diff --git a/.gitignore b/.gitignore index 115de9d1e..d13286436 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,9 @@ Q-municate/.idea/ .DS_Store Q-municate/.DS_Store +Pods/ +Q-municate/Pods/ + ## Standard Xcode.gitignore from https://github.com/github/gitignore/blob/master/Global/Xcode.gitignore build/ *.pbxuser diff --git a/External/Quickblox.framework/Headers/QBASession.h b/External/Quickblox.framework/Headers/QBASession.h index 720a8666f..118e6d3a9 100644 --- a/External/Quickblox.framework/Headers/QBASession.h +++ b/External/Quickblox.framework/Headers/QBASession.h @@ -5,8 +5,12 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import +#import +#if __has_include("QBCEntity.h") +#import "QBCEntity.h" +#else +#import +#endif NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBAddressBookContact.h b/External/Quickblox.framework/Headers/QBAddressBookContact.h index 87dfaaf79..0c6564611 100644 --- a/External/Quickblox.framework/Headers/QBAddressBookContact.h +++ b/External/Quickblox.framework/Headers/QBAddressBookContact.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBAddressBookRejectDetails.h b/External/Quickblox.framework/Headers/QBAddressBookRejectDetails.h index 629b54ac9..922afb9da 100644 --- a/External/Quickblox.framework/Headers/QBAddressBookRejectDetails.h +++ b/External/Quickblox.framework/Headers/QBAddressBookRejectDetails.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBAddressBookUpdates.h b/External/Quickblox.framework/Headers/QBAddressBookUpdates.h index 4746ce816..b8fcb88d1 100644 --- a/External/Quickblox.framework/Headers/QBAddressBookUpdates.h +++ b/External/Quickblox.framework/Headers/QBAddressBookUpdates.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import @class QBAddressBookRejectDetails; diff --git a/External/Quickblox.framework/Headers/QBCBlob.h b/External/Quickblox.framework/Headers/QBCBlob.h index 0c4dcff9c..3fc23b263 100644 --- a/External/Quickblox.framework/Headers/QBCBlob.h +++ b/External/Quickblox.framework/Headers/QBCBlob.h @@ -5,111 +5,116 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import -#import +#import +#if __has_include("QBCEntity.h") +#import "QBCEntity.h" +#import "QBContentEnums.h" +#else +#import +#import +#endif @class QBCBlobObjectAccess; NS_ASSUME_NONNULL_BEGIN /** - * QBCBlob class interface. - * This class represents File in Content module. Limitations: max size of file is 5368709120 bytes (5 GB). + QBCBlob class interface. + This class represents File in Content module. Limitations: max size of file is 100mb. */ @interface QBCBlob : QBCEntity /** - * Content type in mime format. + Content type in mime format. */ @property (nonatomic, copy, nullable) NSString *contentType; /** - * File name. + File name. */ @property (nonatomic, copy, nullable) NSString *name; /** - * Status of the File. + Status of the File. */ @property (nonatomic, assign) QBCBlobStatus status; /** - * Date when the file upload has been completed. + Date when the file upload has been completed. */ @property (nonatomic, strong, nullable) NSDate *completedAt; /** - * The size of file in bytes, readonly + The size of file in bytes, readonly */ @property (nonatomic, assign) NSUInteger size; /** - * File unique identifier. + File unique identifier. */ @property (nonatomic, copy, nullable) NSString *UID; /** - * Last read file time. + Last read file time. */ @property (nonatomic, strong, nullable) NSDate *lastReadAccessTs; /** - * An instance of BlobObjectAccess. + An instance of BlobObjectAccess. */ @property (nonatomic, strong, nullable) QBCBlobObjectAccess *blobObjectAccess; /** - * Coma separated string with file's tags. + Coma separated string with file's tags. */ @property (nonatomic, copy, nullable) NSString *tags; /** - * File's visibility. + File's visibility. */ @property (nonatomic, assign) BOOL isPublic; /** - * Set as YES if you want to update blob's file. + Set as YES if you want to update blob's file. */ @property (nonatomic, assign) BOOL isNew; /** - * Create new blob. - * - * @return New QBCBlob instance + Create new blob. + + @return New QBCBlob instance */ + (QBCBlob *)blob; /** - * Get file's public url (available within Internet), if blob is public. - * - * @return Public url for file + Get file's public url (available within Internet), if blob is public. + + @return Public url for file */ - (nullable NSString *)publicUrl; /** - * Get file's public url (available within Internet), if blob is public. - * - * @param fileUID File unique identifier - * - * @return Public url to file + Get file's public url (available within Internet), if blob is public. + + @param fileUID File unique identifier + + @return Public url to file */ + (nullable NSString *)publicUrlForFileUID:(NSString *)fileUID; /** - * Get file's private url (available only with QuickBlox token), if blob is private. - * - * @return Private url for file + Get file's private url (available only with QuickBlox token), if blob is private. + + @return Private url for file */ - (nullable NSString *)privateUrl; /** - * Get file's private url (available only with QuickBlox token), if blob is private. - * - * @param fileUID File unique identifier - * - * @return Private url to file + Get file's private url (available only with QuickBlox token), if blob is private. + + @param fileUID File unique identifier + + @return Private url to file */ + (nullable NSString *)privateUrlForFileUID:(NSString *)fileUID; diff --git a/External/Quickblox.framework/Headers/QBCBlobObjectAccess.h b/External/Quickblox.framework/Headers/QBCBlobObjectAccess.h index 7682e455c..d1bebf1ed 100644 --- a/External/Quickblox.framework/Headers/QBCBlobObjectAccess.h +++ b/External/Quickblox.framework/Headers/QBCBlobObjectAccess.h @@ -4,9 +4,14 @@ // Created by QuickBlox team // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import -#import +#import +#if __has_include("QBCEntity.h") +#import "QBCEntity.h" +#import "QBContentEnums.h" +#else +#import +#import +#endif /** * QBCBlobObjectAccess class interface. diff --git a/External/Quickblox.framework/Headers/QBCEntity.h b/External/Quickblox.framework/Headers/QBCEntity.h index 971d40e8b..18ff93db8 100644 --- a/External/Quickblox.framework/Headers/QBCEntity.h +++ b/External/Quickblox.framework/Headers/QBCEntity.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN /** diff --git a/External/Quickblox.framework/Headers/QBCOCustomObject.h b/External/Quickblox.framework/Headers/QBCOCustomObject.h index 0782f40bd..736186cd6 100644 --- a/External/Quickblox.framework/Headers/QBCOCustomObject.h +++ b/External/Quickblox.framework/Headers/QBCOCustomObject.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import @class QBCOPermissions; diff --git a/External/Quickblox.framework/Headers/QBCOFile.h b/External/Quickblox.framework/Headers/QBCOFile.h index bf40bbda5..44fe0d6ee 100644 --- a/External/Quickblox.framework/Headers/QBCOFile.h +++ b/External/Quickblox.framework/Headers/QBCOFile.h @@ -5,31 +5,36 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN @interface QBCOFile : NSObject /** - * File name. + The name of the file . */ @property (nonatomic, copy, nullable) NSString *name; /** - * File content type. + The content type of the file. */ @property (nonatomic, copy, nullable) NSString *contentType; /** - * File data. + The data of the file. */ @property (nonatomic, strong, nullable) NSData *data; +/** + The Local url of the file. + */ +@property (nonatomic, strong, nullable) NSURL *fileURL; + /** - * Create file object. - * - * @return New instance of QBCOFile + Create file object. + + @return New instance of `QBCOFile` */ + (instancetype)file; diff --git a/External/Quickblox.framework/Headers/QBCOFileUploadInfo.h b/External/Quickblox.framework/Headers/QBCOFileUploadInfo.h index e8991b9c4..e78797f34 100644 --- a/External/Quickblox.framework/Headers/QBCOFileUploadInfo.h +++ b/External/Quickblox.framework/Headers/QBCOFileUploadInfo.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation.NSObject; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBCOPermissions.h b/External/Quickblox.framework/Headers/QBCOPermissions.h index 37e64bac9..9a5cd0243 100644 --- a/External/Quickblox.framework/Headers/QBCOPermissions.h +++ b/External/Quickblox.framework/Headers/QBCOPermissions.h @@ -5,8 +5,8 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import +#import +#import "QBCustomObjectsEnums.h" NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBChat.h b/External/Quickblox.framework/Headers/QBChat.h index 483e7e96d..9b2b19a64 100644 --- a/External/Quickblox.framework/Headers/QBChat.h +++ b/External/Quickblox.framework/Headers/QBChat.h @@ -5,8 +5,8 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import +#import +#import "QBChatTypes.h" @protocol QBChatDelegate; @@ -52,7 +52,10 @@ NS_ASSUME_NONNULL_BEGIN /** Return current resource. */ @property (nonatomic, readonly, copy, nullable) NSString *currentResource; +/**Unavailable initializer.*/ - (id)init NS_UNAVAILABLE; + +/**Unavailable initializer.*/ + (instancetype)new NS_UNAVAILABLE; //MARK: - Multicast Delegate @@ -86,22 +89,24 @@ NS_ASSUME_NONNULL_BEGIN /** Connect to QuickBlox Chat with completion. - @param user QBUUser structure represents user's login. Required user's fields: ID, password. + @param userID User's ID. + @param password User's password. @param completion Completion block with failure error. */ -- (void)connectWithUser:(QBUUser *)user - completion:(nullable QBChatCompletionBlock)completion; - +- (void)connectWithUserID:(NSUInteger)userID + password:(NSString *)password + completion:(nullable QBChatCompletionBlock)completion; /** - Connect to QuickBlox Chat. + Connect to QuickBlox Chat with completion. - @param user QBUUser structure represents user's login. Required user's fields: ID, password. - @param resource The resource identifier of user. + @param userID User's ID. + @param password User's password. @param completion Completion block with failure error. */ -- (void)connectWithUser:(QBUUser *)user - resource:(nullable NSString *)resource - completion:(nullable QBChatCompletionBlock)completion; +- (void)connectWithUserID:(NSUInteger)userID + password:(NSString *)password + resource:(NSString *)resource + completion:(nullable QBChatCompletionBlock)completion; /** Disconnect current user from Chat and leave all rooms. @@ -123,7 +128,7 @@ NS_ASSUME_NONNULL_BEGIN @interface QBChat(UserStatus) /** - Send presence message with status. Session will be closed in 90 seconds since last activity. + Send presence message with status. @param status Presence status. @@ -324,4 +329,32 @@ NS_ASSUME_NONNULL_BEGIN @end +@interface QBChat(Deprecated) + +/** + Connect to QuickBlox Chat with completion. + + @param user QBUUser structure represents user's login. Required user's fields: ID, password. + @param completion Completion block with failure error. + @warning Deprecated in 2.17. Use connectWithUserID:password:completion:. + */ +- (void)connectWithUser:(QBUUser *)user + completion:(nullable QBChatCompletionBlock)completion +DEPRECATED_MSG_ATTRIBUTE("Deprecated in 2.17. Use connectWithUserID:password:completion:."); + +/** + Connect to QuickBlox Chat. + + @param user QBUUser structure represents user's login. Required user's fields: ID, password. + @param resource The resource identifier of user. + @param completion Completion block with failure error. + @warning Deprecated in 2.17. connectWithUserID:password:resource:completion: + */ +- (void)connectWithUser:(QBUUser *)user + resource:(nullable NSString *)resource + completion:(nullable QBChatCompletionBlock)completion +DEPRECATED_MSG_ATTRIBUTE("Deprecated in 2.17. connectWithUserID:password:resource:completion:"); + +@end + NS_ASSUME_NONNULL_END diff --git a/External/Quickblox.framework/Headers/QBChatAttachment.h b/External/Quickblox.framework/Headers/QBChatAttachment.h index 6bd90bd6d..492650fa2 100644 --- a/External/Quickblox.framework/Headers/QBChatAttachment.h +++ b/External/Quickblox.framework/Headers/QBChatAttachment.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN @@ -36,23 +36,11 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, strong, readonly, nullable) NSDictionary *customParameters; -//MARK: Keyed subscription +//MARK: Keyed subscription for customParameters - (nullable NSString *)objectForKeyedSubscript:(NSString *)key; - (void)setObject:(nullable NSString *)obj forKeyedSubscript:(NSString *)key; -//MARK: DEPRECATED - -/** - Any addictional data. - @warning Deprecated in 2.10. Use object subscripting instead. - @code - QBChatAttachment *attachment = [QBChatAttachment new]; - attachment[@"duration"] = @"45"; - @endcode - */ -@property (nonatomic, copy, nullable) NSString *data -DEPRECATED_MSG_ATTRIBUTE("Deprecated in 2.10. Use object subscripting instead."); - @end + NS_ASSUME_NONNULL_END diff --git a/External/Quickblox.framework/Headers/QBChatDelegate.h b/External/Quickblox.framework/Headers/QBChatDelegate.h index e50ab942f..5d1ab47f5 100644 --- a/External/Quickblox.framework/Headers/QBChatDelegate.h +++ b/External/Quickblox.framework/Headers/QBChatDelegate.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN @@ -166,15 +166,6 @@ NS_ASSUME_NONNULL_BEGIN - (void)chatDidNotSetPrivacyListWithName:(NSString *)name error:(NSError *)error; -/** - Called whenever you have failed to create or edit an active privacy list. - - @param name privacy list name - @param error Error - */ -- (void)chatDidNotSetActivePrivacyListWithName:(NSString *)name - error:(NSError *)error; - /** Called whenever you have failed to set a default privacy list. @@ -206,12 +197,18 @@ Called whenever you have failed to set a default privacy list. - (void)chatDidReceiveContactAddRequestFromUser:(NSUInteger)userID; /** - Called whenver contact list was changed. + Called whenever contact list was changed. @param contactList Contact list */ - (void)chatContactListDidChange:(QBContactList *)contactList; +/** + Called whenever contact list was populated + + @param contactList Contact list + */ +- (void)chatContactListDidPopulate:(QBContactList *)contactList; /** Called in case when user's from contact list online status has been changed. @@ -261,13 +258,8 @@ Called whenever you have failed to set a default privacy list. Implement this protocol in your class and add [QBChat instance].addDelegate to your implementation instance to receive callbacks from QBChat */ -@protocol QBChatDelegate - +@protocol QBChatDelegate @end diff --git a/External/Quickblox.framework/Headers/QBChatDialog.h b/External/Quickblox.framework/Headers/QBChatDialog.h index 1e06654c0..f0ae45c74 100644 --- a/External/Quickblox.framework/Headers/QBChatDialog.h +++ b/External/Quickblox.framework/Headers/QBChatDialog.h @@ -5,12 +5,10 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import @class QBChatMessage; -NS_ASSUME_NONNULL_BEGIN - typedef NS_ENUM(NSUInteger, QBChatDialogType) { QBChatDialogTypePublicGroup = 1, @@ -18,152 +16,154 @@ typedef NS_ENUM(NSUInteger, QBChatDialogType) { QBChatDialogTypePrivate = 3, }; +NS_ASSUME_NONNULL_BEGIN + + typedef void(^QBChatCompletionBlock)(NSError * _Nullable error); typedef void(^QBUserIDBlock)(NSUInteger userID); typedef void(^QBOnlineUsersBlock)(NSMutableArray * _Nullable onlineUsers, NSError * _Nullable error); /** - * QBChatDialog class interface. - * This class represents chat dialog model from server. - * - * @see http://quickblox.com/developers/Chat#Dialog_model + The QBChatDialog class interface. + This class represents chat dialog model from server. + + @see http://quickblox.com/developers/Chat#Dialog_model */ @interface QBChatDialog : NSObject /** - * Chat dialog ID. + The dialog ID. */ @property (nonatomic, copy, readonly, nullable) NSString *ID; /** - * Chat dialog creation date. + The date of the dialog creation. */ @property (nonatomic, strong, nullable) NSDate *createdAt; /** - * Chat dialog update date. + The date of the dialog update. */ @property (nonatomic, strong, nullable) NSDate *updatedAt; /** - * Room JID. - * - * @note If chat dialog is private, room JID will be nil. + The Room JID. + + @note If chat dialog is private, room JID will be nil. */ @property (nonatomic, copy, readonly, nullable) NSString *roomJID; /** - * Chat dialog type. - * - * @see QBChatDialogType + The type of the dialog. + + @see QBChatDialogType */ @property (nonatomic, readonly) QBChatDialogType type; /** - * Group chat dialog name. - * - * @note If chat type is private, name will be nil. + The name of the Group dialog. + + @note If chat type is private, name will be nil. */ @property (nonatomic, copy, nullable) NSString *name; /** - * Group chat photo. - * - * @discussion Can contain a link to a file in Content module, Custom Objects module or just a web link. + The phone of the Group dialog. + + @discussion Can contain a link to a file in Content module, Custom Objects module or just a web link. */ @property (nonatomic, copy, nullable) NSString *photo; /** - * Last message text for current chat dialog. + The Last message text of the dialog. */ @property (nonatomic, copy, nullable) NSString *lastMessageText; /** - * Date of last message in current chat dialog. + The Date of the last message in the dialog. */ @property (nonatomic, strong, nullable) NSDate *lastMessageDate; /** - * Sender user ID of last message in current chat dialog. + The Sender user ID of last message in current chat dialog. */ @property (nonatomic, assign) NSUInteger lastMessageUserID; /** - * Number of unread messages in current chat dialog. + The last message ID + */ +@property (nonatomic, copy, nullable) NSString *lastMessageID; + +/** + The Number of unread messages in the dialog. */ @property (nonatomic, assign) NSUInteger unreadMessagesCount; /** - * Array of user ids in chat. - * - * @note For private chat dialog count is 2. + The Array of occupatns (users') ids in the dialog. + + @note For private chat dialog count is 2. */ @property (nonatomic, copy, nullable) NSArray *occupantIDs; /** - * The dictionary with custom data. - * - * @see https://quickblox.com/developers/SimpleSample-chat_users-ios#Custom_parameters + The dictionary that represents the custom data. + + @see https://quickblox.com/developers/SimpleSample-chat_users-ios#Custom_parameters */ @property (nonatomic, copy, nullable) NSDictionary *data; /** - * Chat dialog owner user ID. + The user id of the dialog's owner. */ @property (nonatomic, assign) NSUInteger userID; /** - * Recipient ID for private chat dialog. - * - * @note ID of a recipient if type = QBChatDialogTypePrivate. -1 otherwise. - * Will always return -1 if QBSession currentUser is nil. - * - * @discussion Will be retrieved from 'QBSession.currentSession.currentUser' - * by subtracting currentUser.ID from occupantsIDs. + The Recipient (user) ID for the private dialog. + + @note ID of a recipient if type = QBChatDialogTypePrivate. -1 otherwise. Will always return -1 if QBSession currentUser is nil. + + @discussion Will be retrieved from 'QBSession.currentSession.currentUser' by subtracting currentUser.ID from occupantsIDs. */ @property (nonatomic, readonly) NSInteger recipientID; /** - * Occupants ids to push. - * - * @discussion Use this method to add occupants to the dialog. + The Occupants (users) ids to be pushed (added) to the dialog. */ @property (strong, nonatomic, nullable) NSArray *pushOccupantsIDs; /** - * Occupants ids to pull. - * - * @discussion Use this method to delete occupants from the chat dialog. + The Occupants (users) ids to be pulled (removed) from the dialog. */ @property (strong, nonatomic, nullable) NSArray *pullOccupantsIDs; /** - * Called whenever sent message was blocked on server. + Called whenever sent message was blocked on server. */ @property (nonatomic, copy, nullable) QBChatCompletionBlock onBlockedMessage; /** - * Called whenever user is typing in current chat dialog. + Called whenever user is typing in current dialog. */ @property (nonatomic, copy, nullable) QBUserIDBlock onUserIsTyping; /** - * Called whenever user has stopped typing in current chat dialog. + Called whenever user has stopped typing in current dialog. */ @property (nonatomic, copy, nullable) QBUserIDBlock onUserStoppedTyping; /** - * Called whenever occupant has joined to the current Group or Public group chat dialog. + Called whenever occupant has joined to the current Group or Public group dialog. */ @property (nonatomic, copy, nullable) QBUserIDBlock onJoinOccupant; /** - * Called whenever occupant has left the current Group or Public group chat dialog. + Called whenever occupant has left the current Group or Public group dialog. */ @property (nonatomic, copy, nullable) QBUserIDBlock onLeaveOccupant; /** - * Called whenever occupant has updated his presence status in the current Group or Public group chat dialog. + Called whenever occupant has updated his presence status in the current Group or Public group dialog. */ @property (nonatomic, copy, nullable) QBUserIDBlock onUpdateOccupant; @@ -172,114 +172,114 @@ typedef void(^QBOnlineUsersBlock)(NSMutableArray * _Nullable online + (id)new NS_UNAVAILABLE; /** - * Init with dialog ID and type. - * - * @param dialogID dialog ID string - * @param type dialog type - * - * @see QBChatDialogType - * - * @discussion Pass nil for dialogID if you are creating a new dialog. - * - * @return QBChatDialog instance. + Init with dialog ID and type. + + @param dialogID dialog ID string + @param type dialog type + + @see QBChatDialogType + + @discussion Pass nil for dialogID if you are creating a new dialog. + + @return QBChatDialog instance. */ - (instancetype)initWithDialogID:(nullable NSString *)dialogID type:(QBChatDialogType)type; //MARK: - Send message /** - * Send chat message with completion block. - * - * @param message Chat message to send. - * @param completion Completion block with failure error. + Sends chat message with completion block. + + @param message Chat message to send. + @param completion Completion block with failure error. */ - (void)sendMessage:(QBChatMessage *)message completionBlock:(nullable QBChatCompletionBlock)completion; /** - * Send group chat message to room, without room join. - * - * @param message Chat message to send - * @param completion Completion block with failure error. - * - * @note Available only for 'Enterprise' clients. - * - * @see http://quickblox.com/enterprise/ + Sends group chat message to room, without room join. + + @param message Chat message to send + @param completion Completion block with failure error. + + @note Available only for 'Enterprise' clients. + + @see http://quickblox.com/enterprise/ */ - (void)sendGroupChatMessageWithoutJoin:(QBChatMessage *)message completion:(nullable QBChatCompletionBlock)completion; //MARK: - Join/leave /** - * Join status of the room - * - * @return YES if user is joined to room, otherwise - no. + Join status of the room + + @return YES if user is joined to room, otherwise - no. */ - (BOOL)isJoined; /** - * Join to room. - * - * @param completion Completion block with failure error. + Join to room. + + @param completion Completion block with failure error. */ - (void)joinWithCompletionBlock:(nullable QBChatCompletionBlock)completion; /** - * Leave joined room. - * - * @param completion Completion block with failure error. + Leave joined room. + + @param completion Completion block with failure error. */ - (void)leaveWithCompletionBlock:(nullable QBChatCompletionBlock)completion; /** - * Clears dialog occupants status blocks. - * - * @discussion Call this method if you don't want to recieve join/leave/update for this dialog. + Clears dialog occupants status blocks. + + @discussion Call this method if you don't want to recieve join/leave/update for this dialog. */ - (void)clearDialogOccupantsStatusBlock; //MARK: - Users status /** - * Requests users who are joined to room. - * - * @param completion Completion block with failure error and array of user ids. + Requests users who are joined to room. + + @param completion Completion block with failure error and array of user ids. */ - (void)requestOnlineUsersWithCompletionBlock:(nullable QBOnlineUsersBlock)completion; //MARK: - Now typing /** - * Send is typing message to occupants. - * - * @note Available only for 'Enterprise' clients. - * - * @see http://quickblox.com/enterprise/ + Sends is typing message to occupants. + + @note Available only for 'Enterprise' clients. + + @see http://quickblox.com/enterprise/ */ - (void)sendUserIsTypingWithoutJoin; /** - * Send is typing message to occupants. + Sends is typing message to occupants. */ - (void)sendUserIsTyping; /** - * Send stopped typing message to occupants. + Sends stopped typing message to occupants. */ - (void)sendUserStoppedTyping; /** - * Send stopped typing message to occupants. - * - * @note Available only for 'Enterprise' clients. - * - * @see http://quickblox.com/enterprise/ + Sends stopped typing message to occupants. + + @note Available only for 'Enterprise' clients. + + @see http://quickblox.com/enterprise/ */ - (void)sendUserStoppedTypingWithoutJoin; /** - * Clears typing status blocks. - * - * @discussion Call this method if you don't want to recieve typing statuses for this dialog. + Clears typing status blocks. + + @discussion Call this method if you don't want to recieve typing statuses for this dialog. */ - (void)clearTypingStatusBlocks; diff --git a/External/Quickblox.framework/Headers/QBChatMessage.h b/External/Quickblox.framework/Headers/QBChatMessage.h index 59d29e3ac..eea7eb5ed 100644 --- a/External/Quickblox.framework/Headers/QBChatMessage.h +++ b/External/Quickblox.framework/Headers/QBChatMessage.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import @class QBChatAttachment; diff --git a/External/Quickblox.framework/Headers/QBChatTypes.h b/External/Quickblox.framework/Headers/QBChatTypes.h index d43d1e0b6..b3c3327da 100644 --- a/External/Quickblox.framework/Headers/QBChatTypes.h +++ b/External/Quickblox.framework/Headers/QBChatTypes.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBCompletionTypes.h b/External/Quickblox.framework/Headers/QBCompletionTypes.h index 1a25fbd13..993408a9a 100644 --- a/External/Quickblox.framework/Headers/QBCompletionTypes.h +++ b/External/Quickblox.framework/Headers/QBCompletionTypes.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import @class QBChatDialog; @class QBResponse; diff --git a/External/Quickblox.framework/Headers/QBConnection.h b/External/Quickblox.framework/Headers/QBConnection.h index 0464fbe58..4e6dafe6e 100644 --- a/External/Quickblox.framework/Headers/QBConnection.h +++ b/External/Quickblox.framework/Headers/QBConnection.h @@ -4,7 +4,7 @@ // Created by QuickBlox team // Copyright (c) 2017 QuickBlox. All rights reserved. -#import +#import "QBSettings.h" NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBContactList.h b/External/Quickblox.framework/Headers/QBContactList.h index a86505c61..6ecd7b015 100644 --- a/External/Quickblox.framework/Headers/QBContactList.h +++ b/External/Quickblox.framework/Headers/QBContactList.h @@ -5,20 +5,19 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation.NSObject; +#import +#import "QBContactListItem.h" NS_ASSUME_NONNULL_BEGIN -@class QBContactListItem; - /** - * QBContactList class interface. - * Represents user's contact list. + QBContactList class interface. + Represents user's contact list. */ @interface QBContactList : NSObject /** - * Current contacts. + Current contacts. */ @property (nonatomic, readonly, nullable) NSArray *contacts; @@ -27,6 +26,25 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nonatomic, readonly, nullable) NSArray *pendingApproval; + +/** + How to use: + QBContactListItem *item = QBChat.instance.contactList[userID]; + + @param userID userID. + @return QBContactListItem isnstance if exist. + */ +- (nullable QBContactListItem *)objectAtIndexedSubscript:(NSUInteger)userID; + +/** + Sorted by state + + @param state @see QBPresenseSubscriptionState + @return Array of QBContactListItem items + */ +- (NSArray *)itemsSortedByState:(QBPresenseSubscriptionState)state; + + @end NS_ASSUME_NONNULL_END diff --git a/External/Quickblox.framework/Headers/QBContactListItem.h b/External/Quickblox.framework/Headers/QBContactListItem.h index 1c7e944bc..e517e255a 100644 --- a/External/Quickblox.framework/Headers/QBContactListItem.h +++ b/External/Quickblox.framework/Headers/QBContactListItem.h @@ -5,48 +5,48 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN -extern NSString * const kPresenceSubscriptionStateNone; -extern NSString * const kPresenceSubscriptionStateTo; -extern NSString * const kPresenceSubscriptionStateFrom; -extern NSString * const kPresenceSubscriptionStateBoth; typedef NS_ENUM(NSUInteger, QBPresenseSubscriptionState) { - - QBPresenceSubscriptionStateNone = 1, // the user does not have a subscription to the contact's presence information, and the contact does not have a subscription to the user's presence information - QBPresenceSubscriptionStateTo = 2, // the user has a subscription to the contact's presence information, but the contact does not have a subscription to the user's presence information - QBPresenceSubscriptionStateFrom = 3, // the contact has a subscription to the user's presence information, but the user does not have a subscription to the contact's presence information - QBPresenceSubscriptionStateBoth = 4, // both the user and the contact have subscriptions to each other's presence information + //The user does not have a subscription to the contact's presence information, and the contact does not have a subscription to the user's presence information + QBPresenceSubscriptionStateNone = 1, + //The user has a subscription to the contact's presence information, but the contact does not have a subscription to the user's presence information + QBPresenceSubscriptionStateTo = 2, + //The contact has a subscription to the user's presence information, but the user does not have a subscription to the contact's presence information + QBPresenceSubscriptionStateFrom = 3, + //Both the user and the contact have subscriptions to each other's presence information + QBPresenceSubscriptionStateBoth = 4, }; /** - * QBContactListItem class interface. - * Represents user's contact list item. + QBContactListItem class interface. + Represents user's contact list item. */ @interface QBContactListItem : NSObject /** - * Unique identifier of user. + Unique identifier of user. */ @property (nonatomic, assign) NSUInteger userID; /** - * User status (online/offline). + User status (online/offline). */ @property (nonatomic, assign, getter=isOnline) BOOL online; /** - * User subscription state. Read more about states http://xmpp.org/rfcs/rfc3921.html#roster + User subscription state. Read more about states http://xmpp.org/rfcs/rfc3921.html#roster */ @property (nonatomic, assign) QBPresenseSubscriptionState subscriptionState; +@end + +@interface QBContactListItem(Internal) // Helpers: translate subscriptionState to and from string to and from enum + (QBPresenseSubscriptionState)subscriptionStateFromString:(nullable NSString *)subscriptionState; -+ (nullable NSString *)subscriptionStateToString:(QBPresenseSubscriptionState)subscriptionState; - @end NS_ASSUME_NONNULL_END diff --git a/External/Quickblox.framework/Headers/QBContentEnums.h b/External/Quickblox.framework/Headers/QBContentEnums.h index bff735969..14ccd3906 100644 --- a/External/Quickblox.framework/Headers/QBContentEnums.h +++ b/External/Quickblox.framework/Headers/QBContentEnums.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import typedef NS_ENUM(NSUInteger, QBCBlobStatus) { diff --git a/External/Quickblox.framework/Headers/QBCustomObjectsConsts.h b/External/Quickblox.framework/Headers/QBCustomObjectsConsts.h index 8ce9f18b4..38da29670 100644 --- a/External/Quickblox.framework/Headers/QBCustomObjectsConsts.h +++ b/External/Quickblox.framework/Headers/QBCustomObjectsConsts.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBCustomObjectsEnums.h b/External/Quickblox.framework/Headers/QBCustomObjectsEnums.h index 98a3ba49d..e31a89515 100644 --- a/External/Quickblox.framework/Headers/QBCustomObjectsEnums.h +++ b/External/Quickblox.framework/Headers/QBCustomObjectsEnums.h @@ -6,7 +6,7 @@ // Copyright (c) 2016 QuickBlox. All rights reserved. // -@import Foundation.NSObjCRuntime; +#import typedef enum QBCOPermissionsAccess { QBCOPermissionsAccessOpen, diff --git a/External/Quickblox.framework/Headers/QBDarwinNotificationCenter.h b/External/Quickblox.framework/Headers/QBDarwinNotificationCenter.h index 6d0439437..c90b9381f 100644 --- a/External/Quickblox.framework/Headers/QBDarwinNotificationCenter.h +++ b/External/Quickblox.framework/Headers/QBDarwinNotificationCenter.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBError.h b/External/Quickblox.framework/Headers/QBError.h index a83281d97..951d83b31 100644 --- a/External/Quickblox.framework/Headers/QBError.h +++ b/External/Quickblox.framework/Headers/QBError.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBGeneralResponsePage.h b/External/Quickblox.framework/Headers/QBGeneralResponsePage.h index 8a731e36b..e22a4b892 100644 --- a/External/Quickblox.framework/Headers/QBGeneralResponsePage.h +++ b/External/Quickblox.framework/Headers/QBGeneralResponsePage.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBHTTPClient.h b/External/Quickblox.framework/Headers/QBHTTPClient.h index c85df8b65..3bc95959d 100644 --- a/External/Quickblox.framework/Headers/QBHTTPClient.h +++ b/External/Quickblox.framework/Headers/QBHTTPClient.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBLoggerEnums.h b/External/Quickblox.framework/Headers/QBLoggerEnums.h index b9d00b1d1..c329ddb75 100644 --- a/External/Quickblox.framework/Headers/QBLoggerEnums.h +++ b/External/Quickblox.framework/Headers/QBLoggerEnums.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import typedef NS_ENUM(NSUInteger, QBLogLevel) { QBLogLevelNothing = 0, // 0 - Nothing in Log diff --git a/External/Quickblox.framework/Headers/QBMEvent.h b/External/Quickblox.framework/Headers/QBMEvent.h index 8152f7830..9c5f42e7b 100644 --- a/External/Quickblox.framework/Headers/QBMEvent.h +++ b/External/Quickblox.framework/Headers/QBMEvent.h @@ -5,9 +5,9 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import -#import +#import +#import "QBCEntity.h" +#import "QBPushNotificationsEnums.h" NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBMPushMessage.h b/External/Quickblox.framework/Headers/QBMPushMessage.h index 735ebcd05..fc9a0f4f9 100644 --- a/External/Quickblox.framework/Headers/QBMPushMessage.h +++ b/External/Quickblox.framework/Headers/QBMPushMessage.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -#import +#import "QBMPushMessageBase.h" NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBMPushMessageBase.h b/External/Quickblox.framework/Headers/QBMPushMessageBase.h index 6499b3fb3..3611b4798 100644 --- a/External/Quickblox.framework/Headers/QBMPushMessageBase.h +++ b/External/Quickblox.framework/Headers/QBMPushMessageBase.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBMPushToken.h b/External/Quickblox.framework/Headers/QBMPushToken.h index 6d9c18061..9b60ba448 100644 --- a/External/Quickblox.framework/Headers/QBMPushToken.h +++ b/External/Quickblox.framework/Headers/QBMPushToken.h @@ -4,19 +4,19 @@ // Created by QuickBlox team // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import +#import +#import "QBCEntity.h" NS_ASSUME_NONNULL_BEGIN /** QBMPushToken class declaration. * Class represents push token, that uniquely identifies the application. - * (for APNS - it's token, for C2DM - it's registration Id, for MPNS - it's uri, for BBPS - it's token). + * (for APNS - it's token, for GCM - it's registration Id, for MPNS - it's uri). */ @interface QBMPushToken : QBCEntity /** - * Identifies client device in 3-rd party service like APNS, C2DM, MPNS, BBPS. + * Identifies client device in 3-rd party service like APNS, GCM, MPNS. */ @property(nonatomic, copy, nullable) NSString *clientIdentificationSequence; diff --git a/External/Quickblox.framework/Headers/QBMSubscription.h b/External/Quickblox.framework/Headers/QBMSubscription.h index c4e27e4dc..fcde02f76 100644 --- a/External/Quickblox.framework/Headers/QBMSubscription.h +++ b/External/Quickblox.framework/Headers/QBMSubscription.h @@ -5,51 +5,46 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import -#import -#import +#import +#import "QBCEntity.h" +#import "QBMSubscription.h" +#import "QBPushNotificationsEnums.h" NS_ASSUME_NONNULL_BEGIN /** - * QBMSubscription class interface. - * Class represents user subscription to push channel. + QBMSubscription class interface. + Class represents user subscription to push channel. */ @interface QBMSubscription : QBCEntity /** - * Declare which notification channels could be used to notify user about events. + Declare which notification channels could be used to notify user about events. */ @property (nonatomic, assign) QBMNotificationChannel notificationChannel; /** - * Device UDID. + Device UDID. */ @property (nonatomic, copy, nullable) NSString *deviceUDID; /** - * Device platform name. + Device platform name. */ @property (nonatomic, copy, nullable) NSString *devicePlatform; /** - * Identifies client device in 3-rd party service like APNS, APNSVOIP C2DM, MPNS, BBPS. + Identifies client device in 3-rd party service like APNS, APNSVOIP, GCM, MPNS. */ @property(nonatomic, strong, nullable) NSData *deviceToken; /** - * Create new subscription. - * - * @return New instance of QBMSubscription + Create new subscription. + + @return New instance of QBMSubscription */ + (QBMSubscription *)subscription; -//MARK: - Converters - -+ (QBMNotificationChannel)notificationChannelFromString:(nullable NSString *)notificationChannel; -+ (nullable NSString *)notificationChannelToString:(QBMNotificationChannel)notificationChannel; - @end NS_ASSUME_NONNULL_END diff --git a/External/Quickblox.framework/Headers/QBMulticastDelegate.h b/External/Quickblox.framework/Headers/QBMulticastDelegate.h index 9c9e9c57c..ecc19c4b2 100644 --- a/External/Quickblox.framework/Headers/QBMulticastDelegate.h +++ b/External/Quickblox.framework/Headers/QBMulticastDelegate.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBPrivacyItem.h b/External/Quickblox.framework/Headers/QBPrivacyItem.h index 41c812a55..d3c7fa2fe 100644 --- a/External/Quickblox.framework/Headers/QBPrivacyItem.h +++ b/External/Quickblox.framework/Headers/QBPrivacyItem.h @@ -5,65 +5,68 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import typedef NS_ENUM(NSUInteger, QBPrivacyType) { - + //This type is used to block the user in private chat dialog. QBPrivacyTypeUserID = 1, + //This type is used to block the user in group chat dialog. QBPrivacyTypeGroupUserID }; NS_ASSUME_NONNULL_BEGIN /** - * QBPrivacyItem class interface. - * This class structure represents privacy object for managing privacy lists. + QBPrivacyItem class interface. + This class structure represents privacy object for managing privacy lists. */ @interface QBPrivacyItem : NSObject /** - * QBPrivacyItemType type value. - * - * @see QBPrivacyItemType. + Returns privacy type of the item. + + @see QBPrivacyItemType. */ @property (assign, nonatomic, readonly) QBPrivacyType privacyType; /** - * User ID. + Returns user ID. */ @property (assign, nonatomic, readonly) NSUInteger userID; /** - * Determines whether item's action is allow or deny. + Determines whether item's action is allow or deny. */ -@property (assign, nonatomic, readonly, getter=isAllowed) BOOL allow; +@property (assign, nonatomic, readonly) BOOL isAllowed; /** - * Determines whether block is mutual. - * - * @discussion By default user, who is blocking, can send messages and presences to - * the one he blocked without any errors. To achieve a two-way block set this - * property to YES. After that the user, who is blocking, will receive errors - * when will try to communicate with blocked user. + Determines whether block is mutual. + + @discussion By default user, who is blocking, can send messages and presences to the one he blocked without any errors. To achieve a two-way block set this property to YES. After that the user, who is blocking, will receive errors when will try to communicate with blocked user. */ @property (assign, nonatomic) BOOL mutualBlock; -// unavailable initializers -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; +/** + Init with privacy type, userID and privacy action. + + @param privacyType QBPrivacyType value (user ID, group user ID, subscription) + @param userID User ID + @param allow Determines whether action is to allow or deny user + + @return QBPrivacyItem instance + */ +- (instancetype)initWithPrivacyType:(QBPrivacyType)privacyType + userID:(NSUInteger)userID + allow:(BOOL)allow; /** - * Init with privacy type, userID and privacy action. - * - * @param privacyType QBPrivacyType value (user ID, group user ID, subscription) - * @param userID user ID - * @param allow determines whether action is to allow or deny user - * - * @return QBPrivacyItem instance + Unavailable initializer. */ -- (nullable instancetype)initWithPrivacyType:(QBPrivacyType)privacyType - userID:(NSUInteger)userID - allow:(BOOL)allow; +- (instancetype)init NS_UNAVAILABLE; +/** + Unavailable initializer. + */ ++ (instancetype)new NS_UNAVAILABLE; @end diff --git a/External/Quickblox.framework/Headers/QBPrivacyList.h b/External/Quickblox.framework/Headers/QBPrivacyList.h index 4488270ce..d11b02289 100644 --- a/External/Quickblox.framework/Headers/QBPrivacyList.h +++ b/External/Quickblox.framework/Headers/QBPrivacyList.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import @class QBPrivacyItem; diff --git a/External/Quickblox.framework/Headers/QBPushNotificationsConsts.h b/External/Quickblox.framework/Headers/QBPushNotificationsConsts.h index 64737602d..0daf0bba2 100644 --- a/External/Quickblox.framework/Headers/QBPushNotificationsConsts.h +++ b/External/Quickblox.framework/Headers/QBPushNotificationsConsts.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN @@ -40,21 +40,15 @@ extern NSString * const kQBMNotificationChannelsAPNS; extern NSString * const kQBMNotificationChannelsAPNSVOIP; extern NSString * const kQBMNotificationChannelsGCM; extern NSString * const kQBMNotificationChannelsMPNS; -extern NSString * const kQBMNotificationChannelsBBPS; -extern NSString * const kQBMNotificationChannelsPull; -extern NSString * const kQBMNotificationChannelsHttpRequest; // Notification type extern NSString * const kQBMNotificationTypePush; extern NSString * const kQBMNotificationTypeEmail; -extern NSString * const kQBMNotificationTypeRequest; -extern NSString * const kQBMNotificationTypePull; // Push type extern NSString * const kQBMPushTypeAPNS; extern NSString * const kQBMPushTypeAPNSVOIP; extern NSString * const kQBMPushTypeGCM; extern NSString * const kQBMPushTypeMPNS; -extern NSString * const kQBMPushTypeBBPS; NS_ASSUME_NONNULL_END diff --git a/External/Quickblox.framework/Headers/QBPushNotificationsEnums.h b/External/Quickblox.framework/Headers/QBPushNotificationsEnums.h index 151dcc95c..dc5c9de52 100644 --- a/External/Quickblox.framework/Headers/QBPushNotificationsEnums.h +++ b/External/Quickblox.framework/Headers/QBPushNotificationsEnums.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import // Event types typedef NS_ENUM(NSUInteger, QBMEventType) { @@ -29,7 +29,6 @@ typedef NS_ENUM(NSUInteger, QBMPushType) { QBMPushTypeAPNSVOIP, QBMPushTypeGCM, QBMPushTypeMPNS, - QBMPushTypeBBPS }; // Notification channels @@ -39,6 +38,5 @@ typedef NS_ENUM(NSUInteger, QBMNotificationChannel) { QBMNotificationChannelAPNS, QBMNotificationChannelAPNSVOIP, QBMNotificationChannelGCM, - QBMNotificationChannelMPNS, - QBMNotificationChannelBBPS + QBMNotificationChannelMPNS }; diff --git a/External/Quickblox.framework/Headers/QBRequest+QBAddressBook.h b/External/Quickblox.framework/Headers/QBRequest+QBAddressBook.h index 6f9276335..2dd973350 100644 --- a/External/Quickblox.framework/Headers/QBRequest+QBAddressBook.h +++ b/External/Quickblox.framework/Headers/QBRequest+QBAddressBook.h @@ -5,8 +5,8 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import +#import +#import "QBRequest.h" @class QBAddressBookContact; @class QBAddressBookUpdates; diff --git a/External/Quickblox.framework/Headers/QBRequest+QBAuth.h b/External/Quickblox.framework/Headers/QBRequest+QBAuth.h index e8aa42a38..54d177e6f 100644 --- a/External/Quickblox.framework/Headers/QBRequest+QBAuth.h +++ b/External/Quickblox.framework/Headers/QBRequest+QBAuth.h @@ -5,8 +5,8 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import +#import +#import "QBRequest.h" @class QBUUser; @@ -121,23 +121,6 @@ typedef void(^qb_response_user_block_t)(QBResponse *response, QBUUser *tUser); successBlock:(nullable qb_response_user_block_t)successBlock errorBlock:(nullable qb_response_block_t)errorBlock; -// MARK: - DEPRECATED - -/** - * User login using Twitter Digits. - * - * @param headers Taken from '-[DGTOAuthSigning OAuthEchoHeadersToVerifyCredentials]'. - * @param successBlock Block with response and user instances if the request is succeeded. - * @param errorBlock Block with response instance if the request is failed. - * @warning Deprecated in 2.10 Use 'logInWithFirebaseProjectID:accessToken:successBlock:errorBlock:'. - * @return An instance of QBRequest for cancel operation mainly. - */ -+ (QBRequest *)logInWithTwitterDigitsAuthHeaders:(NSDictionary *)headers - successBlock:(nullable qb_response_user_block_t)successBlock - errorBlock:(nullable qb_response_block_t)errorBlock -DEPRECATED_MSG_ATTRIBUTE("Deprecated in 2.10 Use 'logInWithFirebaseProjectID:accessToken:successBlock:errorBlock:'."); - - @end NS_ASSUME_NONNULL_END diff --git a/External/Quickblox.framework/Headers/QBRequest+QBChat.h b/External/Quickblox.framework/Headers/QBRequest+QBChat.h index ce49193a6..8e61ca2a9 100644 --- a/External/Quickblox.framework/Headers/QBRequest+QBChat.h +++ b/External/Quickblox.framework/Headers/QBRequest+QBChat.h @@ -5,9 +5,9 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import -#import +#import +#import "QBRequest.h" +#import "QBCompletionTypes.h" NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBRequest+QBContent.h b/External/Quickblox.framework/Headers/QBRequest+QBContent.h index 8da037e0e..a3b96c886 100644 --- a/External/Quickblox.framework/Headers/QBRequest+QBContent.h +++ b/External/Quickblox.framework/Headers/QBRequest+QBContent.h @@ -5,8 +5,8 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import +#import +#import "QBRequest.h" @class QBCBlob; @class QBCBlobObjectAccess; @@ -18,6 +18,21 @@ typedef void(^qb_response_blob_block_t)(QBResponse *response, QBCBlob *tBlob); @interface QBRequest (QBContent) +//MARK: - Create Blob + +/** + Create blob. + + @param blob An instance of QBCBlob, describing the file to be uploaded. + @param successBlock Block with response and blob instances if the request is succeeded + @param errorBlock Block with response instance if the request is failed. + + @return An instance of QBRequest for cancel operation mainly. + */ ++ (QBRequest *)createBlob:(QBCBlob *)blob + successBlock:(nullable qb_response_blob_block_t)successBlock + errorBlock:(nullable qb_response_block_t)errorBlock; + //MARK: - Get Blob with ID @@ -137,7 +152,7 @@ typedef void(^qb_response_blob_block_t)(QBResponse *response, QBCBlob *tBlob); @param UID File unique identifier, value of UID property of the QBCBlob instance. @param successBlock Block with response if the request is succeeded - @param statusBlock Block with upload/download progress + @param statusBlock Block with download progress @param errorBlock Block with response instance if the request is failed. @return An instance of QBRequest for cancel operation mainly. @@ -154,7 +169,7 @@ typedef void(^qb_response_blob_block_t)(QBResponse *response, QBCBlob *tBlob); @param UID File unique identifier, value of UID property of the QBCBlob instance. @param successBlock Block with response if the request is succeeded - @param statusBlock Block with upload/download progress + @param statusBlock Block with download progress @param errorBlock Block with response instance if the request is failed. @return An instance of QBRequest for cancel operation mainly. @@ -168,7 +183,7 @@ typedef void(^qb_response_blob_block_t)(QBResponse *response, QBCBlob *tBlob); @param fileID File identifier. @param successBlock Block with response and fileData if the request is succeeded - @param statusBlock Block with upload/download progress + @param statusBlock Block with download progress @param errorBlock Block with response instance if the request is failed. @return An instance of QBRequest for cancel operation mainly. @@ -185,7 +200,7 @@ typedef void(^qb_response_blob_block_t)(QBResponse *response, QBCBlob *tBlob); @param fileID File identifier. @param successBlock Block with response and fileData if the request is succeeded - @param statusBlock Block with upload/download progress + @param statusBlock Block with download progress @param errorBlock Block with response instance if the request is failed. @return An instance of QBRequest for cancel operation mainly. @@ -204,7 +219,7 @@ typedef void(^qb_response_blob_block_t)(QBResponse *response, QBCBlob *tBlob); @param contentType Type of the content in mime format @param isPublic Blob's visibility @param successBlock Block with response if the request is succeeded - @param statusBlock Block with upload/download progress + @param statusBlock Block with upload progress @param errorBlock Block with response instance if the request is failed. @return An instance of QBRequest for cancel operation mainly. @@ -225,7 +240,7 @@ typedef void(^qb_response_blob_block_t)(QBResponse *response, QBCBlob *tBlob); @param contentType Type of the content in mime format @param isPublic Blob's visibility @param successBlock Block with response if the request is succeeded - @param statusBlock Block with upload/download progress + @param statusBlock Block with upload progress @param errorBlock Block with response instance if the request is failed. @return An instance of QBRequest for cancel operation mainly. @@ -243,7 +258,7 @@ typedef void(^qb_response_blob_block_t)(QBResponse *response, QBCBlob *tBlob); @param data File to be uploaded @param file File which needs to be updated @param successBlock Block with response if the request is succeeded - @param statusBlock Block with upload/download progress + @param statusBlock Block with upload progress @param errorBlock Block with response instance if the request is failed. @return An instance of QBRequest for cancel operation mainly. @@ -254,64 +269,6 @@ typedef void(^qb_response_blob_block_t)(QBResponse *response, QBCBlob *tBlob); statusBlock:(nullable qb_response_status_block_t)statusBlock errorBlock:(nullable qb_response_block_t)errorBlock; -//MARK: DEPRECATED - -/** - Get list of blob for the current User (last 10 files) - - @param successBlock Block with response, page and blob instances if the request is succeeded - @param errorBlock Block with response instance if the request is failed. - - @return An instance of QBRequest for cancel operation mainly. - */ -+ (QBRequest *)blobsWithSuccessBlock:(nullable void(^)(QBResponse *response, QBGeneralResponsePage * _Nullable page, NSArray * _Nullable blobs))successBlock - errorBlock:(nullable qb_response_block_t)errorBlock -DEPRECATED_MSG_ATTRIBUTE("Deprecated in 2.10 Use 'blobsForPage:successBlock:errorBlock:'."); - - -/** - Get list of tagged blobs for the current User (last 10 files) - - @param successBlock Block with response, page and blob instances if the request is succeeded - @param errorBlock Block with response instance if the request is failed. - - @return An instance of QBRequest for cancel operation mainly. - */ -+ (QBRequest *)taggedBlobsWithSuccessBlock:(nullable void(^)(QBResponse *response, QBGeneralResponsePage *page, NSArray * _Nullable blobs))successBlock - errorBlock:(nullable qb_response_block_t)errorBlock -DEPRECATED_MSG_ATTRIBUTE("Deprecated in 2.10 Use 'taggedBlobsForPage:successBlock:errorBlock:'."); - -//MARK: - Get list of tagged blobs for the current user - -/** - Get list of tagged blobs for the current User (with extended set of pagination parameters) - - @param page Page information - @param successBlock Block with response, page and blob instances if the request is succeeded - @param errorBlock Block with response instance if the request is failed. - - @return An instance of QBRequest for cancel operation mainly. - */ -+ (QBRequest *)taggedBlobsForPage:(nullable QBGeneralResponsePage *)page - successBlock:(nullable void(^)(QBResponse *response, QBGeneralResponsePage *page, NSArray *blobs))successBlock - errorBlock:(nullable qb_response_block_t)errorBlock DEPRECATED_ATTRIBUTE; - - -//MARK: - Create Blob - -/** - Create blob. - - @param blob An instance of QBCBlob, describing the file to be uploaded. - @param successBlock Block with response and blob instances if the request is succeeded - @param errorBlock Block with response instance if the request is failed. - - @return An instance of QBRequest for cancel operation mainly. - */ -+ (QBRequest *)createBlob:(QBCBlob *)blob - successBlock:(nullable qb_response_blob_block_t)successBlock - errorBlock:(nullable qb_response_block_t)errorBlock DEPRECATED_ATTRIBUTE; - //MARK: - Declaring Blob uploaded with ID /** @@ -327,7 +284,7 @@ DEPRECATED_MSG_ATTRIBUTE("Deprecated in 2.10 Use 'taggedBlobsForPage:successBloc + (QBRequest *)completeBlobWithID:(NSUInteger)blobID size:(NSUInteger)size successBlock:(nullable qb_response_block_t)successBlock - errorBlock:(nullable qb_response_block_t)errorBlock DEPRECATED_ATTRIBUTE; + errorBlock:(nullable qb_response_block_t)errorBlock; @end diff --git a/External/Quickblox.framework/Headers/QBRequest+QBCustomObjects.h b/External/Quickblox.framework/Headers/QBRequest+QBCustomObjects.h index ea660b03f..ae8e48fe4 100644 --- a/External/Quickblox.framework/Headers/QBRequest+QBCustomObjects.h +++ b/External/Quickblox.framework/Headers/QBRequest+QBCustomObjects.h @@ -5,9 +5,9 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import -#import +#import +#import "QBRequest.h" +#import "QBCustomObjectsConsts.h" @class QBResponsePage; @class QBCOCustomObject; diff --git a/External/Quickblox.framework/Headers/QBRequest+QBPushNotifications.h b/External/Quickblox.framework/Headers/QBRequest+QBPushNotifications.h index 03299b033..f47373f59 100644 --- a/External/Quickblox.framework/Headers/QBRequest+QBPushNotifications.h +++ b/External/Quickblox.framework/Headers/QBRequest+QBPushNotifications.h @@ -5,8 +5,8 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import +#import +#import "QBRequest.h" @class QBMPushToken; @class QBMSubscription; diff --git a/External/Quickblox.framework/Headers/QBRequest+QBUsers.h b/External/Quickblox.framework/Headers/QBRequest+QBUsers.h index 7ef7774d9..aafd30b86 100644 --- a/External/Quickblox.framework/Headers/QBRequest+QBUsers.h +++ b/External/Quickblox.framework/Headers/QBRequest+QBUsers.h @@ -5,8 +5,8 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; -#import +#import +#import "QBRequest.h" @class QBUUser; @class QBGeneralResponsePage; diff --git a/External/Quickblox.framework/Headers/QBRequest.h b/External/Quickblox.framework/Headers/QBRequest.h index 128601f6b..d9ce271ca 100644 --- a/External/Quickblox.framework/Headers/QBRequest.h +++ b/External/Quickblox.framework/Headers/QBRequest.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import @class QBResponse; @class QBRequest; @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN typedef void(^QBErrorBlock)(QBError *error); typedef void(^qb_response_status_block_t)(QBRequest *request, QBRequestStatus *status); typedef void(^qb_response_block_t)(QBResponse *response); +typedef void(^qb_error_block_t)(NSError *error); /** * QBRequest class interface. @@ -42,6 +43,8 @@ typedef void(^qb_response_block_t)(QBResponse *response); + (void)cancelAllRequests:(dispatch_block_t)completion; +- (void)errorBlock:(qb_error_block_t)errorBlock; + @end NS_ASSUME_NONNULL_END diff --git a/External/Quickblox.framework/Headers/QBRequestStatus.h b/External/Quickblox.framework/Headers/QBRequestStatus.h index df907dee9..c4780056c 100644 --- a/External/Quickblox.framework/Headers/QBRequestStatus.h +++ b/External/Quickblox.framework/Headers/QBRequestStatus.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBResponse.h b/External/Quickblox.framework/Headers/QBResponse.h index c17e05ac7..b07b9d03b 100644 --- a/External/Quickblox.framework/Headers/QBResponse.h +++ b/External/Quickblox.framework/Headers/QBResponse.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBResponsePage.h b/External/Quickblox.framework/Headers/QBResponsePage.h index 25f0d77d1..7568db641 100644 --- a/External/Quickblox.framework/Headers/QBResponsePage.h +++ b/External/Quickblox.framework/Headers/QBResponsePage.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBSession.h b/External/Quickblox.framework/Headers/QBSession.h index efe9fc990..f1b1c9736 100644 --- a/External/Quickblox.framework/Headers/QBSession.h +++ b/External/Quickblox.framework/Headers/QBSession.h @@ -5,7 +5,7 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import @class QBUUser; @class QBASession; @@ -81,14 +81,4 @@ FOUNDATION_EXPORT NSNotificationName const kQBLogoutNotification; @end -@interface QBSession (DEPRECATED) - -/** - * Token valid state - */ -@property (nonatomic, readonly, getter=isTokenValid) BOOL tokenValid -DEPRECATED_MSG_ATTRIBUTE("Deprecated in 2.15. Use tokenHasExpired"); - -@end - NS_ASSUME_NONNULL_END diff --git a/External/Quickblox.framework/Headers/QBSettings.h b/External/Quickblox.framework/Headers/QBSettings.h index 11e3c764e..65942b05b 100644 --- a/External/Quickblox.framework/Headers/QBSettings.h +++ b/External/Quickblox.framework/Headers/QBSettings.h @@ -5,7 +5,7 @@ // Copyright 2011 QuickBlox team. All rights reserved. // -#import +#import "QBLoggerEnums.h" NS_ASSUME_NONNULL_BEGIN diff --git a/External/Quickblox.framework/Headers/QBUUser.h b/External/Quickblox.framework/Headers/QBUUser.h index 5d0e38f7d..4380f1a01 100644 --- a/External/Quickblox.framework/Headers/QBUUser.h +++ b/External/Quickblox.framework/Headers/QBUUser.h @@ -4,96 +4,88 @@ // Created by QuickBlox team // Copyright (c) 2017 QuickBlox. All rights reserved. // -#import +#import "QBCEntity.h" NS_ASSUME_NONNULL_BEGIN /** - * QBUUser class interface. - * This class represents QuickBlox User. + QBUUser class interface. + This class represents QuickBlox User. */ @interface QBUUser : QBCEntity /** - * Create new user. - */ -@property (nonatomic, class, readonly) QBUUser *user; - -/** - * ID of User in external system. + ID of User in external system. */ @property (nonatomic, assign) NSUInteger externalUserID; /** - * ID of User associated blob (for example, ID of user's photo). + ID of User associated blob (for example, ID of user's photo). */ -@property (nonatomic, assign) NSInteger blobID; +@property (nonatomic, assign) NSUInteger blobID; /** - * ID of User in Facebook. + ID of User in Facebook. */ @property (nonatomic, copy, nullable) NSString *facebookID; /** - * ID of User in Twitter. + ID of User in Twitter. */ @property (nonatomic, copy, nullable) NSString *twitterID; /** - * ID of User in Twitter Digits. - */ -@property (nonatomic, copy, nullable) NSString *twitterDigitsID; - -/** - * User's full name. + User's full name. */ @property (nonatomic, copy, nullable) NSString *fullName; /** - * User's email. + User's email. */ @property (nonatomic, copy, nullable) NSString *email; /** - * User's login. + User's login. */ @property (nonatomic, copy, nullable) NSString *login; /** - * User's phone. + User's phone. */ @property (nonatomic, copy, nullable) NSString *phone; /** - * User's website. + User's website. */ @property (nonatomic, copy, nullable) NSString *website; /** - * User's tags. + User's tags. */ -@property (nonatomic, strong, null_resettable) NSMutableArray *tags; +@property (nonatomic, strong, nullable) NSArray *tags; /** - * User's password. + User's password. */ @property (nonatomic, copy, nullable) NSString *password; /** - * User's old password. + User's old password. */ @property (nonatomic, copy, nullable) NSString *oldPassword; /** - * User's last activity. + User's last activity. */ @property (nonatomic, strong, nullable) NSDate *lastRequestAt; -/** - * User's custom data field. +/** + User's custom data field. */ @property (nonatomic, copy, nullable) NSString *customData; ++ (QBUUser *)user; + @end NS_ASSUME_NONNULL_END diff --git a/External/Quickblox.framework/Headers/QBUpdateUserParameters.h b/External/Quickblox.framework/Headers/QBUpdateUserParameters.h index d1f23fc74..77f2ec8c8 100644 --- a/External/Quickblox.framework/Headers/QBUpdateUserParameters.h +++ b/External/Quickblox.framework/Headers/QBUpdateUserParameters.h @@ -5,79 +5,74 @@ // Copyright (c) 2017 QuickBlox. All rights reserved. // -@import Foundation; +#import NS_ASSUME_NONNULL_BEGIN @interface QBUpdateUserParameters : NSObject /** - * ID of User in external system. + ID of User in external system. */ @property (nonatomic, assign) NSUInteger externalUserID; /** - * ID of User associated blob (for example, ID of user's photo). + ID of User associated blob (for example, ID of user's photo). */ -@property (nonatomic, assign) NSInteger blobID; +@property (nonatomic, assign) NSUInteger blobID; /** - * ID of User in Facebook. + ID of User in Facebook. */ @property (nonatomic, copy, nullable) NSString *facebookID; /** - * ID of User in Twitter. + ID of User in Twitter. */ @property (nonatomic, copy, nullable) NSString *twitterID; /** - * ID of User in Twitter Digits. - */ -@property (nonatomic, copy, nullable) NSString *twitterDigitsID; - -/** - * User's full name. + User's full name. */ @property (nonatomic, copy, nullable) NSString *fullName; /** - * User's email. + User's email. */ @property (nonatomic, copy, nullable) NSString *email; /** - * User's login. + User's login. */ @property (nonatomic, copy, nullable) NSString *login; /** - * User's phone. + User's phone. */ @property (nonatomic, copy, nullable) NSString *phone; /** - * User's website. + User's website. */ @property (nonatomic, copy, nullable) NSString *website; /** - * User's tags. + User's tags. */ -@property (nonatomic, strong, null_resettable) NSMutableArray *tags; +@property (nonatomic, strong, nullable) NSArray *tags; /** - * User's password. + User's password. */ @property (nonatomic, copy, nullable) NSString *password; /** - * User's old password. + User's old password. */ @property (nonatomic, copy, nullable) NSString *oldPassword; /** - * User's custom data field. + User's custom data field. */ @property (nonatomic, copy, nullable) NSString *customData; diff --git a/External/Quickblox.framework/Headers/Quickblox.h b/External/Quickblox.framework/Headers/Quickblox.h index 38599f6c0..70438d3ef 100644 --- a/External/Quickblox.framework/Headers/Quickblox.h +++ b/External/Quickblox.framework/Headers/Quickblox.h @@ -4,60 +4,60 @@ // // Copyright (c) 2016 QuickBlox. All rights reserved. -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import +#import "QBAddressBookContact.h" +#import "QBAddressBookRejectDetails.h" +#import "QBAddressBookUpdates.h" +#import "QBASession.h" +#import "QBCBlob.h" +#import "QBCBlobObjectAccess.h" +#import "QBCEntity.h" +#import "QBChat.h" +#import "QBChatAttachment.h" +#import "QBChatDelegate.h" +#import "QBChatDialog.h" +#import "QBChatMessage.h" +#import "QBChatTypes.h" +#import "QBCOCustomObject.h" +#import "QBCOFile.h" +#import "QBCOFileUploadInfo.h" +#import "QBCompletionTypes.h" +#import "QBContactList.h" +#import "QBContactListItem.h" +#import "QBContentEnums.h" +#import "QBConnection.h" +#import "QBCOPermissions.h" +#import "QBCustomObjectsConsts.h" +#import "QBCustomObjectsEnums.h" +#import "QBDarwinNotificationCenter.h" +#import "QBError.h" +#import "QBGeneralResponsePage.h" +#import "QBHTTPClient.h" +#import "QBLoggerEnums.h" +#import "QBMEvent.h" +#import "QBMPushMessage.h" +#import "QBMPushMessageBase.h" +#import "QBMPushToken.h" +#import "QBMSubscription.h" +#import "QBMulticastDelegate.h" +#import "QBPrivacyItem.h" +#import "QBPrivacyList.h" +#import "QBPushNotificationsConsts.h" +#import "QBPushNotificationsEnums.h" +#import "QBRequest.h" +#import "QBRequest+QBAddressBook.h" +#import "QBRequest+QBAuth.h" +#import "QBRequest+QBChat.h" +#import "QBRequest+QBContent.h" +#import "QBRequest+QBCustomObjects.h" +#import "QBRequest+QBPushNotifications.h" +#import "QBRequest+QBUsers.h" +#import "QBRequestStatus.h" +#import "QBResponse.h" +#import "QBResponsePage.h" +#import "QBSession.h" +#import "QBSettings.h" +#import "QBUpdateUserParameters.h" +#import "QBUUser.h" -/// Framework version 2.15 +/// Framework version 2.17.4 FOUNDATION_EXPORT NSString * const QuickbloxFrameworkVersion; diff --git a/External/Quickblox.framework/Info.plist b/External/Quickblox.framework/Info.plist index d3bb165ed..3dc2ac563 100644 Binary files a/External/Quickblox.framework/Info.plist and b/External/Quickblox.framework/Info.plist differ diff --git a/External/Quickblox.framework/Modules/module.modulemap b/External/Quickblox.framework/Modules/module.modulemap index ffea3c1d8..10c04a6d6 100644 --- a/External/Quickblox.framework/Modules/module.modulemap +++ b/External/Quickblox.framework/Modules/module.modulemap @@ -5,9 +5,3 @@ framework module Quickblox { export * module * { export * } } - -module Quickblox.QBMulticastDelegate { - header "QBMulticastDelegate.h" - - export * -} diff --git a/External/Quickblox.framework/Quickblox b/External/Quickblox.framework/Quickblox index 3199ec1c1..2f5630827 100755 Binary files a/External/Quickblox.framework/Quickblox and b/External/Quickblox.framework/Quickblox differ diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCAudioSession.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCAudioSession.h deleted file mode 100644 index 9e73e0ab4..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCAudioSession.h +++ /dev/null @@ -1,259 +0,0 @@ -// -// QBRTCAudioSession.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -@class QBRTCAudioSession; -@class QBRTCAudioSessionConfiguration; - -/** - * Audio devices enumeration. - * - * - QBRTCAudioDeviceNotSpecified: When audio session is not initialized - * - QBRTCAudioDeviceReceiver: Receiver device (default for devices that have receiver) - * - QBRTCAudioDeviceSpeaker: Speaker device (can't be used on tvOS and watchOS) - */ -typedef NS_ENUM(NSUInteger, QBRTCAudioDevice) { - - QBRTCAudioDeviceNotSpecified, - QBRTCAudioDeviceReceiver, - QBRTCAudioDeviceSpeaker __TVOS_PROHIBITED __WATCHOS_PROHIBITED -}; - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCAudioSessionDelegate protocol. - * Notifying about important audio session events. - */ -@protocol QBRTCAudioSessionDelegate - -/** - * Protocol methods down below are optional and can be skipped in protocol implementation. - */ -@optional - -/** - * Notifying about current audio device being updated by QBRTCAudioSession. - * - * @param audioSession QBRTCAudioSession instance - * @param updatedAudioDevice new audio device - * - * @discussion Called, for example, when headphones plugged in. In that case audio will automatically be updated from speaker/receiver to headphones. Headphones are considered to be receiver. You can use this delegate to keep your current audio device state up-to-date in your UI. - * - * @note Only called if audio device was changed by QBRTCAudioSession itself, and not on user request. - */ -- (void)audioSession:(QBRTCAudioSession *)audioSession didChangeCurrentAudioDevice:(QBRTCAudioDevice)updatedAudioDevice; - -/** - * Notifying when audio device change on user request was failed. - * - * @param audioSession QBRTCAudioSession instance - * @param error error - * - * @discussion Called when audio device change is not possible. For example, when audio session options set to speaker only, you cannot update device to receiver, etc. - */ -- (void)audioSession:(QBRTCAudioSession *)audioSession didFailToChangeAudioDeviceWithError:(NSError *)error; - -/** - * Called when the audio device is notified to begin playback or recording. - * - * @param audioSession QBRTCAudioSesson instance. - */ -- (void)audioSessionDidStartPlayOrRecord:(QBRTCAudioSession *)audioSession; - -/** - * Called when the audio device is notified to stop playback or recording. - * - * @param audioSession QBRTCAudioSesson instance. - */ -- (void)audioSessionDidStopPlayOrRecord:(QBRTCAudioSession *)audioSession; - -/** - * Called when AVAudioSession starts an interruption event. - * - * @param session QBRTCAudioSession instance - */ -- (void)audioSessionDidBeginInterruption:(QBRTCAudioSession *)session; - -/** - * Called when AVAudioSession ends an interruption event. - * - * @param session QBRTCAudioSession instance - */ -- (void)audioSessionDidEndInterruption:(QBRTCAudioSession *)session shouldResumeSession:(BOOL)shouldResumeSession; - -@end - -/** - * This is a protocol used to inform QBRTCAudioSession when the audio session - * activation state has changed outside of QBRTCAudioSession. The current known use - * case of this is when CallKit activates the audio session for the application - */ -@protocol QBRTCAudioSessionActivationDelegate - -/** - * Called when the audio session is activated outside of the app by iOS. - */ -- (void)audioSessionDidActivate:(AVAudioSession *)session; - -/** - * Called when the audio session is deactivated outside of the app by iOS. - */ -- (void)audioSessionDidDeactivate:(AVAudioSession *)session; - -/** - * Called in order to determine whether audio session was activated ourside of the app by iOS and is still active. - */ -- (BOOL)audioSessionIsActivatedOutside:(AVAudioSession *)session; - -@end - -/** - * QBRTCAudioSession class interface. - * This class is used to manage and configure audio session of web rtc including sound route management. - */ -@interface QBRTCAudioSession : NSObject - -// MARK: Properties - -/** - * Determines whether QBRTCAudioSession is initialized and have saved previous active audio session settings. - */ -@property (nonatomic, readonly, getter=isInitialized) BOOL initialized; - -/** - * If YES, WebRTC will not initialize the audio unit automatically when an - * audio track is ready for playout or recording. Instead, applications should - * call setAudioEnabled. If NO, WebRTC will initialize the audio unit - * as soon as an audio track is ready for playout or recording. - * - * @remark Default value is NO. - */ -@property (assign, nonatomic) BOOL useManualAudio; - -/** - * This property is only effective if useManualAudio is YES. - * Represents permission for WebRTC to initialize the VoIP audio unit. - * When set to NO, if the VoIP audio unit used by WebRTC is active, it will be - * stopped and uninitialized. This will stop incoming and outgoing audio. - * When set to YES, WebRTC will initialize and start the audio unit when it is - * needed (e.g. due to establishing an audio connection). - * This property was introduced to work around an issue where if an AVPlayer is - * playing audio while the VoIP audio unit is initialized, its audio would be - * either cut off completely or played at a reduced volume. By preventing - * the audio unit from being initialized until after the audio has completed, - * we are able to prevent the abrupt cutoff. - * - * @remark Default value is NO. - */ -@property (assign, nonatomic, getter=isAudioEnabled) BOOL audioEnabled; - -/** - * Current audio device. - * - * @remark QBRTCAudioDeviceNotSpecified if not initialized - * - * @discussion Change this property value in order to change current audio device. - * - * @note Audio device change is being performed on background thread and is not an instant operation. - * Cannot be changed if QBRTCAudioSession is not initialized. - */ -@property (assign, nonatomic) QBRTCAudioDevice currentAudioDevice; - -// MARK: Instance - -/** - * QBRTCAudioSession class shared instance. - * - * @return QBRTCAudioSession shared instance - */ -+ (instancetype)instance; - -// Unavailable initializers -+ (instancetype)new NS_UNAVAILABLE; -- (instancetype)init NS_UNAVAILABLE; - -// MARK: QBRTCAudioSessionDelegate - -/** - * Add class that conforms to QBRTCAudioSessionDelegate protocol to observer list. - * - * @param delegate Class that conforms to QBRTCAudioSessionDelegate - */ -- (void)addDelegate:(id)delegate; - -/** - * Remove class that conforms to QBRTCAudioSessionDelegate protocol from observers list. - * - * @param delegate Class that conforms to QBRTCAudioSessionDelegate - */ -- (void)removeDelegate:(id)delegate; - -/** - * List of added delegates. - * - * @return List of delegates that were added to observer's list. - */ -- (NSArray *)delegates; - -// MARK: Initialize and configuration - -/** - * Initialize audio session if not initialized yet. - * - * @discussion Initialization of QBRTCAudioSession will perform configuration of AVAudioSession shared instance. - * using suggested default QBRTCAudioSessionConfiguration settings. Use 'initializeWithConfigurationBlock:' method - * to perform in-depth audio session configuration. - * - * @note Previous configuration will be saved. In order to restore it deinitialize QBRTCAudioSession using - * 'deinitialize' method. - * - * @code - [[QBRTCAudioSession instance] initializeWithConfigurationBlock:^(QBRTCAudioSessionConfiguration *configuration) { - // adding blutetooth support - configuration.categoryOptions |= AVAudioSessionCategoryOptionAllowBluetooth; - configuration.categoryOptions |= AVAudioSessionCategoryOptionAllowBluetoothA2DP; - - // adding airplay support - configuration.categoryOptions |= AVAudioSessionCategoryOptionAllowAirPlay; - - if (_session.conferenceType == QBRTCConferenceTypeVideo) { - // setting mode to video chat to enable airplay audio and speaker only - configuration.mode = AVAudioSessionModeVideoChat; - } - }]; - * @endcode - * - * @return Boolean value of whether operation was successful - */ -- (BOOL)initialize; - -/** - * Initialize audio session if not initialized yet using configuration block. - * - * @param configurationBlock configuration block - * - * @see QBRTCAudioSessionConfiguration class. - * - * @return Boolean value of whether operation was successful - */ -- (BOOL)initializeWithConfigurationBlock:(nullable void(^)(QBRTCAudioSessionConfiguration *configuration))configurationBlock; - -/** - * Deinitialize QBRTCAudioSession. - * - * @note Previous AVAudioSession configuration will be restored (which was saved upon - * QBRTCAudioSession initialization). - * - * @return Boolean value of whether operation was successful - */ -- (BOOL)deinitialize; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCAudioSessionConfiguration.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCAudioSessionConfiguration.h deleted file mode 100644 index d3522a27d..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCAudioSessionConfiguration.h +++ /dev/null @@ -1,49 +0,0 @@ -// -// QBRTCAudioSessionConfiguration.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QBRTCAudioSessionConfiguration : NSObject - -/** - * Audio session category. - * - * @remark Default value: AVAudioSessionCategoryPlayAndRecord - * - * @see AVAudioSessionCategoryAmbient, AVAudioSessionCategorySoloAmbient, AVAudioSessionCategoryPlayback, AVAudioSessionCategoryRecord, AVAudioSessionCategoryPlayAndRecord, AVAudioSessionCategoryAudioProcessing and AVAudioSessionCategoryMultiRoute. - */ -@property (nonatomic, strong) NSString *category; - -/** - * Audio session category options. - * - * @remark Default value: AVAudioSessionCategoryOptionDuckOthers - */ -@property (nonatomic, assign) AVAudioSessionCategoryOptions categoryOptions; - -/** - * Audio session mode. - * - * @remark Default value: AVAudioSessionModeVoiceChat - * - * @see AVAudioSessionModeDefault, AVAudioSessionModeVoiceChat, AVAudioSessionModeGameChat, AVAudioSessionModeVideoRecording, AVAudioSessionModeMeasurement, AVAudioSessionModeMoviePlayback, AVAudioSessionModeVideoChat, AVAudioSessionModeSpokenAudio - */ -@property (nonatomic, strong) NSString *mode; - -/** - * Init default audio session configuration. - * - * @return QBRTCAudioSessionConfiguration instance with default setup. - */ -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCAudioTrack.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCAudioTrack.h deleted file mode 100644 index d8b5ad6d1..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCAudioTrack.h +++ /dev/null @@ -1,78 +0,0 @@ -// -// QBRTCAudioTrack.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCMediaStreamTrack.h" - -#import -#import - -@class QBRTCAudioTrack; - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCAudioTrackSinkInterface protocol. - * Used to sink audio data in real time for a specific audio track. - */ -@protocol QBRTCAudioTrackSinkInterface - -/** - * Audio track sink interface callback. - * - * @param audioTrack QBRTCAudioTrack instance that is responsible for received audio data - * @param audioBufferList audio buffer list with audio buffer (const) - * @param audioStreamDescription audio stream description for audio buffer - * @param numberOfFrames number of frames in current packet - * @param time media timestamp in nano seconds scale - * - * @note Do not modify audioBufferList struct in any way to avoid memory issues. - * But rather copy its data if you want to perform any memory modifications on audio data. - */ -- (void)audioTrack:(QBRTCAudioTrack *)audioTrack -didSinkAudioBufferList:(const AudioBufferList *)audioBufferList -audioStreamDescription:(const AudioStreamBasicDescription)audioStreamDescription - numberOfFrames:(size_t)numberOfFrames - time:(CMTime)time; - -@end - -/** - * QBRTCAudioTrack class interface. - * This class represents remote audio track. - */ -@interface QBRTCAudioTrack : QBRTCMediaStreamTrack - -/** - * Volume of audio track. - * - * @discussion Sets the volume for the specific track. - * - * @remark |volume] is a gain value in the range [0, 10]. - */ -@property (assign, nonatomic) double volume; - -/** - * Add sink. - * - * @param sink class instance that conforms to QBRTCAudioTrackSinkInterface protocol - * - * @see QBRTCAudioTrackSinkInterface - */ -- (void)addSink:(id)sink; - -/** - * Remove sink. - * - * @param sink class instance that conforms to QBRTCAudioTrackSinkInterface protocol - * - * @see QBRTCAudioTrackSinkInterface - */ -- (void)removeSink:(id)sink; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCBaseClient.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCBaseClient.h deleted file mode 100644 index 45e71e5d6..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCBaseClient.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// QBRTCBaseClient.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import -#import "QBRTCBaseClientDelegate.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCBaseClient class interface. - * This class represents basic client methods. - */ -@interface QBRTCBaseClient : NSObject - -// unavailable initializers -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -/** - * Client instance singleton. - * - * @return Client instance - */ -+ (instancetype)instance; - -/** - * Add delegate to the observers list. - * - * @param delegate class that conforms to QBRTCBaseClientDelegate protocol - */ -- (void)addDelegate:(id)delegate; - -/** - * Remove delegate from the observers list. - * - * @param delegate class that conforms to QBRTCBaseClientDelegate protocol - */ -- (void)removeDelegate:(id)delegate; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCBaseClientDelegate.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCBaseClientDelegate.h deleted file mode 100644 index 2d46ef7cc..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCBaseClientDelegate.h +++ /dev/null @@ -1,117 +0,0 @@ -// -// QBRTCBaseClientDelegate.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -#import "QBRTCTypes.h" - -@class QBRTCBaseSession; -@class QBRTCStatsReport; -@class QBRTCAudioTrack; -@class QBRTCVideoTrack; - -NS_ASSUME_NONNULL_BEGIN - -/** - * Base client protocol. - */ -@protocol QBRTCBaseClientDelegate - -/** - * Protocol methods down below are optional and not required to be implemented. - */ -@optional - -/** - * Called by timeout with updated stats report for user ID. - * - * @param session QBRTCSession instance - * @param report QBRTCStatsReport instance - * @param userID user ID - * - * @remark Configure time interval with [QBRTCConfig setStatsReportTimeInterval:timeInterval]. - */ -- (void)session:(__kindof QBRTCBaseSession *)session updatedStatsReport:(QBRTCStatsReport *)report forUserID:(NSNumber *)userID; - -/** - * Called when session state has been changed. - * - * @param session QBRTCSession instance - * @param state session state - * - * @discussion Use this to track a session state. As SDK 2.3 introduced states for session, you can now manage your own states based on this. - */ -- (void)session:(__kindof QBRTCBaseSession *)session didChangeState:(QBRTCSessionState)state; - -/** - * Called when received remote audio track from user. - * - * @param audioTrack QBRTCAudioTrack instance - * @param userID ID of user - */ -- (void)session:(__kindof QBRTCBaseSession *)session receivedRemoteAudioTrack:(QBRTCAudioTrack *)audioTrack fromUser:(NSNumber *)userID; - -/** - * Called when received remote video track from user. - * - * @param videoTrack QBRTCVideoTrack instance - * @param userID ID of user - */ -- (void)session:(__kindof QBRTCBaseSession *)session receivedRemoteVideoTrack:(QBRTCVideoTrack *)videoTrack fromUser:(NSNumber *)userID; - -/** - * Called when connection is closed for user. - * - * @param session QBRTCSession instance - * @param userID ID of user - */ -- (void)session:(__kindof QBRTCBaseSession *)session connectionClosedForUser:(NSNumber *)userID; - -/** - * Called when connection is initiated with user. - * - * @param session QBRTCSession instance - * @param userID ID of user - */ -- (void)session:(__kindof QBRTCBaseSession *)session startedConnectingToUser:(NSNumber *)userID; - -/** - * Called when connection is established with user. - * - * @param session QBRTCSession instance - * @param userID ID of user - */ -- (void)session:(__kindof QBRTCBaseSession *)session connectedToUser:(NSNumber *)userID; - -/** - * Called when disconnected from user. - * - * @param session QBRTCSession instance - * @param userID ID of user - */ -- (void)session:(__kindof QBRTCBaseSession *)session disconnectedFromUser:(NSNumber *)userID; - -/** - * Called when connection failed with user. - * - * @param session QBRTCSession instance - * @param userID ID of user - */ -- (void)session:(__kindof QBRTCBaseSession *)session connectionFailedForUser:(NSNumber *)userID; - -/** - * Called when session connection state changed for a specific user. - * - * @param session QBRTCSession instance - * @param state state - @see QBRTCConnectionState - * @param userID ID of user - */ -- (void)session:(__kindof QBRTCBaseSession *)session didChangeConnectionState:(QBRTCConnectionState)state forUser:(NSNumber *)userID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCBaseSession.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCBaseSession.h deleted file mode 100644 index e25ad6c6f..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCBaseSession.h +++ /dev/null @@ -1,87 +0,0 @@ -// -// QBRTCBaseSession.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -#import "QBRTCTypes.h" - -@class QBRTCMediaStream; -@class QBRTCAudioTrack; -@class QBRTCVideoTrack; - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCBaseSession class interface. - * This class represents basic session methods. - */ -@interface QBRTCBaseSession : NSObject - -/** - * Conference type. - * - * @remark - QBRTCConferenceTypeVideo - video conference - QBRTCConferenceTypeAudio - audio conference - * - * @see QBRTCConferenceType - */ -@property (assign, nonatomic, readonly) QBRTCConferenceType conferenceType; - -/** - * Session state. - * - * @see QBRTCSessionState - */ -@property (assign, nonatomic, readonly) QBRTCSessionState state; - -/** - * Current user ID. - */ -@property (assign, nonatomic, readonly) NSNumber *currentUserID; - -/** - * Local media stream with audio and video (if video conferene) tracks. - * - * @discussion QBRTCMediaStream instance that has both video and audio tracks and allows to manage them. - */ -@property (strong, nonatomic, readonly) QBRTCMediaStream *localMediaStream; - -// unavailable initializers -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -/** - * Remote audio track with opponent user ID. - * - * @param userID opponent user ID - * - * @return QBRTCAudioTrack audio track instance - */ -- (QBRTCAudioTrack *)remoteAudioTrackWithUserID:(NSNumber *)userID; - -/** - * Remote video track with opponent user ID. - * - * @param userID opponent user ID - * - * @return QBRTCVideoTrack video track instance - */ -- (QBRTCVideoTrack *)remoteVideoTrackWithUserID:(NSNumber *)userID; - -/** - * Connection state for opponent user ID. - * - * @param userID opponent user ID - * - * @return QBRTCConnectionState connection state for opponent user ID - */ -- (QBRTCConnectionState)connectionStateForUser:(NSNumber *)userID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCBitrateTracker.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCBitrateTracker.h deleted file mode 100644 index 249cc76ef..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCBitrateTracker.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// QBRTCBitrateTracker.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * Class used to estimate bitrate based on byte count. It is expected that - * byte count is monotonocially increasing. This class tracks the times that - * byte count is updated, and measures the bitrate based on the byte difference - * over the interval between updates. - */ -@interface QBRTCBitrateTracker : NSObject - -/** The bitrate in bits per second. */ -@property (nonatomic, readonly) double bitrate; -/** The bitrate as a formatted string in bps, Kbps or Mbps. */ -@property (nonatomic, readonly) NSString *bitrateString; - -/** Converts the bitrate to a readable format in bps, Kbps or Mbps. */ -+ (NSString *)bitrateStringForBitrate:(double)bitrate; -/** Updates the tracked bitrate with the new byte count. */ -- (void)updateBitrateWithCurrentByteCount:(NSInteger)byteCount; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCCameraCapture.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCCameraCapture.h deleted file mode 100644 index 9430ca40e..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCCameraCapture.h +++ /dev/null @@ -1,124 +0,0 @@ -// -// QBRTCCameraCapture.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCVideoCapture.h" - -#import -#import - -@class QBRTCVideoFormat; - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCCameraCapture class interface. - * This class represent native camera capture based on QBRTCVideoCapture rtc capture. - * - * @see QBRTCVideoCapture - */ -@interface QBRTCCameraCapture : QBRTCVideoCapture - -/** - * AVCaptureSession is the central hub of the AVFoundation capture classes. - */ -@property (nonatomic, strong, readonly) AVCaptureSession *captureSession; - -/** - * A CoreAnimation layer subclass for previewing the visual output of an AVCaptureSession. - */ -@property (nonatomic, strong, readonly) AVCaptureVideoPreviewLayer *previewLayer; - -/** - * Current camera position. - */ -@property (nonatomic, assign) AVCaptureDevicePosition position; - -/** - * Determines whether camera capture has started, but is not running yet (in set-up state). - */ -@property (nonatomic, readonly) BOOL hasStarted; - -/** - * Determines whether capture session is running. - */ -@property (nonatomic, readonly) BOOL isRunning; - -/** - * Initialize video capture with specific capture position. - * - * @param videoFormat QBRTCVideoFormat video format - * @param position AVCaptureDevicePosition, must be back or front - * - * @return QBRTCVideoCapture instance - */ -- (instancetype)initWithVideoFormat:(QBRTCVideoFormat *)videoFormat - position:(AVCaptureDevicePosition)position NS_DESIGNATED_INITIALIZER; - -/** - * Allows you to batch configuration changes to the session. Works while the session is stopped or running. - * @note It is safe to call prepare/teardown or start/stop methods from capturer. - * Also, the session preset may be changed. - * - * @param configureBlock A handler block which applies the changes to the session. - * @note if capture is running, this block will be called on the serial session queue. - */ -- (void)configureSession:(dispatch_block_t)configureBlock; - -/** - * Start the capture session asynchronously with completion block. - * - * @param completion operation completion block - */ -- (void)startSession:(nullable dispatch_block_t)completion; - -/** - * Stop the capture session asynchronously with completion block. - * - * @param completion operation completion block - */ -- (void)stopSession:(nullable dispatch_block_t)completion; - -// MARK: Video format management - -/** - * Current video format that is in use for requested camera position. - * - * @param position requested camera position - * - * @return QBRTCVideoFormat video format - */ -- (QBRTCVideoFormat *)videoFormatForPosition:(AVCaptureDevicePosition)position; - -/** - * Set a specific video format for a requested camera position. - * - * @param videoFormat QBRTCVideoFormat wanted video format - * @param position requested camera position - */ -- (void)setVideoFormat:(QBRTCVideoFormat *)videoFormat forPosition:(AVCaptureDevicePosition)position; - -// MARK: Helpers - -/** - * Retrieve available array of QBRTCVideoFormat instances for given camera position. - * - * @param position requested camera position - * - * @return Array of possible QBRTCVideoFormat video formats for requested position - */ -+ (NSArray *)formatsWithPosition:(AVCaptureDevicePosition)position; - -/** - * Check if device has back or front camera. - * - * @param cameraPosition AVCaptureDevicePosition - */ -- (BOOL)hasCameraForPosition:(AVCaptureDevicePosition)cameraPosition; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCClient.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCClient.h deleted file mode 100644 index 069896edf..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCClient.h +++ /dev/null @@ -1,82 +0,0 @@ -// -// QBRTCClient.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCBaseClient.h" - -#import "QBRTCClientDelegate.h" -#import "QBRTCTypes.h" - -@class QBRTCSession; - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCClient class interface. - * Represents client to initialize call session and notify about call's state. - */ -@interface QBRTCClient : QBRTCBaseClient - -/** - * QBRTCClient shared instance. - * - * @return QBRTCClient instance - */ -+ (instancetype)instance; - -/** - * Initialize RTCClient signaling in order to receive and send calls. - * - * @note You should call this method before any interaction with QuickbloxWebRTC. - */ -+ (void)initializeRTC; - -/** - * Add delegate to the observers list. - * - * @param delegate delegate that conforms to QBRTCClientDelegate protocol - * - * @see QBRTCClientDelegate - */ -- (void)addDelegate:(id)delegate; - -/** - * Remove delegate from the observers list. - * - * @param delegate delegate that conforms to QBRTCClientDelegate protocol - * - * @see QBRTCClientDelegate - */ -- (void)removeDelegate:(id)delegate; - -/** - * Create new session - * - * @param opponents opponents IDs, array of NSNumber instances - * @param conferenceType Type of conference. 'QBRTCConferenceTypeAudio' and 'QBRTCConferenceTypeVideo' values are available - * - * @return New QBRTCSession instance - */ -- (QBRTCSession *)createNewSessionWithOpponents:(NSArray *)opponents - withConferenceType:(QBRTCConferenceType)conferenceType; - -@end - -@interface QBRTCClient (Deprecated) - -/** - * Deinitialize QuickbloxWebRTC - * Disables SSL subsystem and signaling - * - * Call this method when you finish your work with QuickbloxWebRTC - * - * @warning *Deprecated in 2.5*. From now on QBRTCCLient managing deinitialization of webrtc on itself. Just remove usage of this method. - */ -+ (void)deinitializeRTC DEPRECATED_MSG_ATTRIBUTE("Deprecated in 2.5. From now on QBRTCCLient managing deinitialization of webrtc on itself. Just remove usage of this method."); - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCClientDelegate.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCClientDelegate.h deleted file mode 100644 index 55a07729d..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCClientDelegate.h +++ /dev/null @@ -1,77 +0,0 @@ -// -// QBRTCClientDelegate.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -@class QBRTCSession; - -@protocol QBRTCBaseClientDelegate; - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCClientDelegate protocol. - * - * @note all delegate methods will be called on main thread due to webrtc restrictions - */ -@protocol QBRTCClientDelegate - -/** - * Protocol methods down below are optional and not required to be implemented. - */ -@optional - -/** - * Called when someone started a new session with you. - * - * @param session QBRTCSession instance - * @param userInfo The user information dictionary for the new session. May be nil. - */ -- (void)didReceiveNewSession:(QBRTCSession *)session userInfo:(nullable NSDictionary *)userInfo; - -/** - * Called in case when user did not respond to your call within timeout. - * - * @param userID ID of user - * - * @remark use +[QBRTCConfig setAnswerTimeInterval:value] to set answer time interval - * default value: 45 seconds - */ -- (void)session:(QBRTCSession *)session userDidNotRespond:(NSNumber *)userID; - -/** - * Called in case when user rejected you call. - * - * @param userID ID of user - * @param userInfo The user information dictionary for the reject call. May be nil - */ -- (void)session:(QBRTCSession *)session rejectedByUser:(NSNumber *)userID userInfo:(nullable NSDictionary *)userInfo; - -/** - * Called in case when user accepted your call. - * - * @param userID ID of user - */ -- (void)session:(QBRTCSession *)session acceptedByUser:(NSNumber *)userID userInfo:(nullable NSDictionary *)userInfo; - -/** - * Called when user hung up. - * - * @param session QBRTCSession instance - * @param userID ID of user - * @param userInfo The user information dictionary for the hung up. May be nil. - */ -- (void)session:(QBRTCSession *)session hungUpByUser:(NSNumber *)userID userInfo:(nullable NSDictionary *)userInfo; - -/** - * Called when session is closed. - * - * @param session QBRTCSession instance - */ -- (void)sessionDidClose:(QBRTCSession *)session; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCConferenceClient.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCConferenceClient.h deleted file mode 100644 index abd6886e2..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCConferenceClient.h +++ /dev/null @@ -1,85 +0,0 @@ -// -// QBRTCConferenceClient.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCBaseClient.h" - -#import "QBRTCConferenceClientDelegate.h" -#import "QBRTCTypes.h" - -@class QBRTCConferenceSession; - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCConferenceClient class interface. - * Represents conference client and session management. - * - * @note Enterprise-only feature, conferenceEndpoint param must be set in QBRTCConfig - * - * @see QBRTCConfig, https://quickblox.com/plans/ - */ -@interface QBRTCConferenceClient : QBRTCBaseClient - -/** - * QBRTCConferenceClient shared instance - * - * @return QBRTCConferenceClient instance - */ -+ (instancetype)instance; - -/** - * Add delegate to the observers list. - * - * @param delegate delegate that conforms to QBRTCConferenceClientDelegate protocol - * - * @see QBRTCConferenceClientDelegate - */ -- (void)addDelegate:(id)delegate; - -/** - * Remove delegate from the observers list. - * - * @param delegate delegate that conforms to QBRTCConferenceClientDelegate protocol - * - * @see QBRTCConferenceClientDelegate - */ -- (void)removeDelegate:(id)delegate; - -/** - * Send create session request with conference type. - * - * @param chatDialogID chat dialog ID - * @param conferenceType conference type (video/audio) - * - * @note Returns session without ID. When session will be created on server - * ID will be assigned and session will be returned in 'didCreateNewSession:' callback. - * - * @see QBRTCConferenceClientDelegate, QBRTCConferenceType - */ -- (QBRTCConferenceSession *)createSessionWithChatDialogID:(NSString *)chatDialogID conferenceType:(QBRTCConferenceType)conferenceType; - -@end - -@interface QBRTCConferenceClient (Deprecated) - -/** - * Send create session request. - * - * @note Returns session without ID. When session will be created on server - * ID will be assigned and session will be returned in 'didCreateNewSession:' callback. - * - * @see QBRTCConferenceClientDelegate - * - * @param chatDialogID chat dialog ID - * - * @warning Deprecated in 2.6.1. Use 'createSessionWithChatDialogID:conferenceType:' instead. This deprecated method will automatically create session with conference type QBRTCConferenceTypeVideo. - */ -- (QBRTCConferenceSession *)createSessionWithChatDialogID:(NSString *)chatDialogID DEPRECATED_MSG_ATTRIBUTE("Deprecated in 2.6.1. Use 'createSessionWithChatDialogID:conferenceType:' instead. This deprecated method will automatically create session with conference type QBRTCConferenceTypeVideo."); - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCConferenceClientDelegate.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCConferenceClientDelegate.h deleted file mode 100644 index 2efd8e5af..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCConferenceClientDelegate.h +++ /dev/null @@ -1,134 +0,0 @@ -// -// QBRTCConferenceClientDelegate.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCBaseClientDelegate.h" - -#import "QBRTCTypes.h" - -@class QBRTCConferenceSession; - -/** - * Conference client protocol. - * - * @note Enterprise-only feature - * - * @see QBRTCConferenceClient, https://quickblox.com/plans/ - */ -@protocol QBRTCConferenceClientDelegate - -/** - * Protocol methods down below are optional and not required to be implemented. - */ -@optional - -/** - * Called when session was created on server. - * - * @param session QBRTCConferenceSession instance - * - * @discussion When this method is called, session instance that was already created by QBRTCConferenceClient - * will be assigned valid session ID from server. - * - * @see QBRTCConferenceSession, QBRTCConferenceClient - */ -- (void)didCreateNewSession:(QBRTCConferenceSession *)session; - -/** - * Called when join to session is performed and acknowledged by server. - * - * @param session QBRTCConferenceSession instance - * @param chatDialogID chat dialog ID - * @param publishersList array of user IDs, that are currently publishers - * - * @see QBRTCConferenceSession - */ -- (void)session:(QBRTCConferenceSession *)session didJoinChatDialogWithID:(NSString *)chatDialogID publishersList:(NSArray *)publishersList; - -/** - * Called when new publisher did join. - * - * @param session QBRTCConferenceSession instance - * @param userID new publisher user ID - * - * @see QBRTCConferenceSession - */ -- (void)session:(QBRTCConferenceSession *)session didReceiveNewPublisherWithUserID:(NSNumber *)userID; - -/** - * Called when publisher did leave. - * - * @param session QBRTCConferenceSession instance - * @param userID publisher that left user ID - * - * @see QBRTCConferenceSession - */ -- (void)session:(QBRTCConferenceSession *)session publisherDidLeaveWithUserID:(NSNumber *)userID; - -/** - * Called when session did receive error from server. - * - * @param session QBRTCConferenceSession instance - * @param error received error from server - * - * @note Error doesn't necessarily means that session is closed. Can be just a minor error that can be fixed/ignored. - * - * @see QBRTCConferenceSession - */ -- (void)session:(QBRTCConferenceSession *)session didReceiveError:(NSError *)error; - -/** - * Called when slowlink was received. - * - * @param session QBRTCConferenceSession instance - * @param uplink whether the issue is uplink or not - * @param nacks number of nacks - * - * @discussion this callback is triggered when serber reports trouble either sending or receiving media on the - * specified connection, typically as a consequence of too many NACKs received from/sent to the user in the last - * second: for instance, a slowLink with uplink=true means you notified several missing packets from server, - * while uplink=false means server is not receiving all your packets. - * - * @note useful to figure out when there are problems on the media path (e.g., excessive loss), in order to - * possibly react accordingly (e.g., decrease the bitrate if most of our packets are getting lost). - * - * @see QBRTCConferenceSession - */ -- (void)session:(QBRTCConferenceSession *)session didReceiveSlowlinkWithUplink:(BOOL)uplink nacks:(NSNumber *)nacks; - -/** - * Called when media receiving state was changed on server. - * - * @param session QBRTCConferenceSession instance - * @param mediaType media type - * @param receiving whether media is receiving by server - * - * @see QBRTCConferenceSession, QBRTCConferenceMediaType - */ -- (void)session:(QBRTCConferenceSession *)session didChangeMediaStateWithType:(QBRTCConferenceMediaType)mediaType receiving:(BOOL)receiving; - -/** - * Session did initiate close request. - * - * @param session QBRTCConferenceSession instance - * - * @discussion 'sessionDidClose:withTimeout:' will be called after server will close session with callback - * - * @see QBRTCConferenceSession - */ -- (void)sessionWillClose:(QBRTCConferenceSession *)session; - -/** - * Called when session was closed completely on server. - * - * @param session QBRTCConferenceSession instance - * @param timeout whether session was closed due to timeout on server - * - * @see QBRTCConferenceSession - */ -- (void)sessionDidClose:(QBRTCConferenceSession *)session withTimeout:(BOOL)timeout; - -@end diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCConferenceSession.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCConferenceSession.h deleted file mode 100644 index 06ed6d26a..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCConferenceSession.h +++ /dev/null @@ -1,89 +0,0 @@ -// -// QBRTCConferenceSession.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCBaseSession.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * Conference session class interface. - * - * @note Enterprise-only feature - * - * @see https://quickblox.com/plans/ - */ -@interface QBRTCConferenceSession : QBRTCBaseSession - -/** - * Conference session ID. - * - * @note Nil when session is newly created. Only assigned after callback from server 'didCreateNewSession:'. - * - * @see QBRTCConferenceClientDelegate - */ -@property (strong, nonatomic, readonly, nullable) NSNumber *ID; - -/** - * Session chat dialog ID. - */ -@property (strong, nonatomic, readonly) NSString *chatDialogID; - -/** - * Session current active publishers list. - */ -@property (strong, nonatomic, readonly) NSArray *publishersList; - -/** - * Request list of online participants in current room. - * - * @note Session must receive session created callback first from server. - * - * @param completionBlock completion block with publishers and listeners list - */ -- (void)listOnlineParticipantsWithCompletionBlock:(void(^)(NSArray *publishers, NSArray *listeners))completionBlock; - -/** - * Perform join room as publisher. - * - * @discussion 'session:didJoinChatDialogWithID:publishersList:' will be called upon successful join. - * - * @see QBRTCConferenceClientDelegate - */ -- (void)joinAsPublisher; - -/** - * Leave chat room and close session. - * - * @discussion 'sessionWillClose:' will be called when all connection are closed, 'sessionDidClose:withTimeout:' will be called when session will be successfully closed by server. - */ -- (void)leave; - -/** - * Subscribe to publisher's with user ID feed. - * - * @param userID active publisher's user ID - * - * @discussion If you want to receive publishers feeds, you need to subscribe to them. - * - * @note User must be an active publisher. - */ -- (void)subscribeToUserWithID:(NSNumber *)userID; - -/** - * Unsubscribe from publisher's with user ID feed. - * - * @param userID active publisher's user ID - * - * @discussion Do not need to be used when publisher did leave room, in that case unsibscribing will be performing automatically. Use if you need to unsubscribe from active publisher's feed. - * - * @note User must be an active publisher. - */ -- (void)unsubscribeFromUserWithID:(NSNumber *)userID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCConfig.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCConfig.h deleted file mode 100644 index b758eba67..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCConfig.h +++ /dev/null @@ -1,193 +0,0 @@ -// -// QBRTCConfig.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -#import "QBRTCTypes.h" - -NS_ASSUME_NONNULL_BEGIN - -@class QBRTCMediaStreamConfiguration; -@class QBRTCICEServer; - -/// Main class to configure QuickbloxWebRTC settings -@interface QBRTCConfig : NSObject - -- (instancetype)init NS_UNAVAILABLE; - -// MARK: ICE configuration - -/** - * Set custom ICE servers - * By default our Quickblox STUN & TURN servers are used - * - For example: - - NSString *userName = @"quickblox"; - NSString *password = @"baccb97ba2d92d71e26eb9886da5f1e0"; - - NSArray *urls = @[ - @"stun:turn.quickblox.com", - @"turn:turn.quickblox.com:3478?transport=udp", - @"turn:turn.quickblox.com:3478?transport=tcp" - ]; - - QBRTCICEServer *server = [QBRTCICEServer serverWithURLs:urls username:userName password:password]; - [QBRTCConfig setICEServers:@[server]]; - * - * @param iceServers array of QBRTCICEServer instances - */ -+ (void)setICEServers:(NSArray *)iceServers; - -/** - * Get custom ICE servers - * - * @return array of QBRTCICEServer instances - */ -+ (NSArray *)iceServers; - -// MARK: Time interval - -/** - * Set dialing time interval - * - * Indicates how often we send notifications to your opponents about your call - * - * Default value: 5 seconds - * Minimum value: 3 seconds - * @param dialingTimeInterval time in seconds - */ -+ (void)setDialingTimeInterval:(NSTimeInterval)dialingTimeInterval; - -/** - * Set answer time interval - * - * If an opponent did not answer you within dialing time interval, then - * userDidNotRespond: and then connectionClosedForUser: delegate methods will be called - * - * Default value: 45 seconds - * Minimum value: 10 seconds - * @param answerTimeInterval time interval in seconds - */ -+ (void)setAnswerTimeInterval:(NSTimeInterval)answerTimeInterval; - -/** - * Dialing time interval - * - * @return current dialing time interval - */ -+ (NSTimeInterval)dialingTimeInterval; - -/** - * Answer time interval - * - * @return current answer time interval; - */ -+ (NSTimeInterval)answerTimeInterval; - -// MARK: Datagram Transport Layer Security - -/** - * Enable / Disable Datagram Transport Layer Security - * - * @param enabled YES/NO (default YES) - */ -+ (void)setDTLSEnabled:(BOOL)enabled; - -/** - * Datagram Transport Layer Security state - * - * @return current value (default YES) - */ -+ (BOOL)DTLSEnabled; - -// MARK: Media stream configuration - -/** - * Setter for media stream configuration - * - * @param configuration QBRTCMediaStreamConfiguration configuration - */ -+ (void)setMediaStreamConfiguration:(QBRTCMediaStreamConfiguration *)configuration; - -/** - * Media stream configuration - * by default it is [QBRTCMediaStreamConfiguration defaultConfiguration] - * - * @return QBRTCMediaStreamConfiguration instance - */ -+ (QBRTCMediaStreamConfiguration *)mediaStreamConfiguration; - -// MARK: Stats reports - -/** - * Set Stats report time interval. Default 0 which means you never receive stats - * - * @note low time interval affects on CPU performance - * @param timeInterval time interval in seconds - */ -+ (void)setStatsReportTimeInterval:(NSTimeInterval)timeInterval; - -/** - * Current stats report time interval - * - * @return current value - */ -+ (NSTimeInterval)statsReportTimeInterval; - -// MARK: Logging - -/** - * Set QuickbloxWebRTC SDK log level (by default: QBRTCLogLevelDebug). - * - * Possible values: - * QBRTCLogLevelNothing: Nothing in Log - * QBRTCLogLevelErrors: Can see Errors - * QBRTCLogLevelWarnings: Can see Warnings - * QBRTCLogLevelInfo: Some Information Logs - * QBRTCLogLevelVerbose: Full QuickbloxWebRTC Log - * QBRTCLogLevelVerboseWithWebRTC: Full QuickbloxWebRTC and WebRTC native Log - * - * - * @param logLevel New log level - */ -+ (void)setLogLevel:(QBRTCLogLevel)logLevel; - -/** - * Get QuickbloxWebRTC SDK log level (by default: QBRTCLogLevelDebug). - * - * @return QBRTCLogLevel current log level - */ -+ (QBRTCLogLevel)logLevel; - -// MARK: Conference - -/** - * Set conference server endpoint. - * - * @param conferenceEndpoint Quickblox conference server endpoint - * - * @note Enterprise-only feature - * - * @see https://quickblox.com/plans/ - */ -+ (void)setConferenceEndpoint:(NSString *)conferenceEndpoint; - -/** - * Current Quickblox conference server endpoint - * - * @note Enterprise-only feature, might be nil - * - * @see https://quickblox.com/plans/ - * - * @return Current conference server endpoint - */ -+ (nullable NSString *)conferenceEndpoint; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCICEServer.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCICEServer.h deleted file mode 100644 index 8afffe977..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCICEServer.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// QBRTCICEServer.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -/** - * Entity to describe Stun or TURN ICE server - */ -@interface QBRTCICEServer : NSObject - -@property (nonatomic, copy, readonly) NSString *userName; -@property (nonatomic, copy, readonly) NSString *password; -@property (nonatomic, copy, readonly) NSArray *urls; - -/** - * Initializer for RTCICEServer taking urls, username, and password. - */ -+ (instancetype)serverWithURLs:(NSArray *)URLs - username:(NSString *)username - password:(NSString *)password; - -- (instancetype)init NS_UNAVAILABLE; - -@end diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCLocalAudioTrack.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCLocalAudioTrack.h deleted file mode 100644 index 5f21364c6..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCLocalAudioTrack.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// QBRTCLocalAudioTrack.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCMediaStreamTrack.h" - -/** - * QBRTCLocalAudioTrack class interface. - * This class represents local audio track. - */ -@interface QBRTCLocalAudioTrack : QBRTCMediaStreamTrack - -@end diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCLocalVideoTrack.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCLocalVideoTrack.h deleted file mode 100644 index 58d1bda76..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCLocalVideoTrack.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// QBRTCLocalVideoTrack.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCMediaStreamTrack.h" - -@class QBRTCVideoCapture; - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCLocalVideoTrack class interface. - * This class represents local video track. - */ -@interface QBRTCLocalVideoTrack : QBRTCMediaStreamTrack - -/** - * Video capture instance. - */ -@property (weak, nonatomic, nullable) QBRTCVideoCapture *videoCapture; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCLog.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCLog.h deleted file mode 100644 index 3d0e238a8..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCLog.h +++ /dev/null @@ -1,54 +0,0 @@ -// -// QBRTCLog.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCTypes.h" - -#if defined(__cplusplus) -extern "C" void QBRTCLogEx(QBRTCLogLevel severity, NSString* logString); -extern "C" void QBRTCSetMinDebugLogLevel(QBRTCLogLevel severity); -extern "C" NSString* QBRTCFileName(const char* filePath); -#else -// Wrapper for C++ LOG(sev) macros. -// Logs the log string to the webrtc logstream for the given severity. -extern void QBRTCLogEx(QBRTCLogLevel severity, NSString* logString); -// Wrapper for rtc::LogMessage::LogToDebug. -// Sets the minimum severity to be logged to console. -extern void QBRTCSetMinDebugLogLevel(QBRTCLogLevel severity); -extern NSString* QBRTCFileName(const char* file_path); -#endif - -#define QBRTCLogString(format, ...) \ - [NSString stringWithFormat:@"rtc::" format, \ - ##__VA_ARGS__] - -#define QBRTCLogFormat(severity, format, ...) \ - do { \ - NSString *logString = QBRTCLogString(format, ##__VA_ARGS__); \ - QBRTCLogEx(severity, logString); \ - } while (false) - -#define QBRTCLogVerbose(format, ...) \ - QBRTCLogFormat(QBRTCLogLevelVerbose, format, ##__VA_ARGS__) \ - -#define QBRTCLogInfo(format, ...) \ - QBRTCLogFormat(QBRTCLogLevelInfo, format, ##__VA_ARGS__) \ - -#define QBRTCLogWarning(format, ...) \ - QBRTCLogFormat(QBRTCLogLevelWarnings, format, ##__VA_ARGS__) \ - -#define QBRTCLogError(format, ...) \ - QBRTCLogFormat(QBRTCLogLevelErrors, format, ##__VA_ARGS__) \ - -#if !defined(DEBUG) - #define QBRTCLogDebug(format, ...) QBRTCLogInfo(format, ##__VA_ARGS__) -#else - #define QBRTCLogDebug(format, ...) \ - do { \ - } while (false) -#endif - -#define QBRTCLog(format, ...) QBRTCLogInfo(format, ##__VA_ARGS__) diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCMediaStream.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCMediaStream.h deleted file mode 100644 index 38a301025..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCMediaStream.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// QBLocalMediaStream.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -@class QBRTCLocalAudioTrack; -@class QBRTCLocalVideoTrack; - -NS_ASSUME_NONNULL_BEGIN - -/** - * Media stream class holds media information such as video and audio tracks - * Class is access from QBRTCSession class, localMediaStream property - */ -@interface QBRTCMediaStream : NSObject - -/// Audio track, can be enabled or disabled -@property (strong, nonatomic, readonly) QBRTCLocalAudioTrack *audioTrack; - -/// Video track, can be enabled or disabled -@property (strong, nonatomic, readonly) QBRTCLocalVideoTrack *videoTrack; - -// Unavailable initializers -+ (instancetype)new NS_UNAVAILABLE; -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCMediaStreamConfiguration.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCMediaStreamConfiguration.h deleted file mode 100644 index ca0995271..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCMediaStreamConfiguration.h +++ /dev/null @@ -1,83 +0,0 @@ -// -// QBRTCMediaStreamConfiguration.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -typedef NS_ENUM(NSUInteger, QBRTCAudioCodec) { - - QBRTCAudioCodecOpus, - QBRTCAudioCodecISAC, - QBRTCAudioCodeciLBC -}; - -typedef NS_ENUM(NSUInteger, QBRTCVideoCodec) { - - QBRTCVideoCodecVP8, // VP8 video codec, software - QBRTCVideoCodecH264, // H264 video codec, hardware, preferred -}; - -NS_ASSUME_NONNULL_BEGIN - -#pragma mark - Codecs - -/** - * QBRTCMediaStreamConfiguration class allows to configure audio and video settings - * - * Default media stream configuration available with [QBRTCConfig mediaStreamConfiguration] - * - * You can instantiate defaulConfiguration, change and then apply with [QBRTCConfig setMediaStreamConfiguration:] - */ -@interface QBRTCMediaStreamConfiguration : NSObject - -/** - * Audio codec - * - * @note audioCodec QBRTCAudioCodecOpus, QBRTCAudioCodecISAC or QBRTCAudioCodeciLBC are possible values - */ -@property (nonatomic, assign) QBRTCAudioCodec audioCodec; - -/** - * Audio bandwidth - * - * When set to 0 it is skipped in session description - */ -@property (nonatomic, assign) NSInteger audioBandwidth; - -/** - * Video codec - * - * @remark QBRTCVideoCodecVP8 or QBRTCVideoCodecH264 are possible values - */ -@property (nonatomic, assign) QBRTCVideoCodec videoCodec; - -/** - * Video bandwidth - * - * When set to 0 it is skipped in session description - */ -@property (nonatomic, assign) NSInteger videoBandwidth; - -/** - * Audio level control. - * - * @discussion Determines whether webrtc audio level control is enabled. Rough example: slightly reducing - * audio volume for all tracks while you are talking (local audio track receiving sound). - * - * @remark Default value: NO - */ -@property (nonatomic, assign, getter=isAudioLevelControlEnabled) BOOL audioLevelControlEnabled; - -/** - * Default media stream configuration with H264 video codec and Opus audio codec - * - * @return QBRTCMediaStreamConfiguration instance - */ -+ (instancetype)defaultConfiguration; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCMediaStreamTrack.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCMediaStreamTrack.h deleted file mode 100644 index 4326b0e20..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCMediaStreamTrack.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// QBRTCMediaStreamTrack.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCMediaStreamTrack class interface. - * Base class to describe class with media information. - */ -@interface QBRTCMediaStreamTrack : NSObject - -/** - * Media track user ID. - * - * @note nil for local - */ -@property (strong, nonatomic, readonly, nullable) NSNumber *userID; - -/** - * Determines whether track is enabled or disabled for stream. - */ -@property (assign, nonatomic, getter=isEnabled) BOOL enabled; - -// unavailable initializers -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCRecorder.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCRecorder.h deleted file mode 100644 index c530a8b26..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCRecorder.h +++ /dev/null @@ -1,130 +0,0 @@ -// -// QBRTCRecorder.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -#import "QBRTCTypes.h" - -@class QBRTCAudioTrack; -@class QBRTCVideoTrack; -@class QBRTCRecorder; - -NS_ASSUME_NONNULL_BEGIN - -/** - QBRTCRecorder state. - - - QBRTCRecorderStateNotActive: not active - - QBRTCRecorderStateActive: active and recording or waiting for media data - - QBRTCRecorderStateFinalizing: finalizing recording file - */ -typedef NS_ENUM(NSUInteger, QBRTCRecorderState) { - QBRTCRecorderStateNotActive, - QBRTCRecorderStateActive, - QBRTCRecorderStateFinalizing -}; - -@protocol QBRTCRecorderDelegate - -/** - Called when recorder did fail to record at some point. - - @param recorder QBRTCRecorder instance - @param error specific error - */ -- (void)recorder:(QBRTCRecorder *)recorder didFailWithError:(NSError *)error; - -@end - -/** - QBRTCRecorder class interface. - This class represents webrtc audio/video recorder. - */ -@interface QBRTCRecorder : NSObject - -/** - Current output file url. - */ -@property (strong, nonatomic, readonly, nullable) NSURL *outputFileURL; - -/** - Recorder state. - - @see QBRTCRecorderState - */ -@property (assign, atomic, readonly) QBRTCRecorderState state; - -/** - Determines whether microphone should be muted on record. - - @discussion Can be set at any time of class instance life. - */ -@property (assign, nonatomic, getter=isMicrophoneMuted) BOOL microphoneMuted; - -/** - Delegate that conforms to QBRTCRecorderDelegate protocol. - */ -@property (weak, nonatomic, nullable) id delegate; - -// unavailable initializers -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -/** - Set video recording format. - - @param width video width - @param height video height - @param bitrate video bitrate - @param fps video fps - - @note You can only set this params while recording is not in active state (e.g. haven't started yet). - - @remark Default values are 640x480 with 636528 bitrate 30 fps - - @see https://www.dr-lex.be/info-stuff/videocalc.html for bitrate calculation - */ -- (void)setVideoRecordingWidth:(NSUInteger)width - height:(NSUInteger)height - bitrate:(NSUInteger)bitrate - fps:(NSUInteger)fps; - -/** - Set video recording orientation. - - @param videoRotation video rotation - - @note You can only set this params while recording is not in active state (e.g. haven't started yet). - Cannot be changed mid record. - - @remark Default is 0 degrees, e.g. landscape orientation. - */ -- (void)setVideoRecordingRotation:(QBRTCVideoRotation)videoRotation; - -/** - Start record with url. - - @param url preferred file url - - @note Url must contain mp4 extension. - */ -- (void)startRecordWithFileURL:(NSURL *)url; - -/** - Stop record. - - @param completion completion block with file url if record was successful - - @discussion Async operation that might take some time until record is finalized. - - @note File url will be nil if record failed, didn't start or there was nothing to record. - */ -- (void)stopRecord:(nullable void (^)(NSURL * _Nullable file))completion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCRemoteVideoView.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCRemoteVideoView.h deleted file mode 100644 index 42fb94039..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCRemoteVideoView.h +++ /dev/null @@ -1,60 +0,0 @@ -// -// QBRTCRemoteVideoView.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import -#import -#import "RTCVideoRenderer.h" - -NS_ASSUME_NONNULL_BEGIN - -@class QBRTCRemoteVideoView; -@class QBRTCVideoTrack; - -@protocol QBRTCRemoteVideoViewDelegate - -/** - * Called when video view size was changed. - * - * @param videoView QBRTCRemoteVideoView instance - * @param size new size - */ -- (void)videoView:(QBRTCRemoteVideoView *)videoView didChangeVideoSize:(CGSize)size; - -@end - -/** - * QBRTCRemoteVideoView is an RTCVideoRenderer which renders video frames in its - * bounds using OpenGLES 2.0. - */ -@interface QBRTCRemoteVideoView : UIView - -/** - * Delegate that conforms to QBRTCRemoteVideoViewDelegate protocol. - * - * @see QBRTCRemoteVideoViewDelegate - */ -@property (nonatomic, weak) id delegate; - -/** - * Options are AVLayerVideoGravityResizeAspect, AVLayerVideoGravityResizeAspectFill - * and AVLayerVideoGravityResize. AVLayerVideoGravityResizeAspect is default. - * See for a description of these options. - * - * Default value: AVLayerVideoGravityResize - */ -@property (nonatomic, copy) NSString *videoGravity; - -/** - * Set video track - * - * @param videoTrack QBRTCVideoTrack instance - */ -- (void)setVideoTrack:(QBRTCVideoTrack *)videoTrack; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCSession.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCSession.h deleted file mode 100644 index 74ddd088b..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCSession.h +++ /dev/null @@ -1,87 +0,0 @@ -// -// QBRTCSession.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCBaseSession.h" - -@class QBRTCRecorder; - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCSession class interface. - * This class is storing information about rtc session, tracks and opponents. - * - * @see QBRTCBaseSession - */ -@interface QBRTCSession : QBRTCBaseSession - -/** - * Calls recorder. - * - * @discussion Class instance for calls record. Recording remote video and audio track plus local microphone. - * - * @note Available only for 1 to 1 audio and video calls, nil otherwise. Not available for low performance devices, - * such as iPod1,1, iPod2,1, iPod3,1, iPod4,1, iPod5,1, iPhone1,1, iPhone1,2, iPhone2,1, iPhone3,1, iPhone4,1, iPad1,1, - * iPad2,1, iPad2,2, iPad2,3, iPad2,4, iPad2,5, iPad2,6, iPad2,7. - * Will become nil if record was finished and finalized AND session was closed. - * - * @see UIDevice+QBPerformance, qbrtc_lowPerformanceDevices - */ -@property (strong, nonatomic, nullable) QBRTCRecorder *recorder; - -/** - * Unique session identifier. - */ -@property (strong, nonatomic, readonly) NSString *ID; - -/** - * Session initiator user ID. - */ -@property (strong, nonatomic, readonly) NSNumber *initiatorID; - -/** - * Current user ID. - */ -@property (assign, nonatomic, readonly) NSNumber *currentUserID; - -/** - * IDs of opponents in current session. - */ -@property (strong, nonatomic, readonly) NSArray *opponentsIDs; - -/** - * Start call. Opponent will receive new session signal in QBRTCClientDelegate method 'didReceiveNewSession:userInfo: - * called by startCall: or acceptCall: - * - * @param userInfo The user information dictionary for the stat call. May be nil. - */ -- (void)startCall:(nullable NSDictionary *)userInfo; - -/** - * Accept call. Opponent's will receive accept signal in QBRTCClientDelegate method 'session:acceptedByUser:userInfo:' - * - * @param userInfo The user information dictionary for the accept call. May be nil. - */ -- (void)acceptCall:(nullable NSDictionary *)userInfo; - -/** - * Reject call. Opponent's will receive reject signal in QBRTCClientDelegate method 'session:rejectedByUser:userInfo:' - * - * @param userInfo The user information dictionary for the reject call. May be nil. - */ -- (void)rejectCall:(nullable NSDictionary *)userInfo; - -/** - * Hang up. Opponent's will receive hung up signal in QBRTCClientDelegate method 'session:hungUpByUser:userInfo:' - * - * @param userInfo The user information dictionary for the hang up. May be nil. - */ -- (void)hangUp:(nullable NSDictionary *)userInfo; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCStatsReport.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCStatsReport.h deleted file mode 100644 index 97f960311..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCStatsReport.h +++ /dev/null @@ -1,290 +0,0 @@ -// -// QBRTCStatsBuilder.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class QBRTCBitrateTracker; - -/** - * QBRTCStatsReport class interface. - * This class represents stats for calls. - */ -@interface QBRTCStatsReport : NSObject - -// MARK: Bitrate trackers - -/* Bitrate trackers below used to estimate bitrate based on byte count. It is expected that -* byte count is monotonocially increasing. This class tracks the times that -* byte count is updated, and measures the bitrate based on the byte difference -* over the interval between updates. -*/ - -/// Audio received bitrate tracker -@property (nonatomic, strong, readonly) QBRTCBitrateTracker *audioReceivedBitrateTracker; - -/// Audio send bitrate tracker -@property (nonatomic, strong, readonly) QBRTCBitrateTracker *audioSendBitrateTracker; - -/// Connection received bitrate tracker -@property (nonatomic, strong, readonly) QBRTCBitrateTracker *connectionReceivedBitrateTracker; - -/// Connection send bitrate tracker -@property (nonatomic, strong, readonly) QBRTCBitrateTracker *connectionSendBitrateTracker; - -/// Video received bitrate tracker -@property (nonatomic, strong, readonly) QBRTCBitrateTracker *videoReceivedBitrateTracker; - -/// Video send bitrate tracker -@property (nonatomic, strong, readonly) QBRTCBitrateTracker *videoSendBitrateTracker; - -// MARK: Connection stats - -/// Total number of bytes received for this connection -@property (nonatomic, readonly, nullable) NSString *connectionReceivedBitrate; - -/// Total number of bytes send for this connection -@property (nonatomic, readonly, nullable) NSString *connectionSendBitrate; - -/* Estimated round trip time (ms) for this connection. - * RTT is the length of time it takes for a signal to be sent plus the length of time it takes for an acknowledgment of that signal to be received. - */ -@property (nonatomic, readonly, nullable) NSString *connectionRoundTripTime; - -/// Type of local ice candidate e.g. local or relay -@property (nonatomic, readonly, nullable) NSString *localCandidateType; - -/// Type of remote ice candidate e.g. local or relay -@property (nonatomic, readonly, nullable) NSString *remoteCandidateType; - -/// Transport type: UDP or TCP. TCP is usually used with TURN server -@property (nonatomic, readonly, nullable) NSString *transportType; - -// Whether connection is active or not -@property (nonatomic, readonly, nullable) NSString *transportConnectionIsActive; - -// Check if valid incoming ICE request has been received -@property (nonatomic, readonly, nullable) NSString *readableIceRequest; - -// Check if valid incoming ICE request has been received and ACK to an ICE request. -@property (nonatomic, readonly, nullable) NSString *writableIceRequest; - -/// Total number of RTP packets sent for this connection. Calculated as defined in [RFC3550] section 6.4.1. -@property (nonatomic, readonly, nullable) NSString *packetsSent; - -/// Packets discarded on send -@property (nonatomic, readonly, nullable) NSString *packetsDiscardedOnSend; - -/// It is a unique identifier that is associated to the object that was inspected to produce the RTCIceCandidateAttributes for the local candidate associated with this candidate pair. -@property (nonatomic, readonly, nullable) NSString *localCandidateID; - -/// Identifier for the channel. Example: "Channel-audio-1" -@property (nonatomic, readonly, nullable) NSString *channelID; - -/// Local address with port, example: 192.168.2.45:63061 -@property (nonatomic, readonly, nullable) NSString *localAddress; - -/// Remote address with port, example: 192.168.2.45:63061 -@property (nonatomic, readonly, nullable) NSString *remoteAddress; - -// MARK: Bandwidth Estimation stats - -/// Actual encoding bitrate, bit/s -@property (nonatomic, readonly, nullable) NSString *actualEncodingBitrate; - -/// How much receive bandwidth we estimate we have, bit/s -@property (nonatomic, readonly, nullable) NSString *availableReceiveBandwidth; - -/// How much send bandwidth we estimate we have, bit/s -@property (nonatomic, readonly, nullable) NSString *availableSendBandwidth; - -/// Target encoding bitrate, bit/s -@property (nonatomic, readonly, nullable) NSString *targetEncodingBitrate; - -/// Bucket delay -@property (nonatomic, readonly, nullable) NSString *bucketDelay; - -/// Retransmit bitrate, bit/s -@property (nonatomic, readonly, nullable) NSString *retransmitBitrate; - -/// The actual transmit bitrate, bit/s -@property (nonatomic, readonly, nullable) NSString *transmitBitrate; - -// MARK: Video send stats - -/// Video packets lost -@property (nonatomic, readonly, nullable) NSString *videoSendPacketsLost; - -/// Video packets send -@property (nonatomic, readonly, nullable) NSString *videoSendPacketsSent; - -/// Video send encode usage percent -@property (nonatomic, readonly, nullable) NSString *videoSendEncodeUsagePercent; - -/// Video send unique identifier -@property (nonatomic, readonly, nullable) NSString *videoSendTrackID; - -/// Average video encoding time -@property (nonatomic, readonly, nullable) NSString *videoSendEncodeMs; - -/// Video send input frame rate -@property (nonatomic, readonly, nullable) NSString *videoSendInputFps; - -/// Video send input height -@property (nonatomic, readonly, nullable) NSString *videoSendInputHeight; - -/// Video send input width -@property (nonatomic, readonly, nullable) NSString *videoSendInputWidth; - -/// Video send codec: VP8 or H264 -@property (nonatomic, readonly, nullable) NSString *videoSendCodec; - -/// Video send bitrate -@property (nonatomic, readonly, nullable) NSString *videoSendBitrate; - -/// Video send frames per second (FPS) -@property (nonatomic, readonly, nullable) NSString *videoSendFps; - -/// Video send height -@property (nonatomic, readonly, nullable) NSString *videoSendHeight; - -/// Video send width -@property (nonatomic, readonly, nullable) NSString *videoSendWidth; - -/// Video send NACKs received -@property (nonatomic, readonly, nullable) NSString *videoSendNacksReceived; - -/// Video send plis received -@property (nonatomic, readonly, nullable) NSString *videoSendPlisReceived; - -/// Video send view limited resolution -@property (nonatomic, readonly, nullable) NSString *videoSendViewLimitedResolution; - -/// Video send cpu limited resolution -@property (nonatomic, readonly, nullable) NSString *videoSendCpuLimitedResolution; - -// MARK: Video receive stats - -// Packets lost on video received -@property (nonatomic, readonly, nullable) NSString *videoReceivedPacketsLost; - -/// Time spent decoding video in ms -@property (nonatomic, readonly, nullable) NSString *videoReceivedDecodeMs; - -/// Video received decoded frames per second (FPS) -@property (nonatomic, readonly, nullable) NSString *videoReceivedDecodedFps; - -/* Video received output frames per second (FPS) - * Real frames per second output, after processing - **/ -@property (nonatomic, readonly, nullable) NSString *videoReceivedOutputFps; - -/// Video received frames per second (FPS) -@property (nonatomic, readonly, nullable) NSString *videoReceivedFps; - -/// Video received bitrate -@property (nonatomic, readonly, nullable) NSString *videoReceivedBitrate; - -/// Video received height -@property (nonatomic, readonly, nullable) NSString *videoReceivedHeight; - -/// Video received width -@property (nonatomic, readonly, nullable) NSString *videoReceivedWidth; - -// MARK: Audio send stats - -/// Audio send bitrate -@property (nonatomic, readonly, nullable) NSString *audioSendBitrate; - -/** Audio send input level - * You can use this property even if audio track is disabled - * to check if user is currently speaking/talking etc. - */ -@property (nonatomic, readonly, nullable) NSString *audioSendInputLevel; - -/// As audioSendBitrate, but without any changes or processing -@property (nonatomic, readonly, nullable) NSString *audioSendBytesSent; - -/// Audio send packets lost -@property (nonatomic, readonly, nullable) NSString *audioSendPacketsLost; - -/// Audio send packets sent -@property (nonatomic, readonly, nullable) NSString *audioSendPacketsSent; - -/// Audio send codec: OPUS, ISAC or iLBC -@property (nonatomic, readonly, nullable) NSString *audioSendCodec; - -/// Audio send track unique identifier -@property (nonatomic, readonly, nullable) NSString *audioSendTrackID; - -///Receive-side jitter in milliseconds -@property (nonatomic, readonly, nullable) NSString *audioSendJitterReceived; - -// MARK: Audio receive stats - -@property (nonatomic, readonly, nullable) NSString *audioReceivedOutputLevel; - -/// Audio received current delay, in ms -@property (nonatomic, readonly, nullable) NSString *audioReceivedCurrentDelay; - -/// Received audio packets lost -@property (nonatomic, readonly, nullable) NSString *audioReceivedPacketsLost; - -/// Received audio packets number -@property (nonatomic, readonly, nullable) NSString *audioReceivedPacketsReceived; - -/// Audio received track unique identifier -@property (nonatomic, readonly, nullable) NSString *audioReceivedTrackId; - -/// The speech expand rate measures the amount of speech expansion done by NetEQ -@property (nonatomic, readonly, nullable) NSString *audioReceivedExpandRate; - -/// Audio received bitrate, bit/s -@property (nonatomic, readonly, nullable) NSString *audioReceivedBitrate; - -/// Received audio codec: VP8 or H264 -@property (nonatomic, readonly, nullable) NSString *audioReceivedCodec; - -// MARK: QP stats - -/** - Video QP Sum - - Only valid for video. QP (quantization parameter) describes how much - spatial detail is included a frame. Low value corresponds with good - quality. The range of the value per frame is defined by the codec - being used. This parameter represents the sum of all QPs for - framesDecoded on remote streams and framesSent on local streams. - */ -@property (nonatomic, readonly, nullable) NSString *videoQPSum; - -/// Frames encoded -@property (nonatomic, readonly, nullable) NSString *framesEncoded; - -/** - * Parsing all reasonable stats into readable string. - * - * @code - (cpu)61% - CN 565ms | local->local/udp | (s)248Kbps | (r)869Kbps - VS (input) 640x480@30fps | (sent) 640x480@30fps - VS (enc) 279Kbps/260Kbps | (sent) 200Kbps/292Kbps | 8ms | H264 - AvgQP (past 30 encoded frames) = 36 - VR (recv) 640x480@26fps | (decoded)27 | (output)27fps | 827Kbps/0bps | 4ms - AS 38Kbps | opus - AR 37Kbps | opus | 168ms | (expandrate)0.190002 - Packets lost: VS 17 | VR 0 | AS 3 | AR 0 - * @endcode - * - * @return Readable stats - */ -- (NSString *)statsString; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCTimer.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCTimer.h deleted file mode 100644 index f0278ac34..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCTimer.h +++ /dev/null @@ -1,52 +0,0 @@ -// -// QBRTCTimer.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * Background Timer class used to allow running tasks in background - * call this method when you enter background state - */ -@interface QBRTCTimer : NSObject - -/// Timer identification -@property (copy, nonatomic) NSString *label; - -/// Shows whether timer is running or stopped -@property (assign, nonatomic, readonly) BOOL isValid; - -/** - * Initializing background timer - * - * @param timeInterval task running time - * @param repeat repeat timer execution or run it only once - * @param queue queue on which timer will be started - * @param completion completion block called when timer has been started - * @param expiration expiration handler, called when task is to expire its running time - * - * @return QBRTCTimer instance - */ -- (instancetype)initWithTimeInterval:(NSTimeInterval)timeInterval - repeat:(BOOL)repeat - queue:(dispatch_queue_t)queue - completion:(dispatch_block_t)completion - expiration:(dispatch_block_t)expiration; - -/// Start timer -- (void)start; - -/// Stop timer -- (void)invalidate; - -/// Remaining time for current task -- (NSTimeInterval)remainingTime; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCTypes.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCTypes.h deleted file mode 100644 index 737a5753a..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCTypes.h +++ /dev/null @@ -1,141 +0,0 @@ -// -// QBRTCConnectionState.h -// QuickbloxWebRTC -// -// Copyright (c) 2016 QuickBlox. All rights reserved. -// - -#ifndef __QBRTC__TYPES__ -#define __QBRTC__TYPES__ - -#import -#import - -/** - * Connection state. - * - * - QBRTCConnectionUnknown: connection state is unknown - * - QBRTCConnectionNew: connection state created - * - QBRTCConnectionPending: connection is in pending state - * - QBRTCConnectionConnecting: connection in progress - * - QBRTCConnectionChecking: checking connected - * - QBRTCConnectionConnected: connected - * - QBRTCConnectionDisconnected: disconnected - * - QBRTCConnectionClosed: connection was closed - * - QBRTCConnectionCount: count state3 - * - QBRTCConnectionDisconnectTimeout: disconnected by timeout - * - QBRTCConnectionNoAnswer: no answer - * - QBRTCConnectionRejected: connection was rejected - * - QBRTCConnectionHangUp: connection hang up - * - QBRTCConnectionFailed: connection failed - */ -typedef NS_ENUM(NSUInteger, QBRTCConnectionState) { - - QBRTCConnectionStateUnknown = 0, - QBRTCConnectionStateNew, - QBRTCConnectionStatePending, - QBRTCConnectionStateConnecting, - QBRTCConnectionStateChecking, - QBRTCConnectionStateConnected, - QBRTCConnectionStateDisconnected, - QBRTCConnectionStateClosed, - QBRTCConnectionStateCount, - QBRTCConnectionStateDisconnectTimeout, - QBRTCConnectionStateNoAnswer, - QBRTCConnectionStateRejected, - QBRTCConnectionStateHangUp, - QBRTCConnectionStateFailed -}; - -/** - * Session state. - * - * - QBRTCSessionStateNew: created session - * - QBRTCSessionStatePending: session is in pending state - * - QBRTCSessionStateConnecting: connection in progress - * - QBRTCSessionStateConnected: session is connected - * - QBRTCSessionStateClosed: session was closed - */ -typedef NS_ENUM(NSUInteger, QBRTCSessionState) { - - QBRTCSessionStateNew, - QBRTCSessionStatePending, - QBRTCSessionStateConnecting, - QBRTCSessionStateConnected, - QBRTCSessionStateClosed -}; - -/** - * Quickblox WebRTC conference types. - * - * - QBRTCConferenceTypeVideo: video conference type - * - QBRTCConferenceTypeAudio: audio conference type - */ -typedef NS_ENUM (NSUInteger, QBRTCConferenceType) { - - QBRTCConferenceTypeVideo = 1, - QBRTCConferenceTypeAudio = 2, -}; - -/** - * Available pixel formats. - * - * - QBRTCPixelFormat420f: Bi-Planar Component Y'CbCr 8-bit 4:2:0, full-range (luma=[0,255] chroma=[1,255]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct - * - QBRTCPixelFormatARGB: 32 bit ARGB - */ -typedef NS_ENUM(OSType, QBRTCPixelFormat) { - - QBRTCPixelFormat420f = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, - QBRTCPixelFormatARGB = kCVPixelFormatType_32ARGB -}; - -/** - * Log level. - * - * - QBRTCLogLevelNothing: Nothing in Log - * - QBRTCLogLevelErrors: Can see Errors - * - QBRTCLogLevelWarnings: Can see Warnings - * - QBRTCLogLevelInfo: Some Information Logs - * - QBRTCLogLevelVerbose: Full QuickbloxWebRTC Log - * - QBRTCLogLevelVerboseWithWebRTC: Full QuickbloxWebRTC and WebRTC native Log - */ -typedef NS_ENUM(NSInteger, QBRTCLogLevel) { - - QBRTCLogLevelNothing = 0, - QBRTCLogLevelErrors, - QBRTCLogLevelWarnings, - QBRTCLogLevelInfo, - QBRTCLogLevelVerbose, - QBRTCLogLevelVerboseWithWebRTC -}; - -/** - * Video rotation. - * - * - QBRTCVideoRotation_0: no rotation - * - QBRTCVideoRotation_90: 90 degrees rotation - * - QBRTCVideoRotation_180: 180 degrees rotation - * - QBRTCVideoRotation_270: 270 degrees rotation - */ -typedef NS_ENUM(NSUInteger, QBRTCVideoRotation) { - - QBRTCVideoRotation_0 = 0, - QBRTCVideoRotation_90 = 90, - QBRTCVideoRotation_180 = 180, - QBRTCVideoRotation_270 = 270 -}; - -/** - * Conference media type. - * - * - QBRTCConferenceMediaTypeUnknown: Unknown / not supported media type - * - QBRTCConferenceMediaTypeAudio: media type audio - * - QBRTCConferenceMediaTypeVideo: media type video - */ -typedef NS_ENUM(NSUInteger, QBRTCConferenceMediaType) { - QBRTCConferenceMediaTypeUnknown, - QBRTCConferenceMediaTypeAudio, - QBRTCConferenceMediaTypeVideo -}; - -#endif diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoCapture.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoCapture.h deleted file mode 100644 index 41a2a496e..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoCapture.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// QBRTCVideoCapture.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -@class QBRTCVideoFrame; -@class QBRTCLocalVideoTrack; - -/** - * Class allows you to send frames to your opponent using video source( like camera, UIView etc. ) - */ -@interface QBRTCVideoCapture : NSObject - -/** - * Serial queue to process video frames - * For example AVCaptureVideoDataOutput needs a queue, so you can call - * AVCaptureVideoDataOutput instance setSampleBufferDelegate:self queue:self.videoQueue - */ -@property (nonatomic, strong, readonly) dispatch_queue_t videoQueue; - -/** - * Called when video track is set. - * - * @param videoTrack local video track instance - */ -- (void)didSetToVideoTrack:(QBRTCLocalVideoTrack *)videoTrack; - -/** - * Called when video track was removed. - * - * @param videoTrack local video track instance - */ -- (void)didRemoveFromVideoTrack:(QBRTCLocalVideoTrack *)videoTrack; - -/** - * Send video frames to opponents. - * - * @param frame video frame to send - */ -- (void)sendVideoFrame:(QBRTCVideoFrame *)frame; - -/** - * Adapt frames to a specific width, height and fps before sending. - * - * @param width desired frame width - * @param height desired frame height - * @param fps desired fps - * - * @discussion Calling this function will cause frames to be scaled down to the - * requested resolution. Also, frames will be cropped to match the - * requested aspect ratio, and frames will be dropped to match the - * requested fps. The requested aspect ratio is orientation agnostic and - * will be adjusted to maintain the input orientation, so it doesn't - * matter if e.g. 1280x720 or 720x1280 is requested. - */ -- (void)adaptOutputFormatToWidth:(NSUInteger)width height:(NSUInteger)height fps:(NSUInteger)fps; - -@end diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoFormat.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoFormat.h deleted file mode 100644 index 6cabbea57..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoFormat.h +++ /dev/null @@ -1,69 +0,0 @@ -// -// QBRTCVideoFormat.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import -#import "QBRTCTypes.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBRTCVideoFormat class interface. - * This class represents format management - */ -@interface QBRTCVideoFormat : NSObject - -/** - * Frame width. - */ -@property (nonatomic, assign) NSUInteger width; - -/** - * Frame height. - */ -@property (nonatomic, assign) NSUInteger height; - -/** - * Frames per second. - */ -@property (nonatomic, assign) NSUInteger frameRate; - -/** - * Pixel format. - */ -@property (nonatomic, assign) QBRTCPixelFormat pixelFormat; - -/** - * Initialize video format with all settings - * - * @param width frame width - * @param height frame height - * @param frameRate frame rate, default is 30 FPS - * @param pixelFormat QBRTCPixelFormat type - * - * @return QBRTCVideoFormat instance - */ -+ (instancetype)videoFormatWithWidth:(NSUInteger)width - height:(NSUInteger)height - frameRate:(NSUInteger)frameRate - pixelFormat:(QBRTCPixelFormat)pixelFormat; - -/** - * Default video format. - * - * @remark width: 640 - * height: 480 - * framerate: 30 - * pixelFormat: QBRTCPixelFormat420f - * - * @return QBRTCVideoFormat instance - */ -+ (instancetype)defaultFormat; -- (instancetype)init; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoFrame.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoFrame.h deleted file mode 100644 index bbb07f2cc..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoFrame.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// QBVideoFrame.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import -#import - -@class QBRTCVideoFormat; - -/** - * Entity for storing pixel buffer and corresponding information - */ -@interface QBRTCVideoFrame : NSObject - -@property (nonatomic, assign, readonly) CVPixelBufferRef pixelBuffer; -@property (nonatomic, assign, readonly) QBRTCVideoRotation videoRotation; - -/** - * Initialize video frame with pixel buffer - * - * @param pixelBuffer CVPixelBufferRef - * - * @return QBRTCVideoFrame instance - */ -- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer videoRotation:(QBRTCVideoRotation)videoRotation; - -@end diff --git a/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoTrack.h b/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoTrack.h deleted file mode 100644 index 1023f7601..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QBRTCVideoTrack.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// QBWebRTCVideoTrack.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import "QBRTCMediaStreamTrack.h" - -NS_ASSUME_NONNULL_BEGIN - -@protocol RTCVideoRenderer; - -/** - * QBRTCVideoTrack class interface. - * This class represents remote audio track. - */ -@interface QBRTCVideoTrack : QBRTCMediaStreamTrack - -/** - * Register a renderer that will render all frames received on this track. - * - * @param renderer class that conforms to RTCVideoRenderer protocol - * - * @see RTCVideoRenderer - */ -- (void)addRenderer:(id)renderer; - -/** - * Unregister a renderer. - * - * @param renderer class that conforms to RTCVideoRenderer protocol - * - * @see RTCVideoRenderer - */ -- (void)removeRenderer:(id)renderer; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/QuickbloxWebRTC.h b/External/QuickbloxWebRTC.framework/Headers/QuickbloxWebRTC.h deleted file mode 100644 index 05dc1908e..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/QuickbloxWebRTC.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// QuickbloxWebRTC.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -/* - * Enterprise-only - * - * @see https://quickblox.com/plans/ - */ -#import -#import -#import - -//! Framework version 2.6.3 -FOUNDATION_EXPORT NSString * const QuickbloxWebRTCFrameworkVersion; - -//! WebRTC revision 18213 -FOUNDATION_EXPORT NSString * const QuickbloxWebRTCRevision; diff --git a/External/QuickbloxWebRTC.framework/Headers/RTCVideoFrame.h b/External/QuickbloxWebRTC.framework/Headers/RTCVideoFrame.h deleted file mode 100644 index 70105039f..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/RTCVideoFrame.h +++ /dev/null @@ -1,72 +0,0 @@ -// -// RTCVideoTrack.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import -#import - -#import "QBRTCTypes.h" - -NS_ASSUME_NONNULL_BEGIN - -// RTCVideoFrame is an ObjectiveC version of webrtc::VideoFrame. -__attribute__((visibility("default"))) -@interface RTCVideoFrame : NSObject - -/** Width without rotation applied. */ -@property(nonatomic, readonly) int width; - -/** Height without rotation applied. */ -@property(nonatomic, readonly) int height; -@property(nonatomic, readonly) QBRTCVideoRotation rotation; -/** Accessing YUV data should only be done for I420 frames, i.e. if nativeHandle - * is null. It is always possible to get such a frame by calling - * newI420VideoFrame. - */ -@property(nonatomic, readonly, nullable) const uint8_t *dataY; -@property(nonatomic, readonly, nullable) const uint8_t *dataU; -@property(nonatomic, readonly, nullable) const uint8_t *dataV; -@property(nonatomic, readonly) int strideY; -@property(nonatomic, readonly) int strideU; -@property(nonatomic, readonly) int strideV; - -/** Timestamp in nanoseconds. */ -@property(nonatomic, readonly) int64_t timeStampNs; - -/** The native handle should be a pixel buffer on iOS. */ -@property(nonatomic, readonly) CVPixelBufferRef nativeHandle; - -- (instancetype)init NS_UNAVAILABLE; -- (instancetype)new NS_UNAVAILABLE; - -/** Initialize an RTCVideoFrame from a pixel buffer, rotation, and timestamp. - */ -- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer - rotation:(QBRTCVideoRotation)rotation - timeStampNs:(int64_t)timeStampNs; - -/** Initialize an RTCVideoFrame from a pixel buffer combined with cropping and - * scaling. Cropping will be applied first on the pixel buffer, followed by - * scaling to the final resolution of scaledWidth x scaledHeight. - */ -- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer - scaledWidth:(int)scaledWidth - scaledHeight:(int)scaledHeight - cropWidth:(int)cropWidth - cropHeight:(int)cropHeight - cropX:(int)cropX - cropY:(int)cropY - rotation:(QBRTCVideoRotation)rotation - timeStampNs:(int64_t)timeStampNs; - -/** Return a frame that is guaranteed to be I420, i.e. it is possible to access - * the YUV data on it. - */ -- (RTCVideoFrame *)newI420VideoFrame; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/RTCVideoRenderer.h b/External/QuickbloxWebRTC.framework/Headers/RTCVideoRenderer.h deleted file mode 100644 index 833164844..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/RTCVideoRenderer.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// QBRTCRemoteVideoView.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import -#if TARGET_OS_IPHONE -#import -#endif - -NS_ASSUME_NONNULL_BEGIN - -@class RTCVideoFrame; - -@protocol RTCVideoRenderer - -/** The size of the frame. */ -- (void)setSize:(CGSize)size; - -/** The frame to be displayed. */ -- (void)renderFrame:(nullable RTCVideoFrame *)frame; - -@end - -NS_ASSUME_NONNULL_END diff --git a/External/QuickbloxWebRTC.framework/Headers/UIDevice+QBPerformance.h b/External/QuickbloxWebRTC.framework/Headers/UIDevice+QBPerformance.h deleted file mode 100644 index 3fbbb3c0f..000000000 --- a/External/QuickbloxWebRTC.framework/Headers/UIDevice+QBPerformance.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// UIDevice+QBPerformance.h -// QuickbloxWebRTC -// -// Copyright (c) 2017 QuickBlox. All rights reserved. -// - -#import - -@interface UIDevice (QBPerformance) - -/** - * Whether device is in low performance category and should be treated like that. - * - * @device Use this check to determine whether your device is in low device category. - * This should be helpful to determine whether you need to hardcode low resolution and low - * audio codec in order to let device perform well without any problems. - * - * @remark Low performance device list: - iPod1,1, iPod2,1, iPod3,1, iPod4,1, iPod5,1, - iPhone1,1, iPhone1,2, iPhone2,1, iPhone3,1, iPhone4,1, - iPad1,1, iPad2,1, iPad2,2, iPad2,3, iPad2,4, - iPad2,5, iPad2,6, iPad2,7 - */ -@property (nonatomic, readonly, getter=qbrtc_isLowPerformance) BOOL qbrtc_lowPerformance; - -/** - * Whether device is in medium performance category and should be treated like that. - * - * @device Use this check to determine whether your device is in medium device category. - * This should be helpful to determine whether you need to hardcode medium resolution and - * medium audio codec in order to let device perform well without any problems. - * - * @remark Medium performance device list: - iPad3,1, iPad3,2, iPad3,3, iPad3,4, iPad3,5, iPad3,6, - iPhone5,1, iPhone5,2 - */ -@property (nonatomic, readonly, getter=qbrtc_isMediumPerformance) BOOL qbrtc_mediumPerformance; - -@end diff --git a/External/QuickbloxWebRTC.framework/Info.plist b/External/QuickbloxWebRTC.framework/Info.plist deleted file mode 100644 index f523fb3e0..000000000 Binary files a/External/QuickbloxWebRTC.framework/Info.plist and /dev/null differ diff --git a/External/QuickbloxWebRTC.framework/Modules/module.modulemap b/External/QuickbloxWebRTC.framework/Modules/module.modulemap deleted file mode 100644 index 9784c5c02..000000000 --- a/External/QuickbloxWebRTC.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module QuickbloxWebRTC { - umbrella header "QuickbloxWebRTC.h" - - export * - module * { export * } -} diff --git a/External/QuickbloxWebRTC.framework/QuickbloxWebRTC b/External/QuickbloxWebRTC.framework/QuickbloxWebRTC deleted file mode 100755 index 6c3511f6c..000000000 Binary files a/External/QuickbloxWebRTC.framework/QuickbloxWebRTC and /dev/null differ diff --git a/External/QuickbloxWebRTC.framework/strip-framework.sh b/External/QuickbloxWebRTC.framework/strip-framework.sh deleted file mode 100644 index 714b9ae03..000000000 --- a/External/QuickbloxWebRTC.framework/strip-framework.sh +++ /dev/null @@ -1,26 +0,0 @@ -# Stripping framework only for archive -if [ "$ACTION" = "install" ]; then - - FRAMEWORK_NAME="QuickbloxWebRTC" - SCRIPT_FILE_NAME="strip-framework.sh" - - # Set working directory to product’s embedded frameworks - cd "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/${FRAMEWORK_NAME}.framework" - - # Get architectures for current file - ARCHS="$(lipo -info "${FRAMEWORK_NAME}" | rev | cut -d ':' -f1 | rev)" - for ARCH in $ARCHS; do - if ! [[ "${VALID_ARCHS}" == *"$ARCH"* ]]; then - # Strip non-valid architectures in-place - lipo -remove "$ARCH" -output "$FRAMEWORK_NAME" "$FRAMEWORK_NAME" || exit 1 - fi - done - - echo "Framework was successfully stripped with unsupported architectures" - -fi - -# Removing script from framework folder -if [ -f ${SCRIPT_FILE_NAME} ]; then - rm -rf "${SCRIPT_FILE_NAME}" -fi diff --git a/External/QuickbloxWebRTC_2_7_4.framework.zip b/External/QuickbloxWebRTC_2_7_4.framework.zip new file mode 100644 index 000000000..31d97712d Binary files /dev/null and b/External/QuickbloxWebRTC_2_7_4.framework.zip differ diff --git a/Localizable.strings b/Localizable.strings index 936f5e2e5..55e42a1d5 100644 --- a/Localizable.strings +++ b/Localizable.strings @@ -2,8 +2,8 @@ Localized.strings Q-municate - Created by Andrey Ivanov on 05.08.14. - Copyright (c) 2014 Quickblox. All rights reserved. + Created by Injoit on 05.08.14. + Copyright © 2014 QuickBlox. All rights reserved. */ "QM_STR_OK" = "OK"; "QM_STR_DONE" = "Done"; diff --git a/Podfile b/Podfile index 82a2e21dd..a383f8b88 100644 --- a/Podfile +++ b/Podfile @@ -1,69 +1,65 @@ -platform :ios, '9.0' -xcodeproj 'Q-municate.xcodeproj' +platform :ios, '10.3' +project 'Q-municate.xcodeproj' source 'https://github.com/CocoaPods/Specs.git' +# ignore all warnings from all pods +inhibit_all_warnings! -def services - -# pod 'QMServicesDevelopment', :path => '../q-municate-services-ios/' -# pod 'QMServicesDevelopment', :git => 'git@github.com:QuickBlox/q-municate-services-ios.git', :tag => '0.5.3' - pod 'QMServicesDevelopment',:git => 'git@github.com:QuickBlox/q-municate-services-ios.git', :branch => 'development' -end - -def chat_view_controller - -# pod 'QMCVDevelopment', :path => '../QMChatViewController-ios/' - pod 'QMCVDevelopment', :git => 'git@github.com:QuickBlox/QMChatViewController-ios.git', :branch => 'development' -end +target 'Q-municate' do + use_frameworks! -target 'Q-municate' do - - chat_view_controller - services - - pod 'UIDevice-Hardware', '~> 0.1.11' - pod 'SAMKeychain' + pod 'UIDevice-Hardware', '~> 0.1.13' + pod 'SAMKeychain', '~> 1.5.3' pod 'Reachability', '~> 3.2' - pod 'TTTAttributedLabel', '~> 2.0' - pod 'libextobjc/EXTScope', '~> 0.4.1' - pod 'Flurry-iOS-SDK/FlurrySDK', '<= 8.3.1' - pod 'NYTPhotoViewer', :git => 'https://github.com/NYTimes/NYTPhotoViewer.git', :tag => 'v2.0.0' - + pod 'TTTAttributedLabel', '~> 2.0.0' + pod 'libextobjc/EXTScope', '~> 0.6' + pod 'Flurry-iOS-SDK/FlurrySDK', '~> 10.0.1' + pod 'NYTPhotoViewer', '~> 2.0.0' #Facebook - pod 'FBSDKCoreKit' - pod 'FBSDKShareKit' - pod 'FBSDKLoginKit' - #Twitter - pod 'Fabric' - pod 'Crashlytics' + pod 'FBSDKCoreKit', '~> 5.6.0' + pod 'FBSDKLoginKit', '~> 5.6.0' #Firebase - pod 'FirebaseUI/Phone', '~> 4.0' + pod 'FirebaseUI/Phone', '~> 8.1.0' + #ChatUI + pod 'FFCircularProgressView', '~> 0.5' + pod 'SDWebImage', '~> 5.2.0' + #Chat Service + pod 'QuickBlox', '~> 2.17.4' + pod 'Quickblox-WebRTC', '~> 2.7.4' end target 'QMSiriExtension' do + use_frameworks! - services - + #Chat Service + pod 'Bolts', '~> 1.9.0' + pod 'QuickBlox', '~> 2.17.4' + end target 'QMShareExtension' do - - services - chat_view_controller - + use_frameworks! + pod 'Reachability', '~> 3.2' - pod 'SVProgressHUD' - + pod 'SVProgressHUD', '~> 2.2.5' + #ChatUI + pod 'FFCircularProgressView', '~> 0.5' + pod 'SDWebImage', '~> 5.2.0' + pod 'TTTAttributedLabel', '~> 2.0.0' + #Chat Service + pod 'Bolts', '~> 1.9.0' + pod 'QuickBlox', '~> 2.17.4' + end post_install do |installer| #Settings for extensions installer.pods_project.targets.each do |target| case target.name - when 'Bolts','QMCVDevelopment','SVProgressHUD' + when 'Bolts','SVProgressHUD' target.build_configurations.each do |config| config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO' end @@ -74,9 +70,9 @@ post_install do |installer| config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'SV_APP_EXTENSIONS' end end - + end - + #This script fixes an issue with application icon on iOS 11 #MORE INFO: https://github.com/CocoaPods/CocoaPods/issues/7003 installer.aggregate_targets.each do |target| diff --git a/Podfile.lock b/Podfile.lock index c8fc502e7..3057c16c3 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -5,60 +5,76 @@ PODS: - Bolts/AppLinks (1.9.0): - Bolts/Tasks - Bolts/Tasks (1.9.0) - - Crashlytics (3.9.3): - - Fabric (~> 1.7.2) - - Fabric (1.7.2) - - FBSDKCoreKit (4.30.0): - - Bolts (~> 1.7) - - FBSDKLoginKit (4.30.0): - - FBSDKCoreKit - - FBSDKShareKit (4.30.0): - - FBSDKCoreKit (~> 4.30.0) + - FBSDKCoreKit (5.6.0): + - FBSDKCoreKit/Basics (= 5.6.0) + - FBSDKCoreKit/Core (= 5.6.0) + - FBSDKCoreKit/Basics (5.6.0) + - FBSDKCoreKit/Core (5.6.0): + - FBSDKCoreKit/Basics + - FBSDKLoginKit (5.6.0): + - FBSDKLoginKit/Login (= 5.6.0) + - FBSDKLoginKit/Login (5.6.0): + - FBSDKCoreKit (~> 5.0) - FFCircularProgressView (0.5) - - Firebase/Auth (4.8.2): - - Firebase/Core - - FirebaseAuth (= 4.4.2) - - Firebase/Core (4.8.2): - - FirebaseAnalytics (= 4.0.9) - - FirebaseCore (= 4.0.14) - - FirebaseAnalytics (4.0.9): - - FirebaseCore (~> 4.0) - - FirebaseInstanceID (~> 2.0) - - GoogleToolboxForMac/NSData+zlib (~> 2.1) - - nanopb (~> 0.3) - - FirebaseAuth (4.4.2): - - FirebaseAnalytics (~> 4.0) - - GoogleToolboxForMac/NSDictionary+URLArguments (~> 2.1) + - Firebase/Auth (6.9.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 6.2.3) + - Firebase/CoreOnly (6.9.0): + - FirebaseCore (= 6.3.0) + - FirebaseAuth (6.2.3): + - FirebaseAuthInterop (~> 1.0) + - FirebaseCore (~> 6.2) + - GoogleUtilities/AppDelegateSwizzler (~> 6.2) + - GoogleUtilities/Environment (~> 6.2) - GTMSessionFetcher/Core (~> 1.1) - - FirebaseCore (4.0.14): - - GoogleToolboxForMac/NSData+zlib (~> 2.1) - - FirebaseInstanceID (2.0.8): - - FirebaseCore (~> 4.0) - - FirebaseUI/Auth (4.5.1): - - Firebase/Auth (~> 4.2) - - FirebaseUI/Phone (4.5.1): + - FirebaseAuthInterop (1.0.0) + - FirebaseCore (6.3.0): + - FirebaseCoreDiagnostics (~> 1.0) + - FirebaseCoreDiagnosticsInterop (~> 1.0) + - GoogleUtilities/Environment (~> 6.2) + - GoogleUtilities/Logger (~> 6.2) + - FirebaseCoreDiagnostics (1.1.0): + - FirebaseCoreDiagnosticsInterop (~> 1.0) + - GoogleDataTransportCCTSupport (~> 1.0) + - GoogleUtilities/Environment (~> 6.2) + - GoogleUtilities/Logger (~> 6.2) + - FirebaseCoreDiagnosticsInterop (1.0.0) + - FirebaseUI/Auth (8.1.0): + - Firebase/Auth (~> 6.0) + - GoogleUtilities/UserDefaults + - FirebaseUI/Phone (8.1.0): - FirebaseUI/Auth - FLAnimatedImage (1.0.12) - - Flurry-iOS-SDK/FlurrySDK (8.3.1) - - GoogleToolboxForMac/DebugUtils (2.1.3): - - GoogleToolboxForMac/Defines (= 2.1.3) - - GoogleToolboxForMac/Defines (2.1.3) - - GoogleToolboxForMac/NSData+zlib (2.1.3): - - GoogleToolboxForMac/Defines (= 2.1.3) - - GoogleToolboxForMac/NSDictionary+URLArguments (2.1.3): - - GoogleToolboxForMac/DebugUtils (= 2.1.3) - - GoogleToolboxForMac/Defines (= 2.1.3) - - GoogleToolboxForMac/NSString+URLArguments (= 2.1.3) - - GoogleToolboxForMac/NSString+URLArguments (2.1.3) - - GTMSessionFetcher/Core (1.1.13) - - libextobjc/EXTScope (0.4.1): + - Flurry-iOS-SDK/FlurrySDK (10.0.2) + - GoogleDataTransport (2.0.0) + - GoogleDataTransportCCTSupport (1.1.0): + - GoogleDataTransport (~> 2.0) + - nanopb + - GoogleUtilities/AppDelegateSwizzler (6.3.1): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (6.3.1) + - GoogleUtilities/Logger (6.3.1): + - GoogleUtilities/Environment + - GoogleUtilities/Network (6.3.1): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (6.3.1)" + - GoogleUtilities/Reachability (6.3.1): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (6.3.1): + - GoogleUtilities/Logger + - GTMSessionFetcher/Core (1.2.2) + - libextobjc/EXTScope (0.6): - libextobjc/RuntimeExtensions - - libextobjc/RuntimeExtensions (0.4.1) - - nanopb (0.3.8): - - nanopb/decode (= 0.3.8) - - nanopb/encode (= 0.3.8) - - nanopb/decode (0.3.8) - - nanopb/encode (0.3.8) + - libextobjc/RuntimeExtensions (0.6) + - nanopb (0.3.901): + - nanopb/decode (= 0.3.901) + - nanopb/encode (= 0.3.901) + - nanopb/decode (0.3.901) + - nanopb/encode (0.3.901) - NYTPhotoViewer (2.0.0): - NYTPhotoViewer/AnimatedGifSupport (= 2.0.0) - NYTPhotoViewer/Core (= 2.0.0) @@ -66,138 +82,97 @@ PODS: - FLAnimatedImage (~> 1.0.12) - NYTPhotoViewer/Core - NYTPhotoViewer/Core (2.0.0) - - QMCVDevelopment (0.6): - - FFCircularProgressView - - QMCVDevelopment/Categories (= 0.6) - - QMCVDevelopment/Protocols (= 0.6) - - QMCVDevelopment/QMChatDataSource (= 0.6) - - QMCVDevelopment/QMChatLocationSnapshotter (= 0.6) - - QMCVDevelopment/Sections (= 0.6) - - QMCVDevelopment/Utils (= 0.6) - - QMCVDevelopment/ViewModels (= 0.6) - - QMCVDevelopment/Views (= 0.6) - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/Categories (0.6): - - FFCircularProgressView - - QMCVDevelopment/QMChatLocationSnapshotter - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/Protocols (0.6): - - FFCircularProgressView - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/QMChatDataSource (0.6): - - FFCircularProgressView - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/QMChatLocationSnapshotter (0.6): - - FFCircularProgressView - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/Sections (0.6): - - FFCircularProgressView - - QMCVDevelopment/QMChatDataSource - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/Utils (0.6): - - FFCircularProgressView - - QMCVDevelopment/Categories - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/ViewModels (0.6): - - FFCircularProgressView - - QMCVDevelopment/Categories - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/Views (0.6): - - FFCircularProgressView - - QMCVDevelopment/Categories - - QMCVDevelopment/Protocols - - QMCVDevelopment/Utils - - SDWebImage - - TTTAttributedLabel - - QMServicesDevelopment (0.6.1): - - Bolts (>= 1.9.0) + - QuickBlox (2.17.4) + - Quickblox-WebRTC (2.7.4): + - QuickBlox (>= 2.17.2) - Reachability (3.2) - SAMKeychain (1.5.3) - - SDWebImage (4.3.0): - - SDWebImage/Core (= 4.3.0) - - SDWebImage/Core (4.3.0) - - SVProgressHUD (2.2.2) + - SDWebImage (5.2.2): + - SDWebImage/Core (= 5.2.2) + - SDWebImage/Core (5.2.2) + - SVProgressHUD (2.2.5) - TTTAttributedLabel (2.0.0) - - UIDevice-Hardware (0.1.11) + - UIDevice-Hardware (0.1.13) DEPENDENCIES: - - Crashlytics - - Fabric - - FBSDKCoreKit - - FBSDKLoginKit - - FBSDKShareKit - - FirebaseUI/Phone (~> 4.0) - - Flurry-iOS-SDK/FlurrySDK (<= 8.3.1) - - libextobjc/EXTScope (~> 0.4.1) - - NYTPhotoViewer (from `https://github.com/NYTimes/NYTPhotoViewer.git`, tag `v2.0.0`) - - QMCVDevelopment (from `git@github.com:QuickBlox/QMChatViewController-ios.git`, branch `development`) - - QMServicesDevelopment (from `git@github.com:QuickBlox/q-municate-services-ios.git`, branch `development`) + - Bolts (~> 1.9.0) + - FBSDKCoreKit (~> 5.6.0) + - FBSDKLoginKit (~> 5.6.0) + - FFCircularProgressView (~> 0.5) + - FirebaseUI/Phone (~> 8.1.0) + - Flurry-iOS-SDK/FlurrySDK (~> 10.0.1) + - libextobjc/EXTScope (~> 0.6) + - NYTPhotoViewer (~> 2.0.0) + - QuickBlox (~> 2.17.4) + - Quickblox-WebRTC (~> 2.7.4) - Reachability (~> 3.2) - - SAMKeychain - - SVProgressHUD - - TTTAttributedLabel (~> 2.0) - - UIDevice-Hardware (~> 0.1.11) - -EXTERNAL SOURCES: - NYTPhotoViewer: - :git: https://github.com/NYTimes/NYTPhotoViewer.git - :tag: v2.0.0 - QMCVDevelopment: - :branch: development - :git: git@github.com:QuickBlox/QMChatViewController-ios.git - QMServicesDevelopment: - :branch: development - :git: git@github.com:QuickBlox/q-municate-services-ios.git + - SAMKeychain (~> 1.5.3) + - SDWebImage (~> 5.2.0) + - SVProgressHUD (~> 2.2.5) + - TTTAttributedLabel (~> 2.0.0) + - UIDevice-Hardware (~> 0.1.13) -CHECKOUT OPTIONS: - NYTPhotoViewer: - :git: https://github.com/NYTimes/NYTPhotoViewer.git - :tag: v2.0.0 - QMCVDevelopment: - :commit: 4c999c036becead3049c6aa8aecf83b40f103327 - :git: git@github.com:QuickBlox/QMChatViewController-ios.git - QMServicesDevelopment: - :commit: 47874a5b3ea477f39d8917cd0046aca6cb333dc8 - :git: git@github.com:QuickBlox/q-municate-services-ios.git +SPEC REPOS: + https://github.com/CocoaPods/Specs.git: + - Bolts + - FBSDKCoreKit + - FBSDKLoginKit + - FFCircularProgressView + - Firebase + - FirebaseAuth + - FirebaseAuthInterop + - FirebaseCore + - FirebaseCoreDiagnostics + - FirebaseCoreDiagnosticsInterop + - FirebaseUI + - FLAnimatedImage + - Flurry-iOS-SDK + - GoogleDataTransport + - GoogleDataTransportCCTSupport + - GoogleUtilities + - GTMSessionFetcher + - libextobjc + - nanopb + - NYTPhotoViewer + - QuickBlox + - Quickblox-WebRTC + - Reachability + - SAMKeychain + - SDWebImage + - SVProgressHUD + - TTTAttributedLabel + - UIDevice-Hardware SPEC CHECKSUMS: Bolts: ac6567323eac61e203f6a9763667d0f711be34c8 - Crashlytics: dbb07d01876c171c5ccbdf7826410380189e452c - Fabric: 9cd6a848efcf1b8b07497e0b6a2e7d336353ba15 - FBSDKCoreKit: 7c4bba2877781a131ab5d54c0a78c405d4307b62 - FBSDKLoginKit: fe7a7e82373dc5daad92e1623219e86224ab1fb1 - FBSDKShareKit: a9427574b51bde4f437262c3f118c4ccfddeef6c + FBSDKCoreKit: d6655a343868d4bb5c29a60859bab07c3be14a0b + FBSDKLoginKit: c5a623de88a6b0cda35b35582921f6cec2efcc36 FFCircularProgressView: 683a4ab1e1bd613246a3dffa61503ffdebcde8d8 - Firebase: 7d3b8cd837ad9fcd391657734c0d56dab8e9a5a3 - FirebaseAnalytics: 388b630c15713f5dbf364071f5f3d6077fb52f4e - FirebaseAuth: bd2738c5c1e92b108ba5f7f7335908097a4e50bb - FirebaseCore: 2e0b98fb2d64ca8140136beff15772bdd14d2dd7 - FirebaseInstanceID: 81df5805a08001e69138664bdd02c6719a9ac80f - FirebaseUI: 1dc9c8a87a776b488a28a28541f029e60c824cfd + Firebase: 2d750c54cda57d5a6ae31212cfe5cc813c6be7e4 + FirebaseAuth: e7f86c2dfc57281cd01f7da5e4b40e01e4510a4a + FirebaseAuthInterop: 0ffa57668be100582bb7643d4fcb7615496c41fc + FirebaseCore: 8b2765c445d40db7137989b7146a3aa3f91b5529 + FirebaseCoreDiagnostics: be4f7a09d02ab305f18de59a470412caddb64c2a + FirebaseCoreDiagnosticsInterop: 6829da2b8d1fc795ff1bd99df751d3788035d2cb + FirebaseUI: 41e06c5f7f6e34a8f430862d67637e36e4aa696c FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 - Flurry-iOS-SDK: 912b3eb78bee559883feb3b13263437b185e8fe9 - GoogleToolboxForMac: 2501e2ad72a52eb3dfe7bd9aee7dad11b858bd20 - GTMSessionFetcher: 5bb1eae636127de695590f50e7d248483eb891e6 - libextobjc: a650fc1bf489a3d3a9bc2e621efa3e1006fc5471 - nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3 + Flurry-iOS-SDK: 71da0ebf2088b15d8899da71050efc8b33bfd21f + GoogleDataTransport: c8617c00e4f3eb9418e42ac0e8ac5241a9d555dd + GoogleDataTransportCCTSupport: 9f352523e8785a71f6754f51eeff09f49ec19268 + GoogleUtilities: f895fde57977df4e0233edda0dbeac490e3703b6 + GTMSessionFetcher: 61bb0f61a4cb560030f1222021178008a5727a23 + libextobjc: aed8b7d2b07f511c1a7ecaacb33ea03e327c69b7 + nanopb: 2901f78ea1b7b4015c860c2fdd1ea2fee1a18d48 NYTPhotoViewer: 34b8bd6bcc297466adec1668f9a01249d73c90e6 - QMCVDevelopment: 8b724410db764d2d612968cad41048dbe48f3357 - QMServicesDevelopment: bea9291900e039a2af592652696c6156ac852b3e + QuickBlox: 992be26bc127313991a1337dfd98c9359832c147 + Quickblox-WebRTC: cd1a5159c2ddb5b0feaf00b7a38b5551743eb067 Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c - SDWebImage: 6da6c8bca115addc4de8613362e1b15f66333825 - SVProgressHUD: 59b2d3dabacbd051576d21d32293ca7228dc18b0 + SDWebImage: 5fcdb02cc35e05fc35791ec514b191d27189f872 + SVProgressHUD: 1428aafac632c1f86f62aa4243ec12008d7a51d6 TTTAttributedLabel: 8cffe8e127e4e82ff3af1e5386d4cd0ad000b656 - UIDevice-Hardware: 72b0ea097ed0b239fe88073e2b9ac0b18f75bc05 + UIDevice-Hardware: c10ce5703fa8de762079b84236c548cf31223531 -PODFILE CHECKSUM: 23c6321c5974bd0e414a602c4d817e7f08d09f37 +PODFILE CHECKSUM: cd3a5723435ed4df0b283ebde645a71ad0fc05fc -COCOAPODS: 1.4.0 +COCOAPODS: 1.8.3 diff --git a/Pods/Bolts/Bolts/Common/BFCancellationToken.h b/Pods/Bolts/Bolts/Common/BFCancellationToken.h deleted file mode 100644 index bda32ee80..000000000 --- a/Pods/Bolts/Bolts/Common/BFCancellationToken.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -NS_ASSUME_NONNULL_BEGIN - -/*! - A block that will be called when a token is cancelled. - */ -typedef void(^BFCancellationBlock)(void); - -/*! - The consumer view of a CancellationToken. - Propagates notification that operations should be canceled. - A BFCancellationToken has methods to inspect whether the token has been cancelled. - */ -@interface BFCancellationToken : NSObject - -/*! - Whether cancellation has been requested for this token source. - */ -@property (nonatomic, assign, readonly, getter=isCancellationRequested) BOOL cancellationRequested; - -/*! - Register a block to be notified when the token is cancelled. - If the token is already cancelled the delegate will be notified immediately. - */ -- (BFCancellationTokenRegistration *)registerCancellationObserverWithBlock:(BFCancellationBlock)block; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFCancellationToken.m b/Pods/Bolts/Bolts/Common/BFCancellationToken.m deleted file mode 100644 index 4acd58900..000000000 --- a/Pods/Bolts/Bolts/Common/BFCancellationToken.m +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFCancellationToken.h" -#import "BFCancellationTokenRegistration.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface BFCancellationToken () - -@property (nullable, nonatomic, strong) NSMutableArray *registrations; -@property (nonatomic, strong) NSObject *lock; -@property (nonatomic) BOOL disposed; - -@end - -@interface BFCancellationTokenRegistration (BFCancellationToken) - -+ (instancetype)registrationWithToken:(BFCancellationToken *)token delegate:(BFCancellationBlock)delegate; - -- (void)notifyDelegate; - -@end - -@implementation BFCancellationToken - -@synthesize cancellationRequested = _cancellationRequested; - -#pragma mark - Initializer - -- (instancetype)init { - self = [super init]; - if (!self) return self; - - _registrations = [NSMutableArray array]; - _lock = [NSObject new]; - - return self; -} - -#pragma mark - Custom Setters/Getters - -- (BOOL)isCancellationRequested { - @synchronized(self.lock) { - [self throwIfDisposed]; - return _cancellationRequested; - } -} - -- (void)cancel { - NSArray *registrations; - @synchronized(self.lock) { - [self throwIfDisposed]; - if (_cancellationRequested) { - return; - } - [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(cancelPrivate) object:nil]; - _cancellationRequested = YES; - registrations = [self.registrations copy]; - } - - [self notifyCancellation:registrations]; -} - -- (void)notifyCancellation:(NSArray *)registrations { - for (BFCancellationTokenRegistration *registration in registrations) { - [registration notifyDelegate]; - } -} - -- (BFCancellationTokenRegistration *)registerCancellationObserverWithBlock:(BFCancellationBlock)block { - @synchronized(self.lock) { - BFCancellationTokenRegistration *registration = [BFCancellationTokenRegistration registrationWithToken:self delegate:[block copy]]; - [self.registrations addObject:registration]; - - return registration; - } -} - -- (void)unregisterRegistration:(BFCancellationTokenRegistration *)registration { - @synchronized(self.lock) { - [self throwIfDisposed]; - [self.registrations removeObject:registration]; - } -} - -// Delay on a non-public method to prevent interference with a user calling performSelector or -// cancelPreviousPerformRequestsWithTarget on the public method -- (void)cancelPrivate { - [self cancel]; -} - -- (void)cancelAfterDelay:(int)millis { - [self throwIfDisposed]; - if (millis < -1) { - [NSException raise:NSInvalidArgumentException format:@"Delay must be >= -1"]; - } - - if (millis == 0) { - [self cancel]; - return; - } - - @synchronized(self.lock) { - [self throwIfDisposed]; - [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(cancelPrivate) object:nil]; - if (self.cancellationRequested) { - return; - } - - if (millis != -1) { - double delay = (double)millis / 1000; - [self performSelector:@selector(cancelPrivate) withObject:nil afterDelay:delay]; - } - } -} - -- (void)dispose { - @synchronized(self.lock) { - if (self.disposed) { - return; - } - [self.registrations makeObjectsPerformSelector:@selector(dispose)]; - self.registrations = nil; - self.disposed = YES; - } -} - -- (void)throwIfDisposed { - if (self.disposed) { - [NSException raise:NSInternalInconsistencyException format:@"Object already disposed"]; - } -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h b/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h deleted file mode 100644 index fa6090f66..000000000 --- a/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -/*! - Represents the registration of a cancellation observer with a cancellation token. - Can be used to unregister the observer at a later time. - */ -@interface BFCancellationTokenRegistration : NSObject - -/*! - Removes the cancellation observer registered with the token - and releases all resources associated with this registration. - */ -- (void)dispose; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m b/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m deleted file mode 100644 index f396c1c93..000000000 --- a/Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFCancellationTokenRegistration.h" - -#import "BFCancellationToken.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface BFCancellationTokenRegistration () - -@property (nonatomic, weak) BFCancellationToken *token; -@property (nullable, nonatomic, strong) BFCancellationBlock cancellationObserverBlock; -@property (nonatomic, strong) NSObject *lock; -@property (nonatomic) BOOL disposed; - -@end - -@interface BFCancellationToken (BFCancellationTokenRegistration) - -- (void)unregisterRegistration:(BFCancellationTokenRegistration *)registration; - -@end - -@implementation BFCancellationTokenRegistration - -+ (instancetype)registrationWithToken:(BFCancellationToken *)token delegate:(BFCancellationBlock)delegate { - BFCancellationTokenRegistration *registration = [BFCancellationTokenRegistration new]; - registration.token = token; - registration.cancellationObserverBlock = delegate; - return registration; -} - -- (instancetype)init { - self = [super init]; - if (!self) return self; - - _lock = [NSObject new]; - - return self; -} - -- (void)dispose { - @synchronized(self.lock) { - if (self.disposed) { - return; - } - self.disposed = YES; - } - - BFCancellationToken *token = self.token; - if (token != nil) { - [token unregisterRegistration:self]; - self.token = nil; - } - self.cancellationObserverBlock = nil; -} - -- (void)notifyDelegate { - @synchronized(self.lock) { - [self throwIfDisposed]; - self.cancellationObserverBlock(); - } -} - -- (void)throwIfDisposed { - NSAssert(!self.disposed, @"Object already disposed"); -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h b/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h deleted file mode 100644 index 4627e9958..000000000 --- a/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -@class BFCancellationToken; - -/*! - BFCancellationTokenSource represents the producer side of a CancellationToken. - Signals to a CancellationToken that it should be canceled. - It is a cancellation token that also has methods - for changing the state of a token by cancelling it. - */ -@interface BFCancellationTokenSource : NSObject - -/*! - Creates a new cancellation token source. - */ -+ (instancetype)cancellationTokenSource; - -/*! - The cancellation token associated with this CancellationTokenSource. - */ -@property (nonatomic, strong, readonly) BFCancellationToken *token; - -/*! - Whether cancellation has been requested for this token source. - */ -@property (nonatomic, assign, readonly, getter=isCancellationRequested) BOOL cancellationRequested; - -/*! - Cancels the token if it has not already been cancelled. - */ -- (void)cancel; - -/*! - Schedules a cancel operation on this CancellationTokenSource after the specified number of milliseconds. - @param millis The number of milliseconds to wait before completing the returned task. - If delay is `0` the cancel is executed immediately. If delay is `-1` any scheduled cancellation is stopped. - */ -- (void)cancelAfterDelay:(int)millis; - -/*! - Releases all resources associated with this token source, - including disposing of all registrations. - */ -- (void)dispose; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m b/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m deleted file mode 100644 index ee05cf048..000000000 --- a/Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFCancellationTokenSource.h" - -#import "BFCancellationToken.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface BFCancellationToken (BFCancellationTokenSource) - -- (void)cancel; -- (void)cancelAfterDelay:(int)millis; - -- (void)dispose; -- (void)throwIfDisposed; - -@end - -@implementation BFCancellationTokenSource - -#pragma mark - Initializer - -- (instancetype)init { - self = [super init]; - if (!self) return self; - - _token = [BFCancellationToken new]; - - return self; -} - -+ (instancetype)cancellationTokenSource { - return [BFCancellationTokenSource new]; -} - -#pragma mark - Custom Setters/Getters - -- (BOOL)isCancellationRequested { - return _token.isCancellationRequested; -} - -- (void)cancel { - [_token cancel]; -} - -- (void)cancelAfterDelay:(int)millis { - [_token cancelAfterDelay:millis]; -} - -- (void)dispose { - [_token dispose]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFExecutor.h b/Pods/Bolts/Bolts/Common/BFExecutor.h deleted file mode 100644 index 694c8a5fc..000000000 --- a/Pods/Bolts/Bolts/Common/BFExecutor.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -/*! - An object that can run a given block. - */ -@interface BFExecutor : NSObject - -/*! - Returns a default executor, which runs continuations immediately until the call stack gets too - deep, then dispatches to a new GCD queue. - */ -+ (instancetype)defaultExecutor; - -/*! - Returns an executor that runs continuations on the thread where the previous task was completed. - */ -+ (instancetype)immediateExecutor; - -/*! - Returns an executor that runs continuations on the main thread. - */ -+ (instancetype)mainThreadExecutor; - -/*! - Returns a new executor that uses the given block to execute continuations. - @param block The block to use. - */ -+ (instancetype)executorWithBlock:(void(^)(void(^block)(void)))block; - -/*! - Returns a new executor that runs continuations on the given queue. - @param queue The instance of `dispatch_queue_t` to dispatch all continuations onto. - */ -+ (instancetype)executorWithDispatchQueue:(dispatch_queue_t)queue; - -/*! - Returns a new executor that runs continuations on the given queue. - @param queue The instance of `NSOperationQueue` to run all continuations on. - */ -+ (instancetype)executorWithOperationQueue:(NSOperationQueue *)queue; - -/*! - Runs the given block using this executor's particular strategy. - @param block The block to execute. - */ -- (void)execute:(void(^)(void))block; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFExecutor.m b/Pods/Bolts/Bolts/Common/BFExecutor.m deleted file mode 100644 index 05d49f187..000000000 --- a/Pods/Bolts/Bolts/Common/BFExecutor.m +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFExecutor.h" - -#import - -NS_ASSUME_NONNULL_BEGIN - -/*! - Get the remaining stack-size of the current thread. - - @param totalSize The total stack size of the current thread. - - @return The remaining size, in bytes, available to the current thread. - - @note This function cannot be inlined, as otherwise the internal implementation could fail to report the proper - remaining stack space. - */ -__attribute__((noinline)) static size_t remaining_stack_size(size_t *restrict totalSize) { - pthread_t currentThread = pthread_self(); - - // NOTE: We must store stack pointers as uint8_t so that the pointer math is well-defined - uint8_t *endStack = pthread_get_stackaddr_np(currentThread); - *totalSize = pthread_get_stacksize_np(currentThread); - - // NOTE: If the function is inlined, this value could be incorrect - uint8_t *frameAddr = __builtin_frame_address(0); - - return (*totalSize) - (size_t)(endStack - frameAddr); -} - -@interface BFExecutor () - -@property (nonatomic, copy) void(^block)(void(^block)(void)); - -@end - -@implementation BFExecutor - -#pragma mark - Executor methods - -+ (instancetype)defaultExecutor { - static BFExecutor *defaultExecutor = NULL; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - defaultExecutor = [self executorWithBlock:^void(void(^block)(void)) { - // We prefer to run everything possible immediately, so that there is callstack information - // when debugging. However, we don't want the stack to get too deep, so if the remaining stack space - // is less than 10% of the total space, we dispatch to another GCD queue. - size_t totalStackSize = 0; - size_t remainingStackSize = remaining_stack_size(&totalStackSize); - - if (remainingStackSize < (totalStackSize / 10)) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block); - } else { - @autoreleasepool { - block(); - } - } - }]; - }); - return defaultExecutor; -} - -+ (instancetype)immediateExecutor { - static BFExecutor *immediateExecutor = NULL; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - immediateExecutor = [self executorWithBlock:^void(void(^block)(void)) { - block(); - }]; - }); - return immediateExecutor; -} - -+ (instancetype)mainThreadExecutor { - static BFExecutor *mainThreadExecutor = NULL; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - mainThreadExecutor = [self executorWithBlock:^void(void(^block)(void)) { - if (![NSThread isMainThread]) { - dispatch_async(dispatch_get_main_queue(), block); - } else { - @autoreleasepool { - block(); - } - } - }]; - }); - return mainThreadExecutor; -} - -+ (instancetype)executorWithBlock:(void(^)(void(^block)(void)))block { - return [[self alloc] initWithBlock:block]; -} - -+ (instancetype)executorWithDispatchQueue:(dispatch_queue_t)queue { - return [self executorWithBlock:^void(void(^block)(void)) { - dispatch_async(queue, block); - }]; -} - -+ (instancetype)executorWithOperationQueue:(NSOperationQueue *)queue { - return [self executorWithBlock:^void(void(^block)(void)) { - [queue addOperation:[NSBlockOperation blockOperationWithBlock:block]]; - }]; -} - -#pragma mark - Initializer - -- (instancetype)initWithBlock:(void(^)(void(^block)(void)))block { - self = [super init]; - if (!self) return self; - - _block = block; - - return self; -} - -#pragma mark - Execution - -- (void)execute:(void(^)(void))block { - self.block(block); -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFGeneric.h b/Pods/Bolts/Bolts/Common/BFGeneric.h deleted file mode 100644 index 99b2cf7de..000000000 --- a/Pods/Bolts/Bolts/Common/BFGeneric.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -#pragma once - -/** - This exists to use along with `BFTask` and `BFTaskCompletionSource`. - - Instead of returning a `BFTask` with no generic type, or a generic type of 'NSNull' - when there is no usable result from a task, we use the type 'BFVoid', which will always have a value of `nil`. - - This allows you to provide a more enforced API contract to the caller, - as sending any message to `BFVoid` will result in a compile time error. - */ -@class _BFVoid_Nonexistant; -typedef _BFVoid_Nonexistant *BFVoid; diff --git a/Pods/Bolts/Bolts/Common/BFTask.h b/Pods/Bolts/Bolts/Common/BFTask.h deleted file mode 100644 index 074c182de..000000000 --- a/Pods/Bolts/Bolts/Common/BFTask.h +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -NS_ASSUME_NONNULL_BEGIN - -/*! - Error domain used if there was multiple errors on . - */ -extern NSString *const BFTaskErrorDomain; - -/*! - An error code used for , if there were multiple errors. - */ -extern NSInteger const kBFMultipleErrorsError; - -/*! - An error userInfo key used if there were multiple errors on . - Value type is `NSArray *`. - */ -extern NSString *const BFTaskMultipleErrorsUserInfoKey; - -@class BFExecutor; -@class BFTask; - -/*! - The consumer view of a Task. A BFTask has methods to - inspect the state of the task, and to add continuations to - be run once the task is complete. - */ -@interface BFTask<__covariant ResultType> : NSObject - -/*! - A block that can act as a continuation for a task. - */ -typedef __nullable id(^BFContinuationBlock)(BFTask *t); - -/*! - Creates a task that is already completed with the given result. - @param result The result for the task. - */ -+ (instancetype)taskWithResult:(nullable ResultType)result; - -/*! - Creates a task that is already completed with the given error. - @param error The error for the task. - */ -+ (instancetype)taskWithError:(NSError *)error; - -/*! - Creates a task that is already cancelled. - */ -+ (instancetype)cancelledTask; - -/*! - Returns a task that will be completed (with result == nil) once - all of the input tasks have completed. - @param tasks An `NSArray` of the tasks to use as an input. - */ -+ (instancetype)taskForCompletionOfAllTasks:(nullable NSArray *)tasks; - -/*! - Returns a task that will be completed once all of the input tasks have completed. - If all tasks complete successfully without being faulted or cancelled the result will be - an `NSArray` of all task results in the order they were provided. - @param tasks An `NSArray` of the tasks to use as an input. - */ -+ (instancetype)taskForCompletionOfAllTasksWithResults:(nullable NSArray *)tasks; - -/*! - Returns a task that will be completed once there is at least one successful task. - The first task to successuly complete will set the result, all other tasks results are - ignored. - @param tasks An `NSArray` of the tasks to use as an input. - */ -+ (instancetype)taskForCompletionOfAnyTask:(nullable NSArray *)tasks; - -/*! - Returns a task that will be completed a certain amount of time in the future. - @param millis The approximate number of milliseconds to wait before the - task will be finished (with result == nil). - */ -+ (BFTask *)taskWithDelay:(int)millis; - -/*! - Returns a task that will be completed a certain amount of time in the future. - @param millis The approximate number of milliseconds to wait before the - task will be finished (with result == nil). - @param token The cancellation token (optional). - */ -+ (BFTask *)taskWithDelay:(int)millis cancellationToken:(nullable BFCancellationToken *)token; - -/*! - Returns a task that will be completed after the given block completes with - the specified executor. - @param executor A BFExecutor responsible for determining how the - continuation block will be run. - @param block The block to immediately schedule to run with the given executor. - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -+ (instancetype)taskFromExecutor:(BFExecutor *)executor withBlock:(nullable id (^)(void))block; - -// Properties that will be set on the task once it is completed. - -/*! - The result of a successful task. - */ -@property (nullable, nonatomic, strong, readonly) ResultType result; - -/*! - The error of a failed task. - */ -@property (nullable, nonatomic, strong, readonly) NSError *error; - -/*! - Whether this task has been cancelled. - */ -@property (nonatomic, assign, readonly, getter=isCancelled) BOOL cancelled; - -/*! - Whether this task has completed due to an error. - */ -@property (nonatomic, assign, readonly, getter=isFaulted) BOOL faulted; - -/*! - Whether this task has completed. - */ -@property (nonatomic, assign, readonly, getter=isCompleted) BOOL completed; - -/*! - Enqueues the given block to be run once this task is complete. - This method uses a default execution strategy. The block will be - run on the thread where the previous task completes, unless the - the stack depth is too deep, in which case it will be run on a - dispatch queue with default priority. - @param block The block to be run once this task is complete. - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (BFTask *)continueWithBlock:(BFContinuationBlock)block NS_SWIFT_NAME(continueWith(block:)); - -/*! - Enqueues the given block to be run once this task is complete. - This method uses a default execution strategy. The block will be - run on the thread where the previous task completes, unless the - the stack depth is too deep, in which case it will be run on a - dispatch queue with default priority. - @param block The block to be run once this task is complete. - @param cancellationToken The cancellation token (optional). - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (BFTask *)continueWithBlock:(BFContinuationBlock)block - cancellationToken:(nullable BFCancellationToken *)cancellationToken NS_SWIFT_NAME(continueWith(block:cancellationToken:)); - -/*! - Enqueues the given block to be run once this task is complete. - @param executor A BFExecutor responsible for determining how the - continuation block will be run. - @param block The block to be run once this task is complete. - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (BFTask *)continueWithExecutor:(BFExecutor *)executor - withBlock:(BFContinuationBlock)block NS_SWIFT_NAME(continueWith(executor:block:)); - -/*! - Enqueues the given block to be run once this task is complete. - @param executor A BFExecutor responsible for determining how the - continuation block will be run. - @param block The block to be run once this task is complete. - @param cancellationToken The cancellation token (optional). - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - his method will not be completed until that task is completed. - */ -- (BFTask *)continueWithExecutor:(BFExecutor *)executor - block:(BFContinuationBlock)block - cancellationToken:(nullable BFCancellationToken *)cancellationToken -NS_SWIFT_NAME(continueWith(executor:block:cancellationToken:)); - -/*! - Identical to continueWithBlock:, except that the block is only run - if this task did not produce a cancellation or an error. - If it did, then the failure will be propagated to the returned - task. - @param block The block to be run once this task is complete. - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (BFTask *)continueWithSuccessBlock:(BFContinuationBlock)block NS_SWIFT_NAME(continueOnSuccessWith(block:)); - -/*! - Identical to continueWithBlock:, except that the block is only run - if this task did not produce a cancellation or an error. - If it did, then the failure will be propagated to the returned - task. - @param block The block to be run once this task is complete. - @param cancellationToken The cancellation token (optional). - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (BFTask *)continueWithSuccessBlock:(BFContinuationBlock)block - cancellationToken:(nullable BFCancellationToken *)cancellationToken -NS_SWIFT_NAME(continueOnSuccessWith(block:cancellationToken:)); - -/*! - Identical to continueWithExecutor:withBlock:, except that the block - is only run if this task did not produce a cancellation, error, or an error. - If it did, then the failure will be propagated to the returned task. - @param executor A BFExecutor responsible for determining how the - continuation block will be run. - @param block The block to be run once this task is complete. - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (BFTask *)continueWithExecutor:(BFExecutor *)executor - withSuccessBlock:(BFContinuationBlock)block NS_SWIFT_NAME(continueOnSuccessWith(executor:block:)); - -/*! - Identical to continueWithExecutor:withBlock:, except that the block - is only run if this task did not produce a cancellation or an error. - If it did, then the failure will be propagated to the returned task. - @param executor A BFExecutor responsible for determining how the - continuation block will be run. - @param block The block to be run once this task is complete. - @param cancellationToken The cancellation token (optional). - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (BFTask *)continueWithExecutor:(BFExecutor *)executor - successBlock:(BFContinuationBlock)block - cancellationToken:(nullable BFCancellationToken *)cancellationToken -NS_SWIFT_NAME(continueOnSuccessWith(executor:block:cancellationToken:)); - -/*! - Waits until this operation is completed. - This method is inefficient and consumes a thread resource while - it's running. It should be avoided. This method logs a warning - message if it is used on the main thread. - */ -- (void)waitUntilFinished; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFTask.m b/Pods/Bolts/Bolts/Common/BFTask.m deleted file mode 100644 index 0d6bd4cda..000000000 --- a/Pods/Bolts/Bolts/Common/BFTask.m +++ /dev/null @@ -1,465 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFTask.h" - -#import - -#import "Bolts.h" - -NS_ASSUME_NONNULL_BEGIN - -__attribute__ ((noinline)) void warnBlockingOperationOnMainThread() { - NSLog(@"Warning: A long-running operation is being executed on the main thread. \n" - " Break on warnBlockingOperationOnMainThread() to debug."); -} - -NSString *const BFTaskErrorDomain = @"bolts"; -NSInteger const kBFMultipleErrorsError = 80175001; - -NSString *const BFTaskMultipleErrorsUserInfoKey = @"errors"; - -@interface BFTask () { - id _result; - NSError *_error; -} - -@property (nonatomic, assign, readwrite, getter=isCancelled) BOOL cancelled; -@property (nonatomic, assign, readwrite, getter=isFaulted) BOOL faulted; -@property (nonatomic, assign, readwrite, getter=isCompleted) BOOL completed; - -@property (nonatomic, strong) NSObject *lock; -@property (nonatomic, strong) NSCondition *condition; -@property (nonatomic, strong) NSMutableArray *callbacks; - -@end - -@implementation BFTask - -#pragma mark - Initializer - -- (instancetype)init { - self = [super init]; - if (!self) return self; - - _lock = [[NSObject alloc] init]; - _condition = [[NSCondition alloc] init]; - _callbacks = [NSMutableArray array]; - - return self; -} - -- (instancetype)initWithResult:(nullable id)result { - self = [super init]; - if (!self) return self; - - [self trySetResult:result]; - - return self; -} - -- (instancetype)initWithError:(NSError *)error { - self = [super init]; - if (!self) return self; - - [self trySetError:error]; - - return self; -} - -- (instancetype)initCancelled { - self = [super init]; - if (!self) return self; - - [self trySetCancelled]; - - return self; -} - -#pragma mark - Task Class methods - -+ (instancetype)taskWithResult:(nullable id)result { - return [[self alloc] initWithResult:result]; -} - -+ (instancetype)taskWithError:(NSError *)error { - return [[self alloc] initWithError:error]; -} - -+ (instancetype)cancelledTask { - return [[self alloc] initCancelled]; -} - -+ (instancetype)taskForCompletionOfAllTasks:(nullable NSArray *)tasks { - __block int32_t total = (int32_t)tasks.count; - if (total == 0) { - return [self taskWithResult:nil]; - } - - __block int32_t cancelled = 0; - NSObject *lock = [[NSObject alloc] init]; - NSMutableArray *errors = [NSMutableArray array]; - - BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; - for (BFTask *task in tasks) { - [task continueWithBlock:^id(BFTask *t) { - if (t.error) { - @synchronized (lock) { - [errors addObject:t.error]; - } - } else if (t.cancelled) { - OSAtomicIncrement32Barrier(&cancelled); - } - - if (OSAtomicDecrement32Barrier(&total) == 0) { - if (errors.count > 0) { - if (errors.count == 1) { - tcs.error = [errors firstObject]; - } else { - NSError *error = [NSError errorWithDomain:BFTaskErrorDomain - code:kBFMultipleErrorsError - userInfo:@{ BFTaskMultipleErrorsUserInfoKey: errors }]; - tcs.error = error; - } - } else if (cancelled > 0) { - [tcs cancel]; - } else { - tcs.result = nil; - } - } - return nil; - }]; - } - return tcs.task; -} - -+ (instancetype)taskForCompletionOfAllTasksWithResults:(nullable NSArray *)tasks { - return [[self taskForCompletionOfAllTasks:tasks] continueWithSuccessBlock:^id(BFTask * __unused task) { - return [tasks valueForKey:@"result"]; - }]; -} - -+ (instancetype)taskForCompletionOfAnyTask:(nullable NSArray *)tasks -{ - __block int32_t total = (int32_t)tasks.count; - if (total == 0) { - return [self taskWithResult:nil]; - } - - __block int completed = 0; - __block int32_t cancelled = 0; - - NSObject *lock = [NSObject new]; - NSMutableArray *errors = [NSMutableArray new]; - - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - for (BFTask *task in tasks) { - [task continueWithBlock:^id(BFTask *t) { - if (t.error != nil) { - @synchronized(lock) { - [errors addObject:t.error]; - } - } else if (t.cancelled) { - OSAtomicIncrement32Barrier(&cancelled); - } else { - if(OSAtomicCompareAndSwap32Barrier(0, 1, &completed)) { - [source setResult:t.result]; - } - } - - if (OSAtomicDecrement32Barrier(&total) == 0 && - OSAtomicCompareAndSwap32Barrier(0, 1, &completed)) { - if (cancelled > 0) { - [source cancel]; - } else if (errors.count > 0) { - if (errors.count == 1) { - source.error = errors.firstObject; - } else { - NSError *error = [NSError errorWithDomain:BFTaskErrorDomain - code:kBFMultipleErrorsError - userInfo:@{ @"errors": errors }]; - source.error = error; - } - } - } - // Abort execution of per tasks continuations - return nil; - }]; - } - return source.task; -} - - -+ (BFTask *)taskWithDelay:(int)millis { - BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; - dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, millis * NSEC_PER_MSEC); - dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ - tcs.result = nil; - }); - return tcs.task; -} - -+ (BFTask *)taskWithDelay:(int)millis cancellationToken:(nullable BFCancellationToken *)token { - if (token.cancellationRequested) { - return [BFTask cancelledTask]; - } - - BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; - dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, millis * NSEC_PER_MSEC); - dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ - if (token.cancellationRequested) { - [tcs cancel]; - return; - } - tcs.result = nil; - }); - return tcs.task; -} - -+ (instancetype)taskFromExecutor:(BFExecutor *)executor withBlock:(nullable id (^)(void))block { - return [[self taskWithResult:nil] continueWithExecutor:executor withBlock:^id(BFTask *task) { - return block(); - }]; -} - -#pragma mark - Custom Setters/Getters - -- (nullable id)result { - @synchronized(self.lock) { - return _result; - } -} - -- (BOOL)trySetResult:(nullable id)result { - @synchronized(self.lock) { - if (self.completed) { - return NO; - } - self.completed = YES; - _result = result; - [self runContinuations]; - return YES; - } -} - -- (nullable NSError *)error { - @synchronized(self.lock) { - return _error; - } -} - -- (BOOL)trySetError:(NSError *)error { - @synchronized(self.lock) { - if (self.completed) { - return NO; - } - self.completed = YES; - self.faulted = YES; - _error = error; - [self runContinuations]; - return YES; - } -} - -- (BOOL)isCancelled { - @synchronized(self.lock) { - return _cancelled; - } -} - -- (BOOL)isFaulted { - @synchronized(self.lock) { - return _faulted; - } -} - -- (BOOL)trySetCancelled { - @synchronized(self.lock) { - if (self.completed) { - return NO; - } - self.completed = YES; - self.cancelled = YES; - [self runContinuations]; - return YES; - } -} - -- (BOOL)isCompleted { - @synchronized(self.lock) { - return _completed; - } -} - -- (void)runContinuations { - @synchronized(self.lock) { - [self.condition lock]; - [self.condition broadcast]; - [self.condition unlock]; - for (void (^callback)(void) in self.callbacks) { - callback(); - } - [self.callbacks removeAllObjects]; - } -} - -#pragma mark - Chaining methods - -- (BFTask *)continueWithExecutor:(BFExecutor *)executor withBlock:(BFContinuationBlock)block { - return [self continueWithExecutor:executor block:block cancellationToken:nil]; -} - -- (BFTask *)continueWithExecutor:(BFExecutor *)executor - block:(BFContinuationBlock)block - cancellationToken:(nullable BFCancellationToken *)cancellationToken { - BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; - - // Capture all of the state that needs to used when the continuation is complete. - dispatch_block_t executionBlock = ^{ - if (cancellationToken.cancellationRequested) { - [tcs cancel]; - return; - } - - id result = block(self); - if ([result isKindOfClass:[BFTask class]]) { - - id (^setupWithTask) (BFTask *) = ^id(BFTask *task) { - if (cancellationToken.cancellationRequested || task.cancelled) { - [tcs cancel]; - } else if (task.error) { - tcs.error = task.error; - } else { - tcs.result = task.result; - } - return nil; - }; - - BFTask *resultTask = (BFTask *)result; - - if (resultTask.completed) { - setupWithTask(resultTask); - } else { - [resultTask continueWithBlock:setupWithTask]; - } - - } else { - tcs.result = result; - } - }; - - BOOL completed; - @synchronized(self.lock) { - completed = self.completed; - if (!completed) { - [self.callbacks addObject:[^{ - [executor execute:executionBlock]; - } copy]]; - } - } - if (completed) { - [executor execute:executionBlock]; - } - - return tcs.task; -} - -- (BFTask *)continueWithBlock:(BFContinuationBlock)block { - return [self continueWithExecutor:[BFExecutor defaultExecutor] block:block cancellationToken:nil]; -} - -- (BFTask *)continueWithBlock:(BFContinuationBlock)block cancellationToken:(nullable BFCancellationToken *)cancellationToken { - return [self continueWithExecutor:[BFExecutor defaultExecutor] block:block cancellationToken:cancellationToken]; -} - -- (BFTask *)continueWithExecutor:(BFExecutor *)executor - withSuccessBlock:(BFContinuationBlock)block { - return [self continueWithExecutor:executor successBlock:block cancellationToken:nil]; -} - -- (BFTask *)continueWithExecutor:(BFExecutor *)executor - successBlock:(BFContinuationBlock)block - cancellationToken:(nullable BFCancellationToken *)cancellationToken { - if (cancellationToken.cancellationRequested) { - return [BFTask cancelledTask]; - } - - return [self continueWithExecutor:executor block:^id(BFTask *task) { - if (task.faulted || task.cancelled) { - return task; - } else { - return block(task); - } - } cancellationToken:cancellationToken]; -} - -- (BFTask *)continueWithSuccessBlock:(BFContinuationBlock)block { - return [self continueWithExecutor:[BFExecutor defaultExecutor] successBlock:block cancellationToken:nil]; -} - -- (BFTask *)continueWithSuccessBlock:(BFContinuationBlock)block cancellationToken:(nullable BFCancellationToken *)cancellationToken { - return [self continueWithExecutor:[BFExecutor defaultExecutor] successBlock:block cancellationToken:cancellationToken]; -} - -#pragma mark - Syncing Task (Avoid it) - -- (void)warnOperationOnMainThread { - warnBlockingOperationOnMainThread(); -} - -- (void)waitUntilFinished { - if ([NSThread isMainThread]) { - [self warnOperationOnMainThread]; - } - - @synchronized(self.lock) { - if (self.completed) { - return; - } - [self.condition lock]; - } - // TODO: (nlutsenko) Restructure this to use Bolts-Swift thread access synchronization architecture - // In the meantime, it's absolutely safe to get `_completed` aka an ivar, as long as it's a `BOOL` aka less than word size. - while (!_completed) { - [self.condition wait]; - } - [self.condition unlock]; -} - -#pragma mark - NSObject - -- (NSString *)description { - // Acquire the data from the locked properties - BOOL completed; - BOOL cancelled; - BOOL faulted; - NSString *resultDescription = nil; - - @synchronized(self.lock) { - completed = self.completed; - cancelled = self.cancelled; - faulted = self.faulted; - resultDescription = completed ? [NSString stringWithFormat:@" result = %@", self.result] : @""; - } - - // Description string includes status information and, if available, the - // result since in some ways this is what a promise actually "is". - return [NSString stringWithFormat:@"<%@: %p; completed = %@; cancelled = %@; faulted = %@;%@>", - NSStringFromClass([self class]), - self, - completed ? @"YES" : @"NO", - cancelled ? @"YES" : @"NO", - faulted ? @"YES" : @"NO", - resultDescription]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.h b/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.h deleted file mode 100644 index f94c18fdb..000000000 --- a/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -@class BFTask<__covariant ResultType>; - -/*! - A BFTaskCompletionSource represents the producer side of tasks. - It is a task that also has methods for changing the state of the - task by settings its completion values. - */ -@interface BFTaskCompletionSource<__covariant ResultType> : NSObject - -/*! - Creates a new unfinished task. - */ -+ (instancetype)taskCompletionSource; - -/*! - The task associated with this TaskCompletionSource. - */ -@property (nonatomic, strong, readonly) BFTask *task; - -/*! - Completes the task by setting the result. - Attempting to set this for a completed task will raise an exception. - @param result The result of the task. - */ -- (void)setResult:(nullable ResultType)result NS_SWIFT_NAME(set(result:)); - -/*! - Completes the task by setting the error. - Attempting to set this for a completed task will raise an exception. - @param error The error for the task. - */ -- (void)setError:(NSError *)error NS_SWIFT_NAME(set(error:)); - -/*! - Completes the task by marking it as cancelled. - Attempting to set this for a completed task will raise an exception. - */ -- (void)cancel; - -/*! - Sets the result of the task if it wasn't already completed. - @returns whether the new value was set. - */ -- (BOOL)trySetResult:(nullable ResultType)result NS_SWIFT_NAME(trySet(result:)); - -/*! - Sets the error of the task if it wasn't already completed. - @param error The error for the task. - @returns whether the new value was set. - */ -- (BOOL)trySetError:(NSError *)error NS_SWIFT_NAME(trySet(error:)); - -/*! - Sets the cancellation state of the task if it wasn't already completed. - @returns whether the new value was set. - */ -- (BOOL)trySetCancelled; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.m b/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.m deleted file mode 100644 index 33a6f8966..000000000 --- a/Pods/Bolts/Bolts/Common/BFTaskCompletionSource.m +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFTaskCompletionSource.h" - -#import "BFTask.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface BFTask (BFTaskCompletionSource) - -- (BOOL)trySetResult:(nullable id)result; -- (BOOL)trySetError:(NSError *)error; -- (BOOL)trySetCancelled; - -@end - -@implementation BFTaskCompletionSource - -#pragma mark - Initializer - -+ (instancetype)taskCompletionSource { - return [[self alloc] init]; -} - -- (instancetype)init { - self = [super init]; - if (!self) return self; - - _task = [[BFTask alloc] init]; - - return self; -} - -#pragma mark - Custom Setters/Getters - -- (void)setResult:(nullable id)result { - if (![self.task trySetResult:result]) { - [NSException raise:NSInternalInconsistencyException - format:@"Cannot set the result on a completed task."]; - } -} - -- (void)setError:(NSError *)error { - if (![self.task trySetError:error]) { - [NSException raise:NSInternalInconsistencyException - format:@"Cannot set the error on a completed task."]; - } -} - -- (void)cancel { - if (![self.task trySetCancelled]) { - [NSException raise:NSInternalInconsistencyException - format:@"Cannot cancel a completed task."]; - } -} - -- (BOOL)trySetResult:(nullable id)result { - return [self.task trySetResult:result]; -} - -- (BOOL)trySetError:(NSError *)error { - return [self.task trySetError:error]; -} - -- (BOOL)trySetCancelled { - return [self.task trySetCancelled]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/Bolts.h b/Pods/Bolts/Bolts/Common/Bolts.h deleted file mode 100644 index a3f2bd6f2..000000000 --- a/Pods/Bolts/Bolts/Common/Bolts.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 -#import -#import -#import -#import - -#if __has_include() && TARGET_OS_IPHONE && !TARGET_OS_WATCH && !TARGET_OS_TV -#import -#import -#import -#import -#import -#import -#import -#import -#import -#endif - - -NS_ASSUME_NONNULL_BEGIN - -/** - A string containing the version of the Bolts Framework used by the current application. - */ -extern NSString *const BoltsFrameworkVersionString; - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/Common/Bolts.m b/Pods/Bolts/Bolts/Common/Bolts.m deleted file mode 100644 index c20268797..000000000 --- a/Pods/Bolts/Bolts/Common/Bolts.m +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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.h" - -NS_ASSUME_NONNULL_BEGIN - -NSString *const BoltsFrameworkVersionString = @"1.9.0"; - -NS_ASSUME_NONNULL_END diff --git a/Pods/Bolts/Bolts/iOS/BFAppLink.h b/Pods/Bolts/Bolts/iOS/BFAppLink.h deleted file mode 100644 index aa89efc2b..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLink.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -/*! The version of the App Link protocol that this library supports */ -FOUNDATION_EXPORT NSString *const BFAppLinkVersion; - -/*! - Contains App Link metadata relevant for navigation on this device - derived from the HTML at a given URL. - */ -@interface BFAppLink : NSObject - -/*! - Creates a BFAppLink with the given list of BFAppLinkTargets and target URL. - - Generally, this will only be used by implementers of the BFAppLinkResolving protocol, - as these implementers will produce App Link metadata for a given URL. - - @param sourceURL the URL from which this App Link is derived - @param targets an ordered list of BFAppLinkTargets for this platform derived - from App Link metadata. - @param webURL the fallback web URL, if any, for the app link. - */ -+ (instancetype)appLinkWithSourceURL:(NSURL *)sourceURL - targets:(NSArray *)targets - webURL:(NSURL *)webURL; - -/*! The URL from which this BFAppLink was derived */ -@property (nonatomic, strong, readonly) NSURL *sourceURL; - -/*! - The ordered list of targets applicable to this platform that will be used - for navigation. - */ -@property (nonatomic, copy, readonly) NSArray *targets; - -/*! The fallback web URL to use if no targets are installed on this device. */ -@property (nonatomic, strong, readonly) NSURL *webURL; - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLink.m b/Pods/Bolts/Bolts/iOS/BFAppLink.m deleted file mode 100644 index 77fd3115b..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLink.m +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFAppLink_Internal.h" - -NSString *const BFAppLinkDataParameterName = @"al_applink_data"; -NSString *const BFAppLinkTargetKeyName = @"target_url"; -NSString *const BFAppLinkUserAgentKeyName = @"user_agent"; -NSString *const BFAppLinkExtrasKeyName = @"extras"; -NSString *const BFAppLinkRefererAppLink = @"referer_app_link"; -NSString *const BFAppLinkRefererAppName = @"app_name"; -NSString *const BFAppLinkRefererUrl = @"url"; -NSString *const BFAppLinkVersionKeyName = @"version"; -NSString *const BFAppLinkVersion = @"1.0"; - -@interface BFAppLink () - -@property (nonatomic, strong, readwrite) NSURL *sourceURL; -@property (nonatomic, copy, readwrite) NSArray *targets; -@property (nonatomic, strong, readwrite) NSURL *webURL; - -@property (nonatomic, assign, readwrite, getter=isBackToReferrer) BOOL backToReferrer; - -@end - -@implementation BFAppLink - -+ (instancetype)appLinkWithSourceURL:(NSURL *)sourceURL - targets:(NSArray *)targets - webURL:(NSURL *)webURL - isBackToReferrer:(BOOL)isBackToReferrer { - BFAppLink *link = [[self alloc] initWithIsBackToReferrer:isBackToReferrer]; - link.sourceURL = sourceURL; - link.targets = [targets copy]; - link.webURL = webURL; - return link; -} - -+ (instancetype)appLinkWithSourceURL:(NSURL *)sourceURL - targets:(NSArray *)targets - webURL:(NSURL *)webURL { - return [self appLinkWithSourceURL:sourceURL - targets:targets - webURL:webURL - isBackToReferrer:NO]; -} - -- (BFAppLink *)initWithIsBackToReferrer:(BOOL)backToReferrer { - if ((self = [super init])) { - _backToReferrer = backToReferrer; - } - return self; -} - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.h b/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.h deleted file mode 100644 index 4b8a71e02..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -/*! - The result of calling navigate on a BFAppLinkNavigation - */ -typedef NS_ENUM(NSInteger, BFAppLinkNavigationType) { - /*! Indicates that the navigation failed and no app was opened */ - BFAppLinkNavigationTypeFailure, - /*! Indicates that the navigation succeeded by opening the URL in the browser */ - BFAppLinkNavigationTypeBrowser, - /*! Indicates that the navigation succeeded by opening the URL in an app on the device */ - BFAppLinkNavigationTypeApp -}; - -@protocol BFAppLinkResolving; -@class BFTask; - -/*! - Represents a pending request to navigate to an App Link. Most developers will - simply use navigateToURLInBackground: to open a URL, but developers can build - custom requests with additional navigation and app data attached to them by - creating BFAppLinkNavigations themselves. - */ -NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extension") -@interface BFAppLinkNavigation : NSObject - -/*! - The extras for the AppLinkNavigation. This will generally contain application-specific - data that should be passed along with the request, such as advertiser or affiliate IDs or - other such metadata relevant on this device. - */ -@property (nonatomic, copy, readonly) NSDictionary *extras; - -/*! - The al_applink_data for the AppLinkNavigation. This will generally contain data common to - navigation attempts such as back-links, user agents, and other information that may be used - in routing and handling an App Link request. - */ -@property (nonatomic, copy, readonly) NSDictionary *appLinkData; - -/*! The AppLink to navigate to */ -@property (nonatomic, strong, readonly) BFAppLink *appLink; - -/*! Creates an AppLinkNavigation with the given link, extras, and App Link data */ -+ (instancetype)navigationWithAppLink:(BFAppLink *)appLink - extras:(NSDictionary *)extras - appLinkData:(NSDictionary *)appLinkData; - -/*! - Creates an NSDictionary with the correct format for iOS callback URLs, - to be used as 'appLinkData' argument in the call to navigationWithAppLink:extras:appLinkData: - */ -+ (NSDictionary *)callbackAppLinkDataForAppWithName:(NSString *)appName url:(NSString *)url; - -/*! Performs the navigation */ -- (BFAppLinkNavigationType)navigate:(NSError **)error; - -/*! Returns a BFAppLink for the given URL */ -+ (BFTask *)resolveAppLinkInBackground:(NSURL *)destination; - -/*! Returns a BFAppLink for the given URL using the given App Link resolution strategy */ -+ (BFTask *)resolveAppLinkInBackground:(NSURL *)destination resolver:(id)resolver; - -/*! Navigates to a BFAppLink and returns whether it opened in-app or in-browser */ -+ (BFAppLinkNavigationType)navigateToAppLink:(BFAppLink *)link error:(NSError **)error; - -/*! - Returns a BFAppLinkNavigationType based on a BFAppLink. - It's essentially a no-side-effect version of navigateToAppLink:error:, - allowing apps to determine flow based on the link type (e.g. open an - internal web view instead of going straight to the browser for regular links.) - */ -+ (BFAppLinkNavigationType)navigationTypeForLink:(BFAppLink *)link; - -/*! - Return navigation type for current instance. - No-side-effect version of navigate: - */ -- (BFAppLinkNavigationType)navigationType; - -/*! Navigates to a URL (an asynchronous action) and returns a BFNavigationType */ -+ (BFTask *)navigateToURLInBackground:(NSURL *)destination; - -/*! - Navigates to a URL (an asynchronous action) using the given App Link resolution - strategy and returns a BFNavigationType - */ -+ (BFTask *)navigateToURLInBackground:(NSURL *)destination resolver:(id)resolver; - -/*! - Gets the default resolver to be used for App Link resolution. If the developer has not set one explicitly, - a basic, built-in resolver will be used. - */ -+ (id)defaultResolver; - -/*! - Sets the default resolver to be used for App Link resolution. Setting this to nil will revert the - default resolver to the basic, built-in resolver provided by Bolts. - */ -+ (void)setDefaultResolver:(id)resolver; - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.m b/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.m deleted file mode 100644 index 7ea12de0f..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLinkNavigation.m +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFAppLinkNavigation.h" - -#import - -#import "BFMeasurementEvent_Internal.h" -#import "BFAppLink_Internal.h" - -FOUNDATION_EXPORT NSString *const BFAppLinkDataParameterName; -FOUNDATION_EXPORT NSString *const BFAppLinkTargetKeyName; -FOUNDATION_EXPORT NSString *const BFAppLinkUserAgentKeyName; -FOUNDATION_EXPORT NSString *const BFAppLinkExtrasKeyName; -FOUNDATION_EXPORT NSString *const BFAppLinkVersionKeyName; -FOUNDATION_EXPORT NSString *const BFAppLinkRefererAppLink; -FOUNDATION_EXPORT NSString *const BFAppLinkRefererAppName; -FOUNDATION_EXPORT NSString *const BFAppLinkRefererUrl; - -static id defaultResolver; - -@interface BFAppLinkNavigation () - -@property (nonatomic, copy, readwrite) NSDictionary *extras; -@property (nonatomic, copy, readwrite) NSDictionary *appLinkData; -@property (nonatomic, strong, readwrite) BFAppLink *appLink; - -@end - -@implementation BFAppLinkNavigation - -+ (instancetype)navigationWithAppLink:(BFAppLink *)appLink - extras:(NSDictionary *)extras - appLinkData:(NSDictionary *)appLinkData { - BFAppLinkNavigation *navigation = [[self alloc] init]; - navigation.appLink = appLink; - navigation.extras = extras; - navigation.appLinkData = appLinkData; - return navigation; -} - -+ (NSDictionary *)callbackAppLinkDataForAppWithName:(NSString *)appName url:(NSString *)url { - return @{BFAppLinkRefererAppLink: @{BFAppLinkRefererAppName: appName, BFAppLinkRefererUrl: url}}; -} - -- (NSString *)stringByEscapingQueryString:(NSString *)string { -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 - return [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; -#else - return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, - (CFStringRef)string, - NULL, - (CFStringRef) @":/?#[]@!$&'()*+,;=", - kCFStringEncodingUTF8)); -#endif -} - -- (NSURL *)appLinkURLWithTargetURL:(NSURL *)targetUrl error:(NSError **)error { - NSMutableDictionary *appLinkData = [NSMutableDictionary dictionaryWithDictionary:self.appLinkData ?: @{}]; - - // Add applink protocol data - if (!appLinkData[BFAppLinkUserAgentKeyName]) { - appLinkData[BFAppLinkUserAgentKeyName] = [NSString stringWithFormat:@"Bolts iOS %@", BoltsFrameworkVersionString]; - } - if (!appLinkData[BFAppLinkVersionKeyName]) { - appLinkData[BFAppLinkVersionKeyName] = BFAppLinkVersion; - } - appLinkData[BFAppLinkTargetKeyName] = [self.appLink.sourceURL absoluteString]; - appLinkData[BFAppLinkExtrasKeyName] = self.extras ?: @{}; - - // JSON-ify the applink data - NSError *jsonError = nil; - NSData *jsonBlob = [NSJSONSerialization dataWithJSONObject:appLinkData options:0 error:&jsonError]; - if (!jsonError) { - NSString *jsonString = [[NSString alloc] initWithData:jsonBlob encoding:NSUTF8StringEncoding]; - NSString *encoded = [self stringByEscapingQueryString:jsonString]; - - NSString *endUrlString = [NSString stringWithFormat:@"%@%@%@=%@", - [targetUrl absoluteString], - targetUrl.query ? @"&" : @"?", - BFAppLinkDataParameterName, - encoded]; - - return [NSURL URLWithString:endUrlString]; - } else { - if (error) { - *error = jsonError; - } - - // If there was an error encoding the app link data, fail hard. - return nil; - } -} - -- (BFAppLinkNavigationType)navigate:(NSError **)error { - NSURL *openedURL = nil; - NSError *encodingError = nil; - BFAppLinkNavigationType retType = BFAppLinkNavigationTypeFailure; - - // Find the first eligible/launchable target in the BFAppLink. - for (BFAppLinkTarget *target in self.appLink.targets) { - NSURL *appLinkAppURL = [self appLinkURLWithTargetURL:target.URL error:&encodingError]; - if (encodingError || !appLinkAppURL) { - if (error) { - *error = encodingError; - } - } else if ([[UIApplication sharedApplication] openURL:appLinkAppURL]) { - retType = BFAppLinkNavigationTypeApp; - openedURL = appLinkAppURL; - break; - } - } - - if (!openedURL && self.appLink.webURL) { - // Fall back to opening the url in the browser if available. - NSURL *appLinkBrowserURL = [self appLinkURLWithTargetURL:self.appLink.webURL error:&encodingError]; - if (encodingError || !appLinkBrowserURL) { - // If there was an error encoding the app link data, fail hard. - if (error) { - *error = encodingError; - } - } else if ([[UIApplication sharedApplication] openURL:appLinkBrowserURL]) { - // This was a browser navigation. - retType = BFAppLinkNavigationTypeBrowser; - openedURL = appLinkBrowserURL; - } - } - - [self postAppLinkNavigateEventNotificationWithTargetURL:openedURL - error:error ? *error : nil - type:retType]; - return retType; -} - -- (void)postAppLinkNavigateEventNotificationWithTargetURL:(NSURL *)outputURL error:(NSError *)error type:(BFAppLinkNavigationType)type { - NSString *const EVENT_YES_VAL = @"1"; - NSString *const EVENT_NO_VAL = @"0"; - NSMutableDictionary *logData = [[NSMutableDictionary alloc] init]; - - NSString *outputURLScheme = [outputURL scheme]; - NSString *outputURLString = [outputURL absoluteString]; - if (outputURLScheme) { - logData[@"outputURLScheme"] = outputURLScheme; - } - if (outputURLString) { - logData[@"outputURL"] = outputURLString; - } - - NSString *sourceURLString = [self.appLink.sourceURL absoluteString]; - NSString *sourceURLHost = [self.appLink.sourceURL host]; - NSString *sourceURLScheme = [self.appLink.sourceURL scheme]; - if (sourceURLString) { - logData[@"sourceURL"] = sourceURLString; - } - if (sourceURLHost) { - logData[@"sourceHost"] = sourceURLHost; - } - if (sourceURLScheme) { - logData[@"sourceScheme"] = sourceURLScheme; - } - if ([error localizedDescription]) { - logData[@"error"] = [error localizedDescription]; - } - NSString *success = nil; //no - NSString *linkType = nil; // unknown; - switch (type) { - case BFAppLinkNavigationTypeFailure: - success = EVENT_NO_VAL; - linkType = @"fail"; - break; - case BFAppLinkNavigationTypeBrowser: - success = EVENT_YES_VAL; - linkType = @"web"; - break; - case BFAppLinkNavigationTypeApp: - success = EVENT_YES_VAL; - linkType = @"app"; - break; - default: - break; - } - if (success) { - logData[@"success"] = success; - } - if (linkType) { - logData[@"type"] = linkType; - } - - if ([self.appLink isBackToReferrer]) { - [BFMeasurementEvent postNotificationForEventName:BFAppLinkNavigateBackToReferrerEventName args:logData]; - } else { - [BFMeasurementEvent postNotificationForEventName:BFAppLinkNavigateOutEventName args:logData]; - } -} - -+ (BFTask *)resolveAppLinkInBackground:(NSURL *)destination resolver:(id)resolver { - return [resolver appLinkFromURLInBackground:destination]; -} - -+ (BFTask *)resolveAppLinkInBackground:(NSURL *)destination { - return [self resolveAppLinkInBackground:destination resolver:[self defaultResolver]]; -} - -+ (BFTask *)navigateToURLInBackground:(NSURL *)destination { - return [self navigateToURLInBackground:destination - resolver:[self defaultResolver]]; -} - -+ (BFTask *)navigateToURLInBackground:(NSURL *)destination - resolver:(id)resolver { - BFTask *resolutionTask = [self resolveAppLinkInBackground:destination - resolver:resolver]; - return [resolutionTask continueWithExecutor:[BFExecutor mainThreadExecutor] - withSuccessBlock:^id(BFTask *task) { - NSError *error = nil; - BFAppLinkNavigationType result = [self navigateToAppLink:task.result - error:&error]; - if (error) { - return [BFTask taskWithError:error]; - } else { - return @(result); - } - }]; -} - -+ (BFAppLinkNavigationType)navigateToAppLink:(BFAppLink *)link error:(NSError **)error { - return [[BFAppLinkNavigation navigationWithAppLink:link - extras:nil - appLinkData:nil] navigate:error]; -} - -+ (BFAppLinkNavigationType)navigationTypeForLink:(BFAppLink *)link { - return [[self navigationWithAppLink:link extras:nil appLinkData:nil] navigationType]; -} - -- (BFAppLinkNavigationType)navigationType { - BFAppLinkTarget *eligibleTarget = nil; - for (BFAppLinkTarget *target in self.appLink.targets) { - if ([[UIApplication sharedApplication] canOpenURL:target.URL]) { - eligibleTarget = target; - break; - } - } - - if (eligibleTarget != nil) { - NSURL *appLinkURL = [self appLinkURLWithTargetURL:eligibleTarget.URL error:nil]; - if (appLinkURL != nil) { - return BFAppLinkNavigationTypeApp; - } else { - return BFAppLinkNavigationTypeFailure; - } - } - - if (self.appLink.webURL != nil) { - NSURL *appLinkURL = [self appLinkURLWithTargetURL:eligibleTarget.URL error:nil]; - if (appLinkURL != nil) { - return BFAppLinkNavigationTypeBrowser; - } else { - return BFAppLinkNavigationTypeFailure; - } - } - - return BFAppLinkNavigationTypeFailure; -} - -+ (id)defaultResolver { - if (defaultResolver) { - return defaultResolver; - } - return [BFWebViewAppLinkResolver sharedInstance]; -} - -+ (void)setDefaultResolver:(id)resolver { - defaultResolver = resolver; -} - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkResolving.h b/Pods/Bolts/Bolts/iOS/BFAppLinkResolving.h deleted file mode 100644 index 5c78bff45..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLinkResolving.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -@class BFTask; - -/*! - Implement this protocol to provide an alternate strategy for resolving - App Links that may include pre-fetching, caching, or querying for App Link - data from an index provided by a service provider. - */ -@protocol BFAppLinkResolving - -/*! - Asynchronously resolves App Link data for a given URL. - - @param url The URL to resolve into an App Link. - @returns A BFTask that will return a BFAppLink for the given URL. - */ -- (BFTask *)appLinkFromURLInBackground:(NSURL *)url NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extension"); - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h deleted file mode 100644 index 436c52806..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 BFAppLink; -@class BFAppLinkReturnToRefererController; - -/*! - Protocol that a class can implement in order to be notified when the user has navigated back - to the referer of an App Link. - */ -@protocol BFAppLinkReturnToRefererControllerDelegate - -@optional - -/*! Called when the user has tapped to navigate, but before the navigation has been performed. */ -- (void)returnToRefererController:(BFAppLinkReturnToRefererController *)controller - willNavigateToAppLink:(BFAppLink *)appLink; - -/*! Called after the navigation has been attempted, with an indication of whether the referer - app link was successfully opened. */ -- (void)returnToRefererController:(BFAppLinkReturnToRefererController *)controller - didNavigateToAppLink:(BFAppLink *)url - type:(BFAppLinkNavigationType)type; - -@end - -/*! - A controller class that implements default behavior for a BFAppLinkReturnToRefererView, including - the ability to display the view above the navigation bar for navigation-based apps. - */ -NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extension") -@interface BFAppLinkReturnToRefererController : NSObject - -/*! - The delegate that will be notified when the user navigates back to the referer. - */ -@property (nonatomic, weak) id delegate; - -/*! - The BFAppLinkReturnToRefererView this controller is controlling. - */ -@property (nonatomic, strong) BFAppLinkReturnToRefererView *view; - -/*! - Initializes a controller suitable for controlling a BFAppLinkReturnToRefererView that is to be displayed - contained within another UIView (i.e., not displayed above the navigation bar). - */ -- (instancetype)init; - -/*! - Initializes a controller suitable for controlling a BFAppLinkReturnToRefererView that is to be displayed - displayed above the navigation bar. - */ -- (instancetype)initForDisplayAboveNavController:(UINavigationController *)navController; - -/*! - Removes the view entirely from the navigation controller it is currently displayed in. - */ -- (void)removeFromNavController; - -/*! - Shows the BFAppLinkReturnToRefererView with the specified referer information. If nil or missing data, - the view will not be displayed. */ -- (void)showViewForRefererAppLink:(BFAppLink *)refererAppLink; - -/*! - Shows the BFAppLinkReturnToRefererView with referer information extracted from the specified URL. - If nil or missing referer App Link data, the view will not be displayed. */ -- (void)showViewForRefererURL:(NSURL *)url; - -/*! - Closes the view, possibly animating it. - */ -- (void)closeViewAnimated:(BOOL)animated; - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.m b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.m deleted file mode 100644 index d38063549..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.m +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFAppLinkReturnToRefererController.h" - -#import "BFAppLink.h" -#import "BFAppLinkReturnToRefererView_Internal.h" -#import "BFURL_Internal.h" - -static const CFTimeInterval kBFViewAnimationDuration = 0.25f; - -@implementation BFAppLinkReturnToRefererController { - UINavigationController *_navigationController; - BFAppLinkReturnToRefererView *_view; -} - -#pragma mark - Object lifecycle - -- (instancetype)init { - return [self initForDisplayAboveNavController:nil]; -} - -- (instancetype)initForDisplayAboveNavController:(UINavigationController *)navController { - self = [super init]; - if (self) { - _navigationController = navController; - - if (_navigationController != nil) { - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:self - selector:@selector(statusBarFrameWillChange:) - name:UIApplicationWillChangeStatusBarFrameNotification - object:nil]; - [nc addObserver:self - selector:@selector(statusBarFrameDidChange:) - name:UIApplicationDidChangeStatusBarFrameNotification - object:nil]; - [nc addObserver:self - selector:@selector(orientationDidChange:) - name:UIDeviceOrientationDidChangeNotification - object:nil]; - } - } - return self; -} - -- (void)dealloc { - _view.delegate = nil; - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - Public API - -- (BFAppLinkReturnToRefererView *)view { - if (!_view) { - self.view = [[BFAppLinkReturnToRefererView alloc] initWithFrame:CGRectZero]; - if (_navigationController) { - [_navigationController.view addSubview:_view]; - } - } - return _view; -} - -- (void)setView:(BFAppLinkReturnToRefererView *)view { - if (_view != view) { - _view.delegate = nil; - } - - _view = view; - _view.delegate = self; - - if (_navigationController) { - _view.includeStatusBarInSize = BFIncludeStatusBarInSizeAlways; - } -} - -- (void)showViewForRefererAppLink:(BFAppLink *)refererAppLink { - self.view.refererAppLink = refererAppLink; - - [_view sizeToFit]; - - if (_navigationController) { - if (!_view.closed) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self moveNavigationBar]; - }); - } - } -} - -- (void)showViewForRefererURL:(NSURL *)url { - BFAppLink *appLink = [BFURL URLForRenderBackToReferrerBarURL:url].appLinkReferer; - [self showViewForRefererAppLink:appLink]; -} - -- (void)removeFromNavController { - if (_navigationController) { - [_view removeFromSuperview]; - _navigationController = nil; - } -} - -#pragma mark - BFAppLinkReturnToRefererViewDelegate - -- (void)returnToRefererViewDidTapInsideCloseButton:(BFAppLinkReturnToRefererView *)view { - [self closeViewAnimated:YES explicitlyClosed:YES]; -} - -- (void)returnToRefererViewDidTapInsideLink:(BFAppLinkReturnToRefererView *)view - link:(BFAppLink *)link { - [self openRefererAppLink:link]; - [self closeViewAnimated:NO explicitlyClosed:NO]; -} - -#pragma mark - Private - -- (void)statusBarFrameWillChange:(NSNotification *)notification { - NSValue *rectValue = [[notification userInfo] valueForKey:UIApplicationStatusBarFrameUserInfoKey]; - CGRect newFrame; - [rectValue getValue:&newFrame]; - - if (_navigationController && !_view.closed) { - if (CGRectGetHeight(newFrame) == 40) { - UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState; - [UIView animateWithDuration:kBFViewAnimationDuration delay:0.0 options:options animations:^{ - _view.frame = CGRectMake(0.0, 0.0, CGRectGetWidth(_view.bounds), 0.0); - } completion:nil]; - } - } -} - -- (void)statusBarFrameDidChange:(NSNotification *)notification { - NSValue *rectValue = [[notification userInfo] valueForKey:UIApplicationStatusBarFrameUserInfoKey]; - CGRect newFrame; - [rectValue getValue:&newFrame]; - - if (_navigationController && !_view.closed) { - if (CGRectGetHeight(newFrame) == 40) { - UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState; - [UIView animateWithDuration:kBFViewAnimationDuration delay:0.0 options:options animations:^{ - [_view sizeToFit]; - [self moveNavigationBar]; - } completion:nil]; - } - } -} - -- (void)orientationDidChange:(NSNotificationCenter *)notification { - if (_navigationController && !_view.closed && CGRectGetHeight(_view.bounds) > 0) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self moveNavigationBar]; - }); - } -} - -- (void)moveNavigationBar { - if (_view.closed || !_view.refererAppLink) { - return; - } - - [self updateNavigationBarY:CGRectGetHeight(_view.bounds)]; -} - -- (void)updateNavigationBarY:(CGFloat)y { - UINavigationBar *navigationBar = _navigationController.navigationBar; - CGRect navigationBarFrame = navigationBar.frame; - CGFloat oldContainerViewY = CGRectGetMaxY(navigationBarFrame); - navigationBarFrame.origin.y = y; - navigationBar.frame = navigationBarFrame; - - CGFloat dy = CGRectGetMaxY(navigationBarFrame) - oldContainerViewY; - UIView *containerView = _navigationController.visibleViewController.view.superview; - containerView.frame = UIEdgeInsetsInsetRect(containerView.frame, UIEdgeInsetsMake(dy, 0.0, 0.0, 0.0)); -} - -- (void)closeViewAnimated:(BOOL)animated { - [self closeViewAnimated:animated explicitlyClosed:YES]; -} - -- (void)closeViewAnimated:(BOOL)animated explicitlyClosed:(BOOL)explicitlyClosed { - void (^closer)(void) = ^{ - if (_navigationController) { - [self updateNavigationBarY:_view.statusBarHeight]; - } - - CGRect frame = _view.frame; - frame.size.height = 0.0; - _view.frame = frame; - }; - - if (animated) { - [UIView animateWithDuration:kBFViewAnimationDuration animations:^{ - closer(); - } completion:^(BOOL finished) { - if (explicitlyClosed) { - _view.closed = YES; - } - }]; - } else { - closer(); - if (explicitlyClosed) { - _view.closed = YES; - } - } -} - -- (void)openRefererAppLink:(BFAppLink *)refererAppLink { - if (refererAppLink) { - id delegate = _delegate; - if ([delegate respondsToSelector:@selector(returnToRefererController:willNavigateToAppLink:)]) { - [delegate returnToRefererController:self willNavigateToAppLink:refererAppLink]; - } - - NSError *error = nil; - BFAppLinkNavigationType type = [BFAppLinkNavigation navigateToAppLink:refererAppLink error:&error]; - - if ([delegate respondsToSelector:@selector(returnToRefererController:didNavigateToAppLink:type:)]) { - [delegate returnToRefererController:self didNavigateToAppLink:refererAppLink type:type]; - } - } -} - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h deleted file mode 100644 index f62bc66f6..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 BFAppLinkReturnToRefererView; -@class BFURL; - -typedef NS_ENUM(NSUInteger, BFIncludeStatusBarInSize) { - BFIncludeStatusBarInSizeNever, - BFIncludeStatusBarInSizeIOS7AndLater, - BFIncludeStatusBarInSizeAlways, -}; - -/*! - Protocol that a class can implement in order to be notified when the user has navigated back - to the referer of an App Link. - */ -@protocol BFAppLinkReturnToRefererViewDelegate - -/*! - Called when the user has tapped inside the close button. - */ -- (void)returnToRefererViewDidTapInsideCloseButton:(BFAppLinkReturnToRefererView *)view; - -/*! - Called when the user has tapped inside the App Link portion of the view. - */ -- (void)returnToRefererViewDidTapInsideLink:(BFAppLinkReturnToRefererView *)view - link:(BFAppLink *)link; - -@end - -/*! - Provides a UIView that displays a button allowing users to navigate back to the - application that launched the App Link currently being handled, if the App Link - contained referer data. The user can also close the view by clicking a close button - rather than navigating away. If the view is provided an App Link that does not contain - referer data, it will have zero size and no UI will be displayed. - */ -NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extension") -@interface BFAppLinkReturnToRefererView : UIView - -/*! - The delegate that will be notified when the user navigates back to the referer. - */ -@property (nonatomic, weak) id delegate; - -/*! - The color of the text label and close button. - */ -@property (nonatomic, strong) UIColor *textColor; - -@property (nonatomic, strong) BFAppLink *refererAppLink; - -/*! - Indicates whether to extend the size of the view to include the current status bar - size, for use in scenarios where the view might extend under the status bar on iOS 7 and - above; this property has no effect on earlier versions of iOS. - */ -@property (nonatomic, assign) BFIncludeStatusBarInSize includeStatusBarInSize; - -/*! - Indicates whether the user has closed the view by clicking the close button. - */ -@property (nonatomic, assign) BOOL closed; - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.m b/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.m deleted file mode 100644 index f2d0e79ba..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.m +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFAppLinkReturnToRefererView.h" - -#import "BFAppLink.h" -#import "BFAppLinkTarget.h" - -static const CGFloat BFMarginX = 8.5f; -static const CGFloat BFMarginY = 8.5f; - -static NSString *const BFRefererAppLink = @"referer_app_link"; -static NSString *const BFRefererAppName = @"app_name"; -static NSString *const BFRefererUrl = @"url"; -static const CGFloat BFCloseButtonWidth = 12.0; -static const CGFloat BFCloseButtonHeight = 12.0; - -@interface BFAppLinkReturnToRefererView () - -@property (nonatomic, strong) UILabel *labelView; -@property (nonatomic, strong) UIButton *closeButton; -@property (nonatomic, strong) UITapGestureRecognizer *insideTapGestureRecognizer; - -@end - -@implementation BFAppLinkReturnToRefererView { - BOOL _explicitlyHidden; -} - -#pragma mark - Initialization - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self commonInit]; - [self sizeToFit]; - } - return self; -} - -- (instancetype)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if (self) { - [self commonInit]; - } - return self; -} - -- (void)commonInit { - // Initialization code - _includeStatusBarInSize = BFIncludeStatusBarInSizeIOS7AndLater; - - // iOS 7 system blue color - self.backgroundColor = [UIColor colorWithRed:0.0f green:122.0f / 255.0f blue:1.0f alpha:1.0f]; - self.textColor = [UIColor whiteColor]; - self.clipsToBounds = YES; - - [self initViews]; -} - -- (void)initViews { - if (!_labelView && !_closeButton) { - _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; - _closeButton.backgroundColor = [UIColor clearColor]; - _closeButton.userInteractionEnabled = YES; - _closeButton.clipsToBounds = YES; - _closeButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin; - _closeButton.contentMode = UIViewContentModeCenter; - [_closeButton addTarget:self action:@selector(closeButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; - - [self addSubview:_closeButton]; - - _labelView = [[UILabel alloc] initWithFrame:CGRectZero]; - _labelView.font = [UIFont systemFontOfSize:[UIFont smallSystemFontSize]]; - _labelView.textColor = [UIColor whiteColor]; - _labelView.backgroundColor = [UIColor clearColor]; -#ifdef __IPHONE_6_0 - _labelView.textAlignment = NSTextAlignmentCenter; -#else - _labelView.textAlignment = UITextAlignmentCenter; -#endif - _labelView.clipsToBounds = YES; - [self updateLabelText]; - [self addSubview:_labelView]; - - _insideTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTapInside:)]; - _labelView.userInteractionEnabled = YES; - [_labelView addGestureRecognizer:_insideTapGestureRecognizer]; - - [self updateColors]; - } -} - -#pragma mark - Layout - -- (CGSize)intrinsicContentSize { - CGSize size = self.bounds.size; - if (_closed || !self.hasRefererData) { - size.height = 0.0; - } else { - CGSize labelSize = [_labelView sizeThatFits:size]; - size = CGSizeMake(size.width, labelSize.height + 2 * BFMarginY + self.statusBarHeight); - } - return size; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - CGRect bounds = self.bounds; - - _labelView.preferredMaxLayoutWidth = _labelView.bounds.size.width; - CGSize labelSize = [_labelView sizeThatFits:bounds.size]; - _labelView.frame = CGRectMake(BFMarginX, - CGRectGetMaxY(bounds) - labelSize.height - 1.5f * BFMarginY, - CGRectGetMaxX(bounds) - BFCloseButtonWidth - 3 * BFMarginX, - labelSize.height + BFMarginY); - - _closeButton.frame = CGRectMake(CGRectGetMaxX(bounds) - BFCloseButtonWidth - 2 * BFMarginX, - _labelView.center.y - BFCloseButtonHeight / 2.0f - BFMarginY, - BFCloseButtonWidth + 2 * BFMarginX, - BFCloseButtonHeight + 2 * BFMarginY); -} - -- (CGSize)sizeThatFits:(CGSize)size { - if (_closed || !self.hasRefererData) { - size = CGSizeMake(size.width, 0.0); - } else { - CGSize labelSize = [_labelView sizeThatFits:size]; - size = CGSizeMake(size.width, labelSize.height + 2 * BFMarginY + self.statusBarHeight); - } - return size; -} - -- (CGFloat)statusBarHeight { - UIApplication *application = [UIApplication sharedApplication]; - - BOOL include; - switch (_includeStatusBarInSize) { - case BFIncludeStatusBarInSizeAlways: - include = YES; - break; - case BFIncludeStatusBarInSizeIOS7AndLater: { - float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; - include = (systemVersion >= 7.0); - break; - } - case BFIncludeStatusBarInSizeNever: - include = NO; - break; - } - if (include && !application.statusBarHidden) { - BOOL landscape = UIInterfaceOrientationIsLandscape(application.statusBarOrientation); - CGRect statusBarFrame = application.statusBarFrame; - return landscape ? CGRectGetWidth(statusBarFrame) : CGRectGetHeight(statusBarFrame); - } - - return 0; -} - -#pragma mark - Public API - -- (void)setIncludeStatusBarInSize:(BFIncludeStatusBarInSize)includeStatusBarInSize { - _includeStatusBarInSize = includeStatusBarInSize; - [self setNeedsLayout]; - [self invalidateIntrinsicContentSize]; -} - -- (void)setTextColor:(UIColor *)textColor { - _textColor = textColor; - [self updateColors]; -} - -- (void)setRefererAppLink:(BFAppLink *)refererAppLink { - _refererAppLink = refererAppLink; - [self updateLabelText]; - [self updateHidden]; - [self invalidateIntrinsicContentSize]; -} - -- (void)setClosed:(BOOL)closed { - if (_closed != closed) { - _closed = closed; - [self updateHidden]; - [self invalidateIntrinsicContentSize]; - } -} - -- (void)setHidden:(BOOL)hidden { - _explicitlyHidden = hidden; - [self updateHidden]; -} - -#pragma mark - Private - -- (void)updateLabelText { - NSString *appName = (_refererAppLink && _refererAppLink.targets[0]) ? [_refererAppLink.targets[0] appName] : nil; - _labelView.text = [self localizedLabelForReferer:appName]; -} - -- (void)updateColors { - UIImage *closeButtonImage = [self drawCloseButtonImageWithColor:_textColor]; - - _labelView.textColor = _textColor; - [_closeButton setImage:closeButtonImage forState:UIControlStateNormal]; -} - -- (UIImage *)drawCloseButtonImageWithColor:(UIColor *)color { - - UIGraphicsBeginImageContextWithOptions(CGSizeMake(BFCloseButtonWidth, BFCloseButtonHeight), NO, 0.0f); - - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGContextSetStrokeColorWithColor(context, [color CGColor]); - CGContextSetFillColorWithColor(context, [color CGColor]); - - CGContextSetLineWidth(context, 1.25f); - - CGFloat inset = 0.5f; - - CGContextMoveToPoint(context, inset, inset); - CGContextAddLineToPoint(context, BFCloseButtonWidth - inset, BFCloseButtonHeight - inset); - CGContextStrokePath(context); - - CGContextMoveToPoint(context, BFCloseButtonWidth - inset, inset); - CGContextAddLineToPoint(context, inset, BFCloseButtonHeight - inset); - CGContextStrokePath(context); - - UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return result; -} - -- (NSString *)localizedLabelForReferer:(NSString *)refererName { - if (!refererName) { - return nil; - } - - NSString *format = NSLocalizedString(@"Touch to return to %1$@", @"Format for the string to return to a calling app."); - - return [NSString stringWithFormat:format, refererName]; -} - -- (BOOL)hasRefererData { - return _refererAppLink && _refererAppLink.targets[0]; -} - -- (void)closeButtonTapped:(id)sender { - [_delegate returnToRefererViewDidTapInsideCloseButton:self]; -} - -- (void)onTapInside:(UIGestureRecognizer *)sender { - [_delegate returnToRefererViewDidTapInsideLink:self link:_refererAppLink]; -} - -- (void)updateHidden { - [super setHidden:_explicitlyHidden || _closed || !self.hasRefererData]; -} - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.h b/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.h deleted file mode 100644 index 61721269d..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -/*! - Represents a target defined in App Link metadata, consisting of at least - a URL, and optionally an App Store ID and name. - */ -@interface BFAppLinkTarget : NSObject - -/*! Creates a BFAppLinkTarget with the given app site and target URL. */ -+ (instancetype)appLinkTargetWithURL:(NSURL *)url - appStoreId:(NSString *)appStoreId - appName:(NSString *)appName; - -/*! The URL prefix for this app link target */ -@property (nonatomic, strong, readonly) NSURL *URL; - -/*! The app ID for the app store */ -@property (nonatomic, copy, readonly) NSString *appStoreId; - -/*! The name of the app */ -@property (nonatomic, copy, readonly) NSString *appName; - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.m b/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.m deleted file mode 100644 index 5518cba29..000000000 --- a/Pods/Bolts/Bolts/iOS/BFAppLinkTarget.m +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFAppLinkTarget.h" - -@interface BFAppLinkTarget () - -@property (nonatomic, strong, readwrite) NSURL *URL; -@property (nonatomic, copy, readwrite) NSString *appStoreId; -@property (nonatomic, copy, readwrite) NSString *appName; - -@end - -@implementation BFAppLinkTarget - -+ (instancetype)appLinkTargetWithURL:(NSURL *)url - appStoreId:(NSString *)appStoreId - appName:(NSString *)appName { - BFAppLinkTarget *target = [[self alloc] init]; - target.URL = url; - target.appStoreId = appStoreId; - target.appName = appName; - return target; -} - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.h b/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.h deleted file mode 100644 index b3173fc23..000000000 --- a/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -/*! The name of the notification posted by BFMeasurementEvent */ -FOUNDATION_EXPORT NSString *const BFMeasurementEventNotificationName; - -/*! Defines keys in the userInfo object for the notification named BFMeasurementEventNotificationName */ -/*! The string field for the name of the event */ -FOUNDATION_EXPORT NSString *const BFMeasurementEventNameKey; -/*! The dictionary field for the arguments of the event */ -FOUNDATION_EXPORT NSString *const BFMeasurementEventArgsKey; - -/*! Bolts Events raised by BFMeasurementEvent for Applink */ -/*! - The name of the event posted when [BFURL URLWithURL:] is called successfully. This represents the successful parsing of an app link URL. - */ -FOUNDATION_EXPORT NSString *const BFAppLinkParseEventName; - -/*! - The name of the event posted when [BFURL URLWithInboundURL:] is called successfully. - This represents parsing an inbound app link URL from a different application - */ -FOUNDATION_EXPORT NSString *const BFAppLinkNavigateInEventName; - -/*! The event raised when the user navigates from your app to other apps */ -FOUNDATION_EXPORT NSString *const BFAppLinkNavigateOutEventName; - -/*! - The event raised when the user navigates out from your app and back to the referrer app. - e.g when the user leaves your app after tapping the back-to-referrer navigation bar - */ -FOUNDATION_EXPORT NSString *const BFAppLinkNavigateBackToReferrerEventName; - -@interface BFMeasurementEvent : NSObject - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.m b/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.m deleted file mode 100644 index e3e6cde4a..000000000 --- a/Pods/Bolts/Bolts/iOS/BFMeasurementEvent.m +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFMeasurementEvent_Internal.h" - -NSString *const BFMeasurementEventNotificationName = @"com.parse.bolts.measurement_event"; - -NSString *const BFMeasurementEventNameKey = @"event_name"; -NSString *const BFMeasurementEventArgsKey = @"event_args"; - -/* app Link Event raised by this BFURL */ -NSString *const BFAppLinkParseEventName = @"al_link_parse"; -NSString *const BFAppLinkNavigateInEventName = @"al_nav_in"; - -/*! AppLink events raised in this class */ -NSString *const BFAppLinkNavigateOutEventName = @"al_nav_out"; -NSString *const BFAppLinkNavigateBackToReferrerEventName = @"al_ref_back_out"; - -__attribute__((noinline)) void warnOnMissingEventName() { - NSLog(@"Warning: Missing event name when logging bolts measurement event. \n" - " Ignoring this event in logging."); -} - -@implementation BFMeasurementEvent { - NSString *_name; - NSDictionary *_args; -} - -- (void)postNotification { - if (!_name) { - warnOnMissingEventName(); - return; - } - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - NSDictionary *userInfo = @{BFMeasurementEventNameKey : _name, - BFMeasurementEventArgsKey : _args}; - - [center postNotificationName:BFMeasurementEventNotificationName - object:self - userInfo:userInfo]; -} - -- (instancetype)initEventWithName:(NSString *)name args:(NSDictionary *)args { - if ((self = [super init])) { - _name = name; - _args = args ? args : @{}; - } - return self; -} - -+ (void)postNotificationForEventName:(NSString *)name args:(NSDictionary *)args { - [[[self alloc] initEventWithName:name args:args] postNotification]; -} - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFURL.h b/Pods/Bolts/Bolts/iOS/BFURL.h deleted file mode 100644 index 924c91d48..000000000 --- a/Pods/Bolts/Bolts/iOS/BFURL.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -@class BFAppLink; - -/*! - Provides a set of utilities for working with NSURLs, such as parsing of query parameters - and handling for App Link requests. - */ -@interface BFURL : NSObject - -/*! - Creates a link target from a raw URL. - On success, this posts the BFAppLinkParseEventName measurement event. If you are constructing the BFURL within your application delegate's - application:openURL:sourceApplication:annotation:, you should instead use URLWithInboundURL:sourceApplication: - to support better BFMeasurementEvent notifications - @param url The instance of `NSURL` to create BFURL from. - */ -+ (BFURL *)URLWithURL:(NSURL *)url; - -/*! - Creates a link target from a raw URL received from an external application. This is typically called from the app delegate's - application:openURL:sourceApplication:annotation: and will post the BFAppLinkNavigateInEventName measurement event. - @param url The instance of `NSURL` to create BFURL from. - @param sourceApplication the bundle ID of the app that is requesting your app to open the URL. The same sourceApplication in application:openURL:sourceApplication:annotation: - */ -+ (BFURL *)URLWithInboundURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication; - -/*! - Gets the target URL. If the link is an App Link, this is the target of the App Link. - Otherwise, it is the url that created the target. - */ -@property (nonatomic, strong, readonly) NSURL *targetURL; - -/*! - Gets the query parameters for the target, parsed into an NSDictionary. - */ -@property (nonatomic, strong, readonly) NSDictionary *targetQueryParameters; - -/*! - If this link target is an App Link, this is the data found in al_applink_data. - Otherwise, it is nil. - */ -@property (nonatomic, strong, readonly) NSDictionary *appLinkData; - -/*! - If this link target is an App Link, this is the data found in extras. - */ -@property (nonatomic, strong, readonly) NSDictionary *appLinkExtras; - -/*! - The App Link indicating how to navigate back to the referer app, if any. - */ -@property (nonatomic, strong, readonly) BFAppLink *appLinkReferer; - -/*! - The URL that was used to create this BFURL. - */ -@property (nonatomic, strong, readonly) NSURL *inputURL; - -/*! - The query parameters of the inputURL, parsed into an NSDictionary. - */ -@property (nonatomic, strong, readonly) NSDictionary *inputQueryParameters; - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFURL.m b/Pods/Bolts/Bolts/iOS/BFURL.m deleted file mode 100644 index 14a13842b..000000000 --- a/Pods/Bolts/Bolts/iOS/BFURL.m +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFURL_Internal.h" -#import "BFAppLink_Internal.h" -#import "BFAppLinkTarget.h" -#import "BFMeasurementEvent_Internal.h" - -@implementation BFURL - -- (instancetype)initWithURL:(NSURL *)url forOpenInboundURL:(BOOL)forOpenURLEvent sourceApplication:(NSString *)sourceApplication forRenderBackToReferrerBar:(BOOL)forRenderBackToReferrerBar { - self = [super init]; - if (!self) return nil; - - _inputURL = url; - _targetURL = url; - - // Parse the query string parameters for the base URL - NSDictionary *baseQuery = [BFURL queryParametersForURL:url]; - _inputQueryParameters = baseQuery; - _targetQueryParameters = baseQuery; - - // Check for applink_data - NSString *appLinkDataString = baseQuery[BFAppLinkDataParameterName]; - if (appLinkDataString) { - // Try to parse the JSON - NSError *error = nil; - NSDictionary *applinkData = [NSJSONSerialization JSONObjectWithData:[appLinkDataString dataUsingEncoding:NSUTF8StringEncoding] - options:0 - error:&error]; - if (!error && [applinkData isKindOfClass:[NSDictionary class]]) { - // If the version is not specified, assume it is 1. - NSString *version = applinkData[BFAppLinkVersionKeyName] ?: @"1.0"; - NSString *target = applinkData[BFAppLinkTargetKeyName]; - if ([version isKindOfClass:[NSString class]] && - [version isEqual:BFAppLinkVersion]) { - // There's applink data! The target should actually be the applink target. - _appLinkData = applinkData; - id applinkExtras = applinkData[BFAppLinkExtrasKeyName]; - if (applinkExtras && [applinkExtras isKindOfClass:[NSDictionary class]]) { - _appLinkExtras = applinkExtras; - } - _targetURL = ([target isKindOfClass:[NSString class]] ? [NSURL URLWithString:target] : url); - _targetQueryParameters = [BFURL queryParametersForURL:_targetURL]; - - NSDictionary *refererAppLink = _appLinkData[BFAppLinkRefererAppLink]; - NSString *refererURLString = refererAppLink[BFAppLinkRefererUrl]; - NSString *refererAppName = refererAppLink[BFAppLinkRefererAppName]; - - if (refererURLString && refererAppName) { - BFAppLinkTarget *appLinkTarget = [BFAppLinkTarget appLinkTargetWithURL:[NSURL URLWithString:refererURLString] - appStoreId:nil - appName:refererAppName]; - _appLinkReferer = [BFAppLink appLinkWithSourceURL:[NSURL URLWithString:refererURLString] - targets:@[ appLinkTarget ] - webURL:nil - isBackToReferrer:YES]; - } - - // Raise Measurement Event - NSString *const EVENT_YES_VAL = @"1"; - NSString *const EVENT_NO_VAL = @"0"; - NSMutableDictionary *logData = [[NSMutableDictionary alloc] init]; - logData[@"version"] = version; - if (refererURLString) { - logData[@"refererURL"] = refererURLString; - } - if (refererAppName) { - logData[@"refererAppName"] = refererAppName; - } - if (sourceApplication) { - logData[@"sourceApplication"] = sourceApplication; - } - if ([_targetURL absoluteString]) { - logData[@"targetURL"] = [_targetURL absoluteString]; - } - if ([_inputURL absoluteString]) { - logData[@"inputURL"] = [_inputURL absoluteString]; - } - if ([_inputURL scheme]) { - logData[@"inputURLScheme"] = [_inputURL scheme]; - } - logData[@"forRenderBackToReferrerBar"] = forRenderBackToReferrerBar ? EVENT_YES_VAL : EVENT_NO_VAL; - logData[@"forOpenUrl"] = forOpenURLEvent ? EVENT_YES_VAL : EVENT_NO_VAL; - [BFMeasurementEvent postNotificationForEventName:BFAppLinkParseEventName args:logData]; - if (forOpenURLEvent) { - [BFMeasurementEvent postNotificationForEventName:BFAppLinkNavigateInEventName args:logData]; - } - } - } - } - - return self; -} - -+ (BFURL *)URLWithURL:(NSURL *)url { - return [[BFURL alloc] initWithURL:url forOpenInboundURL:NO sourceApplication:nil forRenderBackToReferrerBar:NO]; -} - -+ (BFURL *)URLWithInboundURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication { - return [[BFURL alloc] initWithURL:url forOpenInboundURL:YES sourceApplication:sourceApplication forRenderBackToReferrerBar:NO]; -} - -+ (BFURL *)URLForRenderBackToReferrerBarURL:(NSURL *)url { - return [[BFURL alloc] initWithURL:url forOpenInboundURL:NO sourceApplication:nil forRenderBackToReferrerBar:YES]; -} - -+ (NSString *)decodeURLString:(NSString *)string { - return (NSString *)CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapes(NULL, - (CFStringRef)string, - CFSTR(""))); -} - -+ (NSDictionary *)queryParametersForURL:(NSURL *)url { - NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; - NSString *query = url.query; - if ([query isEqualToString:@""]) { - return @{}; - } - NSArray *queryComponents = [query componentsSeparatedByString:@"&"]; - for (NSString *component in queryComponents) { - NSRange equalsLocation = [component rangeOfString:@"="]; - if (equalsLocation.location == NSNotFound) { - // There's no equals, so associate the key with NSNull - parameters[[self decodeURLString:component]] = [NSNull null]; - } else { - NSString *key = [self decodeURLString:[component substringToIndex:equalsLocation.location]]; - NSString *value = [self decodeURLString:[component substringFromIndex:equalsLocation.location + 1]]; - parameters[key] = value; - } - } - return [NSDictionary dictionaryWithDictionary:parameters]; -} - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h b/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h deleted file mode 100644 index 3782ae2cb..000000000 --- a/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -/*! - A reference implementation for an App Link resolver that uses a hidden UIWebView - to parse the HTML containing App Link metadata. - */ -@interface BFWebViewAppLinkResolver : NSObject - -/*! - Gets the instance of a BFWebViewAppLinkResolver. - */ -+ (instancetype)sharedInstance; - -@end diff --git a/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.m b/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.m deleted file mode 100644 index 0e0d58c6e..000000000 --- a/Pods/Bolts/Bolts/iOS/BFWebViewAppLinkResolver.m +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 "BFWebViewAppLinkResolver.h" -#import "BFAppLink.h" -#import "BFAppLinkTarget.h" -#import "BFTask.h" -#import "BFTaskCompletionSource.h" -#import "BFExecutor.h" - -// Defines JavaScript to extract app link tags from HTML content -static NSString *const BFWebViewAppLinkResolverTagExtractionJavaScript = @"" -"(function() {" -" var metaTags = document.getElementsByTagName('meta');" -" var results = [];" -" for (var i = 0; i < metaTags.length; i++) {" -" var property = metaTags[i].getAttribute('property');" -" if (property && property.substring(0, 'al:'.length) === 'al:') {" -" var tag = { \"property\": metaTags[i].getAttribute('property') };" -" if (metaTags[i].hasAttribute('content')) {" -" tag['content'] = metaTags[i].getAttribute('content');" -" }" -" results.push(tag);" -" }" -" }" -" return JSON.stringify(results);" -"})()"; -static NSString *const BFWebViewAppLinkResolverIOSURLKey = @"url"; -static NSString *const BFWebViewAppLinkResolverIOSAppStoreIdKey = @"app_store_id"; -static NSString *const BFWebViewAppLinkResolverIOSAppNameKey = @"app_name"; -static NSString *const BFWebViewAppLinkResolverDictionaryValueKey = @"_value"; -static NSString *const BFWebViewAppLinkResolverPreferHeader = @"Prefer-Html-Meta-Tags"; -static NSString *const BFWebViewAppLinkResolverMetaTagPrefix = @"al"; -static NSString *const BFWebViewAppLinkResolverWebKey = @"web"; -static NSString *const BFWebViewAppLinkResolverIOSKey = @"ios"; -static NSString *const BFWebViewAppLinkResolverIPhoneKey = @"iphone"; -static NSString *const BFWebViewAppLinkResolverIPadKey = @"ipad"; -static NSString *const BFWebViewAppLinkResolverWebURLKey = @"url"; -static NSString *const BFWebViewAppLinkResolverShouldFallbackKey = @"should_fallback"; - -@interface BFWebViewAppLinkResolverWebViewDelegate : NSObject - -@property (nonatomic, copy) void (^didFinishLoad)(UIWebView *webView); -@property (nonatomic, copy) void (^didFailLoadWithError)(UIWebView *webView, NSError *error); -@property (nonatomic, assign) BOOL hasLoaded; - -@end - -@implementation BFWebViewAppLinkResolverWebViewDelegate - -- (void)webViewDidFinishLoad:(UIWebView *)webView { - if (self.didFinishLoad) { - self.didFinishLoad(webView); - } -} - -- (void)webViewDidStartLoad:(UIWebView *)webView { -} - -- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { - if (self.didFailLoadWithError) { - self.didFailLoadWithError(webView, error); - } -} - -- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { - if (self.hasLoaded) { - // Consider loading a second resource to be "success", since it indicates an inner frame - // or redirect is happening. We can run the tag extraction script at this point. - self.didFinishLoad(webView); - return NO; - } - self.hasLoaded = YES; - return YES; -} - -@end - -@implementation BFWebViewAppLinkResolver - -+ (instancetype)sharedInstance { - static id instance; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [[self alloc] init]; - }); - return instance; -} - -- (BFTask *)followRedirects:(NSURL *)url { - // This task will be resolved with either the redirect NSURL - // or a dictionary with the response data to be returned. - BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; - [request setValue:BFWebViewAppLinkResolverMetaTagPrefix forHTTPHeaderField:BFWebViewAppLinkResolverPreferHeader]; - - void (^completion)(NSURLResponse *response, NSData *data, NSError *error) = ^(NSURLResponse *response, NSData *data, NSError *error) { - if (error) { - [tcs setError:error]; - return; - } - - if ([response isKindOfClass:[NSHTTPURLResponse class]]) { - NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; - - // NSURLConnection usually follows redirects automatically, but the - // documentation is unclear what the default is. This helps it along. - if (httpResponse.statusCode >= 300 && httpResponse.statusCode < 400) { - NSString *redirectString = httpResponse.allHeaderFields[@"Location"]; - NSURL *redirectURL = [NSURL URLWithString:redirectString]; - [tcs setResult:redirectURL]; - return; - } - } - - [tcs setResult:@{ @"response" : response, @"data" : data }]; - }; - -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9 - NSURLSession *session = [NSURLSession sharedSession]; - [[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - completion(response, data, error); - }] resume]; -#else - [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:completion]; -#endif - - return [tcs.task continueWithSuccessBlock:^id(BFTask *task) { - // If we redirected, just keep recursing. - if ([task.result isKindOfClass:[NSURL class]]) { - return [self followRedirects:task.result]; - } - return task; - }]; -} - -- (BFTask *)appLinkFromURLInBackground:(NSURL *)url NS_EXTENSION_UNAVAILABLE_IOS("") { - return [[self followRedirects:url] continueWithExecutor:[BFExecutor mainThreadExecutor] - withSuccessBlock:^id(BFTask *task) { - NSData *responseData = task.result[@"data"]; - NSHTTPURLResponse *response = task.result[@"response"]; - BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; - - UIWebView *webView = [[UIWebView alloc] init]; - BFWebViewAppLinkResolverWebViewDelegate *listener = [[BFWebViewAppLinkResolverWebViewDelegate alloc] init]; - __block BFWebViewAppLinkResolverWebViewDelegate *retainedListener = listener; - listener.didFinishLoad = ^(UIWebView *view) { - if (retainedListener) { - NSDictionary *ogData = [self getALDataFromLoadedPage:view]; - [view removeFromSuperview]; - view.delegate = nil; - retainedListener = nil; - [tcs setResult:[self appLinkFromALData:ogData destination:url]]; - } - }; - listener.didFailLoadWithError = ^(UIWebView* view, NSError *error) { - if (retainedListener) { - [view removeFromSuperview]; - view.delegate = nil; - retainedListener = nil; - [tcs setError:error]; - } - }; - webView.delegate = listener; - webView.hidden = YES; - [webView loadData:responseData - MIMEType:response.MIMEType - textEncodingName:response.textEncodingName - baseURL:response.URL]; - UIWindow *window = [UIApplication sharedApplication].windows.firstObject; - [window addSubview:webView]; - - return tcs.task; - }]; -} - -/* - Builds up a data structure filled with the app link data from the meta tags on a page. - The structure of this object is a dictionary where each key holds an array of app link - data dictionaries. Values are stored in a key called "_value". - */ -- (NSDictionary *)parseALData:(NSArray *)dataArray { - NSMutableDictionary *al = [NSMutableDictionary dictionary]; - for (NSDictionary *tag in dataArray) { - NSString *name = tag[@"property"]; - if (![name isKindOfClass:[NSString class]]) { - continue; - } - NSArray *nameComponents = [name componentsSeparatedByString:@":"]; - if (![nameComponents[0] isEqualToString:BFWebViewAppLinkResolverMetaTagPrefix]) { - continue; - } - NSMutableDictionary *root = al; - for (NSUInteger i = 1; i < nameComponents.count; i++) { - NSMutableArray *children = root[nameComponents[i]]; - if (!children) { - children = [NSMutableArray array]; - root[nameComponents[i]] = children; - } - NSMutableDictionary *child = children.lastObject; - if (!child || i == nameComponents.count - 1) { - child = [NSMutableDictionary dictionary]; - [children addObject:child]; - } - root = child; - } - if (tag[@"content"]) { - root[BFWebViewAppLinkResolverDictionaryValueKey] = tag[@"content"]; - } - } - return al; -} - -- (NSDictionary *)getALDataFromLoadedPage:(UIWebView *)webView { - // Run some JavaScript in the webview to fetch the meta tags. - NSString *jsonString = [webView stringByEvaluatingJavaScriptFromString:BFWebViewAppLinkResolverTagExtractionJavaScript]; - NSError *error = nil; - NSArray *arr = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] - options:0 - error:&error]; - return [self parseALData:arr]; -} - -/* - Converts app link data into a BFAppLink containing the targets relevant for this platform. - */ -- (BFAppLink *)appLinkFromALData:(NSDictionary *)appLinkDict destination:(NSURL *)destination { - NSMutableArray *linkTargets = [NSMutableArray array]; - - NSArray *platformData = nil; - - const UIUserInterfaceIdiom idiom = UI_USER_INTERFACE_IDIOM(); - if (idiom == UIUserInterfaceIdiomPad) { - platformData = @[ appLinkDict[BFWebViewAppLinkResolverIPadKey] ?: @{}, - appLinkDict[BFWebViewAppLinkResolverIOSKey] ?: @{} ]; - } else if (idiom == UIUserInterfaceIdiomPhone) { - platformData = @[ appLinkDict[BFWebViewAppLinkResolverIPhoneKey] ?: @{}, - appLinkDict[BFWebViewAppLinkResolverIOSKey] ?: @{} ]; - } else { - // Future-proofing. Other User Interface idioms should only hit ios. - platformData = @[ appLinkDict[BFWebViewAppLinkResolverIOSKey] ?: @{} ]; - } - - for (NSArray *platformObjects in platformData) { - for (NSDictionary *platformDict in platformObjects) { - // The schema requires a single url/app store id/app name, - // but we could find multiple of them. We'll make a best effort - // to interpret this data. - NSArray *urls = platformDict[BFWebViewAppLinkResolverIOSURLKey]; - NSArray *appStoreIds = platformDict[BFWebViewAppLinkResolverIOSAppStoreIdKey]; - NSArray *appNames = platformDict[BFWebViewAppLinkResolverIOSAppNameKey]; - - NSUInteger maxCount = MAX(urls.count, MAX(appStoreIds.count, appNames.count)); - - for (NSUInteger i = 0; i < maxCount; i++) { - NSString *urlString = urls[i][BFWebViewAppLinkResolverDictionaryValueKey]; - NSURL *url = urlString ? [NSURL URLWithString:urlString] : nil; - NSString *appStoreId = appStoreIds[i][BFWebViewAppLinkResolverDictionaryValueKey]; - NSString *appName = appNames[i][BFWebViewAppLinkResolverDictionaryValueKey]; - BFAppLinkTarget *target = [BFAppLinkTarget appLinkTargetWithURL:url - appStoreId:appStoreId - appName:appName]; - [linkTargets addObject:target]; - } - } - } - - NSDictionary *webDict = appLinkDict[BFWebViewAppLinkResolverWebKey][0]; - NSString *webUrlString = webDict[BFWebViewAppLinkResolverWebURLKey][0][BFWebViewAppLinkResolverDictionaryValueKey]; - NSString *shouldFallbackString = webDict[BFWebViewAppLinkResolverShouldFallbackKey][0][BFWebViewAppLinkResolverDictionaryValueKey]; - - NSURL *webUrl = destination; - - if (shouldFallbackString && - [@[ @"no", @"false", @"0" ] containsObject:[shouldFallbackString lowercaseString]]) { - webUrl = nil; - } - if (webUrl && webUrlString) { - webUrl = [NSURL URLWithString:webUrlString]; - } - - return [BFAppLink appLinkWithSourceURL:destination - targets:linkTargets - webURL:webUrl]; -} - -@end diff --git a/Pods/Bolts/Bolts/iOS/Internal/BFAppLinkReturnToRefererView_Internal.h b/Pods/Bolts/Bolts/iOS/Internal/BFAppLinkReturnToRefererView_Internal.h deleted file mode 100644 index 8b85823b4..000000000 --- a/Pods/Bolts/Bolts/iOS/Internal/BFAppLinkReturnToRefererView_Internal.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 BFAppLinkReturnToRefererView (Internal) - -- (CGFloat)statusBarHeight; - -@end diff --git a/Pods/Bolts/Bolts/iOS/Internal/BFAppLink_Internal.h b/Pods/Bolts/Bolts/iOS/Internal/BFAppLink_Internal.h deleted file mode 100644 index aeeaa53e3..000000000 --- a/Pods/Bolts/Bolts/iOS/Internal/BFAppLink_Internal.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 - -FOUNDATION_EXPORT NSString *const BFAppLinkDataParameterName; -FOUNDATION_EXPORT NSString *const BFAppLinkTargetKeyName; -FOUNDATION_EXPORT NSString *const BFAppLinkUserAgentKeyName; -FOUNDATION_EXPORT NSString *const BFAppLinkExtrasKeyName; -FOUNDATION_EXPORT NSString *const BFAppLinkVersionKeyName; -FOUNDATION_EXPORT NSString *const BFAppLinkRefererAppLink; -FOUNDATION_EXPORT NSString *const BFAppLinkRefererAppName; -FOUNDATION_EXPORT NSString *const BFAppLinkRefererUrl; - -@interface BFAppLink (Internal) - -+ (instancetype)appLinkWithSourceURL:(NSURL *)sourceURL - targets:(NSArray *)targets - webURL:(NSURL *)webURL - isBackToReferrer:(BOOL)isBackToReferrer; - -/*! return if this AppLink is to go back to referrer. */ -@property (nonatomic, assign, readonly, getter=isBackToReferrer) BOOL backToReferrer; - -@end diff --git a/Pods/Bolts/Bolts/iOS/Internal/BFMeasurementEvent_Internal.h b/Pods/Bolts/Bolts/iOS/Internal/BFMeasurementEvent_Internal.h deleted file mode 100644 index 7d46fd046..000000000 --- a/Pods/Bolts/Bolts/iOS/Internal/BFMeasurementEvent_Internal.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 -/*! - Provides methods for posting notifications from the Bolts framework - */ -@interface BFMeasurementEvent (Internal) - -+ (void)postNotificationForEventName:(NSString *)name args:(NSDictionary *)args; - -@end diff --git a/Pods/Bolts/Bolts/iOS/Internal/BFURL_Internal.h b/Pods/Bolts/Bolts/iOS/Internal/BFURL_Internal.h deleted file mode 100644 index 03b6bc674..000000000 --- a/Pods/Bolts/Bolts/iOS/Internal/BFURL_Internal.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * 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 BFURL (Internal) -+ (BFURL *)URLForRenderBackToReferrerBarURL:(NSURL *)url; -@end diff --git a/Pods/Bolts/LICENSE b/Pods/Bolts/LICENSE deleted file mode 100644 index e1a5831de..000000000 --- a/Pods/Bolts/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -BSD License - -For Bolts software - -Copyright (c) 2013-present, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Pods/Bolts/README.md b/Pods/Bolts/README.md deleted file mode 100644 index 5e972c850..000000000 --- a/Pods/Bolts/README.md +++ /dev/null @@ -1,683 +0,0 @@ -Bolts -============ -[![Build Status](https://img.shields.io/travis/BoltsFramework/Bolts-ObjC/master.svg?style=flat)](https://travis-ci.org/BoltsFramework/Bolts-ObjC) -[![Coverage Status](https://codecov.io/github/BoltsFramework/Bolts-ObjC/coverage.svg?branch=master)](https://codecov.io/github/BoltsFramework/Bolts-ObjC?branch=master) -[![Pod Platform](https://img.shields.io/cocoapods/p/Bolts.svg?style=flat)](https://cocoapods.org/pods/Bolts) -[![Pod License](https://img.shields.io/cocoapods/l/Bolts.svg?style=flat)](https://github.com/BoltsFramework/Bolts-ObjC/blob/master/LICENSE) -[![Reference Status](https://www.versioneye.com/objective-c/bolts/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/bolts/references) - -[![Pod Version](https://img.shields.io/cocoapods/v/Bolts.svg?style=flat)](https://cocoapods.org/pods/Bolts) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) - -Bolts is a collection of low-level libraries designed to make developing mobile -apps easier. Bolts was designed by Parse and Facebook for our own internal use, -and we have decided to open source these libraries to make them available to -others. Using these libraries does not require using any Parse services. Nor -do they require having a Parse or Facebook developer account. - -Bolts includes: - -* "Tasks", which make organization of complex asynchronous code more manageable. A task is kind of like a JavaScript Promise, but available for iOS and Android. -* An implementation of the [App Links protocol](http://applinks.org/), helping you link to content in other apps and handle incoming deep-links. - -For more information, see the [Bolts iOS API Reference](http://boltsframework.github.io/docs/ios/). - -# Tasks - -To build a truly responsive iOS application, you must keep long-running operations off of the UI thread, and be careful to avoid blocking anything the UI thread might be waiting on. This means you will need to execute various operations in the background. To make this easier, we've added a class called `BFTask`. A task represents the result of an asynchronous operation. Typically, a `BFTask` is returned from an asynchronous function and gives the ability to continue processing the result of the task. When a task is returned from a function, it's already begun doing its job. A task is not tied to a particular threading model: it represents the work being done, not where it is executing. Tasks have many advantages over other methods of asynchronous programming, such as callbacks. `BFTask` is not a replacement for `NSOperation` or GCD. In fact, they play well together. But tasks do fill in some gaps that those technologies don't address. -* `BFTask` takes care of managing dependencies for you. Unlike using `NSOperation` for dependency management, you don't have to declare all dependencies before starting a `BFTask`. For example, imagine you need to save a set of objects and each one may or may not require saving child objects. With an `NSOperation`, you would normally have to create operations for each of the child saves ahead of time. But you don't always know before you start the work whether that's going to be necessary. That can make managing dependencies with `NSOperation` very painful. Even in the best case, you have to create your dependencies before the operations that depend on them, which results in code that appears in a different order than it executes. With `BFTask`, you can decide during your operation's work whether there will be subtasks and return the other task in just those cases. -* `BFTasks` release their dependencies. `NSOperation` strongly retains its dependencies, so if you have a queue of ordered operations and sequence them using dependencies, you have a leak, because every operation gets retained forever. `BFTasks` release their callbacks as soon as they are run, so everything cleans up after itself. This can reduce memory use, and simplify memory management. -* `BFTasks` keep track of the state of finished tasks: It tracks whether there was a returned value, the task was cancelled, or if an error occurred. It also has convenience methods for propagating errors. With `NSOperation`, you have to build all of this stuff yourself. -* `BFTasks` don't depend on any particular threading model. So it's easy to have some tasks perform their work with an operation queue, while others perform work using blocks with GCD. These tasks can depend on each other seamlessly. -* Performing several tasks in a row will not create nested "pyramid" code as you would get when using only callbacks. -* `BFTasks` are fully composable, allowing you to perform branching, parallelism, and complex error handling, without the spaghetti code of having many named callbacks. -* You can arrange task-based code in the order that it executes, rather than having to split your logic across scattered callback functions. - -For the examples in this doc, assume there are async versions of some common Parse methods, called `saveAsync:` and `findAsync:` which return a `Task`. In a later section, we'll show how to define these functions yourself. - -## The `continueWithBlock` Method - -Every `BFTask` has a method named `continueWithBlock:` which takes a continuation block. A continuation is a block that will be executed when the task is complete. You can then inspect the task to check if it was successful and to get its result. - -```objective-c -// Objective-C -[[self saveAsync:obj] continueWithBlock:^id(BFTask *task) { - if (task.isCancelled) { - // the save was cancelled. - } else if (task.error) { - // the save failed. - } else { - // the object was saved successfully. - PFObject *object = task.result; - } - return nil; -}]; -``` - -```swift -// Swift -self.saveAsync(obj).continueWithBlock { - (task: BFTask!) -> BFTask in - if task.isCancelled() { - // the save was cancelled. - } else if task.error != nil { - // the save failed. - } else { - // the object was saved successfully. - var object = task.result() as PFObject - } -} -``` - -BFTasks use Objective-C blocks, so the syntax should be pretty straightforward. Let's look closer at the types involved with an example. - -```objective-c -// Objective-C -/** - * Gets an NSString asynchronously. - */ -- (BFTask *)getStringAsync { - // Let's suppose getNumberAsync returns a BFTask whose result is an NSNumber. - return [[self getNumberAsync] continueWithBlock:^id(BFTask *task) { - // This continuation block takes the NSNumber BFTask as input, - // and provides an NSString as output. - - NSNumber *number = task.result; - return [NSString stringWithFormat:@"%@", number]; - )]; -} -``` - -```swift -// Swift -/** - * Gets an NSString asynchronously. - */ -func getStringAsync() -> BFTask { - //Let's suppose getNumberAsync returns a BFTask whose result is an NSNumber. - return self.getNumberAsync().continueWithBlock { - (task: BFTask!) -> NSString in - // This continuation block takes the NSNumber BFTask as input, - // and provides an NSString as output. - - let number = task.result() as NSNumber - return NSString(format:"%@", number) - } -} -``` - -In many cases, you only want to do more work if the previous task was successful, and propagate any errors or cancellations to be dealt with later. To do this, use the `continueWithSuccessBlock:` method instead of `continueWithBlock:`. - -```objective-c -// Objective-C -[[self saveAsync:obj] continueWithSuccessBlock:^id(BFTask *task) { - // the object was saved successfully. - return nil; -}]; -``` - -```swift -// Swift -self.saveAsync(obj).continueWithSuccessBlock { - (task: BFTask!) -> AnyObject! in - // the object was saved successfully. - return nil -} -``` - -## Chaining Tasks Together - -BFTasks are a little bit magical, in that they let you chain them without nesting. If you return a BFTask from `continueWithBlock:`, then the task returned by `continueWithBlock:` will not be considered finished until the new task returned from the new continuation block. This lets you perform multiple actions without incurring the pyramid code you would get with callbacks. Likewise, you can return a `BFTask` from `continueWithSuccessBlock:`. So, return a `BFTask` to do more asynchronous work. - -```objective-c -// Objective-C -PFQuery *query = [PFQuery queryWithClassName:@"Student"]; -[query orderByDescending:@"gpa"]; -[[[[[self findAsync:query] continueWithSuccessBlock:^id(BFTask *task) { - NSArray *students = task.result; - PFObject *valedictorian = [students objectAtIndex:0]; - [valedictorian setObject:@YES forKey:@"valedictorian"]; - return [self saveAsync:valedictorian]; -}] continueWithSuccessBlock:^id(BFTask *task) { - PFObject *valedictorian = task.result; - return [self findAsync:query]; -}] continueWithSuccessBlock:^id(BFTask *task) { - NSArray *students = task.result; - PFObject *salutatorian = [students objectAtIndex:1]; - [salutatorian setObject:@YES forKey:@"salutatorian"]; - return [self saveAsync:salutatorian]; -}] continueWithSuccessBlock:^id(BFTask *task) { - // Everything is done! - return nil; -}]; -``` - -```swift -// Swift -var query = PFQuery(className:"Student") -query.orderByDescending("gpa") -findAsync(query).continueWithSuccessBlock { - (task: BFTask!) -> BFTask in - let students = task.result() as NSArray - var valedictorian = students.objectAtIndex(0) as PFObject - valedictorian["valedictorian"] = true - return self.saveAsync(valedictorian) -}.continueWithSuccessBlock { - (task: BFTask!) -> BFTask in - var valedictorian = task.result() as PFObject - return self.findAsync(query) -}.continueWithSuccessBlock { - (task: BFTask!) -> BFTask in - let students = task.result() as NSArray - var salutatorian = students.objectAtIndex(1) as PFObject - salutatorian["salutatorian"] = true - return self.saveAsync(salutatorian) -}.continueWithSuccessBlock { - (task: BFTask!) -> AnyObject! in - // Everything is done! - return nil -} -``` - -## Error Handling - -By carefully choosing whether to call `continueWithBlock:` or `continueWithSuccessBlock:`, you can control how errors are propagated in your application. Using `continueWithBlock:` lets you handle errors by transforming them or dealing with them. You can think of failed tasks kind of like throwing an exception. In fact, if you throw an exception inside a continuation, the resulting task will be faulted with that exception. - -```objective-c -// Objective-C -PFQuery *query = [PFQuery queryWithClassName:@"Student"]; -[query orderByDescending:@"gpa"]; -[[[[[self findAsync:query] continueWithSuccessBlock:^id(BFTask *task) { - NSArray *students = task.result; - PFObject *valedictorian = [students objectAtIndex:0]; - [valedictorian setObject:@YES forKey:@"valedictorian"]; - // Force this callback to fail. - return [BFTask taskWithError:[NSError errorWithDomain:@"example.com" - code:-1 - userInfo:nil]]; -}] continueWithSuccessBlock:^id(BFTask *task) { - // Now this continuation will be skipped. - PFQuery *valedictorian = task.result; - return [self findAsync:query]; -}] continueWithBlock:^id(BFTask *task) { - if (task.error) { - // This error handler WILL be called. - // The error will be the NSError returned above. - // Let's handle the error by returning a new value. - // The task will be completed with nil as its value. - return nil; - } - // This will also be skipped. - NSArray *students = task.result; - PFObject *salutatorian = [students objectAtIndex:1]; - [salutatorian setObject:@YES forKey:@"salutatorian"]; - return [self saveAsync:salutatorian]; -}] continueWithSuccessBlock:^id(BFTask *task) { - // Everything is done! This gets called. - // The task's result is nil. - return nil; -}]; -``` - -```swift -// Swift -var query = PFQuery(className:"Student") -query.orderByDescending("gpa") -findAsync(query).continueWithSuccessBlock { - (task: BFTask!) -> BFTask in - let students = task.result() as NSArray - var valedictorian = students.objectAtIndex(0) as PFObject - valedictorian["valedictorian"] = true - //Force this callback to fail. - return BFTask(error:NSError(domain:"example.com", - code:-1, userInfo: nil)) -}.continueWithSuccessBlock { - (task: BFTask!) -> AnyObject! in - //Now this continuation will be skipped. - var valedictorian = task.result() as PFObject - return self.findAsync(query) -}.continueWithBlock { - (task: BFTask!) -> AnyObject! in - if task.error != nil { - // This error handler WILL be called. - // The error will be the NSError returned above. - // Let's handle the error by returning a new value. - // The task will be completed with nil as its value. - return nil - } - // This will also be skipped. - let students = task.result() as NSArray - var salutatorian = students.objectAtIndex(1) as PFObject - salutatorian["salutatorian"] = true - return self.saveAsync(salutatorian) -}.continueWithSuccessBlock { - (task: BFTask!) -> AnyObject! in - // Everything is done! This gets called. - // The tasks result is nil. - return nil -} -``` - -It's often convenient to have a long chain of success callbacks with only one error handler at the end. - -## Creating Tasks - -When you're getting started, you can just use the tasks returned from methods like `findAsync:` or `saveAsync:`. However, for more advanced scenarios, you may want to make your own tasks. To do that, you create a `BFTaskCompletionSource`. This object will let you create a new `BFTask`, and control whether it gets marked as finished or cancelled. After you create a `BFTaskCompletionSource`, you'll need to call `setResult:`, `setError:`, or `cancel` to trigger its continuations. - -```objective-c -// Objective-C -- (BFTask *)successAsync { - BFTaskCompletionSource *successful = [BFTaskCompletionSource taskCompletionSource]; - [successful setResult:@"The good result."]; - return successful.task; -} - -- (BFTask *)failAsync { - BFTaskCompletionSource *failed = [BFTaskCompletionSource taskCompletionSource]; - [failed setError:[NSError errorWithDomain:@"example.com" code:-1 userInfo:nil]]; - return failed.task; -} -``` - -```swift -// Swift -func successAsync() -> BFTask { - var successful = BFTaskCompletionSource() - successful.setResult("The good result.") - return successful.task -} - -func failAsync() -> BFTask { - var failed = BFTaskCompletionSource() - failed.setError(NSError(domain:"example.com", code:-1, userInfo:nil)) - return failed.task -} -``` - -If you know the result of a task at the time it is created, there are some convenience methods you can use. - -```objective-c -// Objective-C -BFTask *successful = [BFTask taskWithResult:@"The good result."]; - -BFTask *failed = [BFTask taskWithError:anError]; -``` - -```swift -// Swift -let successful = BFTask(result:"The good result") - -let failed = BFTask(error:anError) -``` - -## Creating Async Methods - -With these tools, it's easy to make your own asynchronous functions that return tasks. For example, you can make a task-based version of `fetchAsync:` easily. - -```objective-c -// Objective-C -- (BFTask *) fetchAsync:(PFObject *)object { - BFTaskCompletionSource *task = [BFTaskCompletionSource taskCompletionSource]; - [object fetchInBackgroundWithBlock:^(PFObject *object, NSError *error) { - if (!error) { - [task setResult:object]; - } else { - [task setError:error]; - } - }]; - return task.task; -} -``` - -```swift -// Swift -func fetchAsync(object: PFObject) -> BFTask { - var task = BFTaskCompletionSource() - object.fetchInBackgroundWithBlock { - (object: PFObject?, error: NSError?) -> Void in - if error == nil { - task.setResult(object) - } else { - task.setError(error) - } - } - return task.task -} - -``` - -It's similarly easy to create `saveAsync:`, `findAsync:` or `deleteAsync:`. - -## Tasks in Series - -`BFTasks` are convenient when you want to do a series of tasks in a row, each one waiting for the previous to finish. For example, imagine you want to delete all of the comments on your blog. - -```objective-c -// Objective-C -PFQuery *query = [PFQuery queryWithClassName:@"Comments"]; -[query whereKey:@"post" equalTo:@123]; - -[[[self findAsync:query] continueWithBlock:^id(BFTask *task) { - NSArray *results = task.result; - - // Create a trivial completed task as a base case. - BFTask *task = [BFTask taskWithResult:nil]; - for (PFObject *result in results) { - // For each item, extend the task with a function to delete the item. - task = [task continueWithBlock:^id(BFTask *task) { - // Return a task that will be marked as completed when the delete is finished. - return [self deleteAsync:result]; - }]; - } - return task; -}] continueWithBlock:^id(BFTask *task) { - // Every comment was deleted. - return nil; -}]; -``` - -```swift -// Swift -var query = PFQuery(className:"Comments") -query.whereKey("post", equalTo:123) -findAsync(query).continueWithBlock { - (task: BFTask!) -> BFTask in - let results = task.result() as NSArray - - // Create a trivial completed task as a base case. - let task = BFTask(result:nil) - for result : PFObject in results { - // For each item, extend the task with a function to delete the item. - task = task.continueWithBlock { - (task: BFTask!) -> BFTask in - return self.deleteAsync(result) - } - } - return task -}.continueWithBlock { - (task: BFTask!) -> AnyObject! in - // Every comment was deleted. - return nil -} -``` - -## Tasks in Parallel - -You can also perform several tasks in parallel, using the `taskForCompletionOfAllTasks:` method. You can start multiple operations at once, and use `taskForCompletionOfAllTasks:` to create a new task that will be marked as completed when all of its input tasks are completed. The new task will be successful only if all of the passed-in tasks succeed. Performing operations in parallel will be faster than doing them serially, but may consume more system resources and bandwidth. - -```objective-c -// Objective-C -PFQuery *query = [PFQuery queryWithClassName:@"Comments"]; -[query whereKey:@"post" equalTo:@123]; - -[[[self findAsync:query] continueWithBlock:^id(BFTask *results) { - // Collect one task for each delete into an array. - NSMutableArray *tasks = [NSMutableArray array]; - for (PFObject *result in results) { - // Start this delete immediately and add its task to the list. - [tasks addObject:[self deleteAsync:result]]; - } - // Return a new task that will be marked as completed when all of the deletes are - // finished. - return [BFTask taskForCompletionOfAllTasks:tasks]; -}] continueWithBlock:^id(BFTask *task) { - // Every comment was deleted. - return nil; -}]; -``` - -```swift -// Swift -var query = PFQuery(className:"Comments") -query.whereKey("post", equalTo:123) - -findAsync(query).continueWithBlock { - (task: BFTask!) -> BFTask in - // Collect one task for each delete into an array. - var tasks = NSMutableArray.array() - var results = task.result() as NSArray - for result : PFObject! in results { - // Start this delete immediately and add its task to the list. - tasks.addObject(self.deleteAsync(result)) - } - // Return a new task that will be marked as completed when all of the deletes - // are finished. - return BFTask(forCompletionOfAllTasks:tasks) -}.continueWithBlock { - (task: BFTask!) -> AnyObject! in - // Every comment was deleted. - return nil -} -``` - -## Task Executors - -Both `continueWithBlock:` and `continueWithSuccessBlock:` methods have another form that takes an instance of `BFExecutor`. These are `continueWithExecutor:withBlock:` and `continueWithExecutor:withSuccessBlock:`. These methods allow you to control how the continuation is executed. The default executor will dispatch to GCD, but you can provide your own executor to schedule work onto a different thread. For example, if you want to continue with work on the UI thread: - -```objective-c -// Create a BFExecutor that uses the main thread. -BFExecutor *myExecutor = [BFExecutor executorWithBlock:^void(void(^block)()) { - dispatch_async(dispatch_get_main_queue(), block); -}]; - -// And use the Main Thread Executor like this. The executor applies only to the new -// continuation being passed into continueWithBlock. -[[self fetchAsync:object] continueWithExecutor:myExecutor withBlock:^id(BFTask *task) { - myTextView.text = [object objectForKey:@"name"]; -}]; -``` - -For common cases, such as dispatching on the main thread, we have provided default implementations of `BFExecutor`. These include `defaultExecutor`, `immediateExecutor`, `mainThreadExecutor`, `executorWithDispatchQueue:`, and `executorWithOperationQueue:`. For example: - -```objective-c -// Continue on the Main Thread, using a built-in executor. -[[self fetchAsync:object] continueWithExecutor:[BFExecutor mainThreadExecutor] withBlock:^id(BFTask *task) { - myTextView.text = [object objectForKey:@"name"]; -}]; -``` - -## Task Cancellation - -It's generally bad design to keep track of the `BFTaskCompletionSource` for cancellation. A better model is to create a "cancellation token" at the top level, and pass that to each async function that you want to be part of the same "cancelable operation". Then, in your continuation blocks, you can check whether the cancellation token has been cancelled and bail out early by returning a `[BFTask cancelledTask]`. For example: - -```objective-c -- (void)doSomethingComplicatedAsync:(MYCancellationToken *)cancellationToken { - [[self doSomethingAsync:cancellationToken] continueWithBlock:^{ - if (cancellationToken.isCancelled) { - return [BFTask cancelledTask]; - } - // Do something that takes a while. - return result; - }]; -} - -// Somewhere else. -MYCancellationToken *cancellationToken = [[MYCancellationToken alloc] init]; -[obj doSomethingComplicatedAsync:cancellationToken]; - -// When you get bored... -[cancellationToken cancel]; -``` - -**Note:** The cancellation token implementation should be thread-safe. -We are likely to add some concept like this to Bolts at some point in the future. - -# App Links - -[App Links](http://applinks.org/) provide a cross-platform mechanism that allows a developer to define and publish a deep-linking scheme for their content, allowing other apps to link directly to an experience optimized for the device they are running on. Whether you are building an app that receives incoming links or one that may link out to other apps' content, Bolts provides tools to simplify implementation of the [App Links protocol](http://applinks.org/documentation). - -## Handling an App Link - -The most common case will be making your app receive App Links. In-linking will allow your users to quickly access the richest, most native-feeling presentation of linked content on their devices. Bolts makes it easy to handle an inbound App Link (as well as general inbound deep-links) by providing utilities for processing an incoming URL. - -For example, you can use the `BFURL` utility class to parse an incoming URL in your `AppDelegate`: - -```objective-c -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation { - BFURL *parsedUrl = [BFURL URLWithInboundURL:url sourceApplication:sourceApplication]; - - // Use the target URL from the App Link to locate content. - if ([parsedUrl.targetURL.pathComponents[1] isEqualToString:@"profiles"]) { - // Open a profile viewer. - } - - // You can also check the query string easily. - NSString *query = parsedUrl.targetQueryParameters[@"query"]; - - // Apps that have existing deep-linking support and map their App Links to existing - // deep-linking functionality may instead want to perform these operations on the input URL. - // Use the target URL from the App Link to locate content. - if ([parsedUrl.inputURL.pathComponents[1] isEqualToString:@"profiles"]) { - // Open a profile viewer. - } - - // You can also check the query string easily. - NSString *query = parsedUrl.inputQueryParameters[@"query"]; - - // Apps can easily check the Extras and App Link data from the App Link as well. - NSString *fbAccessToken = parsedUrl.appLinkExtras[@"fb_access_token"]; - NSDictionary *refererData = parsedUrl.appLinkExtras[@"referer"]; -} -``` - -## Navigating to a URL - -Following an App Link allows your app to provide the best user experience (as defined by the receiving app) when a user navigates to a link. Bolts makes this process simple, automating the steps required to follow a link: - -1. Resolve the App Link by getting the App Link metadata from the HTML at the URL specified. -2. Step through App Link targets relevant to the device being used, checking whether the app that can handle the target is present on the device. -3. If an app is present, build a URL with the appropriate al_applink_data specified and navigate to that URL. -4. Otherwise, open the browser with the original URL specified. - -In the simplest case, it takes just one line of code to navigate to a URL that may have an App Link: - -```objective-c -[BFAppLinkNavigation navigateToURLInBackground:url]; -``` - -### Adding App and Navigation Data - -Under most circumstances, the data that will need to be passed along to an app during a navigation will be contained in the URL itself, so that whether or not the app is actually installed on the device, users are taken to the correct content. Occasionally, however, apps will want to pass along data that is relevant for app-to-app navigation, or will want to augment the App Link protocol with information that might be used by the app to adjust how the app should behave (e.g. showing a link back to the referring app). - -If you want to take advantage of these features, you can break apart the navigation process. First, you must have an App Link to which you wish to navigate: - -```objective-c -[[BFAppLinkNavigation resolveAppLinkInBackground:url] continueWithSuccessBlock:^id(BFTask *task) { - BFAppLink *link = task.result; -}]; -``` - -Then, you can build an App Link request with any additional data you would like and navigate: - -```objective-c -BFAppLinkNavigation *navigation = [BFAppLinkNavigation navigationWithAppLink:link - extras:@{ @"access_token": @"t0kEn" } - appLinkData:@{ @"ref": @"12345" }]; -NSError *error = nil; -[navigation navigate:&error]; -``` - -### Resolving App Link Metadata - -Bolts allows for custom App Link resolution, which may be used as a performance optimization (e.g. caching the metadata) or as a mechanism to allow developers to use a centralized index for obtaining App Link metadata. A custom App Link resolver just needs to be able to take a URL and return a `BFAppLink` containing the ordered list of `BFAppLinkTarget`s that are applicable for this device. Bolts provides one of these out of the box that performs this resolution on the device using a hidden UIWebView. - -You can use any resolver that implements the `BFAppLinkResolving` protocol by using one of the overloads on `BFAppLinkNavigation`: - -```objective-c -[BFAppLinkNavigation navigateToURLInBackground:url - resolver:resolver]; -``` - -Alternatively, a you can swap out the default resolver to be used by the built-in APIs: - -```objective-c -[BFAppLinkNavigation setDefaultResolver:resolver]; -[BFAppLinkNavigation navigateToURLInBackground:url]; -``` - -## App Link Return-to-Referer View - -When an application is opened via an App Link, a banner allowing the user to "Touch to return to " should be displayed. The `BFAppLinkReturnToRefererView` provides this functionality. It will take an incoming App Link and parse the referer information to display the appropriate calling app name. - -```objective-c -- (void)viewDidLoad { - [super viewDidLoad]; - - // Perform other view initialization. - - self.returnToRefererController = [[BFAppLinkReturnToRefererController alloc] init]; - - // self.returnToRefererView is a BFAppLinkReturnToRefererView. - // You may initialize the view either by loading it from a NIB or programmatically. - self.returnToRefererController.view = self.returnToRefererView; - - // If you have a UINavigationController in the view, then the bar must be shown above it. - [self.returnToRefererController] -} -``` - -The following code assumes that the view controller has an `openedAppLinkURL` `NSURL` property that has already been populated with the URL used to open the app. You can then do something like this to show the view: - -```objective-c -- (void)viewWillAppear { - [super viewWillAppear]; - - // Show only if you have a back AppLink. - [self.returnToRefererController showViewForRefererURL:self.openedAppLinkURL]; -} -``` - -In a navigation-controller view hierarchy, the banner should be displayed above the navigation bar, and `BFAppLinkReturnToRefererController` provides an `initForDisplayAboveNavController` method to assist with this. - -## Analytics - -Bolts introduces Measurement Event. App Links posts three different Measurement Event notifications to the application, which can be caught and integrated with existing analytics components in your application. - -* `al_nav_out` — Raised when your app switches out to an App Links URL. -* `al_nav_in` — Raised when your app opens an incoming App Links URL. -* `al_ref_back_out` — Raised when your app returns back the referrer app using the built-in top navigation back bar view. - -### Listen for App Links Measurement Events - -There are other analytics tools that are integrated with Bolts' App Links events, but you can also listen for these events yourself: - -```objective-c -[[NSNotificationCenter defaultCenter] addObserverForName:BFMeasurementEventNotificationName object:nil queue:nil usingBlock:^(NSNotification *note) { - NSDictionary *event = note.userInfo; - NSDictionary *eventData = event[BFMeasurementEventArgsKey]; - // Integrate to your logging/analytics component. -}]; -``` - -### App Links Event Fields - -App Links Measurement Events sends additional information from App Links Intents in flattened string key value pairs. Here are some of the useful fields for the three events. - -* `al_nav_in` - * `inputURL`: the URL that opens the app. - * `inputURLScheme`: the scheme of `inputURL`. - * `refererURL`: the URL that the referrer app added into `al_applink_data`: `referer_app_link`. - * `refererAppName`: the app name that the referrer app added to `al_applink_data`: `referer_app_link`. - * `sourceApplication`: the bundle of referrer application. - * `targetURL`: the `target_url` field in `al_applink_data`. - * `version`: App Links API version. - -* `al_nav_out` / `al_ref_back_out` - * `outputURL`: the URL used to open the other app (or browser). If there is an eligible app to open, this will be the custom scheme url/intent in `al_applink_data`. - * `outputURLScheme`: the scheme of `outputURL`. - * `sourceURL`: the URL of the page hosting App Links meta tags. - * `sourceURLHost`: the hostname of `sourceURL`. - * `success`: `“1”` to indicate success in opening the App Link in another app or browser; `“0”` to indicate failure to open the App Link. - * `type`: `“app”` for open in app, `“web”` for open in browser; `“fail”` when the success field is `“0”`. - * `version`: App Links API version. - -# Installation - -You can download the latest framework files from our [Releases page](https://github.com/BoltsFramework/Bolts-ObjC/releases). - -Bolts is also available through [CocoaPods](https://cocoapods.org/). To install it simply add the following line to your Podfile: - - pod 'Bolts' diff --git a/Pods/Crashlytics/Crashlytics.framework/README b/Pods/Crashlytics/Crashlytics.framework/README deleted file mode 100644 index 3ebf76719..000000000 --- a/Pods/Crashlytics/Crashlytics.framework/README +++ /dev/null @@ -1 +0,0 @@ -We've now combined all our supported platforms into a single podspec. As a result, we moved our submit script to a new location for Cocoapods projects: ${PODS_ROOT}/Crashlytics/submit. To avoid breaking functionality that references the old location of the submit, we've placed this dummy script that calls to the correct location, while providing a helpful warning if it is invoked. This bridge for backwards compatibility will be removed in a future release, so please heed the warning! diff --git a/Pods/Crashlytics/Crashlytics.framework/submit b/Pods/Crashlytics/Crashlytics.framework/submit deleted file mode 100755 index b7de4e377..000000000 --- a/Pods/Crashlytics/Crashlytics.framework/submit +++ /dev/null @@ -1,6 +0,0 @@ -if [[ -z $PODS_ROOT ]]; then -echo "error: The submit binary delivered by cocoapods is in a new location, under '$"{"PODS_ROOT"}"/Crashlytics/submit'. This script was put in place for backwards compatibility, but it relies on PODS_ROOT, which does not have a value in your current setup. Please update the path to the submit binary to fix this issue." -else -echo "warning: The submit script is now located at '$"{"PODS_ROOT"}"/Crashlytics/submit'. To remove this warning, update your path to point to this new location." -sh "${PODS_ROOT}/Crashlytics/submit" "$@" -fi diff --git a/Pods/Crashlytics/README.md b/Pods/Crashlytics/README.md deleted file mode 100644 index 2715a06b7..000000000 --- a/Pods/Crashlytics/README.md +++ /dev/null @@ -1,39 +0,0 @@ -![Crashlytics Header](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-crashlytics-header.png) - -Part of [Google Fabric](https://get.fabric.io), [Crashlytics](http://try.crashlytics.com/) offers the most powerful, yet lightest weight crash reporting solution for iOS. Crashlytics also provides real-time analytics through [Answers](https://answers.io/) and app distributions to testers using [Beta](http://try.crashlytics.com/beta/). - -## Setup - -1. Visit [https://fabric.io/sign_up](https://fabric.io/sign_up) to create your Fabric account and to download Fabric.app. - -1. Open Fabric.app, login and select the Crashlytics SDK. - - ![Fabric Plugin](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-fabric-plugin.png) - -1. The Fabric app automatically detects when a project uses CocoaPods and gives you the option to install via the Podfile or Xcode. - - ![Fabric Installation Options](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-pod-installation-option.png) - -1. Select the Podfile option and follow the installation instructions to update your Podfile. **Note:** the Crashlytics Pod includes Answers. If you have Answers included as a separate Pod it should be removed from your Podfile to avoid duplicate symbol errors. - - ``` - pod 'Fabric' - pod 'Crashlytics' - ``` - -1. Run `pod install` - -1. Add a Run Script Build Phase and build your app. - - ![Fabric Run Script Build Phase](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-rsbp.png) - -1. Initialize the SDK by inserting code outlined in the Fabric.app. - -1. Run your app to finish the installation. - -## Resources - -* [Documentation](https://docs.fabric.io/apple/crashlytics/overview.html) -* [Forums](https://stackoverflow.com/questions/tagged/google-fabric) -* [Website](http://try.crashlytics.com/) -* Follow us on Twitter: [@fabric](https://twitter.com/fabric) and [@crashlytics](https://twitter.com/crashlytics) diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics b/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics deleted file mode 100755 index 352144e12..000000000 Binary files a/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics and /dev/null differ diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/ANSCompatibility.h b/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/ANSCompatibility.h deleted file mode 100644 index 6ec011d93..000000000 --- a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/ANSCompatibility.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// ANSCompatibility.h -// AnswersKit -// -// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. -// - -#pragma once - -#if !__has_feature(nullability) -#define nonnull -#define nullable -#define _Nullable -#define _Nonnull -#endif - -#ifndef NS_ASSUME_NONNULL_BEGIN -#define NS_ASSUME_NONNULL_BEGIN -#endif - -#ifndef NS_ASSUME_NONNULL_END -#define NS_ASSUME_NONNULL_END -#endif - -#if __has_feature(objc_generics) -#define ANS_GENERIC_NSARRAY(type) NSArray -#define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary -#else -#define ANS_GENERIC_NSARRAY(type) NSArray -#define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary -#endif diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/Answers.h b/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/Answers.h deleted file mode 100644 index 8deacbee5..000000000 --- a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/Answers.h +++ /dev/null @@ -1,210 +0,0 @@ -// -// Answers.h -// Crashlytics -// -// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. -// - -#import -#import "ANSCompatibility.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * This class exposes the Answers Events API, allowing you to track key - * user user actions and metrics in your app. - */ -@interface Answers : NSObject - -/** - * Log a Sign Up event to see users signing up for your app in real-time, understand how - * many users are signing up with different methods and their success rate signing up. - * - * @param signUpMethodOrNil The method by which a user logged in, e.g. Twitter or Digits. - * @param signUpSucceededOrNil The ultimate success or failure of the login - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. - */ -+ (void)logSignUpWithMethod:(nullable NSString *)signUpMethodOrNil - success:(nullable NSNumber *)signUpSucceededOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log an Log In event to see users logging into your app in real-time, understand how many - * users are logging in with different methods and their success rate logging into your app. - * - * @param loginMethodOrNil The method by which a user logged in, e.g. email, Twitter or Digits. - * @param loginSucceededOrNil The ultimate success or failure of the login - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. - */ -+ (void)logLoginWithMethod:(nullable NSString *)loginMethodOrNil - success:(nullable NSNumber *)loginSucceededOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log a Share event to see users sharing from your app in real-time, letting you - * understand what content they're sharing from the type or genre down to the specific id. - * - * @param shareMethodOrNil The method by which a user shared, e.g. email, Twitter, SMS. - * @param contentNameOrNil The human readable name for this piece of content. - * @param contentTypeOrNil The type of content shared. - * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item. - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. - */ -+ (void)logShareWithMethod:(nullable NSString *)shareMethodOrNil - contentName:(nullable NSString *)contentNameOrNil - contentType:(nullable NSString *)contentTypeOrNil - contentId:(nullable NSString *)contentIdOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log an Invite Event to track how users are inviting other users into - * your application. - * - * @param inviteMethodOrNil The method of invitation, e.g. GameCenter, Twitter, email. - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. - */ -+ (void)logInviteWithMethod:(nullable NSString *)inviteMethodOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log a Purchase event to see your revenue in real-time, understand how many users are making purchases, see which - * items are most popular, and track plenty of other important purchase-related metrics. - * - * @param itemPriceOrNil The purchased item's price. - * @param currencyOrNil The ISO4217 currency code. Example: USD - * @param purchaseSucceededOrNil Was the purchase successful or unsuccessful - * @param itemNameOrNil The human-readable form of the item's name. Example: - * @param itemTypeOrNil The type, or genre of the item. Example: Song - * @param itemIdOrNil The machine-readable, unique item identifier Example: SKU - * @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase. - */ -+ (void)logPurchaseWithPrice:(nullable NSDecimalNumber *)itemPriceOrNil - currency:(nullable NSString *)currencyOrNil - success:(nullable NSNumber *)purchaseSucceededOrNil - itemName:(nullable NSString *)itemNameOrNil - itemType:(nullable NSString *)itemTypeOrNil - itemId:(nullable NSString *)itemIdOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log a Level Start Event to track where users are in your game. - * - * @param levelNameOrNil The level name - * @param customAttributesOrNil A dictionary of custom attributes to associate with this level start event. - */ -+ (void)logLevelStart:(nullable NSString *)levelNameOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log a Level End event to track how users are completing levels in your game. - * - * @param levelNameOrNil The name of the level completed, E.G. "1" or "Training" - * @param scoreOrNil The score the user completed the level with. - * @param levelCompletedSuccesfullyOrNil A boolean representing whether or not the level was completed successfully. - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. - */ -+ (void)logLevelEnd:(nullable NSString *)levelNameOrNil - score:(nullable NSNumber *)scoreOrNil - success:(nullable NSNumber *)levelCompletedSuccesfullyOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log an Add to Cart event to see users adding items to a shopping cart in real-time, understand how - * many users start the purchase flow, see which items are most popular, and track plenty of other important - * purchase-related metrics. - * - * @param itemPriceOrNil The purchased item's price. - * @param currencyOrNil The ISO4217 currency code. Example: USD - * @param itemNameOrNil The human-readable form of the item's name. Example: - * @param itemTypeOrNil The type, or genre of the item. Example: Song - * @param itemIdOrNil The machine-readable, unique item identifier Example: SKU - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. - */ -+ (void)logAddToCartWithPrice:(nullable NSDecimalNumber *)itemPriceOrNil - currency:(nullable NSString *)currencyOrNil - itemName:(nullable NSString *)itemNameOrNil - itemType:(nullable NSString *)itemTypeOrNil - itemId:(nullable NSString *)itemIdOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log a Start Checkout event to see users moving through the purchase funnel in real-time, understand how many - * users are doing this and how much they're spending per checkout, and see how it related to other important - * purchase-related metrics. - * - * @param totalPriceOrNil The total price of the cart. - * @param currencyOrNil The ISO4217 currency code. Example: USD - * @param itemCountOrNil The number of items in the cart. - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. - */ -+ (void)logStartCheckoutWithPrice:(nullable NSDecimalNumber *)totalPriceOrNil - currency:(nullable NSString *)currencyOrNil - itemCount:(nullable NSNumber *)itemCountOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log a Rating event to see users rating content within your app in real-time and understand what - * content is most engaging, from the type or genre down to the specific id. - * - * @param ratingOrNil The integer rating given by the user. - * @param contentNameOrNil The human readable name for this piece of content. - * @param contentTypeOrNil The type of content shared. - * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item. - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. - */ -+ (void)logRating:(nullable NSNumber *)ratingOrNil - contentName:(nullable NSString *)contentNameOrNil - contentType:(nullable NSString *)contentTypeOrNil - contentId:(nullable NSString *)contentIdOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log a Content View event to see users viewing content within your app in real-time and - * understand what content is most engaging, from the type or genre down to the specific id. - * - * @param contentNameOrNil The human readable name for this piece of content. - * @param contentTypeOrNil The type of content shared. - * @param contentIdOrNil The unique identifier for this piece of content. Useful for finding the top shared item. - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. - */ -+ (void)logContentViewWithName:(nullable NSString *)contentNameOrNil - contentType:(nullable NSString *)contentTypeOrNil - contentId:(nullable NSString *)contentIdOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log a Search event allows you to see users searching within your app in real-time and understand - * exactly what they're searching for. - * - * @param queryOrNil The user's query. - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. - */ -+ (void)logSearchWithQuery:(nullable NSString *)queryOrNil - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -/** - * Log a Custom Event to see user actions that are uniquely important for your app in real-time, to see how often - * they're performing these actions with breakdowns by different categories you add. Use a human-readable name for - * the name of the event, since this is how the event will appear in Answers. - * - * @param eventName The human-readable name for the event. - * @param customAttributesOrNil A dictionary of custom attributes to associate with this event. Attribute keys - * must be NSString and values must be NSNumber or NSString. - * @discussion How we treat NSNumbers: - * We will provide information about the distribution of values over time. - * - * How we treat NSStrings: - * NSStrings are used as categorical data, allowing comparison across different category values. - * Strings are limited to a maximum length of 100 characters, attributes over this length will be - * truncated. - * - * When tracking the Tweet views to better understand user engagement, sending the tweet's length - * and the type of media present in the tweet allows you to track how tweet length and the type of media influence - * engagement. - */ -+ (void)logCustomEventWithName:(NSString *)eventName - customAttributes:(nullable ANS_GENERIC_NSDICTIONARY(NSString *, id) *)customAttributesOrNil; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSAttributes.h b/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSAttributes.h deleted file mode 100644 index 1526b0dca..000000000 --- a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSAttributes.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// CLSAttributes.h -// Crashlytics -// -// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. -// - -#pragma once - -#define CLS_DEPRECATED(x) __attribute__ ((deprecated(x))) - -#if !__has_feature(nullability) - #define nonnull - #define nullable - #define _Nullable - #define _Nonnull -#endif - -#ifndef NS_ASSUME_NONNULL_BEGIN - #define NS_ASSUME_NONNULL_BEGIN -#endif - -#ifndef NS_ASSUME_NONNULL_END - #define NS_ASSUME_NONNULL_END -#endif - -#if __has_feature(objc_generics) - #define CLS_GENERIC_NSARRAY(type) NSArray - #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary -#else - #define CLS_GENERIC_NSARRAY(type) NSArray - #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary -#endif diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSLogging.h b/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSLogging.h deleted file mode 100644 index 59590d546..000000000 --- a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSLogging.h +++ /dev/null @@ -1,64 +0,0 @@ -// -// CLSLogging.h -// Crashlytics -// -// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. -// -#ifdef __OBJC__ -#import "CLSAttributes.h" -#import - -NS_ASSUME_NONNULL_BEGIN -#endif - - - -/** - * - * The CLS_LOG macro provides as easy way to gather more information in your log messages that are - * sent with your crash data. CLS_LOG prepends your custom log message with the function name and - * line number where the macro was used. If your app was built with the DEBUG preprocessor macro - * defined CLS_LOG uses the CLSNSLog function which forwards your log message to NSLog and CLSLog. - * If the DEBUG preprocessor macro is not defined CLS_LOG uses CLSLog only. - * - * Example output: - * -[AppDelegate login:] line 134 $ login start - * - * If you would like to change this macro, create a new header file, unset our define and then define - * your own version. Make sure this new header file is imported after the Crashlytics header file. - * - * #undef CLS_LOG - * #define CLS_LOG(__FORMAT__, ...) CLSNSLog... - * - **/ -#ifdef __OBJC__ -#ifdef DEBUG -#define CLS_LOG(__FORMAT__, ...) CLSNSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) -#else -#define CLS_LOG(__FORMAT__, ...) CLSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) -#endif -#endif - -/** - * - * Add logging that will be sent with your crash data. This logging will not show up in the system.log - * and will only be visible in your Crashlytics dashboard. - * - **/ - -#ifdef __OBJC__ -OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); -OBJC_EXTERN void CLSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0); - -/** - * - * Add logging that will be sent with your crash data. This logging will show up in the system.log - * and your Crashlytics dashboard. It is not recommended for Release builds. - * - **/ -OBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); -OBJC_EXTERN void CLSNSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0); - - -NS_ASSUME_NONNULL_END -#endif diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSReport.h b/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSReport.h deleted file mode 100644 index a8ff3b0b9..000000000 --- a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSReport.h +++ /dev/null @@ -1,103 +0,0 @@ -// -// CLSReport.h -// Crashlytics -// -// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. -// - -#import -#import "CLSAttributes.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * The CLSCrashReport protocol is deprecated. See the CLSReport class and the CrashyticsDelegate changes for details. - **/ -@protocol CLSCrashReport - -@property (nonatomic, copy, readonly) NSString *identifier; -@property (nonatomic, copy, readonly) NSDictionary *customKeys; -@property (nonatomic, copy, readonly) NSString *bundleVersion; -@property (nonatomic, copy, readonly) NSString *bundleShortVersionString; -@property (nonatomic, readonly, nullable) NSDate *crashedOnDate; -@property (nonatomic, copy, readonly) NSString *OSVersion; -@property (nonatomic, copy, readonly) NSString *OSBuildVersion; - -@end - -/** - * The CLSReport exposes an interface to the phsyical report that Crashlytics has created. You can - * use this class to get information about the event, and can also set some values after the - * event has occurred. - **/ -@interface CLSReport : NSObject - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -/** - * Returns the session identifier for the report. - **/ -@property (nonatomic, copy, readonly) NSString *identifier; - -/** - * Returns the custom key value data for the report. - **/ -@property (nonatomic, copy, readonly) NSDictionary *customKeys; - -/** - * Returns the CFBundleVersion of the application that generated the report. - **/ -@property (nonatomic, copy, readonly) NSString *bundleVersion; - -/** - * Returns the CFBundleShortVersionString of the application that generated the report. - **/ -@property (nonatomic, copy, readonly) NSString *bundleShortVersionString; - -/** - * Returns the date that the report was created. - **/ -@property (nonatomic, copy, readonly) NSDate *dateCreated; - -/** - * Returns the os version that the application crashed on. - **/ -@property (nonatomic, copy, readonly) NSString *OSVersion; - -/** - * Returns the os build version that the application crashed on. - **/ -@property (nonatomic, copy, readonly) NSString *OSBuildVersion; - -/** - * Returns YES if the report contains any crash information, otherwise returns NO. - **/ -@property (nonatomic, assign, readonly) BOOL isCrash; - -/** - * You can use this method to set, after the event, additional custom keys. The rules - * and semantics for this method are the same as those documented in Crashlytics.h. Be aware - * that the maximum size and count of custom keys is still enforced, and you can overwrite keys - * and/or cause excess keys to be deleted by using this method. - **/ -- (void)setObjectValue:(nullable id)value forKey:(NSString *)key; - -/** - * Record an application-specific user identifier. See Crashlytics.h for details. - **/ -@property (nonatomic, copy, nullable) NSString * userIdentifier; - -/** - * Record a user name. See Crashlytics.h for details. - **/ -@property (nonatomic, copy, nullable) NSString * userName; - -/** - * Record a user email. See Crashlytics.h for details. - **/ -@property (nonatomic, copy, nullable) NSString * userEmail; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSStackFrame.h b/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSStackFrame.h deleted file mode 100644 index cdb5596cc..000000000 --- a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/CLSStackFrame.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// CLSStackFrame.h -// Crashlytics -// -// Copyright 2015 Crashlytics, Inc. All rights reserved. -// - -#import -#import "CLSAttributes.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * - * This class is used in conjunction with -[Crashlytics recordCustomExceptionName:reason:frameArray:] to - * record information about non-ObjC/C++ exceptions. All information included here will be displayed - * in the Crashlytics UI, and can influence crash grouping. Be particularly careful with the use of the - * address property. If set, Crashlytics will attempt symbolication and could overwrite other properities - * in the process. - * - **/ -@interface CLSStackFrame : NSObject - -+ (instancetype)stackFrame; -+ (instancetype)stackFrameWithAddress:(NSUInteger)address; -+ (instancetype)stackFrameWithSymbol:(NSString *)symbol; - -@property (nonatomic, copy, nullable) NSString *symbol; -@property (nonatomic, copy, nullable) NSString *rawSymbol; -@property (nonatomic, copy, nullable) NSString *library; -@property (nonatomic, copy, nullable) NSString *fileName; -@property (nonatomic, assign) uint32_t lineNumber; -@property (nonatomic, assign) uint64_t offset; -@property (nonatomic, assign) uint64_t address; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/Crashlytics.h b/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/Crashlytics.h deleted file mode 100644 index 7104ca812..000000000 --- a/Pods/Crashlytics/iOS/Crashlytics.framework/Headers/Crashlytics.h +++ /dev/null @@ -1,288 +0,0 @@ -// -// Crashlytics.h -// Crashlytics -// -// Copyright (c) 2015 Crashlytics, Inc. All rights reserved. -// - -#import - -#import "CLSAttributes.h" -#import "CLSLogging.h" -#import "CLSReport.h" -#import "CLSStackFrame.h" -#import "Answers.h" - -NS_ASSUME_NONNULL_BEGIN - -@protocol CrashlyticsDelegate; - -/** - * Crashlytics. Handles configuration and initialization of Crashlytics. - * - * Note: The Crashlytics class cannot be subclassed. If this is causing you pain for - * testing, we suggest using either a wrapper class or a protocol extension. - */ -@interface Crashlytics : NSObject - -@property (nonatomic, readonly, copy) NSString *APIKey; -@property (nonatomic, readonly, copy) NSString *version; -@property (nonatomic, assign) BOOL debugMode; - -/** - * - * The delegate can be used to influence decisions on reporting and behavior, as well as reacting - * to previous crashes. - * - * Make certain that the delegate is setup before starting Crashlytics with startWithAPIKey:... or - * via +[Fabric with:...]. Failure to do will result in missing any delegate callbacks that occur - * synchronously during start. - * - **/ -@property (nonatomic, assign, nullable) id delegate; - -/** - * The recommended way to install Crashlytics into your application is to place a call to +startWithAPIKey: - * in your -application:didFinishLaunchingWithOptions: or -applicationDidFinishLaunching: - * method. - * - * Note: Starting with 3.0, the submission process has been significantly improved. The delay parameter - * is no longer required to throttle submissions on launch, performance will be great without it. - * - * @param apiKey The Crashlytics API Key for this app - * - * @return The singleton Crashlytics instance - */ -+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey; -+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey afterDelay:(NSTimeInterval)delay CLS_DEPRECATED("Crashlytics no longer needs or uses the delay parameter. Please use +startWithAPIKey: instead."); - -/** - * If you need the functionality provided by the CrashlyticsDelegate protocol, you can use - * these convenience methods to activate the framework and set the delegate in one call. - * - * @param apiKey The Crashlytics API Key for this app - * @param delegate A delegate object which conforms to CrashlyticsDelegate. - * - * @return The singleton Crashlytics instance - */ -+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(nullable id)delegate; -+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(nullable id)delegate afterDelay:(NSTimeInterval)delay CLS_DEPRECATED("Crashlytics no longer needs or uses the delay parameter. Please use +startWithAPIKey:delegate: instead."); - -/** - * Access the singleton Crashlytics instance. - * - * @return The singleton Crashlytics instance - */ -+ (Crashlytics *)sharedInstance; - -/** - * The easiest way to cause a crash - great for testing! - */ -- (void)crash; - -/** - * The easiest way to cause a crash with an exception - great for testing. - */ -- (void)throwException; - -/** - * Specify a user identifier which will be visible in the Crashlytics UI. - * - * Many of our customers have requested the ability to tie crashes to specific end-users of their - * application in order to facilitate responses to support requests or permit the ability to reach - * out for more information. We allow you to specify up to three separate values for display within - * the Crashlytics UI - but please be mindful of your end-user's privacy. - * - * We recommend specifying a user identifier - an arbitrary string that ties an end-user to a record - * in your system. This could be a database id, hash, or other value that is meaningless to a - * third-party observer but can be indexed and queried by you. - * - * Optionally, you may also specify the end-user's name or username, as well as email address if you - * do not have a system that works well with obscured identifiers. - * - * Pursuant to our EULA, this data is transferred securely throughout our system and we will not - * disseminate end-user data unless required to by law. That said, if you choose to provide end-user - * contact information, we strongly recommend that you disclose this in your application's privacy - * policy. Data privacy is of our utmost concern. - * - * @param identifier An arbitrary user identifier string which ties an end-user to a record in your system. - */ -- (void)setUserIdentifier:(nullable NSString *)identifier; - -/** - * Specify a user name which will be visible in the Crashlytics UI. - * Please be mindful of your end-user's privacy and see if setUserIdentifier: can fulfil your needs. - * @see setUserIdentifier: - * - * @param name An end user's name. - */ -- (void)setUserName:(nullable NSString *)name; - -/** - * Specify a user email which will be visible in the Crashlytics UI. - * Please be mindful of your end-user's privacy and see if setUserIdentifier: can fulfil your needs. - * - * @see setUserIdentifier: - * - * @param email An end user's email address. - */ -- (void)setUserEmail:(nullable NSString *)email; - -+ (void)setUserIdentifier:(nullable NSString *)identifier CLS_DEPRECATED("Please access this method via +sharedInstance"); -+ (void)setUserName:(nullable NSString *)name CLS_DEPRECATED("Please access this method via +sharedInstance"); -+ (void)setUserEmail:(nullable NSString *)email CLS_DEPRECATED("Please access this method via +sharedInstance"); - -/** - * Set a value for a for a key to be associated with your crash data which will be visible in the Crashlytics UI. - * When setting an object value, the object is converted to a string. This is typically done by calling - * -[NSObject description]. - * - * @param value The object to be associated with the key - * @param key The key with which to associate the value - */ -- (void)setObjectValue:(nullable id)value forKey:(NSString *)key; - -/** - * Set an int value for a key to be associated with your crash data which will be visible in the Crashlytics UI. - * - * @param value The integer value to be set - * @param key The key with which to associate the value - */ -- (void)setIntValue:(int)value forKey:(NSString *)key; - -/** - * Set an BOOL value for a key to be associated with your crash data which will be visible in the Crashlytics UI. - * - * @param value The BOOL value to be set - * @param key The key with which to associate the value - */ -- (void)setBoolValue:(BOOL)value forKey:(NSString *)key; - -/** - * Set an float value for a key to be associated with your crash data which will be visible in the Crashlytics UI. - * - * @param value The float value to be set - * @param key The key with which to associate the value - */ -- (void)setFloatValue:(float)value forKey:(NSString *)key; - -+ (void)setObjectValue:(nullable id)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); -+ (void)setIntValue:(int)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); -+ (void)setBoolValue:(BOOL)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); -+ (void)setFloatValue:(float)value forKey:(NSString *)key CLS_DEPRECATED("Please access this method via +sharedInstance"); - -/** - * This method can be used to record a single exception structure in a report. This is particularly useful - * when your code interacts with non-native languages like Lua, C#, or Javascript. This call can be - * expensive and should only be used shortly before process termination. This API is not intended be to used - * to log NSException objects. All safely-reportable NSExceptions are automatically captured by - * Crashlytics. - * - * @param name The name of the custom exception - * @param reason The reason this exception occurred - * @param frameArray An array of CLSStackFrame objects - */ -- (void)recordCustomExceptionName:(NSString *)name reason:(nullable NSString *)reason frameArray:(CLS_GENERIC_NSARRAY(CLSStackFrame *) *)frameArray; - -/** - * - * This allows you to record a non-fatal event, described by an NSError object. These events will be grouped and - * displayed similarly to crashes. Keep in mind that this method can be expensive. Also, the total number of - * NSErrors that can be recorded during your app's life-cycle is limited by a fixed-size circular buffer. If the - * buffer is overrun, the oldest data is dropped. Errors are relayed to Crashlytics on a subsequent launch - * of your application. - * - * You can also use the -recordError:withAdditionalUserInfo: to include additional context not represented - * by the NSError instance itself. - * - **/ -- (void)recordError:(NSError *)error; -- (void)recordError:(NSError *)error withAdditionalUserInfo:(nullable CLS_GENERIC_NSDICTIONARY(NSString *, id) *)userInfo; - -- (void)logEvent:(NSString *)eventName CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); -- (void)logEvent:(NSString *)eventName attributes:(nullable NSDictionary *) attributes CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); -+ (void)logEvent:(NSString *)eventName CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); -+ (void)logEvent:(NSString *)eventName attributes:(nullable NSDictionary *) attributes CLS_DEPRECATED("Please refer to Answers +logCustomEventWithName:"); - -@end - -/** - * - * The CrashlyticsDelegate protocol provides a mechanism for your application to take - * action on events that occur in the Crashlytics crash reporting system. You can make - * use of these calls by assigning an object to the Crashlytics' delegate property directly, - * or through the convenience +startWithAPIKey:delegate: method. - * - */ -@protocol CrashlyticsDelegate -@optional - - -- (void)crashlyticsDidDetectCrashDuringPreviousExecution:(Crashlytics *)crashlytics CLS_DEPRECATED("Please refer to -crashlyticsDidDetectReportForLastExecution:"); -- (void)crashlytics:(Crashlytics *)crashlytics didDetectCrashDuringPreviousExecution:(id )crash CLS_DEPRECATED("Please refer to -crashlyticsDidDetectReportForLastExecution:"); - -/** - * - * Called when a Crashlytics instance has determined that the last execution of the - * application resulted in a saved report. This is called synchronously on Crashlytics - * initialization. Your delegate must invoke the completionHandler, but does not need to do so - * synchronously, or even on the main thread. Invoking completionHandler with NO will cause the - * detected report to be deleted and not submitted to Crashlytics. This is useful for - * implementing permission prompts, or other more-complex forms of logic around submitting crashes. - * - * Instead of using this method, you should try to make use of -crashlyticsDidDetectReportForLastExecution: - * if you can. - * - * @warning Failure to invoke the completionHandler will prevent submissions from being reported. Watch out. - * - * @warning Just implementing this delegate method will disable all forms of synchronous report submission. This can - * impact the reliability of reporting crashes very early in application launch. - * - * @param report The CLSReport object representing the last detected report - * @param completionHandler The completion handler to call when your logic has completed. - * - */ -- (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL submit))completionHandler; - -/** - * - * Called when a Crashlytics instance has determined that the last execution of the - * application resulted in a saved report. This method differs from - * -crashlyticsDidDetectReportForLastExecution:completionHandler: in three important ways: - * - * - it is not called synchronously during initialization - * - it does not give you the ability to prevent the report from being submitted - * - the report object itself is immutable - * - * Thanks to these limitations, making use of this method does not impact reporting - * reliabilty in any way. - * - * @param report The read-only CLSReport object representing the last detected report - * - */ - -- (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report; - -/** - * If your app is running on an OS that supports it (OS X 10.9+, iOS 7.0+), Crashlytics will submit - * most reports using out-of-process background networking operations. This results in a significant - * improvement in reliability of reporting, as well as power and performance wins for your users. - * If you don't want this functionality, you can disable by returning NO from this method. - * - * @warning Background submission is not supported for extensions on iOS or OS X. - * - * @param crashlytics The Crashlytics singleton instance - * - * @return Return NO if you don't want out-of-process background network operations. - * - */ -- (BOOL)crashlyticsCanUseBackgroundSessions:(Crashlytics *)crashlytics; - -@end - -/** - * `CrashlyticsKit` can be used as a parameter to `[Fabric with:@[CrashlyticsKit]];` in Objective-C. In Swift, use Crashlytics.sharedInstance() - */ -#define CrashlyticsKit [Crashlytics sharedInstance] - -NS_ASSUME_NONNULL_END diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Info.plist b/Pods/Crashlytics/iOS/Crashlytics.framework/Info.plist deleted file mode 100644 index 3c2580356..000000000 Binary files a/Pods/Crashlytics/iOS/Crashlytics.framework/Info.plist and /dev/null differ diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/Modules/module.modulemap b/Pods/Crashlytics/iOS/Crashlytics.framework/Modules/module.modulemap deleted file mode 100644 index da0845e39..000000000 --- a/Pods/Crashlytics/iOS/Crashlytics.framework/Modules/module.modulemap +++ /dev/null @@ -1,14 +0,0 @@ -framework module Crashlytics { - header "Crashlytics.h" - header "Answers.h" - header "ANSCompatibility.h" - header "CLSLogging.h" - header "CLSReport.h" - header "CLSStackFrame.h" - header "CLSAttributes.h" - - export * - - link "z" - link "c++" -} diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/run b/Pods/Crashlytics/iOS/Crashlytics.framework/run deleted file mode 100755 index 9058ea62c..000000000 --- a/Pods/Crashlytics/iOS/Crashlytics.framework/run +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -# run -# -# Copyright (c) 2015 Crashlytics. All rights reserved. - -# Figure out where we're being called from -DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) - -# Quote path in case of spaces or special chars -DIR="\"${DIR}" - -PATH_SEP="/" -VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" -UPLOAD_COMMAND="uploadDSYM\" $@ run-script" - -# Ensure params are as expected, run in sync mode to validate -eval $DIR$PATH_SEP$VALIDATE_COMMAND -return_code=$? - -if [[ $return_code != 0 ]]; then - exit $return_code -fi - -# Verification passed, upload dSYM in background to prevent Xcode from waiting -# Note: Validation is performed again before upload. -# Output can still be found in Console.app -eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/submit b/Pods/Crashlytics/iOS/Crashlytics.framework/submit deleted file mode 100755 index 0b07556b7..000000000 Binary files a/Pods/Crashlytics/iOS/Crashlytics.framework/submit and /dev/null differ diff --git a/Pods/Crashlytics/iOS/Crashlytics.framework/uploadDSYM b/Pods/Crashlytics/iOS/Crashlytics.framework/uploadDSYM deleted file mode 100755 index 8286a0d8b..000000000 Binary files a/Pods/Crashlytics/iOS/Crashlytics.framework/uploadDSYM and /dev/null differ diff --git a/Pods/Crashlytics/submit b/Pods/Crashlytics/submit deleted file mode 100755 index 0b07556b7..000000000 Binary files a/Pods/Crashlytics/submit and /dev/null differ diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h deleted file mode 100644 index ef54b1516..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import - -/** - Notification indicating that the `currentAccessToken` has changed. - - the userInfo dictionary of the notification will contain keys - `FBSDKAccessTokenChangeOldKey` and - `FBSDKAccessTokenChangeNewKey`. - */ -FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeNotification; - -/** - A key in the notification's userInfo that will be set - if and only if the user ID changed between the old and new tokens. - - Token refreshes can occur automatically with the SDK - which do not change the user. If you're only interested in user - changes (such as logging out), you should check for the existence - of this key. The value is a NSNumber with a boolValue. - - On a fresh start of the app where the SDK reads in the cached value - of an access token, this key will also exist since the access token - is moving from a null state (no user) to a non-null state (user). - */ -FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeUserID; - -/* - key in notification's userInfo object for getting the old token. - - If there was no old token, the key will not be present. - */ -FBSDK_EXTERN NSString *const FBSDKAccessTokenChangeOldKey; - -/* - key in notification's userInfo object for getting the new token. - - If there is no new token, the key will not be present. - */ -FBSDK_EXTERN NSString *const FBSDKAccessTokenChangeNewKey; - - -/** - Represents an immutable access token for using Facebook services. - */ -@interface FBSDKAccessToken : NSObject - -/** - Returns the app ID. - */ -@property (readonly, copy, nonatomic) NSString *appID; - -/** - Returns the known declined permissions. - */ -@property (readonly, copy, nonatomic) NSSet *declinedPermissions; - -/** - Returns the expiration date. - */ -@property (readonly, copy, nonatomic) NSDate *expirationDate; - -/** - Returns the known granted permissions. - */ -@property (readonly, copy, nonatomic) NSSet *permissions; - -/** - Returns the date the token was last refreshed. -*/ -@property (readonly, copy, nonatomic) NSDate *refreshDate; - -/** - Returns the opaque token string. - */ -@property (readonly, copy, nonatomic) NSString *tokenString; - -/** - Returns the user ID. - */ -@property (readonly, copy, nonatomic) NSString *userID; - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -/** - Initializes a new instance. - - Parameter tokenString: the opaque token string. - - Parameter permissions: the granted permissions. Note this is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - - Parameter declinedPermissions: the declined permissions. Note this is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - - Parameter appID: the app ID. - - Parameter userID: the user ID. - - Parameter expirationDate: the optional expiration date (defaults to distantFuture). - - Parameter refreshDate: the optional date the token was last refreshed (defaults to today). - - This initializer should only be used for advanced apps that - manage tokens explicitly. Typical login flows only need to use `FBSDKLoginManager` - along with `+currentAccessToken`. - */ -- (instancetype)initWithTokenString:(NSString *)tokenString - permissions:(NSArray *)permissions - declinedPermissions:(NSArray *)declinedPermissions - appID:(NSString *)appID - userID:(NSString *)userID - expirationDate:(NSDate *)expirationDate - refreshDate:(NSDate *)refreshDate -NS_DESIGNATED_INITIALIZER; - -/** - Convenience getter to determine if a permission has been granted - - Parameter permission: The permission to check. - */ -- (BOOL)hasGranted:(NSString *)permission; - -/** - Compares the receiver to another FBSDKAccessToken - - Parameter token: The other token - - Returns: YES if the receiver's values are equal to the other token's values; otherwise NO - */ -- (BOOL)isEqualToAccessToken:(FBSDKAccessToken *)token; - -/** - Returns the "global" access token that represents the currently logged in user. - - The `currentAccessToken` is a convenient representation of the token of the - current user and is used by other SDK components (like `FBSDKLoginManager`). - */ -+ (FBSDKAccessToken *)currentAccessToken; - -/** - Sets the "global" access token that represents the currently logged in user. - - Parameter token: The access token to set. - - This will broadcast a notification and save the token to the app keychain. - */ -+ (void)setCurrentAccessToken:(FBSDKAccessToken *)token; - -/** - Refresh the current access token's permission state and extend the token's expiration date, - if possible. - - Parameter completionHandler: an optional callback handler that can surface any errors related to permission refreshing. - - On a successful refresh, the currentAccessToken will be updated so you typically only need to - observe the `FBSDKAccessTokenDidChangeNotification` notification. - - If a token is already expired, it cannot be refreshed. - */ -+ (void)refreshCurrentAccessToken:(FBSDKGraphRequestHandler)completionHandler; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.m deleted file mode 100644 index be6911fed..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.m +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAccessToken.h" - -#import "FBSDKGraphRequestPiggybackManager.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKMath.h" -#import "FBSDKSettings+Internal.h" - -NSString *const FBSDKAccessTokenDidChangeNotification = @"com.facebook.sdk.FBSDKAccessTokenData.FBSDKAccessTokenDidChangeNotification"; -NSString *const FBSDKAccessTokenDidChangeUserID = @"FBSDKAccessTokenDidChangeUserID"; -NSString *const FBSDKAccessTokenChangeNewKey = @"FBSDKAccessToken"; -NSString *const FBSDKAccessTokenChangeOldKey = @"FBSDKAccessTokenOld"; - -static FBSDKAccessToken *g_currentAccessToken; - -#define FBSDK_ACCESSTOKEN_TOKENSTRING_KEY @"tokenString" -#define FBSDK_ACCESSTOKEN_PERMISSIONS_KEY @"permissions" -#define FBSDK_ACCESSTOKEN_DECLINEDPERMISSIONS_KEY @"declinedPermissions" -#define FBSDK_ACCESSTOKEN_APPID_KEY @"appID" -#define FBSDK_ACCESSTOKEN_USERID_KEY @"userID" -#define FBSDK_ACCESSTOKEN_REFRESHDATE_KEY @"refreshDate" -#define FBSDK_ACCESSTOKEN_EXPIRATIONDATE_KEY @"expirationDate" - -@implementation FBSDKAccessToken - -- (instancetype)init NS_UNAVAILABLE -{ - assert(0); -} - -- (instancetype)initWithTokenString:(NSString *)tokenString - permissions:(NSArray *)permissions - declinedPermissions:(NSArray *)declinedPermissions - appID:(NSString *)appID - userID:(NSString *)userID - expirationDate:(NSDate *)expirationDate - refreshDate:(NSDate *)refreshDate -{ - if ((self = [super init])) { - _tokenString = [tokenString copy]; - _permissions = [NSSet setWithArray:permissions]; - _declinedPermissions = [NSSet setWithArray:declinedPermissions]; - _appID = [appID copy]; - _userID = [userID copy]; - _expirationDate = [expirationDate copy] ?: [NSDate distantFuture]; - _refreshDate = [refreshDate copy] ?: [NSDate date]; - } - return self; -} - -- (BOOL)hasGranted:(NSString *)permission -{ - return [self.permissions containsObject:permission]; -} - -+ (FBSDKAccessToken *)currentAccessToken -{ - return g_currentAccessToken; -} - -+ (void)setCurrentAccessToken:(FBSDKAccessToken *)token -{ - if (token != g_currentAccessToken) { - NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; - [FBSDKInternalUtility dictionary:userInfo setObject:token forKey:FBSDKAccessTokenChangeNewKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:g_currentAccessToken forKey:FBSDKAccessTokenChangeOldKey]; - if (![g_currentAccessToken.userID isEqualToString:token.userID]) { - userInfo[FBSDKAccessTokenDidChangeUserID] = @YES; - } - - g_currentAccessToken = token; - - // Only need to keep current session in web view for the case when token is current - // When token is abandoned cookies must to be cleaned up immediately - if (token == nil) { - [FBSDKInternalUtility deleteFacebookCookies]; - } - - [[FBSDKSettings accessTokenCache] cacheAccessToken:token]; - [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKAccessTokenDidChangeNotification - object:[self class] - userInfo:userInfo]; - } -} - -+ (void)refreshCurrentAccessToken:(FBSDKGraphRequestHandler)completionHandler -{ - if ([FBSDKAccessToken currentAccessToken]) { - FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; - [FBSDKGraphRequestPiggybackManager addRefreshPiggyback:connection permissionHandler:completionHandler]; - [connection start]; - } else { - if (completionHandler) { - completionHandler(nil, nil, [FBSDKError errorWithCode:FBSDKAccessTokenRequiredErrorCode message:@"No current access token to refresh"]); - } - } -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [self.tokenString hash], - [self.permissions hash], - [self.declinedPermissions hash], - [self.appID hash], - [self.userID hash], - [self.refreshDate hash], - [self.expirationDate hash] - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKAccessToken class]]) { - return NO; - } - return [self isEqualToAccessToken:(FBSDKAccessToken *)object]; -} - -- (BOOL)isEqualToAccessToken:(FBSDKAccessToken *)token -{ - return (token && - [FBSDKInternalUtility object:self.tokenString isEqualToObject:token.tokenString] && - [FBSDKInternalUtility object:self.permissions isEqualToObject:token.permissions] && - [FBSDKInternalUtility object:self.declinedPermissions isEqualToObject:token.declinedPermissions] && - [FBSDKInternalUtility object:self.appID isEqualToObject:token.appID] && - [FBSDKInternalUtility object:self.userID isEqualToObject:token.userID] && - [FBSDKInternalUtility object:self.refreshDate isEqualToObject:token.refreshDate] && - [FBSDKInternalUtility object:self.expirationDate isEqualToObject:token.expirationDate] ); -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - // we're immutable. - return self; -} - -#pragma mark NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - NSString *appID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ACCESSTOKEN_APPID_KEY]; - NSSet *declinedPermissions = [decoder decodeObjectOfClass:[NSSet class] forKey:FBSDK_ACCESSTOKEN_DECLINEDPERMISSIONS_KEY]; - NSSet *permissions = [decoder decodeObjectOfClass:[NSSet class] forKey:FBSDK_ACCESSTOKEN_PERMISSIONS_KEY]; - NSString *tokenString = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ACCESSTOKEN_TOKENSTRING_KEY]; - NSString *userID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ACCESSTOKEN_USERID_KEY]; - NSDate *refreshDate = [decoder decodeObjectOfClass:[NSDate class] forKey:FBSDK_ACCESSTOKEN_REFRESHDATE_KEY]; - NSDate *expirationDate = [decoder decodeObjectOfClass:[NSDate class] forKey:FBSDK_ACCESSTOKEN_EXPIRATIONDATE_KEY]; - - return [self initWithTokenString:tokenString - permissions:[permissions allObjects] - declinedPermissions:[declinedPermissions allObjects] - appID:appID - userID:userID - expirationDate:expirationDate - refreshDate:refreshDate]; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:self.appID forKey:FBSDK_ACCESSTOKEN_APPID_KEY]; - [encoder encodeObject:self.declinedPermissions forKey:FBSDK_ACCESSTOKEN_DECLINEDPERMISSIONS_KEY]; - [encoder encodeObject:self.permissions forKey:FBSDK_ACCESSTOKEN_PERMISSIONS_KEY]; - [encoder encodeObject:self.tokenString forKey:FBSDK_ACCESSTOKEN_TOKENSTRING_KEY]; - [encoder encodeObject:self.userID forKey:FBSDK_ACCESSTOKEN_USERID_KEY]; - [encoder encodeObject:self.expirationDate forKey:FBSDK_ACCESSTOKEN_EXPIRATIONDATE_KEY]; - [encoder encodeObject:self.refreshDate forKey:FBSDK_ACCESSTOKEN_REFRESHDATE_KEY]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h deleted file mode 100644 index 71260ca8c..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h +++ /dev/null @@ -1,523 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKMacros.h" - -@class FBSDKAccessToken; -@class FBSDKGraphRequest; - -/** NSNotificationCenter name indicating a result of a failed log flush attempt. The posted object will be an NSError instance. */ -FBSDK_EXTERN NSString *const FBSDKAppEventsLoggingResultNotification; - -/** optional plist key ("FacebookLoggingOverrideAppID") for setting `loggingOverrideAppID` */ -FBSDK_EXTERN NSString *const FBSDKAppEventsOverrideAppIDBundleKey; - -/** - - NS_ENUM (NSUInteger, FBSDKAppEventsFlushBehavior) - - Specifies when `FBSDKAppEvents` sends log events to the server. - - */ -typedef NS_ENUM(NSUInteger, FBSDKAppEventsFlushBehavior) -{ - - /** Flush automatically: periodically (once a minute or every 100 logged events) and always at app reactivation. */ - FBSDKAppEventsFlushBehaviorAuto = 0, - - /** Only flush when the `flush` method is called. When an app is moved to background/terminated, the - events are persisted and re-established at activation, but they will only be written with an - explicit call to `flush`. */ - FBSDKAppEventsFlushBehaviorExplicitOnly, - -}; - -/** - @methodgroup Predefined event names for logging events common to many apps. Logging occurs through the `logEvent` family of methods on `FBSDKAppEvents`. - Common event parameters are provided in the `FBSDKAppEventsParameterNames*` constants. - */ - -/** Log this event when the user has achieved a level in the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameAchievedLevel; - -/** Log this event when the user has entered their payment info. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedPaymentInfo; - -/** Log this event when the user has added an item to their cart. The valueToSum passed to logEvent should be the item's price. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedToCart; - -/** Log this event when the user has added an item to their wishlist. The valueToSum passed to logEvent should be the item's price. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedToWishlist; - -/** Log this event when a user has completed registration with the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameCompletedRegistration; - -/** Log this event when the user has completed a tutorial in the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameCompletedTutorial; - -/** Log this event when the user has entered the checkout process. The valueToSum passed to logEvent should be the total price in the cart. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameInitiatedCheckout; - -/** Log this event when the user has rated an item in the app. The valueToSum passed to logEvent should be the numeric rating. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameRated; - -/** Log this event when a user has performed a search within the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameSearched; - -/** Log this event when the user has spent app credits. The valueToSum passed to logEvent should be the number of credits spent. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameSpentCredits; - -/** Log this event when the user has unlocked an achievement in the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameUnlockedAchievement; - -/** Log this event when a user has viewed a form of content in the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameViewedContent; - -/** - @methodgroup Predefined event name parameters for common additional information to accompany events logged through the `logEvent` family - of methods on `FBSDKAppEvents`. Common event names are provided in the `FBAppEventName*` constants. - */ - - /** - * Parameter key used to specify data for the one or more pieces of content being logged about. - * Data should be a JSON encoded string. - * Example: - * "[{\"id\": \"1234\", \"quantity\": 2, \"item_price\": 5.99}, {\"id\": \"5678\", \"quantity\": 1, \"item_price\": 9.99}]" - */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContent; - -/** Parameter key used to specify an ID for the specific piece of content being logged about. Could be an EAN, article identifier, etc., depending on the nature of the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContentID; - -/** Parameter key used to specify a generic content type/family for the logged event, e.g. "music", "photo", "video". Options to use will vary based upon what the app is all about. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContentType; - -/** Parameter key used to specify currency used with logged event. E.g. "USD", "EUR", "GBP". See ISO-4217 for specific values. One reference for these is . */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameCurrency; - -/** Parameter key used to specify a description appropriate to the event being logged. E.g., the name of the achievement unlocked in the `FBAppEventNameAchievementUnlocked` event. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameDescription; - -/** Parameter key used to specify the level achieved in a `FBAppEventNameAchieved` event. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameLevel; - -/** Parameter key used to specify the maximum rating available for the `FBAppEventNameRate` event. E.g., "5" or "10". */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameMaxRatingValue; - -/** Parameter key used to specify how many items are being processed for an `FBAppEventNameInitiatedCheckout` or `FBAppEventNamePurchased` event. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameNumItems; - -/** Parameter key used to specify whether payment info is available for the `FBAppEventNameInitiatedCheckout` event. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNamePaymentInfoAvailable; - -/** Parameter key used to specify method user has used to register for the app, e.g., "Facebook", "email", "Twitter", etc */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameRegistrationMethod; - -/** Parameter key used to specify the string provided by the user for a search operation. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSearchString; - -/** Parameter key used to specify whether the activity being logged about was successful or not. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSuccess; - -/* - @methodgroup Predefined values to assign to event parameters that accompany events logged through the `logEvent` family - of methods on `FBSDKAppEvents`. Common event parameters are provided in the `FBSDKAppEventParameterName*` constants. - */ - -/** Yes-valued parameter value to be used with parameter keys that need a Yes/No value */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterValueYes; - -/** No-valued parameter value to be used with parameter keys that need a Yes/No value */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterValueNo; - - -/** - - - Client-side event logging for specialized application analytics available through Facebook App Insights - and for use with Facebook Ads conversion tracking and optimization. - - - - The `FBSDKAppEvents` static class has a few related roles: - - + Logging predefined and application-defined events to Facebook App Insights with a - numeric value to sum across a large number of events, and an optional set of key/value - parameters that define "segments" for this event (e.g., 'purchaserStatus' : 'frequent', or - 'gamerLevel' : 'intermediate') - - + Logging events to later be used for ads optimization around lifetime value. - - + Methods that control the way in which events are flushed out to the Facebook servers. - - Here are some important characteristics of the logging mechanism provided by `FBSDKAppEvents`: - - + Events are not sent immediately when logged. They're cached and flushed out to the Facebook servers - in a number of situations: - - when an event count threshold is passed (currently 100 logged events). - - when a time threshold is passed (currently 15 seconds). - - when an app has gone to background and is then brought back to the foreground. - - + Events will be accumulated when the app is in a disconnected state, and sent when the connection is - restored and one of the above 'flush' conditions are met. - - + The `FBSDKAppEvents` class is thread-safe in that events may be logged from any of the app's threads. - - + The developer can set the `flushBehavior` on `FBSDKAppEvents` to force the flushing of events to only - occur on an explicit call to the `flush` method. - - + The developer can turn on console debug output for event logging and flushing to the server by using - the `FBSDKLoggingBehaviorAppEvents` value in `[FBSettings setLoggingBehavior:]`. - - Some things to note when logging events: - - + There is a limit on the number of unique event names an app can use, on the order of 1000. - + There is a limit to the number of unique parameter names in the provided parameters that can - be used per event, on the order of 25. This is not just for an individual call, but for all - invocations for that eventName. - + Event names and parameter names (the keys in the NSDictionary) must be between 2 and 40 characters, and - must consist of alphanumeric characters, _, -, or spaces. - + The length of each parameter value can be no more than on the order of 100 characters. - - */ -@interface FBSDKAppEvents : NSObject - -/* - * Basic event logging - */ - -/** - - Log an event with just an eventName. - - - Parameter eventName: The name of the event to record. Limitations on number of events and name length - are given in the `FBSDKAppEvents` documentation. - - */ -+ (void)logEvent:(NSString *)eventName; - -/** - - Log an event with an eventName and a numeric value to be aggregated with other events of this name. - - - Parameter eventName: The name of the event to record. Limitations on number of events and name length - are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. - - - Parameter valueToSum: Amount to be aggregated into all events of this eventName, and App Insights will report - the cumulative and average value of this amount. - */ -+ (void)logEvent:(NSString *)eventName - valueToSum:(double)valueToSum; - - -/** - - Log an event with an eventName and a set of key/value pairs in the parameters dictionary. - Parameter limitations are described above. - - - Parameter eventName: The name of the event to record. Limitations on number of events and name construction - are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. - - - Parameter parameters: Arbitrary parameter dictionary of characteristics. The keys to this dictionary must - be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of - parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names - are provided in `FBSDKAppEventParameterName*` constants. - */ -+ (void)logEvent:(NSString *)eventName - parameters:(NSDictionary *)parameters; - -/** - - Log an event with an eventName, a numeric value to be aggregated with other events of this name, - and a set of key/value pairs in the parameters dictionary. - - - Parameter eventName: The name of the event to record. Limitations on number of events and name construction - are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. - - - Parameter valueToSum: Amount to be aggregated into all events of this eventName, and App Insights will report - the cumulative and average value of this amount. - - - Parameter parameters: Arbitrary parameter dictionary of characteristics. The keys to this dictionary must - be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of - parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names - are provided in `FBSDKAppEventParameterName*` constants. - - */ -+ (void)logEvent:(NSString *)eventName - valueToSum:(double)valueToSum - parameters:(NSDictionary *)parameters; - - -/** - - Log an event with an eventName, a numeric value to be aggregated with other events of this name, - and a set of key/value pairs in the parameters dictionary. Providing session lets the developer - target a particular . If nil is provided, then `[FBSession activeSession]` will be used. - - - Parameter eventName: The name of the event to record. Limitations on number of events and name construction - are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. - - - Parameter valueToSum: Amount to be aggregated into all events of this eventName, and App Insights will report - the cumulative and average value of this amount. Note that this is an NSNumber, and a value of `nil` denotes - that this event doesn't have a value associated with it for summation. - - - Parameter parameters: Arbitrary parameter dictionary of characteristics. The keys to this dictionary must - be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of - parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names - are provided in `FBSDKAppEventParameterName*` constants. - - - Parameter accessToken: The optional access token to log the event as. - */ -+ (void)logEvent:(NSString *)eventName - valueToSum:(NSNumber *)valueToSum - parameters:(NSDictionary *)parameters - accessToken:(FBSDKAccessToken *)accessToken; - -/* - * Purchase logging - */ - -/** - - Log a purchase of the specified amount, in the specified currency. - - - Parameter purchaseAmount: Purchase amount to be logged, as expressed in the specified currency. This value - will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). - - - Parameter currency: Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for - specific values. One reference for these is . - - - This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set - to `FBSDKAppEventsFlushBehaviorExplicitOnly`. - - */ -+ (void)logPurchase:(double)purchaseAmount - currency:(NSString *)currency; - -/** - - Log a purchase of the specified amount, in the specified currency, also providing a set of - additional characteristics describing the purchase. - - - Parameter purchaseAmount: Purchase amount to be logged, as expressed in the specified currency.This value - will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). - - - Parameter currency: Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for - specific values. One reference for these is . - - - Parameter parameters: Arbitrary parameter dictionary of characteristics. The keys to this dictionary must - be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of - parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names - are provided in `FBSDKAppEventParameterName*` constants. - - - This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set - to `FBSDKAppEventsFlushBehaviorExplicitOnly`. - - */ -+ (void)logPurchase:(double)purchaseAmount - currency:(NSString *)currency - parameters:(NSDictionary *)parameters; - -/** - - Log a purchase of the specified amount, in the specified currency, also providing a set of - additional characteristics describing the purchase, as well as an to log to. - - - Parameter purchaseAmount: Purchase amount to be logged, as expressed in the specified currency.This value - will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). - - - Parameter currency: Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for - specific values. One reference for these is . - - - Parameter parameters: Arbitrary parameter dictionary of characteristics. The keys to this dictionary must - be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of - parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names - are provided in `FBSDKAppEventParameterName*` constants. - - - Parameter accessToken: The optional access token to log the event as. - - - This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set - to `FBSDKAppEventsFlushBehaviorExplicitOnly`. - - */ -+ (void)logPurchase:(double)purchaseAmount - currency:(NSString *)currency - parameters:(NSDictionary *)parameters - accessToken:(FBSDKAccessToken *)accessToken; - - -/* - * Push Notifications Logging - */ - -/** - Log an app event that tracks that the application was open via Push Notification. - - - Parameter payload: Notification payload received via `UIApplicationDelegate`. - */ -+ (void)logPushNotificationOpen:(NSDictionary *)payload; - -/** - Log an app event that tracks that a custom action was taken from a push notification. - - - Parameter payload: Notification payload received via `UIApplicationDelegate`. - - Parameter action: Name of the action that was taken. - */ -+ (void)logPushNotificationOpen:(NSDictionary *)payload action:(NSString *)action; - -/** - - Notifies the events system that the app has launched and, when appropriate, logs an "activated app" event. - This function is called automatically from FBSDKApplicationDelegate applicationDidBecomeActive, unless - one overrides 'FacebookAutoLogAppEventsEnabled' key to false in the project info plist file. - In case 'FacebookAutoLogAppEventsEnabled' is set to false, then it should typically be placed in the - app delegates' `applicationDidBecomeActive:` method. - - This method also takes care of logging the event indicating the first time this app has been launched, which, among other things, is used to - track user acquisition and app install ads conversions. - - - - `activateApp` will not log an event on every app launch, since launches happen every time the app is backgrounded and then foregrounded. - "activated app" events will be logged when the app has not been active for more than 60 seconds. This method also causes a "deactivated app" - event to be logged when sessions are "completed", and these events are logged with the session length, with an indication of how much - time has elapsed between sessions, and with the number of background/foreground interruptions that session had. This data - is all visible in your app's App Events Insights. - */ -+ (void)activateApp; - -/* - * Push Notifications Registration - */ - -/** - Sets and sends device token to register the current application for push notifications. - - - - Sets and sends a device token from `NSData` representation that you get from `UIApplicationDelegate.-application:didRegisterForRemoteNotificationsWithDeviceToken:`. - - - Parameter deviceToken: Device token data. - */ -+ (void)setPushNotificationsDeviceToken:(NSData *)deviceToken; - -/* - * Control over event batching/flushing - */ - -/** - - Get the current event flushing behavior specifying when events are sent back to Facebook servers. - */ -+ (FBSDKAppEventsFlushBehavior)flushBehavior; - -/** - - Set the current event flushing behavior specifying when events are sent back to Facebook servers. - - - Parameter flushBehavior: The desired `FBSDKAppEventsFlushBehavior` to be used. - */ -+ (void)setFlushBehavior:(FBSDKAppEventsFlushBehavior)flushBehavior; - -/** - Set the 'override' App ID for App Event logging. - - - - In some cases, apps want to use one Facebook App ID for login and social presence and another - for App Event logging. (An example is if multiple apps from the same company share an app ID for login, but - want distinct logging.) By default, this value is `nil`, and defers to the `FBSDKAppEventsOverrideAppIDBundleKey` - plist value. If that's not set, it defaults to `[FBSDKSettings appID]`. - - This should be set before any other calls are made to `FBSDKAppEvents`. Thus, you should set it in your application - delegate's `application:didFinishLaunchingWithOptions:` delegate. - - - Parameter appID: The Facebook App ID to be used for App Event logging. - */ -+ (void)setLoggingOverrideAppID:(NSString *)appID; - -/** - Get the 'override' App ID for App Event logging. - - -- See:setLoggingOverrideAppID: - - */ -+ (NSString *)loggingOverrideAppID; - - -/** - Explicitly kick off flushing of events to Facebook. This is an asynchronous method, but it does initiate an immediate - kick off. Server failures will be reported through the NotificationCenter with notification ID `FBSDKAppEventsLoggingResultNotification`. - */ -+ (void)flush; - -/** - Creates a request representing the Graph API call to retrieve a Custom Audience "third party ID" for the app's Facebook user. - Callers will send this ID back to their own servers, collect up a set to create a Facebook Custom Audience with, - and then use the resultant Custom Audience to target ads. - - - Parameter accessToken: The access token to use to establish the user's identity for users logged into Facebook through this app. - If `nil`, then the `[FBSDKAccessToken currentAccessToken]` is used. - - - - The JSON in the request's response will include an "custom_audience_third_party_id" key/value pair, with the value being the ID retrieved. - This ID is an encrypted encoding of the Facebook user's ID and the invoking Facebook app ID. - Multiple calls with the same user will return different IDs, thus these IDs cannot be used to correlate behavior - across devices or applications, and are only meaningful when sent back to Facebook for creating Custom Audiences. - - The ID retrieved represents the Facebook user identified in the following way: if the specified access token is valid, - the ID will represent the user associated with that token; otherwise the ID will represent the user logged into the - native Facebook app on the device. If there is no native Facebook app, no one is logged into it, or the user has opted out - at the iOS level from ad tracking, then a `nil` ID will be returned. - - This method returns `nil` if either the user has opted-out (via iOS) from Ad Tracking, the app itself has limited event usage - via the `[FBSDKSettings limitEventAndDataUsage]` flag, or a specific Facebook user cannot be identified. - */ -+ (FBSDKGraphRequest *)requestForCustomAudienceThirdPartyIDWithAccessToken:(FBSDKAccessToken *)accessToken; - -/* - Sets a custom user ID to associate with all app events. - - The userID is persisted until it is cleared by passing nil. - */ -+ (void)setUserID:(NSString *)userID; - -/* - Returns the set custom user ID. - */ -+ (NSString *)userID; - -/* - Sends a request to update the properties for the current user, set by `setUserID:` - - You must call `FBSDKAppEvents setUserID:` before making this call. - - Parameter properties: the custom user properties - - Parameter handler: the optional completion handler - */ -+ (void)updateUserProperties:(NSDictionary *)properties handler:(FBSDKGraphRequestHandler)handler; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.m deleted file mode 100644 index d35fc798c..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.m +++ /dev/null @@ -1,995 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppEvents.h" -#import "FBSDKAppEvents+Internal.h" - -#import - -#import "FBSDKAccessToken.h" -#import "FBSDKAppEventsState.h" -#import "FBSDKAppEventsStateManager.h" -#import "FBSDKAppEventsUtility.h" -#import "FBSDKConstants.h" -#import "FBSDKError.h" -#import "FBSDKGraphRequest+Internal.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKPaymentObserver.h" -#import "FBSDKServerConfiguration.h" -#import "FBSDKServerConfigurationManager.h" -#import "FBSDKSettings.h" -#import "FBSDKTimeSpentData.h" -#import "FBSDKUtility.h" - -// -// Public event names -// - -// General purpose -NSString *const FBSDKAppEventNameCompletedRegistration = @"fb_mobile_complete_registration"; -NSString *const FBSDKAppEventNameViewedContent = @"fb_mobile_content_view"; -NSString *const FBSDKAppEventNameSearched = @"fb_mobile_search"; -NSString *const FBSDKAppEventNameRated = @"fb_mobile_rate"; -NSString *const FBSDKAppEventNameCompletedTutorial = @"fb_mobile_tutorial_completion"; -NSString *const FBSDKAppEventParameterLaunchSource = @"fb_mobile_launch_source"; - -// Ecommerce related -NSString *const FBSDKAppEventNameAddedToCart = @"fb_mobile_add_to_cart"; -NSString *const FBSDKAppEventNameAddedToWishlist = @"fb_mobile_add_to_wishlist"; -NSString *const FBSDKAppEventNameInitiatedCheckout = @"fb_mobile_initiated_checkout"; -NSString *const FBSDKAppEventNameAddedPaymentInfo = @"fb_mobile_add_payment_info"; - -// Gaming related -NSString *const FBSDKAppEventNameAchievedLevel = @"fb_mobile_level_achieved"; -NSString *const FBSDKAppEventNameUnlockedAchievement = @"fb_mobile_achievement_unlocked"; -NSString *const FBSDKAppEventNameSpentCredits = @"fb_mobile_spent_credits"; - -// -// Public event parameter names -// - -NSString *const FBSDKAppEventParameterNameCurrency = @"fb_currency"; -NSString *const FBSDKAppEventParameterNameRegistrationMethod = @"fb_registration_method"; -NSString *const FBSDKAppEventParameterNameContentType = @"fb_content_type"; -NSString *const FBSDKAppEventParameterNameContent = @"fb_content"; -NSString *const FBSDKAppEventParameterNameContentID = @"fb_content_id"; -NSString *const FBSDKAppEventParameterNameSearchString = @"fb_search_string"; -NSString *const FBSDKAppEventParameterNameSuccess = @"fb_success"; -NSString *const FBSDKAppEventParameterNameMaxRatingValue = @"fb_max_rating_value"; -NSString *const FBSDKAppEventParameterNamePaymentInfoAvailable = @"fb_payment_info_available"; -NSString *const FBSDKAppEventParameterNameNumItems = @"fb_num_items"; -NSString *const FBSDKAppEventParameterNameLevel = @"fb_level"; -NSString *const FBSDKAppEventParameterNameDescription = @"fb_description"; - -// -// Public event parameter values -// - -NSString *const FBSDKAppEventParameterValueNo = @"0"; -NSString *const FBSDKAppEventParameterValueYes = @"1"; - -// -// Event names internal to this file -// -NSString *const FBSDKAppEventNamePurchased = @"fb_mobile_purchase"; - -NSString *const FBSDKAppEventNameLoginViewUsage = @"fb_login_view_usage"; -NSString *const FBSDKAppEventNameShareSheetLaunch = @"fb_share_sheet_launch"; -NSString *const FBSDKAppEventNameShareSheetDismiss = @"fb_share_sheet_dismiss"; -NSString *const FBSDKAppEventNameShareTrayDidLaunch = @"fb_share_tray_did_launch"; -NSString *const FBSDKAppEventNameShareTrayDidSelectActivity = @"fb_share_tray_did_select_activity"; -NSString *const FBSDKAppEventNamePermissionsUILaunch = @"fb_permissions_ui_launch"; -NSString *const FBSDKAppEventNamePermissionsUIDismiss = @"fb_permissions_ui_dismiss"; -NSString *const FBSDKAppEventNameFBDialogsPresentShareDialog = @"fb_dialogs_present_share"; -NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogPhoto = @"fb_dialogs_present_share_photo"; -NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogOG = @"fb_dialogs_present_share_og"; -NSString *const FBSDKAppEventNameFBDialogsPresentLikeDialogOG = @"fb_dialogs_present_like_og"; -NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialog = @"fb_dialogs_present_message"; -NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogPhoto = @"fb_dialogs_present_message_photo"; -NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogOG = @"fb_dialogs_present_message_og"; - -NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogStart = @"fb_dialogs_native_login_dialog_start"; -NSString *const FBSDKAppEventsNativeLoginDialogStartTime = @"fb_native_login_dialog_start_time"; - -NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogEnd = @"fb_dialogs_native_login_dialog_end"; -NSString *const FBSDKAppEventsNativeLoginDialogEndTime = @"fb_native_login_dialog_end_time"; - -NSString *const FBSDKAppEventNameFBDialogsWebLoginCompleted = @"fb_dialogs_web_login_dialog_complete"; -NSString *const FBSDKAppEventsWebLoginE2E = @"fb_web_login_e2e"; - -NSString *const FBSDKAppEventNameFBSessionAuthStart = @"fb_mobile_login_start"; -NSString *const FBSDKAppEventNameFBSessionAuthEnd = @"fb_mobile_login_complete"; -NSString *const FBSDKAppEventNameFBSessionAuthMethodStart = @"fb_mobile_login_method_start"; -NSString *const FBSDKAppEventNameFBSessionAuthMethodEnd = @"fb_mobile_login_method_complete"; - -NSString *const FBSDKAppEventNameFBSDKLikeButtonImpression = @"fb_like_button_impression"; -NSString *const FBSDKAppEventNameFBSDKLoginButtonImpression = @"fb_login_button_impression"; -NSString *const FBSDKAppEventNameFBSDKSendButtonImpression = @"fb_send_button_impression"; -NSString *const FBSDKAppEventNameFBSDKShareButtonImpression = @"fb_share_button_impression"; - -NSString *const FBSDKAppEventNameFBSDKSmartLoginService = @"fb_smart_login_service"; - -NSString *const FBSDKAppEventNameFBSDKLikeButtonDidTap = @"fb_like_button_did_tap"; -NSString *const FBSDKAppEventNameFBSDKLoginButtonDidTap = @"fb_login_button_did_tap"; -NSString *const FBSDKAppEventNameFBSDKSendButtonDidTap = @"fb_send_button_did_tap"; -NSString *const FBSDKAppEventNameFBSDKShareButtonDidTap = @"fb_share_button_did_tap"; - -NSString *const FBSDKAppEventNameFBSDKLikeControlDidDisable = @"fb_like_control_did_disable"; -NSString *const FBSDKAppEventNameFBSDKLikeControlDidLike = @"fb_like_control_did_like"; -NSString *const FBSDKAppEventNameFBSDKLikeControlDidPresentDialog = @"fb_like_control_did_present_dialog"; -NSString *const FBSDKAppEventNameFBSDKLikeControlDidTap = @"fb_like_control_did_tap"; -NSString *const FBSDKAppEventNameFBSDKLikeControlDidUnlike = @"fb_like_control_did_unlike"; -NSString *const FBSDKAppEventNameFBSDKLikeControlError = @"fb_like_control_error"; -NSString *const FBSDKAppEventNameFBSDKLikeControlImpression = @"fb_like_control_impression"; -NSString *const FBSDKAppEventNameFBSDKLikeControlNetworkUnavailable = @"fb_like_control_network_unavailable"; - -NSString *const FBSDLAppEventNameFBSDKEventShareDialogResult = @"fb_dialog_share_result"; -NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogResult = @"fb_messenger_dialog_share_result"; -NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogResult = @"fb_app_invite_dialog_share_result"; - -NSString *const FBSDKAppEventNameFBSDKEventShareDialogShow = @"fb_dialog_share_show"; -NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogShow = @"fb_messenger_dialog_share_show"; -NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogShow = @"fb_app_invite_share_show"; - -NSString *const FBSDKAppEventNameFBSessionFASLoginDialogResult = @"fb_mobile_login_fas_dialog_result"; - -// Event Parameters internal to this file -NSString *const FBSDKAppEventParameterDialogOutcome = @"fb_dialog_outcome"; -NSString *const FBSDKAppEventParameterDialogErrorMessage = @"fb_dialog_outcome_error_message"; -NSString *const FBSDKAppEventParameterDialogMode = @"fb_dialog_mode"; -NSString *const FBSDKAppEventParameterDialogShareContentType = @"fb_dialog_share_content_type"; -NSString *const FBSDKAppEventParameterDialogShareContentUUID = @"fb_dialog_share_content_uuid"; -NSString *const FBSDKAppEventParameterDialogShareContentPageID = @"fb_dialog_share_content_page_id"; -NSString *const FBSDKAppEventParameterShareTrayActivityName = @"fb_share_tray_activity"; -NSString *const FBSDKAppEventParameterShareTrayResult = @"fb_share_tray_result"; -NSString *const FBSDKAppEventParameterLogTime = @"_logTime"; -NSString *const FBSDKAppEventParameterEventName = @"_eventName"; -NSString *const FBSDKAppEventParameterImplicitlyLogged = @"_implicitlyLogged"; - -// Event parameter values internal to this file -NSString *const FBSDKAppEventsDialogOutcomeValue_Completed = @"Completed"; -NSString *const FBSDKAppEventsDialogOutcomeValue_Cancelled = @"Cancelled"; -NSString *const FBSDKAppEventsDialogOutcomeValue_Failed = @"Failed"; - -NSString *const FBSDKAppEventsDialogShareModeAutomatic = @"Automatic"; -NSString *const FBSDKAppEventsDialogShareModeBrowser = @"Browser"; -NSString *const FBSDKAppEventsDialogShareModeNative = @"Native"; -NSString *const FBSDKAppEventsDialogShareModeShareSheet = @"ShareSheet"; -NSString *const FBSDKAppEventsDialogShareModeWeb = @"Web"; -NSString *const FBSDKAppEventsDialogShareModeFeedBrowser = @"FeedBrowser"; -NSString *const FBSDKAppEventsDialogShareModeFeedWeb = @"FeedWeb"; -NSString *const FBSDKAppEventsDialogShareModeUnknown = @"Unknown"; - -NSString *const FBSDKAppEventsDialogShareContentTypeOpenGraph = @"OpenGraph"; -NSString *const FBSDKAppEventsDialogShareContentTypeStatus = @"Status"; -NSString *const FBSDKAppEventsDialogShareContentTypePhoto = @"Photo"; -NSString *const FBSDKAppEventsDialogShareContentTypeVideo = @"Video"; -NSString *const FBSDKAppEventsDialogShareContentTypeCamera = @"Camera"; -NSString *const FBSDKAppEventsDialogShareContentTypeMessengerGenericTemplate = @"GenericTemplate"; -NSString *const FBSDKAppEventsDialogShareContentTypeMessengerMediaTemplate = @"MediaTemplate"; -NSString *const FBSDKAppEventsDialogShareContentTypeMessengerOpenGraphMusicTemplate = @"OpenGraphMusicTemplate"; -NSString *const FBSDKAppEventsDialogShareContentTypeUnknown = @"Unknown"; - -NSString *const FBSDKAppEventsLoggingResultNotification = @"com.facebook.sdk:FBSDKAppEventsLoggingResultNotification"; - -NSString *const FBSDKAppEventsOverrideAppIDBundleKey = @"FacebookLoggingOverrideAppID"; - -// -// Push Notifications -// -// Activities Endpoint Parameter -static NSString *const FBSDKActivitesParameterPushDeviceToken = @"device_token"; -// Event Names -static NSString *const FBSDKAppEventNamePushTokenObtained = @"fb_mobile_obtain_push_token"; -static NSString *const FBSDKAppEventNamePushOpened = @"fb_mobile_push_opened"; -// Event Parameter -static NSString *const FBSDKAppEventParameterPushCampaign = @"fb_push_campaign"; -static NSString *const FBSDKAppEventParameterPushAction = @"fb_push_action"; -// Payload Keys -static NSString *const FBSDKAppEventsPushPayloadKey = @"fb_push_payload"; -static NSString *const FBSDKAppEventsPushPayloadCampaignKey = @"campaign"; - -#define NUM_LOG_EVENTS_TO_TRY_TO_FLUSH_AFTER 100 -#define FLUSH_PERIOD_IN_SECONDS 15 -#define APP_SUPPORTS_ATTRIBUTION_ID_RECHECK_PERIOD 60 * 60 * 24 -#define USER_ID_USER_DEFAULTS_KEY @"com.facebook.sdk.appevents.userid" - -static NSString *g_overrideAppID = nil; - -@interface FBSDKAppEvents () - -@property (nonatomic, readwrite) FBSDKAppEventsFlushBehavior flushBehavior; -//for testing only. -@property (nonatomic, assign) BOOL disableTimer; - -@property (nonatomic, copy) NSString *pushNotificationsDeviceTokenString; - -@end - -@implementation FBSDKAppEvents -{ - BOOL _explicitEventsLoggedYet; - NSTimer *_flushTimer; - NSTimer *_attributionIDRecheckTimer; - FBSDKServerConfiguration *_serverConfiguration; - FBSDKAppEventsState *_appEventsState; - NSString *_userID; -} - -#pragma mark - Object Lifecycle - -+ (void)initialize -{ - if (self == [FBSDKAppEvents class]) { - g_overrideAppID = [[[NSBundle mainBundle] objectForInfoDictionaryKey:FBSDKAppEventsOverrideAppIDBundleKey] copy]; - } -} - -- (FBSDKAppEvents *)init -{ - self = [super init]; - if (self) { - _flushBehavior = FBSDKAppEventsFlushBehaviorAuto; - _flushTimer = [NSTimer timerWithTimeInterval:FLUSH_PERIOD_IN_SECONDS - target:self - selector:@selector(flushTimerFired:) - userInfo:nil - repeats:YES]; - _attributionIDRecheckTimer = [NSTimer timerWithTimeInterval:APP_SUPPORTS_ATTRIBUTION_ID_RECHECK_PERIOD - target:self - selector:@selector(appSettingsFetchStateResetTimerFired:) - userInfo:nil - repeats:YES]; - [[NSRunLoop mainRunLoop] addTimer:_flushTimer forMode:NSDefaultRunLoopMode]; - [[NSRunLoop mainRunLoop] addTimer:_attributionIDRecheckTimer forMode:NSDefaultRunLoopMode]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(applicationMovingFromActiveStateOrTerminating) - name:UIApplicationWillResignActiveNotification - object:NULL]; - - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(applicationMovingFromActiveStateOrTerminating) - name:UIApplicationWillTerminateNotification - object:NULL]; - - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(applicationDidBecomeActive) - name:UIApplicationDidBecomeActiveNotification - object:NULL]; - - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - _userID = [defaults stringForKey:USER_ID_USER_DEFAULTS_KEY]; - } - - return self; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; - // technically these timers retain self so there's a cycle but - // we're a singleton anyway. - [_flushTimer invalidate]; - [_attributionIDRecheckTimer invalidate]; -} - -#pragma mark - Public Methods - -+ (void)logEvent:(NSString *)eventName -{ - [FBSDKAppEvents logEvent:eventName - parameters:nil]; -} - -+ (void)logEvent:(NSString *)eventName - valueToSum:(double)valueToSum -{ - [FBSDKAppEvents logEvent:eventName - valueToSum:valueToSum - parameters:nil]; -} - -+ (void)logEvent:(NSString *)eventName - parameters:(NSDictionary *)parameters -{ - [FBSDKAppEvents logEvent:eventName - valueToSum:nil - parameters:parameters - accessToken:nil]; -} - -+ (void)logEvent:(NSString *)eventName - valueToSum:(double)valueToSum - parameters:(NSDictionary *)parameters -{ - [FBSDKAppEvents logEvent:eventName - valueToSum:[NSNumber numberWithDouble:valueToSum] - parameters:parameters - accessToken:nil]; -} - -+ (void)logEvent:(NSString *)eventName - valueToSum:(NSNumber *)valueToSum - parameters:(NSDictionary *)parameters - accessToken:(FBSDKAccessToken *)accessToken -{ - [[FBSDKAppEvents singleton] instanceLogEvent:eventName - valueToSum:valueToSum - parameters:parameters - isImplicitlyLogged:(BOOL)parameters[FBSDKAppEventParameterImplicitlyLogged] - accessToken:accessToken]; -} - -+ (void)logPurchase:(double)purchaseAmount - currency:(NSString *)currency -{ - [FBSDKAppEvents logPurchase:purchaseAmount - currency:currency - parameters:nil]; -} - -+ (void)logPurchase:(double)purchaseAmount - currency:(NSString *)currency - parameters:(NSDictionary *)parameters -{ - [FBSDKAppEvents logPurchase:purchaseAmount - currency:currency - parameters:parameters - accessToken:nil]; -} - -+ (void)logPurchase:(double)purchaseAmount - currency:(NSString *)currency - parameters:(NSDictionary *)parameters - accessToken:(FBSDKAccessToken *)accessToken -{ - - // A purchase event is just a regular logged event with a given event name - // and treating the currency value as going into the parameters dictionary. - NSDictionary *newParameters; - if (!parameters) { - newParameters = @{ FBSDKAppEventParameterNameCurrency : currency }; - } else { - newParameters = [NSMutableDictionary dictionaryWithDictionary:parameters]; - [newParameters setValue:currency forKey:FBSDKAppEventParameterNameCurrency]; - } - - [FBSDKAppEvents logEvent:FBSDKAppEventNamePurchased - valueToSum:[NSNumber numberWithDouble:purchaseAmount] - parameters:newParameters - accessToken:accessToken]; - - // Unless the behavior is set to only allow explicit flushing, we go ahead and flush, since purchase events - // are relatively rare and relatively high value and worth getting across on wire right away. - if ([FBSDKAppEvents flushBehavior] != FBSDKAppEventsFlushBehaviorExplicitOnly) { - [[FBSDKAppEvents singleton] flushForReason:FBSDKAppEventsFlushReasonEagerlyFlushingEvent]; - } -} - -/* - * Push Notifications Logging - */ - -+ (void)logPushNotificationOpen:(NSDictionary *)payload -{ - [self logPushNotificationOpen:payload action:nil]; -} - -+ (void)logPushNotificationOpen:(NSDictionary *)payload action:(NSString *)action -{ - NSDictionary *facebookPayload = payload[FBSDKAppEventsPushPayloadKey]; - if (!facebookPayload) { - return; - } - NSString *campaign = facebookPayload[FBSDKAppEventsPushPayloadCampaignKey]; - if (campaign.length == 0) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - logEntry:@"Malformed payload specified for logging a push notification open."]; - return; - } - - NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithObject:campaign forKey:FBSDKAppEventParameterPushCampaign]; - if (action) { - parameters[FBSDKAppEventParameterPushAction] = action; - } - [self logEvent:FBSDKAppEventNamePushOpened parameters:parameters]; -} - -+ (void)activateApp -{ - [FBSDKAppEventsUtility ensureOnMainThread:NSStringFromSelector(_cmd) className:NSStringFromClass(self)]; - - // Fetch app settings and register for transaction notifications only if app supports implicit purchase - // events - FBSDKAppEvents *instance = [FBSDKAppEvents singleton]; - [instance publishInstall]; - [instance fetchServerConfiguration:NULL]; - - // Restore time spent data, indicating that we're being called from "activateApp", which will, - // when appropriate, result in logging an "activated app" and "deactivated app" (for the - // previous session) App Event. - [FBSDKTimeSpentData restore:YES]; -} - -+ (void)setPushNotificationsDeviceToken:(NSData *)deviceToken -{ - NSString *deviceTokenString = [FBSDKInternalUtility hexadecimalStringFromData:deviceToken]; - if (deviceTokenString == nil) { - [FBSDKAppEvents singleton].pushNotificationsDeviceTokenString = nil; - return; - } - - if (![deviceTokenString isEqualToString:([FBSDKAppEvents singleton].pushNotificationsDeviceTokenString)]) { - [FBSDKAppEvents singleton].pushNotificationsDeviceTokenString = deviceTokenString; - - [FBSDKAppEvents logEvent:FBSDKAppEventNamePushTokenObtained]; - - // Unless the behavior is set to only allow explicit flushing, we go ahead and flush the event - if ([FBSDKAppEvents flushBehavior] != FBSDKAppEventsFlushBehaviorExplicitOnly) { - [[FBSDKAppEvents singleton] flushForReason:FBSDKAppEventsFlushReasonEagerlyFlushingEvent]; - } - } -} - -+ (FBSDKAppEventsFlushBehavior)flushBehavior -{ - return [FBSDKAppEvents singleton].flushBehavior; -} - -+ (void)setFlushBehavior:(FBSDKAppEventsFlushBehavior)flushBehavior -{ - [FBSDKAppEvents singleton].flushBehavior = flushBehavior; -} - -+ (NSString *)loggingOverrideAppID -{ - return g_overrideAppID; -} - -+ (void)setLoggingOverrideAppID:(NSString *)appID -{ - if (![g_overrideAppID isEqualToString:appID]) { - FBSDKConditionalLog(![FBSDKAppEvents singleton]->_explicitEventsLoggedYet, - FBSDKLoggingBehaviorDeveloperErrors, - @"[FBSDKAppEvents setLoggingOverrideAppID:] should only be called prior to any events being logged."); - g_overrideAppID = appID; - } -} - -+ (void)flush -{ - [[FBSDKAppEvents singleton] flushForReason:FBSDKAppEventsFlushReasonExplicit]; -} - -+ (void)setUserID:(NSString *)userID -{ - if ([[[self class] singleton]->_userID isEqualToString:userID]) { - return; - } - [[self class] singleton]->_userID = userID; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - [defaults setObject:userID forKey:USER_ID_USER_DEFAULTS_KEY]; - [defaults synchronize]; -} - -+ (NSString *)userID -{ - return [[self class] singleton]->_userID; -} - -+ (void)updateUserProperties:(NSDictionary *)properties handler:(FBSDKGraphRequestHandler)handler -{ - NSString *userID = [[self class] userID]; - - if (userID.length == 0) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"Missing [FBSDKAppEvents userID] for [FBSDKAppEvents updateUserProperties:]"]; - NSError *error = [FBSDKError requiredArgumentErrorWithName:@"userID" message:@"Missing [FBSDKAppEvents userID] for [FBSDKAppEvents updateUserProperties:]"]; - if (handler) { - handler(nil, nil, error); - } - return; - } - NSMutableDictionary *dataDictionary = [NSMutableDictionary dictionaryWithCapacity:3]; - dataDictionary[@"user_unique_id"] = [FBSDKAppEvents userID]; - [FBSDKInternalUtility dictionary:dataDictionary setObject:[FBSDKAppEventsUtility advertiserID] forKey:@"advertiser_id"]; - [FBSDKInternalUtility dictionary:dataDictionary setObject:properties forKey:@"custom_data"]; - - NSError *error; - __block NSError *invalidObjectError; - NSString *dataJSONString = [FBSDKInternalUtility JSONStringForObject:@[dataDictionary] error:&error invalidObjectHandler:^id(id object, BOOL *stop) { - *stop = YES; - invalidObjectError = [FBSDKError unknownErrorWithMessage:@"The values in the properties dictionary must be NSStrings or NSNumbers"]; - return nil; - }]; - if (!error) { - error = invalidObjectError; - } - if (error) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"Failed to serialize properties for [FBSDKAppEvents updateUserProperties:]"]; - if (handler) { - handler(nil, nil, error); - } - return; - } - NSDictionary *params = @{ @"data" : dataJSONString }; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/user_properties", [[self singleton] appID]] - parameters:params - tokenString:[FBSDKAccessToken currentAccessToken].tokenString - HTTPMethod:@"POST" - flags:FBSDKGraphRequestFlagDisableErrorRecovery | - FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | - FBSDKGraphRequestFlagSkipClientToken - ]; - [request startWithCompletionHandler:handler]; -} - -#pragma mark - Internal Methods - -+ (void)logImplicitEvent:(NSString *)eventName - valueToSum:(NSNumber *)valueToSum - parameters:(NSDictionary *)parameters - accessToken:(FBSDKAccessToken *)accessToken -{ - [[FBSDKAppEvents singleton] instanceLogEvent:eventName - valueToSum:valueToSum - parameters:parameters - isImplicitlyLogged:YES - accessToken:accessToken]; -} - -+ (FBSDKAppEvents *)singleton -{ - static dispatch_once_t pred; - static FBSDKAppEvents *shared = nil; - - dispatch_once(&pred, ^{ - shared = [[FBSDKAppEvents alloc] init]; - }); - return shared; -} - -- (void)flushForReason:(FBSDKAppEventsFlushReason)flushReason -{ - // Always flush asynchronously, even on main thread, for two reasons: - // - most consistent code path for all threads. - // - allow locks being held by caller to be released prior to actual flushing work being done. - @synchronized (self) { - if (!_appEventsState) { - return; - } - FBSDKAppEventsState *copy = [_appEventsState copy]; - _appEventsState = [[FBSDKAppEventsState alloc] initWithToken:copy.tokenString - appID:copy.appID]; - dispatch_async(dispatch_get_main_queue(), ^{ - [self flushOnMainQueue:copy forReason:flushReason]; - }); - } -} - -#pragma mark - Private Methods -- (NSString *)appID -{ - return [FBSDKAppEvents loggingOverrideAppID] ?: [FBSDKSettings appID]; -} - -- (void)publishInstall -{ - NSString *appID = [self appID]; - NSString *lastAttributionPingString = [NSString stringWithFormat:@"com.facebook.sdk:lastAttributionPing%@", appID]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - if ([defaults objectForKey:lastAttributionPingString]) { - return; - } - [self fetchServerConfiguration:^{ - NSDictionary *params = [FBSDKAppEventsUtility activityParametersDictionaryForEvent:@"MOBILE_APP_INSTALL" - implicitEventsOnly:NO - shouldAccessAdvertisingID:_serverConfiguration.isAdvertisingIDEnabled]; - NSString *path = [NSString stringWithFormat:@"%@/activities", appID]; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:path - parameters:params - tokenString:nil - HTTPMethod:@"POST" - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - if (!error) { - [defaults setObject:[NSDate date] forKey:lastAttributionPingString]; - NSString *lastInstallResponseKey = [NSString stringWithFormat:@"com.facebook.sdk:lastInstallResponse%@", appID]; - [defaults setObject:result forKey:lastInstallResponseKey]; - [defaults synchronize]; - } - }]; - }]; -} - -// app events can use a server configuration up to 24 hours old to minimize network traffic. -- (void)fetchServerConfiguration:(void (^)(void))callback -{ - if (_serverConfiguration == nil) { - [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *error) { - _serverConfiguration = serverConfiguration; - - if (_serverConfiguration.implicitPurchaseLoggingEnabled) { - [FBSDKPaymentObserver startObservingTransactions]; - } else { - [FBSDKPaymentObserver stopObservingTransactions]; - } - if (callback) { - callback(); - } - }]; - return; - } - if (callback) { - callback(); - } -} - -- (void)instanceLogEvent:(NSString *)eventName - valueToSum:(NSNumber *)valueToSum - parameters:(NSDictionary *)parameters - isImplicitlyLogged:(BOOL)isImplicitlyLogged - accessToken:(FBSDKAccessToken *)accessToken -{ - if (isImplicitlyLogged && _serverConfiguration && !_serverConfiguration.isImplicitLoggingSupported) { - return; - } - - if (!isImplicitlyLogged && !_explicitEventsLoggedYet) { - _explicitEventsLoggedYet = YES; - } - - __block BOOL failed = NO; - - if (![FBSDKAppEventsUtility validateIdentifier:eventName]) { - failed = YES; - } - - // Make sure parameter dictionary is well formed. Log and exit if not. - [parameters enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - if (![key isKindOfClass:[NSString class]]) { - [FBSDKAppEventsUtility logAndNotify:[NSString stringWithFormat:@"The keys in the parameters must be NSStrings, '%@' is not.", key]]; - failed = YES; - } - if (![FBSDKAppEventsUtility validateIdentifier:key]) { - failed = YES; - } - if (![obj isKindOfClass:[NSString class]] && ![obj isKindOfClass:[NSNumber class]]) { - [FBSDKAppEventsUtility logAndNotify:[NSString stringWithFormat:@"The values in the parameters dictionary must be NSStrings or NSNumbers, '%@' is not.", obj]]; - failed = YES; - } - } - ]; - - if (failed) { - return; - } - - NSMutableDictionary *eventDictionary = [NSMutableDictionary dictionaryWithDictionary:parameters]; - eventDictionary[FBSDKAppEventParameterEventName] = eventName; - if (!eventDictionary[FBSDKAppEventParameterLogTime]) { - eventDictionary[FBSDKAppEventParameterLogTime] = @([FBSDKAppEventsUtility unixTimeNow]); - } - [FBSDKInternalUtility dictionary:eventDictionary setObject:valueToSum forKey:@"_valueToSum"]; - if (isImplicitlyLogged) { - eventDictionary[FBSDKAppEventParameterImplicitlyLogged] = @"1"; - } - - NSString *currentViewControllerName; - if ([NSThread isMainThread]) { - // We only collect the view controller when on the main thread, as the behavior off - // the main thread is unpredictable. Besides, UI state for off-main-thread computations - // isn't really relevant anyhow. - UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController.presentedViewController; - if (vc) { - currentViewControllerName = [[vc class] description]; - } else { - currentViewControllerName = @"no_ui"; - } - } else { - currentViewControllerName = @"off_thread"; - } - eventDictionary[@"_ui"] = currentViewControllerName; - - NSString *tokenString = [FBSDKAppEventsUtility tokenStringToUseFor:accessToken]; - NSString *appID = [self appID]; - - @synchronized (self) { - if (!_appEventsState) { - _appEventsState = [[FBSDKAppEventsState alloc] initWithToken:tokenString appID:appID]; - } else if (![_appEventsState isCompatibleWithTokenString:tokenString appID:appID]) { - if (self.flushBehavior == FBSDKAppEventsFlushBehaviorExplicitOnly) { - [FBSDKAppEventsStateManager persistAppEventsData:_appEventsState]; - } else { - [self flushForReason:FBSDKAppEventsFlushReasonSessionChange]; - } - _appEventsState = [[FBSDKAppEventsState alloc] initWithToken:tokenString appID:appID]; - } - - [_appEventsState addEvent:eventDictionary isImplicit:isImplicitlyLogged]; - if (!isImplicitlyLogged) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - formatString:@"FBSDKAppEvents: Recording event @ %ld: %@", - [FBSDKAppEventsUtility unixTimeNow], - eventDictionary]; - } - - [self checkPersistedEvents]; - - if (_appEventsState.events.count > NUM_LOG_EVENTS_TO_TRY_TO_FLUSH_AFTER && - self.flushBehavior != FBSDKAppEventsFlushBehaviorExplicitOnly) { - [self flushForReason:FBSDKAppEventsFlushReasonEventThreshold]; - } - } -} - -// this fetches persisted event states. -// for those matching the currently tracked events, add it. -// otherwise, either flush (if not explicitonly behavior) or persist them back. -- (void)checkPersistedEvents -{ - NSArray *existingEventsStates = [FBSDKAppEventsStateManager retrievePersistedAppEventsStates]; - if (existingEventsStates.count == 0) { - return; - } - FBSDKAppEventsState *matchingEventsPreviouslySaved = nil; - // reduce lock time by creating a new FBSDKAppEventsState to collect matching persisted events. - @synchronized(self) { - if (_appEventsState) { - matchingEventsPreviouslySaved = [[FBSDKAppEventsState alloc] initWithToken:_appEventsState.tokenString - appID:_appEventsState.appID]; - } - } - for (FBSDKAppEventsState *saved in existingEventsStates) { - if ([saved isCompatibleWithAppEventsState:matchingEventsPreviouslySaved]) { - [matchingEventsPreviouslySaved addEventsFromAppEventState:saved]; - } else { - if (self.flushBehavior == FBSDKAppEventsFlushBehaviorExplicitOnly) { - [FBSDKAppEventsStateManager persistAppEventsData:saved]; - } else { - dispatch_async(dispatch_get_main_queue(), ^{ - [self flushOnMainQueue:saved forReason:FBSDKAppEventsFlushReasonPersistedEvents]; - }); - } - } - } - if (matchingEventsPreviouslySaved.events.count > 0) { - @synchronized(self) { - if ([_appEventsState isCompatibleWithAppEventsState:matchingEventsPreviouslySaved]) { - [_appEventsState addEventsFromAppEventState:matchingEventsPreviouslySaved]; - } - } - } -} - -- (void)flushOnMainQueue:(FBSDKAppEventsState *)appEventsState - forReason:(FBSDKAppEventsFlushReason)reason -{ - if (appEventsState.events.count == 0) { - return; - } - [FBSDKAppEventsUtility ensureOnMainThread:NSStringFromSelector(_cmd) className:NSStringFromClass([self class])]; - - [self fetchServerConfiguration:^(void) { - NSString *receipt_data = [appEventsState extractReceiptData]; - NSString *JSONString = [appEventsState JSONStringForEvents:_serverConfiguration.implicitLoggingEnabled]; - NSData *encodedEvents = [JSONString dataUsingEncoding:NSUTF8StringEncoding]; - if (!encodedEvents) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - logEntry:@"FBSDKAppEvents: Flushing skipped - no events after removing implicitly logged ones.\n"]; - return; - } - NSMutableDictionary *postParameters = [FBSDKAppEventsUtility - activityParametersDictionaryForEvent:@"CUSTOM_APP_EVENTS" - implicitEventsOnly:appEventsState.areAllEventsImplicit - shouldAccessAdvertisingID:_serverConfiguration.advertisingIDEnabled]; - NSInteger length = [receipt_data length]; - if (length > 0) { - postParameters[@"receipt_data"] = receipt_data; - } - - postParameters[@"custom_events_file"] = encodedEvents; - if (appEventsState.numSkipped > 0) { - postParameters[@"num_skipped_events"] = [NSString stringWithFormat:@"%lu", (unsigned long)appEventsState.numSkipped]; - } - if (self.pushNotificationsDeviceTokenString) { - postParameters[FBSDKActivitesParameterPushDeviceToken] = self.pushNotificationsDeviceTokenString; - } - - NSString *loggingEntry = nil; - if ([[FBSDKSettings loggingBehavior] containsObject:FBSDKLoggingBehaviorAppEvents]) { - NSData *prettyJSONData = [NSJSONSerialization dataWithJSONObject:appEventsState.events - options:NSJSONWritingPrettyPrinted - error:NULL]; - NSString *prettyPrintedJsonEvents = [[NSString alloc] initWithData:prettyJSONData - encoding:NSUTF8StringEncoding]; - // Remove this param -- just an encoding of the events which we pretty print later. - NSMutableDictionary *paramsForPrinting = [postParameters mutableCopy]; - [paramsForPrinting removeObjectForKey:@"custom_events_file"]; - - loggingEntry = [NSString stringWithFormat:@"FBSDKAppEvents: Flushed @ %ld, %lu events due to '%@' - %@\nEvents: %@", - [FBSDKAppEventsUtility unixTimeNow], - (unsigned long)appEventsState.events.count, - [FBSDKAppEventsUtility flushReasonToString:reason], - paramsForPrinting, - prettyPrintedJsonEvents]; - } - - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/activities", appEventsState.appID] - parameters:postParameters - tokenString:appEventsState.tokenString - HTTPMethod:@"POST" - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - - [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - [self handleActivitiesPostCompletion:error - loggingEntry:loggingEntry - appEventsState:(FBSDKAppEventsState *)appEventsState]; - }]; - - }]; -} - -- (void)handleActivitiesPostCompletion:(NSError *)error - loggingEntry:(NSString *)loggingEntry - appEventsState:(FBSDKAppEventsState *)appEventsState -{ - typedef NS_ENUM(NSUInteger, FBSDKAppEventsFlushResult) { - FlushResultSuccess, - FlushResultServerError, - FlushResultNoConnectivity - }; - - [FBSDKAppEventsUtility ensureOnMainThread:NSStringFromSelector(_cmd) className:NSStringFromClass([self class])]; - - FBSDKAppEventsFlushResult flushResult = FlushResultSuccess; - if (error) { - NSInteger errorCode = [error.userInfo[FBSDKGraphRequestErrorHTTPStatusCodeKey] integerValue]; - - // We interpret a 400 coming back from FBRequestConnection as a server error due to improper data being - // sent down. Otherwise we assume no connectivity, or another condition where we could treat it as no connectivity. - flushResult = errorCode == 400 ? FlushResultServerError : FlushResultNoConnectivity; - } - - if (flushResult == FlushResultServerError) { - // Only log events that developer can do something with (i.e., if parameters are incorrect). - // as opposed to cases where the token is bad. - if ([error.userInfo[FBSDKGraphRequestErrorCategoryKey] unsignedIntegerValue] == FBSDKGraphRequestErrorCategoryOther) { - NSString *message = [NSString stringWithFormat:@"Failed to send AppEvents: %@", error]; - [FBSDKAppEventsUtility logAndNotify:message allowLogAsDeveloperError:!appEventsState.areAllEventsImplicit]; - } - } else if (flushResult == FlushResultNoConnectivity) { - @synchronized(self) { - if ([appEventsState isCompatibleWithAppEventsState:_appEventsState]) { - [_appEventsState addEventsFromAppEventState:appEventsState]; - } else { - // flush failed due to connectivity. Persist to be tried again later. - [FBSDKAppEventsStateManager persistAppEventsData:appEventsState]; - } - } - } - - NSString *resultString = @""; - switch (flushResult) { - case FlushResultSuccess: - resultString = @"Success"; - break; - - case FlushResultNoConnectivity: - resultString = @"No Connectivity"; - break; - - case FlushResultServerError: - resultString = [NSString stringWithFormat:@"Server Error - %@", [error description]]; - break; - } - - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - formatString:@"%@\nFlush Result : %@", loggingEntry, resultString]; -} - -- (void)flushTimerFired:(id)arg -{ - [FBSDKAppEventsUtility ensureOnMainThread:NSStringFromSelector(_cmd) className:NSStringFromClass([self class])]; - if (self.flushBehavior != FBSDKAppEventsFlushBehaviorExplicitOnly && !self.disableTimer) { - [self flushForReason:FBSDKAppEventsFlushReasonTimer]; - } -} - -- (void)appSettingsFetchStateResetTimerFired:(id)arg -{ - _serverConfiguration = nil; -} - -- (void)applicationDidBecomeActive -{ - [FBSDKAppEventsUtility ensureOnMainThread:NSStringFromSelector(_cmd) className:NSStringFromClass([self class])]; - - [self checkPersistedEvents]; - - // Restore time spent data, indicating that we're not being called from "activateApp". - [FBSDKTimeSpentData restore:NO]; -} - -- (void)applicationMovingFromActiveStateOrTerminating -{ - // When moving from active state, we don't have time to wait for the result of a flush, so - // just persist events to storage, and we'll process them at the next activation. - FBSDKAppEventsState *copy = nil; - @synchronized (self) { - copy = [_appEventsState copy]; - _appEventsState = nil; - } - if (copy) { - [FBSDKAppEventsStateManager persistAppEventsData:copy]; - } - [FBSDKTimeSpentData suspend]; -} - -#pragma mark - Custom Audience - -+ (FBSDKGraphRequest *)requestForCustomAudienceThirdPartyIDWithAccessToken:(FBSDKAccessToken *)accessToken -{ - accessToken = accessToken ?: [FBSDKAccessToken currentAccessToken]; - // Rules for how we use the attribution ID / advertiser ID for an 'custom_audience_third_party_id' Graph API request - // 1) if the OS tells us that the user has Limited Ad Tracking, then just don't send, and return a nil in the token. - // 2) if the app has set 'limitEventAndDataUsage', this effectively implies that app-initiated ad targeting shouldn't happen, - // so use that data here to return nil as well. - // 3) if we have a user session token, then no need to send attribution ID / advertiser ID back as the udid parameter - // 4) otherwise, send back the udid parameter. - - if ([FBSDKAppEventsUtility advertisingTrackingStatus] == FBSDKAdvertisingTrackingDisallowed || [FBSDKSettings limitEventAndDataUsage]) { - return nil; - } - - NSString *tokenString = [FBSDKAppEventsUtility tokenStringToUseFor:accessToken]; - NSString *udid = nil; - if (!accessToken) { - // We don't have a logged in user, so we need some form of udid representation. Prefer advertiser ID if - // available, and back off to attribution ID if not. Note that this function only makes sense to be - // called in the context of advertising. - udid = [FBSDKAppEventsUtility advertiserID]; - if (!udid) { - udid = [FBSDKAppEventsUtility attributionID]; - } - - if (!udid) { - // No udid, and no user token. No point in making the request. - return nil; - } - } - - NSDictionary *parameters = nil; - if (udid) { - parameters = @{ @"udid" : udid }; - } - - NSString *graphPath = [NSString stringWithFormat:@"%@/custom_audience_third_party_id", [[self singleton] appID]]; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath - parameters:parameters - tokenString:tokenString - HTTPMethod:nil - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - - return request; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h deleted file mode 100644 index c97b6b35d..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class BFTask; - -// Check if Bolts.framework is available for import -#if __has_include() -// Import it if it's available -# import -#else -// Otherwise - redeclare BFAppLinkResolving protocol to resolve the problem of missing symbols -// Please note: Bolts.framework is still required for AppLink resolving to work, -// but this allows FBSDKCoreKit to weakly link Bolts.framework as well as this enables clang modulemaps to work. - -/** - Implement this protocol to provide an alternate strategy for resolving - App Links that may include pre-fetching, caching, or querying for App Link - data from an index provided by a service provider. - */ -@protocol BFAppLinkResolving - -/** - Asynchronously resolves App Link data for a given URL. - - - Parameter url: The URL to resolve into an App Link. - - Returns: A BFTask that will return a BFAppLink for the given URL. - */ -- (BFTask *)appLinkFromURLInBackground:(NSURL *)url; - -@end - -#endif - -/** - - Provides an implementation of the BFAppLinkResolving protocol that uses the Facebook App Link - Index API to resolve App Links given a URL. It also provides an additional helper method that can resolve - multiple App Links in a single call. - - - - Usage of this type requires a client token. See `[FBSDKSettings setClientToken:]` and linking - Bolts.framework - */ -@interface FBSDKAppLinkResolver : NSObject - -/** - Asynchronously resolves App Link data for multiple URLs. - - - Parameter urls: An array of NSURLs to resolve into App Links. - - Returns: A BFTask that will return dictionary mapping input NSURLs to their - corresponding BFAppLink. - - - - You should set the client token before making this call. See `[FBSDKSettings setClientToken:]` - */ -- (BFTask *)appLinksFromURLsInBackground:(NSArray *)urls; - -/** - Allocates and initializes a new instance of FBSDKAppLinkResolver. - */ -+ (instancetype)resolver; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.m deleted file mode 100644 index 2dec493e4..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.m +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppLinkResolver.h" - -#import - -#import -#import -#import -#import - -#import "FBSDKAccessToken.h" -#import "FBSDKGraphRequest+Internal.h" -#import "FBSDKGraphRequestConnection.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKSettings+Internal.h" -#import "FBSDKUtility.h" - -static NSString *const kURLKey = @"url"; -static NSString *const kIOSAppStoreIdKey = @"app_store_id"; -static NSString *const kIOSAppNameKey = @"app_name"; -static NSString *const kWebKey = @"web"; -static NSString *const kIOSKey = @"ios"; -static NSString *const kIPhoneKey = @"iphone"; -static NSString *const kIPadKey = @"ipad"; -static NSString *const kShouldFallbackKey = @"should_fallback"; -static NSString *const kAppLinksKey = @"app_links"; - -@interface FBSDKAppLinkResolver () - -@property (nonatomic, strong) NSMutableDictionary *cachedLinks; -@property (nonatomic, assign) UIUserInterfaceIdiom userInterfaceIdiom; -@end - -@implementation FBSDKAppLinkResolver - -static Class g_BFTaskCompletionSourceClass; -static Class g_BFAppLinkTargetClass; -static Class g_BFAppLinkClass; -static Class g_BFTaskClass; - -+ (void)initialize -{ - if (self == [FBSDKAppLinkResolver class]) { - g_BFTaskCompletionSourceClass = [FBSDKInternalUtility - resolveBoltsClassWithName:@"BFTaskCompletionSource"]; - g_BFAppLinkTargetClass = [FBSDKInternalUtility resolveBoltsClassWithName:@"BFAppLinkTarget"]; - g_BFTaskClass = [FBSDKInternalUtility resolveBoltsClassWithName:@"BFTask"]; - g_BFAppLinkClass = [FBSDKInternalUtility resolveBoltsClassWithName:@"BFAppLink"]; - } -} - -- (id)initWithUserInterfaceIdiom:(UIUserInterfaceIdiom)userInterfaceIdiom -{ - if (self = [super init]) { - self.cachedLinks = [NSMutableDictionary dictionary]; - self.userInterfaceIdiom = userInterfaceIdiom; - } - return self; -} - -- (BFTask *)appLinksFromURLsInBackground:(NSArray *)urls -{ - if (![FBSDKSettings clientToken] && ![FBSDKAccessToken currentAccessToken]) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - logEntry:@"A user access token or clientToken is required to use FBAppLinkResolver"]; - } - NSMutableDictionary *appLinks = [NSMutableDictionary dictionary]; - NSMutableArray *toFind = [NSMutableArray array]; - NSMutableArray *toFindStrings = [NSMutableArray array]; - - @synchronized (self.cachedLinks) { - for (NSURL *url in urls) { - if (self.cachedLinks[url]) { - appLinks[url] = self.cachedLinks[url]; - } else { - [toFind addObject:url]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [toFindStrings addObject:[url.absoluteString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; -#pragma clang diagnostic pop - } - } - } - if (toFind.count == 0) { - // All of the URLs have already been found. - return [g_BFTaskClass taskWithResult:appLinks]; - } - NSMutableArray *fields = [NSMutableArray arrayWithObject:kIOSKey]; - - NSString *idiomSpecificField = nil; - - switch (self.userInterfaceIdiom) { - case UIUserInterfaceIdiomPad: - idiomSpecificField = kIPadKey; - break; - case UIUserInterfaceIdiomPhone: - idiomSpecificField = kIPhoneKey; - break; - default: - break; - } - if (idiomSpecificField) { - [fields addObject:idiomSpecificField]; - } - NSString *path = [NSString stringWithFormat:@"?fields=%@.fields(%@)&ids=%@", - kAppLinksKey, - [fields componentsJoinedByString:@","], - [toFindStrings componentsJoinedByString:@","]]; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:path - parameters:nil - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - BFTaskCompletionSource *tcs = [g_BFTaskCompletionSourceClass taskCompletionSource]; - [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - if (error) { - [tcs setError:error]; - return; - } - for (NSURL *url in toFind) { - id nestedObject = [[result objectForKey:url.absoluteString] objectForKey:kAppLinksKey]; - NSMutableArray *rawTargets = [NSMutableArray array]; - if (idiomSpecificField) { - [rawTargets addObjectsFromArray:[nestedObject objectForKey:idiomSpecificField]]; - } - [rawTargets addObjectsFromArray:[nestedObject objectForKey:kIOSKey]]; - - NSMutableArray *targets = [NSMutableArray arrayWithCapacity:rawTargets.count]; - for (id rawTarget in rawTargets) { - [targets addObject:[g_BFAppLinkTargetClass appLinkTargetWithURL:[NSURL URLWithString:[rawTarget objectForKey:kURLKey]] - appStoreId:[rawTarget objectForKey:kIOSAppStoreIdKey] - appName:[rawTarget objectForKey:kIOSAppNameKey]]]; - } - - id webTarget = [nestedObject objectForKey:kWebKey]; - NSString *webFallbackString = [webTarget objectForKey:kURLKey]; - NSURL *fallbackUrl = webFallbackString ? [NSURL URLWithString:webFallbackString] : url; - - NSNumber *shouldFallback = [webTarget objectForKey:kShouldFallbackKey]; - if (shouldFallback && !shouldFallback.boolValue) { - fallbackUrl = nil; - } - - BFAppLink *link = [g_BFAppLinkClass appLinkWithSourceURL:url - targets:targets - webURL:fallbackUrl]; - @synchronized (self.cachedLinks) { - self.cachedLinks[url] = link; - } - appLinks[url] = link; - } - [tcs setResult:appLinks]; - }]; - return tcs.task; -} - -- (BFTask *)appLinkFromURLInBackground:(NSURL *)url -{ - // Implement in terms of appLinksFromURLsInBackground - BFTask *resolveTask = [self appLinksFromURLsInBackground:@[url]]; - return [resolveTask continueWithSuccessBlock:^id(BFTask *task) { - return task.result[url]; - }]; -} - -+ (id)resolver -{ - return [[self alloc] initWithUserInterfaceIdiom:UI_USER_INTERFACE_IDIOM()]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h deleted file mode 100644 index 1cc549a19..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - Describes the callback for fetchDeferredAppLink. - - Parameter url: the url representing the deferred App Link - - Parameter error: the error during the request, if any - - - The url may also have a fb_click_time_utc query parameter that - represents when the click occurred that caused the deferred App Link to be created. - */ -typedef void (^FBSDKDeferredAppLinkHandler)(NSURL *url, NSError *error); - - -/** - Describes the callback for fetchOrganicDeferredAppLink. - - Parameter url: the url representing the deferred App Link - */ -typedef void (^FBSDKDeferredAppInviteHandler)(NSURL *url); - - -/** - Class containing App Links related utility methods. - */ -@interface FBSDKAppLinkUtility : NSObject - -/** - Call this method from the main thread to fetch deferred applink data if you use Mobile App - Engagement Ads (https://developers.facebook.com/docs/ads-for-apps/mobile-app-ads-engagement). - This may require a network round trip. If successful, the handler is invoked with the link - data (this will only return a valid URL once, and future calls will result in a nil URL - value in the callback). - - - Parameter handler: the handler to be invoked if there is deferred App Link data - - - The handler may contain an NSError instance to capture any errors. In the - common case where there simply was no app link data, the NSError instance will be nil. - - This method should only be called from a location that occurs after any launching URL has - been processed (e.g., you should call this method from your application delegate's - applicationDidBecomeActive:). - */ -+ (void)fetchDeferredAppLink:(FBSDKDeferredAppLinkHandler)handler; - -/** - -- Warning:This method is no longer available and will always return NO. - */ -+ (BOOL)fetchDeferredAppInvite:(FBSDKDeferredAppInviteHandler)handler -__attribute__((deprecated("This method is no longer available.")));; - -/* - Call this method to fetch promotion code from the url, if it's present. This function - requires Bolts framework. - - Note: This throws an exception if Bolts.framework is not linked. Add '[BFURL class]' in intialize method - of your AppDelegate. - - - Parameter url: App Link url that was passed to the app. - - - Returns: Promotion code string. - - - Call this method to fetch App Invite Promotion Code from applink if present. - This can be used to fetch the promotion code that was associated with the invite when it - was created. This method should be called with the url from the openURL method. -*/ -+ (NSString*)appInvitePromotionCodeFromURL:(NSURL*)url; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.m deleted file mode 100644 index 6def9e4de..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.m +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppLinkUtility.h" - -#import - -#import "FBSDKAppEventsUtility.h" -#import "FBSDKGraphRequest.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKSettings.h" -#import "FBSDKUtility.h" - -static NSString *const FBSDKLastDeferredAppLink = @"com.facebook.sdk:lastDeferredAppLink%@"; -static NSString *const FBSDKDeferredAppLinkEvent = @"DEFERRED_APP_LINK"; - -@implementation FBSDKAppLinkUtility {} - -+ (void)fetchDeferredAppLink:(FBSDKDeferredAppLinkHandler)handler -{ - NSAssert([NSThread isMainThread], @"FBSDKAppLink fetchDeferredAppLink: must be invoked from main thread."); - - NSString *appID = [FBSDKSettings appID]; - - // Deferred app links are only currently used for engagement ads, thus we consider the app to be an advertising one. - // If this is considered for organic, non-ads scenarios, we'll need to retrieve the FBAppEventsUtility.shouldAccessAdvertisingID - // before we make this call. - NSMutableDictionary *deferredAppLinkParameters = - [FBSDKAppEventsUtility activityParametersDictionaryForEvent:FBSDKDeferredAppLinkEvent - implicitEventsOnly:NO - shouldAccessAdvertisingID:YES]; - - FBSDKGraphRequest *deferredAppLinkRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/activities", appID, nil] - parameters:deferredAppLinkParameters - tokenString:nil - version:nil - HTTPMethod:@"POST"]; - - [deferredAppLinkRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, - id result, - NSError *error) { - NSURL *applinkURL = nil; - if (!error) { - NSString *appLinkString = result[@"applink_url"]; - if (appLinkString) { - applinkURL = [NSURL URLWithString:appLinkString]; - - NSString *createTimeUtc = result[@"click_time"]; - if (createTimeUtc) { - // append/translate the create_time_utc so it can be used by clients - NSString *modifiedURLString = [[applinkURL absoluteString] - stringByAppendingFormat:@"%@fb_click_time_utc=%@", - ([applinkURL query]) ? @"&" : @"?" , - createTimeUtc ]; - applinkURL = [NSURL URLWithString:modifiedURLString]; - } - } - } - - if (handler) { - dispatch_async(dispatch_get_main_queue(), ^{ - handler(applinkURL, error); - }); - } - }]; -} - -+ (BOOL)fetchDeferredAppInvite:(FBSDKDeferredAppInviteHandler)handler -{ - return NO; -} - -+ (NSString*)appInvitePromotionCodeFromURL:(NSURL*)url; -{ - BFURL *parsedUrl = [[FBSDKInternalUtility resolveBoltsClassWithName:@"BFURL"] URLWithURL:url]; - NSDictionary *extras = [parsedUrl appLinkExtras]; - if (extras) { - NSString *deeplinkContextString = extras[@"deeplink_context"]; - - // Parse deeplinkContext and extract promo code - if ([deeplinkContextString length] > 0) { - NSError *error = nil; - NSDictionary *deeplinkContextData = [FBSDKInternalUtility objectForJSONString:deeplinkContextString error:&error]; - if (!error && [deeplinkContextData isKindOfClass:[NSDictionary class]]) { - return deeplinkContextData[@"promo_code"]; - } - } - } - - return nil; - -} -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h deleted file mode 100644 index ebaef4d38..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - - The FBSDKApplicationDelegate is designed to post process the results from Facebook Login - or Facebook Dialogs (or any action that requires switching over to the native Facebook - app or Safari). - - - - The methods in this class are designed to mirror those in UIApplicationDelegate, and you - should call them in the respective methods in your AppDelegate implementation. - */ -@interface FBSDKApplicationDelegate : NSObject - -/** - Gets the singleton instance. - */ -+ (instancetype)sharedInstance; - -/** - Call this method from the [UIApplicationDelegate application:openURL:sourceApplication:annotation:] method - of the AppDelegate for your app. It should be invoked for the proper processing of responses during interaction - with the native Facebook app or Safari as part of SSO authorization flow or Facebook dialogs. - - - Parameter application: The application as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. - - - Parameter url: The URL as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. - - - Parameter sourceApplication: The sourceApplication as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. - - - Parameter annotation: The annotation as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. - - - Returns: YES if the url was intended for the Facebook SDK, NO if not. - */ -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation; - -#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_9_0 -/** - Call this method from the [UIApplicationDelegate application:openURL:options:] method - of the AppDelegate for your app. It should be invoked for the proper processing of responses during interaction - with the native Facebook app or Safari as part of SSO authorization flow or Facebook dialogs. - - - Parameter application: The application as passed to [UIApplicationDelegate application:openURL:options:]. - - - Parameter url: The URL as passed to [UIApplicationDelegate application:openURL:options:]. - - - Parameter options: The options dictionary as passed to [UIApplicationDelegate application:openURL:options:]. - - - Returns: YES if the url was intended for the Facebook SDK, NO if not. - */ -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - options:(NSDictionary *)options; -#endif - -/** - Call this method from the [UIApplicationDelegate application:didFinishLaunchingWithOptions:] method - of the AppDelegate for your app. It should be invoked for the proper use of the Facebook SDK. - As part of SDK initialization basic auto logging of app events will occur, this can be -controlled via 'FacebookAutoLogAppEventsEnabled' key in the project info plist file. - - - Parameter application: The application as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - - - Parameter launchOptions: The launchOptions as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - - - Returns: YES if the url was intended for the Facebook SDK, NO if not. - */ -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.m deleted file mode 100644 index 611304519..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.m +++ /dev/null @@ -1,553 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKApplicationDelegate.h" -#import "FBSDKApplicationDelegate+Internal.h" - -#import - -#if !TARGET_OS_TV -#import -#endif - -#import "FBSDKAppEvents+Internal.h" -#import "FBSDKConstants.h" -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKError.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKServerConfiguration.h" -#import "FBSDKServerConfigurationManager.h" -#import "FBSDKSettings+Internal.h" -#import "FBSDKTimeSpentData.h" -#import "FBSDKUtility.h" - -#if !TARGET_OS_TV -#import "FBSDKBoltsMeasurementEventListener.h" -#import "FBSDKBridgeAPIRequest.h" -#import "FBSDKBridgeAPIResponse.h" -#import "FBSDKContainerViewController.h" -#import "FBSDKProfile+Internal.h" -#endif - -NSString *const FBSDKApplicationDidBecomeActiveNotification = @"com.facebook.sdk.FBSDKApplicationDidBecomeActiveNotification"; - -static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound"; - -@implementation FBSDKApplicationDelegate -{ -#if !TARGET_OS_TV - FBSDKBridgeAPIRequest *_pendingRequest; - FBSDKBridgeAPICallbackBlock _pendingRequestCompletionBlock; - id _pendingURLOpen; - SFAuthenticationSession *_authenticationSession NS_AVAILABLE_IOS(11_0); -#endif - BOOL _expectingBackground; - UIViewController *_safariViewController; - BOOL _isDismissingSafariViewController; -} - -#pragma mark - Class Methods - -+ (void)load -{ - // when the app becomes active by any means, kick off the initialization. - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(initializeWithLaunchData:) - name:UIApplicationDidFinishLaunchingNotification - object:nil]; -} - -// Initialize SDK listeners -// Don't call this function in any place else. It should only be called when the class is loaded. -+ (void)initializeWithLaunchData:(NSNotification *)note -{ - NSDictionary *launchData = note.userInfo; -#if !TARGET_OS_TV - // Register Listener for Bolts measurement events - [FBSDKBoltsMeasurementEventListener defaultListener]; -#endif - // Set the SourceApplication for time spent data. This is not going to update the value if the app has already launched. - [FBSDKTimeSpentData setSourceApplication:launchData[UIApplicationLaunchOptionsSourceApplicationKey] - openURL:launchData[UIApplicationLaunchOptionsURLKey]]; - // Register on UIApplicationDidEnterBackgroundNotification events to reset source application data when app backgrounds. - [FBSDKTimeSpentData registerAutoResetSourceApplication]; - - [FBSDKInternalUtility validateFacebookReservedURLSchemes]; - - // Remove the observer - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -+ (instancetype)sharedInstance -{ - static FBSDKApplicationDelegate *_sharedInstance; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - _sharedInstance = [[self alloc] _init]; - }); - return _sharedInstance; -} - -#pragma mark - Object Lifecycle - -- (instancetype)_init -{ - if ((self = [super init]) != nil) { - NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; - [defaultCenter addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; - [defaultCenter addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil]; - } - return self; -} - -- (instancetype)init -{ - return nil; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - UIApplicationDelegate - -#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_9_0 -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - options:(NSDictionary *)options -{ - return [self application:application - openURL:url - sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] - annotation:options[UIApplicationOpenURLOptionsAnnotationKey]]; -} -#endif - -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation -{ - if (sourceApplication != nil && ![sourceApplication isKindOfClass:[NSString class]]) { - @throw [NSException exceptionWithName:NSInvalidArgumentException - reason:@"Expected 'sourceApplication' to be NSString. Please verify you are passing in 'sourceApplication' from your app delegate (not the UIApplication* parameter). If your app delegate implements iOS 9's application:openURL:options:, you should pass in options[UIApplicationOpenURLOptionsSourceApplicationKey]. " - userInfo:nil]; - } - [FBSDKTimeSpentData setSourceApplication:sourceApplication openURL:url]; - -#if !TARGET_OS_TV - id pendingURLOpen = _pendingURLOpen; - - void (^completePendingOpenURLBlock)(void) = ^{ - _pendingURLOpen = nil; - [pendingURLOpen application:application - openURL:url - sourceApplication:sourceApplication - annotation:annotation]; - _isDismissingSafariViewController = NO; - }; - // if they completed a SFVC flow, dismiss it. - if (_safariViewController) { - _isDismissingSafariViewController = YES; - [_safariViewController.presentingViewController dismissViewControllerAnimated:YES - completion:completePendingOpenURLBlock]; - _safariViewController = nil; - } else { - if (_authenticationSession != nil) { - [_authenticationSession cancel]; - _authenticationSession = nil; - } - completePendingOpenURLBlock(); - } - if ([pendingURLOpen canOpenURL:url - forApplication:application - sourceApplication:sourceApplication - annotation:annotation]) { - return YES; - } - if ([self _handleBridgeAPIResponseURL:url sourceApplication:sourceApplication]) { - return YES; - } -#endif - [self _logIfAppLinkEvent:url]; - - return NO; -} - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - FBSDKAccessToken *cachedToken = [[FBSDKSettings accessTokenCache] fetchAccessToken]; - [FBSDKAccessToken setCurrentAccessToken:cachedToken]; - // fetch app settings - [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; - - [self _logSDKInitialize]; -#if !TARGET_OS_TV - FBSDKProfile *cachedProfile = [FBSDKProfile fetchCachedProfile]; - [FBSDKProfile setCurrentProfile:cachedProfile]; - - NSURL *launchedURL = launchOptions[UIApplicationLaunchOptionsURLKey]; - NSString *sourceApplication = launchOptions[UIApplicationLaunchOptionsSourceApplicationKey]; - - if (launchedURL && - sourceApplication) { - Class loginManagerClass = NSClassFromString(@"FBSDKLoginManager"); - if (loginManagerClass) { - id annotation = launchOptions[UIApplicationLaunchOptionsAnnotationKey]; - id loginManager = [[loginManagerClass alloc] init]; - return [loginManager application:application - openURL:launchedURL - sourceApplication:sourceApplication - annotation:annotation]; - } - } -#endif - return NO; -} - -- (void)applicationDidEnterBackground:(NSNotification *)notification -{ - _active = NO; - _expectingBackground = NO; -} - -- (void)applicationDidBecomeActive:(NSNotification *)notification -{ - // Auto log basic events in case autoLogAppEventsEnabled is set - if ([[FBSDKSettings autoLogAppEventsEnabled] boolValue]) { - [FBSDKAppEvents activateApp]; - } - // _expectingBackground can be YES if the caller started doing work (like login) - // within the app delegate's lifecycle like openURL, in which case there - // might have been a "didBecomeActive" event pending that we want to ignore. - BOOL notExpectingBackground = !_expectingBackground && !_safariViewController && !_isDismissingSafariViewController; -#if !TARGET_OS_TV - notExpectingBackground = notExpectingBackground && !_authenticationSession; -#endif - if (notExpectingBackground) { - _active = YES; -#if !TARGET_OS_TV - [_pendingURLOpen applicationDidBecomeActive:[notification object]]; - [self _cancelBridgeRequest]; -#endif - [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKApplicationDidBecomeActiveNotification object:self]; - } -} - -#pragma mark - Internal Methods - -#pragma mark -- (non-tvos) - -#if !TARGET_OS_TV - -- (void)openURL:(NSURL *)url sender:(id)sender handler:(void(^)(BOOL, NSError *))handler -{ - _expectingBackground = YES; - _pendingURLOpen = sender; - dispatch_async(dispatch_get_main_queue(), ^{ - // Dispatch openURL calls to prevent hangs if we're inside the current app delegate's openURL flow already - NSOperatingSystemVersion iOS10Version = { .majorVersion = 10, .minorVersion = 0, .patchVersion = 0 }; - if ([FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS10Version]) { - [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) { - handler(success, nil); - }]; - } else { - BOOL opened = [[UIApplication sharedApplication] openURL:url]; - - if ([url.scheme hasPrefix:@"http"] && !opened) { - NSOperatingSystemVersion iOS8Version = { .majorVersion = 8, .minorVersion = 0, .patchVersion = 0 }; - if (![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS8Version]) { - // Safari openURL calls can wrongly return NO on iOS 7 so manually overwrite that case to YES. - // Otherwise we would rather trust in the actual result of openURL - opened = YES; - } - } - if (handler) { - handler(opened, nil); - } - } - }); -} - -- (void)openBridgeAPIRequest:(FBSDKBridgeAPIRequest *)request - useSafariViewController:(BOOL)useSafariViewController - fromViewController:(UIViewController *)fromViewController - completionBlock:(FBSDKBridgeAPICallbackBlock)completionBlock -{ - if (!request) { - return; - } - NSError *error; - NSURL *requestURL = [request requestURL:&error]; - if (!requestURL) { - FBSDKBridgeAPIResponse *response = [FBSDKBridgeAPIResponse bridgeAPIResponseWithRequest:request error:error]; - completionBlock(response); - return; - } - _pendingRequest = request; - _pendingRequestCompletionBlock = [completionBlock copy]; - void (^handler)(BOOL, NSError *) = ^(BOOL openedURL, NSError *anError) { - if (!openedURL) { - _pendingRequest = nil; - _pendingRequestCompletionBlock = nil; - NSError *openedURLError; - if ([request.scheme hasPrefix:@"http"]) { - openedURLError = [FBSDKError errorWithCode:FBSDKBrowserUnavailableErrorCode - message:@"the app switch failed because the browser is unavailable"]; - } else { - openedURLError = [FBSDKError errorWithCode:FBSDKAppVersionUnsupportedErrorCode - message:@"the app switch failed because the destination app is out of date"]; - } - FBSDKBridgeAPIResponse *response = [FBSDKBridgeAPIResponse bridgeAPIResponseWithRequest:request - error:openedURLError]; - completionBlock(response); - return; - } - }; - if (useSafariViewController) { - [self openURLWithSafariViewController:requestURL sender:nil fromViewController:fromViewController handler:handler]; - } else { - [self openURL:requestURL sender:nil handler:handler]; - } -} - -- (void)openURLWithSafariViewController:(NSURL *)url - sender:(id)sender - fromViewController:(UIViewController *)fromViewController - handler:(void(^)(BOOL, NSError *))handler -{ - if (![url.scheme hasPrefix:@"http"]) { - [self openURL:url sender:sender handler:handler]; - return; - } - - _expectingBackground = NO; - _pendingURLOpen = sender; - - if ([sender isAuthenticationURL:url]) { - Class SFAuthenticationSessionClass = fbsdkdfl_SFAuthenticationSessionClass(); - if (SFAuthenticationSessionClass != nil) { - _authenticationSession = [[SFAuthenticationSessionClass alloc] initWithURL:url callbackURLScheme:[FBSDKInternalUtility appURLScheme] completionHandler:^ (NSURL *aURL, NSError *error) { - handler(error == nil, error); - if (error == nil) { - [self application:[UIApplication sharedApplication] openURL:aURL sourceApplication:@"com.apple" annotation:nil]; - } - _authenticationSession = nil; - }]; - [_authenticationSession start]; - return; - } - } - - // trying to dynamically load SFSafariViewController class - // so for the cases when it is available we can send users through Safari View Controller flow - // in cases it is not available regular flow will be selected - Class SFSafariViewControllerClass = fbsdkdfl_SFSafariViewControllerClass(); - - if (SFSafariViewControllerClass) { - UIViewController *parent = fromViewController ?: [FBSDKInternalUtility topMostViewController]; - if (parent == nil) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"There are no valid ViewController to present SafariViewController with", nil]; - return; - } - - NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; - NSURLQueryItem *sfvcQueryItem = [[NSURLQueryItem alloc] initWithName:@"sfvc" value:@"1"]; - [components setQueryItems:[components.queryItems arrayByAddingObject:sfvcQueryItem]]; - url = components.URL; - FBSDKContainerViewController *container = [[FBSDKContainerViewController alloc] init]; - container.delegate = self; - if (parent.transitionCoordinator != nil) { - // Wait until the transition is finished before presenting SafariVC to avoid a blank screen. - [parent.transitionCoordinator animateAlongsideTransition:NULL completion:^(id context) { - // Note SFVC init must occur inside block to avoid blank screen. - _safariViewController = [[SFSafariViewControllerClass alloc] initWithURL:url]; - // Disable dismissing with edge pan gesture - _safariViewController.modalPresentationStyle = UIModalPresentationOverFullScreen; - [_safariViewController performSelector:@selector(setDelegate:) withObject:self]; - [container displayChildController:_safariViewController]; - [parent presentViewController:container animated:YES completion:nil]; - }]; - } else { - _safariViewController = [[SFSafariViewControllerClass alloc] initWithURL:url]; - // Disable dismissing with edge pan gesture - _safariViewController.modalPresentationStyle = UIModalPresentationOverFullScreen; - [_safariViewController performSelector:@selector(setDelegate:) withObject:self]; - [container displayChildController:_safariViewController]; - [parent presentViewController:container animated:YES completion:nil]; - } - - // Assuming Safari View Controller always opens - if (handler) { - handler(YES, nil); - } - } else { - [self openURL:url sender:sender handler:handler]; - } -} - -#pragma mark -- SFSafariViewControllerDelegate - -// This means the user tapped "Done" which we should treat as a cancellation. -- (void)safariViewControllerDidFinish:(UIViewController *)safariViewController -{ - if (_pendingURLOpen) { - id pendingURLOpen = _pendingURLOpen; - - _pendingURLOpen = nil; - - [pendingURLOpen application:nil - openURL:nil - sourceApplication:nil - annotation:nil]; - - } - [self _cancelBridgeRequest]; - _safariViewController = nil; -} - -#pragma mark -- FBSDKContainerViewControllerDelegate - -- (void)viewControllerDidDisappear:(FBSDKContainerViewController *)viewController animated:(BOOL)animated -{ - if (_safariViewController) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - logEntry:@"**ERROR**:\n The SFSafariViewController's parent view controller was dismissed.\n" - "This can happen if you are triggering login from a UIAlertController. Instead, make sure your top most view " - "controller will not be prematurely dismissed."]; - [self safariViewControllerDidFinish:_safariViewController]; - } -} - -#endif - -#pragma mark - Helper Methods - -- (void)_logIfAppLinkEvent:(NSURL *)url -{ - if (!url) { - return; - } - NSDictionary *params = [FBSDKUtility dictionaryWithQueryString:url.query]; - NSString *applinkDataString = params[@"al_applink_data"]; - if (!applinkDataString) { - return; - } - - NSDictionary *applinkData = [FBSDKInternalUtility objectForJSONString:applinkDataString error:NULL]; - if (!applinkData) { - return; - } - - NSString *targetURLString = applinkData[@"target_url"]; - NSURL *targetURL = [targetURLString isKindOfClass:[NSString class]] ? [NSURL URLWithString:targetURLString] : nil; - - NSMutableDictionary *logData = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:logData setObject:[targetURL absoluteString] forKey:@"targetURL"]; - [FBSDKInternalUtility dictionary:logData setObject:[targetURL host] forKey:@"targetURLHost"]; - - NSDictionary *refererData = applinkData[@"referer_data"]; - if (refererData) { - [FBSDKInternalUtility dictionary:logData setObject:refererData[@"target_url"] forKey:@"referralTargetURL"]; - [FBSDKInternalUtility dictionary:logData setObject:refererData[@"url"] forKey:@"referralURL"]; - [FBSDKInternalUtility dictionary:logData setObject:refererData[@"app_name"] forKey:@"referralAppName"]; - } - [FBSDKInternalUtility dictionary:logData setObject:[url absoluteString] forKey:@"inputURL"]; - [FBSDKInternalUtility dictionary:logData setObject:[url scheme] forKey:@"inputURLScheme"]; - - [FBSDKAppEvents logImplicitEvent:FBSDKAppLinkInboundEvent - valueToSum:nil - parameters:logData - accessToken:nil]; -} - -- (void)_logSDKInitialize -{ - NSMutableDictionary *params = [NSMutableDictionary new]; - [params setObject:@1 forKey:@"core_lib_included"]; - if (objc_lookUpClass("FBSDKShareDialog") != nil) { - [params setObject:@1 forKey:@"share_lib_included"]; - } - if (objc_lookUpClass("FBSDKLoginManager") != nil) { - [params setObject:@1 forKey:@"login_lib_included"]; - } - if (objc_lookUpClass("FBSDKPlacesManager") != nil) { - [params setObject:@1 forKey:@"places_lib_included"]; - } - if (objc_lookUpClass("FBSDKMessengerButton") != nil) { - [params setObject:@1 forKey:@"messenger_lib_included"]; - } - if (objc_lookUpClass("FBSDKMessengerButton") != nil) { - [params setObject:@1 forKey:@"messenger_lib_included"]; - } - if (objc_lookUpClass("FBSDKTVInterfaceFactory.m") != nil) { - [params setObject:@1 forKey:@"tv_lib_included"]; - } - [FBSDKAppEvents logEvent:@"fb_sdk_initialize" parameters:params]; -} - -#pragma mark -- (non-tvos) -#if !TARGET_OS_TV -- (BOOL)_handleBridgeAPIResponseURL:(NSURL *)responseURL sourceApplication:(NSString *)sourceApplication -{ - FBSDKBridgeAPIRequest *request = _pendingRequest; - FBSDKBridgeAPICallbackBlock completionBlock = _pendingRequestCompletionBlock; - _pendingRequest = nil; - _pendingRequestCompletionBlock = NULL; - if (![responseURL.scheme isEqualToString:[FBSDKInternalUtility appURLScheme]]) { - return NO; - } - if (![responseURL.host isEqualToString:@"bridge"]) { - return NO; - } - if (!request) { - return NO; - } - if (!completionBlock) { - return YES; - } - NSError *error; - FBSDKBridgeAPIResponse *response = [FBSDKBridgeAPIResponse bridgeAPIResponseWithRequest:request - responseURL:responseURL - sourceApplication:sourceApplication - error:&error]; - if (response) { - completionBlock(response); - return YES; - } else if (error) { - completionBlock([FBSDKBridgeAPIResponse bridgeAPIResponseWithRequest:request error:error]); - return YES; - } else { - return NO; - } -} - -- (void)_cancelBridgeRequest -{ - if (_pendingRequest && _pendingRequestCompletionBlock) { - _pendingRequestCompletionBlock([FBSDKBridgeAPIResponse bridgeAPIResponseCancelledWithRequest:_pendingRequest]); - } - _pendingRequest = nil; - _pendingRequestCompletionBlock = NULL; -} -#endif - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h deleted file mode 100644 index ca539660c..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - A base class for common SDK buttons. - */ -@interface FBSDKButton : UIButton - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.m deleted file mode 100644 index 91690e3c1..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.m +++ /dev/null @@ -1,457 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKButton.h" -#import "FBSDKButton+Subclass.h" - -#import "FBSDKAccessToken.h" -#import "FBSDKAppEvents+Internal.h" -#import "FBSDKAppEvents.h" -#import "FBSDKApplicationDelegate+Internal.h" -#import "FBSDKLogo.h" -#import "FBSDKMath.h" -#import "FBSDKUIUtility.h" -#import "FBSDKViewImpressionTracker.h" - -#define HEIGHT_TO_FONT_SIZE 0.47 -#define HEIGHT_TO_MARGIN 0.27 -#define HEIGHT_TO_PADDING 0.23 -#define HEIGHT_TO_TEXT_PADDING_CORRECTION 0.08 - -@implementation FBSDKButton -{ - BOOL _skipIntrinsicContentSizing; - BOOL _isExplicitlyDisabled; -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithFrame:(CGRect)frame -{ - if ((self = [super initWithFrame:frame])) { - _skipIntrinsicContentSizing = YES; - [self configureButton]; - _skipIntrinsicContentSizing = NO; - } - return self; -} - -- (void)awakeFromNib -{ - [super awakeFromNib]; - _skipIntrinsicContentSizing = YES; - [self configureButton]; - _skipIntrinsicContentSizing = NO; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - Properties - -- (void)setEnabled:(BOOL)enabled -{ - _isExplicitlyDisabled = !enabled; - [self checkImplicitlyDisabled]; -} - -#pragma mark - Layout - -- (CGRect)imageRectForContentRect:(CGRect)contentRect -{ - if ([self isHidden] || CGRectIsEmpty(self.bounds)) { - return CGRectZero; - } - CGRect imageRect = UIEdgeInsetsInsetRect(contentRect, self.imageEdgeInsets); - CGFloat margin = [self _marginForHeight:[self _heightForContentRect:contentRect]]; - imageRect = CGRectInset(imageRect, margin, margin); - imageRect.size.width = CGRectGetHeight(imageRect); - return imageRect; -} - -- (CGSize)intrinsicContentSize -{ - if (_skipIntrinsicContentSizing) { - return CGSizeZero; - } - _skipIntrinsicContentSizing = YES; - CGSize size = [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; - _skipIntrinsicContentSizing = NO; - return size; -} - -- (void)layoutSubviews -{ - // automatic impression tracking if the button conforms to FBSDKButtonImpressionTracking - if ([self conformsToProtocol:@protocol(FBSDKButtonImpressionTracking)]) { - NSString *eventName = [(id)self impressionTrackingEventName]; - NSString *identifier = [(id)self impressionTrackingIdentifier]; - NSDictionary *parameters = [(id)self analyticsParameters]; - if (eventName && identifier) { - FBSDKViewImpressionTracker *impressionTracker = [FBSDKViewImpressionTracker impressionTrackerWithEventName:eventName]; - [impressionTracker logImpressionWithIdentifier:identifier parameters:parameters]; - } - } - [super layoutSubviews]; -} - -- (CGSize)sizeThatFits:(CGSize)size -{ - if ([self isHidden]) { - return CGSizeZero; - } - CGSize normalSize = [self sizeThatFits:size title:[self titleForState:UIControlStateNormal]]; - CGSize selectedSize = [self sizeThatFits:size title:[self titleForState:UIControlStateSelected]]; - return CGSizeMake(MAX(normalSize.width, selectedSize.width), MAX(normalSize.height, selectedSize.height)); -} - -- (void)sizeToFit -{ - CGRect bounds = self.bounds; - bounds.size = [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; - self.bounds = bounds; -} - -- (CGRect)titleRectForContentRect:(CGRect)contentRect -{ - if ([self isHidden] || CGRectIsEmpty(self.bounds)) { - return CGRectZero; - } - CGRect imageRect = [self imageRectForContentRect:contentRect]; - CGFloat height = [self _heightForContentRect:contentRect]; - CGFloat padding = [self _paddingForHeight:height]; - CGFloat titleX = CGRectGetMaxX(imageRect) + padding; - CGRect titleRect = CGRectMake(titleX, 0.0, CGRectGetWidth(contentRect) - titleX, CGRectGetHeight(contentRect)); - - UIEdgeInsets titleEdgeInsets = UIEdgeInsetsZero; - if (!self.layer.needsLayout) { - UILabel *titleLabel = self.titleLabel; - if (titleLabel.textAlignment == NSTextAlignmentCenter) { - // if the text is centered, we need to adjust the frame for the titleLabel based on the size of the text in order - // to keep the text centered in the button without adding extra blank space to the right when unnecessary - // 1. the text fits centered within the button without colliding with the image (imagePaddingWidth) - // 2. the text would run into the image, so adjust the insets to effectively left align it (textPaddingWidth) - CGSize titleSize = FBSDKTextSize(titleLabel.text, - titleLabel.font, - titleRect.size, - titleLabel.lineBreakMode); - CGFloat titlePaddingWidth = (CGRectGetWidth(titleRect) - titleSize.width) / 2; - CGFloat imagePaddingWidth = titleX / 2; - CGFloat inset = MIN(titlePaddingWidth, imagePaddingWidth); - titleEdgeInsets.left -= inset; - titleEdgeInsets.right += inset; - } - } - return UIEdgeInsetsInsetRect(titleRect, titleEdgeInsets); -} - -#pragma mark - Subclass Methods - -- (void)logTapEventWithEventName:(NSString *)eventName parameters:(NSDictionary *)parameters -{ - [FBSDKAppEvents logImplicitEvent:eventName - valueToSum:nil - parameters:parameters - accessToken:[FBSDKAccessToken currentAccessToken]]; -} - -- (void)checkImplicitlyDisabled -{ - BOOL enabled = !_isExplicitlyDisabled && ![self isImplicitlyDisabled]; - BOOL currentEnabled = [self isEnabled]; - [super setEnabled:enabled]; - if (currentEnabled != enabled) { - [self invalidateIntrinsicContentSize]; - [self setNeedsLayout]; - } -} - -- (void)configureButton -{ - [self configureWithIcon:[[self class] defaultIcon] - title:nil - backgroundColor:[[self class] defaultBackgroundColor] - highlightedColor:[[self class] defaultHighlightedColor]]; -} - -- (void)configureWithIcon:(FBSDKIcon *)icon - title:(NSString *)title - backgroundColor:(UIColor *)backgroundColor - highlightedColor:(UIColor *)highlightedColor -{ - [self _configureWithIcon:icon - title:title - backgroundColor:backgroundColor - highlightedColor:highlightedColor - selectedTitle:nil - selectedIcon:nil - selectedColor:nil - selectedHighlightedColor:nil]; -} - -- (void)configureWithIcon:(FBSDKIcon *)icon - title:(NSString *)title - backgroundColor:(UIColor *)backgroundColor - highlightedColor:(UIColor *)highlightedColor - selectedTitle:(NSString *)selectedTitle - selectedIcon:(FBSDKIcon *)selectedIcon - selectedColor:(UIColor *)selectedColor - selectedHighlightedColor:(UIColor *)selectedHighlightedColor -{ - if (!selectedColor) { - selectedColor = [self defaultSelectedColor]; - } - if (!selectedHighlightedColor) { - selectedHighlightedColor = highlightedColor; - } - [self _configureWithIcon:icon - title:title - backgroundColor:backgroundColor - highlightedColor:highlightedColor - selectedTitle:selectedTitle - selectedIcon:selectedIcon - selectedColor:selectedColor - selectedHighlightedColor:selectedHighlightedColor]; -} - -- (UIColor *)defaultBackgroundColor -{ - return [UIColor colorWithRed:65.0/255.0 green:93.0/255.0 blue:174.0/255.0 alpha:1.0]; -} - -- (UIColor *)defaultDisabledColor -{ - return [UIColor colorWithRed:189.0/255.0 green:193.0/255.0 blue:201.0/255.0 alpha:1.0]; -} - -- (UIFont *)defaultFont -{ - return [UIFont systemFontOfSize:14]; -} - -- (UIColor *)defaultHighlightedColor -{ - return [UIColor colorWithRed:47.0/255.0 green:71.0/255.0 blue:122.0/255.0 alpha:1.0]; -} - -- (FBSDKIcon *)defaultIcon -{ - return [[FBSDKLogo alloc] init]; -} - -- (UIColor *)defaultSelectedColor -{ - return [UIColor colorWithRed:124.0/255.0 green:143.0/255.0 blue:200.0/255.0 alpha:1.0]; -} - -- (BOOL)isImplicitlyDisabled -{ - return NO; -} - -- (CGSize)sizeThatFits:(CGSize)size title:(NSString *)title -{ - UIFont *font = self.titleLabel.font; - CGFloat height = [self _heightForFont:font]; - - UIEdgeInsets contentEdgeInsets = self.contentEdgeInsets; - - CGSize constrainedContentSize = FBSDKEdgeInsetsInsetSize(size, contentEdgeInsets); - - CGSize titleSize = FBSDKTextSize(title, font, constrainedContentSize, self.titleLabel.lineBreakMode); - - CGFloat padding = [self _paddingForHeight:height]; - CGFloat textPaddingCorrection = [self _textPaddingCorrectionForHeight:height]; - CGSize contentSize = CGSizeMake(height + padding + titleSize.width - textPaddingCorrection, height); - return FBSDKEdgeInsetsOutsetSize(contentSize, contentEdgeInsets); -} - -#pragma mark - Helper Methods - -- (void)_applicationDidBecomeActiveNotification:(NSNotification *)notification -{ - [self checkImplicitlyDisabled]; -} - -- (UIImage *)_backgroundImageWithColor:(UIColor *)color cornerRadius:(CGFloat)cornerRadius scale:(CGFloat)scale -{ - CGFloat size = 1.0 + 2 * cornerRadius; - UIGraphicsBeginImageContextWithOptions(CGSizeMake(size, size), NO, scale); - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextSetFillColorWithColor(context, color.CGColor); - CGMutablePathRef path = CGPathCreateMutable(); - CGPathMoveToPoint(path, NULL, cornerRadius + 1.0, 0.0); - CGPathAddArcToPoint(path, NULL, size, 0.0, size, cornerRadius, cornerRadius); - CGPathAddLineToPoint(path, NULL, size, cornerRadius + 1.0); - CGPathAddArcToPoint(path, NULL, size, size, cornerRadius + 1.0, size, cornerRadius); - CGPathAddLineToPoint(path, NULL, cornerRadius, size); - CGPathAddArcToPoint(path, NULL, 0.0, size, 0.0, cornerRadius + 1.0, cornerRadius); - CGPathAddLineToPoint(path, NULL, 0.0, cornerRadius); - CGPathAddArcToPoint(path, NULL, 0.0, 0.0, cornerRadius, 0.0, cornerRadius); - CGPathCloseSubpath(path); - CGContextAddPath(context, path); - CGPathRelease(path); - CGContextFillPath(context); - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); -#if TARGET_OS_TV - return [image resizableImageWithCapInsets:UIEdgeInsetsMake(cornerRadius, cornerRadius, cornerRadius, cornerRadius) - resizingMode:UIImageResizingModeStretch]; -#else - return [image stretchableImageWithLeftCapWidth:cornerRadius topCapHeight:cornerRadius]; -#endif -} - -- (void)_configureWithIcon:(FBSDKIcon *)icon - title:(NSString *)title - backgroundColor:(UIColor *)backgroundColor - highlightedColor:(UIColor *)highlightedColor - selectedTitle:(NSString *)selectedTitle - selectedIcon:(FBSDKIcon *)selectedIcon - selectedColor:(UIColor *)selectedColor - selectedHighlightedColor:(UIColor *)selectedHighlightedColor -{ - [self checkImplicitlyDisabled]; - - if (!icon) { - icon = [self defaultIcon]; - } - if (!backgroundColor) { - backgroundColor = [self defaultBackgroundColor]; - } - if (!highlightedColor) { - highlightedColor = [self defaultHighlightedColor]; - } - - self.adjustsImageWhenDisabled = NO; - self.adjustsImageWhenHighlighted = NO; - self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; - self.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; - self.tintColor = [UIColor whiteColor]; - - BOOL forceSizeToFit = CGRectIsEmpty(self.bounds); - - CGFloat scale = [UIScreen mainScreen].scale; - UIImage *backgroundImage; - - backgroundImage = [self _backgroundImageWithColor:backgroundColor cornerRadius:3.0 scale:scale]; - [self setBackgroundImage:backgroundImage forState:UIControlStateNormal]; -#if TARGET_OS_TV - [self setBackgroundImage:backgroundImage forState:UIControlStateFocused]; -#endif - - backgroundImage = [self _backgroundImageWithColor:highlightedColor cornerRadius:3.0 scale:scale]; - [self setBackgroundImage:backgroundImage forState:UIControlStateHighlighted]; - - backgroundImage = [self _backgroundImageWithColor:[self defaultDisabledColor] cornerRadius:3.0 scale:scale]; - [self setBackgroundImage:backgroundImage forState:UIControlStateDisabled]; - - if (selectedColor) { - backgroundImage = [self _backgroundImageWithColor:selectedColor cornerRadius:3.0 scale:scale]; - [self setBackgroundImage:backgroundImage forState:UIControlStateSelected]; - } - - if (selectedHighlightedColor) { - backgroundImage = [self _backgroundImageWithColor:selectedHighlightedColor cornerRadius:3.0 scale:scale]; - [self setBackgroundImage:backgroundImage forState:UIControlStateSelected | UIControlStateHighlighted]; -#if TARGET_OS_TV - [self setBackgroundImage:backgroundImage forState:UIControlStateSelected | UIControlStateFocused]; -#endif - } - - [self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - - [self setTitle:title forState:UIControlStateNormal]; -#if TARGET_OS_TV - [self setTitle:title forState:UIControlStateFocused]; -#endif - if (selectedTitle) { - [self setTitle:selectedTitle forState:UIControlStateSelected]; - [self setTitle:selectedTitle forState:UIControlStateSelected | UIControlStateHighlighted]; -#if TARGET_OS_TV - [self setTitle:selectedTitle forState:UIControlStateSelected | UIControlStateFocused]; -#endif - } - - UILabel *titleLabel = self.titleLabel; - titleLabel.lineBreakMode = NSLineBreakByClipping; - UIFont *font = [self defaultFont]; - titleLabel.font = font; - - CGSize imageSize = CGSizeMake(font.pointSize, font.pointSize); - UIImage *image = [icon imageWithSize:imageSize]; - image = [image resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeStretch]; - [self setImage:image forState:UIControlStateNormal]; -#if TARGET_OS_TV - [self setImage:image forState:UIControlStateFocused]; -#endif - - if (selectedIcon) { - UIImage *selectedImage = [selectedIcon imageWithSize:imageSize]; - selectedImage = [selectedImage resizableImageWithCapInsets:UIEdgeInsetsZero - resizingMode:UIImageResizingModeStretch]; - [self setImage:selectedImage forState:UIControlStateSelected]; - [self setImage:selectedImage forState:UIControlStateSelected | UIControlStateHighlighted]; -#if TARGET_OS_TV - [self setImage:selectedImage forState:UIControlStateSelected | UIControlStateFocused]; -#endif - } - - if (forceSizeToFit) { - [self sizeToFit]; - } - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_applicationDidBecomeActiveNotification:) - name:FBSDKApplicationDidBecomeActiveNotification - object:[FBSDKApplicationDelegate sharedInstance]]; -} - -- (CGFloat)_fontSizeForHeight:(CGFloat)height -{ - return floorf(height * HEIGHT_TO_FONT_SIZE); -} - -- (CGFloat)_heightForContentRect:(CGRect)contentRect -{ - UIEdgeInsets contentEdgeInsets = self.contentEdgeInsets; - return contentEdgeInsets.top + CGRectGetHeight(contentRect) + contentEdgeInsets.bottom; -} - -- (CGFloat)_heightForFont:(UIFont *)font -{ - return floorf(font.pointSize / (1 - 2 * HEIGHT_TO_MARGIN)); -} - -- (CGFloat)_marginForHeight:(CGFloat)height -{ - return floorf(height * HEIGHT_TO_MARGIN); -} - -- (CGFloat)_paddingForHeight:(CGFloat)height -{ - return roundf(height * HEIGHT_TO_PADDING) - [self _textPaddingCorrectionForHeight:height]; -} - -- (CGFloat)_textPaddingCorrectionForHeight:(CGFloat)height -{ - return floorf(height * HEIGHT_TO_TEXT_PADDING_CORRECTION); -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h deleted file mode 100644 index 98cfd73c3..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - The error domain for all errors from FBSDKCoreKit. - - Error codes from the SDK in the range 0-99 are reserved for this domain. - */ -FBSDK_EXTERN NSString *const FBSDKErrorDomain; - -/** - NS_ENUM(NSInteger, FBSDKErrorCode) - Error codes for FBSDKErrorDomain. - */ -typedef NS_ENUM(NSInteger, FBSDKErrorCode) -{ - /** - Reserved. - */ - FBSDKReservedErrorCode = 0, - - /** - The error code for errors from invalid encryption on incoming encryption URLs. - */ - FBSDKEncryptionErrorCode, - - /** - The error code for errors from invalid arguments to SDK methods. - */ - FBSDKInvalidArgumentErrorCode, - - /** - The error code for unknown errors. - */ - FBSDKUnknownErrorCode, - - /** - A request failed due to a network error. Use NSUnderlyingErrorKey to retrieve - the error object from the NSURLConnection for more information. - */ - FBSDKNetworkErrorCode, - - /** - The error code for errors encountered during an App Events flush. - */ - FBSDKAppEventsFlushErrorCode, - - /** - An endpoint that returns a binary response was used with FBSDKGraphRequestConnection. - - Endpoints that return image/jpg, etc. should be accessed using NSURLRequest - */ - FBSDKGraphRequestNonTextMimeTypeReturnedErrorCode, - - /** - The operation failed because the server returned an unexpected response. - - You can get this error if you are not using the most recent SDK, or you are accessing a version of the - Graph API incompatible with the current SDK. - */ - FBSDKGraphRequestProtocolMismatchErrorCode, - - /** - The Graph API returned an error. - - See below for useful userInfo keys (beginning with FBSDKGraphRequestError*) - */ - FBSDKGraphRequestGraphAPIErrorCode, - - /** - The specified dialog configuration is not available. - - This error may signify that the configuration for the dialogs has not yet been downloaded from the server - or that the dialog is unavailable. Subsequent attempts to use the dialog may succeed as the configuration is loaded. - */ - FBSDKDialogUnavailableErrorCode, - - /** - Indicates an operation failed because a required access token was not found. - */ - FBSDKAccessTokenRequiredErrorCode, - - /** - Indicates an app switch (typically for a dialog) failed because the destination app is out of date. - */ - FBSDKAppVersionUnsupportedErrorCode, - - /** - Indicates an app switch to the browser (typically for a dialog) failed. - */ - FBSDKBrowserUnavailableErrorCode, - - /** - -- Warning:use FBSDKBrowserUnavailableErrorCode instead - */ - FBSDKBrowswerUnavailableErrorCode __attribute__ ((deprecated("use FBSDKBrowserUnavailableErrorCode instead"))) = FBSDKBrowserUnavailableErrorCode, -}; - -/** - NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory) - Describes the category of Facebook error. See `FBSDKGraphRequestErrorCategoryKey`. - */ -typedef NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory) -{ - /** The default error category that is not known to be recoverable. Check `FBSDKLocalizedErrorDescriptionKey` for a user facing message. */ - FBSDKGraphRequestErrorCategoryOther = 0, - /** Indicates the error is temporary (such as server throttling). While a recoveryAttempter will be provided with the error instance, the attempt is guaranteed to succeed so you can simply retry the operation if you do not want to present an alert. */ - FBSDKGraphRequestErrorCategoryTransient = 1, - /** Indicates the error can be recovered (such as requiring a login). A recoveryAttempter will be provided with the error instance that can take UI action. */ - FBSDKGraphRequestErrorCategoryRecoverable = 2 -}; - -/* - @methodgroup error userInfo keys - */ - -/** - The userInfo key for the invalid collection for errors with FBSDKInvalidArgumentErrorCode. - - If the invalid argument is a collection, the collection can be found with this key and the individual - invalid item can be found with FBSDKErrorArgumentValueKey. - */ -FBSDK_EXTERN NSString *const FBSDKErrorArgumentCollectionKey; - -/** - The userInfo key for the invalid argument name for errors with FBSDKInvalidArgumentErrorCode. - */ -FBSDK_EXTERN NSString *const FBSDKErrorArgumentNameKey; - -/** - The userInfo key for the invalid argument value for errors with FBSDKInvalidArgumentErrorCode. - */ -FBSDK_EXTERN NSString *const FBSDKErrorArgumentValueKey; - -/** - The userInfo key for the message for developers in NSErrors that originate from the SDK. - - The developer message will not be localized and is not intended to be presented within the app. - */ -FBSDK_EXTERN NSString *const FBSDKErrorDeveloperMessageKey; - -/** - The userInfo key describing a localized description that can be presented to the user. - */ -FBSDK_EXTERN NSString *const FBSDKErrorLocalizedDescriptionKey; - -/** - The userInfo key describing a localized title that can be presented to the user, used with `FBSDKLocalizedErrorDescriptionKey`. - */ -FBSDK_EXTERN NSString *const FBSDKErrorLocalizedTitleKey; - -/* - @methodgroup FBSDKGraphRequest error userInfo keys - */ - -/** - The userInfo key describing the error category, for error recovery purposes. - - See `FBSDKGraphErrorRecoveryProcessor` and `[FBSDKGraphRequest disableErrorRecovery]`. - */ -FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorCategoryKey; - -/* - The userInfo key for the Graph API error code. - */ -FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorGraphErrorCode; - -/* - The userInfo key for the Graph API error subcode. - */ -FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorGraphErrorSubcode; - -/* - The userInfo key for the HTTP status code. - */ -FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorHTTPStatusCodeKey; - -/* - The userInfo key for the raw JSON response. - */ -FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey; - -/** - a formal protocol very similar to the informal protocol NSErrorRecoveryAttempting - */ -@protocol FBSDKErrorRecoveryAttempting - -/** - attempt the recovery - - Parameter error: the error - - Parameter recoveryOptionIndex: the selected option index - - Parameter delegate: the delegate - - Parameter didRecoverSelector: the callback selector, see discussion. - - Parameter contextInfo: context info to pass back to callback selector, see discussion. - - - Given that an error alert has been presented document-modally to the user, and the user has chosen one of the error's recovery options, attempt recovery from the error, and send the selected message to the specified delegate. The option index is an index into the error's array of localized recovery options. The method selected by didRecoverSelector must have the same signature as: - - - (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo; - - The value passed for didRecover must be YES if error recovery was completely successful, NO otherwise. - */ -- (void)attemptRecoveryFromError:(NSError *)error optionIndex:(NSUInteger)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.m deleted file mode 100644 index f3a6ee53e..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.m +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKConstants.h" - -NSString *const FBSDKErrorDomain = @"com.facebook.sdk.core"; - -NSString *const FBSDKErrorArgumentCollectionKey = @"com.facebook.sdk:FBSDKErrorArgumentCollectionKey"; -NSString *const FBSDKErrorArgumentNameKey = @"com.facebook.sdk:FBSDKErrorArgumentNameKey"; -NSString *const FBSDKErrorArgumentValueKey = @"com.facebook.sdk:FBSDKErrorArgumentValueKey"; -NSString *const FBSDKErrorDeveloperMessageKey = @"com.facebook.sdk:FBSDKErrorDeveloperMessageKey"; -NSString *const FBSDKErrorLocalizedDescriptionKey = @"com.facebook.sdk:FBSDKErrorLocalizedDescriptionKey"; -NSString *const FBSDKErrorLocalizedTitleKey = @"com.facebook.sdk:FBSDKErrorLocalizedErrorTitleKey"; - -NSString *const FBSDKGraphRequestErrorCategoryKey = @"com.facebook.sdk:FBSDKGraphRequestErrorCategoryKey"; -NSString *const FBSDKGraphRequestErrorGraphErrorCode = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode"; -NSString *const FBSDKGraphRequestErrorGraphErrorSubcode = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorSubcode"; -NSString *const FBSDKGraphRequestErrorHTTPStatusCodeKey = @"com.facebook.sdk:FBSDKGraphRequestErrorHTTPStatusCodeKey"; -NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey = @"com.facebook.sdk:FBSDKGraphRequestErrorParsedJSONResponseKey"; diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h deleted file mode 100644 index c84975ca4..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - Extension protocol for NSCopying that adds the copy method, which is implemented on NSObject. - - NSObject implicitly conforms to this protocol. - */ -@protocol FBSDKCopying - -/** - Implemented by NSObject as a convenience to copyWithZone:. - - Returns: A copy of the receiver. - */ -- (id)copy; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h deleted file mode 100644 index afa0e371d..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#if !TARGET_OS_TV -#import -#import -#import -#import -#import -#import -#else -#import -#import -#endif - -#define FBSDK_VERSION_STRING @"4.30.0" -#define FBSDK_TARGET_PLATFORM_VERSION @"v2.11" diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h deleted file mode 100644 index 658bc46ee..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKConstants.h" - -@class FBSDKGraphErrorRecoveryProcessor; -@class FBSDKGraphRequest; - -/** - Defines a delegate for `FBSDKGraphErrorRecoveryProcessor`. - */ -@protocol FBSDKGraphErrorRecoveryProcessorDelegate - -/** - Indicates the error recovery has been attempted. - - Parameter processor: the processor instance. - - Parameter didRecover: YES if the recovery was successful. - - Parameter error: the error that that was attempted to be recovered from. - */ -- (void)processorDidAttemptRecovery:(FBSDKGraphErrorRecoveryProcessor *)processor didRecover:(BOOL)didRecover error:(NSError *)error; - -@optional -/** - Indicates the processor is about to process the error. - - Parameter processor: the processor instance. - - Parameter error: the error is about to be processed. - - return NO if the processor should not process the error. For example, - if you want to prevent alerts of localized messages but otherwise perform retries and recoveries, - you could return NO for errors where userInfo[FBSDKGraphRequestErrorCategoryKey] equal to FBSDKGraphRequestErrorCategoryOther - */ -- (BOOL)processorWillProcessError:(FBSDKGraphErrorRecoveryProcessor *)processor error:(NSError *)error; - -@end - -/** - Defines a type that can process Facebook NSErrors with best practices. - - Facebook NSErrors can contain FBSDKErrorRecoveryAttempting instances to recover from errors, or - localized messages to present to the user. This class will process the instances as follows: - - 1. If the error is temporary as indicated by FBSDKGraphRequestErrorCategoryKey, assume the recovery succeeded and - notify the delegate. - 2. If a FBSDKErrorRecoveryAttempting instance is available, display an alert (dispatched to main thread) - with the recovery options and call the instance's [ attemptRecoveryFromError:optionIndex:...]. - 3. If a FBSDKErrorRecoveryAttempting is not available, check the userInfo for FBSDKLocalizedErrorDescriptionKey - and present that in an alert (dispatched to main thread). - - By default, FBSDKGraphRequests use this type to process errors and retry the request upon a successful - recovery. - - Note that Facebook recovery attempters can present UI or even cause app switches (such as to login). Any such - work is dispatched to the main thread (therefore your request handlers may then run on the main thread). - - Login recovery requires FBSDKLoginKit. Login will use FBSDKLoginBehaviorNative and will prompt the user - for all permissions last granted. If any are declined on the new request, the recovery is not successful but - the `[FBSDKAccessToken currentAccessToken]` might still have been updated. - . - */ -@interface FBSDKGraphErrorRecoveryProcessor : NSObject - -/** - Gets the delegate. Note this is a strong reference, and is nil'ed out after recovery is complete. - */ -@property (nonatomic, strong, readonly) iddelegate; - -/** - Attempts to process the error, return YES if the error can be processed. - - Parameter error: the error to process. - - Parameter request: the related request that may be reissued. - - Parameter delegate: the delegate that will be retained until recovery is complete. - */ -- (BOOL)processError:(NSError *)error request:(FBSDKGraphRequest *)request delegate:(id) delegate; - -/** - The callback for FBSDKErrorRecoveryAttempting - - Parameter didRecover: if the recovery succeeded - - Parameter contextInfo: unused - */ -- (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.m deleted file mode 100644 index 498e19a63..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.m +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -#import "FBSDKGraphErrorRecoveryProcessor.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKErrorRecoveryAttempter.h" - -@interface FBSDKGraphErrorRecoveryProcessor() -{ - FBSDKErrorRecoveryAttempter *_recoveryAttempter; - NSError *_error; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - UIAlertView *_alertView; -#pragma clang diagnostic pop -} - -@property (nonatomic, strong, readwrite) iddelegate; - -@end - -@implementation FBSDKGraphErrorRecoveryProcessor - -- (void)dealloc -{ - if (_alertView) { - _alertView.delegate = nil; - } -} - -- (BOOL)processError:(NSError *)error request:(FBSDKGraphRequest *)request delegate:(id) delegate -{ - self.delegate = delegate; - if ([self.delegate respondsToSelector:@selector(processorWillProcessError:error:)]) { - if (![self.delegate processorWillProcessError:self error:error]) { - return NO; - } - } - - FBSDKGraphRequestErrorCategory errorCategory = [error.userInfo[FBSDKGraphRequestErrorCategoryKey] unsignedIntegerValue]; - switch (errorCategory) { - case FBSDKGraphRequestErrorCategoryTransient : - [self.delegate processorDidAttemptRecovery:self didRecover:YES error:nil]; - self.delegate = nil; - return YES; - case FBSDKGraphRequestErrorCategoryRecoverable : - if ([request.tokenString isEqualToString:[FBSDKAccessToken currentAccessToken].tokenString]) { - _recoveryAttempter = error.recoveryAttempter; - BOOL isLoginRecoveryAttempter = [_recoveryAttempter isKindOfClass:NSClassFromString(@"_FBSDKLoginRecoveryAttempter")]; - - // Set up a block to do the typical recovery work so that we can chain it for ios auth special cases. - // the block returns YES if recovery UI is started (meaning we wait for the alertviewdelegate to resume control flow). - BOOL (^standardRecoveryWork)(void) = ^BOOL{ - NSArray *recoveryOptionsTitles = error.userInfo[NSLocalizedRecoveryOptionsErrorKey]; - if (recoveryOptionsTitles.count > 0 && _recoveryAttempter) { - NSString *recoverySuggestion = error.userInfo[NSLocalizedRecoverySuggestionErrorKey]; - _error = error; - dispatch_async(dispatch_get_main_queue(), ^{ - [self displayAlertWithRecoverySuggestion:recoverySuggestion recoveryOptionsTitles:recoveryOptionsTitles]; - }); - return YES; - } - return NO; - }; - - if ([request.tokenString isEqualToString:[[FBSDKSystemAccountStoreAdapter sharedInstance] accessTokenString]] && - isLoginRecoveryAttempter) { - // special system auth case: if user has granted permissions we can simply renew. On a successful - // renew, treat this as immediately recovered without the standard alert prompty. - // (for example, this can repair expired tokens seamlessly) - [[FBSDKSystemAccountStoreAdapter sharedInstance] - renewSystemAuthorization:^(ACAccountCredentialRenewResult result, NSError *renewError) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (result == ACAccountCredentialRenewResultRenewed) { - [self.delegate processorDidAttemptRecovery:self didRecover:YES error:nil]; - self.delegate = nil; - } else if (!standardRecoveryWork()) { - [self.delegate processorDidAttemptRecovery:self didRecover:NO error:_error]; - }; - }); - }]; - // short-circuit YES so that the renew callback resumes the control flow. - return YES; - } - - return standardRecoveryWork(); - } - return NO; - case FBSDKGraphRequestErrorCategoryOther : - if ([request.tokenString isEqualToString:[FBSDKAccessToken currentAccessToken].tokenString]) { - NSString *message = error.userInfo[FBSDKErrorLocalizedDescriptionKey]; - NSString *title = error.userInfo[FBSDKErrorLocalizedTitleKey]; - if (message) { - dispatch_async(dispatch_get_main_queue(), ^{ - NSString *localizedOK = - NSLocalizedStringWithDefaultValue(@"ErrorRecovery.Alert.OK", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"OK", - @"The title of the label to dismiss the alert when presenting user facing error messages"); - [self displayAlertWithTitle:title message:message cancelButtonTitle:localizedOK]; - }); - } - } - return NO; - } - return NO; -} - -#pragma mark - UIAlertView and UIAlertController support - -- (void)displayAlertWithRecoverySuggestion:(NSString *)recoverySuggestion recoveryOptionsTitles:(NSArray *)recoveryOptionsTitles -{ - if ([UIAlertController class]) { - UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil - message:recoverySuggestion - preferredStyle:UIAlertControllerStyleAlert]; - for (NSUInteger i = 0; i < recoveryOptionsTitles.count; i++) { - NSString *title = recoveryOptionsTitles[i]; - UIAlertAction *option = [UIAlertAction actionWithTitle:title - style:UIAlertActionStyleDefault - handler:^(UIAlertAction * _Nonnull action) { - [_recoveryAttempter attemptRecoveryFromError:_error - optionIndex:i - delegate:self - didRecoverSelector:@selector(didPresentErrorWithRecovery:contextInfo:) - contextInfo:nil]; - }]; - [alertController addAction:option]; - } - UIViewController *topMostViewController = [FBSDKInternalUtility topMostViewController]; - [topMostViewController presentViewController:alertController - animated:YES - completion:nil]; - } else { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - _alertView = [[UIAlertView alloc] initWithTitle:nil - message:recoverySuggestion - delegate:self - cancelButtonTitle:nil - otherButtonTitles:nil]; -#pragma clang diagnostic pop - for (NSString *option in recoveryOptionsTitles) { - [_alertView addButtonWithTitle:option]; - } - [_alertView show]; - } -} - -- (void)displayAlertWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)localizedOK -{ - if ([UIAlertController class]) { - UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil - message:message - preferredStyle:UIAlertControllerStyleAlert]; - UIAlertAction *OKAction = [UIAlertAction actionWithTitle:localizedOK - style:UIAlertActionStyleCancel - handler:^(UIAlertAction * _Nonnull action) { - [_recoveryAttempter attemptRecoveryFromError:_error - optionIndex:0 - delegate:self - didRecoverSelector:@selector(didPresentErrorWithRecovery:contextInfo:) - contextInfo:nil]; - }]; - [alertController addAction:OKAction]; - UIViewController *topMostViewController = [FBSDKInternalUtility topMostViewController]; - [topMostViewController presentViewController:alertController - animated:YES - completion:nil]; - } else { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [[[UIAlertView alloc] initWithTitle:title - message:message - delegate:nil - cancelButtonTitle:localizedOK - otherButtonTitles:nil] show]; -#pragma clang diagnostic pop - } -} - -#pragma mark - UIAlertViewDelegate - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex -{ - [_recoveryAttempter attemptRecoveryFromError:_error optionIndex:buttonIndex delegate:self didRecoverSelector:@selector(didPresentErrorWithRecovery:contextInfo:) contextInfo:nil]; - if (_alertView) { - _alertView.delegate = nil; - _alertView = nil; - } -} -#pragma clang diagnostic pop - -#pragma mark - FBSDKErrorRecoveryAttempting "delegate" - -- (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo -{ - [self.delegate processorDidAttemptRecovery:self didRecover:didRecover error:_error]; - self.delegate = nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h deleted file mode 100644 index 2743ec3ad..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@class FBSDKAccessToken; - -/** - Represents a request to the Facebook Graph API. - - - `FBSDKGraphRequest` encapsulates the components of a request (the - Graph API path, the parameters, error recovery behavior) and should be - used in conjunction with `FBSDKGraphRequestConnection` to issue the request. - - Nearly all Graph APIs require an access token. Unless specified, the - `[FBSDKAccessToken currentAccessToken]` is used. Therefore, most requests - will require login first (see `FBSDKLoginManager` in FBSDKLoginKit.framework). - - A `- start` method is provided for convenience for single requests. - - By default, FBSDKGraphRequest will attempt to recover any errors returned from - Facebook. You can disable this via `disableErrorRecovery:`. - -- See:FBSDKGraphErrorRecoveryProcessor - */ -@interface FBSDKGraphRequest : NSObject - -/** - Initializes a new instance that use use `[FBSDKAccessToken currentAccessToken]`. - - Parameter graphPath: the graph path (e.g., @"me"). - - Parameter parameters: the optional parameters dictionary. - */ -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters; - -/** - Initializes a new instance that use use `[FBSDKAccessToken currentAccessToken]`. - - Parameter graphPath: the graph path (e.g., @"me"). - - Parameter parameters: the optional parameters dictionary. - - Parameter HTTPMethod: the optional HTTP method. nil defaults to @"GET". - */ -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters - HTTPMethod:(NSString *)HTTPMethod; - -/** - Initializes a new instance. - - Parameter graphPath: the graph path (e.g., @"me"). - - Parameter parameters: the optional parameters dictionary. - - Parameter tokenString: the token string to use. Specifying nil will cause no token to be used. - - Parameter version: the optional Graph API version (e.g., @"v2.0"). nil defaults to `[FBSDKSettings graphAPIVersion]`. - - Parameter HTTPMethod: the optional HTTP method (e.g., @"POST"). nil defaults to @"GET". - */ -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters - tokenString:(NSString *)tokenString - version:(NSString *)version - HTTPMethod:(NSString *)HTTPMethod -NS_DESIGNATED_INITIALIZER; - -/** - The request parameters. - */ -@property (nonatomic, strong, readonly) NSMutableDictionary *parameters; - -/** - The access token string used by the request. - */ -@property (nonatomic, copy, readonly) NSString *tokenString; - -/** - The Graph API endpoint to use for the request, for example "me". - */ -@property (nonatomic, copy, readonly) NSString *graphPath; - -/** - The HTTPMethod to use for the request, for example "GET" or "POST". - */ -@property (nonatomic, copy, readonly) NSString *HTTPMethod; - -/** - The Graph API version to use (e.g., "v2.0") - */ -@property (nonatomic, copy, readonly) NSString *version; - -/** - If set, disables the automatic error recovery mechanism. - - Parameter disable: whether to disable the automatic error recovery mechanism - - By default, non-batched FBSDKGraphRequest instances will automatically try to recover - from errors by constructing a `FBSDKGraphErrorRecoveryProcessor` instance that - re-issues the request on successful recoveries. The re-issued request will call the same - handler as the receiver but may occur with a different `FBSDKGraphRequestConnection` instance. - - This will override [FBSDKSettings setGraphErrorRecoveryDisabled:]. - */ -- (void)setGraphErrorRecoveryDisabled:(BOOL)disable; - -/** - Starts a connection to the Graph API. - - Parameter handler: The handler block to call when the request completes. - */ -- (FBSDKGraphRequestConnection *)startWithCompletionHandler:(FBSDKGraphRequestHandler)handler; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.m deleted file mode 100644 index 9b91cbd0d..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.m +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKGraphRequest+Internal.h" - -#import - -#import "FBSDKAccessToken.h" -#import "FBSDKCoreKit.h" -#import "FBSDKGraphRequestConnection.h" -#import "FBSDKGraphRequestDataAttachment.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKSettings+Internal.h" - -// constants -static NSString *const kGetHTTPMethod = @"GET"; - -@interface FBSDKGraphRequest() -@property (nonatomic, assign) FBSDKGraphRequestFlags flags; -@end - -@implementation FBSDKGraphRequest - -- (instancetype)init NS_UNAVAILABLE -{ - assert(0); -} - -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters { - return [self initWithGraphPath:graphPath - parameters:parameters - flags:FBSDKGraphRequestFlagNone]; -} - -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters - HTTPMethod:(NSString *)HTTPMethod { - return [self initWithGraphPath:graphPath - parameters:parameters - tokenString:[FBSDKAccessToken currentAccessToken].tokenString - version:nil - HTTPMethod:HTTPMethod]; -} - -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters - flags:(FBSDKGraphRequestFlags)flags { - return [self initWithGraphPath:graphPath - parameters:parameters - tokenString:[FBSDKAccessToken currentAccessToken].tokenString - HTTPMethod:nil - flags:flags]; -} - -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters - tokenString:(NSString *)tokenString - HTTPMethod:(NSString *)HTTPMethod - flags:(FBSDKGraphRequestFlags)flags { - if ((self = [self initWithGraphPath:graphPath - parameters:parameters - tokenString:tokenString - version:[FBSDKSettings graphAPIVersion] - HTTPMethod:HTTPMethod])) { - self.flags |= flags; - } - return self; -} - -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters - tokenString:(NSString *)tokenString - version:(NSString *)version - HTTPMethod:(NSString *)HTTPMethod { - if ((self = [super init])) { - _tokenString = [tokenString copy]; - _version = version ? [version copy] : [FBSDKSettings graphAPIVersion]; - _graphPath = [graphPath copy]; - _HTTPMethod = HTTPMethod ? [HTTPMethod copy] : kGetHTTPMethod; - _parameters = [[NSMutableDictionary alloc] initWithDictionary:parameters]; - if ([FBSDKSettings isGraphErrorRecoveryDisabled]) { - _flags = FBSDKGraphRequestFlagDisableErrorRecovery; - } - } - return self; -} - -- (BOOL)isGraphErrorRecoveryDisabled -{ - return (self.flags & FBSDKGraphRequestFlagDisableErrorRecovery); -} - -- (void)setGraphErrorRecoveryDisabled:(BOOL)disable -{ - if (disable) { - self.flags |= FBSDKGraphRequestFlagDisableErrorRecovery; - } else { - self.flags &= ~FBSDKGraphRequestFlagDisableErrorRecovery; - } -} - -- (BOOL)hasAttachments -{ - __block BOOL hasAttachments = NO; - [self.parameters enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - if ([FBSDKGraphRequest isAttachment:obj]) { - hasAttachments = YES; - *stop = YES; - } - }]; - return hasAttachments; -} - -+ (BOOL)isAttachment:(id)item -{ - return ([item isKindOfClass:[UIImage class]] || - [item isKindOfClass:[NSData class]] || - [item isKindOfClass:[FBSDKGraphRequestDataAttachment class]]); -} - - -+ (NSString *)serializeURL:(NSString *)baseUrl - params:(NSDictionary *)params { - return [self serializeURL:baseUrl params:params httpMethod:kGetHTTPMethod]; -} - -+ (NSString *)serializeURL:(NSString *)baseUrl - params:(NSDictionary *)params - httpMethod:(NSString *)httpMethod { - params = [self preprocessParams: params]; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - NSURL *parsedURL = [NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; -#pragma clang pop - NSString *queryPrefix = parsedURL.query ? @"&" : @"?"; - - NSString *query = [FBSDKInternalUtility queryStringWithDictionary:params error:NULL invalidObjectHandler:^id(id object, BOOL *stop) { - if ([self isAttachment:object]) { - if ([httpMethod isEqualToString:kGetHTTPMethod]) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"can not use GET to upload a file"]; - } - return nil; - } - return object; - }]; - return [NSString stringWithFormat:@"%@%@%@", baseUrl, queryPrefix, query]; -} - -+ (NSDictionary *)preprocessParams:(NSDictionary *)params -{ - NSString *debugValue = [FBSDKSettings graphAPIDebugParamValue]; - if (debugValue) { - NSMutableDictionary *mutableParams = [NSMutableDictionary dictionaryWithDictionary:params]; - [mutableParams setObject:debugValue forKey:@"debug"]; - return mutableParams; - } - - return params; -} - -- (FBSDKGraphRequestConnection *)startWithCompletionHandler:(FBSDKGraphRequestHandler)handler -{ - FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; - [connection addRequest:self completionHandler:handler]; - [connection start]; - return connection; -} - -#pragma mark - Debugging helpers - -- (NSString *)description -{ - NSMutableString *result = [NSMutableString stringWithFormat:@"<%@: %p", - NSStringFromClass([self class]), - self]; - if (self.graphPath) { - [result appendFormat:@", graphPath: %@", self.graphPath]; - } - if (self.HTTPMethod) { - [result appendFormat:@", HTTPMethod: %@", self.HTTPMethod]; - } - [result appendFormat:@", parameters: %@>", [self.parameters description]]; - return result; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h deleted file mode 100644 index 3eca5840f..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h +++ /dev/null @@ -1,323 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@class FBSDKGraphRequest; -@class FBSDKGraphRequestConnection; - -/** - FBSDKGraphRequestHandler - - A block that is passed to addRequest to register for a callback with the results of that - request once the connection completes. - - - - Pass a block of this type when calling addRequest. This will be called once - the request completes. The call occurs on the UI thread. - - - Parameter connection: The `FBSDKGraphRequestConnection` that sent the request. - - - Parameter result: The result of the request. This is a translation of - JSON data to `NSDictionary` and `NSArray` objects. This - is nil if there was an error. - - - Parameter error: The `NSError` representing any error that occurred. - - */ -typedef void (^FBSDKGraphRequestHandler)(FBSDKGraphRequestConnection *connection, - id result, - NSError *error); - -/** - @protocol - - The `FBSDKGraphRequestConnectionDelegate` protocol defines the methods used to receive network - activity progress information from a . - */ -@protocol FBSDKGraphRequestConnectionDelegate - -@optional - -/** - @method - - Tells the delegate the request connection will begin loading - - - - If the is created using one of the convenience factory methods prefixed with - start, the object returned from the convenience method has already begun loading and this method - will not be called when the delegate is set. - - - Parameter connection: The request connection that is starting a network request - */ -- (void)requestConnectionWillBeginLoading:(FBSDKGraphRequestConnection *)connection; - -/** - @method - - Tells the delegate the request connection finished loading - - - - If the request connection completes without a network error occurring then this method is called. - Invocation of this method does not indicate success of every made, only that the - request connection has no further activity. Use the error argument passed to the FBSDKGraphRequestHandler - block to determine success or failure of each . - - This method is invoked after the completion handler for each . - - - Parameter connection: The request connection that successfully completed a network request - */ -- (void)requestConnectionDidFinishLoading:(FBSDKGraphRequestConnection *)connection; - -/** - @method - - Tells the delegate the request connection failed with an error - - - - If the request connection fails with a network error then this method is called. The `error` - argument specifies why the network connection failed. The `NSError` object passed to the - FBSDKGraphRequestHandler block may contain additional information. - - - Parameter connection: The request connection that successfully completed a network request - - Parameter error: The `NSError` representing the network error that occurred, if any. May be nil - in some circumstances. Consult the `NSError` for the for reliable - failure information. - */ -- (void)requestConnection:(FBSDKGraphRequestConnection *)connection - didFailWithError:(NSError *)error; - -/** - @method - - Tells the delegate how much data has been sent and is planned to send to the remote host - - - - The byte count arguments refer to the aggregated objects, not a particular . - - Like `NSURLConnection`, the values may change in unexpected ways if data needs to be resent. - - - Parameter connection: The request connection transmitting data to a remote host - - Parameter bytesWritten: The number of bytes sent in the last transmission - - Parameter totalBytesWritten: The total number of bytes sent to the remote host - - Parameter totalBytesExpectedToWrite: The total number of bytes expected to send to the remote host - */ -- (void)requestConnection:(FBSDKGraphRequestConnection *)connection - didSendBodyData:(NSInteger)bytesWritten - totalBytesWritten:(NSInteger)totalBytesWritten -totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite; - -@end - -/** - - The `FBSDKGraphRequestConnection` represents a single connection to Facebook to service a request. - - - - The request settings are encapsulated in a reusable object. The - `FBSDKGraphRequestConnection` object encapsulates the concerns of a single communication - e.g. starting a connection, canceling a connection, or batching requests. - - */ -@interface FBSDKGraphRequestConnection : NSObject - -/** - The delegate object that receives updates. - */ -@property (nonatomic, weak) id delegate; - -/** - Gets or sets the timeout interval to wait for a response before giving up. - */ -@property (nonatomic) NSTimeInterval timeout; - -/** - The raw response that was returned from the server. (readonly) - - - - This property can be used to inspect HTTP headers that were returned from - the server. - - The property is nil until the request completes. If there was a response - then this property will be non-nil during the FBSDKGraphRequestHandler callback. - */ -@property (nonatomic, retain, readonly) NSHTTPURLResponse *URLResponse; - -/** - @methodgroup Class methods - */ - -/** - @method - - This method sets the default timeout on all FBSDKGraphRequestConnection instances. Defaults to 60 seconds. - - - Parameter defaultConnectionTimeout: The timeout interval. - */ -+ (void)setDefaultConnectionTimeout:(NSTimeInterval)defaultConnectionTimeout; - -/** - @methodgroup Adding requests - */ - -/** - @method - - This method adds an object to this connection. - - - Parameter request: A request to be included in the round-trip when start is called. - - Parameter handler: A handler to call back when the round-trip completes or times out. - - - - The completion handler is retained until the block is called upon the - completion or cancellation of the connection. - */ -- (void)addRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler; - -/** - @method - - This method adds an object to this connection. - - - Parameter request: A request to be included in the round-trip when start is called. - - - Parameter handler: A handler to call back when the round-trip completes or times out. - The handler will be invoked on the main thread. - - - Parameter name: An optional name for this request. This can be used to feed - the results of one request to the input of another in the same - `FBSDKGraphRequestConnection` as described in - [Graph API Batch Requests]( https://developers.facebook.com/docs/reference/api/batch/ ). - - - - The completion handler is retained until the block is called upon the - completion or cancellation of the connection. This request can be named - to allow for using the request's response in a subsequent request. - */ -- (void)addRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler - batchEntryName:(NSString *)name; - -/** - @method - - This method adds an object to this connection. - - - Parameter request: A request to be included in the round-trip when start is called. - - - Parameter handler: A handler to call back when the round-trip completes or times out. - - - Parameter batchParameters: The optional dictionary of parameters to include for this request - as described in [Graph API Batch Requests]( https://developers.facebook.com/docs/reference/api/batch/ ). - Examples include "depends_on", "name", or "omit_response_on_success". - - - - The completion handler is retained until the block is called upon the - completion or cancellation of the connection. This request can be named - to allow for using the request's response in a subsequent request. - */ -- (void)addRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler - batchParameters:(NSDictionary *)batchParameters; - -/** - @methodgroup Instance methods - */ - -/** - @method - - Signals that a connection should be logically terminated as the - application is no longer interested in a response. - - - - Synchronously calls any handlers indicating the request was cancelled. Cancel - does not guarantee that the request-related processing will cease. It - does promise that all handlers will complete before the cancel returns. A call to - cancel prior to a start implies a cancellation of all requests associated - with the connection. - */ -- (void)cancel; - -/** - @method - - This method starts a connection with the server and is capable of handling all of the - requests that were added to the connection. - - - By default, a connection is scheduled on the current thread in the default mode when it is created. - See `setDelegateQueue:` for other options. - - This method cannot be called twice for an `FBSDKGraphRequestConnection` instance. - */ -- (void)start; - -/** - Determines the operation queue that is used to call methods on the connection's delegate. - - Parameter queue: The operation queue to use when calling delegate methods. - - By default, a connection is scheduled on the current thread in the default mode when it is created. - You cannot reschedule a connection after it has started. - - This is very similar to `[NSURLConnection setDelegateQueue:]`. - */ -- (void)setDelegateQueue:(NSOperationQueue *)queue; - -/** - @method - - Overrides the default version for a batch request - - - - The SDK automatically prepends a version part, such as "v2.0" to API paths in order to simplify API versioning - for applications. If you want to override the version part while using batch requests on the connection, call - this method to set the version for the batch request. - - - Parameter version: This is a string in the form @"v2.0" which will be used for the version part of an API path - */ -- (void)overrideVersionPartWith:(NSString *)version; - -@end - -/** - The key in the result dictionary for requests to old versions of the Graph API - whose response is not a JSON object. - - - When a request returns a non-JSON response (such as a "true" literal), that response - will be wrapped into a dictionary using this const as the key. This only applies for very few Graph API - prior to v2.1. - */ -FBSDK_EXTERN NSString *const FBSDKNonJSONResponseProperty; diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.m deleted file mode 100644 index b15ed96e8..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.m +++ /dev/null @@ -1,1037 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKGraphRequestConnection+Internal.h" - -#import "FBSDKAppEvents+Internal.h" -#import "FBSDKConstants.h" -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKError.h" -#import "FBSDKErrorConfiguration.h" -#import "FBSDKGraphRequest+Internal.h" -#import "FBSDKGraphRequestBody.h" -#import "FBSDKGraphRequestDataAttachment.h" -#import "FBSDKGraphRequestMetadata.h" -#import "FBSDKGraphRequestPiggybackManager.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKSettings+Internal.h" -#import "FBSDKURLSessionTask.h" - -NSString *const FBSDKNonJSONResponseProperty = @"FACEBOOK_NON_JSON_RESULT"; - -// URL construction constants -static NSString *const kGraphURLPrefix = @"graph."; -static NSString *const kGraphVideoURLPrefix = @"graph-video."; - -static NSString *const kBatchKey = @"batch"; -static NSString *const kBatchMethodKey = @"method"; -static NSString *const kBatchRelativeURLKey = @"relative_url"; -static NSString *const kBatchAttachmentKey = @"attached_files"; -static NSString *const kBatchFileNamePrefix = @"file"; -static NSString *const kBatchEntryName = @"name"; - -static NSString *const kAccessTokenKey = @"access_token"; -#if TARGET_OS_TV -static NSString *const kSDK = @"tvos"; -static NSString *const kUserAgentBase = @"FBtvOSSDK"; -#else -static NSString *const kSDK = @"ios"; -static NSString *const kUserAgentBase = @"FBiOSSDK"; -#endif -static NSString *const kBatchRestMethodBaseURL = @"method/"; - -static NSTimeInterval g_defaultTimeout = 60.0; - -static FBSDKErrorConfiguration *g_errorConfiguration; - -// ---------------------------------------------------------------------------- -// FBSDKGraphRequestConnectionState - -typedef NS_ENUM(NSUInteger, FBSDKGraphRequestConnectionState) -{ - kStateCreated, - kStateSerialized, - kStateStarted, - kStateCompleted, - kStateCancelled, -}; - -// ---------------------------------------------------------------------------- -// Private properties and methods - -@interface FBSDKGraphRequestConnection () < -NSURLSessionDataDelegate -#if !TARGET_OS_TV -, FBSDKGraphErrorRecoveryProcessorDelegate -#endif -> - -@property (nonatomic, strong) NSURLSession *session; -@property (nonatomic, strong) FBSDKURLSessionTask *task; -@property (nonatomic, retain) NSMutableArray *requests; -@property (nonatomic, assign) FBSDKGraphRequestConnectionState state; -@property (nonatomic, strong) FBSDKLogger *logger; -@property (nonatomic, assign) uint64_t requestStartTime; - -@end - -// ---------------------------------------------------------------------------- -// FBSDKGraphRequestConnection - -@implementation FBSDKGraphRequestConnection -{ - NSString *_overrideVersionPart; - NSUInteger _expectingResults; - NSOperationQueue *_delegateQueue; -#if !TARGET_OS_TV - FBSDKGraphRequestMetadata *_recoveringRequestMetadata; - FBSDKGraphErrorRecoveryProcessor *_errorRecoveryProcessor; -#endif -} - -- (instancetype)init -{ - if ((self = [super init])) { - _requests = [[NSMutableArray alloc] init]; - _timeout = g_defaultTimeout; - _state = kStateCreated; - _logger = [[FBSDKLogger alloc] initWithLoggingBehavior:FBSDKLoggingBehaviorNetworkRequests]; - } - return self; -} - -- (void)dealloc -{ - [_session invalidateAndCancel]; -} - -#pragma mark - Public - -+ (void)setDefaultConnectionTimeout:(NSTimeInterval)defaultTimeout -{ - if (defaultTimeout >= 0) { - g_defaultTimeout = defaultTimeout; - } -} - -- (void)addRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler -{ - [self addRequest:request completionHandler:handler batchEntryName:nil]; -} - -- (void)addRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler - batchEntryName:(NSString *)name -{ - NSDictionary *batchParams = (name)? @{kBatchEntryName : name } : nil; - [self addRequest:request completionHandler:handler batchParameters:batchParams]; -} - -- (void)addRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler - batchParameters:(NSDictionary *)batchParameters -{ - if (self.state != kStateCreated) { - @throw [NSException exceptionWithName:NSInternalInconsistencyException - reason:@"Cannot add requests once started or if a URLRequest is set" - userInfo:nil]; - } - FBSDKGraphRequestMetadata *metadata = [[FBSDKGraphRequestMetadata alloc] initWithRequest:request - completionHandler:handler - batchParameters:batchParameters]; - - [self.requests addObject:metadata]; -} - -- (void)cancel -{ - self.state = kStateCancelled; - [self.task cancel]; - [self cleanUpSession]; -} - -- (void)overrideVersionPartWith:(NSString *)version -{ - if (![_overrideVersionPart isEqualToString:version]) { - _overrideVersionPart = [version copy]; - } -} - -- (void)start -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - g_errorConfiguration = [[FBSDKErrorConfiguration alloc] initWithDictionary:nil]; - }); - //optimistically check for updated server configuration; - g_errorConfiguration = [FBSDKServerConfigurationManager cachedServerConfiguration].errorConfiguration ?: g_errorConfiguration; - - if (self.state != kStateCreated && self.state != kStateSerialized) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"FBSDKGraphRequestConnection cannot be started again."]; - return; - } - [FBSDKGraphRequestPiggybackManager addPiggybackRequests:self]; - NSMutableURLRequest *request = [self requestWithBatch:self.requests timeout:_timeout]; - - self.state = kStateStarted; - - [self logRequest:request bodyLength:0 bodyLogger:nil attachmentLogger:nil]; - _requestStartTime = [FBSDKInternalUtility currentTimeInMilliseconds]; - - FBSDKURLSessionTaskHandler handler = ^(NSError *error, - NSURLResponse *response, - NSData *responseData) { - [self completeFBSDKURLSessionWithResponse:response - data:responseData - networkError:error]; - }; - - if (!self.session) { - self.session = [self defaultSession]; - } - - self.task = [[FBSDKURLSessionTask alloc] initWithRequest:request - fromSession:self.session - completionHandler:handler]; - [self.task start]; - - id delegate = self.delegate; - if ([delegate respondsToSelector:@selector(requestConnectionWillBeginLoading:)]) { - if (_delegateQueue) { - [_delegateQueue addOperationWithBlock:^{ - [delegate requestConnectionWillBeginLoading:self]; - }]; - } else { - [delegate requestConnectionWillBeginLoading:self]; - } - } -} - -- (void)setDelegateQueue:(NSOperationQueue *)queue -{ - _delegateQueue = queue; -} - -#pragma mark - Private methods (request generation) - -// -// Adds request data to a batch in a format expected by the JsonWriter. -// Binary attachments are referenced by name in JSON and added to the -// attachments dictionary. -// -- (void)addRequest:(FBSDKGraphRequestMetadata *)metadata - toBatch:(NSMutableArray *)batch - attachments:(NSMutableDictionary *)attachments - batchToken:(NSString *)batchToken -{ - NSMutableDictionary *requestElement = [[NSMutableDictionary alloc] init]; - - if (metadata.batchParameters) { - [requestElement addEntriesFromDictionary:metadata.batchParameters]; - } - - if (batchToken) { - metadata.request.parameters[kAccessTokenKey] = batchToken; - [self registerTokenToOmitFromLog:batchToken]; - } - - NSString *urlString = [self urlStringForSingleRequest:metadata.request forBatch:YES]; - requestElement[kBatchRelativeURLKey] = urlString; - requestElement[kBatchMethodKey] = metadata.request.HTTPMethod; - - NSMutableArray *attachmentNames = [NSMutableArray array]; - - [metadata.request.parameters enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { - if ([FBSDKGraphRequest isAttachment:value]) { - NSString *name = [NSString stringWithFormat:@"%@%lu", - kBatchFileNamePrefix, - (unsigned long)[attachments count]]; - [attachmentNames addObject:name]; - attachments[name] = value; - } - }]; - - if ([attachmentNames count]) { - requestElement[kBatchAttachmentKey] = [attachmentNames componentsJoinedByString:@","]; - } - - [batch addObject:requestElement]; -} - -- (void)appendAttachments:(NSDictionary *)attachments - toBody:(FBSDKGraphRequestBody *)body - addFormData:(BOOL)addFormData - logger:(FBSDKLogger *)logger -{ - [attachments enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { - value = [FBSDKInternalUtility convertRequestValue:value]; - if ([value isKindOfClass:[NSString class]]) { - if (addFormData) { - [body appendWithKey:key formValue:(NSString *)value logger:logger]; - } - } else if ([value isKindOfClass:[UIImage class]]) { - [body appendWithKey:key imageValue:(UIImage *)value logger:logger]; - } else if ([value isKindOfClass:[NSData class]]) { - [body appendWithKey:key dataValue:(NSData *)value logger:logger]; - } else if ([value isKindOfClass:[FBSDKGraphRequestDataAttachment class]]) { - [body appendWithKey:key dataAttachmentValue:(FBSDKGraphRequestDataAttachment *)value logger:logger]; - } else { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors formatString:@"Unsupported FBSDKGraphRequest attachment:%@, skipping.", value]; - } - }]; -} - -// -// Serializes all requests in the batch to JSON and appends the result to -// body. Also names all attachments that need to go as separate blocks in -// the body of the request. -// -// All the requests are serialized into JSON, with any binary attachments -// named and referenced by name in the JSON. -// -- (void)appendJSONRequests:(NSArray *)requests - toBody:(FBSDKGraphRequestBody *)body - andNameAttachments:(NSMutableDictionary *)attachments - logger:(FBSDKLogger *)logger -{ - NSMutableArray *batch = [[NSMutableArray alloc] init]; - NSString *batchToken = nil; - for (FBSDKGraphRequestMetadata *metadata in requests) { - NSString *individualToken = [self accessTokenWithRequest:metadata.request]; - BOOL isClientToken = [FBSDKSettings clientToken] && [individualToken hasSuffix:[FBSDKSettings clientToken]]; - if (!batchToken && - !isClientToken) { - batchToken = individualToken; - } - [self addRequest:metadata - toBatch:batch - attachments:attachments - batchToken:[batchToken isEqualToString:individualToken] ? nil : individualToken]; - } - - NSString *jsonBatch = [FBSDKInternalUtility JSONStringForObject:batch error:NULL invalidObjectHandler:NULL]; - - [body appendWithKey:kBatchKey formValue:jsonBatch logger:logger]; - if (batchToken) { - [body appendWithKey:kAccessTokenKey formValue:batchToken logger:logger]; - } -} - -- (BOOL)_shouldWarnOnMissingFieldsParam:(FBSDKGraphRequest *)request -{ - NSString *minVersion = @"2.4"; - NSString *version = request.version; - if (!version) { - return YES; - } - if ([version hasPrefix:@"v"]) { - version = [version substringFromIndex:1]; - } - - NSComparisonResult result = [version compare:minVersion options:NSNumericSearch]; - - // if current version is the same as minVersion, or if the current version is > minVersion - return (result == NSOrderedSame) || (result == NSOrderedDescending); -} - -// Validate that all GET requests after v2.4 have a "fields" param -- (void)_validateFieldsParamForGetRequests:(NSArray *)requests -{ - for (FBSDKGraphRequestMetadata *metadata in requests) { - FBSDKGraphRequest *request = metadata.request; - if ([request.HTTPMethod.uppercaseString isEqualToString:@"GET"] && - [self _shouldWarnOnMissingFieldsParam:request] && - !request.parameters[@"fields"] && - [request.graphPath rangeOfString:@"fields="].location == NSNotFound) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"starting with Graph API v2.4, GET requests for /%@ should contain an explicit \"fields\" parameter", request.graphPath]; - } - } -} - -// -// Generates a NSURLRequest based on the contents of self.requests, and sets -// options on the request. Chooses between URL-based request for a single -// request and JSON-based request for batches. -// -- (NSMutableURLRequest *)requestWithBatch:(NSArray *)requests - timeout:(NSTimeInterval)timeout -{ - FBSDKGraphRequestBody *body = [[FBSDKGraphRequestBody alloc] init]; - FBSDKLogger *bodyLogger = [[FBSDKLogger alloc] initWithLoggingBehavior:_logger.loggingBehavior]; - FBSDKLogger *attachmentLogger = [[FBSDKLogger alloc] initWithLoggingBehavior:_logger.loggingBehavior]; - - NSMutableURLRequest *request; - - if (requests.count == 0) { - [[NSException exceptionWithName:NSInvalidArgumentException - reason:@"FBSDKGraphRequestConnection: Must have at least one request or urlRequest not specified." - userInfo:nil] - raise]; - - } - - [self _validateFieldsParamForGetRequests:requests]; - - if ([requests count] == 1) { - FBSDKGraphRequestMetadata *metadata = [requests objectAtIndex:0]; - NSURL *url = [NSURL URLWithString:[self urlStringForSingleRequest:metadata.request forBatch:NO]]; - request = [NSMutableURLRequest requestWithURL:url - cachePolicy:NSURLRequestUseProtocolCachePolicy - timeoutInterval:timeout]; - - // HTTP methods are case-sensitive; be helpful in case someone provided a mixed case one. - NSString *httpMethod = [metadata.request.HTTPMethod uppercaseString]; - [request setHTTPMethod:httpMethod]; - [self appendAttachments:metadata.request.parameters - toBody:body - addFormData:[httpMethod isEqualToString:@"POST"] - logger:attachmentLogger]; - } else { - // Find the session with an app ID and use that as the batch_app_id. If we can't - // find one, try to load it from the plist. As a last resort, pass 0. - NSString *batchAppID = [FBSDKSettings appID]; - if (!batchAppID || batchAppID.length == 0) { - // The Graph API batch method requires either an access token or batch_app_id. - // If we can't determine an App ID to use for the batch, we can't issue it. - [[NSException exceptionWithName:NSInternalInconsistencyException - reason:@"FBSDKGraphRequestConnection: [FBSDKSettings appID] must be specified for batch requests" - userInfo:nil] - raise]; - } - - [body appendWithKey:@"batch_app_id" formValue:batchAppID logger:bodyLogger]; - - NSMutableDictionary *attachments = [[NSMutableDictionary alloc] init]; - - [self appendJSONRequests:requests - toBody:body - andNameAttachments:attachments - logger:bodyLogger]; - - [self appendAttachments:attachments - toBody:body - addFormData:NO - logger:attachmentLogger]; - - NSURL *url = [FBSDKInternalUtility facebookURLWithHostPrefix:kGraphURLPrefix path:nil queryParameters:nil defaultVersion:_overrideVersionPart error:NULL]; - request = [NSMutableURLRequest requestWithURL:url - cachePolicy:NSURLRequestUseProtocolCachePolicy - timeoutInterval:timeout]; - [request setHTTPMethod:@"POST"]; - } - - [request setHTTPBody:[body data]]; - NSUInteger bodyLength = [[body data] length] / 1024; - - [request setValue:[FBSDKGraphRequestConnection userAgent] forHTTPHeaderField:@"User-Agent"]; - [request setValue:[FBSDKGraphRequestBody mimeContentType] forHTTPHeaderField:@"Content-Type"]; - [request setHTTPShouldHandleCookies:NO]; - - [self logRequest:request bodyLength:bodyLength bodyLogger:bodyLogger attachmentLogger:attachmentLogger]; - - return request; -} - -// -// Generates a URL for a batch containing only a single request, -// and names all attachments that need to go in the body of the -// request. -// -// The URL contains all parameters that are not body attachments, -// including the session key if present. -// -// Attachments are named and referenced by name in the URL. -// -- (NSString *)urlStringForSingleRequest:(FBSDKGraphRequest *)request forBatch:(BOOL)forBatch -{ - request.parameters[@"format"] = @"json"; - request.parameters[@"sdk"] = kSDK; - request.parameters[@"include_headers"] = @"false"; - - NSString *baseURL; - if (forBatch) { - baseURL = request.graphPath; - } else { - NSString *token = [self accessTokenWithRequest:request]; - if (token) { - [request.parameters setValue:token forKey:kAccessTokenKey]; - [self registerTokenToOmitFromLog:token]; - } - - NSString *prefix = kGraphURLPrefix; - // We special case a graph post to /videos and send it to graph-video.facebook.com - // We only do this for non batch post requests - NSString *graphPath = [request.graphPath lowercaseString]; - if ([[request.HTTPMethod uppercaseString] isEqualToString:@"POST"] && - [graphPath hasSuffix:@"/videos"]) { - graphPath = [graphPath stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]]; - NSArray *components = [graphPath componentsSeparatedByString:@"/"]; - if ([components count] == 2) { - prefix = kGraphVideoURLPrefix; - } - } - - baseURL = [[FBSDKInternalUtility facebookURLWithHostPrefix:prefix path:request.graphPath queryParameters:nil defaultVersion:request.version error:NULL] absoluteString]; - } - - NSString *url = [FBSDKGraphRequest serializeURL:baseURL - params:request.parameters - httpMethod:request.HTTPMethod]; - return url; -} - -#pragma mark - Private methods (response parsing) - -- (void)completeFBSDKURLSessionWithResponse:(NSURLResponse *)response - data:(NSData *)data - networkError:(NSError *)error -{ - if (self.state != kStateCancelled) { - NSAssert(self.state == kStateStarted, - @"Unexpected state %lu in completeWithResponse", - (unsigned long)self.state); - self.state = kStateCompleted; - } - - NSArray *results = nil; - _URLResponse = (NSHTTPURLResponse *)response; - if (response) { - NSAssert([response isKindOfClass:[NSHTTPURLResponse class]], - @"Expected NSHTTPURLResponse, got %@", - response); - - NSInteger statusCode = _URLResponse.statusCode; - - if (!error && [response.MIMEType hasPrefix:@"image"]) { - error = [FBSDKError errorWithCode:FBSDKGraphRequestNonTextMimeTypeReturnedErrorCode - message:@"Response is a non-text MIME type; endpoints that return images and other " - @"binary data should be fetched using NSURLRequest and NSURLSession"]; - } else { - results = [self parseJSONResponse:data - error:&error - statusCode:statusCode]; - } - } else if (!error) { - error = [FBSDKError errorWithCode:FBSDKUnknownErrorCode - message:@"Missing NSURLResponse"]; - } - - if (!error) { - if ([self.requests count] != [results count]) { - error = [FBSDKError errorWithCode:FBSDKGraphRequestProtocolMismatchErrorCode - message:@"Unexpected number of results returned from server."]; - } else { - [_logger appendFormat:@"Response <#%lu>\nDuration: %llu msec\nSize: %lu kB\nResponse Body:\n%@\n\n", - (unsigned long)[_logger loggerSerialNumber], - [FBSDKInternalUtility currentTimeInMilliseconds] - _requestStartTime, - (unsigned long)[data length], - results]; - } - } - - if (error) { - [_logger appendFormat:@"Response <#%lu> :\n%@\n%@\n", - (unsigned long)[_logger loggerSerialNumber], - [error localizedDescription], - [error userInfo]]; - } - [_logger emitToNSLog]; - - [self completeWithResults:results networkError:error]; - - [self cleanUpSession]; -} - -// -// If there is one request, the JSON is the response. -// If there are multiple requests, the JSON has an array of dictionaries whose -// body property is the response. -// [{ "code":200, -// "body":"JSON-response-as-a-string" }, -// { "code":200, -// "body":"JSON-response-as-a-string" }] -// -// In both cases, this function returns an NSArray containing the results. -// The NSArray looks just like the multiple request case except the body -// value is converted from a string to parsed JSON. -// -- (NSArray *)parseJSONResponse:(NSData *)data - error:(NSError **)error - statusCode:(NSInteger)statusCode; -{ - // Graph API can return "true" or "false", which is not valid JSON. - // Translate that before asking JSON parser to look at it. - NSString *responseUTF8 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSMutableArray *results = [[NSMutableArray alloc] init];; - id response = [self parseJSONOrOtherwise:responseUTF8 error:error]; - - if (responseUTF8 == nil) { - NSString *base64Data = [data length] != 0 ? [data base64EncodedStringWithOptions:0] : @""; - if (base64Data != nil) { - [FBSDKAppEvents logImplicitEvent:@"fb_response_invalid_utf8" - valueToSum:nil - parameters:nil - accessToken:nil]; - } - } - - NSDictionary *responseError = nil; - if (!response) { - if ((error != NULL) && (*error == nil)) { - *error = [self errorWithCode:FBSDKUnknownErrorCode - statusCode:statusCode - parsedJSONResponse:nil - innerError:nil - message:@"The server returned an unexpected response."]; - } - } else if ([self.requests count] == 1) { - // response is the entry, so put it in a dictionary under "body" and add - // that to array of responses. - [results addObject:@{ - @"code":@(statusCode), - @"body":response - }]; - } else if ([response isKindOfClass:[NSArray class]]) { - // response is the array of responses, but the body element of each needs - // to be decoded from JSON. - for (id item in response) { - // Don't let errors parsing one response stop us from parsing another. - NSError *batchResultError = nil; - if (![item isKindOfClass:[NSDictionary class]]) { - [results addObject:item]; - } else { - NSMutableDictionary *result = [((NSDictionary *)item) mutableCopy]; - if (result[@"body"]) { - result[@"body"] = [self parseJSONOrOtherwise:result[@"body"] error:&batchResultError]; - } - [results addObject:result]; - } - if (batchResultError) { - // We'll report back the last error we saw. - *error = batchResultError; - } - } - } else if ([response isKindOfClass:[NSDictionary class]] && - (responseError = [FBSDKTypeUtility dictionaryValue:response[@"error"]]) != nil && - [responseError[@"type"] isEqualToString:@"OAuthException"]) { - // if there was one request then return the only result. if there were multiple requests - // but only one error then the server rejected the batch access token - NSDictionary *result = @{ - @"code":@(statusCode), - @"body":response - }; - - for (NSUInteger resultIndex = 0, resultCount = self.requests.count; resultIndex < resultCount; ++resultIndex) { - [results addObject:result]; - } - } else if (error != NULL) { - *error = [self errorWithCode:FBSDKGraphRequestProtocolMismatchErrorCode - statusCode:statusCode - parsedJSONResponse:results - innerError:nil - message:nil]; - } - - return results; -} - -- (id)parseJSONOrOtherwise:(NSString *)utf8 - error:(NSError **)error -{ - id parsed = nil; - if (!(*error)) { - parsed = [FBSDKInternalUtility objectForJSONString:utf8 error:error]; - // if we fail parse we attempt a re-parse of a modified input to support results in the form "foo=bar", "true", etc. - // which is shouldn't be necessary since Graph API v2.1. - if (*error) { - // we round-trip our hand-wired response through the parser in order to remain - // consistent with the rest of the output of this function (note, if perf turns out - // to be a problem -- unlikely -- we can return the following dictionary outright) - NSDictionary *original = @{ FBSDKNonJSONResponseProperty : utf8 }; - NSString *jsonrep = [FBSDKInternalUtility JSONStringForObject:original error:NULL invalidObjectHandler:NULL]; - NSError *reparseError = nil; - parsed = [FBSDKInternalUtility objectForJSONString:jsonrep error:&reparseError]; - if (!reparseError) { - *error = nil; - } - } - } - return parsed; -} - -- (void)completeWithResults:(NSArray *)results - networkError:(NSError *)networkError -{ - NSUInteger count = [self.requests count]; - _expectingResults = count; - NSUInteger disabledRecoveryCount = 0; - for (FBSDKGraphRequestMetadata *metadata in self.requests) { - if ([metadata.request isGraphErrorRecoveryDisabled]) { - disabledRecoveryCount++; - } - } -#if !TARGET_OS_TV - BOOL isSingleRequestToRecover = (count - disabledRecoveryCount == 1); -#endif - - [self.requests enumerateObjectsUsingBlock:^(FBSDKGraphRequestMetadata *metadata, NSUInteger i, BOOL *stop) { - id result = networkError ? nil : [results objectAtIndex:i]; - NSError *resultError = networkError ?: [self errorFromResult:result request:metadata.request]; - - id body = nil; - if (!resultError && [result isKindOfClass:[NSDictionary class]]) { - NSDictionary *resultDictionary = [FBSDKTypeUtility dictionaryValue:result]; - body = [FBSDKTypeUtility dictionaryValue:resultDictionary[@"body"]]; - } - -#if !TARGET_OS_TV - if (resultError && ![metadata.request isGraphErrorRecoveryDisabled] && isSingleRequestToRecover) { - _recoveringRequestMetadata = metadata; - _errorRecoveryProcessor = [[FBSDKGraphErrorRecoveryProcessor alloc] init]; - if ([_errorRecoveryProcessor processError:resultError request:metadata.request delegate:self]) { - return; - } - } -#endif - - [self processResultBody:body error:resultError metadata:metadata canNotifyDelegate:networkError == nil]; - }]; - - if (networkError) { - if ([_delegate respondsToSelector:@selector(requestConnection:didFailWithError:)]) { - [_delegate requestConnection:self didFailWithError:networkError]; - } - } -} - -- (void)processResultBody:(NSDictionary *)body error:(NSError *)error metadata:(FBSDKGraphRequestMetadata *)metadata canNotifyDelegate:(BOOL)canNotifyDelegate -{ - void (^finishAndInvokeCompletionHandler)(void) = ^{ - NSDictionary *graphDebugDict = [body objectForKey:@"__debug__"]; - if ([graphDebugDict isKindOfClass:[NSDictionary class]]) { - [self processResultDebugDictionary: graphDebugDict]; - } - [metadata invokeCompletionHandlerForConnection:self withResults:body error:error]; - - if (--_expectingResults == 0) { - if (canNotifyDelegate && [_delegate respondsToSelector:@selector(requestConnectionDidFinishLoading:)]) { - [_delegate requestConnectionDidFinishLoading:self]; - } - } - }; - -#if !TARGET_OS_TV - void (^clearToken)(void) = ^{ - if (!(metadata.request.flags & FBSDKGraphRequestFlagDoNotInvalidateTokenOnError)) { - [FBSDKAccessToken setCurrentAccessToken:nil]; - } - }; - - FBSDKSystemAccountStoreAdapter *adapter = [FBSDKSystemAccountStoreAdapter sharedInstance]; - NSString *metadataTokenString = metadata.request.tokenString; - NSString *currentTokenString = [FBSDKAccessToken currentAccessToken].tokenString; - NSString *accountStoreTokenString = adapter.accessTokenString; - BOOL isAccountStoreLogin = [metadataTokenString isEqualToString:accountStoreTokenString]; - - if ([metadataTokenString isEqualToString:currentTokenString] || isAccountStoreLogin) { - NSInteger errorCode = [error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] integerValue]; - NSInteger errorSubcode = [error.userInfo[FBSDKGraphRequestErrorGraphErrorSubcode] integerValue]; - if (errorCode == 190 || errorCode == 102) { - if (isAccountStoreLogin) { - if (errorSubcode == 460) { - // For iOS6, when the password is changed on the server, the system account store - // will continue to issue the old token until the user has changed the - // password AND _THEN_ a renew call is made. To prevent opening - // with an old token which would immediately be closed, we tell our adapter - // that we want to force a blocking renew until success. - adapter.forceBlockingRenew = YES; - } else { - [adapter renewSystemAuthorization:^(ACAccountCredentialRenewResult result, NSError *renewError) { - NSOperationQueue *queue = _delegateQueue ?: [NSOperationQueue mainQueue]; - [queue addOperationWithBlock:^{ - clearToken(); - finishAndInvokeCompletionHandler(); - }]; - }]; - return; - } - } - clearToken(); - } else if (errorCode >= 200 && errorCode < 300) { - // permission error - [adapter renewSystemAuthorization:^(ACAccountCredentialRenewResult result, NSError *renewError) { - NSOperationQueue *queue = _delegateQueue ?: [NSOperationQueue mainQueue]; - [queue addOperationWithBlock:finishAndInvokeCompletionHandler]; - }]; - return; - } - } -#endif - // this is already on the queue since we are currently in the NSURLSession callback. - finishAndInvokeCompletionHandler(); -} - -- (void)processResultDebugDictionary:(NSDictionary *)dict -{ - NSArray *messages = [FBSDKTypeUtility arrayValue:dict[@"messages"]]; - if (![messages count]) { - return; - } - - [messages enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - NSDictionary *messageDict = [FBSDKTypeUtility dictionaryValue:obj]; - NSString *message = [FBSDKTypeUtility stringValue:messageDict[@"message"]]; - NSString *type = [FBSDKTypeUtility stringValue:messageDict[@"type"]]; - NSString *link = [FBSDKTypeUtility stringValue:messageDict[@"link"]]; - if (!message || !type) { - return; - } - - NSString *loggingBehavior = FBSDKLoggingBehaviorGraphAPIDebugInfo; - if ([type isEqualToString:@"warning"]) { - loggingBehavior = FBSDKLoggingBehaviorGraphAPIDebugWarning; - } - if (link) { - message = [message stringByAppendingFormat:@" Link: %@", link]; - } - - [FBSDKLogger singleShotLogEntry:loggingBehavior logEntry:message]; - }]; - -} - -- (NSError *)errorFromResult:(id)result request:(FBSDKGraphRequest *)request -{ - if ([result isKindOfClass:[NSDictionary class]]) { - NSDictionary *errorDictionary = [FBSDKTypeUtility dictionaryValue:result[@"body"]][@"error"]; - - if ([errorDictionary isKindOfClass:[NSDictionary class]]) { - NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; - [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"code"] forKey:FBSDKGraphRequestErrorGraphErrorCode]; - [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_subcode"] forKey:FBSDKGraphRequestErrorGraphErrorSubcode]; - //"message" is preferred over error_msg or error_reason. - [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_msg"] forKey:FBSDKErrorDeveloperMessageKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_reason"] forKey:FBSDKErrorDeveloperMessageKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"message"] forKey:FBSDKErrorDeveloperMessageKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_user_title"] forKey:FBSDKErrorLocalizedTitleKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_user_msg"] forKey:FBSDKErrorLocalizedDescriptionKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_user_msg"] forKey:NSLocalizedDescriptionKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:result[@"code"] forKey:FBSDKGraphRequestErrorHTTPStatusCodeKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:result forKey:FBSDKGraphRequestErrorParsedJSONResponseKey]; - - FBSDKErrorRecoveryConfiguration *recoveryConfiguration = [g_errorConfiguration - recoveryConfigurationForCode:[userInfo[FBSDKGraphRequestErrorGraphErrorCode] stringValue] - subcode:[userInfo[FBSDKGraphRequestErrorGraphErrorSubcode] stringValue] - request:request]; - if ([errorDictionary[@"is_transient"] boolValue]) { - userInfo[FBSDKGraphRequestErrorCategoryKey] = @(FBSDKGraphRequestErrorCategoryTransient); - } else { - [FBSDKInternalUtility dictionary:userInfo setObject:@(recoveryConfiguration.errorCategory) forKey:FBSDKGraphRequestErrorCategoryKey]; - } - [FBSDKInternalUtility dictionary:userInfo setObject:recoveryConfiguration.localizedRecoveryDescription forKey:NSLocalizedRecoverySuggestionErrorKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:recoveryConfiguration.localizedRecoveryOptionDescriptions forKey:NSLocalizedRecoveryOptionsErrorKey]; - FBSDKErrorRecoveryAttempter *attempter = [FBSDKErrorRecoveryAttempter recoveryAttempterFromConfiguration:recoveryConfiguration]; - [FBSDKInternalUtility dictionary:userInfo setObject:attempter forKey:NSRecoveryAttempterErrorKey]; - - return [FBSDKError errorWithCode:FBSDKGraphRequestGraphAPIErrorCode - userInfo:userInfo - message:nil - underlyingError:nil]; - } - } - - return nil; -} - -- (NSError *)errorWithCode:(FBSDKErrorCode)code - statusCode:(NSInteger)statusCode - parsedJSONResponse:(id)response - innerError:(NSError *)innerError - message:(NSString *)message { - NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init]; - userInfo[FBSDKGraphRequestErrorHTTPStatusCodeKey] = @(statusCode); - - if (response) { - userInfo[FBSDKGraphRequestErrorParsedJSONResponseKey] = response; - } - - if (innerError) { - userInfo[FBSDKGraphRequestErrorParsedJSONResponseKey] = innerError; - } - - if (message) { - userInfo[FBSDKErrorDeveloperMessageKey] = message; - } - - NSError *error = [[NSError alloc] - initWithDomain:FBSDKErrorDomain - code:code - userInfo:userInfo]; - - return error; -} - -#pragma mark - Private methods (miscellaneous) - -- (void)logRequest:(NSMutableURLRequest *)request - bodyLength:(NSUInteger)bodyLength - bodyLogger:(FBSDKLogger *)bodyLogger - attachmentLogger:(FBSDKLogger *)attachmentLogger -{ - if (_logger.isActive) { - [_logger appendFormat:@"Request <#%lu>:\n", (unsigned long)_logger.loggerSerialNumber]; - [_logger appendKey:@"URL" value:[[request URL] absoluteString]]; - [_logger appendKey:@"Method" value:[request HTTPMethod]]; - [_logger appendKey:@"UserAgent" value:[request valueForHTTPHeaderField:@"User-Agent"]]; - [_logger appendKey:@"MIME" value:[request valueForHTTPHeaderField:@"Content-Type"]]; - - if (bodyLength != 0) { - [_logger appendKey:@"Body Size" value:[NSString stringWithFormat:@"%lu kB", (unsigned long)bodyLength / 1024]]; - } - - if (bodyLogger != nil) { - [_logger appendKey:@"Body (w/o attachments)" value:bodyLogger.contents]; - } - - if (attachmentLogger != nil) { - [_logger appendKey:@"Attachments" value:attachmentLogger.contents]; - } - - [_logger appendString:@"\n"]; - - [_logger emitToNSLog]; - } -} - -- (NSString *)accessTokenWithRequest:(FBSDKGraphRequest *)request -{ - NSString *token = request.tokenString ?: request.parameters[kAccessTokenKey]; - if (!token && !(request.flags & FBSDKGraphRequestFlagSkipClientToken) && [FBSDKSettings clientToken].length > 0) { - return [NSString stringWithFormat:@"%@|%@", [FBSDKSettings appID], [FBSDKSettings clientToken]]; - } - return token; -} - -- (void)registerTokenToOmitFromLog:(NSString *)token -{ - if (![[FBSDKSettings loggingBehavior] containsObject:FBSDKLoggingBehaviorAccessTokens]) { - [FBSDKLogger registerStringToReplace:token replaceWith:@"ACCESS_TOKEN_REMOVED"]; - } -} - -+ (NSString *)userAgent -{ - static NSString *agent = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - agent = [NSString stringWithFormat:@"%@.%@", kUserAgentBase, FBSDK_VERSION_STRING]; - }); - - if ([FBSDKSettings userAgentSuffix]) { - return [NSString stringWithFormat:@"%@/%@", agent, [FBSDKSettings userAgentSuffix]]; - } - return agent; -} - -- (NSURLSession *)defaultSession -{ - NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; - return [NSURLSession sessionWithConfiguration:config - delegate:self - delegateQueue:_delegateQueue]; -} - -- (void)cleanUpSession -{ - [self.session invalidateAndCancel]; - self.session = nil; -} - -#pragma mark - NSURLSessionDataDelegate - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task - didSendBodyData:(int64_t)bytesSent - totalBytesSent:(int64_t)totalBytesSent -totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend -{ - id delegate = self.delegate; - - if ([delegate respondsToSelector:@selector(requestConnection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:)]) { - [delegate requestConnection:self - didSendBodyData:(NSUInteger)bytesSent - totalBytesWritten:(NSUInteger)totalBytesSent - totalBytesExpectedToWrite:(NSUInteger)totalBytesExpectedToSend]; - } -} - -#pragma mark - FBSDKGraphErrorRecoveryProcessorDelegate - -#if !TARGET_OS_TV -- (void)processorDidAttemptRecovery:(FBSDKGraphErrorRecoveryProcessor *)processor didRecover:(BOOL)didRecover error:(NSError *)error -{ - if (didRecover) { - FBSDKGraphRequest *originalRequest = _recoveringRequestMetadata.request; - FBSDKGraphRequest *retryRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:originalRequest.graphPath - parameters:originalRequest.parameters - tokenString:[FBSDKAccessToken currentAccessToken].tokenString - version:originalRequest.version - HTTPMethod:originalRequest.HTTPMethod]; - // prevent further attempts at recovery (i.e., additional retries). - [retryRequest setGraphErrorRecoveryDisabled:YES]; - FBSDKGraphRequestMetadata *retryMetadata = [[FBSDKGraphRequestMetadata alloc] initWithRequest:retryRequest completionHandler:_recoveringRequestMetadata.completionHandler batchParameters:_recoveringRequestMetadata.batchParameters]; - [retryRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *retriedError) { - [self processResultBody:result error:retriedError metadata:retryMetadata canNotifyDelegate:YES]; - _errorRecoveryProcessor = nil; - _recoveringRequestMetadata = nil; - }]; - } else { - [self processResultBody:nil error:error metadata:_recoveringRequestMetadata canNotifyDelegate:YES]; - _errorRecoveryProcessor = nil; - _recoveringRequestMetadata = nil; - } -} -#endif - -#pragma mark - Debugging helpers - -- (NSString *)description -{ - NSMutableString *result = [NSMutableString stringWithFormat:@"<%@: %p, %lu request(s): (\n", - NSStringFromClass([self class]), - self, - (unsigned long)self.requests.count]; - BOOL comma = NO; - for (FBSDKGraphRequestMetadata *metadata in self.requests) { - FBSDKGraphRequest *request = metadata.request; - if (comma) { - [result appendString:@",\n"]; - } - [result appendString:[request description]]; - comma = YES; - } - [result appendString:@"\n)>"]; - return result; - -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h deleted file mode 100644 index edf0f7815..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - A container class for data attachments so that additional metadata can be provided about the attachment. - */ -@interface FBSDKGraphRequestDataAttachment : NSObject - -/** - Initializes the receiver with the attachment data and metadata. - - Parameter data: The attachment data (retained, not copied) - - Parameter filename: The filename for the attachment - - Parameter contentType: The content type for the attachment - */ -- (instancetype)initWithData:(NSData *)data - filename:(NSString *)filename - contentType:(NSString *)contentType -NS_DESIGNATED_INITIALIZER; - -/** - The content type for the attachment. - */ -@property (nonatomic, copy, readonly) NSString *contentType; - -/** - The attachment data. - */ -@property (nonatomic, strong, readonly) NSData *data; - -/** - The filename for the attachment. - */ -@property (nonatomic, copy, readonly) NSString *filename; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.m deleted file mode 100644 index d5ec04dee..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.m +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKGraphRequestDataAttachment.h" - -#import "FBSDKMacros.h" - -@implementation FBSDKGraphRequestDataAttachment - -- (instancetype)initWithData:(NSData *)data filename:(NSString *)filename contentType:(NSString *)contentType -{ - if ((self = [super init])) { - _data = data; - _filename = [filename copy]; - _contentType = [contentType copy]; - } - return self; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithData:filename:contentType:); - return [self initWithData:nil filename:nil contentType:nil]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h deleted file mode 100644 index fd2e2fff3..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#ifdef __cplusplus -#define FBSDK_EXTERN extern "C" __attribute__((visibility ("default"))) -#else -#define FBSDK_EXTERN extern __attribute__((visibility ("default"))) -#endif - -#define FBSDK_STATIC_INLINE static inline - -#define FBSDK_NO_DESIGNATED_INITIALIZER() \ -@throw [NSException exceptionWithName:NSInvalidArgumentException \ - reason:[NSString stringWithFormat:@"unrecognized selector sent to instance %p", self] \ - userInfo:nil] - -#define FBSDK_NOT_DESIGNATED_INITIALIZER(DESIGNATED_INITIALIZER) \ -@throw [NSException exceptionWithName:NSInvalidArgumentException \ - reason:[NSString stringWithFormat:@"Please use the designated initializer [%p %@]", \ - self, \ - NSStringFromSelector(@selector(DESIGNATED_INITIALIZER))] \ - userInfo:nil] diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h deleted file mode 100644 index 1b351dbdf..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - Extension protocol for NSMutableCopying that adds the mutableCopy method, which is implemented on NSObject. - - NSObject implicitly conforms to this protocol. - */ -@protocol FBSDKMutableCopying - -/** - Implemented by NSObject as a convenience to mutableCopyWithZone:. - - Returns: A mutable copy of the receiver. - */ -- (id)mutableCopy; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h deleted file mode 100644 index 1f33f1689..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKMacros.h" -#import "FBSDKProfilePictureView.h" - -/** - Notification indicating that the `currentProfile` has changed. - - the userInfo dictionary of the notification will contain keys - `FBSDKProfileChangeOldKey` and - `FBSDKProfileChangeNewKey`. - */ -FBSDK_EXTERN NSString *const FBSDKProfileDidChangeNotification; - -/* key in notification's userInfo object for getting the old profile. - - If there was no old profile, the key will not be present. - */ -FBSDK_EXTERN NSString *const FBSDKProfileChangeOldKey; - -/* key in notification's userInfo object for getting the new profile. - - If there is no new profile, the key will not be present. - */ -FBSDK_EXTERN NSString *const FBSDKProfileChangeNewKey; - -/** - Represents an immutable Facebook profile - - This class provides a global "currentProfile" instance to more easily - add social context to your application. When the profile changes, a notification is - posted so that you can update relevant parts of your UI and is persisted to NSUserDefaults. - - Typically, you will want to call `enableUpdatesOnAccessTokenChange:YES` so that - it automatically observes changes to the `[FBSDKAccessToken currentAccessToken]`. - - You can use this class to build your own `FBSDKProfilePictureView` or in place of typical requests to "/me". - */ -@interface FBSDKProfile : NSObject - -/** - initializes a new instance. - - Parameter userID: the user ID - - Parameter firstName: the user's first name - - Parameter middleName: the user's middle name - - Parameter lastName: the user's last name - - Parameter name: the user's complete name - - Parameter linkURL: the link for this profile - - Parameter refreshDate: the optional date this profile was fetched. Defaults to [NSDate date]. - */ -- (instancetype)initWithUserID:(NSString *)userID - firstName:(NSString *)firstName - middleName:(NSString *)middleName - lastName:(NSString *)lastName - name:(NSString *)name - linkURL:(NSURL *)linkURL - refreshDate:(NSDate *)refreshDate NS_DESIGNATED_INITIALIZER; -/** - The user id - */ -@property (nonatomic, copy, readonly) NSString *userID; -/** - The user's first name - */ -@property (nonatomic, copy, readonly) NSString *firstName; -/** - The user's middle name - */ -@property (nonatomic, copy, readonly) NSString *middleName; -/** - The user's last name - */ -@property (nonatomic, copy, readonly) NSString *lastName; -/** - The user's complete name - */ -@property (nonatomic, copy, readonly) NSString *name; -/** - A URL to the user's profile. - - Consider using Bolts and `FBSDKAppLinkResolver` to resolve this - to an app link to link directly to the user's profile in the Facebook app. - */ -@property (nonatomic, readonly) NSURL *linkURL; - -/** - The last time the profile data was fetched. - */ -@property (nonatomic, readonly) NSDate *refreshDate; - -/** - Gets the current FBSDKProfile instance. - */ -+ (FBSDKProfile *)currentProfile; - -/** - Sets the current instance and posts the appropriate notification if the profile parameter is different - than the receiver. - - Parameter profile: the profile to set - - This persists the profile to NSUserDefaults. - */ -+ (void)setCurrentProfile:(FBSDKProfile *)profile; - -/** - Indicates if `currentProfile` will automatically observe `FBSDKAccessTokenDidChangeNotification` notifications - - Parameter enable: YES is observing - - If observing, this class will issue a graph request for public profile data when the current token's userID - differs from the current profile. You can observe `FBSDKProfileDidChangeNotification` for when the profile is updated. - - Note that if `[FBSDKAccessToken currentAccessToken]` is unset, the `currentProfile` instance remains. It's also possible - for `currentProfile` to return nil until the data is fetched. - */ -+ (void)enableUpdatesOnAccessTokenChange:(BOOL)enable; - -/** - Loads the current profile and passes it to the completion block. - - Parameter completion: The block to be executed once the profile is loaded - - If the profile is already loaded, this method will call the completion block synchronously, otherwise it - will begin a graph request to update `currentProfile` and then call the completion block when finished. - */ -+ (void)loadCurrentProfileWithCompletion:(void(^)(FBSDKProfile *profile, NSError *error))completion; - -/** - A convenience method for returning a complete `NSURL` for retrieving the user's profile image. - - Parameter mode: The picture mode - - Parameter size: The height and width. This will be rounded to integer precision. - */ -- (NSURL *)imageURLForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size; - -/** - A convenience method for returning a Graph API path for retrieving the user's profile image. - -- Warning:use `imageURLForPictureMode:size:` instead - - You can pass this to a `FBSDKGraphRequest` instance to download the image. - - Parameter mode: The picture mode - - Parameter size: The height and width. This will be rounded to integer precision. - */ -- (NSString *)imagePathForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size -__attribute__ ((deprecated("use imageURLForPictureMode:size: instead"))); - -/** - Returns YES if the profile is equivalent to the receiver. - - Parameter profile: the profile to compare to. - */ -- (BOOL)isEqualToProfile:(FBSDKProfile *)profile; -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.m deleted file mode 100644 index f2f76d090..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.m +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKProfile+Internal.h" - -#import "FBSDKCoreKit+Internal.h" - -NSString *const FBSDKProfileDidChangeNotification = @"com.facebook.sdk.FBSDKProfile.FBSDKProfileDidChangeNotification";; -NSString *const FBSDKProfileChangeOldKey = @"FBSDKProfileOld"; -NSString *const FBSDKProfileChangeNewKey = @"FBSDKProfileNew"; -static NSString *const FBSDKProfileUserDefaultsKey = @"com.facebook.sdk.FBSDKProfile.currentProfile"; -static FBSDKProfile *g_currentProfile; - -#define FBSDKPROFILE_USERID_KEY @"userID" -#define FBSDKPROFILE_FIRSTNAME_KEY @"firstName" -#define FBSDKPROFILE_MIDDLENAME_KEY @"middleName" -#define FBSDKPROFILE_LASTNAME_KEY @"lastName" -#define FBSDKPROFILE_NAME_KEY @"name" -#define FBSDKPROFILE_LINKURL_KEY @"linkURL" -#define FBSDKPROFILE_REFRESHDATE_KEY @"refreshDate" - -// Once a day -#define FBSDKPROFILE_STALE_IN_SECONDS (60 * 60 * 24) - -@implementation FBSDKProfile - -- (instancetype)init NS_UNAVAILABLE -{ - assert(0); -} - -- (instancetype)initWithUserID:(NSString *)userID - firstName:(NSString *)firstName - middleName:(NSString *)middleName - lastName:(NSString *)lastName - name:(NSString *)name - linkURL:(NSURL *)linkURL - refreshDate:(NSDate *)refreshDate -{ - if ((self = [super init])) { - _userID = [userID copy]; - _firstName = [firstName copy]; - _middleName = [middleName copy]; - _lastName = [lastName copy]; - _name = [name copy]; - _linkURL = [linkURL copy]; - _refreshDate = [refreshDate copy] ?: [NSDate date]; - } - return self; -} - -+ (FBSDKProfile *)currentProfile -{ - return g_currentProfile; -} - -+ (void)setCurrentProfile:(FBSDKProfile *)profile -{ - if (profile != g_currentProfile && ![profile isEqualToProfile:g_currentProfile]) { - [[self class] cacheProfile:profile]; - NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; - - [FBSDKInternalUtility dictionary:userInfo setObject:profile forKey:FBSDKProfileChangeNewKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:g_currentProfile forKey:FBSDKProfileChangeOldKey]; - g_currentProfile = profile; - [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKProfileDidChangeNotification - object:[self class] - userInfo:userInfo]; - } -} - -- (NSURL *)imageURLForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size -{ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - NSString *path = [self imagePathForPictureMode:mode size:size]; -#pragma clang diagnostic pop - return [FBSDKInternalUtility facebookURLWithHostPrefix:@"graph" - path:path - queryParameters:nil - error:NULL]; -} - -- (NSString *)imagePathForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size -{ - NSString *type; - switch (mode) { - case FBSDKProfilePictureModeNormal: type = @"normal"; break; - case FBSDKProfilePictureModeSquare: type = @"square"; break; - } - return [NSString stringWithFormat:@"%@/picture?type=%@&width=%d&height=%d", - _userID, - type, - (int) roundf(size.width), - (int) roundf(size.height)]; -} - -+ (void)enableUpdatesOnAccessTokenChange:(BOOL)enable -{ - if (enable) { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(observeChangeAccessTokenChange:) - name:FBSDKAccessTokenDidChangeNotification - object:nil]; - } else { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - } -} - -+ (void)loadCurrentProfileWithCompletion:(void (^)(FBSDKProfile *, NSError *))completion -{ - [self loadProfileWithToken:[FBSDKAccessToken currentAccessToken] completion:completion]; -} - -#pragma mark - NSCopying - -- (instancetype)copyWithZone:(NSZone *)zone -{ - //immutable - return self; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [self.userID hash], - [self.firstName hash], - [self.middleName hash], - [self.lastName hash], - [self.name hash], - [self.linkURL hash], - [self.refreshDate hash] - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKProfile class]]){ - return NO; - } - return [self isEqualToProfile:object]; -} - -- (BOOL)isEqualToProfile:(FBSDKProfile *)profile -{ - return ([_userID isEqualToString:profile.userID] && - [_firstName isEqualToString:profile.firstName] && - [_middleName isEqualToString:profile.middleName] && - [_lastName isEqualToString:profile.lastName] && - [_name isEqualToString:profile.name] && - [_linkURL isEqual:profile.linkURL] && - [_refreshDate isEqualToDate:profile.refreshDate]); -} -#pragma mark NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - NSString *userID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_USERID_KEY]; - NSString *firstName = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_FIRSTNAME_KEY]; - NSString *middleName = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_MIDDLENAME_KEY]; - NSString *lastName = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_LASTNAME_KEY]; - NSString *name = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_NAME_KEY]; - NSURL *linkURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDKPROFILE_LINKURL_KEY]; - NSDate *refreshDate = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDKPROFILE_REFRESHDATE_KEY]; - return [self initWithUserID:userID - firstName:firstName - middleName:middleName - lastName:lastName - name:name - linkURL:linkURL - refreshDate:refreshDate]; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:self.userID forKey:FBSDKPROFILE_USERID_KEY]; - [encoder encodeObject:self.firstName forKey:FBSDKPROFILE_FIRSTNAME_KEY]; - [encoder encodeObject:self.middleName forKey:FBSDKPROFILE_MIDDLENAME_KEY]; - [encoder encodeObject:self.lastName forKey:FBSDKPROFILE_LASTNAME_KEY]; - [encoder encodeObject:self.name forKey:FBSDKPROFILE_NAME_KEY]; - [encoder encodeObject:self.linkURL forKey:FBSDKPROFILE_LINKURL_KEY]; - [encoder encodeObject:self.refreshDate forKey:FBSDKPROFILE_REFRESHDATE_KEY]; -} - -#pragma mark - Private - -+ (void)loadProfileWithToken:(FBSDKAccessToken *)token completion:(void (^)(FBSDKProfile *, NSError *))completion -{ - static FBSDKGraphRequestConnection *executingRequestConnection = nil; - - BOOL isStale = [[NSDate date] timeIntervalSinceDate:g_currentProfile.refreshDate] > FBSDKPROFILE_STALE_IN_SECONDS; - if (token && - (isStale || ![g_currentProfile.userID isEqualToString:token.userID])) { - FBSDKProfile *expectedCurrentProfile = g_currentProfile; - - NSString *graphPath = @"me?fields=id,first_name,middle_name,last_name,name,link"; - [executingRequestConnection cancel]; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath - parameters:nil - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - executingRequestConnection = [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - if (expectedCurrentProfile != g_currentProfile) { - // current profile has already changed since request was started. Let's not overwrite. - if (completion != NULL) { - completion(nil, nil); - } - return; - } - FBSDKProfile *profile = nil; - if (!error) { - profile = [[FBSDKProfile alloc] initWithUserID:result[@"id"] - firstName:result[@"first_name"] - middleName:result[@"middle_name"] - lastName:result[@"last_name"] - name:result[@"name"] - linkURL:[NSURL URLWithString:result[@"link"]] - refreshDate:[NSDate date]]; - } - [[self class] setCurrentProfile:profile]; - if (completion != NULL) { - completion(profile, error); - } - }]; - } else if (completion != NULL) { - completion(g_currentProfile, nil); - } -} - -+ (void)observeChangeAccessTokenChange:(NSNotification *)notification -{ - FBSDKAccessToken *token = notification.userInfo[FBSDKAccessTokenChangeNewKey]; - [self loadProfileWithToken:token completion:NULL]; -} - -@end - -@implementation FBSDKProfile(Internal) - -+ (void)cacheProfile:(FBSDKProfile *) profile -{ - NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; - if (profile) { - NSData *data = [NSKeyedArchiver archivedDataWithRootObject:profile]; - [userDefaults setObject:data forKey:FBSDKProfileUserDefaultsKey]; - } else { - [userDefaults removeObjectForKey:FBSDKProfileUserDefaultsKey]; - } - [userDefaults synchronize]; -} - -+ (FBSDKProfile *)fetchCachedProfile -{ - NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; - NSData *data = [userDefaults objectForKey:FBSDKProfileUserDefaultsKey]; - if (data != nil) { - @try { - return [NSKeyedUnarchiver unarchiveObjectWithData:data]; - } @catch (NSException *exception) { - return nil; - } - } - return nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h deleted file mode 100644 index aaf9bcaa7..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - FBSDKProfilePictureMode enum - Defines the aspect ratio mode for the source image of the profile picture. - */ -typedef NS_ENUM(NSUInteger, FBSDKProfilePictureMode) -{ - /** - A square cropped version of the image will be included in the view. - */ - FBSDKProfilePictureModeSquare, - /** - The original picture's aspect ratio will be used for the source image in the view. - */ - FBSDKProfilePictureModeNormal, -}; - -/** - A view to display a profile picture. - */ -@interface FBSDKProfilePictureView : UIView - -/** - The mode for the receiver to determine the aspect ratio of the source image. - */ -@property (nonatomic, assign) FBSDKProfilePictureMode pictureMode; - -/** - The profile ID to show the picture for. - */ -@property (nonatomic, copy) NSString *profileID; - -/** - Explicitly marks the receiver as needing to update the image. - - This method is called whenever any properties that affect the source image are modified, but this can also - be used to trigger a manual update of the image if it needs to be re-downloaded. - */ -- (void)setNeedsImageUpdate; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.m deleted file mode 100644 index 001d73777..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.m +++ /dev/null @@ -1,374 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKProfilePictureView.h" - -#import "FBSDKAccessToken.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKMaleSilhouetteIcon.h" -#import "FBSDKMath.h" -#import "FBSDKURLConnection.h" -#import "FBSDKUtility.h" - -@interface FBSDKProfilePictureViewState : NSObject - -- (instancetype)initWithProfileID:(NSString *)profileID - size:(CGSize)size - scale:(CGFloat)scale - pictureMode:(FBSDKProfilePictureMode)pictureMode - imageShouldFit:(BOOL)imageShouldFit; - -@property (nonatomic, assign, readonly) BOOL imageShouldFit; -@property (nonatomic, assign, readonly) FBSDKProfilePictureMode pictureMode; -@property (nonatomic, copy, readonly) NSString *profileID; -@property (nonatomic, assign, readonly) CGFloat scale; -@property (nonatomic, assign, readonly) CGSize size; - -- (BOOL)isEqualToState:(FBSDKProfilePictureViewState *)other; -- (BOOL)isValidForState:(FBSDKProfilePictureViewState *)other; - -@end - -@implementation FBSDKProfilePictureViewState - -- (instancetype)initWithProfileID:(NSString *)profileID - size:(CGSize)size - scale:(CGFloat)scale - pictureMode:(FBSDKProfilePictureMode)pictureMode - imageShouldFit:(BOOL)imageShouldFit -{ - if ((self = [super init])) { - _profileID = [profileID copy]; - _size = size; - _scale = scale; - _pictureMode = pictureMode; - _imageShouldFit = imageShouldFit; - } - return self; -} - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - (NSUInteger)_imageShouldFit, - (NSUInteger)_size.width, - (NSUInteger)_size.height, - (NSUInteger)_scale, - (NSUInteger)_pictureMode, - [_profileID hash], - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (![object isKindOfClass:[FBSDKProfilePictureViewState class]]) { - return NO; - } - FBSDKProfilePictureViewState *other = (FBSDKProfilePictureViewState *)object; - return [self isEqualToState:other]; -} - -- (BOOL)isEqualToState:(FBSDKProfilePictureViewState *)other -{ - return ([self isValidForState:other] && - CGSizeEqualToSize(_size, other->_size) && - (_scale == other->_scale)); -} - -- (BOOL)isValidForState:(FBSDKProfilePictureViewState *)other -{ - return (other != nil && - (_imageShouldFit == other->_imageShouldFit) && - (_pictureMode == other->_pictureMode) && - [FBSDKInternalUtility object:_profileID isEqualToObject:other->_profileID]); -} - -@end - -@implementation FBSDKProfilePictureView -{ - BOOL _hasProfileImage; - UIImageView *_imageView; - FBSDKProfilePictureViewState *_lastState; - BOOL _needsImageUpdate; - BOOL _placeholderImageIsValid; -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithFrame:(CGRect)frame -{ - if ((self = [super initWithFrame:frame])) { - [self _configureProfilePictureView]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [super initWithCoder:decoder])) { - [self _configureProfilePictureView]; - } - return self; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - Properties - -- (void)setBounds:(CGRect)bounds -{ - CGRect currentBounds = self.bounds; - if (!CGRectEqualToRect(currentBounds, bounds)) { - [super setBounds:bounds]; - if (!CGSizeEqualToSize(currentBounds.size, bounds.size)) { - _placeholderImageIsValid = NO; - [self setNeedsImageUpdate]; - } - } -} - -- (UIViewContentMode)contentMode -{ - return _imageView.contentMode; -} - -- (void)setContentMode:(UIViewContentMode)contentMode -{ - if (_imageView.contentMode != contentMode) { - _imageView.contentMode = contentMode; - [super setContentMode:contentMode]; - [self setNeedsImageUpdate]; - } -} - -- (void)setMode:(FBSDKProfilePictureMode)pictureMode -{ - if (_pictureMode != pictureMode) { - _pictureMode = pictureMode; - [self setNeedsImageUpdate]; - } -} - -- (void)setProfileID:(NSString *)profileID -{ - if (![FBSDKInternalUtility object:_profileID isEqualToObject:profileID]) { - _profileID = [profileID copy]; - _placeholderImageIsValid = NO; - [self setNeedsImageUpdate]; - } -} - -#pragma mark - Public Methods - -- (void)setNeedsImageUpdate -{ - if (!_imageView || CGRectIsEmpty(self.bounds)) { - // we can't do anything with an empty view, so just bail out until we have a size - return; - } - - // ensure that we have an image. do this here so we can draw the placeholder image synchronously if we don't have one - if (!_placeholderImageIsValid && !_hasProfileImage) { - [self _setPlaceholderImage]; - } - - // debounce calls to needsImage against the main runloop - if (_needsImageUpdate) { - return; - } - _needsImageUpdate = YES; - __weak FBSDKProfilePictureView *weakSelf = self; - dispatch_async(dispatch_get_main_queue(), ^{ - [weakSelf _needsImageUpdate]; - }); -} - -#pragma mark - Helper Methods - -+ (void)_downloadImageWithState:(FBSDKProfilePictureViewState *)state - completionBlock:(void(^)(NSData *data))completionBlock; -{ - NSURL *imageURL = [self _imageURLWithState:state]; - if (!imageURL) { - return; - } - FBSDKURLConnectionHandler completionHandler = ^(FBSDKURLConnection *connection, - NSError *error, - NSURLResponse *response, - NSData *responseData) { - if (!error && [responseData length]) { - completionBlock(responseData); - } - }; - NSURLRequest *request = [[NSURLRequest alloc] initWithURL:imageURL]; - [[[FBSDKURLConnection alloc] initWithRequest:request completionHandler:completionHandler] start]; -} - -+ (NSURL *)_imageURLWithState:(FBSDKProfilePictureViewState *)state -{ - FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken]; - if ([state.profileID isEqualToString:@"me"] && !accessToken) { - return nil; - } - NSString *path = [[NSString alloc] initWithFormat:@"/%@/picture", [FBSDKUtility URLEncode:state.profileID]]; - CGSize size = state.size; - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - parameters[@"width"] = @(size.width); - parameters[@"height"] = @(size.height); - [FBSDKInternalUtility dictionary:parameters setObject:accessToken.tokenString forKey:@"access_token"]; - return [FBSDKInternalUtility facebookURLWithHostPrefix:@"graph" path:path queryParameters:parameters error:NULL]; -} - -- (void)_accessTokenDidChangeNotification:(NSNotification *)notification -{ - if (![_profileID isEqualToString:@"me"] || !notification.userInfo[FBSDKAccessTokenDidChangeUserID]) { - return; - } - _lastState = nil; - [self setNeedsImageUpdate]; -} - -- (void)_configureProfilePictureView -{ - _imageView = [[UIImageView alloc] initWithFrame:self.bounds]; - _imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); - [self addSubview:_imageView]; - - _profileID = @"me"; - self.backgroundColor = [UIColor whiteColor]; - self.contentMode = UIViewContentModeScaleAspectFit; - self.userInteractionEnabled = NO; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_accessTokenDidChangeNotification:) - name:FBSDKAccessTokenDidChangeNotification - object:nil]; - - [self setNeedsImageUpdate]; -} - -- (BOOL)_imageShouldFit -{ - switch (self.contentMode) { - case UIViewContentModeBottom: - case UIViewContentModeBottomLeft: - case UIViewContentModeBottomRight: - case UIViewContentModeCenter: - case UIViewContentModeLeft: - case UIViewContentModeRedraw: - case UIViewContentModeRight: - case UIViewContentModeScaleAspectFit: - case UIViewContentModeTop: - case UIViewContentModeTopLeft: - case UIViewContentModeTopRight: - return YES; - case UIViewContentModeScaleAspectFill: - case UIViewContentModeScaleToFill: - return NO; - } -} - -- (CGSize)_imageSize:(BOOL)imageShouldFit scale:(CGFloat)scale -{ - // get the image size based on the contentMode and pictureMode - CGSize size = self.bounds.size; - switch (_pictureMode) { - case FBSDKProfilePictureModeSquare:{ - CGFloat imageSize; - if (imageShouldFit) { - imageSize = MIN(size.width, size.height); - } else { - imageSize = MAX(size.width, size.height); - } - size = CGSizeMake(imageSize, imageSize); - break; - } - case FBSDKProfilePictureModeNormal: - // use the bounds size - break; - } - - // adjust for the screen scale - size = CGSizeMake(size.width * scale, size.height * scale); - - return size; -} - -- (void)_needsImageUpdate -{ - _needsImageUpdate = NO; - - if (!_profileID) { - if (!_placeholderImageIsValid) { - [self _setPlaceholderImage]; - } - return; - } - - // if the current image is no longer representative of the current state, clear the current value out; otherwise, - // leave the current value until the new resolution image is downloaded - BOOL imageShouldFit = [self _imageShouldFit]; - UIScreen *screen = self.window.screen ?: [UIScreen mainScreen]; - CGFloat scale = [screen scale]; - CGSize imageSize = [self _imageSize:imageShouldFit scale:scale]; - FBSDKProfilePictureViewState *state = [[FBSDKProfilePictureViewState alloc] initWithProfileID:_profileID - size:imageSize - scale:scale - pictureMode:_pictureMode - imageShouldFit:imageShouldFit]; - if (![_lastState isValidForState:state]) { - [self _setPlaceholderImage]; - } - _lastState = state; - - __weak FBSDKProfilePictureView *weakSelf = self; - [[self class] _downloadImageWithState:state completionBlock:^(NSData *data) { - [weakSelf _updateImageWithData:data state:state]; - }]; -} - -- (void)_setPlaceholderImage -{ - UIColor *fillColor = [UIColor colorWithRed:157.0/255.0 green:177.0/255.0 blue:204.0/255.0 alpha:1.0]; - _imageView.image = [[[FBSDKMaleSilhouetteIcon alloc] initWithColor:fillColor] imageWithSize:_imageView.bounds.size]; - _placeholderImageIsValid = YES; - _hasProfileImage = NO; -} - -- (void)_updateImageWithData:(NSData *)data state:(FBSDKProfilePictureViewState *)state -{ - // make sure we haven't updated the state since we began fetching the image - if (![state isValidForState:_lastState]) { - return; - } - UIImage *image = [[UIImage alloc] initWithData:data scale:state.scale]; - if (image) { - _imageView.image = image; - _hasProfileImage = YES; - } else { - _hasProfileImage = NO; - _placeholderImageIsValid = NO; - [self setNeedsImageUpdate]; - } -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h deleted file mode 100644 index 22347b709..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/* - * Constants defining logging behavior. Use with <[FBSDKSettings setLoggingBehavior]>. - */ - -/** Include access token in logging. */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorAccessTokens; - -/** Log performance characteristics */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorPerformanceCharacteristics; - -/** Log FBSDKAppEvents interactions */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorAppEvents; - -/** Log Informational occurrences */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorInformational; - -/** Log cache errors. */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorCacheErrors; - -/** Log errors from SDK UI controls */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorUIControlErrors; - -/** Log debug warnings from API response, i.e. when friends fields requested, but user_friends permission isn't granted. */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorGraphAPIDebugWarning; - -/** Log warnings from API response, i.e. when requested feature will be deprecated in next version of API. - Info is the lowest level of severity, using it will result in logging all previously mentioned levels. - */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorGraphAPIDebugInfo; - -/** Log errors from SDK network requests */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorNetworkRequests; - -/** Log errors likely to be preventable by the developer. This is in the default set of enabled logging behaviors. */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorDeveloperErrors; - -@interface FBSDKSettings : NSObject - -/** - Get the Facebook App ID used by the SDK. - - If not explicitly set, the default will be read from the application's plist (FacebookAppID). - */ -+ (NSString *)appID; - -/** - Set the Facebook App ID to be used by the SDK. - - Parameter appID: The Facebook App ID to be used by the SDK. - */ -+ (void)setAppID:(NSString *)appID; - -/** - Get the default url scheme suffix used for sessions. - - If not explicitly set, the default will be read from the application's plist (FacebookUrlSchemeSuffix). - */ -+ (NSString *)appURLSchemeSuffix; - -/** - Set the app url scheme suffix used by the SDK. - - Parameter appURLSchemeSuffix: The url scheme suffix to be used by the SDK. - */ -+ (void)setAppURLSchemeSuffix:(NSString *)appURLSchemeSuffix; - -/** - Retrieve the Client Token that has been set via [FBSDKSettings setClientToken]. - - If not explicitly set, the default will be read from the application's plist (FacebookClientToken). - */ -+ (NSString *)clientToken; - -/** - Sets the Client Token for the Facebook App. - - This is needed for certain API calls when made anonymously, without a user-based access token. - - Parameter clientToken: The Facebook App's "client token", which, for a given appid can be found in the Security - section of the Advanced tab of the Facebook App settings found at - */ -+ (void)setClientToken:(NSString *)clientToken; - -/** - A convenient way to toggle error recovery for all FBSDKGraphRequest instances created after this is set. - - Parameter disableGraphErrorRecovery: YES or NO. - */ -+ (void)setGraphErrorRecoveryDisabled:(BOOL)disableGraphErrorRecovery; - -/** - Get the Facebook Display Name used by the SDK. - - If not explicitly set, the default will be read from the application's plist (FacebookDisplayName). - */ -+ (NSString *)displayName; - -/** - Set the default Facebook Display Name to be used by the SDK. - - This should match the Display Name that has been set for the app with the corresponding Facebook App ID, - in the Facebook App Dashboard. - - Parameter displayName: The Facebook Display Name to be used by the SDK. - */ -+ (void)setDisplayName:(NSString *)displayName; - -/** - Get the Facebook domain part. - - If not explicitly set, the default will be read from the application's plist (FacebookDomainPart). - */ -+ (NSString *)facebookDomainPart; - -/** - Set the subpart of the Facebook domain. - - This can be used to change the Facebook domain (e.g. @"beta") so that requests will be sent to - graph.beta.facebook.com - - Parameter facebookDomainPart: The domain part to be inserted into facebook.com. - */ -+ (void)setFacebookDomainPart:(NSString *)facebookDomainPart; - -/** - The quality of JPEG images sent to Facebook from the SDK. - - If not explicitly set, the default is 0.9. - -- See:[UIImageJPEGRepresentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/#//apple_ref/c/func/UIImageJPEGRepresentation) */ -+ (CGFloat)JPEGCompressionQuality; - -/** - Set the quality of JPEG images sent to Facebook from the SDK. - - Parameter JPEGCompressionQuality: The quality for JPEG images, expressed as a value from 0.0 to 1.0. - -- See:[UIImageJPEGRepresentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/#//apple_ref/c/func/UIImageJPEGRepresentation) */ -+ (void)setJPEGCompressionQuality:(CGFloat)JPEGCompressionQuality; - -/** - Flag which controls the auto logging of basic app events, such as activateApp and deactivateApp. - If not explicitly set, the default is 1 - true - */ -+ (NSNumber *)autoLogAppEventsEnabled; - -/** - Set the flag which controls the auto logging of basic app events, such as activateApp and deactivateApp. - - Parameter AutoLogAppEventsEnabled: Flag value, expressed as a value from 0 - false or 1 - true. - */ -+ (void)setAutoLogAppEventsEnabled:(NSNumber *)AutoLogAppEventsEnabled; - -/** - Gets whether data such as that generated through FBSDKAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. - */ -+ (BOOL)limitEventAndDataUsage; - -/** - Sets whether data such as that generated through FBSDKAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. - - - Parameter limitEventAndDataUsage: The desired value. - */ -+ (void)setLimitEventAndDataUsage:(BOOL)limitEventAndDataUsage; - -/** - Retrieve the current iOS SDK version. - */ -+ (NSString *)sdkVersion; - -/** - Retrieve the current Facebook SDK logging behavior. - */ -+ (NSSet *)loggingBehavior; - -/** - Set the current Facebook SDK logging behavior. This should consist of strings defined as - constants with FBSDKLoggingBehavior*. - - - Parameter loggingBehavior: A set of strings indicating what information should be logged. If nil is provided, the logging - behavior is reset to the default set of enabled behaviors. Set to an empty set in order to disable all logging. - - - You can also define this via an array in your app plist with key "FacebookLoggingBehavior" or add and remove individual values via enableLoggingBehavior: or disableLogginBehavior: - */ -+ (void)setLoggingBehavior:(NSSet *)loggingBehavior; - -/** - Enable a particular Facebook SDK logging behavior. - - - Parameter loggingBehavior: The LoggingBehavior to enable. This should be a string defined as a constant with FBSDKLoggingBehavior*. - */ -+ (void)enableLoggingBehavior:(NSString *)loggingBehavior; - -/** - Disable a particular Facebook SDK logging behavior. - - - Parameter loggingBehavior: The LoggingBehavior to disable. This should be a string defined as a constant with FBSDKLoggingBehavior*. - */ -+ (void)disableLoggingBehavior:(NSString *)loggingBehavior; - -/** - Set the user defaults key used by legacy token caches. - - - Parameter tokenInformationKeyName: the key used by legacy token caches. - - - Use this only if you customized FBSessionTokenCachingStrategy in v3.x of - the Facebook SDK for iOS. -*/ -+ (void)setLegacyUserDefaultTokenInformationKeyName:(NSString *)tokenInformationKeyName; - -/** - Get the user defaults key used by legacy token caches. -*/ -+ (NSString *)legacyUserDefaultTokenInformationKeyName; - -/** - Overrides the default Graph API version to use with `FBSDKGraphRequests`. This overrides `FBSDK_TARGET_PLATFORM_VERSION`. - - The string should be of the form `@"v2.7"`. -*/ -+ (void)setGraphAPIVersion:(NSString *)version; - -/** - Returns the default Graph API version. Defaults to `FBSDK_TARGET_PLATFORM_VERSION` -*/ -+ (NSString *)graphAPIVersion; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.m deleted file mode 100644 index 346b2909d..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.m +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKSettings+Internal.h" - -#import "FBSDKAccessTokenCache.h" -#import "FBSDKCoreKit.h" - -#define FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(TYPE, PLIST_KEY, GETTER, SETTER, DEFAULT_VALUE) \ -static TYPE *g_##PLIST_KEY = nil; \ -+ (TYPE *)GETTER \ -{ \ - if (!g_##PLIST_KEY) { \ - g_##PLIST_KEY = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@#PLIST_KEY] copy] ?: DEFAULT_VALUE; \ - } \ - return g_##PLIST_KEY; \ -} \ -+ (void)SETTER:(TYPE *)value { \ - g_##PLIST_KEY = [value copy]; \ -} - -NSString *const FBSDKLoggingBehaviorAccessTokens = @"include_access_tokens"; -NSString *const FBSDKLoggingBehaviorPerformanceCharacteristics = @"perf_characteristics"; -NSString *const FBSDKLoggingBehaviorAppEvents = @"app_events"; -NSString *const FBSDKLoggingBehaviorInformational = @"informational"; -NSString *const FBSDKLoggingBehaviorCacheErrors = @"cache_errors"; -NSString *const FBSDKLoggingBehaviorUIControlErrors = @"ui_control_errors"; -NSString *const FBSDKLoggingBehaviorDeveloperErrors = @"developer_errors"; -NSString *const FBSDKLoggingBehaviorGraphAPIDebugWarning = @"graph_api_debug_warning"; -NSString *const FBSDKLoggingBehaviorGraphAPIDebugInfo = @"graph_api_debug_info"; -NSString *const FBSDKLoggingBehaviorNetworkRequests = @"network_requests"; - -static NSObject *g_tokenCache; -static NSMutableSet *g_loggingBehavior; -static NSString *g_legacyUserDefaultTokenInformationKeyName = @"FBAccessTokenInformationKey"; -static NSString *const FBSDKSettingsLimitEventAndDataUsage = @"com.facebook.sdk:FBSDKSettingsLimitEventAndDataUsage"; -static BOOL g_disableErrorRecovery; -static NSString *g_userAgentSuffix; -static NSString *g_defaultGraphAPIVersion; - -@implementation FBSDKSettings - -+ (void)initialize -{ - if (self == [FBSDKSettings class]) { - g_tokenCache = [[FBSDKAccessTokenCache alloc] init]; - } -} - -#pragma mark - Plist Configuration Settings - -FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSString, FacebookAppID, appID, setAppID, nil); -FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSString, FacebookUrlSchemeSuffix, appURLSchemeSuffix, setAppURLSchemeSuffix, nil); -FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSString, FacebookClientToken, clientToken, setClientToken, nil); -FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSString, FacebookDisplayName, displayName, setDisplayName, nil); -FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSString, FacebookDomainPart, facebookDomainPart, setFacebookDomainPart, nil); -FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSNumber, FacebookJpegCompressionQuality, _JPEGCompressionQualityNumber, _setJPEGCompressionQualityNumber, @0.9); -FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSNumber, FacebookAutoLogAppEventsEnabled, autoLogAppEventsEnabled, - setAutoLogAppEventsEnabled, @1); - -+ (void)setGraphErrorRecoveryDisabled:(BOOL)disableGraphErrorRecovery { - g_disableErrorRecovery = disableGraphErrorRecovery; -} - -+ (BOOL)isGraphErrorRecoveryDisabled { - return g_disableErrorRecovery; -} - -+ (CGFloat)JPEGCompressionQuality -{ - return [[self _JPEGCompressionQualityNumber] floatValue]; -} - -+ (void)setJPEGCompressionQuality:(CGFloat)JPEGCompressionQuality -{ - [self _setJPEGCompressionQualityNumber:@(JPEGCompressionQuality)]; -} - -+ (BOOL)limitEventAndDataUsage -{ - NSNumber *storedValue = [[NSUserDefaults standardUserDefaults] objectForKey:FBSDKSettingsLimitEventAndDataUsage]; - if (storedValue == nil) { - return NO; - } - return storedValue.boolValue; -} - -+ (void)setLimitEventAndDataUsage:(BOOL)limitEventAndDataUsage -{ - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - [defaults setObject:@(limitEventAndDataUsage) forKey:FBSDKSettingsLimitEventAndDataUsage]; - [defaults synchronize]; -} - -+ (NSSet *)loggingBehavior -{ - if (!g_loggingBehavior) { - NSArray *bundleLoggingBehaviors = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"FacebookLoggingBehavior"]; - if (bundleLoggingBehaviors) { - g_loggingBehavior = [[NSMutableSet alloc] initWithArray:bundleLoggingBehaviors]; - } else { - // Establish set of default enabled logging behaviors. You can completely disable logging by - // specifying an empty array for FacebookLoggingBehavior in your Info.plist. - g_loggingBehavior = [[NSMutableSet alloc] initWithObjects:FBSDKLoggingBehaviorDeveloperErrors, nil]; - } - } - return [g_loggingBehavior copy]; -} - -+ (void)setLoggingBehavior:(NSSet *)loggingBehavior -{ - if (![g_loggingBehavior isEqualToSet:loggingBehavior]) { - g_loggingBehavior = [loggingBehavior mutableCopy]; - - [self updateGraphAPIDebugBehavior]; - } -} - -+ (void)enableLoggingBehavior:(NSString *)loggingBehavior -{ - if (!g_loggingBehavior) { - [self loggingBehavior]; - } - [g_loggingBehavior addObject:loggingBehavior]; - [self updateGraphAPIDebugBehavior]; -} - -+ (void)disableLoggingBehavior:(NSString *)loggingBehavior -{ - if (!g_loggingBehavior) { - [self loggingBehavior]; - } - [g_loggingBehavior removeObject:loggingBehavior]; - [self updateGraphAPIDebugBehavior]; -} - -+ (void)setLegacyUserDefaultTokenInformationKeyName:(NSString *)tokenInformationKeyName -{ - if (![g_legacyUserDefaultTokenInformationKeyName isEqualToString:tokenInformationKeyName]) { - g_legacyUserDefaultTokenInformationKeyName = tokenInformationKeyName; - } -} - -+ (NSString *)legacyUserDefaultTokenInformationKeyName -{ - return g_legacyUserDefaultTokenInformationKeyName; -} - -#pragma mark - Readonly Configuration Settings - -+ (NSString *)sdkVersion -{ - return FBSDK_VERSION_STRING; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -#pragma mark - Internal - -+ (NSObject *)accessTokenCache -{ - return g_tokenCache; -} - -+ (void)setAccessTokenCache:(NSObject *)cache -{ - if (g_tokenCache != cache) { - g_tokenCache = cache; - } -} - -+ (NSString *)userAgentSuffix -{ - return g_userAgentSuffix; -} - -+ (void)setUserAgentSuffix:(NSString *)suffix -{ - if (![g_userAgentSuffix isEqualToString:suffix]) { - g_userAgentSuffix = suffix; - } -} - -+ (void)setGraphAPIVersion:(NSString *)version -{ - if (![g_defaultGraphAPIVersion isEqualToString:version]) - { - g_defaultGraphAPIVersion = version; - } -} - -+ (NSString *)graphAPIVersion -{ - return g_defaultGraphAPIVersion ?: FBSDK_TARGET_PLATFORM_VERSION; -} - -#pragma mark - Internal - Graph API Debug - -+ (void)updateGraphAPIDebugBehavior -{ - // Enable Warnings everytime Info is enabled - if ([g_loggingBehavior containsObject:FBSDKLoggingBehaviorGraphAPIDebugInfo] - && ![g_loggingBehavior containsObject:FBSDKLoggingBehaviorGraphAPIDebugWarning]) { - [g_loggingBehavior addObject:FBSDKLoggingBehaviorGraphAPIDebugWarning]; - } -} - -+ (NSString *)graphAPIDebugParamValue -{ - if ([[self loggingBehavior] containsObject:FBSDKLoggingBehaviorGraphAPIDebugInfo]) { - return @"info"; - } else if ([[self loggingBehavior] containsObject:FBSDKLoggingBehaviorGraphAPIDebugWarning]) { - return @"warning"; - } - - return nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h deleted file mode 100644 index 3be95297e..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKAccessToken; - -/** - - Callback block for returning an array of FBSDKAccessToken instances (and possibly `NSNull` instances); or an error. - */ -typedef void (^FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)(NSArray *tokens, NSError *error) ; - -/** - - Callback block for removing a test user. - */ -typedef void (^FBSDKTestUsersManagerRemoveTestAccountHandler)(NSError *error) ; - - -/** - Provides methods for managing test accounts for testing Facebook integration. - - - Facebook allows developers to create test accounts for testing their applications' - Facebook integration (see https://developers.facebook.com/docs/test_users/). This class - simplifies use of these accounts for writing tests. It is not designed for use in - production application code. - - This class will make Graph API calls on behalf of your app to manage test accounts and requires - an app id and app secret. You will typically use this class to write unit or integration tests. - Make sure you NEVER include your app secret in your production app. - */ -@interface FBSDKTestUsersManager : NSObject - -/** - construct or return the shared instance - - Parameter appID: the Facebook app id - - Parameter appSecret: the Facebook app secret - */ -+ (instancetype)sharedInstanceForAppID:(NSString *)appID appSecret:(NSString *)appSecret; - -/** - retrieve FBSDKAccessToken instances for test accounts with the specific permissions. - - Parameter arraysOfPermissions: an array of permissions sets, such as @[ [NSSet setWithObject:@"email"], [NSSet setWithObject:@"user_birthday"]] - if you needed two test accounts with email and birthday permissions, respectively. You can pass in empty nested sets - if you need two arbitrary test accounts. For convenience, passing nil is treated as @[ [NSSet set] ] - for fetching a single test user. - - Parameter createIfNotFound: if YES, new test accounts are created if no test accounts existed that fit the permissions - requirement - - Parameter handler: the callback to invoke which will return an array of `FBAccessTokenData` instances or an `NSError`. - If param `createIfNotFound` is NO, the array may contain `[NSNull null]` instances. - - - If you are requesting test accounts with differing number of permissions, try to order - `arrayOfPermissionsArrays` so that the most number of permissions come first to minimize creation of new - test accounts. - */ -- (void)requestTestAccountTokensWithArraysOfPermissions:(NSArray *)arraysOfPermissions - createIfNotFound:(BOOL)createIfNotFound - completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler; - -/** - add a test account with the specified permissions - - Parameter permissions: the set of permissions, e.g., [NSSet setWithObjects:@"email", @"user_friends"] - - Parameter handler: the callback handler - */ -- (void)addTestAccountWithPermissions:(NSSet *)permissions - completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler; - -/** - remove a test account for the given user id - - Parameter userId: the user id - - Parameter handler: the callback handler - */ -- (void)removeTestAccount:(NSString *)userId completionHandler:(FBSDKTestUsersManagerRemoveTestAccountHandler)handler; - -/** - Make two test users friends with each other. - - Parameter first: the token of the first user - - Parameter second: the token of the second user - - Parameter callback: the callback handler - */ -- (void)makeFriendsWithFirst:(FBSDKAccessToken *)first second:(FBSDKAccessToken *)second callback:(void (^)(NSError *))callback; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.m deleted file mode 100644 index aba46489b..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.m +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKTestUsersManager.h" - -#import "FBSDKCoreKit+Internal.h" - -static NSString *const kFBGraphAPITestUsersPathFormat = @"%@/accounts/test-users"; -static NSString *const kAccountsDictionaryTokenKey = @"access_token"; -static NSString *const kAccountsDictionaryPermissionsKey = @"permissions"; -static NSMutableDictionary *gInstancesDictionary; - -@interface FBSDKTestUsersManager() -- (instancetype)initWithAppID:(NSString *)appID appSecret:(NSString *)appSecret NS_DESIGNATED_INITIALIZER; -@end - -@implementation FBSDKTestUsersManager -{ - NSString *_appID; - NSString *_appSecret; - // dictionary with format like: - // { user_id : { kAccountsDictionaryTokenKey : "token", - // kAccountsDictionaryPermissionsKey : [ permissions ] } - NSMutableDictionary *_accounts; -} - -- (instancetype)initWithAppID:(NSString *)appID appSecret:(NSString *)appSecret { - if ((self = [super init])) { - _appID = [appID copy]; - _appSecret = [appSecret copy]; - _accounts = [NSMutableDictionary dictionary]; - } - return self; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithAppID:appSecret:); - return [self initWithAppID:nil appSecret:nil]; -} - -+ (instancetype)sharedInstanceForAppID:(NSString *)appID appSecret:(NSString *)appSecret { - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - gInstancesDictionary = [NSMutableDictionary dictionary]; - }); - - NSString *instanceKey = [NSString stringWithFormat:@"%@|%@", appID, appSecret]; - if (!gInstancesDictionary[instanceKey]) { - gInstancesDictionary[instanceKey] = [[FBSDKTestUsersManager alloc] initWithAppID:appID appSecret:appSecret]; - } - return gInstancesDictionary[instanceKey]; -} - -- (void)requestTestAccountTokensWithArraysOfPermissions:(NSArray *)arraysOfPermissions - createIfNotFound:(BOOL)createIfNotFound - completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler { - arraysOfPermissions = arraysOfPermissions ?: @[[NSSet set]]; - - // wrap work in a block so that we can chain it to after a fetch of existing accounts if we need to. - void (^helper)(NSError *) = ^(NSError *error){ - if (error) { - if (handler) { - handler(nil, error); - } - return; - } - NSMutableArray *tokenDatum = [NSMutableArray arrayWithCapacity:arraysOfPermissions.count]; - NSMutableSet *collectedUserIds = [NSMutableSet setWithCapacity:arraysOfPermissions.count]; - __block BOOL canInvokeHandler = YES; - __weak id weakSelf = self; - [arraysOfPermissions enumerateObjectsUsingBlock:^(NSSet *desiredPermissions, NSUInteger idx, BOOL *stop) { - NSArray* userIdAndTokenPair = [self userIdAndTokenOfExistingAccountWithPermissions:desiredPermissions skip:collectedUserIds]; - if (!userIdAndTokenPair) { - if (createIfNotFound) { - [self addTestAccountWithPermissions:desiredPermissions - completionHandler:^(NSArray *tokens, NSError *addError) { - if (addError) { - if (handler) { - handler(nil, addError); - } - } else { - [weakSelf requestTestAccountTokensWithArraysOfPermissions:arraysOfPermissions - createIfNotFound:createIfNotFound - completionHandler:handler]; - } - }]; - // stop the enumeration (ane flag so that callback to addTestAccount* will resolve our handler now). - canInvokeHandler = NO; - *stop = YES; - return; - } else { - [tokenDatum addObject:[NSNull null]]; - } - } else { - NSString *userId = userIdAndTokenPair[0]; - NSString *tokenString = userIdAndTokenPair[1]; - [collectedUserIds addObject:userId]; - [tokenDatum addObject:[self tokenDataForTokenString:tokenString - permissions:desiredPermissions - userId:userId]]; - } - }]; - - if (canInvokeHandler && handler) { - handler(tokenDatum, nil); - } - }; - if (_accounts.count == 0) { - [self fetchExistingTestAccountsWithAfterCursor:nil handler:helper]; - } else { - helper(NULL); - } -} - -- (void)addTestAccountWithPermissions:(NSSet *)permissions - completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler { - NSDictionary *params = @{ - @"installed" : @"true", - @"permissions" : [[permissions allObjects] componentsJoinedByString:@","], - @"access_token" : self.appAccessToken - }; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:kFBGraphAPITestUsersPathFormat, _appID] - parameters:params - tokenString:[self appAccessToken] - version:nil - HTTPMethod:@"POST"]; - [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - if (error) { - if (handler) { - handler(nil, error); - } - } else { - NSMutableDictionary *accountData = [NSMutableDictionary dictionaryWithCapacity:2]; - accountData[kAccountsDictionaryPermissionsKey] = [NSSet setWithSet:permissions]; - accountData[kAccountsDictionaryTokenKey] = result[@"access_token"]; - _accounts[result[@"id"]] = accountData; - - if (handler) { - FBSDKAccessToken *token = [self tokenDataForTokenString:accountData[kAccountsDictionaryTokenKey] - permissions:permissions - userId:result[@"id"]]; - handler(@[token], nil); - } - } - }]; -} - -- (void)makeFriendsWithFirst:(FBSDKAccessToken *)first second:(FBSDKAccessToken *)second callback:(void (^)(NSError *))callback -{ - __block int expectedCount = 2; - void (^complete)(NSError *) = ^(NSError *error) { - // ignore if they're already friends or pending request - if ([error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] integerValue] == 522 || - [error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] integerValue] == 520) { - error = nil; - } - if (--expectedCount == 0 || error) { - callback(error); - } - }; - FBSDKGraphRequest *one = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/friends/%@", first.userID, second.userID] - parameters:nil - tokenString:first.tokenString - version:nil - HTTPMethod:@"POST"]; - FBSDKGraphRequest *two = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/friends/%@", second.userID, first.userID] - parameters:nil - tokenString:second.tokenString - version:nil - HTTPMethod:@"POST"]; - FBSDKGraphRequestConnection *conn = [[FBSDKGraphRequestConnection alloc] init]; - [conn addRequest:one completionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - complete(error); - } batchEntryName:@"first"]; - [conn addRequest:two completionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - complete(error); - } batchParameters:@{ @"depends_on" : @"first"} ]; - [conn start]; -} - -- (void)removeTestAccount:(NSString *)userId completionHandler:(FBSDKTestUsersManagerRemoveTestAccountHandler)handler { - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:userId - parameters:nil - tokenString:self.appAccessToken - version:nil - HTTPMethod:@"DELETE"]; - [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - if (handler) { - handler(error); - } - }]; - [_accounts removeObjectForKey:userId]; -} - -#pragma mark - private methods -- (FBSDKAccessToken *)tokenDataForTokenString:(NSString *)tokenString permissions:(NSSet *)permissions userId:(NSString *)userId{ - return [[FBSDKAccessToken alloc] initWithTokenString:tokenString - permissions:[permissions allObjects] - declinedPermissions:nil - appID:_appID - userID:userId - expirationDate:nil - refreshDate:nil]; -} - -- (NSArray *)userIdAndTokenOfExistingAccountWithPermissions:(NSSet *)permissions skip:(NSSet *)setToSkip { - __block NSString *userId = nil; - __block NSString *token = nil; - - [_accounts enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSDictionary *accountData, BOOL *stop) { - if ([setToSkip containsObject:key]) { - return; - } - NSSet *accountPermissions = accountData[kAccountsDictionaryPermissionsKey]; - if ([permissions isSubsetOfSet:accountPermissions]) { - token = accountData[kAccountsDictionaryTokenKey]; - userId = key; - *stop = YES; - } - }]; - if (userId && token) { - return @[userId, token]; - } else { - return nil; - } -} - -- (NSString *)appAccessToken { - return [NSString stringWithFormat:@"%@|%@", _appID, _appSecret]; -} - -- (void)fetchExistingTestAccountsWithAfterCursor:(NSString *)after handler:(void(^)(NSError *error))handler { - FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; - FBSDKGraphRequest *requestForAccountIds = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:kFBGraphAPITestUsersPathFormat, _appID] - parameters:@{@"limit" : @"50", - @"after" : after ?: @"", - @"fields": @"" - } - tokenString:self.appAccessToken - version:nil - HTTPMethod:nil]; - __block NSString *afterCursor = nil; - __block NSInteger expectedTestAccounts = 0; - FBSDKGraphRequestConnection *permissionConnection = [[FBSDKGraphRequestConnection alloc] init]; - [connection addRequest:requestForAccountIds completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { - if (error) { - if (handler) { - handler(error); - } - // on errors, clear out accounts since it may be in a bad state - [_accounts removeAllObjects]; - return; - } else { - for (NSDictionary *account in result[@"data"]) { - NSString *userId = account[@"id"]; - NSString *token = account[@"access_token"]; - if (userId && token) { - _accounts[userId] = [NSMutableDictionary dictionaryWithCapacity:2]; - _accounts[userId][kAccountsDictionaryTokenKey] = token; - expectedTestAccounts++; - [permissionConnection addRequest:[[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@?fields=permissions", userId] - parameters:nil - tokenString:self.appAccessToken - version:nil - HTTPMethod:nil] - completionHandler:^(FBSDKGraphRequestConnection *innerConnection2, id innerResult, NSError *innerError) { - if (_accounts.count == 0) { - // indicates an earlier error that was already passed to handler, so just short circuit. - return; - } - if (innerError) { - if (handler) { - handler(innerError); - } - [_accounts removeAllObjects]; - return; - } else { - NSMutableSet *grantedPermissions = [NSMutableSet set]; - NSArray *resultPermissionsDictionaries = innerResult[@"permissions"][@"data"]; - [resultPermissionsDictionaries enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL *stop) { - if ([obj[@"status"] isEqualToString:@"granted"]) { - [grantedPermissions addObject:obj[@"permission"]]; - } - }]; - _accounts[userId][kAccountsDictionaryPermissionsKey] = grantedPermissions; - } - expectedTestAccounts--; - if (!expectedTestAccounts) { - if (afterCursor) { - [self fetchExistingTestAccountsWithAfterCursor:afterCursor handler:handler]; - } else if (handler) { - handler(nil); - } - } - } - ]; - } - } - afterCursor = result[@"paging"][@"cursors"][@"after"]; - } - - if (expectedTestAccounts) { - // finished fetching ids and tokens, now kick off the request for all the permissions - [permissionConnection start]; - } else { - if (handler) { - handler(nil); - } - } - }]; - [connection start]; -} -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h deleted file mode 100644 index 1a240c8f0..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - Class to contain common utility methods. - */ -@interface FBSDKUtility : NSObject - -/** - Parses a query string into a dictionary. - - Parameter queryString: The query string value. - - Returns: A dictionary with the key/value pairs. - */ -+ (NSDictionary *)dictionaryWithQueryString:(NSString *)queryString; - -/** - Constructs a query string from a dictionary. - - Parameter dictionary: The dictionary with key/value pairs for the query string. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Returns: Query string representation of the parameters. - */ -+ (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary error:(NSError *__autoreleasing *)errorRef; - -/** - Decodes a value from an URL. - - Parameter value: The value to decode. - - Returns: The decoded value. - */ -+ (NSString *)URLDecode:(NSString *)value; - -/** - Encodes a value for an URL. - - Parameter value: The value to encode. - - Returns: The encoded value. - */ -+ (NSString *)URLEncode:(NSString *)value; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.m deleted file mode 100644 index e140d16b7..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.m +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKUtility.h" - -#import "FBSDKInternalUtility.h" -#import "FBSDKMacros.h" - -@implementation FBSDKUtility - -+ (NSDictionary *)dictionaryWithQueryString:(NSString *)queryString -{ - NSMutableDictionary *result = [[NSMutableDictionary alloc] init]; - NSArray *parts = [queryString componentsSeparatedByString:@"&"]; - - for (NSString *part in parts) { - if ([part length] == 0) { - continue; - } - - NSRange index = [part rangeOfString:@"="]; - NSString *key; - NSString *value; - - if (index.location == NSNotFound) { - key = part; - value = @""; - } else { - key = [part substringToIndex:index.location]; - value = [part substringFromIndex:index.location + index.length]; - } - - key = [self URLDecode:key]; - value = [self URLDecode:value]; - if (key && value) { - result[key] = value; - } - } - return result; -} - -+ (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary error:(NSError *__autoreleasing *)errorRef -{ - return [FBSDKInternalUtility queryStringWithDictionary:dictionary error:errorRef invalidObjectHandler:NULL]; -} - -+ (NSString *)URLDecode:(NSString *)value -{ - value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - value = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; -#pragma clang diagnostic pop - return value; -} - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -+ (NSString *)URLEncode:(NSString *)value -{ - return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, - (CFStringRef)value, - NULL, // characters to leave unescaped - CFSTR(":!*();@/&?+$,='"), - kCFStringEncodingUTF8); -} -#pragma clang diagnostic pop - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h deleted file mode 100644 index 312eeff82..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -#import "FBSDKAppEventsUtility.h" - -@class FBSDKGraphRequest; - -// Internally known event names - -FBSDK_EXTERN NSString *const FBSDKAppEventNamePurchased; - -/** Use to log that the share dialog was launched */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameShareSheetLaunch; - -/** Use to log that the share dialog was dismissed */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameShareSheetDismiss; - -/** Use to log that the permissions UI was launched */ -FBSDK_EXTERN NSString *const FBSDKAppEventNamePermissionsUILaunch; - -/** Use to log that the permissions UI was dismissed */ -FBSDK_EXTERN NSString *const FBSDKAppEventNamePermissionsUIDismiss; - -/** Use to log that the login view was used */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameLoginViewUsage; - -/*! Use to log that the share tray launched. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameShareTrayDidLaunch; - -/*! Use to log that the person selected a sharing target. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameShareTrayDidSelectActivity; - -// Internally known event parameters - -/** String parameter specifying the outcome of a dialog invocation */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogOutcome; - -/** Parameter key used to specify which application launches this application. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterLaunchSource; - -/** Use to log the result of a call to FBDialogs presentShareDialogWithParams: */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentShareDialog; - -/** Use to log the result of a call to FBDialogs presentShareDialogWithOpenGraphActionParams: */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogOG; - -/** Use to log the result of a call to FBDialogs presentLikeDialogWithLikeParams: */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentLikeDialogOG; - -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogPhoto; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialog; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogPhoto; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogOG; - -/** Use to log the start of an auth request that cannot be fulfilled by the token cache */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthStart; - -/** Use to log the end of an auth request that was not fulfilled by the token cache */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthEnd; - -/** Use to log the start of a specific auth method as part of an auth request */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthMethodStart; - -/** Use to log the end of the last tried auth method as part of an auth request */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthMethodEnd; - -/** Use to log the timestamp for the transition to the Facebook native login dialog */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogStart; - -/** Use to log the timestamp for the transition back to the app after the Facebook native login dialog */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogEnd; - -/** Use to log the e2e timestamp metrics for web login */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsWebLoginCompleted; - -/** Use to log the result of the App Switch OS AlertView. Only available on OS >= iOS10 */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionFASLoginDialogResult; - -/** Use to log the results of a share dialog */ -FBSDK_EXTERN NSString *const FBSDLAppEventNameFBSDKEventShareDialogResult; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogResult; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogResult; - -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventShareDialogShow; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogShow; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogShow; - -FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogMode; -FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogShareContentType; -FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogShareContentUUID; -FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogShareContentPageID; - -/*! Use to log parameters for share tray use */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterShareTrayActivityName; -FBSDK_EXTERN NSString *const FBSDKAppEventParameterShareTrayResult; - -// Internally known event parameter values - -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogOutcomeValue_Completed; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogOutcomeValue_Cancelled; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogOutcomeValue_Failed; - -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeOpenGraph; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeStatus; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypePhoto; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeVideo; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeCamera; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeMessengerGenericTemplate; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeMessengerMediaTemplate; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeMessengerOpenGraphMusicTemplate; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeUnknown; - - -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeAutomatic; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeBrowser; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeNative; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeShareSheet; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeWeb; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeFeedBrowser; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeFeedWeb; -FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeUnknown; - -FBSDK_EXTERN NSString *const FBSDKAppEventsNativeLoginDialogStartTime; -FBSDK_EXTERN NSString *const FBSDKAppEventsNativeLoginDialogEndTime; - -FBSDK_EXTERN NSString *const FBSDKAppEventsWebLoginE2E; - -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeButtonImpression; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLoginButtonImpression; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKSendButtonImpression; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKShareButtonImpression; - -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKSmartLoginService; - -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeButtonDidTap; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLoginButtonDidTap; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKSendButtonDidTap; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKShareButtonDidTap; - -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidDisable; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidLike; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidPresentDialog; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidTap; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidUnlike; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlError; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlImpression; -FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlNetworkUnavailable; - -FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogErrorMessage; -FBSDK_EXTERN NSString *const FBSDKAppEventParameterLogTime; - -@interface FBSDKAppEvents (Internal) - -+ (void)logImplicitEvent:(NSString *)eventName - valueToSum:(NSNumber *)valueToSum - parameters:(NSDictionary *)parameters - accessToken:(FBSDKAccessToken *)accessToken; - -+ (FBSDKAppEvents *)singleton; -- (void)flushForReason:(FBSDKAppEventsFlushReason)flushReason; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h deleted file mode 100644 index 2de04b854..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKAppEventsDeviceInfo : NSObject - -+ (void)extendDictionaryWithDeviceInfo:(NSMutableDictionary *)dictionary; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.m deleted file mode 100644 index 7b8b066ae..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.m +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppEventsDeviceInfo.h" - -#import -#import - -#if !TARGET_OS_TV -#import -#import -#endif -#import -#import - -#import "FBSDKAppEvents+Internal.h" -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKUtility.h" - -#define FB_ARRAY_COUNT(x) sizeof(x) / sizeof(x[0]) - -static const u_int FB_GROUP1_RECHECK_DURATION = 30 * 60; // seconds - -// Apple reports storage in binary gigabytes (1024^3) in their About menus, etc. -static const u_int FB_GIGABYTE = 1024 * 1024 * 1024; // bytes - -@implementation FBSDKAppEventsDeviceInfo -{ - // Ephemeral data, may change during the lifetime of an app. We collect them in different - // 'group' frequencies - group1 may gets collected once every 30 minutes. - - // group1 - NSString *_carrierName; - NSString *_timeZoneAbbrev; - unsigned long long _remainingDiskSpaceGB; - NSString *_timeZoneName; - - // Persistent data, but we maintain it to make rebuilding the device info as fast as possible. - NSString *_bundleIdentifier; - NSString *_longVersion; - NSString *_shortVersion; - NSString *_sysVersion; - NSString *_machine; - NSString *_language; - unsigned long long _totalDiskSpaceGB; - unsigned long long _coreCount; - CGFloat _width; - CGFloat _height; - CGFloat _density; - - // Other state - long _lastGroup1CheckTime; - BOOL _isEncodingDirty; - NSString *_encodedDeviceInfo; -} - -#pragma mark - Public Methods - -+ (void)extendDictionaryWithDeviceInfo:(NSMutableDictionary *)dictionary -{ - dictionary[@"extinfo"] = [[self sharedDeviceInfo] encodedDeviceInfo]; -} - -#pragma mark - Internal Methods - -+ (void)initialize -{ - if (self == [FBSDKAppEventsDeviceInfo class]) { - [[self sharedDeviceInfo] _collectPersistentData]; - } -} - -+ (instancetype)sharedDeviceInfo -{ - static FBSDKAppEventsDeviceInfo *_sharedDeviceInfo = nil; - if (_sharedDeviceInfo == nil) { - _sharedDeviceInfo = [[FBSDKAppEventsDeviceInfo alloc] init]; - } - return _sharedDeviceInfo; -} - -- (instancetype)init -{ - if ((self = [super init])) { - _isEncodingDirty = YES; - } - return self; -} - -- (NSString *)encodedDeviceInfo -{ - @synchronized (self) { - - BOOL isGroup1Expired = [self _isGroup1Expired]; - BOOL isEncodingExpired = isGroup1Expired; // Can || other groups in if we add them - - // As long as group1 hasn't expired, we can just return the last generated value - if (_encodedDeviceInfo && !isEncodingExpired) { - return _encodedDeviceInfo; - } - - if (isGroup1Expired) { - [self _collectGroup1Data]; - } - - if (_isEncodingDirty) { - self.encodedDeviceInfo = [self _generateEncoding]; - _isEncodingDirty = NO; - } - - return _encodedDeviceInfo; - } -} - -- (void)setEncodedDeviceInfo:(NSString *)encodedDeviceInfo -{ - @synchronized (self) { - if (![_encodedDeviceInfo isEqualToString:encodedDeviceInfo]) { - _encodedDeviceInfo = [encodedDeviceInfo copy]; - } - } -} - -// This data need only be collected once. -- (void)_collectPersistentData -{ - // Bundle stuff - NSBundle *mainBundle = [NSBundle mainBundle]; - _bundleIdentifier = mainBundle.bundleIdentifier; - _longVersion = [mainBundle objectForInfoDictionaryKey:@"CFBundleVersion"]; - _shortVersion = [mainBundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; - - // Locale stuff - _language = [[NSLocale currentLocale] localeIdentifier]; - - // Device stuff - UIDevice *device = [UIDevice currentDevice]; - _sysVersion = device.systemVersion; - _coreCount = [FBSDKAppEventsDeviceInfo _coreCount]; - - UIScreen *sc = [UIScreen mainScreen]; - CGRect sr = sc.bounds; - _width = sr.size.width; - _height = sr.size.height; - _density = sc.scale; - - struct utsname systemInfo; - uname(&systemInfo); - _machine = @(systemInfo.machine); - - // Disk space stuff - float totalDiskSpace = [[FBSDKAppEventsDeviceInfo _getTotalDiskSpace] floatValue]; - _totalDiskSpaceGB = (unsigned long long)round(totalDiskSpace / FB_GIGABYTE); -} - -- (BOOL)_isGroup1Expired -{ - return ([FBSDKAppEventsUtility unixTimeNow] - _lastGroup1CheckTime) > FB_GROUP1_RECHECK_DURATION; -} - -// This data is collected only once every GROUP1_RECHECK_DURATION. -- (void)_collectGroup1Data -{ - // Carrier - NSString *newCarrierName = [FBSDKAppEventsDeviceInfo _getCarrier]; - if (![newCarrierName isEqualToString:_carrierName]) { - _carrierName = newCarrierName; - _isEncodingDirty = YES; - } - - // Time zone - NSTimeZone *timeZone = [NSTimeZone systemTimeZone]; - NSString *timeZoneName = timeZone.name; - if (![timeZoneName isEqualToString:_timeZoneName]) { - _timeZoneName = timeZoneName; - _timeZoneAbbrev = timeZone.abbreviation; - _isEncodingDirty = YES; - } - - // Remaining disk space - float remainingDiskSpace = [[FBSDKAppEventsDeviceInfo _getRemainingDiskSpace] floatValue]; - unsigned long long newRemainingDiskSpaceGB = (unsigned long long)round(remainingDiskSpace / FB_GIGABYTE); - if (_remainingDiskSpaceGB != newRemainingDiskSpaceGB) { - _remainingDiskSpaceGB = newRemainingDiskSpaceGB; - _isEncodingDirty = YES; - } - - _lastGroup1CheckTime = [FBSDKAppEventsUtility unixTimeNow]; -} - -- (NSString *)_generateEncoding -{ - // Keep a bit of precision on density as it's the most likely to become non-integer. - NSString *densityString = _density ? [NSString stringWithFormat:@"%.02f", _density] : @""; - - NSArray *arr = @[ - @"i2", // version - starts with 'i' for iOS, we'll use 'a' for Android - _bundleIdentifier ?: @"", - _longVersion ?: @"", - _shortVersion ?: @"", - _sysVersion ?: @"", - _machine ?: @"", - _language ?: @"", - _timeZoneAbbrev ?: @"", - _carrierName ?: @"", - _width ? @((unsigned long)_width) : @"", - _height ? @((unsigned long)_height) : @"", - densityString, - @(_coreCount) ?: @"", - @(_totalDiskSpaceGB) ?: @"", - @(_remainingDiskSpaceGB) ?: @"", - _timeZoneName ?: @"" - ]; - - return [FBSDKInternalUtility JSONStringForObject:arr error:NULL invalidObjectHandler:NULL]; -} - -#pragma mark - Helper Methods - -+ (NSNumber *)_getTotalDiskSpace -{ - NSDictionary *attrs = [[[NSFileManager alloc] init] attributesOfFileSystemForPath:NSHomeDirectory() - error:nil]; - return [attrs objectForKey:NSFileSystemSize]; -} - -+ (NSNumber *)_getRemainingDiskSpace -{ - NSDictionary *attrs = [[[NSFileManager alloc] init] attributesOfFileSystemForPath:NSHomeDirectory() - error:nil]; - return [attrs objectForKey:NSFileSystemFreeSize]; -} - -+ (uint)_coreCount -{ - return [FBSDKAppEventsDeviceInfo _readSysCtlUInt:CTL_HW type:HW_AVAILCPU]; -} - -+ (uint)_readSysCtlUInt:(int)ctl type:(int)type -{ - int mib[2] = {ctl, type}; - uint value; - size_t size = sizeof value; - if (0 != sysctl(mib, FB_ARRAY_COUNT(mib), &value, &size, NULL, 0)) { - return 0; - } - return value; -} - -+ (NSString *)_getCarrier -{ -#if TARGET_OS_TV - return @"NoCarrier"; -#else - // Dynamically load class for this so calling app doesn't need to link framework in. - CTTelephonyNetworkInfo *networkInfo = [[fbsdkdfl_CTTelephonyNetworkInfoClass() alloc] init]; - CTCarrier *carrier = [networkInfo subscriberCellularProvider]; - return [carrier carrierName] ?: @"NoCarrier"; -#endif -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h deleted file mode 100644 index 1e4902982..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -// this type is not thread safe. -@interface FBSDKAppEventsState : NSObject - -@property (readonly, copy) NSArray *events; -@property (readonly, assign) NSUInteger numSkipped; -@property (readonly, copy) NSString *tokenString; -@property (readonly, copy) NSString *appID; - -- (instancetype)initWithToken:(NSString *)tokenString appID:(NSString *)appID NS_DESIGNATED_INITIALIZER; - -- (void)addEvent:(NSDictionary *)eventDictionary isImplicit:(BOOL)isImplicit; -- (void)addEventsFromAppEventState:(FBSDKAppEventsState *)appEventsState; -- (BOOL)areAllEventsImplicit; -- (BOOL)isCompatibleWithAppEventsState:(FBSDKAppEventsState *)appEventsState; -- (BOOL)isCompatibleWithTokenString:(NSString *)tokenString appID:(NSString *)appID; -- (NSString *)JSONStringForEvents:(BOOL)includeImplicitEvents; -- (NSString *)extractReceiptData; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.m deleted file mode 100644 index b4c447b98..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.m +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppEventsState.h" - -#import "FBSDKInternalUtility.h" -#import "FBSDKMacros.h" - -#define FBSDK_APPEVENTSTATE_ISIMPLICIT_KEY @"isImplicit" - -#define FBSDK_APPEVENTSSTATE_MAX_EVENTS 1000 - -#define FBSDK_APPEVENTSSTATE_APPID_KEY @"appID" -#define FBSDK_APPEVENTSSTATE_EVENTS_KEY @"events" -#define FBSDK_APPEVENTSSTATE_NUMSKIPPED_KEY @"numSkipped" -#define FBSDK_APPEVENTSSTATE_TOKENSTRING_KEY @"tokenString" -#define FBSDK_APPEVENTSTATE_RECEIPTDATA_KEY @"receipt_data" -#define FBSDK_APPEVENTSTATE_RECEIPTID_KEY @"receipt_id" - -@implementation FBSDKAppEventsState -{ - NSMutableArray *_mutableEvents; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithToken:appID:); - return [self initWithToken:nil appID:nil]; -} - -- (instancetype)initWithToken:(NSString *)tokenString appID:(NSString *)appID -{ - if ((self = [super init])) { - _tokenString = [tokenString copy]; - _appID = [appID copy]; - _mutableEvents = [NSMutableArray array]; - } - return self; -} - -- (instancetype)copyWithZone:(NSZone *)zone -{ - FBSDKAppEventsState *copy = [[FBSDKAppEventsState allocWithZone:zone] initWithToken:_tokenString appID:_appID]; - if (copy) { - [copy->_mutableEvents addObjectsFromArray:_mutableEvents]; - copy->_numSkipped = _numSkipped; - } - return copy; -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - NSString *appID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APPEVENTSSTATE_APPID_KEY]; - NSString *tokenString = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APPEVENTSSTATE_TOKENSTRING_KEY]; - NSArray *events = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_APPEVENTSSTATE_EVENTS_KEY]; - NSUInteger numSkipped = [[decoder decodeObjectOfClass:[NSNumber class] forKey:FBSDK_APPEVENTSSTATE_NUMSKIPPED_KEY] unsignedIntegerValue]; - - if ((self = [self initWithToken:tokenString appID:appID])) { - _mutableEvents = [NSMutableArray arrayWithArray:events]; - _numSkipped = numSkipped; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_appID forKey:FBSDK_APPEVENTSSTATE_APPID_KEY]; - [encoder encodeObject:_tokenString forKey:FBSDK_APPEVENTSSTATE_TOKENSTRING_KEY]; - [encoder encodeObject:@(_numSkipped) forKey:FBSDK_APPEVENTSSTATE_NUMSKIPPED_KEY]; - [encoder encodeObject:_mutableEvents forKey:FBSDK_APPEVENTSSTATE_EVENTS_KEY]; -} - -#pragma mark - Implementation - -- (NSArray *)events -{ - return [_mutableEvents copy]; -} - -- (void)addEventsFromAppEventState:(FBSDKAppEventsState *)appEventsState -{ - NSArray *toAdd = appEventsState->_mutableEvents; - NSInteger excess = _mutableEvents.count + toAdd.count - FBSDK_APPEVENTSSTATE_MAX_EVENTS; - if (excess > 0) { - NSInteger range = FBSDK_APPEVENTSSTATE_MAX_EVENTS - _mutableEvents.count; - toAdd = [toAdd subarrayWithRange:NSMakeRange(0, range)]; - _numSkipped += excess; - } - - [_mutableEvents addObjectsFromArray:toAdd]; -} - -- (void)addEvent:(NSDictionary *)eventDictionary - isImplicit:(BOOL)isImplicit { - if (_mutableEvents.count >= FBSDK_APPEVENTSSTATE_MAX_EVENTS) { - _numSkipped++; - } else { - [_mutableEvents addObject:@{ - @"event" : eventDictionary, - FBSDK_APPEVENTSTATE_ISIMPLICIT_KEY : @(isImplicit) - }]; - } -} - -- (NSString *)extractReceiptData { - NSMutableString *receipts_string = [NSMutableString string]; - NSInteger transactionId = 1; - for (NSMutableDictionary* events in _mutableEvents) { - NSMutableDictionary *event = events[@"event"]; - - NSString* receipt = event[@"receipt_data"]; - // Add receipt id as the identifier for receipt data in event parameter. - // Receipt data will be sent as post parameter rather than the event parameter - if (receipt) { - NSString* idKey = [NSString stringWithFormat:@"receipt_%ld", (long)transactionId]; - event[FBSDK_APPEVENTSTATE_RECEIPTID_KEY] = idKey; - NSString* receiptWithId = [NSString stringWithFormat:@"%@::%@;;;", idKey, receipt]; - [receipts_string appendString:receiptWithId]; - transactionId++; - } - } - return receipts_string; -} - -- (BOOL)areAllEventsImplicit -{ - for (NSDictionary *event in _mutableEvents) { - if (![[event valueForKey:FBSDK_APPEVENTSTATE_ISIMPLICIT_KEY] boolValue]) { - return NO; - } - } - return YES; -} - -- (BOOL)isCompatibleWithAppEventsState:(FBSDKAppEventsState *)appEventsState -{ - return ([self isCompatibleWithTokenString:appEventsState.tokenString appID:appEventsState.appID]); -} - -- (BOOL)isCompatibleWithTokenString:(NSString *)tokenString appID:(NSString *)appID -{ - // token strings can be nil (e.g., no user token) but appIDs should not. - BOOL tokenCompatible = ([self.tokenString isEqualToString:tokenString] || - (self.tokenString == nil && tokenString == nil)); - return (tokenCompatible && - [self.appID isEqualToString:appID]); -} - -- (NSString *)JSONStringForEvents:(BOOL)includeImplicitEvents -{ - NSMutableArray *events = [[NSMutableArray alloc] initWithCapacity:_mutableEvents.count]; - for (NSDictionary *eventAndImplicitFlag in _mutableEvents) { - if (!includeImplicitEvents && [eventAndImplicitFlag[FBSDK_APPEVENTSTATE_ISIMPLICIT_KEY] boolValue]) { - continue; - } - NSMutableDictionary *event = eventAndImplicitFlag[@"event"]; - NSAssert(event != nil, @"event cannot be nil"); - [event removeObjectForKey:FBSDK_APPEVENTSTATE_RECEIPTDATA_KEY]; - - [events addObject:event]; - } - - return [FBSDKInternalUtility JSONStringForObject:events error:NULL invalidObjectHandler:NULL]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h deleted file mode 100644 index 4c17a4c79..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKAppEventsState; - -@interface FBSDKAppEventsStateManager : NSObject - -+ (void)clearPersistedAppEventsStates; - -// reads all saved event states, appends the param, and writes them all. -+ (void)persistAppEventsData:(FBSDKAppEventsState *)appEventsState; - -// returns the array of saved app event states and deletes them. -+ (NSArray *)retrievePersistedAppEventsStates; - - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.m deleted file mode 100644 index 596d7a622..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.m +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppEventsStateManager.h" - -#import - -#import "FBSDKAppEventsState.h" -#import "FBSDKAppEventsUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKSettings.h" - -// A quick optimization to allow returning empty array if we know there are no persisted events. -static BOOL g_canSkipDiskCheck = NO; - -@implementation FBSDKAppEventsStateManager - -+ (void)clearPersistedAppEventsStates -{ - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - logEntry:@"FBSDKAppEvents Persist: Clearing"]; - [[NSFileManager defaultManager] removeItemAtPath:[[self class] filePath] - error:NULL]; - g_canSkipDiskCheck = YES; -} - -+ (void)persistAppEventsData:(FBSDKAppEventsState *)appEventsState -{ - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - formatString:@"FBSDKAppEvents Persist: Writing %lu events", (unsigned long)appEventsState.events.count]; - - if (!appEventsState.events.count) { - return; - } - NSMutableArray *existingEvents = [NSMutableArray arrayWithArray:[[self class] retrievePersistedAppEventsStates]]; - [existingEvents addObject:appEventsState]; - - [NSKeyedArchiver archiveRootObject:existingEvents toFile:[[self class] filePath]]; - g_canSkipDiskCheck = NO; -} - -+ (NSArray *)retrievePersistedAppEventsStates -{ - NSMutableArray *eventsStates = [NSMutableArray array]; - if (!g_canSkipDiskCheck) { - [eventsStates addObjectsFromArray:[NSKeyedUnarchiver unarchiveObjectWithFile:[[self class] filePath]]]; - - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - formatString:@"FBSDKAppEvents Persist: Read %lu event states. First state has %lu events", - (unsigned long)eventsStates.count, - (unsigned long)(eventsStates.count > 0 ? ((FBSDKAppEventsState *)eventsStates[0]).events.count : 0)]; - [[self class] clearPersistedAppEventsStates]; - } - return eventsStates; -} - -#pragma mark - Private Helpers - -+ (NSString *)filePath -{ - return [FBSDKAppEventsUtility persistenceFilePath:@"com-facebook-sdk-AppEventsPersistedEvents.json"]; -} -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h deleted file mode 100644 index e6362ca85..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKAccessToken; - -typedef NS_ENUM(NSUInteger, FBSDKAdvertisingTrackingStatus) -{ - FBSDKAdvertisingTrackingAllowed, - FBSDKAdvertisingTrackingDisallowed, - FBSDKAdvertisingTrackingUnspecified -}; - -typedef NS_ENUM(NSUInteger, FBSDKAppEventsFlushReason) -{ - FBSDKAppEventsFlushReasonExplicit, - FBSDKAppEventsFlushReasonTimer, - FBSDKAppEventsFlushReasonSessionChange, - FBSDKAppEventsFlushReasonPersistedEvents, - FBSDKAppEventsFlushReasonEventThreshold, - FBSDKAppEventsFlushReasonEagerlyFlushingEvent -}; - -@interface FBSDKAppEventsUtility : NSObject - -+ (NSMutableDictionary *)activityParametersDictionaryForEvent:(NSString *)eventCategory - implicitEventsOnly:(BOOL)implicitEventsOnly - shouldAccessAdvertisingID:(BOOL)shouldAccessAdvertisingID; -+ (NSString *)advertiserID; -+ (FBSDKAdvertisingTrackingStatus)advertisingTrackingStatus; -+ (NSString *)attributionID; -+ (void)ensureOnMainThread:(NSString *)methodName className:(NSString *)className; -+ (NSString *)flushReasonToString:(FBSDKAppEventsFlushReason)flushReason; -+ (void)logAndNotify:(NSString *)msg allowLogAsDeveloperError:(BOOL)allowLogAsDeveloperError; -+ (void)logAndNotify:(NSString *)msg; -+ (NSString *)persistenceFilePath:(NSString *)filename; -+ (NSString *)tokenStringToUseFor:(FBSDKAccessToken *)token; -+ (long)unixTimeNow; -+ (BOOL)validateIdentifier:(NSString *)identifier; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.m deleted file mode 100644 index 6ffba8164..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.m +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppEventsUtility.h" - -#import - -#import "FBSDKAccessToken.h" -#import "FBSDKAppEvents.h" -#import "FBSDKAppEventsDeviceInfo.h" -#import "FBSDKConstants.h" -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKError.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKMacros.h" -#import "FBSDKSettings.h" -#import "FBSDKTimeSpentData.h" - -#define FBSDK_APPEVENTSUTILITY_ANONYMOUSIDFILENAME @"com-facebook-sdk-PersistedAnonymousID.json" -#define FBSDK_APPEVENTSUTILITY_ANONYMOUSID_KEY @"anon_id" -#define FBSDK_APPEVENTSUTILITY_MAX_IDENTIFIER_LENGTH 40 - -@implementation FBSDKAppEventsUtility - -+ (NSMutableDictionary *)activityParametersDictionaryForEvent:(NSString *)eventCategory - implicitEventsOnly:(BOOL)implicitEventsOnly - shouldAccessAdvertisingID:(BOOL)shouldAccessAdvertisingID { - NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; - parameters[@"event"] = eventCategory; - - NSString *attributionID = [[self class] attributionID]; // Only present on iOS 6 and below. - [FBSDKInternalUtility dictionary:parameters setObject:attributionID forKey:@"attribution"]; - - if (!implicitEventsOnly && shouldAccessAdvertisingID) { - NSString *advertiserID = [[self class] advertiserID]; - [FBSDKInternalUtility dictionary:parameters setObject:advertiserID forKey:@"advertiser_id"]; - } - - parameters[FBSDK_APPEVENTSUTILITY_ANONYMOUSID_KEY] = [self anonymousID]; - - FBSDKAdvertisingTrackingStatus advertisingTrackingStatus = [[self class] advertisingTrackingStatus]; - if (advertisingTrackingStatus != FBSDKAdvertisingTrackingUnspecified) { - BOOL allowed = (advertisingTrackingStatus == FBSDKAdvertisingTrackingAllowed); - parameters[@"advertiser_tracking_enabled"] = [@(allowed) stringValue]; - } - - parameters[@"application_tracking_enabled"] = [@(!FBSDKSettings.limitEventAndDataUsage) stringValue]; - - NSString *userID = [FBSDKAppEvents userID]; - if (userID) { - parameters[@"app_user_id"] = userID; - } - - [FBSDKAppEventsDeviceInfo extendDictionaryWithDeviceInfo:parameters]; - - static dispatch_once_t fetchBundleOnce; - static NSMutableArray *urlSchemes; - - dispatch_once(&fetchBundleOnce, ^{ - NSBundle *mainBundle = [NSBundle mainBundle]; - urlSchemes = [[NSMutableArray alloc] init]; - for (NSDictionary *fields in [mainBundle objectForInfoDictionaryKey:@"CFBundleURLTypes"]) { - NSArray *schemesForType = [fields objectForKey:@"CFBundleURLSchemes"]; - if (schemesForType) { - [urlSchemes addObjectsFromArray:schemesForType]; - } - } - }); - - if (urlSchemes.count > 0) { - [parameters setObject:[FBSDKInternalUtility JSONStringForObject:urlSchemes error:NULL invalidObjectHandler:NULL] - forKey:@"url_schemes"]; - } - - return parameters; -} - -+ (NSString *)advertiserID -{ - NSString *result = nil; - - Class ASIdentifierManagerClass = fbsdkdfl_ASIdentifierManagerClass(); - if ([ASIdentifierManagerClass class]) { - ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager]; - result = [[manager advertisingIdentifier] UUIDString]; - } - - return result; -} - -+ (FBSDKAdvertisingTrackingStatus)advertisingTrackingStatus -{ - static dispatch_once_t fetchAdvertisingTrackingStatusOnce; - static FBSDKAdvertisingTrackingStatus status; - - dispatch_once(&fetchAdvertisingTrackingStatusOnce, ^{ - status = FBSDKAdvertisingTrackingUnspecified; - Class ASIdentifierManagerClass = fbsdkdfl_ASIdentifierManagerClass(); - if ([ASIdentifierManagerClass class]) { - ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager]; - if (manager) { - status = [manager isAdvertisingTrackingEnabled] ? FBSDKAdvertisingTrackingAllowed : FBSDKAdvertisingTrackingDisallowed; - } - } - }); - - return status; -} - -+ (NSString *)anonymousID -{ - // Grab previously written anonymous ID and, if none have been generated, create and - // persist a new one which will remain associated with this app. - NSString *result = [[self class] retrievePersistedAnonymousID]; - if (!result) { - // Generate a new anonymous ID. Create as a UUID, but then prepend the fairly - // arbitrary 'XZ' to the front so it's easily distinguishable from IDFA's which - // will only contain hex. - result = [NSString stringWithFormat:@"XZ%@", [[NSUUID UUID] UUIDString]]; - - [self persistAnonymousID:result]; - } - return result; -} - -+ (NSString *)attributionID -{ -#if TARGET_OS_TV - return nil; -#else - return [[UIPasteboard pasteboardWithName:@"fb_app_attribution" create:NO] string]; -#endif -} - -// for tests only. -+ (void)clearLibraryFiles -{ - [[NSFileManager defaultManager] removeItemAtPath:[[self class] persistenceFilePath:FBSDK_APPEVENTSUTILITY_ANONYMOUSIDFILENAME] - error:NULL]; - [[NSFileManager defaultManager] removeItemAtPath:[[self class] persistenceFilePath:FBSDKTimeSpentFilename] - error:NULL]; -} - -+ (void)ensureOnMainThread:(NSString *)methodName className:(NSString *)className -{ - FBSDKConditionalLog([NSThread isMainThread], - FBSDKLoggingBehaviorDeveloperErrors, - @"*** <%@, %@> is not called on the main thread. This can lead to errors.", - methodName, - className); -} - -+ (NSString *)flushReasonToString:(FBSDKAppEventsFlushReason)flushReason -{ - NSString *result = @"Unknown"; - switch (flushReason) { - case FBSDKAppEventsFlushReasonExplicit: - result = @"Explicit"; - break; - case FBSDKAppEventsFlushReasonTimer: - result = @"Timer"; - break; - case FBSDKAppEventsFlushReasonSessionChange: - result = @"SessionChange"; - break; - case FBSDKAppEventsFlushReasonPersistedEvents: - result = @"PersistedEvents"; - break; - case FBSDKAppEventsFlushReasonEventThreshold: - result = @"EventCountThreshold"; - break; - case FBSDKAppEventsFlushReasonEagerlyFlushingEvent: - result = @"EagerlyFlushingEvent"; - break; - } - return result; -} - -+ (void)logAndNotify:(NSString *)msg -{ - [[self class] logAndNotify:msg allowLogAsDeveloperError:YES]; -} - -+ (void)logAndNotify:(NSString *)msg allowLogAsDeveloperError:(BOOL)allowLogAsDeveloperError -{ - NSString *behaviorToLog = FBSDKLoggingBehaviorAppEvents; - if (allowLogAsDeveloperError) { - if ([[FBSDKSettings loggingBehavior] containsObject:FBSDKLoggingBehaviorDeveloperErrors]) { - // Rather than log twice, prefer 'DeveloperErrors' if it's set over AppEvents. - behaviorToLog = FBSDKLoggingBehaviorDeveloperErrors; - } - } - - [FBSDKLogger singleShotLogEntry:behaviorToLog logEntry:msg]; - NSError *error = [FBSDKError errorWithCode:FBSDKAppEventsFlushErrorCode message:msg]; - [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKAppEventsLoggingResultNotification object:error]; -} - -+ (BOOL)matchString:(NSString *)string - firstCharacterSet:(NSCharacterSet *)firstCharacterSet -restOfStringCharacterSet:(NSCharacterSet *)restOfStringCharacterSet -{ - if (string.length == 0) { - return NO; - } - for (NSUInteger i = 0; i < string.length; i++) { - const unichar c = [string characterAtIndex:i]; - if (i == 0) { - if (![firstCharacterSet characterIsMember:c]) { - return NO; - } - } else { - if (![restOfStringCharacterSet characterIsMember:c]) { - return NO; - } - } - } - return YES; -} - -+ (BOOL)regexValidateIdentifier:(NSString *)identifier -{ - static NSCharacterSet *firstCharacterSet; - static NSCharacterSet *restOfStringCharacterSet; - static dispatch_once_t onceToken; - static NSMutableSet *cachedIdentifiers; - dispatch_once(&onceToken, ^{ - NSMutableCharacterSet *mutableSet = [NSMutableCharacterSet alphanumericCharacterSet]; - [mutableSet addCharactersInString:@"_"]; - firstCharacterSet = [mutableSet copy]; - - [mutableSet addCharactersInString:@"- "]; - restOfStringCharacterSet = [mutableSet copy]; - cachedIdentifiers = [[NSMutableSet alloc] init]; - }); - - @synchronized(self) { - if (![cachedIdentifiers containsObject:identifier]) { - if ([self matchString:identifier - firstCharacterSet:firstCharacterSet - restOfStringCharacterSet:restOfStringCharacterSet]) { - [cachedIdentifiers addObject:identifier]; - } else { - return NO; - } - } - } - return YES; -} - -+ (BOOL)validateIdentifier:(NSString *)identifier -{ - if (identifier == nil || identifier.length == 0 || identifier.length > FBSDK_APPEVENTSUTILITY_MAX_IDENTIFIER_LENGTH || ![[self class] regexValidateIdentifier:identifier]) { - [[self class] logAndNotify:[NSString stringWithFormat:@"Invalid identifier: '%@'. Must be between 1 and %d characters, and must be contain only alphanumerics, _, - or spaces, starting with alphanumeric or _.", - identifier, FBSDK_APPEVENTSUTILITY_MAX_IDENTIFIER_LENGTH]]; - return NO; - } - - return YES; -} - -+ (void)persistAnonymousID:(NSString *)anonymousID -{ - [[self class] ensureOnMainThread:NSStringFromSelector(_cmd) className:NSStringFromClass(self)]; - NSDictionary *data = @{ FBSDK_APPEVENTSUTILITY_ANONYMOUSID_KEY : anonymousID }; - NSString *content = [FBSDKInternalUtility JSONStringForObject:data error:NULL invalidObjectHandler:NULL]; - - [content writeToFile:[[self class] persistenceFilePath:FBSDK_APPEVENTSUTILITY_ANONYMOUSIDFILENAME] - atomically:YES - encoding:NSASCIIStringEncoding - error:nil]; -} - -+ (NSString *)persistenceFilePath:(NSString *)filename -{ - NSSearchPathDirectory directory = NSLibraryDirectory; - NSArray *paths = NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES); - NSString *docDirectory = [paths objectAtIndex:0]; - return [docDirectory stringByAppendingPathComponent:filename]; -} - -+ (NSString *)retrievePersistedAnonymousID -{ - [[self class] ensureOnMainThread:NSStringFromSelector(_cmd) className:NSStringFromClass(self)]; - NSString *file = [[self class] persistenceFilePath:FBSDK_APPEVENTSUTILITY_ANONYMOUSIDFILENAME]; - NSString *content = [[NSString alloc] initWithContentsOfFile:file - encoding:NSASCIIStringEncoding - error:nil]; - NSDictionary *results = [FBSDKInternalUtility objectForJSONString:content error:NULL]; - return [results objectForKey:FBSDK_APPEVENTSUTILITY_ANONYMOUSID_KEY]; -} - -// Given a candidate token (which may be nil), find the real token to string to use. -// Precedence: 1) provided token, 2) current token, 3) app | client token, 4) fully anonymous session. -+ (NSString *)tokenStringToUseFor:(FBSDKAccessToken *)token -{ - if (!token) { - token = [FBSDKAccessToken currentAccessToken]; - } - - NSString *appID = [FBSDKAppEvents loggingOverrideAppID] ?: token.appID ?: [FBSDKSettings appID]; - NSString *tokenString = token.tokenString; - if (!tokenString || ![appID isEqualToString:token.appID]) { - // If there's an logging override app id present, then we don't want to use the client token since the client token - // is intended to match up with the primary app id (and AppEvents doesn't require a client token). - NSString *clientTokenString = [FBSDKSettings clientToken]; - if (clientTokenString && appID && [appID isEqualToString:token.appID]){ - tokenString = [NSString stringWithFormat:@"%@|%@", appID, clientTokenString]; - } else if (appID) { - tokenString = nil; - } - } - return tokenString; -} - -+ (long)unixTimeNow -{ - return (long)round([[NSDate date] timeIntervalSince1970]); -} - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h deleted file mode 100644 index a5f7a77ab..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -// Class to encapsulate implicit logging of purchase events -@interface FBSDKPaymentObserver : NSObject -+ (void)startObservingTransactions; -+ (void)stopObservingTransactions; -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.m deleted file mode 100644 index 31a6c0ddc..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.m +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKPaymentObserver.h" - -#import - -#import "FBSDKAppEvents+Internal.h" -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKLogger.h" -#import "FBSDKSettings.h" - -static NSString *const FBSDKAppEventParameterImplicitlyLoggedPurchase = @"_implicitlyLogged"; -static NSString *const FBSDKAppEventNamePurchaseFailed = @"fb_mobile_purchase_failed"; -static NSString *const FBSDKAppEventParameterNameProductTitle = @"fb_content_title"; -static NSString *const FBSDKAppEventParameterNameTransactionID = @"fb_transaction_id"; -static int const FBSDKMaxParameterValueLength = 100; -static NSMutableArray *g_pendingRequestors; - -@interface FBSDKPaymentProductRequestor : NSObject - -@property (nonatomic, retain) SKPaymentTransaction *transaction; - -- (instancetype)initWithTransaction:(SKPaymentTransaction*)transaction; -- (void)resolveProducts; - -@end - -@interface FBSDKPaymentObserver() -@end - -@implementation FBSDKPaymentObserver -{ - BOOL _observingTransactions; -} - -+ (void)startObservingTransactions -{ - [[self singleton] startObservingTransactions]; -} - -+ (void)stopObservingTransactions -{ - [[self singleton] stopObservingTransactions]; -} - -// -// Internal methods -// - -+ (FBSDKPaymentObserver *)singleton -{ - static dispatch_once_t pred; - static FBSDKPaymentObserver *shared = nil; - - dispatch_once(&pred, ^{ - shared = [[FBSDKPaymentObserver alloc] init]; - }); - return shared; -} - -- (instancetype) init -{ - self = [super init]; - if (self) { - _observingTransactions = NO; - } - return self; -} - -- (void)startObservingTransactions -{ - @synchronized (self) { - if (!_observingTransactions) { - [(SKPaymentQueue *)[fbsdkdfl_SKPaymentQueueClass() defaultQueue] addTransactionObserver:self]; - _observingTransactions = YES; - } - } -} - -- (void)stopObservingTransactions -{ - @synchronized (self) { - if (_observingTransactions) { - [(SKPaymentQueue *)[fbsdkdfl_SKPaymentQueueClass() defaultQueue] removeTransactionObserver:self]; - _observingTransactions = NO; - } - } -} - -- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions -{ - for (SKPaymentTransaction *transaction in transactions) { - switch (transaction.transactionState) { - case SKPaymentTransactionStatePurchasing: - case SKPaymentTransactionStatePurchased: - case SKPaymentTransactionStateFailed: - [self handleTransaction:transaction]; - break; - case SKPaymentTransactionStateDeferred: - case SKPaymentTransactionStateRestored: - break; - } - } -} - -- (void)handleTransaction:(SKPaymentTransaction *)transaction -{ - // Ignore restored transaction - if (transaction.originalTransaction != nil) { - return; - } - FBSDKPaymentProductRequestor *productRequest = [[FBSDKPaymentProductRequestor alloc] initWithTransaction:transaction]; - [productRequest resolveProducts]; -} - -@end - -@interface FBSDKPaymentProductRequestor() -@property (nonatomic, retain) SKProductsRequest *productRequest; -@end - -@implementation FBSDKPaymentProductRequestor - -+ (void)initialize -{ - if ([self class] == [FBSDKPaymentProductRequestor class]) { - g_pendingRequestors = [[NSMutableArray alloc] init]; - } -} - -- (instancetype)initWithTransaction:(SKPaymentTransaction*)transaction -{ - self = [super init]; - if (self) { - _transaction = transaction; - } - return self; -} - -- (void)setProductRequest:(SKProductsRequest *)productRequest -{ - if (productRequest != _productRequest) { - if (_productRequest) { - _productRequest.delegate = nil; - } - _productRequest = productRequest; - } -} - -- (void)resolveProducts -{ - NSString *productId = self.transaction.payment.productIdentifier; - NSSet *productIdentifiers = [NSSet setWithObjects:productId, nil]; - self.productRequest = [[fbsdkdfl_SKProductsRequestClass() alloc] initWithProductIdentifiers:productIdentifiers]; - self.productRequest.delegate = self; - @synchronized(g_pendingRequestors) { - [g_pendingRequestors addObject:self]; - } - [self.productRequest start]; -} - -- (NSString *)getTruncatedString:(NSString *)inputString -{ - if (!inputString) { - return @""; - } - - return [inputString length] <= FBSDKMaxParameterValueLength ? inputString : [inputString substringToIndex:FBSDKMaxParameterValueLength]; -} - -- (void)logTransactionEvent:(SKProduct *)product -{ - NSString *eventName = nil; - NSString *transactionID = nil; - switch (self.transaction.transactionState) { - case SKPaymentTransactionStatePurchasing: - eventName = FBSDKAppEventNameInitiatedCheckout; - break; - case SKPaymentTransactionStatePurchased: - eventName = FBSDKAppEventNamePurchased; - transactionID = self.transaction.transactionIdentifier; - break; - case SKPaymentTransactionStateFailed: - eventName = FBSDKAppEventNamePurchaseFailed; - break; - case SKPaymentTransactionStateDeferred: - case SKPaymentTransactionStateRestored: - return; - } - if (!eventName) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - formatString:@"FBSDKPaymentObserver logTransactionEvent: event name cannot be nil"]; - return; - } - - SKPayment *payment = self.transaction.payment; - NSMutableDictionary *eventParameters = [NSMutableDictionary dictionaryWithDictionary: @{ - FBSDKAppEventParameterNameContentID: payment.productIdentifier ?: @"", - FBSDKAppEventParameterNameNumItems: @(payment.quantity), - }]; - double totalAmount = 0; - if (product) { - totalAmount = payment.quantity * product.price.doubleValue; - [eventParameters addEntriesFromDictionary: @{ - FBSDKAppEventParameterNameCurrency: [product.priceLocale objectForKey:NSLocaleCurrencyCode], - FBSDKAppEventParameterNameNumItems: @(payment.quantity), - FBSDKAppEventParameterNameProductTitle: [self getTruncatedString:product.localizedTitle], - FBSDKAppEventParameterNameDescription: [self getTruncatedString:product.localizedDescription], - }]; - if (transactionID) { - [eventParameters setObject:transactionID forKey:FBSDKAppEventParameterNameTransactionID]; - } - } - - [self logImplicitPurchaseEvent:eventName - valueToSum:totalAmount - parameters:eventParameters]; -} - -- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response -{ - NSArray* products = response.products; - NSArray* invalidProductIdentifiers = response.invalidProductIdentifiers; - if (products.count + invalidProductIdentifiers.count != 1) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - formatString:@"FBSDKPaymentObserver: Expect to resolve one product per request"]; - } - SKProduct *product = nil; - if (products.count) { - product = products[0]; - } - [self logTransactionEvent:product]; -} - -- (void)requestDidFinish:(SKRequest *)request -{ - [self cleanUp]; -} - -- (void)request:(SKRequest *)request didFailWithError:(NSError *)error -{ - [self logTransactionEvent:nil]; - [self cleanUp]; -} - -- (void)cleanUp -{ - @synchronized(g_pendingRequestors) { - [g_pendingRequestors removeObject:self]; - } -} - -- (void)logImplicitPurchaseEvent:(NSString *)eventName - valueToSum:(double)valueToSum - parameters:(NSDictionary *)parameters { - NSMutableDictionary *eventParameters = [NSMutableDictionary dictionaryWithDictionary:parameters]; - - if ([eventName isEqualToString:FBSDKAppEventNamePurchased]) { - NSData* receipt = [self fetchDeviceReceipt]; - if (receipt) { - NSString *base64encodedReceipt = [receipt base64EncodedStringWithOptions:0]; - eventParameters[@"receipt_data"] = base64encodedReceipt; - } - } - - [eventParameters setObject:@"1"forKey:FBSDKAppEventParameterImplicitlyLoggedPurchase]; - [FBSDKAppEvents logEvent:eventName - valueToSum:valueToSum - parameters:eventParameters]; - - // Unless the behavior is set to only allow explicit flushing, we go ahead and flush, since purchase events - // are relatively rare and relatively high value and worth getting across on wire right away. - if ([FBSDKAppEvents flushBehavior] != FBSDKAppEventsFlushBehaviorExplicitOnly) { - [[FBSDKAppEvents singleton] flushForReason:FBSDKAppEventsFlushReasonEagerlyFlushingEvent]; - } -} - -// Fetch the current receipt for this application. -- (NSData*)fetchDeviceReceipt { - NSURL *receiptURL = [[NSBundle bundleForClass:[self class]] appStoreReceiptURL]; - NSData *receipt = [NSData dataWithContentsOfURL:receiptURL]; - return receipt; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h deleted file mode 100644 index 12f2f3a27..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -FBSDK_EXTERN NSString *const FBSDKTimeSpentFilename; - -// Class to encapsulate persisting of time spent data collected by [FBSDKAppEvents activateApp]. The activate app App Event is -// logged when restore: is called with sufficient time since the last deactivation. -@interface FBSDKTimeSpentData : NSObject - -+ (void)suspend; -+ (void)restore:(BOOL)calledFromActivateApp; - -+ (void)setSourceApplication:(NSString *)sourceApplication openURL:(NSURL *)url; -+ (void)setSourceApplication:(NSString *)sourceApplication isFromAppLink:(BOOL)isFromAppLink; -+ (void)registerAutoResetSourceApplication; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.m deleted file mode 100644 index 8fb87e3b3..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.m +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKTimeSpentData.h" - -#import "FBSDKAppEvents+Internal.h" -#import "FBSDKAppEventsUtility.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKServerConfiguration.h" -#import "FBSDKServerConfigurationManager.h" -#import "FBSDKSettings.h" - - -// Filename and keys for session length -NSString *const FBSDKTimeSpentFilename = @"com-facebook-sdk-AppEventsTimeSpent.json"; -static NSString *const FBSDKTimeSpentPersistKeySessionSecondsSpent = @"secondsSpentInCurrentSession"; -static NSString *const FBSDKTimeSpentPersistKeySessionNumInterruptions = @"numInterruptions"; -static NSString *const FBSDKTimeSpentPersistKeyLastSuspendTime = @"lastSuspendTime"; -static NSString *const FBSDKTimeSpentPersistKeySessionID = @"sessionID"; - -static NSString *const FBSDKAppEventNameActivatedApp = @"fb_mobile_activate_app"; -static NSString *const FBSDKAppEventNameDeactivatedApp = @"fb_mobile_deactivate_app"; -static NSString *const FBSDKAppEventParameterNameSessionInterruptions = @"fb_mobile_app_interruptions"; -static NSString *const FBSDKAppEventParameterNameTimeBetweenSessions = @"fb_mobile_time_between_sessions"; -static NSString *const FBSDKAppEventParameterNameSessionID = @"_session_id"; - - -static const int SECS_PER_MIN = 60; -static const int SECS_PER_HOUR = 60 * SECS_PER_MIN; -static const int SECS_PER_DAY = 24 * SECS_PER_HOUR; - -static NSString *g_sourceApplication; -static BOOL g_isOpenedFromAppLink; - -// Will be translated and displayed in App Insights. Need to maintain same number and value of quanta on the server. -static const long INACTIVE_SECONDS_QUANTA[] = -{ - 5 * SECS_PER_MIN, - 15 * SECS_PER_MIN, - 30 * SECS_PER_MIN, - 1 * SECS_PER_HOUR, - 6 * SECS_PER_HOUR, - 12 * SECS_PER_HOUR, - 1 * SECS_PER_DAY, - 2 * SECS_PER_DAY, - 3 * SECS_PER_DAY, - 7 * SECS_PER_DAY, - 14 * SECS_PER_DAY, - 21 * SECS_PER_DAY, - 28 * SECS_PER_DAY, - 60 * SECS_PER_DAY, - 90 * SECS_PER_DAY, - 120 * SECS_PER_DAY, - 150 * SECS_PER_DAY, - 180 * SECS_PER_DAY, - 365 * SECS_PER_DAY, - LONG_MAX, // keep as LONG_MAX to guarantee loop will terminate -}; - -/** - * This class encapsulates the notion of an app 'session' - the length of time that the user has - * spent in the app that can be considered a single usage of the app. Apps may be frequently interrupted - * do to other device activity, like a text message, so this class allows those interruptions to be smoothed - * out and the time actually spent in the app excluding this interruption time to be accumulated. Also, - * once a certain amount of time has gone by where the app is not in the foreground, we consider the - * session to be complete, and a new session beginning. When this occurs, we log a 'deactivate app' event - * with the duration of the previous session as the 'value' of this event, along with the number of - * interruptions from that previous session as an event parameter. - */ -@implementation FBSDKTimeSpentData -{ - BOOL _isCurrentlyLoaded; - BOOL _shouldLogActivateEvent; - BOOL _shouldLogDeactivateEvent; - long _secondsSpentInCurrentSession; - long _timeSinceLastSuspend; - int _numInterruptionsInCurrentSession; - long _lastRestoreTime; - long _lastSuspendTime; - NSString *_sessionID; -} - -// -// Public methods -// - -+ (void)suspend -{ - [self.singleton instanceSuspend]; -} - -+ (void)restore:(BOOL)calledFromActivateApp -{ - [self.singleton instanceRestore:calledFromActivateApp]; -} - -// -// Internal methods -// -+ (FBSDKTimeSpentData *)singleton -{ - static dispatch_once_t pred; - static FBSDKTimeSpentData *shared = nil; - - dispatch_once(&pred, ^{ - shared = [[FBSDKTimeSpentData alloc] init]; - }); - return shared; -} - -// Calculate and persist time spent data for this instance of the app activation. -- (void)instanceSuspend -{ - - [FBSDKAppEventsUtility ensureOnMainThread:NSStringFromSelector(_cmd) className:NSStringFromClass([self class])]; - if (!_isCurrentlyLoaded) { - FBSDKConditionalLog(YES, FBSDKLoggingBehaviorInformational, @"[FBSDKTimeSpentData suspend] invoked without corresponding restore"); - return; - } - - long now = [FBSDKAppEventsUtility unixTimeNow]; - long timeSinceRestore = now - _lastRestoreTime; - - // Can happen if the clock on the device is changed - if (timeSinceRestore < 0) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - formatString:@"Clock skew detected"]; - timeSinceRestore = 0; - } - - _secondsSpentInCurrentSession += timeSinceRestore; - - NSDictionary *timeSpentData = - @{ - FBSDKTimeSpentPersistKeySessionSecondsSpent : @(_secondsSpentInCurrentSession), - FBSDKTimeSpentPersistKeySessionNumInterruptions : @(_numInterruptionsInCurrentSession), - FBSDKTimeSpentPersistKeyLastSuspendTime : @(now), - FBSDKTimeSpentPersistKeySessionID : _sessionID, - }; - - NSString *content = [FBSDKInternalUtility JSONStringForObject:timeSpentData error:NULL invalidObjectHandler:NULL]; - - [content writeToFile:[FBSDKAppEventsUtility persistenceFilePath:FBSDKTimeSpentFilename] - atomically:YES - encoding:NSASCIIStringEncoding - error:nil]; - - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - formatString:@"FBSDKTimeSpentData Persist: %@", content]; - - _isCurrentlyLoaded = NO; -} - - -// Called during activation - either through an explicit 'activateApp' call or implicitly when the app is foregrounded. -// In both cases, we restore the persisted event data. In the case of the activateApp, we log an 'app activated' -// event if there's been enough time between the last deactivation and now. -- (void)instanceRestore:(BOOL)calledFromActivateApp -{ - - [FBSDKAppEventsUtility ensureOnMainThread:NSStringFromSelector(_cmd) className:NSStringFromClass([self class])]; - - // It's possible to call this multiple times during the time the app is in the foreground. If this is the case, - // just restore persisted data the first time. - if (!_isCurrentlyLoaded) { - - NSString *content = - [[NSString alloc] initWithContentsOfFile:[FBSDKAppEventsUtility persistenceFilePath:FBSDKTimeSpentFilename] - usedEncoding:nil - error:nil]; - - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAppEvents - formatString:@"FBSDKTimeSpentData Restore: %@", content]; - - long now = [FBSDKAppEventsUtility unixTimeNow]; - if (!content) { - - // Nothing persisted, so this is the first launch. - _sessionID = [[NSUUID UUID] UUIDString]; - _secondsSpentInCurrentSession = 0; - _numInterruptionsInCurrentSession = 0; - _lastSuspendTime = 0; - - // We want to log the app activation event on the first launch, but not the deactivate event - _shouldLogActivateEvent = YES; - _shouldLogDeactivateEvent = NO; - - } else { - - NSDictionary *results = [FBSDKInternalUtility objectForJSONString:content error:NULL]; - - _lastSuspendTime = [[results objectForKey:FBSDKTimeSpentPersistKeyLastSuspendTime] longValue]; - - _timeSinceLastSuspend = now - _lastSuspendTime; - _secondsSpentInCurrentSession = [[results objectForKey:FBSDKTimeSpentPersistKeySessionSecondsSpent] intValue]; - _sessionID = results[FBSDKTimeSpentPersistKeySessionID] ? : [[NSUUID UUID] UUIDString]; - _numInterruptionsInCurrentSession = [[results objectForKey:FBSDKTimeSpentPersistKeySessionNumInterruptions] intValue]; - _shouldLogActivateEvent = (_timeSinceLastSuspend > [FBSDKServerConfigurationManager cachedServerConfiguration].sessionTimoutInterval); - - // Other than the first launch, we always log the last session's deactivate with this session's activate. - _shouldLogDeactivateEvent = _shouldLogActivateEvent; - - if (!_shouldLogDeactivateEvent) { - // If we're not logging, then the time we spent deactivated is considered another interruption. But cap it - // so errant or test uses doesn't blow out the cardinality on the backend processing - _numInterruptionsInCurrentSession = MIN(_numInterruptionsInCurrentSession + 1, 200); - } - - } - - _lastRestoreTime = now; - _isCurrentlyLoaded = YES; - - if (calledFromActivateApp) { - // It's important to log deactivate first to reset sessionID - if (_shouldLogDeactivateEvent) { - [FBSDKAppEvents logEvent:FBSDKAppEventNameDeactivatedApp - valueToSum:_secondsSpentInCurrentSession - parameters:[self appEventsParametersForDeactivate]]; - - // We've logged the session stats, now reset. - _secondsSpentInCurrentSession = 0; - _numInterruptionsInCurrentSession = 0; - _sessionID = [[NSUUID UUID] UUIDString]; - } - - if (_shouldLogActivateEvent) { - [FBSDKAppEvents logEvent:FBSDKAppEventNameActivatedApp - parameters:[self appEventsParametersForActivate]]; - // Unless the behavior is set to only allow explicit flushing, we go ahead and flush. App launch - // events are critical to Analytics so we don't want to lose them. - if ([FBSDKAppEvents flushBehavior] != FBSDKAppEventsFlushBehaviorExplicitOnly) { - [[FBSDKAppEvents singleton] flushForReason:FBSDKAppEventsFlushReasonEagerlyFlushingEvent]; - } - } - } - } -} - -- (NSDictionary *)appEventsParametersForActivate -{ - return @{ - FBSDKAppEventParameterLaunchSource: [[self class] getSourceApplication], - FBSDKAppEventParameterNameSessionID: _sessionID, - }; -} - -- (NSDictionary *)appEventsParametersForDeactivate -{ - int quantaIndex = 0; - while (_timeSinceLastSuspend > INACTIVE_SECONDS_QUANTA[quantaIndex]) { - quantaIndex++; - } - - NSMutableDictionary *params = [@{ FBSDKAppEventParameterNameSessionInterruptions : @(_numInterruptionsInCurrentSession), - FBSDKAppEventParameterNameTimeBetweenSessions : [NSString stringWithFormat:@"session_quanta_%d", quantaIndex], - FBSDKAppEventParameterLaunchSource: [[self class] getSourceApplication], - FBSDKAppEventParameterNameSessionID : _sessionID ?: @"", - } mutableCopy]; - if (_lastSuspendTime) { - params[FBSDKAppEventParameterLogTime] = @(_lastSuspendTime); - } - return [params copy]; -} - -+ (void)setSourceApplication:(NSString *)sourceApplication openURL:(NSURL *)url -{ - [self setSourceApplication:sourceApplication - isFromAppLink:[FBSDKInternalUtility dictionaryFromFBURL:url][@"al_applink_data"] != nil]; -} - -+ (void)setSourceApplication:(NSString *)sourceApplication isFromAppLink:(BOOL)isFromAppLink -{ - g_isOpenedFromAppLink = isFromAppLink; - g_sourceApplication = sourceApplication; -} - -+ (NSString *)getSourceApplication -{ - NSString *openType = @"Unclassified"; - if (g_isOpenedFromAppLink) { - openType = @"AppLink"; - } - return (g_sourceApplication ? - [NSString stringWithFormat:@"%@(%@)", openType, g_sourceApplication] - : openType); -} - -+ (void)resetSourceApplication -{ - g_sourceApplication = nil; - g_isOpenedFromAppLink = NO; -} - -+ (void)registerAutoResetSourceApplication -{ - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(resetSourceApplication) - name:UIApplicationDidEnterBackgroundNotification - object:nil]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h deleted file mode 100644 index c42431b80..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKBoltsMeasurementEventListener : NSObject -+ (FBSDKBoltsMeasurementEventListener *)defaultListener; -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.m deleted file mode 100644 index 415e02950..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.m +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKBoltsMeasurementEventListener.h" - -#import "FBSDKAppEvents+Internal.h" -#import "FBSDKTimeSpentData.h" - -static NSString *const BoltsMeasurementEventNotificationName = @"com.parse.bolts.measurement_event"; -static NSString *const BoltsMeasurementEventName = @"event_name"; -static NSString *const BoltsMeasurementEventArgs = @"event_args"; -static NSString *const BoltsMeasurementEventPrefix = @"bf_"; - -@implementation FBSDKBoltsMeasurementEventListener - -+ (instancetype)defaultListener -{ - static dispatch_once_t dispatchOnceLocker = 0; - static FBSDKBoltsMeasurementEventListener *defaultListener = nil; - dispatch_once(&dispatchOnceLocker, ^{ - defaultListener = [[self alloc] init]; - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - [center addObserver:defaultListener - selector:@selector(logFBAppEventForNotification:) - name:BoltsMeasurementEventNotificationName - object:nil]; - }); - return defaultListener; -} - -- (void)logFBAppEventForNotification:(NSNotification *)note -{ - // when catch al_nav_in event, we set source application for FBAppEvents. - if ([note.userInfo[BoltsMeasurementEventName] isEqualToString:@"al_nav_in"]) { - NSString *sourceApplication = note.userInfo[BoltsMeasurementEventArgs][@"sourceApplication"]; - if (sourceApplication) { - [FBSDKTimeSpentData setSourceApplication:sourceApplication isFromAppLink:YES]; - } - } - NSDictionary *eventArgs = note.userInfo[BoltsMeasurementEventArgs]; - NSMutableDictionary *logData = [[NSMutableDictionary alloc] init]; - for(NSString *key in eventArgs.allKeys) { - NSError *error = nil; - NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^0-9a-zA-Z _-]" options:0 error:&error]; - NSString *safeKey = [regex stringByReplacingMatchesInString:key - options:0 - range:NSMakeRange(0, [key length]) - withTemplate:@"-"]; - safeKey = [safeKey stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" -"]]; - logData[safeKey] = eventArgs[key]; - } - [FBSDKAppEvents logImplicitEvent:[BoltsMeasurementEventPrefix stringByAppendingString:note.userInfo[BoltsMeasurementEventName]] - valueToSum:nil - parameters:logData - accessToken:nil]; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h deleted file mode 100644 index 252e20547..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKBase64 : NSObject - -/** - Decodes a base-64 encoded string. - - Parameter string: The base-64 encoded string. - - Returns: NSData containing the decoded bytes. - */ -+ (NSData *)decodeAsData:(NSString *)string; - -/** - Decodes a base-64 encoded string into a string. - - Parameter string: The base-64 encoded string. - - Returns: NSString with the decoded UTF-8 value. - */ -+ (NSString *)decodeAsString:(NSString *)string; - -/** - Encodes data into a string. - - Parameter data: The data to be encoded. - - Returns: The base-64 encoded string. - */ -+ (NSString *)encodeData:(NSData *)data; - -/** - Encodes string into a base-64 representation. - - Parameter string: The string to be encoded. - - Returns: The base-64 encoded string. - */ -+ (NSString *)encodeString:(NSString *)string; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.m deleted file mode 100644 index c509d2e0b..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.m +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKBase64.h" - -#import "FBSDKMacros.h" - -@implementation FBSDKBase64 -{ - BOOL _optionsEnabled; -} - -static FBSDKBase64 *_decoder; -static FBSDKBase64 *_encoder; - -#pragma mark - Class Methods - -+ (void)initialize -{ - if (self == [FBSDKBase64 class]) { - BOOL optionsEnabled; - optionsEnabled = [NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)]; - _decoder = [[FBSDKBase64 alloc] initWithOptionsEnabled:optionsEnabled]; - optionsEnabled = [NSData instancesRespondToSelector:@selector(base64EncodedStringWithOptions:)]; - _encoder = [[FBSDKBase64 alloc] initWithOptionsEnabled:optionsEnabled]; - } -} - -+ (NSData *)decodeAsData:(NSString *)string -{ - return [_decoder decodeAsData:string]; -} - -+ (NSString *)decodeAsString:(NSString *)string -{ - return [_decoder decodeAsString:string]; -} - -+ (NSString *)encodeData:(NSData *)data -{ - return [_encoder encodeData:data]; -} - -+ (NSString *)encodeString:(NSString *)string -{ - return [_encoder encodeString:string]; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithOptionsEnabled:); - return nil; -} - -- (instancetype)initWithOptionsEnabled:(BOOL)optionsEnabled -{ - if ((self = [super init])) { - _optionsEnabled = optionsEnabled; - } - return self; -} - -#pragma mark - Implementation Methods - -- (NSData *)decodeAsData:(NSString *)string -{ - if (!string) { - return nil; - } - // This padding will be appended before stripping unknown characters, so if there are unknown characters of count % 4 - // it will not be able to decode. Since we assume valid base64 data, we will take this as is. - int needPadding = string.length % 4; - if (needPadding > 0) { - needPadding = 4 - needPadding; - string = [string stringByPaddingToLength:string.length+needPadding withString:@"=" startingAtIndex:0]; - } - if (_optionsEnabled) { - return [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters]; - } else { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - return [[NSData alloc] initWithBase64Encoding:string]; -#pragma clang diagnostic pop - } -} - -- (NSString *)decodeAsString:(NSString *)string -{ - NSData *data = [self decodeAsData:string]; - if (!data) { - return nil; - } - return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; -} - -- (NSString *)encodeData:(NSData *)data -{ - if (!data) { - return nil; - } - if (_optionsEnabled) { - return [data base64EncodedStringWithOptions:0]; - } else { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - return [data base64Encoding]; -#pragma clang diagnostic pop - } -} - -- (NSString *)encodeString:(NSString *)string -{ - return [self encodeData:[string dataUsingEncoding:NSUTF8StringEncoding]]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h deleted file mode 100644 index 7d488e7e2..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKBridgeAPIRequest.h" - -@interface FBSDKBridgeAPICrypto : NSObject - -+ (void)addCipherKeyToQueryParameters:(NSMutableDictionary *)queryParameters; -+ (NSDictionary *)decryptResponseForRequest:(FBSDKBridgeAPIRequest *)request - queryParameters:(NSDictionary *)queryParameters - error:(NSError *__autoreleasing *)errorRef; -+ (void)reset; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.m deleted file mode 100644 index 29d2eb450..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.m +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKBridgeAPICrypto.h" - -#import "FBSDKBridgeAPIProtocol.h" -#import "FBSDKConstants.h" -#import "FBSDKCrypto.h" -#import "FBSDKError.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKMacros.h" -#import "FBSDKSettings.h" -#import "FBSDKUtility.h" - -static NSString *const FBSDKBridgeAPICryptoCipherKey = @"cipher"; -static NSString *const FBSDKBridgeAPICryptoCipherKeyKey = @"cipher_key"; -static NSString *g_cipherKey = nil; - -@implementation FBSDKBridgeAPICrypto - -#pragma mark - Class Methods - -+ (void)addCipherKeyToQueryParameters:(NSMutableDictionary *)queryParameters -{ - [FBSDKInternalUtility dictionary:queryParameters setObject:[self _cipherKey] forKey:FBSDKBridgeAPICryptoCipherKeyKey]; -} - -+ (NSDictionary *)decryptResponseForRequest:(FBSDKBridgeAPIRequest *)request - queryParameters:(NSDictionary *)queryParameters - error:(NSError *__autoreleasing *)errorRef -{ - if (errorRef != NULL) { - *errorRef = nil; - } - NSString *cipher = queryParameters[FBSDKBridgeAPICryptoCipherKey]; - if (!cipher) { - return queryParameters ?: @{}; - } - NSString *version = queryParameters[FBSDKBridgeAPIVersionKey]; - NSString *cipherKey = [self _cipherKey]; - if (!version || !cipherKey) { - if (errorRef != NULL) { - NSDictionary *userInfo = @{ - FBSDKErrorArgumentValueKey: queryParameters, - }; - *errorRef = [FBSDKError errorWithCode:FBSDKEncryptionErrorCode - userInfo:userInfo - message:@"Error decrypting incoming query parameters." - underlyingError:nil]; - } - return nil; - } - NSArray *additionalSignedDataArray = @[ - [[NSBundle mainBundle] bundleIdentifier], - [FBSDKSettings appID] ?: @"", - @"bridge", - request.methodName ?: @"", - version, - ]; - NSString *additionalSignedDataString = [additionalSignedDataArray componentsJoinedByString:@":"]; - NSData *additionalSignedData = [additionalSignedDataString dataUsingEncoding:NSUTF8StringEncoding]; - FBSDKCrypto *crypto = [[FBSDKCrypto alloc] initWithMasterKey:cipherKey]; - NSData *decryptedData = [crypto decrypt:cipher additionalSignedData:additionalSignedData]; - if (!decryptedData) { - if (errorRef != NULL) { - NSDictionary *userInfo = @{ - FBSDKErrorArgumentValueKey: @{ - @"cipher": cipher, - @"bundleIdentifier": additionalSignedDataArray[0], - @"appID": additionalSignedDataArray[1], - @"host": additionalSignedDataArray[2], - @"methodName": additionalSignedDataArray[3], - @"version": additionalSignedDataArray[4], - }, - }; - *errorRef = [FBSDKError errorWithCode:FBSDKEncryptionErrorCode - userInfo:userInfo - message:@"Error decrypting incoming query parameters." - underlyingError:nil]; - } - return nil; - } - NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding]; - NSDictionary *decryptedDictionary = [FBSDKUtility dictionaryWithQueryString:decryptedString]; - NSMutableDictionary *decryptedQueryParameters = [[NSMutableDictionary alloc] initWithDictionary:decryptedDictionary]; - decryptedQueryParameters[FBSDKBridgeAPIVersionKey] = version; - return [decryptedQueryParameters copy]; -} - -+ (void)reset -{ - [self _resetCipherKey]; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -#pragma mark - Helper Methods - -+ (NSString *)_cipherKey -{ - if (g_cipherKey) { - return g_cipherKey; - } - g_cipherKey = [[[NSUserDefaults standardUserDefaults] stringForKey:FBSDKBridgeAPICryptoCipherKeyKey] copy]; - if (g_cipherKey) { - return g_cipherKey; - } - return [self _resetCipherKey]; -} - -+ (NSString *)_resetCipherKey -{ - g_cipherKey = [[FBSDKCrypto makeMasterKey] copy]; - [[NSUserDefaults standardUserDefaults] setObject:g_cipherKey forKey:FBSDKBridgeAPICryptoCipherKeyKey]; - return g_cipherKey; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h deleted file mode 100644 index 679577c4b..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKBridgeAPIProtocolType.h" - -@class FBSDKBridgeAPIRequest; - -FBSDK_EXTERN NSString *const FBSDKBridgeAPIAppIDKey; -FBSDK_EXTERN NSString *const FBSDKBridgeAPISchemeSuffixKey; -FBSDK_EXTERN NSString *const FBSDKBridgeAPIVersionKey; - -@protocol FBSDKBridgeAPIProtocol - -- (NSURL *)requestURLWithActionID:(NSString *)actionID - scheme:(NSString *)scheme - methodName:(NSString *)methodName - methodVersion:(NSString *)methodVersion - parameters:(NSDictionary *)parameters - error:(NSError *__autoreleasing *)errorRef; -- (NSDictionary *)responseParametersForActionID:(NSString *)actionID - queryParameters:(NSDictionary *)queryParameters - cancelled:(BOOL *)cancelledRef - error:(NSError *__autoreleasing *)errorRef; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h deleted file mode 100644 index b04e3592b..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -typedef NS_ENUM(NSUInteger, FBSDKBridgeAPIProtocolType) -{ - FBSDKBridgeAPIProtocolTypeNative, - FBSDKBridgeAPIProtocolTypeWeb, -}; diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h deleted file mode 100644 index 4455e2268..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKBridgeAPIProtocol.h" -#import "FBSDKBridgeAPIRequest.h" - -@interface FBSDKBridgeAPIRequest () - -- (instancetype)initWithProtocol:(id)protocol - protocolType:(FBSDKBridgeAPIProtocolType)protocolType - scheme:(NSString *)scheme - methodName:(NSString *)methodName - methodVersion:(NSString *)methodVersion - parameters:(NSDictionary *)parameters - userInfo:(NSDictionary *)userInfo -NS_DESIGNATED_INITIALIZER; - -@property (nonatomic, strong, readonly) id protocol; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h deleted file mode 100644 index 01af30c41..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKBridgeAPIProtocolType.h" - -@interface FBSDKBridgeAPIRequest : NSObject - -+ (instancetype)bridgeAPIRequestWithProtocolType:(FBSDKBridgeAPIProtocolType)protocolType - scheme:(NSString *)scheme - methodName:(NSString *)methodName - methodVersion:(NSString *)methodVersion - parameters:(NSDictionary *)parameters - userInfo:(NSDictionary *)userInfo; - -@property (nonatomic, copy, readonly) NSString *actionID; -@property (nonatomic, copy, readonly) NSString *methodName; -@property (nonatomic, copy, readonly) NSString *methodVersion; -@property (nonatomic, copy, readonly) NSDictionary *parameters; -@property (nonatomic, assign, readonly) FBSDKBridgeAPIProtocolType protocolType; -@property (nonatomic, copy, readonly) NSString *scheme; -@property (nonatomic, copy, readonly) NSDictionary *userInfo; - -- (NSURL *)requestURL:(NSError *__autoreleasing *)errorRef; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.m deleted file mode 100644 index e51e58b57..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.m +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKBridgeAPIRequest.h" -#import "FBSDKBridgeAPIRequest+Private.h" - -#import "FBSDKBridgeAPICrypto.h" -#import "FBSDKBridgeAPIProtocolNativeV1.h" -#import "FBSDKBridgeAPIProtocolWebV1.h" -#import "FBSDKBridgeAPIProtocolWebV2.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKMacros.h" -#import "FBSDKSettings.h" -#import "FBSDKUtility.h" - -NSString *const FBSDKBridgeAPIAppIDKey = @"app_id"; -NSString *const FBSDKBridgeAPISchemeSuffixKey = @"scheme_suffix"; -NSString *const FBSDKBridgeAPIVersionKey = @"version"; - -@implementation FBSDKBridgeAPIRequest - -#pragma mark - Class Methods - -+ (instancetype)bridgeAPIRequestWithProtocolType:(FBSDKBridgeAPIProtocolType)protocolType - scheme:(NSString *)scheme - methodName:(NSString *)methodName - methodVersion:(NSString *)methodVersion - parameters:(NSDictionary *)parameters - userInfo:(NSDictionary *)userInfo -{ - return [[self alloc] initWithProtocol:[self _protocolForType:protocolType scheme:scheme] - protocolType:protocolType - scheme:scheme - methodName:methodName - methodVersion:methodVersion - parameters:parameters - userInfo:userInfo]; -} - -+ (NSDictionary *)protocolMap -{ - static NSDictionary *_protocolMap; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - _protocolMap = @{ - @(FBSDKBridgeAPIProtocolTypeNative): @{ - FBSDK_CANOPENURL_FACEBOOK:[[FBSDKBridgeAPIProtocolNativeV1 alloc] initWithAppScheme:@"fbapi20130214"], - FBSDK_CANOPENURL_MESSENGER:[[FBSDKBridgeAPIProtocolNativeV1 alloc] initWithAppScheme:@"fb-messenger-share-api"], - FBSDK_CANOPENURL_MSQRD_PLAYER:[[FBSDKBridgeAPIProtocolNativeV1 alloc] initWithAppScheme:@"msqrdplayer-api20170208"] - }, - @(FBSDKBridgeAPIProtocolTypeWeb): @{ - @"https": [[FBSDKBridgeAPIProtocolWebV1 alloc] init], - @"web": [[FBSDKBridgeAPIProtocolWebV2 alloc] init] - }, - }; - }); - return _protocolMap; -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithProtocol:(id)protocol - protocolType:(FBSDKBridgeAPIProtocolType)protocolType - scheme:(NSString *)scheme - methodName:(NSString *)methodName - methodVersion:(NSString *)methodVersion - parameters:(NSDictionary *)parameters - userInfo:(NSDictionary *)userInfo -{ - if (!protocol) { - return nil; - } - if ((self = [super init])) { - _protocol = protocol; - _protocolType = protocolType; - _scheme = [scheme copy]; - _methodName = [methodName copy]; - _methodVersion = [methodVersion copy]; - _parameters = [parameters copy]; - _userInfo = [userInfo copy]; - - _actionID = [[NSUUID UUID] UUIDString]; - } - return self; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithProtocol:protocolType:scheme:methodName:methodVersion:parameters:userInfo:); - return [self initWithProtocol:nil - protocolType:FBSDKBridgeAPIProtocolTypeWeb - scheme:nil - methodName:nil - methodVersion:nil - parameters:nil - userInfo:nil]; -} - -#pragma mark - Public Methods - -- (NSURL *)requestURL:(NSError *__autoreleasing *)errorRef -{ - NSURL *requestURL = [_protocol requestURLWithActionID:self.actionID - scheme:self.scheme - methodName:self.methodName - methodVersion:self.methodVersion - parameters:self.parameters - error:errorRef]; - if (!requestURL) { - return nil; - } - - [FBSDKInternalUtility validateURLSchemes]; - - NSDictionary *requestQueryParameters = [FBSDKUtility dictionaryWithQueryString:requestURL.query]; - NSMutableDictionary *queryParameters = [[NSMutableDictionary alloc] initWithDictionary:requestQueryParameters]; - [FBSDKBridgeAPICrypto addCipherKeyToQueryParameters:queryParameters]; - [FBSDKInternalUtility dictionary:queryParameters setObject:[FBSDKSettings appID] forKey:FBSDKBridgeAPIAppIDKey]; - [FBSDKInternalUtility dictionary:queryParameters - setObject:[FBSDKSettings appURLSchemeSuffix] - forKey:FBSDKBridgeAPISchemeSuffixKey]; - requestURL = [FBSDKInternalUtility URLWithScheme:requestURL.scheme - host:requestURL.host - path:requestURL.path - queryParameters:queryParameters - error:errorRef]; - return requestURL; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - return self; -} - -+ (id)_protocolForType:(FBSDKBridgeAPIProtocolType)type scheme:(NSString *)scheme -{ - id protocol = [self protocolMap][@(type)][scheme]; - if (type == FBSDKBridgeAPIProtocolTypeWeb) { - return protocol; - } - NSURLComponents *components = [[NSURLComponents alloc] init]; - components.scheme = scheme; - components.path = @"/"; - if ([[UIApplication sharedApplication] canOpenURL:components.URL]) { - return protocol; - } - return nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h deleted file mode 100644 index 3da24d367..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKBridgeAPIRequest.h" - -@interface FBSDKBridgeAPIResponse : NSObject - -+ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request error:(NSError *)error; -+ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request - responseURL:(NSURL *)responseURL - sourceApplication:(NSString *)sourceApplication - error:(NSError *__autoreleasing *)errorRef; -+ (instancetype)bridgeAPIResponseCancelledWithRequest:(FBSDKBridgeAPIRequest *)request; - -@property (nonatomic, assign, readonly, getter=isCancelled) BOOL cancelled; -@property (nonatomic, copy, readonly) NSError *error; -@property (nonatomic, copy, readonly) FBSDKBridgeAPIRequest *request; -@property (nonatomic, copy, readonly) NSDictionary *responseParameters; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.m deleted file mode 100644 index 2254c953e..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.m +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKBridgeAPIResponse.h" - -#import "FBSDKBridgeAPICrypto.h" -#import "FBSDKBridgeAPIProtocol.h" -#import "FBSDKBridgeAPIProtocolType.h" -#import "FBSDKBridgeAPIRequest+Private.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKMacros.h" -#import "FBSDKTypeUtility.h" -#import "FBSDKUtility.h" - -@interface FBSDKBridgeAPIResponse () -- (instancetype)initWithRequest:(FBSDKBridgeAPIRequest *)request - responseParameters:(NSDictionary *)responseParameters - cancelled:(BOOL)cancelled - error:(NSError *)error -NS_DESIGNATED_INITIALIZER; -@end - -@implementation FBSDKBridgeAPIResponse - -#pragma mark - Class Methods - -+ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request error:(NSError *)error -{ - return [[self alloc] initWithRequest:request - responseParameters:nil - cancelled:NO - error:error]; -} - -+ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request - responseURL:(NSURL *)responseURL - sourceApplication:(NSString *)sourceApplication - error:(NSError *__autoreleasing *)errorRef -{ - FBSDKBridgeAPIProtocolType protocolType = request.protocolType; - switch (protocolType) { - case FBSDKBridgeAPIProtocolTypeNative:{ - if (![FBSDKInternalUtility isFacebookBundleIdentifier:sourceApplication]) { - [FBSDKBridgeAPICrypto reset]; - return nil; - } - break; - } - case FBSDKBridgeAPIProtocolTypeWeb:{ - if (![FBSDKInternalUtility isSafariBundleIdentifier:sourceApplication]) { - [FBSDKBridgeAPICrypto reset]; - return nil; - } - break; - } - } - NSDictionary *queryParameters = [FBSDKUtility dictionaryWithQueryString:responseURL.query]; - queryParameters = [FBSDKBridgeAPICrypto decryptResponseForRequest:request - queryParameters:queryParameters - error:errorRef]; - if (!queryParameters) { - return nil; - } - id protocol = request.protocol; - BOOL cancelled; - NSError *error; - NSDictionary *responseParameters = [protocol responseParametersForActionID:request.actionID - queryParameters:queryParameters - cancelled:&cancelled - error:&error]; - if (errorRef != NULL) { - *errorRef = error; - } - if (!responseParameters) { - return nil; - } - return [[self alloc] initWithRequest:request - responseParameters:responseParameters - cancelled:cancelled - error:error]; -} - -+ (instancetype)bridgeAPIResponseCancelledWithRequest:(FBSDKBridgeAPIRequest *)request -{ - return [[self alloc] initWithRequest:request - responseParameters:nil - cancelled:YES - error:nil]; -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithRequest:(FBSDKBridgeAPIRequest *)request - responseParameters:(NSDictionary *)responseParameters - cancelled:(BOOL)cancelled - error:(NSError *)error -{ - if ((self = [super init])) { - _request = [request copy]; - _responseParameters = [responseParameters copy]; - _cancelled = cancelled; - _error = [error copy]; - } - return self; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithRequest:responseParameters:cancelled:error:); - return [self initWithRequest:nil responseParameters:nil cancelled:NO error:nil]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - return self; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h deleted file mode 100644 index 54cd1674b..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright 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. - -@protocol FBSDKURLOpening - -// Implementations should make sure they can handle nil parameters -// which is possible in SafariViewController. -// see canOpenURL below. -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation; - -// create a different handler to return YES/NO if the receiver can process the above openURL:. -// This is separated so that we can process the openURL: in callbacks, while still returning -// the result of canOpenURL synchronously in FBSDKApplicationDelegate -- (BOOL)canOpenURL:(NSURL *)url - forApplication:(UIApplication *)application - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation; - -- (void)applicationDidBecomeActive:(UIApplication *)application; - -- (BOOL)isAuthenticationURL:(NSURL *)url; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h deleted file mode 100644 index 8fd34bdfa..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKBridgeAPIProtocol.h" - -typedef struct -{ - __unsafe_unretained NSString *bridgeArgs; - __unsafe_unretained NSString *methodArgs; - __unsafe_unretained NSString *methodVersion; -} FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct; -FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct FBSDKBridgeAPIProtocolNativeV1OutputKeys; - -typedef struct -{ - __unsafe_unretained NSString *actionID; - __unsafe_unretained NSString *appIcon; - __unsafe_unretained NSString *appName; - __unsafe_unretained NSString *sdkVersion; -} FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct; -FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys; - -typedef struct -{ - __unsafe_unretained NSString *bridgeArgs; - __unsafe_unretained NSString *methodResults; -} FBSDKBridgeAPIProtocolNativeV1InputKeysStruct; -FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1InputKeysStruct FBSDKBridgeAPIProtocolNativeV1InputKeys; - -typedef struct -{ - __unsafe_unretained NSString *actionID; - __unsafe_unretained NSString *error; -} FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct; -FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys; - -@interface FBSDKBridgeAPIProtocolNativeV1 : NSObject - -- (instancetype)initWithAppScheme:(NSString *)appScheme; -- (instancetype)initWithAppScheme:(NSString *)appScheme - pasteboard:(UIPasteboard *)pasteboard - dataLengthThreshold:(NSUInteger)dataLengthThreshold - includeAppIcon:(BOOL)includeAppIcon -NS_DESIGNATED_INITIALIZER; - -@property (nonatomic, copy, readonly) NSString *appScheme; -@property (nonatomic, assign, readonly) NSUInteger dataLengthThreshold; -@property (nonatomic, assign, readonly) BOOL includeAppIcon; -@property (nonatomic, strong, readonly) UIPasteboard *pasteboard; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.m deleted file mode 100644 index 50e5b9723..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.m +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKBridgeAPIProtocolNativeV1.h" - -#import - -#import - -#import "FBSDKApplicationDelegate+Internal.h" -#import "FBSDKBase64.h" -#import "FBSDKBridgeAPIRequest.h" -#import "FBSDKConstants.h" -#import "FBSDKError.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKSettings.h" -#import "FBSDKTypeUtility.h" - -#define FBSDKBridgeAPIProtocolNativeV1BridgeMaxBase64DataLengthThreshold (1024 * 16) - -const FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct FBSDKBridgeAPIProtocolNativeV1OutputKeys = -{ - .bridgeArgs = @"bridge_args", - .methodArgs = @"method_args", - .methodVersion = @"version", -}; - -const FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys = -{ - .actionID = @"action_id", - .appIcon = @"app_icon", - .appName = @"app_name", - .sdkVersion = @"sdk_version", -}; - -const FBSDKBridgeAPIProtocolNativeV1InputKeysStruct FBSDKBridgeAPIProtocolNativeV1InputKeys = -{ - .bridgeArgs = @"bridge_args", - .methodResults = @"method_results", -}; - -const FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys = -{ - .actionID = @"action_id", - .error = @"error", -}; - -static const struct -{ - __unsafe_unretained NSString *isBase64; - __unsafe_unretained NSString *isPasteboard; - __unsafe_unretained NSString *tag; - __unsafe_unretained NSString *value; -} FBSDKBridgeAPIProtocolNativeV1DataKeys = -{ - .isBase64 = @"isBase64", - .isPasteboard = @"isPasteboard", - .tag = @"tag", - .value = @"fbAppBridgeType_jsonReadyValue", -}; - -static NSString *const FBSDKBridgeAPIProtocolNativeV1DataPasteboardKey = @"com.facebook.Facebook.FBAppBridgeType"; - -static const struct -{ - __unsafe_unretained NSString *data; - __unsafe_unretained NSString *image; -} FBSDKBridgeAPIProtocolNativeV1DataTypeTags = -{ - .data = @"data", - // we serialize jpegs but use png for backward compatibility - it is any image format that UIImage can handle - .image = @"png", -}; - -static const struct -{ - __unsafe_unretained NSString *code; - __unsafe_unretained NSString *domain; - __unsafe_unretained NSString *userInfo; -} FBSDKBridgeAPIProtocolNativeV1ErrorKeys = -{ - .code = @"code", - .domain = @"domain", - .userInfo = @"user_info", -}; - -@implementation FBSDKBridgeAPIProtocolNativeV1 - -#pragma mark - Object Lifecycle - -- (instancetype)initWithAppScheme:(NSString *)appScheme -{ - return [self initWithAppScheme:appScheme - pasteboard:[UIPasteboard generalPasteboard] - dataLengthThreshold:FBSDKBridgeAPIProtocolNativeV1BridgeMaxBase64DataLengthThreshold - includeAppIcon:YES]; -} - -- (instancetype)initWithAppScheme:(NSString *)appScheme - pasteboard:(UIPasteboard *)pasteboard - dataLengthThreshold:(NSUInteger)dataLengthThreshold - includeAppIcon:(BOOL)includeAppIcon -{ - if ((self = [super init])) { - _appScheme = [appScheme copy]; - _pasteboard = pasteboard; - _dataLengthThreshold = dataLengthThreshold; - _includeAppIcon = includeAppIcon; - } - return self; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithAppScheme:); - return [self initWithAppScheme:nil]; -} - -#pragma mark - FBSDKBridgeAPIProtocol - -- (NSURL *)requestURLWithActionID:(NSString *)actionID - scheme:(NSString *)scheme - methodName:(NSString *)methodName - methodVersion:(NSString *)methodVersion - parameters:(NSDictionary *)parameters - error:(NSError *__autoreleasing *)errorRef -{ - NSString *host = @"dialog"; - NSString *path = [@"/" stringByAppendingString:methodName]; - - NSMutableDictionary *queryParameters = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:queryParameters setObject:methodVersion - forKey:FBSDKBridgeAPIProtocolNativeV1OutputKeys.methodVersion]; - - if ([parameters count]) { - NSString *parametersString = [self _JSONStringForObject:parameters enablePasteboard:YES error:errorRef]; - if (!parametersString) { - return nil; - } - [FBSDKInternalUtility dictionary:queryParameters - setObject:parametersString - forKey:FBSDKBridgeAPIProtocolNativeV1OutputKeys.methodArgs]; - } - - NSDictionary *bridgeParameters = [self _bridgeParametersWithActionID:actionID error:errorRef]; - if (!bridgeParameters) { - return nil; - } - NSString *bridgeParametersString = [self _JSONStringForObject:bridgeParameters enablePasteboard:NO error:errorRef]; - if (!bridgeParametersString) { - return nil; - } - [FBSDKInternalUtility dictionary:queryParameters - setObject:bridgeParametersString - forKey:FBSDKBridgeAPIProtocolNativeV1OutputKeys.bridgeArgs]; - - - return [FBSDKInternalUtility URLWithScheme:self.appScheme - host:host - path:path - queryParameters:queryParameters - error:errorRef]; -} - -- (NSDictionary *)responseParametersForActionID:(NSString *)actionID - queryParameters:(NSDictionary *)queryParameters - cancelled:(BOOL *)cancelledRef - error:(NSError *__autoreleasing *)errorRef -{ - if (cancelledRef != NULL) { - *cancelledRef = NO; - } - if (errorRef != NULL) { - *errorRef = nil; - } - NSError *error; - NSString *bridgeParametersJSON = queryParameters[FBSDKBridgeAPIProtocolNativeV1InputKeys.bridgeArgs]; - NSDictionary *bridgeParameters = [FBSDKInternalUtility objectForJSONString:bridgeParametersJSON error:&error]; - bridgeParameters = [FBSDKTypeUtility dictionaryValue:bridgeParameters]; - if (!bridgeParameters) { - if (error && (errorRef != NULL)) { - *errorRef = [FBSDKError invalidArgumentErrorWithName:FBSDKBridgeAPIProtocolNativeV1InputKeys.bridgeArgs - value:bridgeParametersJSON - message:@"Invalid bridge_args." - underlyingError:error]; - } - return nil; - } - NSString *responseActionID = bridgeParameters[FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys.actionID]; - responseActionID = [FBSDKTypeUtility stringValue:responseActionID]; - if (![responseActionID isEqualToString:actionID]) { - return nil; - } - NSDictionary *errorDictionary = bridgeParameters[FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys.error]; - errorDictionary = [FBSDKTypeUtility dictionaryValue:errorDictionary]; - if (errorDictionary) { - error = [self _errorWithDictionary:errorDictionary]; - if (errorRef != NULL) { - *errorRef = error; - } - return nil; - } - NSString *resultParametersJSON = queryParameters[FBSDKBridgeAPIProtocolNativeV1InputKeys.methodResults]; - NSDictionary *resultParameters = [FBSDKInternalUtility objectForJSONString:resultParametersJSON error:&error]; - if (!resultParameters) { - if (errorRef != NULL) { - *errorRef = [FBSDKError invalidArgumentErrorWithName:FBSDKBridgeAPIProtocolNativeV1InputKeys.methodResults - value:resultParametersJSON - message:@"Invalid method_results." - underlyingError:error]; - } - return nil; - } - if (cancelledRef != NULL) { - NSString *completionGesture = [FBSDKTypeUtility stringValue:resultParameters[@"completionGesture"]]; - *cancelledRef = [completionGesture isEqualToString:@"cancel"]; - } - return resultParameters; -} - -#pragma mark - Helper Methods - -- (UIImage *)_appIcon -{ - if (!_includeAppIcon) { - return nil; - } - NSArray *files = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIcons"] - [@"CFBundlePrimaryIcon"] - [@"CFBundleIconFiles"]; - if (![files count]) { - return nil; - } - return [UIImage imageNamed:files[0]]; -} - -- (NSDictionary *)_bridgeParametersWithActionID:(NSString *)actionID error:(NSError *__autoreleasing *)errorRef -{ - NSMutableDictionary *bridgeParameters = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:bridgeParameters setObject:actionID - forKey:FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys.actionID]; - [FBSDKInternalUtility dictionary:bridgeParameters setObject:[self _appIcon] - forKey:FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys.appIcon]; - [FBSDKInternalUtility dictionary:bridgeParameters setObject:[FBSDKSettings displayName] - forKey:FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys.appName]; - [FBSDKInternalUtility dictionary:bridgeParameters setObject:[FBSDKSettings sdkVersion] - forKey:FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys.sdkVersion]; - return bridgeParameters; -} - -- (NSError *)_errorWithDictionary:(NSDictionary *)dictionary -{ - if (!dictionary) { - return nil; - } - NSString *domain = [FBSDKTypeUtility stringValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.domain]] ?: - FBSDKErrorDomain; - NSInteger code = [FBSDKTypeUtility integerValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.code]] ?: - FBSDKUnknownErrorCode; - NSDictionary *userInfo = [FBSDKTypeUtility dictionaryValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.userInfo]]; - return [NSError errorWithDomain:domain code:code userInfo:userInfo]; -} - -- (NSString *)_JSONStringForObject:(id)object enablePasteboard:(BOOL)enablePasteboard error:(NSError **)errorRef -{ - __block BOOL didAddToPasteboard = NO; - return [FBSDKInternalUtility JSONStringForObject:object error:errorRef invalidObjectHandler:^id(id invalidObject, BOOL *stop) { - NSString *dataTag = FBSDKBridgeAPIProtocolNativeV1DataTypeTags.data; - if ([invalidObject isKindOfClass:[UIImage class]]) { - UIImage *image = (UIImage *)invalidObject; - // due to backward compatibility, we must send UIImage as NSData even though UIPasteboard can handle UIImage - invalidObject = UIImageJPEGRepresentation(image, [FBSDKSettings JPEGCompressionQuality]); - dataTag = FBSDKBridgeAPIProtocolNativeV1DataTypeTags.image; - } - if ([invalidObject isKindOfClass:[NSData class]]) { - NSData *data = (NSData *)invalidObject; - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - if (didAddToPasteboard || !enablePasteboard || !_pasteboard || (data.length < _dataLengthThreshold)) { - dictionary[FBSDKBridgeAPIProtocolNativeV1DataKeys.isBase64] = @YES; - dictionary[FBSDKBridgeAPIProtocolNativeV1DataKeys.tag] = dataTag; - [FBSDKInternalUtility dictionary:dictionary - setObject:[FBSDKBase64 encodeData:data] - forKey:FBSDKBridgeAPIProtocolNativeV1DataKeys.value]; - } else { - dictionary[FBSDKBridgeAPIProtocolNativeV1DataKeys.isPasteboard] = @YES; - dictionary[FBSDKBridgeAPIProtocolNativeV1DataKeys.tag] = dataTag; - dictionary[FBSDKBridgeAPIProtocolNativeV1DataKeys.value] = _pasteboard.name; - [_pasteboard setData:data forPasteboardType:FBSDKBridgeAPIProtocolNativeV1DataPasteboardKey]; - // this version of the protocol only supports a single item on the pasteboard, so if when we add an item, make - // sure we don't add another item - didAddToPasteboard = YES; - // if we are adding this to the general pasteboard, then we want to remove it when we are done with the share. - // the Facebook app will not clear the value with this version of the protocol, so we should do it when the app - // becomes active again - NSString *pasteboardName = _pasteboard.name; - if ([pasteboardName isEqualToString:UIPasteboardNameGeneral] || - [pasteboardName isEqualToString:UIPasteboardNameFind]) { - [[self class] clearData:data fromPasteboardOnApplicationDidBecomeActive:_pasteboard]; - } - } - return dictionary; - } else if ([invalidObject isKindOfClass:[NSURL class]]) { - return [(NSURL *)invalidObject absoluteString]; - } - return invalidObject; - }]; -} - -+ (void)clearData:(NSData *)data fromPasteboardOnApplicationDidBecomeActive:(UIPasteboard *)pasteboard -{ - void(^notificationBlock)(NSNotification *) = ^(NSNotification *note){ - NSData *pasteboardData = [pasteboard dataForPasteboardType:FBSDKBridgeAPIProtocolNativeV1DataPasteboardKey]; - if ([data isEqualToData:pasteboardData]) { - [pasteboard setData:[NSData data] forPasteboardType:FBSDKBridgeAPIProtocolNativeV1DataPasteboardKey]; - } - }; - [[NSNotificationCenter defaultCenter] addObserverForName:FBSDKApplicationDidBecomeActiveNotification - object:[FBSDKApplicationDelegate sharedInstance] - queue:nil - usingBlock:notificationBlock]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h deleted file mode 100644 index c7b28f4f2..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKBridgeAPIProtocol.h" - -@interface FBSDKBridgeAPIProtocolWebV1 : NSObject - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.m deleted file mode 100644 index ebe87100b..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.m +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKBridgeAPIProtocolWebV1.h" - -#import - -#import "FBSDKBase64.h" -#import "FBSDKBridgeAPIRequest.h" -#import "FBSDKError.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKMacros.h" -#import "FBSDKSettings.h" -#import "FBSDKTypeUtility.h" - -#define FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_ACTION_ID_KEY @"action_id" -#define FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY @"bridge_args" - -@implementation FBSDKBridgeAPIProtocolWebV1 - -#pragma mark - FBSDKBridgeAPIProtocol - -- (NSURL *)requestURLWithActionID:(NSString *)actionID - scheme:(NSString *)scheme - methodName:(NSString *)methodName - methodVersion:(NSString *)methodVersion - parameters:(NSDictionary *)parameters - error:(NSError *__autoreleasing *)errorRef -{ - NSMutableDictionary *queryParameters = [[NSMutableDictionary alloc] initWithDictionary:parameters]; - queryParameters[@"display"] = @"touch"; - NSString *bridgeArgs = [FBSDKInternalUtility JSONStringForObject:@{ FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_ACTION_ID_KEY: actionID } - error:NULL - invalidObjectHandler:NULL]; - NSDictionary *redirectQueryParameters = @{ FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY: bridgeArgs }; - NSURL *redirectURL = [FBSDKInternalUtility appURLWithHost:@"bridge" - path:methodName - queryParameters:redirectQueryParameters - error:NULL]; - [FBSDKInternalUtility dictionary:queryParameters setObject:redirectURL forKey:@"redirect_uri"]; - [queryParameters addEntriesFromDictionary:parameters]; - return [FBSDKInternalUtility facebookURLWithHostPrefix:@"m" - path:[@"/dialog/" stringByAppendingString:methodName] - queryParameters:queryParameters - error:NULL]; -} - -- (NSDictionary *)responseParametersForActionID:(NSString *)actionID - queryParameters:(NSDictionary *)queryParameters - cancelled:(BOOL *)cancelledRef - error:(NSError *__autoreleasing *)errorRef -{ - if (errorRef != NULL) { - *errorRef = nil; - } - NSInteger errorCode = [FBSDKTypeUtility integerValue:queryParameters[@"error_code"]]; - switch (errorCode) { - case 0:{ - // good to go, handle the other codes and bail - break; - } - case 4201:{ - return @{ - @"completionGesture": @"cancel", - }; - break; - } - default:{ - if (errorRef != NULL) { - *errorRef = [FBSDKError errorWithCode:errorCode - message:[FBSDKTypeUtility stringValue:queryParameters[@"error_message"]]]; - } - return nil; - break; - } - } - - NSError *error; - NSString *bridgeParametersJSON = [FBSDKTypeUtility stringValue:queryParameters[FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY]]; - NSDictionary *bridgeParameters = [FBSDKInternalUtility objectForJSONString:bridgeParametersJSON error:&error]; - if (!bridgeParameters) { - if (error && (errorRef != NULL)) { - *errorRef = [FBSDKError invalidArgumentErrorWithName:FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY - value:bridgeParametersJSON - message:nil - underlyingError:error]; - } - return nil; - } - NSString *responseActionID = bridgeParameters[FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_ACTION_ID_KEY]; - responseActionID = [FBSDKTypeUtility stringValue:responseActionID]; - if (![responseActionID isEqualToString:actionID]) { - return nil; - } - NSMutableDictionary *resultParameters = [queryParameters mutableCopy]; - [resultParameters removeObjectForKey:FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY]; - resultParameters[@"didComplete"] = @YES; - return resultParameters; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h deleted file mode 100644 index 3d7e34040..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKBridgeAPIProtocol.h" - -@interface FBSDKBridgeAPIProtocolWebV2 : NSObject - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.m deleted file mode 100644 index 414543d88..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.m +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKBridgeAPIProtocolWebV2.h" - -#import "FBSDKBridgeAPIProtocolNativeV1.h" -#import "FBSDKDialogConfiguration.h" -#import "FBSDKError.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKServerConfiguration.h" -#import "FBSDKServerConfigurationManager.h" -#import "FBSDKUtility.h" - -@implementation FBSDKBridgeAPIProtocolWebV2 -{ - FBSDKBridgeAPIProtocolNativeV1 *_nativeProtocol; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - if ((self = [super init])) { - _nativeProtocol = [[FBSDKBridgeAPIProtocolNativeV1 alloc] initWithAppScheme:nil - pasteboard:nil - dataLengthThreshold:0 - includeAppIcon:NO]; - } - return self; -} - -#pragma mark - FBSDKBridgeAPIProtocol - -- (NSURL *)_redirectURLWithActionID:(NSString *)actionID methodName:(NSString *)methodName error:(NSError **)errorRef -{ - NSDictionary *queryParameters = nil; - if (actionID) { - NSDictionary *bridgeArgs = @{ FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys.actionID: actionID }; - NSString *bridgeArgsString = [FBSDKInternalUtility JSONStringForObject:bridgeArgs - error:NULL - invalidObjectHandler:NULL]; - queryParameters = @{ FBSDKBridgeAPIProtocolNativeV1InputKeys.bridgeArgs: bridgeArgsString }; - } - return [FBSDKInternalUtility appURLWithHost:@"bridge" path:methodName queryParameters:queryParameters error:errorRef]; -} - -- (NSURL *)_requestURLForDialogConfiguration:(FBSDKDialogConfiguration *)dialogConfiguration error:(NSError **)errorRef -{ - NSURL *requestURL = dialogConfiguration.URL; - if (!requestURL.scheme) { - requestURL = [FBSDKInternalUtility facebookURLWithHostPrefix:@"m" - path:requestURL.path - queryParameters:nil - defaultVersion:@"" - error:errorRef]; - } - return requestURL; -} - -- (NSURL *)requestURLWithActionID:(NSString *)actionID - scheme:(NSString *)scheme - methodName:(NSString *)methodName - methodVersion:(NSString *)methodVersion - parameters:(NSDictionary *)parameters - error:(NSError *__autoreleasing *)errorRef -{ - FBSDKServerConfiguration *serverConfiguration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - FBSDKDialogConfiguration *dialogConfiguration = [serverConfiguration dialogConfigurationForDialogName:methodName]; - if (!dialogConfiguration) { - if (errorRef != NULL) { - *errorRef = [FBSDKError errorWithCode:FBSDKDialogUnavailableErrorCode message:nil]; - } - return nil; - } - - NSURL *requestURL = [_nativeProtocol requestURLWithActionID:actionID - scheme:scheme - methodName:methodName - methodVersion:methodVersion - parameters:parameters error:errorRef]; - if (!requestURL) { - return nil; - } - - NSMutableDictionary *queryParameters = [[FBSDKUtility dictionaryWithQueryString:requestURL.query] mutableCopy]; - queryParameters[@"ios_bundle_id"] = [[NSBundle mainBundle] bundleIdentifier]; - NSURL *redirectURL = [self _redirectURLWithActionID:nil methodName:methodName error:errorRef]; - if (!redirectURL) { - return nil; - } - queryParameters[@"redirect_url"] = redirectURL; - - requestURL = [self _requestURLForDialogConfiguration:dialogConfiguration error:errorRef]; - if (!requestURL) { - return nil; - } - return [FBSDKInternalUtility URLWithScheme:requestURL.scheme - host:requestURL.host - path:requestURL.path - queryParameters:queryParameters - error:errorRef]; -} - -- (NSDictionary *)responseParametersForActionID:(NSString *)actionID - queryParameters:(NSDictionary *)queryParameters - cancelled:(BOOL *)cancelledRef - error:(NSError *__autoreleasing *)errorRef -{ - return [_nativeProtocol responseParametersForActionID:actionID - queryParameters:queryParameters - cancelled:cancelledRef - error:errorRef]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h deleted file mode 100644 index ae84c5d29..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKCrypto : NSObject - -/** - Generate numOfBytes random data. - - This calls the system-provided function SecRandomCopyBytes, based on /dev/random. - */ -+ (NSData *)randomBytes:(NSUInteger)numOfBytes; - -/** - * Generate numOfBytes random data, base64-encoded. - * This calls the system-provided function SecRandomCopyBytes, based on /dev/random. - */ -+ (NSString *)randomString:(NSUInteger)numOfBytes; - -/** - Generate a fresh master key using SecRandomCopyBytes, the result is encoded in base64/. - */ -+ (NSString *)makeMasterKey; - -/** - Initialize with a base64-encoded master key. - - This key and the current derivation function will be used to generate the encryption key and the mac key. - */ -- (instancetype)initWithMasterKey:(NSString *)masterKey; - -/** - Initialize with base64-encoded encryption key and mac key. - */ -- (instancetype)initWithEncryptionKey:(NSString *)encryptionKey macKey:(NSString *)macKey; - -/** - Encrypt plainText and return the base64 encoded result. - - MAC computation involves additionalDataToSign. - */ -- (NSString *)encrypt:(NSData *)plainText additionalDataToSign:(NSData *)additionalDataToSign; - -/** - Decrypt base64EncodedCipherText. - - MAC computation involves additionalSignedData. - */ -- (NSData *)decrypt:(NSString *)base64EncodedCipherText additionalSignedData:(NSData *)additionalSignedData; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.m deleted file mode 100644 index 9c2a66ade..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.m +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKCrypto.h" - -#import -#import -#import - -#import "FBSDKBase64.h" -#import "FBSDKDynamicFrameworkLoader.h" - -static const uint8_t kFBSDK_CRYPTO_CURRENT_VERSION = 1; -static const uint8_t kFBSDK_CRYPTO_CURRENT_MASTER_KEY_LENGTH = 16; - -FBSDK_STATIC_INLINE void FBSDKCryptoWriteIntBigEndian(uint8_t *buffer, uint32_t value) -{ - buffer[3] = (uint8_t)(value & 0xff); - buffer[2] = (uint8_t)((value >> 8) & 0xff); - buffer[1] = (uint8_t)((value >> 16) & 0xff); - buffer[0] = (uint8_t)((value >> 24) & 0xff); -} - -FBSDK_STATIC_INLINE void FBSDKCryptoBlankData(NSData *data) -{ - if (!data) { - return; - } - bzero((void *) [data bytes], [data length]); -} - -// Note: the following simple derivation function is NOT suitable for passwords or weak keys -FBSDK_STATIC_INLINE NSData *FBSDKCryptoMakeSubKey(uint8_t *key, size_t len, uint32_t idx) -{ - if (!key || len < 10) { - return nil; - } - - size_t macBufferLength = 4; - uint8_t macBuffer[4]; - FBSDKCryptoWriteIntBigEndian(macBuffer, idx); - - uint8_t *result = malloc(CC_SHA256_DIGEST_LENGTH); - if (!result) { - return nil; - } - - CCHmac(kCCHmacAlgSHA256, key, len, macBuffer, macBufferLength, result); - - return [NSData dataWithBytesNoCopy:result length:CC_SHA256_DIGEST_LENGTH]; -} - -@implementation FBSDKCrypto -{ - NSData *_encryptionKeyData; - NSData *_macKeyData; -} - -#pragma mark - Class Methods - -+ (NSString *)makeMasterKey -{ - NSData *masterKeyData = [FBSDKCrypto randomBytes:kFBSDK_CRYPTO_CURRENT_MASTER_KEY_LENGTH + 1]; - - // force the first byte to be the crypto version - uint8_t *first = (uint8_t *) [masterKeyData bytes]; - *first = kFBSDK_CRYPTO_CURRENT_VERSION; - - NSString *masterKey = [FBSDKBase64 encodeData:masterKeyData]; - FBSDKCryptoBlankData(masterKeyData); - return masterKey; -} - -+ (NSData *)randomBytes:(NSUInteger)numOfBytes -{ - uint8_t *buffer = malloc(numOfBytes); - int result = fbsdkdfl_SecRandomCopyBytes([FBSDKDynamicFrameworkLoader loadkSecRandomDefault], numOfBytes, buffer); - if (result != 0) { - free(buffer); - return nil; - } - return [NSData dataWithBytesNoCopy:buffer length:numOfBytes]; -} - -+ (NSString *)randomString:(NSUInteger)numOfBytes -{ - NSData *randomStringData = [FBSDKCrypto randomBytes:numOfBytes]; - NSString *randomString = [FBSDKBase64 encodeData:randomStringData]; - FBSDKCryptoBlankData(randomStringData); - return randomString; -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithMasterKey:(NSString *)masterKey -{ - if ((self = [super init])) { - NSData *masterKeyData = [FBSDKBase64 decodeAsData:masterKey]; - NSUInteger len = [masterKeyData length]; - uint8_t *first = (uint8_t *) [masterKeyData bytes]; - - if (len == 0 || first == nil || *first != kFBSDK_CRYPTO_CURRENT_VERSION) { - // only one version supported at the moment - return nil; - } - - _encryptionKeyData = FBSDKCryptoMakeSubKey(first+1, len-1, 1); - _macKeyData = FBSDKCryptoMakeSubKey(first+1, len-1, 2); - FBSDKCryptoBlankData(masterKeyData); - return self; - } else { - return nil; - } -} - -- (instancetype)initWithEncryptionKey:(NSString *)encryptionKey macKey:(NSString *)macKey -{ - if ((self = [super init])) { - _macKeyData = [FBSDKBase64 decodeAsData:macKey]; - _encryptionKeyData = [FBSDKBase64 decodeAsData:encryptionKey]; - } - return self; -} - -- (void)dealloc -{ - FBSDKCryptoBlankData(_encryptionKeyData); - FBSDKCryptoBlankData(_macKeyData); -} - -#pragma mark - Public Methods - -/** - * return base64_encode([VERSION 1 byte] + [MAC 32 bytes] + [IV 16 bytes] + [AES256(Padded Data, multiples of 16)] - */ -- (NSString *)encrypt:(NSData *)plainText additionalDataToSign:(NSData *)additionalDataToSign -{ - NSAssert(plainText.length <= INT_MAX, @""); - int plainTextLength = (int)plainText.length; - - uint8_t numPaddingBytes = kCCBlockSizeAES128 - (plainText.length % kCCBlockSizeAES128); // Pad 1 .. 16 bytes - int cipherDataLength = plainTextLength + numPaddingBytes; - size_t bufferSize = 1 + CC_SHA256_DIGEST_LENGTH + kCCBlockSizeAES128 + cipherDataLength; - int offsetMAC = 1; - int offsetIV = offsetMAC + CC_SHA256_DIGEST_LENGTH; - int offsetCipherData = offsetIV + kCCBlockSizeAES128; - - uint8_t *buffer = calloc(bufferSize, sizeof(uint8_t)); - buffer[0] = kFBSDK_CRYPTO_CURRENT_VERSION; // First byte is the version number - NSData *IV = [[self class] randomBytes:kCCBlockSizeAES128]; - memcpy(buffer + offsetIV, IV.bytes, IV.length); - - memcpy(buffer + offsetCipherData, plainText.bytes, plainTextLength); // Copy input in - fbsdkdfl_SecRandomCopyBytes([FBSDKDynamicFrameworkLoader loadkSecRandomDefault], - numPaddingBytes, - buffer + offsetCipherData + plainTextLength); // Random pad - buffer[offsetCipherData + cipherDataLength - 1] = numPaddingBytes; // Record the number of padded bytes at the end - - size_t numOutputBytes = 0; - CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 0, - _encryptionKeyData.bytes, kCCKeySizeAES256, - IV.bytes, - buffer + offsetCipherData, cipherDataLength, - buffer + offsetCipherData, cipherDataLength, - &numOutputBytes); - - NSData *mac = [self _macForIV:IV - cipherData:[NSData dataWithBytesNoCopy:buffer + offsetCipherData length:cipherDataLength freeWhenDone:NO] - additionalDataToSign:additionalDataToSign]; - memcpy(buffer + offsetMAC, mac.bytes, CC_SHA256_DIGEST_LENGTH); - - if (cryptStatus == kCCSuccess) { - return [FBSDKBase64 encodeData:[NSData dataWithBytesNoCopy:buffer length:bufferSize]]; - } - free(buffer); - return nil; -} - -- (NSData *)decrypt:(NSString *)base64EncodedCipherText additionalSignedData:(NSData *)additionalSignedData -{ - NSData *cipherText = [FBSDKBase64 decodeAsData:base64EncodedCipherText]; - NSAssert(cipherText.length <= INT_MAX, @""); - int cipherTextLength = (int)cipherText.length; - - if (!cipherText || cipherTextLength < 1 + CC_SHA256_DIGEST_LENGTH + kCCBlockSizeAES128) { - return nil; - } - int cipherDataLength = cipherTextLength - (1 + CC_SHA256_DIGEST_LENGTH + kCCBlockSizeAES128); - if (cipherDataLength % kCCBlockSizeAES128 != 0) { - return nil; - } - uint8_t *buffer = (uint8_t *)cipherText.bytes; - - int offsetMAC = 1; - int offsetIV = offsetMAC + CC_SHA256_DIGEST_LENGTH; - int offsetCipherData = offsetIV + kCCBlockSizeAES128; - - if (buffer[0] != kFBSDK_CRYPTO_CURRENT_VERSION) { - return nil; // Version does not match - } - - NSData *IV = [NSData dataWithBytesNoCopy:buffer + offsetIV length:kCCBlockSizeAES128 freeWhenDone:NO]; - NSData *cipherData = [NSData dataWithBytesNoCopy:buffer + offsetCipherData length:cipherDataLength freeWhenDone:NO]; - NSData *mac = [self _macForIV:IV cipherData:cipherData additionalDataToSign:additionalSignedData]; - NSData *macFromStream = [NSData dataWithBytesNoCopy:buffer + offsetMAC length:CC_SHA256_DIGEST_LENGTH freeWhenDone:NO]; - if (![mac isEqualToData:macFromStream]) { - return nil; // MAC does not match - } - - - uint8_t *outputBuffer = malloc(cipherDataLength); - size_t numOutputBytes = 0; - CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, - _encryptionKeyData.bytes, kCCKeySizeAES256, - IV.bytes, - buffer + offsetCipherData, cipherDataLength, - outputBuffer, cipherDataLength, - &numOutputBytes); - if (cryptStatus == kCCSuccess) { - int numPaddingBytes = outputBuffer[cipherDataLength - 1]; - if (!(numPaddingBytes >= 1 && numPaddingBytes <= kCCBlockSizeAES128)) { - numPaddingBytes = 0; - } - return [NSData dataWithBytesNoCopy:outputBuffer length:cipherDataLength - numPaddingBytes]; - } - free(outputBuffer); - return nil; -} - -#pragma mark - Helper Methods - -/** - * - * [IV 16 bytes] . [length of ciphertext 4 bytes] . [ciphertext] . [length of additionalDataToSign, 4 bytes] . [additionalDataToSign]) - * length is written in big-endian - */ -- (NSData *)_macForIV:(NSData *)IV cipherData:(NSData *)cipherData additionalDataToSign:(NSData *)additionalDataToSign -{ - NSAssert(cipherData.length <= INT_MAX, @""); - int cipherDataLength = (int)cipherData.length; - - NSAssert(additionalDataToSign.length <= INT_MAX, @""); - int additionalDataToSignLength = (int)additionalDataToSign.length; - - size_t macBufferLength = kCCBlockSizeAES128 + 4 + cipherData.length + 4 + additionalDataToSign.length; - uint8_t *macBuffer = malloc(macBufferLength); - int offsetIV = 0; - int offsetCipherTextLength = offsetIV + kCCBlockSizeAES128; - int offsetCipherText = offsetCipherTextLength + 4; - - int offsetAdditionalDataLength = offsetCipherText + cipherDataLength; - int offsetAdditionalData = offsetAdditionalDataLength + 4; - - // [IV 16 bytes] - memcpy(macBuffer + offsetIV, IV.bytes, kCCBlockSizeAES128); - // [length of ciphertext 4 bytes] - FBSDKCryptoWriteIntBigEndian(macBuffer + offsetCipherTextLength, cipherDataLength); - // [ciphertext] - memcpy(macBuffer + offsetCipherText, cipherData.bytes, cipherDataLength); - // [length of additionalDataToSign, 4 bytes] - FBSDKCryptoWriteIntBigEndian(macBuffer + offsetAdditionalDataLength, additionalDataToSignLength); - memcpy(macBuffer + offsetAdditionalData, additionalDataToSign.bytes, additionalDataToSignLength); - - uint8_t *result = malloc(CC_SHA256_DIGEST_LENGTH); - - CCHmac(kCCHmacAlgSHA256, _macKeyData.bytes, _macKeyData.length, macBuffer, macBufferLength, result); - free(macBuffer); - - return [NSData dataWithBytesNoCopy:result length:CC_SHA256_DIGEST_LENGTH]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h deleted file mode 100644 index 65d5e58bc..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@class FBSDKErrorRecoveryConfiguration; - -@interface FBSDKErrorRecoveryAttempter : NSObject - -// can return nil if configuration is not supported. -+ (instancetype)recoveryAttempterFromConfiguration:(FBSDKErrorRecoveryConfiguration *)configuration; - -@end - -@interface FBSDKErrorRecoveryAttempter (Protected) -- (void)completeRecovery:(BOOL)didRecover delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo; -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.m deleted file mode 100644 index 78b5e8758..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.m +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKErrorRecoveryAttempter.h" - -#import "_FBSDKTemporaryErrorRecoveryAttempter.h" -#import "FBSDKErrorRecoveryConfiguration.h" - -@implementation FBSDKErrorRecoveryAttempter - -+ (instancetype)recoveryAttempterFromConfiguration:(FBSDKErrorRecoveryConfiguration *)configuration -{ - if (configuration.errorCategory == FBSDKGraphRequestErrorCategoryTransient) { - return [[_FBSDKTemporaryErrorRecoveryAttempter alloc] init]; - } else if (configuration.errorCategory == FBSDKGraphRequestErrorCategoryOther) { - return nil; - } - if ([configuration.recoveryActionName isEqualToString:@"login"]) { - Class loginRecoveryAttmpterClass = NSClassFromString(@"_FBSDKLoginRecoveryAttempter"); - if (loginRecoveryAttmpterClass) { - return [[loginRecoveryAttmpterClass alloc] init]; - } - } - return nil; -} - -- (void)attemptRecoveryFromError:(NSError *)error optionIndex:(NSUInteger)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo -{ - // should be implemented by subclasses. -} -@end - -@implementation FBSDKErrorRecoveryAttempter(Protected) - -- (void)completeRecovery:(BOOL)didRecover delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo -{ - void (*callback)(id, SEL, BOOL, void *) = (void *)[delegate methodForSelector:didRecoverSelector]; - (*callback)(delegate, didRecoverSelector, didRecover, contextInfo); -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h deleted file mode 100644 index 21ad040d1..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKErrorRecoveryAttempter.h" - -@interface _FBSDKTemporaryErrorRecoveryAttempter : FBSDKErrorRecoveryAttempter - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.m deleted file mode 100644 index bb555aa7f..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.m +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "_FBSDKTemporaryErrorRecoveryAttempter.h" - -@implementation _FBSDKTemporaryErrorRecoveryAttempter - -- (void)attemptRecoveryFromError:(NSError *)error optionIndex:(NSUInteger)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo -{ - [super completeRecovery:YES delegate:delegate didRecoverSelector:didRecoverSelector contextInfo:contextInfo]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h deleted file mode 100644 index 8d0b14a59..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import - -#import "FBSDKCoreKit+Internal.h" - -FBSDK_EXTERN NSString *const FBSDKApplicationDidBecomeActiveNotification; - -@class FBSDKApplicationCall; - -#if !TARGET_OS_TV -typedef void(^FBSDKBridgeAPICallbackBlock)(FBSDKBridgeAPIResponse *response); -#endif - -@interface FBSDKApplicationDelegate () -#if !TARGET_OS_TV - - -- (void)openBridgeAPIRequest:(FBSDKBridgeAPIRequest *)request - useSafariViewController:(BOOL)useSafariViewController - fromViewController:(UIViewController *)fromViewController - completionBlock:(FBSDKBridgeAPICallbackBlock)completionBlock; - -- (void)openURLWithSafariViewController:(NSURL *)url - sender:(id)sender - fromViewController:(UIViewController *)fromViewController - handler:(void(^)(BOOL, NSError *))handler; - -- (void)openURL:(NSURL *)url sender:(id)sender handler:(void(^)(BOOL, NSError *))handler; - -#endif - -@property (nonatomic, readonly, getter=isActive) BOOL active; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h deleted file mode 100644 index 2c0557524..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKAudioResourceLoader : NSObject - -+ (instancetype)sharedLoader; - -- (BOOL)loadSound:(NSError **)error; -- (void)playSound; - -@end - -@interface FBSDKAudioResourceLoader (Subclass) - -+ (NSString *)name; -+ (NSUInteger)version; -+ (NSData *)data; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.m deleted file mode 100644 index c7efb3f7a..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.m +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAudioResourceLoader.h" - -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKLogger.h" -#import "FBSDKSettings.h" - -@implementation FBSDKAudioResourceLoader -{ - NSFileManager *_fileManager; - NSURL *_fileURL; - SystemSoundID _systemSoundID; -} - -#pragma mark - Class Methods - -+ (instancetype)sharedLoader -{ - static NSMutableDictionary *_loaderCache = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - _loaderCache = [[NSMutableDictionary alloc] init]; - }); - - NSString *name = [self name]; - FBSDKAudioResourceLoader *loader; - @synchronized(_loaderCache) { - loader = _loaderCache[name]; - if (!loader) { - loader = [[self alloc] init]; - NSError *error = nil; - if ([loader loadSound:&error]) { - _loaderCache[name] = loader; - } else { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"%@ error: %@", self, error]; - } - } - } - - return loader; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - if ((self = [super init])) { - _fileManager = [[NSFileManager alloc] init]; - } - return self; -} - -- (void)dealloc -{ - fbsdkdfl_AudioServicesDisposeSystemSoundID(_systemSoundID); -} - -#pragma mark - Public API - -- (BOOL)loadSound:(NSError **)errorRef -{ - NSURL *fileURL = [self _fileURL:errorRef]; - - if (![_fileManager fileExistsAtPath:[fileURL path]]) { - NSData *data = [[self class] data]; - if (![data writeToURL:fileURL options:NSDataWritingAtomic error:errorRef]) { - return NO; - } - } - - OSStatus status = fbsdkdfl_AudioServicesCreateSystemSoundID((__bridge CFURLRef)fileURL, &_systemSoundID); - return (status == kAudioServicesNoError); -} - -- (void)playSound -{ - if ((_systemSoundID == 0) && ![self loadSound:NULL]) { - return; - } - fbsdkdfl_AudioServicesPlaySystemSound(_systemSoundID); -} - -#pragma mark - Helper Methods - -- (NSURL *)_fileURL:(NSError **)errorRef -{ - if (_fileURL) { - return _fileURL; - } - - NSURL *baseURL = [_fileManager URLForDirectory:NSCachesDirectory - inDomain:NSUserDomainMask - appropriateForURL:nil - create:YES - error:errorRef]; - if (!baseURL) { - return nil; - } - - NSURL *directoryURL = [baseURL URLByAppendingPathComponent:@"fb_audio" isDirectory:YES]; - NSURL *versionURL = [directoryURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%lu", (unsigned long)[[self class] version]] - isDirectory:YES]; - if (![_fileManager createDirectoryAtURL:versionURL withIntermediateDirectories:YES attributes:nil error:errorRef]) { - return nil; - } - - _fileURL = [[versionURL URLByAppendingPathComponent:[[self class] name]] copy]; - - return _fileURL; -} - -@end - -@implementation FBSDKAudioResourceLoader (Subclass) - -#pragma mark - Subclass Methods - -+ (NSString *)name -{ - return nil; -} - -+ (NSUInteger)version -{ - return 0; -} - -+ (NSData *)data -{ - return nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h deleted file mode 100644 index 5feed4f0f..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKContainerViewController; - -@protocol FBSDKContainerViewControllerDelegate - -- (void)viewControllerDidDisappear:(FBSDKContainerViewController *)viewController animated:(BOOL)animated; - -@end - -@interface FBSDKContainerViewController : UIViewController - -@property (nonatomic, weak) id delegate; - -- (void)displayChildController:(UIViewController *)childController; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.m deleted file mode 100644 index e1c2e6d93..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.m +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKContainerViewController.h" - -@implementation FBSDKContainerViewController - -- (void)viewDidDisappear:(BOOL)animated -{ - [super viewDidDisappear:animated]; - if ([self.delegate respondsToSelector:@selector(viewControllerDidDisappear:animated:)]) { - [self.delegate viewControllerDidDisappear:self animated:animated]; - } -} - -- (void)displayChildController:(UIViewController *)childController -{ - [self addChildViewController:childController]; - UIView *view = self.view; - UIView *childView = childController.view; - childView.translatesAutoresizingMaskIntoConstraints = NO; - childView.frame = view.frame; - [view addSubview:childView]; - - [view addConstraints: - @[ - [NSLayoutConstraint constraintWithItem:childView - attribute:NSLayoutAttributeTop - relatedBy:NSLayoutRelationEqual - toItem:view - attribute:NSLayoutAttributeTop - multiplier:1.0 - constant:0.0], - - [NSLayoutConstraint constraintWithItem:childView - attribute:NSLayoutAttributeBottom - relatedBy:NSLayoutRelationEqual - toItem:view - attribute:NSLayoutAttributeBottom - multiplier:1.0 - constant:0.0], - - [NSLayoutConstraint constraintWithItem:childView - attribute:NSLayoutAttributeLeading - relatedBy:NSLayoutRelationEqual - toItem:view - attribute:NSLayoutAttributeLeading - multiplier:1.0 - constant:0.0], - - [NSLayoutConstraint constraintWithItem:childView - attribute:NSLayoutAttributeTrailing - relatedBy:NSLayoutRelationEqual - toItem:view - attribute:NSLayoutAttributeTrailing - multiplier:1.0 - constant:0.0], - ]]; - - [childController didMoveToParentViewController:self]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h deleted file mode 100644 index d189ad54d..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#if !TARGET_OS_TV -#import "BridgeAPI/FBSDKBridgeAPIProtocol.h" -#import "BridgeAPI/FBSDKBridgeAPIProtocolType.h" -#import "BridgeAPI/FBSDKBridgeAPIRequest.h" -#import "BridgeAPI/FBSDKBridgeAPIResponse.h" -#import "BridgeAPI/FBSDKURLOpening.h" -#import "Cryptography/FBSDKCrypto.h" -#import "FBSDKAudioResourceLoader.h" -#import "FBSDKContainerViewController.h" -#import "FBSDKMonotonicTime.h" -#import "FBSDKSystemAccountStoreAdapter.h" -#import "FBSDKTriStateBOOL.h" -#import "UI/FBSDKCloseIcon.h" -#import "UI/FBSDKColor.h" -#import "UI/FBSDKMaleSilhouetteIcon.h" -#import "UI/FBSDKUIUtility.h" -#import "UI/FBSDKViewImpressionTracker.h" -#import "WebDialog/FBSDKWebDialog.h" -#else -#import "Device/FBSDKDeviceButton+Internal.h" -#import "Device/FBSDKDeviceDialogView.h" -#import "Device/FBSDKSmartDeviceDialogView.h" -#import "Device/FBSDKDeviceViewControllerBase+Internal.h" -#import "Device/FBSDKModalFormPresentationController.h" -#endif - -#import "AppEvents/FBSDKAppEvents+Internal.h" -#import "AppEvents/FBSDKAppEventsState.h" -#import "AppEvents/FBSDKAppEventsStateManager.h" -#import "AppEvents/FBSDKAppEventsUtility.h" -#import "AppEvents/FBSDKTimeSpentData.h" -#import "Base64/FBSDKBase64.h" -#import "ErrorRecovery/FBSDKErrorRecoveryAttempter.h" -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKApplicationDelegate+Internal.h" -#import "FBSDKDeviceRequestsHelper.h" -#import "FBSDKError.h" -#import "FBSDKImageDownloader.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKMath.h" -#import "FBSDKSettings+Internal.h" -#import "FBSDKTypeUtility.h" -#import "Network/FBSDKGraphRequest+Internal.h" -#import "Network/FBSDKGraphRequestConnection+Internal.h" -#import "Network/FBSDKGraphRequestMetadata.h" -#import "ServerConfiguration/FBSDKDialogConfiguration.h" -#import "ServerConfiguration/FBSDKServerConfiguration+Internal.h" -#import "ServerConfiguration/FBSDKServerConfiguration.h" -#import "ServerConfiguration/FBSDKServerConfigurationManager+Internal.h" -#import "ServerConfiguration/FBSDKServerConfigurationManager.h" -#import "TokenCaching/FBSDKAccessTokenCache.h" -#import "TokenCaching/FBSDKAccessTokenCaching.h" -#import "TokenCaching/FBSDKKeychainStore.h" -#import "TokenCaching/FBSDKKeychainStoreViaBundleID.h" -#import "UI/FBSDKButton+Subclass.h" -#import "UI/FBSDKIcon.h" -#import "UI/FBSDKLogo.h" - diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDeviceRequestsHelper.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDeviceRequestsHelper.h deleted file mode 100644 index 90caec262..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDeviceRequestsHelper.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -#define FBSDK_DEVICE_INFO_PARAM @"device_info" - -/* - @class - - Helper class for device requests mDNS broadcasts. Note this is only intended for - internal consumption. - */ -@interface FBSDKDeviceRequestsHelper : NSObject - -/** - Get device info to include with the GraphRequest - */ -+ (NSString *)getDeviceInfo; - -/** - Start the mDNS advertisement service for a device request - - Parameter loginCode: The login code associated with the action for the device request. - - Returns: True if the service broadcast was successfully started. - */ -+ (BOOL)startAdvertisementService:(NSString *)loginCode withDelegate:(id)delegate; - -/** - Check if a service delegate is registered with particular advertisement service - - Parameter delegate: The delegate to check if registered. - - Parameter service: The advertisement service to check for. - - Returns: True if the service is the one the delegate registered with. - */ -+ (BOOL)isDelegate:(id)delegate forAdvertisementService:(NSNetService *)service; - -/** - Stop the mDNS advertisement service for a device request - - Parameter delegate: The delegate registered with the service. - */ -+ (void)cleanUpAdvertisementService:(id)delegate; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDeviceRequestsHelper.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDeviceRequestsHelper.m deleted file mode 100644 index 0f83e1de8..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDeviceRequestsHelper.m +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKDeviceRequestsHelper.h" - -#import - -#import - -#import "FBSDKCoreKit+Internal.h" - -#define FBSDK_DEVICE_INFO_DEVICE @"device" -#define FBSDK_DEVICE_INFO_MODEL @"model" -#define FBSDK_HEADER @"fbsdk" -#if !TARGET_OS_TV -#define FBSDK_FLAVOR @"ios" -#else -#define FBSDK_FLAVOR @"tvos" -#endif -#define FBSDK_SERVICE_TYPE @"_fb._tcp." - -static NSMapTable *g_mdnsAdvertisementServices; - -@implementation FBSDKDeviceRequestsHelper - -#pragma mark - Class Methods - -+ (void)initialize { - // We use weak to strong in order to retain the advertisement services - // without having to pass them back to the delegate that started them - // Note that in case the delegate is destroyed before it had a chance to - // stop the service, the service will continue broadcasting until the map - // resizes itself and releases the service, causing it to stop - g_mdnsAdvertisementServices = [NSMapTable weakToStrongObjectsMapTable]; -} - -+ (NSString *)getDeviceInfo -{ - struct utsname systemInfo; - uname(&systemInfo); - NSDictionary *deviceInfo = @{ - FBSDK_DEVICE_INFO_DEVICE: [NSString stringWithCString:systemInfo.machine - encoding:NSUTF8StringEncoding], - FBSDK_DEVICE_INFO_MODEL: [[UIDevice currentDevice] model], - }; - NSError *err; - NSData *jsonDeviceInfo = [NSJSONSerialization dataWithJSONObject:deviceInfo - options:0 - error:&err]; - - return [[NSString alloc] initWithData:jsonDeviceInfo encoding:NSUTF8StringEncoding]; -} - -+ (BOOL)startAdvertisementService:(NSString *)loginCode withDelegate:(id)delegate; -{ - static NSString *sdkVersion = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - // Dots in the version will mess up the bonjour DNS record parsing - sdkVersion = [[FBSDKSettings sdkVersion] stringByReplacingOccurrencesOfString:@"." withString:@"|"]; - if (sdkVersion.length > 10 || - ![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[sdkVersion characterAtIndex:0]]) { - sdkVersion = @"dev"; - } - }); - NSString *serviceName = [NSString stringWithFormat:@"%@_%@_%@", - FBSDK_HEADER, - [NSString stringWithFormat:@"%@-%@", - FBSDK_FLAVOR, - sdkVersion - ], - loginCode - ]; - if (serviceName.length > 60) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"serviceName exceeded 60 characters"]; - } - NSNetService *mdnsAdvertisementService = [[NSNetService alloc] - initWithDomain:@"local." - type:FBSDK_SERVICE_TYPE - name:serviceName - port:0]; - mdnsAdvertisementService.delegate = delegate; - [mdnsAdvertisementService publishWithOptions:NSNetServiceNoAutoRename | NSNetServiceListenForConnections]; - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKSmartLoginService - valueToSum:nil - parameters:nil - accessToken:nil]; - [g_mdnsAdvertisementServices setObject:mdnsAdvertisementService forKey:delegate]; - - return YES; -} - -+ (BOOL)isDelegate:(id)delegate forAdvertisementService:(NSNetService *)service -{ - NSNetService *mdnsAdvertisementService = [g_mdnsAdvertisementServices objectForKey:delegate]; - return (mdnsAdvertisementService == service); -} - -+ (void)cleanUpAdvertisementService:(id)delegate -{ - NSNetService *mdnsAdvertisementService = [g_mdnsAdvertisementServices objectForKey:delegate]; - if (mdnsAdvertisementService != nil) { - // We are not interested in the stop publish event - mdnsAdvertisementService.delegate = nil; - [mdnsAdvertisementService stop]; - [g_mdnsAdvertisementServices removeObjectForKey:delegate]; - } -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h deleted file mode 100644 index b807ccde2..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import -#import - -#import - -/** - - This class provides a way to load constants and methods from Apple Frameworks in a dynamic - fashion. It allows the SDK to be just dragged into a project without having to specify additional - frameworks to link against. It is an internal class and not to be used by 3rd party developers. - - As new types are needed, they should be added and strongly typed. - */ -@interface FBSDKDynamicFrameworkLoader : NSObject - -#pragma mark - Security Constants - -/** - Load the kSecRandomDefault value from the Security Framework - - - Returns: The kSecRandomDefault value or nil. - */ -+ (SecRandomRef)loadkSecRandomDefault; - -/** - Load the kSecAttrAccessible value from the Security Framework - - - Returns: The kSecAttrAccessible value or nil. - */ -+ (CFTypeRef)loadkSecAttrAccessible; - -/** - Load the kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly value from the Security Framework - - - Returns: The kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly value or nil. - */ -+ (CFTypeRef)loadkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; - -/** - Load the kSecAttrAccount value from the Security Framework - - - Returns: The kSecAttrAccount value or nil. - */ -+ (CFTypeRef)loadkSecAttrAccount; - -/** - Load the kSecAttrService value from the Security Framework - - - Returns: The kSecAttrService value or nil. - */ -+ (CFTypeRef)loadkSecAttrService; - -/** - Load the kSecAttrGeneric value from the Security Framework - - - Returns: The kSecAttrGeneric value or nil. - */ -+ (CFTypeRef)loadkSecAttrGeneric; - -/** - Load the kSecValueData value from the Security Framework - - - Returns: The kSecValueData value or nil. - */ -+ (CFTypeRef)loadkSecValueData; - -/** - Load the kSecClassGenericPassword value from the Security Framework - - - Returns: The kSecClassGenericPassword value or nil. - */ -+ (CFTypeRef)loadkSecClassGenericPassword; - -/** - Load the kSecAttrAccessGroup value from the Security Framework - - - Returns: The kSecAttrAccessGroup value or nil. - */ -+ (CFTypeRef)loadkSecAttrAccessGroup; - -/** - Load the kSecMatchLimitOne value from the Security Framework - - - Returns: The kSecMatchLimitOne value or nil. - */ -+ (CFTypeRef)loadkSecMatchLimitOne; - -/** - Load the kSecMatchLimit value from the Security Framework - - - Returns: The kSecMatchLimit value or nil. - */ -+ (CFTypeRef)loadkSecMatchLimit; - -/** - Load the kSecReturnData value from the Security Framework - - - Returns: The kSecReturnData value or nil. - */ -+ (CFTypeRef)loadkSecReturnData; - -/** - Load the kSecClass value from the Security Framework - - - Returns: The kSecClass value or nil. - */ -+ (CFTypeRef)loadkSecClass; - -@end - -#pragma mark - Security APIs - -// These are local wrappers around the corresponding methods in Security/SecRandom.h -FBSDK_EXTERN int fbsdkdfl_SecRandomCopyBytes(SecRandomRef rnd, size_t count, uint8_t *bytes); - -// These are local wrappers around Keychain API -FBSDK_EXTERN OSStatus fbsdkdfl_SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate); -FBSDK_EXTERN OSStatus fbsdkdfl_SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result); -FBSDK_EXTERN OSStatus fbsdkdfl_SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result); -FBSDK_EXTERN OSStatus fbsdkdfl_SecItemDelete(CFDictionaryRef query); - -#pragma mark - Social Constants - -FBSDK_EXTERN NSString *fbsdkdfl_SLServiceTypeFacebook(void); -FBSDK_EXTERN NSString *fbsdkdfl_SLServiceTypeTwitter(void); - -#pragma mark - Social Classes - -FBSDK_EXTERN Class fbsdkdfl_SLComposeViewControllerClass(void); - -#pragma mark - MessageUI Classes - -FBSDK_EXTERN Class fbsdkdfl_MFMailComposeViewControllerClass(void); -FBSDK_EXTERN Class fbsdkdfl_MFMessageComposeViewControllerClass(void); - -#pragma mark - QuartzCore Classes - -FBSDK_EXTERN Class fbsdkdfl_CATransactionClass(void); - -#pragma mark - QuartzCore APIs - -// These are local wrappers around the corresponding transform methods from QuartzCore.framework/CATransform3D.h -FBSDK_EXTERN CATransform3D fbsdkdfl_CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz); -FBSDK_EXTERN CATransform3D fbsdkdfl_CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz); -FBSDK_EXTERN CATransform3D fbsdkdfl_CATransform3DConcat (CATransform3D a, CATransform3D b); - -FBSDK_EXTERN const CATransform3D fbsdkdfl_CATransform3DIdentity; - -#pragma mark - AudioToolbox APIs - -// These are local wrappers around the corresponding methods in AudioToolbox/AudioToolbox.h -FBSDK_EXTERN OSStatus fbsdkdfl_AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID); -FBSDK_EXTERN OSStatus fbsdkdfl_AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID); -FBSDK_EXTERN void fbsdkdfl_AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID); - -#pragma mark - AdSupport Classes - -FBSDK_EXTERN Class fbsdkdfl_ASIdentifierManagerClass(void); - -#pragma mark - SafariServices Classes - -FBSDK_EXTERN Class fbsdkdfl_SFSafariViewControllerClass(void); -FBSDK_EXTERN Class fbsdkdfl_SFAuthenticationSessionClass(void); - -#pragma mark - Accounts Constants - -FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAppIdKey(void); -FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceEveryone(void); -FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceFriends(void); -FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceKey(void); -FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceOnlyMe(void); -FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookPermissionsKey(void); - -#pragma mark - Accounts Classes - -FBSDK_EXTERN Class fbsdkdfl_ACAccountStoreClass(void); - -#pragma mark - StoreKit classes - -FBSDK_EXTERN Class fbsdkdfl_SKPaymentQueueClass(void); -FBSDK_EXTERN Class fbsdkdfl_SKProductsRequestClass(void); - -#pragma mark - AssetsLibrary Classes - -FBSDK_EXTERN Class fbsdkdfl_ALAssetsLibraryClass(void); - -#pragma mark - CoreTelephony Classes - -FBSDK_EXTERN Class fbsdkdfl_CTTelephonyNetworkInfoClass(void); - -#pragma mark - CoreImage - -FBSDK_EXTERN Class fbsdkdfl_CIImageClass(void); -FBSDK_EXTERN Class fbsdkdfl_CIFilterClass(void); -FBSDK_EXTERN NSString *fbsdkdfl_kCIInputImageKey(void); -FBSDK_EXTERN NSString *fbsdkdfl_kCIInputRadiusKey(void); -FBSDK_EXTERN NSString *fbsdkdfl_kCIOutputImageKey(void); - -#pragma mark - Photos.framework - -FBSDK_EXTERN Class fbsdkdfl_PHPhotoLibrary(void); -FBSDK_EXTERN Class fbsdkdfl_PHAssetChangeRequest(void); - -#pragma mark - MobileCoreServices - -FBSDK_EXTERN CFStringRef fbsdkdfl_UTTypeCopyPreferredTagWithClass(CFStringRef inUTI, - CFStringRef inTagClass); -FBSDK_EXTERN CFStringRef fbsdkdfl_kUTTagClassMIMEType(void); -FBSDK_EXTERN CFStringRef fbsdkdfl_kUTTypeJPEG(void); -FBSDK_EXTERN CFStringRef fbsdkdfl_kUTTypePNG(void); diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h deleted file mode 100644 index f37bd86b9..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKError : NSObject - -+ (NSString *)errorDomain; - -+ (BOOL)errorIsNetworkError:(NSError *)error; - -+ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message; -+ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message underlyingError:(NSError *)underlyingError; -+ (NSError *)errorWithCode:(NSInteger)code - userInfo:(NSDictionary *)userInfo - message:(NSString *)message - underlyingError:(NSError *)underlyingError; - -+ (NSError *)invalidArgumentErrorWithName:(NSString *)name value:(id)value message:(NSString *)message; -+ (NSError *)invalidArgumentErrorWithName:(NSString *)name - value:(id)value - message:(NSString *)message - underlyingError:(NSError *)underlyingError; -+ (NSError *)invalidCollectionErrorWithName:(NSString *)name - collection:(id)collection - item:(id)item - message:(NSString *)message; -+ (NSError *)invalidCollectionErrorWithName:(NSString *)name - collection:(id)collection - item:(id)item - message:(NSString *)message - underlyingError:(NSError *)underlyingError; - -+ (NSError *)requiredArgumentErrorWithName:(NSString *)name message:(NSString *)message; -+ (NSError *)requiredArgumentErrorWithName:(NSString *)name - message:(NSString *)message - underlyingError:(NSError *)underlyingError; - -+ (NSError *)unknownErrorWithMessage:(NSString *)message; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.m deleted file mode 100644 index 0a7b4555a..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.m +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKError.h" - -#import "FBSDKConstants.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKTypeUtility.h" - -@implementation FBSDKError - -#pragma mark - Class Methods - -+ (NSString *)errorDomain -{ - return FBSDKErrorDomain; -} - -+ (BOOL)errorIsNetworkError:(NSError *)error -{ - if (error == nil) { - return NO; - } - - NSError *innerError = error.userInfo[NSUnderlyingErrorKey]; - if ([self errorIsNetworkError:innerError]) { - return YES; - } - - switch (error.code) { - case NSURLErrorTimedOut: - case NSURLErrorCannotFindHost: - case NSURLErrorCannotConnectToHost: - case NSURLErrorNetworkConnectionLost: - case NSURLErrorDNSLookupFailed: - case NSURLErrorNotConnectedToInternet: - case NSURLErrorInternationalRoamingOff: - case NSURLErrorCallIsActive: - case NSURLErrorDataNotAllowed: - return YES; - default: - return NO; - } -} - -+ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message -{ - return [self errorWithCode:code message:message underlyingError:nil]; -} - -+ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message underlyingError:(NSError *)underlyingError -{ - return [self errorWithCode:code userInfo:nil message:message underlyingError:underlyingError]; -} - -+ (NSError *)errorWithCode:(NSInteger)code - userInfo:(NSDictionary *)userInfo - message:(NSString *)message - underlyingError:(NSError *)underlyingError -{ - NSMutableDictionary *fullUserInfo = [[NSMutableDictionary alloc] initWithDictionary:userInfo]; - [FBSDKInternalUtility dictionary:fullUserInfo setObject:message forKey:FBSDKErrorDeveloperMessageKey]; - [FBSDKInternalUtility dictionary:fullUserInfo setObject:underlyingError forKey:NSUnderlyingErrorKey]; - userInfo = ([fullUserInfo count] ? [fullUserInfo copy] : nil); - return [[NSError alloc] initWithDomain:[self errorDomain] code:code userInfo:userInfo]; -} - -+ (NSError *)invalidArgumentErrorWithName:(NSString *)name value:(id)value message:(NSString *)message -{ - return [self invalidArgumentErrorWithName:name value:value message:message underlyingError:nil]; -} - -+ (NSError *)invalidArgumentErrorWithName:(NSString *)name - value:(id)value - message:(NSString *)message - underlyingError:(NSError *)underlyingError -{ - if (!message) { - message = [[NSString alloc] initWithFormat:@"Invalid value for %@: %@", name, value]; - } - NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:userInfo setObject:name forKey:FBSDKErrorArgumentNameKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:value forKey:FBSDKErrorArgumentValueKey]; - return [self errorWithCode:FBSDKInvalidArgumentErrorCode - userInfo:userInfo - message:message - underlyingError:underlyingError]; -} - -+ (NSError *)invalidCollectionErrorWithName:(NSString *)name - collection:(id)collection - item:(id)item - message:(NSString *)message -{ - return [self invalidCollectionErrorWithName:name collection:collection item:item message:message underlyingError:nil]; -} - -+ (NSError *)invalidCollectionErrorWithName:(NSString *)name - collection:(id)collection - item:(id)item - message:(NSString *)message - underlyingError:(NSError *)underlyingError -{ - if (!message) { - message = [[NSString alloc] initWithFormat:@"Invalid item (%@) found in collection for %@: %@", item, name, collection]; - } - NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:userInfo setObject:name forKey:FBSDKErrorArgumentNameKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:item forKey:FBSDKErrorArgumentValueKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:collection forKey:FBSDKErrorArgumentCollectionKey]; - return [self errorWithCode:FBSDKInvalidArgumentErrorCode - userInfo:userInfo - message:message - underlyingError:underlyingError]; -} - -+ (NSError *)requiredArgumentErrorWithName:(NSString *)name message:(NSString *)message -{ - return [self requiredArgumentErrorWithName:name message:message underlyingError:nil]; -} - -+ (NSError *)requiredArgumentErrorWithName:(NSString *)name - message:(NSString *)message - underlyingError:(NSError *)underlyingError -{ - if (!message) { - message = [[NSString alloc] initWithFormat:@"Value for %@ is required.", name]; - } - return [self invalidArgumentErrorWithName:name value:nil message:message underlyingError:underlyingError]; -} - -+ (NSError *)unknownErrorWithMessage:(NSString *)message -{ - return [self errorWithCode:FBSDKUnknownErrorCode - userInfo:nil - message:message - underlyingError:nil]; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKImageDownloader.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKImageDownloader.h deleted file mode 100644 index b2629da77..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKImageDownloader.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -/* - simple class to manage image downloads - - this class is not smart enough to dedupe identical requests in flight. - */ -@interface FBSDKImageDownloader : NSObject - -+ (instancetype)sharedInstance; - -/* - download an image or retrieve it from cache - - Parameter url: the url to download - - Parameter ttl: the amount of time (in seconds) that using a cached version is acceptable. - - Parameter completion: the callback with the image - for simplicity nil is returned rather than surfacing an error. - */ -- (void)downloadImageWithURL:(NSURL *)url ttl:(NSTimeInterval)ttl completion:(void(^)(UIImage* image))completion; - -- (void)removeAll; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKImageDownloader.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKImageDownloader.m deleted file mode 100644 index 4c9f5c907..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKImageDownloader.m +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKImageDownloader.h" - -static NSString *const kImageDirectory = @"fbsdkimages"; -static NSString *const kCachedResponseUserInfoKeyTimestamp = @"timestamp"; - -@implementation FBSDKImageDownloader { - NSURLCache *_urlCache; -} - -+ (instancetype)sharedInstance -{ - static FBSDKImageDownloader *instance; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - instance = [[FBSDKImageDownloader alloc] init]; - }); - return instance; -} - -- (instancetype)init -{ - if ((self = [super init])) { - _urlCache = [[NSURLCache alloc] initWithMemoryCapacity:1024*1024*8 - diskCapacity:1024*1024*100 - diskPath:kImageDirectory]; - } - return self; -} - -- (void)removeAll -{ - [_urlCache removeAllCachedResponses]; -} - -- (void)downloadImageWithURL:(NSURL *)url ttl:(NSTimeInterval)ttl completion:(void(^)(UIImage* image))completion -{ - NSURLRequest *request = [NSURLRequest requestWithURL:url]; - NSCachedURLResponse *cachedResponse = [_urlCache cachedResponseForRequest:request]; - NSDate *modificationDate = cachedResponse.userInfo[kCachedResponseUserInfoKeyTimestamp]; - BOOL isExpired = ([[modificationDate dateByAddingTimeInterval:ttl] compare:[NSDate date]] == NSOrderedAscending); - - void (^completionWrapper)(NSCachedURLResponse *) = ^(NSCachedURLResponse *responseData){ - if (completion != NULL) { - UIImage *image = [UIImage imageWithData:responseData.data]; - completion(image); - } - }; - - if (cachedResponse == nil || isExpired) { - NSURLSession *session = [NSURLSession sharedSession]; - NSURLSessionDataTask *task = [session dataTaskWithRequest:request - completionHandler: - ^(NSData *data, NSURLResponse *response, NSError *error) { - if ([response isKindOfClass:[NSHTTPURLResponse class]] && - ((NSHTTPURLResponse *)response).statusCode == 200 && - error == nil && - data != nil) { - NSCachedURLResponse *responseToCache = - [[NSCachedURLResponse alloc] initWithResponse:response - data:data - userInfo:@{ kCachedResponseUserInfoKeyTimestamp : [NSDate date] } - storagePolicy:NSURLCacheStorageAllowed]; - [_urlCache storeCachedResponse:responseToCache forRequest:request]; - completionWrapper(responseToCache); - } else if (completion != NULL) { - completion(nil); - } - }]; - [task resume]; - } else { - completionWrapper(cachedResponse); - } -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h deleted file mode 100644 index a35ddb5b9..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h +++ /dev/null @@ -1,366 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -#define FBSDK_CANOPENURL_FACEBOOK @"fbauth2" -#define FBSDK_CANOPENURL_FBAPI @"fbapi" -#define FBSDK_CANOPENURL_MESSENGER @"fb-messenger-share-api" -#define FBSDK_CANOPENURL_MSQRD_PLAYER @"msqrdplayer" -#define FBSDK_CANOPENURL_SHARE_EXTENSION @"fbshareextension" - -typedef NS_ENUM(int32_t, FBSDKUIKitVersion) -{ - FBSDKUIKitVersion_6_0 = 0x0944, - FBSDKUIKitVersion_6_1 = 0x094C, - FBSDKUIKitVersion_7_0 = 0x0B57, - FBSDKUIKitVersion_7_1 = 0x0B77, - FBSDKUIKitVersion_8_0 = 0x0CF6, -}; - -@interface FBSDKInternalUtility : NSObject - -/** - Constructs the scheme for apps that come to the current app through the bridge. - */ -+ (NSString *)appURLScheme; - -/** - Constructs an URL for the current app. - - Parameter host: The host for the URL. - - Parameter path: The path for the URL. - - Parameter queryParameters: The query parameters for the URL. This will be converted into a query string. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Returns: The app URL. - */ -+ (NSURL *)appURLWithHost:(NSString *)host - path:(NSString *)path - queryParameters:(NSDictionary *)queryParameters - error:(NSError *__autoreleasing *)errorRef; - -/** - Parses an FB url's query params (and potentially fragment) into a dictionary. - - Parameter url: The FB url. - - Returns: A dictionary with the key/value pairs. - */ -+ (NSDictionary *)dictionaryFromFBURL:(NSURL *)url; - -/** - Adds an object to an array if it is not nil. - - Parameter array: The array to add the object to. - - Parameter object: The object to add to the array. - */ -+ (void)array:(NSMutableArray *)array addObject:(id)object; - -/** - Returns bundle for returning localized strings - - We assume a convention of a bundle named FBSDKStrings.bundle, otherwise we - return the main bundle. -*/ -+ (NSBundle *)bundleForStrings; - -/** - Converts simple value types to the string equivalent for serializing to a request query or body. - - Parameter value: The value to be converted. - - Returns: The value that may have been converted if able (otherwise the input param). - */ -+ (id)convertRequestValue:(id)value; - -/** - Gets the milliseconds since the Unix Epoch. - - Changes in the system clock will affect this value. - - Returns: The number of milliseconds since the Unix Epoch. - */ -+ (uint64_t)currentTimeInMilliseconds; - -/** - Sets an object for a key in a dictionary if it is not nil. - - Parameter dictionary: The dictionary to set the value for. - - Parameter object: The value to set after serializing to JSON. - - Parameter key: The key to set the value for. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Returns: NO if an error occurred while serializing the object, otherwise YES. - */ -+ (BOOL)dictionary:(NSMutableDictionary *)dictionary -setJSONStringForObject:(id)object - forKey:(id)key - error:(NSError *__autoreleasing *)errorRef; - -/** - Sets an object for a key in a dictionary if it is not nil. - - Parameter dictionary: The dictionary to set the value for. - - Parameter object: The value to set. - - Parameter key: The key to set the value for. - */ -+ (void)dictionary:(NSMutableDictionary *)dictionary setObject:(id)object forKey:(id)key; - -/** - Constructs a Facebook URL. - - Parameter hostPrefix: The prefix for the host, such as 'm', 'graph', etc. - - Parameter path: The path for the URL. This may or may not include a version. - - Parameter queryParameters: The query parameters for the URL. This will be converted into a query string. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Returns: The Facebook URL. - */ -+ (NSURL *)facebookURLWithHostPrefix:(NSString *)hostPrefix - path:(NSString *)path - queryParameters:(NSDictionary *)queryParameters - error:(NSError *__autoreleasing *)errorRef; - -/** - Constructs a Facebook URL. - - Parameter hostPrefix: The prefix for the host, such as 'm', 'graph', etc. - - Parameter path: The path for the URL. This may or may not include a version. - - Parameter queryParameters: The query parameters for the URL. This will be converted into a query string. - - Parameter defaultVersion: A version to add to the URL if none is found in the path. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Returns: The Facebook URL. - */ -+ (NSURL *)facebookURLWithHostPrefix:(NSString *)hostPrefix - path:(NSString *)path - queryParameters:(NSDictionary *)queryParameters - defaultVersion:(NSString *)defaultVersion - error:(NSError *__autoreleasing *)errorRef; - -/** - Tests whether the supplied URL is a valid URL for opening in the browser. - - Parameter URL: The URL to test. - - Returns: YES if the URL refers to an http or https resource, otherwise NO. - */ -+ (BOOL)isBrowserURL:(NSURL *)URL; - -/** - Tests whether the supplied bundle identifier references a Facebook app. - - Parameter bundleIdentifier: The bundle identifier to test. - - Returns: YES if the bundle identifier refers to a Facebook app, otherwise NO. - */ -+ (BOOL)isFacebookBundleIdentifier:(NSString *)bundleIdentifier; - -/** - Tests whether the operating system is at least the specified version. - - Parameter version: The version to test against. - - Returns: YES if the operating system is greater than or equal to the specified version, otherwise NO. - */ -+ (BOOL)isOSRunTimeVersionAtLeast:(NSOperatingSystemVersion)version; - -/** - Tests whether the supplied bundle identifier references the Safari app. - - Parameter bundleIdentifier: The bundle identifier to test. - - Returns: YES if the bundle identifier refers to the Safari app, otherwise NO. - */ -+ (BOOL)isSafariBundleIdentifier:(NSString *)bundleIdentifier; - -/** - Tests whether the UIKit version that the current app was linked to is at least the specified version. - - Parameter version: The version to test against. - - Returns: YES if the linked UIKit version is greater than or equal to the specified version, otherwise NO. - */ -+ (BOOL)isUIKitLinkTimeVersionAtLeast:(FBSDKUIKitVersion)version; - -/** - Tests whether the UIKit version in the runtime is at least the specified version. - - Parameter version: The version to test against. - - Returns: YES if the runtime UIKit version is greater than or equal to the specified version, otherwise NO. - */ -+ (BOOL)isUIKitRunTimeVersionAtLeast:(FBSDKUIKitVersion)version; - -/** - Converts an object into a JSON string. - - Parameter object: The object to convert to JSON. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Parameter invalidObjectHandler: Handles objects that are invalid, returning a replacement value or nil to ignore. - - Returns: A JSON string or nil if the object cannot be converted to JSON. - */ -+ (NSString *)JSONStringForObject:(id)object - error:(NSError *__autoreleasing *)errorRef - invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler; - -/** - Checks equality between 2 objects. - - Checks for pointer equality, nils, isEqual:. - - Parameter object: The first object to compare. - - Parameter other: The second object to compare. - - Returns: YES if the objects are equal, otherwise NO. - */ -+ (BOOL)object:(id)object isEqualToObject:(id)other; - -/** - Converts a JSON string into an object - - Parameter string: The JSON string to convert. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Returns: An NSDictionary, NSArray, NSString or NSNumber containing the object representation, or nil if the string - cannot be converted. - */ -+ (id)objectForJSONString:(NSString *)string error:(NSError *__autoreleasing *)errorRef; - -/** - The version of the operating system on which the process is executing. - */ -+ (NSOperatingSystemVersion)operatingSystemVersion; - -/** - Constructs a query string from a dictionary. - - Parameter dictionary: The dictionary with key/value pairs for the query string. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Parameter invalidObjectHandler: Handles objects that are invalid, returning a replacement value or nil to ignore. - - Returns: Query string representation of the parameters. - */ -+ (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary - error:(NSError *__autoreleasing *)errorRef - invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler; - -/** - Tests whether the orientation should be manually adjusted for views outside of the root view controller. - - With the legacy layout the developer must worry about device orientation when working with views outside of - the window's root view controller and apply the correct rotation transform and/or swap a view's width and height - values. If the application was linked with UIKit on iOS 7 or earlier or the application is running on iOS 7 or earlier - then we need to use the legacy layout code. Otherwise if the application was linked with UIKit on iOS 8 or later and - the application is running on iOS 8 or later, UIKit handles all of the rotation complexity and the origin is always in - the top-left and no rotation transform is necessary. - - Returns: YES if if the orientation must be manually adjusted, otherwise NO. - */ -+ (BOOL)shouldManuallyAdjustOrientation; - -/** - Constructs an NSURL. - - Parameter scheme: The scheme for the URL. - - Parameter host: The host for the URL. - - Parameter path: The path for the URL. - - Parameter queryParameters: The query parameters for the URL. This will be converted into a query string. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Returns: The URL. - */ -+ (NSURL *)URLWithScheme:(NSString *)scheme - host:(NSString *)host - path:(NSString *)path - queryParameters:(NSDictionary *)queryParameters - error:(NSError *__autoreleasing *)errorRef; - -/** - * Deletes all the cookies in the NSHTTPCookieStorage for Facebook web dialogs - */ -+ (void)deleteFacebookCookies; - -/** - Extracts permissions from a response fetched from me/permissions - - Parameter responseObject: the response - - Parameter grantedPermissions: the set to add granted permissions to - - Parameter declinedPermissions: the set to add declined permissions to. - */ -+ (void)extractPermissionsFromResponse:(NSDictionary *)responseObject - grantedPermissions:(NSMutableSet *)grantedPermissions - declinedPermissions:(NSMutableSet *)declinedPermissions; - -/** - Registers a transient object so that it will not be deallocated until unregistered - - Parameter object: The transient object - */ -+ (void)registerTransientObject:(id)object; - -/** - Unregisters a transient object that was previously registered with registerTransientObject: - - Parameter object: The transient object - */ -+ (void)unregisterTransientObject:(__weak id)object; - -/** - validates that the app ID is non-nil, throws an NSException if nil. - */ -+ (void)validateAppID; - -/** - Validates that the client access token is non-nil, otherwise - throws an NSException otherwise. - Returns the composed client access token. - */ -+ (NSString *)validateRequiredClientAccessToken; - -/** - validates that the right URL schemes are registered, throws an NSException if not. - */ -+ (void)validateURLSchemes; - -/** - validates that Facebook reserved URL schemes are not registered, throws an NSException if they are. - */ -+ (void)validateFacebookReservedURLSchemes; - -/** - Attempts to find the first UIViewController in the view's responder chain. Returns nil if not found. - */ -+ (UIViewController *)viewControllerForView:(UIView *)view; - -/** - returns true if the url scheme is registered in the CFBundleURLTypes - */ -+ (BOOL)isRegisteredURLScheme:(NSString *)urlScheme; - -/** - returns the current key window - */ -+ (UIWindow *)findWindow; - -/** - returns currently displayed top view controller. - */ -+ (UIViewController *)topMostViewController; - -/** - Converts NSData to a hexadecimal UTF8 String. - */ -+ (NSString *)hexadecimalStringFromData:(NSData *)data; - -/* - Checks if the permission is a publish permission. - */ -+ (BOOL)isPublishPermission:(NSString *)permission; - -/* - Checks if the set of permissions are all read permissions. - */ -+ (BOOL)areAllPermissionsReadPermissions:(NSSet *)permissions; - -/* - Checks if the set of permissions are all publish permissions. - */ -+ (BOOL)areAllPermissionsPublishPermissions:(NSSet *)permissions; - -#pragma mark - FB Apps Installed - -+ (BOOL)isFacebookAppInstalled; -+ (BOOL)isMessengerAppInstalled; -+ (BOOL)isMSQRDPlayerAppInstalled; -+ (void)checkRegisteredCanOpenURLScheme:(NSString *)urlScheme; -+ (BOOL)isRegisteredCanOpenURLScheme:(NSString *)urlScheme; - -#define FBSDKConditionalLog(condition, loggingBehavior, desc, ...) \ -{ \ - if (!(condition)) { \ - NSString *msg = [NSString stringWithFormat:(desc), ##__VA_ARGS__]; \ - [FBSDKLogger singleShotLogEntry:loggingBehavior logEntry:msg]; \ - } \ -} - -#define FB_BASE_URL @"facebook.com" - -+ (Class)resolveBoltsClassWithName:(NSString *)className; -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.m deleted file mode 100644 index 574db4edf..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.m +++ /dev/null @@ -1,775 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKInternalUtility.h" - -#import - -#import - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKError.h" -#import "FBSDKMacros.h" -#import "FBSDKSettings.h" -#import "FBSDKUtility.h" - -typedef NS_ENUM(NSUInteger, FBSDKInternalUtilityVersionMask) -{ - FBSDKInternalUtilityMajorVersionMask = 0xFFFF0000, - //FBSDKInternalUtilityMinorVersionMask = 0x0000FF00, // unused - //FBSDKInternalUtilityPatchVersionMask = 0x000000FF, // unused -}; - -typedef NS_ENUM(NSUInteger, FBSDKInternalUtilityVersionShift) -{ - FBSDKInternalUtilityMajorVersionShift = 16, - //FBSDKInternalUtilityMinorVersionShift = 8, // unused - //FBSDKInternalUtilityPatchVersionShift = 0, // unused -}; - -@implementation FBSDKInternalUtility - -#pragma mark - Class Methods - -+ (NSString *)appURLScheme -{ - NSString *appID = ([FBSDKSettings appID] ?: @""); - NSString *suffix = ([FBSDKSettings appURLSchemeSuffix] ?: @""); - return [[NSString alloc] initWithFormat: @"fb%@%@", appID, suffix]; -} - -+ (NSURL *)appURLWithHost:(NSString *)host - path:(NSString *)path - queryParameters:(NSDictionary *)queryParameters - error:(NSError *__autoreleasing *)errorRef -{ - return [self URLWithScheme:[self appURLScheme] - host:host - path:path - queryParameters:queryParameters - error:errorRef]; -} - -+ (NSDictionary *)dictionaryFromFBURL:(NSURL *)url -{ - // version 3.2.3 of the Facebook app encodes the parameters in the query but - // version 3.3 and above encode the parameters in the fragment; - // merge them together with fragment taking priority. - NSMutableDictionary *params = [NSMutableDictionary dictionary]; - [params addEntriesFromDictionary:[FBSDKUtility dictionaryWithQueryString:url.query]]; - - // Only get the params from the fragment if it has authorize as the host - if ([url.host isEqualToString:@"authorize"]) { - [params addEntriesFromDictionary:[FBSDKUtility dictionaryWithQueryString:url.fragment]]; - } - return params; -} - -+ (void)array:(NSMutableArray *)array addObject:(id)object -{ - if (object) { - [array addObject:object]; - } -} - -+ (NSBundle *)bundleForStrings -{ - static NSBundle *bundle; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSString *stringsBundlePath = [[NSBundle bundleForClass:[FBSDKApplicationDelegate class]] - pathForResource:@"FacebookSDKStrings" - ofType:@"bundle"]; - bundle = [NSBundle bundleWithPath:stringsBundlePath] ?: [NSBundle mainBundle]; - }); - return bundle; -} - -+ (id)convertRequestValue:(id)value -{ - if ([value isKindOfClass:[NSNumber class]]) { - value = [(NSNumber *)value stringValue]; - } else if ([value isKindOfClass:[NSURL class]]) { - value = [(NSURL *)value absoluteString]; - } - return value; -} - -+ (uint64_t)currentTimeInMilliseconds -{ - struct timeval time; - gettimeofday(&time, NULL); - return ((uint64_t)time.tv_sec * 1000) + (time.tv_usec / 1000); -} - -+ (BOOL)dictionary:(NSMutableDictionary *)dictionary -setJSONStringForObject:(id)object - forKey:(id)key - error:(NSError *__autoreleasing *)errorRef -{ - if (!object || !key) { - return YES; - } - NSString *JSONString = [self JSONStringForObject:object error:errorRef invalidObjectHandler:NULL]; - if (!JSONString) { - return NO; - } - [self dictionary:dictionary setObject:JSONString forKey:key]; - return YES; -} - -+ (void)dictionary:(NSMutableDictionary *)dictionary setObject:(id)object forKey:(id)key -{ - if (object && key) { - [dictionary setObject:object forKey:key]; - } -} - -+ (void)extractPermissionsFromResponse:(NSDictionary *)responseObject - grantedPermissions:(NSMutableSet *)grantedPermissions - declinedPermissions:(NSMutableSet *)declinedPermissions -{ - NSArray *resultData = responseObject[@"data"]; - if (resultData.count > 0) { - for (NSDictionary *permissionsDictionary in resultData) { - NSString *permissionName = permissionsDictionary[@"permission"]; - NSString *status = permissionsDictionary[@"status"]; - - if ([status isEqualToString:@"granted"]) { - [grantedPermissions addObject:permissionName]; - } else if ([status isEqualToString:@"declined"]) { - [declinedPermissions addObject:permissionName]; - } - } - } -} - -+ (NSURL *)facebookURLWithHostPrefix:(NSString *)hostPrefix - path:(NSString *)path - queryParameters:(NSDictionary *)queryParameters - error:(NSError *__autoreleasing *)errorRef -{ - return [self facebookURLWithHostPrefix:hostPrefix - path:path - queryParameters:queryParameters - defaultVersion:nil - error:errorRef]; -} - -+ (NSURL *)facebookURLWithHostPrefix:(NSString *)hostPrefix - path:(NSString *)path - queryParameters:(NSDictionary *)queryParameters - defaultVersion:(NSString *)defaultVersion - error:(NSError *__autoreleasing *)errorRef -{ - if ([hostPrefix length] && ![hostPrefix hasSuffix:@"."]) { - hostPrefix = [hostPrefix stringByAppendingString:@"."]; - } - - NSString *host = @"facebook.com"; - NSString *domainPart = [FBSDKSettings facebookDomainPart]; - if ([domainPart length]) { - host = [[NSString alloc] initWithFormat:@"%@.%@", domainPart, host]; - } - host = [NSString stringWithFormat:@"%@%@", hostPrefix ?: @"", host ?: @""]; - - NSString *version = defaultVersion ?: [FBSDKSettings graphAPIVersion]; - if ([version length]) { - version = [@"/" stringByAppendingString:version]; - } - - if ([path length]) { - NSScanner *versionScanner = [[NSScanner alloc] initWithString:path]; - if ([versionScanner scanString:@"/v" intoString:NULL] && - [versionScanner scanInteger:NULL] && - [versionScanner scanString:@"." intoString:NULL] && - [versionScanner scanInteger:NULL]) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - logEntry:[NSString stringWithFormat:@"Invalid Graph API version:%@, assuming %@ instead", - version, - [FBSDKSettings graphAPIVersion]]]; - version = nil; - } - if (![path hasPrefix:@"/"]) { - path = [@"/" stringByAppendingString:path]; - } - } - path = [[NSString alloc] initWithFormat:@"%@%@", version ?: @"", path ?: @""]; - - return [self URLWithScheme:@"https" - host:host - path:path - queryParameters:queryParameters - error:errorRef]; -} - -+ (BOOL)isBrowserURL:(NSURL *)URL -{ - NSString *scheme = [URL.scheme lowercaseString]; - return ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"]); -} - -+ (BOOL)isFacebookBundleIdentifier:(NSString *)bundleIdentifier -{ - return ([bundleIdentifier hasPrefix:@"com.facebook."] || - [bundleIdentifier hasPrefix:@".com.facebook."]); -} - -+ (BOOL)isOSRunTimeVersionAtLeast:(NSOperatingSystemVersion)version -{ - return ([self _compareOperatingSystemVersion:[self operatingSystemVersion] toVersion:version] != NSOrderedAscending); -} - -+ (BOOL)isSafariBundleIdentifier:(NSString *)bundleIdentifier -{ - return ([bundleIdentifier isEqualToString:@"com.apple.mobilesafari"] || - [bundleIdentifier isEqualToString:@"com.apple.SafariViewService"]); -} - -+ (BOOL)isUIKitLinkTimeVersionAtLeast:(FBSDKUIKitVersion)version -{ - static int32_t linkTimeMajorVersion; - static dispatch_once_t getVersionOnce; - dispatch_once(&getVersionOnce, ^{ - int32_t linkTimeVersion = NSVersionOfLinkTimeLibrary("UIKit"); - linkTimeMajorVersion = ((MAX(linkTimeVersion, 0) & FBSDKInternalUtilityMajorVersionMask) >> FBSDKInternalUtilityMajorVersionShift); - }); - return (version <= linkTimeMajorVersion); -} - -+ (BOOL)isUIKitRunTimeVersionAtLeast:(FBSDKUIKitVersion)version -{ - static int32_t runTimeMajorVersion; - static dispatch_once_t getVersionOnce; - dispatch_once(&getVersionOnce, ^{ - int32_t runTimeVersion = NSVersionOfRunTimeLibrary("UIKit"); - runTimeMajorVersion = ((MAX(runTimeVersion, 0) & FBSDKInternalUtilityMajorVersionMask) >> FBSDKInternalUtilityMajorVersionShift); - }); - return (version <= runTimeMajorVersion); -} - -+ (NSString *)JSONStringForObject:(id)object - error:(NSError *__autoreleasing *)errorRef - invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler -{ - if (invalidObjectHandler || ![NSJSONSerialization isValidJSONObject:object]) { - object = [self _convertObjectToJSONObject:object invalidObjectHandler:invalidObjectHandler stop:NULL]; - if (![NSJSONSerialization isValidJSONObject:object]) { - if (errorRef != NULL) { - *errorRef = [FBSDKError invalidArgumentErrorWithName:@"object" - value:object - message:@"Invalid object for JSON serialization."]; - } - return nil; - } - } - NSData *data = [NSJSONSerialization dataWithJSONObject:object options:0 error:errorRef]; - if (!data) { - return nil; - } - return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; -} - -+ (BOOL)object:(id)object isEqualToObject:(id)other; -{ - if (object == other) { - return YES; - } - if (!object || !other) { - return NO; - } - return [object isEqual:other]; -} - -+ (id)objectForJSONString:(NSString *)string error:(NSError *__autoreleasing *)errorRef -{ - NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; - if (!data) { - if (errorRef != NULL) { - *errorRef = nil; - } - return nil; - } - return [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:errorRef]; -} - -+ (NSOperatingSystemVersion)operatingSystemVersion -{ - static NSOperatingSystemVersion operatingSystemVersion = { - .majorVersion = 0, - .minorVersion = 0, - .patchVersion = 0, - }; - static dispatch_once_t getVersionOnce; - dispatch_once(&getVersionOnce, ^{ - if ([NSProcessInfo instancesRespondToSelector:@selector(operatingSystemVersion)]) { - operatingSystemVersion = [NSProcessInfo processInfo].operatingSystemVersion; - } else { - NSArray *components = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; - switch (components.count) { - default: - case 3: - operatingSystemVersion.patchVersion = [components[2] integerValue]; - // fall through - case 2: - operatingSystemVersion.minorVersion = [components[1] integerValue]; - // fall through - case 1: - operatingSystemVersion.majorVersion = [components[0] integerValue]; - break; - case 0: - operatingSystemVersion.majorVersion = ([self isUIKitLinkTimeVersionAtLeast:FBSDKUIKitVersion_7_0] ? 7 : 6); - break; - } - } - }); - return operatingSystemVersion; -} - -+ (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary - error:(NSError *__autoreleasing *)errorRef - invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler -{ - NSMutableString *queryString = [[NSMutableString alloc] init]; - __block BOOL hasParameters = NO; - if (dictionary) { - NSMutableArray *keys = [[dictionary allKeys] mutableCopy]; - // remove non-string keys, as they are not valid - [keys filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { - return [evaluatedObject isKindOfClass:[NSString class]]; - }]]; - // sort the keys so that the query string order is deterministic - [keys sortUsingSelector:@selector(compare:)]; - BOOL stop = NO; - for (NSString *key in keys) { - id value = [self convertRequestValue:dictionary[key]]; - if ([value isKindOfClass:[NSString class]]) { - value = [FBSDKUtility URLEncode:value]; - } - if (invalidObjectHandler && ![value isKindOfClass:[NSString class]]) { - value = invalidObjectHandler(value, &stop); - if (stop) { - break; - } - } - if (value) { - if (hasParameters) { - [queryString appendString:@"&"]; - } - [queryString appendFormat:@"%@=%@", key, value]; - hasParameters = YES; - } - } - } - if (errorRef != NULL) { - *errorRef = nil; - } - return ([queryString length] ? [queryString copy] : nil); -} - -+ (BOOL)shouldManuallyAdjustOrientation -{ - return (![self isUIKitLinkTimeVersionAtLeast:FBSDKUIKitVersion_8_0] || - ![self isUIKitRunTimeVersionAtLeast:FBSDKUIKitVersion_8_0]); -} - -+ (NSURL *)URLWithScheme:(NSString *)scheme - host:(NSString *)host - path:(NSString *)path - queryParameters:(NSDictionary *)queryParameters - error:(NSError *__autoreleasing *)errorRef -{ - if (![path hasPrefix:@"/"]) { - path = [@"/" stringByAppendingString:path ?: @""]; - } - - NSString *queryString = nil; - if ([queryParameters count]) { - NSError *queryStringError; - queryString = [@"?" stringByAppendingString:[FBSDKUtility queryStringWithDictionary:queryParameters - error:&queryStringError]]; - if (!queryString) { - if (errorRef != NULL) { - *errorRef = [FBSDKError invalidArgumentErrorWithName:@"queryParameters" - value:queryParameters - message:nil - underlyingError:queryStringError]; - } - return nil; - } - } - - NSURL *URL = [[NSURL alloc] initWithString:[NSString stringWithFormat: - @"%@://%@%@%@", - scheme ?: @"", - host ?: @"", - path ?: @"", - queryString ?: @""]]; - if (errorRef != NULL) { - if (URL) { - *errorRef = nil; - } else { - *errorRef = [FBSDKError unknownErrorWithMessage:@"Unknown error building URL."]; - } - } - return URL; -} - -+ (void)deleteFacebookCookies -{ - NSHTTPCookieStorage *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage]; - NSArray *facebookCookies = [cookies cookiesForURL:[self facebookURLWithHostPrefix:@"m." - path:@"/dialog/" - queryParameters:nil - error:NULL]]; - - for (NSHTTPCookie *cookie in facebookCookies) { - [cookies deleteCookie:cookie]; - } -} - -static NSMapTable *_transientObjects; - -+ (void)registerTransientObject:(id)object -{ - NSAssert([NSThread isMainThread], @"Must be called from the main thread!"); - if (!_transientObjects) { - _transientObjects = [[NSMapTable alloc] init]; - } - NSUInteger count = [(NSNumber *)[_transientObjects objectForKey:object] unsignedIntegerValue]; - [_transientObjects setObject:@(count + 1) forKey:object]; -} - -+ (void)unregisterTransientObject:(__weak id)object -{ - if (!object) { - return; - } - NSAssert([NSThread isMainThread], @"Must be called from the main thread!"); - NSUInteger count = [(NSNumber *)[_transientObjects objectForKey:object] unsignedIntegerValue]; - if (count == 1) { - [_transientObjects removeObjectForKey:object]; - } else if (count != 0) { - [_transientObjects setObject:@(count - 1) forKey:object]; - } else { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"unregisterTransientObject:%@ count is 0. This may indicate a bug in the FBSDK. Please" - " file a report to developers.facebook.com/bugs if you encounter any problems. Thanks!", [object class]]; - } -} - -+ (UIViewController *)viewControllerForView:(UIView *)view -{ - UIResponder *responder = view.nextResponder; - while (responder) { - if ([responder isKindOfClass:[UIViewController class]]) { - return (UIViewController *)responder; - } - responder = responder.nextResponder; - } - return nil; -} - -#pragma mark - FB Apps Installed - -+ (BOOL)isFacebookAppInstalled -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_FACEBOOK]; - }); - return [self _canOpenURLScheme:FBSDK_CANOPENURL_FACEBOOK]; -} - -+ (BOOL)isMessengerAppInstalled -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_MESSENGER]; - }); - return [self _canOpenURLScheme:FBSDK_CANOPENURL_MESSENGER]; -} - -+ (BOOL)isMSQRDPlayerAppInstalled -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_MSQRD_PLAYER]; - }); - return [self _canOpenURLScheme:FBSDK_CANOPENURL_MSQRD_PLAYER]; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -#pragma mark - Helper Methods - -+ (NSComparisonResult)_compareOperatingSystemVersion:(NSOperatingSystemVersion)version1 - toVersion:(NSOperatingSystemVersion)version2 -{ - if (version1.majorVersion < version2.majorVersion) { - return NSOrderedAscending; - } else if (version1.majorVersion > version2.majorVersion) { - return NSOrderedDescending; - } else if (version1.minorVersion < version2.minorVersion) { - return NSOrderedAscending; - } else if (version1.minorVersion > version2.minorVersion) { - return NSOrderedDescending; - } else if (version1.patchVersion < version2.patchVersion) { - return NSOrderedAscending; - } else if (version1.patchVersion > version2.patchVersion) { - return NSOrderedDescending; - } else { - return NSOrderedSame; - } -} - -+ (id)_convertObjectToJSONObject:(id)object - invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler - stop:(BOOL *)stopRef -{ - __block BOOL stop = NO; - if ([object isKindOfClass:[NSString class]] || [object isKindOfClass:[NSNumber class]]) { - // good to go, keep the object - } else if ([object isKindOfClass:[NSURL class]]) { - object = [(NSURL *)object absoluteString]; - } else if ([object isKindOfClass:[NSDictionary class]]) { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - [(NSDictionary *)object enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *dictionaryStop) { - [self dictionary:dictionary - setObject:[self _convertObjectToJSONObject:obj invalidObjectHandler:invalidObjectHandler stop:&stop] - forKey:[FBSDKTypeUtility stringValue:key]]; - if (stop) { - *dictionaryStop = YES; - } - }]; - object = dictionary; - } else if ([object isKindOfClass:[NSArray class]]) { - NSMutableArray *array = [[NSMutableArray alloc] init]; - for (id obj in (NSArray *)object) { - id convertedObj = [self _convertObjectToJSONObject:obj invalidObjectHandler:invalidObjectHandler stop:&stop]; - [self array:array addObject:convertedObj]; - if (stop) { - break; - } - } - object = array; - } else { - object = invalidObjectHandler(object, stopRef); - } - if (stopRef != NULL) { - *stopRef = stop; - } - return object; -} - -+ (BOOL)_canOpenURLScheme:(NSString *)scheme -{ - NSURLComponents *components = [[NSURLComponents alloc] init]; - components.scheme = scheme; - components.path = @"/"; - return [[UIApplication sharedApplication] canOpenURL:components.URL]; -} - -+ (void)validateAppID -{ - if (![FBSDKSettings appID]) { - NSString *reason = @"App ID not found. Add a string value with your app ID for the key " - @"FacebookAppID to the Info.plist or call [FBSDKSettings setAppID:]."; - @throw [NSException exceptionWithName:@"InvalidOperationException" reason:reason userInfo:nil]; - } -} - -+ (NSString *)validateRequiredClientAccessToken { - if (![FBSDKSettings clientToken]) { - NSString *reason = @"ClientToken is required to be set for this operation. " - @"Set the FacebookClientToken in the Info.plist or call [FBSDKSettings setClientToken:]. " - @"You can find your client token in your App Settings -> Advanced."; - @throw [NSException exceptionWithName:@"InvalidOperationException" reason:reason userInfo:nil]; - } - return [NSString stringWithFormat:@"%@|%@", [FBSDKSettings appID], [FBSDKSettings clientToken]]; -} - -+ (void)validateURLSchemes -{ - [self validateAppID]; - NSString *defaultUrlScheme = [NSString stringWithFormat:@"fb%@%@", [FBSDKSettings appID], [FBSDKSettings appURLSchemeSuffix] ?: @""]; - if (![self isRegisteredURLScheme:defaultUrlScheme]) { - NSString *reason = [NSString stringWithFormat:@"%@ is not registered as a URL scheme. Please add it in your Info.plist", defaultUrlScheme]; - @throw [NSException exceptionWithName:@"InvalidOperationException" reason:reason userInfo:nil]; - } -} - -+ (void)validateFacebookReservedURLSchemes -{ - for (NSString * fbUrlScheme in @[FBSDK_CANOPENURL_FACEBOOK, FBSDK_CANOPENURL_MESSENGER, FBSDK_CANOPENURL_FBAPI, FBSDK_CANOPENURL_SHARE_EXTENSION]) { - if ([self isRegisteredURLScheme:fbUrlScheme]) { - NSString *reason = [NSString stringWithFormat:@"%@ is registered as a URL scheme. Please move the entry from CFBundleURLSchemes in your Info.plist to LSApplicationQueriesSchemes. If you are trying to resolve \"canOpenURL: failed\" warnings, those only indicate that the Facebook app is not installed on your device or simulator and can be ignored.", fbUrlScheme]; - @throw [NSException exceptionWithName:@"InvalidOperationException" reason:reason userInfo:nil]; - } - } -} - -+ (UIWindow *)findWindow -{ - UIWindow *window = [UIApplication sharedApplication].keyWindow; - if (window == nil || window.windowLevel != UIWindowLevelNormal) { - for (window in [UIApplication sharedApplication].windows) { - if (window.windowLevel == UIWindowLevelNormal) { - break; - } - } - } - if (window == nil) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"Unable to find a valid UIWindow", nil]; - } - return window; -} - -+ (UIViewController *)topMostViewController -{ - UIWindow *keyWindow = [self findWindow]; - // SDK expects a key window at this point, if it is not, make it one - if (keyWindow != nil && !keyWindow.isKeyWindow) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"Unable to obtain a key window, marking %@ as keyWindow", keyWindow.description]; - [keyWindow makeKeyWindow]; - } - - UIViewController *topController = keyWindow.rootViewController; - while (topController.presentedViewController) { - topController = topController.presentedViewController; - } - return topController; -} - -+ (NSString *)hexadecimalStringFromData:(NSData *)data -{ - NSUInteger dataLength = data.length; - if (dataLength == 0) { - return nil; - } - - const unsigned char *dataBuffer = data.bytes; - NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)]; - for (int i = 0; i < dataLength; ++i) { - [hexString appendFormat:@"%02x", dataBuffer[i]]; - } - return [hexString copy]; -} - -+ (BOOL)isRegisteredURLScheme:(NSString *)urlScheme { - static dispatch_once_t fetchBundleOnce; - static NSArray *urlTypes = nil; - - dispatch_once(&fetchBundleOnce, ^{ - urlTypes = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleURLTypes"]; - }); - for (NSDictionary *urlType in urlTypes) { - NSArray *urlSchemes = [urlType valueForKey:@"CFBundleURLSchemes"]; - if ([urlSchemes containsObject:urlScheme]) { - return YES; - } - } - return NO; -} - -+ (void)checkRegisteredCanOpenURLScheme:(NSString *)urlScheme -{ - static dispatch_once_t initCheckedSchemesOnce; - static NSMutableSet *checkedSchemes = nil; - - dispatch_once(&initCheckedSchemesOnce, ^{ - checkedSchemes = [NSMutableSet set]; - }); - - @synchronized(self) { - if ([checkedSchemes containsObject:urlScheme]) { - return; - } else { - [checkedSchemes addObject:urlScheme]; - } - } - - if (![self isRegisteredCanOpenURLScheme:urlScheme]){ - NSString *reason = [NSString stringWithFormat:@"%@ is missing from your Info.plist under LSApplicationQueriesSchemes and is required for iOS 9.0", urlScheme]; - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:reason]; - } -} - -+ (BOOL)isRegisteredCanOpenURLScheme:(NSString *)urlScheme -{ - static dispatch_once_t fetchBundleOnce; - static NSArray *schemes = nil; - - dispatch_once(&fetchBundleOnce, ^{ - schemes = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"LSApplicationQueriesSchemes"]; - }); - - return [schemes containsObject:urlScheme]; -} - -+ (BOOL)isPublishPermission:(NSString *)permission -{ - return [permission hasPrefix:@"publish"] || - [permission hasPrefix:@"manage"] || - [permission isEqualToString:@"ads_management"] || - [permission isEqualToString:@"create_event"] || - [permission isEqualToString:@"rsvp_event"]; -} - -+ (BOOL)areAllPermissionsReadPermissions:(NSSet *)permissions -{ - for (NSString *permission in permissions) { - if ([[self class] isPublishPermission:permission]) { - return NO; - } - } - return YES; -} - -+ (BOOL)areAllPermissionsPublishPermissions:(NSSet *)permissions -{ - for (NSString *permission in permissions) { - if (![[self class] isPublishPermission:permission]) { - return NO; - } - } - return YES; -} - -+ (Class)resolveBoltsClassWithName:(NSString *)className; -{ - Class clazz = NSClassFromString(className); - if (clazz == nil) { - NSString *message = [NSString stringWithFormat:@"Unable to load class %@. Did you link Bolts.framework?", className]; - @throw [NSException exceptionWithName:NSInternalInconsistencyException - reason:message - userInfo:nil]; - } - - return clazz; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h deleted file mode 100644 index 1672a8b58..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - - Simple logging utility for conditionally logging strings and then emitting them - via NSLog(). - - @unsorted - */ -@interface FBSDKLogger : NSObject - -// Access current accumulated contents of the logger. -@property (copy, nonatomic) NSString *contents; - -// Each FBSDKLogger gets a unique serial number to allow the client to log these numbers and, for instance, correlation of Request/Response -@property (nonatomic, readonly) NSUInteger loggerSerialNumber; - -// The logging behavior of this logger. See the FB_LOG_BEHAVIOR* constants in FBSession.h -@property (copy, nonatomic, readonly) NSString *loggingBehavior; - -// Is the current logger instance active, based on its loggingBehavior? -@property (nonatomic, readonly) BOOL isActive; - -// -// Instance methods -// - -// Create with specified logging behavior -- (instancetype)initWithLoggingBehavior:(NSString *)loggingBehavior; - -// Append string, or key/value pair -- (void)appendString:(NSString *)string; -- (void)appendFormat:(NSString *)formatString, ... NS_FORMAT_FUNCTION(1,2); -- (void)appendKey:(NSString *)key value:(NSString *)value; - -// Emit log, clearing out the logger contents. -- (void)emitToNSLog; - -// -// Class methods -// - -// -// Return a globally unique serial number to be used for correlating multiple output from the same logger. -// -+ (NSUInteger)generateSerialNumber; - -// Simple helper to write a single log entry, based upon whether the behavior matches a specified on. -+ (void)singleShotLogEntry:(NSString *)loggingBehavior - logEntry:(NSString *)logEntry; - -+ (void)singleShotLogEntry:(NSString *)loggingBehavior - formatString:(NSString *)formatString, ... NS_FORMAT_FUNCTION(2,3); - -+ (void)singleShotLogEntry:(NSString *)loggingBehavior - timestampTag:(NSObject *)timestampTag - formatString:(NSString *)formatString, ... NS_FORMAT_FUNCTION(3,4); - -// Register a timestamp label with the "current" time, to then be retrieved by singleShotLogEntry -// to include a duration. -+ (void)registerCurrentTime:(NSString *)loggingBehavior - withTag:(NSObject *)timestampTag; - -// When logging strings, replace all instances of 'replace' with instances of 'replaceWith'. -+ (void)registerStringToReplace:(NSString *)replace - replaceWith:(NSString *)replaceWith; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.m deleted file mode 100644 index 6921fc267..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.m +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLogger.h" - -#import "FBSDKInternalUtility.h" -#import "FBSDKSettings+Internal.h" - -static NSUInteger g_serialNumberCounter = 1111; -static NSMutableDictionary *g_stringsToReplace = nil; -static NSMutableDictionary *g_startTimesWithTags = nil; - -@interface FBSDKLogger () - -@property (nonatomic, strong, readonly) NSMutableString *internalContents; - -@end - -@implementation FBSDKLogger - -// Lifetime - -- (instancetype)initWithLoggingBehavior:(NSString *)loggingBehavior -{ - if ((self = [super init])) { - _isActive = [[FBSDKSettings loggingBehavior] containsObject:loggingBehavior]; - _loggingBehavior = loggingBehavior; - if (_isActive) { - _internalContents = [[NSMutableString alloc] init]; - _loggerSerialNumber = [FBSDKLogger generateSerialNumber]; - } - } - - return self; -} - -// Public properties - -- (NSString *)contents -{ - return _internalContents; -} - -- (void)setContents:(NSString *)contents -{ - if (_isActive) { - _internalContents = [NSMutableString stringWithString:contents]; - } -} - -// Public instance methods - -- (void)appendString:(NSString *)string -{ - if (_isActive) { - [_internalContents appendString:string]; - } -} - -- (void)appendFormat:(NSString *)formatString, ... -{ - if (_isActive) { - va_list vaArguments; - va_start(vaArguments, formatString); - NSString *logString = [[NSString alloc] initWithFormat:formatString arguments:vaArguments]; - va_end(vaArguments); - - [self appendString:logString]; - } -} - - -- (void)appendKey:(NSString *)key value:(NSString *)value -{ - if (_isActive && [value length]) { - [_internalContents appendFormat:@" %@:\t%@\n", key, value]; - } -} - -- (void)emitToNSLog -{ - if (_isActive) { - - for (NSString *key in [g_stringsToReplace keyEnumerator]) { - [_internalContents replaceOccurrencesOfString:key - withString:[g_stringsToReplace objectForKey:key] - options:NSLiteralSearch - range:NSMakeRange(0, _internalContents.length)]; - } - - // Xcode 4.4 hangs on extremely long NSLog output (http://openradar.appspot.com/11972490). Truncate if needed. - const int MAX_LOG_STRING_LENGTH = 10000; - NSString *logString = _internalContents; - if (_internalContents.length > MAX_LOG_STRING_LENGTH) { - logString = [NSString stringWithFormat:@"TRUNCATED: %@", [_internalContents substringToIndex:MAX_LOG_STRING_LENGTH]]; - } - NSLog(@"FBSDKLog: %@", logString); - - [_internalContents setString:@""]; - } -} - -// Public static methods - -+ (NSUInteger)generateSerialNumber -{ - return g_serialNumberCounter++; -} - -+ (void)singleShotLogEntry:(NSString *)loggingBehavior - logEntry:(NSString *)logEntry { - if ([[FBSDKSettings loggingBehavior] containsObject:loggingBehavior]) { - FBSDKLogger *logger = [[FBSDKLogger alloc] initWithLoggingBehavior:loggingBehavior]; - [logger appendString:logEntry]; - [logger emitToNSLog]; - } -} - -+ (void)singleShotLogEntry:(NSString *)loggingBehavior - formatString:(NSString *)formatString, ... { - - if ([[FBSDKSettings loggingBehavior] containsObject:loggingBehavior]) { - va_list vaArguments; - va_start(vaArguments, formatString); - NSString *logString = [[NSString alloc] initWithFormat:formatString arguments:vaArguments]; - va_end(vaArguments); - - [self singleShotLogEntry:loggingBehavior logEntry:logString]; - } -} - - -+ (void)singleShotLogEntry:(NSString *)loggingBehavior - timestampTag:(NSObject *)timestampTag - formatString:(NSString *)formatString, ... { - - if ([[FBSDKSettings loggingBehavior] containsObject:loggingBehavior]) { - va_list vaArguments; - va_start(vaArguments, formatString); - NSString *logString = [[NSString alloc] initWithFormat:formatString arguments:vaArguments]; - va_end(vaArguments); - - // Start time of this "timestampTag" is stashed in the dictionary. - // Treat the incoming object tag simply as an address, since it's only used to identify during lifetime. If - // we send in as an object, the dictionary will try to copy it. - NSNumber *tagAsNumber = [NSNumber numberWithUnsignedLong:(unsigned long)(__bridge void *)timestampTag]; - NSNumber *startTimeNumber = [g_startTimesWithTags objectForKey:tagAsNumber]; - - // Only log if there's been an associated start time. - if (startTimeNumber) { - uint64_t elapsed = [FBSDKInternalUtility currentTimeInMilliseconds] - startTimeNumber.unsignedLongLongValue; - [g_startTimesWithTags removeObjectForKey:tagAsNumber]; // served its purpose, remove - - // Log string is appended with "%d msec", with nothing intervening. This gives the most control to the caller. - logString = [NSString stringWithFormat:@"%@%llu msec", logString, elapsed]; - - [self singleShotLogEntry:loggingBehavior logEntry:logString]; - } - } -} - -+ (void)registerCurrentTime:(NSString *)loggingBehavior - withTag:(NSObject *)timestampTag { - - if ([[FBSDKSettings loggingBehavior] containsObject:loggingBehavior]) { - - if (!g_startTimesWithTags) { - g_startTimesWithTags = [[NSMutableDictionary alloc] init]; - } - - if (g_startTimesWithTags.count >= 1000) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry: - @"Unexpectedly large number of outstanding perf logging start times, something is likely wrong."]; - } - - uint64_t currTime = [FBSDKInternalUtility currentTimeInMilliseconds]; - - // Treat the incoming object tag simply as an address, since it's only used to identify during lifetime. If - // we send in as an object, the dictionary will try to copy it. - unsigned long tagAsNumber = (unsigned long)(__bridge void *)timestampTag; - [g_startTimesWithTags setObject:@(currTime) - forKey:[NSNumber numberWithUnsignedLong:tagAsNumber]]; - } -} - - -+ (void)registerStringToReplace:(NSString *)replace - replaceWith:(NSString *)replaceWith { - - // Strings sent in here never get cleaned up, but that's OK, don't ever expect too many. - - if ([[FBSDKSettings loggingBehavior] count] > 0) { // otherwise there's no logging. - - if (!g_stringsToReplace) { - g_stringsToReplace = [[NSMutableDictionary alloc] init]; - } - - [g_stringsToReplace setValue:replaceWith forKey:replace]; - } -} - - - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h deleted file mode 100644 index e3f9cd531..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -@interface FBSDKMath : NSObject - -+ (CGPoint)ceilForPoint:(CGPoint)value; -+ (CGSize)ceilForSize:(CGSize)value; -+ (CGPoint)floorForPoint:(CGPoint)value; -+ (CGSize)floorForSize:(CGSize)value; -+ (NSUInteger)hashWithCGFloat:(CGFloat)value; -+ (NSUInteger)hashWithCString:(const char *)value; -+ (NSUInteger)hashWithDouble:(double)value; -+ (NSUInteger)hashWithFloat:(float)value; -+ (NSUInteger)hashWithInteger:(NSUInteger)value; -+ (NSUInteger)hashWithInteger:(NSUInteger)value1 andInteger:(NSUInteger)value2; -+ (NSUInteger)hashWithIntegerArray:(NSUInteger *)values count:(NSUInteger)count; -+ (NSUInteger)hashWithLong:(unsigned long long)value; -+ (NSUInteger)hashWithPointer:(const void *)value; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.m deleted file mode 100644 index 6ac3fe5a1..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.m +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright 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. - -// -// Based on Thomas Wang 32/64 bit mix hash -// http://www.concentric.net/~Ttwang/tech/inthash.htm -// - -#import "FBSDKMath.h" - -#import - -#import "FBSDKMacros.h" - -@implementation FBSDKMath - -#pragma mark - Class Methods - -+ (CGPoint)ceilForPoint:(CGPoint)value -{ - return CGPointMake(ceilf(value.x), ceilf(value.x)); -} - -+ (CGSize)ceilForSize:(CGSize)value -{ - return CGSizeMake(ceilf(value.width), ceilf(value.height)); -} - -+ (CGPoint)floorForPoint:(CGPoint)value -{ - return CGPointMake(floorf(value.x), floorf(value.y)); -} - -+ (CGSize)floorForSize:(CGSize)value -{ - return CGSizeMake(floorf(value.width), floorf(value.height)); -} - -+ (NSUInteger)hashWithCGFloat:(CGFloat)value -{ -#if CGFLOAT_IS_DOUBLE - return [self hashWithDouble:value]; -#else - return [self hashWithFloat:value]; -#endif -} - -+ (NSUInteger)hashWithCString:(const char *)value -{ - // FNV-1a hash. - NSUInteger hash = sizeof(NSUInteger) == 4 ? 2166136261U : 14695981039346656037U; - while (*value) { - hash ^= *value++; - hash *= sizeof(NSUInteger) == 4 ? 16777619 : 1099511628211; - } - return hash; -} - -+ (NSUInteger)hashWithDouble:(double)value -{ - assert(sizeof(double) == sizeof(uint64_t)); // Size of double must be 8 bytes - union { - double key; - uint64_t bits; - } u; - u.key = value; - return [self hashWithLong:u.bits]; -} - -+ (NSUInteger)hashWithFloat:(float)value -{ - assert(sizeof(float) == sizeof(uint32_t)); // Size of float must be 4 bytes - union { - float key; - uint32_t bits; - } u; - u.key = value; - return [self hashWithInteger:u.bits]; -} - -+ (NSUInteger)hashWithInteger:(NSUInteger)value -{ - return [self hashWithPointer:(void *)value]; -} - -+ (NSUInteger)hashWithInteger:(NSUInteger)value1 andInteger:(NSUInteger)value2 -{ - return [self hashWithLong:(((unsigned long long)value1) << 32 | value2)]; -} - -+ (NSUInteger)hashWithIntegerArray:(NSUInteger *)values count:(NSUInteger)count -{ - if (count == 0) { - return 0; - } - NSUInteger hash = values[0]; - for (NSUInteger i = 1; i < count; ++i) { - hash = [self hashWithInteger:hash andInteger:values[i]]; - } - return hash; -} - -+ (NSUInteger)hashWithLong:(unsigned long long)value -{ - value = (~value) + (value << 18); // key = (key << 18) - key - 1; - value ^= (value >> 31); - value *= 21; // key = (key + (key << 2)) + (key << 4); - value ^= (value >> 11); - value += (value << 6); - value ^= (value >> 22); - return (NSUInteger)value; -} - -+ (NSUInteger)hashWithPointer:(const void *)value -{ - NSUInteger hash = (NSUInteger)value; -#if !TARGET_RT_64_BIT - hash = ~hash + (hash << 15); // key = (key << 15) - key - 1; - hash ^= (hash >> 12); - hash += (hash << 2); - hash ^= (hash >> 4); - hash *= 2057; // key = (key + (key << 3)) + (key << 11); - hash ^= (hash >> 16); -#else - hash += ~hash + (hash << 21); // key = (key << 21) - key - 1; - hash ^= (hash >> 24); - hash = (hash + (hash << 3)) + (hash << 8); - hash ^= (hash >> 14); - hash = (hash + (hash << 2)) + (hash << 4); // key * 21 - hash ^= (hash >> 28); - hash += (hash << 31); -#endif - return hash; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h deleted file mode 100644 index d504d9733..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright 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. - -#include - -typedef double FBSDKMonotonicTimeSeconds; -typedef uint64_t FBSDKMonotonicTimeMilliseconds; -typedef uint64_t FBSDKMonotonicTimeNanoseconds; -typedef uint64_t FBSDKMachAbsoluteTimeUnits; - -/** - * return current monotonic time in Milliseconds - * Millisecond precision, uint64_t value. - * Avoids float/double math operations, thus more efficient than FBSDKMonotonicTimeGetCurrentSeconds. - * Should be preferred over FBSDKMonotonicTimeGetCurrentSeconds in case millisecond - * precision is required. - * IMPORTANT: this timer doesn't run while the device is sleeping. - */ -FBSDKMonotonicTimeMilliseconds FBSDKMonotonicTimeGetCurrentMilliseconds(void); - -/** - * return current monotonic time in Seconds - * Nanosecond precision, double value. - * Should be preferred over FBSDKMonotonicTimeGetCurrentMilliseconds in case - * nanosecond precision is required. - * IMPORTANT: this timer doesn't run while the device is sleeping. - */ -FBSDKMonotonicTimeSeconds FBSDKMonotonicTimeGetCurrentSeconds(void); - -/** - * return current monotonic time in NanoSeconds - * Nanosecond precision, uint64_t value. - * Useful when nanosecond precision is required but you want to avoid float/double math operations. - * IMPORTANT: this timer doesn't run while the device is sleeping. - */ -FBSDKMonotonicTimeNanoseconds FBSDKMonotonicTimeGetCurrentNanoseconds(void); - -/** - * return number of MachTimeUnits for given number of seconds - * this is useful when you want to use the really fast mach_absolute_time() function - * to calculate deltas between two points and then check it against a (precomputed) threshold. - * Nanosecond precision, uint64_t value. - */ -FBSDKMachAbsoluteTimeUnits FBSDKMonotonicTimeConvertSecondsToMachUnits(FBSDKMonotonicTimeSeconds seconds); - -/** - * return the number of seconds for a given amount of MachTimeUnits - * this is useful when you want to use the really fast mach_absolute_time() function, take - * deltas between time points, and when you're out of the timing critical section, use - * this function to compute how many seconds the delta works out to be. - */ -FBSDKMonotonicTimeSeconds FBSDKMonotonicTimeConvertMachUnitsToSeconds(FBSDKMachAbsoluteTimeUnits machUnits); diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.m deleted file mode 100644 index 1a52c81ef..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.m +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright 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. - -#include -#include -#include -#include - -#import "FBSDKMonotonicTime.h" - -/** - * PLEASE NOTE: FBSDKSDKMonotonicTimeTests work fine, but are disabled - * because they take several seconds. Please re-enable them to test - * any changes you're making here! - */ -static uint64_t _get_time_nanoseconds(void) -{ - static struct mach_timebase_info tb_info = {0}; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - int ret = mach_timebase_info(&tb_info); - assert(0 == ret); - }); - - return (mach_absolute_time() * tb_info.numer) / tb_info.denom; -} - -FBSDKMonotonicTimeSeconds FBSDKMonotonicTimeGetCurrentSeconds(void) -{ - const uint64_t nowNanoSeconds = _get_time_nanoseconds(); - return (FBSDKMonotonicTimeSeconds)nowNanoSeconds / (FBSDKMonotonicTimeSeconds)1000000000.0; -} - -FBSDKMonotonicTimeMilliseconds FBSDKMonotonicTimeGetCurrentMilliseconds(void) -{ - const uint64_t nowNanoSeconds = _get_time_nanoseconds(); - return nowNanoSeconds / 1000000; -} - -FBSDKMonotonicTimeNanoseconds FBSDKMonotonicTimeGetCurrentNanoseconds(void) -{ - return _get_time_nanoseconds(); -} - -FBSDKMachAbsoluteTimeUnits FBSDKMonotonicTimeConvertSecondsToMachUnits(FBSDKMonotonicTimeSeconds seconds) -{ - static double ratio = 0; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - struct mach_timebase_info tb_info = {0}; - int ret = mach_timebase_info(&tb_info); - assert(0 == ret); - ratio = ((double) tb_info.denom / (double)tb_info.numer) * 1000000000.0; - }); - - return seconds * ratio; -} - -FBSDKMonotonicTimeSeconds FBSDKMonotonicTimeConvertMachUnitsToSeconds(FBSDKMachAbsoluteTimeUnits machUnits) -{ - static double ratio = 0; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - struct mach_timebase_info tb_info = {0}; - int ret = mach_timebase_info(&tb_info); - assert(0 == ret); - ratio = ((double) tb_info.numer / (double)tb_info.denom) / 1000000000.0; - }); - - return ratio * (double)machUnits; -} diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h deleted file mode 100644 index d2298d53f..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKProfile.h" - -@interface FBSDKProfile(Internal) - -+ (void)cacheProfile:(FBSDKProfile *) profile; -+ (FBSDKProfile *)fetchCachedProfile; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h deleted file mode 100644 index 0751f7a5d..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@protocol FBSDKAccessTokenCaching; - -@interface FBSDKSettings(Internal) - -+ (NSObject *)accessTokenCache; - -+ (void)setAccessTokenCache:(NSObject *)accessTokenCache; - -+ (NSString *)graphAPIDebugParamValue; - -+ (BOOL)isGraphErrorRecoveryDisabled; - -// used by Unity. -+ (NSString *)userAgentSuffix; -+ (void)setUserAgentSuffix:(NSString *)suffix; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h deleted file mode 100644 index f8c7fdd70..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -typedef void (^FBSDKGraphRequestAccessToAccountsHandler)(NSString *oauthToken, NSError *accountStoreError); - -/* - @class - - Adapter around system account store APIs. Note this is only intended for internal - consumption. If publicized, consider moving declarations to an internal only header and - reconsider dispatching semantics. - */ -@interface FBSDKSystemAccountStoreAdapter : NSObject - -/* - Requests access to the device's Facebook account for the given parameters. - - Parameter permissions: the permissions - - Parameter defaultAudience: the default audience - - Parameter isReauthorize: a flag describing if this is a reauth request - - Parameter appID: the app id - - Parameter handler: the handler that will be invoked on completion (dispatched to the main thread). the oauthToken is nil on failure. - */ -- (void)requestAccessToFacebookAccountStore:(NSSet *)permissions - defaultAudience:(NSString *)defaultAudience - isReauthorize:(BOOL)isReauthorize - appID:(NSString *)appID - handler:(FBSDKGraphRequestAccessToAccountsHandler)handler; - -/* - Sends a message to the device account store to renew the Facebook account credentials - - - Parameter handler: the handler that is invoked on completion - */ -- (void)renewSystemAuthorization:(void(^)(ACAccountCredentialRenewResult result, NSError *error))handler; - -/* - s gets the oauth token stored in the account store credential, if available. If not empty, - this implies user has granted access. - */ -- (NSString *)accessTokenString; - -/* - Gets the singleton instance. - */ -+ (FBSDKSystemAccountStoreAdapter *)sharedInstance; - -/* - Sets the singleton instance, typically only for unit tests - */ -+ (void)setSharedInstance:(FBSDKSystemAccountStoreAdapter *)instance; - -/* - Gets or sets the flag indicating if the next requestAccess call should block - on a renew call. - */ -@property (nonatomic, assign) BOOL forceBlockingRenew; - -/* - A convenience getter to the Facebook account type in the account store, if available. - */ -@property (strong, nonatomic, readonly) ACAccountType *accountType; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.m deleted file mode 100644 index 6bc112366..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.m +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKSystemAccountStoreAdapter.h" - -#import "FBSDKAccessToken.h" -#import "FBSDKConstants.h" -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKError.h" -#import "FBSDKLogger.h" -#import "FBSDKSettings+Internal.h" - -@interface FBSDKSystemAccountStoreAdapter () - -@property (retain, nonatomic, readonly) ACAccountStore *accountStore; - -@end - -static NSString *const FBForceBlockingRenewKey = @"com.facebook.sdk:ForceBlockingRenewKey"; -static FBSDKSystemAccountStoreAdapter *_singletonInstance = nil; - -@implementation FBSDKSystemAccountStoreAdapter -{ - ACAccountStore *_accountStore; - ACAccountType *_accountType; -} - -+ (void)initialize -{ - if (self == [FBSDKSystemAccountStoreAdapter class]) { - _singletonInstance = [[self alloc] init]; - } -} - -- (instancetype)init -{ - self = [super init]; - if (self) { - _forceBlockingRenew = [[NSUserDefaults standardUserDefaults] boolForKey:FBForceBlockingRenewKey]; - } - return self; -} - -#pragma mark - Properties - -- (ACAccountStore *)accountStore -{ - if (_accountStore == nil) { - _accountStore = [[fbsdkdfl_ACAccountStoreClass() alloc] init]; - } - return _accountStore; -} - -- (ACAccountType *)accountType -{ - if (_accountType == nil) { - _accountType = [self.accountStore accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"]; - } - return _accountType; -} - -- (void)setForceBlockingRenew:(BOOL)forceBlockingRenew -{ - if (_forceBlockingRenew != forceBlockingRenew) { - _forceBlockingRenew = forceBlockingRenew; - NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; - [userDefaults setBool:forceBlockingRenew forKey:FBForceBlockingRenewKey]; - [userDefaults synchronize]; - } -} - -+ (FBSDKSystemAccountStoreAdapter *)sharedInstance -{ - return _singletonInstance; -} - -+ (void)setSharedInstance:(FBSDKSystemAccountStoreAdapter *)instance -{ - _singletonInstance = instance; -} - -- (NSString *)accessTokenString -{ - if (self.accountType && self.accountType.accessGranted) { - NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType]; - if (fbAccounts.count > 0) { - id account = [fbAccounts objectAtIndex:0]; - id credential = [account credential]; - - return [credential oauthToken]; - } - } - return nil; -} - -#pragma mark - Public properties and methods - -- (void)requestAccessToFacebookAccountStore:(NSSet *)permissions - defaultAudience:(NSString *)defaultAudience - isReauthorize:(BOOL)isReauthorize - appID:(NSString *)appID - handler:(FBSDKGraphRequestAccessToAccountsHandler)handler -{ - if (appID == nil) { - @throw [NSException exceptionWithName:NSInvalidArgumentException - reason:@"appID cannot be nil" - userInfo:nil]; - } - - // no publish_* permissions are permitted with a nil audience - if (!defaultAudience && isReauthorize) { - for (NSString *p in permissions) { - if ([p hasPrefix:@"publish"]) { - [[NSException exceptionWithName:NSInvalidArgumentException - reason:@"FBSDKLoginManager: One or more publish permission was requested " - @"without specifying an audience; use FBSDKDefaultAudienceOnlyMe, " - @"FBSDKDefaultAudienceFriends, or FBSDKDefaultAudienceEveryone" - userInfo:nil] - raise]; - } - } - } - - // construct access options - NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: - appID, fbsdkdfl_ACFacebookAppIdKey(), - [permissions allObjects], fbsdkdfl_ACFacebookPermissionsKey(), - defaultAudience, fbsdkdfl_ACFacebookAudienceKey(), // must end on this key/value due to audience possibly being nil - nil]; - - if (self.forceBlockingRenew - && [self.accountStore accountsWithAccountType:self.accountType].count > 0) { - // If the force renew flag is set and an iOS FB account is still set, - // chain the requestAccessBlock to a successful renew result - [self renewSystemAuthorization:^(ACAccountCredentialRenewResult result, NSError *error) { - if (result == ACAccountCredentialRenewResultRenewed) { - self.forceBlockingRenew = NO; - [self requestAccessToFacebookAccountStore:options retrying:NO handler:handler]; - } else if (handler) { - // Otherwise, invoke the caller's handler back on the main thread with an - // error that will trigger the password change user message. - dispatch_async(dispatch_get_main_queue(), ^{ - handler(nil, error); - }); - } - }]; - } else { - // Otherwise go ahead and invoke normal request. - [self requestAccessToFacebookAccountStore:options retrying:NO handler:handler]; - } -} - -- (void)requestAccessToFacebookAccountStore:(NSDictionary *)options - retrying:(BOOL)retrying - handler:(FBSDKGraphRequestAccessToAccountsHandler)handler -{ - if (!self.accountType) { - if (handler) { - handler(nil, [FBSDKError errorWithCode:FBSDKUnknownErrorCode message:@"Invalid request to account store"]); - } - return; - } - // we will attempt an iOS integrated facebook login - [self.accountStore - requestAccessToAccountsWithType:self.accountType - options:options - completion:^(BOOL granted, NSError *error) { - if (!granted && - error.code == ACErrorPermissionDenied && - [error.description rangeOfString:@"remote_app_id does not match stored id"].location != NSNotFound) { - - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors formatString: - @"System authorization failed:'%@'. This may be caused by a mismatch between" - @" the bundle identifier and your app configuration on the server" - @" at developers.facebook.com/apps.", - error.localizedDescription]; - } - - // requestAccessToAccountsWithType:options:completion: completes on an - // arbitrary thread; let's process this back on our main thread - dispatch_async(dispatch_get_main_queue(), ^{ - NSError *accountStoreError = error; - NSString *oauthToken = nil; - id account = nil; - if (granted) { - NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType]; - if (fbAccounts.count > 0) { - account = [fbAccounts objectAtIndex:0]; - - id credential = [account credential]; - - oauthToken = [credential oauthToken]; - } - self.forceBlockingRenew = NO; - } - - if (!accountStoreError && !oauthToken) { - if (!retrying) { - // This can happen as a result of, e.g., restoring from iCloud to a different device. Try once to renew. - [self renewSystemAuthorization:^(ACAccountCredentialRenewResult renewResult, NSError *renewError) { - // Call block again, regardless of result -- either we'll get credentials or we'll fail with the - // exception below. We want to treat failure here the same regardless of whether it was before or after the refresh attempt. - [self requestAccessToFacebookAccountStore:options retrying:YES handler:handler]; - }]; - return; - } - // else call handler with nils. - } - handler(oauthToken, accountStoreError); - }); - }]; -} - -- (void)renewSystemAuthorization:(void(^)(ACAccountCredentialRenewResult, NSError *))handler -{ - // if the slider has been set to off, renew calls to iOS simply hang, so we must - // preemptively check for that condition. - if (self.accountStore && self.accountType && self.accountType.accessGranted) { - NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType]; - id account; - if (fbAccounts && [fbAccounts count] > 0 && - (account = [fbAccounts objectAtIndex:0])) { - - FBSDKAccessToken *currentToken = [FBSDKAccessToken currentAccessToken]; - if (![currentToken.tokenString isEqualToString:[self accessTokenString]]) { - currentToken = nil; - } - [self.accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) { - if (error) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorAccessTokens - logEntry:[NSString stringWithFormat:@"renewCredentialsForAccount result:%ld, error: %@", - (long)renewResult, - error]]; - } - if (renewResult == ACAccountCredentialRenewResultRenewed && - currentToken && - [currentToken isEqual:[FBSDKAccessToken currentAccessToken]]) { - // account store renewals can change the stored oauth token so we need to update the currentAccessToken - // so future comparisons to -[ accessTokenString] work correctly (e.g., error recovery). - FBSDKAccessToken *updatedToken = [[FBSDKAccessToken alloc] initWithTokenString:[self accessTokenString] - permissions:[currentToken.permissions allObjects] declinedPermissions:[currentToken.declinedPermissions allObjects] - appID:currentToken.appID - userID:currentToken.userID - expirationDate:[NSDate distantFuture] - refreshDate:[NSDate date]]; - [FBSDKAccessToken setCurrentAccessToken:updatedToken]; - } - if (handler) { - handler(renewResult, error); - } - }]; - return; - } - } - - if (handler) { - handler(ACAccountCredentialRenewResultFailed, nil); - } -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h deleted file mode 100644 index 8fe3e9efd..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -typedef NS_ENUM(NSInteger, FBSDKTriStateBOOL) -{ - FBSDKTriStateBOOLValueUnknown = -1, - FBSDKTriStateBOOLValueNO = 0, - FBSDKTriStateBOOLValueYES = 1, -}; - -FBSDK_EXTERN FBSDKTriStateBOOL FBSDKTriStateBOOLFromBOOL(BOOL value); -FBSDK_EXTERN FBSDKTriStateBOOL FBSDKTriStateBOOLFromNSNumber(NSNumber *value); -FBSDK_EXTERN BOOL BOOLFromFBSDKTriStateBOOL(FBSDKTriStateBOOL value, BOOL defaultValue); diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.m deleted file mode 100644 index c25d365ad..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.m +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKTriStateBOOL.h" - -FBSDKTriStateBOOL FBSDKTriStateBOOLFromBOOL(BOOL value) -{ - return value ? FBSDKTriStateBOOLValueYES : FBSDKTriStateBOOLValueNO; -} - -FBSDKTriStateBOOL FBSDKTriStateBOOLFromNSNumber(NSNumber *value) -{ - return ([value isKindOfClass:[NSNumber class]] ? - FBSDKTriStateBOOLFromBOOL([value boolValue]) : - FBSDKTriStateBOOLValueUnknown); -} - -BOOL BOOLFromFBSDKTriStateBOOL(FBSDKTriStateBOOL value, BOOL defaultValue) -{ - switch (value) { - case FBSDKTriStateBOOLValueYES: - return YES; - case FBSDKTriStateBOOLValueNO: - return NO; - case FBSDKTriStateBOOLValueUnknown: - return defaultValue; - } -} diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h deleted file mode 100644 index 7f02153c0..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKTypeUtility : NSObject - -+ (NSArray *)arrayValue:(id)object; -+ (BOOL)boolValue:(id)object; -+ (NSDictionary *)dictionaryValue:(id)object; -+ (NSInteger)integerValue:(id)object; -+ (id)objectValue:(id)object; -+ (NSString *)stringValue:(id)object; -+ (NSTimeInterval)timeIntervalValue:(id)object; -+ (NSUInteger)unsignedIntegerValue:(id)object; -+ (NSURL *)URLValue:(id)object; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.m deleted file mode 100644 index aa02502b4..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.m +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKTypeUtility.h" - -#import "FBSDKMacros.h" - -@implementation FBSDKTypeUtility - -#pragma mark - Class Methods - -+ (NSArray *)arrayValue:(id)object -{ - return (NSArray *)[self _objectValue:object ofClass:[NSArray class]]; -} - -+ (BOOL)boolValue:(id)object -{ - if ([object isKindOfClass:[NSNumber class]]) { - // @0 or @NO returns NO, otherwise YES - return [(NSNumber *)object boolValue]; - } else if ([object isKindOfClass:[NSString class]]) { - // Returns YES on encountering one of "Y", "y", "T", "t", or a digit 1-9, otherwise NO - return [(NSString *)object boolValue]; - } else { - return ([self objectValue:object] != nil); - } -} - -+ (NSDictionary *)dictionaryValue:(id)object -{ - return (NSDictionary *)[self _objectValue:object ofClass:[NSDictionary class]]; -} - -+ (NSInteger)integerValue:(id)object -{ - if ([object isKindOfClass:[NSNumber class]]) { - return [(NSNumber *)object integerValue]; - } else if ([object isKindOfClass:[NSString class]]) { - return [(NSString *)object integerValue]; - } else { - return 0; - } -} - -+ (id)objectValue:(id)object -{ - return ([object isKindOfClass:[NSNull class]] ? nil : object); -} - -+ (NSString *)stringValue:(id)object -{ - if ([object isKindOfClass:[NSString class]]) { - return (NSString *)object; - } else if ([object isKindOfClass:[NSNumber class]]) { - return [(NSNumber *)object stringValue]; - } else if ([object isKindOfClass:[NSURL class]]) { - return [(NSURL *)object absoluteString]; - } else { - return nil; - } -} - -+ (NSTimeInterval)timeIntervalValue:(id)object -{ - if ([object isKindOfClass:[NSNumber class]]) { - return [(NSNumber *)object doubleValue]; - } else if ([object isKindOfClass:[NSString class]]) { - return [(NSString *)object doubleValue]; - } else { - return 0; - } -} - -+ (NSUInteger)unsignedIntegerValue:(id)object -{ - if ([object isKindOfClass:[NSNumber class]]) { - return [(NSNumber *)object unsignedIntegerValue]; - } else { - // there is no direct support for strings containing unsigned values > NSIntegerMax - not worth writing ourselves - // right now, so just cap unsigned values at NSIntegerMax until we have a need for larger - NSInteger integerValue = [self integerValue:object]; - if (integerValue < 0) { - integerValue = 0; - } - return (NSUInteger)integerValue; - } -} - -+ (NSURL *)URLValue:(id)object -{ - if ([object isKindOfClass:[NSURL class]]) { - return (NSURL *)object; - } else if ([object isKindOfClass:[NSString class]]) { - return [[NSURL alloc] initWithString:(NSString *)object]; - } else { - return nil; - } -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -#pragma mark - Helper Methods - -+ (id)_objectValue:(id)object ofClass:(Class)expectedClass -{ - return ([object isKindOfClass:expectedClass] ? object : nil); -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h deleted file mode 100644 index 86fedc65e..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -typedef NS_OPTIONS(NSUInteger, FBSDKGraphRequestFlags) -{ - FBSDKGraphRequestFlagNone = 0, - // indicates this request should not use a client token as its token parameter - FBSDKGraphRequestFlagSkipClientToken = 1 << 1, - // indicates this request should not close the session if its response is an oauth error - FBSDKGraphRequestFlagDoNotInvalidateTokenOnError = 1 << 2, - // indicates this request should not perform error recovery - FBSDKGraphRequestFlagDisableErrorRecovery = 1 << 3, -}; -@interface FBSDKGraphRequest (Internal) - -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters - flags:(FBSDKGraphRequestFlags)flags; -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters - tokenString:(NSString *)tokenString - HTTPMethod:(NSString *)HTTPMethod - flags:(FBSDKGraphRequestFlags)flags; -// Generally, requests automatically issued by the SDK -// should not invalidate the token and should disableErrorRecovery -// so that we don't cause a sudden change in token state or trigger recovery -// out of context of any user action. -@property (nonatomic, assign) FBSDKGraphRequestFlags flags; - -- (BOOL)isGraphErrorRecoveryDisabled; -- (BOOL)hasAttachments; -+ (BOOL)isAttachment:(id)item; -+ (NSString *)serializeURL:(NSString *)baseUrl - params:(NSDictionary *)params - httpMethod:(NSString *)httpMethod; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h deleted file mode 100644 index b61c782d6..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -@class FBSDKGraphRequestDataAttachment; -@class FBSDKLogger; - -@interface FBSDKGraphRequestBody : NSObject - -@property (nonatomic, retain, readonly) NSData *data; - -- (void)appendWithKey:(NSString *)key - formValue:(NSString *)value - logger:(FBSDKLogger *)logger; - -- (void)appendWithKey:(NSString *)key - imageValue:(UIImage *)image - logger:(FBSDKLogger *)logger; - -- (void)appendWithKey:(NSString *)key - dataValue:(NSData *)data - logger:(FBSDKLogger *)logger; - -- (void)appendWithKey:(NSString *)key - dataAttachmentValue:(FBSDKGraphRequestDataAttachment *)dataAttachment - logger:(FBSDKLogger *)logger; - -+ (NSString *)mimeContentType; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.m deleted file mode 100644 index 54625765e..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.m +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKGraphRequestBody.h" - -#import "FBSDKGraphRequestDataAttachment.h" -#import "FBSDKLogger.h" -#import "FBSDKSettings.h" - -#define kStringBoundary @"3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f" -#define kNewline @"\r\n" - -@implementation FBSDKGraphRequestBody -{ - NSMutableData *_data; -} - -- (instancetype)init -{ - if ((self = [super init])) { - _data = [[NSMutableData alloc] init]; - } - - return self; -} - -+ (NSString *)mimeContentType -{ - return [NSString stringWithFormat:@"multipart/form-data; boundary=%@", kStringBoundary]; -} - -- (void)appendUTF8:(NSString *)utf8 -{ - if (![_data length]) { - NSString *headerUTF8 = [NSString stringWithFormat:@"--%@%@", kStringBoundary, kNewline]; - NSData *headerData = [headerUTF8 dataUsingEncoding:NSUTF8StringEncoding]; - [_data appendData:headerData]; - } - NSData *data = [utf8 dataUsingEncoding:NSUTF8StringEncoding]; - [_data appendData:data]; -} - -- (void)appendWithKey:(NSString *)key - formValue:(NSString *)value - logger:(FBSDKLogger *)logger -{ - [self _appendWithKey:key filename:nil contentType:nil contentBlock:^{ - [self appendUTF8:value]; - }]; - [logger appendFormat:@"\n %@:\t%@", key, (NSString *)value]; -} - -- (void)appendWithKey:(NSString *)key - imageValue:(UIImage *)image - logger:(FBSDKLogger *)logger -{ - NSData *data = UIImageJPEGRepresentation(image, [FBSDKSettings JPEGCompressionQuality]); - [self _appendWithKey:key filename:key contentType:@"image/jpeg" contentBlock:^{ - [_data appendData:data]; - }]; - [logger appendFormat:@"\n %@:\t", key, (unsigned long)([data length] / 1024)]; -} - -- (void)appendWithKey:(NSString *)key - dataValue:(NSData *)data - logger:(FBSDKLogger *)logger -{ - [self _appendWithKey:key filename:key contentType:@"content/unknown" contentBlock:^{ - [_data appendData:data]; - }]; - [logger appendFormat:@"\n %@:\t", key, (unsigned long)([data length] / 1024)]; -} - -- (void)appendWithKey:(NSString *)key - dataAttachmentValue:(FBSDKGraphRequestDataAttachment *)dataAttachment - logger:(FBSDKLogger *)logger -{ - NSString *filename = dataAttachment.filename ?: key; - NSString *contentType = dataAttachment.contentType ?: @"content/unknown"; - NSData *data = dataAttachment.data; - [self _appendWithKey:key filename:filename contentType:contentType contentBlock:^{ - [_data appendData:data]; - }]; - [logger appendFormat:@"\n %@:\t", key, (unsigned long)([data length] / 1024)]; -} - -- (NSData *)data -{ - return [_data copy]; -} - -- (void)_appendWithKey:(NSString *)key - filename:(NSString *)filename - contentType:(NSString *)contentType - contentBlock:(void(^)(void))contentBlock -{ - NSMutableArray *disposition = [[NSMutableArray alloc] init]; - [disposition addObject:@"Content-Disposition: form-data"]; - if (key) { - [disposition addObject:[[NSString alloc] initWithFormat:@"name=\"%@\"", key]]; - } - if (filename) { - [disposition addObject:[[NSString alloc] initWithFormat:@"filename=\"%@\"", filename]]; - } - [self appendUTF8:[[NSString alloc] initWithFormat:@"%@%@", [disposition componentsJoinedByString:@"; "], kNewline]]; - if (contentType) { - [self appendUTF8:[[NSString alloc] initWithFormat:@"Content-Type: %@%@", contentType, kNewline]]; - } - [self appendUTF8:kNewline]; - if (contentBlock != NULL) { - contentBlock(); - } - [self appendUTF8:[[NSString alloc] initWithFormat:@"%@--%@%@", kNewline, kStringBoundary, kNewline]]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h deleted file mode 100644 index c63688cd4..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKGraphRequestConnection(Internal) - -@property (nonatomic, readonly) NSMutableArray *requests; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h deleted file mode 100644 index cd218c43a..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -// Internal only class to facilitate FBSDKGraphRequest processing, specifically -// associating FBSDKGraphRequest and FBSDKGraphRequestHandler instances and necessary -// data for retry processing. -@interface FBSDKGraphRequestMetadata : NSObject - -@property (nonatomic, retain) FBSDKGraphRequest *request; -@property (nonatomic, copy) FBSDKGraphRequestHandler completionHandler; -@property (nonatomic, copy) NSDictionary *batchParameters; - -- (instancetype)initWithRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler - batchParameters:(NSDictionary *)batchParameters -NS_DESIGNATED_INITIALIZER; - -- (void)invokeCompletionHandlerForConnection:(FBSDKGraphRequestConnection *)connection - withResults:(id)results - error:(NSError *)error; -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.m deleted file mode 100644 index 3b0ee7855..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.m +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKGraphRequestMetadata.h" - -#import "FBSDKGraphRequest.h" -#import "FBSDKMacros.h" - -@implementation FBSDKGraphRequestMetadata - -- (instancetype)initWithRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler - batchParameters:(NSDictionary *)batchParameters { - - if ((self = [super init])) { - _request = request; - _batchParameters = [batchParameters copy]; - _completionHandler = [handler copy]; - } - return self; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithRequest:completionHandler:batchParameters:); - return [self initWithRequest:nil completionHandler:NULL batchParameters:nil]; -} - -- (void)invokeCompletionHandlerForConnection:(FBSDKGraphRequestConnection *)connection - withResults:(id)results - error:(NSError *)error { - if (self.completionHandler) { - self.completionHandler(connection, results, error); - } -} - -- (NSString *)description -{ - return [NSString stringWithFormat:@"<%@: %p, batchParameters: %@, completionHandler: %@, request: %@>", - NSStringFromClass([self class]), - self, - self.batchParameters, - self.completionHandler, - self.request.description]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h deleted file mode 100644 index 567f8ecdb..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKCoreKit+Internal.h" - -@interface FBSDKGraphRequestPiggybackManager : NSObject - -+ (void)addPiggybackRequests:(FBSDKGraphRequestConnection *)connection; - -+ (void)addRefreshPiggyback:(FBSDKGraphRequestConnection *)connection permissionHandler:(FBSDKGraphRequestHandler)permissionHandler; - -+ (void)addRefreshPiggybackIfStale:(FBSDKGraphRequestConnection *)connection; - -+ (void)addServerConfigurationPiggyback:(FBSDKGraphRequestConnection *)connection; -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.m deleted file mode 100644 index 50960739a..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.m +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKGraphRequestPiggybackManager.h" - -#import "FBSDKCoreKit+Internal.h" - -static int const FBSDKTokenRefreshThresholdSeconds = 24 * 60 * 60; // day -static int const FBSDKTokenRefreshRetrySeconds = 60 * 60; // hour - -@implementation FBSDKGraphRequestPiggybackManager - -+ (void)addPiggybackRequests:(FBSDKGraphRequestConnection *)connection -{ - if ([FBSDKSettings appID].length > 0) { - BOOL safeForPiggyback = YES; - for (FBSDKGraphRequestMetadata *metadata in connection.requests) { - if (![metadata.request.version isEqualToString:[FBSDKSettings graphAPIVersion]] || - [metadata.request hasAttachments]) { - safeForPiggyback = NO; - break; - } - } - if (safeForPiggyback) { - [[self class] addRefreshPiggybackIfStale:connection]; - [[self class] addServerConfigurationPiggyback:connection]; - } - } -} - -+ (void)addRefreshPiggyback:(FBSDKGraphRequestConnection *)connection permissionHandler:(FBSDKGraphRequestHandler)permissionHandler -{ - FBSDKAccessToken *expectedToken = [FBSDKAccessToken currentAccessToken]; - __block NSMutableSet *permissions = nil; - __block NSMutableSet *declinedPermissions = nil; - __block NSString *tokenString = nil; - __block NSNumber *expirationDateNumber = nil; - __block int expectingCallbacksCount = 2; - void (^expectingCallbackComplete)(void) = ^{ - if (--expectingCallbacksCount == 0) { - FBSDKAccessToken *currentToken = [FBSDKAccessToken currentAccessToken]; - NSDate *expirationDate = currentToken.expirationDate; - if (expirationDateNumber) { - expirationDate = ([expirationDateNumber doubleValue] > 0 ? - [NSDate dateWithTimeIntervalSince1970:[expirationDateNumber doubleValue]] : - [NSDate distantFuture]); - } - FBSDKAccessToken *refreshedToken = [[FBSDKAccessToken alloc] initWithTokenString:tokenString ?: currentToken.tokenString - permissions:[(permissions ?: currentToken.permissions) allObjects] - declinedPermissions:[(declinedPermissions ?: currentToken.declinedPermissions) allObjects] - appID:currentToken.appID - userID:currentToken.userID - expirationDate:expirationDate - refreshDate:[NSDate date]]; - if (expectedToken == currentToken) { - [FBSDKAccessToken setCurrentAccessToken:refreshedToken]; - } - } - }; - FBSDKGraphRequest *extendRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"oauth/access_token" - parameters:@{@"grant_type" : @"fb_extend_sso_token", - @"fields": @"" - } - flags:FBSDKGraphRequestFlagDisableErrorRecovery]; - - [connection addRequest:extendRequest completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { - tokenString = result[@"access_token"]; - expirationDateNumber = result[@"expires_at"]; - expectingCallbackComplete(); - }]; - FBSDKGraphRequest *permissionsRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions" - parameters:@{@"fields": @""} - flags:FBSDKGraphRequestFlagDisableErrorRecovery]; - - [connection addRequest:permissionsRequest completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { - if (!error) { - permissions = [NSMutableSet set]; - declinedPermissions = [NSMutableSet set]; - - [FBSDKInternalUtility extractPermissionsFromResponse:result - grantedPermissions:permissions - declinedPermissions:declinedPermissions]; - } - expectingCallbackComplete(); - if (permissionHandler) { - permissionHandler(innerConnection, result, error); - } - }]; -} - -+ (void)addRefreshPiggybackIfStale:(FBSDKGraphRequestConnection *)connection -{ - // don't piggy back more than once an hour as a cheap way of - // retrying in cases of errors and preventing duplicate refreshes. - // obviously this is not foolproof but is simple and sufficient. - static NSDate *lastRefreshTry; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - lastRefreshTry = [NSDate distantPast]; - }); - - NSDate *now = [NSDate date]; - NSDate *tokenRefreshDate = [FBSDKAccessToken currentAccessToken].refreshDate; - if (tokenRefreshDate && - [now timeIntervalSinceDate:lastRefreshTry] > FBSDKTokenRefreshRetrySeconds && - [now timeIntervalSinceDate:tokenRefreshDate] > FBSDKTokenRefreshThresholdSeconds) { - [self addRefreshPiggyback:connection permissionHandler:NULL]; - lastRefreshTry = [NSDate date]; - } -} - -+ (void)addServerConfigurationPiggyback:(FBSDKGraphRequestConnection *)connection -{ - if (![[FBSDKServerConfigurationManager cachedServerConfiguration] isDefaults]) { - return; - } - NSString *appID = [FBSDKSettings appID]; - FBSDKGraphRequest *serverConfigurationRequest = [FBSDKServerConfigurationManager requestToLoadServerConfiguration:appID]; - [connection addRequest:serverConfigurationRequest - completionHandler:^(FBSDKGraphRequestConnection *conn, id result, NSError *error) { - [FBSDKServerConfigurationManager processLoadRequestResponse:result error:error appID:appID]; - }]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h deleted file mode 100644 index 9cc5bc351..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKURLConnection; - -typedef void (^FBSDKURLConnectionHandler)(FBSDKURLConnection *connection, - NSError *error, - NSURLResponse *response, - NSData *responseData); - -@protocol FBSDKURLConnectionDelegate - -@optional - -- (void)facebookURLConnection:(FBSDKURLConnection *)connection - didSendBodyData:(NSInteger)bytesWritten - totalBytesWritten:(NSInteger)totalBytesWritten - totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite; - -@end - -@interface FBSDKURLConnection : NSObject - -- (FBSDKURLConnection *)initWithRequest:(NSURLRequest *)request - completionHandler:(FBSDKURLConnectionHandler)handler -NS_DESIGNATED_INITIALIZER; - -@property (nonatomic, weak) id delegate; - -- (void)cancel; -- (void)start; -- (void)setDelegateQueue:(NSOperationQueue *)queue; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.m deleted file mode 100644 index 4b0942728..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.m +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKURLConnection.h" - -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKMacros.h" -#import "FBSDKSettings.h" - -@interface FBSDKURLConnection () - -@property (nonatomic, retain) NSURLConnection *connection; -@property (nonatomic, retain) NSMutableData *data; -@property (nonatomic, copy) FBSDKURLConnectionHandler handler; -@property (nonatomic, retain) NSURLResponse *response; -@property (nonatomic, assign) uint64_t requestStartTime; -@property (nonatomic, readonly) NSUInteger loggerSerialNumber; - -@end - -@implementation FBSDKURLConnection - -#pragma mark - Lifecycle - -- (FBSDKURLConnection *)initWithRequest:(NSURLRequest *)request - completionHandler:(FBSDKURLConnectionHandler)handler { - if ((self = [super init])) { - _requestStartTime = [FBSDKInternalUtility currentTimeInMilliseconds]; - _loggerSerialNumber = [FBSDKLogger generateSerialNumber]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - _connection = [[NSURLConnection alloc] - initWithRequest:request - delegate:self - startImmediately:NO]; -#pragma clang diagnostic pop - _data = [[NSMutableData alloc] init]; - - _handler = [handler copy]; - } - return self; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithRequest:completionHandler:); - return [self initWithRequest:nil completionHandler:NULL]; -} - -- (void)logAndInvokeHandler:(FBSDKURLConnectionHandler)handler - error:(NSError *)error { - if (error) { - NSString *logEntry = [NSString - stringWithFormat:@"FBSDKURLConnection <#%lu>:\n Error: '%@'\n%@\n", - (unsigned long)self.loggerSerialNumber, - [error localizedDescription], - [error userInfo]]; - - [self logMessage:logEntry]; - } - - [self invokeHandler:handler error:error response:nil responseData:nil]; -} - -- (void)logAndInvokeHandler:(FBSDKURLConnectionHandler)handler - response:(NSURLResponse *)response - responseData:(NSData *)responseData { - // Basic FBSDKURLConnection logging just prints out the URL. FBSDKGraphRequest logging provides more details. - NSString *mimeType = [response MIMEType]; - NSMutableString *mutableLogEntry = [NSMutableString stringWithFormat:@"FBSDKURLConnection <#%lu>:\n Duration: %llu msec\nResponse Size: %lu kB\n MIME type: %@\n", - (unsigned long)self.loggerSerialNumber, - [FBSDKInternalUtility currentTimeInMilliseconds] - self.requestStartTime, - (unsigned long)[responseData length] / 1024, - mimeType]; - - if ([mimeType isEqualToString:@"text/javascript"]) { - NSString *responseUTF8 = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; - [mutableLogEntry appendFormat:@" Response:\n%@\n\n", responseUTF8]; - } - - [self logMessage:mutableLogEntry]; - - [self invokeHandler:handler error:nil response:response responseData:responseData]; -} - -- (void)invokeHandler:(FBSDKURLConnectionHandler)handler - error:(NSError *)error - response:(NSURLResponse *)response - responseData:(NSData *)responseData { - if (handler != nil) { - handler(self, error, response, responseData); - } -} - -- (void)logMessage:(NSString *)message -{ - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorNetworkRequests formatString:@"%@", message]; -} - -- (void)cancel -{ - [self.connection cancel]; - self.handler = nil; -} - -- (void)connection:(NSURLConnection *)connection -didReceiveResponse:(NSURLResponse *)response -{ - self.response = response; - [self.data setLength:0]; -} - -- (void)connection:(NSURLResponse *)connection - didReceiveData:(NSData *)data { - [self.data appendData:data]; -} - -- (void)connection:(NSURLConnection *)connection - didFailWithError:(NSError *)error { - @try { - if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == kCFURLErrorSecureConnectionFailed) { - NSOperatingSystemVersion iOS9Version = { .majorVersion = 9, .minorVersion = 0, .patchVersion = 0 }; - if ([FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS9Version]) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - logEntry:@"WARNING: FBSDK secure network request failed. Please verify you have configured your " - "app for Application Transport Security compatibility described at https://developers.facebook.com/docs/ios/ios9"]; - } - } - [self logAndInvokeHandler:self.handler error:error]; - } @finally { - self.handler = nil; - } -} - -- (void)connectionDidFinishLoading:(NSURLConnection *)connection -{ - @try { - [self logAndInvokeHandler:self.handler response:self.response responseData:self.data]; - } @finally { - self.handler = nil; - } -} - -- (NSURLRequest *)connection:(NSURLConnection *)connection - willSendRequest:(NSURLRequest *)request - redirectResponse:(NSURLResponse *)redirectResponse { - return request; -} - -- (void) connection:(NSURLConnection *)connection - didSendBodyData:(NSInteger)bytesWritten - totalBytesWritten:(NSInteger)totalBytesWritten -totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite -{ - id delegate = self.delegate; - - if ([delegate respondsToSelector:@selector(facebookURLConnection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:)]) { - [delegate facebookURLConnection:self - didSendBodyData:bytesWritten - totalBytesWritten:totalBytesWritten - totalBytesExpectedToWrite:totalBytesExpectedToWrite]; - } -} - -- (void)start -{ - [_connection start]; -} - -- (void)setDelegateQueue:(NSOperationQueue*)queue -{ - [_connection setDelegateQueue:queue]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLSessionTask.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLSessionTask.h deleted file mode 100644 index 73894395f..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLSessionTask.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -typedef void (^FBSDKURLSessionTaskHandler)(NSError *error, - NSURLResponse *response, - NSData *responseData); - -@interface FBSDKURLSessionTask : NSObject - -- (FBSDKURLSessionTask *)initWithRequest:(NSURLRequest *)request - fromSession:(NSURLSession *)session - completionHandler:(FBSDKURLSessionTaskHandler)handler -NS_DESIGNATED_INITIALIZER; - -- (void)cancel; -- (void)start; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLSessionTask.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLSessionTask.m deleted file mode 100644 index 3858c0e63..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLSessionTask.m +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKURLSessionTask.h" - -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKMacros.h" -#import "FBSDKSettings.h" - -@interface FBSDKURLSessionTask () - -@property (nonatomic, strong) NSURLSessionTask *task; -@property (nonatomic, copy) FBSDKURLSessionTaskHandler handler; -@property (nonatomic, assign) uint64_t requestStartTime; -@property (nonatomic, assign, readonly) NSUInteger loggerSerialNumber; - -@end - -@implementation FBSDKURLSessionTask - -- (FBSDKURLSessionTask *)initWithRequest:(NSURLRequest *)request - fromSession:(NSURLSession *)session - completionHandler:(FBSDKURLSessionTaskHandler)handler -{ - if ((self = [super init])) { - _requestStartTime = [FBSDKInternalUtility currentTimeInMilliseconds]; - _loggerSerialNumber = [FBSDKLogger generateSerialNumber]; - _handler = [handler copy]; - __weak FBSDKURLSessionTask *weakSelf = self; - _task = [session dataTaskWithRequest:request - completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { - if (error) { - [weakSelf taskDidCompleteWithError:error]; - } else { - [weakSelf taskDidCompleteWithResponse:response data:data]; - } - }]; - } - return self; -} - -- (FBSDKURLSessionTask *)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithRequest:fromSession:completionHandler:); - return [self initWithRequest:nil - fromSession:nil - completionHandler:NULL]; -} - -#pragma mark - Logging and Completion - -- (void)logAndInvokeHandler:(FBSDKURLSessionTaskHandler)handler - error:(NSError *)error { - if (error) { - NSString *logEntry = [NSString - stringWithFormat:@"FBSDKURLSessionTask <#%lu>:\n Error: '%@'\n%@\n", - (unsigned long)self.loggerSerialNumber, - [error localizedDescription], - [error userInfo]]; - - [self logMessage:logEntry]; - } - - [self invokeHandler:handler error:error response:nil responseData:nil]; -} - -- (void)logAndInvokeHandler:(FBSDKURLSessionTaskHandler)handler - response:(NSURLResponse *)response - responseData:(NSData *)responseData { - // Basic FBSDKURLSessionTask logging just prints out the URL. FBSDKGraphRequest logging provides more details. - NSString *mimeType = [response MIMEType]; - NSMutableString *mutableLogEntry = [NSMutableString stringWithFormat:@"FBSDKURLSessionTask <#%lu>:\n Duration: %llu msec\nResponse Size: %lu kB\n MIME type: %@\n", - (unsigned long)self.loggerSerialNumber, - [FBSDKInternalUtility currentTimeInMilliseconds] - self.requestStartTime, - (unsigned long)[responseData length] / 1024, - mimeType]; - - if ([mimeType isEqualToString:@"text/javascript"]) { - NSString *responseUTF8 = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; - [mutableLogEntry appendFormat:@" Response:\n%@\n\n", responseUTF8]; - } - - [self logMessage:mutableLogEntry]; - - [self invokeHandler:handler error:nil response:response responseData:responseData]; -} - -- (void)invokeHandler:(FBSDKURLSessionTaskHandler)handler - error:(NSError *)error - response:(NSURLResponse *)response - responseData:(NSData *)responseData { - if (handler != nil) { - dispatch_async(dispatch_get_main_queue(), ^{ - handler(error, response, responseData); - }); - } -} - -- (void)logMessage:(NSString *)message -{ - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorNetworkRequests formatString:@"%@", message]; -} - -- (void)taskDidCompleteWithResponse:(NSURLResponse *)response data:(NSData *)data -{ - @try { - [self logAndInvokeHandler:self.handler response:response responseData:data]; - } @finally { - self.handler = nil; - } -} - -- (void)taskDidCompleteWithError:(NSError *)error -{ - @try { - if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == kCFURLErrorSecureConnectionFailed) { - NSOperatingSystemVersion iOS9Version = { .majorVersion = 9, .minorVersion = 0, .patchVersion = 0 }; - if ([FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS9Version]) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - logEntry:@"WARNING: FBSDK secure network request failed. Please verify you have configured your " - "app for Application Transport Security compatibility described at https://developers.facebook.com/docs/ios/ios9"]; - } - } - [self logAndInvokeHandler:self.handler error:error]; - } @finally { - self.handler = nil; - } -} - -#pragma mark - Task State - -- (void)start -{ - [self.task resume]; -} - -- (void)cancel -{ - [self.task cancel]; - self.handler = nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h deleted file mode 100644 index 8913cc0c1..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@interface FBSDKDialogConfiguration : NSObject - -- (instancetype)initWithName:(NSString *)name - URL:(NSURL *)URL - appVersions:(NSArray *)appVersions -NS_DESIGNATED_INITIALIZER; - -@property (nonatomic, copy, readonly) NSArray *appVersions; -@property (nonatomic, copy, readonly) NSString *name; -@property (nonatomic, copy, readonly) NSURL *URL; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.m deleted file mode 100644 index a8986c0bc..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.m +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKDialogConfiguration.h" - -#import "FBSDKMacros.h" - -#define FBSDK_DIALOG_CONFIGURATION_APP_VERSIONS_KEY @"appVersions" -#define FBSDK_DIALOG_CONFIGURATION_NAME_KEY @"name" -#define FBSDK_DIALOG_CONFIGURATION_URL_KEY @"url" - -@implementation FBSDKDialogConfiguration - -#pragma mark - Object Lifecycle - -- (instancetype)initWithName:(NSString *)name URL:(NSURL *)URL appVersions:(NSArray *)appVersions -{ - if ((self = [super init])) { - _name = [name copy]; - _URL = [URL copy]; - _appVersions = [appVersions copy]; - } - return self; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithName:URL:appVersions:); - return [self initWithName:nil URL:nil appVersions:nil]; -} - -#pragma mark NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - NSString *name = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_DIALOG_CONFIGURATION_NAME_KEY]; - NSURL *URL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_DIALOG_CONFIGURATION_URL_KEY]; - NSSet *appVersionsClasses = [NSSet setWithObjects:[NSArray class], [NSNumber class], nil]; - NSArray *appVersions = [decoder decodeObjectOfClasses:appVersionsClasses - forKey:FBSDK_DIALOG_CONFIGURATION_APP_VERSIONS_KEY]; - return [self initWithName:name URL:URL appVersions:appVersions]; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_appVersions forKey:FBSDK_DIALOG_CONFIGURATION_APP_VERSIONS_KEY]; - [encoder encodeObject:_name forKey:FBSDK_DIALOG_CONFIGURATION_NAME_KEY]; - [encoder encodeObject:_URL forKey:FBSDK_DIALOG_CONFIGURATION_URL_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - return self; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h deleted file mode 100644 index ae8bce781..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKErrorRecoveryConfiguration.h" - -@class FBSDKGraphRequest; - -// maps codes and subcodes pairs to FBSDKErrorRecoveryConfiguration instances. -@interface FBSDKErrorConfiguration : NSObject - -// initialize from optional dictionary of existing configurations. If not supplied a fallback will be created. -- (instancetype)initWithDictionary:(NSDictionary *)dictionary NS_DESIGNATED_INITIALIZER; - -// parses the array (supplied from app settings endpoint) -- (void)parseArray:(NSArray *)array; - -// NSString "code" instances support "*" wildcard semantics (nil is treated as "*" also) -// 'request' is optional, typically for identifying special graph request semantics (e.g., no recovery for client token) -- (FBSDKErrorRecoveryConfiguration *)recoveryConfigurationForCode:(NSString *)code subcode:(NSString *)subcode request:(FBSDKGraphRequest *)request; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.m deleted file mode 100644 index 53e794388..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.m +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKErrorConfiguration.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKErrorRecoveryConfiguration.h" - -static NSString *const kErrorCategoryOther = @"other"; -static NSString *const kErrorCategoryTransient = @"transient"; -static NSString *const kErrorCategoryLogin = @"login"; - -#define FBSDKERRORCONFIGURATION_DICTIONARY_KEY @"configurationDictionary" - -@implementation FBSDKErrorConfiguration -{ - NSMutableDictionary *_configurationDictionary; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithDictionary:); - return [self initWithDictionary:nil]; -} - -- (instancetype)initWithDictionary:(NSDictionary *)dictionary -{ - if ((self = [super init])) { - if (dictionary) { - _configurationDictionary = [NSMutableDictionary dictionaryWithDictionary:dictionary]; - } else { - _configurationDictionary = [NSMutableDictionary dictionary]; - NSString *localizedOK = - NSLocalizedStringWithDefaultValue(@"ErrorRecovery.OK", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"OK", - @"The title of the label to start attempting error recovery"); - NSString *localizedCancel = - NSLocalizedStringWithDefaultValue(@"ErrorRecovery.Cancel", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Cancel", - @"The title of the label to decline attempting error recovery"); - NSString *localizedTransientSuggestion = - NSLocalizedStringWithDefaultValue(@"ErrorRecovery.Transient.Suggestion", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"The server is temporarily busy, please try again.", - @"The fallback message to display to retry transient errors"); - NSString *localizedLoginRecoverableSuggestion = - NSLocalizedStringWithDefaultValue(@"ErrorRecovery.Login.Suggestion", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Please log into this app again to reconnect your Facebook account.", - @"The fallback message to display to recover invalidated tokens"); - NSArray *fallbackArray = @[ - @{ @"name" : @"login", - @"items" : @[ @{ @"code" : @102 }, - @{ @"code" : @190 } ], - @"recovery_message" : localizedLoginRecoverableSuggestion, - @"recovery_options" : @[ localizedOK, localizedCancel] - }, - @{ @"name" : @"transient", - @"items" : @[ @{ @"code" : @1 }, - @{ @"code" : @2 }, - @{ @"code" : @4 }, - @{ @"code" : @9 }, - @{ @"code" : @17 }, - @{ @"code" : @341 } ], - @"recovery_message" : localizedTransientSuggestion, - @"recovery_options" : @[ localizedOK] - }, - ]; - [self parseArray:fallbackArray]; - } - } - return self; -} - -- (FBSDKErrorRecoveryConfiguration *)recoveryConfigurationForCode:(NSString *)code subcode:(NSString *)subcode request:(FBSDKGraphRequest *)request -{ - code = code ?: @"*"; - subcode = subcode ?: @"*"; - FBSDKErrorRecoveryConfiguration *configuration = (_configurationDictionary[code][subcode] ?: - _configurationDictionary[code][@"*"] ?: - _configurationDictionary[@"*"][subcode] ?: - _configurationDictionary[@"*"][@"*"]); - if (configuration.errorCategory == FBSDKGraphRequestErrorCategoryRecoverable && - [FBSDKSettings clientToken] && - [request.parameters[@"access_token"] hasSuffix:[FBSDKSettings clientToken]]) { - // do not attempt to recovery client tokens. - return nil; - } - return configuration; -} - -- (void)parseArray:(NSArray *)array -{ - for (NSDictionary *dictionary in array) { - [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) { - FBSDKGraphRequestErrorCategory category; - NSString *action = dictionary[@"name"]; - if ([action isEqualToString:kErrorCategoryOther]) { - category = FBSDKGraphRequestErrorCategoryOther; - } else if ([action isEqualToString:kErrorCategoryTransient]) { - category = FBSDKGraphRequestErrorCategoryTransient; - } else { - category = FBSDKGraphRequestErrorCategoryRecoverable; - } - NSString *suggestion = dictionary[@"recovery_message"]; - NSArray *options = dictionary[@"recovery_options"]; - for (NSDictionary *codeSubcodesDictionary in dictionary[@"items"]) { - NSString *code = [codeSubcodesDictionary[@"code"] stringValue]; - - NSMutableDictionary *currentSubcodes = _configurationDictionary[code]; - if (!currentSubcodes) { - currentSubcodes = [NSMutableDictionary dictionary]; - _configurationDictionary[code] = currentSubcodes; - } - - NSArray *subcodes = codeSubcodesDictionary[@"subcodes"]; - if (subcodes.count > 0) { - for (NSNumber *subcodeNumber in subcodes) { - currentSubcodes[[subcodeNumber stringValue]] = [[FBSDKErrorRecoveryConfiguration alloc] - initWithRecoveryDescription:suggestion - optionDescriptions:options - category:category - recoveryActionName:action]; - } - } else { - currentSubcodes[@"*"] = [[FBSDKErrorRecoveryConfiguration alloc] - initWithRecoveryDescription:suggestion - optionDescriptions:options - category:category - recoveryActionName:action]; - } - } - }]; - } -} - -#pragma mark - NSSecureCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - NSDictionary *configurationDictionary = [decoder decodeObjectOfClass:[NSDictionary class] forKey:FBSDKERRORCONFIGURATION_DICTIONARY_KEY]; - return [self initWithDictionary:configurationDictionary]; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_configurationDictionary forKey:FBSDKERRORCONFIGURATION_DICTIONARY_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - return self; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h deleted file mode 100644 index 105618fad..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -//immutable -@interface FBSDKErrorRecoveryConfiguration : NSObject - -@property (nonatomic, readonly) NSString *localizedRecoveryDescription; -@property (nonatomic, readonly) NSArray *localizedRecoveryOptionDescriptions; -@property (nonatomic, readonly) FBSDKGraphRequestErrorCategory errorCategory; -@property (nonatomic, readonly) NSString *recoveryActionName; - -- (instancetype)initWithRecoveryDescription:(NSString *)description - optionDescriptions:(NSArray *)optionDescriptions - category:(FBSDKGraphRequestErrorCategory)category - recoveryActionName:(NSString *)recoveryActionName NS_DESIGNATED_INITIALIZER; -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.m deleted file mode 100644 index 3c0642dda..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.m +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKErrorRecoveryConfiguration.h" - -#define FBSDK_ERROR_RECOVERY_CONFIGURATION_DESCRIPTION_KEY @"description" -#define FBSDK_ERROR_RECOVERY_CONFIGURATION_OPTIONS_KEY @"options" -#define FBSDK_ERROR_RECOVERY_CONFIGURATION_CATEGORY_KEY @"category" -#define FBSDK_ERROR_RECOVERY_CONFIGURATION_ACTION_KEY @"action" - -@implementation FBSDKErrorRecoveryConfiguration - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithRecoveryDescription:optionDescriptions:category:recoveryActionName:); - return [self initWithRecoveryDescription:nil - optionDescriptions:nil - category:0 - recoveryActionName:nil]; -} - -- (instancetype)initWithRecoveryDescription:(NSString *)description - optionDescriptions:(NSArray *)optionDescriptions - category:(FBSDKGraphRequestErrorCategory)category - recoveryActionName:(NSString *)recoveryActionName { - if ((self = [super init])) { - _localizedRecoveryDescription = [description copy]; - _localizedRecoveryOptionDescriptions = [optionDescriptions copy]; - _errorCategory = category; - _recoveryActionName = [recoveryActionName copy]; - } - return self; -} - -#pragma mark - NSSecureCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - NSString *description = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_DESCRIPTION_KEY]; - NSArray *options = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_OPTIONS_KEY]; - NSNumber *category = [decoder decodeObjectOfClass:[NSNumber class] forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_CATEGORY_KEY]; - NSString *action = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_ACTION_KEY]; - - return [self initWithRecoveryDescription:description - optionDescriptions:options - category:[category unsignedIntegerValue] - recoveryActionName:action]; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_localizedRecoveryDescription forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_DESCRIPTION_KEY]; - [encoder encodeObject:_localizedRecoveryOptionDescriptions forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_OPTIONS_KEY]; - [encoder encodeObject:@(_errorCategory) forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_CATEGORY_KEY]; - [encoder encodeObject:_recoveryActionName forKey:FBSDK_ERROR_RECOVERY_CONFIGURATION_ACTION_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - //immutable - return self; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h deleted file mode 100644 index 5096c039d..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -extern NSString *const FBSDKDialogConfigurationNameDefault; -extern NSString *const FBSDKDialogConfigurationNameSharing; - -extern NSString *const FBSDKDialogConfigurationFeatureUseNativeFlow; -extern NSString *const FBSDKDialogConfigurationFeatureUseSafariViewController; diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h deleted file mode 100644 index 69e8990cd..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKDialogConfiguration.h" -#import "FBSDKErrorConfiguration.h" - -// login kit -extern NSString *const FBSDKDialogConfigurationNameLogin; - -// share kit -extern NSString *const FBSDKDialogConfigurationNameAppInvite; -extern NSString *const FBSDKDialogConfigurationNameGameRequest; -extern NSString *const FBSDKDialogConfigurationNameGroup; -extern NSString *const FBSDKDialogConfigurationNameLike; -extern NSString *const FBSDKDialogConfigurationNameMessage; -extern NSString *const FBSDKDialogConfigurationNameShare; - -extern const NSInteger FBSDKServerConfigurationVersion; - -typedef NS_OPTIONS(NSUInteger, FBSDKServerConfigurationSmartLoginOptions) -{ - FBSDKServerConfigurationSmartLoginOptionsUnknown = 0, - FBSDKServerConfigurationSmartLoginOptionsEnabled = 1 << 0, - FBSDKServerConfigurationSmartLoginOptionsRequireConfirmation = 1 << 1, -}; - -@interface FBSDKServerConfiguration : NSObject - -- (instancetype)initWithAppID:(NSString *)appID - appName:(NSString *)appName - loginTooltipEnabled:(BOOL)loginTooltipEnabled - loginTooltipText:(NSString *)loginTooltipText - defaultShareMode:(NSString *)defaultShareMode - advertisingIDEnabled:(BOOL)advertisingIDEnabled - implicitLoggingEnabled:(BOOL)implicitLoggingEnabled -implicitPurchaseLoggingEnabled:(BOOL)implicitPurchaseLoggingEnabled - appIndexingTriggerEnabled:(BOOL)appIndexingTriggerEnabled - systemAuthenticationEnabled:(BOOL)systemAuthenticationEnabled - nativeAuthFlowEnabled:(BOOL)nativeAuthFlowEnabled - dialogConfigurations:(NSDictionary *)dialogConfigurations - dialogFlows:(NSDictionary *)dialogFlows - timestamp:(NSDate *)timestamp - errorConfiguration:(FBSDKErrorConfiguration *)errorConfiguration - sessionTimeoutInterval:(NSTimeInterval) sessionTimeoutInterval - defaults:(BOOL)defaults - loggingToken:(NSString *)loggingToken - smartLoginOptions:(FBSDKServerConfigurationSmartLoginOptions)smartLoginOptions - smartLoginBookmarkIconURL:(NSURL *)smartLoginBookmarkIconURL - smartLoginMenuIconURL:(NSURL *)smartLoginMenuIconURL -NS_DESIGNATED_INITIALIZER; - -@property (nonatomic, assign, readonly, getter=isAdvertisingIDEnabled) BOOL advertisingIDEnabled; -@property (nonatomic, copy, readonly) NSString *appID; -@property (nonatomic, copy, readonly) NSString *appName; -@property (nonatomic, assign, readonly, getter=isDefaults) BOOL defaults; -@property (nonatomic, copy, readonly) NSString *defaultShareMode; -@property (nonatomic, strong, readonly) FBSDKErrorConfiguration *errorConfiguration; -@property (nonatomic, assign, readonly, getter=isImplicitLoggingSupported) BOOL implicitLoggingEnabled; -@property (nonatomic, assign, readonly, getter=isImplicitPurchaseLoggingSupported) BOOL implicitPurchaseLoggingEnabled; -@property (nonatomic, assign, readonly, getter=isAppIndexingTriggerEnabled) BOOL appIndexingTriggerEnabled; -@property (nonatomic, assign, readonly, getter=isLoginTooltipEnabled) BOOL loginTooltipEnabled; -@property (nonatomic, assign, readonly, getter=isNativeAuthFlowEnabled) BOOL nativeAuthFlowEnabled; -@property (nonatomic, assign, readonly, getter=isSystemAuthenticationEnabled) BOOL systemAuthenticationEnabled; -@property (nonatomic, copy, readonly) NSString *loginTooltipText; -@property (nonatomic, copy, readonly) NSDate *timestamp; -@property (nonatomic, assign) NSTimeInterval sessionTimoutInterval; -@property (nonatomic, copy, readonly) NSString *loggingToken; -@property (nonatomic, assign, readonly) FBSDKServerConfigurationSmartLoginOptions smartLoginOptions; -@property (nonatomic, copy, readonly) NSURL *smartLoginBookmarkIconURL; -@property (nonatomic, copy, readonly) NSURL *smartLoginMenuIconURL; -@property (nonatomic, readonly) NSInteger version; - -- (FBSDKDialogConfiguration *)dialogConfigurationForDialogName:(NSString *)dialogName; -- (BOOL)useNativeDialogForDialogName:(NSString *)dialogName; -- (BOOL)useSafariViewControllerForDialogName:(NSString *)dialogName; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.m deleted file mode 100644 index ddcdea5b1..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.m +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKServerConfiguration.h" -#import "FBSDKServerConfiguration+Internal.h" - -#import "FBSDKInternalUtility.h" -#import "FBSDKMacros.h" - -#define FBSDK_SERVER_CONFIGURATION_ADVERTISING_ID_ENABLED_KEY @"advertisingIDEnabled" -#define FBSDK_SERVER_CONFIGURATION_APP_ID_KEY @"appID" -#define FBSDK_SERVER_CONFIGURATION_APP_NAME_KEY @"appName" -#define FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_KEY @"dialogConfigs" -#define FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_KEY @"dialogFlows" -#define FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGS_KEY @"errorConfigs" -#define FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_KEY @"implicitLoggingEnabled" -#define FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_KEY @"defaultShareMode" -#define FBSDK_SERVER_CONFIGURATION_IMPLICIT_PURCHASE_LOGGING_ENABLED_KEY @"implicitPurchaseLoggingEnabled" -#define FBSDK_SERVER_CONFIGURATION_APP_INDEXING_TRIGGER_ENABLED_KEY @"appIndexingTriggerEnabled" -#define FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_KEY @"loginTooltipEnabled" -#define FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_KEY @"loginTooltipText" -#define FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_KEY @"systemAuthenticationEnabled" -#define FBSDK_SERVER_CONFIGURATION_NATIVE_AUTH_FLOW_ENABLED_KEY @"nativeAuthFlowEnabled" -#define FBSDK_SERVER_CONFIGURATION_TIMESTAMP_KEY @"timestamp" -#define FBSDK_SERVER_CONFIGURATION_SESSION_TIMEOUT_INTERVAL @"sessionTimeoutInterval" -#define FBSDK_SERVER_CONFIGURATION_LOGGING_TOKEN @"loggingToken" -#define FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_OPTIONS_KEY @"smartLoginEnabled" -#define FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_BOOKMARK_ICON_URL_KEY @"smarstLoginBookmarkIconURL" -#define FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_MENU_ICON_URL_KEY @"smarstLoginBookmarkMenuURL" -#define FBSDK_SERVER_CONFIGURATION_VERSION_KEY @"version" - -#pragma mark - Dialog Names - -NSString *const FBSDKDialogConfigurationNameDefault = @"default"; - -NSString *const FBSDKDialogConfigurationNameLogin = @"login"; - -NSString *const FBSDKDialogConfigurationNameSharing = @"sharing"; - -NSString *const FBSDKDialogConfigurationNameAppInvite = @"app_invite"; -NSString *const FBSDKDialogConfigurationNameGameRequest = @"game_request"; -NSString *const FBSDKDialogConfigurationNameGroup = @"group"; -NSString *const FBSDKDialogConfigurationNameLike = @"like"; -NSString *const FBSDKDialogConfigurationNameMessage = @"message"; -NSString *const FBSDKDialogConfigurationNameShare = @"share"; - -NSString *const FBSDKDialogConfigurationFeatureUseNativeFlow = @"use_native_flow"; -NSString *const FBSDKDialogConfigurationFeatureUseSafariViewController = @"use_safari_vc"; - -// Increase this value when adding new fields and previous cached configurations should be -// treated as stale. -const NSInteger FBSDKServerConfigurationVersion = 2; - -@implementation FBSDKServerConfiguration -{ - NSDictionary *_dialogConfigurations; - NSDictionary *_dialogFlows; - NSInteger _version; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init NS_UNAVAILABLE -{ - assert(0); -} - -- (instancetype)initWithAppID:(NSString *)appID - appName:(NSString *)appName - loginTooltipEnabled:(BOOL)loginTooltipEnabled - loginTooltipText:(NSString *)loginTooltipText - defaultShareMode:(NSString*)defaultShareMode - advertisingIDEnabled:(BOOL)advertisingIDEnabled - implicitLoggingEnabled:(BOOL)implicitLoggingEnabled -implicitPurchaseLoggingEnabled:(BOOL)implicitPurchaseLoggingEnabled - appIndexingTriggerEnabled:(BOOL)appIndexingTriggerEnabled - systemAuthenticationEnabled:(BOOL)systemAuthenticationEnabled - nativeAuthFlowEnabled:(BOOL)nativeAuthFlowEnabled - dialogConfigurations:(NSDictionary *)dialogConfigurations - dialogFlows:(NSDictionary *)dialogFlows - timestamp:(NSDate *)timestamp - errorConfiguration:(FBSDKErrorConfiguration *)errorConfiguration - sessionTimeoutInterval:(NSTimeInterval) sessionTimeoutInterval - defaults:(BOOL)defaults - loggingToken:(NSString *)loggingToken - smartLoginOptions:(FBSDKServerConfigurationSmartLoginOptions)smartLoginOptions - smartLoginBookmarkIconURL:(NSURL *)smartLoginBookmarkIconURL - smartLoginMenuIconURL:(NSURL *)smartLoginMenuIconURL -{ - if ((self = [super init])) { - _appID = [appID copy]; - _appName = [appName copy]; - _loginTooltipEnabled = loginTooltipEnabled; - _loginTooltipText = [loginTooltipText copy]; - _defaultShareMode = defaultShareMode; - _advertisingIDEnabled = advertisingIDEnabled; - _implicitLoggingEnabled = implicitLoggingEnabled; - _implicitPurchaseLoggingEnabled = implicitPurchaseLoggingEnabled; - _appIndexingTriggerEnabled = appIndexingTriggerEnabled; - _systemAuthenticationEnabled = systemAuthenticationEnabled; - _nativeAuthFlowEnabled = nativeAuthFlowEnabled; - _dialogConfigurations = [dialogConfigurations copy]; - _dialogFlows = [dialogFlows copy]; - _timestamp = [timestamp copy]; - _errorConfiguration = [errorConfiguration copy]; - _sessionTimoutInterval = sessionTimeoutInterval; - _defaults = defaults; - _loggingToken = loggingToken; - _smartLoginOptions = smartLoginOptions; - _smartLoginMenuIconURL = [smartLoginMenuIconURL copy]; - _smartLoginBookmarkIconURL = [smartLoginBookmarkIconURL copy]; - _version = FBSDKServerConfigurationVersion; - } - return self; -} - -#pragma mark - Public Methods - -- (FBSDKDialogConfiguration *)dialogConfigurationForDialogName:(NSString *)dialogName -{ - return _dialogConfigurations[dialogName]; -} - -- (BOOL)useNativeDialogForDialogName:(NSString *)dialogName -{ - return [self _useFeatureWithKey:FBSDKDialogConfigurationFeatureUseNativeFlow dialogName:dialogName]; -} - -- (BOOL)useSafariViewControllerForDialogName:(NSString *)dialogName -{ - return [self _useFeatureWithKey:FBSDKDialogConfigurationFeatureUseSafariViewController dialogName:dialogName]; -} - -#pragma mark - Helper Methods - -- (BOOL)_useFeatureWithKey:(NSString *)key dialogName:(NSString *)dialogName -{ - if ([dialogName isEqualToString:FBSDKDialogConfigurationNameLogin]) { - return [(NSNumber *)(_dialogFlows[dialogName][key] ?: - _dialogFlows[FBSDKDialogConfigurationNameDefault][key]) boolValue]; - } else { - return [(NSNumber *)(_dialogFlows[dialogName][key] ?: - _dialogFlows[FBSDKDialogConfigurationNameSharing][key] ?: - _dialogFlows[FBSDKDialogConfigurationNameDefault][key]) boolValue]; - } -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - NSString *appID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SERVER_CONFIGURATION_APP_ID_KEY]; - NSString *appName = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SERVER_CONFIGURATION_APP_NAME_KEY]; - BOOL loginTooltipEnabled = [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_KEY]; - NSString *loginTooltipText = [decoder decodeObjectOfClass:[NSString class] - forKey:FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_KEY]; - NSString *defaultShareMode = [decoder decodeObjectOfClass:[NSString class] - forKey:FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_KEY]; - BOOL advertisingIDEnabled = [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_ADVERTISING_ID_ENABLED_KEY]; - BOOL implicitLoggingEnabled = [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_KEY]; - BOOL implicitPurchaseLoggingEnabled = - [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_IMPLICIT_PURCHASE_LOGGING_ENABLED_KEY]; - BOOL appIndexingTriggerEnabled = - [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_APP_INDEXING_TRIGGER_ENABLED_KEY]; - BOOL systemAuthenticationEnabled = - [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_KEY]; - FBSDKServerConfigurationSmartLoginOptions smartLoginOptions = [decoder decodeIntegerForKey:FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_OPTIONS_KEY]; - BOOL nativeAuthFlowEnabled = [decoder decodeBoolForKey:FBSDK_SERVER_CONFIGURATION_NATIVE_AUTH_FLOW_ENABLED_KEY]; - NSDate *timestamp = [decoder decodeObjectOfClass:[NSDate class] forKey:FBSDK_SERVER_CONFIGURATION_TIMESTAMP_KEY]; - NSSet *dialogConfigurationsClasses = [[NSSet alloc] initWithObjects: - [NSDictionary class], - [FBSDKDialogConfiguration class], - nil]; - NSDictionary *dialogConfigurations = [decoder decodeObjectOfClasses:dialogConfigurationsClasses - forKey:FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_KEY]; - NSSet *dialogFlowsClasses = [[NSSet alloc] initWithObjects: - [NSDictionary class], - [NSString class], - [NSNumber class], - nil]; - NSDictionary *dialogFlows = [decoder decodeObjectOfClasses:dialogFlowsClasses - forKey:FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_KEY]; - FBSDKErrorConfiguration *errorConfiguration = [decoder decodeObjectOfClass:[FBSDKErrorConfiguration class] forKey:FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGS_KEY]; - NSTimeInterval sessionTimeoutInterval = [decoder decodeDoubleForKey:FBSDK_SERVER_CONFIGURATION_SESSION_TIMEOUT_INTERVAL]; - NSString *loggingToken = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SERVER_CONFIGURATION_LOGGING_TOKEN]; - NSURL *smartLoginBookmarkIconURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_BOOKMARK_ICON_URL_KEY]; - NSURL *smartLoginMenuIconURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_MENU_ICON_URL_KEY]; - NSInteger version = [decoder decodeIntegerForKey:FBSDK_SERVER_CONFIGURATION_VERSION_KEY]; - FBSDKServerConfiguration *configuration = [self initWithAppID:appID - appName:appName - loginTooltipEnabled:loginTooltipEnabled - loginTooltipText:loginTooltipText - defaultShareMode:defaultShareMode - advertisingIDEnabled:advertisingIDEnabled - implicitLoggingEnabled:implicitLoggingEnabled - implicitPurchaseLoggingEnabled:implicitPurchaseLoggingEnabled - appIndexingTriggerEnabled:appIndexingTriggerEnabled - systemAuthenticationEnabled:systemAuthenticationEnabled - nativeAuthFlowEnabled:nativeAuthFlowEnabled - dialogConfigurations:dialogConfigurations - dialogFlows:dialogFlows - timestamp:timestamp - errorConfiguration:errorConfiguration - sessionTimeoutInterval:sessionTimeoutInterval - defaults:NO - loggingToken:loggingToken - smartLoginOptions:smartLoginOptions - smartLoginBookmarkIconURL:smartLoginBookmarkIconURL - smartLoginMenuIconURL:smartLoginMenuIconURL - ]; - configuration->_version = version; - return configuration; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeBool:_advertisingIDEnabled forKey:FBSDK_SERVER_CONFIGURATION_ADVERTISING_ID_ENABLED_KEY]; - [encoder encodeObject:_appID forKey:FBSDK_SERVER_CONFIGURATION_APP_ID_KEY]; - [encoder encodeObject:_appName forKey:FBSDK_SERVER_CONFIGURATION_APP_NAME_KEY]; - [encoder encodeObject:_defaultShareMode forKey:FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_KEY]; - [encoder encodeObject:_dialogConfigurations forKey:FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_KEY]; - [encoder encodeObject:_dialogFlows forKey:FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_KEY]; - [encoder encodeObject:_errorConfiguration forKey:FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGS_KEY]; - [encoder encodeBool:_implicitLoggingEnabled forKey:FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_KEY]; - [encoder encodeBool:_implicitPurchaseLoggingEnabled - forKey:FBSDK_SERVER_CONFIGURATION_IMPLICIT_PURCHASE_LOGGING_ENABLED_KEY]; - [encoder encodeBool:_appIndexingTriggerEnabled - forKey:FBSDK_SERVER_CONFIGURATION_APP_INDEXING_TRIGGER_ENABLED_KEY]; - [encoder encodeBool:_loginTooltipEnabled forKey:FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_KEY]; - [encoder encodeObject:_loginTooltipText forKey:FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_KEY]; - [encoder encodeBool:_nativeAuthFlowEnabled forKey:FBSDK_SERVER_CONFIGURATION_NATIVE_AUTH_FLOW_ENABLED_KEY]; - [encoder encodeBool:_systemAuthenticationEnabled forKey:FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_KEY]; - [encoder encodeObject:_timestamp forKey:FBSDK_SERVER_CONFIGURATION_TIMESTAMP_KEY]; - [encoder encodeDouble:_sessionTimoutInterval forKey:FBSDK_SERVER_CONFIGURATION_SESSION_TIMEOUT_INTERVAL]; - [encoder encodeObject:_loggingToken forKey:FBSDK_SERVER_CONFIGURATION_LOGGING_TOKEN]; - [encoder encodeInteger:_smartLoginOptions forKey:FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_OPTIONS_KEY]; - [encoder encodeObject:_smartLoginBookmarkIconURL forKey:FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_BOOKMARK_ICON_URL_KEY]; - [encoder encodeObject:_smartLoginMenuIconURL forKey:FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_MENU_ICON_URL_KEY]; - [encoder encodeInteger:_version forKey:FBSDK_SERVER_CONFIGURATION_VERSION_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - return self; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h deleted file mode 100644 index b84b02353..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKServerConfigurationManager.h" - -@class FBSDKGraphRequest; - -@interface FBSDKServerConfigurationManager () - -+ (void)processLoadRequestResponse:(id)result error:(NSError *)error appID:(NSString *)appID; - -+ (FBSDKGraphRequest *)requestToLoadServerConfiguration:(NSString *)appID; - -+ (void)clearCache; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h deleted file mode 100644 index d188d3dce..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKServerConfiguration.h" - -typedef void(^FBSDKServerConfigurationManagerLoadBlock)(FBSDKServerConfiguration *serverConfiguration, NSError *error); - -@interface FBSDKServerConfigurationManager : NSObject - -/** - Returns the locally cached configuration. - - The result will be valid for the appID from FBSDKSettings, but may be expired. A network request will be - initiated to update the configuration if a valid and unexpired configuration is not available. - */ -+ (FBSDKServerConfiguration *)cachedServerConfiguration; - -/** - Executes the completionBlock with a valid and current configuration when it is available. - - This method will use a cached configuration if it is valid and not expired. - */ -+ (void)loadServerConfigurationWithCompletionBlock:(FBSDKServerConfigurationManagerLoadBlock)completionBlock; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.m deleted file mode 100644 index e0c732648..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.m +++ /dev/null @@ -1,419 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKServerConfigurationManager+Internal.h" - -#import "FBSDKGraphRequest+Internal.h" -#import "FBSDKGraphRequest.h" -#import "FBSDKImageDownloader.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKServerConfiguration+Internal.h" -#import "FBSDKServerConfiguration.h" -#import "FBSDKSettings.h" -#import "FBSDKTypeUtility.h" - -// one hour -#define DEFAULT_SESSION_TIMEOUT_INTERVAL 60 -#define FBSDK_SERVER_CONFIGURATION_MANAGER_CACHE_TIMEOUT (60 * 60) - -#define FBSDK_SERVER_CONFIGURATION_USER_DEFAULTS_KEY @"com.facebook.sdk:serverConfiguration%@" - -#define FBSDK_SERVER_CONFIGURATION_APP_EVENTS_FEATURES_FIELD @"app_events_feature_bitmask" -#define FBSDK_SERVER_CONFIGURATION_APP_NAME_FIELD @"name" -#define FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_FIELD @"default_share_mode" -#define FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_FIELD @"ios_dialog_configs" -#define FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_FIELD @"ios_sdk_dialog_flows" -#define FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGURATION_FIELD @"ios_sdk_error_categories" -#define FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_FIELD @"supports_implicit_sdk_logging" -#define FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_FIELD @"gdpv4_nux_enabled" -#define FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_FIELD @"gdpv4_nux_content" -#define FBSDK_SERVER_CONFIGURATION_NATIVE_PROXY_AUTH_FLOW_ENABLED_FIELD @"ios_supports_native_proxy_auth_flow" -#define FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_FIELD @"ios_supports_system_auth" -#define FBSDK_SERVER_CONFIGURATION_SESSION_TIMEOUT_FIELD @"app_events_session_timeout" -#define FBSDK_SERVER_CONFIGURATION_LOGGIN_TOKEN_FIELD @"logging_token" -#define FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_OPTIONS_FIELD @"seamless_login" -#define FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_BOOKMARK_ICON_URL_FIELD @"smart_login_bookmark_icon_url" -#define FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_MENU_ICON_URL_FIELD @"smart_login_menu_icon_url" - -@implementation FBSDKServerConfigurationManager - -static NSMutableArray *_completionBlocks; -static BOOL _loadingServerConfiguration; -static FBSDKServerConfiguration *_serverConfiguration; -static NSError *_serverConfigurationError; -static NSDate *_serverConfigurationErrorTimestamp; -static const NSTimeInterval kTimeout = 4.0; - -typedef NS_OPTIONS(NSUInteger, FBSDKServerConfigurationManagerAppEventsFeatures) -{ - FBSDKServerConfigurationManagerAppEventsFeaturesNone = 0, - FBSDKServerConfigurationManagerAppEventsFeaturesAdvertisingIDEnabled = 1 << 0, - FBSDKServerConfigurationManagerAppEventsFeaturesImplicitPurchaseLoggingEnabled = 1 << 1, - FBSDKServerConfigurationManagerAppEventsFeaturesAppIndexingTriggerEnabled = 1 << 6, -}; - -#pragma mark - Public Class Methods - -+ (void)initialize -{ - if (self == [FBSDKServerConfigurationManager class]) { - _completionBlocks = [[NSMutableArray alloc] init]; - } -} - -+ (void)clearCache -{ - _serverConfiguration = nil; - _serverConfigurationError = nil; - _serverConfigurationErrorTimestamp = nil; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *defaultsKey = [NSString stringWithFormat:FBSDK_SERVER_CONFIGURATION_USER_DEFAULTS_KEY, [FBSDKSettings appID]]; - [defaults removeObjectForKey:defaultsKey]; - [defaults synchronize]; -} - -+ (FBSDKServerConfiguration *)cachedServerConfiguration -{ - NSString *appID = [FBSDKSettings appID]; - @synchronized(self) { - // load the server configuration if we don't have it already - [self loadServerConfigurationWithCompletionBlock:NULL]; - - // use whatever configuration we have or the default - return _serverConfiguration ?: [self _defaultServerConfigurationForAppID:appID]; - } -} - -+ (void)loadServerConfigurationWithCompletionBlock:(FBSDKServerConfigurationManagerLoadBlock)completionBlock -{ - void (^loadBlock)(void) = NULL; - NSString *appID = [FBSDKSettings appID]; - @synchronized(self) { - // validate the cached configuration has the correct appID - if (_serverConfiguration && ![_serverConfiguration.appID isEqualToString:appID]) { - _serverConfiguration = nil; - _serverConfigurationError = nil; - _serverConfigurationErrorTimestamp = nil; - } - - // load the configuration from NSUserDefaults - if (!_serverConfiguration) { - // load the defaults - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *defaultsKey = [NSString stringWithFormat:FBSDK_SERVER_CONFIGURATION_USER_DEFAULTS_KEY, appID]; - NSData *data = [defaults objectForKey:defaultsKey]; - if ([data isKindOfClass:[NSData class]]) { - // decode the configuration - FBSDKServerConfiguration *serverConfiguration = [NSKeyedUnarchiver unarchiveObjectWithData:data]; - if ([serverConfiguration isKindOfClass:[FBSDKServerConfiguration class]]) { - // ensure that the configuration points to the current appID - if ([serverConfiguration.appID isEqualToString:appID]) { - _serverConfiguration = serverConfiguration; - } - } - } - } - - if ((_serverConfiguration && [self _serverConfigurationTimestampIsValid:_serverConfiguration.timestamp] && _serverConfiguration.version >= FBSDKServerConfigurationVersion) || - (_serverConfigurationErrorTimestamp && [self _serverConfigurationTimestampIsValid:_serverConfigurationErrorTimestamp])) { - // we have a valid server configuration, use that - loadBlock = [self _wrapperBlockForLoadBlock:completionBlock]; - } else { - // hold onto the completion block - [FBSDKInternalUtility array:_completionBlocks addObject:[completionBlock copy]]; - - // check if we are already loading - if (!_loadingServerConfiguration) { - // load the configuration from the network - _loadingServerConfiguration = YES; - FBSDKGraphRequest *request = [[self class] requestToLoadServerConfiguration:appID]; - - // start request with specified timeout instead of the default 180s - FBSDKGraphRequestConnection *requestConnection = [[FBSDKGraphRequestConnection alloc] init]; - requestConnection.timeout = kTimeout; - [requestConnection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - [self processLoadRequestResponse:result error:error appID:appID]; - }]; - [requestConnection start]; - } - } - } - - if (loadBlock != NULL) { - loadBlock(); - } -} - -#pragma mark - Internal Class Methods - -+ (void)processLoadRequestResponse:(id)result error:(NSError *)error appID:(NSString *)appID -{ - if (error) { - [self _didProcessConfigurationFromNetwork:nil appID:appID error:error]; - return; - } - - NSDictionary *resultDictionary = [FBSDKTypeUtility dictionaryValue:result]; - NSUInteger appEventsFeatures = [FBSDKTypeUtility unsignedIntegerValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_APP_EVENTS_FEATURES_FIELD]]; - BOOL advertisingIDEnabled = (appEventsFeatures & FBSDKServerConfigurationManagerAppEventsFeaturesAdvertisingIDEnabled); - BOOL implicitPurchaseLoggingEnabled = (appEventsFeatures & FBSDKServerConfigurationManagerAppEventsFeaturesImplicitPurchaseLoggingEnabled); - BOOL appIndexingTriggerEnabled = (appEventsFeatures & FBSDKServerConfigurationManagerAppEventsFeaturesAppIndexingTriggerEnabled); - NSString *appName = [FBSDKTypeUtility stringValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_APP_NAME_FIELD]]; - BOOL loginTooltipEnabled = [FBSDKTypeUtility boolValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_FIELD]]; - NSString *loginTooltipText = [FBSDKTypeUtility stringValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_FIELD]]; - NSString *defaultShareMode = [FBSDKTypeUtility stringValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_FIELD]]; - BOOL implicitLoggingEnabled = [FBSDKTypeUtility boolValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_FIELD]]; - BOOL systemAuthenticationEnabled = [FBSDKTypeUtility boolValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_FIELD]]; - BOOL nativeAuthFlowEnabled = [FBSDKTypeUtility boolValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_NATIVE_PROXY_AUTH_FLOW_ENABLED_FIELD]]; - NSDictionary *dialogConfigurations = [FBSDKTypeUtility dictionaryValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_FIELD]]; - dialogConfigurations = [self _parseDialogConfigurations:dialogConfigurations]; - NSDictionary *dialogFlows = [FBSDKTypeUtility dictionaryValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_FIELD]]; - FBSDKErrorConfiguration *errorConfiguration = [[FBSDKErrorConfiguration alloc] initWithDictionary:nil]; - [errorConfiguration parseArray:resultDictionary[FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGURATION_FIELD]]; - NSTimeInterval sessionTimeoutInterval = [FBSDKTypeUtility timeIntervalValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_SESSION_TIMEOUT_FIELD]] ?: DEFAULT_SESSION_TIMEOUT_INTERVAL; - NSString *loggingToken = [FBSDKTypeUtility stringValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_LOGGIN_TOKEN_FIELD]]; - FBSDKServerConfigurationSmartLoginOptions smartLoginOptions = [FBSDKTypeUtility integerValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_OPTIONS_FIELD]]; - NSURL *smartLoginBookmarkIconURL = [FBSDKTypeUtility URLValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_BOOKMARK_ICON_URL_FIELD]]; - NSURL *smartLoginMenuIconURL = [FBSDKTypeUtility URLValue:resultDictionary[FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_MENU_ICON_URL_FIELD]]; - FBSDKServerConfiguration *serverConfiguration = [[FBSDKServerConfiguration alloc] initWithAppID:appID - appName:appName - loginTooltipEnabled:loginTooltipEnabled - loginTooltipText:loginTooltipText - defaultShareMode:defaultShareMode - advertisingIDEnabled:advertisingIDEnabled - implicitLoggingEnabled:implicitLoggingEnabled - implicitPurchaseLoggingEnabled:implicitPurchaseLoggingEnabled - appIndexingTriggerEnabled:appIndexingTriggerEnabled - systemAuthenticationEnabled:systemAuthenticationEnabled - nativeAuthFlowEnabled:nativeAuthFlowEnabled - dialogConfigurations:dialogConfigurations - dialogFlows:dialogFlows - timestamp:[NSDate date] - errorConfiguration:errorConfiguration - sessionTimeoutInterval:sessionTimeoutInterval - defaults:NO - loggingToken:loggingToken - smartLoginOptions:smartLoginOptions - smartLoginBookmarkIconURL:smartLoginBookmarkIconURL - smartLoginMenuIconURL:smartLoginMenuIconURL - ]; -#if TARGET_OS_TV - // don't download icons more than once a day. - static const NSTimeInterval kSmartLoginIconsTTL = 60 * 60 * 24; - - BOOL smartLoginEnabled = (smartLoginOptions & FBSDKServerConfigurationSmartLoginOptionsEnabled); - // for TVs go ahead and prime the images - if (smartLoginEnabled && - smartLoginMenuIconURL && - smartLoginBookmarkIconURL) { - [[FBSDKImageDownloader sharedInstance] downloadImageWithURL:serverConfiguration.smartLoginBookmarkIconURL - ttl:kSmartLoginIconsTTL - completion:NULL]; - [[FBSDKImageDownloader sharedInstance] downloadImageWithURL:serverConfiguration.smartLoginMenuIconURL - ttl:kSmartLoginIconsTTL - completion:NULL]; - } -#endif - [self _didProcessConfigurationFromNetwork:serverConfiguration appID:appID error:nil]; -} - -+ (FBSDKGraphRequest *)requestToLoadServerConfiguration:(NSString *)appID -{ - NSOperatingSystemVersion operatingSystemVersion = [FBSDKInternalUtility operatingSystemVersion]; - NSString *dialogFlowsField = [NSString stringWithFormat:@"%@.os_version(%ti.%ti.%ti)", - FBSDK_SERVER_CONFIGURATION_DIALOG_FLOWS_FIELD, - operatingSystemVersion.majorVersion, - operatingSystemVersion.minorVersion, - operatingSystemVersion.patchVersion]; - NSArray *fields = @[FBSDK_SERVER_CONFIGURATION_APP_EVENTS_FEATURES_FIELD, - FBSDK_SERVER_CONFIGURATION_APP_NAME_FIELD, - FBSDK_SERVER_CONFIGURATION_DEFAULT_SHARE_MODE_FIELD, - FBSDK_SERVER_CONFIGURATION_DIALOG_CONFIGS_FIELD, - dialogFlowsField, - FBSDK_SERVER_CONFIGURATION_ERROR_CONFIGURATION_FIELD, - FBSDK_SERVER_CONFIGURATION_IMPLICIT_LOGGING_ENABLED_FIELD, - FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_ENABLED_FIELD, - FBSDK_SERVER_CONFIGURATION_LOGIN_TOOLTIP_TEXT_FIELD, - FBSDK_SERVER_CONFIGURATION_NATIVE_PROXY_AUTH_FLOW_ENABLED_FIELD, - FBSDK_SERVER_CONFIGURATION_SYSTEM_AUTHENTICATION_ENABLED_FIELD, - FBSDK_SERVER_CONFIGURATION_SESSION_TIMEOUT_FIELD, - FBSDK_SERVER_CONFIGURATION_LOGGIN_TOKEN_FIELD -#if TARGET_OS_TV - ,FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_OPTIONS_FIELD, - FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_BOOKMARK_ICON_URL_FIELD, - FBSDK_SERVER_CONFIGURATION_SMART_LOGIN_MENU_ICON_URL_FIELD -#endif - ]; - NSDictionary *parameters = @{ @"fields": [fields componentsJoinedByString:@","] }; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:appID - parameters:parameters - tokenString:nil - HTTPMethod:nil - flags:FBSDKGraphRequestFlagSkipClientToken | FBSDKGraphRequestFlagDisableErrorRecovery]; - return request; -} - -#pragma mark - Helper Class Methods - -+ (FBSDKServerConfiguration *)_defaultServerConfigurationForAppID:(NSString *)appID -{ - // Use a default configuration while we do not have a configuration back from the server. This allows us to set - // the default values for any of the dialog sets or anything else in a centralized location while we are waiting for - // the server to respond. - static FBSDKServerConfiguration *_defaultServerConfiguration = nil; - if (![_defaultServerConfiguration.appID isEqualToString:appID]) { - // Bypass the native dialog flow for iOS 9+, as it produces a series of additional confirmation dialogs that lead to - // extra friction that is not desirable. - NSOperatingSystemVersion iOS9Version = { .majorVersion = 9, .minorVersion = 0, .patchVersion = 0 }; - BOOL useNativeFlow = ![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS9Version]; - // Also enable SFSafariViewController by default. - NSDictionary *dialogFlows = @{ - FBSDKDialogConfigurationNameDefault: @{ - FBSDKDialogConfigurationFeatureUseNativeFlow: @(useNativeFlow), - FBSDKDialogConfigurationFeatureUseSafariViewController: @YES, - }, - FBSDKDialogConfigurationNameMessage: @{ - FBSDKDialogConfigurationFeatureUseNativeFlow: @YES, - }, - }; - _defaultServerConfiguration = [[FBSDKServerConfiguration alloc] initWithAppID:appID - appName:nil - loginTooltipEnabled:NO - loginTooltipText:nil - defaultShareMode:nil - advertisingIDEnabled:NO - implicitLoggingEnabled:NO - implicitPurchaseLoggingEnabled:NO - appIndexingTriggerEnabled:NO - systemAuthenticationEnabled:NO - nativeAuthFlowEnabled:NO - dialogConfigurations:nil - dialogFlows:dialogFlows - timestamp:nil - errorConfiguration:nil - sessionTimeoutInterval:DEFAULT_SESSION_TIMEOUT_INTERVAL - defaults:YES - loggingToken:nil - smartLoginOptions:FBSDKServerConfigurationSmartLoginOptionsUnknown - smartLoginBookmarkIconURL:nil - smartLoginMenuIconURL:nil - ]; - } - return _defaultServerConfiguration; -} - -+ (void)_didProcessConfigurationFromNetwork:(FBSDKServerConfiguration *)serverConfiguration - appID:(NSString *)appID - error:(NSError *)error -{ - NSMutableArray *completionBlocks = [[NSMutableArray alloc] init]; - @synchronized(self) { - if (error) { - // Only set the error if we don't have previously fetched app settings. - // (i.e., if we have app settings and a new call gets an error, we'll - // ignore the error and surface the last successfully fetched settings). - if (_serverConfiguration && [_serverConfiguration.appID isEqualToString:appID]) { - // We have older app settings but the refresh received an error. - // Log and ignore the error. - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorInformational - formatString:@"loadServerConfigurationWithCompletionBlock failed with %@", error]; - } else { - _serverConfiguration = nil; - } - _serverConfigurationError = error; - _serverConfigurationErrorTimestamp = [NSDate date]; - } else { - _serverConfiguration = serverConfiguration; - _serverConfigurationError = nil; - _serverConfigurationErrorTimestamp = nil; - } - - // update the cached copy in NSUserDefaults - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *defaultsKey = [NSString stringWithFormat:FBSDK_SERVER_CONFIGURATION_USER_DEFAULTS_KEY, appID]; - if (serverConfiguration) { - NSData *data = [NSKeyedArchiver archivedDataWithRootObject:serverConfiguration]; - [defaults setObject:data forKey:defaultsKey]; - } - - // wrap the completion blocks - for (FBSDKServerConfigurationManagerLoadBlock completionBlock in _completionBlocks) { - [completionBlocks addObject:[self _wrapperBlockForLoadBlock:completionBlock]]; - } - [_completionBlocks removeAllObjects]; - _loadingServerConfiguration = NO; - } - - // release the lock before calling out of this class - for (void (^completionBlock)(void) in completionBlocks) { - completionBlock(); - } -} - -+ (NSDictionary *)_parseDialogConfigurations:(NSDictionary *)dictionary -{ - NSMutableDictionary *dialogConfigurations = [[NSMutableDictionary alloc] init]; - NSArray *dialogConfigurationsArray = [FBSDKTypeUtility arrayValue:dictionary[@"data"]]; - for (id dialogConfiguration in dialogConfigurationsArray) { - NSDictionary *dialogConfigurationDictionary = [FBSDKTypeUtility dictionaryValue:dialogConfiguration]; - if (dialogConfigurationDictionary) { - NSString *name = [FBSDKTypeUtility stringValue:dialogConfigurationDictionary[@"name"]]; - if ([name length]) { - NSURL *URL = [FBSDKTypeUtility URLValue:dialogConfigurationDictionary[@"url"]]; - NSArray *appVersions = [FBSDKTypeUtility arrayValue:dialogConfigurationDictionary[@"versions"]]; - dialogConfigurations[name] = [[FBSDKDialogConfiguration alloc] initWithName:name - URL:URL - appVersions:appVersions]; - } - } - } - return dialogConfigurations; -} - -+ (BOOL)_serverConfigurationTimestampIsValid:(NSDate *)timestamp -{ - return ([[NSDate date] timeIntervalSinceDate:timestamp] < FBSDK_SERVER_CONFIGURATION_MANAGER_CACHE_TIMEOUT); -} - -+ (void(^)(void))_wrapperBlockForLoadBlock:(FBSDKServerConfigurationManagerLoadBlock)loadBlock -{ - if (loadBlock == NULL) { - return NULL; - } - - // create local vars to capture the current values from the ivars to allow this wrapper to be called outside of a lock - FBSDKServerConfiguration *serverConfiguration; - NSError *serverConfigurationError; - @synchronized(self) { - serverConfiguration = _serverConfiguration; - serverConfigurationError = _serverConfigurationError; - } - return ^{ - loadBlock(serverConfiguration, serverConfigurationError); - }; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - return nil; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h deleted file mode 100644 index 0d7a49290..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKAccessTokenCaching.h" - -@interface FBSDKAccessTokenCache : NSObject - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.m deleted file mode 100644 index aeb110345..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.m +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAccessTokenCache.h" - -#import "FBSDKAccessTokenCacheV3.h" -#import "FBSDKAccessTokenCacheV3_17.h" -#import "FBSDKAccessTokenCacheV3_21.h" -#import "FBSDKAccessTokenCacheV4.h" - -static BOOL g_tryDeprecatedCaches = YES; - -@implementation FBSDKAccessTokenCache - -- (FBSDKAccessToken*)fetchAccessToken -{ - FBSDKAccessToken *token = [[[FBSDKAccessTokenCacheV4 alloc] init] fetchAccessToken]; - if (token || !g_tryDeprecatedCaches) { - return token; - } - - g_tryDeprecatedCaches = NO; - NSArray *oldCacheClasses = [[self class] deprecatedCacheClasses]; - __block FBSDKAccessToken *oldToken = nil; - [oldCacheClasses enumerateObjectsUsingBlock:^(Class obj, NSUInteger idx, BOOL *stop) { - id cache = [[obj alloc] init]; - oldToken = [cache fetchAccessToken]; - if (oldToken) { - *stop = YES; - [cache clearCache]; - } - }]; - if (oldToken) { - [self cacheAccessToken:oldToken]; - } - return oldToken; -} - -- (void)cacheAccessToken:(FBSDKAccessToken *)token -{ - [[[FBSDKAccessTokenCacheV4 alloc] init] cacheAccessToken:token]; - if (g_tryDeprecatedCaches) { - g_tryDeprecatedCaches = NO; - NSArray *oldCacheClasses = [[self class] deprecatedCacheClasses]; - [oldCacheClasses enumerateObjectsUsingBlock:^(Class obj, NSUInteger idx, BOOL *stop) { - id cache = [[obj alloc] init]; - [cache clearCache]; - }]; - } -} - -- (void)clearCache -{ - [[[FBSDKAccessTokenCacheV4 alloc] init] clearCache]; -} - -// used by FBSDKAccessTokenCacheIntegrationTests -+ (void)resetV3CacheChecks -{ - g_tryDeprecatedCaches = YES; -} - -+ (NSArray *)deprecatedCacheClasses -{ - return @[ [FBSDKAccessTokenCacheV3_21 class], [FBSDKAccessTokenCacheV3_17 class], [FBSDKAccessTokenCacheV3 class]]; -} -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h deleted file mode 100644 index 28134a0e4..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKAccessTokenCaching.h" -#import "FBSDKMacros.h" - -FBSDK_EXTERN NSString *const FBSDKTokenInformationUUIDKey; - -@interface FBSDKAccessTokenCacheV3 : NSObject - -+ (FBSDKAccessToken *)accessTokenForV3Dictionary:(NSDictionary *)dictionary; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.m deleted file mode 100644 index 356a1a6cd..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.m +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAccessTokenCacheV3.h" - -#import "FBSDKAccessToken.h" -#import "FBSDKSettings.h" -#import "FBSDKTypeUtility.h" - -NSString *const FBSDKTokenInformationUUIDKey = @"com.facebook.sdk:TokenInformationUUIDKey"; - -#define FBSDK_TOKEN_INFORMATION_TOKEN_KEY @"com.facebook.sdk:TokenInformationTokenKey" -#define FBSDK_TOKEN_INFORMATION_EXPIRATION_DATE_KEY @"com.facebook.sdk:TokenInformationExpirationDateKey" -#define FBSDK_TOKEN_INFORMATION_USER_FBID_KEY @"com.facebook.sdk:TokenInformationUserFBIDKey" -#define FBSDK_TOKEN_INFORMATION_PERMISSIONS_KEY @"com.facebook.sdk:TokenInformationPermissionsKey" -#define FBSDK_TOKEN_INFORMATION_DECLINED_PERMISSIONS_KEY @"com.facebook.sdk:TokenInformationDeclinedPermissionsKey" -#define FBSDK_TOKEN_INFORMATION_APP_ID_KEY @"com.facebook.sdk:TokenInformationAppIDKey" -#define FBSDK_TOKEN_INFORMATION_REFRESH_DATE_KEY @"com.facebook.sdk:TokenInformationRefreshDateKey" - - -@implementation FBSDKAccessTokenCacheV3 - -- (FBSDKAccessToken *)fetchAccessToken -{ - // Check NSUserDefaults ( <= v3.16 ) - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSDictionary *tokenDictionary = [defaults objectForKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName]]; - return [[self class] accessTokenForV3Dictionary:tokenDictionary]; -} - -- (void)clearCache -{ - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - [defaults removeObjectForKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName]]; - [defaults synchronize]; -} - -- (void)cacheAccessToken:(FBSDKAccessToken *)token -{ - //no-op. - NSAssert(NO, @"deprecated cache FBSDKAccessTokenCacheV3 should not be used to cache a token"); -} - -+ (FBSDKAccessToken *)accessTokenForV3Dictionary:(NSDictionary *)dictionary -{ - NSString *tokenString = [FBSDKTypeUtility stringValue:dictionary[FBSDK_TOKEN_INFORMATION_TOKEN_KEY]]; - if (tokenString.length > 0) { - NSDate *expirationDate = dictionary[FBSDK_TOKEN_INFORMATION_EXPIRATION_DATE_KEY]; - // Note we default to valid in cases where expiration date is missing. - BOOL isExpired = ([expirationDate compare:[NSDate date]] == NSOrderedAscending); - if (isExpired) { - return nil; - } - return [[FBSDKAccessToken alloc] initWithTokenString:tokenString - permissions:dictionary[FBSDK_TOKEN_INFORMATION_PERMISSIONS_KEY] - declinedPermissions:dictionary[FBSDK_TOKEN_INFORMATION_DECLINED_PERMISSIONS_KEY] - appID:dictionary[FBSDK_TOKEN_INFORMATION_APP_ID_KEY] - userID:dictionary[FBSDK_TOKEN_INFORMATION_USER_FBID_KEY] - expirationDate:expirationDate - refreshDate:dictionary[FBSDK_TOKEN_INFORMATION_REFRESH_DATE_KEY]]; - } - return nil; -} -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h deleted file mode 100644 index 7f486f357..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKAccessTokenCaching.h" - -@interface FBSDKAccessTokenCacheV3_17 : NSObject - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.m deleted file mode 100644 index 18626e50d..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.m +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAccessTokenCacheV3_17.h" - -#import "FBSDKAccessToken.h" -#import "FBSDKAccessTokenCacheV3.h" -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKKeychainStoreViaBundleID.h" -#import "FBSDKSettings.h" - -@implementation FBSDKAccessTokenCacheV3_17 -{ - FBSDKKeychainStoreViaBundleID *_keychainStore; -} - -- (instancetype)init -{ - if ((self = [super init])) { - _keychainStore = [[FBSDKKeychainStoreViaBundleID alloc] init]; - } - return self; -} -- (FBSDKAccessToken *)fetchAccessToken -{ - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *uuidKey = [[FBSDKSettings legacyUserDefaultTokenInformationKeyName] stringByAppendingString:@"UUID"]; - NSString *uuid = [defaults objectForKey:uuidKey]; - NSDictionary *tokenDictionary = [_keychainStore dictionaryForKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName]]; - if (![tokenDictionary[FBSDKTokenInformationUUIDKey] isEqualToString:uuid]) { - [self clearCache]; - } - - return [FBSDKAccessTokenCacheV3 accessTokenForV3Dictionary:tokenDictionary]; -} - -- (void)clearCache -{ - [_keychainStore setDictionary:nil forKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName] accessibility:nil]; -} - -- (void)cacheAccessToken:(FBSDKAccessToken *)token -{ - //no-op. - NSAssert(NO, @"deprecated cache FBSDKAccessTokenCacheV3_17 should not be used to cache a token"); -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h deleted file mode 100644 index da1ac64df..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKAccessTokenCaching.h" - -@interface FBSDKAccessTokenCacheV3_21 : NSObject - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.m deleted file mode 100644 index 845138b08..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.m +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAccessTokenCacheV3_21.h" - -#import "FBSDKAccessToken.h" -#import "FBSDKAccessTokenCacheV3.h" -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKKeychainStore.h" -#import "FBSDKSettings.h" - -@implementation FBSDKAccessTokenCacheV3_21 -{ - FBSDKKeychainStore *_keychainStore; -} - -- (instancetype)init -{ - if ((self = [super init])) { - NSString *keyChainServiceIdentifier = [NSString stringWithFormat:@"com.facebook.sdk.tokencache.%@", [[NSBundle mainBundle] bundleIdentifier]]; - _keychainStore = [[FBSDKKeychainStore alloc] initWithService:keyChainServiceIdentifier accessGroup:nil]; - } - return self; -} - -- (FBSDKAccessToken *)fetchAccessToken -{ - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *uuidKey = [[FBSDKSettings legacyUserDefaultTokenInformationKeyName] stringByAppendingString:@"UUID"]; - NSString *uuid = [defaults objectForKey:uuidKey]; - NSDictionary *tokenDictionary = [_keychainStore dictionaryForKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName]]; - if (![tokenDictionary[FBSDKTokenInformationUUIDKey] isEqualToString:uuid]) { - [self clearCache]; - } - - return [FBSDKAccessTokenCacheV3 accessTokenForV3Dictionary:tokenDictionary]; -} - -- (void)clearCache -{ - [_keychainStore setDictionary:nil forKey:[FBSDKSettings legacyUserDefaultTokenInformationKeyName] accessibility:nil]; -} - -- (void)cacheAccessToken:(FBSDKAccessToken *)token -{ - //no-op. - NSAssert(NO, @"deprecated cache FBSDKAccessTokenCacheV3_21 should not be used to cache a token"); -} - - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h deleted file mode 100644 index 7fa7d7f04..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKAccessToken.h" -#import "FBSDKAccessTokenCaching.h" - -@interface FBSDKAccessTokenCacheV4 : NSObject - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.m deleted file mode 100644 index 05aea0a34..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.m +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAccessTokenCacheV4.h" - -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKKeychainStore.h" - -static NSString *const kFBSDKAccessTokenUserDefaultsKey = @"com.facebook.sdk.v4.FBSDKAccessTokenInformationKey"; -static NSString *const kFBSDKAccessTokenKeychainKey = @"com.facebook.sdk.v4.FBSDKAccessTokenInformationKeychainKey"; -static NSString *const kFBSDKAccessTokenUUIDKey = @"tokenUUID"; -static NSString *const kFBSDKAccessTokenEncodedKey = @"tokenEncoded"; - -@implementation FBSDKAccessTokenCacheV4 -{ - FBSDKKeychainStore *_keychainStore; -} - -- (instancetype)init -{ - if ((self = [super init])) { - NSString *keyChainServiceIdentifier = [NSString stringWithFormat:@"com.facebook.sdk.tokencache.%@", [[NSBundle mainBundle] bundleIdentifier]]; - _keychainStore = [[FBSDKKeychainStore alloc] initWithService:keyChainServiceIdentifier accessGroup:nil]; - } - return self; -} - -- (FBSDKAccessToken *)fetchAccessToken -{ - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *uuid = [defaults objectForKey:kFBSDKAccessTokenUserDefaultsKey]; - - NSDictionary *dict = [_keychainStore dictionaryForKey:kFBSDKAccessTokenKeychainKey]; - if ([dict[kFBSDKAccessTokenUUIDKey] isKindOfClass:[NSString class]]) { - // there is a bug while running on simulator that the uuid stored in dict can be NSData, - // do a type check to make sure it is NSString - if ([dict[kFBSDKAccessTokenUUIDKey] isEqualToString:uuid]) { - id tokenData = dict[kFBSDKAccessTokenEncodedKey]; - if ([tokenData isKindOfClass:[NSData class]]) { - return [NSKeyedUnarchiver unarchiveObjectWithData:tokenData]; - } - } - } - // if the uuid doesn't match (including if there is no uuid in defaults which means uninstalled case) - // clear the keychain and return nil. - [self clearCache]; - return nil; -} - -- (void)cacheAccessToken:(FBSDKAccessToken *)token -{ - if (!token) { - [self clearCache]; - return; - } - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *uuid = [defaults objectForKey:kFBSDKAccessTokenUserDefaultsKey]; - if (!uuid) { - uuid = [[NSUUID UUID] UUIDString]; - [defaults setObject:uuid forKey:kFBSDKAccessTokenUserDefaultsKey]; - [defaults synchronize]; - } - NSData *tokenData = [NSKeyedArchiver archivedDataWithRootObject:token]; - NSDictionary *dict = @{ - kFBSDKAccessTokenUUIDKey : uuid, - kFBSDKAccessTokenEncodedKey : tokenData - }; - - [_keychainStore setDictionary:dict - forKey:kFBSDKAccessTokenKeychainKey - accessibility:[FBSDKDynamicFrameworkLoader loadkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly]]; -} - -- (void)clearCache -{ - [_keychainStore setDictionary:nil - forKey:kFBSDKAccessTokenKeychainKey - accessibility:NULL]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - [defaults removeObjectForKey:kFBSDKAccessTokenUserDefaultsKey]; - [defaults synchronize]; -} -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h deleted file mode 100644 index 856224502..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKAccessToken; - -@protocol FBSDKAccessTokenCaching - -- (FBSDKAccessToken *)fetchAccessToken; - -- (void)cacheAccessToken:(FBSDKAccessToken *)token; - -- (void)clearCache; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h deleted file mode 100644 index f6036357b..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKKeychainStore : NSObject - -@property (nonatomic, readonly, copy) NSString *service; -@property (nonatomic, readonly, copy) NSString *accessGroup; - -- (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup NS_DESIGNATED_INITIALIZER; - -- (BOOL)setDictionary:(NSDictionary *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; -- (NSDictionary *)dictionaryForKey:(NSString *)key; - -- (BOOL)setString:(NSString *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; -- (NSString *)stringForKey:(NSString *)key; - -- (BOOL)setData:(NSData *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility; -- (NSData *)dataForKey:(NSString *)key; - -// hook for subclasses to override keychain query construction. -- (NSMutableDictionary *)queryForKey:(NSString *)key; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.m deleted file mode 100644 index 11ab73ebf..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.m +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Contains code from UICKeyChainStore - * - * Copyright (c) 2011 kishikawa katsumi - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#import "FBSDKKeychainStore.h" - -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKMacros.h" - -@implementation FBSDKKeychainStore - -- (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup -{ - if ((self = [super init])) { - _service = service ? [service copy] : [[NSBundle mainBundle] bundleIdentifier]; - _accessGroup = [accessGroup copy]; - NSAssert(_service, @"Keychain must be initialized with service"); - } - - return self; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithService:accessGroup:); - return [self initWithService:nil accessGroup:nil]; -} - -- (BOOL)setDictionary:(NSDictionary *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility -{ - NSData *data = value == nil ? nil : [NSKeyedArchiver archivedDataWithRootObject:value]; - return [self setData:data forKey:key accessibility:accessibility]; -} - -- (NSDictionary *)dictionaryForKey:(NSString *)key -{ - NSData *data = [self dataForKey:key]; - if (!data) { - return nil; - } - - NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; - if (![dict isKindOfClass:[NSDictionary class]]) { - return nil; - } - - return dict; -} - -- (BOOL)setString:(NSString *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility -{ - NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding]; - return [self setData:data forKey:key accessibility:accessibility]; -} - -- (NSString *)stringForKey:(NSString *)key -{ - NSData *data = [self dataForKey:key]; - if (!data) { - return nil; - } - - return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; -} - -- (BOOL)setData:(NSData *)value forKey:(NSString *)key accessibility:(CFTypeRef)accessibility -{ - if (!key) { - return NO; - } - -#if TARGET_OS_SIMULATOR - NSLog(@"Falling back to storing access token in NSUserDefaults because of simulator bug"); - [[NSUserDefaults standardUserDefaults] setObject:value forKey:key]; - - return [[NSUserDefaults standardUserDefaults] synchronize]; -#else - NSMutableDictionary *query = [self queryForKey:key]; - - OSStatus status; - if (value) { - NSMutableDictionary *attributesToUpdate = [NSMutableDictionary dictionary]; - [attributesToUpdate setObject:value forKey:[FBSDKDynamicFrameworkLoader loadkSecValueData]]; - - status = fbsdkdfl_SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)attributesToUpdate); - if (status == errSecItemNotFound) { -#if TARGET_OS_IPHONE || (defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9) - if (accessibility) { - [query setObject:(__bridge id)(accessibility) forKey:[FBSDKDynamicFrameworkLoader loadkSecAttrAccessible]]; - } -#endif - [query setObject:value forKey:[FBSDKDynamicFrameworkLoader loadkSecValueData]]; - - status = fbsdkdfl_SecItemAdd((__bridge CFDictionaryRef)query, NULL); - } - } else { - status = fbsdkdfl_SecItemDelete((__bridge CFDictionaryRef)query); - if (status == errSecItemNotFound) { - status = errSecSuccess; - } - } - - return (status == errSecSuccess); -#endif -} - -- (NSData *)dataForKey:(NSString *)key -{ - if (!key) { - return nil; - } - -#if TARGET_OS_SIMULATOR - NSLog(@"Falling back to loading access token from NSUserDefaults because of simulator bug"); - return [[NSUserDefaults standardUserDefaults] dataForKey:key]; -#else - NSMutableDictionary *query = [self queryForKey:key]; - [query setObject:(id)kCFBooleanTrue forKey:[FBSDKDynamicFrameworkLoader loadkSecReturnData]]; - [query setObject:[FBSDKDynamicFrameworkLoader loadkSecMatchLimitOne] forKey:[FBSDKDynamicFrameworkLoader loadkSecMatchLimit]]; - - CFTypeRef data = nil; - OSStatus status = fbsdkdfl_SecItemCopyMatching((__bridge CFDictionaryRef)query, &data); - if (status != errSecSuccess) { - return nil; - } - - if (!data || CFGetTypeID(data) != CFDataGetTypeID()) { - return nil; - } - - NSData *ret = [NSData dataWithData:(__bridge NSData *)(data)]; - CFRelease(data); - - return ret; -#endif -} - -- (NSMutableDictionary *)queryForKey:(NSString *)key -{ - NSMutableDictionary *query = [NSMutableDictionary dictionary]; - [query setObject:[FBSDKDynamicFrameworkLoader loadkSecClassGenericPassword] forKey:[FBSDKDynamicFrameworkLoader loadkSecClass]]; - [query setObject:_service forKey:[FBSDKDynamicFrameworkLoader loadkSecAttrService]]; - [query setObject:key forKey:[FBSDKDynamicFrameworkLoader loadkSecAttrAccount]]; -#if !TARGET_IPHONE_SIMULATOR - if (_accessGroup) { - [query setObject:_accessGroup forKey:[FBSDKDynamicFrameworkLoader loadkSecAttrAccessGroup]]; - } -#endif - - return query; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h deleted file mode 100644 index 0a0fb86bc..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKKeychainStore.h" - -// This is the keychainstore defined in 3.17 that incorrectly used the bundle id as the service id -// and should NOT be used outside of this cache. -@interface FBSDKKeychainStoreViaBundleID : FBSDKKeychainStore - -// since this subclass represents the old keychainstore behavior, -// the designated initializer is just the `init`. -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.m deleted file mode 100644 index d36335ced..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.m +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKKeychainStoreViaBundleID.h" - -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKInternalUtility.h" - -@implementation FBSDKKeychainStoreViaBundleID - -- (instancetype)init -{ - return [super initWithService:[[NSBundle mainBundle] bundleIdentifier] accessGroup:nil]; -} - -- (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup -{ - return [self init]; -} - -- (NSMutableDictionary*)queryForKey:(NSString *)key -{ - NSMutableDictionary *query = [NSMutableDictionary dictionary]; - query[(__bridge id)[FBSDKDynamicFrameworkLoader loadkSecClass]] = (__bridge id)([FBSDKDynamicFrameworkLoader loadkSecClassGenericPassword]); - query[(__bridge id)[FBSDKDynamicFrameworkLoader loadkSecAttrService]] = self.service; - query[(__bridge id)[FBSDKDynamicFrameworkLoader loadkSecAttrGeneric]] = key; - -#if !TARGET_IPHONE_SIMULATOR - [FBSDKInternalUtility dictionary:query setObject:self.accessGroup forKey:[FBSDKDynamicFrameworkLoader loadkSecAttrAccessGroup]]; -#endif - - return query; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h deleted file mode 100644 index 17e0c65ac..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKIcon.h" - -@protocol FBSDKButtonImpressionTracking - -- (NSDictionary *)analyticsParameters; -- (NSString *)impressionTrackingEventName; -- (NSString *)impressionTrackingIdentifier; - -@end - -@interface FBSDKButton () - -- (void)logTapEventWithEventName:(NSString *)eventName - parameters:(NSDictionary *)parameters; -- (void)checkImplicitlyDisabled; -- (void)configureButton; -- (void)configureWithIcon:(FBSDKIcon *)icon - title:(NSString *)title - backgroundColor:(UIColor *)backgroundColor - highlightedColor:(UIColor *)highlightedColor; -- (void)configureWithIcon:(FBSDKIcon *)icon - title:(NSString *)title - backgroundColor:(UIColor *)backgroundColor - highlightedColor:(UIColor *)highlightedColor - selectedTitle:(NSString *)selectedTitle - selectedIcon:(FBSDKIcon *)selectedIcon - selectedColor:(UIColor *)selectedColor - selectedHighlightedColor:(UIColor *)selectedHighlightedColor; -- (UIColor *)defaultBackgroundColor; -- (UIColor *)defaultDisabledColor; -- (UIFont *)defaultFont; -- (UIColor *)defaultHighlightedColor; -- (FBSDKIcon *)defaultIcon; -- (UIColor *)defaultSelectedColor; -- (BOOL)isImplicitlyDisabled; -- (CGSize)sizeThatFits:(CGSize)size title:(NSString *)title; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h deleted file mode 100644 index ec55385a7..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKCloseIcon : NSObject - -- (UIImage *)imageWithSize:(CGSize)size; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.m deleted file mode 100644 index 1bbb74649..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.m +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKCloseIcon.h" - -#import "FBSDKMacros.h" - -@implementation FBSDKCloseIcon - -#pragma mark - Public API - -- (UIImage *)imageWithSize:(CGSize)size -{ - CGFloat scale = [UIScreen mainScreen].scale; - UIGraphicsBeginImageContextWithOptions(size, NO, scale); - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGFloat iconSize = MIN(size.width, size.height); - - CGRect rect = CGRectMake((size.width - iconSize) / 2, (size.height - iconSize) / 2, iconSize, iconSize); - CGFloat step = iconSize / 12; - - // shadow - rect = CGRectIntegral(CGRectInset(rect, step, step)); - NSArray *colors = @[ - (__bridge id)[UIColor colorWithWhite:0.0 alpha:0.7].CGColor, - (__bridge id)[UIColor colorWithWhite:0.0 alpha:0.3].CGColor, - (__bridge id)[UIColor colorWithWhite:0.0 alpha:0.1].CGColor, - (__bridge id)[UIColor colorWithWhite:0.0 alpha:0.0].CGColor, - ]; - CGFloat locations[4] = { - 0.70, - 0.80, - 0.90, - 1.0, - }; - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); - CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations); - CGColorSpaceRelease(colorSpace); - CGPoint center = CGPointMake(CGRectGetMidX(rect) - step / 6, CGRectGetMidY(rect) + step / 4); - CGContextDrawRadialGradient(context, gradient, center, 0.0, center, (CGRectGetWidth(rect) - step / 2) / 2, 0); - CGGradientRelease(gradient); - - // outer circle - rect = CGRectIntegral(CGRectInset(rect, step, step)); - [[UIColor whiteColor] setFill]; - CGContextFillEllipseInRect(context, rect); - - // inner circle - rect = CGRectIntegral(CGRectInset(rect, step, step)); - [[UIColor blackColor] setFill]; - CGContextFillEllipseInRect(context, rect); - - // cross - rect = CGRectIntegral(CGRectInset(rect, step, step)); - CGFloat lineWidth = step * 5 / 4; - rect.origin.y = CGRectGetMidY(rect) - lineWidth / 2; - rect.size.height = lineWidth; - [[UIColor whiteColor] setFill]; - CGContextTranslateCTM(context, size.width / 2, size.height / 2); - CGContextRotateCTM(context, M_PI_4); - CGContextTranslateCTM(context, -size.width / 2, -size.height / 2); - CGContextFillRect(context, rect); - CGContextTranslateCTM(context, size.width / 2, size.height / 2); - CGContextRotateCTM(context, M_PI_2); - CGContextTranslateCTM(context, -size.width / 2, -size.height / 2); - CGContextFillRect(context, rect); - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - return image; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h deleted file mode 100644 index 54825b607..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -UIColor *FBSDKUIColorWithRGBA(uint8_t r, uint8_t g, uint8_t b, CGFloat a); -UIColor *FBSDKUIColorWithRGB(uint8_t r, uint8_t g, uint8_t b); diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.m deleted file mode 100644 index 71b3d80e8..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.m +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKColor.h" - -static const CGFloat kFBRGBMax = 255.0; - -UIColor *FBSDKUIColorWithRGBA(uint8_t r, uint8_t g, uint8_t b, CGFloat a) -{ - return [UIColor colorWithRed:(r / kFBRGBMax) green:(g / kFBRGBMax) blue:(b / kFBRGBMax) alpha:a]; -} - -UIColor *FBSDKUIColorWithRGB(uint8_t r, uint8_t g, uint8_t b) -{ - return FBSDKUIColorWithRGBA(r, g, b, 1.0); -} diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h deleted file mode 100644 index 5be344554..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKIcon : NSObject - -- (instancetype)initWithColor:(UIColor *)color NS_DESIGNATED_INITIALIZER; - -@property (nonatomic, strong, readonly) UIColor *color; - -- (UIImage *)imageWithSize:(CGSize)size; - -- (CGPathRef)pathWithSize:(CGSize)size; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.m deleted file mode 100644 index 06b778efb..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.m +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKIcon.h" - -#import "FBSDKMacros.h" - -@implementation FBSDKIcon - -#pragma mark - Object Lifecycle - -- (instancetype)initWithColor:(UIColor *)color -{ - if ((self = [super init])) { - _color = [color copy]; - } - return self; -} - -- (instancetype)init -{ - return [self initWithColor:[UIColor whiteColor]]; -} - -#pragma mark - Public API - -- (UIImage *)imageWithSize:(CGSize)size -{ - if ((size.width == 0) || (size.height == 0)) { - return nil; - } - CGFloat scale = [UIScreen mainScreen].scale; - UIGraphicsBeginImageContextWithOptions(size, NO, scale); - CGContextRef context = UIGraphicsGetCurrentContext(); - CGPathRef path = [self pathWithSize:size]; - CGContextAddPath(context, path); - CGContextSetFillColorWithColor(context, self.color.CGColor); - CGContextFillPath(context); - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - return image; -} - -- (CGPathRef)pathWithSize:(CGSize)size -{ - return NULL; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h deleted file mode 100644 index 76affe680..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKIcon.h" - -@interface FBSDKLogo : FBSDKIcon - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.m deleted file mode 100644 index 47d0dc465..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.m +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLogo.h" - -@implementation FBSDKLogo - -- (CGPathRef)pathWithSize:(CGSize)size -{ - CGAffineTransform transformValue = CGAffineTransformMakeScale(size.width / 136.0, size.height / 136.0); - const CGAffineTransform *transform = &transformValue; - CGMutablePathRef path = CGPathCreateMutable(); - CGPathMoveToPoint(path, transform, 127.856, 0.676); - CGPathAddLineToPoint(path, transform, 7.469, 0.676); - CGPathAddCurveToPoint(path, transform, 3.344, 0.676, 0.0, 4.02, 0.0, 8.145); - CGPathAddLineToPoint(path, transform, 0.0, 128.531); - CGPathAddCurveToPoint(path, transform, 0.0, 132.656, 3.344, 136.0, 7.469, 136.0); - CGPathAddLineToPoint(path, transform, 72.282, 136.0); - CGPathAddLineToPoint(path, transform, 72.282, 83.596); - CGPathAddLineToPoint(path, transform, 54.646, 83.596); - CGPathAddLineToPoint(path, transform, 54.646, 63.173); - CGPathAddLineToPoint(path, transform, 72.282, 63.173); - CGPathAddLineToPoint(path, transform, 72.282, 48.112); - CGPathAddCurveToPoint(path, transform, 72.282, 30.633, 82.957, 21.116, 98.549, 21.116); - CGPathAddCurveToPoint(path, transform, 106.018, 21.116, 112.438, 21.671, 114.309, 21.92); - CGPathAddLineToPoint(path, transform, 114.309, 40.187); - CGPathAddLineToPoint(path, transform, 103.495, 40.191); - CGPathAddCurveToPoint(path, transform, 95.014, 40.191, 93.372, 44.221, 93.372, 50.133); - CGPathAddLineToPoint(path, transform, 93.372, 63.173); - CGPathAddLineToPoint(path, transform, 113.596, 63.173); - CGPathAddLineToPoint(path, transform, 110.963, 83.596); - CGPathAddLineToPoint(path, transform, 93.372, 83.596); - CGPathAddLineToPoint(path, transform, 93.372, 136.0); - CGPathAddLineToPoint(path, transform, 127.856, 136.0); - CGPathAddCurveToPoint(path, transform, 131.981, 136.0, 135.325, 132.656, 135.325, 128.531); - CGPathAddLineToPoint(path, transform, 135.325, 8.145); - CGPathAddCurveToPoint(path, transform, 135.325, 4.02, 131.981, 0.676, 127.856, 0.676); - CGPathCloseSubpath(path); - CGPathRef result = CGPathCreateCopy(path); - CGPathRelease(path); - return CFAutorelease(result); -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h deleted file mode 100644 index 1a4479740..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKIcon.h" - -@interface FBSDKMaleSilhouetteIcon : FBSDKIcon - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.m deleted file mode 100644 index 6e0e1ede8..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.m +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKMaleSilhouetteIcon.h" - -@implementation FBSDKMaleSilhouetteIcon - -- (CGPathRef)pathWithSize:(CGSize)size -{ - CGAffineTransform transformValue = CGAffineTransformMakeScale(size.width / 158.783, size.height / 158.783); - CGAffineTransform *transform = &transformValue; - CGMutablePathRef path = CGPathCreateMutable(); - CGPathMoveToPoint(path, transform, 158.783, 158.783); - CGPathAddCurveToPoint(path, transform, 156.39, 131.441, 144.912, 136.964, 105.607, 117.32); - CGPathAddCurveToPoint(path, transform, 103.811, 113.941, 103.348, 108.8965, 103.013, 107.4781); - CGPathAddLineToPoint(path, transform, 100.434, 106.7803); - CGPathAddCurveToPoint(path, transform, 97.2363, 82.7701, 100.67, 101.5845, 106.006, 75.2188); - CGPathAddCurveToPoint(path, transform, 107.949, 76.2959, 108.268, 70.7417, 108.971, 66.5743); - CGPathAddCurveToPoint(path, transform, 109.673, 62.4068, 110.864, 58.9082, 107.139, 58.9082); - CGPathAddCurveToPoint(path, transform, 107.94, 42.7652, 110.299, 31.3848, 101.335, 23.3072); - CGPathAddCurveToPoint(path, transform, 92.3808, 15.23781, 87.874, 15.52349, 95.0483, 9.6036128); - CGPathAddCurveToPoint(path, transform, 91.2319, 8.892613, 70.2036, 12.01861, 57.4487, 23.3072); - CGPathAddCurveToPoint(path, transform, 48.4121, 31.3042, 50.8437, 42.7652, 51.6445, 58.9082); - CGPathAddCurveToPoint(path, transform, 47.9194, 58.9082, 49.1108, 62.4068, 49.813, 66.5743); - CGPathAddCurveToPoint(path, transform, 50.5156, 70.7417, 50.8349, 76.2959, 52.7778, 75.2188); - CGPathAddCurveToPoint(path, transform, 58.1138, 110.1135, 61.5478, 82.7701, 58.3501, 106.7803); - CGPathAddLineToPoint(path, transform, 55.7705, 107.4781); - CGPathAddCurveToPoint(path, transform, 55.4355, 108.8965, 54.9722, 113.941, 53.1767, 117.32); - CGPathAddCurveToPoint(path, transform, 13.8711, 136.964, 2.3945, 131.441, 0.0, 158.783); - CGPathAddLineToPoint(path, transform, 158.783, 158.783); - CGPathRef result = CGPathCreateCopy(path); - CGPathRelease(path); - return CFAutorelease(result); -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h deleted file mode 100644 index 2480616e5..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "../FBSDKMath.h" - -/** - Insets a CGSize with the insets in a UIEdgeInsets. - */ -FBSDK_STATIC_INLINE CGSize FBSDKEdgeInsetsInsetSize(CGSize size, UIEdgeInsets insets) -{ - CGRect rect = CGRectZero; - rect.size = size; - return UIEdgeInsetsInsetRect(rect, insets).size; -} - -/** - Outsets a CGSize with the insets in a UIEdgeInsets. - */ -FBSDK_STATIC_INLINE CGSize FBSDKEdgeInsetsOutsetSize(CGSize size, UIEdgeInsets insets) -{ - return CGSizeMake(insets.left + size.width + insets.right, - insets.top + size.height + insets.bottom); -} - -/** - Limits a CGFloat value, using the scale to limit to pixels (instead of points). - - - The limitFunction is frequention floorf, ceilf or roundf. If the scale is 2.0, - you may get back values of *.5 to correspond to pixels. - */ -typedef float (*FBSDKLimitFunctionType)(float); -FBSDK_STATIC_INLINE CGFloat FBSDKPointsForScreenPixels(FBSDKLimitFunctionType limitFunction, - CGFloat screenScale, - CGFloat pointValue) -{ - return limitFunction(pointValue * screenScale) / screenScale; -} - -FBSDK_STATIC_INLINE CGSize FBSDKTextSize(NSString *text, - UIFont *font, - CGSize constrainedSize, - NSLineBreakMode lineBreakMode) -{ - if (!text) { - return CGSizeZero; - } - - NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; - paragraphStyle.lineBreakMode = lineBreakMode; - NSDictionary *attributes = @{ - NSFontAttributeName: font, - NSParagraphStyleAttributeName: paragraphStyle, - }; - NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text attributes:attributes]; - CGSize size = [FBSDKMath ceilForSize:[attributedString boundingRectWithSize:constrainedSize - options:(NSStringDrawingUsesDeviceMetrics | - NSStringDrawingUsesLineFragmentOrigin | - NSStringDrawingUsesFontLeading) - context:NULL].size]; - return [FBSDKMath ceilForSize:size]; -} diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h deleted file mode 100644 index f280228c4..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKViewImpressionTracker : NSObject - -+ (instancetype)impressionTrackerWithEventName:(NSString *)eventName; - -@property (nonatomic, copy, readonly) NSString *eventName; - -- (void)logImpressionWithIdentifier:(NSString *)identifier parameters:(NSDictionary *)parameters; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.m deleted file mode 100644 index 4f95ad7be..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.m +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKViewImpressionTracker.h" - -#import "FBSDKAccessToken.h" -#import "FBSDKAppEvents+Internal.h" - -@implementation FBSDKViewImpressionTracker -{ - NSMutableSet *_trackedImpressions; -} - -#pragma mark - Class Methods - -+ (instancetype)impressionTrackerWithEventName:(NSString *)eventName -{ - static NSMutableDictionary *_impressionTrackers = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - _impressionTrackers = [[NSMutableDictionary alloc] init]; - }); - // Maintains a single instance of an impression tracker for each event name - FBSDKViewImpressionTracker *impressionTracker = _impressionTrackers[eventName]; - if (!impressionTracker) { - impressionTracker = [[self alloc] initWithEventName:eventName]; - _impressionTrackers[eventName] = impressionTracker; - } - return impressionTracker; -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithEventName:(NSString *)eventName -{ - if ((self = [super init])) { - _eventName = [eventName copy]; - _trackedImpressions = [[NSMutableSet alloc] init]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_applicationDidEnterBackgroundNotification:) - name:UIApplicationDidEnterBackgroundNotification - object:[UIApplication sharedApplication]]; - } - return self; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - Public API - -- (void)logImpressionWithIdentifier:(NSString *)identifier parameters:(NSDictionary *)parameters -{ - NSMutableDictionary *keys = [NSMutableDictionary dictionary]; - keys[@"__view_impression_identifier__"] = identifier; - [keys addEntriesFromDictionary:parameters]; - NSDictionary *impressionKey = [keys copy]; - // Ensure that each impression is only tracked once - if ([_trackedImpressions containsObject:impressionKey]) { - return; - } - [_trackedImpressions addObject:impressionKey]; - - [FBSDKAppEvents logImplicitEvent:self.eventName - valueToSum:nil - parameters:parameters - accessToken:[FBSDKAccessToken currentAccessToken]]; -} - -#pragma mark - Helper Methods - -- (void)_applicationDidEnterBackgroundNotification:(NSNotification *)notification -{ - // reset all tracked impressions when the app backgrounds so we will start tracking them again the next time they - // are triggered. - [_trackedImpressions removeAllObjects]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h deleted file mode 100644 index 84dcd6272..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@protocol FBSDKWebDialogDelegate; - -@interface FBSDKWebDialog : NSObject - -+ (instancetype)showWithName:(NSString *)name - parameters:(NSDictionary *)parameters - delegate:(id)delegate; - -@property (nonatomic, assign) BOOL deferVisibility; -@property (nonatomic, weak) id delegate; -@property (nonatomic, copy) NSString *name; -@property (nonatomic, copy) NSDictionary *parameters; - -- (BOOL)show; - -@end - -@protocol FBSDKWebDialogDelegate - -- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results; -- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error; -- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.m deleted file mode 100644 index 74cb64b13..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.m +++ /dev/null @@ -1,336 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKWebDialog.h" - -#import "FBSDKAccessToken.h" -#import "FBSDKDynamicFrameworkLoader.h" -#import "FBSDKInternalUtility.h" -#import "FBSDKLogger.h" -#import "FBSDKSettings.h" -#import "FBSDKTypeUtility.h" -#import "FBSDKWebDialogView.h" - -#define FBSDK_WEB_DIALOG_SHOW_ANIMATION_DURATION 0.2 -#define FBSDK_WEB_DIALOG_DISMISS_ANIMATION_DURATION 0.3 - -static FBSDKWebDialog *g_currentDialog = nil; - -@interface FBSDKWebDialog () -@end - -@implementation FBSDKWebDialog -{ - UIView *_backgroundView; - FBSDKWebDialogView *_dialogView; -} - -#pragma mark - Class Methods - -+ (instancetype)showWithName:(NSString *)name - parameters:(NSDictionary *)parameters - delegate:(id)delegate -{ - FBSDKWebDialog *dialog = [[self alloc] init]; - dialog.name = name; - dialog.parameters = parameters; - dialog.delegate = delegate; - [dialog show]; - return dialog; -} - -#pragma mark - Object Lifecycle - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; - _dialogView.delegate = nil; - [_dialogView removeFromSuperview]; - [_backgroundView removeFromSuperview]; -} - -#pragma mark - Public Methods - -- (BOOL)show -{ - if (g_currentDialog == self) { - return NO; - } - [g_currentDialog _dismissAnimated:YES]; - - NSError *error; - NSURL *URL = [self _generateURL:&error]; - if (!URL) { - [self _failWithError:error]; - return NO; - } - - g_currentDialog = self; - - UIWindow *window = [FBSDKInternalUtility findWindow]; - if (!window) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"There are no valid ViewController to present FBSDKWebDialog", nil]; - [self _failWithError:nil]; - return NO; - } - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - _dialogView = [[FBSDKWebDialogView alloc] initWithFrame:window.screen.applicationFrame]; -#pragma clang diagnostic pop - - _dialogView.delegate = self; - [_dialogView loadURL:URL]; - - if (!_deferVisibility) { - [self _showWebView]; - } - - return YES; -} - -#pragma mark - FBSDKWebDialogViewDelegate - -- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didCompleteWithResults:(NSDictionary *)results -{ - [self _completeWithResults:results]; -} - -- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didFailWithError:(NSError *)error -{ - [self _failWithError:error]; -} - -- (void)webDialogViewDidCancel:(FBSDKWebDialogView *)webDialogView -{ - [self _cancel]; -} - -- (void)webDialogViewDidFinishLoad:(FBSDKWebDialogView *)webDialogView -{ - if (_deferVisibility) { - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - if (_dialogView) { - [self _showWebView]; - } - }); - } -} - -#pragma mark - Notifications - -- (void)_addObservers -{ - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:self - selector:@selector(_deviceOrientationDidChangeNotification:) - name:UIDeviceOrientationDidChangeNotification - object:nil]; -} - -- (void)_deviceOrientationDidChangeNotification:(NSNotification *)notification -{ - BOOL animated = [FBSDKTypeUtility boolValue:notification.userInfo[@"UIDeviceOrientationRotateAnimatedUserInfoKey"]]; - Class CATransactionClass = fbsdkdfl_CATransactionClass(); - CFTimeInterval animationDuration = (animated ? [CATransactionClass animationDuration] : 0.0); - [self _updateViewsWithScale:1.0 alpha:1.0 animationDuration:animationDuration completion:^(BOOL finished) { - if (finished) { - [_dialogView setNeedsDisplay]; - } - }]; -} - -- (void)_removeObservers -{ - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; -} - -#pragma mark - Helper Methods - -- (void)_cancel -{ - FBSDKWebDialog *dialog = self; - [self _dismissAnimated:YES]; // may cause the receiver to be released - [_delegate webDialogDidCancel:dialog]; -} - -- (void)_completeWithResults:(NSDictionary *)results -{ - FBSDKWebDialog *dialog = self; - [self _dismissAnimated:YES]; // may cause the receiver to be released - [_delegate webDialog:dialog didCompleteWithResults:results]; -} - -- (void)_dismissAnimated:(BOOL)animated -{ - [self _removeObservers]; - UIView *backgroundView = _backgroundView; - _backgroundView = nil; - FBSDKWebDialogView *dialogView = _dialogView; - _dialogView.delegate = nil; - _dialogView = nil; - void(^didDismiss)(BOOL) = ^(BOOL finished){ - [backgroundView removeFromSuperview]; - [dialogView removeFromSuperview]; - }; - if (animated) { - [UIView animateWithDuration:FBSDK_WEB_DIALOG_DISMISS_ANIMATION_DURATION animations:^{ - dialogView.alpha = 0.0; - backgroundView.alpha = 0.0; - } completion:didDismiss]; - } else { - didDismiss(YES); - } - if (g_currentDialog == self) { - g_currentDialog = nil; - } -} - -- (void)_failWithError:(NSError *)error -{ - // defer so that the consumer is guaranteed to have an opportunity to set the delegate before we fail - dispatch_async(dispatch_get_main_queue(), ^{ - [self _dismissAnimated:YES]; - [_delegate webDialog:self didFailWithError:error]; - }); -} - -- (NSURL *)_generateURL:(NSError **)errorRef -{ - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - parameters[@"display"] = @"touch"; - parameters[@"sdk"] = [NSString stringWithFormat:@"ios-%@", [FBSDKSettings sdkVersion]]; - parameters[@"redirect_uri"] = @"fbconnect://success"; - [FBSDKInternalUtility dictionary:parameters setObject:[FBSDKSettings appID] forKey:@"app_id"]; - [FBSDKInternalUtility dictionary:parameters - setObject:[FBSDKAccessToken currentAccessToken].tokenString - forKey:@"access_token"]; - [parameters addEntriesFromDictionary:self.parameters]; - return [FBSDKInternalUtility facebookURLWithHostPrefix:@"m" - path:[@"/dialog/" stringByAppendingString:self.name] - queryParameters:parameters - error:errorRef]; -} - -- (BOOL)_showWebView -{ - UIWindow *window = [FBSDKInternalUtility findWindow]; - if (!window) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"There are no valid ViewController to present FBSDKWebDialog", nil]; - [self _failWithError:nil]; - return NO; - } - - [self _addObservers]; - - _backgroundView = [[UIView alloc] initWithFrame:window.bounds]; - _backgroundView.alpha = 0.0; - _backgroundView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); - _backgroundView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:0.8]; - [window addSubview:_backgroundView]; - - [window addSubview:_dialogView]; - - [_dialogView becomeFirstResponder]; // dismisses the keyboard if it there was another first responder with it - [self _updateViewsWithScale:0.001 alpha:0.0 animationDuration:0.0 completion:NULL]; - [self _updateViewsWithScale:1.1 alpha:1.0 animationDuration:FBSDK_WEB_DIALOG_SHOW_ANIMATION_DURATION completion:^(BOOL finished1) { - [self _updateViewsWithScale:0.9 alpha:1.0 animationDuration:FBSDK_WEB_DIALOG_SHOW_ANIMATION_DURATION completion:^(BOOL finished2) { - [self _updateViewsWithScale:1.0 alpha:1.0 animationDuration:FBSDK_WEB_DIALOG_SHOW_ANIMATION_DURATION completion:NULL]; - }]; - }]; - return YES; -} - -- (CGAffineTransform)_transformForOrientation -{ - // iOS 8 simply adjusts the application frame to adapt to the current orientation and deprecated the concept of - // interface orientations - if ([FBSDKInternalUtility shouldManuallyAdjustOrientation]) { - switch ([UIApplication sharedApplication].statusBarOrientation) { - case UIInterfaceOrientationLandscapeLeft: - return CGAffineTransformMakeRotation(M_PI * 1.5); - case UIInterfaceOrientationLandscapeRight: - return CGAffineTransformMakeRotation(M_PI/2); - case UIInterfaceOrientationPortraitUpsideDown: - return CGAffineTransformMakeRotation(-M_PI); - case UIInterfaceOrientationPortrait: - case UIInterfaceOrientationUnknown: - // don't adjust the orientation - break; - } - } - return CGAffineTransformIdentity; -} - -- (CGRect)_applicationFrameForOrientation -{ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - CGRect applicationFrame = _dialogView.window.screen.applicationFrame; -#pragma clang diagnostic pop - if ([FBSDKInternalUtility shouldManuallyAdjustOrientation]) { - switch ([UIApplication sharedApplication].statusBarOrientation) { - case UIInterfaceOrientationLandscapeLeft: - case UIInterfaceOrientationLandscapeRight: - return CGRectMake(0, 0, CGRectGetHeight(applicationFrame), CGRectGetWidth(applicationFrame)); - case UIInterfaceOrientationPortraitUpsideDown: - case UIInterfaceOrientationPortrait: - case UIInterfaceOrientationUnknown: - return applicationFrame; - } - } else { - return applicationFrame; - } -} - -- (void)_updateViewsWithScale:(CGFloat)scale - alpha:(CGFloat)alpha - animationDuration:(CFTimeInterval)animationDuration - completion:(void(^)(BOOL finished))completion -{ - CGAffineTransform transform; - CGRect applicationFrame = [self _applicationFrameForOrientation]; - if (scale == 1.0) { - transform = _dialogView.transform; - _dialogView.transform = CGAffineTransformIdentity; - _dialogView.frame = applicationFrame; - _dialogView.transform = transform; - } - transform = CGAffineTransformScale([self _transformForOrientation], scale, scale); - void(^updateBlock)(void) = ^{ - _dialogView.transform = transform; - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - CGRect mainFrame = _dialogView.window.screen.applicationFrame; -#pragma clang diagnostic pop - _dialogView.center = CGPointMake(CGRectGetMidX(mainFrame), - CGRectGetMidY(mainFrame)); - _backgroundView.alpha = alpha; - }; - if (animationDuration == 0.0) { - updateBlock(); - } else { - [UIView animateWithDuration:animationDuration animations:updateBlock completion:completion]; - } -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h deleted file mode 100644 index 08f17f673..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@protocol FBSDKWebDialogViewDelegate; - -@interface FBSDKWebDialogView : UIView - -@property (nonatomic, weak) id delegate; - -- (void)loadURL:(NSURL *)URL; -- (void)stopLoading; - -@end - -@protocol FBSDKWebDialogViewDelegate - -- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didCompleteWithResults:(NSDictionary *)results; -- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didFailWithError:(NSError *)error; -- (void)webDialogViewDidCancel:(FBSDKWebDialogView *)webDialogView; -- (void)webDialogViewDidFinishLoad:(FBSDKWebDialogView *)webDialogView; - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.m deleted file mode 100644 index 81d7182f9..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.m +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKWebDialogView.h" - -#import "FBSDKCloseIcon.h" -#import "FBSDKError.h" -#import "FBSDKTypeUtility.h" -#import "FBSDKUtility.h" - -#define FBSDK_WEB_DIALOG_VIEW_BORDER_WIDTH 10.0 - -@interface FBSDKWebDialogView () -@end - -@implementation FBSDKWebDialogView -{ - UIButton *_closeButton; - UIActivityIndicatorView *_loadingView; - UIWebView *_webView; -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithFrame:(CGRect)frame -{ - if ((self = [super initWithFrame:frame])) { - self.backgroundColor = [UIColor clearColor]; - self.opaque = NO; - - _webView = [[UIWebView alloc] initWithFrame:CGRectZero]; - _webView.delegate = self; - [self addSubview:_webView]; - - _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; - UIImage *closeImage = [[[FBSDKCloseIcon alloc] init] imageWithSize:CGSizeMake(29.0, 29.0)]; - [_closeButton setImage:closeImage forState:UIControlStateNormal]; - [_closeButton setTitleColor:[UIColor colorWithRed:167.0/255.0 - green:184.0/255.0 - blue:216.0/255.0 - alpha:1.0] forState:UIControlStateNormal]; - [_closeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted]; - _closeButton.showsTouchWhenHighlighted = YES; - [_closeButton sizeToFit]; - [self addSubview:_closeButton]; - [_closeButton addTarget:self action:@selector(_close:) forControlEvents:UIControlEventTouchUpInside]; - - _loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; - _loadingView.color = [UIColor grayColor]; - [_webView addSubview:_loadingView]; - } - return self; -} - -- (void)dealloc -{ - _webView.delegate = nil; -} - -#pragma mark - Public Methods - -- (void)loadURL:(NSURL *)URL -{ - [_loadingView startAnimating]; - [_webView loadRequest:[NSURLRequest requestWithURL:URL]]; -} - -- (void)stopLoading -{ - [_webView stopLoading]; -} - -#pragma mark - Layout - -- (void)drawRect:(CGRect)rect -{ - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextSaveGState(context); - [self.backgroundColor setFill]; - CGContextFillRect(context, self.bounds); - [[UIColor blackColor] setStroke]; - CGContextSetLineWidth(context, 1.0 / self.layer.contentsScale); - CGContextStrokeRect(context, _webView.frame); - CGContextRestoreGState(context); - [super drawRect:rect]; -} - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - CGRect bounds = self.bounds; - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - CGFloat horizontalInset = CGRectGetWidth(bounds) * 0.2; - CGFloat verticalInset = CGRectGetHeight(bounds) * 0.2; - UIEdgeInsets iPadInsets = UIEdgeInsetsMake(verticalInset, horizontalInset, verticalInset, horizontalInset); - bounds = UIEdgeInsetsInsetRect(bounds, iPadInsets); - } - UIEdgeInsets webViewInsets = UIEdgeInsetsMake(FBSDK_WEB_DIALOG_VIEW_BORDER_WIDTH, - FBSDK_WEB_DIALOG_VIEW_BORDER_WIDTH, - FBSDK_WEB_DIALOG_VIEW_BORDER_WIDTH, - FBSDK_WEB_DIALOG_VIEW_BORDER_WIDTH); - _webView.frame = CGRectIntegral(UIEdgeInsetsInsetRect(bounds, webViewInsets)); - - CGRect webViewBounds = _webView.bounds; - _loadingView.center = CGPointMake(CGRectGetMidX(webViewBounds), CGRectGetMidY(webViewBounds)); - - CGRect closeButtonFrame = _closeButton.bounds; - closeButtonFrame.origin = bounds.origin; - _closeButton.frame = CGRectIntegral(closeButtonFrame); -} - -#pragma mark - Actions - -- (void)_close:(id)sender -{ - [_delegate webDialogViewDidCancel:self]; -} - -#pragma mark - UIWebViewDelegate - -- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error -{ - [_loadingView stopAnimating]; - - // 102 == WebKitErrorFrameLoadInterruptedByPolicyChange - // NSURLErrorCancelled == "Operation could not be completed", note NSURLErrorCancelled occurs when the user clicks - // away before the page has completely loaded, if we find cases where we want this to result in dialog failure - // (usually this just means quick-user), then we should add something more robust here to account for differences in - // application needs - if (!(([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) || - ([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102))) { - [_delegate webDialogView:self didFailWithError:error]; - } -} - -- (BOOL)webView:(UIWebView *)webView -shouldStartLoadWithRequest:(NSURLRequest *)request - navigationType:(UIWebViewNavigationType)navigationType -{ - NSURL *URL = request.URL; - - if ([URL.scheme isEqualToString:@"fbconnect"]) { - NSMutableDictionary *parameters = [[FBSDKUtility dictionaryWithQueryString:URL.query] mutableCopy]; - [parameters addEntriesFromDictionary:[FBSDKUtility dictionaryWithQueryString:URL.fragment]]; - if ([URL.resourceSpecifier hasPrefix:@"//cancel"]) { - NSInteger errorCode = [FBSDKTypeUtility integerValue:parameters[@"error_code"]]; - if (errorCode) { - NSString *errorMessage = [FBSDKTypeUtility stringValue:parameters[@"error_msg"]]; - NSError *error = [FBSDKError errorWithCode:errorCode message:errorMessage]; - [_delegate webDialogView:self didFailWithError:error]; - } else { - [_delegate webDialogViewDidCancel:self]; - } - } else { - [_delegate webDialogView:self didCompleteWithResults:parameters]; - } - return NO; - } else if (navigationType == UIWebViewNavigationTypeLinkClicked) { - [[UIApplication sharedApplication] openURL:request.URL]; - return NO; - } else { - return YES; - } -} - -- (void)webViewDidFinishLoad:(UIWebView *)webView -{ - [_loadingView stopAnimating]; - [_delegate webDialogViewDidFinishLoad:self]; -} - -@end diff --git a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal_NoARC/FBSDKDynamicFrameworkLoader.m b/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal_NoARC/FBSDKDynamicFrameworkLoader.m deleted file mode 100644 index cc05b1fd7..000000000 --- a/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal_NoARC/FBSDKDynamicFrameworkLoader.m +++ /dev/null @@ -1,567 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKDynamicFrameworkLoader.h" - -#import - -#import -#import -#import - -#import "FBSDKLogger.h" -#import "FBSDKSettings.h" - -static NSString *const g_frameworkPathTemplate = @"/System/Library/Frameworks/%@.framework/%@"; - -#pragma mark - Library and Symbol Loading - -struct FBSDKDFLLoadSymbolContext -{ - void *(*library)(void); // function to retrieve the library handle (it's a function instead of void * so it can be staticlly bound) - const char *name; // name of the symbol to retrieve - void **address; // [out] address of the symbol in the process address space -}; - -// Retrieves the handle for a library for framework. The paths for each are constructed -// differently so the loading function passed to dispatch_once() calls this. -static void *fbsdkdfl_load_library_once(const char *path) -{ - void *handle = dlopen(path, RTLD_LAZY); - if (handle) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorInformational formatString:@"Dynamically loaded library at %s", path]; - } else { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorInformational formatString:@"Failed to load library at %s", path]; - } - return handle; -} - -// Constructs the path for a system framework with the given name and returns the handle for dlsym -static void *fbsdkdfl_load_framework_once(NSString *framework) -{ - NSString *path = [NSString stringWithFormat:g_frameworkPathTemplate, framework, framework]; - return fbsdkdfl_load_library_once([path fileSystemRepresentation]); -} - -// Implements the callback for dispatch_once() that loads the handle for specified framework name -#define _fbsdkdfl_load_framework_once_impl_(FRAMEWORK) \ - static void fbsdkdfl_load_##FRAMEWORK##_once(void *context) { \ - *(void **)context = fbsdkdfl_load_framework_once(@#FRAMEWORK); \ - } - -// Implements the framework/library retrieval function for the given name. -// It calls the loading function once and caches the handle in a local static variable -#define _fbsdkdfl_handle_get_impl_(LIBRARY) \ - static void *fbsdkdfl_handle_get_##LIBRARY(void) { \ - static void *LIBRARY##_handle; \ - static dispatch_once_t LIBRARY##_once; \ - dispatch_once_f(&LIBRARY##_once, &LIBRARY##_handle, &fbsdkdfl_load_##LIBRARY##_once); \ - return LIBRARY##_handle;\ - } - -// Callback from dispatch_once() to load a specific symbol -static void fbsdkdfl_load_symbol_once(void *context) -{ - struct FBSDKDFLLoadSymbolContext *ctx = context; - *ctx->address = dlsym(ctx->library(), ctx->name); -} - -// The boilerplate code for loading a symbol from a given library once and caching it in a static local -#define _fbsdkdfl_symbol_get(LIBRARY, PREFIX, SYMBOL, TYPE, VARIABLE_NAME) \ - static TYPE VARIABLE_NAME; \ - static dispatch_once_t SYMBOL##_once; \ - static struct FBSDKDFLLoadSymbolContext ctx = { .library = &fbsdkdfl_handle_get_##LIBRARY, .name = PREFIX #SYMBOL, .address = (void **)&VARIABLE_NAME }; \ - dispatch_once_f(&SYMBOL##_once, &ctx, &fbsdkdfl_load_symbol_once) - -#define _fbsdkdfl_symbol_get_c(LIBRARY, SYMBOL) _fbsdkdfl_symbol_get(LIBRARY, "OBJC_CLASS_$_", SYMBOL, Class, c) // convenience symbol retrieval macro for getting an Objective-C class symbol and storing it in the local static c -#define _fbsdkdfl_symbol_get_f(LIBRARY, SYMBOL) _fbsdkdfl_symbol_get(LIBRARY, "", SYMBOL, SYMBOL##_type, f) // convenience symbol retrieval macro for getting a function pointer and storing it in the local static f -#define _fbsdkdfl_symbol_get_k(LIBRARY, SYMBOL, TYPE) _fbsdkdfl_symbol_get(LIBRARY, "", SYMBOL, TYPE, k) // convenience symbol retrieval macro for getting a pointer to a named variable and storing it in the local static k - -// convenience macro for verifying a pointer to a named variable was successfully loaded and returns the value -#define _fbsdkdfl_return_k(FRAMEWORK, SYMBOL) \ - NSCAssert(k != NULL, @"Failed to load constant %@ in the %@ framework", @#SYMBOL, @#FRAMEWORK); \ - return *k - -// convenience macro for getting a pointer to a named NSString, verifying it loaded correctly, and returning it -#define _fbsdkdfl_get_and_return_NSString(LIBRARY, SYMBOL) \ - _fbsdkdfl_symbol_get_k(LIBRARY, SYMBOL, NSString **); \ - NSCAssert([*k isKindOfClass:[NSString class]], @"Loaded symbol %@ is not of type NSString *", @#SYMBOL); \ - _fbsdkdfl_return_k(LIBRARY, SYMBOL) - -#pragma mark - Security Framework - -_fbsdkdfl_load_framework_once_impl_(Security) -_fbsdkdfl_handle_get_impl_(Security) - -#pragma mark - Security Constants - -@implementation FBSDKDynamicFrameworkLoader - -#define _fbsdkdfl_Security_get_k(SYMBOL) _fbsdkdfl_symbol_get_k(Security, SYMBOL, CFTypeRef *) - -#define _fbsdkdfl_Security_get_and_return_k(SYMBOL) \ - _fbsdkdfl_Security_get_k(SYMBOL); \ - _fbsdkdfl_return_k(Security, SYMBOL) - -+ (SecRandomRef)loadkSecRandomDefault -{ - _fbsdkdfl_symbol_get_k(Security, kSecRandomDefault, SecRandomRef *); - _fbsdkdfl_return_k(Security, kSecRandomDefault); -} - -+ (CFTypeRef)loadkSecAttrAccessible -{ - _fbsdkdfl_Security_get_and_return_k(kSecAttrAccessible); -} - -+ (CFTypeRef)loadkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly -{ - _fbsdkdfl_Security_get_and_return_k(kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly); -} - -+ (CFTypeRef)loadkSecAttrAccount -{ - _fbsdkdfl_Security_get_and_return_k(kSecAttrAccount); -} - -+ (CFTypeRef)loadkSecAttrService -{ - _fbsdkdfl_Security_get_and_return_k(kSecAttrService); -} - -+ (CFTypeRef)loadkSecAttrGeneric -{ - _fbsdkdfl_Security_get_and_return_k(kSecAttrGeneric); -} - -+ (CFTypeRef)loadkSecValueData -{ - _fbsdkdfl_Security_get_and_return_k(kSecValueData); -} - -+ (CFTypeRef)loadkSecClassGenericPassword -{ - _fbsdkdfl_Security_get_and_return_k(kSecClassGenericPassword); -} - -+ (CFTypeRef)loadkSecAttrAccessGroup -{ - _fbsdkdfl_Security_get_and_return_k(kSecAttrAccessGroup); -} - -+ (CFTypeRef)loadkSecMatchLimitOne -{ - _fbsdkdfl_Security_get_and_return_k(kSecMatchLimitOne); -} - -+ (CFTypeRef)loadkSecMatchLimit -{ - _fbsdkdfl_Security_get_and_return_k(kSecMatchLimit); -} - -+ (CFTypeRef)loadkSecReturnData -{ - _fbsdkdfl_Security_get_and_return_k(kSecReturnData); -} - -+ (CFTypeRef)loadkSecClass -{ - _fbsdkdfl_Security_get_and_return_k(kSecClass); -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -@end - -#pragma mark - Security APIs - -#define _fbsdkdfl_Security_get_f(SYMBOL) _fbsdkdfl_symbol_get_f(Security, SYMBOL) - -typedef int (*SecRandomCopyBytes_type)(SecRandomRef, size_t, uint8_t *); -typedef OSStatus (*SecItemUpdate_type)(CFDictionaryRef, CFDictionaryRef); -typedef OSStatus (*SecItemAdd_type)(CFDictionaryRef, CFTypeRef); -typedef OSStatus (*SecItemCopyMatching_type)(CFDictionaryRef, CFTypeRef); -typedef OSStatus (*SecItemDelete_type)(CFDictionaryRef); - -int fbsdkdfl_SecRandomCopyBytes(SecRandomRef rnd, size_t count, uint8_t *bytes) -{ - _fbsdkdfl_Security_get_f(SecRandomCopyBytes); - return f(rnd, count, bytes); -} - -OSStatus fbsdkdfl_SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate) -{ - _fbsdkdfl_Security_get_f(SecItemUpdate); - return f(query, attributesToUpdate); -} - -OSStatus fbsdkdfl_SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result) -{ - _fbsdkdfl_Security_get_f(SecItemAdd); - return f(attributes, result); -} - -OSStatus fbsdkdfl_SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result) -{ - _fbsdkdfl_Security_get_f(SecItemCopyMatching); - return f(query, result); -} - -OSStatus fbsdkdfl_SecItemDelete(CFDictionaryRef query) -{ - _fbsdkdfl_Security_get_f(SecItemDelete); - return f(query); -} - -#pragma mark - Social Constants - -_fbsdkdfl_load_framework_once_impl_(Social) -_fbsdkdfl_handle_get_impl_(Social) - -#define _fbsdkdfl_Social_get_and_return_constant(SYMBOL) _fbsdkdfl_get_and_return_NSString(Social, SYMBOL) - -NSString *fbsdkdfl_SLServiceTypeFacebook(void) -{ - _fbsdkdfl_Social_get_and_return_constant(SLServiceTypeFacebook); -} - -NSString *fbsdkdfl_SLServiceTypeTwitter(void) -{ - _fbsdkdfl_Social_get_and_return_constant(SLServiceTypeTwitter); -} - -#pragma mark - Social Classes - -#define _fbsdkdfl_Social_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(Social, SYMBOL) - -Class fbsdkdfl_SLComposeViewControllerClass(void) -{ - _fbsdkdfl_Social_get_c(SLComposeViewController); - return c; -} - -#pragma mark - MessageUI Classes - -_fbsdkdfl_load_framework_once_impl_(MessageUI) -_fbsdkdfl_handle_get_impl_(MessageUI) - -#define _fbsdkdfl_MessageUI_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(MessageUI, SYMBOL) - -Class fbsdkdfl_MFMailComposeViewControllerClass(void) -{ - _fbsdkdfl_MessageUI_get_c(MFMailComposeViewController); - return c; -} - -Class fbsdkdfl_MFMessageComposeViewControllerClass(void) -{ - _fbsdkdfl_MessageUI_get_c(MFMessageComposeViewController); - return c; -} - -#pragma mark - QuartzCore Classes - -_fbsdkdfl_load_framework_once_impl_(QuartzCore) -_fbsdkdfl_handle_get_impl_(QuartzCore) - -#define _fbsdkdfl_QuartzCore_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(QuartzCore, SYMBOL); - -Class fbsdkdfl_CATransactionClass(void) -{ - _fbsdkdfl_QuartzCore_get_c(CATransaction); - return c; -} - -#pragma mark - QuartzCore APIs - -#define _fbsdkdfl_QuartzCore_get_f(SYMBOL) _fbsdkdfl_symbol_get_f(QuartzCore, SYMBOL) - -typedef CATransform3D (*CATransform3DMakeScale_type)(CGFloat, CGFloat, CGFloat); -typedef CATransform3D (*CATransform3DMakeTranslation_type)(CGFloat, CGFloat, CGFloat); -typedef CATransform3D (*CATransform3DConcat_type)(CATransform3D, CATransform3D); - -const CATransform3D fbsdkdfl_CATransform3DIdentity = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; - -CATransform3D fbsdkdfl_CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz) -{ - _fbsdkdfl_QuartzCore_get_f(CATransform3DMakeScale); - return f(sx, sy, sz); -} - -CATransform3D fbsdkdfl_CATransform3DMakeTranslation(CGFloat tx, CGFloat ty, CGFloat tz) -{ - _fbsdkdfl_QuartzCore_get_f(CATransform3DMakeTranslation); - return f(tx, ty, tz); -} - -CATransform3D fbsdkdfl_CATransform3DConcat(CATransform3D a, CATransform3D b) -{ - _fbsdkdfl_QuartzCore_get_f(CATransform3DConcat); - return f(a, b); -} - -#pragma mark - AudioToolbox APIs - -_fbsdkdfl_load_framework_once_impl_(AudioToolbox) -_fbsdkdfl_handle_get_impl_(AudioToolbox) - -#define _fbsdkdfl_AudioToolbox_get_f(SYMBOL) _fbsdkdfl_symbol_get_f(AudioToolbox, SYMBOL) - -typedef OSStatus (*AudioServicesCreateSystemSoundID_type)(CFURLRef, SystemSoundID *); -typedef OSStatus (*AudioServicesDisposeSystemSoundID_type)(SystemSoundID); -typedef void (*AudioServicesPlaySystemSound_type)(SystemSoundID); - -OSStatus fbsdkdfl_AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID) -{ - _fbsdkdfl_AudioToolbox_get_f(AudioServicesCreateSystemSoundID); - return f(inFileURL, outSystemSoundID); -} - -OSStatus fbsdkdfl_AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID) -{ - _fbsdkdfl_AudioToolbox_get_f(AudioServicesDisposeSystemSoundID); - return f(inSystemSoundID); -} - -void fbsdkdfl_AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID) -{ - _fbsdkdfl_AudioToolbox_get_f(AudioServicesPlaySystemSound); - return f(inSystemSoundID); -} - -#pragma mark - Ad Support Classes - -_fbsdkdfl_load_framework_once_impl_(AdSupport) -_fbsdkdfl_handle_get_impl_(AdSupport) - -#define _fbsdkdfl_AdSupport_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(AdSupport, SYMBOL); - -Class fbsdkdfl_ASIdentifierManagerClass(void) -{ - _fbsdkdfl_AdSupport_get_c(ASIdentifierManager); - return c; -} - -#pragma mark - Safari Services -_fbsdkdfl_load_framework_once_impl_(SafariServices) -_fbsdkdfl_handle_get_impl_(SafariServices) - -#define _fbsdkdfl_SafariServices_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(SafariServices, SYMBOL); - -Class fbsdkdfl_SFSafariViewControllerClass(void) -{ - _fbsdkdfl_SafariServices_get_c(SFSafariViewController); - return c; -} - -Class fbsdkdfl_SFAuthenticationSessionClass(void) -{ - _fbsdkdfl_SafariServices_get_c(SFAuthenticationSession); - return c; -} - -#pragma mark - Accounts Constants - -_fbsdkdfl_load_framework_once_impl_(Accounts) -_fbsdkdfl_handle_get_impl_(Accounts) - -#define _fbsdkdfl_Accounts_get_and_return_NSString(SYMBOL) _fbsdkdfl_get_and_return_NSString(Accounts, SYMBOL) - -NSString *fbsdkdfl_ACFacebookAppIdKey(void) -{ - _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookAppIdKey); -} - -NSString *fbsdkdfl_ACFacebookAudienceEveryone(void) -{ - _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookAudienceEveryone); -} - -NSString *fbsdkdfl_ACFacebookAudienceFriends(void) -{ - _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookAudienceFriends); -} - -NSString *fbsdkdfl_ACFacebookAudienceKey(void) -{ - _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookAudienceKey); -} - -NSString *fbsdkdfl_ACFacebookAudienceOnlyMe(void) -{ - _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookAudienceOnlyMe); -} - -NSString *fbsdkdfl_ACFacebookPermissionsKey(void) -{ - _fbsdkdfl_Accounts_get_and_return_NSString(ACFacebookPermissionsKey); -} - -#pragma mark - Accounts Classes - -#define _fbsdkdfl_Accounts_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(Accounts, SYMBOL); - -Class fbsdkdfl_ACAccountStoreClass(void) -{ - _fbsdkdfl_Accounts_get_c(ACAccountStore); - return c; -} - -#pragma mark - StoreKit Classes - -_fbsdkdfl_load_framework_once_impl_(StoreKit) -_fbsdkdfl_handle_get_impl_(StoreKit) - -#define _fbsdkdfl_StoreKit_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(StoreKit, SYMBOL); - -Class fbsdkdfl_SKPaymentQueueClass(void) -{ - _fbsdkdfl_StoreKit_get_c(SKPaymentQueue); - return c; -} - -Class fbsdkdfl_SKProductsRequestClass(void) -{ - _fbsdkdfl_StoreKit_get_c(SKProductsRequest); - return c; -} - -#pragma mark - AssetsLibrary Classes - -_fbsdkdfl_load_framework_once_impl_(AssetsLibrary) -_fbsdkdfl_handle_get_impl_(AssetsLibrary) - -#define _fbsdkdfl_AssetsLibrary_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(AssetsLibrary, SYMBOL); - -Class fbsdkdfl_ALAssetsLibraryClass(void) -{ - _fbsdkdfl_AssetsLibrary_get_c(ALAssetsLibrary); - return c; -} - -#pragma mark - CoreTelephony Classes - -_fbsdkdfl_load_framework_once_impl_(CoreTelephony) -_fbsdkdfl_handle_get_impl_(CoreTelephony) - -#define _fbsdkdfl_CoreTelephonyLibrary_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(CoreTelephony, SYMBOL); - -Class fbsdkdfl_CTTelephonyNetworkInfoClass(void) -{ - _fbsdkdfl_CoreTelephonyLibrary_get_c(CTTelephonyNetworkInfo); - return c; -} - -#pragma mark - CoreImage - -_fbsdkdfl_load_framework_once_impl_(CoreImage) -_fbsdkdfl_handle_get_impl_(CoreImage) - -#define _fbsdkdfl_CoreImage_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(CoreImage, SYMBOL); -#define _fbsdkdfl_CoreImage_get_and_return_NSString(SYMBOL) _fbsdkdfl_get_and_return_NSString(CoreImage, SYMBOL) - - -Class fbsdkdfl_CIImageClass(void) -{ - _fbsdkdfl_CoreImage_get_c(CIImage); - return c; -} - -Class fbsdkdfl_CIFilterClass(void) -{ - _fbsdkdfl_CoreImage_get_c(CIFilter); - return c; -} - -NSString *fbsdkdfl_kCIInputImageKey(void) -{ - _fbsdkdfl_CoreImage_get_and_return_NSString(kCIInputImageKey); -} - -NSString *fbsdkdfl_kCIInputRadiusKey(void) -{ - _fbsdkdfl_CoreImage_get_and_return_NSString(kCIInputRadiusKey); -} - -NSString *fbsdkdfl_kCIOutputImageKey(void) -{ - _fbsdkdfl_CoreImage_get_and_return_NSString(kCIOutputImageKey); -} - -#pragma mark - Photos.framework - -_fbsdkdfl_load_framework_once_impl_(Photos) -_fbsdkdfl_handle_get_impl_(Photos) - -#define _fbsdkdfl_Photos_get_c(SYMBOL) _fbsdkdfl_symbol_get_c(Photos, SYMBOL); -#define _fbsdkdfl_Photos_get_and_return_NSString(SYMBOL) _fbsdkdfl_get_and_return_NSString(Photos, SYMBOL) - -Class fbsdkdfl_PHPhotoLibrary(void) -{ - _fbsdkdfl_Photos_get_c(PHPhotoLibrary); - return c; -} - -Class fbsdkdfl_PHAssetChangeRequest(void) -{ - _fbsdkdfl_Photos_get_c(PHAssetChangeRequest); - return c; -} - -#pragma mark - MobileCoreServices - -_fbsdkdfl_load_framework_once_impl_(MobileCoreServices) -_fbsdkdfl_handle_get_impl_(MobileCoreServices) - -#define _fbsdkdfl_MobileCoreServices_get_k(SYMBOL) _fbsdkdfl_symbol_get_k(MobileCoreServices, SYMBOL, CFStringRef *) - -#define _fbsdkdfl_MobileCoreServices_get_and_return_k(SYMBOL) \ -_fbsdkdfl_MobileCoreServices_get_k(SYMBOL); \ -_fbsdkdfl_return_k(MobileCoreServices, SYMBOL) - -#define _fbsdkdfl_MobileCoreServices_get_f(SYMBOL) _fbsdkdfl_symbol_get_f(MobileCoreServices, SYMBOL) - -typedef CFStringRef (*UTTypeCopyPreferredTagWithClass_type)(CFStringRef inUTI, CFStringRef inTagClass); - -CFStringRef fbsdkdfl_UTTypeCopyPreferredTagWithClass(CFStringRef inUTI, - CFStringRef inTagClass) -{ - _fbsdkdfl_MobileCoreServices_get_f(UTTypeCopyPreferredTagWithClass); - return f(inUTI, inTagClass); -} - -CFStringRef fbsdkdfl_kUTTagClassMIMEType(void) -{ - _fbsdkdfl_MobileCoreServices_get_and_return_k(kUTTagClassMIMEType); -} - -CFStringRef fbsdkdfl_kUTTypeJPEG(void) -{ - _fbsdkdfl_MobileCoreServices_get_and_return_k(kUTTypeJPEG); -} - -CFStringRef fbsdkdfl_kUTTypePNG(void) -{ - _fbsdkdfl_MobileCoreServices_get_and_return_k(kUTTypePNG); -} diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/af.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/af.lproj/FacebookSDK.strings deleted file mode 100644 index e6bf3afa1..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/af.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Besoek %@ en voer die kode in wat hierbo vertoon word."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Om jou rekening te verbind, maak die Facebook-toepassing op jou mobiele toestel oop en kontroleer vir kennisgewings."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- OF -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "Goed"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Kanselleer"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Meld asseblief weer by hierdie toepassing aan om jou Facebook-rekening te herkoppel. "; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "Goed"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Die bediener is tydelik besig, probeer asseblief weer."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Hou van"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Hou van"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Kanselleer"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Meld af"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Met Facebook aangemeld"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "As %@ aangemeld"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Meld aan"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Gaan voort met Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Meld met Facebook aan"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Meld af"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Toegang is nie na die Facebook-rekening verleen nie. Verifieer toestelinstellings."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Kan nie aan Facebook koppel nie. Gaan jou netwerkverbinding na en probeer weer."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Jou Facebook-wagwoord het verander. Om jou wagwoord te bevestig, maak Instellings > Facebook oop en tik jou naam."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Die Facebook-rekening is nie op die toestel opgestel nie."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Jou rekening is nie bevestig nie. Meld asseblief by www.facebook.com aan en volg die gegewe instruksies."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Jy kan nie op die oomblik by toepassings aanmeld nie. Meld asseblief by www.facebook.com aan en volg die gegewe instruksies."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Jy is in beheer – kies watter inligting jy met toepassings wil deel."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Meld aan"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Stuur"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Deel"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Nie jy nie?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Bevestig aantekening"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Gaan voort as %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ar.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ar.lproj/FacebookSDK.strings deleted file mode 100644 index 0911c786b..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ar.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "تفضل بزيارة %@ وإدخال الرمز الموضح أدناه."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "لربط حسابك، افتح تطبيق فيسبوك على جهازك المحمول ثم تفقد الإشعارات."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- أو -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "موافق"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "إلغاء"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "يرجى تسجيل الدخول إلى هذا التطبيق مرة أخرى لإعادة الاتصال بحساب فيسبوك."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "موافق"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "الخادم مشغول مؤقتًا، يرجى إعادة المحاولة."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "إعجاب"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "أعجبني"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "إلغاء"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "تسجيل الخروج"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "تم تسجيل الدخول بحساب فيسبوك"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "تم تسجيل الدخول باسم %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "تسجيل الدخول"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "متابعة بحساب فيسبوك"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "تسجيل الدخول بحساب فيسبوك"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "تسجيل الخروج"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "لم يتم منح إذن الوصول لحساب فيسبوك. تحقق من إعدادات الجهاز."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "تعذر الاتصال بفيسبوك. يُرجى التحقق من الاتصال بالإنترنت وإعادة المحاولة."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "تم تغيير كلمة سر فيسبوك الخاصة بك. لتأكيد كلمة السر، افتح الإعدادات > فيسبوك ثم اضغط على اسمك."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "لم تتم تهيئة حساب فيسبوك على الجهاز."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "لم يتم تأكيد حسابك. يُرجى تسجيل الدخول إلى www.facebook.com واتباع التعليمات الموضحة."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "لا يمكنك تسجيل الدخول إلى التطبيقات حاليًا. يُرجى تسجيل الدخول إلى www.facebook.com واتباع التعليمات الموضحة."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "أنت المتحكم - اختر المعلومات التي تريد مشاركتها مع التطبيقات."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "تسجيل الدخول"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "إرسال"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "مشاركة"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "لست أنت؟"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "تأكيد تسجيل الدخول"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "متابعة باسم %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/bn.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/bn.lproj/FacebookSDK.strings deleted file mode 100644 index 657075230..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/bn.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@ -এ যান এবং উপরে যে কোডটি দেখানো হয়েছে সেটি লিখুন।"; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "আপনার অ্যাকাউন্টে সংযোগ করতে, আপনার মোবাইল ডিভাইসে Facebook অ্যাপটি খুলুন এবং বিজ্ঞপ্তি চেক করুন।"; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- অথবা -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "ঠিক আছে"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "বাতিল করুন"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "আপনার Facebook অ্যাকাউন্টটিতে পুনরায় সংযোগ করার জন্য অনুগ্রহ করে এই অ্যাপটিতে লগ ইন করুন৷"; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "ঠিক আছে"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "এই সার্ভারটি সাময়িকভাবে ব্যস্ত আছে, অনুগ্রহ করে পুনরায় চেষ্টা করুন৷"; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "পছন্দ করুন"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "পছন্দ করা হয়েছে"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "বাতিল করুন"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "লগ আউট করুন"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Facebook ব্যবহার করে লগ ইন করা হয়েছে"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@ হিসাবে লগ ইন করা হয়েছে"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "লগ ইন করুন"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebook এর সাথে চালিয়ে যান"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Facebook -এর সাথে লগ ইন করুন"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "লগ আউট করুন"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebook অ্যাকাউন্টটিতে অ্যাক্সেস করার অনুমতি নেই৷ ডিভাইস সেটিংস যাচাই করুন৷"; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Facebook-এ সংযোগ করা যাচ্ছে না৷ আপনার নেটওয়ার্ক সংযোগটি পরীক্ষা করুন এবং পুনরায় চেষ্টা করুন৷"; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "আপনার Facebook পাসওয়ার্ডটি পরিবর্তিত হয়েছে৷ আপনার পাসওয়ার্ডটি নিশ্চিত করতে, সেটিংস > Facebook খুলুন এবং আপনার নামটি ট্যাপ করুন৷"; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Facebook অ্যাকাউন্টটি এই ডিভাইসে কনফিগার করা যাযনি৷"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "আপনার অ্যাকাউন্টটি নিশ্চিত করা যায়নি৷ অনুগ্রহ করে www.facebook.com-এ লগ ইন করুন এবং উল্লিখিত নির্দেশাবলী অনুসরণ করুন৷"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "এই সময়ে আপনি অ্যাপসে লগ ইন করতে পারবেন না৷ অনুগ্রহ করে www.facebook.com-এ লগ ইন করুন এবং উল্লিখিত নির্দেশাবলী অনুসরণ করুন৷"; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "আপনি নিয়ন্ত্রণে আছেন - অ্যাপ্সের সাথে আপনি যে তথ্য শেয়ার করতে চান তা বাছুন৷"; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "লগ ইন করুন"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "পাঠান"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "ভাগ করুন"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "আপনি নন?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "লগ ইন নিশ্চিত করুন"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@ হিসেবে চালিয়ে যান"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/cs.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/cs.lproj/FacebookSDK.strings deleted file mode 100644 index 1de061a65..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/cs.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Navštivte %@ a zadejte nahoře uvedený kód."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Účet si můžete připojit tak, že si na mobilním zařízení spustíte aplikaci Facebook a podíváte se do upozornění."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- NEBO -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Zrušit"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Pokud se chcete ke svému Facebook účtu znovu připojit, přihlaste se k této aplikaci ještě jednou."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Server je dočasně zaneprázdněný, zkuste to znovu."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "To se mi líbí"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Už se mi to líbí"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Zrušit"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Odhlásit"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Přihlášen(a) přes Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Přihlášen(a) jako %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Přihlásit"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Pokračovat přes Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Přihlásit se přes Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Odhlásit"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebook účtu nebylo oprávnění uděleno. Ověřte nastavení zařízení."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "K Facebooku se nedá připojit. Zkontrolujte připojení k síti a zkuste to znovu."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Vaše heslo na Facebook je změněné. Pokud chcete heslo potvrdit, přejděte do Nastavení > Facebook a klepněte na své jméno."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "V tomto zařízení není Facebook účet konfigurovaný."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Váš účet není potvrzený. Přihlaste se na www. facebook.com a postupujte podle uvedených pokynů."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Do aplikací se v této chvíli přihlásit nemůžete. Přihlaste se na www. facebook.com a postupujte podle uvedených pokynů."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Je jen na vás, které informace chcete s aplikacemi sdílet."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Přihlásit"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Odeslat"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Sdílet"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Nejste to vy?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Potvrdit přihlášení"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Pokračovat jako %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/da.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/da.lproj/FacebookSDK.strings deleted file mode 100644 index 9a49bb512..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/da.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Gå til %@, og indtast den kode, der er angivet ovenfor."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Du kan tilknytte din konto ved at åbne Facebook-appen på din mobilenhed og tjekke notifikationerne."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- ELLER -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Annuller"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Log på denne app igen for at genoprette forbindelsen til din Facebook-konto."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Serveren er optaget i øjeblikket. Prøv igen."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Synes godt om"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Synes godt om"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Annuller"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Log af"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Logget på med Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Logget på som %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Log på"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Fortsæt med Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Log på med Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Log af"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Der er ikke blevet givet adgang til Facebook-kontoen. Kontrollér enhedsindstillingerne."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Kunne ikke oprette forbindelse til Facebook. Kontrollér din netværksforbindelse, og prøv igen."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Din Facebook-adgangskode er ændret. For at bekræfte din adgangskode skal du åbne Indstillinger > Facebook og trykke på dit navn."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Facebook-kontoen er ikke blevet konfigureret på enheden."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Din konto er ikke bekræftet. Log på www.facebook.com, og følg instruktionerne."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Du kan ikke logge på apps på nuværende tidspunkt. Log på www.facebook.com, og følg instruktionerne."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Du har styringen – vælg de oplysninger, som du vil dele med apps."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Log på"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Send"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Del"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Ikke dig?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Bekræft login"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Fortsæt som %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/de.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/de.lproj/FacebookSDK.strings deleted file mode 100644 index 331aa9b1f..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/de.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Besuche %@ und gib den oben angezeigten Code ein."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Um dein Konto zu verbinden, öffne die Facebook-App auf deinem Mobilgerät und prüfe, ob du Benachrichtigungen erhalten hast."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "– ODER –"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Abbrechen"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Melde dich bitte erneut bei dieser App an, um die Verbindung mit deinem Facebook-Konto wiederherzustellen."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Der Server ist vorübergehend beschäftigt. Bitte versuche es erneut."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Gefällt mir"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Gefällt dir"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Abbrechen"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Abmelden"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Über Facebook angemeldet"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Als %@ angemeldet"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Anmelden"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Mit Facebook fortfahren"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Über Facebook anmelden"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Abmelden"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Auf das Facebook-Konto wurde kein Zugriff erteilt. Überprüfe bitte die Geräteeinstellungen."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Verbindung zu Facebook kann nicht hergestellt werden. Bitte überprüfe deine Netzwerkverbindung und versuche es erneut."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Dein Facebook-Passwort hat sich geändert. Öffne „Einstellungen“ > „Facebook“ und tippe auf deinen Namen, um dein Passwort zu bestätigen."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Das Facebook-Konto wurde für dieses Gerät nicht konfiguriert."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Dein Konto wurde nicht bestätigt. Bitte melde dich unter www.facebook.com an und folge den Anweisungen."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Du kannst dich zurzeit nicht bei Apps anmelden. Bitte melde dich unter www.facebook.com an und folge den Anweisungen."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Es liegt ganz an dir – du kannst dir aussuchen, was du mit Apps teilen möchtest."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Anmelden"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Senden"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Teilen"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Nicht du?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Login bestätigen"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Fortfahren als %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/el.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/el.lproj/FacebookSDK.strings deleted file mode 100644 index 9b7a3bdde..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/el.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Επισκεφτείτε τη διεύθυνση %@ και συμπληρώστε τον παραπάνω κωδικό."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Για να συνδεθείτε στο λογαριασμό σας, ανοίξτε την εφαρμογή Facebook στη φορητή συσκευή σας και ελέγξτε τις ειδοποιήσεις."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- Ή -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Άκυρο"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Συνδεθείτε ξανά σε αυτή την εφαρμογή για να συνδέσετε και πάλι το λογαριασμό σας στο Facebook."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Ο διακομιστής είναι προσωρινά απασχολημένος, προσπαθήστε ξανά."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Μου αρέσει!"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Σας αρέσει"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Άκυρο"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Αποσύνδεση"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Έχει γίνει σύνδεση μέσω Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Έχει γίνει σύνδεση ως %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Σύνδεση"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Συνεχίστε με το Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Σύνδεση μέσω Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Αποσύνδεση"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Δεν έχει παραχωρηθεί πρόσβαση στο λογαριασμό Facebook. Επαληθεύστε τις ρυθμίσεις της συσκευής σας."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Δεν είναι δυνατή η σύνδεση στο Facebook. Ελέγξτε τη σύνδεση στο δίκτυο και προσπαθήστε ξανά."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Ο κωδικός πρόσβασής σας στο Facebook άλλαξε. Για να επιβεβαιώσετε τον κωδικό σας, πηγαίνετε στις Ρυθμίσεις > Facebook και πατήστε το όνομά σας."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Ο λογαριασμός Facebook δεν έχει διαμορφωθεί στη συσκευή."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Ο λογαριασμός σας δεν επιβεβαιώθηκε. Συνδεθείτε στο www.facebook.com και ακολουθήστε τις οδηγίες που εμφανίζονται."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Προς το παρόν δεν μπορείτε να συνδεθείτε σε εφαρμογές. Συνδεθείτε στο www.facebook.com και ακολουθήστε τις οδηγίες που εμφανίζονται."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Έχετε τον έλεγχο - επιλέξτε ποιες πληροφορίες θέλετε να κοινοποιούνται στις εφαρμογές."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Σύνδεση"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Αποστολή"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Κοινοποίηση"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Δεν είστε εσείς;"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Επιβεβαίωση σύνδεσης"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Συνέχεια ως %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/en.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/en.lproj/FacebookSDK.strings deleted file mode 100644 index 92ad2e232..000000000 Binary files a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/en.lproj/FacebookSDK.strings and /dev/null differ diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/en_GB.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/en_GB.lproj/FacebookSDK.strings deleted file mode 100644 index 358a92c5a..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/en_GB.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* The format string for device login instructions */ -"DeviceLogin.LogInPrompt" = "Visit %@ and enter the code shown above."; - -/* The 'or' string for smart login instructions */ -"DeviceLogin.SmartLogInOrLabel" = "-- OR --"; - -/* The string for smart login instructions */ -"DeviceLogin.SmartLogInPrompt" = "To connect your account, open the Facebook app on your mobile device and check for notifications."; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Cancel"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Please log in to this app again to reconnect your Facebook account."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "The server is temporarily busy, please try again."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Like"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Liked"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Cancel"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Log out"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Logged in using Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Logged in as %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Log in"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Continue with Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Log in with Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Log out"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Access has not been granted to the Facebook account. Verify device settings."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Unable to connect to Facebook. Please check your network connection and try again."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Your Facebook password has changed. To confirm your password, open Settings > Facebook and tap your name."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "The Facebook account has not been configured on the device."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Your account is not confirmed. Please log in to www.facebook.com and follow the instructions given."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "You cannot log in to apps at this time. Please log in to www.facebook.com and follow the instructions given."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "You're in control – choose what information you want to share with apps."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Log In"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Send"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Share"; - -/* The title for the alert when smart login requires confirmation */ -"SmartLogin.ConfirmationTitle" = "Confirm Login"; - -/* The format string to continue as for the alert when smart login requires confirmation */ -"SmartLogin.Continue" = "Continue as %@"; - -/* The cancel label for the alert when smart login requires confirmation */ -"SmartLogin.NotYou" = "Not you?"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/es.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/es.lproj/FacebookSDK.strings deleted file mode 100644 index 7038004d9..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/es.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Visita %@ e ingresa el código que se muestra arriba."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Para conectar tu cuenta, abre la aplicación de Facebook en tu dispositivo móvil y comprueba las notificaciones."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- O -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "Aceptar"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Cancelar"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Inicia sesión de nuevo en esta aplicación para volver a conectarte a tu cuenta de Facebook."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "Aceptar"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "El servidor está temporalmente ocupado. Vuelve a intentarlo."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Me gusta"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Te gusta"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Cancelar"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Cerrar sesión"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Sesión iniciada con Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Sesión iniciada como %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Inicio de sesión"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Continuar con Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Iniciar sesión con Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Salir"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "No se concedió acceso a la cuenta de Facebook. Verifica la configuración del dispositivo."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "No es posible conectarse a Facebook. Comprueba tu conexión a internet y vuelve a intentarlo."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Cambió tu contraseña de Facebook. Para confirmar tu contraseña, abre Configuración > Facebook y toca tu nombre."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "No se configuró la cuenta de Facebook en el dispositivo."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Tu cuenta no está confirmada. Inicia sesión en www.facebook.com y sigue las instrucciones."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "No puedes iniciar sesión en las aplicaciones en este momento. Inicia sesión en www.facebook.com y sigue las instrucciones."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Tú decides: elige qué información quieres compartir con las aplicaciones."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Inicio de sesión"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Enviar"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Compartir"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "¿No eres tú?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Confirmar inicio de sesión"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Continuar como %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/es_ES.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/es_ES.lproj/FacebookSDK.strings deleted file mode 100644 index 963fa96f6..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/es_ES.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Visita %@ e introduce el código que se muestra arriba."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Para conectar tu cuenta, abre la aplicación de Facebook en tu dispositivo móvil y comprueba las notificaciones."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- O -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "Aceptar"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Cancelar"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Vuelve a iniciar sesión en esta aplicación para volver a conectar tu cuenta de Facebook."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "Aceptar"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "El servidor está ocupado temporalmente. Vuelve a intentarlo más tarde."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Me gusta"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Te gusta"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Cancelar"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Salir"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Sesión iniciada con Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Sesión iniciada como %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Inicio de sesión"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Continuar con Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Iniciar sesión con Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Salir"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "No se ha otorgado acceso a la cuenta de Facebook. Verifica la configuración del dispositivo."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "No es posible conectarse a Facebook. Comprueba tu conexión de red y vuelve a intentarlo."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Tu contraseña de Facebook ha cambiado. Para confirmar tu contraseña, abre Configuración > Facebook y toca tu nombre."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "La cuenta de Facebook no se ha configurado en el dispositivo."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Tu cuenta no se ha confirmado. Inicia sesión en www.facebook.com y sigue las instrucciones."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "No puedes iniciar sesión en las aplicaciones en este momento. Inicia sesión en www.facebook.com y sigue las instrucciones."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Tú tienes el control: elige la información que quieres compartir con las aplicaciones."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Inicio de sesión"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Enviar"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Compartir"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "¿No eres tú?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Confirmar inicio de sesión"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Continuar como %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/fi.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/fi.lproj/FacebookSDK.strings deleted file mode 100644 index 1f1cc7872..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/fi.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Siirry osoitteeseen %@ ja kirjoita oheinen koodi sivulle."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Pääset liittämään käyttäjätilisi avaamalla Facebook-sovelluksen mobiililaitteellasi ja tarkistamalla ilmoitukset."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- TAI -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Peruuta"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Kirjaudu tähän sovellukseen uudelleen, jotta voit yhdistää Facebook-tilisi uudelleen."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Palvelin on tilapäisesti varattu, yritä uudelleen."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Tykkää"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Tykätty"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Peruuta"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Kirjaudu ulos"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Sisäänkirjautunut Facebookin avulla"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Sisäänkirjautunut nimellä %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Kirjaudu sisään"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Jatka Facebook-tunnuksilla"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Kirjaudu sisään Facebookin avulla"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Kirjaudu ulos"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Pääsyä Facebook-tiliin ei ole myönnetty. Tarkista laiteasetukset."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Yhteyttä Facebookiin ei voi muodostaa. Tarkista verkkoyhteys ja yritä sitten uudelleen."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Facebook-salasanasi on vaihdettu. Vahvista salasanasi avaamalla Asetukset > Facebook ja napauttamalla nimeäsi."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Facebook-tiliä ei ole määritetty laitteessa."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Tiliäsi ei ole vahvistettu. Kirjaudu sisään osoitteeseen www.facebook.com ja noudata annettuja ohjeita."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Et pysty kirjautumaan sovelluksiin tällä hetkellä. Kirjaudu sisään osoitteeseen www.facebook.com ja noudata annettuja ohjeita."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Sinä voit valita, mitä tietoja jaat sovelluksille."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Kirjaudu sisään"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Lähetä"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Jaa"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Etkö tämä ole sinä?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Vahvista sisäänkirjautuminen"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Jatka nimellä %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/fil.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/fil.lproj/FacebookSDK.strings deleted file mode 100644 index 5daf341fd..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/fil.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Pumunta sa %@ at ilagay ang code na ipinapakita sa itaas."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Para ikonekta ang iyong account, buksan ang Facebook app sa iyong cellphone at tumingin ng mga notification."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- O KAYA -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Kanselahin"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Mangyaring mag-log in muli sa app na ito para ikonekta muli ang iyong Facebook account."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Pansamantalang abala ang server, pakisubukan muli."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Gustuhin"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Nagustuhan"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Kanselahin"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Mag-log Out"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Naka-log in gamit ang Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Naka-log in bilang si %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Mag-log in"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Magatuloy sa Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Mag-log in sa pamamagitan ng Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Mag-log out"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Hindi binigyan ng access ang Facebook account. Beripikahin ang mga setting ng device."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Hindi nakakonekta sa Facebook. Tingnan ang iyong koneksyon sa network at subukan muli."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Nagbago ang iyong password sa Facebook. Para makumpirma ang iyong password, buksan ang Mga Setting > Facebook at i-tap ang iyong pangalan."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Hindi na-configure sa device ang Facebook account."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Hindi nakumpirma ang iyong account. Mangyaring mag-log in sa www.facebook.com at sundin ang mga ibinigay na tagubilin."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Hindi ka makakapag-log in sa mga app sa oras na ito. Mangyaring mag-log in sa www.facebook.com at sundin ang mga ibinigay na tagubilin."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Ikaw ang may kontrol - piliin kung anong impormasyon ang gusto mong ibahagi sa mga app."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Mag-log In"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Ipadala"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Ibahagi"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Hindi ikaw?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "I-confirm ang Pag-log in"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Magpatuloy bilang %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/fr.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/fr.lproj/FacebookSDK.strings deleted file mode 100644 index 65fb07c8d..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/fr.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Consultez la page %@ et saisissez le code indiqué ci-dessus."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Pour connecter votre compte, lancez l’application Facebook sur votre appareil mobile et consultez les notifications."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- OU -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Annuler"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Veuillez vous connecter à nouveau à cette application pour reconnecter votre compte Facebook."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Le serveur est temporairement occupé. Veuillez réessayer plus tard."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "J’aime"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "J’aime déjà"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Annuler"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Déconnexion"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Connecté(e) à l’aide de Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Connecté(e) en tant que %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Connexion"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Continuer avec Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Connexion avec Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Déconnexion"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "L’accès au compte Facebook n’a pas été autorisé. Vérifiez les paramètres de l’appareil."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Connexion à Facebook impossible. Vérifiez votre connexion avant de réessayer."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Votre mot de passe Facebook a changé. Pour confirmer votre mot de passe, ouvrez Paramètres > Facebook et saisissez votre nom."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Le compte Facebook n’a pas été configuré sur l’appareil."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Votre compte n’est pas confirmé. Veuillez vous connecter à www.facebook.com et suivre les instructions indiquées."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Vous ne pouvez pas vous connecter à des applications pour le moment. Veuillez vous connecter à www.facebook.com et suivre les instructions indiquées."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Vous gardez le contrôle. Choisissez les informations que vous souhaitez partager avec les applications."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Connexion"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Envoyer"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Partager"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Ce n’est pas vous ?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Confirmer la connexion"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Continuer en tant que %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/gu.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/gu.lproj/FacebookSDK.strings deleted file mode 100644 index a91785a83..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/gu.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@ ની મુલાકાત લો અને ઉપર બતાવ્યા પ્રમાણે કોડ દાખલ કરો."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "તમારા એકાઉન્ટ સાથે જોડાવા માટે, તમારા મોબાઇલ ઉપકરણ પર Facebook એપ્લિકેશન ખોલો અને સૂચનો માટે તપાસો."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- અથવા -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "ઠીક"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "રદ કરો"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "તમારા ફેસબુક ખાતાને ફરીથી કનેક્ટ કરવા માટે કૃપા કરીને આ એપ્લિકેશનમાં ફરી લૉગ ઇન કરો."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "ઠીક"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "સર્વર અસ્થાયીરૂપે વ્યસ્ત છે, કૃપા કરીને ફરી પ્રયાસ કરો."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "પસંદ કરો"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "પસંદ કર્યું"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "રદ કરો"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "લૉગ આઉટ કરો"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "ફેસબુકનો ઉપયોગ કરીને લૉગ ઇન કરો"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@ તરીકે લૉગ ઇન થયાં"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "લૉગ ઇન કરો"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebook સાથે ચાલુ રાખો"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "ફેસબુક સાથે લૉગ ઇન કરો"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "લૉગ આઉટ કરો"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "ફેસબુક ખાતા પર ઍક્સેસ આપવામાં આવી નથી. ઉપકરણ સેટિંગ્સ ચકાસો"; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "ફેસબુકથી કનેક્ટ કરવામાં અસમર્થ. તમારું નેટવર્ક કનેક્શન તપાસો અને ફરી પ્રયાસ કરો."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "તમારો ફેસબુક પાસવર્ડ બદલાઈ ગયો છે. તમારા પાસવર્ડની પુષ્ટિ કરવા માટે, સેટિંગ્સ > ફેસબુક ખોલો અને તમારા નામ પર ટૅપ કરો."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "ઉપકરણ પર ફેસબુક ખાતું કન્ફિગર કરવામાં આવ્યું નથી."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "તમારા ખાતાની પુષ્ટિ કરવામાં આવી નથી. કૃપા કરીને www.facebook.com પર લૉગ ઇન કરો અને આપેલા સૂચનોને અનુસરો."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "તમે આ સમયે એપ્લિકેશન્સમાં લૉગ ઇન કરી શકતાં નથી. કૃપા કરીને www.facebook.com પર લૉગ ઇન કરો અને આપેલા સૂચનોને અનુસરો."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "તમે નિયંત્રણ કરો છો - તમે એપ્લિકેશન્સ સાથે કઈ માહિતી શેર કરવા માંગો છો તે પસંદ કરો."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "લૉગ ઇન કરો"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "મોકલો"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "શેર કરો"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "તમે નહિ?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "લૉગિનની પુષ્ટિ કરો"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@ તરીકે ચાલુ રાખો"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/he.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/he.lproj/FacebookSDK.strings deleted file mode 100644 index 2e2a3c56a..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/he.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "בקר ב-%@ והזן את הקוד המופיע למעלה."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "כדי לחבר את החשבון שלך, פתח את אפליקציית פייסבוק במכשיר הנייד שלך ובדוק אם יש התראות."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- או -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "אישור"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "ביטול"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "התחבר לאפליקציה זו שוב כדי לחבר מחדש את חשבון הפייסבוק שלך."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "אישור"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "השרת עמוס באופן זמני, נסה שוב."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "אהבתי"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "אהבתי"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "ביטול"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "התנתק"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "מחובר באמצעות פייסבוק"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "מחובר בתור %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "התחבר"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "המשך עם פייסבוק"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "התחבר באמצעות פייסבוק"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "התנתק"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "לא הוענקה גישה לחשבון הפייסבוק. אמת את הגדרות המכשיר."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "לא ניתן להתחבר לפייסבוק. בדוק את החיבור שלך לרשת ונסה שוב."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "סיסמת הפייסבוק שלך השתנתה. כדי לאשר את הסיסמה, פתח את 'הגדרות' > 'פייסבוק' והקש על שמך."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "חשבון הפייסבוק לא הוגדר במכשיר."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "החשבון שלך לא אושר. התחבר ל-www.facebook.com ופעל בהתאם להוראות שיוצגו."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "לא ניתן להתחבר לאפליקציות כעת. התחבר ל-www.facebook.com ופעל בהתאם להוראות שיוצגו."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "אתה מחליט - בחר איזה מידע אתה רוצה לשתף עם אפליקציות."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "התחבר"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "שלח"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "שתף"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "לא אתה?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "אשר התחברות"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "המשך כ-%@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/hi.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/hi.lproj/FacebookSDK.strings deleted file mode 100644 index 14b1b959e..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/hi.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@ पर जाएँ और ऊपर दिया गया कोड दर्ज करें."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "अपने खाते को कनेक्ट करने के लिए, अपने मोबाइल एप्लिकेशन में Facebook एप्लिकेशन खोलें और सूचनाओं के लिए जाँच करें."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- या -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "ठीक"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "रद्द करें"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "अपने Facebook खाते से फिर से कनेक्ट होने के लिए कृपया इस एप्लिकेशन में फिर से लॉग इन करें."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "ठीक"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "सर्वर अस्थायी रूप से व्यस्त है, कृपया फिर से कोशिश करें."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "पसंद करें"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "पसंद किया"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "रद्द करें"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "लॉग आउट करें"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Facebook का उपयोग करके लॉग इन किया हुआ है"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@ के रूप में लॉग इन किया हुआ है"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "लॉग इन करें"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebook के साथ जारी रखें"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Facebook से लॉग इन करें"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "लॉग आउट"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebook खाते को एक्सेस नहीं दी गई है. डिवाइस सेटिंग सत्यापित करें."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Facebook से कनेक्ट होने में असमर्थ. कृपया अपने नेटवर्क कनेक्शन की जाँच करें फिर से प्रयास करें."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "आपका Facebook पासवर्ड बदल गया है. अपना पासवर्ड कन्फ़र्म करने के लिए, सेटिंग > Facebook खोलें और अपना नाम टैप करें."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "डिवाइस पर Facebook खाता कॉन्फ़िगर नहीं किया गया है."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "आपका खाता कन्फ़र्म नहीं किया गया है. कृपया www.facebook.com में लॉग इन करें और दिए गए निर्देशों का पालन करें."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "आप इस समय एप्लिकेशन में लॉग इन नहीं कर सकते. कृपया www.facebook.com में लॉग इन करें और दिए गए निर्देशों का पालन करें."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "आप नियंत्रण में हैं - चुनें कि आप एप्लिकेशन से कौन-सी जानकारी साझा करना चाहते हैं."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "लॉग इन करें"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "भेजें"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "साझा करें"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "आप नहीं हैं?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "लॉग इन कन्फ़र्म करें"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@ के रूप में जारी रखें"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/hr.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/hr.lproj/FacebookSDK.strings deleted file mode 100644 index 45e331264..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/hr.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Posjetite adresu %@ i unesite gore prikazan kod."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Da biste povezali račun, otvorite aplikaciju Facebook na mobilnom uređaju i potražite obavijesti."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- ILI -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "U redu"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Odustani"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Ponovo se prijavite u ovu aplikaciju kako biste se ponovo povezali s Facebook računom."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "U redu"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Poslužitelj je privremeno zauzet, pokušajte ponovo."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Sviđa mi se"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Označeno sa \"sviđa mi se\""; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Odustani"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Odjavi se"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Prijavljen putem Facebooka"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Prijavljen kao %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Prijavi se"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Nastavite s korištenjem Facebooka"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Prijava putem Facebooka"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Odjavi se"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Pristup Facebook računu nije odobren. Provjerite postavke uređaja."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Povezivanje s Facebookom nije uspjelo. Provjerite mrežnu vezu i pokušajte ponovo."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Promijenili ste lozinku za Facebook. Za potvrdu lozinke otvorite Postavke > Facebook i dodirnite svoje ime."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Na uređaju nije konfiguriran račun za Facebook."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Vaš račun nije potvrđen. Prijavite se na www.facebook.com i slijedite upute."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "U ovome trenutku prijava u aplikacije nije moguća. Prijavite se na www.facebook.com i slijedite upute."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Vi odlučujete – odaberite koje podatke želite dijeliti u aplikacijama."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Prijava"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Pošalji"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Dijeli"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "To niste vi?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Potvrda prijave"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Nastavi kao %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/hu.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/hu.lproj/FacebookSDK.strings deleted file mode 100644 index 6d74f4670..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/hu.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Keresd fel a %@ címet, és írd be a fent megjelenített kódot."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "A fiók hozzákapcsolásához nyisd meg a Facebook alkalmazást a mobilkészülékeden, és nézd meg az értesítéseket."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- VAGY -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Mégsem"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Kérjük, jelentkezz be újra ebbe az alkalmazásba, ha szeretnéd ismét összekapcsolni a Facebook-fiókoddal."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "A kiszolgáló átmenetileg foglalt, próbáld meg újra."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Tetszik"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Kedveled"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Mégsem"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Kijelentkezés"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Bejelentkezve a Facebook használatával"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Bejelentkezve %@ néven"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Bejelentkezés"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Folytatás a Facebookkal"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Bejelentkezés a Facebook használatával"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Kijelentkezés"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "A Facebook-fiókhoz nincs megadva a hozzáférés. Ellenőrizd az eszköz beállításait."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Nem sikerült kapcsolódni a Facebookhoz. Ellenőrizd a hálózati kapcsolatot, majd próbáld meg újra."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Facebook-jelszavad megváltozott. A jelszó megerősítéséhez nyisd meg a Settings (Beállítások) > Facebook pontot, és koppints a nevedre."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "A készüléken nincs beállítva a Facebook-fiók."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "A fiókod nincs megerősítve. Jelentkezz be a www.facebook.com címre, és kövesd az utasításokat."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Jelenleg nem tudsz alkalmazásokba bejelentkezni. Jelentkezz be a www.facebook.com címre, és kövesd az utasításokat."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "A döntés a kezedben van: kiválaszthatod, hogy milyen adatokat osztasz meg az alkalmazásokkal."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Bejelentkezés"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Küldés"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Megosztás"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Nem te vagy az?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Bejelentkezés megerősítése"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Folytatás mint %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/id.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/id.lproj/FacebookSDK.strings deleted file mode 100644 index 651b51b22..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/id.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Kunjungi %@ dan masukkan kode yang ditampilkan di atas."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Untuk menghubungkan akun Anda, buka aplikasi Facebook di perangkat seluler Anda dan periksa pemberitahuan."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- ATAU -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Batal"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Harap masuk ke aplikasi ini lagi untuk menghubungkan kembali akun Facebook Anda."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Server untuk sementara sedang sibuk, harap coba lagi."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Suka"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Disukai"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Batal"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Keluar"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Masuk menggunakan Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Masuk sebagai %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Masuk"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Lanjutkan dengan Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Masuk menggunakan Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Keluar"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Akses belum diberikan ke akun Facebook. Verifikasi pengaturan perangkat."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Tidak dapat terhubung ke Facebook. Periksa koneksi jaringan dan coba lagi."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Kata sandi Facebook Anda telah diubah. Untuk mengonfirmasi kata sandi Anda, buka Pengaturan > Facebook, lalu ketuk nama Anda."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Akun Facebook belum dikonfigurasikan di perangkat."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Akun Anda tidak dikonfirmasi. Masuk ke www.facebook.com dan ikuti petunjuknya."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Saat ini Anda tidak dapat masuk ke aplikasi. Masuk ke www.facebook.com dan ikuti petunjuknya."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Anda memegang kendali - pilih info yang ingin Anda bagikan dengan aplikasi."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Masuk"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Kirim"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Berbagi"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Bukan Anda?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Konfirmasikan Masuk"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Lanjutkan sebagai %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/it.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/it.lproj/FacebookSDK.strings deleted file mode 100644 index 469ea536a..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/it.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Visita %@ e inserisci il codice mostrato sopra."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Per collegare il tuo account, apri l'app Facebook sul tuo dispositivo mobile e controlla se hai notifiche."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- OPPURE -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Annulla"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Effettua di nuovo l'accesso a questa applicazione per riconnettere il tuo account Facebook."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Il server è temporaneamente occupato, riprova."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Mi piace"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Ti piace"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Annulla"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Esci"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Accesso effettuato tramite Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Accesso effettuato come %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Accedi"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Continua con Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Accedi con Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Esci"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "All'account Facebook non è stato concesso l'accesso. Verifica le impostazioni del dispositivo."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Impossibile connettersi a Facebook. Controlla la tua connessione e riprova."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "La tua password di Facebook è stata modificata. Per confermare la password, apri Impostazioni > Facebook e tocca il tuo nome."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "L'account Facebook non è stato configurato nel dispositivo."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Il tuo account non è stato verificato. Accedi a www.facebook.com e segui le istruzioni fornite."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Impossibile accedere alle applicazioni al momento. Accedi a www.facebook.com e segui le istruzioni fornite."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Il controllo è nelle tue mani: scegli quali informazioni condividere con le app."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Accedi"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Invia"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Condividi"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Non sei tu?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Conferma l'accesso"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Continua come %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ja.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ja.lproj/FacebookSDK.strings deleted file mode 100644 index fb08bd740..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ja.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@にアクセスし、上に表示されているコードを入力してください。"; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "アカウントをリンクするには、お使いのモバイル機器でFacebookアプリを開き、お知らせをご確認ください。"; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- または -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "キャンセル"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "このアプリにもう一度ログインして、Facebookアカウントを再接続してください。"; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "サーバーが一時的にビジーです。もう一度お試しください。"; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "いいね!"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "いいね!済み"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "キャンセル"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "ログアウト"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Facebookを使用してログイン中"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@としてログイン中"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "ログイン"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebookで続ける"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Facebookでログイン"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "ログアウト"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebookアカウントにアクセス権が与えられていません。デバイス設定を確認してください。"; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Facebookに接続できませんでした。ネットワーク接続を確認してもう一度お試しください。"; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Facebookパスワードが変更されています。パスワードを確認するには、[設定] > [Facebook]の順に開き、名前をタップしてください。"; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "デバイスにFacebookアカウントが構成されていません。"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "アカウントが確認されません。www.facebook.comにログインし、表示される説明に従ってください。"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "今はアプリにログインできません。www.facebook.comにログインし、表示される説明に従ってください。"; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "アプリと共有する情報をコントロールできます。"; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "ログイン"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "送信"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "シェア"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "別のユーザーとしてログイン"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "ログインの確認"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@として続行"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/kn.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/kn.lproj/FacebookSDK.strings deleted file mode 100644 index f743a2793..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/kn.lproj/FacebookSDK.strings +++ /dev/null @@ -1,77 +0,0 @@ -/* The format string for device login instructions */ -"DeviceLogin.LogInPrompt" = "ನಿಮ್ಮ ಸ್ಮಾರ್ಟ್‌ ಫೋನ್‌ ಅಥವಾ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ %@ ಗೆ ಭೇಟಿ ನೀಡಿ ಮತ್ತು ಈ ಕೋಡ್‌ ಅನ್ನು ನಮೂದಿಸಿ:"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "ಸರಿ"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "ರದ್ದುಮಾಡು"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "ನಿಮ್ಮ Facebook ಖಾತೆಯನ್ನು ಮರುಸಂಪರ್ಕಗೊಳಿಸಲು ಈ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ಮತ್ತೊಮ್ಮೆ ಲಾಗಿನ್‌ ಮಾಡಿ."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "ಸರಿ"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "ಸರ್ವರ್ ತಾತ್ಕಾಲಿಕವಾಗಿ ಕಾರ್ಯನಿರತವಾಗಿದೆ, ದಯವಿಟ್ಟು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "ಇಷ್ಟವಾಗಿದೆ"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "ಇಷ್ಟಪಟ್ಟಿದ್ದಾರೆ"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "ರದ್ದುಮಾಡು"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "ಲಾಗ್‌ ಔಟ್‌"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Facebook ಬಳಸಿಕೊಂಡು ಲಾಗಿನ್‌ ಮಾಡಲಾಗಿದೆ"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@ ರಂತೆ ಲಾಗಿನ್‌ ಮಾಡಲಾಗಿದೆ"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "ಲಾಗ್‌ ಇನ್‌"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebook ಅನ್ನು ಮುಂದುವರಿಸಿ"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Facebook ಮೂಲಕ ಲಾಗ್‌ ಇನ್‌ ಮಾಡಿ"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "ಲಾಗ್‌ ಔಟ್‌"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebook ಖಾತೆಗೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ. ಸಾಧನದ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Facebook ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "ನಿಮ್ಮ Facebook ಪಾಸ್‌ವರ್ಡ್‌ ಬದಲಿಸಲಾಗಿದೆ. ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ ಖಚಿತಪಡಿಸಲು, ಸೆಟ್ಟಿಂಗ್‌ಗಳು > Facebook ತೆರೆಯಿರಿ ಮತ್ತು ನಿಮ್ಮ ಹೆಸರನ್ನು ಟ್ಯಾಪ್‌ ಮಾಡಿ."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Facebook ಖಾತೆಯನ್ನು ಸಾಧನದಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿಲ್ಲ."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "ನಿಮ್ಮ ಖಾತೆಯನ್ನು ದೃಢೀಕರಿಸಿಲ್ಲ. ದಯವಿಟ್ಟು www.facebook.com ಗೆ ಲಾಗಿನ್‌ ಮಾಡಿ ಮತ್ತು ಕೆಳಗೆ ನೀಡಿದ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "ನೀವು ಈ ಸಮಯದಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಲಾಗಿನ್‌ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು www.facebook.com ಗೆ ಲಾಗಿನ್‌ ಮಾಡಿ ಮತ್ತು ಕೆಳಗೆ ನೀಡಿದ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "ನೀವು ನಿಯಂತ್ರಣದಲ್ಲಿರುವಿರಿ - ನೀವು ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಹಂಚಿಕೊಳ್ಳಲು ಬಯಸುವ ವಿಷಯವನ್ನು ಆರಿಸಿ."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "ಲಾಗ್‌ ಇನ್‌"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "ಕಳುಹಿಸಿ"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "ಹಂಚಿಕೊಳ್ಳಿ"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ko.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ko.lproj/FacebookSDK.strings deleted file mode 100644 index 0dbd73faa..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ko.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@를 방문하여 위에 표시된 코드를 입력하세요."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "계정을 연결하려면 모바일 기기에서 Facebook 앱을 열고 알림을 확인하세요."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- 또는 -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "확인"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "취소"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Facebook 계정을 다시 연결하려면 이 앱에 다시 로그인하세요."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "확인"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "일시적으로 서버 사용량이 많아졌습니다. 다시 시도하세요."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "좋아요"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "좋아요"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "취소"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "로그아웃"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Facebook 계정으로 로그인함"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@(으)로 로그인함"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "로그인"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebook으로 계속"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Facebook으로 로그인"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "로그아웃"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebook 계정에 대한 액세스가 승인되지 않았습니다. 기기 설정을 확인하세요."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Facebook에 연결할 수 없습니다. 네트워크 연결을 확인하고 다시 시도하세요."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Facebook 비밀번호가 변경되었습니다. 비밀번호를 확인하려면 설정 > Facebook으로 이동하여 이름을 누르세요."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Facebook 계정이 기기에 구성되어 있지 않습니다."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "계정이 확인되지 않았습니다. www.facebook.com에 로그인한 뒤 안내를 따라주세요."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "현재 앱에 로그인할 수 없습니다. www.facebook.com에 로그인한 뒤 안내를 따라주세요."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "원하는 정보를 선택하여 앱에 공유할 수 있습니다."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "로그인"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "보내기"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "공유하기"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "회원님이 아닌가요?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "로그인 확인"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@님으로 계속"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ml.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ml.lproj/FacebookSDK.strings deleted file mode 100644 index e7a0189b5..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ml.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@ സന്ദർശിച്ച്‌ മുകളിൽ കാണിച്ച‌ കോഡ്‌ നൽകുക."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "നിങ്ങളുടെ അക്കൗണ്ട്‌ കണക്‌റ്റുചെയ്യാൻ, നിങ്ങളുടെ മൊബൈൽ ഉപകരണത്തിലെ Facebook ആപ്പ്‌ തുറന്ന്‌ അറിയിപ്പുകൾ പരിശോധിക്കുക."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- അല്ലെങ്കിൽ -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "ശരി"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "റദ്ദാക്കുക"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "നിങ്ങളുടെ Facebook അക്കൗണ്ടുമായി വീണ്ടും കണക്‌റ്റുചെയ്യുന്നതിന് ഈ ആപ്ലിക്കേഷനിൽ വീണ്ടും ലോഗിൻ ചെയ്യുക."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "ശരി"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "സെർവർ താൽക്കാലികമായി തിരക്കിലാണ്, വീണ്ടും ശ്രമിക്കുക."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "ലൈക്കുചെയ്യുക"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "ലൈക്കുചെയ്‌‌തു"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "റദ്ദാക്കുക"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "ലോഗ്ഔട്ട് ചെയ്യുക"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Facebook ഉപയോഗിച്ച് ലോഗിൻ ചെയ്‌തു"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@ എന്നതായി ലോഗിൻ ചെയ്‌തു"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "ലോഗിൻ ചെയ്യുക"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebook ഉപയോഗിച്ച് തുടരുക"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Facebook ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യുക"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "ലോഗ്ഔട്ട് ചെയ്യുക"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebook അക്കൗണ്ടിലേക്ക് ആക്‌സസ് നൽകിയിട്ടില്ല. ഉപകരണ ക്രമീകരണങ്ങൾ പരിശോധിച്ചുറപ്പിക്കുക."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Facebook-ലേക്ക് കണക്‌റ്റുചെയ്യാനായില്ല. നിങ്ങളുടെ നെറ്റ്‌വർക്ക് കണക്ഷൻ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "നിങ്ങളുടെ Facebook പാസ്‌വേഡ് മാറി. പാ‌സ്‌വേഡ് സ്ഥിരീകരിക്കുന്നതിന് ക്രമീകരണങ്ങൾ > Facebook എന്നത് തുറന്ന് പേര് ടാപ്പുചെയ്യുക."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "ഉപകരണത്തിൽ Facebook അക്കൗണ്ട് കോൺഫിഗർ ചെയ്‌തിട്ടില്ല."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "അക്കൗണ്ട് സ്ഥിരീകരിച്ചു. www.facebook.com എന്നതിലേക്ക് ലോഗിൻ ചെയ്‌ത് തന്നിരിക്കുന്ന നിർദ്ദേശങ്ങൾ പാലിക്കുക."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "നിങ്ങൾക്ക് ഈ സമയം ആപ്ലിക്കേഷനുകളിലേക്ക് ലോഗിൻ ചെയ്യാനാവില്ല. www.facebook.com എന്നതിലേക്ക് ലോഗിൻ ചെയ്‌ത് തന്നിരിക്കുന്ന നിർദ്ദേശങ്ങൾ പാലിക്കുക."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "നിങ്ങളുടെ നിയന്ത്രണത്തിലാണ് - നിങ്ങൾക്ക് ആപ്‌സുമായി ഏതെല്ലാം വിവരങ്ങൾ പങ്കിടണമെന്ന് തിരഞ്ഞെടുക്കുക."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "ലോഗിൻ ചെയ്യുക"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "അയയ്‌ക്കുക"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "പങ്കിടൂ"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "നിങ്ങൾ അല്ലേ?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "ലോഗിൻ സ്ഥിരീകരിക്കുക"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@ ആയി തുടരുക"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/mr.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/mr.lproj/FacebookSDK.strings deleted file mode 100644 index 246b69266..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/mr.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@ वर भेट द्या आणि वर दर्शवलेला कोड प्रविष्ट करा."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "तुमचे खाते कनेक्ट करण्यासाठी, तुमच्या मोबाईल उपकरणावर Facebook अॅप उघडा आणि सूचना तपासा."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- किंवा -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "ठीक"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "रद्द करा"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "कृपया आपले फेसबुक खाते रीकनेक्ट करण्यासाठी या अनुप्रयोगावर पुन्हा लॉग इन करा."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "ठीक"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "सर्व्हर तात्पुरता व्यस्त आहे, कृपया पुन्हा प्रयत्न करा."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "आवडले"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "आवडलेले"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "रद्द करा"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "लॉग आउट करा"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "फेसबुक वापरून लॉग इन केले"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@ म्हणून लॉग इन केले"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "लॉग इन करा"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebook सह चालू ठेवा"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "फेसबुकसह लॉग इन करा"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "लॉग आउट करा"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "फेसबुक खात्यावर प्रवेशास मंजूरी दिली गेली नाही. डिव्हाइस सेटिंग्ज सत्यापित करा."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "फेसबुकशी कनेक्ट करण्यात अक्षम. आपले नेटवर्क कनेक्शन तपासा आणि पुन्हा प्रयत्न करा."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "आपला फेसबुक पासवर्ड बदलला आहे. आपल्या पासवर्डची पुष्टी करण्यासाठी, सेटिंग्ज > फेसबुक उघडा आणि आपले नाव टॅप करा."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "डिव्हाइसवर फेसबुक खाते कॉन्फिगर केले गेले नाही."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "आपल्या खात्याची पुष्टी झाली नाही. कृपया www.facebook.com वर लॉग इन करा आणि दिलेल्या सूचनांचे अनुसरण करा."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "आपण यावेळी अनुप्रयोगांवर लॉग इन करू शकत नाही. कृपया www.facebook.com वर लॉग इन करा आणि दिलेल्या सूचनांचे अनुसरण करा."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "तुम्ही नियंत्रणात आहात - तुम्ही कोणती माहिती अॅपसह सामायिक करू इच्छिता ते निवडा."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "लॉग इन करा"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "पाठवा"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "सामायिक करा"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "तुम्ही नाही?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "लॉग इन पुष्टी करा"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@ म्हणून चालू ठेवा"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ms.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ms.lproj/FacebookSDK.strings deleted file mode 100644 index 20b212aa3..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ms.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Lawati %@ dan masukkan kod yang ditunjukkan di atas."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Untuk menghubungkan akaun anda, buka apl Facebook di peranti mudah alih anda dan semak pemberitahuan."; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Bukan anda?"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Batal"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Sila log masuk ke aplikasi ini sekali lagi untuk menyambung semula akaun Facebook anda."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Pelayan ini sibuk buat sementara waktu, sila cuba lagi."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Suka"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Disukai"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Batal"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Log Keluar"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Dilog masuk menggunakan Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Dilog masuk sebagai %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Log masuk"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Teruskan dengan Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Log masuk dengan Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Log keluar"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Akses ke akaun Facebook tidak diberikan. Sahkan tetapan peranti."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Tidak dapat menyambung ke Facebook. Semak sambungan rangkaian anda dan cuba lagi."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Kata laluan Facebook anda telah ditukar. Untuk mengesahkan kata laluan anda, buka Tetapan > Facebook dan ketik nama anda."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Akaun Facebook masih belum dikonfigurasikan pada peranti."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Akaun anda tidak disahkan. Sila log masuk ke www.facebook.com dan ikuti arahan yang diberi."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Anda tidak boleh log masuk ke aplikasi pada masa ini. Sila log masuk ke www.facebook.com dan ikuti arahan yang diberi."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Anda yang mengawal - pilih maklumat yang anda ingin kongsi dengan apl."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Log Masuk"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Hantar"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Kongsi"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Sahkan Log Masuk"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Teruskan sebagai %@"; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- ATAU -"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/nb.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/nb.lproj/FacebookSDK.strings deleted file mode 100644 index 2307ecb03..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/nb.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Gå til %@, og oppgi koden som vises ovenfor."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Koble til kontoen din ved å åpne Facebook-appen på mobilenheten din og se etter varsler."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- ELLER -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Avbryt"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Logg deg inn igjen på denne appen for å koble til Facebook-kontoen på nytt."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Serveren er midlertidig opptatt. Prøv på nytt."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Liker"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Likt"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Avbryt"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Logg ut"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Logget inn med Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Logget inn som %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Logg inn"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Fortsett med Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Logg inn med Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Logg ut"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Det er ikke gitt tilgang til Facebook-kontoen. Bekreft enhetsinnstillinger."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Kunne ikke koble til Facebook. Kontroller nettverkstilkoblingen, og prøv på nytt."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Facebook-passordet ditt er endret. Bekreft passordet ditt ved å gå til Innstillinger > Facebook og trykke på navnet ditt."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Facebook-kontoen er ikke konfigurert på enheten."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Kontoen din er bekreftet. Logg deg inn på www.facebook.com, og følg instruksjonene."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Du kan ikke logge deg inn på apper for øyeblikket. Logg deg inn på www.facebook.com, og følg instruksjonene."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Du bestemmer – velg hvilke opplysninger du vil dele med appene."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Logg inn"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Send"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Del"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Ikke deg?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Bekreft innlogging"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Fortsett som %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/nl.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/nl.lproj/FacebookSDK.strings deleted file mode 100644 index 899870ef3..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/nl.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Ga naar %@ en voer de bovenstaande code in."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Om je account te verbinden, open je de Facebook-app op je mobiele apparaat en controleer of je meldingen ziet."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- OF -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Annuleren"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Meld je nogmaals aan bij deze app om verbinding te maken met je Facebook-account."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "De server is tijdelijk niet beschikbaar. Probeer het opnieuw."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Vind ik leuk"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Vind ik leuk"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Annuleren"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Afmelden"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Aangemeld via Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Aangemeld als %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Aanmelden"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Doorgaan met Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Aanmelden met Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Afmelden"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Er is geen toegang verleend aan het Facebook-account. Verifieer de apparaatinstellingen."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Er kan geen verbinding worden gemaakt met Facebook. Controleer je netwerkverbinding en probeer het opnieuw."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Je Facebook-wachtwoord is gewijzigd. Open Instellingen > Facebook en tik op je naam om je wachtwoord te bevestigen."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Het Facebook-account is niet geconfigureerd op het apparaat."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Je account is niet bevestigd. Meld je aan bij www.facebook.com en volg de instructies."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Je kunt je momenteel niet aanmelden bij apps. Meld je aan bij www.facebook.com en volg de instructies."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Jij hebt de controle. Kies welke informatie je met apps wilt delen."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Aanmelden"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Verzenden"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Delen"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Ben jij dit niet?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Aanmelden bevestigen"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Doorgaan als %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pa.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pa.lproj/FacebookSDK.strings deleted file mode 100644 index 29ca53683..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pa.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@ ਵਿੱਚ ਜਾਓ ਅਤੇ ਉੱਤੇ ਦਿਖਾਏ ਗਏ ਕੋਡ ਨੂੰ ਦਾਖ਼ਲ ਕਰੋ।"; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "ਆਪਣੇ ਖਾਤੇ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਲਈ, ਆਪਣੀ ਮੋਬਾਈਲ ਡਿਵਾਈਸ 'ਤੇ Facebook ਐਪ ਨੂੰ ਖੋਲ੍ਹੋ ਅਤੇ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦੇਖੋ।"; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- ਜਾਂ -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "ਠੀਕ"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "ਰੱਦ ਕਰੋ"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ Facebook ਖਾਤੇ ਨਾਲ ਮੁੜ ਕਨੈਕਟ ਕਰਨ ਲਈ ਇਸ ਐਪ ਵਿੱਚ ਦੁਬਾਰਾ ਲੌਗ ਇਨ ਕਰੋ।"; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "ਠੀਕ"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "ਇਹ ਸਰਵਰ ਅਸਥਾਈ ਰੂਪ ਵਿੱਚ ਵਿਅਸਤ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "ਪਸੰਦ ਕਰੋ"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "ਪਸੰਦ ਕੀਤਾ ਗਿਆ"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "ਰੱਦ ਕਰੋ"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "ਲੌਗ ਆਉਟ ਕਰੋ"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Facebook ਦਾ ਉਪਯੋਗ ਕਰਕੇ ਲੌਗ ਇਨ ਕੀਤਾ ਗਿਆ"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@ ਵੱਜੋਂ ਲੌਗ ਇਨ ਕੀਤਾ ਗਿਆ"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "ਲੌਗ ਇਨ ਕਰੋ"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebook ਦੇ ਨਾਲ ਜਾਰੀ ਰੱਖੋ"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Facebook ਦੇ ਨਾਲ ਲੌਗ ਇਨ ਕਰੋ"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "ਲੌਗ ਆਉਟ ਕਰੋ"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebook ਖਾਤੇ ਨੂੰ ਐਕਸੈਸ ਪ੍ਰਦਾਨ ਨਹੀਂ ਕੀਤੀ ਗਈ। ਡਿਵਾਈਸ ਸੈੱਟਿੰਗਜ਼ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।"; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Facebook ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਅਸਮਰਥਿਤ ਆਪਣੇ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "ਤੁਹਾਡੇ Facebook ਪਾਸਵਰਡ ਨੂੰ ਬਦਲ ਦਿੱਤਾ ਗਿਆ ਹੈ। ਆਪਣੇ ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ, ਸੈੱਟਿੰਗਜ਼ > Facebook ਖੋਲ੍ਹੋ ਅਤੇ ਆਪਣੇ ਨਾਂ ਨੂੰ ਟੈਪ ਕਰੋ।"; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Facebook ਖਾਤੇ ਨੂੰ ਡਿਵਾਈਸ 'ਤੇ ਕਨਫ਼ੀਗਰ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "ਤੁਹਾਡੇ ਖਾਤੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਗਈ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ www.facebook.com ਵਿੱਚ ਲੌਗ ਇਨ ਕਰੋ ਅਤੇ ਹੇਠਾਂ ਦਿੱਤੇ ਨਿਰਦੇਸ਼ਾਂ ਦਾ ਪਾਲਣ ਕਰੋ।"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "ਤੁਸੀਂ ਇਸ ਸਮੇਂ ਐਪ ਵਿੱਚ ਲੌਗ ਇਨ ਨਹੀਂ ਕਰ ਸਕਦੇ ਹੋ। ਕਿਰਪਾ ਕਰਕੇ www.facebook.com ਵਿੱਚ ਲੌਗ ਇਨ ਕਰੋ ਅਤੇ ਹੇਠਾਂ ਦਿੱਤੇ ਨਿਰਦੇਸ਼ਾਂ ਦਾ ਪਾਲਣ ਕਰੋ।"; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "ਤੁ\ਸੀਂ ਨਿਯੰਤਰਣ ਵਿੱਚ ਹੋ - ਉਹ ਜਾਣਕਾਰੀ ਚੁਣੋ ਜੋ ਤੁਸੀਂ ਐਪਸ ਦੇ ਨਾਲ ਸਾਂਝੀ ਕਰਨੀ ਚਾਹੁੰਦੇ ਹੋ।"; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "ਲੌਗ ਇਨ ਕਰੋ"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "ਸਾਂਝਾ ਕਰੋ"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "ਭੇਜੋ"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "ਕੀ ਤੁਸੀਂ ਨਹੀਂ ਹੋ?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "ਲੌਗਇਨ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@ ਵੱਜੋਂ ਜਾਰੀ ਰੱਖੋ"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pl.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pl.lproj/FacebookSDK.strings deleted file mode 100644 index f7e86816c..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pl.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Wejdź na stronę %@ i wprowadź podany powyżej kod."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Aby połączyć konto, otwórz aplikację Facebook na urządzeniu mobilnym i sprawdź powiadomienia."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- LUB -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Anuluj"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Zaloguj się jeszcze raz do aplikacji, aby ponownie przyłączyć swoje konto na Facebooku."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Serwer jest zajęty, spróbuj później."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Lubię to!"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Polubione"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Anuluj"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Wyloguj się"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Zalogowano przez Facebooka"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Zalogowano jako %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Zaloguj się"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Kontynuuj za pośrednictwem Facebooka"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Zaloguj się przez Facebooka"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Wyloguj się"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Brak dostępu z tego konta na Facebooku. Sprawdź ustawienia urządzenia."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Nie można połączyć się z Facebookiem. Sprawdź połączenie sieciowe i spróbuj ponownie."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Twoje hasło do Facebooka zostało zmienione. Aby potwierdzić hasło, otwórz Ustawienia > Facebook i dotknij swojego imienia i nazwiska."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Na tym urządzeniu nie skonfigurowano konta na Facebooku."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Konto niepotwierdzone. Zaloguj się przez stronę www.facebook.com i postępuj zgodnie ze wskazówkami."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Brak możliwości logowania się do aplikacji. Zaloguj się przez stronę www.facebook.com i postępuj zgodnie ze wskazówkami."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Masz pełną kontrolę – określ, jakie informacje chcesz udostępniać aplikacjom."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Zaloguj się"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Wyślij"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Udostępnij"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "To nie Ty?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Potwierdź logowanie"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Kontynuuj jako %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pt.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pt.lproj/FacebookSDK.strings deleted file mode 100644 index 781791229..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pt.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Acesse %@ e introduza o código mostrado acima."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Para conectar sua conta, abra o aplicativo Facebook em seu dispositivo móvel e verifique se tem notificações."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "– OU –"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Cancelar"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Entre nesse aplicativo novamente para reconectar sua conta do Facebook."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "O servidor está temporariamente ocupado. Tente novamente."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Curtir"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Curtiu"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Cancelar"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Sair"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Você entrou usando o Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Conectado como %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Entrar"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Continuar com o Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Entrar com o Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Sair"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "O acesso à conta do Facebook não foi permitido. Verifique as configurações do dispositivo."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Não foi possível se conectar ao Facebook. Verifique sua conexão de rede e tente novamente."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "A sua senha do Facebook foi alterada. Para confirmar a sua senha, abra Configurações > Facebook e toque no seu nome."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "A conta do Facebook não foi configurada no dispositivo."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "A sua conta não foi confirmada. Entre no site www.facebook.com e siga as instruções fornecidas."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Não é possível entrar em aplicativos neste momento. Entre no site www.facebook.com e siga as instruções fornecidas."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Você é quem controla — escolha quais informações você quer compartilhar com os aplicativos."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Entrar"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Envio"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Compartilhar"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Não é você?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Confirme o login"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Continue como %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pt_PT.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pt_PT.lproj/FacebookSDK.strings deleted file mode 100644 index 1fd2d29ea..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/pt_PT.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Visita %@ e introduz o código mostrado acima."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Para ligares a tua conta, abre a app Facebook no teu dispositivo móvel e verifica se tens notificações."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "– OU –"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Cancelar"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Volta a iniciar sessão nesta aplicação para te ligares novamente à tua conta do Facebook."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "O servidor está temporariamente ocupado. Tenta novamente."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Gosto"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Gostei"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Cancelar"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Terminar sessão"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Com sessão iniciada através do Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Com sessão iniciada como %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Iniciar sessão"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Continuar com o Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Iniciar sessão com o Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Terminar a sessão"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "O acesso não foi concedido à conta do Facebook. Verificar as definições do dispositivo."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Não é possível ligar ao Facebook. Verifica a tua ligação à rede e tenta novamente."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "A tua palavra-passe do Facebook foi alterada. Para confirmares a tua palavra-passe, abre as Definições > Facebook e toca no teu nome."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "A conta do Facebook não foi configurada no dispositivo."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "A tua conta não foi confirmada. Inicia sessão em www.facebook.com e segue as instruções indicadas."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Não podes iniciar sessão em aplicações neste momento. Inicia sessão em www.facebook.com e segue as instruções indicadas."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Tens o controlo: escolhe a informação que pretendes partilhar com as apps."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Iniciar sessão"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Enviar"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Partilhar"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Não és tu?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Confirmar Início de Sessão"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Continuar como %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ru.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ru.lproj/FacebookSDK.strings deleted file mode 100644 index 114e0be23..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ru.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Откройте страницу %@ и введите представленный выше код."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Чтобы подключить аккаунт, откройте приложение Facebook на мобильном устройстве и проверьте уведомления."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- ИЛИ -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Отменить"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Войдите в это приложение еще раз, чтобы повторно подключить ваш аккаунт Facebook."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Сервер временно загружен, повторите попытку."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Нравится"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Понравилось"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Отменить"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Выход"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Выполнен вход с помощью Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Вы вошли как %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Вход"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Продолжить с Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Вход через Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Выход"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Аккаунту Facebook доступ не предоставлен. Проверьте настройки устройства."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Не удалось подключиться к Facebook. Проверьте сетевое подключение и повторите попытку."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Ваш пароль Facebook изменен. Чтобы подтвердить пароль, откройте «Настройки» > Facebook и коснитесь вашего имени."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "На устройстве не настроен аккаунт Facebook."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Ваш аккаунт не подтвержден. Войдите на сайт www.facebook.com и следуйте инструкциям."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Сейчас нельзя войти в приложения. Войдите на сайт www.facebook.com и следуйте инструкциям."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Вы сами выбираете, какой информацией поделиться с приложениями."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Вход в систему"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Отправить"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Поделиться"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Это не вы?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Подтвердить вход"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Продолжить как %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/sk.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/sk.lproj/FacebookSDK.strings deleted file mode 100644 index 1c1e2a836..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/sk.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Navštívte stránku %@ a zadajte kód zobrazený vyššie."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Na pripojenie svojho účtu otvorte vo svojom mobilnom zariadení aplikáciu Facebook a skontrolujte upozornenia."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- ALEBO -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Zrušiť"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Ak sa chcete znova pripojiť k svojmu účtu na Facebooku, prihláste sa znova do tejto aplikácie."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Server je dočasne zaneprázdnený – skúste znova."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Páči sa mi to"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Páči sa mi to"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Zrušiť"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Odhlásiť"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Prihlásený cez Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Prihlásený ako %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Prihlásiť sa"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Pokračovať s Facebookom"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Prihlásiť sa cez Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Odhlásiť sa"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Danému účtu na Facebooku nebol poskytnutý prístup. Skontrolujte nastavenia zariadenia."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Nedá sa pripojiť k Facebooku. Skontrolujte svoje sieťové pripojenie a skúste znova."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Vaše heslo pre Facebook sa zmenilo. Na potvrdenie svojho hesla otvorte Nastavenia > Facebook a ťuknite na svoje meno."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Daný účet na Facebooku nebol nastavený v zariadení."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Váš účet nie je potvrdený. Prihláste sa na stránke www.facebook.com a postupujte podľa pokynov."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Momentálne sa nemôžete prihlásiť do aplikácií. Prihláste sa na stránke www.facebook.com a postupujte podľa pokynov."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Máte to pod kontrolou: vyberte, ktoré informácie chcete zdieľať s aplikáciami."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Prihlásenie sa"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Odoslať"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Zdieľať"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Nie ste to vy?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Potvrdiť prihlásenie"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Pokračovať ako %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/sv.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/sv.lproj/FacebookSDK.strings deleted file mode 100644 index 3fd3107bf..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/sv.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Besök %@ och ange koden som visas ovan."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Koppla ditt konto genom att öppna Facebook-appen på din mobila enhet och söka efter aviseringar."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- ELLER -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Avbryt"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Logga in på den här appen igen om du vill ansluta ditt Facebook-konto på nytt."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Servern är upptagen för tillfället. Försök igen."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Gilla"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Gillade"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Avbryt"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Logga ut"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Inloggad med Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Inloggad som %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Logga in"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Fortsätt med Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Logga in med Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Logga ut"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Du har inte fått tillgång till Facebook-kontot. Verifiera enhetsinställningar."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Det går inte att ansluta till Facebook. Kontrollera nätverksanslutningen och försök igen."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Ditt Facebook-lösenord har ändrats. Bekräfta lösenordet genom att öppna Inställningar > Facebook och skriva in ditt namn."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Facebook-konto har inte konfigurerats på enheten."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Ditt konto har inte bekräftats. Logga in på www.facebook.com och följ instruktionerna."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Du kan inte logga in på appar för närvarande. Logga in på www.facebook.com och följ instruktionerna."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Du bestämmer – välj vilken info du vill dela med appar."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Logga in"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Skicka"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Dela"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Inte du?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Bekräfta inloggning"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Fortsätt som %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ta.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ta.lproj/FacebookSDK.strings deleted file mode 100644 index c0d2d08da..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/ta.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@ என்பதற்குச் சென்று மேலே தெரியும் குறியீட்டை உள்ளிடவும்."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "உங்கள் கணக்குடன் இணைக்க, உங்கள் மொபைல் சாதனத்தில் Facebook பயன்பாட்டைத் திறந்து அறிவிப்புகளைப் பார்க்கவும்."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- அல்லது -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "சரி"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "ரத்துசெய்"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "உங்கள் Facebook கணக்கில் மீண்டும் இணைய, இந்தப் பயன்பாட்டில் மீண்டும் உள்நுழையவும்."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "சரி"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "சேவையகம் தற்காலிகமாக பிஸியாக உள்ளது, மீண்டும் முயற்சிக்கவும்."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "விருப்பம்"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "விரும்பப்பட்டது"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "ரத்துசெய்"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "வெளியேறு"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Facebook மூலம் உள்நுழையப்பட்டுள்ளது"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@ இல் உள்நுழைந்துள்ளீர்கள்"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "உள்நுழைவு"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebook இல் தொடரவும்"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Facebook மூலம் உள்நுழையவும்"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "வெளியேறு"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebook கணக்கிற்கு அணுகல் வழங்கப்படவில்லை. சாதன அமைப்புகளைச் சரிபார்க்கவும்."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Facebook இல் இணைய முடியவில்லை. இணைய இணைப்பைச் சரிபார்த்து, மீண்டும் முயற்சிக்கவும்."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Facebook கடவுச்சொல் மாற்றப்பட்டது. கடவுச்சொல்லை உறுதிசெய்ய, அமைப்புகள் > Facebook க்கு சென்று உங்கள் பெயரைத் தட்டவும்."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "சாதனத்தில் Facebook கணக்கு உள்ளமைக்கப்படவில்லை."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "உங்கள் கணக்கு உறுதிசெய்யப்படவில்லை. www.facebook.com இல் உள்நுழைந்து, வழங்கப்பட்டுள்ள வழிமுறைகளைப் பின்பற்றவும்."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "இப்போது பயன்பாடுகளில் உள்நுழைய முடியாது. www.facebook.com இல் உள்நுழைந்து, வழங்கப்பட்டுள்ள வழிமுறைகளைப் பின்பற்றவும்."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "பயன்பாடுகளில் எந்தத் தகவலைப் பகிர விரும்புகிறீர்கள் என்பதை நீங்கள் கட்டுப்படுத்தலாம்."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "உள்நுழைவு"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "அனுப்பு"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "பகிர்"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "நீங்கள் இல்லையா?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "உள்நுழைவை உறுதிப்படுத்தவும்"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@ ஆகத் தொடரவும்"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/te.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/te.lproj/FacebookSDK.strings deleted file mode 100644 index 7605c9b5e..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/te.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@ లింక్‌ను సందర్శించి, ఎగువ చూపిన కోడ్‌ను నమోదు చేయండి."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "మీ ఖాతాను అనుసంధానించడానికి, మీ మొబైల్ పరికరంలో Facebook అనువర్తనాన్ని తెరిచి, నోటిఫికేషన్‌లను తనిఖీ చేయండి."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- లేదా -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "ఒప్పుకుంటున్నాను"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "రద్దు చేయి"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "దయచేసి మీ Facebook ఖాతాను మళ్లీ కనెక్ట్ చేయడానికి ఈ అప్లికేషన్‌కు మళ్లీ లాగిన్ చేయండి."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "ఒప్పుకుంటున్నాను"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "సర్వర్ తాత్కాలికంగా బిజీగా ఉంది, దయచేసి మళ్లీ ప్రయత్నించండి."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "ఇష్టంగా గుర్తు పెట్టు"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "ఇష్టంగా గుర్తు పెట్టబడింది"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "రద్దు చేయి"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "లాగ్ అవుట్ చేయి"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Facebook ఉపయోగించి లాగిన్ చేసారు"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@గా లాగిన్ చేసారు"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "లాగిన్ చేయి"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebookతో కొనసాగించండి"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Facebookతో లాగిన్ చేయి"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "లాగ్ అవుట్ చేయి"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebook ఖాతాకు ప్రాప్యత మంజూరు చేయలేదు. పరికర సెట్టింగ్‌లను సరిచూడండి."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Facebookకి కనెక్ట్ చేయడం సాధ్యపడలేదు. మీ నెట్‌వర్క్ కనెక్షన్‌ను తనిఖీ చేసి, మళ్లీ ప్రయత్నించండి."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "మీ Facebook పాస్‌వర్డ్ మారింది. మీ పాస్‌వర్డ్‌ను నిర్ధారించడానికి, సెట్టింగ్‌లు > Facebook తెరిచి, మీ పేరు నొక్కండి."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "పరికరంలో Facebook ఖాతా కాన్ఫిగర్ చేయబడలేదు."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "మీ ఖాతా నిర్ధారించబడలేదు. దయచేసి www.facebook.comకి లాగిన్ చేసి, అందించిన సూచనలను అనుసరించండి."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "ప్రస్తుతం మీరు అప్లికేషన్‌లకు లాగిన్ చేయలేరు. దయచేసి www.facebook.comకి లాగిన్ చేసి, అందించిన సూచనలను అనుసరించండి."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "మీకు నియంత్రణ ఉంది - మీరు అనువర్తనాలతో భాగస్వామ్యం చేయాలనుకునే సమాచారాన్ని ఎంచుకోండి."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "లాగిన్ చేయండి"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "పంపు"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "భాగస్వామ్యం చేయండి"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "మీరు కాదా?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "లాగిన్‌ను నిర్ధారించండి"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@ వలె కొనసాగండి"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/th.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/th.lproj/FacebookSDK.strings deleted file mode 100644 index 8c5c9fde4..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/th.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "ไปที่ %@ และใส่โค้ดที่แสดงด้านบน"; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "หากต้องการเชื่อมต่อบัญชีผู้ใช้ของคุณ ให้เปิดแอพ Facebook บนอุปกรณ์มือถือของคุณและตรวจสอบการแจ้งเตือน"; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- หรือ -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "ตกลง"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "ยกเลิก"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "โปรดลงชื่อเข้าใช้แอพนี้อีกครั้งเพื่อเชื่อมต่อบัญชีผู้ใช้ Facebook ของคุณใหม่"; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "ตกลง"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "เซิร์ฟเวอร์ไม่พร้อมให้บริการชั่วคราว โปรดลองใหม่อีกครั้ง"; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "ถูกใจ"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "ถูกใจแล้ว"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "ยกเลิก"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "ออกจากระบบ"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "เข้าสู่ระบบโดยใช้ Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "เข้าสู่ระบบในชื่อ %@"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "เข้าสู่ระบบ"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "ดำเนินการต่อด้วย Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "เข้าสู่ระบบด้วย Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "ออกจากระบบ"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "บัญชีผู้ใช้ Facebook ไม่ได้รับอนุญาตให้เข้าถึง ตรวจสอบการตั้งค่าของอุปกรณ์"; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "ไม่สามารถเชื่อมต่อกับ Facebook ตรวจสอบการเชื่อมต่อเครือข่ายและลองอีกครั้ง"; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "เปลี่ยนรหัสผ่าน Facebook ของคุณแล้ว เพื่อยืนยันรหัสผ่านของคุณ ให้เปิด การตั้งค่า > Facebook แล้วแตะชื่อของคุณ"; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "บัญชีผู้ใช้ Facebook ไม่ได้รับการกำหนดค่าบนอุปกรณ์เครื่องนี้"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "บัญชีผู้ใช้ของคุณไม่ได้รับการยืนยัน โปรดเข้าสู่ระบบที่ www.facebook.com และทำตามคำแนะนำที่ปรากฏ"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "คุณไม่สามารถเข้าสู่ระบบของแอพได้ในตอนนี้ โปรดเข้าสู่ระบบที่ www.facebook.com และทำตามคำแนะนำที่ปรากฏ"; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "คุณเป็นฝ่ายควบคุม โปรดเลือกข้อมูลที่คุณต้องการแชร์ด้วยแอพ"; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "เข้าสู่ระบบ"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "ส่ง"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "แชร์"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "หากไม่ใช่คุณ"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "ยืนยันการเข้าสู่ระบบ"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "ดำเนินการต่อในชื่อ %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/tr.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/tr.lproj/FacebookSDK.strings deleted file mode 100644 index 3d57b8f21..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/tr.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "%@ adresini ziyaret edin ve yukarıda görülen kodu girin."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Hesabınızı bağlamak için, mobil cihazınızda Facebook uygulamasını açın ve bildirimlerinizi kontrol edin."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- YA DA -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "Tamam"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "İptal"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Facebook hesabına yeniden bağlanmak için lütfen bu uygulamaya tekrar giriş yap."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "Tamam"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Sunucu geçici olarak meşgul. Lütfen tekrar dene."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Beğen"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Beğendin"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "İptal"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Çıkış Yap"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Facebook ile giriş yapıldı"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "%@ olarak giriş yapıldı"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Giriş yap"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Facebook ile Devam Et"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Facebook ile giriş yap"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Çıkış yap"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Facebook hesabına erişim izni verilmedi. Cihaz ayarlarını doğrula."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Facebook'a bağlanılamıyor. Ağ bağlantını kontrol edip tekrar dene."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Facebook şifren değiştirildi. Şifreni onaylamak için Ayarlar > Facebook'u aç ve adına dokunun."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Facebook hesabı cihaz üzerinde yapılandırılmadı."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Hesabın onaylanmadı. Lütfen www.facebook.com adresine giriş yap ve verilen talimatları izle."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Şu an için uygulamalara giriş yapamazsın. Lütfen www.facebook.com adresine giriş yap ve verilen talimatları izle."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Kontrol sende. Uygulamalarla paylaşmak istediğin bilgileri seç."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Giriş Yap"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Gönder"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Paylaş"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Sen değil misin?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Girişi Onayla"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "%@ olarak devam et"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/vi.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/vi.lproj/FacebookSDK.strings deleted file mode 100644 index e7b69465e..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/vi.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "Truy cập %@ và nhập mã hiển thị ở trên."; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "Để kết nối tài khoản của bạn, hãy mở ứng dụng Facebook trên thiết bị di động và kiểm tra thông báo."; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- HOẶC -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "OK"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "Hủy"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "Vui lòng đăng nhập lại vào ứng dụng này để kết nối lại tài khoản Facebook của bạn."; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "OK"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "Máy chủ hiện đang bận, vui lòng thử lại sau."; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "Thích"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "Đã thích"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "Hủy"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "Đăng xuất"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "Đã đăng nhập bằng Facebook"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "Đã đăng nhập với tư cách là"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "Đăng nhập"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "Tiếp tục với Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "Đăng nhập bằng Facebook"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "Đăng xuất"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "Quyền truy cập chưa được cấp cho tài khoản Facebook. Xác minh thiết lập của thiết bị."; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "Không thể kết nối với Facebook. Vui lòng kiểm tra kết nối mạng của bạn và thử lại."; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "Mật khẩu Facebook của bạn đã thay đổi. Để xác nhận mật khẩu của bạn, hãy mở Thiết lập > Facebook và nhấn vào tên bạn."; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Tài khoản Facebook chưa được định cấu hình trên thiết bị."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "Tài khoản của bạn không được xác nhận. Vui lòng đăng nhập vào www.facebook.com và làm theo hướng dẫn được cung cấp."; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "Bạn không thể đăng nhập vào các ứng dụng lúc này. Vui lòng đăng nhập vào www.facebook.com và làm theo hướng dẫn được cung cấp."; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "Bạn đang có quyền kiểm soát - hãy chọn thông tin bạn muốn chia sẻ với ứng dụng."; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "Đăng nhập"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "Gửi"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "Chia sẻ"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "Không phải bạn?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "Xác nhận đăng nhập"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "Tiếp tục với tư cách %@"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/zh.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/zh.lproj/FacebookSDK.strings deleted file mode 100644 index e15368584..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/zh.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "请访问 %@ 并输入上方显示的验证码。"; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "要关联你的帐户,请在移动设备上打开 Facebook 应用,并查看通知。"; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- 或者 -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "确定"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "取消"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "请再次登录此应用,以便重新连接您的 Facebook 帐户。"; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "确定"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "服务器暂时繁忙,请重试。"; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "赞"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "赞了"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "取消"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "退出"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "已使用 Facebook 登录"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "已以 %@ 身份登录"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "登录"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "继续使用 Facebook 登录"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "使用 Facebook 登录"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "退出"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "未授予该 Facebook 帐户访问权限。验证设备设置。"; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "无法连接到 Facebook。检查网络连接并重试。"; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "您的 Facebook 密码已更改。要确认密码,请打开设置 > Facebook,并轻触您的姓名。"; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "未在设备上配置 Facebook 帐户。"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "您的帐户未确认。请登录 www.facebook.com,并按照提供的说明操作。"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "您此时不能登录应用。请登录 www.facebook.com,并按照提供的说明操作。"; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "一切任您掌控 — 选择您想通过应用分享的信息。"; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "登录"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "发送"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "分享"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "不是你?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "确认登录"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "以%@的身份继续"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/zh_Hant_HK.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/zh_Hant_HK.lproj/FacebookSDK.strings deleted file mode 100644 index fcf0c3ed3..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/zh_Hant_HK.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "前往 %@ 並輸入上方的程式碼。"; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "若要連結您的帳戶,請在您的流動裝置上開啟 Facebook 應用程式並查看通知。"; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- 或 -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "確定"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "取消"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "請再次登入此應用程式以重新連接您的 Facebook 帳戶。"; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "確定"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "伺服器暫時忙碌中,請再試一次。"; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "讚好"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "已讚好"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "取消"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "登出"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "使用 Facebook 登入"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "以 %@ 身分登入"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "登入"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "繼續使用 Facebook"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "使用 Facebook 登入"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "登出"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "沒有獲得 Facebook 帳戶的存取授權。確認裝置設定。"; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "無法與 Facebook 連線。請檢查網絡連線,然後再試一次。"; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "您的 Facebook 密碼已經變更。要確認密碼,請開啟設定 > Facebook,然後點按您的名稱。"; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "Facebook 帳戶尚未在此裝置上設定。"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "您的帳戶尚未確認。請登入 www.facebook.com 並依據指示操作。"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "您現時無法登入應用程式。請登入 www.facebook.com 並依據指示操作。"; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "控制權在您 - 選擇您要與應用程式分享的資訊。"; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "登入"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "傳送"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "分享"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "這不是您?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "確認登入"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "以%@的身分繼續"; diff --git a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/zh_Hant_TW.lproj/FacebookSDK.strings b/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/zh_Hant_TW.lproj/FacebookSDK.strings deleted file mode 100644 index f02b0c86d..000000000 --- a/Pods/FBSDKCoreKit/FacebookSDKStrings.bundle/Resources/zh_Hant_TW.lproj/FacebookSDK.strings +++ /dev/null @@ -1,92 +0,0 @@ -/* Prompts a person to go to the URL listed to enter the confirmation code that is presented to them above the given string. */ -"DeviceLogin.LogInPrompt" = "請前往 %@ 並輸入上方顯示的代碼。"; - -/* Prompts a person that the next thing they need to do to finish connecting their Smart TV and Facebook application is to navigate to their Facebook application on their mobile device and look through their notifications for a message about the connection being formed */ -"DeviceLogin.SmartLogInPrompt" = "若要連結帳號,請從行動裝置開啟 Facebook 應用程式,並查看通知。"; - -/* Displayed as a separator between two options. First option is on a line above this, and second option is below */ -"DeviceLogin.SmartLogInOrLabel" = "- 或 -"; - -/* The title of the label to dismiss the alert when presenting user facing error messages */ -"ErrorRecovery.Alert.OK" = "是"; - -/* The title of the label to decline attempting error recovery */ -"ErrorRecovery.Cancel" = "取消"; - -/* The fallback message to display to recover invalidated tokens */ -"ErrorRecovery.Login.Suggestion" = "請重新登入此應用程式以重新連結您的 Facebook 帳號。"; - -/* The title of the label to start attempting error recovery */ -"ErrorRecovery.OK" = "是"; - -/* The fallback message to display to retry transient errors */ -"ErrorRecovery.Transient.Suggestion" = "伺服器暫時忙碌中,請再試一次。"; - -/* The label for the FBSDKLikeButton when the object is not currently liked. */ -"LikeButton.Like" = "讚"; - -/* The label for the FBSDKLikeButton when the object is currently liked. */ -"LikeButton.Liked" = "說讚"; - -/* The label for the FBSDKLoginButton action sheet to cancel logging out */ -"LoginButton.CancelLogout" = "取消"; - -/* The label for the FBSDKLoginButton action sheet to confirm logging out */ -"LoginButton.ConfirmLogOut" = "登出"; - -/* The fallback string for the FBSDKLoginButton label when the user name is not available yet */ -"LoginButton.LoggedIn" = "已使用 Facebook 登入"; - -/* The format string for the FBSDKLoginButton label when the user is logged in */ -"LoginButton.LoggedInAs" = "以 %@ 身分登入"; - -/* The short label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogIn" = "登入"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInContinue" = "繼續使用 Facebook 帳號"; - -/* The long label for the FBSDKLoginButton when the user is currently logged out */ -"LoginButton.LogInLong" = "使用 Facebook 登入"; - -/* The label for the FBSDKLoginButton when the user is currently logged in */ -"LoginButton.LogOut" = "登出"; - -/* The user facing error message when the app slider has been disabled and login fails. */ -"LoginError.SystemAccount.Disabled" = "尚未取得授權,無法存取 Facebook 帳號。請確認裝置設定。"; - -/* The user facing error message when the Accounts framework encounters a network error. */ -"LoginError.SystemAccount.Network" = "無法連線到 Facebook。請檢查網路連線,然後再試一次。"; - -/* The user facing error message when the device Facebook account password is incorrect and login fails. */ -"LoginError.SystemAccount.PasswordChange" = "您的 Facebook 密碼已經更改。若要確認您的密碼,請開啟「設定」>「Facebook」,然後點按您的姓名。"; - -/* The user facing error message when the device Facebook account is unavailable and login fails. */ -"LoginError.SystemAccount.Unavailable" = "尚未透過裝置設定 Facebook 帳號。"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed. */ -"LoginError.SystemAccount.UnconfirmedUser" = "您的帳號尚未確認。請登入 www.facebook.com,然後按照指示操作。"; - -/* The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed. */ -"LoginError.SystemAccount.UserCheckpointed" = "您目前無法登入應用程式。請登入 www.facebook.com,然後按照指示操作。"; - -/* The message of the FBSDKLoginTooltipView */ -"LoginTooltip.Message" = "您可以全盤掌控!選擇您想和應用程式分享的資訊內容。"; - -/* Title of the web dialog that prompts the user to log in to Facebook. */ -"LoginWeb.LogInTitle" = "登入"; - -/* The label for FBSDKSendButton */ -"SendButton.Send" = "傳送"; - -/* The label for FBSDKShareButton */ -"ShareButton.Share" = "分享"; - -/* Prompts a person if this is their current account */ -"SmartLogin.NotYou" = "這不是您?"; - -/* Text on a button that a person presses to confirm that they are finished with the login experience */ -"SmartLogin.ConfirmationTitle" = "確認登入"; - -/* Text on a button that lets a person continue with their name linked to a Facebook account (Name = %@) */ -"SmartLogin.Continue" = "以 %@ 身分繼續"; diff --git a/Pods/FBSDKCoreKit/LICENSE b/Pods/FBSDKCoreKit/LICENSE deleted file mode 100644 index bdb9fc54b..000000000 --- a/Pods/FBSDKCoreKit/LICENSE +++ /dev/null @@ -1,17 +0,0 @@ -Copyright (c) 2014-present, Facebook, Inc. All rights reserved. - -You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -copy, modify, and distribute this software in source code or binary form for use -in connection with the web services and APIs provided by Facebook. - -As with any software that integrates with the Facebook platform, your use of -this software is subject to the Facebook Developer Principles and Policies -[http://developers.facebook.com/policy/]. This copyright notice shall be -included in all copies or substantial portions of the software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/FBSDKCoreKit/README.mdown b/Pods/FBSDKCoreKit/README.mdown deleted file mode 100644 index 4e6580c19..000000000 --- a/Pods/FBSDKCoreKit/README.mdown +++ /dev/null @@ -1,46 +0,0 @@ -Facebook SDK for iOS -==================== - -This open-source library allows you to integrate Facebook into your iOS app. - -Learn more about the provided samples, documentation, integrating the SDK into your app, accessing source code, and more at https://developers.facebook.com/docs/ios - -NOTE: By default, the Facebook SDK for iOS is installed in ~/Documents/FacebookSDK - -TRY IT OUT ----------- -1. Download the SDK at https://developers.facebook.com/docs/ios or via CocoaPods by adding the 'FBSDKCoreKit', 'FBSDKLoginKit', and 'FBSDKShareKit' pods. -2. Test your install: build and run the project at ~/Documents/FacebookSDK/Samples/Scrumptious/Scrumptious.xcodeproj -3. Check-out the tutorials available online at: https://developers.facebook.com/docs/ios/getting-started -4. Start coding! Visit https://developers.facebook.com/docs/ios for tutorials and reference documentation. - -FEATURES --------- -* Login - https://developers.facebook.com/docs/facebook-login -* Sharing - https://developers.facebook.com/docs/sharing -* App Links - https://developers.facebook.com/docs/applinks -* Graph API - https://developers.facebook.com/docs/ios/graph -* Analytics - https://developers.facebook.com/docs/analytics - -GIVE FEEDBACK -------------- -Please report bugs or issues to https://developers.facebook.com/bugs/ - -You can also join the Facebook Developers Group on Facebook (https://www.facebook.com/groups/fbdevelopers/) or ask questions on Stack Overflow (http://facebook.stackoverflow.com) - -LICENSE -------- -See the LICENSE file. - -DEVELOPER TERMS ---------------- - -- By enabling Facebook integrations, including through this SDK, you can share information with Facebook, including information about people’s use of your app. Facebook will use information received in accordance with our Data Use Policy [https://www.facebook.com/about/privacy/], including to provide you with insights about the effectiveness of your ads and the use of your app. These integrations also enable us and our partners to serve ads on and off Facebook. - -- You may limit your sharing of information with us by updating the Insights control in the developer tool [https://developers.facebook.com/apps/{app_id}/settings/advanced]. - -- If you use a Facebook integration, including to share information with us, you agree and confirm that you have provided appropriate and sufficiently prominent notice to and obtained the appropriate consent from your users regarding such collection, use, and disclosure (including, at a minimum, through your privacy policy). You further agree that you will not share information with us about children under the age of 13. - -- You agree to comply with all applicable laws and regulations and also agree to our Terms , including our Platform Policies .and Advertising Guidelines, as applicable . - -By using the Facebook SDK for iOS you agree to these terms. diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginButton.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginButton.h deleted file mode 100644 index adc7b9b09..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginButton.h +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import - -#import "FBSDKTooltipView.h" - -@protocol FBSDKLoginButtonDelegate; - -/** - NS_ENUM(NSUInteger, FBSDKLoginButtonTooltipBehavior) - Indicates the desired login tooltip behavior. - */ -typedef NS_ENUM(NSUInteger, FBSDKLoginButtonTooltipBehavior) -{ - /** The default behavior. The tooltip will only be displayed if - the app is eligible (determined by possible server round trip) */ - FBSDKLoginButtonTooltipBehaviorAutomatic = 0, - /** Force display of the tooltip (typically for UI testing) */ - FBSDKLoginButtonTooltipBehaviorForceDisplay = 1, - /** Force disable. In this case you can still exert more refined - control by manually constructing a `FBSDKLoginTooltipView` instance. */ - FBSDKLoginButtonTooltipBehaviorDisable = 2 -}; - -/** - A button that initiates a log in or log out flow upon tapping. - - `FBSDKLoginButton` works with `[FBSDKAccessToken currentAccessToken]` to - determine what to display, and automatically starts authentication when tapped (i.e., - you do not need to manually subscribe action targets). - - Like `FBSDKLoginManager`, you should make sure your app delegate is connected to - `FBSDKApplicationDelegate` in order for the button's delegate to receive messages. - - `FBSDKLoginButton` has a fixed height of @c 30 pixels, but you may change the width. `initWithFrame:CGRectZero` - will size the button to its minimum frame. -*/ -@interface FBSDKLoginButton : FBSDKButton - -/** - The default audience to use, if publish permissions are requested at login time. - */ -@property (assign, nonatomic) FBSDKDefaultAudience defaultAudience; -/** - Gets or sets the delegate. - */ -@property (weak, nonatomic) IBOutlet id delegate; -/** - Gets or sets the login behavior to use - */ -@property (assign, nonatomic) FBSDKLoginBehavior loginBehavior; -/** - The publish permissions to request. - - - Use `defaultAudience` to specify the default audience to publish to. - Note this is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - */ -@property (copy, nonatomic) NSArray *publishPermissions; -/** - The read permissions to request. - - - Note, that if read permissions are specified, then publish permissions should not be specified. This is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - */ -@property (copy, nonatomic) NSArray *readPermissions; -/** - Gets or sets the desired tooltip behavior. - */ -@property (assign, nonatomic) FBSDKLoginButtonTooltipBehavior tooltipBehavior; -/** - Gets or sets the desired tooltip color style. - */ -@property (assign, nonatomic) FBSDKTooltipColorStyle tooltipColorStyle; - -@end - -/** - @protocol - A delegate for `FBSDKLoginButton` - */ -@protocol FBSDKLoginButtonDelegate - -@required -/** - Sent to the delegate when the button was used to login. - - Parameter loginButton: the sender - - Parameter result: The results of the login - - Parameter error: The error (if any) from the login - */ -- (void)loginButton:(FBSDKLoginButton *)loginButton -didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result - error:(NSError *)error; - -/** - Sent to the delegate when the button was used to logout. - - Parameter loginButton: The button that was clicked. -*/ -- (void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton; - -@optional -/** - Sent to the delegate when the button is about to login. - - Parameter loginButton: the sender - - Returns: YES if the login should be allowed to proceed, NO otherwise - */ -- (BOOL) loginButtonWillLogin:(FBSDKLoginButton *)loginButton; - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginButton.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginButton.m deleted file mode 100644 index fb3146906..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginButton.m +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginButton.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKLoginTooltipView.h" - -static const CGFloat kFBLogoSize = 16.0; -static const CGFloat kFBLogoLeftMargin = 6.0; -static const CGFloat kButtonHeight = 28.0; -static const CGFloat kRightMargin = 8.0; -static const CGFloat kPaddingBetweenLogoTitle = 8.0; - -@interface FBSDKLoginButton() -@end - -@implementation FBSDKLoginButton -{ - BOOL _hasShownTooltipBubble; - FBSDKLoginManager *_loginManager; - NSString *_userID; - NSString *_userName; -} - -#pragma mark - Object Lifecycle - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - Properties - -- (FBSDKDefaultAudience)defaultAudience -{ - return _loginManager.defaultAudience; -} - -- (void)setDefaultAudience:(FBSDKDefaultAudience)defaultAudience -{ - _loginManager.defaultAudience = defaultAudience; -} - -- (FBSDKLoginBehavior)loginBehavior -{ - return _loginManager.loginBehavior; -} - -- (void)setLoginBehavior:(FBSDKLoginBehavior)loginBehavior -{ - _loginManager.loginBehavior = loginBehavior; -} - -- (UIFont *)defaultFont -{ - return [UIFont systemFontOfSize:13]; -} - -- (UIColor *)backgroundColor -{ - return [UIColor colorWithRed:66.0/255.0 green:103.0/255.0 blue:178.0/255.0 alpha:1.0]; -} - -#pragma mark - UIView - -- (void)didMoveToWindow -{ - [super didMoveToWindow]; - - if (self.window && - ((self.tooltipBehavior == FBSDKLoginButtonTooltipBehaviorForceDisplay) || !_hasShownTooltipBubble)) { - [self performSelector:@selector(_showTooltipIfNeeded) withObject:nil afterDelay:0]; - _hasShownTooltipBubble = YES; - } -} - -#pragma mark - Layout - -- (CGRect)imageRectForContentRect:(CGRect)contentRect -{ - CGFloat centerY = CGRectGetMidY(contentRect); - CGFloat y = centerY - (kFBLogoSize / 2.0); - return CGRectMake(kFBLogoLeftMargin, y, kFBLogoSize, kFBLogoSize); -} - -- (CGRect)titleRectForContentRect:(CGRect)contentRect -{ - if (self.hidden || CGRectIsEmpty(self.bounds)) { - return CGRectZero; - } - CGRect imageRect = [self imageRectForContentRect:contentRect]; - CGFloat titleX = CGRectGetMaxX(imageRect) + kPaddingBetweenLogoTitle; - CGRect titleRect = CGRectMake(titleX, 0, CGRectGetWidth(contentRect) - titleX - kRightMargin, CGRectGetHeight(contentRect)); - - return titleRect; -} - -- (void)layoutSubviews -{ - CGSize size = self.bounds.size; - CGSize longTitleSize = [self sizeThatFits:size title:[self _longLogInTitle]]; - NSString *title = (longTitleSize.width <= size.width ? - [self _longLogInTitle] : - [self _shortLogInTitle]); - if (![title isEqualToString:[self titleForState:UIControlStateNormal]]) { - [self setTitle:title forState:UIControlStateNormal]; - } - - [super layoutSubviews]; -} - -- (CGSize)sizeThatFits:(CGSize)size -{ - if ([self isHidden]) { - return CGSizeZero; - } - UIFont *font = self.titleLabel.font; - - CGSize selectedSize = FBSDKTextSize([self _logOutTitle], font, size, self.titleLabel.lineBreakMode); - CGSize normalSize = FBSDKTextSize([self _longLogInTitle], font, size, self.titleLabel.lineBreakMode); - if (normalSize.width > size.width) { - normalSize = FBSDKTextSize([self _shortLogInTitle], font, size, self.titleLabel.lineBreakMode); - } - - CGFloat titleWidth = MAX(normalSize.width, selectedSize.width); - CGFloat buttonWidth = kFBLogoLeftMargin + kFBLogoSize + kPaddingBetweenLogoTitle + titleWidth + kRightMargin; - return CGSizeMake(buttonWidth, kButtonHeight); -} - -#pragma mark - UIActionSheetDelegate - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex -{ - if (buttonIndex == 0) { - [_loginManager logOut]; - [self.delegate loginButtonDidLogOut:self]; - } -} -#pragma clang diagnostic pop - -#pragma mark - FBSDKButtonImpressionTracking - -- (NSDictionary *)analyticsParameters -{ - return nil; -} - -- (NSString *)impressionTrackingEventName -{ - return FBSDKAppEventNameFBSDKLoginButtonImpression; -} - -- (NSString *)impressionTrackingIdentifier -{ - return @"login"; -} - -#pragma mark - FBSDKButton - -- (void)configureButton -{ - _loginManager = [[FBSDKLoginManager alloc] init]; - - NSString *logInTitle = [self _shortLogInTitle]; - NSString *logOutTitle = [self _logOutTitle]; - - [self configureWithIcon:nil - title:logInTitle - backgroundColor:[self backgroundColor] - highlightedColor:nil - selectedTitle:logOutTitle - selectedIcon:nil - selectedColor:[self backgroundColor] - selectedHighlightedColor:nil]; - self.titleLabel.textAlignment = NSTextAlignmentCenter; - [self addConstraint:[NSLayoutConstraint constraintWithItem:self - attribute:NSLayoutAttributeHeight - relatedBy:NSLayoutRelationEqual - toItem:nil - attribute:NSLayoutAttributeNotAnAttribute - multiplier:1 - constant:28]]; - [self _updateContent]; - - [self addTarget:self action:@selector(_buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_accessTokenDidChangeNotification:) - name:FBSDKAccessTokenDidChangeNotification - object:nil]; -} - -#pragma mark - Helper Methods - -- (void)_accessTokenDidChangeNotification:(NSNotification *)notification -{ - if (notification.userInfo[FBSDKAccessTokenDidChangeUserID]) { - [self _updateContent]; - } -} - -- (void)_buttonPressed:(id)sender -{ - [self logTapEventWithEventName:FBSDKAppEventNameFBSDKLoginButtonDidTap parameters:[self analyticsParameters]]; - if ([FBSDKAccessToken currentAccessToken]) { - NSString *title = nil; - - if (_userName) { - NSString *localizedFormatString = - NSLocalizedStringWithDefaultValue(@"LoginButton.LoggedInAs", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Logged in as %@", - @"The format string for the FBSDKLoginButton label when the user is logged in"); - title = [NSString localizedStringWithFormat:localizedFormatString, _userName]; - } else { - NSString *localizedLoggedIn = - NSLocalizedStringWithDefaultValue(@"LoginButton.LoggedIn", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Logged in using Facebook", - @"The fallback string for the FBSDKLoginButton label when the user name is not available yet"); - title = localizedLoggedIn; - } - NSString *cancelTitle = - NSLocalizedStringWithDefaultValue(@"LoginButton.CancelLogout", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Cancel", - @"The label for the FBSDKLoginButton action sheet to cancel logging out"); - NSString *logOutTitle = - NSLocalizedStringWithDefaultValue(@"LoginButton.ConfirmLogOut", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Log Out", - @"The label for the FBSDKLoginButton action sheet to confirm logging out"); - if ([UIAlertController class]) { - UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title - message:nil - preferredStyle:UIAlertControllerStyleActionSheet]; - alertController.popoverPresentationController.sourceView = self; - alertController.popoverPresentationController.sourceRect = self.bounds; - UIAlertAction *cancel = [UIAlertAction actionWithTitle:cancelTitle - style:UIAlertActionStyleCancel - handler:nil]; - UIAlertAction *logout = [UIAlertAction actionWithTitle:logOutTitle - style:UIAlertActionStyleDestructive - handler:^(UIAlertAction * _Nonnull action) { - [_loginManager logOut]; - [self.delegate loginButtonDidLogOut:self]; - }]; - [alertController addAction:cancel]; - [alertController addAction:logout]; - UIViewController *topMostViewController = [FBSDKInternalUtility topMostViewController]; - [topMostViewController presentViewController:alertController - animated:YES - completion:nil]; - } else { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:title - delegate:self - cancelButtonTitle:cancelTitle - destructiveButtonTitle:logOutTitle - otherButtonTitles:nil]; - [sheet showInView:self]; -#pragma clang diagnostic pop - } - } else { - if ([self.delegate respondsToSelector:@selector(loginButtonWillLogin:)]) { - if (![self.delegate loginButtonWillLogin:self]) { - return; - } - } - - FBSDKLoginManagerRequestTokenHandler handler = ^(FBSDKLoginManagerLoginResult *result, NSError *error) { - if ([self.delegate respondsToSelector:@selector(loginButton:didCompleteWithResult:error:)]) { - [self.delegate loginButton:self didCompleteWithResult:result error:error]; - } - }; - - if (self.publishPermissions.count > 0) { - [_loginManager logInWithPublishPermissions:self.publishPermissions - fromViewController:[FBSDKInternalUtility viewControllerForView:self] - handler:handler]; - } else { - [_loginManager logInWithReadPermissions:self.readPermissions - fromViewController:[FBSDKInternalUtility viewControllerForView:self] - handler:handler]; - } - } -} - -- (NSString *)_logOutTitle -{ - return NSLocalizedStringWithDefaultValue(@"LoginButton.LogOut", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Log out", - @"The label for the FBSDKLoginButton when the user is currently logged in"); - ; -} - -- (NSString *)_longLogInTitle -{ - return NSLocalizedStringWithDefaultValue(@"LoginButton.LogInContinue", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Continue with Facebook", - @"The long label for the FBSDKLoginButton when the user is currently logged out"); -} - -- (NSString *)_shortLogInTitle -{ - return NSLocalizedStringWithDefaultValue(@"LoginButton.LogIn", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Log in", - @"The short label for the FBSDKLoginButton when the user is currently logged out"); -} - -- (void)_showTooltipIfNeeded -{ - if ([FBSDKAccessToken currentAccessToken] || self.tooltipBehavior == FBSDKLoginButtonTooltipBehaviorDisable) { - return; - } else { - FBSDKLoginTooltipView *tooltipView = [[FBSDKLoginTooltipView alloc] init]; - tooltipView.colorStyle = self.tooltipColorStyle; - if (self.tooltipBehavior == FBSDKLoginButtonTooltipBehaviorForceDisplay) { - tooltipView.forceDisplay = YES; - } - [tooltipView presentFromView:self]; - } -} - -- (void)_updateContent -{ - self.selected = ([FBSDKAccessToken currentAccessToken] != nil); - if ([FBSDKAccessToken currentAccessToken]) { - if (![[FBSDKAccessToken currentAccessToken].userID isEqualToString:_userID]) { - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me?fields=id,name" - parameters:nil - flags:FBSDKGraphRequestFlagDisableErrorRecovery]; - [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - NSString *userID = [FBSDKTypeUtility stringValue:result[@"id"]]; - if (!error && [[FBSDKAccessToken currentAccessToken].userID isEqualToString:userID]) { - _userName = [FBSDKTypeUtility stringValue:result[@"name"]]; - _userID = userID; - } - }]; - } - } -} - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginConstants.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginConstants.h deleted file mode 100644 index 713d79858..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginConstants.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - The error domain for all errors from FBSDKLoginKit - - Error codes from the SDK in the range 300-399 are reserved for this domain. - */ -FBSDK_EXTERN NSString *const FBSDKLoginErrorDomain; - -/** - NS_ENUM(NSInteger, FBSDKLoginErrorCode) - Error codes for FBSDKLoginErrorDomain. - */ -typedef NS_ENUM(NSInteger, FBSDKLoginErrorCode) -{ - /** - Reserved. - */ - FBSDKLoginReservedErrorCode = 300, - /** - The error code for unknown errors. - */ - FBSDKLoginUnknownErrorCode, - - /** - The user's password has changed and must log in again - */ - FBSDKLoginPasswordChangedErrorCode, - /** - The user must log in to their account on www.facebook.com to restore access - */ - FBSDKLoginUserCheckpointedErrorCode, - /** - Indicates a failure to request new permissions because the user has changed. - */ - FBSDKLoginUserMismatchErrorCode, - /** - The user must confirm their account with Facebook before logging in - */ - FBSDKLoginUnconfirmedUserErrorCode, - - /** - The Accounts framework failed without returning an error, indicating the - app's slider in the iOS Facebook Settings (device Settings -> Facebook -> App Name) has - been disabled. - */ - FBSDKLoginSystemAccountAppDisabledErrorCode, - /** - An error occurred related to Facebook system Account store - */ - FBSDKLoginSystemAccountUnavailableErrorCode, - /** - The login response was missing a valid challenge string. - */ - FBSDKLoginBadChallengeString, -}; diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginConstants.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginConstants.m deleted file mode 100644 index 1897305d0..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginConstants.m +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginConstants.h" - -NSString *const FBSDKLoginErrorDomain = @"com.facebook.sdk.login"; diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit.h deleted file mode 100644 index 472394001..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import -#import -#import diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManager.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManager.h deleted file mode 100644 index 5758325cc..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManager.h +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import -#import - -@class FBSDKLoginManagerLoginResult; - -/** - Describes the call back to the FBSDKLoginManager - - Parameter result: the result of the authorization - - Parameter error: the authorization error, if any. - */ -typedef void (^FBSDKLoginManagerRequestTokenHandler)(FBSDKLoginManagerLoginResult *result, NSError *error); - - -/** - FBSDKDefaultAudience enum - - Passed to open to indicate which default audience to use for sessions that post data to Facebook. - - - - Certain operations such as publishing a status or publishing a photo require an audience. When the user - grants an application permission to perform a publish operation, a default audience is selected as the - publication ceiling for the application. This enumerated value allows the application to select which - audience to ask the user to grant publish permission for. - */ -typedef NS_ENUM(NSUInteger, FBSDKDefaultAudience) -{ - /** Indicates that the user's friends are able to see posts made by the application */ - FBSDKDefaultAudienceFriends = 0, - /** Indicates that only the user is able to see posts made by the application */ - FBSDKDefaultAudienceOnlyMe, - /** Indicates that all Facebook users are able to see posts made by the application */ - FBSDKDefaultAudienceEveryone, -}; - -/** - FBSDKLoginBehavior enum - - Passed to the \c FBSDKLoginManager to indicate how Facebook Login should be attempted. - - - - Facebook Login authorizes the application to act on behalf of the user, using the user's - Facebook account. Usually a Facebook Login will rely on an account maintained outside of - the application, by the native Facebook application, the browser, or perhaps the device - itself. This avoids the need for a user to enter their username and password directly, and - provides the most secure and lowest friction way for a user to authorize the application to - interact with Facebook. - - The \c FBSDKLoginBehavior enum specifies which log-in methods may be used. The SDK - will determine the best behavior based on the current device (such as iOS version). - */ -typedef NS_ENUM(NSUInteger, FBSDKLoginBehavior) -{ - /** - This is the default behavior, and indicates logging in through the native - Facebook app may be used. The SDK may still use Safari instead. - */ - FBSDKLoginBehaviorNative = 0, - /** - Attempts log in through the Safari or SFSafariViewController, if available. - */ - FBSDKLoginBehaviorBrowser, - /** - Attempts log in through the Facebook account currently signed in through - the device Settings. - @note If the account is not available to the app (either not configured by user or - as determined by the SDK) this behavior falls back to \c FBSDKLoginBehaviorNative. - */ - FBSDKLoginBehaviorSystemAccount, - /** - Attempts log in through a modal \c UIWebView pop up - - @note This behavior is only available to certain types of apps. Please check the Facebook - Platform Policy to verify your app meets the restrictions. - */ - FBSDKLoginBehaviorWeb, -}; - -/** - `FBSDKLoginManager` provides methods for logging the user in and out. - - `FBSDKLoginManager` works directly with `[FBSDKAccessToken currentAccessToken]` and - sets the "currentAccessToken" upon successful authorizations (or sets `nil` in case of `logOut`). - - You should check `[FBSDKAccessToken currentAccessToken]` before calling logIn* to see if there is - a cached token available (typically in your viewDidLoad). - - If you are managing your own token instances outside of "currentAccessToken", you will need to set - "currentAccessToken" before calling logIn* to authorize further permissions on your tokens. - */ -@interface FBSDKLoginManager : NSObject - -/** - the default audience. - - you should set this if you intend to ask for publish permissions. - */ -@property (assign, nonatomic) FBSDKDefaultAudience defaultAudience; - -/** - the login behavior - */ -@property (assign, nonatomic) FBSDKLoginBehavior loginBehavior; - -/** - -- Warning:use logInWithReadPermissions:fromViewController:handler: instead - */ -- (void)logInWithReadPermissions:(NSArray *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler -__attribute__ ((deprecated("use logInWithReadPermissions:fromViewController:handler: instead"))); - -/** - -- Warning:use logInWithPublishPermissions:fromViewController:handler: instead - */ -- (void)logInWithPublishPermissions:(NSArray *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler -__attribute__ ((deprecated("use logInWithPublishPermissions:fromViewController:handler: instead"))); - -/** - Logs the user in or authorizes additional permissions. - - Parameter permissions: the optional array of permissions. Note this is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - - Parameter fromViewController: the view controller to present from. If nil, the topmost view controller will be - automatically determined as best as possible. - - Parameter handler: the callback. - - Use this method when asking for read permissions. You should only ask for permissions when they - are needed and explain the value to the user. You can inspect the result.declinedPermissions to also - provide more information to the user if they decline permissions. - - This method will present UI the user. You typically should check if `[FBSDKAccessToken currentAccessToken]` - already contains the permissions you need before asking to reduce unnecessary app switching. For example, - you could make that check at viewDidLoad. - You can only do one login call at a time. Calling a login method before the completion handler is called - on a previous login will return an error. - */ -- (void)logInWithReadPermissions:(NSArray *)permissions - fromViewController:(UIViewController *)fromViewController - handler:(FBSDKLoginManagerRequestTokenHandler)handler; - -/** - Logs the user in or authorizes additional permissions. - - Parameter permissions: the optional array of permissions. Note this is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - - Parameter fromViewController: the view controller to present from. If nil, the topmost view controller will be - automatically determined as best as possible. - - Parameter handler: the callback. - - Use this method when asking for publish permissions. You should only ask for permissions when they - are needed and explain the value to the user. You can inspect the result.declinedPermissions to also - provide more information to the user if they decline permissions. - - This method will present UI the user. You typically should check if `[FBSDKAccessToken currentAccessToken]` - already contains the permissions you need before asking to reduce unnecessary app switching. For example, - you could make that check at viewDidLoad. - You can only do one login call at a time. Calling a login method before the completion handler is called - on a previous login will return an error. - */ -- (void)logInWithPublishPermissions:(NSArray *)permissions - fromViewController:(UIViewController *)fromViewController - handler:(FBSDKLoginManagerRequestTokenHandler)handler; - -/** - Logs the user out - - This calls [FBSDKAccessToken setCurrentAccessToken:nil] and [FBSDKProfile setCurrentProfile:nil]. - */ -- (void)logOut; - -/** - @method - - Issues an asynchronous renewCredentialsForAccount call to the device's Facebook account store. - - - Parameter handler: The completion handler to call when the renewal is completed. This can be invoked on an arbitrary thread. - - - This can be used to explicitly renew account credentials and is provided as a convenience wrapper around - `[ACAccountStore renewCredentialsForAccount:completion]`. Note the method will not issue the renewal call if the the - Facebook account has not been set on the device, or if access had not been granted to the account (though the handler - wil receive an error). - - If the `[FBSDKAccessToken currentAccessToken]` was from the account store, a succesful renewal will also set - a new "currentAccessToken". - */ -+ (void)renewSystemCredentials:(void (^)(ACAccountCredentialRenewResult result, NSError *error))handler; - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManager.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManager.m deleted file mode 100644 index 17bece347..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManager.m +++ /dev/null @@ -1,859 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginManager+Internal.h" -#import "FBSDKLoginManagerLoginResult+Internal.h" - -#import -#import - -#import "_FBSDKLoginRecoveryAttempter.h" -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKLoginCompletion.h" -#import "FBSDKLoginConstants.h" -#import "FBSDKLoginError.h" -#import "FBSDKLoginManagerLogger.h" -#import "FBSDKLoginUtility.h" - -static int const FBClientStateChallengeLength = 20; -static NSString *const FBSDKExpectedChallengeKey = @"expected_login_challenge"; -static NSString *const FBSDKOauthPath = @"/dialog/oauth"; -static NSString *const SFVCCanceledLogin = @"com.apple.SafariServices.Authentication"; - -typedef NS_ENUM(NSInteger, FBSDKLoginManagerState) { - FBSDKLoginManagerStateIdle, - // We received a call to start login. - FBSDKLoginManagerStateStart, - // We're calling out to the Facebook app or Safari to perform a log in - FBSDKLoginManagerStatePerformingLogin, -}; - -@implementation FBSDKLoginManager -{ - FBSDKLoginManagerRequestTokenHandler _handler; - FBSDKLoginManagerLogger *_logger; - FBSDKLoginManagerState _state; - FBSDKKeychainStore *_keychainStore; - BOOL _usedSFAuthSession; -} - -+ (void)initialize -{ - if (self == [FBSDKLoginManager class]) { - [_FBSDKLoginRecoveryAttempter class]; - [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; - } -} - -- (instancetype)init -{ - self = [super init]; - if (self) { - NSString *keyChainServiceIdentifier = [NSString stringWithFormat:@"com.facebook.sdk.loginmanager.%@", [[NSBundle mainBundle] bundleIdentifier]]; - _keychainStore = [[FBSDKKeychainStore alloc] initWithService:keyChainServiceIdentifier accessGroup:nil]; - } - return self; -} - -- (void)logInWithReadPermissions:(NSArray *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler -{ - [self logInWithReadPermissions:permissions - fromViewController:nil - handler:handler]; -} -- (void)logInWithReadPermissions:(NSArray *)permissions - fromViewController:(UIViewController *)fromViewController - handler:(FBSDKLoginManagerRequestTokenHandler)handler -{ - if (![self validateLoginStartState]) { - return; - } - [self assertPermissions:permissions]; - NSSet *permissionSet = [NSSet setWithArray:permissions]; - if (![FBSDKInternalUtility areAllPermissionsReadPermissions:permissionSet]) { - [self raiseLoginException:[NSException exceptionWithName:NSInvalidArgumentException - reason:@"Publish or manage permissions are not permitted to be requested with read permissions." - userInfo:nil]]; - } - self.fromViewController = fromViewController; - [self logInWithPermissions:permissionSet handler:handler]; -} - -- (void)logInWithPublishPermissions:(NSArray *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler -{ - [self logInWithPublishPermissions:permissions - fromViewController:nil - handler:handler]; -} - -- (void)logInWithPublishPermissions:(NSArray *)permissions - fromViewController:(UIViewController *)fromViewController - handler:(FBSDKLoginManagerRequestTokenHandler)handler -{ - if (![self validateLoginStartState]) { - return; - } - [self assertPermissions:permissions]; - NSSet *permissionSet = [NSSet setWithArray:permissions]; - if (![FBSDKInternalUtility areAllPermissionsPublishPermissions:permissionSet]) { - [self raiseLoginException:[NSException exceptionWithName:NSInvalidArgumentException - reason:@"Read permissions are not permitted to be requested with publish or manage permissions." - userInfo:nil]]; - } - self.fromViewController = fromViewController; - [self logInWithPermissions:permissionSet handler:handler]; -} - -- (void)logOut -{ - [FBSDKAccessToken setCurrentAccessToken:nil]; - [FBSDKProfile setCurrentProfile:nil]; -} - -+ (void)renewSystemCredentials:(void (^)(ACAccountCredentialRenewResult result, NSError *error))handler -{ - FBSDKSystemAccountStoreAdapter *adapter = [FBSDKSystemAccountStoreAdapter sharedInstance]; - - if (!adapter.accountType) { - handler(ACAccountCredentialRenewResultFailed, [FBSDKLoginError errorForFailedLoginWithCode:FBSDKLoginSystemAccountUnavailableErrorCode]); - } else if (!adapter.accountType.accessGranted) { - handler(ACAccountCredentialRenewResultFailed, [FBSDKLoginError errorForFailedLoginWithCode:FBSDKLoginSystemAccountAppDisabledErrorCode]); - } else { - [[FBSDKSystemAccountStoreAdapter sharedInstance] renewSystemAuthorization:handler]; - } -} - -#pragma mark - Private - -- (void)raiseLoginException:(NSException *)exception -{ - _state = FBSDKLoginManagerStateIdle; - [exception raise]; -} - -- (void)handleImplicitCancelOfLogIn -{ - FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:nil - isCancelled:YES - grantedPermissions:nil - declinedPermissions:nil]; - [result addLoggingExtra:@YES forKey:@"implicit_cancel"]; - [self invokeHandler:result error:nil]; -} - -- (BOOL)validateLoginStartState -{ - switch (_state) { - case FBSDKLoginManagerStateStart: { - if (self->_usedSFAuthSession) { - // Using SFAuthenticationSession makes an interestitial dialog that blocks the app, but in certain situations such as - // screen lock it can be dismissed and have the control returned to the app without invoking the completionHandler. - // In this case, the viewcontroller has the control back and tried to reinvoke the login. This is acceptable behavior - // and we should pop up the dialog again - return YES; - } - - NSString *errorStr = @"** WARNING: You are trying to start a login while a previous login has not finished yet." - "This is unsupported behavior. You should wait until the previous login handler gets called to start a new login."; - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"%@", errorStr]; - return NO; - } - case FBSDKLoginManagerStatePerformingLogin:{ - [self handleImplicitCancelOfLogIn]; - return YES; - } - case FBSDKLoginManagerStateIdle: - _state = FBSDKLoginManagerStateStart; - return YES; - } -} - -- (BOOL)isPerformingLogin -{ - return _state == FBSDKLoginManagerStatePerformingLogin; -} - -- (void)assertPermissions:(NSArray *)permissions -{ - for (NSString *permission in permissions) { - if (![permission isKindOfClass:[NSString class]]) { - [self raiseLoginException:[NSException exceptionWithName:NSInvalidArgumentException - reason:@"Permissions must be string values." - userInfo:nil]]; - } - if ([permission rangeOfString:@","].location != NSNotFound) { - [self raiseLoginException:[NSException exceptionWithName:NSInvalidArgumentException - reason:@"Permissions should each be specified in separate string values in the array." - userInfo:nil]]; - } - } -} - -- (void)completeAuthentication:(FBSDKLoginCompletionParameters *)parameters expectChallenge:(BOOL)expectChallenge -{ - NSSet *recentlyGrantedPermissions = nil; - NSSet *recentlyDeclinedPermissions = nil; - FBSDKLoginManagerLoginResult *result = nil; - NSError *error = parameters.error; - - NSString *tokenString = parameters.accessTokenString; - BOOL cancelled = (tokenString == nil); - - BOOL challengePassed = YES; - if (expectChallenge) { - // Perform this check early so we be sure to clear expected challenge in all cases. - NSString *challengeReceived = parameters.challenge; - NSString *challengeExpected = [self loadExpectedChallenge]; - if (![challengeExpected isEqualToString:challengeReceived]) { - challengePassed = NO; - } - - // Don't overwrite an existing error, if any. - if (!error && !cancelled && !challengePassed) { - error = [FBSDKLoginError errorForFailedLoginWithCode:FBSDKLoginBadChallengeString]; - } - } - - [self storeExpectedChallenge:nil]; - - if (!error) { - if (!cancelled) { - NSSet *grantedPermissions = parameters.permissions; - NSSet *declinedPermissions = parameters.declinedPermissions; - - [self determineRecentlyGrantedPermissions:&recentlyGrantedPermissions - recentlyDeclinedPermissions:&recentlyDeclinedPermissions - forGrantedPermission:grantedPermissions - declinedPermissions:declinedPermissions]; - - if (recentlyGrantedPermissions.count > 0) { - FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:tokenString - permissions:[grantedPermissions allObjects] - declinedPermissions:[declinedPermissions allObjects] - appID:parameters.appID - userID:parameters.userID - expirationDate:parameters.expirationDate - refreshDate:[NSDate date]]; - result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:token - isCancelled:NO - grantedPermissions:recentlyGrantedPermissions - declinedPermissions:recentlyDeclinedPermissions]; - - if ([FBSDKAccessToken currentAccessToken]) { - [self validateReauthentication:[FBSDKAccessToken currentAccessToken] withResult:result]; - // in a reauth, short circuit and let the login handler be called when the validation finishes. - return; - } - } else { - cancelled = YES; - } - } - - if (cancelled) { - NSSet *declinedPermissions = nil; - if ([FBSDKAccessToken currentAccessToken] != nil) { - if (parameters.isSystemAccount) { - // If a System Account reauthorization was cancelled by the user tapping Don't Allow - // then add the declined permissions to the login result. The Accounts framework - // doesn't register the decline with Facebook, which is why we don't update the - // access token. - declinedPermissions = parameters.declinedPermissions; - } else { - // Always include the list of declined permissions from this login request - // if an access token is already cached by the SDK - declinedPermissions = recentlyDeclinedPermissions; - } - } - - result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:nil - isCancelled:YES - grantedPermissions:nil - declinedPermissions:declinedPermissions]; - } - } - - if (result.token) { - [FBSDKAccessToken setCurrentAccessToken:result.token]; - } - - [self invokeHandler:result error:error]; -} - -- (void)determineRecentlyGrantedPermissions:(NSSet **)recentlyGrantedPermissionsRef - recentlyDeclinedPermissions:(NSSet **)recentlyDeclinedPermissionsRef - forGrantedPermission:(NSSet *)grantedPermissions - declinedPermissions:(NSSet *)declinedPermissions -{ - NSMutableSet *recentlyGrantedPermissions = [grantedPermissions mutableCopy]; - NSSet *previouslyGrantedPermissions = ([FBSDKAccessToken currentAccessToken] ? - [FBSDKAccessToken currentAccessToken].permissions : - nil); - if (previouslyGrantedPermissions.count > 0) { - // If there were no requested permissions for this auth - treat all permissions as granted. - // Otherwise this is a reauth, so recentlyGranted should be a subset of what was requested. - if (_requestedPermissions.count != 0) { - [recentlyGrantedPermissions intersectSet:_requestedPermissions]; - } - } - - NSMutableSet *recentlyDeclinedPermissions = [_requestedPermissions mutableCopy]; - [recentlyDeclinedPermissions intersectSet:declinedPermissions]; - - if (recentlyGrantedPermissionsRef != NULL) { - *recentlyGrantedPermissionsRef = [recentlyGrantedPermissions copy]; - } - if (recentlyDeclinedPermissionsRef != NULL) { - *recentlyDeclinedPermissionsRef = [recentlyDeclinedPermissions copy]; - } -} - -- (void)invokeHandler:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error -{ - [_logger endLoginWithResult:result error:error]; - [_logger endSession]; - _logger = nil; - _state = FBSDKLoginManagerStateIdle; - - if (_handler) { - FBSDKLoginManagerRequestTokenHandler handler = _handler; - _handler(result, error); - if (handler == _handler) { - _handler = nil; - } else { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"** WARNING: You are requesting permissions inside the completion block of an existing login." - "This is unsupported behavior. You should request additional permissions only when they are needed, such as requesting for publish_actions" - "when the user performs a sharing action."]; - } - } -} - -- (NSString *)loadExpectedChallenge -{ - return [_keychainStore stringForKey:FBSDKExpectedChallengeKey]; -} - -- (NSDictionary *)logInParametersWithPermissions:(NSSet *)permissions serverConfiguration:(FBSDKServerConfiguration *)serverConfiguration -{ - [FBSDKInternalUtility validateURLSchemes]; - - NSMutableDictionary *loginParams = [NSMutableDictionary dictionary]; - loginParams[@"client_id"] = [FBSDKSettings appID]; - loginParams[@"response_type"] = @"token,signed_request"; - loginParams[@"redirect_uri"] = @"fbconnect://success"; - loginParams[@"display"] = @"touch"; - loginParams[@"sdk"] = @"ios"; - loginParams[@"return_scopes"] = @"true"; - loginParams[@"sdk_version"] = FBSDK_VERSION_STRING; - loginParams[@"fbapp_pres"] = @([FBSDKInternalUtility isFacebookAppInstalled]); - loginParams[@"auth_type"] = @"rerequest"; - loginParams[@"logging_token"] = serverConfiguration.loggingToken; - - [FBSDKInternalUtility dictionary:loginParams setObject:[FBSDKSettings appURLSchemeSuffix] forKey:@"local_client_id"]; - [FBSDKInternalUtility dictionary:loginParams setObject:[FBSDKLoginUtility stringForAudience:self.defaultAudience] forKey:@"default_audience"]; - [FBSDKInternalUtility dictionary:loginParams setObject:[[permissions allObjects] componentsJoinedByString:@","] forKey:@"scope"]; - - NSString *expectedChallenge = [FBSDKLoginManager stringForChallenge]; - NSDictionary *state = @{@"challenge": [FBSDKUtility URLEncode:expectedChallenge]}; - loginParams[@"state"] = [FBSDKInternalUtility JSONStringForObject:state error:NULL invalidObjectHandler:nil]; - - [self storeExpectedChallenge:expectedChallenge]; - - return loginParams; -} - -- (void)logInWithPermissions:(NSSet *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler -{ - FBSDKServerConfiguration *serverConfiguration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - _logger = [[FBSDKLoginManagerLogger alloc] initWithLoggingToken:serverConfiguration.loggingToken]; - - _handler = [handler copy]; - _requestedPermissions = permissions; - - [_logger startSessionForLoginManager:self]; - - [self logInWithBehavior:self.loginBehavior]; -} - -- (void)logInWithBehavior:(FBSDKLoginBehavior)loginBehavior -{ - FBSDKServerConfiguration *serverConfiguration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - NSDictionary *loginParams = [self logInParametersWithPermissions:_requestedPermissions serverConfiguration:serverConfiguration]; - self->_usedSFAuthSession = NO; - - void(^completion)(BOOL, NSString *, NSError *) = ^void(BOOL didPerformLogIn, NSString *authMethod, NSError *error) { - if (didPerformLogIn) { - [_logger startAuthMethod:authMethod]; - _state = FBSDKLoginManagerStatePerformingLogin; - } else if (error && [error.domain isEqualToString:SFVCCanceledLogin]) { - [self handleImplicitCancelOfLogIn]; - } else { - if (!error) { - error = [NSError errorWithDomain:FBSDKLoginErrorDomain code:FBSDKLoginUnknownErrorCode userInfo:nil]; - } - [self invokeHandler:nil error:error]; - } - }; - - switch (loginBehavior) { - case FBSDKLoginBehaviorNative: { - if ([FBSDKInternalUtility isFacebookAppInstalled]) { - BOOL useNativeDialog = [serverConfiguration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLogin]; - if (useNativeDialog) { - [self performNativeLogInWithParameters:loginParams handler:^(BOOL openedURL, NSError *openedURLError) { - if (openedURLError) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"FBSDKLoginBehaviorNative failed : %@\nTrying FBSDKLoginBehaviorBrowser", openedURLError]; - } - if (openedURL) { - completion(YES, FBSDKLoginManagerLoggerAuthMethod_Native, openedURLError); - } else { - [self logInWithBehavior:FBSDKLoginBehaviorBrowser]; - } - }]; - } else { - [self logInWithBehavior:FBSDKLoginBehaviorBrowser]; - } - break; - } - // Intentional fall through. Switching to browser login instead. - } - case FBSDKLoginBehaviorBrowser: { - [self performBrowserLogInWithParameters:loginParams handler:^(BOOL openedURL, - NSString *authMethod, - NSError *openedURLError) { - completion(openedURL, authMethod, openedURLError); - }]; - break; - } - case FBSDKLoginBehaviorSystemAccount: { - if (serverConfiguration.isSystemAuthenticationEnabled) { - [self beginSystemLogIn]; - } else { - [self logInWithBehavior:FBSDKLoginBehaviorNative]; - } - completion(YES, FBSDKLoginManagerLoggerAuthMethod_System, nil); - break; - } - case FBSDKLoginBehaviorWeb: - [self performWebLogInWithParameters:loginParams handler:^(BOOL openedURL, NSError *openedURLError) { - completion(openedURL, FBSDKLoginManagerLoggerAuthMethod_Webview, openedURLError); - }]; - break; - } -} - -- (void)storeExpectedChallenge:(NSString *)challengeExpected -{ - [_keychainStore setString:challengeExpected - forKey:FBSDKExpectedChallengeKey - accessibility:[FBSDKDynamicFrameworkLoader loadkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly]]; -} - -+ (NSString *)stringForChallenge { - return [FBSDKCrypto randomString:FBClientStateChallengeLength]; -} - -- (void)validateReauthentication:(FBSDKAccessToken *)currentToken withResult:(FBSDKLoginManagerLoginResult *)loginResult -{ - FBSDKGraphRequest *requestMe = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" - parameters:@{@"fields":@""} - tokenString:loginResult.token.tokenString - HTTPMethod:nil - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - [requestMe startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - NSString *actualID = result[@"id"]; - if ([currentToken.userID isEqualToString:actualID]) { - [FBSDKAccessToken setCurrentAccessToken:loginResult.token]; - [self invokeHandler:loginResult error:nil]; - } else { - NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; - [FBSDKInternalUtility dictionary:userInfo setObject:error forKey:NSUnderlyingErrorKey]; - NSError *resultError = [NSError errorWithDomain:FBSDKLoginErrorDomain - code:FBSDKLoginUserMismatchErrorCode - userInfo:userInfo]; - [self invokeHandler:nil error:resultError]; - } - }]; -} - -#pragma mark - Test Methods - -- (void)setHandler:(FBSDKLoginManagerRequestTokenHandler)handler -{ - _handler = [handler copy]; -} - -- (void)setRequestedPermissions:(NSSet *)requestedPermissions -{ - _requestedPermissions = [requestedPermissions copy]; -} - -@end - -#pragma mark - - -@implementation FBSDKLoginManager (Native) - -- (void)performNativeLogInWithParameters:(NSDictionary *)loginParams handler:(void(^)(BOOL, NSError*))handler -{ - [_logger willAttemptAppSwitchingBehavior]; - loginParams = [_logger parametersWithTimeStampAndClientState:loginParams forAuthMethod:FBSDKLoginManagerLoggerAuthMethod_Native]; - - NSString *scheme = ([FBSDKSettings appURLSchemeSuffix] ? @"fbauth2" : @"fbauth"); - NSMutableDictionary *mutableParams = [NSMutableDictionary dictionaryWithDictionary:loginParams]; - mutableParams[@"legacy_override"] = FBSDK_TARGET_PLATFORM_VERSION; - NSError *error; - NSURL *authURL = [FBSDKInternalUtility URLWithScheme:scheme host:@"authorize" path:@"" queryParameters:mutableParams error:&error]; - - NSDate *start = [NSDate date]; - [[FBSDKApplicationDelegate sharedInstance] openURL:authURL sender:self handler:^(BOOL openedURL, NSError *anError) { - [_logger logNativeAppDialogResult:openedURL dialogDuration:-[start timeIntervalSinceNow]]; - if (handler) { - handler(openedURL, anError); - } - }]; -} - -// change bool to auth method string. -- (void)performBrowserLogInWithParameters:(NSDictionary *)loginParams - handler:(void(^)(BOOL didOpen, NSString *authMethod, NSError *error))handler -{ - [_logger willAttemptAppSwitchingBehavior]; - - FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - BOOL useSafariViewController = [configuration useSafariViewControllerForDialogName:FBSDKDialogConfigurationNameLogin]; - NSString *authMethod = (useSafariViewController ? FBSDKLoginManagerLoggerAuthMethod_SFVC : FBSDKLoginManagerLoggerAuthMethod_Browser); - - loginParams = [_logger parametersWithTimeStampAndClientState:loginParams forAuthMethod:authMethod]; - - NSURL *authURL = nil; - NSError *error; - NSURL *redirectURL = [FBSDKInternalUtility appURLWithHost:@"authorize" path:nil queryParameters:nil error:&error]; - if (!error) { - NSMutableDictionary *browserParams = [loginParams mutableCopy]; - [FBSDKInternalUtility dictionary:browserParams - setObject:redirectURL - forKey:@"redirect_uri"]; - authURL = [FBSDKInternalUtility facebookURLWithHostPrefix:@"m." - path:FBSDKOauthPath - queryParameters:browserParams - error:&error]; - } - if (authURL) { - void(^handlerWrapper)(BOOL, NSError*) = ^(BOOL didOpen, NSError *anError) { - if (handler) { - handler(didOpen, authMethod, anError); - } - }; - - if (useSafariViewController) { - // Note based on above, authURL must be a http scheme. If that changes, add a guard, otherwise SFVC can throw - self->_usedSFAuthSession = YES; - [[FBSDKApplicationDelegate sharedInstance] openURLWithSafariViewController:authURL - sender:self - fromViewController:self.fromViewController - handler:handlerWrapper]; - } else { - [[FBSDKApplicationDelegate sharedInstance] openURL:authURL sender:self handler:handlerWrapper]; - } - } else { - error = error ?: [FBSDKError errorWithCode:FBSDKLoginUnknownErrorCode message:@"Failed to construct oauth browser url"]; - if (handler) { - handler(NO, nil, error); - } - } -} - -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation -{ - BOOL isFacebookURL = [self canOpenURL:url forApplication:application sourceApplication:sourceApplication annotation:annotation]; - - if (!isFacebookURL && [self isPerformingLogin]) { - [self handleImplicitCancelOfLogIn]; - } - - if (isFacebookURL) { - NSDictionary *urlParameters = [FBSDKLoginUtility queryParamsFromLoginURL:url]; - id completer = [[FBSDKLoginURLCompleter alloc] initWithURLParameters:urlParameters appID:[FBSDKSettings appID]]; - - if (_logger == nil) { - _logger = [FBSDKLoginManagerLogger loggerFromParameters:urlParameters]; - } - - // any necessary strong reference is maintained by the FBSDKLoginURLCompleter handler - [completer completeLogIn:self withHandler:^(FBSDKLoginCompletionParameters *parameters) { - [self completeAuthentication:parameters expectChallenge:YES]; - }]; - } - - return isFacebookURL; -} - -- (BOOL)canOpenURL:(NSURL *)url - forApplication:(UIApplication *)application - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation -{ - // verify the URL is intended as a callback for the SDK's log in - BOOL isFacebookURL = [[url scheme] hasPrefix:[NSString stringWithFormat:@"fb%@", [FBSDKSettings appID]]] && - [[url host] isEqualToString:@"authorize"]; - - BOOL isExpectedSourceApplication = [sourceApplication hasPrefix:@"com.facebook"] || [sourceApplication hasPrefix:@"com.apple"] || [sourceApplication hasPrefix:@"com.burbn"]; - - return isFacebookURL && isExpectedSourceApplication; -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - if ([self isPerformingLogin]) { - [self handleImplicitCancelOfLogIn]; - } -} - -- (BOOL)isAuthenticationURL:(NSURL *)url -{ - return [url.path hasSuffix:FBSDKOauthPath]; -} - -@end - -@implementation FBSDKLoginManager (Accounts) - -- (void)beginSystemLogIn -{ - // First, we need to validate the current access token. The user may have uninstalled the - // app, changed their password, etc., or the access token may have expired, which - // requires us to renew the account before asking for additional permissions. - NSString *accessTokenString = [FBSDKSystemAccountStoreAdapter sharedInstance].accessTokenString; - if (accessTokenString.length > 0) { - FBSDKGraphRequest *meRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" - parameters:@{ @"fields" : @"id" } - tokenString:accessTokenString - HTTPMethod:nil - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - [meRequest startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - if (!error) { - // If there was no error, make an explicit renewal call anyway to cover cases where user has revoked some read permission like email. - // Otherwise, iOS system account may continue to think email was granted and never prompt UI again. - [[FBSDKSystemAccountStoreAdapter sharedInstance] renewSystemAuthorization:^(ACAccountCredentialRenewResult renewResult, NSError *renewError) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self performSystemLogIn]; - }); - }]; - } else { - // If there was an error, FBSDKGraphRequestConnection would have already done work already (like renewal calls) - [self performSystemLogIn]; - } - }]; - } else { - [self performSystemLogIn]; - } -} - -- (void)performSystemLogIn -{ - if (![FBSDKSystemAccountStoreAdapter sharedInstance].accountType) { - // There is no Facebook system account type. Fallback to Native behavior - [self fallbackToNativeBehavior]; - return; - } - BOOL isReauthorize = [FBSDKAccessToken currentAccessToken] != nil; - - // app may be asking for nothing, but we will always have a set here - NSMutableSet *permissionsToUse = _requestedPermissions ? [_requestedPermissions mutableCopy] : [NSMutableSet set]; - // Only add basic info if this is not reauthorize case, if it is the app should already have basic info ToSed - if (!isReauthorize) { - // Ensure that basic info is among the permissions requested so that the app will install if necessary. - // "email" is used as a proxy for basic_info permission. - [permissionsToUse addObject:@"email"]; - } - - [permissionsToUse removeObject:@"public_profile"]; - [permissionsToUse removeObject:@"user_friends"]; - - NSString *audience; - switch (self.defaultAudience) { - case FBSDKDefaultAudienceOnlyMe: - audience = fbsdkdfl_ACFacebookAudienceOnlyMe(); - break; - case FBSDKDefaultAudienceFriends: - audience = fbsdkdfl_ACFacebookAudienceFriends(); - break; - case FBSDKDefaultAudienceEveryone: - audience = fbsdkdfl_ACFacebookAudienceEveryone(); - break; - default: - audience = nil; - } - - uint64_t timePriorToSystemAuthUI = [FBSDKInternalUtility currentTimeInMilliseconds]; - - // the FBSDKSystemAccountStoreAdapter completion handler maintains the strong reference during the the asynchronous operation - [[FBSDKSystemAccountStoreAdapter sharedInstance] - requestAccessToFacebookAccountStore:permissionsToUse - defaultAudience:audience - isReauthorize:isReauthorize - appID:[FBSDKSettings appID] - handler:^(NSString *oauthToken, NSError *accountStoreError) { - - // There doesn't appear to be a reliable way to determine whether UI was shown or - // whether the cached token was sufficient. So we use a timer heuristic assuming that - // human response time couldn't complete a dialog in under the interval given here, but - // the process will return here fast enough if the token is cached. The threshold was - // chosen empirically, so there may be some edge cases that are false negatives or - // false positives. - BOOL didShowDialog = [FBSDKInternalUtility currentTimeInMilliseconds] - timePriorToSystemAuthUI > 350; - BOOL isUnTOSedDevice = !oauthToken && accountStoreError.code == ACErrorAccountNotFound; - [_logger systemAuthDidShowDialog:didShowDialog isUnTOSedDevice:isUnTOSedDevice]; - - if (accountStoreError && [FBSDKSystemAccountStoreAdapter sharedInstance].forceBlockingRenew) { - accountStoreError = [FBSDKLoginError errorForSystemPasswordChange:accountStoreError]; - } - if (!oauthToken && !accountStoreError) { - // This means iOS did not give an error nor granted, even after a renew. In order to - // surface this to users, stuff in our own error that can be inspected. - accountStoreError = [FBSDKLoginError errorForFailedLoginWithCode:FBSDKLoginSystemAccountAppDisabledErrorCode]; - } - - FBSDKLoginManagerSystemAccountState *state = [[FBSDKLoginManagerSystemAccountState alloc] init]; - state.didShowDialog = didShowDialog; - state.reauthorize = isReauthorize; - state.unTOSedDevice = isUnTOSedDevice; - - [self continueSystemLogInWithTokenString:oauthToken error:accountStoreError state:state]; - }]; -} - -- (void)continueSystemLogInWithTokenString:(NSString *)oauthToken error:(NSError *)accountStoreError state:(FBSDKLoginManagerSystemAccountState *)state -{ - id completer = nil; - - if (!oauthToken && accountStoreError.code == ACErrorAccountNotFound) { - // Even with the Accounts framework we use the Facebook app or Safari to log in if - // the user has not signed in. This condition can only be detected by attempting to - // log in because the framework does not otherwise indicate whether a Facebook account - // exists on the device unless the user has granted the app permissions. - - // Do this asynchronously so the logger correctly notes the system account was skipped - dispatch_async(dispatch_get_main_queue(), ^{ - [self fallbackToNativeBehavior]; - }); - } else if (oauthToken) { - completer = [[FBSDKLoginSystemAccountCompleter alloc] initWithTokenString:oauthToken appID:[FBSDKSettings appID]]; - } else { - completer = [[FBSDKLoginSystemAccountErrorCompleter alloc] initWithError:accountStoreError permissions:_requestedPermissions]; - } - - // any necessary strong reference is maintained by the FBSDKLoginSystemAccount[Error]Completer handler - [completer completeLogIn:self withHandler:^(FBSDKLoginCompletionParameters *parameters) { - NSString *eventName = [NSString stringWithFormat:@"%@ %@", - (state.isReauthorize ? @"Reauthorization" : @"Authorization"), - (parameters.error ? @"Error" : (parameters.accessTokenString ? @"succeeded" : @"cancelled")) - ]; - - [self completeAuthentication:parameters expectChallenge:NO]; - - if (eventName != nil) { - NSString *sortedPermissions = (parameters.permissions.count == 0) - ? @"" - : [[parameters.permissions.allObjects sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] componentsJoinedByString:@","]; - - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNamePermissionsUILaunch - valueToSum:nil - parameters:@{ @"ui_dialog_type" : @"iOS integrated auth", - @"permissions_requested" : sortedPermissions } - accessToken:nil]; - - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNamePermissionsUIDismiss - valueToSum:nil - parameters:@{ @"ui_dialog_type" : @"iOS integrated auth", - FBSDKAppEventParameterDialogOutcome : eventName, - @"permissions_requested" : sortedPermissions } - accessToken:nil]; - } - }]; -} - -- (void)fallbackToNativeBehavior -{ - FBSDKLoginManagerLoginResult *skippedResult = [[FBSDKLoginManagerLoginResult alloc] initWithToken:nil - isCancelled:NO - grantedPermissions:nil - declinedPermissions:nil]; - skippedResult.isSkipped = YES; - [_logger endLoginWithResult:skippedResult error:nil]; - // any necessary strong reference will be maintained by the mechanism that is used - [self logInWithBehavior:FBSDKLoginBehaviorNative]; -} - -@end - -@implementation FBSDKLoginManager (WebDialog) - -- (void)performWebLogInWithParameters:(NSDictionary *)loginParams handler:(void(^)(BOOL, NSError*))handler -{ - [FBSDKInternalUtility registerTransientObject:self]; - [FBSDKInternalUtility deleteFacebookCookies]; - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] initWithDictionary:loginParams]; - parameters[@"title"] = NSLocalizedStringWithDefaultValue(@"LoginWeb.LogInTitle", - @"FacebookSDK", - [FBSDKInternalUtility bundleForStrings], - @"Log In", - @"Title of the web dialog that prompts the user to log in to Facebook."); - [FBSDKWebDialog showWithName:@"oauth" parameters:parameters delegate:self]; - - if (handler) { - handler(YES, nil); - } -} - -- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results -{ - NSString *token = results[@"access_token"]; - - if (token.length == 0) { - [self webDialogDidCancel:webDialog]; - } else { - id completer = [[FBSDKLoginURLCompleter alloc] initWithURLParameters:results appID:[FBSDKSettings appID]]; - [completer completeLogIn:self withHandler:^(FBSDKLoginCompletionParameters *parameters) { - [self completeAuthentication:parameters expectChallenge:YES]; - }]; - [FBSDKInternalUtility unregisterTransientObject:self]; - } -} - -- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error -{ - FBSDKLoginCompletionParameters *parameters = [[FBSDKLoginCompletionParameters alloc] initWithError:error]; - [self completeAuthentication:parameters expectChallenge:YES]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog -{ - FBSDKLoginCompletionParameters *parameters = [[FBSDKLoginCompletionParameters alloc] init]; - [self completeAuthentication:parameters expectChallenge:YES]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -@end - -@implementation FBSDKLoginManagerSystemAccountState -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h deleted file mode 100644 index 6148a0754..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKAccessToken; - -/** - Describes the result of a login attempt. - */ -@interface FBSDKLoginManagerLoginResult : NSObject - -/** - the access token. - */ -@property (copy, nonatomic) FBSDKAccessToken *token; - -/** - whether the login was cancelled by the user. - */ -@property (readonly, nonatomic) BOOL isCancelled; - -/** - the set of permissions granted by the user in the associated request. - - inspect the token's permissions set for a complete list. - */ -@property (copy, nonatomic) NSSet *grantedPermissions; - -/** - the set of permissions declined by the user in the associated request. - - inspect the token's permissions set for a complete list. - */ -@property (copy, nonatomic) NSSet *declinedPermissions; - -/** - Initializes a new instance. - - Parameter token: the access token - - Parameter isCancelled: whether the login was cancelled by the user - - Parameter grantedPermissions: the set of granted permissions - - Parameter declinedPermissions: the set of declined permissions - */ -- (instancetype)initWithToken:(FBSDKAccessToken *)token - isCancelled:(BOOL)isCancelled - grantedPermissions:(NSSet *)grantedPermissions - declinedPermissions:(NSSet *)declinedPermissions -NS_DESIGNATED_INITIALIZER; -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManagerLoginResult.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManagerLoginResult.m deleted file mode 100644 index d03b0227d..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManagerLoginResult.m +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginManagerLoginResult+Internal.h" - -#import "FBSDKCoreKit+Internal.h" - -@implementation FBSDKLoginManagerLoginResult { - NSMutableDictionary *_mutableLoggingExtras; -} - -- (instancetype)init NS_UNAVAILABLE -{ - assert(0); -} - -- (instancetype)initWithToken:(FBSDKAccessToken *)token - isCancelled:(BOOL)isCancelled - grantedPermissions:(NSSet *)grantedPermissions - declinedPermissions:(NSSet *)declinedPermissions { - if ((self = [super init])) { - _mutableLoggingExtras = [NSMutableDictionary dictionary]; - _token = [token copy]; - _isCancelled = isCancelled; - _grantedPermissions = [grantedPermissions copy]; - _declinedPermissions = [declinedPermissions copy]; - }; - return self; -} - -- (void)addLoggingExtra:(id)object forKey:(id)key -{ - [FBSDKInternalUtility dictionary:_mutableLoggingExtras setObject:object forKey:key]; -} - -- (NSDictionary *)loggingExtras -{ - return [_mutableLoggingExtras copy]; -} - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginTooltipView.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginTooltipView.h deleted file mode 100644 index ad2c9d504..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginTooltipView.h +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@protocol FBSDKLoginTooltipViewDelegate; - -/** - - Represents a tooltip to be displayed next to a Facebook login button - to highlight features for new users. - - - The `FBSDKLoginButton` may display this view automatically. If you do - not use the `FBSDKLoginButton`, you can manually call one of the `present*` methods - as appropriate and customize behavior via `FBSDKLoginTooltipViewDelegate` delegate. - - By default, the `FBSDKLoginTooltipView` is not added to the superview until it is - determined the app has migrated to the new login experience. You can override this - (e.g., to test the UI layout) by implementing the delegate or setting `forceDisplay` to YES. - - */ -@interface FBSDKLoginTooltipView : FBSDKTooltipView - -/** the delegate */ -@property (nonatomic, weak) id delegate; - -/** if set to YES, the view will always be displayed and the delegate's - `loginTooltipView:shouldAppear:` will NOT be called. */ -@property (nonatomic, assign) BOOL forceDisplay; - -@end - -/** - @protocol - - The `FBSDKLoginTooltipViewDelegate` protocol defines the methods used to receive event - notifications from `FBSDKLoginTooltipView` objects. - */ -@protocol FBSDKLoginTooltipViewDelegate - -@optional - -/** - Asks the delegate if the tooltip view should appear - - - Parameter view: The tooltip view. - - Parameter appIsEligible: The value fetched from the server identifying if the app - is eligible for the new login experience. - - - Use this method to customize display behavior. - */ -- (BOOL)loginTooltipView:(FBSDKLoginTooltipView *)view shouldAppear:(BOOL)appIsEligible; - -/** - Tells the delegate the tooltip view will appear, specifically after it's been - added to the super view but before the fade in animation. - - - Parameter view: The tooltip view. - */ -- (void)loginTooltipViewWillAppear:(FBSDKLoginTooltipView *)view; - -/** - Tells the delegate the tooltip view will not appear (i.e., was not - added to the super view). - - - Parameter view: The tooltip view. - */ -- (void)loginTooltipViewWillNotAppear:(FBSDKLoginTooltipView *)view; - - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginTooltipView.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginTooltipView.m deleted file mode 100644 index e1a17d486..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginTooltipView.m +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginTooltipView.h" - -#import "FBSDKCoreKit+Internal.h" - -@interface FBSDKLoginTooltipView () -@end - -@implementation FBSDKLoginTooltipView - -- (instancetype)init -{ - NSString *tooltipMessage = - NSLocalizedStringWithDefaultValue(@"LoginTooltip.Message", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"You're in control - choose what info you want to share with apps.", - @"The message of the FBSDKLoginTooltipView"); - return [super initWithTagline:nil message:tooltipMessage colorStyle:FBSDKTooltipColorStyleFriendlyBlue]; -} - -- (void)presentInView:(UIView *)view withArrowPosition:(CGPoint)arrowPosition direction:(FBSDKTooltipViewArrowDirection)arrowDirection -{ - if (self.forceDisplay) { - [super presentInView:view withArrowPosition:arrowPosition direction:arrowDirection]; - } else { - - [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *error) { - self.message = serverConfiguration.loginTooltipText; - BOOL shouldDisplay = serverConfiguration.loginTooltipEnabled; - if ([self.delegate respondsToSelector:@selector(loginTooltipView:shouldAppear:)]) { - shouldDisplay = [self.delegate loginTooltipView:self shouldAppear:shouldDisplay]; - } - if (shouldDisplay) { - [super presentInView:view withArrowPosition:arrowPosition direction:arrowDirection]; - if ([self.delegate respondsToSelector:@selector(loginTooltipViewWillAppear:)]) { - [self.delegate loginTooltipViewWillAppear:self]; - } - } else { - if ([self.delegate respondsToSelector:@selector(loginTooltipViewWillNotAppear:)]) { - [self.delegate loginTooltipViewWillNotAppear:self]; - } - } - }]; - } -} -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKTooltipView.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKTooltipView.h deleted file mode 100644 index 604c840c8..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKTooltipView.h +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - FBSDKTooltipViewArrowDirection enum - - Passed on construction to determine arrow orientation. - */ -typedef NS_ENUM(NSUInteger, FBSDKTooltipViewArrowDirection) -{ - /** View is located above given point, arrow is pointing down. */ - FBSDKTooltipViewArrowDirectionDown = 0, - /** View is located below given point, arrow is pointing up. */ - FBSDKTooltipViewArrowDirectionUp = 1, -}; - -/** - FBSDKTooltipColorStyle enum - - Passed on construction to determine color styling. - */ -typedef NS_ENUM(NSUInteger, FBSDKTooltipColorStyle) -{ - /** Light blue background, white text, faded blue close button. */ - FBSDKTooltipColorStyleFriendlyBlue = 0, - /** Dark gray background, white text, light gray close button. */ - FBSDKTooltipColorStyleNeutralGray = 1, -}; - -/** - - Tooltip bubble with text in it used to display tips for UI elements, - with a pointed arrow (to refer to the UI element). - - - - The tooltip fades in and will automatically fade out. See `displayDuration`. - */ -@interface FBSDKTooltipView : UIView - -/** - Gets or sets the amount of time in seconds the tooltip should be displayed. - Set this to zero to make the display permanent until explicitly dismissed. - Defaults to six seconds. - */ -@property (nonatomic, assign) CFTimeInterval displayDuration; - -/** - Gets or sets the color style after initialization. - Defaults to value passed to -initWithTagline:message:colorStyle:. - */ -@property (nonatomic, assign) FBSDKTooltipColorStyle colorStyle; - -/** - Gets or sets the message. - */ -@property (nonatomic, copy) NSString *message; - -/** - Gets or sets the optional phrase that comprises the first part of the label (and is highlighted differently). - */ -@property (nonatomic, copy) NSString *tagline; - -/** - Designated initializer. - - - Parameter tagline: First part of the label, that will be highlighted with different color. Can be nil. - - - Parameter message: Main message to display. - - - Parameter colorStyle: Color style to use for tooltip. - - - - If you need to show a tooltip for login, consider using the `FBSDKLoginTooltipView` view. - - -- See:FBSDKLoginTooltipView - */ -- (instancetype)initWithTagline:(NSString *)tagline message:(NSString *)message colorStyle:(FBSDKTooltipColorStyle)colorStyle; - -/** - Show tooltip at the top or at the bottom of given view. - Tooltip will be added to anchorView.window.rootViewController.view - - - Parameter anchorView: view to show at, must be already added to window view hierarchy, in order to decide - where tooltip will be shown. (If there's not enough space at the top of the anchorView in window bounds - - tooltip will be shown at the bottom of it) - - - - Use this method to present the tooltip with automatic positioning or - use -presentInView:withArrowPosition:direction: for manual positioning - If anchorView is nil or has no window - this method does nothing. - */ -- (void)presentFromView:(UIView *)anchorView; - -/** - Adds tooltip to given view, with given position and arrow direction. - - - Parameter view: View to be used as superview. - - - Parameter arrowPosition: Point in view's cordinates, where arrow will be pointing - - - Parameter arrowDirection: whenever arrow should be pointing up (message bubble is below the arrow) or - down (message bubble is above the arrow). - */ -- (void)presentInView:(UIView *)view withArrowPosition:(CGPoint)arrowPosition direction:(FBSDKTooltipViewArrowDirection)arrowDirection; - -/** - Remove tooltip manually. - - - - Calling this method isn't necessary - tooltip will dismiss itself automatically after the `displayDuration`. - */ -- (void)dismiss; - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKTooltipView.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKTooltipView.m deleted file mode 100644 index d500cc4f4..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKTooltipView.m +++ /dev/null @@ -1,603 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKTooltipView.h" - -#import - -#import "FBSDKCoreKit+Internal.h" - -static const CGFloat kTransitionDuration = 0.3; -static const CGFloat kZoomOutScale = 0.001f; -static const CGFloat kZoomInScale = 1.1f; -static const CGFloat kZoomBounceScale = 0.98f; - -static const CGFloat kNUXRectInset = 6; -static const CGFloat kNUXBubbleMargin = 17 - kNUXRectInset; -static const CGFloat kNUXPointMargin = -3; -static const CGFloat kNUXCornerRadius = 4; -static const CGFloat kNUXStrokeLineWidth = 0.5f; -static const CGFloat kNUXSideCap = 6; -static const CGFloat kNUXFontSize = 10; -static const CGFloat kNUXCrossGlyphSize = 11; - -static CGMutablePathRef _fbsdkCreateUpPointingBubbleWithRect(CGRect rect, CGFloat arrowMidpoint, CGFloat arrowHeight, CGFloat radius); -static CGMutablePathRef _fbsdkCreateDownPointingBubbleWithRect(CGRect rect, CGFloat arrowMidpoint, CGFloat arrowHeight, CGFloat radius); - -#pragma mark - - -@implementation FBSDKTooltipView -{ - CGPoint _positionInView; - CFAbsoluteTime _displayTime; - CFTimeInterval _minimumDisplayDuration; - UILabel *_textLabel; - UITapGestureRecognizer *_insideTapGestureRecognizer; - CGFloat _leftWidth; - CGFloat _rightWidth; - CGFloat _arrowMidpoint; - BOOL _pointingUp; - BOOL _isFadingOut; - // style - UIColor *_innerStrokeColor; - CGFloat _arrowHeight; - CGFloat _textPadding; - CGFloat _maximumTextWidth; - CGFloat _verticalTextOffset; - CGFloat _verticalCrossOffset; - FBSDKTooltipColorStyle _colorStyle; - NSArray *_gradientColors; - UIColor *_crossCloseGlyphColor; -} - -- (instancetype)initWithTagline:(NSString *)tagline message:(NSString *)message colorStyle:(FBSDKTooltipColorStyle)colorStyle -{ - self = [super initWithFrame:CGRectZero]; - if (self) { - // Define style - _textLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _textLabel.backgroundColor = [UIColor clearColor]; - _textLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin; - _textLabel.numberOfLines = 0; - _textLabel.font = [UIFont boldSystemFontOfSize: kNUXFontSize]; - _textLabel.textAlignment = NSTextAlignmentLeft; - _arrowHeight = 7; - _textPadding = 10; - _maximumTextWidth = 185; - _verticalCrossOffset = - 2.5f; - _verticalTextOffset = 0; - _displayDuration = 6.0; - [self setColorStyle:colorStyle]; - - _message = [message copy]; - _tagline = [tagline copy]; - [self setMessage:message tagline:tagline]; - [self addSubview:_textLabel]; - - _insideTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTapInTooltip:)]; - [self addGestureRecognizer:_insideTapGestureRecognizer]; - - self.opaque = NO; - self.backgroundColor = [UIColor clearColor]; - self.layer.needsDisplayOnBoundsChange = YES; - self.layer.shadowColor = [UIColor blackColor].CGColor; - self.layer.shadowOpacity = 0.5f; - self.layer.shadowOffset = CGSizeMake(0.0f, 2.0f); - self.layer.shadowRadius = 5.0f; - self.layer.masksToBounds = NO; - } - return self; -} - -- (void)dealloc -{ - [_insideTapGestureRecognizer removeTarget:self action:NULL]; -} - -#pragma mark - Public Methods - -- (void)setMessage:(NSString *)message -{ - if (![message isEqualToString:_message]) { - _message = [message copy]; - [self setMessage:_message tagline:self.tagline]; - } -} - -- (void)setTagline:(NSString *)tagline -{ - if (![tagline isEqualToString:_tagline]) { - _tagline = [tagline copy]; - [self setMessage:self.message tagline:_tagline]; - } -} - -#pragma mark Presentation - -- (void)presentFromView:(UIView *)anchorView -{ - UIView *superview = anchorView.window.rootViewController.view; - if (!superview) { - return; - } - - // By default - attach to the top, pointing down - CGPoint position = CGPointMake(CGRectGetMidX(anchorView.bounds), CGRectGetMinY(anchorView.bounds)); - CGPoint positionInSuperview = [superview convertPoint:position fromView:anchorView]; - FBSDKTooltipViewArrowDirection direction = FBSDKTooltipViewArrowDirectionDown; - - // If not enough space to point up from top of anchor view - point up to it's bottom - CGFloat bubbleHeight = CGRectGetHeight(_textLabel.bounds) + _verticalTextOffset + _textPadding * 2; - if (positionInSuperview.y - bubbleHeight - kNUXBubbleMargin < CGRectGetMinY(superview.bounds)) { - direction = FBSDKTooltipViewArrowDirectionUp; - position = CGPointMake(CGRectGetMidX(anchorView.bounds), CGRectGetMaxY(anchorView.bounds)); - positionInSuperview = [superview convertPoint:position fromView:anchorView]; - } - - [self presentInView:superview withArrowPosition:positionInSuperview direction:direction]; -} - -- (void)presentInView:(UIView *)view withArrowPosition:(CGPoint)arrowPosition direction:(FBSDKTooltipViewArrowDirection)arrowDirection -{ - _pointingUp = arrowDirection == FBSDKTooltipViewArrowDirectionUp; - _positionInView = arrowPosition; - self.frame = [self layoutSubviewsAndDetermineFrame]; - - // Add to view, while invisible. - self.hidden = YES; - if ([self superview]) { - [self removeFromSuperview]; - } - [view addSubview:self]; - - // Layout & schedule dismissal. - _displayTime = CFAbsoluteTimeGetCurrent(); - _isFadingOut = NO; - [self scheduleAutomaticFadeout]; - [self layoutSubviews]; - - [self animateFadeIn]; -} - -- (void)dismiss -{ - if (_isFadingOut) { - return; - } - _isFadingOut = YES; - - [self animateFadeOutWithCompletion:^{ - [self removeFromSuperview]; - [self cancelAllScheduledFadeOutMethods]; - _isFadingOut = NO; - }]; -} - -#pragma mark Style - -- (FBSDKTooltipColorStyle)colorStyle -{ - return _colorStyle; -} - -- (void)setColorStyle:(FBSDKTooltipColorStyle)colorStyle -{ - _colorStyle = colorStyle; - switch (colorStyle) { - case FBSDKTooltipColorStyleNeutralGray: - _gradientColors = @[ - (id)(FBSDKUIColorWithRGB(0x51, 0x50, 0x4f).CGColor), - (id)(FBSDKUIColorWithRGB(0x2d, 0x2c, 0x2c).CGColor) - ]; - _innerStrokeColor = [UIColor colorWithWhite:0.13f alpha:1.0f]; - _crossCloseGlyphColor = [UIColor colorWithWhite:0.69f alpha:1.0f]; - break; - - case FBSDKTooltipColorStyleFriendlyBlue: - default: - _gradientColors = @[ - (id)(FBSDKUIColorWithRGB(0x6e, 0x9c, 0xf5).CGColor), - (id)(FBSDKUIColorWithRGB(0x49, 0x74, 0xc6).CGColor) - ]; - _innerStrokeColor = [UIColor colorWithRed:0.12f green:0.26f blue:0.55f alpha:1.0f]; - _crossCloseGlyphColor = [UIColor colorWithRed:0.60f green:0.73f blue:1.0f alpha:1.0f]; - break; - } - - _textLabel.textColor = [UIColor whiteColor]; -} - -#pragma mark - Private Methods -#pragma mark Animation - -- (void)animateFadeIn -{ - // Prepare Animation: Zoom in with bounce. Keep the arrow point in place. - // Set initial transform (zoomed out) & become visible. - CGFloat centerPos = self.bounds.size.width / 2.0; - CGFloat zoomOffsetX = (centerPos - _arrowMidpoint) * (kZoomOutScale - 1.0f); - CGFloat zoomOffsetY = -0.5f * self.bounds.size.height * (kZoomOutScale - 1.0f); - if (_pointingUp) { - zoomOffsetY = -zoomOffsetY; - } - self.layer.transform = fbsdkdfl_CATransform3DConcat(fbsdkdfl_CATransform3DMakeScale(kZoomOutScale, kZoomOutScale, kZoomOutScale), - fbsdkdfl_CATransform3DMakeTranslation(zoomOffsetX, zoomOffsetY, 0)); - self.hidden = NO; - - // Prepare animation steps - // 1st Step. - void (^zoomIn)(void) = ^{ - self.alpha = 1.0; - - CGFloat newZoomOffsetX = (centerPos - _arrowMidpoint) * (kZoomInScale - 1.0f); - CGFloat newZoomOffsetY = -0.5f * self.bounds.size.height * (kZoomInScale - 1.0f); - if (_pointingUp) { - newZoomOffsetY = -newZoomOffsetY; - } - - CATransform3D scale = fbsdkdfl_CATransform3DMakeScale(kZoomInScale, kZoomInScale, kZoomInScale); - CATransform3D translate =fbsdkdfl_CATransform3DMakeTranslation(newZoomOffsetX, newZoomOffsetY, 0); - self.layer.transform = fbsdkdfl_CATransform3DConcat(scale, translate); - }; - - // 2nd Step. - void (^bounceZoom)(void) = ^{ - CGFloat centerPos2 = self.bounds.size.width / 2.0; - CGFloat zoomOffsetX2 = (centerPos2 - _arrowMidpoint) * (kZoomBounceScale - 1.0f); - CGFloat zoomOffsetY2 = -0.5f * self.bounds.size.height * (kZoomBounceScale - 1.0f); - if (_pointingUp) { - zoomOffsetY2 = -zoomOffsetY2; - } - self.layer.transform = fbsdkdfl_CATransform3DConcat(fbsdkdfl_CATransform3DMakeScale(kZoomBounceScale, kZoomBounceScale, kZoomBounceScale), - fbsdkdfl_CATransform3DMakeTranslation(zoomOffsetX2, zoomOffsetY2, 0)); - }; - - // 3rd Step. - void (^normalizeZoom)(void) = ^{ - self.layer.transform = fbsdkdfl_CATransform3DIdentity; - }; - - // Animate 3 steps sequentially - [UIView animateWithDuration:kTransitionDuration/1.5 - delay:0 - options:UIViewAnimationOptionCurveEaseInOut - animations:zoomIn - completion:^(BOOL finished) { - [UIView animateWithDuration:kTransitionDuration/2.2 - animations:bounceZoom - completion:^(BOOL innerFinished) { - [UIView animateWithDuration:kTransitionDuration/5 - animations:normalizeZoom]; - }]; - }]; -} - -- (void) animateFadeOutWithCompletion: (void(^)(void)) completionHandler -{ - [UIView animateWithDuration:0.3 - delay:0 - options:UIViewAnimationOptionCurveEaseInOut - animations:^{ - self.alpha = 0.0; - } - completion:^(BOOL complete) { - if(completionHandler) - completionHandler(); - }]; -} - -#pragma mark Gestures - -- (void)onTapInTooltip:(UIGestureRecognizer*)sender -{ - // ignore incomplete tap gestures - if (sender.state != UIGestureRecognizerStateEnded) { - return; - } - - // fade out the tooltip view right away - [self dismiss]; -} - -#pragma mark Drawing - -CGMutablePathRef _fbsdkCreateUpPointingBubbleWithRect(CGRect rect, CGFloat arrowMidpoint, CGFloat arrowHeight, CGFloat radius) -{ - CGMutablePathRef path = CGPathCreateMutable(); - CGFloat arrowHalfWidth = arrowHeight; - // start with arrow - CGPathMoveToPoint(path, NULL, arrowMidpoint - arrowHalfWidth, CGRectGetMinY(rect)); - CGPathAddLineToPoint(path, NULL, arrowMidpoint, CGRectGetMinY(rect) - arrowHeight); - CGPathAddLineToPoint(path, NULL, arrowMidpoint + arrowHalfWidth, CGRectGetMinY(rect)); - - // rest of curved rectangle - CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMinY(rect), CGRectGetMaxX(rect), CGRectGetMaxY(rect), radius); - CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMaxY(rect), CGRectGetMinX(rect), CGRectGetMaxY(rect), radius); - CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMaxY(rect), CGRectGetMinX(rect), CGRectGetMinY(rect), radius); - CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMinY(rect), CGRectGetMaxX(rect), CGRectGetMinY(rect), radius); - CGPathCloseSubpath(path); - return path; -} - -CGMutablePathRef _fbsdkCreateDownPointingBubbleWithRect(CGRect rect, CGFloat arrowMidpoint, CGFloat arrowHeight, CGFloat radius) -{ - CGMutablePathRef path = CGPathCreateMutable(); - CGFloat arrowHalfWidth = arrowHeight; - - // start with arrow - CGPathMoveToPoint(path, NULL, arrowMidpoint + arrowHalfWidth, CGRectGetMaxY(rect)); - CGPathAddLineToPoint(path, NULL, arrowMidpoint, CGRectGetMaxY(rect) + arrowHeight); - CGPathAddLineToPoint(path, NULL, arrowMidpoint - arrowHalfWidth, CGRectGetMaxY(rect)); - - // rest of curved rectangle - CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMaxY(rect), CGRectGetMinX(rect), CGRectGetMinY(rect), radius); - CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMinY(rect), CGRectGetMaxX(rect), CGRectGetMinY(rect), radius); - CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMinY(rect), CGRectGetMaxX(rect), CGRectGetMaxY(rect), radius); - CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMaxY(rect), CGRectGetMinX(rect), CGRectGetMaxY(rect), radius); - CGPathCloseSubpath(path); - return path; -} - -static CGMutablePathRef _createCloseCrossGlyphWithRect(CGRect rect) -{ - CGFloat lineThickness = 0.20f * CGRectGetHeight(rect); - - // One rectangle - CGMutablePathRef path1 = CGPathCreateMutable(); - CGPathMoveToPoint(path1, NULL, CGRectGetMinX(rect), CGRectGetMinY(rect) + lineThickness); - CGPathAddLineToPoint(path1, NULL, CGRectGetMinX(rect) + lineThickness, CGRectGetMinY(rect)); - CGPathAddLineToPoint(path1, NULL, CGRectGetMaxX(rect), CGRectGetMaxY(rect) - lineThickness); - CGPathAddLineToPoint(path1, NULL, CGRectGetMaxX(rect) - lineThickness, CGRectGetMaxY(rect)); - CGPathCloseSubpath(path1); - - // 2nd rectangle - mirrored horizontally - CGMutablePathRef path2 = CGPathCreateMutable(); - CGPathMoveToPoint(path2, NULL, CGRectGetMinX(rect), CGRectGetMaxY(rect) - lineThickness); - CGPathAddLineToPoint(path2, NULL, CGRectGetMaxX(rect) - lineThickness, CGRectGetMinY(rect)); - CGPathAddLineToPoint(path2, NULL, CGRectGetMaxX(rect), CGRectGetMinY(rect) + lineThickness); - CGPathAddLineToPoint(path2, NULL, CGRectGetMinX(rect) + lineThickness, CGRectGetMaxY(rect)); - CGPathCloseSubpath(path2); - - CGMutablePathRef groupedPath = CGPathCreateMutable(); - CGPathAddPath(groupedPath, NULL, path1); - CGPathAddPath(groupedPath, NULL, path2); - CFRelease(path1); - CFRelease(path2); - - return groupedPath; -} - -- (void)drawRect:(CGRect)rect -{ - // Ignore dirty rect and just redraw the entire nux bubble - CGFloat arrowSideMargin = 1 + 0.5f * MAX(kNUXRectInset, _arrowHeight); - CGFloat arrowYMarginOffset = _pointingUp ? arrowSideMargin : kNUXRectInset; - CGFloat halfStroke = kNUXStrokeLineWidth / 2.0; - CGRect outerRect = CGRectMake(kNUXRectInset + halfStroke, - arrowYMarginOffset + halfStroke, - self.bounds.size.width - 2 * kNUXRectInset - kNUXStrokeLineWidth, - self.bounds.size.height - kNUXRectInset - arrowSideMargin - kNUXStrokeLineWidth); - outerRect = CGRectInset(outerRect, 5, 5); - CGRect innerRect = CGRectInset(outerRect, kNUXStrokeLineWidth, kNUXStrokeLineWidth); - CGRect fillRect = CGRectInset(innerRect, kNUXStrokeLineWidth/2.0, kNUXStrokeLineWidth/2.0); - CGFloat closeCrossGlyphPositionY = MIN(CGRectGetMinY(fillRect) + _textPadding + _verticalCrossOffset, - CGRectGetMidY(fillRect) - 0.5f * kNUXCrossGlyphSize); - CGRect closeCrossGlyphRect = CGRectMake(CGRectGetMaxX(fillRect) - 2 * kNUXFontSize, closeCrossGlyphPositionY, - kNUXCrossGlyphSize, kNUXCrossGlyphSize); - - // setup and get paths - CGContextRef context = UIGraphicsGetCurrentContext(); - CGMutablePathRef outerPath; - CGMutablePathRef innerPath; - CGMutablePathRef fillPath; - CGMutablePathRef crossCloseGlyphPath = _createCloseCrossGlyphWithRect(closeCrossGlyphRect); - CGRect gradientRect = fillRect; - if (_pointingUp) { - outerPath = _fbsdkCreateUpPointingBubbleWithRect(outerRect, - _arrowMidpoint, _arrowHeight, - kNUXCornerRadius + kNUXStrokeLineWidth); - innerPath = _fbsdkCreateUpPointingBubbleWithRect(innerRect, - _arrowMidpoint, _arrowHeight, - kNUXCornerRadius); - fillPath = _fbsdkCreateUpPointingBubbleWithRect(fillRect, - _arrowMidpoint, _arrowHeight, - kNUXCornerRadius - kNUXStrokeLineWidth); - gradientRect.origin.y -= _arrowHeight; - gradientRect.size.height += _arrowHeight; - } else { - outerPath = _fbsdkCreateDownPointingBubbleWithRect(outerRect, - _arrowMidpoint, _arrowHeight, - kNUXCornerRadius + kNUXStrokeLineWidth); - innerPath = _fbsdkCreateDownPointingBubbleWithRect(innerRect, - _arrowMidpoint, _arrowHeight, - kNUXCornerRadius); - fillPath = _fbsdkCreateDownPointingBubbleWithRect(fillRect, - _arrowMidpoint, _arrowHeight, - kNUXCornerRadius - kNUXStrokeLineWidth); - gradientRect.size.height += _arrowHeight; - } - self.layer.shadowPath = outerPath; - - // This tooltip has two borders, so draw two strokes and a fill. - CGColorRef strokeColor = _innerStrokeColor.CGColor; - CGContextSaveGState(context); - CGContextSetStrokeColorWithColor(context, strokeColor); - CGContextSetLineWidth(context, kNUXStrokeLineWidth); - CGContextAddPath(context, innerPath); - CGContextStrokePath(context); - CGContextAddPath(context, fillPath); - CGContextClip(context); - CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB(); - CGGradientRef gradient = CGGradientCreateWithColors(rgbColorspace, (CFArrayRef)_gradientColors, nil); - CGColorSpaceRelease(rgbColorspace); - CGPoint start = CGPointMake(gradientRect.origin.x, gradientRect.origin.y); - CGPoint end = CGPointMake(gradientRect.origin.x, CGRectGetMaxY(gradientRect)); - CGContextDrawLinearGradient(context, gradient, start, end, 0); - CGContextAddPath(context, crossCloseGlyphPath); - CGContextSetFillColorWithColor(context, _crossCloseGlyphColor.CGColor); - CGContextFillPath(context); - CGGradientRelease(gradient); - CGContextRestoreGState(context); - CFRelease(outerPath); - CFRelease(innerPath); - CFRelease(fillPath); - CFRelease(crossCloseGlyphPath); -} - -#pragma mark Layout - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - // We won't set the frame in layoutSubviews to avoid potential infinite loops. - // Frame is set in -presentInView:withArrowPosition:direction: method. - [self layoutSubviewsAndDetermineFrame]; -} - -- (CGRect)layoutSubviewsAndDetermineFrame -{ - // Compute the positioning of the arrow. - CGRect screenBounds = [[UIScreen mainScreen] bounds]; - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - if (!UIInterfaceOrientationIsPortrait(orientation)) { - screenBounds = CGRectMake(0, 0, screenBounds.size.height, screenBounds.size.width); - } - CGFloat arrowHalfWidth = _arrowHeight; - CGFloat arrowXPos = _positionInView.x - arrowHalfWidth; - arrowXPos = MAX(arrowXPos, kNUXSideCap + kNUXBubbleMargin); - arrowXPos = MIN(arrowXPos, screenBounds.size.width - kNUXBubbleMargin - kNUXSideCap - 2 * arrowHalfWidth); - _positionInView = CGPointMake(arrowXPos + arrowHalfWidth, _positionInView.y); - - CGFloat arrowYMarginOffset = _pointingUp ? MAX(kNUXRectInset, _arrowHeight) : kNUXRectInset; - - // Set the lock image frame. - CGFloat xPos = kNUXRectInset + _textPadding + kNUXStrokeLineWidth; - CGFloat yPos = arrowYMarginOffset + kNUXStrokeLineWidth + _textPadding; - - // Set the text label frame. - _textLabel.frame = CGRectMake(xPos, - yPos + _verticalTextOffset, // sizing function may not return desired height exactly - CGRectGetWidth(_textLabel.bounds), - CGRectGetHeight(_textLabel.bounds)); - - // Determine the size of the nux bubble. - CGFloat bubbleHeight = CGRectGetHeight(_textLabel.bounds) + _verticalTextOffset + _textPadding * 2; - CGFloat crossGlyphWidth = 2 * kNUXFontSize; - CGFloat bubbleWidth = CGRectGetWidth(_textLabel.bounds) + _textPadding * 2 + kNUXStrokeLineWidth * 2 + crossGlyphWidth; - - // Compute the widths to the left and right of the arrow. - _leftWidth = roundf(0.5f * (bubbleWidth - 2 * arrowHalfWidth)); - _rightWidth = _leftWidth; - CGFloat originX = arrowXPos - _leftWidth; - if (originX < kNUXBubbleMargin) { - CGFloat xShift = kNUXBubbleMargin - originX; - originX += xShift; - _leftWidth -= xShift; - _rightWidth += xShift; - } else if (originX + bubbleWidth > screenBounds.size.width - kNUXBubbleMargin) { - CGFloat xShift = originX + bubbleWidth - (screenBounds.size.width - kNUXBubbleMargin); - originX -= xShift; - _leftWidth += xShift; - _rightWidth -= xShift; - } - - _arrowMidpoint = _positionInView.x - originX + kNUXRectInset; - - // Set the frame for the view. - CGFloat nuxWidth = bubbleWidth + 2 * kNUXRectInset; - CGFloat nuxHeight = bubbleHeight + kNUXRectInset + MAX(kNUXRectInset, _arrowHeight) + 2 * kNUXStrokeLineWidth; - CGFloat yOrigin = 0; - if (_pointingUp) { - yOrigin = _positionInView.y + kNUXPointMargin - MAX(0, kNUXRectInset - _arrowHeight); - } else { - yOrigin = _positionInView.y - nuxHeight - kNUXPointMargin + MAX(0, kNUXRectInset - _arrowHeight); - } - - return CGRectMake(originX - kNUXRectInset, - yOrigin, - nuxWidth, - nuxHeight); -} - -#pragma mark Message & Tagline - -- (void)setMessage:(NSString *)message tagline:(NSString *)tagline -{ - message = message ?: @""; - // Ensure tagline is empty string or ends with space - tagline = tagline ?: @""; - if ([tagline length] && ![tagline hasSuffix:@" "]) - tagline = [tagline stringByAppendingString:@" "]; - - // Concatenate tagline & main message - message = [tagline stringByAppendingString:message]; - - NSRange fullRange = NSMakeRange(0, message.length); - NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString: message]; - - UIFont *font=[UIFont boldSystemFontOfSize:kNUXFontSize]; - [attrString addAttribute:NSFontAttributeName value:font range:fullRange]; - [attrString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:fullRange]; - if ([tagline length]) { - [attrString addAttribute:NSForegroundColorAttributeName value: FBSDKUIColorWithRGB(0x6D, 0x87, 0xC7) range:NSMakeRange(0, [tagline length])]; - } - - _textLabel.attributedText = attrString; - - CGSize textLabelSize = [_textLabel sizeThatFits:CGSizeMake(_maximumTextWidth, MAXFLOAT)]; - _textLabel.bounds = CGRectMake(0, 0, textLabelSize.width, textLabelSize.height); - self.frame = [self layoutSubviewsAndDetermineFrame]; - [self setNeedsDisplay]; -} - -#pragma mark Auto Dismiss Timeout - -- (void)scheduleAutomaticFadeout -{ - [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(scheduleFadeoutRespectingMinimumDisplayDuration) object:nil]; - - if (_displayDuration > 0.0 && [self superview]) { - CFTimeInterval intervalAlreadyDisplaying = CFAbsoluteTimeGetCurrent() - _displayTime; - CFTimeInterval timeRemainingBeforeAutomaticFadeout = _displayDuration - intervalAlreadyDisplaying; - if (timeRemainingBeforeAutomaticFadeout > 0.0) { - [self performSelector:@selector(scheduleFadeoutRespectingMinimumDisplayDuration) withObject:nil afterDelay:timeRemainingBeforeAutomaticFadeout]; - } else { - [self scheduleFadeoutRespectingMinimumDisplayDuration]; - } - } -} - -- (void)scheduleFadeoutRespectingMinimumDisplayDuration -{ - CFTimeInterval intervalAlreadyDisplaying = CFAbsoluteTimeGetCurrent() - _displayTime; - CFTimeInterval remainingDisplayTime = _minimumDisplayDuration - intervalAlreadyDisplaying; - if (remainingDisplayTime > 0.0) { - [self performSelector:@selector(dismiss) withObject:nil afterDelay:remainingDisplayTime]; - } else { - [self dismiss]; - } -} - -- (void)cancelAllScheduledFadeOutMethods -{ - [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(scheduleFadeoutRespectingMinimumDisplayDuration) object:nil]; - [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(dismiss) object:nil]; -} - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion+Internal.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion+Internal.h deleted file mode 100644 index ea9096549..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion+Internal.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginCompletion.h" - -@interface FBSDKLoginCompletionParameters () - -@property (nonatomic, copy, readwrite) NSString *accessTokenString; - -@property (nonatomic, copy, readwrite) NSSet *permissions; -@property (nonatomic, copy, readwrite) NSSet *declinedPermissions; - -@property (nonatomic, copy, readwrite) NSString *appID; -@property (nonatomic, copy, readwrite) NSString *userID; - -@property (nonatomic, copy, readwrite) NSError *error; - -@property (nonatomic, readwrite, getter=isSystemAccount) BOOL systemAccount; -@property (nonatomic, copy, readwrite) NSDate *expirationDate; -@property (nonatomic, copy, readwrite) NSString *challenge; - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion.h deleted file mode 100644 index af06f09fb..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion.h +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKLoginManager; - -/** - Structured interface for accessing the parameters used to complete a log in request. - If \c accessTokenString is non-nil, the authentication succeeded. If \c error is - non-nil the request failed. If both are \c nil, the request was cancelled. - */ -@interface FBSDKLoginCompletionParameters : NSObject - -- (instancetype)init NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithError:(NSError *)error; - -@property (nonatomic, copy, readonly) NSString *accessTokenString; - -@property (nonatomic, copy, readonly) NSSet *permissions; -@property (nonatomic, copy, readonly) NSSet *declinedPermissions; - -@property (nonatomic, copy, readonly) NSString *appID; -@property (nonatomic, copy, readonly) NSString *userID; - -@property (nonatomic, copy, readonly) NSError *error; - -@property (nonatomic, readonly, getter=isSystemAccount) BOOL systemAccount; -@property (nonatomic, copy, readonly) NSDate *expirationDate; -@property (nonatomic, copy, readonly) NSString *challenge; -@end - -@protocol FBSDKLoginCompleting - -/** - Invoke \p handler with the login parameters derived from the authentication result. - See the implementing class's documentation for whether it completes synchronously or asynchronously. - */ -- (void)completeLogIn:(FBSDKLoginManager *)loginManager withHandler:(void(^)(FBSDKLoginCompletionParameters *parameters))handler; - -@end - -#pragma mark - Completers - -/** - Extracts the log in completion parameters from the \p parameters dictionary, - which must contain the parsed result of the return URL query string. - - The \c user_id key is first used to derive the User ID. If that fails, \c signed_request - is used. - - Completion occurs synchronously. - */ -@interface FBSDKLoginURLCompleter : NSObject - -- (instancetype)initWithURLParameters:(NSDictionary *)parameters appID:(NSString *)appID NS_DESIGNATED_INITIALIZER; - -@end - -/** - Requests the User ID, granted permissions and declined permissions from the server - using the given access token, which must occur before authentication can be completed. - - Completion occurs asynchronously. - */ -@interface FBSDKLoginSystemAccountCompleter : NSObject - -- (instancetype)initWithTokenString:(NSString *)tokenString appID:(NSString *)appID NS_DESIGNATED_INITIALIZER; - -@end - -/** - Converts an Accounts framework error in to an error or cancellation result - - Completion occurs synchronously. - */ -@interface FBSDKLoginSystemAccountErrorCompleter : NSObject - -- (instancetype)initWithError:(NSError *)accountStoreError permissions:(NSSet *)permissions NS_DESIGNATED_INITIALIZER; - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion.m deleted file mode 100644 index a03e21820..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion.m +++ /dev/null @@ -1,326 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginCompletion+Internal.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKLoginConstants.h" -#import "FBSDKLoginError.h" -#import "FBSDKLoginManager+Internal.h" -#import "FBSDKLoginUtility.h" - -static void FBSDKLoginRequestMeAndPermissions(FBSDKLoginCompletionParameters *parameters, void(^completionBlock)(void)) -{ - __block NSUInteger pendingCount = 1; - void(^didCompleteBlock)(void) = ^{ - if (--pendingCount == 0) { - completionBlock(); - } - }; - - NSString *tokenString = parameters.accessTokenString; - FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; - - pendingCount++; - FBSDKGraphRequest *userIDRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me" - parameters:@{ @"fields" : @"id" } - tokenString:tokenString - HTTPMethod:nil - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - - [connection addRequest:userIDRequest completionHandler:^(FBSDKGraphRequestConnection *requestConnection, - id result, - NSError *error) { - parameters.userID = [result objectForKey:@"id"]; - if (error) { - parameters.error = error; - } - didCompleteBlock(); - }]; - - pendingCount++; - FBSDKGraphRequest *permissionsRequest = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions" - parameters:@{@"fields":@""} - tokenString:tokenString - HTTPMethod:nil - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - - [connection addRequest:permissionsRequest completionHandler:^(FBSDKGraphRequestConnection *requestConnection, - id result, - NSError *error) { - NSMutableSet *grantedPermissions = [NSMutableSet set]; - NSMutableSet *declinedPermissions = [NSMutableSet set]; - - [FBSDKInternalUtility extractPermissionsFromResponse:result - grantedPermissions:grantedPermissions - declinedPermissions:declinedPermissions]; - - parameters.permissions = [grantedPermissions copy]; - parameters.declinedPermissions = [declinedPermissions copy]; - if (error) { - parameters.error = error; - } - didCompleteBlock(); - }]; - - [connection start]; - didCompleteBlock(); -} - -@implementation FBSDKLoginCompletionParameters - -- (instancetype)init -{ - return [super init]; -} - -- (instancetype)initWithError:(NSError *)error -{ - if ((self = [self init]) != nil) { - self.error = error; - } - return self; -} - -@end - -#pragma mark - Completers - -@implementation FBSDKLoginURLCompleter -{ - FBSDKLoginCompletionParameters *_parameters; - id _observer - ; BOOL _performExplicitFallback; -} - -- (instancetype)init NS_UNAVAILABLE -{ - assert(0); -} - -- (instancetype)initWithURLParameters:(NSDictionary *)parameters appID:(NSString *)appID -{ - if ((self = [super init]) != nil) { - _parameters = [[FBSDKLoginCompletionParameters alloc] init]; - - _parameters.accessTokenString = parameters[@"access_token"]; - - if (_parameters.accessTokenString.length > 0) { - [self setParametersWithDictionary:parameters appID:appID]; - } else { - _parameters.accessTokenString = nil; - [self setErrorWithDictionary:parameters]; - } - } - return self; -} - -- (void)completeLogIn:(FBSDKLoginManager *)loginManager withHandler:(void(^)(FBSDKLoginCompletionParameters *parameters))handler -{ - if (_performExplicitFallback && loginManager.loginBehavior == FBSDKLoginBehaviorNative) { - // UIKit and iOS don't like an application opening a URL during a URL open callback, so - // we need to wait until *at least* the next turn of the run loop to open the URL to - // perform the browser log in behavior. However we also need to wait for the application - // to become active so FBSDKApplicationDelegate doesn't erroneously call back the URL - // opener before the URL has been opened. - if ([FBSDKApplicationDelegate sharedInstance].isActive) { - // The application is active so there's no need to wait. - [loginManager logInWithBehavior:FBSDKLoginBehaviorBrowser]; - } else { - // use the block version to guarantee there's a strong reference to self - _observer = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^ (NSNotification *notification) { - [self attemptBrowserLogIn:loginManager]; - }]; - } - return; - } - - if (_parameters.accessTokenString && !_parameters.userID) { - void(^handlerCopy)(FBSDKLoginCompletionParameters *) = [handler copy]; - FBSDKLoginRequestMeAndPermissions(_parameters, ^{ - handlerCopy(_parameters); - }); - return; - } - - handler(_parameters); -} - -- (void)setParametersWithDictionary:(NSDictionary *)parameters appID:(NSString *)appID -{ - NSString *grantedPermissionsString = parameters[@"granted_scopes"]; - NSString *declinedPermissionsString = parameters[@"denied_scopes"]; - - NSString *signedRequest = parameters[@"signed_request"]; - NSString *userID = parameters[@"user_id"]; - - // check the string length so that we assign an empty set rather than a set with an empty string - _parameters.permissions = (grantedPermissionsString.length > 0) - ? [NSSet setWithArray:[grantedPermissionsString componentsSeparatedByString:@","]] - : [NSSet set]; - _parameters.declinedPermissions = (declinedPermissionsString.length > 0) - ? [NSSet setWithArray:[declinedPermissionsString componentsSeparatedByString:@","]] - : [NSSet set]; - - _parameters.appID = appID; - - if (userID.length == 0 && signedRequest.length > 0) { - _parameters.userID = [FBSDKLoginUtility userIDFromSignedRequest:signedRequest]; - } else { - _parameters.userID = userID; - } - - NSString *expirationDateString = parameters[@"expires"] ?: parameters[@"expires_at"]; - NSDate *expirationDate = [NSDate distantFuture]; - if (expirationDateString && [expirationDateString doubleValue] > 0) { - expirationDate = [NSDate dateWithTimeIntervalSince1970:[expirationDateString doubleValue]]; - } else if (parameters[@"expires_in"] && [parameters[@"expires_in"] integerValue] > 0) { - expirationDate = [NSDate dateWithTimeIntervalSinceNow:[parameters[@"expires_in"] integerValue]]; - } - _parameters.expirationDate = expirationDate; - - NSError *error = nil; - NSDictionary *state = [FBSDKInternalUtility objectForJSONString:parameters[@"state"] error:&error]; - _parameters.challenge = [FBSDKUtility URLDecode:state[@"challenge"]]; -} - -- (void)setErrorWithDictionary:(NSDictionary *)parameters -{ - NSString *legacyErrorReason = parameters[@"error"]; - - if ([legacyErrorReason isEqualToString:@"service_disabled_use_browser"] || - [legacyErrorReason isEqualToString:@"service_disabled"]) { - _performExplicitFallback = YES; - } - - // if error is nil, then this should be processed as a cancellation unless - // _performExplicitFallback is set to YES and the log in behavior is Native. - _parameters.error = [FBSDKLoginError errorFromReturnURLParameters:parameters]; -} - -- (void)attemptBrowserLogIn:(FBSDKLoginManager *)loginManager { - if (_observer != nil) { - [[NSNotificationCenter defaultCenter] removeObserver:_observer]; - _observer = nil; - } - - if ([FBSDKApplicationDelegate sharedInstance].isActive) { - [loginManager logInWithBehavior:FBSDKLoginBehaviorBrowser]; - } else { - // The application is active but due to notification ordering the FBSDKApplicationDelegate - // doesn't know it yet. Wait one more turn of the run loop. - dispatch_async(dispatch_get_main_queue(), ^{ - [self attemptBrowserLogIn:loginManager]; - }); - } -} - -@end - -@implementation FBSDKLoginSystemAccountCompleter -{ - FBSDKLoginCompletionParameters *_parameters; -} - -- (instancetype)init NS_UNAVAILABLE -{ - assert(0); -} - -- (instancetype)initWithTokenString:(NSString *)tokenString appID:(NSString *)appID -{ - if ((self = [super init]) != nil) { - _parameters = [[FBSDKLoginCompletionParameters alloc] init]; - - _parameters.accessTokenString = tokenString; - _parameters.appID = appID; - - _parameters.systemAccount = YES; - } - return self; -} - -- (void)completeLogIn:(FBSDKLoginManager *)loginManager withHandler:(void(^)(FBSDKLoginCompletionParameters *parameters))handler -{ - void(^handlerCopy)(FBSDKLoginCompletionParameters *) = [handler copy]; - FBSDKLoginRequestMeAndPermissions(_parameters, ^{ - // Transform the FBSDKCoreKit error in to an FBSDKLoginKit error, if necessary. This specializes - // the graph errors in to User Checkpointed, Password Changed or Unconfirmed User. - // - // It's possible the graph error has a value set for NSRecoveryAttempterErrorKey but we don't - // have any login-specific attempter to provide since system auth succeeded and the error is a - // graph API error. - NSError *serverError = _parameters.error; - NSError *error = [FBSDKLoginError errorFromServerError:serverError]; - if (error != nil) { - // In the event the user's password changed the Accounts framework will still return - // an access token but API calls will fail. Clear the access token from the result - // and use the special-case System Password changed error, which has different text - // to display to the user. - if (error.code == FBSDKLoginPasswordChangedErrorCode) { - [FBSDKSystemAccountStoreAdapter sharedInstance].forceBlockingRenew = YES; - - _parameters.accessTokenString = nil; - _parameters.appID = nil; - - error = [FBSDKLoginError errorForSystemPasswordChange:serverError]; - } - - _parameters.error = error; - } - - handlerCopy(_parameters); - }); -} - -@end - -@implementation FBSDKLoginSystemAccountErrorCompleter -{ - FBSDKLoginCompletionParameters *_parameters; -} - -- (instancetype)init NS_UNAVAILABLE -{ - assert(0); -} - -- (instancetype)initWithError:(NSError *)accountStoreError permissions:(NSSet *)permissions -{ - if ((self = [super init]) != nil) { - _parameters = [[FBSDKLoginCompletionParameters alloc] init]; - - NSError *error = [FBSDKLoginError errorForSystemAccountStoreError:accountStoreError]; - if (error != nil) { - _parameters.error = error; - } else { - // The lack of an error indicates the user declined permissions - _parameters.declinedPermissions = permissions; - } - - _parameters.systemAccount = YES; - } - return self; -} - -- (void)completeLogIn:(FBSDKLoginManager *)loginManager withHandler:(void(^)(FBSDKLoginCompletionParameters *parameters))handler -{ - handler(_parameters); -} - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginError.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginError.h deleted file mode 100644 index 34b6647b5..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginError.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@interface FBSDKLoginError : NSObject - -+ (NSString *)errorDomain; - -+ (NSError *)errorForFailedLoginWithCode:(FBSDKLoginErrorCode)code; - -+ (NSError *)errorForSystemAccountStoreError:(NSError *)accountStoreError; -+ (NSError *)errorForSystemPasswordChange:(NSError *)innerError; - -+ (NSError *)errorFromReturnURLParameters:(NSDictionary *)parameters; -+ (NSError *)errorFromServerError:(NSError *)serverError; - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginError.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginError.m deleted file mode 100644 index 856b7f9f8..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginError.m +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginError.h" - -#import "FBSDKCoreKit+Internal.h" - -typedef NS_ENUM(NSUInteger, FBSDKLoginErrorSubcode) -{ - FBSDKLoginUserCheckpointedErrorSubcode = 459, - FBSDKLoginPasswordChangedErrorSubcode = 460, - FBSDKLoginUnconfirmedUserErrorSubcode = 464, -}; - -@implementation FBSDKLoginError - -+ (NSString *)errorDomain -{ - return FBSDKLoginErrorDomain; -} - -+ (NSError *)errorForFailedLoginWithCode:(FBSDKLoginErrorCode)code; -{ - return [self errorForFailedLoginWithCode:code innerError:nil]; -} - -+ (NSError *)errorForFailedLoginWithCode:(FBSDKLoginErrorCode)code - innerError:(NSError *)innerError -{ - NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; - - [FBSDKInternalUtility dictionary:userInfo setObject:innerError forKey:NSUnderlyingErrorKey]; - - NSString *errorDomain = [self errorDomain]; - NSString *localizedDescription = nil; - - switch ((NSInteger)code) { - case FBSDKNetworkErrorCode: - errorDomain = FBSDKErrorDomain; - localizedDescription = - NSLocalizedStringWithDefaultValue(@"LoginError.SystemAccount.Network", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Unable to connect to Facebook. Check your network connection and try again.", - @"The user facing error message when the Accounts framework encounters a network error."); - break; - case FBSDKLoginUserCheckpointedErrorCode: - localizedDescription = - NSLocalizedStringWithDefaultValue(@"LoginError.SystemAccount.UserCheckpointed", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"You cannot log in to apps at this time. Please log in to www.facebook.com and follow the instructions given.", - @"The user facing error message when the Facebook account signed in to the Accounts framework has been checkpointed."); - break; - case FBSDKLoginUnconfirmedUserErrorCode: - localizedDescription = - NSLocalizedStringWithDefaultValue(@"LoginError.SystemAccount.UnconfirmedUser", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Your account is not confirmed. Please log in to www.facebook.com and follow the instructions given.", - @"The user facing error message when the Facebook account signed in to the Accounts framework becomes unconfirmed."); - break; - case FBSDKLoginSystemAccountAppDisabledErrorCode: - localizedDescription = - NSLocalizedStringWithDefaultValue(@"LoginError.SystemAccount.Disabled", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Access has not been granted to the Facebook account. Verify device settings.", - @"The user facing error message when the app slider has been disabled and login fails."); - break; - case FBSDKLoginSystemAccountUnavailableErrorCode: - localizedDescription = - NSLocalizedStringWithDefaultValue(@"LoginError.SystemAccount.Unavailable", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"The Facebook account has not been configured on the device.", - @"The user facing error message when the device Facebook account is unavailable and login fails."); - break; - default: - break; - } - - [FBSDKInternalUtility dictionary:userInfo setObject:localizedDescription forKey:NSLocalizedDescriptionKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:localizedDescription forKey:FBSDKErrorLocalizedDescriptionKey]; - - return [NSError errorWithDomain:errorDomain - code:code - userInfo:userInfo]; -} - -+ (NSError *)errorForSystemAccountStoreError:(NSError *)accountStoreError -{ - NSError *err = nil; - BOOL cancellation = NO; - - if ([accountStoreError.domain isEqualToString:[self errorDomain]] || - [accountStoreError.domain isEqualToString:[FBSDKError errorDomain]]) { - // If the requestAccess call results in a Facebook error, surface it as a top-level - // error. This implies it is not the typical user "disallows" case. - err = accountStoreError; - } else if ([accountStoreError.domain isEqualToString:@"com.apple.accounts"] && accountStoreError.code == 7) { - err = [self errorWithSystemAccountStoreDeniedError:accountStoreError isCancellation:&cancellation]; - } - - if (err == nil && !cancellation) { - // create an error object with additional info regarding failed login - NSInteger errorCode = FBSDKLoginSystemAccountUnavailableErrorCode; - - NSString *errorDomain = accountStoreError.domain; - if ([errorDomain isEqualToString:NSURLErrorDomain] || - [errorDomain isEqualToString:@"kCFErrorDomainCFNetwork"]) { - errorCode = FBSDKNetworkErrorCode; - } - - err = [self errorForFailedLoginWithCode:errorCode - innerError:accountStoreError]; - } - - return err; -} - -+ (NSError *)errorForSystemPasswordChange:(NSError *)innerError -{ - NSString *failureReasonAndDescription = - NSLocalizedStringWithDefaultValue(@"LoginError.SystemAccount.PasswordChange", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Your Facebook password has changed. To confirm your password, open Settings > Facebook and tap your name.", - @"The user facing error message when the device Facebook account password is incorrect and login fails."); - NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: - failureReasonAndDescription, FBSDKErrorLocalizedDescriptionKey, - failureReasonAndDescription, NSLocalizedDescriptionKey, - nil]; - - [FBSDKInternalUtility dictionary:userInfo setObject:innerError forKey:NSUnderlyingErrorKey]; - - return [NSError errorWithDomain:[self errorDomain] - code:FBSDKLoginPasswordChangedErrorCode - userInfo:userInfo]; -} - -+ (NSError *)errorFromReturnURLParameters:(NSDictionary *)parameters -{ - NSError *error = nil; - - NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:userInfo setObject:parameters[@"error_message"] forKey:FBSDKErrorDeveloperMessageKey]; - - if (userInfo.count > 0) { - [FBSDKInternalUtility dictionary:userInfo setObject:parameters[@"error"] forKey:FBSDKErrorDeveloperMessageKey]; - [FBSDKInternalUtility dictionary:userInfo setObject:parameters[@"error_code"] forKey:FBSDKGraphRequestErrorGraphErrorCode]; - - if (!userInfo[FBSDKErrorDeveloperMessageKey]) { - [FBSDKInternalUtility dictionary:userInfo setObject:parameters[@"error_reason"] forKey:FBSDKErrorDeveloperMessageKey]; - } - - userInfo[FBSDKGraphRequestErrorCategoryKey] = @(FBSDKGraphRequestErrorCategoryOther); - - error = [NSError errorWithDomain:FBSDKErrorDomain - code:FBSDKGraphRequestGraphAPIErrorCode - userInfo:userInfo]; - } - - return error; -} - -+ (NSError *)errorFromServerError:(NSError *)serverError -{ - NSError *loginError = nil; - - if ([serverError.domain isEqualToString:FBSDKErrorDomain]) { - NSDictionary *response = [FBSDKTypeUtility dictionaryValue:serverError.userInfo[FBSDKGraphRequestErrorParsedJSONResponseKey]]; - NSDictionary *body = [FBSDKTypeUtility dictionaryValue:response[@"body"]]; - NSDictionary *error = [FBSDKTypeUtility dictionaryValue:body[@"error"]]; - NSInteger subcode = [FBSDKTypeUtility integerValue:error[@"error_subcode"]]; - - switch (subcode) { - case FBSDKLoginUserCheckpointedErrorSubcode: - loginError = [self errorForFailedLoginWithCode:FBSDKLoginUserCheckpointedErrorCode - innerError:serverError]; - break; - case FBSDKLoginPasswordChangedErrorSubcode: - loginError = [self errorForFailedLoginWithCode:FBSDKLoginPasswordChangedErrorCode - innerError:serverError]; - break; - case FBSDKLoginUnconfirmedUserErrorSubcode: - loginError = [self errorForFailedLoginWithCode:FBSDKLoginUnconfirmedUserErrorCode - innerError:serverError]; - break; - } - } - - return loginError; -} - -+ (NSError *)errorWithSystemAccountStoreDeniedError:(NSError *)accountStoreError isCancellation:(BOOL *)cancellation -{ - // The Accounts framework returns an ACErrorPermissionDenied error for both user denied errors, - // Facebook denied errors, and other things. Unfortunately examining the contents of the - // description is the only means available to determine the reason for the error. - NSString *description = accountStoreError.userInfo[NSLocalizedDescriptionKey]; - NSError *err = nil; - - if (description) { - // If a parenthetical error code exists, map it ot a Facebook server error - FBSDKLoginErrorCode errorCode = FBSDKLoginReservedErrorCode; - if ([description rangeOfString:@"(459)"].location != NSNotFound) { - // The Facebook server could not fulfill this access request: Error validating access token: - // You cannot access the app till you log in to www.facebook.com and follow the instructions given. (459) - - // The OAuth endpoint directs people to www.facebook.com when an account has been - // checkpointed. If the web address is present, assume it's due to a checkpoint. - errorCode = FBSDKLoginUserCheckpointedErrorCode; - } else if ([description rangeOfString:@"(452)"].location != NSNotFound || - [description rangeOfString:@"(460)"].location != NSNotFound) { - // The Facebook server could not fulfill this access request: Error validating access token: - // Session does not match current stored session. This may be because the user changed the password since - // the time the session was created or Facebook has changed the session for security reasons. (452)or(460) - - // If the login failed due to the session changing, maybe it's due to the password - // changing. Direct the user to update the password in the Settings > Facebook. - err = [self errorForSystemPasswordChange:accountStoreError]; - } else if ([description rangeOfString:@"(464)"].location != NSNotFound) { - // The Facebook server could not fulfill this access request: Error validating access token: - // Sessions for the user are not allowed because the user is not a confirmed user. (464) - errorCode = FBSDKLoginUnconfirmedUserErrorCode; - } - - if (errorCode != FBSDKLoginReservedErrorCode) { - err = [self errorForFailedLoginWithCode:errorCode]; - } - } else { - // If there is no description, assume this is a user cancellation. No error object is - // returned for a cancellation. - if (cancellation != NULL) { - *cancellation = YES; - } - } - - return err; -} - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginKit+Internal.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginKit+Internal.h deleted file mode 100644 index 74b65971e..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginKit+Internal.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKLoginCompletion+Internal.h" -#import "FBSDKLoginError.h" -#import "FBSDKLoginManager+Internal.h" -#import "FBSDKLoginUtility.h" diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManager+Internal.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManager+Internal.h deleted file mode 100644 index 7608b40e0..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManager+Internal.h +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKCoreKit+Internal.h" - -@class FBSDKAccessToken; -@class FBSDKLoginCompletionParameters; - -@interface FBSDKLoginManagerSystemAccountState : NSObject -@property (nonatomic) BOOL didShowDialog; -@property (nonatomic, getter=isReauthorize) BOOL reauthorize; -@property (nonatomic, getter=isUnTOSedDevice) BOOL unTOSedDevice; -@end - -@interface FBSDKLoginManager () -@property (nonatomic, weak) UIViewController *fromViewController; -@property (nonatomic, readonly) NSSet *requestedPermissions; - -- (void)completeAuthentication:(FBSDKLoginCompletionParameters *)parameters expectChallenge:(BOOL)expectChallenge; - -// available to internal types to trigger login without checking read/publish mixtures. -- (void)logInWithPermissions:(NSSet *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler; -- (void)logInWithBehavior:(FBSDKLoginBehavior)loginBehavior; - -// made available for testing only -- (NSDictionary *)logInParametersWithPermissions:(NSSet *)permissions serverConfiguration:(FBSDKServerConfiguration *)serverConfiguration; -// made available for testing only -- (void)validateReauthentication:(FBSDKAccessToken *)currentToken withResult:(FBSDKLoginManagerLoginResult *)loginResult; - -// for testing only -- (void)setHandler:(FBSDKLoginManagerRequestTokenHandler)handler; -// for testing only -- (void)setRequestedPermissions:(NSSet *)requestedPermissions; -// for testing only -- (NSString *)loadExpectedChallenge; -@end - -// the category is made available for testing only -@interface FBSDKLoginManager (Native) - -- (void)performNativeLogInWithParameters:(NSDictionary *)loginParams handler:(void(^)(BOOL, NSError*))handler; -- (void)performBrowserLogInWithParameters:(NSDictionary *)loginParams handler:(void(^)(BOOL, NSString *,NSError*))handler; - -@end - -// the category is made available for testing only -@interface FBSDKLoginManager (Accounts) - -- (void)beginSystemLogIn; -- (void)performSystemLogIn; -- (void)continueSystemLogInWithTokenString:(NSString *)oauthToken error:(NSError *)accountStoreError state:(FBSDKLoginManagerSystemAccountState *)state; - -- (void)fallbackToNativeBehavior; - -@end - -// the category is made available for testing only -@interface FBSDKLoginManager (WebDialog) - -- (void)performWebLogInWithParameters:(NSDictionary *)loginParams handler:(void(^)(BOOL, NSError*))handler; - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLogger.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLogger.h deleted file mode 100644 index b07ac0e4a..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLogger.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginManager+Internal.h" - -extern NSString *const FBSDKLoginManagerLoggerAuthMethod_Native; -extern NSString *const FBSDKLoginManagerLoggerAuthMethod_Browser; -extern NSString *const FBSDKLoginManagerLoggerAuthMethod_System; -extern NSString *const FBSDKLoginManagerLoggerAuthMethod_Webview; -extern NSString *const FBSDKLoginManagerLoggerAuthMethod_SFVC; - - -@interface FBSDKLoginManagerLogger : NSObject -+ (FBSDKLoginManagerLogger *)loggerFromParameters:(NSDictionary *)parameters; - -- (instancetype)init NS_UNAVAILABLE; -- (instancetype)new NS_UNAVAILABLE; - -- (instancetype)initWithLoggingToken:(NSString *)loggingToken; - -// this must not retain loginManager - only used to conveniently grab various properties to log. -- (void)startSessionForLoginManager:(FBSDKLoginManager *)loginManager; -- (void)endSession; - -- (void)startAuthMethod:(NSString *)authMethod; -- (void)endLoginWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error; - -- (NSDictionary *)parametersWithTimeStampAndClientState:(NSDictionary *)loginParams forAuthMethod:(NSString *)authMethod; -- (void)willAttemptAppSwitchingBehavior; -- (void)systemAuthDidShowDialog:(BOOL)didShowDialog isUnTOSedDevice:(BOOL)isUnTOSedDevice; - -- (void)logNativeAppDialogResult:(BOOL)result dialogDuration:(NSTimeInterval)dialogDuration; -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLogger.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLogger.m deleted file mode 100644 index bb053543f..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLogger.m +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginManagerLogger.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKLoginError.h" -#import "FBSDKLoginManagerLoginResult+Internal.h" -#import "FBSDKLoginUtility.h" - -NSString *const FBSDKLoginManagerLoggerAuthMethod_Native = @"fb_application_web_auth"; -NSString *const FBSDKLoginManagerLoggerAuthMethod_Browser = @"browser_auth"; -NSString *const FBSDKLoginManagerLoggerAuthMethod_System = @"integrated_auth"; -NSString *const FBSDKLoginManagerLoggerAuthMethod_Webview = @"fallback_auth"; -NSString *const FBSDKLoginManagerLoggerAuthMethod_SFVC = @"sfvc_auth"; - -static NSString *const FBSDKLoginManagerLoggingClientStateKey = @"state"; -static NSString *const FBSDKLoginManagerLoggingClientStateIsClientState = @"com.facebook.sdk_client_state"; - -static NSString *const FBSDKLoginManagerLoggerParamIdentifierKey = @"0_auth_logger_id"; -static NSString *const FBSDKLoginManagerLoggerParamTimestampKey = @"1_timestamp_ms"; -static NSString *const FBSDKLoginManagerLoggerParamResultKey = @"2_result"; -static NSString *const FBSDKLoginManagerLoggerParamAuthMethodKey = @"3_method"; -static NSString *const FBSDKLoginManagerLoggerParamErrorCodeKey = @"4_error_code"; -static NSString *const FBSDKLoginManagerLoggerParamErrorMessageKey = @"5_error_message"; -static NSString *const FBSDKLoginManagerLoggerParamExtrasKey = @"6_extras"; -static NSString *const FBSDKLoginManagerLoggerParamLoggingTokenKey = @"7_logging_token"; - -static NSString *const FBSDKLoginManagerLoggerValueEmpty = @""; - -static NSString *const FBSDKLoginManagerLoggerResultSuccessString = @"success"; -static NSString *const FBSDKLoginManagerLoggerResultCancelString = @"cancelled"; -static NSString *const FBSDKLoginManagerLoggerResultErrorString = @"error"; -static NSString *const FBSDKLoginManagerLoggerResultSkippedString = @"skipped"; - -static NSString *const FBSDKLoginManagerLoggerTryNative = @"tryFBAppAuth"; -static NSString *const FBSDKLoginManagerLoggerTryBrowser = @"trySafariAuth"; -static NSString *const FBSDKLoginManagerLoggerTrySystemAccount = @"tryIntegratedAuth"; -static NSString *const FBSDKLoginManagerLoggerTryWebView = @"tryFallback"; - -@implementation FBSDKLoginManagerLogger -{ -@private - NSString *_identifier; - NSMutableDictionary *_extras; - - NSString *_lastResult; - NSError *_lastError; - - NSString *_authMethod; - NSString *_loggingToken; -} - -+ (FBSDKLoginManagerLogger *)loggerFromParameters:(NSDictionary *)parameters -{ - NSDictionary *clientState = [FBSDKInternalUtility objectForJSONString:parameters[FBSDKLoginManagerLoggingClientStateKey] error:NULL]; - - id isClientState = clientState[FBSDKLoginManagerLoggingClientStateIsClientState]; - if ([isClientState isKindOfClass:[NSNumber class]] && [isClientState boolValue]) { - FBSDKLoginManagerLogger *logger = [[self alloc] initWithLoggingToken:nil]; - if (logger != nil) { - logger->_identifier = clientState[FBSDKLoginManagerLoggerParamIdentifierKey]; - logger->_authMethod = clientState[FBSDKLoginManagerLoggerParamAuthMethodKey]; - logger->_loggingToken = clientState[FBSDKLoginManagerLoggerParamLoggingTokenKey]; - return logger; - } - } - return nil; -} - -- (instancetype)initWithLoggingToken:(NSString *)loggingToken -{ - if ((self = [super init]) != nil) { - _identifier = [[NSUUID UUID] UUIDString]; - _extras = [NSMutableDictionary dictionary]; - _loggingToken = [loggingToken copy]; - } - return self; -} - -- (void)startSessionForLoginManager:(FBSDKLoginManager *)loginManager -{ - BOOL isReauthorize = ([FBSDKAccessToken currentAccessToken] != nil); - BOOL willTryNative = NO; - BOOL willTryBrowser = NO; - BOOL willTrySystemAccount = NO; - BOOL willTryWebView = NO; - NSString *behaviorString = nil; - - switch (loginManager.loginBehavior) { - case FBSDKLoginBehaviorNative: - willTryNative = YES; - willTryBrowser = YES; - behaviorString = @"FBSDKLoginBehaviorNative"; - break; - case FBSDKLoginBehaviorBrowser: - willTryBrowser = YES; - behaviorString = @"FBSDKLoginBehaviorBrowser"; - break; - case FBSDKLoginBehaviorSystemAccount: - willTryNative = YES; - willTryBrowser = YES; - willTrySystemAccount = YES; - behaviorString = @"FBSDKLoginBehaviorSystemAccount"; - break; - case FBSDKLoginBehaviorWeb: - willTryWebView = YES; - behaviorString = @"FBSDKLoginBehaviorWeb"; - break; - } - - [_extras addEntriesFromDictionary:@{ - FBSDKLoginManagerLoggerTryNative : @(willTryNative), - FBSDKLoginManagerLoggerTryBrowser : @(willTryBrowser), - FBSDKLoginManagerLoggerTrySystemAccount : @(willTrySystemAccount), - FBSDKLoginManagerLoggerTryWebView : @(willTryWebView), - @"isReauthorize" : @(isReauthorize), - @"login_behavior" : behaviorString, - @"default_audience" : [FBSDKLoginUtility stringForAudience:loginManager.defaultAudience], - @"permissions" : [[loginManager.requestedPermissions allObjects] componentsJoinedByString:@","] ?: @"" - }]; - - [self logEvent:FBSDKAppEventNameFBSessionAuthStart params:[self _parametersForNewEvent]]; -} - -- (void)endSession -{ - [self logEvent:FBSDKAppEventNameFBSessionAuthEnd result:_lastResult error:_lastError]; -} - -- (void)startAuthMethod:(NSString *)authMethod -{ - _authMethod = [authMethod copy]; - [self logEvent:FBSDKAppEventNameFBSessionAuthMethodStart params:[self _parametersForNewEvent]]; -} - -- (void)endLoginWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error -{ - NSString *resultString = @""; - - if (error != nil) { - resultString = FBSDKLoginManagerLoggerResultErrorString; - } else if (result.isCancelled) { - resultString = FBSDKLoginManagerLoggerResultCancelString; - } else if (result.isSkipped) { - resultString = FBSDKLoginManagerLoggerResultSkippedString; - } else if (result.token) { - resultString = FBSDKLoginManagerLoggerResultSuccessString; - if (result.declinedPermissions.count) { - _extras[@"declined_permissions"] = [[result.declinedPermissions allObjects] componentsJoinedByString:@","]; - } - } - - _lastResult = resultString; - _lastError = error; - [_extras addEntriesFromDictionary:result.loggingExtras]; - - [self logEvent:FBSDKAppEventNameFBSessionAuthMethodEnd result:resultString error:error]; -} - -- (NSDictionary *)parametersWithTimeStampAndClientState:(NSDictionary *)loginParams forAuthMethod:(NSString *)authMethod -{ - NSMutableDictionary *params = [loginParams mutableCopy]; - - NSTimeInterval timeValue = (NSTimeInterval)FBSDKMonotonicTimeGetCurrentSeconds(); - NSString *e2eTimestampString = [FBSDKInternalUtility JSONStringForObject:@{ @"init" : @(timeValue) } - error:NULL - invalidObjectHandler:NULL]; - params[@"e2e"] = e2eTimestampString; - - NSDictionary *existingState = [FBSDKInternalUtility objectForJSONString:params[FBSDKLoginManagerLoggingClientStateKey] error:NULL]; - params[FBSDKLoginManagerLoggingClientStateKey] = [self clientStateForAuthMethod:authMethod andExistingState:existingState]; - - return params; -} - -- (void)willAttemptAppSwitchingBehavior -{ - NSString *defaultUrlScheme = [NSString stringWithFormat:@"fb%@%@", [FBSDKSettings appID], [FBSDKSettings appURLSchemeSuffix] ?: @""]; - BOOL isURLSchemeRegistered = [FBSDKInternalUtility isRegisteredURLScheme:defaultUrlScheme]; - - BOOL isFacebookAppCanOpenURLSchemeRegistered = [FBSDKInternalUtility isRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_FACEBOOK]; - BOOL isMessengerAppCanOpenURLSchemeRegistered = [FBSDKInternalUtility isRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_MESSENGER]; - - [_extras addEntriesFromDictionary:@{ - @"isURLSchemeRegistered" : @(isURLSchemeRegistered), - @"isFacebookAppCanOpenURLSchemeRegistered" : @(isFacebookAppCanOpenURLSchemeRegistered), - @"isMessengerAppCanOpenURLSchemeRegistered" : @(isMessengerAppCanOpenURLSchemeRegistered), - }]; -} - -- (void)systemAuthDidShowDialog:(BOOL)didShowDialog isUnTOSedDevice:(BOOL)isUnTOSedDevice -{ - [_extras addEntriesFromDictionary:@{ - @"isUntosedDevice" : @(isUnTOSedDevice), - @"dialogShown" : @(didShowDialog), - }]; -} - -- (void)logNativeAppDialogResult:(BOOL)result dialogDuration:(NSTimeInterval)dialogDuration -{ - NSOperatingSystemVersion iOS10Version = { .majorVersion = 10, .minorVersion = 0, .patchVersion = 0 }; - if ([FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS10Version]) { - _extras[@"native_app_login_dialog_duration"] = @(dialogDuration); - _extras[@"native_app_login_dialog_result"] = @(result); - [self logEvent:FBSDKAppEventNameFBSessionFASLoginDialogResult params:[self _parametersForNewEvent]]; - } -} - -#pragma mark - Private - -- (NSString *)clientStateForAuthMethod:(NSString *)authMethod andExistingState:(NSDictionary *)existingState -{ - NSDictionary *clientState = @{ - FBSDKLoginManagerLoggerParamAuthMethodKey: authMethod ?: @"", - FBSDKLoginManagerLoggerParamIdentifierKey: _identifier, - FBSDKLoginManagerLoggingClientStateIsClientState: @YES, - }; - - if (existingState) { - NSMutableDictionary *mutableState = [clientState mutableCopy]; - [mutableState addEntriesFromDictionary:existingState]; - clientState = mutableState; - } - - return [FBSDKInternalUtility JSONStringForObject:clientState error:NULL invalidObjectHandler:NULL]; -} - -- (NSMutableDictionary *)_parametersForNewEvent -{ - NSMutableDictionary *eventParameters = [[NSMutableDictionary alloc] init]; - - // NOTE: We ALWAYS add all params to each event, to ensure predictable mapping on the backend. - eventParameters[FBSDKLoginManagerLoggerParamIdentifierKey] = _identifier ?: FBSDKLoginManagerLoggerValueEmpty; - eventParameters[FBSDKLoginManagerLoggerParamTimestampKey] = [NSNumber numberWithDouble:round(1000 * [[NSDate date] timeIntervalSince1970])]; - eventParameters[FBSDKLoginManagerLoggerParamResultKey] = FBSDKLoginManagerLoggerValueEmpty; - [FBSDKInternalUtility dictionary:eventParameters setObject:_authMethod forKey:FBSDKLoginManagerLoggerParamAuthMethodKey]; - eventParameters[FBSDKLoginManagerLoggerParamErrorCodeKey] = FBSDKLoginManagerLoggerValueEmpty; - eventParameters[FBSDKLoginManagerLoggerParamErrorMessageKey] = FBSDKLoginManagerLoggerValueEmpty; - eventParameters[FBSDKLoginManagerLoggerParamExtrasKey] = FBSDKLoginManagerLoggerValueEmpty; - eventParameters[FBSDKLoginManagerLoggerParamLoggingTokenKey] = _loggingToken ?: FBSDKLoginManagerLoggerValueEmpty; - - return eventParameters; -} - -- (void)logEvent:(NSString *)eventName params:(NSMutableDictionary *)params -{ - if (_identifier) { - NSString *extrasJSONString = [FBSDKInternalUtility JSONStringForObject:_extras - error:NULL - invalidObjectHandler:NULL]; - if (extrasJSONString) { - params[FBSDKLoginManagerLoggerParamExtrasKey] = extrasJSONString; - } - [_extras removeAllObjects]; - - [FBSDKAppEvents logImplicitEvent:eventName valueToSum:nil parameters:params accessToken:nil]; - } -} - -- (void)logEvent:(NSString *)eventName result:(NSString *)result error:(NSError *)error -{ - NSMutableDictionary *params = [self _parametersForNewEvent]; - - params[FBSDKLoginManagerLoggerParamResultKey] = result; - - if ([error.domain isEqualToString:FBSDKErrorDomain] || [error.domain isEqualToString:FBSDKLoginErrorDomain]) { - // tease apart the structure. - - // first see if there is an explicit message in the error's userInfo. If not, default to the reason, - // which is less useful. - NSString *value = error.userInfo[@"error_message"] ?: error.userInfo[FBSDKErrorLocalizedDescriptionKey]; - [FBSDKInternalUtility dictionary:params setObject:value forKey:FBSDKLoginManagerLoggerParamErrorMessageKey]; - - value = error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] ?: [NSString stringWithFormat:@"%ld", (long)error.code]; - [FBSDKInternalUtility dictionary:params setObject:value forKey:FBSDKLoginManagerLoggerParamErrorCodeKey]; - - NSError *innerError = error.userInfo[NSUnderlyingErrorKey]; - if (innerError != nil) { - value = innerError.userInfo[@"error_message"] ?: innerError.userInfo[NSLocalizedDescriptionKey]; - [FBSDKInternalUtility dictionary:_extras setObject:value forKey:@"inner_error_message"]; - - value = innerError.userInfo[FBSDKGraphRequestErrorGraphErrorCode] ?: [NSString stringWithFormat:@"%ld", (long)innerError.code]; - [FBSDKInternalUtility dictionary:_extras setObject:value forKey:@"inner_error_code"]; - } - } else if (error) { - params[FBSDKLoginManagerLoggerParamErrorCodeKey] = @(error.code); - params[FBSDKLoginManagerLoggerParamErrorMessageKey] = error.localizedDescription; - } - - [self logEvent:eventName params:params]; -} - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLoginResult+Internal.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLoginResult+Internal.h deleted file mode 100644 index 3191aa99e..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLoginResult+Internal.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@interface FBSDKLoginManagerLoginResult() - -@property (nonatomic, readonly) NSDictionary *loggingExtras; - -// legacy flag indicating this is an intermediary result only for logging purposes. -@property (nonatomic) BOOL isSkipped; - -// adds additional logging entry to extras - only sent as part of `endLoginWithResult:` --(void)addLoggingExtra:(id)object forKey:(id)key; -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginUtility.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginUtility.h deleted file mode 100644 index 9cc7e2bb1..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginUtility.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@interface FBSDKLoginUtility : NSObject - -+ (NSString *)stringForAudience:(FBSDKDefaultAudience)audience; -+ (NSDictionary *)queryParamsFromLoginURL:(NSURL *)url; - -+ (NSString *)userIDFromSignedRequest:(NSString *)signedRequest; - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginUtility.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginUtility.m deleted file mode 100644 index 91908abf3..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginUtility.m +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLoginUtility.h" - -#import -#import - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKLoginConstants.h" - -@implementation FBSDKLoginUtility - -+ (NSString *)stringForAudience:(FBSDKDefaultAudience)audience -{ - switch (audience) { - case FBSDKDefaultAudienceOnlyMe: - return @"only_me"; - case FBSDKDefaultAudienceFriends: - return @"friends"; - case FBSDKDefaultAudienceEveryone: - return @"everyone"; - } -} - -+ (NSDictionary *)queryParamsFromLoginURL:(NSURL *)url -{ - NSString *expectedUrlPrefix = [FBSDKInternalUtility appURLWithHost:@"authorize" path:nil queryParameters:nil error:NULL].absoluteString; - if (![[url absoluteString] hasPrefix:expectedUrlPrefix]) { - // Don't have an App ID, just verify path. - NSString *host = url.host; - if (![host isEqualToString:@"authorize"]) { - return nil; - } - } - NSMutableDictionary *params = [NSMutableDictionary dictionaryWithDictionary:[FBSDKInternalUtility dictionaryFromFBURL:url]]; - - NSString *userID = [[self class] userIDFromSignedRequest:params[@"signed_request"]]; - if (userID) { - params[@"user_id"] = userID; - } - - return params; -} - -+ (NSString *)userIDFromSignedRequest:(NSString *)signedRequest -{ - if (!signedRequest) { - return nil; - } - - NSArray *signatureAndPayload = [signedRequest componentsSeparatedByString:@"."]; - NSString *userID = nil; - - if (signatureAndPayload.count == 2) { - NSData *data = [FBSDKBase64 decodeAsData:signatureAndPayload[1]]; - if (data) { - NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; - userID = dictionary[@"user_id"]; - } - } - return userID; -} - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/_FBSDKLoginRecoveryAttempter.h b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/_FBSDKLoginRecoveryAttempter.h deleted file mode 100644 index b9791388f..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/_FBSDKLoginRecoveryAttempter.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKCoreKit+Internal.h" - -@interface _FBSDKLoginRecoveryAttempter : FBSDKErrorRecoveryAttempter - -@end diff --git a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/_FBSDKLoginRecoveryAttempter.m b/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/_FBSDKLoginRecoveryAttempter.m deleted file mode 100644 index 3152cef26..000000000 --- a/Pods/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/_FBSDKLoginRecoveryAttempter.m +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "_FBSDKLoginRecoveryAttempter.h" - -#import "FBSDKLoginKit+Internal.h" - -@implementation _FBSDKLoginRecoveryAttempter - -- (void)attemptRecoveryFromError:(NSError *)error - optionIndex:(NSUInteger)recoveryOptionIndex - delegate:(id)delegate - didRecoverSelector:(SEL)didRecoverSelector - contextInfo:(void *)contextInfo { - - void(^handler)(BOOL) = ^(BOOL didRecover) { - [super completeRecovery:didRecover delegate:delegate didRecoverSelector:didRecoverSelector contextInfo:contextInfo]; - }; - NSSet *currentPermissions = [FBSDKAccessToken currentAccessToken].permissions; - if (recoveryOptionIndex == 0 && currentPermissions.count > 0) { - FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; - [login logInWithPermissions:currentPermissions handler:^(FBSDKLoginManagerLoginResult *result, NSError *loginError) { - // we can only consider a recovery successful if there are no declines - // (note this could still set an updated currentAccessToken). - handler(!loginError && !result.isCancelled && result.declinedPermissions.count == 0); - }]; - } else { - handler(NO); - } -} - -@end diff --git a/Pods/FBSDKLoginKit/LICENSE b/Pods/FBSDKLoginKit/LICENSE deleted file mode 100644 index bdb9fc54b..000000000 --- a/Pods/FBSDKLoginKit/LICENSE +++ /dev/null @@ -1,17 +0,0 @@ -Copyright (c) 2014-present, Facebook, Inc. All rights reserved. - -You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -copy, modify, and distribute this software in source code or binary form for use -in connection with the web services and APIs provided by Facebook. - -As with any software that integrates with the Facebook platform, your use of -this software is subject to the Facebook Developer Principles and Policies -[http://developers.facebook.com/policy/]. This copyright notice shall be -included in all copies or substantial portions of the software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/FBSDKLoginKit/README.mdown b/Pods/FBSDKLoginKit/README.mdown deleted file mode 100644 index 4e6580c19..000000000 --- a/Pods/FBSDKLoginKit/README.mdown +++ /dev/null @@ -1,46 +0,0 @@ -Facebook SDK for iOS -==================== - -This open-source library allows you to integrate Facebook into your iOS app. - -Learn more about the provided samples, documentation, integrating the SDK into your app, accessing source code, and more at https://developers.facebook.com/docs/ios - -NOTE: By default, the Facebook SDK for iOS is installed in ~/Documents/FacebookSDK - -TRY IT OUT ----------- -1. Download the SDK at https://developers.facebook.com/docs/ios or via CocoaPods by adding the 'FBSDKCoreKit', 'FBSDKLoginKit', and 'FBSDKShareKit' pods. -2. Test your install: build and run the project at ~/Documents/FacebookSDK/Samples/Scrumptious/Scrumptious.xcodeproj -3. Check-out the tutorials available online at: https://developers.facebook.com/docs/ios/getting-started -4. Start coding! Visit https://developers.facebook.com/docs/ios for tutorials and reference documentation. - -FEATURES --------- -* Login - https://developers.facebook.com/docs/facebook-login -* Sharing - https://developers.facebook.com/docs/sharing -* App Links - https://developers.facebook.com/docs/applinks -* Graph API - https://developers.facebook.com/docs/ios/graph -* Analytics - https://developers.facebook.com/docs/analytics - -GIVE FEEDBACK -------------- -Please report bugs or issues to https://developers.facebook.com/bugs/ - -You can also join the Facebook Developers Group on Facebook (https://www.facebook.com/groups/fbdevelopers/) or ask questions on Stack Overflow (http://facebook.stackoverflow.com) - -LICENSE -------- -See the LICENSE file. - -DEVELOPER TERMS ---------------- - -- By enabling Facebook integrations, including through this SDK, you can share information with Facebook, including information about people’s use of your app. Facebook will use information received in accordance with our Data Use Policy [https://www.facebook.com/about/privacy/], including to provide you with insights about the effectiveness of your ads and the use of your app. These integrations also enable us and our partners to serve ads on and off Facebook. - -- You may limit your sharing of information with us by updating the Insights control in the developer tool [https://developers.facebook.com/apps/{app_id}/settings/advanced]. - -- If you use a Facebook integration, including to share information with us, you agree and confirm that you have provided appropriate and sufficiently prominent notice to and obtained the appropriate consent from your users regarding such collection, use, and disclosure (including, at a minimum, through your privacy policy). You further agree that you will not share information with us about children under the age of 13. - -- You agree to comply with all applicable laws and regulations and also agree to our Terms , including our Platform Policies .and Advertising Guidelines, as applicable . - -By using the Facebook SDK for iOS you agree to these terms. diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h deleted file mode 100644 index 460ac2887..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@protocol FBSDKAppGroupAddDialogDelegate; - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -__attribute__ ((deprecated)) -@interface FBSDKAppGroupAddDialog : NSObject - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -+ (instancetype)showWithContent:(FBSDKAppGroupContent *)content - delegate:(id)delegate __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -@property (nonatomic, weak) id delegate __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -@property (nonatomic, copy) FBSDKAppGroupContent *content __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (BOOL)canShow __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (BOOL)show __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef __attribute__ ((deprecated)); - -@end - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -__attribute__ ((deprecated)) -@protocol FBSDKAppGroupAddDialogDelegate - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (void)appGroupAddDialog:(FBSDKAppGroupAddDialog *)appGroupAddDialog didCompleteWithResults:(NSDictionary *)results __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (void)appGroupAddDialog:(FBSDKAppGroupAddDialog *)appGroupAddDialog didFailWithError:(NSError *)error __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (void)appGroupAddDialogDidCancel:(FBSDKAppGroupAddDialog *)appGroupAddDialog __attribute__ ((deprecated)); - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.m deleted file mode 100644 index 805ccefef..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.m +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppGroupAddDialog.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareConstants.h" -#import "FBSDKShareError.h" -#import "FBSDKShareUtility.h" - -@interface FBSDKAppGroupAddDialog () -@end - -@implementation FBSDKAppGroupAddDialog -{ - FBSDKWebDialog *_webDialog; -} - -#define FBSDK_APP_GROUP_CREATE_METHOD_NAME @"game_group_create" - -#pragma mark - Class Methods - -+ (instancetype)showWithContent:(FBSDKAppGroupContent *)content - delegate:(id)delegate -{ - FBSDKAppGroupAddDialog *dialog = [[self alloc] init]; - dialog.content = content; - dialog.delegate = delegate; - [dialog show]; - return dialog; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - if ((self = [super init])) { - _webDialog = [[FBSDKWebDialog alloc] init]; - _webDialog.delegate = self; - _webDialog.name = FBSDK_APP_GROUP_CREATE_METHOD_NAME; - } - return self; -} - -- (void)dealloc -{ - _webDialog.delegate = nil; -} - -#pragma mark - Public Methods - -- (BOOL)canShow -{ - return YES; -} - -- (BOOL)show -{ - NSError *error; - if (![self canShow]) { - error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode - message:@"App group create dialog is not available."]; - [_delegate appGroupAddDialog:self didFailWithError:error]; - return NO; - } - if (![self validateWithError:&error]) { - [_delegate appGroupAddDialog:self didFailWithError:error]; - return NO; - } - - FBSDKAppGroupContent *content = self.content; - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:parameters setObject:content.name forKey:@"name"]; - [FBSDKInternalUtility dictionary:parameters setObject:content.groupDescription forKey:@"description"]; - [FBSDKInternalUtility dictionary:parameters - setObject:NSStringFromFBSDKAppGroupPrivacy(content.privacy) - forKey:@"privacy"]; - - _webDialog.parameters = parameters; - [_webDialog show]; - [FBSDKInternalUtility registerTransientObject:self]; - return YES; -} - -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef -{ - FBSDKAppGroupContent *content = self.content; - if (!content) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"content" message:nil]; - } - return NO; - } - if (![content.name length]) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"name" message:nil]; - } - return NO; - } - if (![content.groupDescription length]) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"groupDescription" message:nil]; - } - return NO; - } - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; -} - -#pragma mark - FBSDKWebDialogDelegate - -- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results -{ - if (_webDialog != webDialog) { - return; - } - NSError *error = [FBSDKShareError errorWithCode:[FBSDKTypeUtility unsignedIntegerValue:results[@"error_code"]] - message:[FBSDKTypeUtility stringValue:results[@"error_message"]]]; - [self _handleCompletionWithDialogResults:results error:error]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error -{ - if (_webDialog != webDialog) { - return; - } - [self _handleCompletionWithDialogResults:nil error:error]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog -{ - if (_webDialog != webDialog) { - return; - } - [_delegate appGroupAddDialogDidCancel:self]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -#pragma mark - Helper Methods - -- (void)_handleCompletionWithDialogResults:(NSDictionary *)results error:(NSError *)error -{ - if (!_delegate) { - return; - } - switch (error.code) { - case 0:{ - [_delegate appGroupAddDialog:self didCompleteWithResults:results]; - break; - } - case 4201:{ - [_delegate appGroupAddDialogDidCancel:self]; - break; - } - default:{ - [_delegate appGroupAddDialog:self didFailWithError:error]; - break; - } - } - if (error) { - return; - } else { - } -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h deleted file mode 100644 index e5722ef56..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import - -/** - NS_ENUM(NSUInteger, FBSDKAppGroupPrivacy) - Specifies the privacy of a group. - */ -typedef NS_ENUM(NSUInteger, FBSDKAppGroupPrivacy) -{ - /** Anyone can see the group, who's in it and what members post. */ - FBSDKAppGroupPrivacyOpen = 0, - /** Anyone can see the group and who's in it, but only members can see posts. */ - FBSDKAppGroupPrivacyClosed, -}; - -/** - Converts an FBSDKAppGroupPrivacy to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKAppGroupPrivacy(FBSDKAppGroupPrivacy privacy); - -/** - A model for creating an app group. - */ -@interface FBSDKAppGroupContent : NSObject - -/** - The description of the group. - */ -@property (nonatomic, copy) NSString *groupDescription; - -/** - The name of the group. - */ -@property (nonatomic, copy) NSString *name; - -/** - The privacy for the group. - */ -@property (nonatomic, assign) FBSDKAppGroupPrivacy privacy; - -/** - Compares the receiver to another app group content. - - Parameter content: The other content - - Returns: YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToAppGroupContent:(FBSDKAppGroupContent *)content; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.m deleted file mode 100644 index d3f429fd7..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.m +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppGroupContent.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareUtility.h" - -#define FBSDK_APP_GROUP_CONTENT_GROUP_DESCRIPTION_KEY @"groupDescription" -#define FBSDK_APP_GROUP_CONTENT_NAME_KEY @"name" -#define FBSDK_APP_GROUP_CONTENT_PRIVACY_KEY @"privacy" - -NSString *NSStringFromFBSDKAppGroupPrivacy(FBSDKAppGroupPrivacy privacy) -{ - switch (privacy) { - case FBSDKAppGroupPrivacyClosed:{ - return @"closed"; - } - case FBSDKAppGroupPrivacyOpen:{ - return @"open"; - } - } -} - -@implementation FBSDKAppGroupContent - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [_groupDescription hash], - [_name hash], - _privacy, - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKAppGroupContent class]]) { - return NO; - } - return [self isEqualToAppGroupContent:(FBSDKAppGroupContent *)object]; -} - -- (BOOL)isEqualToAppGroupContent:(FBSDKAppGroupContent *)content -{ - return (content && - (_privacy == content.privacy) && - [FBSDKInternalUtility object:_name isEqualToObject:content.name] && - [FBSDKInternalUtility object:_groupDescription isEqualToObject:content.groupDescription]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _groupDescription = [decoder decodeObjectOfClass:[NSString class] - forKey:FBSDK_APP_GROUP_CONTENT_GROUP_DESCRIPTION_KEY]; - _name = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APP_GROUP_CONTENT_PRIVACY_KEY]; - _privacy = [decoder decodeIntegerForKey:FBSDK_APP_GROUP_CONTENT_PRIVACY_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_groupDescription forKey:FBSDK_APP_GROUP_CONTENT_GROUP_DESCRIPTION_KEY]; - [encoder encodeObject:_name forKey:FBSDK_APP_GROUP_CONTENT_NAME_KEY]; - [encoder encodeInteger:_privacy forKey:FBSDK_APP_GROUP_CONTENT_PRIVACY_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKAppGroupContent *copy = [[FBSDKAppGroupContent alloc] init]; - copy->_groupDescription = [_groupDescription copy]; - copy->_name = [_name copy]; - copy->_privacy = _privacy; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h deleted file mode 100644 index 371e5cc6f..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@protocol FBSDKAppGroupJoinDialogDelegate; - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -__attribute__ ((deprecated)) -@interface FBSDKAppGroupJoinDialog : NSObject - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -+ (instancetype)showWithGroupID:(NSString *)groupID - delegate:(id)delegate __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. */ -@property (nonatomic, weak) id delegate __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. */ -@property (nonatomic, copy) NSString *groupID __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (BOOL)canShow __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (BOOL)show __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef __attribute__ ((deprecated)); - -@end - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -__attribute__ ((deprecated)) -@protocol FBSDKAppGroupJoinDialogDelegate - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (void)appGroupJoinDialog:(FBSDKAppGroupJoinDialog *)appGroupJoinDialog didCompleteWithResults:(NSDictionary *)results __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (void)appGroupJoinDialog:(FBSDKAppGroupJoinDialog *)appGroupJoinDialog didFailWithError:(NSError *)error __attribute__ ((deprecated)); - -/** - -- Warning:App and game groups are being deprecated. See https://developers.facebook.com/docs/games/services/game-groups for more information. - */ -- (void)appGroupJoinDialogDidCancel:(FBSDKAppGroupJoinDialog *)appGroupJoinDialog __attribute__ ((deprecated)); - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.m deleted file mode 100644 index dd7a11a3a..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.m +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppGroupJoinDialog.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareConstants.h" -#import "FBSDKShareError.h" -#import "FBSDKShareUtility.h" - -@interface FBSDKAppGroupJoinDialog () -@end - -@implementation FBSDKAppGroupJoinDialog -{ - FBSDKWebDialog *_webDialog; -} - -#define FBSDK_APP_GROUP_JOIN_METHOD_NAME @"game_group_join" - -#pragma mark - Class Methods - -+ (instancetype)showWithGroupID:(NSString *)groupID - delegate:(id)delegate -{ - FBSDKAppGroupJoinDialog *dialog = [[self alloc] init]; - dialog.groupID = groupID; - dialog.delegate = delegate; - [dialog show]; - return dialog; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - if ((self = [super init])) { - _webDialog = [[FBSDKWebDialog alloc] init]; - _webDialog.delegate = self; - _webDialog.name = FBSDK_APP_GROUP_JOIN_METHOD_NAME; - } - return self; -} - -- (void)dealloc -{ - _webDialog.delegate = nil; -} - -#pragma mark - Public Methods - -- (BOOL)canShow -{ - return YES; -} - -- (BOOL)show -{ - NSError *error; - if (![self canShow]) { - error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode - message:@"App group join dialog is not available."]; - [_delegate appGroupJoinDialog:self didFailWithError:error]; - return NO; - } - if (![self validateWithError:&error]) { - [_delegate appGroupJoinDialog:self didFailWithError:error]; - return NO; - } - - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:parameters setObject:self.groupID forKey:@"id"]; - - _webDialog.parameters = parameters; - [_webDialog show]; - [FBSDKInternalUtility registerTransientObject:self]; - return YES; -} - -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef -{ - if (![self.groupID length]) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"groupID" message:nil]; - } - return NO; - } - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; -} - -#pragma mark - FBSDKWebDialogDelegate - -- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results -{ - if (_webDialog != webDialog) { - return; - } - NSError *error = [FBSDKShareError errorWithCode:[FBSDKTypeUtility unsignedIntegerValue:results[@"error_code"]] - message:[FBSDKTypeUtility stringValue:results[@"error_message"]]]; - [self _handleCompletionWithDialogResults:results error:error]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error -{ - if (_webDialog != webDialog) { - return; - } - [self _handleCompletionWithDialogResults:nil error:error]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog -{ - if (_webDialog != webDialog) { - return; - } - [_delegate appGroupJoinDialogDidCancel:self]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -#pragma mark - Helper Methods - -- (void)_handleCompletionWithDialogResults:(NSDictionary *)results error:(NSError *)error -{ - if (!_delegate) { - return; - } - switch (error.code) { - case 0:{ - [_delegate appGroupJoinDialog:self didCompleteWithResults:results]; - break; - } - case 4201:{ - [_delegate appGroupJoinDialogDidCancel:self]; - break; - } - default:{ - [_delegate appGroupJoinDialog:self didFailWithError:error]; - break; - } - } - if (error) { - return; - } else { - } -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h deleted file mode 100644 index fe911420c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - NS_ENUM(NSUInteger, FBSDKAppInviteDestination) - Specifies the privacy of a group. - */ -typedef NS_ENUM(NSUInteger, FBSDKAppInviteDestination) -{ - /** Deliver to Facebook. */ - FBSDKAppInviteDestinationFacebook = 0, - /** Deliver to Messenger. */ - FBSDKAppInviteDestinationMessenger, -}; - -/** - A model for app invite. - */ -@interface FBSDKAppInviteContent : NSObject - -/** - A URL to a preview image that will be displayed with the app invite - - - This is optional. If you don't include it a fallback image will be used. -*/ -@property (nonatomic, copy) NSURL *appInvitePreviewImageURL; - -/** - An app link target that will be used as a target when the user accept the invite. - - - This is a requirement. - */ -@property (nonatomic, copy) NSURL *appLinkURL; - -/** - -- Warning:Use `appInvitePreviewImageURL` instead. - */ -@property (nonatomic, copy) NSURL *previewImageURL __attribute__ ((deprecated("use appInvitePreviewImageURL instead"))); - -/** - Promotional code to be displayed while sending and receiving the invite. - - - This is optional. This can be between 0 and 10 characters long and can contain - alphanumeric characters only. To set a promo code, you need to set promo text. - */ -@property (nonatomic, copy) NSString *promotionCode; - -/** - Promotional text to be displayed while sending and receiving the invite. - - - This is optional. This can be between 0 and 80 characters long and can contain - alphanumeric and spaces only. - */ -@property (nonatomic, copy) NSString *promotionText; - -/** - Destination for the app invite. - - - This is optional and for declaring destination of the invite. - */ -@property FBSDKAppInviteDestination destination; - -/** - Compares the receiver to another app invite content. - - Parameter content: The other content - - Returns: YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToAppInviteContent:(FBSDKAppInviteContent *)content; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.m deleted file mode 100644 index 780c5b9fa..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.m +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppInviteContent.h" - -#import "FBSDKCoreKit+Internal.h" - -#define FBSDK_APP_INVITE_CONTENT_APP_LINK_URL_KEY @"appLinkURL" -#define FBSDK_APP_INVITE_CONTENT_PREVIEW_IMAGE_KEY @"previewImage" -#define FBSDK_APP_INVITE_CONTENT_PROMO_CODE_KEY @"promoCode" -#define FBSDK_APP_INVITE_CONTENT_PROMO_TEXT_KEY @"promoText" -#define FBSDK_APP_INVITE_CONTENT_DESTINATION_KEY @"destination" - - -@implementation FBSDKAppInviteContent - -- (NSURL *)previewImageURL -{ - return self.appInvitePreviewImageURL; -} - -- (void)setPreviewImageURL:(NSURL *)previewImageURL -{ - self.appInvitePreviewImageURL = previewImageURL; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [_appLinkURL hash], - [_appInvitePreviewImageURL hash], - [_promotionCode hash], - [_promotionText hash], - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKAppInviteContent class]]) { - return NO; - } - return [self isEqualToAppInviteContent:(FBSDKAppInviteContent *)object]; -} - -- (BOOL)isEqualToAppInviteContent:(FBSDKAppInviteContent *)content -{ - return (content && - [FBSDKInternalUtility object:_appLinkURL isEqualToObject:content.appLinkURL] && - [FBSDKInternalUtility object:_appInvitePreviewImageURL isEqualToObject:content.appInvitePreviewImageURL] && - [FBSDKInternalUtility object:_promotionText isEqualToObject:content.promotionText] && - [FBSDKInternalUtility object:_promotionCode isEqualToObject:content.promotionText] && - _destination == content.destination - ); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _appLinkURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_APP_INVITE_CONTENT_APP_LINK_URL_KEY]; - _appInvitePreviewImageURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_APP_INVITE_CONTENT_PREVIEW_IMAGE_KEY]; - _promotionCode = [decoder decodeObjectOfClass:[NSString class] forKey: - FBSDK_APP_INVITE_CONTENT_PROMO_CODE_KEY]; - _promotionText = [decoder decodeObjectOfClass:[NSString class] forKey: - FBSDK_APP_INVITE_CONTENT_PROMO_TEXT_KEY]; - _destination = [decoder decodeIntegerForKey: - FBSDK_APP_INVITE_CONTENT_DESTINATION_KEY]; - - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_appLinkURL forKey:FBSDK_APP_INVITE_CONTENT_APP_LINK_URL_KEY]; - [encoder encodeObject:_appInvitePreviewImageURL forKey:FBSDK_APP_INVITE_CONTENT_PREVIEW_IMAGE_KEY]; - [encoder encodeObject:_promotionCode forKey:FBSDK_APP_INVITE_CONTENT_PROMO_CODE_KEY]; - [encoder encodeObject:_promotionText forKey:FBSDK_APP_INVITE_CONTENT_PROMO_TEXT_KEY]; - [encoder encodeInt:_destination forKey:FBSDK_APP_INVITE_CONTENT_DESTINATION_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKAppInviteContent *copy = [[FBSDKAppInviteContent alloc] init]; - copy->_appLinkURL = [_appLinkURL copy]; - copy->_appInvitePreviewImageURL = [_appInvitePreviewImageURL copy]; - copy->_promotionText = [_promotionText copy]; - copy->_promotionCode = [_promotionCode copy]; - copy->_destination = _destination; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h deleted file mode 100644 index 9994ff92c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -#import - -@protocol FBSDKAppInviteDialogDelegate; - -/** - A dialog for sending App Invites. - */ -@interface FBSDKAppInviteDialog : NSObject - -/** - Convenience method to show a FBSDKAppInviteDialog - - Parameter viewController: A UIViewController to present the dialog from. - - Parameter content: The content for the app invite. - - Parameter delegate: The receiver's delegate. - - Warning: This method is deprecated. - */ -+ (instancetype)showFromViewController:(UIViewController *)viewController - withContent:(FBSDKAppInviteContent *)content - delegate:(id)delegate -__attribute__ ((deprecated("App Invites no longer supported"))); - - -/** - - - Warning:use showFromViewController:withContent:delegate: instead - */ -+ (instancetype)showWithContent:(FBSDKAppInviteContent *)content delegate:(id)delegate -__attribute__ ((deprecated("use showFromViewController:withContent:delegate: instead"))); - -/** - A UIViewController to present the dialog from. - - If not specified, the top most view controller will be automatically determined as best as possible. - */ -@property (nonatomic, weak) UIViewController *fromViewController; - -/** - The receiver's delegate or nil if it doesn't have a delegate. - */ -@property (nonatomic, weak) id delegate; - -/** - The content for app invite. - */ -@property (nonatomic, copy) FBSDKAppInviteContent *content; - -/** - A Boolean value that indicates whether the receiver can initiate an app invite. - - May return NO if the appropriate Facebook app is not installed and is required or an access token is - required but not available. This method does not validate the content on the receiver, so this can be checked before - building up the content. - - - See:validateWithError: - - Returns: YES if the receiver can show the dialog, otherwise NO. - */ -- (BOOL)canShow; - -/** - Begins the app invite from the receiver. - - Returns: YES if the receiver was able to show the dialog, otherwise NO. - */ -- (BOOL)show; - -/** - Validates the content on the receiver. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Returns: YES if the content is valid, otherwise NO. - */ -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; - -@end - -/** - A delegate for FBSDKAppInviteDialog. - - The delegate is notified with the results of the app invite as long as the application has permissions to - receive the information. For example, if the person is not signed into the containing app, the shower may not be able - to distinguish between completion of an app invite and cancellation. - */ -@protocol FBSDKAppInviteDialogDelegate - -/** - Sent to the delegate when the app invite completes without error. - - Parameter appInviteDialog: The FBSDKAppInviteDialog that completed. - - Parameter results: The results from the dialog. This may be nil or empty. - */ -- (void)appInviteDialog:(FBSDKAppInviteDialog *)appInviteDialog didCompleteWithResults:(NSDictionary *)results; - -/** - Sent to the delegate when the app invite encounters an error. - - Parameter appInviteDialog: The FBSDKAppInviteDialog that completed. - - Parameter error: The error. - */ -- (void)appInviteDialog:(FBSDKAppInviteDialog *)appInviteDialog didFailWithError:(NSError *)error; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.m deleted file mode 100644 index 63ea582aa..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.m +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKAppInviteDialog.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareConstants.h" -#import "FBSDKShareDefines.h" -#import "FBSDKShareError.h" -#import "FBSDKShareUtility.h" - -@implementation FBSDKAppInviteDialog - -#define FBSDK_APP_INVITE_METHOD_MIN_VERSION @"20140410" -#define FBSDK_APP_INVITE_METHOD_NAME @"appinvites" - -+ (void)initialize -{ - if ([FBSDKAppInviteDialog class] == self) { - [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_FACEBOOK]; - // ensure that we have updated the dialog configs if we haven't already - [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; - } -} - -#pragma mark - Class Methods - - -+ (instancetype)showWithContent:(FBSDKAppInviteContent *)content delegate:(id)delegate -{ - return [self showFromViewController:nil withContent:content delegate:delegate]; -} - - -+ (instancetype)showFromViewController:(UIViewController *)viewController - withContent:(FBSDKAppInviteContent *)content - delegate:(id)delegate; -{ - return nil; -} - -#pragma mark - Public Methods - -- (BOOL)canShow -{ - return NO; -} - -- (BOOL)show -{ - return NO; -} - -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef -{ - return [FBSDKShareUtility validateAppInviteContent:self.content error:errorRef]; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h deleted file mode 100644 index 6f67f0a54..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - * A container of arguments for a camera effect. - * An argument is a NSString identified by a NSString key. - */ -@interface FBSDKCameraEffectArguments : NSObject - -/** - Sets a string argument in the container. - - Parameter string: The argument - - Parameter key: The key for the argument - */ -- (void)setString:(NSString *)string forKey:(NSString *)key; - -/** - Gets a string argument from the container. - - Parameter key: The key for the argument - - Returns: The string value or nil - */ -- (NSString *)stringForKey:(NSString *)key; - -/** - Sets a string array argument in the container. - - Parameter array: The array argument - - Parameter key: The key for the argument - */ -- (void)setArray:(NSArray *)array forKey:(NSString *)key; - -/** - Gets an array argument from the container. - - Parameter key: The key for the argument - - Returns: The array argument - */ -- (NSArray *)arrayForKey:(NSString *)key; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.m deleted file mode 100644 index 9df789133..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.m +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKCameraEffectArguments.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareUtility.h" - -static NSString *const FBSDKCameraEffectArgumentsArgumentsKey = @"arguments"; - -@implementation FBSDKCameraEffectArguments -{ - NSMutableDictionary *_arguments; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - if ((self = [super init])) { - _arguments = [NSMutableDictionary new]; - } - return self; -} - -- (void)setString:(NSString *)string forKey:(NSString *)key -{ - [self _setValue:[string copy] forKey:key]; -} - -- (NSString *)stringForKey:(NSString *)key -{ - return [self _valueOfClass:[NSString class] forKey:key]; -} - -- (void)setArray:(NSArray *)array forKey:(NSString *)key -{ - [self _setValue:[array copy] forKey:key]; -} - -- (NSArray *)arrayForKey:(NSString *)key -{ - return [self _valueOfClass:[NSArray class] forKey:key]; -} - -- (NSDictionary *)allArguments -{ - return _arguments; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - return [_arguments hash]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKCameraEffectArguments class]]) { - return NO; - } - return [self isEqualToCameraEffectArguments:(FBSDKCameraEffectArguments *)object]; -} - -- (BOOL)isEqualToCameraEffectArguments:(FBSDKCameraEffectArguments *)object -{ - return [FBSDKInternalUtility object:_arguments isEqualToObject:[object allArguments]]; -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _arguments = [decoder decodeObjectOfClass:[NSMutableDictionary class] - forKey:FBSDKCameraEffectArgumentsArgumentsKey]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_arguments forKey:FBSDKCameraEffectArgumentsArgumentsKey]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKCameraEffectArguments *copy = [FBSDKCameraEffectArguments new]; - copy->_arguments = [_arguments copy]; - return copy; -} - - -#pragma mark - Helper Methods - -- (void)_setValue:(id)value forKey:(NSString *)key -{ - [FBSDKCameraEffectArguments assertKey:key]; - if (value) { - [FBSDKCameraEffectArguments assertValue:value]; - _arguments[key] = value; - } else { - [_arguments removeObjectForKey:key]; - } -} - -- (id)_valueForKey:(NSString *)key -{ - key = [FBSDKTypeUtility stringValue:key]; - return (key ? [FBSDKTypeUtility objectValue:_arguments[key]] : nil); -} - -- (id)_valueOfClass:(__unsafe_unretained Class)cls forKey:(NSString *)key -{ - id value = [self _valueForKey:key]; - return ([value isKindOfClass:cls] ? value : nil); -} - -+ (void)assertKey:(id)key -{ - if ([key isKindOfClass:[NSString class]]) { - return; - } - NSString *reason = [NSString stringWithFormat:@"Invalid key found in CameraEffectArguments: %@", key]; - @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; -} - -+ (void)assertValue:(id)value -{ - BOOL isInvalid = NO; - if ([value isKindOfClass:[NSString class]]) { - // Strings are always valid. - } else if ([value isKindOfClass:[NSArray class]]) { - // Allow only string arrays. - for (id subValue in (NSArray *)value) { - if (![subValue isKindOfClass:[NSString class]]) { - isInvalid = YES; - break; - } - } - } else { - isInvalid = YES; - } - - if (isInvalid) { - NSString *reason = [NSString stringWithFormat:@"Invalid value found in CameraEffectArguments: %@", value]; - @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; - } -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h deleted file mode 100644 index 37aeff37d..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - * A container of textures for a camera effect. - * A texture for a camera effect is an UIImages identified by a NSString key. - */ -@interface FBSDKCameraEffectTextures : NSObject - -/** - Sets the image for a texture key. - - Parameter image: The UIImage for the texture - - Parameter name: The key for the texture - */ -- (void)setImage:(UIImage *)image forKey:(NSString *)key; - -/** - Gets the image for a texture key. - - Parameter name: The key for the texture - - Returns: The texture UIImage or nil - */ -- (UIImage *)imageForKey:(NSString *)key; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.m deleted file mode 100644 index 9da5c06b6..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.m +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKCameraEffectTextures.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareUtility.h" - -static NSString *const FBSDKCameraEffectTexturesTexturesKey = @"textures"; - -@implementation FBSDKCameraEffectTextures -{ - NSMutableDictionary *_textures; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - if ((self = [super init])) { - _textures = [NSMutableDictionary new]; - } - return self; -} - -- (void)setImage:(UIImage *)image forKey:(NSString *)key -{ - [self _setValue:image forKey:key]; -} - -- (UIImage *)imageForKey:(NSString *)key -{ - return [self _valueOfClass:[UIImage class] forKey:key]; -} - -- (NSDictionary *)allTextures -{ - return _textures; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - return [_textures hash]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKCameraEffectTextures class]]) { - return NO; - } - return [self isEqualToCameraEffectTextures:(FBSDKCameraEffectTextures *)object]; -} - -- (BOOL)isEqualToCameraEffectTextures:(FBSDKCameraEffectTextures *)object -{ - return [FBSDKInternalUtility object:_textures isEqualToObject:[object allTextures]]; -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _textures = [decoder decodeObjectOfClass:[NSMutableDictionary class] - forKey:FBSDKCameraEffectTexturesTexturesKey]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_textures forKey:FBSDKCameraEffectTexturesTexturesKey]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKCameraEffectTextures *copy = [FBSDKCameraEffectTextures new]; - copy->_textures = [_textures copy]; - return copy; -} - -#pragma mark - Helper Methods - -- (void)_setValue:(id)value forKey:(NSString *)key -{ - if (value) { - _textures[key] = value; - } else { - [_textures removeObjectForKey:key]; - } -} - -- (id)_valueForKey:(NSString *)key -{ - key = [FBSDKTypeUtility stringValue:key]; - return (key ? [FBSDKTypeUtility objectValue:_textures[key]] : nil); -} - -- (id)_valueOfClass:(__unsafe_unretained Class)cls forKey:(NSString *)key -{ - id value = [self _valueForKey:key]; - return ([value isKindOfClass:cls] ? value : nil); -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h deleted file mode 100644 index a7428268d..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - NS_ENUM(NSUInteger, FBSDKGameRequestActionType) - Additional context about the nature of the request. - */ -typedef NS_ENUM(NSUInteger, FBSDKGameRequestActionType) -{ - /** No action type */ - FBSDKGameRequestActionTypeNone = 0, - /** Send action type: The user is sending an object to the friends. */ - FBSDKGameRequestActionTypeSend, - /** Ask For action type: The user is asking for an object from friends. */ - FBSDKGameRequestActionTypeAskFor, - /** Turn action type: It is the turn of the friends to play against the user in a match. (no object) */ - FBSDKGameRequestActionTypeTurn, -}; - -/** - NS_ENUM(NSUInteger, FBSDKGameRequestFilters) - Filter for who can be displayed in the multi-friend selector. - */ -typedef NS_ENUM(NSUInteger, FBSDKGameRequestFilter) -{ - /** No filter, all friends can be displayed. */ - FBSDKGameRequestFilterNone = 0, - /** Friends using the app can be displayed. */ - FBSDKGameRequestFilterAppUsers, - /** Friends not using the app can be displayed. */ - FBSDKGameRequestFilterAppNonUsers, -}; - -/** - A model for a game request. - */ -@interface FBSDKGameRequestContent : NSObject - -/** - Used when defining additional context about the nature of the request. - - The parameter 'objectID' is required if the action type is either - 'FBSDKGameRequestSendActionType' or 'FBSDKGameRequestAskForActionType'. - -- SeeAlso:objectID - */ -@property (nonatomic, assign) FBSDKGameRequestActionType actionType; - -/** - Compares the receiver to another game request content. - - Parameter content: The other content - - Returns: YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToGameRequestContent:(FBSDKGameRequestContent *)content; - -/** - Additional freeform data you may pass for tracking. This will be stored as part of - the request objects created. The maximum length is 255 characters. - */ -@property (nonatomic, copy) NSString *data; - -/** - This controls the set of friends someone sees if a multi-friend selector is shown. - It is FBSDKGameRequestNoFilter by default, meaning that all friends can be shown. - If specify as FBSDKGameRequestAppUsersFilter, only friends who use the app will be shown. - On the other hands, use FBSDKGameRequestAppNonUsersFilter to filter only friends who do not use the app. - - The parameter name is preserved to be consistent with the counter part on desktop. - */ -@property (nonatomic, assign) FBSDKGameRequestFilter filters; - -/** - A plain-text message to be sent as part of the request. This text will surface in the App Center view - of the request, but not on the notification jewel. Required parameter. - */ -@property (nonatomic, copy) NSString *message; - -/** - The Open Graph object ID of the object being sent. - -- SeeAlso:actionType - */ -@property (nonatomic, copy) NSString *objectID; - -/** - An array of user IDs, usernames or invite tokens (NSString) of people to send request. - - These may or may not be a friend of the sender. If this is specified by the app, - the sender will not have a choice of recipients. If not, the sender will see a multi-friend selector - - This is equivalent to the "to" parameter when using the web game request dialog. - */ -@property (nonatomic, copy) NSArray *recipients; - -/** - An array of user IDs that will be included in the dialog as the first suggested friends. - Cannot be used together with filters. - - This is equivalent to the "suggestions" parameter when using the web game request dialog. -*/ -@property (nonatomic, copy) NSArray *recipientSuggestions; - -/** - -- Warning:Use `recipientSuggestions` instead. -*/ -@property (nonatomic, copy) NSArray *suggestions __attribute__ ((deprecated("use recipientSuggestions instead"))); - -/** - The title for the dialog. - */ -@property (nonatomic, copy) NSString *title; - -/** - -- Warning:Use `recipients` instead. - */ -@property (nonatomic, copy) NSArray *to __attribute__ ((deprecated("use recipients instead"))); - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.m deleted file mode 100644 index c2f629e50..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.m +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKGameRequestContent.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareUtility.h" - -#define FBSDK_APP_REQUEST_CONTENT_TO_KEY @"to" -#define FBSDK_APP_REQUEST_CONTENT_MESSAGE_KEY @"message" -#define FBSDK_APP_REQUEST_CONTENT_ACTION_TYPE_KEY @"actionType" -#define FBSDK_APP_REQUEST_CONTENT_OBJECT_ID_KEY @"objectID" -#define FBSDK_APP_REQUEST_CONTENT_FILTERS_KEY @"filters" -#define FBSDK_APP_REQUEST_CONTENT_SUGGESTIONS_KEY @"suggestions" -#define FBSDK_APP_REQUEST_CONTENT_DATA_KEY @"data" -#define FBSDK_APP_REQUEST_CONTENT_TITLE_KEY @"title" - -@implementation FBSDKGameRequestContent - -#pragma mark - Properties - --(void)setRecipients:(NSArray *)recipients -{ - [FBSDKShareUtility assertCollection:recipients ofClass:[NSString class] name:@"recipients"]; - if (![_recipients isEqual:recipients]) { - _recipients = [recipients copy]; - } -} - -- (void)setRecipientSuggestions:(NSArray *)recipientSuggestions -{ - [FBSDKShareUtility assertCollection:recipientSuggestions ofClass:[NSString class] name:@"recipientSuggestions"]; - if (![_recipientSuggestions isEqual:recipientSuggestions]) { - _recipientSuggestions = [recipientSuggestions copy]; - } -} - -- (NSArray *)suggestions -{ - return self.recipientSuggestions; -} - -- (void)setSuggestions:(NSArray *)suggestions -{ - self.recipientSuggestions = suggestions; -} - -- (NSArray *)to -{ - return self.recipients; -} - -- (void)setTo:(NSArray *)to -{ - self.recipients = to; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [FBSDKMath hashWithInteger:_actionType], - [_data hash], - [FBSDKMath hashWithInteger:_filters], - [_message hash], - [_objectID hash], - [_recipientSuggestions hash], - [_title hash], - [_recipients hash], - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKGameRequestContent class]]) { - return NO; - } - return [self isEqualToGameRequestContent:(FBSDKGameRequestContent *)object]; -} - -- (BOOL)isEqualToGameRequestContent:(FBSDKGameRequestContent *)content -{ - return (content && - _actionType == content.actionType && - _filters == content.filters && - [FBSDKInternalUtility object:_data isEqualToObject:content.data] && - [FBSDKInternalUtility object:_message isEqualToObject:content.message] && - [FBSDKInternalUtility object:_objectID isEqualToObject:content.objectID] && - [FBSDKInternalUtility object:_recipientSuggestions isEqualToObject:content.recipientSuggestions] && - [FBSDKInternalUtility object:_title isEqualToObject:content.title] && - [FBSDKInternalUtility object:_recipients isEqualToObject:content.recipients]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _actionType = [decoder decodeIntegerForKey:FBSDK_APP_REQUEST_CONTENT_ACTION_TYPE_KEY]; - _data = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APP_REQUEST_CONTENT_DATA_KEY]; - _filters = [decoder decodeIntegerForKey:FBSDK_APP_REQUEST_CONTENT_FILTERS_KEY]; - _message = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APP_REQUEST_CONTENT_MESSAGE_KEY]; - _objectID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APP_REQUEST_CONTENT_OBJECT_ID_KEY]; - _recipientSuggestions = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_APP_REQUEST_CONTENT_SUGGESTIONS_KEY]; - _title = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_APP_REQUEST_CONTENT_TITLE_KEY]; - _recipients = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_APP_REQUEST_CONTENT_TO_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeInteger:_actionType forKey:FBSDK_APP_REQUEST_CONTENT_ACTION_TYPE_KEY]; - [encoder encodeObject:_data forKey:FBSDK_APP_REQUEST_CONTENT_DATA_KEY]; - [encoder encodeInteger:_filters forKey:FBSDK_APP_REQUEST_CONTENT_FILTERS_KEY]; - [encoder encodeObject:_message forKey:FBSDK_APP_REQUEST_CONTENT_MESSAGE_KEY]; - [encoder encodeObject:_objectID forKey:FBSDK_APP_REQUEST_CONTENT_OBJECT_ID_KEY]; - [encoder encodeObject:_recipientSuggestions forKey:FBSDK_APP_REQUEST_CONTENT_SUGGESTIONS_KEY]; - [encoder encodeObject:_title forKey:FBSDK_APP_REQUEST_CONTENT_TITLE_KEY]; - [encoder encodeObject:_recipients forKey:FBSDK_APP_REQUEST_CONTENT_TO_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKGameRequestContent *copy = [[FBSDKGameRequestContent alloc] init]; - copy->_actionType = _actionType; - copy->_data = [_data copy]; - copy->_filters = _filters; - copy->_message = [_message copy]; - copy->_objectID = [_objectID copy]; - copy->_recipientSuggestions = [_recipientSuggestions copy]; - copy->_title = [_title copy]; - copy->_recipients = [_recipients copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h deleted file mode 100644 index 0cca01645..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@protocol FBSDKGameRequestDialogDelegate; - -/** - A dialog for sending game requests. - */ -@interface FBSDKGameRequestDialog : NSObject - -/** - Convenience method to build up a game request with content and a delegate. - - Parameter content: The content for the game request. - - Parameter delegate: The receiver's delegate. - */ -+ (instancetype)showWithContent:(FBSDKGameRequestContent *)content delegate:(id)delegate; - -/** - The receiver's delegate or nil if it doesn't have a delegate. - */ -@property (nonatomic, weak) id delegate; - -/** - The content for game request. - */ -@property (nonatomic, copy) FBSDKGameRequestContent *content; - -/** - Specifies whether frictionless requests are enabled. - */ -@property (nonatomic, assign) BOOL frictionlessRequestsEnabled; - -/** - A Boolean value that indicates whether the receiver can initiate a game request. - - May return NO if the appropriate Facebook app is not installed and is required or an access token is - required but not available. This method does not validate the content on the receiver, so this can be checked before - building up the content. - -- See:validateWithError: - - Returns: YES if the receiver can share, otherwise NO. - */ -- (BOOL)canShow; - -/** - Begins the game request from the receiver. - - Returns: YES if the receiver was able to show the dialog, otherwise NO. - */ -- (BOOL)show; - -/** - Validates the content on the receiver. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Returns: YES if the content is valid, otherwise NO. - */ -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; - -@end - -/** - A delegate for FBSDKGameRequestDialog. - - The delegate is notified with the results of the game request as long as the application has permissions to - receive the information. For example, if the person is not signed into the containing app, the shower may not be able - to distinguish between completion of a game request and cancellation. - */ -@protocol FBSDKGameRequestDialogDelegate - -/** - Sent to the delegate when the game request completes without error. - - Parameter gameRequestDialog: The FBSDKGameRequestDialog that completed. - - Parameter results: The results from the dialog. This may be nil or empty. - */ -- (void)gameRequestDialog:(FBSDKGameRequestDialog *)gameRequestDialog didCompleteWithResults:(NSDictionary *)results; - -/** - Sent to the delegate when the game request encounters an error. - - Parameter gameRequestDialog: The FBSDKGameRequestDialog that completed. - - Parameter error: The error. - */ -- (void)gameRequestDialog:(FBSDKGameRequestDialog *)gameRequestDialog didFailWithError:(NSError *)error; - -/** - Sent to the delegate when the game request dialog is cancelled. - - Parameter gameRequestDialog: The FBSDKGameRequestDialog that completed. - */ -- (void)gameRequestDialogDidCancel:(FBSDKGameRequestDialog *)gameRequestDialog; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.m deleted file mode 100644 index 11932aef2..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.m +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKGameRequestDialog.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKGameRequestFrictionlessRecipientCache.h" -#import "FBSDKShareConstants.h" -#import "FBSDKShareError.h" -#import "FBSDKShareUtility.h" - -@interface FBSDKGameRequestDialog () -@end - -@implementation FBSDKGameRequestDialog -{ - BOOL _dialogIsFrictionless; - FBSDKWebDialog *_webDialog; -} - -#define FBSDK_APP_REQUEST_METHOD_NAME @"apprequests" - -#pragma mark - Class Methods - -static FBSDKGameRequestFrictionlessRecipientCache *_recipientCache = nil; - -+ (void)initialize -{ - if (self == [FBSDKGameRequestDialog class]) { - _recipientCache = [[FBSDKGameRequestFrictionlessRecipientCache alloc] init]; - } -} - -+ (instancetype)showWithContent:(FBSDKGameRequestContent *)content delegate:(id)delegate -{ - FBSDKGameRequestDialog *dialog = [[self alloc] init]; - dialog.content = content; - dialog.delegate = delegate; - [dialog show]; - return dialog; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - if ((self = [super init])) { - _webDialog = [[FBSDKWebDialog alloc] init]; - _webDialog.delegate = self; - _webDialog.name = FBSDK_APP_REQUEST_METHOD_NAME; - } - return self; -} - -- (void)dealloc -{ - _webDialog.delegate = nil; -} - -#pragma mark - Public Methods - -- (BOOL)canShow -{ - return YES; -} - -- (BOOL)show -{ - NSError *error; - if (![self canShow]) { - error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode - message:@"Game request dialog is not available."]; - [_delegate gameRequestDialog:self didFailWithError:error]; - return NO; - } - if (![self validateWithError:&error]) { - [_delegate gameRequestDialog:self didFailWithError:error]; - return NO; - } - - FBSDKGameRequestContent *content = self.content; - - if (error) { - return NO; - } - - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:parameters setObject:[content.recipients componentsJoinedByString:@","] forKey:@"to"]; - [FBSDKInternalUtility dictionary:parameters setObject:content.message forKey:@"message"]; - [FBSDKInternalUtility dictionary:parameters setObject:[self _actionTypeNameForActionType:content.actionType] forKey:@"action_type"]; - [FBSDKInternalUtility dictionary:parameters setObject:content.objectID forKey:@"object_id"]; - [FBSDKInternalUtility dictionary:parameters setObject:[self _filtersNameForFilters:content.filters] forKey:@"filters"]; - [FBSDKInternalUtility dictionary:parameters setObject:[content.recipientSuggestions componentsJoinedByString:@","] forKey:@"suggestions"]; - [FBSDKInternalUtility dictionary:parameters setObject:content.data forKey:@"data"]; - [FBSDKInternalUtility dictionary:parameters setObject:content.title forKey:@"title"]; - - // check if we are sending to a specific set of recipients. if we are and they are all frictionless recipients, we - // can perform this action without displaying the web dialog - _webDialog.deferVisibility = NO; - NSArray *recipients = content.recipients; - if (_frictionlessRequestsEnabled && recipients) { - // specify these parameters to get the frictionless recipients from the dialog when it is presented - parameters[@"frictionless"] = @YES; - parameters[@"get_frictionless_recipients"] = @YES; - - _dialogIsFrictionless = YES; - if ([_recipientCache recipientsAreFrictionless:recipients]) { - _webDialog.deferVisibility = YES; - } - } - - _webDialog.parameters = parameters; - [_webDialog show]; - [FBSDKInternalUtility registerTransientObject:self]; - return YES; -} - -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef -{ - return [FBSDKShareUtility validateGameRequestContent:self.content error:errorRef]; -} - -#pragma mark - FBSDKWebDialogDelegate - -- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results -{ - if (_webDialog != webDialog) { - return; - } - if (_dialogIsFrictionless && results) { - [_recipientCache updateWithResults:results]; - } - [self _cleanUp]; - - NSError *error = [FBSDKShareError errorWithCode:[FBSDKTypeUtility unsignedIntegerValue:results[@"error_code"]] - message:[FBSDKTypeUtility stringValue:results[@"error_message"]]]; - if (!error.code) { - // reformat "to[x]" keys into an array. - int counter = 0; - NSMutableArray *toArray = [NSMutableArray array]; - while (true) { - NSString *key = [NSString stringWithFormat:@"to[%d]", counter++]; - if (results[key]) { - [toArray addObject:results[key]]; - } else { - break; - } - } - if (toArray.count) { - NSMutableDictionary *mutableResults = [results mutableCopy]; - mutableResults[@"to"] = toArray; - results = mutableResults; - } - } - [self _handleCompletionWithDialogResults:results error:error]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error -{ - if (_webDialog != webDialog) { - return; - } - [self _cleanUp]; - [self _handleCompletionWithDialogResults:nil error:error]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog -{ - if (_webDialog != webDialog) { - return; - } - [self _cleanUp]; - [_delegate gameRequestDialogDidCancel:self]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -#pragma mark - Helper Methods - -- (void)_cleanUp -{ - _dialogIsFrictionless = NO; -} - -- (void)_handleCompletionWithDialogResults:(NSDictionary *)results error:(NSError *)error -{ - if (!_delegate) { - return; - } - switch (error.code) { - case 0:{ - [_delegate gameRequestDialog:self didCompleteWithResults:results]; - break; - } - case 4201:{ - [_delegate gameRequestDialogDidCancel:self]; - break; - } - default:{ - [_delegate gameRequestDialog:self didFailWithError:error]; - break; - } - } - if (error) { - return; - } else { - } -} - -- (NSString *)_actionTypeNameForActionType:(FBSDKGameRequestActionType)actionType -{ - switch (actionType) { - case FBSDKGameRequestActionTypeNone:{ - return nil; - } - case FBSDKGameRequestActionTypeSend:{ - return @"send"; - } - case FBSDKGameRequestActionTypeAskFor:{ - return @"askfor"; - } - case FBSDKGameRequestActionTypeTurn:{ - return @"turn"; - } - default:{ - return nil; - } - } -} - -- (NSString *)_filtersNameForFilters:(FBSDKGameRequestFilter)filters -{ - switch (filters) { - case FBSDKGameRequestFilterNone:{ - return nil; - } - case FBSDKGameRequestFilterAppUsers:{ - return @"app_users"; - } - case FBSDKGameRequestFilterAppNonUsers:{ - return @"app_non_users"; - } - default:{ - return nil; - } - } -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h deleted file mode 100644 index 438b664d1..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - Represents a single hashtag that can be used with the share dialog. - */ -@interface FBSDKHashtag : NSObject - -/** - Convenience method to build a new hashtag with a string identifier. Equivalent to setting the - `stringRepresentation` property. - - Parameter hashtagString: The hashtag string. - */ -+ (instancetype)hashtagWithString:(NSString *)hashtagString; - -/** - The hashtag string. - - You are responsible for making sure that `stringRepresentation` is a valid hashtag (a single '#' followed - by one or more word characters). Invalid hashtags are ignored when sharing content. You can check validity with the - `valid` property. - - Returns: The hashtag string. - */ -@property (nonatomic, readwrite, copy) NSString *stringRepresentation; - -/** - Tests if a hashtag is valid. - - A valid hashtag matches the regular expression "#\w+": A single '#' followed by one or more - word characters. - - Returns: YES if the hashtag is valid, NO otherwise. - */ -@property (nonatomic, readonly, assign, getter=isValid) BOOL valid; - -/** - Compares the receiver to another hashtag. - - Parameter hashtag: The other hashtag - - Returns: YES if the receiver is equal to the other hashtag; otherwise NO - */ -- (BOOL)isEqualToHashtag:(FBSDKHashtag *)hashtag; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.m deleted file mode 100644 index ad1b6f472..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.m +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKHashtag.h" - -#import "FBSDKCoreKit+Internal.h" - -#define FBSDK_HASHTAG_STRING_KEY @"hashtag" - -static NSRegularExpression *HashtagRegularExpression() -{ - static NSRegularExpression *hashtagRegularExpression = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - hashtagRegularExpression = [[NSRegularExpression alloc] initWithPattern:@"^#\\w+$" options:0 error:NULL]; - }); - return hashtagRegularExpression; -} - -@implementation FBSDKHashtag - -#pragma mark - Class Methods - -+ (instancetype)hashtagWithString:(NSString *)hashtagString -{ - FBSDKHashtag *hashtag = [[self alloc] init]; - hashtag.stringRepresentation = hashtagString; - return hashtag; -} - -#pragma mark - Properties - -- (NSString *)description -{ - if (self.valid) { - return _stringRepresentation; - } else { - return [NSString stringWithFormat:@"Invalid hashtag '%@'", _stringRepresentation]; - } -} - -- (BOOL)isValid -{ - if (_stringRepresentation == nil) { - return NO; - } - NSRange fullString = NSMakeRange(0, _stringRepresentation.length); - NSRegularExpression *hashtagRegularExpression = HashtagRegularExpression(); - NSUInteger numberOfMatches = [hashtagRegularExpression numberOfMatchesInString:_stringRepresentation - options:0 - range:fullString]; - return numberOfMatches > 0; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - return [_stringRepresentation hash]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKHashtag class]]) { - return NO; - } - return [self isEqualToHashtag:(FBSDKHashtag *)object]; -} - -- (BOOL)isEqualToHashtag:(FBSDKHashtag *)hashtag -{ - return (hashtag && - [FBSDKInternalUtility object:_stringRepresentation isEqualToObject:hashtag.stringRepresentation]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)aDecoder -{ - if ((self = [self init])) { - _stringRepresentation = [aDecoder decodeObjectOfClass:[NSString class] forKey:FBSDK_HASHTAG_STRING_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)aCoder -{ - [aCoder encodeObject:_stringRepresentation forKey:FBSDK_HASHTAG_STRING_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKHashtag *copy = [[FBSDKHashtag alloc] init]; - copy.stringRepresentation = [_stringRepresentation copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h deleted file mode 100644 index 191c03365..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import -#import - -/** - Warning: This class is deprecated. - A button to like an object. - - Tapping the receiver will invoke an API call to the Facebook app through a fast-app-switch that allows - the object to be liked. Upon return to the calling app, the view will update with the new state. If the - currentAccessToken has "publish_actions" permission and the object is an Open Graph object, then the like can happen - seamlessly without the fast-app-switch. - */ -__attribute__ ((deprecated)) -@interface FBSDKLikeButton : FBSDKButton - -/** - If YES, a sound is played when the receiver is toggled. - - @default YES - */ -@property (nonatomic, assign, getter = isSoundEnabled) BOOL soundEnabled; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.m deleted file mode 100644 index fb91227c7..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.m +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLikeButton.h" -#import "FBSDKLikeButton+Internal.h" - -#import "FBSDKCheckmarkIcon.h" -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKLikeActionController.h" -#import "FBSDKLikeControl+Internal.h" - -#define FBSDK_LIKE_BUTTON_ANIMATION_DURATION 0.2 -#define FBSDK_LIKE_BUTTON_ANIMATION_SPRING_DAMPING 0.3 -#define FBSDK_LIKE_BUTTON_ANIMATION_SPRING_VELOCITY 0.2 - -@implementation FBSDKLikeButton -{ - BOOL _isExplicitlyDisabled; - FBSDKLikeActionController *_likeActionController; - NSString *_objectID; - FBSDKLikeObjectType _objectType; -} - -#pragma mark - Class Methods - -+ (void)initialize -{ - if ([FBSDKLikeButton class] == self) { - // ensure that we have updated the dialog configs if we haven't already - [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; - } -} - -#pragma mark - Object Lifecycle - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [_likeActionController endContentAccess]; -} - -#pragma mark - Properties - -- (FBSDKLikeActionController *)likeActionController -{ - [self _ensureLikeActionController:NO]; - return _likeActionController; -} - -- (void)setLikeActionController:(FBSDKLikeActionController *)likeActionController -{ - [self _setLikeActionController:likeActionController]; -} - -- (NSString *)objectID -{ - return _objectID; -} - -- (void)setObjectID:(NSString *)objectID -{ - if (![_objectID isEqualToString:objectID]) { - _objectID = objectID; - [self checkImplicitlyDisabled]; - [self _resetLikeActionController]; - } -} - -- (FBSDKLikeObjectType)objectType -{ - return _objectType; -} - -- (void)setObjectType:(FBSDKLikeObjectType)objectType -{ - if (_objectType != objectType) { - _objectType = objectType; - [self _resetLikeActionController]; - } -} - -#pragma mark - Layout - -- (void)layoutSubviews -{ - [self _ensureLikeActionController:YES]; - [super layoutSubviews]; -} - -#pragma mark - FBSDKButtonImpressionTracking - -- (NSDictionary *)analyticsParameters -{ - UIView *superview = self.superview; - while (superview && ![superview isKindOfClass:[FBSDKLikeControl class]]) { - superview = superview.superview; - } - if ([superview isKindOfClass:[FBSDKLikeControl class]]) { - return ((FBSDKLikeControl *)superview).analyticsParameters; - } - return @{ - @"object_id": (self.objectID ?: [NSNull null]), - @"object_type": (NSStringFromFBSDKLikeObjectType(self.objectType) ?: [NSNull null]), - @"sound_enabled": @(self.soundEnabled), - }; -} - -- (NSString *)impressionTrackingEventName -{ - return FBSDKAppEventNameFBSDKLikeButtonImpression; -} - -- (NSString *)impressionTrackingIdentifier -{ - return self.objectID; -} - -#pragma mark - FBSDKButton - -- (void)configureButton -{ - self.soundEnabled = YES; - - NSString *title = - NSLocalizedStringWithDefaultValue(@"LikeButton.Like", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Like", - @"The label for the FBSDKLikeButton when the object is not currently liked."); - NSString *selectedTitle = - NSLocalizedStringWithDefaultValue(@"LikeButton.Liked", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Liked", - @"The label for the FBSDKLikeButton when the object is currently liked."); - - UIColor *backgroundColor = [self defaultBackgroundColor]; - UIColor *highlightedColor = [self defaultHighlightedColor]; - UIColor *selectedColor = [self defaultSelectedColor]; - UIColor *selectedHighlightedColor = [UIColor colorWithRed:99.0/255.0 green:119.0/255.0 blue:178.0/255.0 alpha:1.0]; - - [self configureWithIcon:nil - title:title - backgroundColor:backgroundColor - highlightedColor:highlightedColor - selectedTitle:selectedTitle - selectedIcon:[[FBSDKCheckmarkIcon alloc] init] - selectedColor:selectedColor - selectedHighlightedColor:selectedHighlightedColor]; - - [self addTarget:self action:@selector(_handleTap:) forControlEvents:UIControlEventTouchUpInside]; - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:self - selector:@selector(_likeActionControllerDidDisableNotification:) - name:FBSDKLikeActionControllerDidDisableNotification - object:nil]; - [nc addObserver:self - selector:@selector(_likeActionControllerDidResetNotification:) - name:FBSDKLikeActionControllerDidResetNotification - object:nil]; - [nc addObserver:self - selector:@selector(_likeActionControllerDidUpdateNotification:) - name:FBSDKLikeActionControllerDidUpdateNotification - object:nil]; -} - -- (BOOL)isImplicitlyDisabled -{ - return !self.objectID || [FBSDKLikeActionController isDisabled]; -} - -#pragma mark - Helper Methods - -- (void)_ensureLikeActionController:(BOOL)notifyKVO -{ - if (!_likeActionController) { - FBSDKLikeActionController *likeActionController = [FBSDKLikeActionController likeActionControllerForObjectID:_objectID - objectType:_objectType]; - if (notifyKVO) { - self.likeActionController = likeActionController; - } else { - [self _setLikeActionController:likeActionController]; - } - [likeActionController endContentAccess]; - self.selected = _likeActionController.objectIsLiked; - } -} - -- (void)_handleTap:(FBSDKLikeButton *)likeButton -{ - [self logTapEventWithEventName:FBSDKAppEventNameFBSDKLikeButtonDidTap parameters:[self analyticsParameters]]; - [self _ensureLikeActionController:YES]; - [_likeActionController toggleLikeWithSoundEnabled:self.soundEnabled - analyticsParameters:[self analyticsParameters] - fromViewController:[FBSDKInternalUtility viewControllerForView:self]]; -} - -- (void)_like:(id)sender -{ - [_likeActionController toggleLikeWithSoundEnabled:_soundEnabled - analyticsParameters:[self analyticsParameters] - fromViewController:[FBSDKInternalUtility viewControllerForView:self]]; -} - -- (void)_likeActionControllerDidDisableNotification:(NSNotification *)notification -{ - [self checkImplicitlyDisabled]; -} - -- (void)_likeActionControllerDidResetNotification:(NSNotification *)notification -{ - [self _resetLikeActionController]; - [self _ensureLikeActionController:YES]; -} - -- (void)_likeActionControllerDidUpdateNotification:(NSNotification *)notification -{ - [self _ensureLikeActionController:YES]; - FBSDKLikeActionController *likeActionController = (FBSDKLikeActionController *)notification.object; - NSString *objectID = likeActionController.objectID; - if ([self.objectID isEqualToString:objectID]) { - BOOL animated = [notification.userInfo[FBSDKLikeActionControllerAnimatedKey] boolValue]; - [self _setSelected:likeActionController.objectIsLiked animated:animated]; - } -} - -- (void)_resetLikeActionController -{ - self.likeActionController = nil; - [self setNeedsLayout]; -} - -- (void)_setLikeActionController:(FBSDKLikeActionController *)likeActionController -{ - if (_likeActionController != likeActionController) { - [_likeActionController endContentAccess]; - _likeActionController = likeActionController; - [_likeActionController beginContentAccess]; - } -} - -- (void)_setSelected:(BOOL)selected animated:(BOOL)animated -{ - if (self.selected != selected) { - if (animated) { - CFTimeInterval duration = FBSDK_LIKE_BUTTON_ANIMATION_DURATION; - UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState; - UIImageView *imageView = self.imageView; - imageView.frame = [self imageRectForContentRect:UIEdgeInsetsInsetRect(self.bounds, self.contentEdgeInsets)]; - [UIView animateWithDuration:duration delay:0.0 options:options animations:^{ - CGPoint iconImageViewCenter = imageView.center; - imageView.frame = CGRectMake(iconImageViewCenter.x, iconImageViewCenter.y, 0.0, 0.0); - } completion:^(BOOL animateOutFinished) { - self.selected = selected; - CGPoint iconImageViewCenter = imageView.center; - imageView.frame = CGRectMake(iconImageViewCenter.x, iconImageViewCenter.y, 0.0, 0.0); - - void(^animations)(void) = ^{ - imageView.frame = [self imageRectForContentRect:UIEdgeInsetsInsetRect(self.bounds, self.contentEdgeInsets)]; - }; - if ([UIView respondsToSelector:@selector(animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:)]) { - [UIView animateWithDuration:(duration * 2) - delay:0.0 - usingSpringWithDamping:FBSDK_LIKE_BUTTON_ANIMATION_SPRING_DAMPING - initialSpringVelocity:FBSDK_LIKE_BUTTON_ANIMATION_SPRING_VELOCITY - options:options - animations:animations - completion:NULL]; - } else { - [UIView animateWithDuration:(duration * 2) - delay:0.0 - options:options - animations:animations - completion:NULL]; - } - }]; - } else { - self.selected = selected; - } - } -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h deleted file mode 100644 index 6ce351de2..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import -#import - -/** - NS_ENUM (NSUInteger, FBSDKLikeControlAuxiliaryPosition) - - Specifies the position of the auxiliary view relative to the like button. - */ -typedef NS_ENUM(NSUInteger, FBSDKLikeControlAuxiliaryPosition) -{ - /** The auxiliary view is inline with the like button. */ - FBSDKLikeControlAuxiliaryPositionInline, - /** The auxiliary view is above the like button. */ - FBSDKLikeControlAuxiliaryPositionTop, - /** The auxiliary view is below the like button. */ - FBSDKLikeControlAuxiliaryPositionBottom, -}; - -/** - Converts an FBSDKLikeControlAuxiliaryPosition to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKLikeControlAuxiliaryPosition(FBSDKLikeControlAuxiliaryPosition auxiliaryPosition); - -/** - NS_ENUM(NSUInteger, FBSDKLikeControlHorizontalAlignment) - - Specifies the horizontal alignment for FBSDKLikeControlStyleStandard with - FBSDKLikeControlAuxiliaryPositionTop or FBSDKLikeControlAuxiliaryPositionBottom. - */ -typedef NS_ENUM(NSUInteger, FBSDKLikeControlHorizontalAlignment) -{ - /** The subviews are left aligned. */ - FBSDKLikeControlHorizontalAlignmentLeft, - /** The subviews are center aligned. */ - FBSDKLikeControlHorizontalAlignmentCenter, - /** The subviews are right aligned. */ - FBSDKLikeControlHorizontalAlignmentRight, -}; - -/** - Converts an FBSDKLikeControlHorizontalAlignment to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKLikeControlHorizontalAlignment(FBSDKLikeControlHorizontalAlignment horizontalAlignment); - -/** - NS_ENUM (NSUInteger, FBSDKLikeControlStyle) - - Specifies the style of a like control. - */ -typedef NS_ENUM(NSUInteger, FBSDKLikeControlStyle) -{ - /** Displays the button and the social sentence. */ - FBSDKLikeControlStyleStandard = 0, - /** Displays the button and a box that contains the like count. */ - FBSDKLikeControlStyleBoxCount, -}; - -/** - Converts an FBSDKLikeControlStyle to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKLikeControlStyle(FBSDKLikeControlStyle style); - -/** - Warning: This class is deprecated. - UI control to like an object in the Facebook graph. - - - Taps on the like button within this control will invoke an API call to the Facebook app through a - fast-app-switch that allows the user to like the object. Upon return to the calling app, the view will update - with the new state and send actions for the UIControlEventValueChanged event. - */ -__attribute__ ((deprecated)) -@interface FBSDKLikeControl : UIControl - -/** - The foreground color to use for the content of the receiver. - */ -@property (nonatomic, strong) UIColor *foregroundColor; - -/** - The position for the auxiliary view for the receiver. - - -- See:FBSDKLikeControlAuxiliaryPosition - */ -@property (nonatomic, assign) FBSDKLikeControlAuxiliaryPosition likeControlAuxiliaryPosition; - -/** - The text alignment of the social sentence. - - - This value is only valid for FBSDKLikeControlStyleStandard with - FBSDKLikeControlAuxiliaryPositionTop|Bottom. - */ -@property (nonatomic, assign) FBSDKLikeControlHorizontalAlignment likeControlHorizontalAlignment; - -/** - The style to use for the receiver. - - -- See:FBSDKLikeControlStyle - */ -@property (nonatomic, assign) FBSDKLikeControlStyle likeControlStyle; - -/** - The preferred maximum width (in points) for autolayout. - - - This property affects the size of the receiver when layout constraints are applied to it. During layout, - if the text extends beyond the width specified by this property, the additional text is flowed to one or more new - lines, thereby increasing the height of the receiver. - */ -@property (nonatomic, assign) CGFloat preferredMaxLayoutWidth; - -/** - If YES, a sound is played when the receiver is toggled. - - @default YES - */ -@property (nonatomic, assign, getter = isSoundEnabled) BOOL soundEnabled; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.m deleted file mode 100644 index 6a8167a4c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.m +++ /dev/null @@ -1,664 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLikeControl.h" -#import "FBSDKLikeControl+Internal.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKLikeActionController.h" -#import "FBSDKLikeBoxView.h" -#import "FBSDKLikeButton+Internal.h" -#import "FBSDKLikeButton.h" - -#define kFBLikeControlAnimationDuration 0.2 -#define kFBLikeControlSocialSentenceAnimationOffset 10.0 - -static void *FBSDKLikeControlKVOLikeActionControllerContext = &FBSDKLikeControlKVOLikeActionControllerContext; - -NSString *NSStringFromFBSDKLikeControlAuxiliaryPosition(FBSDKLikeControlAuxiliaryPosition auxiliaryPosition) -{ - switch (auxiliaryPosition) { - case FBSDKLikeControlAuxiliaryPositionBottom: - return @"bottom"; - case FBSDKLikeControlAuxiliaryPositionInline: - return @"inline"; - case FBSDKLikeControlAuxiliaryPositionTop: - return @"top"; - } - return nil; -} - -NSString *NSStringFromFBSDKLikeControlHorizontalAlignment(FBSDKLikeControlHorizontalAlignment horizontalAlignment) -{ - switch (horizontalAlignment) { - case FBSDKLikeControlHorizontalAlignmentCenter: - return @"center"; - case FBSDKLikeControlHorizontalAlignmentLeft: - return @"left"; - case FBSDKLikeControlHorizontalAlignmentRight: - return @"right"; - } - return nil; -} - -NSString *NSStringFromFBSDKLikeControlStyle(FBSDKLikeControlStyle style) -{ - switch (style) { - case FBSDKLikeControlStyleBoxCount: - return @"box_count"; - case FBSDKLikeControlStyleStandard: - return @"standard"; - } - return nil; -} - -typedef struct FBSDKLikeControlLayout -{ - CGSize contentSize; - CGRect likeButtonFrame; - CGRect auxiliaryViewFrame; -} FBSDKLikeControlLayout; - -typedef CGSize (^fbsdk_like_control_sizing_block_t)(UIView *subview, CGSize constrainedSize); - -@implementation FBSDKLikeControl -{ - BOOL _isExplicitlyDisabled; - FBSDKLikeBoxView *_likeBoxView; - FBSDKLikeButton *_likeButton; - UIView *_likeButtonContainer; - UILabel *_socialSentenceLabel; -} - -#pragma mark - Class Methods - -+ (void)initialize -{ - if ([FBSDKLikeControl class] == self) { - // ensure that we have updated the dialog configs if we haven't already - [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; - } -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithFrame:(CGRect)frame -{ - if ((self = [super initWithFrame:frame])) { - [self _initializeContent]; - if (CGRectEqualToRect(frame, CGRectZero)) { - [self sizeToFit]; - } - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [super initWithCoder:decoder])) { - [self _initializeContent]; - } - return self; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [_likeButton removeObserver:self forKeyPath:@"likeActionController"]; -} - -#pragma mark - Properties - -- (void)setBackgroundColor:(UIColor *)backgroundColor -{ - [super setBackgroundColor:backgroundColor]; - _likeButtonContainer.backgroundColor = backgroundColor; -} - -- (void)setForegroundColor:(UIColor *)foregroundColor -{ - if (![_foregroundColor isEqual:foregroundColor]) { - _foregroundColor = foregroundColor; - [_likeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - _socialSentenceLabel.textColor = foregroundColor; - } -} - -- (void)setEnabled:(BOOL)enabled -{ - _isExplicitlyDisabled = !enabled; - [self _updateEnabled]; -} - -- (void)setLikeControlAuxiliaryPosition:(FBSDKLikeControlAuxiliaryPosition)likeControlAuxiliaryPosition -{ - if (_likeControlAuxiliaryPosition != likeControlAuxiliaryPosition) { - _likeControlAuxiliaryPosition = likeControlAuxiliaryPosition; - [self _updateLikeBoxCaretPosition]; - [self setNeedsLayout]; - [self setNeedsUpdateConstraints]; - [self invalidateIntrinsicContentSize]; - } -} - -- (void)setLikeControlHorizontalAlignment:(FBSDKLikeControlHorizontalAlignment)likeControlHorizontalAlignment -{ - if (_likeControlHorizontalAlignment != likeControlHorizontalAlignment) { - _likeControlHorizontalAlignment = likeControlHorizontalAlignment; - [self _updateLikeBoxCaretPosition]; - [self setNeedsLayout]; - [self setNeedsUpdateConstraints]; - [self invalidateIntrinsicContentSize]; - } -} - -- (void)setLikeControlStyle:(FBSDKLikeControlStyle)likeControlStyle -{ - if (_likeControlStyle != likeControlStyle) { - _likeControlStyle = likeControlStyle; - [self _updateLikeBoxCaretPosition]; - [self setNeedsLayout]; - [self setNeedsUpdateConstraints]; - [self invalidateIntrinsicContentSize]; - } -} - -- (NSString *)objectID -{ - return _likeButton.objectID; -} - -- (void)setObjectID:(NSString *)objectID -{ - if (![_likeButton.objectID isEqualToString:objectID]) { - _likeButton.objectID = objectID; - [self _updateEnabled]; - [self setNeedsLayout]; - } -} - -- (FBSDKLikeObjectType)objectType -{ - return _likeButton.objectType; -} - -- (void)setObjectType:(FBSDKLikeObjectType)objectType -{ - if (_likeButton.objectType != objectType) { - _likeButton.objectType = objectType; - [self setNeedsLayout]; - } -} - -- (void)setOpaque:(BOOL)opaque -{ - [super setOpaque:opaque]; - _likeButtonContainer.opaque = opaque; -} - -- (BOOL)isSoundEnabled -{ - return _likeButton.soundEnabled; -} - -- (void)setSoundEnabled:(BOOL)soundEnabled -{ - _likeButton.soundEnabled = soundEnabled; -} - -#pragma mark - Layout - -- (CGSize)intrinsicContentSize -{ - CGFloat width = self.preferredMaxLayoutWidth; - if (width == 0) { - width = CGFLOAT_MAX; - } - CGRect bounds = CGRectMake(0.0, 0.0, width, CGFLOAT_MAX); - return [self _layoutWithBounds:bounds subviewSizingBlock:^CGSize(UIView *subview, CGSize constrainedSize) { - if ([subview respondsToSelector:@selector(setPreferredMaxLayoutWidth:)]) { - [(id)subview setPreferredMaxLayoutWidth:constrainedSize.width]; - } - return subview.intrinsicContentSize; - }].contentSize; -} - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - NSString *objectID = self.objectID; - if (objectID) { - FBSDKViewImpressionTracker *impressionTracker = - [FBSDKViewImpressionTracker impressionTrackerWithEventName:FBSDKAppEventNameFBSDKLikeControlImpression]; - [impressionTracker logImpressionWithIdentifier:objectID parameters:[self analyticsParameters]]; - } - - [self _ensureLikeActionController]; - - CGRect bounds = self.bounds; - CGSize(^sizingBlock)(UIView *, CGSize) = ^CGSize(UIView *subview, CGSize constrainedSize) { - return [subview sizeThatFits:constrainedSize]; - }; - FBSDKLikeControlLayout layout = [self _layoutWithBounds:bounds subviewSizingBlock:sizingBlock]; - - UIView *auxiliaryView = [self _auxiliaryView]; - _likeBoxView.hidden = (_likeBoxView != auxiliaryView); - _socialSentenceLabel.hidden = (_socialSentenceLabel != auxiliaryView); - - _likeButtonContainer.frame = layout.likeButtonFrame; - _likeButton.frame = _likeButtonContainer.bounds; - auxiliaryView.frame = layout.auxiliaryViewFrame; -} - -- (CGSize)sizeThatFits:(CGSize)size -{ - switch (self.likeControlAuxiliaryPosition) { - case FBSDKLikeControlAuxiliaryPositionInline:{ - size.height = MAX(size.height, CGRectGetHeight(self.bounds)); - break; - } - case FBSDKLikeControlAuxiliaryPositionTop: - case FBSDKLikeControlAuxiliaryPositionBottom:{ - size.width = MAX(size.width, CGRectGetWidth(self.bounds)); - break; - } - } - - CGRect bounds = CGRectMake(0.0, 0.0, size.width, size.height); - return [self _layoutWithBounds:bounds subviewSizingBlock:^CGSize(UIView *subview, CGSize constrainedSize) { - return [subview sizeThatFits:constrainedSize]; - }].contentSize; -} - -#pragma mark - Internal Methods - -- (NSDictionary *)analyticsParameters -{ - return @{ - @"auxiliary_position": NSStringFromFBSDKLikeControlAuxiliaryPosition(self.likeControlAuxiliaryPosition), - @"horizontal_alignment": NSStringFromFBSDKLikeControlHorizontalAlignment(self.likeControlHorizontalAlignment), - @"object_id": (self.objectID ?: [NSNull null]), - @"object_type": (NSStringFromFBSDKLikeObjectType(self.objectType) ?: [NSNull null]), - @"sound_enabled": @(self.soundEnabled), - @"style": NSStringFromFBSDKLikeControlStyle(self.likeControlStyle), - }; -} - -#pragma mark - Helper Methods - -- (UIView *)_auxiliaryView -{ - [self _ensureLikeActionController]; - switch (_likeControlStyle) { - case FBSDKLikeControlStyleStandard:{ - return (_socialSentenceLabel.text.length == 0 ? nil : _socialSentenceLabel); - } - case FBSDKLikeControlStyleBoxCount:{ - return (_likeButton.likeActionController.likeCountString == nil ? nil : _likeBoxView); - } - } - return nil; -} - -- (CGFloat)_auxiliaryViewPadding -{ - switch (_likeControlStyle) { - case FBSDKLikeControlStyleStandard:{ - return 8.0; - } - case FBSDKLikeControlStyleBoxCount:{ - return 0.0; - } - } - return 0.0; -} - -- (void)_ensureLikeActionController -{ - FBSDKLikeActionController *likeActionController = _likeButton.likeActionController; - if (likeActionController) { - _socialSentenceLabel.text = likeActionController.socialSentence; - _likeBoxView.text = likeActionController.likeCountString; - } -} - -- (void)_handleLikeButtonTap:(FBSDKLikeButton *)likeButton -{ - [self _ensureLikeActionController]; - [self sendActionsForControlEvents:UIControlEventTouchUpInside]; -} - -- (void)_initializeContent -{ - self.backgroundColor = [UIColor clearColor]; - _foregroundColor = [UIColor blackColor]; - - _likeButtonContainer = [[UIView alloc] initWithFrame:CGRectZero]; - _likeButtonContainer.backgroundColor = self.backgroundColor; - _likeButtonContainer.opaque = self.opaque; - [self addSubview:_likeButtonContainer]; - - _likeButton = [[FBSDKLikeButton alloc] initWithFrame:CGRectZero]; - [_likeButton addTarget:self action:@selector(_handleLikeButtonTap:) forControlEvents:UIControlEventTouchUpInside]; - [_likeButtonContainer addSubview:_likeButton]; - - _socialSentenceLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _socialSentenceLabel.font = [UIFont systemFontOfSize:11.0]; - _socialSentenceLabel.numberOfLines = 2; - [self addSubview:_socialSentenceLabel]; - - _likeBoxView = [[FBSDKLikeBoxView alloc] initWithFrame:CGRectZero]; - [self addSubview:_likeBoxView]; - - // use KVO to monitor changes to the likeActionController instance on FBSDKButton in order to avoid race conditions - // between notification observers - [_likeButton addObserver:self - forKeyPath:@"likeActionController" - options:NSKeyValueObservingOptionInitial - context:FBSDKLikeControlKVOLikeActionControllerContext]; - - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:self - selector:@selector(_likeActionControllerDidDisableNotification:) - name:FBSDKLikeActionControllerDidDisableNotification - object:nil]; - [nc addObserver:self - selector:@selector(_likeActionControllerDidUpdateNotification:) - name:FBSDKLikeActionControllerDidUpdateNotification - object:nil]; -} - -- (void)observeValueForKeyPath:(NSString *)keyPath - ofObject:(id)object - change:(NSDictionary *)change - context:(void *)context -{ - if (context == FBSDKLikeControlKVOLikeActionControllerContext) { - [self _likeActionControllerDidUpdateWithAnimated:NO]; - } else { - [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; - } -} - -static void FBSDKLikeControlApplyHorizontalAlignment(CGRect *frameRef, - CGRect bounds, - FBSDKLikeControlHorizontalAlignment alignment) -{ - if (frameRef == NULL) { - return; - } - - CGRect frame = *frameRef; - switch (alignment) { - case FBSDKLikeControlHorizontalAlignmentLeft:{ - frame.origin.x = CGRectGetMinX(bounds); - break; - } - case FBSDKLikeControlHorizontalAlignmentCenter:{ - frame.origin.x = CGRectGetMinX(bounds) + floorf((CGRectGetWidth(bounds) - CGRectGetWidth(frame)) / 2); - break; - } - case FBSDKLikeControlHorizontalAlignmentRight:{ - frame.origin.x = CGRectGetMinX(bounds) + CGRectGetWidth(bounds) - CGRectGetWidth(frame); - break; - } - } - *frameRef = frame; -} - -static CGFloat FBSDKLikeControlPaddedDistance(CGFloat distance, CGFloat padding, BOOL includeDistance) -{ - return (distance == 0.0 ? 0.0 : (includeDistance ? distance : 0.0) + padding); -} - -static CGSize FBSDKLikeControlCalculateContentSize(FBSDKLikeControlLayout layout) -{ - return CGSizeMake(MAX(CGRectGetMaxX(layout.likeButtonFrame), CGRectGetMaxX(layout.auxiliaryViewFrame)), - MAX(CGRectGetMaxY(layout.likeButtonFrame), CGRectGetMaxY(layout.auxiliaryViewFrame))); - -} - -- (FBSDKLikeControlLayout)_layoutWithBounds:(CGRect)bounds - subviewSizingBlock:(fbsdk_like_control_sizing_block_t)subviewSizingBlock -{ - FBSDKLikeControlLayout layout; - - CGSize likeButtonSize = subviewSizingBlock(_likeButton, bounds.size); - layout.likeButtonFrame = CGRectMake(CGRectGetMinX(bounds), - CGRectGetMinY(bounds), - likeButtonSize.width, - likeButtonSize.height); - layout.auxiliaryViewFrame = CGRectZero; - - UIView *auxiliaryView = [self _auxiliaryView]; - CGFloat auxiliaryViewPadding = [self _auxiliaryViewPadding]; - CGSize auxiliaryViewSize = CGSizeZero; - switch (self.likeControlAuxiliaryPosition) { - case FBSDKLikeControlAuxiliaryPositionInline:{ - if (auxiliaryView) { - auxiliaryViewSize = CGSizeMake((CGRectGetWidth(bounds) - - auxiliaryViewPadding - - CGRectGetWidth(layout.likeButtonFrame)), - CGRectGetHeight(bounds)); - auxiliaryViewSize = subviewSizingBlock(auxiliaryView, auxiliaryViewSize); - - layout.auxiliaryViewFrame = CGRectMake(CGRectGetMinX(bounds), - CGRectGetMinY(bounds), - auxiliaryViewSize.width, - MAX(auxiliaryViewSize.height, - CGRectGetHeight(layout.likeButtonFrame))); - } - - // align the views next to each other for sizing - FBSDKLikeControlApplyHorizontalAlignment(&layout.likeButtonFrame, - bounds, - FBSDKLikeControlHorizontalAlignmentLeft); - if (auxiliaryView) { - layout.auxiliaryViewFrame.origin.x = CGRectGetMaxX(layout.likeButtonFrame) + auxiliaryViewPadding; - } - - // calculate the size before offsetting the horizontal alignment, using the total calculated width - layout.contentSize = FBSDKLikeControlCalculateContentSize(layout); - - // layout the subviews next to each other - switch (self.likeControlHorizontalAlignment) { - case FBSDKLikeControlHorizontalAlignmentLeft:{ - // already done - break; - } - case FBSDKLikeControlHorizontalAlignmentCenter:{ - layout.likeButtonFrame.origin.x = floorf((CGRectGetWidth(bounds) - layout.contentSize.width) / 2); - if (auxiliaryView) { - layout.auxiliaryViewFrame.origin.x = (CGRectGetMaxX(layout.likeButtonFrame) + - auxiliaryViewPadding); - } - break; - } - case FBSDKLikeControlHorizontalAlignmentRight:{ - layout.likeButtonFrame.origin.x = CGRectGetMaxX(bounds) - CGRectGetWidth(layout.likeButtonFrame); - if (auxiliaryView) { - layout.auxiliaryViewFrame.origin.x = (CGRectGetMinX(layout.likeButtonFrame) - - auxiliaryViewPadding - - CGRectGetWidth(layout.auxiliaryViewFrame)); - } - break; - } - } - - break; - } - case FBSDKLikeControlAuxiliaryPositionTop:{ - if (auxiliaryView) { - auxiliaryViewSize = CGSizeMake(CGRectGetWidth(bounds), - (CGRectGetHeight(bounds) - - auxiliaryViewPadding - - CGRectGetHeight(layout.likeButtonFrame))); - auxiliaryViewSize = subviewSizingBlock(auxiliaryView, auxiliaryViewSize); - - layout.auxiliaryViewFrame = CGRectMake(CGRectGetMinX(bounds), - CGRectGetMinY(bounds), - MAX(auxiliaryViewSize.width, - CGRectGetWidth(layout.likeButtonFrame)), - auxiliaryViewSize.height); - } - layout.likeButtonFrame.origin.y = FBSDKLikeControlPaddedDistance(CGRectGetMaxY(layout.auxiliaryViewFrame), - auxiliaryViewPadding, - YES); - - // calculate the size before offsetting the horizontal alignment, using the total calculated width - layout.contentSize = FBSDKLikeControlCalculateContentSize(layout); - - FBSDKLikeControlApplyHorizontalAlignment(&layout.likeButtonFrame, bounds, self.likeControlHorizontalAlignment); - FBSDKLikeControlApplyHorizontalAlignment(&layout.auxiliaryViewFrame, - bounds, - self.likeControlHorizontalAlignment); - break; - } - case FBSDKLikeControlAuxiliaryPositionBottom:{ - if (auxiliaryView) { - auxiliaryViewSize = CGSizeMake(CGRectGetWidth(bounds), - (CGRectGetHeight(bounds) - - auxiliaryViewPadding - - CGRectGetHeight(layout.likeButtonFrame))); - auxiliaryViewSize = subviewSizingBlock(auxiliaryView, auxiliaryViewSize); - - layout.auxiliaryViewFrame = CGRectMake(CGRectGetMinX(bounds), - CGRectGetMaxY(layout.likeButtonFrame) + auxiliaryViewPadding, - MAX(auxiliaryViewSize.width, - CGRectGetWidth(layout.likeButtonFrame)), - auxiliaryViewSize.height); - } - - // calculate the size before offsetting the horizontal alignment, using the total calculated width - layout.contentSize = FBSDKLikeControlCalculateContentSize(layout); - - FBSDKLikeControlApplyHorizontalAlignment(&layout.likeButtonFrame, bounds, self.likeControlHorizontalAlignment); - FBSDKLikeControlApplyHorizontalAlignment(&layout.auxiliaryViewFrame, - bounds, - self.likeControlHorizontalAlignment); - break; - } - } - - return layout; -} - -- (void)_likeActionControllerDidDisableNotification:(NSNotification *)notification -{ - [self _updateEnabled]; -} - -- (void)_likeActionControllerDidUpdateNotification:(NSNotification *)notification -{ - [self _ensureLikeActionController]; - FBSDKLikeActionController *likeActionController = (FBSDKLikeActionController *)notification.object; - NSString *objectID = likeActionController.objectID; - if ([self.objectID isEqualToString:objectID]) { - BOOL animated = [notification.userInfo[FBSDKLikeActionControllerAnimatedKey] boolValue]; - [self _likeActionControllerDidUpdateWithAnimated:animated]; - } -} - -- (void)_likeActionControllerDidUpdateWithAnimated:(BOOL)animated -{ - FBSDKLikeActionController *likeActionController = _likeButton.likeActionController; - NSString *objectID = likeActionController.objectID; - if ([self.objectID isEqualToString:objectID]) { - _likeBoxView.text = _likeButton.likeActionController.likeCountString; - - if (animated) { - void(^hideView)(UIView *) = ^(UIView *view){ - view.alpha = 0.0; - CGRect frame = view.frame; - frame.origin.y += kFBLikeControlSocialSentenceAnimationOffset; - view.frame = frame; - }; - [UIView animateWithDuration:kFBLikeControlAnimationDuration animations:^{ - hideView(_socialSentenceLabel); - } completion:^(BOOL finished) { - _socialSentenceLabel.text = likeActionController.socialSentence; - [self setNeedsLayout]; - [self setNeedsUpdateConstraints]; - [self invalidateIntrinsicContentSize]; - [self layoutIfNeeded]; - hideView(_socialSentenceLabel); - - [UIView animateWithDuration:kFBLikeControlAnimationDuration animations:^{ - _socialSentenceLabel.alpha = 1.0; - [self setNeedsLayout]; - [self layoutIfNeeded]; - }]; - }]; - } else { - _socialSentenceLabel.text = likeActionController.socialSentence; - [self setNeedsLayout]; - [self setNeedsUpdateConstraints]; - [self invalidateIntrinsicContentSize]; - } - - [self sendActionsForControlEvents:UIControlEventValueChanged]; - } -} - -- (void)_updateEnabled -{ - BOOL enabled = (!_isExplicitlyDisabled && - self.objectID && - ![FBSDKLikeActionController isDisabled]); - BOOL currentEnabled = [self isEnabled]; - [super setEnabled:enabled]; - if (currentEnabled != enabled) { - [self invalidateIntrinsicContentSize]; - [self setNeedsLayout]; - } -} - -- (void)_updateLikeBoxCaretPosition -{ - if (self.likeControlStyle != FBSDKLikeControlStyleBoxCount) { - return; - } - - switch (self.likeControlAuxiliaryPosition) { - case FBSDKLikeControlAuxiliaryPositionInline:{ - switch (self.likeControlHorizontalAlignment) { - case FBSDKLikeControlHorizontalAlignmentLeft: - case FBSDKLikeControlHorizontalAlignmentCenter:{ - _likeBoxView.caretPosition = FBSDKLikeBoxCaretPositionLeft; - break; - } - case FBSDKLikeControlHorizontalAlignmentRight:{ - _likeBoxView.caretPosition = FBSDKLikeBoxCaretPositionRight; - break; - } - } - break; - } - case FBSDKLikeControlAuxiliaryPositionTop:{ - _likeBoxView.caretPosition = FBSDKLikeBoxCaretPositionBottom; - break; - } - case FBSDKLikeControlAuxiliaryPositionBottom:{ - _likeBoxView.caretPosition = FBSDKLikeBoxCaretPositionTop; - break; - } - } -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h deleted file mode 100644 index c52f3022c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - NS_ENUM (NSUInteger, FBSDKLikeObjectType) - Specifies the type of object referenced by the objectID for likes. - */ -typedef NS_ENUM(NSUInteger, FBSDKLikeObjectType) -{ - /** The objectID refers to an unknown object type. */ - FBSDKLikeObjectTypeUnknown = 0, - /** The objectID refers to an Open Graph object. */ - FBSDKLikeObjectTypeOpenGraph, - /** The objectID refers to an Page object. */ - FBSDKLikeObjectTypePage, -}; - -/** - Converts an FBLikeControlObjectType to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKLikeObjectType(FBSDKLikeObjectType objectType); diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.m deleted file mode 100644 index 273fab124..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.m +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLikeObjectType.h" - -NSString *NSStringFromFBSDKLikeObjectType(FBSDKLikeObjectType objectType) -{ - switch (objectType) { - case FBSDKLikeObjectTypeUnknown: - return @"unknown"; - case FBSDKLikeObjectTypeOpenGraph: - return @"open_graph"; - case FBSDKLikeObjectTypePage: - return @"page"; - } - return nil; -} diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h deleted file mode 100644 index 78855be84..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - The common interface for components that initiate liking. - -- See:FBSDKLikeButton - -- See:FBSDKLikeControl - */ -@protocol FBSDKLiking - -/** - The objectID for the object to like. - - - This value may be an Open Graph object ID or a string representation of an URL that describes an - Open Graph object. The objects may be public objects, like pages, or objects that are defined by your application. - */ -@property (nonatomic, copy) NSString *objectID; - -/** - The type of object referenced by the objectID. - - - If the objectType is unknown, the control will determine the objectType by querying the server with the - objectID. Specifying a value for the objectType is an optimization that should be used if the type is known by the - consumer. Consider setting the objectType if it is known when setting the objectID. - */ -@property (nonatomic, assign) FBSDKLikeObjectType objectType; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h deleted file mode 100644 index 860988081..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - A dialog for sharing content through Messenger. - */ -@interface FBSDKMessageDialog : NSObject - -/** - Convenience method to show a Message Share Dialog with content and a delegate. - - Parameter content: The content to be shared. - - Parameter delegate: The receiver's delegate. - */ -+ (instancetype)showWithContent:(id)content delegate:(id)delegate; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.m deleted file mode 100644 index c98f52621..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.m +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKMessageDialog.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareConstants.h" -#import "FBSDKShareDefines.h" -#import "FBSDKShareError.h" -#import "FBSDKShareMessengerGenericTemplateContent.h" -#import "FBSDKShareMessengerMediaTemplateContent.h" -#import "FBSDKShareMessengerOpenGraphMusicTemplateContent.h" -#import "FBSDKShareOpenGraphContent.h" -#import "FBSDKShareUtility.h" -#import "FBSDKShareVideoContent.h" - -#define FBSDK_MESSAGE_DIALOG_APP_SCHEME @"fb-messenger-share-api" - -@implementation FBSDKMessageDialog - -#pragma mark - Class Methods - -+ (void)initialize -{ - if ([FBSDKMessageDialog class] == self) { - [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_MESSENGER]; - [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; - } -} - -+ (instancetype)showWithContent:(id)content delegate:(id)delegate -{ - FBSDKMessageDialog *dialog = [[self alloc] init]; - dialog.shareContent = content; - dialog.delegate = delegate; - [dialog show]; - return dialog; -} - -#pragma mark - Properties - -@synthesize delegate = _delegate; -@synthesize shareContent = _shareContent; -@synthesize shouldFailOnDataError = _shouldFailOnDataError; - -#pragma mark - Public Methods - -- (BOOL)canShow -{ - return [self _canShowNative]; -} - -- (BOOL)show -{ - NSError *error; - if (![self canShow]) { - error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode - message:@"Message dialog is not available."]; - [self _invokeDelegateDidFailWithError:error]; - return NO; - } - if (![self validateWithError:&error]) { - [self _invokeDelegateDidFailWithError:error]; - return NO; - } - - id shareContent = self.shareContent; - NSDictionary *parameters = [FBSDKShareUtility parametersForShareContent:shareContent - shouldFailOnDataError:self.shouldFailOnDataError]; - NSString *methodName = ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]] ? - FBSDK_SHARE_OPEN_GRAPH_METHOD_NAME : - FBSDK_SHARE_METHOD_NAME); - FBSDKBridgeAPIRequest *request; - request = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeNative - scheme:FBSDK_MESSAGE_DIALOG_APP_SCHEME - methodName:methodName - methodVersion:nil - parameters:parameters - userInfo:nil]; - FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - BOOL useSafariViewController = [configuration useSafariViewControllerForDialogName:FBSDKDialogConfigurationNameMessage]; - FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { - [self _handleCompletionWithDialogResults:response.responseParameters response:response]; - [FBSDKInternalUtility unregisterTransientObject:self]; - }; - [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:request - useSafariViewController:useSafariViewController - fromViewController:nil - completionBlock:completionBlock]; - - [self _logDialogShow]; - [FBSDKInternalUtility registerTransientObject:self]; - return YES; -} - -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef -{ - id shareContent = self.shareContent; - if (!shareContent) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"shareContent" message:nil]; - } - return NO; - } - if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - if (![FBSDKShareUtility validateAssetLibraryURLWithShareVideoContent:(FBSDKShareVideoContent *)shareContent name:@"videoURL" error:errorRef]) { - return NO; - } - } - if ([shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"shareContent" - message:@"Message dialog does not support camera content."]; - } - return NO; - } - return [FBSDKShareUtility validateShareContent:self.shareContent error:errorRef]; -} - -#pragma mark - Helper Methods - -- (BOOL)_canShowNative -{ - FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - BOOL useNativeDialog = [configuration useNativeDialogForDialogName:FBSDKDialogConfigurationNameMessage]; - return (useNativeDialog && [FBSDKInternalUtility isMessengerAppInstalled]); -} - -- (void)_handleCompletionWithDialogResults:(NSDictionary *)results response:(FBSDKBridgeAPIResponse *)response -{ - NSString *completionGesture = results[FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; - if ([completionGesture isEqualToString:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_CANCEL] || - response.isCancelled) { - [self _invokeDelegateDidCancel]; - } else if (response.error) { - [self _invokeDelegateDidFailWithError:response.error]; - } else { - [self _invokeDelegateDidCompleteWithResults:results]; - } -} - -- (void)_invokeDelegateDidCancel -{ - NSDictionary * parameters =@{ - FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Cancelled, - }; - - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventMessengerShareDialogResult - valueToSum:nil - parameters:parameters - accessToken:[FBSDKAccessToken currentAccessToken]]; - - if (!_delegate) { - return; - } - - [_delegate sharerDidCancel:self]; -} - -- (void)_invokeDelegateDidCompleteWithResults:(NSDictionary *)results -{ - NSDictionary * parameters =@{ - FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Completed, - }; - - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventMessengerShareDialogResult - valueToSum:nil - parameters:parameters - accessToken:[FBSDKAccessToken currentAccessToken]]; - - if (!_delegate) { - return; - } - - [_delegate sharer:self didCompleteWithResults:[results copy]]; -} - -- (void)_invokeDelegateDidFailWithError:(NSError *)error -{ - NSMutableDictionary * parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys:FBSDKAppEventsDialogOutcomeValue_Failed, FBSDKAppEventParameterDialogOutcome, nil]; - if (error) { - parameters[FBSDKAppEventParameterDialogErrorMessage] = [NSString stringWithFormat:@"%@", error]; - } - - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventMessengerShareDialogResult - valueToSum:nil - parameters:parameters - accessToken:[FBSDKAccessToken currentAccessToken]]; - - if (!_delegate) { - return; - } - - [_delegate sharer:self didFailWithError:error]; -} - -- (void)_logDialogShow -{ - NSString *contentType; - if([self.shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypeOpenGraph; - } else if ([self.shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypeStatus; - } else if ([self.shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypePhoto; - } else if ([self.shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypeVideo; - } else if ([self.shareContent isKindOfClass:[FBSDKShareMessengerGenericTemplateContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypeMessengerGenericTemplate; - } else if ([self.shareContent isKindOfClass:[FBSDKShareMessengerMediaTemplateContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypeMessengerMediaTemplate; - } else if ([self.shareContent isKindOfClass:[FBSDKShareMessengerOpenGraphMusicTemplateContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypeMessengerOpenGraphMusicTemplate; - } else { - contentType = FBSDKAppEventsDialogShareContentTypeUnknown; - } - - NSDictionary *parameters = @{FBSDKAppEventParameterDialogShareContentType : contentType, - FBSDKAppEventParameterDialogShareContentUUID : self.shareContent.shareUUID ?: [NSNull null], - FBSDKAppEventParameterDialogShareContentPageID : self.shareContent.pageID ?: [NSNull null]}; - - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventMessengerShareDialogShow - valueToSum:nil - parameters:parameters - accessToken:[FBSDKAccessToken currentAccessToken]]; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h deleted file mode 100644 index 8dc40ac8b..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import - -/** - A button to send content through Messenger. - - Tapping the receiver will invoke the FBSDKShareDialog with the attached shareContent. If the dialog cannot - be shown, the button will be disable. - */ -@interface FBSDKSendButton : FBSDKButton - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.m deleted file mode 100644 index cc0ee18dc..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.m +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKSendButton.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKMessageDialog.h" -#import "FBSDKMessengerIcon.h" - -@interface FBSDKSendButton () -@end - -@implementation FBSDKSendButton -{ - FBSDKMessageDialog *_dialog; -} - -#pragma mark - Properties - -- (id)shareContent -{ - return _dialog.shareContent; -} - -- (void)setShareContent:(id)shareContent -{ - _dialog.shareContent = shareContent; - [self checkImplicitlyDisabled]; -} - -#pragma mark - FBSDKButtonImpressionTracking - -- (NSDictionary *)analyticsParameters -{ - return nil; -} - -- (NSString *)impressionTrackingEventName -{ - return FBSDKAppEventNameFBSDKSendButtonImpression; -} - -- (NSString *)impressionTrackingIdentifier -{ - return @"send"; -} - -#pragma mark - FBSDKButton - -- (void)configureButton -{ - NSString *title = - NSLocalizedStringWithDefaultValue(@"SendButton.Send", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Send", - @"The label for FBSDKSendButton"); - - UIColor *backgroundColor = [UIColor colorWithRed:0.0 green:132.0/255.0 blue:1.0 alpha:1.0]; - UIColor *highlightedColor = [UIColor colorWithRed:0.0 green:111.0/255.0 blue:1.0 alpha:1.0]; - - [self configureWithIcon:[[FBSDKMessengerIcon alloc] init] - title:title - backgroundColor:backgroundColor - highlightedColor:highlightedColor]; - - [self addTarget:self action:@selector(_share:) forControlEvents:UIControlEventTouchUpInside]; - _dialog = [[FBSDKMessageDialog alloc] init]; -} - -- (BOOL)isImplicitlyDisabled -{ - return ![_dialog canShow] || ![_dialog validateWithError:NULL]; -} - -#pragma mark - Helper Methods - -- (void)_share:(id)sender -{ - [self logTapEventWithEventName:FBSDKAppEventNameFBSDKSendButtonDidTap parameters:[self analyticsParameters]]; - [_dialog show]; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h deleted file mode 100644 index bf53883b5..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import -#import - -/** - A utility class for sharing through the graph API. Using this class requires an access token that - has been granted the "publish_actions" permission. - - FBSDKShareAPI network requests are scheduled on the current run loop in the default run loop mode - (like NSURLConnection). If you want to use FBSDKShareAPI in a background thread, you must manage the run loop - yourself. - */ -@interface FBSDKShareAPI : NSObject - -/** - Convenience method to build up a share API with content and a delegate. - - Parameter content: The content to be shared. - - Parameter delegate: The receiver's delegate. - */ -+ (instancetype)shareWithContent:(id)content delegate:(id)delegate; - -/** - The message the person has provided through the custom dialog that will accompany the share content. - */ -@property (nonatomic, copy) NSString *message; - -/** - The graph node to which content should be shared. - */ -@property (nonatomic, copy) NSString *graphNode; - -/** - The access token used when performing a share. The access token must have the "publish_actions" - permission granted. - - Defaults to [FBSDKAccessToken currentAccessToken]. Setting this to nil will revert the access token to - [FBSDKAccessToken currentAccessToken]. - */ -@property (nonatomic, strong) FBSDKAccessToken *accessToken; - -/** - A Boolean value that indicates whether the receiver can send the share. - - May return NO if the appropriate Facebook app is not installed and is required or an access token is - required but not available. This method does not validate the content on the receiver, so this can be checked before - building up the content. - -- See:[FBSDKSharing validateWithError:] - - Returns: YES if the receiver can send, otherwise NO. - */ -- (BOOL)canShare; - -/** - Creates an User Owned Open Graph object without an action. - - Parameter openGraphObject: The open graph object to create. - - Use this method to create an object alone, when an action is not going to be posted with the object. If - the object will be used within an action, just put the object in the action and share that as the shareContent and the - object will be created in the process. The delegate will be messaged with the results. - - Also see https://developers.facebook.com/docs/sharing/opengraph/object-api#objectapi-creatinguser - - - Returns: YES if the receiver was able to send the request to create the object, otherwise NO. - */ -- (BOOL)createOpenGraphObject:(FBSDKShareOpenGraphObject *)openGraphObject; - -/** - Begins the send from the receiver. - - Returns: YES if the receiver was able to send the share, otherwise NO. - */ -- (BOOL)share; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.m deleted file mode 100644 index d95292045..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.m +++ /dev/null @@ -1,822 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareAPI.h" - -#if !TARGET_OS_TV -#import -#endif - -#import -#import - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareConstants.h" -#import "FBSDKShareDefines.h" -#import "FBSDKShareError.h" -#import "FBSDKShareLinkContent.h" -#import "FBSDKShareOpenGraphAction.h" -#import "FBSDKShareOpenGraphContent.h" -#import "FBSDKShareOpenGraphObject.h" -#import "FBSDKSharePhoto.h" -#import "FBSDKSharePhotoContent.h" -#import "FBSDKShareUtility.h" -#import "FBSDKShareVideo.h" -#import "FBSDKShareVideoContent.h" -#import "FBSDKVideoUploader.h" - -static NSString *const FBSDKShareAPIDefaultGraphNode = @"me"; -static NSString *const FBSDKShareAPIPhotosEdge = @"photos"; -static NSString *const FBSDKShareAPIVideosEdge = @"videos"; -static NSMutableArray *g_pendingFBSDKShareAPI; - -@interface FBSDKShareAPI () -@end - -@implementation FBSDKShareAPI { - NSFileHandle *_fileHandle; -#if !TARGET_OS_TV - ALAssetRepresentation *_assetRepresentation; -#endif -} - -#pragma mark - Class Methods - -+ (instancetype)shareWithContent:(id)content delegate:(id)delegate -{ - FBSDKShareAPI *API = [[self alloc] init]; - API.shareContent = content; - API.delegate = delegate; - [API share]; - return API; -} - -#pragma mark - Properties - -@synthesize delegate = _delegate; -@synthesize shareContent = _shareContent; -@synthesize shouldFailOnDataError = _shouldFailOnDataError; -@synthesize accessToken = _accessToken; - -#pragma mark - Object Lifecycle - -#if !TARGET_OS_TV -+ (ALAssetsLibrary *)defaultAssetsLibrary { - static dispatch_once_t pred = 0; - static ALAssetsLibrary *library = nil; - dispatch_once(&pred, ^{ - library = [[fbsdkdfl_ALAssetsLibraryClass() alloc] init]; - }); - return library; -} -#endif - -+ (void)initialize -{ - if (self == [FBSDKShareAPI class]) { - g_pendingFBSDKShareAPI = [[NSMutableArray alloc] init]; - } -} - -- (instancetype)init -{ - if ((self = [super init])) { - _graphNode = FBSDKShareAPIDefaultGraphNode; - } - return self; -} - -#pragma mark - Public Methods - -- (BOOL)canShare -{ - return YES; -} - -- (BOOL)createOpenGraphObject:(FBSDKShareOpenGraphObject *)openGraphObject -{ - NSError *error; - if (![self canShare]) { - NSString *message = @"Share API is not available; verify 'canShare' returns YES"; - error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode message:message]; - [_delegate sharer:self didFailWithError:error]; - return NO; - } - if (![self _hasPublishActions]) { - NSString *message = @"Warning: Access token is missing publish_actions permissions"; - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:message]; - } - if (!openGraphObject) { - error = [FBSDKShareError requiredArgumentErrorWithName:@"openGraphObject" message:nil]; - [_delegate sharer:self didFailWithError:error]; - return NO; - } - - FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; - void(^completionHandler)(id) = ^(NSDictionary *result) { - [_delegate sharer:self didCompleteWithResults:result]; - }; - if (![self _stageOpenGraphObject:openGraphObject - connection:connection - stagingHandler:NULL - completionHandler:completionHandler]) { - return NO; - } - [connection start]; - return YES; -} - -- (BOOL)share -{ - NSError *error; - if (![self canShare]) { - NSString *message = @"Share API is not available; verify 'canShare' returns YES"; - error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode message:message]; - [_delegate sharer:self didFailWithError:error]; - return NO; - } - if (![self _hasPublishActions]) { - NSString *message = @"Warning: Access token is missing publish_actions permissions"; - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:message]; - } - if (![self validateWithError:&error]) { - [_delegate sharer:self didFailWithError:error]; - return NO; - } - id shareContent = self.shareContent; - - if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - return [self _shareLinkContent:(FBSDKShareLinkContent *)shareContent]; - } else if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - return [self _sharePhotoContent:(FBSDKSharePhotoContent *)shareContent]; - } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - return [self _shareVideoContent:(FBSDKShareVideoContent *)shareContent]; - } else if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - return [self _shareOpenGraphContent:(FBSDKShareOpenGraphContent *)shareContent]; - } else { - return NO; - } -} - -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef -{ - id shareContent = self.shareContent; - if (!shareContent) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"shareContent" message:@"Share content cannot be null."]; - } - return NO; - } - if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - if (shareContent.peopleIDs.count > 0) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"peopleIDs" value:shareContent.peopleIDs message:@"Cannot specify peopleIDs with FBSDKShareVideoContent."]; - } - return NO; - } - if (shareContent.placeID) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"placeID" value:shareContent.placeID message:@"Cannot specify place ID with FBSDKShareVideoContent."]; - } - return NO; - } - } - if (errorRef != NULL){ - *errorRef = nil; - } - return [FBSDKShareUtility validateShareContent:shareContent error:errorRef]; -} - -- (FBSDKAccessToken *)accessToken -{ - return _accessToken ?: [FBSDKAccessToken currentAccessToken]; -} - -#pragma mark - Helper Methods - -- (NSString *)_graphPathWithSuffix:(NSString *)suffix, ... NS_REQUIRES_NIL_TERMINATION -{ - NSMutableString *graphPath = [[NSMutableString alloc] initWithString:self.graphNode]; - va_list args; - va_start(args, suffix); - for (NSString *arg = suffix; arg != nil; arg = va_arg(args, NSString *)) { - [graphPath appendFormat:@"/%@", arg]; - } - va_end(args); - return graphPath; -} - -- (void)_addCommonParameters:(NSMutableDictionary *)parameters content:(id)content -{ - if (content.peopleIDs.count > 0) { - NSString *tags; - if ([content isKindOfClass:[FBSDKSharePhotoContent class]]) { - NSMutableArray *tagsArray = [[NSMutableArray alloc] init]; - for (NSString *peopleID in content.peopleIDs) { - [tagsArray addObject:@{ @"tag_uid" : peopleID }]; - } - NSData *tagsJSON = [NSJSONSerialization dataWithJSONObject:tagsArray options:0 error:nil]; - tags = [[NSString alloc] initWithData:tagsJSON encoding:NSUTF8StringEncoding]; - } else { - tags = [content.peopleIDs componentsJoinedByString:@","]; - } - [FBSDKInternalUtility dictionary:parameters setObject:tags forKey:@"tags"]; - } - [FBSDKInternalUtility dictionary:parameters setObject:content.placeID forKey:@"place"]; - [FBSDKInternalUtility dictionary:parameters setObject:content.ref forKey:@"ref"]; -} - -- (BOOL)_hasPublishActions -{ - return [self.accessToken.permissions containsObject:@"publish_actions"]; -} - -- (BOOL)_shareLinkContent:(FBSDKShareLinkContent *)linkContent -{ - FBSDKGraphRequestHandler completionHandler = ^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - if (!_delegate) { - return; - } - if (error) { - [_delegate sharer:self didFailWithError:error]; - } else { - result = [FBSDKTypeUtility dictionaryValue:result]; - NSMutableDictionary *shareResults = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:shareResults setObject:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST - forKey:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; - [FBSDKInternalUtility dictionary:shareResults setObject:[FBSDKTypeUtility stringValue:result[@"id"]] - forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; - [_delegate sharer:self didCompleteWithResults:shareResults]; - } - }; - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - [self _addCommonParameters:parameters content:linkContent]; - [FBSDKInternalUtility dictionary:parameters setObject:self.message forKey:@"message"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentURL forKey:@"link"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.imageURL forKey:@"picture"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentTitle forKey:@"name"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentDescription forKey:@"description"]; -#pragma clang diagnostic pop - [[[FBSDKGraphRequest alloc] initWithGraphPath:[self _graphPathWithSuffix:@"feed", nil] - parameters:parameters - tokenString:self.accessToken.tokenString - version:nil - HTTPMethod:@"POST"] startWithCompletionHandler:completionHandler]; - return YES; -} - -- (BOOL)_shareOpenGraphContent:(FBSDKShareOpenGraphContent *)openGraphContent -{ - // In order to create a new Open Graph action using a custom object that does not already exist (objectID or URL), you - // must first send a request to post the object and then another to post the action. If a local image is supplied - // with the object or action, that must be staged first and then referenced by the staging URL that is returned by - // that request. - FBSDKShareOpenGraphAction *action = openGraphContent.action; - FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; - void(^stagingHandler)(NSDictionary *) = ^(NSDictionary *stagedContainer) { - NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:stagedContainer]; - [self _addCommonParameters:parameters content:openGraphContent]; - [FBSDKInternalUtility dictionary:parameters setObject:self.message forKey:@"message"]; - - FBSDKGraphRequestHandler requestHandler = ^(FBSDKGraphRequestConnection *requestConnection, - id result, - NSError *requestError) { - if (!_delegate) { - return; - } - if (requestError) { - NSError *error = [FBSDKShareError errorWithCode:FBSDKShareOpenGraphErrorCode - message:@"Error sharing Open Graph content" - underlyingError:requestError]; - [_delegate sharer:self didFailWithError:error]; - } else if (result) { - NSMutableDictionary *shareResults = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:shareResults setObject:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST - forKey:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; - [FBSDKInternalUtility dictionary:shareResults setObject:[FBSDKTypeUtility stringValue:result[@"id"]] - forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; - [_delegate sharer:self didCompleteWithResults:shareResults]; - } - }; - NSString *graphPath = [self _graphPathWithSuffix:[FBSDKUtility URLEncode:action.actionType], nil]; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath - parameters:parameters - tokenString:self.accessToken.tokenString - version:nil - HTTPMethod:@"POST"]; - [self _connection:connection addRequest:request completionHandler:requestHandler]; - [connection start]; - }; - if (![self _stageOpenGraphValueContainer:action connection:connection stagingHandler:stagingHandler]) { - return NO; - } - return YES; -} - -- (BOOL)_sharePhotoContent:(FBSDKSharePhotoContent *)photoContent -{ - NSArray *photos = photoContent.photos; - NSMutableArray *requests = [[NSMutableArray alloc] init]; - for (FBSDKSharePhoto *photo in photos) { - UIImage *image = photo.image; - if (!image && [photo.imageURL isFileURL]) { - image = [UIImage imageWithContentsOfFile:[photo.imageURL path]]; - } - if (image) { - NSString *graphPath = [self _graphPathWithSuffix:FBSDKShareAPIPhotosEdge, nil]; - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - [self _addCommonParameters:parameters content:photoContent]; - NSString *caption = photo.caption ?: self.message; - [FBSDKInternalUtility dictionary:parameters setObject:caption forKey:@"caption"]; - parameters[@"picture"] = image; - [requests addObject:[[FBSDKGraphRequest alloc] initWithGraphPath:graphPath - parameters:parameters - tokenString:self.accessToken.tokenString - version:nil - HTTPMethod:@"POST"]]; - } - } - NSUInteger requestCount = [requests count]; - NSMutableArray *results = [[NSMutableArray alloc] init]; - NSMutableArray *errors = [[NSMutableArray alloc] init]; - __block NSUInteger completedCount = 0; - FBSDKGraphRequestHandler completionHandler = ^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - result = [FBSDKTypeUtility dictionaryValue:result]; - [FBSDKInternalUtility array:results addObject:result]; - [FBSDKInternalUtility array:errors addObject:error]; - if (++completedCount != requestCount) { - return; - } - if (!_delegate) { - return; - } - if ([errors count]) { - [_delegate sharer:self didFailWithError:errors[0]]; - } else if ([results count]) { - NSArray *individualPhotoIDs = [results valueForKeyPath:@"id"]; - // each photo upload will be merged into the same post, so grab the post_id from the first and use that - NSMutableDictionary *shareResults = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:shareResults setObject:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST - forKey:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; - NSDictionary *firstResult = [FBSDKTypeUtility dictionaryValue:results[0]]; - [FBSDKInternalUtility dictionary:shareResults setObject:[FBSDKTypeUtility stringValue:firstResult[@"post_id"]] - forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; - [FBSDKInternalUtility dictionary:shareResults setObject:individualPhotoIDs forKey:FBSDK_SHARE_RESULT_PHOTO_IDS_KEY]; - [_delegate sharer:self didCompleteWithResults:shareResults]; - } - }; - for (FBSDKGraphRequest *request in requests) { - [request startWithCompletionHandler:completionHandler]; - } - return YES; -} - -- (BOOL)_shareVideoContent:(FBSDKShareVideoContent *)videoContent -{ - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - [self _addCommonParameters:parameters content:videoContent]; - [FBSDKInternalUtility dictionary:parameters setObject:self.message forKey:@"description"]; - if ([self.accessToken.permissions containsObject:@"ads_management"]) { - FBSDKSharePhoto *photo = videoContent.previewPhoto; - UIImage *image = photo.image; - if (!image && [photo.imageURL isFileURL]) { - image = [UIImage imageWithContentsOfFile:[photo.imageURL path]]; - } - [FBSDKInternalUtility dictionary:parameters setObject:image forKey:@"thumb"]; - } - FBSDKShareVideo *video = videoContent.video; - NSURL *videoURL = video.videoURL; - if ([videoURL isFileURL]) { - NSError *fileError; - _fileHandle = [NSFileHandle fileHandleForReadingFromURL:videoURL error:&fileError]; - if (!_fileHandle) { - [_delegate sharer:self didFailWithError:fileError]; - return NO; - } - if (![self _addToPendingShareAPI]) { - return NO; - } - FBSDKVideoUploader *videoUploader = [[FBSDKVideoUploader alloc] initWithVideoName:[videoURL lastPathComponent] - videoSize:(unsigned long)[_fileHandle seekToEndOfFile] - parameters:parameters - delegate:self]; - videoUploader.graphNode = self.graphNode; - [videoUploader start]; - return YES; - } else if (videoURL) { -#if TARGET_OS_TV - return NO; -#else - if (![self _addToPendingShareAPI]) { - return NO; - } - [[FBSDKShareAPI defaultAssetsLibrary] assetForURL:videoURL resultBlock:^(ALAsset *asset) { - _assetRepresentation = [asset defaultRepresentation]; - NSUInteger size = (NSUInteger)_assetRepresentation.size; - FBSDKVideoUploader *videoUploader = [[FBSDKVideoUploader alloc] initWithVideoName:[videoURL lastPathComponent] - videoSize:size - parameters:parameters - delegate:self]; - videoUploader.graphNode = self.graphNode; - [videoUploader start]; - } failureBlock:^(NSError *error) { - [_delegate sharer:self didFailWithError:error]; - }]; - return YES; -#endif - } else { - return NO; - } -} - -- (BOOL)_addEncodedParametersToDictionary:(NSMutableDictionary *)parameters - key:(NSString *)key - value:(id)value - error:(NSError **)errorRef -{ - if ([value isKindOfClass:[NSString class]] || - [value isKindOfClass:[NSNumber class]] || - [value isKindOfClass:[NSNull class]]) { - parameters[key] = value; - } else if ([value isKindOfClass:[NSArray class]]) { - __block BOOL didEncode = YES; - [(NSArray *)value enumerateObjectsUsingBlock:^(id subvalue, NSUInteger idx, BOOL *stop) { - NSString *subkey = [[NSString alloc] initWithFormat:@"%@[%lu]", key, (unsigned long)idx]; - if (![self _addEncodedParametersToDictionary:parameters key:subkey value:subvalue error:errorRef]) { - *stop = YES; - didEncode = NO; - } - }]; - if (!didEncode) { - return NO; - } - } else if ([value isKindOfClass:[NSDictionary class]]) { - __block BOOL didEncode = YES; - [(NSDictionary *)value enumerateKeysAndObjectsUsingBlock:^(id subkey, id subvalue, BOOL *stop) { - subkey = [[NSString alloc] initWithFormat:@"%@[%@]", key, subkey]; - if (![self _addEncodedParametersToDictionary:parameters key:subkey value:subvalue error:errorRef]) { - *stop = YES; - didEncode = NO; - } - }]; - if (!didEncode) { - return NO; - } - } else { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:key value:value message:nil]; - } - return NO; - } - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; -} - -- (BOOL)_stageArray:(NSArray *)array - connection:(FBSDKGraphRequestConnection *)connection - stagingHandler:(void(^)(NSArray *stagedArray))stagingHandler -{ - __block BOOL result = YES; - __block NSUInteger pendingCount = 1; - NSMutableArray *stagedArray = [[NSMutableArray alloc] initWithArray:array]; - void(^itemDidFail)(void) = ^{ - if (!result) { - return; - } - result = NO; - }; - void(^itemDidSucceed)(void) = ^{ - if (!result) { - return; - } - if ((--pendingCount == 0) && (stagingHandler != NULL)) { - stagingHandler(stagedArray); - } - }; - [array enumerateObjectsUsingBlock:^(id item, NSUInteger idx, BOOL *stop) { - pendingCount++; - void(^itemHandler)(id) = ^(id stagedValue) { - if (stagedValue) { - stagedArray[idx] = stagedValue; - itemDidSucceed(); - } else { - NSError *error = [FBSDKShareError invalidArgumentErrorWithName:@"value" - value:item - message:@"Error staging object."]; - [_delegate sharer:self didFailWithError:error]; - itemDidFail(); - *stop = YES; - result = NO; - } - }; - if (![self _stageValue:item connection:connection stagingHandler:itemHandler]) { - itemDidFail(); - *stop = YES; - result = NO; - } - }]; - if (result) { - itemDidSucceed(); - } - return result; -} - -- (BOOL)_stageOpenGraphObject:(FBSDKShareOpenGraphObject *)openGraphObject - connection:(FBSDKGraphRequestConnection *)connection - stagingHandler:(void(^)(id stagedObject))stagingHandler - completionHandler:(void(^)(NSDictionary *result))completionHandler -{ - NSString *type = [FBSDKTypeUtility stringValue:openGraphObject[@"og:type"]]; - if (!type) { - NSString *message = @"Open Graph objects must contain a og:type value."; - NSError *error = [FBSDKShareError requiredArgumentErrorWithName:@"og:type" message:message]; - [_delegate sharer:self didFailWithError:error]; - return NO; - } - void(^containerHandler)(NSDictionary *) = ^(NSDictionary *stagedContainer) { - NSError *JSONError; - NSString *objectString = [FBSDKInternalUtility JSONStringForObject:stagedContainer - error:&JSONError - invalidObjectHandler:NULL]; - if (!objectString) { - [_delegate sharer:self didFailWithError:JSONError]; - return; - } - NSString *graphPath = [self _graphPathWithSuffix:@"objects", type, nil]; - NSDictionary *parameters = @{ @"object": objectString }; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath - parameters:parameters - tokenString:self.accessToken.tokenString - version:nil - HTTPMethod:@"POST"]; - FBSDKGraphRequestHandler requestCompletionHandler = ^(FBSDKGraphRequestConnection *requestConnection, - id result, - NSError *requestError) { - if (!_delegate) { - return; - } - if (requestError) { - NSString *message = [[NSString alloc] initWithFormat:@"Error creating Open Graph object: %@", - requestError.description]; - NSError *error = [FBSDKShareError errorWithCode:FBSDKShareOpenGraphErrorCode - message:message - underlyingError:requestError]; - [_delegate sharer:self didFailWithError:error]; - } else if (completionHandler != NULL) { - completionHandler([FBSDKTypeUtility dictionaryValue:result]); - } - }; - NSString *batchEntryName = [self _connection:connection - addRequest:request - completionHandler:requestCompletionHandler]; - if (stagingHandler != NULL) { - stagingHandler([[NSString alloc] initWithFormat:@"{result=%@:$.id}", batchEntryName]); - } - }; - return [self _stageOpenGraphValueContainer:openGraphObject connection:connection stagingHandler:containerHandler]; - return YES; -} - -- (BOOL)_stageOpenGraphValueContainer:(id)container - connection:(FBSDKGraphRequestConnection *)connection - stagingHandler:(void(^)(NSDictionary *stagedContainer))stagingHandler -{ - __block BOOL result = YES; - __block NSUInteger pendingCount = 1; - NSMutableDictionary *stagedContainer = [[NSMutableDictionary alloc] init]; - void(^itemDidFail)(void) = ^{ - if (!result) { - return; - } - result = NO; - }; - void(^itemDidSucceed)(void) = ^{ - if (!result) { - return; - } - if ((--pendingCount == 0) && (stagingHandler != NULL)) { - stagingHandler(stagedContainer); - } - }; - BOOL isAction = [container isKindOfClass:[FBSDKShareOpenGraphAction class]]; - [container enumerateKeysAndObjectsUsingBlock:^(NSString *key, id object, BOOL *stop) { - pendingCount++; - - // The server does not understand custom namespaces remove them until the server is fixed - NSString *namespace; - key = [FBSDKShareUtility getOpenGraphNameAndNamespaceFromFullName:key namespace:&namespace]; - if (namespace && !isAction) { - if (!stagedContainer[namespace]) { - stagedContainer[namespace] = [[NSMutableDictionary alloc] init]; - } - } - - void(^itemHandler)(id) = ^(id stagedValue) { - if (stagedValue) { - if (isAction) { - NSError *error; - if (![self _addEncodedParametersToDictionary:stagedContainer key:key value:stagedValue error:&error]) { - [_delegate sharer:self didFailWithError:error]; - itemDidFail(); - return; - } - } else { - NSMutableDictionary *valueContainer = (namespace ? stagedContainer[namespace] : stagedContainer); - valueContainer[key] = stagedValue; - } - } - itemDidSucceed(); - }; - if (![self _stageValue:object connection:connection stagingHandler:itemHandler]) { - *stop = YES; - result = NO; - } - }]; - if (result) { - itemDidSucceed(); - } - return result; -} - -- (BOOL)_stagePhoto:(FBSDKSharePhoto *)photo - connection:(FBSDKGraphRequestConnection *)connection - stagingHandler:(void(^)(id stagedPhoto))stagingHandler -{ - if (photo.imageURL) { - NSMutableDictionary *stagedPhoto = [[NSMutableDictionary alloc]initWithDictionary: @{ - @"url": photo.imageURL.absoluteString, - @"user_generated": @(photo.userGenerated), - }]; - [FBSDKInternalUtility dictionary:stagedPhoto setObject:photo.caption forKey:@"caption"]; - if (stagingHandler) { - stagingHandler(stagedPhoto); - } - return YES; - } else if (photo.image) { - NSString *graphPath = @"/me/staging_resources"; - NSDictionary *parameters = @{ @"file": photo.image }; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:graphPath - parameters:parameters - tokenString:self.accessToken.tokenString - version:nil - HTTPMethod:@"POST"]; - FBSDKGraphRequestHandler completionHandler = ^(FBSDKGraphRequestConnection *requestConnection, - id result, - NSError *requestError) { - NSString *stagedPhotoURLString = [FBSDKTypeUtility stringValue:result[@"uri"]]; - if (requestError || !stagedPhotoURLString) { - NSError *error = [FBSDKShareError errorWithCode:FBSDKShareOpenGraphErrorCode - message:@"Error staging photo" - underlyingError:requestError]; - [_delegate sharer:self didFailWithError:error]; - } else if (stagingHandler) { - NSMutableDictionary *stagedPhoto = [[NSMutableDictionary alloc] initWithDictionary: @{ - @"url": stagedPhotoURLString, - @"user_generated": @(photo.userGenerated), - }]; - [FBSDKInternalUtility dictionary:stagedPhoto setObject:photo.caption forKey:@"caption"]; - stagingHandler(stagedPhoto); - } - }; - [request startWithCompletionHandler:completionHandler]; - return YES; - } else { - NSError *error = [FBSDKShareError invalidArgumentErrorWithName:@"photo" - value:photo - message:@"Photos must have an imageURL or image."]; - [_delegate sharer:self didFailWithError:error]; - return NO; - } -} - -- (BOOL)_stageValue:(id)value - connection:(FBSDKGraphRequestConnection *)connection - stagingHandler:(void(^)(id stagedValue))stagingHandler -{ - if ([value isKindOfClass:[NSString class]] || - [value isKindOfClass:[NSNumber class]]) { - if (stagingHandler != NULL) { - stagingHandler(value); - } - return YES; - } else if ([value isKindOfClass:[NSURL class]]) { - if (stagingHandler != NULL) { - stagingHandler([(NSURL *)value absoluteString]); - } - return YES; - } else if ([value isKindOfClass:[FBSDKSharePhoto class]]) { - return [self _stagePhoto:(FBSDKSharePhoto *)value connection:connection stagingHandler:stagingHandler]; - } else if ([value isKindOfClass:[FBSDKShareOpenGraphObject class]]) { - return [self _stageOpenGraphObject:(FBSDKShareOpenGraphObject *)value - connection:connection - stagingHandler:stagingHandler - completionHandler:NULL]; - } else if ([value isKindOfClass:[NSArray class]]) { - return [self _stageArray:(NSArray *)value connection:connection stagingHandler:stagingHandler]; - } else { - NSError *error = [FBSDKShareError invalidArgumentErrorWithName:@"value" - value:value - message:@"Invalid value type found in Open Graph object."]; - [_delegate sharer:self didFailWithError:error]; - return NO; - } -} - -- (NSString *)_connection:(FBSDKGraphRequestConnection *)connection - addRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)completionHandler -{ - NSUInteger requestCount = [connection.requests count]; - NSString *batchEntryName = [[NSString alloc] initWithFormat:@"request_%lu", (unsigned long)requestCount]; - [connection addRequest:request completionHandler:completionHandler batchEntryName:batchEntryName]; - return batchEntryName; -} - -- (BOOL)_addToPendingShareAPI -{ - @synchronized(g_pendingFBSDKShareAPI) { - if ([g_pendingFBSDKShareAPI containsObject:self]) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"FBSDKShareAPI did not share video content. Video upload already in progress."]; - return NO; - } - [g_pendingFBSDKShareAPI addObject:self]; - return YES; - } -} - -- (void)_removeFromPendingShareAPI -{ - @synchronized(g_pendingFBSDKShareAPI) { - [g_pendingFBSDKShareAPI removeObject:self]; - _fileHandle = nil; -#if !TARGET_OS_TV - _assetRepresentation = nil; -#endif - } -} - -#pragma mark - FBSDKVideoUploaderDelegate - -- (NSData *)videoChunkDataForVideoUploader:(FBSDKVideoUploader *)videoUploader startOffset:(NSUInteger)startOffset endOffset:(NSUInteger)endOffset -{ - NSUInteger chunkSize = endOffset - startOffset; - if (_fileHandle) { - [_fileHandle seekToFileOffset:startOffset]; - NSData *videoChunkData = [_fileHandle readDataOfLength:chunkSize]; - if (videoChunkData == nil || videoChunkData.length != chunkSize) { - return nil; - } - return videoChunkData; - } -#if !TARGET_OS_TV - else if (_assetRepresentation) { - NSMutableData *data = [NSMutableData dataWithLength:chunkSize]; - NSError *error; - NSUInteger bufferedLength = [_assetRepresentation getBytes:[data mutableBytes] fromOffset:startOffset length:chunkSize error:&error]; - if (bufferedLength != chunkSize || data == nil || error) { - return nil; - } - return data; - } -#endif - return nil; -} - -- (void)videoUploader:(FBSDKVideoUploader *)videoUploader didCompleteWithResults:(NSDictionary *)results -{ - results = [FBSDKTypeUtility dictionaryValue:results]; - NSMutableDictionary *shareResults = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:shareResults setObject:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST forKey:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; - [FBSDKInternalUtility dictionary:shareResults setObject:[FBSDKTypeUtility stringValue:results[FBSDK_SHARE_VIDEO_ID]] forKey:FBSDK_SHARE_VIDEO_ID]; - [_delegate sharer:self didCompleteWithResults:shareResults]; - [self _removeFromPendingShareAPI]; -} - -- (void)videoUploader:(FBSDKVideoUploader *)videoUploader didFailWithError:(NSError *)error -{ - [_delegate sharer:self didFailWithError:error]; - [self _removeFromPendingShareAPI]; -} - - - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h deleted file mode 100644 index c2565db37..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import - -/** - A button to share content. - - Tapping the receiver will invoke the FBSDKShareDialog with the attached shareContent. If the dialog cannot - be shown, the button will be disabled. - */ -@interface FBSDKShareButton : FBSDKButton - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.m deleted file mode 100644 index 17ecf716b..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.m +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareButton.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareDialog.h" - -@implementation FBSDKShareButton -{ - FBSDKShareDialog *_dialog; -} - -#pragma mark - Properties - -- (id)shareContent -{ - return _dialog.shareContent; -} - -- (void)setShareContent:(id)shareContent -{ - _dialog.shareContent = shareContent; - [self checkImplicitlyDisabled]; -} - -#pragma mark - FBSDKButtonImpressionTracking - -- (NSDictionary *)analyticsParameters -{ - return nil; -} - -- (NSString *)impressionTrackingEventName -{ - return FBSDKAppEventNameFBSDKShareButtonImpression; -} - -- (NSString *)impressionTrackingIdentifier -{ - return @"share"; -} - -#pragma mark - FBSDKButton - -- (void)configureButton -{ - NSString *title = - NSLocalizedStringWithDefaultValue(@"ShareButton.Share", @"FacebookSDK", [FBSDKInternalUtility bundleForStrings], - @"Share", - @"The label for FBSDKShareButton"); - - [self configureWithIcon:nil - title:title - backgroundColor:nil - highlightedColor:nil]; - - [self addTarget:self action:@selector(_share:) forControlEvents:UIControlEventTouchUpInside]; - _dialog = [[FBSDKShareDialog alloc] init]; -} - -- (BOOL)isImplicitlyDisabled -{ - return ![_dialog canShow] || ![_dialog validateWithError:NULL]; -} - -#pragma mark - Helper Methods - -- (void)_share:(id)sender -{ - [self logTapEventWithEventName:FBSDKAppEventNameFBSDKShareButtonDidTap parameters:[self analyticsParameters]]; - [_dialog show]; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h deleted file mode 100644 index 65e2f6bdc..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import - -/** - A model for content to share with a Facebook camera effect. - */ -@interface FBSDKShareCameraEffectContent : NSObject - -/** - ID of the camera effect to use. - */ -@property (nonatomic, copy) NSString *effectID; - -/** - Arguments for the effect. - */ -@property (nonatomic, copy) FBSDKCameraEffectArguments *effectArguments; - -/** - Textures for the effect. - */ -@property (nonatomic, copy) FBSDKCameraEffectTextures *effectTextures; - -/** - Compares the receiver to another camera effect content. - - Parameter content: The other content - - Returns: YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToShareCameraEffectContent:(FBSDKShareCameraEffectContent *)content; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.m deleted file mode 100644 index 4be510092..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.m +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareCameraEffectContent.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKHashtag.h" -#import "FBSDKShareUtility.h" - -static NSString *const FBSDKShareCameraEffectContentEffectIDKey = @"effectID"; -static NSString *const FBSDKShareCameraEffectContentEffectArgumentsKey = @"effectArguments"; -static NSString *const FBSDKShareCameraEffectContentEffectTexturesKey = @"effectTextures"; -static NSString *const FBSDKShareCameraEffectContentContentURLKey = @"contentURL"; -static NSString *const FBSDKShareCameraEffectContentHashtagKey = @"hashtag"; -static NSString *const FBSDKShareCameraEffectContentPeopleIDsKey = @"peopleIDs"; -static NSString *const FBSDKShareCameraEffectContentPlaceIDKey = @"placeID"; -static NSString *const FBSDKShareCameraEffectContentRefKey = @"ref"; -static NSString *const FBSDKShareCameraEffectContentPageIDKey = @"pageID"; -static NSString *const FBSDKShareCameraEffectContentUUIDKey = @"uuid"; - -@implementation FBSDKShareCameraEffectContent - -#pragma mark - Properties - -@synthesize effectID = _effectID; -@synthesize effectArguments = _effectArguments; -@synthesize effectTextures = _effectTextures; -@synthesize contentURL = _contentURL; -@synthesize hashtag = _hashtag; -@synthesize peopleIDs = _peopleIDs; -@synthesize placeID = _placeID; -@synthesize ref = _ref; -@synthesize pageID = _pageID; -@synthesize shareUUID = _shareUUID; - -#pragma mark - Initializer - -- (instancetype)init -{ - self = [super init]; - if (self) { - _shareUUID = [NSUUID UUID].UUIDString; - } - return self; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [_effectID hash], - [_effectArguments hash], - [_effectTextures hash], - [_contentURL hash], - [_hashtag hash], - [_peopleIDs hash], - [_placeID hash], - [_ref hash], - [_pageID hash], - [_shareUUID hash], - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - return NO; - } - return [self isEqualToShareCameraEffectContent:(FBSDKShareCameraEffectContent *)object]; -} - -- (BOOL)isEqualToShareCameraEffectContent:(FBSDKShareCameraEffectContent *)content -{ - return (content && - [FBSDKInternalUtility object:_effectID isEqualToObject:content.effectID] && - [FBSDKInternalUtility object:_effectArguments isEqualToObject:content.effectArguments] && - [FBSDKInternalUtility object:_effectTextures isEqualToObject:content.effectTextures] && - [FBSDKInternalUtility object:_contentURL isEqualToObject:content.contentURL] && - [FBSDKInternalUtility object:_hashtag isEqualToObject:content.hashtag] && - [FBSDKInternalUtility object:_peopleIDs isEqualToObject:content.peopleIDs] && - [FBSDKInternalUtility object:_placeID isEqualToObject:content.placeID] && - [FBSDKInternalUtility object:_ref isEqualToObject:content.ref] && - [FBSDKInternalUtility object:_shareUUID isEqualToObject:content.shareUUID] && - [FBSDKInternalUtility object:_pageID isEqualToObject:content.pageID]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _effectID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKShareCameraEffectContentEffectIDKey]; - _effectArguments = [decoder decodeObjectOfClass:[FBSDKCameraEffectArguments class] forKey:FBSDKShareCameraEffectContentEffectArgumentsKey]; - _effectTextures = [decoder decodeObjectOfClass:[FBSDKCameraEffectTextures class] forKey:FBSDKShareCameraEffectContentEffectTexturesKey]; - _contentURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDKShareCameraEffectContentContentURLKey]; - _hashtag = [decoder decodeObjectOfClass:[FBSDKHashtag class] forKey:FBSDKShareCameraEffectContentHashtagKey]; - _peopleIDs = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDKShareCameraEffectContentPeopleIDsKey]; - _placeID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKShareCameraEffectContentPlaceIDKey]; - _ref = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKShareCameraEffectContentRefKey]; - _pageID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKShareCameraEffectContentPageIDKey]; - _shareUUID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKShareCameraEffectContentUUIDKey]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_effectID forKey:FBSDKShareCameraEffectContentEffectIDKey]; - [encoder encodeObject:_effectArguments forKey:FBSDKShareCameraEffectContentEffectArgumentsKey]; - [encoder encodeObject:_effectTextures forKey:FBSDKShareCameraEffectContentEffectTexturesKey]; - [encoder encodeObject:_contentURL forKey:FBSDKShareCameraEffectContentContentURLKey]; - [encoder encodeObject:_hashtag forKey:FBSDKShareCameraEffectContentHashtagKey]; - [encoder encodeObject:_peopleIDs forKey:FBSDKShareCameraEffectContentPeopleIDsKey]; - [encoder encodeObject:_placeID forKey:FBSDKShareCameraEffectContentPlaceIDKey]; - [encoder encodeObject:_ref forKey:FBSDKShareCameraEffectContentRefKey]; - [encoder encodeObject:_pageID forKey:FBSDKShareCameraEffectContentPageIDKey]; - [encoder encodeObject:_shareUUID forKey:FBSDKShareCameraEffectContentUUIDKey]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareCameraEffectContent *copy = [[FBSDKShareCameraEffectContent alloc] init]; - copy->_effectID = [_effectID copy]; - copy->_effectArguments = [_effectArguments copy]; - copy->_effectTextures = [_effectTextures copy]; - copy->_contentURL = [_contentURL copy]; - copy->_hashtag = [_hashtag copy]; - copy->_peopleIDs = [_peopleIDs copy]; - copy->_placeID = [_placeID copy]; - copy->_ref = [_ref copy]; - copy->_pageID = [_pageID copy]; - copy->_shareUUID = [_shareUUID copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h deleted file mode 100644 index 1d73ecf45..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - The error domain for all errors from FBSDKShareKit. - - Error codes from the SDK in the range 200-299 are reserved for this domain. - */ -FBSDK_EXTERN NSString *const FBSDKShareErrorDomain; - -/** - NS_ENUM(NSInteger, FBSDKShareErrorCode) - Error codes for FBSDKShareErrorDomain. - */ -typedef NS_ENUM(NSInteger, FBSDKShareErrorCode) -{ - /** - Reserved. - */ - FBSDKShareReservedErrorCode = 200, - - /** - The error code for errors from uploading open graph objects. - */ - FBSDKShareOpenGraphErrorCode, - - /** - The error code for when a sharing dialog is not available. - - Use the canShare methods to check for this case before calling show. - */ - FBSDKShareDialogNotAvailableErrorCode, - - /** - @The error code for unknown errors. - */ - FBSDKShareUnknownErrorCode, -}; diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.m deleted file mode 100644 index 8de78c76c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.m +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareConstants.h" - -NSString *const FBSDKShareErrorDomain = @"com.facebook.sdk.share"; - -NSString *const FBSDKShareOpenGraphKeyErrorKey = @"key"; -NSString *const FBSDKShareOpenGraphValueErrorKey = @"value"; diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h deleted file mode 100644 index 849859050..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import - -/** - A dialog for sharing content on Facebook. - */ -@interface FBSDKShareDialog : NSObject - -/** - Convenience method to show an FBSDKShareDialog with a fromViewController, content and a delegate. - - Parameter viewController: A UIViewController to present the dialog from, if appropriate. - - Parameter content: The content to be shared. - - Parameter delegate: The receiver's delegate. - */ -+ (instancetype)showFromViewController:(UIViewController *)viewController - withContent:(id)content - delegate:(id)delegate; - -/** - A UIViewController to present the dialog from. - - If not specified, the top most view controller will be automatically determined as best as possible. - */ -@property (nonatomic, weak) UIViewController *fromViewController; - -/** - The mode with which to display the dialog. - - Defaults to FBSDKShareDialogModeAutomatic, which will automatically choose the best available mode. - */ -@property (nonatomic, assign) FBSDKShareDialogMode mode; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.m deleted file mode 100644 index 88a743428..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.m +++ /dev/null @@ -1,1130 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareDialog.h" - -#import - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareConstants.h" -#import "FBSDKShareDefines.h" -#import "FBSDKShareError.h" -#import "FBSDKShareLinkContent.h" -#import "FBSDKShareMediaContent.h" -#import "FBSDKShareOpenGraphAction.h" -#import "FBSDKShareOpenGraphContent.h" -#import "FBSDKShareOpenGraphObject.h" -#import "FBSDKSharePhoto.h" -#import "FBSDKSharePhotoContent.h" -#import "FBSDKShareUtility.h" -#import "FBSDKShareVideo.h" -#import "FBSDKShareVideoContent.h" - -#define FBSDK_SHARE_FEED_METHOD_NAME @"feed" -#define FBSDK_SHARE_METHOD_CAMERA_MIN_VERSION @"20170417" -#define FBSDK_SHARE_METHOD_MIN_VERSION @"20130410" -#define FBSDK_SHARE_METHOD_OG_MIN_VERSION @"20130214" -#define FBSDK_SHARE_METHOD_OG_IMAGE_MIN_VERSION @"20130410" -#define FBSDK_SHARE_METHOD_PHOTOS_MIN_VERSION @"20140116" -#define FBSDK_SHARE_METHOD_VIDEO_MIN_VERSION @"20150313" -#define FBSDK_SHARE_METHOD_ATTRIBUTED_SHARE_SHEET_MIN_VERSION @"20150629" -#define FBSDK_SHARE_METHOD_QUOTE_MIN_VERSION @"20160328" -#define FBSDK_SHARE_METHOD_MMP_MIN_VERSION @"20160328" - -FBSDK_STATIC_INLINE void FBSDKShareDialogValidateAPISchemeRegisteredForCanOpenUrl() -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_FBAPI]; - }); -} - -FBSDK_STATIC_INLINE void FBSDKShareDialogValidateShareExtensionSchemeRegisteredForCanOpenUrl() -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_SHARE_EXTENSION]; - }); -} - - -@interface FBSDKShareDialog () -@end - -@implementation FBSDKShareDialog -{ - FBSDKWebDialog *_webDialog; -} - -#pragma mark - Class Methods - -+ (void)initialize -{ - if ([FBSDKShareDialog class] == self) { - [FBSDKInternalUtility checkRegisteredCanOpenURLScheme:FBSDK_CANOPENURL_FACEBOOK]; - [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; - } -} - -+ (instancetype)showFromViewController:(UIViewController *)viewController - withContent:(id)content - delegate:(id)delegate -{ - FBSDKShareDialog *dialog = [[self alloc] init]; - dialog.fromViewController = viewController; - dialog.shareContent = content; - dialog.delegate = delegate; - [dialog show]; - return dialog; -} - -#pragma mark - Object Lifecycle - -- (void)dealloc -{ - _webDialog.delegate = nil; -} - -#pragma mark - Properties - -@synthesize delegate = _delegate; -@synthesize shareContent = _shareContent; -@synthesize shouldFailOnDataError = _shouldFailOnDataError; - -#pragma mark - Public Methods - -- (BOOL)canShow -{ - if (!self.shareContent) { - switch (self.mode) { - case FBSDKShareDialogModeAutomatic: - case FBSDKShareDialogModeBrowser: - case FBSDKShareDialogModeFeedBrowser: - case FBSDKShareDialogModeFeedWeb: - case FBSDKShareDialogModeWeb:{ - return YES; - } - case FBSDKShareDialogModeNative:{ - return [self _canShowNative]; - } - case FBSDKShareDialogModeShareSheet:{ - return [self _canShowShareSheet]; - } - } - } else { - NSError *error = nil; - return [self _validateWithError:&error]; - } -} - -- (BOOL)show -{ - BOOL didShow = NO; - NSError *error = nil; - - if ([self _validateWithError:&error]) { - switch (self.mode) { - case FBSDKShareDialogModeAutomatic:{ - didShow = [self _showAutomatic:&error]; - break; - } - case FBSDKShareDialogModeBrowser:{ - didShow = [self _showBrowser:&error]; - break; - } - case FBSDKShareDialogModeFeedBrowser:{ - didShow = [self _showFeedBrowser:&error]; - break; - } - case FBSDKShareDialogModeFeedWeb:{ - didShow = [self _showFeedWeb:&error]; - break; - } - case FBSDKShareDialogModeNative:{ - didShow = [self _showNativeWithCanShowError:&error validationError:&error]; - break; - } - case FBSDKShareDialogModeShareSheet:{ - didShow = [self _showShareSheetWithCanShowError:&error validationError:&error]; - break; - } - case FBSDKShareDialogModeWeb:{ - didShow = [self _showWeb:&error]; - break; - } - } - } - if (!didShow) { - [self _invokeDelegateDidFailWithError:error]; - } else { - [self _logDialogShow]; - [FBSDKInternalUtility registerTransientObject:self]; - } - return didShow; -} - -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef -{ - return [self _validateWithError:errorRef] && [self _validateFullyCompatibleWithError:errorRef]; -} - -#pragma mark - FBSDKWebDialogDelegate - -- (void)webDialog:(FBSDKWebDialog *)webDialog didCompleteWithResults:(NSDictionary *)results -{ - if (_webDialog != webDialog) { - return; - } - [self _cleanUpWebDialog]; - NSInteger errorCode = [results[@"error_code"] integerValue]; - if (errorCode == 4201) { - [self _invokeDelegateDidCancel]; - } else if (errorCode != 0) { - NSError *error = [FBSDKShareError errorWithCode:FBSDKShareUnknownErrorCode - userInfo:@{ - FBSDKGraphRequestErrorGraphErrorCode : @(errorCode) - } - message:results[@"error_message"] - underlyingError:nil]; - [self _handleWebResponseParameters:nil error:error cancelled: NO]; - } else { - // not all web dialogs report cancellation, so assume that the share has completed with no additional information - [self _handleWebResponseParameters:results error:nil cancelled: NO]; - } - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -- (void)webDialog:(FBSDKWebDialog *)webDialog didFailWithError:(NSError *)error -{ - if (_webDialog != webDialog) { - return; - } - [self _cleanUpWebDialog]; - [self _invokeDelegateDidFailWithError:error]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -- (void)webDialogDidCancel:(FBSDKWebDialog *)webDialog -{ - if (_webDialog != webDialog) { - return; - } - [self _cleanUpWebDialog]; - [self _invokeDelegateDidCancel]; - [FBSDKInternalUtility unregisterTransientObject:self]; -} - -#pragma mark - Helper Methods - --(BOOL)_isDefaultToShareSheet -{ - if ([self.shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - return NO; - } - FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - return [configuration.defaultShareMode isEqualToString:@"share_sheet"]; -} - -- (BOOL)_isOpenGraphURLShare:(FBSDKShareOpenGraphContent *)shareContent -{ - __block BOOL hasOGURL = NO; - [shareContent.action enumerateKeysAndObjectsUsingBlock:^(NSString *key, id object, BOOL *stop) { - if ([object isKindOfClass:[NSURL class]]) { - hasOGURL = YES; - } - }]; - return hasOGURL; -} - --(BOOL)_showAutomatic:(NSError *__autoreleasing *)errorRef -{ - BOOL isDefaultToShareSheet = [self _isDefaultToShareSheet]; - BOOL useNativeDialog = [self _useNativeDialog]; - return ((isDefaultToShareSheet && [self _showShareSheetWithCanShowError:NULL validationError:errorRef]) || - (useNativeDialog && [self _showNativeWithCanShowError:NULL validationError:errorRef]) || - (!isDefaultToShareSheet && [self _showShareSheetWithCanShowError:NULL validationError:errorRef]) || - [self _showFeedBrowser:errorRef] || - [self _showFeedWeb:errorRef] || - [self _showBrowser:errorRef] || - [self _showWeb:errorRef] || - (!useNativeDialog && [self _showNativeWithCanShowError:NULL validationError:errorRef])); -} - -- (NSString *)_nativeScheme { - if ([self.shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - if ([FBSDKInternalUtility isMSQRDPlayerAppInstalled]) { - // If installed, launch MSQRD Player for testing effects. - return FBSDK_CANOPENURL_MSQRD_PLAYER; - } - } - return FBSDK_CANOPENURL_FACEBOOK; -} - -- (void)_loadNativeMethodName:(NSString **)methodNameRef methodVersion:(NSString **)methodVersionRef -{ - if (methodNameRef != NULL) { - *methodNameRef = nil; - } - if (methodVersionRef != NULL) { - *methodVersionRef = nil; - } - - id shareContent = self.shareContent; - if (!shareContent) { - return; - } - - // if there is shareContent on the receiver already, we can check the minimum app version, otherwise we can only check - // for an app that can handle the native share dialog - NSString *methodName = nil; - NSString *methodVersion = nil; - if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - methodName = FBSDK_SHARE_OPEN_GRAPH_METHOD_NAME; - BOOL containsMedia = NO; - [FBSDKShareUtility testShareContent:shareContent containsMedia:&containsMedia containsPhotos:NULL containsVideos:NULL]; - if (containsMedia) { - methodVersion = FBSDK_SHARE_METHOD_OG_IMAGE_MIN_VERSION; - } else { - methodVersion = FBSDK_SHARE_METHOD_OG_MIN_VERSION; - } - } else if ([shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - methodName = FBSDK_SHARE_CAMERA_METHOD_NAME; - methodVersion = FBSDK_SHARE_METHOD_CAMERA_MIN_VERSION; - } else { - methodName = FBSDK_SHARE_METHOD_NAME; - if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - methodVersion = FBSDK_SHARE_METHOD_PHOTOS_MIN_VERSION; - } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - methodVersion = FBSDK_SHARE_METHOD_VIDEO_MIN_VERSION; - } else { - methodVersion = FBSDK_SHARE_METHOD_MIN_VERSION; - } - } - if (methodNameRef != NULL) { - *methodNameRef = methodName; - } - if (methodVersionRef != NULL) { - *methodVersionRef = methodVersion; - } -} - -- (BOOL)_canShowNative -{ - return [FBSDKInternalUtility isFacebookAppInstalled]; -} - -- (BOOL)_canShowShareSheet -{ - if (![FBSDKInternalUtility isFacebookAppInstalled]) { - return NO; - } - - Class composeViewControllerClass = [fbsdkdfl_SLComposeViewControllerClass() class]; - if (!composeViewControllerClass) { - return NO; - } - // iOS 11 returns NO for `isAvailableForServiceType` but it will still work - NSString *facebookServiceType = fbsdkdfl_SLServiceTypeFacebook(); - NSOperatingSystemVersion iOS11Version = { .majorVersion = 11, .minorVersion = 0, .patchVersion = 0 }; - if (![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS11Version] && ![composeViewControllerClass isAvailableForServiceType:facebookServiceType]) { - return NO; - } - return YES; -} - -- (BOOL)_canAttributeThroughShareSheet -{ - NSOperatingSystemVersion iOS8Version = { .majorVersion = 8, .minorVersion = 0, .patchVersion = 0 }; - if (![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS8Version]) { - return NO; - } - FBSDKShareDialogValidateAPISchemeRegisteredForCanOpenUrl(); - NSString *scheme = FBSDK_CANOPENURL_FBAPI; - NSString *minimumVersion = FBSDK_SHARE_METHOD_ATTRIBUTED_SHARE_SHEET_MIN_VERSION; - NSURLComponents *components = [[NSURLComponents alloc] init]; - components.scheme = [scheme stringByAppendingString:minimumVersion]; - components.path = @"/"; - return ([[UIApplication sharedApplication] canOpenURL:components.URL] || - [self _canUseFBShareSheet]); -} - -- (BOOL)_canUseFBShareSheet -{ - NSOperatingSystemVersion iOS8Version = { .majorVersion = 8, .minorVersion = 0, .patchVersion = 0 }; - if (![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS8Version]) { - return NO; - } - FBSDKShareDialogValidateShareExtensionSchemeRegisteredForCanOpenUrl(); - NSURLComponents *components = [[NSURLComponents alloc] init]; - components.scheme = FBSDK_CANOPENURL_SHARE_EXTENSION; - components.path = @"/"; - return [[UIApplication sharedApplication] canOpenURL:components.URL]; -} - -- (BOOL)_canUseQuoteInShareSheet -{ - return [self _canUseFBShareSheet] && [self _supportsShareSheetMinimumVersion:FBSDK_SHARE_METHOD_QUOTE_MIN_VERSION]; -} - -- (BOOL)_canUseMMPInShareSheet -{ - return [self _canUseFBShareSheet] && [self _supportsShareSheetMinimumVersion:FBSDK_SHARE_METHOD_MMP_MIN_VERSION]; -} - -- (BOOL)_supportsShareSheetMinimumVersion:(NSString *)minimumVersion -{ - NSOperatingSystemVersion iOS8Version = { .majorVersion = 8, .minorVersion = 0, .patchVersion = 0 }; - if (![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS8Version]) { - return NO; - } - FBSDKShareDialogValidateAPISchemeRegisteredForCanOpenUrl(); - NSString *scheme = FBSDK_CANOPENURL_FBAPI; - NSURLComponents *components = [[NSURLComponents alloc] init]; - components.scheme = [scheme stringByAppendingString:minimumVersion]; - components.path = @"/"; - return [[UIApplication sharedApplication] canOpenURL:components.URL]; -} - -- (void)_cleanUpWebDialog -{ - _webDialog.delegate = nil; - _webDialog = nil; -} - -- (NSArray *)_contentImages -{ - NSMutableArray *ret = [NSMutableArray new]; - id shareContent = self.shareContent; - if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - [ret addObjectsFromArray:[((FBSDKSharePhotoContent *)shareContent).photos valueForKeyPath:@"@distinctUnionOfObjects.image"]]; - } else if ([shareContent isKindOfClass:[FBSDKShareMediaContent class]]) { - for (id media in ((FBSDKShareMediaContent *)shareContent).media) { - if ([media isKindOfClass:[FBSDKSharePhoto class]]) { - UIImage *image = ((FBSDKSharePhoto *)media).image; - if (image != nil) { - [ret addObject:image]; - } - } - } - } - return [ret copy]; -} - -- (NSArray *)_contentVideoURLs -{ - NSMutableArray *ret = [NSMutableArray new]; - id shareContent = self.shareContent; - if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - NSURL *videoURL = ((FBSDKShareVideoContent *)shareContent).video.videoURL; - if (videoURL != nil) { - [ret addObject:videoURL]; - } - } else if ([shareContent isKindOfClass:[FBSDKShareMediaContent class]]) { - for (id media in ((FBSDKShareMediaContent *)shareContent).media) { - if ([media isKindOfClass:[FBSDKShareVideo class]]) { - NSURL *videoURL = ((FBSDKShareVideo *)media).videoURL; - if (videoURL != nil) { - [ret addObject:videoURL]; - } - } - } - } - return [ret copy]; -} - -- (NSArray *)_contentURLs -{ - NSArray *URLs = nil; - id shareContent = self.shareContent; - if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - FBSDKShareLinkContent *linkContent = (FBSDKShareLinkContent *)shareContent; - URLs = (linkContent.contentURL ? @[linkContent.contentURL] : nil); - } else if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - FBSDKSharePhotoContent *photoContent = (FBSDKSharePhotoContent *)shareContent; - URLs = (photoContent.contentURL ? @[photoContent.contentURL] : nil); - } - return URLs; -} - -- (void)_handleWebResponseParameters:(NSDictionary *)webResponseParameters - error:(NSError *)error - cancelled:(BOOL)isCancelled -{ - if (error) { - [self _invokeDelegateDidFailWithError:error]; - return; - } else { - NSString *completionGesture = webResponseParameters[FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; - if ([completionGesture isEqualToString:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_CANCEL] || isCancelled) { - [self _invokeDelegateDidCancel]; - } else { - // not all web dialogs report cancellation, so assume that the share has completed with no additional information - NSMutableDictionary *results = [[NSMutableDictionary alloc] init]; - // the web response comes back with a different payload, so we need to translate it - [FBSDKInternalUtility dictionary:results - setObject:webResponseParameters[FBSDK_SHARE_WEB_PARAM_POST_ID_KEY] - forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; - [self _invokeDelegateDidCompleteWithResults:results]; - } - } -} - -- (BOOL)_photoContentHasAtLeastOneImage:(FBSDKSharePhotoContent *)photoContent -{ - for (FBSDKSharePhoto *photo in photoContent.photos) { - if (photo.image != nil) { - return YES; - } - } - return NO; -} - -- (BOOL)_showBrowser:(NSError **)errorRef -{ - if (![self _validateShareContentForBrowser:errorRef]) { - return NO; - } - id shareContent = self.shareContent; - NSString *methodName; - NSDictionary *parameters; - - if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]] && [self _photoContentHasAtLeastOneImage:(FBSDKSharePhotoContent *)shareContent]) { - void(^completion)(BOOL, NSString *, NSDictionary *) = ^(BOOL successfullyBuilt, NSString *cMethodName, NSDictionary *cParameters) { - if (successfullyBuilt) { - FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { - [self _handleWebResponseParameters:response.responseParameters error:response.error cancelled: response.isCancelled]; - [FBSDKInternalUtility unregisterTransientObject:self]; - }; - FBSDKBridgeAPIRequest *request; - request = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeWeb - scheme:FBSDK_SHARE_WEB_SCHEME - methodName:cMethodName - methodVersion:nil - parameters:cParameters - userInfo:nil]; - [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:request - useSafariViewController:[self _useSafariViewController] - fromViewController:self.fromViewController - completionBlock:completionBlock]; - } - }; - - [FBSDKShareUtility buildAsyncWebPhotoContent:shareContent - completionHandler:completion]; - } else { - if (![FBSDKShareUtility buildWebShareContent:shareContent - methodName:&methodName - parameters:¶meters - error:errorRef]) { - return NO; - } - FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { - [self _handleWebResponseParameters:response.responseParameters error:response.error cancelled: response.isCancelled]; - [FBSDKInternalUtility unregisterTransientObject:self]; - }; - FBSDKBridgeAPIRequest *request; - request = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeWeb - scheme:FBSDK_SHARE_WEB_SCHEME - methodName:methodName - methodVersion:nil - parameters:parameters - userInfo:nil]; - [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:request - useSafariViewController:[self _useSafariViewController] - fromViewController:self.fromViewController - completionBlock:completionBlock]; - } - return YES; -} - -- (BOOL)_showFeedBrowser:(NSError **)errorRef -{ - if (![self _validateShareContentForFeed:errorRef]) { - return NO; - } - id shareContent = self.shareContent; - NSDictionary *parameters = [FBSDKShareUtility feedShareDictionaryForContent:shareContent]; - FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { - [self _handleWebResponseParameters:response.responseParameters error:response.error cancelled:response.isCancelled]; - [FBSDKInternalUtility unregisterTransientObject:self]; - }; - FBSDKBridgeAPIRequest *request; - request = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeWeb - scheme:FBSDK_SHARE_WEB_SCHEME - methodName:FBSDK_SHARE_FEED_METHOD_NAME - methodVersion:nil - parameters:parameters - userInfo:nil]; - [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:request - useSafariViewController:[self _useSafariViewController] - fromViewController:self.fromViewController - completionBlock:completionBlock]; - return YES; -} - -- (BOOL)_showFeedWeb:(NSError **)errorRef -{ - if (![self _validateShareContentForFeed:errorRef]) { - return NO; - } - id shareContent = self.shareContent; - NSDictionary *parameters = [FBSDKShareUtility feedShareDictionaryForContent:shareContent]; - _webDialog = [FBSDKWebDialog showWithName:FBSDK_SHARE_FEED_METHOD_NAME - parameters:parameters - delegate:self]; - return YES; -} - -- (BOOL)_showNativeWithCanShowError:(NSError **)canShowErrorRef validationError:(NSError **)validationErrorRef -{ - if (![self _canShowNative]) { - if (canShowErrorRef != NULL) { - *canShowErrorRef = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode - message:@"Native share dialog is not available."]; - } - return NO; - } - if (![self _validateShareContentForNative:validationErrorRef]) { - return NO; - } - - NSString *methodName; - NSString *methodVersion; - [self _loadNativeMethodName:&methodName methodVersion:&methodVersion]; - NSDictionary *parameters = [FBSDKShareUtility parametersForShareContent:self.shareContent - shouldFailOnDataError:self.shouldFailOnDataError]; - FBSDKBridgeAPIRequest *request; - request = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeNative - scheme:[self _nativeScheme] - methodName:methodName - methodVersion:methodVersion - parameters:parameters - userInfo:nil]; - FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { - if (response.error.code == FBSDKAppVersionUnsupportedErrorCode) { - NSError *fallbackError; - if ([self _showShareSheetWithCanShowError:NULL validationError:&fallbackError] || - [self _showFeedBrowser:&fallbackError]) { - return; - } - } - NSDictionary *responseParameters = response.responseParameters; - NSString *completionGesture = responseParameters[FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; - if ([completionGesture isEqualToString:FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_CANCEL] || - response.isCancelled) { - [self _invokeDelegateDidCancel]; - } else if (response.error) { - [self _invokeDelegateDidFailWithError:response.error]; - } else { - NSMutableDictionary *results = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:results - setObject:responseParameters[FBSDK_SHARE_RESULT_POST_ID_KEY] - forKey:FBSDK_SHARE_RESULT_POST_ID_KEY]; - [self _invokeDelegateDidCompleteWithResults:results]; - } - [FBSDKInternalUtility unregisterTransientObject:self]; - }; - [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:request - useSafariViewController:[self _useSafariViewController] - fromViewController:self.fromViewController - completionBlock:completionBlock]; - return YES; -} - -- (BOOL)_showShareSheetWithCanShowError:(NSError **)canShowErrorRef validationError:(NSError **)validationErrorRef -{ - if (![self _canShowShareSheet]) { - if (canShowErrorRef != NULL) { - *canShowErrorRef = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode - message:@"Share sheet is not available."]; - } - return NO; - } - if (![self _validateShareContentForShareSheet:validationErrorRef]) { - return NO; - } - UIViewController *fromViewController = self.fromViewController; - if (!fromViewController) { - if (validationErrorRef != NULL) { - *validationErrorRef = [FBSDKShareError requiredArgumentErrorWithName:@"fromViewController" message:nil]; - } - return NO; - } - NSArray *images = [self _contentImages]; - NSArray *URLs = [self _contentURLs]; - NSArray *videoURLs = [self _contentVideoURLs]; - - Class composeViewControllerClass = [fbsdkdfl_SLComposeViewControllerClass() class]; - NSString *facebookServiceType = fbsdkdfl_SLServiceTypeFacebook(); - SLComposeViewController *composeViewController; - composeViewController = [composeViewControllerClass composeViewControllerForServiceType:facebookServiceType]; - - if (!composeViewController) { - if (canShowErrorRef != NULL) { - *canShowErrorRef = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode - message:@"Error creating SLComposeViewController."]; - } - return NO; - } - - NSString *initialText = [self _calculateInitialText]; - if (initialText.length > 0) { - [composeViewController setInitialText:initialText]; - } - - for (UIImage *image in images) { - [composeViewController addImage:image]; - } - for (NSURL *URL in URLs) { - [composeViewController addURL:URL]; - } - for (NSURL *videoURL in videoURLs) { - [composeViewController addURL:videoURL]; - } - composeViewController.completionHandler = ^(SLComposeViewControllerResult result) { - switch (result) { - case SLComposeViewControllerResultCancelled:{ - [self _invokeDelegateDidCancel]; - break; - } - case SLComposeViewControllerResultDone:{ - [self _invokeDelegateDidCompleteWithResults:@{}]; - break; - } - } - dispatch_async(dispatch_get_main_queue(), ^{ - [FBSDKInternalUtility unregisterTransientObject:self]; - }); - }; - [fromViewController presentViewController:composeViewController animated:YES completion:nil]; - return YES; -} - -- (BOOL)_showWeb:(NSError **)errorRef -{ - if (![self _validateShareContentForBrowser:errorRef]) { - return NO; - } - id shareContent = self.shareContent; - NSString *methodName; - NSDictionary *parameters; - if (![FBSDKShareUtility buildWebShareContent:shareContent - methodName:&methodName - parameters:¶meters - error:errorRef]) { - return NO; - } - _webDialog = [FBSDKWebDialog showWithName:methodName - parameters:parameters - delegate:self]; - return YES; -} - -- (BOOL)_useNativeDialog -{ - if ([self.shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - return YES; - } - FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - return [configuration useNativeDialogForDialogName:FBSDKDialogConfigurationNameShare]; -} - -- (BOOL)_useSafariViewController -{ - if ([self.shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - return NO; - } - FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - return [configuration useSafariViewControllerForDialogName:FBSDKDialogConfigurationNameShare]; -} - -- (BOOL)_validateWithError:(NSError *__autoreleasing *)errorRef -{ - if (errorRef != NULL) { - *errorRef = nil; - } - id shareContent = self.shareContent; - if (!shareContent) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"shareContent" message:nil]; - } - return NO; - } - if (![FBSDKShareUtility validateShareContent:shareContent error:errorRef]) { - return NO; - } - if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - if (![FBSDKShareUtility validateAssetLibraryURLWithShareVideoContent:(FBSDKShareVideoContent *)shareContent name:@"videoURL" error:errorRef]) { - return NO; - } - } - if ([shareContent isKindOfClass:[FBSDKShareMediaContent class]]) { - if (![FBSDKShareUtility validateAssetLibraryURLsWithShareMediaContent:(FBSDKShareMediaContent *)shareContent name:@"mediaVideoURL" error:errorRef]) { - return NO; - } - } - switch (self.mode) { - case FBSDKShareDialogModeAutomatic:{ - return ( - ([self _canShowNative] && [self _validateShareContentForNative:errorRef]) || - ([self _canShowShareSheet] && [self _validateShareContentForShareSheet:errorRef]) || - [self _validateShareContentForFeed:errorRef] || - [self _validateShareContentForBrowser:errorRef]); - } - case FBSDKShareDialogModeNative:{ - return [self _validateShareContentForNative:errorRef]; - } - case FBSDKShareDialogModeShareSheet:{ - return [self _validateShareContentForShareSheet:errorRef]; - } - case FBSDKShareDialogModeBrowser: - case FBSDKShareDialogModeWeb:{ - return [self _validateShareContentForBrowser:errorRef]; - } - case FBSDKShareDialogModeFeedBrowser: - case FBSDKShareDialogModeFeedWeb:{ - return [self _validateShareContentForFeed:errorRef]; - } - } -} - -/** - `validateWithError:` can be used by clients of this API to discover if certain features are - available for a specific `mode`. However, these features could be optional for said `mode`, in which - case `validateWithError:` should return NO but when calling `show`, the dialog must still show. - - ie: Quotes are only available if FB for iOS v52 or higher is installed. If the client adds a quote to - the `ShareLinkContent` object and FB for iOS v52 or higher is not installed, `validateWithError:` will - return NO if the `mode` is set to ShareSheet. However, calling `show` will actually show the shareSheet - without the Quote. - - This method exists to enable the behavior described above and should only be called from `validateWithError:`. - */ -- (BOOL)_validateFullyCompatibleWithError:(NSError *__autoreleasing *)errorRef -{ - id shareContent = self.shareContent; - if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - FBSDKShareLinkContent *shareLinkContent = (FBSDKShareLinkContent *)shareContent; - if (shareLinkContent.quote.length > 0 && - self.mode == FBSDKShareDialogModeShareSheet && - ![self _canUseQuoteInShareSheet]) { - if ((errorRef != NULL) && !*errorRef) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" - value:shareLinkContent - message:@"Quotes are only supported if Facebook for iOS version 52 and above is installed"]; - } - return NO; - } - } - return YES; -} - -- (BOOL)_validateShareContentForBrowser:(NSError **)errorRef -{ - id shareContent = self.shareContent; - if ([shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - if ((errorRef != NULL) && !*errorRef) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" - value:shareContent - message:@"Camera Content must be shared in `Native` mode."]; - } - return NO; - } - BOOL containsMedia; - BOOL containsPhotos; - [FBSDKShareUtility testShareContent:shareContent containsMedia:&containsMedia containsPhotos:&containsPhotos containsVideos:NULL]; - if (containsPhotos) { - if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - if ([FBSDKAccessToken currentAccessToken] != nil) { - return YES; - } - if ((errorRef != NULL) && !*errorRef) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" - value:shareContent - message:@"The web share dialog needs a valid access token to stage photos."]; - } - return NO; - } else { - if ((errorRef != NULL) && !*errorRef) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" - value:shareContent - message:@"Web share dialogs cannot include photos."]; - } - return NO; - } - } - if (containsMedia) { - if ((errorRef != NULL) && !*errorRef) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" - value:shareContent - message:@"Web share dialogs cannot include local media."]; - } - return NO; - } - return YES; -} - -- (BOOL)_validateShareContentForFeed:(NSError **)errorRef -{ - id shareContent = self.shareContent; - if (![shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - if ((errorRef != NULL) && !*errorRef) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" - value:shareContent - message:@"Feed share dialogs support FBSDKShareLinkContent."]; - } - return NO; - } else if ([shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - if ((errorRef != NULL) && !*errorRef) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" - value:shareContent - message:@"Camera Content must be shared in `Native` mode."]; - } - return NO; - } - return YES; -} - -- (BOOL)_validateShareContentForNative:(NSError **)errorRef -{ - id shareContent = self.shareContent; - if ([shareContent isKindOfClass:[FBSDKShareMediaContent class]]) { - if ([FBSDKShareUtility shareMediaContentContainsPhotosAndVideos:(FBSDKShareMediaContent *)shareContent]) { - if ((errorRef != NULL) && !*errorRef) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" - value:shareContent - message:@"Multimedia Content is only available for mode `ShareSheet`"]; - } - return NO; - } - } - if (![shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - return YES; - } - return [self _validateVideoURL:((FBSDKShareVideoContent *)shareContent).video.videoURL error:errorRef]; -} - -- (BOOL)_validateShareContentForShareSheet:(NSError **)errorRef -{ - id shareContent = self.shareContent; - if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - if ([self _contentImages].count != 0) { - return YES; - } else { - if ((errorRef != NULL) && !*errorRef) { - NSString *message = @"Share photo content must have UIImage photos in order to share with the share sheet"; - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" value:shareContent message:message]; - } - return NO; - } - } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - return ([self _canUseFBShareSheet] && - [self _validateVideoURL:((FBSDKShareVideoContent *)shareContent).video.videoURL error:errorRef]); - } else if ([shareContent isKindOfClass:[FBSDKShareMediaContent class]]) { - return ([self _canUseFBShareSheet] && - [self _validateShareMediaContentAvailability:shareContent error:errorRef] && - [FBSDKShareUtility validateShareMediaContent:(FBSDKShareMediaContent *)shareContent error:errorRef]); - } else if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - FBSDKShareOpenGraphContent *ogContent = (FBSDKShareOpenGraphContent *)shareContent; - BOOL isOGURLShare = [self _isOpenGraphURLShare:ogContent]; - - BOOL isValidOGShare = (isOGURLShare && - [ogContent.action.actionType length] != 0 && - [ogContent.previewPropertyName length] != 0); - if (!isValidOGShare) { - if ((errorRef != NULL) && !*errorRef) { - NSString *message = @"Share content must include an URL in the action, an action type, and a preview property name in order to share with the share sheet."; - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" value:shareContent message:message]; - } - } - return isValidOGShare; - } else if (![shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - if ((errorRef != NULL) && !*errorRef) { - NSString *message = @"Share content must be FBSDKShareLinkContent or FBSDKShareMediaContent in order to share " - @"with the share sheet."; - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" value:shareContent message:message]; - } - return NO; - } else if ([shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - if ((errorRef != NULL) && !*errorRef) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" - value:shareContent - message:@"Camera Content must be shared in `Native` mode."]; - } - return NO; - } - return YES; -} - -- (BOOL)_validateVideoURL:(NSURL *)videoURL error:(NSError **)errorRef -{ - if (videoURL.isFileURL) { - if ((errorRef != NULL) && !*errorRef) { - NSString *message = @"Only asset file URLs are allowed for videos."; - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"videoURL" value:videoURL message:message]; - } - return NO; - } - return YES; -} - -- (BOOL)_validateShareMediaContentAvailability:(FBSDKShareMediaContent *)shareContent error:(NSError **)errorRef -{ - if ([FBSDKShareUtility shareMediaContentContainsPhotosAndVideos:shareContent] && - self.mode == FBSDKShareDialogModeShareSheet && - ![self _canUseMMPInShareSheet]) { - if ((errorRef != NULL) && !*errorRef) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" - value:shareContent - message:@"Multimedia content (photos + videos) is only supported if Facebook for iOS version 52 and above is installed"]; - } - return NO; - } - return YES; -} - -- (void)_invokeDelegateDidCancel -{ - NSDictionary * parameters = @{ - FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Cancelled, - }; - - [FBSDKAppEvents logImplicitEvent:FBSDLAppEventNameFBSDKEventShareDialogResult - valueToSum:nil - parameters:parameters - accessToken:[FBSDKAccessToken currentAccessToken]]; - - [_delegate sharerDidCancel:self]; -} - -- (void)_invokeDelegateDidCompleteWithResults:(NSDictionary *)results -{ - NSDictionary * parameters = @{ - FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Completed - }; - - [FBSDKAppEvents logImplicitEvent:FBSDLAppEventNameFBSDKEventShareDialogResult - valueToSum:nil - parameters:parameters - accessToken:[FBSDKAccessToken currentAccessToken]]; - - [_delegate sharer:self didCompleteWithResults:[results copy]]; -} - -- (void)_invokeDelegateDidFailWithError:(NSError *)error -{ - NSDictionary * parameters = @{ - FBSDKAppEventParameterDialogOutcome : FBSDKAppEventsDialogOutcomeValue_Failed, - FBSDKAppEventParameterDialogErrorMessage : [NSString stringWithFormat:@"%@", error] - }; - - [FBSDKAppEvents logImplicitEvent:FBSDLAppEventNameFBSDKEventShareDialogResult - valueToSum:nil - parameters:parameters - accessToken:[FBSDKAccessToken currentAccessToken]]; - - [_delegate sharer:self didFailWithError:error]; -} - -- (void)_logDialogShow -{ - NSString *shareMode = NSStringFromFBSDKShareDialogMode(self.mode); - - NSString *contentType; - if([self.shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypeOpenGraph; - } else if ([self.shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypeStatus; - } else if ([self.shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypePhoto; - } else if ([self.shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypeVideo; - } else if ([self.shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - contentType = FBSDKAppEventsDialogShareContentTypeCamera; - } else { - contentType = FBSDKAppEventsDialogShareContentTypeUnknown; - } - - - NSDictionary *parameters = @{ - FBSDKAppEventParameterDialogMode : shareMode, - FBSDKAppEventParameterDialogShareContentType : contentType, - - }; - - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKEventShareDialogShow - valueToSum:nil - parameters:parameters - accessToken:[FBSDKAccessToken currentAccessToken]]; -} - -- (NSString *)_calculateInitialText -{ - NSString *initialText; - if ([self _canAttributeThroughShareSheet]) { - NSMutableDictionary *initialTextDictionary = [NSMutableDictionary new]; - initialTextDictionary[@"app_id"] = [FBSDKSettings appID]; - NSString *hashtag = [FBSDKShareUtility hashtagStringFromHashtag:self.shareContent.hashtag]; - if (hashtag != nil) { - initialTextDictionary[@"hashtags"] = @[hashtag]; - } - if ([self.shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - NSString *quote = [(FBSDKShareLinkContent *)self.shareContent quote]; - if (quote != nil) { - initialTextDictionary[@"quotes"] = @[quote]; - } - } - if ([self.shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - NSDictionary *ogData = [FBSDKShareUtility parametersForShareContent:self.shareContent - shouldFailOnDataError:self.shouldFailOnDataError]; - initialTextDictionary[@"og_data"] = ogData; - } - - NSError *error = nil; - NSString *jsonString = [FBSDKInternalUtility JSONStringForObject:initialTextDictionary error:&error invalidObjectHandler:NULL]; - if (error != nil) { - return nil; - } - - NSString *JSONStartDelimiter = @"|"; - initialText = [NSString stringWithFormat:@"%@%@%@", - [self _calculatePreJSONInitialTextWithHashtag:hashtag], - JSONStartDelimiter, - jsonString]; - } else { - NSString *hashtag = [FBSDKShareUtility hashtagStringFromHashtag:self.shareContent.hashtag]; - if (hashtag != nil) { - initialText = hashtag; - } - } - return initialText; -} - -// Not all versions of the Share Extension support JSON. Adding this text before allows backward compatibility -- (NSString *)_calculatePreJSONInitialTextWithHashtag:(NSString *)hashtag -{ - NSMutableString *text = [NSMutableString new]; - [text appendString:[NSString stringWithFormat:@"fb-app-id:%@", [FBSDKSettings appID]]]; - if (hashtag != nil) { - [text appendString:@" "]; - [text appendString:hashtag]; - } - return [text copy]; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h deleted file mode 100644 index c756802de..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - NS_ENUM(NSUInteger, FBSDKShareDialogMode) - Modes for the FBSDKShareDialog. - - The automatic mode will progressively check the availability of different modes and open the most - appropriate mode for the dialog that is available. - */ -typedef NS_ENUM(NSUInteger, FBSDKShareDialogMode) -{ - /** - Acts with the most appropriate mode that is available. - */ - FBSDKShareDialogModeAutomatic = 0, - /** - @Displays the dialog in the main native Facebook app. - */ - FBSDKShareDialogModeNative, - /** - @Displays the dialog in the iOS integrated share sheet. - */ - FBSDKShareDialogModeShareSheet, - /** - @Displays the dialog in Safari. - */ - FBSDKShareDialogModeBrowser, - /** - @Displays the dialog in a UIWebView within the app. - */ - FBSDKShareDialogModeWeb, - /** - @Displays the feed dialog in Safari. - */ - FBSDKShareDialogModeFeedBrowser, - /** - @Displays the feed dialog in a UIWebView within the app. - */ - FBSDKShareDialogModeFeedWeb, -}; - -/** - Converts an FBLikeControlObjectType to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKShareDialogMode(FBSDKShareDialogMode dialogMode); diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.m deleted file mode 100644 index 7791adb45..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.m +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareDialogMode.h" - -#import "FBSDKCoreKit+Internal.h" - -NSString *NSStringFromFBSDKShareDialogMode(FBSDKShareDialogMode dialogMode) -{ - switch (dialogMode) { - case FBSDKShareDialogModeAutomatic:{ - return FBSDKAppEventsDialogShareModeAutomatic; - } - case FBSDKShareDialogModeBrowser:{ - return FBSDKAppEventsDialogShareModeBrowser; - } - case FBSDKShareDialogModeNative:{ - return FBSDKAppEventsDialogShareModeNative; - } - case FBSDKShareDialogModeShareSheet:{ - return FBSDKAppEventsDialogShareModeShareSheet; - } - case FBSDKShareDialogModeWeb:{ - return FBSDKAppEventsDialogShareModeWeb; - } - case FBSDKShareDialogModeFeedBrowser: { - return FBSDKAppEventsDialogShareModeFeedBrowser; - } - case FBSDKShareDialogModeFeedWeb:{ - return FBSDKAppEventsDialogShareModeFeedWeb; - } - default:{ - return FBSDKAppEventsDialogShareModeUnknown; - } - } -} diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h deleted file mode 100644 index 30e36aa4c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#if !TARGET_OS_TV -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#else -#import -#import -#endif diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h deleted file mode 100644 index b4290d16c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - A model for status and link content to be shared. - */ -@interface FBSDKShareLinkContent : NSObject - -/** - The description of the link. - - If not specified, this field is automatically populated by information scraped from the contentURL, - typically the title of the page. This value may be discarded for specially handled links (ex: iTunes URLs). - - Returns: The description of the link - - @deprecated `contentDescription` is deprecated from Graph API 2.9. - For more information, see https://developers.facebook.com/docs/apps/changelog#v2_9_deprecations. - */ -@property (nonatomic, readonly) NSString *contentDescription - DEPRECATED_MSG_ATTRIBUTE("`contentDescription` is deprecated from Graph API 2.9"); - -/** - The title to display for this link. - - This value may be discarded for specially handled links (ex: iTunes URLs). - - Returns: The link title - - @deprecated `contentTitle` is deprecated from Graph API 2.9. - For more information, see https://developers.facebook.com/docs/apps/changelog#v2_9_deprecations - */ -@property (nonatomic, readonly) NSString *contentTitle - DEPRECATED_MSG_ATTRIBUTE("`contentTitle` is deprecated from Graph API 2.9"); - -/** - The URL of a picture to attach to this content. - - Returns: The network URL of an image - - @deprecated `imageURL` is deprecated from Graph API 2.9. - For more information, see https://developers.facebook.com/docs/apps/changelog#v2_9_deprecations - */ -@property (nonatomic, readonly) NSURL *imageURL - DEPRECATED_MSG_ATTRIBUTE("`imageURL` is deprecated from Graph API 2.9"); - -/** - Some quote text of the link. - - If specified, the quote text will render with custom styling on top of the link. - - Returns: The quote text of a link - */ -@property (nonatomic, copy) NSString *quote; - -/** - Compares the receiver to another link content. - - Parameter content: The other content - - Returns: YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToShareLinkContent:(FBSDKShareLinkContent *)content; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.m deleted file mode 100644 index 4ebc980ef..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.m +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareLinkContent+Internal.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKHashtag.h" -#import "FBSDKShareUtility.h" - -#define FBSDK_SHARE_STATUS_CONTENT_CONTENT_DESCRIPTION_KEY @"contentDescription" -#define FBSDK_SHARE_STATUS_CONTENT_CONTENT_TITLE_KEY @"contentTitle" -#define FBSDK_SHARE_STATUS_CONTENT_CONTENT_URL_KEY @"contentURL" -#define FBSDK_SHARE_STATUS_CONTENT_HASHTAG_KEY @"hashtag" -#define FBSDK_SHARE_STATUS_CONTENT_IMAGE_URL_KEY @"imageURL" -#define FBSDK_SHARE_STATUS_CONTENT_PEOPLE_IDS_KEY @"peopleIDs" -#define FBSDK_SHARE_STATUS_CONTENT_PLACE_ID_KEY @"placeID" -#define FBSDK_SHARE_STATUS_CONTENT_REF_KEY @"ref" -#define FBSDK_SHARE_STATUS_CONTENT_PAGE_ID_KEY @"pageID" -#define FBSDK_SHARE_STATUS_CONTENT_QUOTE_TEXT_KEY @"quote" -#define FBSDK_SHARE_STATUS_CONTENT_FEED_PARAMETERS_KEY @"feedParameters" -#define FBSDK_SHARE_STATUS_CONTENT_UUID_KEY @"uuid" - -@implementation FBSDKShareLinkContent - -#pragma mark - Properties - -@synthesize contentURL = _contentURL; -@synthesize hashtag = _hashtag; -@synthesize peopleIDs = _peopleIDs; -@synthesize placeID = _placeID; -@synthesize ref = _ref; -@synthesize pageID = _pageID; -@synthesize feedParameters = _feedParameters; -@synthesize quote = _quote; -@synthesize shareUUID = _shareUUID; - -#pragma mark - Initializer - -- (instancetype)init -{ - self = [super init]; - if (self) { - _shareUUID = [NSUUID UUID].UUIDString; - } - return self; -} - -#pragma mark - Setters - -- (void)setPeopleIDs:(NSArray *)peopleIDs -{ - [FBSDKShareUtility assertCollection:peopleIDs ofClass:[NSString class] name:@"peopleIDs"]; - if (![FBSDKInternalUtility object:_peopleIDs isEqualToObject:peopleIDs]) { - _peopleIDs = [peopleIDs copy]; - } -} - -- (void)setFeedParameters:(NSDictionary *)feedParameters -{ - if (![_feedParameters isEqualToDictionary:feedParameters]) { - _feedParameters = [feedParameters copy]; - } -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [_contentDescription hash], - [_contentURL hash], - [_hashtag hash], - [_imageURL hash], - [_peopleIDs hash], - [_placeID hash], - [_ref hash], - [_pageID hash], - [_contentTitle hash], - [_feedParameters hash], - [_quote hash], - [_shareUUID hash], - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKShareLinkContent class]]) { - return NO; - } - return [self isEqualToShareLinkContent:(FBSDKShareLinkContent *)object]; -} - -- (BOOL)isEqualToShareLinkContent:(FBSDKShareLinkContent *)content -{ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - return (content && - [FBSDKInternalUtility object:_contentDescription isEqualToObject:content.contentDescription] && - [FBSDKInternalUtility object:_contentTitle isEqualToObject:content.contentTitle] && - [FBSDKInternalUtility object:_contentURL isEqualToObject:content.contentURL] && - [FBSDKInternalUtility object:_hashtag isEqualToObject:content.hashtag] && - [FBSDKInternalUtility object:_feedParameters isEqualToObject:content.feedParameters] && - [FBSDKInternalUtility object:_imageURL isEqualToObject:content.imageURL] && - [FBSDKInternalUtility object:_peopleIDs isEqualToObject:content.peopleIDs] && - [FBSDKInternalUtility object:_placeID isEqualToObject:content.placeID] && - [FBSDKInternalUtility object:_ref isEqualToObject:content.ref] && - [FBSDKInternalUtility object:_pageID isEqualToObject:content.pageID] && - [FBSDKInternalUtility object:_shareUUID isEqualToObject:content.shareUUID]) && - [FBSDKInternalUtility object:_quote isEqualToObject:content.quote]; -#pragma clang diagnostic pop -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _contentDescription = [decoder decodeObjectOfClass:[NSString class] - forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_DESCRIPTION_KEY]; - _contentTitle = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_TITLE_KEY]; - _contentURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_URL_KEY]; - _feedParameters = [decoder decodeObjectOfClass:[NSDictionary class] forKey:FBSDK_SHARE_STATUS_CONTENT_FEED_PARAMETERS_KEY]; - _hashtag = [decoder decodeObjectOfClass:[FBSDKHashtag class] forKey:FBSDK_SHARE_STATUS_CONTENT_HASHTAG_KEY]; - _imageURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_STATUS_CONTENT_IMAGE_URL_KEY]; - _peopleIDs = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_SHARE_STATUS_CONTENT_PEOPLE_IDS_KEY]; - _placeID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_STATUS_CONTENT_PLACE_ID_KEY]; - _ref = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_STATUS_CONTENT_REF_KEY]; - _pageID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_STATUS_CONTENT_PAGE_ID_KEY]; - _quote = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_STATUS_CONTENT_QUOTE_TEXT_KEY]; - _shareUUID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_STATUS_CONTENT_UUID_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_contentDescription forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_DESCRIPTION_KEY]; - [encoder encodeObject:_contentTitle forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_TITLE_KEY]; - [encoder encodeObject:_contentURL forKey:FBSDK_SHARE_STATUS_CONTENT_CONTENT_URL_KEY]; - [encoder encodeObject:_feedParameters forKey:FBSDK_SHARE_STATUS_CONTENT_FEED_PARAMETERS_KEY]; - [encoder encodeObject:_hashtag forKey:FBSDK_SHARE_STATUS_CONTENT_HASHTAG_KEY]; - [encoder encodeObject:_imageURL forKey:FBSDK_SHARE_STATUS_CONTENT_IMAGE_URL_KEY]; - [encoder encodeObject:_peopleIDs forKey:FBSDK_SHARE_STATUS_CONTENT_PEOPLE_IDS_KEY]; - [encoder encodeObject:_placeID forKey:FBSDK_SHARE_STATUS_CONTENT_PLACE_ID_KEY]; - [encoder encodeObject:_ref forKey:FBSDK_SHARE_STATUS_CONTENT_REF_KEY]; - [encoder encodeObject:_pageID forKey:FBSDK_SHARE_STATUS_CONTENT_PAGE_ID_KEY]; - [encoder encodeObject:_quote forKey:FBSDK_SHARE_STATUS_CONTENT_QUOTE_TEXT_KEY]; - [encoder encodeObject:_shareUUID forKey:FBSDK_SHARE_STATUS_CONTENT_UUID_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareLinkContent *copy = [[FBSDKShareLinkContent alloc] init]; - copy->_contentDescription = [_contentDescription copy]; - copy->_contentTitle = [_contentTitle copy]; - copy->_contentURL = [_contentURL copy]; - copy->_feedParameters = [_feedParameters copy]; - copy->_hashtag = [_hashtag copy]; - copy->_imageURL = [_imageURL copy]; - copy->_peopleIDs = [_peopleIDs copy]; - copy->_placeID = [_placeID copy]; - copy->_ref = [_ref copy]; - copy->_pageID = [_pageID copy]; - copy->_quote = [_quote copy]; - copy->_shareUUID = [_shareUUID copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h deleted file mode 100644 index 2029422ff..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - A model for media content (photo or video) to be shared. - */ -@interface FBSDKShareMediaContent : NSObject - -/** - Media to be shared. - - Returns: Array of the media (FBSDKSharePhoto or FBSDKShareVideo) - */ -@property (nonatomic, copy) NSArray *media; - -/** - Compares the receiver to another media content. - - Parameter content: The other content - - Returns: YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToShareMediaContent:(FBSDKShareMediaContent *)content; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.m deleted file mode 100644 index 9ebbaf3c9..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.m +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareMediaContent.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKHashtag.h" -#import "FBSDKSharePhoto.h" -#import "FBSDKShareUtility.h" -#import "FBSDKShareVideo.h" - -#define FBSDK_SHARE_MEDIA_CONTENT_CONTENT_URL_KEY @"contentURL" -#define FBSDK_SHARE_MEDIA_CONTENT_HASHTAG_KEY @"hashtag" -#define FBSDK_SHARE_MEDIA_CONTENT_PEOPLE_IDS_KEY @"peopleIDs" -#define FBSDK_SHARE_MEDIA_CONTENT_MEDIA_KEY @"media" -#define FBSDK_SHARE_MEDIA_CONTENT_PLACE_ID_KEY @"placeID" -#define FBSDK_SHARE_MEDIA_CONTENT_REF_KEY @"ref" -#define FBSDK_SHARE_MEDIA_CONTENT_PAGE_ID_KEY @"pageID" -#define FBSDK_SHARE_MEDIA_CONTENT_UUID_KEY @"uuid" - -@implementation FBSDKShareMediaContent - -#pragma mark - Properties - -@synthesize contentURL = _contentURL; -@synthesize hashtag = _hashtag; -@synthesize peopleIDs = _peopleIDs; -@synthesize placeID = _placeID; -@synthesize ref = _ref; -@synthesize pageID = _pageID; -@synthesize shareUUID = _shareUUID; - -#pragma mark - Initializer - -- (instancetype)init -{ - self = [super init]; - if (self) { - _shareUUID = [NSUUID UUID].UUIDString; - } - return self; -} - -#pragma mark - Setters - -- (void)setPeopleIDs:(NSArray *)peopleIDs -{ - [FBSDKShareUtility assertCollection:peopleIDs ofClass:[NSString class] name:@"peopleIDs"]; - if (![FBSDKInternalUtility object:_peopleIDs isEqualToObject:peopleIDs]) { - _peopleIDs = [peopleIDs copy]; - } -} - -- (void)setMedia:(NSArray *)media -{ - [FBSDKShareUtility assertCollection:media ofClassStrings:@[NSStringFromClass([FBSDKSharePhoto class]), NSStringFromClass([FBSDKShareVideo class])] name:@"media"]; - if (![FBSDKInternalUtility object:_media isEqualToObject:media]) { - _media = [media copy]; - } -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [_contentURL hash], - [_hashtag hash], - [_peopleIDs hash], - [_media hash], - [_placeID hash], - [_ref hash], - [_pageID hash], - [_shareUUID hash], - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKShareMediaContent class]]) { - return NO; - } - return [self isEqualToShareMediaContent:(FBSDKShareMediaContent *)object]; -} - -- (BOOL)isEqualToShareMediaContent:(FBSDKShareMediaContent *)content -{ - return (content && - [FBSDKInternalUtility object:_contentURL isEqualToObject:content.contentURL] && - [FBSDKInternalUtility object:_hashtag isEqualToObject:content.hashtag] && - [FBSDKInternalUtility object:_peopleIDs isEqualToObject:content.peopleIDs] && - [FBSDKInternalUtility object:_media isEqualToObject:content.media] && - [FBSDKInternalUtility object:_placeID isEqualToObject:content.placeID] && - [FBSDKInternalUtility object:_ref isEqualToObject:content.ref] && - [FBSDKInternalUtility object:_shareUUID isEqualToObject:content.shareUUID] && - [FBSDKInternalUtility object:_pageID isEqualToObject:content.pageID]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _contentURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_MEDIA_CONTENT_CONTENT_URL_KEY]; - _hashtag = [decoder decodeObjectOfClass:[FBSDKHashtag class] forKey:FBSDK_SHARE_MEDIA_CONTENT_HASHTAG_KEY]; - _peopleIDs = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_SHARE_MEDIA_CONTENT_PEOPLE_IDS_KEY]; - NSSet *classes = [NSSet setWithObjects:[NSArray class], [FBSDKSharePhoto class], nil]; - _media = [decoder decodeObjectOfClasses:classes forKey:FBSDK_SHARE_MEDIA_CONTENT_MEDIA_KEY]; - _placeID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_MEDIA_CONTENT_PLACE_ID_KEY]; - _ref = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_MEDIA_CONTENT_REF_KEY]; - _pageID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_MEDIA_CONTENT_PAGE_ID_KEY]; - _shareUUID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_MEDIA_CONTENT_UUID_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_contentURL forKey:FBSDK_SHARE_MEDIA_CONTENT_CONTENT_URL_KEY]; - [encoder encodeObject:_hashtag forKey:FBSDK_SHARE_MEDIA_CONTENT_HASHTAG_KEY]; - [encoder encodeObject:_peopleIDs forKey:FBSDK_SHARE_MEDIA_CONTENT_PEOPLE_IDS_KEY]; - [encoder encodeObject:_media forKey:FBSDK_SHARE_MEDIA_CONTENT_MEDIA_KEY]; - [encoder encodeObject:_placeID forKey:FBSDK_SHARE_MEDIA_CONTENT_PLACE_ID_KEY]; - [encoder encodeObject:_ref forKey:FBSDK_SHARE_MEDIA_CONTENT_REF_KEY]; - [encoder encodeObject:_pageID forKey:FBSDK_SHARE_MEDIA_CONTENT_PAGE_ID_KEY]; - [encoder encodeObject:_shareUUID forKey:FBSDK_SHARE_MEDIA_CONTENT_UUID_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareMediaContent *copy = [[FBSDKShareMediaContent alloc] init]; - copy->_contentURL = [_contentURL copy]; - copy->_hashtag = [_hashtag copy]; - copy->_peopleIDs = [_peopleIDs copy]; - copy->_media = [_media copy]; - copy->_placeID = [_placeID copy]; - copy->_ref = [_ref copy]; - copy->_pageID = [_pageID copy]; - copy->_shareUUID = [_shareUUID copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h deleted file mode 100644 index ad970f570..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - A base interface for Messenger share action buttons. - */ -@protocol FBSDKShareMessengerActionButton - -/** - The title displayed to the user for the button. - - Returns: The title for the button. - */ -@property (nonatomic, copy) NSString *title; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h deleted file mode 100644 index ffc1b7f9f..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@class FBSDKShareMessengerGenericTemplateElement; - -typedef NS_ENUM(NSUInteger, FBSDKShareMessengerGenericTemplateImageAspectRatio) { - FBSDKShareMessengerGenericTemplateImageAspectRatioHorizontal = 0, - FBSDKShareMessengerGenericTemplateImageAspectRatioSquare -}; - -/** - A model for sharing a generic template element to Messenger. This wrapper element allows - specifying whether or not the bubble is sharable and what aspect to render the images. - See https://developers.facebook.com/docs/messenger-platform/send-messages/template/generic - for more details. - */ -@interface FBSDKShareMessengerGenericTemplateContent : NSObject - -/** - This specifies whether or not this generic template message can be shared again after the - initial share. Defaults to false. - */ -@property (nonatomic, assign) BOOL isSharable; - -/** - The aspect ratio for when the image is rendered in the generic template bubble after being - shared. Defaults to horizontal. - */ -@property (nonatomic, assign) FBSDKShareMessengerGenericTemplateImageAspectRatio imageAspectRatio; - -/** - A generic template element with a title, optional subtitle, optional image, etc. Required. - */ -@property (nonatomic, copy) FBSDKShareMessengerGenericTemplateElement *element; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.m deleted file mode 100644 index c46fe6ffc..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.m +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareMessengerGenericTemplateContent.h" - -#import "FBSDKShareMessengerGenericTemplateElement.h" - -static NSString *const kGenericTemplatePageIDKey = @"pageID"; -static NSString *const kGenericTemplateUUIDKey = @"UUID"; -static NSString *const kGenericTemplateIsSharableKey = @"isSharable"; -static NSString *const kGenericTemplateImageAspectRatioKey = @"imageAspectRatio"; -static NSString *const kGenericTemplateElementKey = @"element"; - -@implementation FBSDKShareMessengerGenericTemplateContent - -#pragma mark - Properties - -@synthesize contentURL = _contentURL; -@synthesize hashtag = _hashtag; -@synthesize peopleIDs = _peopleIDs; -@synthesize placeID = _placeID; -@synthesize ref = _ref; -@synthesize pageID = _pageID; -@synthesize shareUUID = _shareUUID; - -#pragma mark - Initializer - -- (instancetype)init -{ - self = [super init]; - if (self) { - _shareUUID = [NSUUID UUID].UUIDString; - } - return self; -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _pageID = [decoder decodeObjectOfClass:[NSString class] forKey:kGenericTemplatePageIDKey]; - _isSharable = [decoder decodeBoolForKey:kGenericTemplateIsSharableKey]; - _imageAspectRatio = [[decoder decodeObjectOfClass:[NSNumber class] forKey:kGenericTemplateImageAspectRatioKey] unsignedIntegerValue]; - _element = [decoder decodeObjectForKey:kGenericTemplateElementKey]; - _shareUUID = [decoder decodeObjectOfClass:[NSString class] forKey:kGenericTemplateUUIDKey]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_pageID forKey:kGenericTemplatePageIDKey]; - [encoder encodeBool:_isSharable forKey:kGenericTemplateIsSharableKey]; - [encoder encodeObject:@(_imageAspectRatio) forKey:kGenericTemplateImageAspectRatioKey]; - [encoder encodeObject:_element forKey:kGenericTemplateElementKey]; - [encoder encodeObject:_shareUUID forKey:kGenericTemplateUUIDKey]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareMessengerGenericTemplateContent *copy = [[FBSDKShareMessengerGenericTemplateContent alloc] init]; - copy->_pageID = [_pageID copy]; - copy->_isSharable = _isSharable; - copy->_imageAspectRatio = _imageAspectRatio; - copy->_element = [_element copy]; - copy->_shareUUID = [_shareUUID copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h deleted file mode 100644 index d70dd9631..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import - -/** - A model for sharing a generic template element to Messenger. This allows specifying title, subtitle, - image, default action, and any other buttons. Title is required. See - https://developers.facebook.com/docs/messenger-platform/send-messages/template/generic for more details. - */ -@interface FBSDKShareMessengerGenericTemplateElement : NSObject - -/** - The rendered title for the shared generic template element. Required. - */ -@property (nonatomic, copy) NSString *title; - -/** - The rendered subtitle for the shared generic template element. Optional. - */ -@property (nonatomic, copy) NSString *subtitle; - -/** - The image url that will be downloaded and rendered at the top of the generic template. Optional. - */ -@property (nonatomic, copy) NSURL *imageURL; - -/** - The default action executed when this shared generic tempate is tapped. Title for this button is ignored. Optional. - */ -@property (nonatomic, copy) id defaultAction; - -/** - This specifies what action button to show below the generic template. Optional. - */ -@property (nonatomic, copy) id button; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.m deleted file mode 100644 index 7268f780d..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.m +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareMessengerGenericTemplateElement.h" - -static NSString *const kGenericTemplateTitleKey = @"title"; -static NSString *const kGenericTemplateSubtitleKey = @"subtitle"; -static NSString *const kGenericTemplateImageURLKey = @"imageURL"; -static NSString *const kGenericTemplateDefaultActionKey = @"defaultAction"; -static NSString *const kGenericTemplateButtonKey = @"button"; - -@implementation FBSDKShareMessengerGenericTemplateElement - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _title = [decoder decodeObjectOfClass:[NSString class] forKey:kGenericTemplateTitleKey]; - _subtitle = [decoder decodeObjectOfClass:[NSString class] forKey:kGenericTemplateSubtitleKey]; - _imageURL = [decoder decodeObjectOfClass:[NSURL class] forKey:kGenericTemplateImageURLKey]; - _defaultAction = [decoder decodeObjectForKey:kGenericTemplateDefaultActionKey]; - _button = [decoder decodeObjectForKey:kGenericTemplateButtonKey]; - - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_title forKey:kGenericTemplateTitleKey]; - [encoder encodeObject:_subtitle forKey:kGenericTemplateSubtitleKey]; - [encoder encodeObject:_imageURL forKey:kGenericTemplateImageURLKey]; - [encoder encodeObject:_defaultAction forKey:kGenericTemplateDefaultActionKey]; - [encoder encodeObject:_button forKey:kGenericTemplateButtonKey]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareMessengerGenericTemplateElement *copy = [[FBSDKShareMessengerGenericTemplateElement alloc] init]; - copy->_title = [_title copy]; - copy->_subtitle = [_subtitle copy]; - copy->_imageURL = [_imageURL copy]; - copy->_defaultAction = [_defaultAction copy]; - copy->_button = [_button copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h deleted file mode 100644 index 142702d06..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import - -typedef NS_ENUM(NSUInteger, FBSDKShareMessengerMediaTemplateMediaType) { - FBSDKShareMessengerMediaTemplateMediaTypeImage = 0, - FBSDKShareMessengerMediaTemplateMediaTypeVideo -}; - -/** - A model for sharing media template content. See - https://developers.facebook.com/docs/messenger-platform/send-messages/template/media for details. - */ -@interface FBSDKShareMessengerMediaTemplateContent : NSObject - -/** - The media type (image or video) for this content. This must match the media type specified in the - attachmentID/mediaURL to avoid an error when sharing. Defaults to image. - */ -@property (nonatomic, assign) FBSDKShareMessengerMediaTemplateMediaType mediaType; - -/** - The attachmentID of the item to share. Optional, but either attachmentID or mediaURL must be specified. - */ -@property (nonatomic, copy, readonly) NSString *attachmentID; - -/** - The Facebook url for this piece of media. External urls will not work; this must be a Facebook url. - See https://developers.facebook.com/docs/messenger-platform/send-messages/template/media for details. - Optional, but either attachmentID or mediaURL must be specified. - */ -@property (nonatomic, copy, readonly) NSURL *mediaURL; - -/** - This specifies what action button to show below the media. Optional. - */ -@property (nonatomic, copy) id button; - -/** - Custom initializer to create media template share with attachment id. - */ -- (instancetype)initWithAttachmentID:(NSString *)attachmentID; - -/** - Custom initializer to create media template share with media url. This must be a Facebook url - and cannot be an external url. - */ -- (instancetype)initWithMediaURL:(NSURL *)mediaURL; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.m deleted file mode 100644 index 3439fec06..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.m +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareMessengerMediaTemplateContent.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKHashtag.h" -#import "FBSDKShareUtility.h" - -static NSString *const kMediaTemplatePageIDKey = @"pageID"; -static NSString *const kMediaTemplateMediaTypeKey = @"mediaType"; -static NSString *const kMediaTemplateAttachmentIDKey = @"attachmentID"; -static NSString *const kMediaTemplateMediaURLKey = @"mediaURL"; -static NSString *const kMediaTemplateButtonKey = @"button"; -static NSString *const kMediaTemplateUUIDKey = @"uuid"; - -@implementation FBSDKShareMessengerMediaTemplateContent - -#pragma mark - Properties - -@synthesize contentURL = _contentURL; -@synthesize hashtag = _hashtag; -@synthesize peopleIDs = _peopleIDs; -@synthesize placeID = _placeID; -@synthesize ref = _ref; -@synthesize pageID = _pageID; -@synthesize shareUUID = _shareUUID; - -#pragma mark - Initializer - -- (instancetype)initWithAttachmentID:(NSString *)attachmentID -{ - self = [super init]; - if (self) { - _attachmentID = [attachmentID copy]; - _shareUUID = [NSUUID UUID].UUIDString; - } - return self; -} - -- (instancetype)initWithMediaURL:(NSURL *)mediaURL -{ - self = [super init]; - if (self) { - _mediaURL = [mediaURL copy]; - _shareUUID = [NSUUID UUID].UUIDString; - } - return self; -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _pageID = [decoder decodeObjectOfClass:[NSString class] forKey:kMediaTemplatePageIDKey]; - _mediaType = [[decoder decodeObjectForKey:kMediaTemplateMediaTypeKey] unsignedIntegerValue]; - _attachmentID = [decoder decodeObjectOfClass:[NSString class] forKey:kMediaTemplateAttachmentIDKey]; - _mediaURL = [decoder decodeObjectOfClass:[NSURL class] forKey:kMediaTemplateMediaURLKey]; - _button = [decoder decodeObjectForKey:kMediaTemplateButtonKey]; - _shareUUID = [decoder decodeObjectOfClass:[NSString class] forKey:kMediaTemplateUUIDKey]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_pageID forKey:kMediaTemplatePageIDKey]; - [encoder encodeObject:@(_mediaType) forKey:kMediaTemplateMediaTypeKey]; - [encoder encodeObject:_attachmentID forKey:kMediaTemplateAttachmentIDKey]; - [encoder encodeObject:_mediaURL forKey:kMediaTemplateMediaURLKey]; - [encoder encodeObject:_button forKey:kMediaTemplateButtonKey]; - [encoder encodeObject:_shareUUID forKey:kMediaTemplateUUIDKey]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareMessengerMediaTemplateContent *copy = [[FBSDKShareMessengerMediaTemplateContent alloc] init]; - copy->_pageID = [_pageID copy]; - copy->_mediaType = _mediaType; - copy->_attachmentID = [_attachmentID copy]; - copy->_mediaURL = [_mediaURL copy]; - copy->_button = [_button copy]; - copy->_shareUUID = [_shareUUID copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h deleted file mode 100644 index f68f51c4d..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import - -/** - This share content allows sharing a bubble that plays songs with Open Graph music. - See https://developers.facebook.com/docs/messenger-platform/send-messages/template/open-graph - for details. Passing property pageID is required for this type of share. - */ -@interface FBSDKShareMessengerOpenGraphMusicTemplateContent : NSObject - -/** - This must be an Open Graph music url. Required. - */ -@property (nonatomic, copy) NSURL *url; - -/** - This specifies what action button to show below the open graph music bubble. Optional. - */ -@property (nonatomic, copy) id button; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.m deleted file mode 100644 index df5ed4fde..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.m +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareMessengerOpenGraphMusicTemplateContent.h" - -static NSString *const kMusicTemplatePageIDKey = @"pageID"; -static NSString *const kMusicTemplateURLKey = @"url"; -static NSString *const kMusicTemplateButtonKey = @"button"; -static NSString *const kMusicTemplateUUIDKey = @"uuid"; - -@implementation FBSDKShareMessengerOpenGraphMusicTemplateContent - -#pragma mark - Properties - -@synthesize contentURL = _contentURL; -@synthesize hashtag = _hashtag; -@synthesize peopleIDs = _peopleIDs; -@synthesize placeID = _placeID; -@synthesize ref = _ref; -@synthesize pageID = _pageID; -@synthesize shareUUID = _shareUUID; - -#pragma mark - Initializer - -- (instancetype)init -{ - self = [super init]; - if (self) { - _shareUUID = [NSUUID UUID].UUIDString; - } - return self; -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _pageID = [decoder decodeObjectOfClass:[NSString class] forKey:kMusicTemplatePageIDKey]; - _url = [decoder decodeObjectOfClass:[NSURL class] forKey:kMusicTemplateURLKey]; - _button = [decoder decodeObjectForKey:kMusicTemplateButtonKey]; - _shareUUID = [decoder decodeObjectOfClass:[NSString class] forKey:kMusicTemplateUUIDKey]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_pageID forKey:kMusicTemplatePageIDKey]; - [encoder encodeObject:_url forKey:kMusicTemplateURLKey]; - [encoder encodeObject:_button forKey:kMusicTemplateButtonKey]; - [encoder encodeObject:_shareUUID forKey:kMusicTemplateUUIDKey]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareMessengerOpenGraphMusicTemplateContent *copy = [[FBSDKShareMessengerOpenGraphMusicTemplateContent alloc] init]; - copy->_pageID = [_pageID copy]; - copy->_url = [_url copy]; - copy->_button = [_button copy]; - copy->_shareUUID = [_shareUUID copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h deleted file mode 100644 index 79feadd16..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -typedef NS_ENUM(NSUInteger, FBSDKShareMessengerURLActionButtonWebviewHeightRatio) { - FBSDKShareMessengerURLActionButtonWebviewHeightRatioFull = 0, - FBSDKShareMessengerURLActionButtonWebviewHeightRatioTall, - FBSDKShareMessengerURLActionButtonWebviewHeightRatioCompact -}; - -/** - A model for a Messenger share URL action button. - */ -@interface FBSDKShareMessengerURLActionButton : NSObject - -/** - The url that this button should open when tapped. Required. - */ -@property (nonatomic, copy) NSURL *url; - -/** - This controls the display height of the webview when shown in the Messenger app. Defaults to Full. - */ -@property (nonatomic, assign) FBSDKShareMessengerURLActionButtonWebviewHeightRatio webviewHeightRatio; - -/** - This must be true if the url is a Messenger Extensions url. Defaults to NO. - */ -@property (nonatomic, assign) BOOL isMessengerExtensionURL; - -/** - This is a fallback url for a Messenger Extensions enabled button. It is used on clients that do not support - Messenger Extensions. If this is not defined, the url will be used as a fallback. Optional, but ignored - unless isMessengerExtensionURL == YES. - */ -@property (nonatomic, copy) NSURL *fallbackURL; - -/** - This controls whether we want to hide the share button in the webview or not. It is useful to hide the share - button when the webview is user-specific and contains sensitive information. Defaults to NO. - */ -@property (nonatomic, assign) BOOL shouldHideWebviewShareButton; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.m deleted file mode 100644 index 60df77cf6..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.m +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareMessengerURLActionButton.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareUtility.h" - -static NSString *const kURLActionButtonTitleKey = @"title"; -static NSString *const kURLActionButtonURLKey = @"url"; -static NSString *const kURLActionButtonWebviewHeightRatioKey = @"webviewHeightRatio"; -static NSString *const kURLActionButtonMessengerExtensionsKey = @"messengerExtensions"; -static NSString *const kURLActionButtonFallbackURLKey = @"fallbackURL"; -static NSString *const kURLActionButtonShouldHideWebviewShareButtonKey = @"shouldHideWebviewShareButton"; - -@implementation FBSDKShareMessengerURLActionButton - -#pragma mark - Properties - -@synthesize title = _title; - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _title = [decoder decodeObjectOfClass:[NSString class] forKey:kURLActionButtonTitleKey]; - _url = [decoder decodeObjectOfClass:[NSURL class] forKey:kURLActionButtonURLKey]; - _webviewHeightRatio = [[decoder decodeObjectOfClass:[NSNumber class] forKey:kURLActionButtonWebviewHeightRatioKey] unsignedIntegerValue]; - _isMessengerExtensionURL = [decoder decodeBoolForKey:kURLActionButtonMessengerExtensionsKey]; - _fallbackURL = [decoder decodeObjectOfClass:[NSURL class] forKey:kURLActionButtonFallbackURLKey]; - _shouldHideWebviewShareButton = [decoder decodeBoolForKey:kURLActionButtonShouldHideWebviewShareButtonKey]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_title forKey:kURLActionButtonTitleKey]; - [encoder encodeObject:_url forKey:kURLActionButtonURLKey]; - [encoder encodeObject:@(_webviewHeightRatio) forKey:kURLActionButtonWebviewHeightRatioKey]; - [encoder encodeBool:_isMessengerExtensionURL forKey:kURLActionButtonMessengerExtensionsKey]; - [encoder encodeObject:_fallbackURL forKey:kURLActionButtonFallbackURLKey]; - [encoder encodeBool:_shouldHideWebviewShareButton forKey:kURLActionButtonShouldHideWebviewShareButtonKey]; - -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareMessengerURLActionButton *copy = [[FBSDKShareMessengerURLActionButton alloc] init]; - copy->_title = [_title copy]; - copy->_url = [_url copy]; - copy->_webviewHeightRatio = _webviewHeightRatio; - copy->_isMessengerExtensionURL = _isMessengerExtensionURL; - copy->_fallbackURL = [_fallbackURL copy]; - copy->_shouldHideWebviewShareButton = _shouldHideWebviewShareButton; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h deleted file mode 100644 index d30ebad5e..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import -#import - -/** - An Open Graph Action for sharing. - - The property keys MUST have namespaces specified on them, such as `og:image`. - */ -@interface FBSDKShareOpenGraphAction : FBSDKShareOpenGraphValueContainer - -/** - Convenience method to build a new action and set the object for the specified key. - - Parameter actionType: The action type of the receiver - - Parameter object: The Open Graph object represented by this action - - Parameter key: The key for the object - */ -+ (instancetype)actionWithType:(NSString *)actionType object:(FBSDKShareOpenGraphObject *)object key:(NSString *)key; - -/** - Convenience method to build a new action and set the object for the specified key. - - Parameter actionType: The action type of the receiver - - Parameter objectID: The ID of an existing Open Graph object - - Parameter key: The key for the object - */ -+ (instancetype)actionWithType:(NSString *)actionType objectID:(NSString *)objectID key:(NSString *)key; - -/** - Convenience method to build a new action and set the object for the specified key. - - Parameter actionType: The action type of the receiver - - Parameter objectURL: The URL to a page that defines the Open Graph object with meta tags - - Parameter key: The key for the object - */ -+ (instancetype)actionWithType:(NSString *)actionType objectURL:(NSURL *)objectURL key:(NSString *)key; - -/** - Gets the action type. - - Returns: The action type - */ -@property (nonatomic, copy) NSString *actionType; - -/** - Compares the receiver to another Open Graph Action. - - Parameter action: The other action - - Returns: YES if the receiver's values are equal to the other action's values; otherwise NO - */ -- (BOOL)isEqualToShareOpenGraphAction:(FBSDKShareOpenGraphAction *)action; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.m deleted file mode 100644 index 8211b595c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.m +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareOpenGraphAction.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareOpenGraphValueContainer+Internal.h" - -#define FBSDK_SHARE_OPEN_GRAPH_ACTION_TYPE_KEY @"type" - -@implementation FBSDKShareOpenGraphAction - -#pragma mark - Class Methods - -+ (instancetype)actionWithType:(NSString *)actionType object:(FBSDKShareOpenGraphObject *)object key:(NSString *)key -{ - FBSDKShareOpenGraphAction *action = [[FBSDKShareOpenGraphAction alloc] init]; - action.actionType = actionType; - [action setObject:object forKey:key]; - return action; -} - -+ (instancetype)actionWithType:(NSString *)actionType objectID:(NSString *)objectID key:(NSString *)key -{ - FBSDKShareOpenGraphAction *action = [[FBSDKShareOpenGraphAction alloc] init]; - action.actionType = actionType; - [action setString:objectID forKey:key]; - return action; -} - -+ (instancetype)actionWithType:(NSString *)actionType objectURL:(NSURL *)objectURL key:(NSString *)key -{ - FBSDKShareOpenGraphAction *action = [[FBSDKShareOpenGraphAction alloc] init]; - action.actionType = actionType; - [action setURL:objectURL forKey:key]; - return action; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - return [FBSDKMath hashWithInteger:[super hash] andInteger:[_actionType hash]]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKShareOpenGraphAction class]]) { - return NO; - } - return [self isEqualToShareOpenGraphAction:(FBSDKShareOpenGraphAction *)object]; -} - -- (BOOL)isEqualToShareOpenGraphAction:(FBSDKShareOpenGraphAction *)action -{ - return (action && - [FBSDKInternalUtility object:_actionType isEqualToObject:action.actionType] && - [self isEqualToShareOpenGraphValueContainer:action]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [super initWithCoder:decoder])) { - _actionType = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_OPEN_GRAPH_ACTION_TYPE_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [super encodeWithCoder:encoder]; - [encoder encodeObject:_actionType forKey:FBSDK_SHARE_OPEN_GRAPH_ACTION_TYPE_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareOpenGraphAction *copy = [[FBSDKShareOpenGraphAction alloc] init]; - copy->_actionType = [_actionType copy]; - [copy parseProperties:[self allProperties]]; - return copy; -} - -#pragma mark - Internal Methods - -- (BOOL)requireKeyNamespace -{ - return NO; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h deleted file mode 100644 index 43286dcfa..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import - -/** - A model for Open Graph content to be shared. - */ -@interface FBSDKShareOpenGraphContent : NSObject - -/** - Open Graph Action to be shared. - - Returns: The action - */ -@property (nonatomic, copy) FBSDKShareOpenGraphAction *action; - -/** - Property name that points to the primary Open Graph Object in the action. - - The value that this action points to will be use for rendering the preview for the share. - - Returns: The property name for the Open Graph Object in the action - */ -@property (nonatomic, copy) NSString *previewPropertyName; - -/** - Compares the receiver to another Open Graph content. - - Parameter content: The other content - - Returns: YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToShareOpenGraphContent:(FBSDKShareOpenGraphContent *)content; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.m deleted file mode 100644 index 39ad3d50b..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.m +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareOpenGraphContent.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKHashtag.h" -#import "FBSDKSharePhoto.h" -#import "FBSDKShareUtility.h" - -#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_ACTION_KEY @"action" -#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_CONTENT_URL_KEY @"contentURL" -#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_HASHTAG_KEY @"hashtag" -#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_PEOPLE_IDS_KEY @"peopleIDs" -#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_PLACE_ID_KEY @"placeID" -#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_PREVIEW_PROPERTY_NAME_KEY @"previewPropertyName" -#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_REF_KEY @"ref" -#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_PAGE_ID_KEY @"pageID" -#define FBSDK_SHARE_OPEN_GRAPH_CONTENT_UUID_KEY @"uuid" - -@implementation FBSDKShareOpenGraphContent - -#pragma mark - Properties - -@synthesize contentURL = _contentURL; -@synthesize hashtag = _hashtag; -@synthesize peopleIDs = _peopleIDs; -@synthesize placeID = _placeID; -@synthesize ref = _ref; -@synthesize pageID = _pageID; -@synthesize shareUUID = _shareUUID; - -#pragma mark - Initializer - -- (instancetype)init -{ - self = [super init]; - if (self) { - _shareUUID = [NSUUID UUID].UUIDString; - } - return self; -} - -#pragma mark - Setters - -- (void)setPeopleIDs:(NSArray *)peopleIDs -{ - [FBSDKShareUtility assertCollection:peopleIDs ofClass:[NSString class] name:@"peopleIDs"]; - if (![FBSDKInternalUtility object:_peopleIDs isEqualToObject:peopleIDs]) { - _peopleIDs = [peopleIDs copy]; - } -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [_action hash], - [_contentURL hash], - [_hashtag hash], - [_peopleIDs hash], - [_placeID hash], - [_previewPropertyName hash], - [_ref hash], - [_pageID hash], - [_shareUUID hash], - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - return NO; - } - return [self isEqualToShareOpenGraphContent:(FBSDKShareOpenGraphContent *)object]; -} - -- (BOOL)isEqualToShareOpenGraphContent:(FBSDKShareOpenGraphContent *)content -{ - return (content && - [FBSDKInternalUtility object:_action isEqualToObject:content.action] && - [FBSDKInternalUtility object:_contentURL isEqualToObject:content.contentURL] && - [FBSDKInternalUtility object:_hashtag isEqualToObject:content.hashtag] && - [FBSDKInternalUtility object:_peopleIDs isEqualToObject:content.peopleIDs] && - [FBSDKInternalUtility object:_placeID isEqualToObject:content.placeID] && - [FBSDKInternalUtility object:_previewPropertyName isEqualToObject:content.previewPropertyName] && - [FBSDKInternalUtility object:_ref isEqualToObject:content.ref] && - [FBSDKInternalUtility object:_shareUUID isEqualToObject:content.shareUUID] && - [FBSDKInternalUtility object:_pageID isEqualToObject:content.pageID]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [super init])) { - _action = [decoder decodeObjectOfClass:[FBSDKShareOpenGraphAction class] - forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_ACTION_KEY]; - _contentURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_CONTENT_URL_KEY]; - _hashtag = [decoder decodeObjectOfClass:[FBSDKHashtag class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_HASHTAG_KEY]; - _peopleIDs = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PEOPLE_IDS_KEY]; - _placeID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PLACE_ID_KEY]; - _previewPropertyName = [decoder decodeObjectOfClass:[NSString class] - forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PREVIEW_PROPERTY_NAME_KEY]; - _ref = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_REF_KEY]; - _pageID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PAGE_ID_KEY]; - _shareUUID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_UUID_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_action forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_ACTION_KEY]; - [encoder encodeObject:_contentURL forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_CONTENT_URL_KEY]; - [encoder encodeObject:_hashtag forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_HASHTAG_KEY]; - [encoder encodeObject:_peopleIDs forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PEOPLE_IDS_KEY]; - [encoder encodeObject:_placeID forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PLACE_ID_KEY]; - [encoder encodeObject:_previewPropertyName forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PREVIEW_PROPERTY_NAME_KEY]; - [encoder encodeObject:_ref forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_REF_KEY]; - [encoder encodeObject:_pageID forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_PAGE_ID_KEY]; - [encoder encodeObject:_shareUUID forKey:FBSDK_SHARE_OPEN_GRAPH_CONTENT_UUID_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareOpenGraphContent *copy = [[FBSDKShareOpenGraphContent alloc] init]; - copy->_action = [_action copy]; - copy->_contentURL = [_contentURL copy]; - copy->_hashtag = [_hashtag copy]; - copy->_peopleIDs = [_peopleIDs copy]; - copy->_placeID = [_placeID copy]; - copy->_previewPropertyName = [_previewPropertyName copy]; - copy->_ref = [_ref copy]; - copy->_pageID = [_pageID copy]; - copy->_shareUUID = [_shareUUID copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h deleted file mode 100644 index 22745cdcd..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import - -/** - An Open Graph Object for sharing. - - The property keys MUST have namespaces specified on them, such as `og:image`, - and `og:type` is required. - - See https://developers.facebook.com/docs/sharing/opengraph/object-properties for other properties. - - You can specify nested namespaces inline to define complex properties. For example, the following - code will generate a fitness.course object with a location: - - FBSDKShareOpenGraphObject *course = [FBSDKShareOpenGraphObject objectWithProperties: - @{ - @"og:type": @"fitness.course", - @"og:title": @"Sample course", - @"fitness:metrics:location:latitude": @"41.40338", - @"fitness:metrics:location:longitude": @"2.17403", - }]; - */ -@interface FBSDKShareOpenGraphObject : FBSDKShareOpenGraphValueContainer - -/** - Convenience method to build a new action and set the object for the specified key. - - Parameter properties: Properties for the Open Graph object, which will be parsed into the proper models - */ -+ (instancetype)objectWithProperties:(NSDictionary *)properties; - -/** - Compares the receiver to another Open Graph Object. - - Parameter object: The other object - - Returns: YES if the receiver's values are equal to the other object's values; otherwise NO - */ -- (BOOL)isEqualToShareOpenGraphObject:(FBSDKShareOpenGraphObject *)object; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.m deleted file mode 100644 index eb6a1c599..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.m +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareOpenGraphObject.h" - -#import "FBSDKShareOpenGraphValueContainer+Internal.h" - -#define FBSDK_SHARE_OPEN_GRAPH_OBJECT_DATA_KEY @"data" - -@implementation FBSDKShareOpenGraphObject - -#pragma mark - Class Methods - -+ (instancetype)objectWithProperties:(NSDictionary *)properties -{ - FBSDKShareOpenGraphObject *object = [[FBSDKShareOpenGraphObject alloc] init]; - [object parseProperties:properties]; - return object; -} - -#pragma mark - Equality - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKShareOpenGraphObject class]]) { - return NO; - } - return [self isEqualToShareOpenGraphObject:(FBSDKShareOpenGraphObject *)object]; -} - -- (BOOL)isEqualToShareOpenGraphObject:(FBSDKShareOpenGraphObject *)object -{ - return [self isEqualToShareOpenGraphValueContainer:object]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareOpenGraphObject *copy = [[FBSDKShareOpenGraphObject alloc] init]; - [copy parseProperties:[self allProperties]]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h deleted file mode 100644 index ddef60f82..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKShareOpenGraphObject; -@class FBSDKSharePhoto; - -/** - Protocol defining operations on open graph actions and objects. - - The property keys MUST have namespaces specified on them, such as `og:image`. - */ -@protocol FBSDKShareOpenGraphValueContaining - -/** - Gets an NSArray out of the receiver. - - Parameter key: The key for the value - - Returns: The NSArray value or nil - */ -- (NSArray *)arrayForKey:(NSString *)key; - -/** - Applies a given block object to the entries of the receiver. - - Parameter block: A block object to operate on entries in the receiver - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(NSString *key, id object, BOOL *stop))block; - -/** - Returns an enumerator object that lets you access each key in the receiver. - - Returns: An enumerator object that lets you access each key in the receiver - */ -- (NSEnumerator *)keyEnumerator; - -/** - Gets an NSNumber out of the receiver. - - Parameter key: The key for the value - - Returns: The NSNumber value or nil - */ -- (NSNumber *)numberForKey:(NSString *)key; - -/** - Returns an enumerator object that lets you access each value in the receiver. - - Returns: An enumerator object that lets you access each value in the receiver - */ -- (NSEnumerator *)objectEnumerator; - -/** - Gets an FBSDKShareOpenGraphObject out of the receiver. - - Parameter key: The key for the value - - Returns: The FBSDKShareOpenGraphObject value or nil - */ -- (FBSDKShareOpenGraphObject *)objectForKey:(NSString *)key; - -/** - Enables subscript access to the values in the receiver. - - Parameter key: The key for the value - - Returns: The value - */ -- (id)objectForKeyedSubscript:(NSString *)key; - -/** - Parses properties out of a dictionary into the receiver. - - Parameter properties: The properties to parse. - */ -- (void)parseProperties:(NSDictionary *)properties; - -/** - Gets an FBSDKSharePhoto out of the receiver. - - Parameter key: The key for the value - - Returns: The FBSDKSharePhoto value or nil - */ -- (FBSDKSharePhoto *)photoForKey:(NSString *)key; - -/** - Removes a value from the receiver for the specified key. - - Parameter key: The key for the value - */ -- (void)removeObjectForKey:(NSString *)key; - -/** - Sets an NSArray on the receiver. - - This method will throw if the array contains any values that is not an NSNumber, NSString, NSURL, - FBSDKSharePhoto or FBSDKShareOpenGraphObject. - - Parameter array: The NSArray value - - Parameter key: The key for the value - */ -- (void)setArray:(NSArray *)array forKey:(NSString *)key; - -/** - Sets an NSNumber on the receiver. - - Parameter number: The NSNumber value - - Parameter key: The key for the value - */ -- (void)setNumber:(NSNumber *)number forKey:(NSString *)key; - -/** - Sets an FBSDKShareOpenGraphObject on the receiver. - - Parameter object: The FBSDKShareOpenGraphObject value - - Parameter key: The key for the value - */ -- (void)setObject:(FBSDKShareOpenGraphObject *)object forKey:(NSString *)key; - -/** - Sets an FBSDKSharePhoto on the receiver. - - Parameter photo: The FBSDKSharePhoto value - - Parameter key: The key for the value - */ -- (void)setPhoto:(FBSDKSharePhoto *)photo forKey:(NSString *)key; - -/** - Sets an NSString on the receiver. - - Parameter string: The NSString value - - Parameter key: The key for the value - */ -- (void)setString:(NSString *)string forKey:(NSString *)key; - -/** - Sets an NSURL on the receiver. - - Parameter URL: The NSURL value - - Parameter key: The key for the value - */ -- (void)setURL:(NSURL *)URL forKey:(NSString *)key; - -/** - Gets an NSString out of the receiver. - - Parameter key: The key for the value - - Returns: The NSString value or nil - */ -- (NSString *)stringForKey:(NSString *)key; - -/** - Gets an NSURL out of the receiver. - - Parameter key: The key for the value - - Returns: The NSURL value or nil - */ -- (NSURL *)URLForKey:(NSString *)key; - -@end - -/** - A base class to container Open Graph values. - */ -@interface FBSDKShareOpenGraphValueContainer : NSObject - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.m deleted file mode 100644 index d19ce0828..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.m +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareOpenGraphValueContainer.h" -#import "FBSDKShareOpenGraphValueContainer+Internal.h" - -#import - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareOpenGraphObject.h" -#import "FBSDKSharePhoto.h" -#import "FBSDKShareUtility.h" - -#define FBSDK_SHARE_OPEN_GRAPH_VALUE_CONTAINER_PROPERTIES_KEY @"properties" - -@implementation FBSDKShareOpenGraphValueContainer -{ - NSMutableDictionary *_properties; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - if ((self = [super init])) { - _properties = [[NSMutableDictionary alloc] init]; - } - return self; -} - -#pragma mark - Public Methods - -- (NSDictionary *)allData -{ - return [_properties copy]; -} - -- (NSArray *)arrayForKey:(NSString *)key -{ - return [self _valueOfClass:[NSArray class] forKey:key]; -} - -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(NSString *key, id object, BOOL *stop))block -{ - [_properties enumerateKeysAndObjectsUsingBlock:block]; -} - -- (NSEnumerator *)keyEnumerator -{ - return [_properties keyEnumerator]; -} - -- (NSNumber *)numberForKey:(NSString *)key -{ - return [self _valueOfClass:[NSNumber class] forKey:key]; -} - -- (NSEnumerator *)objectEnumerator -{ - return [_properties objectEnumerator]; -} - -- (FBSDKShareOpenGraphObject *)objectForKey:(NSString *)key -{ - return [self _valueOfClass:[FBSDKShareOpenGraphObject class] forKey:key]; -} - -- (id)objectForKeyedSubscript:(id)key -{ - return [self _valueForKey:key]; -} - -- (void)parseProperties:(NSDictionary *)properties -{ - [FBSDKShareUtility assertOpenGraphValues:properties requireKeyNamespace:[self requireKeyNamespace]]; - [_properties addEntriesFromDictionary:[FBSDKShareUtility convertOpenGraphValues:properties]]; -} - -- (FBSDKSharePhoto *)photoForKey:(NSString *)key -{ - return [self _valueOfClass:[FBSDKSharePhoto class] forKey:key]; -} - -- (void)removeObjectForKey:(NSString *)key -{ - [_properties removeObjectForKey:key]; -} - -- (void)setArray:(NSArray *)array forKey:(NSString *)key -{ - [self _setValue:array forKey:key]; -} - -- (void)setNumber:(NSNumber *)number forKey:(NSString *)key -{ - [self _setValue:number forKey:key]; -} - -- (void)setObject:(FBSDKShareOpenGraphObject *)object forKey:(NSString *)key -{ - [self _setValue:object forKey:key]; -} - -- (void)setPhoto:(FBSDKSharePhoto *)photo forKey:(NSString *)key -{ - [self _setValue:photo forKey:key]; -} - -- (void)setString:(NSString *)string forKey:(NSString *)key -{ - [self _setValue:string forKey:key]; -} - -- (void)setURL:(NSURL *)URL forKey:(NSString *)key -{ - [self _setValue:URL forKey:key]; -} -- (NSString *)stringForKey:(NSString *)key -{ - return [self _valueOfClass:[NSString class] forKey:key]; -} - -- (NSURL *)URLForKey:(NSString *)key -{ - return [self _valueOfClass:[NSURL class] forKey:key]; -} - -- (id)valueForKey:(NSString *)key -{ - return [self _valueForKey:key] ?: [super valueForKey:key]; -} - -#pragma mark - Internal Methods - -- (NSDictionary *)allProperties -{ - return _properties; -} - -- (BOOL)requireKeyNamespace -{ - return YES; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - return [_properties hash]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKShareOpenGraphValueContainer class]]) { - return NO; - } - return [self isEqualToShareOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)object]; -} - -- (BOOL)isEqualToShareOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)object -{ - return [FBSDKInternalUtility object:_properties isEqualToObject:[object allProperties]]; -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - NSSet *classes = [NSSet setWithObjects: - [NSArray class], - [NSDictionary class], - [FBSDKShareOpenGraphObject class], - [FBSDKSharePhoto class], - nil]; - NSDictionary *properties = [decoder decodeObjectOfClasses:classes - forKey:FBSDK_SHARE_OPEN_GRAPH_VALUE_CONTAINER_PROPERTIES_KEY]; - if ([properties count]) { - [self parseProperties:properties]; - } - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_properties forKey:FBSDK_SHARE_OPEN_GRAPH_VALUE_CONTAINER_PROPERTIES_KEY]; -} - -#pragma mark - Helper Methods - -- (void)_setValue:(id)value forKey:(NSString *)key -{ - [FBSDKShareUtility assertOpenGraphKey:key requireNamespace:[self requireKeyNamespace]]; - [FBSDKShareUtility assertOpenGraphValue:value]; - if (value) { - _properties[key] = value; - } else { - [self removeObjectForKey:key]; - } -} - -- (id)_valueForKey:(id)key -{ - key = [FBSDKTypeUtility stringValue:key]; - return (key ? [FBSDKTypeUtility objectValue:_properties[key]] : nil); -} - -- (id)_valueOfClass:(__unsafe_unretained Class)cls forKey:(NSString *)key -{ - id value = [self _valueForKey:key]; - return ([value isKindOfClass:cls] ? value : nil); -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h deleted file mode 100644 index 7926e2a91..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - A photo for sharing. - */ -@interface FBSDKSharePhoto : NSObject - -/** - Convenience method to build a new photo object with an image. - - Parameter image: If the photo is resident in memory, this method supplies the data - - Parameter userGenerated: Specifies whether the photo represented by the receiver was generated by the user or by the - application - */ -+ (instancetype)photoWithImage:(UIImage *)image userGenerated:(BOOL)userGenerated; - -/** - Convenience method to build a new photo object with an imageURL. - - Parameter imageURL: The URL to the photo - - Parameter userGenerated: Specifies whether the photo represented by the receiver was generated by the user or by the - application - - This method should only be used when adding photo content to open graph stories. - For example, if you're trying to share a photo from the web by itself, download the image and use - `photoWithImage:userGenerated:` instead. - */ -+ (instancetype)photoWithImageURL:(NSURL *)imageURL userGenerated:(BOOL)userGenerated; - -/** - If the photo is resident in memory, this method supplies the data. - - Returns: UIImage representation of the photo - */ -@property (nonatomic, strong) UIImage *image; - -/** - The URL to the photo. - - Returns: URL that points to a network location or the location of the photo on disk - */ -@property (nonatomic, copy) NSURL *imageURL; - -/** - Specifies whether the photo represented by the receiver was generated by the user or by the application. - - Returns: YES if the photo is user-generated, otherwise NO - */ -@property (nonatomic, assign, getter=isUserGenerated) BOOL userGenerated; - -/** - Compares the receiver to another photo. - - Parameter photo: The other photo - - Returns: YES if the receiver's values are equal to the other photo's values; otherwise NO - */ -- (BOOL)isEqualToSharePhoto:(FBSDKSharePhoto *)photo; - -/** - The user generated caption for the photo. Note that the 'caption' must come from - * the user, as pre-filled content is forbidden by the Platform Policies (2.3). - - Returns: the Photo's caption if exists else returns null. - */ -@property (nonatomic, copy) NSString *caption; - - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.m deleted file mode 100644 index 27c67b535..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.m +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKSharePhoto.h" - -#import "FBSDKCoreKit+Internal.h" - -#define FBSDK_SHARE_PHOTO_IMAGE_KEY @"image" -#define FBSDK_SHARE_PHOTO_IMAGE_URL_KEY @"imageURL" -#define FBSDK_SHARE_PHOTO_USER_GENERATED_KEY @"userGenerated" -#define FBSDK_SHARE_PHOTO_CAPTION_KEY @"caption" - -@implementation FBSDKSharePhoto - -#pragma mark - Class Methods - -+ (instancetype)photoWithImage:(UIImage *)image userGenerated:(BOOL)userGenerated -{ - FBSDKSharePhoto *photo = [[self alloc] init]; - photo.image = image; - photo.userGenerated = userGenerated; - return photo; -} - -+ (instancetype)photoWithImageURL:(NSURL *)imageURL userGenerated:(BOOL)userGenerated -{ - FBSDKSharePhoto *photo = [[self alloc] init]; - photo.imageURL = imageURL; - photo.userGenerated = userGenerated; - return photo; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [_image hash], - [_imageURL hash], - [_caption hash], - (_userGenerated ? 1u : 0u) - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKSharePhoto class]]) { - return NO; - } - return [self isEqualToSharePhoto:(FBSDKSharePhoto *)object]; -} - -- (BOOL)isEqualToSharePhoto:(FBSDKSharePhoto *)photo -{ - return (photo && - (_userGenerated == photo.userGenerated) && - [FBSDKInternalUtility object:_image isEqualToObject:photo.image] && - [FBSDKInternalUtility object:_imageURL isEqualToObject:photo.imageURL] && - [FBSDKInternalUtility object:_caption isEqualToObject:photo.caption]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _image = [decoder decodeObjectOfClass:[UIImage class] forKey:FBSDK_SHARE_PHOTO_IMAGE_KEY]; - _imageURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_PHOTO_IMAGE_URL_KEY]; - _userGenerated = [decoder decodeBoolForKey:FBSDK_SHARE_PHOTO_USER_GENERATED_KEY]; - _caption = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_PHOTO_CAPTION_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_image forKey:FBSDK_SHARE_PHOTO_IMAGE_KEY]; - [encoder encodeObject:_imageURL forKey:FBSDK_SHARE_PHOTO_IMAGE_URL_KEY]; - [encoder encodeBool:_userGenerated forKey:FBSDK_SHARE_PHOTO_USER_GENERATED_KEY]; - [encoder encodeObject:_caption forKey:FBSDK_SHARE_PHOTO_CAPTION_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKSharePhoto *copy = [[FBSDKSharePhoto alloc] init]; - copy->_image = [_image copy]; - copy->_imageURL = [_imageURL copy]; - copy->_userGenerated = _userGenerated; - copy->_caption = [_caption copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h deleted file mode 100644 index 3043268f2..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - A model for photo content to be shared. - */ -@interface FBSDKSharePhotoContent : NSObject - -/** - Photos to be shared. - - Returns: Array of the photos (FBSDKSharePhoto) - */ -@property (nonatomic, copy) NSArray *photos; - -/** - Compares the receiver to another photo content. - - Parameter content: The other content - - Returns: YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToSharePhotoContent:(FBSDKSharePhotoContent *)content; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.m deleted file mode 100644 index 90d1119f5..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.m +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKSharePhotoContent.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKHashtag.h" -#import "FBSDKSharePhoto.h" -#import "FBSDKShareUtility.h" - -#define FBSDK_SHARE_PHOTO_CONTENT_CONTENT_URL_KEY @"contentURL" -#define FBSDK_SHARE_PHOTO_CONTENT_HASHTAG_KEY @"hashtag" -#define FBSDK_SHARE_PHOTO_CONTENT_PEOPLE_IDS_KEY @"peopleIDs" -#define FBSDK_SHARE_PHOTO_CONTENT_PHOTOS_KEY @"photos" -#define FBSDK_SHARE_PHOTO_CONTENT_PLACE_ID_KEY @"placeID" -#define FBSDK_SHARE_PHOTO_CONTENT_REF_KEY @"ref" -#define FBSDK_SHARE_PHOTO_CONTENT_PAGE_ID_KEY @"pageID" -#define FBSDK_SHARE_PHOTO_CONTENT_UUID_KEY @"uuid" - -@implementation FBSDKSharePhotoContent - -#pragma mark - Properties - -@synthesize contentURL = _contentURL; -@synthesize hashtag = _hashtag; -@synthesize peopleIDs = _peopleIDs; -@synthesize placeID = _placeID; -@synthesize ref = _ref; -@synthesize pageID = _pageID; -@synthesize shareUUID = _shareUUID; - -#pragma mark - Initializer - -- (instancetype)init -{ - self = [super init]; - if (self) { - _shareUUID = [NSUUID UUID].UUIDString; - } - return self; -} - -#pragma mark - Setters - -- (void)setPeopleIDs:(NSArray *)peopleIDs -{ - [FBSDKShareUtility assertCollection:peopleIDs ofClass:[NSString class] name:@"peopleIDs"]; - if (![FBSDKInternalUtility object:_peopleIDs isEqualToObject:peopleIDs]) { - _peopleIDs = [peopleIDs copy]; - } -} - -- (void)setPhotos:(NSArray *)photos -{ - [FBSDKShareUtility assertCollection:photos ofClass:[FBSDKSharePhoto class] name:@"photos"]; - if (![FBSDKInternalUtility object:_photos isEqualToObject:photos]) { - _photos = [photos copy]; - } -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [_contentURL hash], - [_hashtag hash], - [_peopleIDs hash], - [_photos hash], - [_placeID hash], - [_ref hash], - [_pageID hash], - [_shareUUID hash], - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKSharePhotoContent class]]) { - return NO; - } - return [self isEqualToSharePhotoContent:(FBSDKSharePhotoContent *)object]; -} - -- (BOOL)isEqualToSharePhotoContent:(FBSDKSharePhotoContent *)content -{ - return (content && - [FBSDKInternalUtility object:_contentURL isEqualToObject:content.contentURL] && - [FBSDKInternalUtility object:_hashtag isEqualToObject:content.hashtag] && - [FBSDKInternalUtility object:_peopleIDs isEqualToObject:content.peopleIDs] && - [FBSDKInternalUtility object:_photos isEqualToObject:content.photos] && - [FBSDKInternalUtility object:_placeID isEqualToObject:content.placeID] && - [FBSDKInternalUtility object:_ref isEqualToObject:content.ref] && - [FBSDKInternalUtility object:_shareUUID isEqualToObject:content.shareUUID] && - [FBSDKInternalUtility object:_pageID isEqualToObject:content.pageID]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _contentURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_PHOTO_CONTENT_CONTENT_URL_KEY]; - _hashtag = [decoder decodeObjectOfClass:[FBSDKHashtag class] forKey:FBSDK_SHARE_PHOTO_CONTENT_HASHTAG_KEY]; - _peopleIDs = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_SHARE_PHOTO_CONTENT_PEOPLE_IDS_KEY]; - NSSet *classes = [NSSet setWithObjects:[NSArray class], [FBSDKSharePhoto class], nil]; - _photos = [decoder decodeObjectOfClasses:classes forKey:FBSDK_SHARE_PHOTO_CONTENT_PHOTOS_KEY]; - _placeID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_PHOTO_CONTENT_PLACE_ID_KEY]; - _ref = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_PHOTO_CONTENT_REF_KEY]; - _pageID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_PHOTO_CONTENT_PAGE_ID_KEY]; - _shareUUID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_PHOTO_CONTENT_UUID_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_contentURL forKey:FBSDK_SHARE_PHOTO_CONTENT_CONTENT_URL_KEY]; - [encoder encodeObject:_hashtag forKey:FBSDK_SHARE_PHOTO_CONTENT_HASHTAG_KEY]; - [encoder encodeObject:_peopleIDs forKey:FBSDK_SHARE_PHOTO_CONTENT_PEOPLE_IDS_KEY]; - [encoder encodeObject:_photos forKey:FBSDK_SHARE_PHOTO_CONTENT_PHOTOS_KEY]; - [encoder encodeObject:_placeID forKey:FBSDK_SHARE_PHOTO_CONTENT_PLACE_ID_KEY]; - [encoder encodeObject:_ref forKey:FBSDK_SHARE_PHOTO_CONTENT_REF_KEY]; - [encoder encodeObject:_pageID forKey:FBSDK_SHARE_PHOTO_CONTENT_PAGE_ID_KEY]; - [encoder encodeObject:_shareUUID forKey:FBSDK_SHARE_PHOTO_CONTENT_UUID_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKSharePhotoContent *copy = [[FBSDKSharePhotoContent alloc] init]; - copy->_contentURL = [_contentURL copy]; - copy->_hashtag = [_hashtag copy]; - copy->_peopleIDs = [_peopleIDs copy]; - copy->_photos = [_photos copy]; - copy->_placeID = [_placeID copy]; - copy->_ref = [_ref copy]; - copy->_pageID = [_pageID copy]; - copy->_shareUUID = [_shareUUID copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h deleted file mode 100644 index dcec319f3..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@class FBSDKSharePhoto; - -/** - A video for sharing. - */ -@interface FBSDKShareVideo : NSObject - -/** - Convenience method to build a new video object with a videoURL. - - Parameter videoURL: The URL to the video - */ -+ (instancetype)videoWithVideoURL:(NSURL *)videoURL; - -/** - Convenience method to build a new video object with a videoURL and a previewPhoto - - Parameter videoURL: The URL to the video - - Parameter previewPhoto: The photo that represents the video - */ -+ (instancetype)videoWithVideoURL:(NSURL *)videoURL previewPhoto:(FBSDKSharePhoto *)previewPhoto; - -/** - The file URL to the video. - - Returns: URL that points to the location of the video on disk - */ -@property (nonatomic, copy) NSURL *videoURL; - -/** - The photo that represents the video. - - Returns: The photo - */ -@property (nonatomic, copy) FBSDKSharePhoto *previewPhoto; - -/** - Compares the receiver to another video. - - Parameter video: The other video - - Returns: YES if the receiver's values are equal to the other video's values; otherwise NO - */ -- (BOOL)isEqualToShareVideo:(FBSDKShareVideo *)video; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.m deleted file mode 100644 index a27a9aecd..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.m +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareVideo.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKSharePhoto.h" - -#define FBSDK_SHARE_VIDEO_URL_KEY @"videoURL" -#define FBSDK_SHARE_VIDEO_PREVIEW_PHOTO_KEY @"previewPhoto" - -@implementation FBSDKShareVideo - -#pragma mark - Class Methods - -+ (instancetype)videoWithVideoURL:(NSURL *)videoURL -{ - FBSDKShareVideo *video = [[FBSDKShareVideo alloc] init]; - video.videoURL = videoURL; - return video; -} - -+ (instancetype)videoWithVideoURL:(NSURL *)videoURL previewPhoto:(FBSDKSharePhoto *)previewPhoto -{ - FBSDKShareVideo *video = [[FBSDKShareVideo alloc] init]; - video.videoURL = videoURL; - video.previewPhoto = previewPhoto; - return video; -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [_videoURL hash], - [_previewPhoto hash], - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKShareVideo class]]) { - return NO; - } - return [self isEqualToShareVideo:(FBSDKShareVideo *)object]; -} - -- (BOOL)isEqualToShareVideo:(FBSDKShareVideo *)video -{ - return (video && - [FBSDKInternalUtility object:_videoURL isEqualToObject:video.videoURL] && - [FBSDKInternalUtility object:_previewPhoto isEqualToObject:video.previewPhoto]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _videoURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_VIDEO_URL_KEY]; - _previewPhoto = [decoder decodeObjectOfClass:[FBSDKSharePhoto class] forKey:FBSDK_SHARE_VIDEO_PREVIEW_PHOTO_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_videoURL forKey:FBSDK_SHARE_VIDEO_URL_KEY]; - [encoder encodeObject:_previewPhoto forKey:FBSDK_SHARE_VIDEO_PREVIEW_PHOTO_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareVideo *copy = [[FBSDKShareVideo alloc] init]; - copy->_videoURL = [_videoURL copy]; - copy->_previewPhoto = [_previewPhoto copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h deleted file mode 100644 index 726459116..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import - -/** - A model for video content to be shared. - */ -@interface FBSDKShareVideoContent : NSObject - -/** - The photo that represents the video. - - Returns: The photo - */ -@property (nonatomic, copy) FBSDKSharePhoto *previewPhoto; - -/** - The video to be shared. - - Returns: The video - */ -@property (nonatomic, copy) FBSDKShareVideo *video; - -/** - Compares the receiver to another video content. - - Parameter content: The other content - - Returns: YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToShareVideoContent:(FBSDKShareVideoContent *)content; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.m deleted file mode 100644 index 78b14b9fa..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.m +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareVideoContent.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKHashtag.h" -#import "FBSDKShareUtility.h" - -#define FBSDK_SHARE_VIDEO_CONTENT_CONTENT_URL_KEY @"contentURL" -#define FBSDK_SHARE_VIDEO_CONTENT_HASHTAG_KEY @"hashtag" -#define FBSDK_SHARE_VIDEO_CONTENT_PEOPLE_IDS_KEY @"peopleIDs" -#define FBSDK_SHARE_VIDEO_CONTENT_PLACE_ID_KEY @"placeID" -#define FBSDK_SHARE_VIDEO_CONTENT_PREVIEW_PHOTO_KEY @"previewPhoto" -#define FBSDK_SHARE_VIDEO_CONTENT_REF_KEY @"ref" -#define FBSDK_SHARE_VIDEO_CONTENT_PAGE_ID_KEY @"pageID" -#define FBSDK_SHARE_VIDEO_CONTENT_VIDEO_KEY @"video" -#define FBSDK_SHARE_VIDEO_CONTENT_UUID_KEY @"uuid" - -@implementation FBSDKShareVideoContent - -#pragma mark - Properties - -@synthesize contentURL = _contentURL; -@synthesize hashtag = _hashtag; -@synthesize peopleIDs = _peopleIDs; -@synthesize placeID = _placeID; -@synthesize ref = _ref; -@synthesize pageID = _pageID; -@synthesize shareUUID = _shareUUID; - -#pragma mark - Initializer - -- (instancetype)init -{ - self = [super init]; - if (self) { - _shareUUID = [NSUUID UUID].UUIDString; - } - return self; -} - -#pragma mark - Setters - -- (void)setPeopleIDs:(NSArray *)peopleIDs -{ - [FBSDKShareUtility assertCollection:peopleIDs ofClass:[NSString class] name:@"peopleIDs"]; - if (![FBSDKInternalUtility object:_peopleIDs isEqualToObject:peopleIDs]) { - _peopleIDs = [peopleIDs copy]; - } -} - -#pragma mark - Equality - -- (NSUInteger)hash -{ - NSUInteger subhashes[] = { - [_contentURL hash], - [_hashtag hash], - [_peopleIDs hash], - [_placeID hash], - [_previewPhoto hash], - [_ref hash], - [_pageID hash], - [_video hash], - [_shareUUID hash], - }; - return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])]; -} - -- (BOOL)isEqual:(id)object -{ - if (self == object) { - return YES; - } - if (![object isKindOfClass:[FBSDKShareVideoContent class]]) { - return NO; - } - return [self isEqualToShareVideoContent:(FBSDKShareVideoContent *)object]; -} - -- (BOOL)isEqualToShareVideoContent:(FBSDKShareVideoContent *)content -{ - return (content && - [FBSDKInternalUtility object:_contentURL isEqualToObject:content.contentURL] && - [FBSDKInternalUtility object:_hashtag isEqualToObject:content.hashtag] && - [FBSDKInternalUtility object:_peopleIDs isEqualToObject:content.peopleIDs] && - [FBSDKInternalUtility object:_placeID isEqualToObject:content.placeID] && - [FBSDKInternalUtility object:_previewPhoto isEqualToObject:content.previewPhoto] && - [FBSDKInternalUtility object:_ref isEqualToObject:content.ref] && - [FBSDKInternalUtility object:_pageID isEqualToObject:content.pageID] && - [FBSDKInternalUtility object:_shareUUID isEqualToObject:content.shareUUID] && - [FBSDKInternalUtility object:_video isEqualToObject:content.video]); -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [self init])) { - _contentURL = [decoder decodeObjectOfClass:[NSURL class] forKey:FBSDK_SHARE_VIDEO_CONTENT_CONTENT_URL_KEY]; - _hashtag = [decoder decodeObjectOfClass:[FBSDKHashtag class] forKey:FBSDK_SHARE_VIDEO_CONTENT_HASHTAG_KEY]; - _peopleIDs = [decoder decodeObjectOfClass:[NSArray class] forKey:FBSDK_SHARE_VIDEO_CONTENT_PEOPLE_IDS_KEY]; - _placeID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_VIDEO_CONTENT_PLACE_ID_KEY]; - _previewPhoto = [decoder decodeObjectOfClass:[FBSDKSharePhoto class] - forKey:FBSDK_SHARE_VIDEO_CONTENT_PREVIEW_PHOTO_KEY]; - _ref = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_VIDEO_CONTENT_REF_KEY]; - _pageID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_VIDEO_CONTENT_PAGE_ID_KEY]; - _video = [decoder decodeObjectOfClass:[FBSDKShareVideo class] forKey:FBSDK_SHARE_VIDEO_CONTENT_VIDEO_KEY]; - _shareUUID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_SHARE_VIDEO_CONTENT_UUID_KEY]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_contentURL forKey:FBSDK_SHARE_VIDEO_CONTENT_CONTENT_URL_KEY]; - [encoder encodeObject:_hashtag forKey:FBSDK_SHARE_VIDEO_CONTENT_HASHTAG_KEY]; - [encoder encodeObject:_peopleIDs forKey:FBSDK_SHARE_VIDEO_CONTENT_PEOPLE_IDS_KEY]; - [encoder encodeObject:_placeID forKey:FBSDK_SHARE_VIDEO_CONTENT_PLACE_ID_KEY]; - [encoder encodeObject:_previewPhoto forKey:FBSDK_SHARE_VIDEO_CONTENT_PREVIEW_PHOTO_KEY]; - [encoder encodeObject:_ref forKey:FBSDK_SHARE_VIDEO_CONTENT_REF_KEY]; - [encoder encodeObject:_pageID forKey:FBSDK_SHARE_VIDEO_CONTENT_PAGE_ID_KEY]; - [encoder encodeObject:_video forKey:FBSDK_SHARE_VIDEO_CONTENT_VIDEO_KEY]; - [encoder encodeObject:_shareUUID forKey:FBSDK_SHARE_VIDEO_CONTENT_UUID_KEY]; -} - -#pragma mark - NSCopying - -- (id)copyWithZone:(NSZone *)zone -{ - FBSDKShareVideoContent *copy = [[FBSDKShareVideoContent alloc] init]; - copy->_contentURL = [_contentURL copy]; - copy->_hashtag = [_hashtag copy]; - copy->_peopleIDs = [_peopleIDs copy]; - copy->_placeID = [_placeID copy]; - copy->_previewPhoto = [_previewPhoto copy]; - copy->_ref = [_ref copy]; - copy->_pageID = [_pageID copy]; - copy->_video = [_video copy]; - copy->_shareUUID = [_shareUUID copy]; - return copy; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h deleted file mode 100644 index 7a297ddd8..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@protocol FBSDKSharingDelegate; - -/** - The common interface for components that initiate sharing. - -- See:FBSDKShareDialog - -- See:FBSDKMessageDialog - -- See:FBSDKShareAPI - */ -@protocol FBSDKSharing - -/** - The receiver's delegate or nil if it doesn't have a delegate. - */ -@property (nonatomic, weak) id delegate; - -/** - The content to be shared. - */ -@property (nonatomic, copy) id shareContent; - -/** - A Boolean value that indicates whether the receiver should fail if it finds an error with the share content. - - If NO, the sharer will still be displayed without the data that was mis-configured. For example, an - invalid placeID specified on the shareContent would produce a data error. - */ -@property (nonatomic, assign) BOOL shouldFailOnDataError; - -/** - Validates the content on the receiver. - - Parameter errorRef: If an error occurs, upon return contains an NSError object that describes the problem. - - Returns: YES if the content is valid, otherwise NO. - */ -- (BOOL)validateWithError:(NSError **)errorRef; - -@end - -/** - The common interface for dialogs that initiate sharing. - */ -@protocol FBSDKSharingDialog - -/** - A Boolean value that indicates whether the receiver can initiate a share. - - May return NO if the appropriate Facebook app is not installed and is required or an access token is - required but not available. This method does not validate the content on the receiver, so this can be checked before - building up the content. - -- See:[FBSDKSharing validateWithError:] - - Returns: YES if the receiver can share, otherwise NO. - */ -- (BOOL)canShow; - -/** - Shows the dialog. - - Returns: YES if the receiver was able to begin sharing, otherwise NO. - */ -- (BOOL)show; - -@end - -/** - A delegate for FBSDKSharing. - - The delegate is notified with the results of the sharer as long as the application has permissions to - receive the information. For example, if the person is not signed into the containing app, the sharer may not be able - to distinguish between completion of a share and cancellation. - */ -@protocol FBSDKSharingDelegate - -/** - Sent to the delegate when the share completes without error or cancellation. - - Parameter sharer: The FBSDKSharing that completed. - - Parameter results: The results from the sharer. This may be nil or empty. - */ -- (void)sharer:(id)sharer didCompleteWithResults:(NSDictionary *)results; - -/** - Sent to the delegate when the sharer encounters an error. - - Parameter sharer: The FBSDKSharing that completed. - - Parameter error: The error. - */ -- (void)sharer:(id)sharer didFailWithError:(NSError *)error; - -/** - Sent to the delegate when the sharer is cancelled. - - Parameter sharer: The FBSDKSharing that completed. - */ -- (void)sharerDidCancel:(id)sharer; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h deleted file mode 100644 index 5192de470..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/** - The common interface for sharing buttons. - -- See:FBSDKSendButton - -- See:FBSDKShareButton - */ -@protocol FBSDKSharingButton - -/** - The content to be shared. - */ -@property (nonatomic, copy) id shareContent; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h deleted file mode 100644 index 0e0e06d25..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@class FBSDKHashtag; - -/** - A base interface for content to be shared. - */ -@protocol FBSDKSharingContent - -/** - URL for the content being shared. - - This URL will be checked for all link meta tags for linking in platform specific ways. See documentation - for App Links (https://developers.facebook.com/docs/applinks/) - - Returns: URL representation of the content link - */ -@property (nonatomic, copy) NSURL *contentURL; - -/** - Hashtag for the content being shared. - - Returns: The hashtag for the content being shared. - */ -@property (nonatomic, copy) FBSDKHashtag *hashtag; - -/** - List of IDs for taggable people to tag with this content. - See documentation for Taggable Friends - (https://developers.facebook.com/docs/graph-api/reference/user/taggable_friends) - - Returns: Array of IDs for people to tag (NSString) - */ -@property (nonatomic, copy) NSArray *peopleIDs; - -/** - The ID for a place to tag with this content. - - Returns: The ID for the place to tag - */ -@property (nonatomic, copy) NSString *placeID; - -/** - A value to be added to the referrer URL when a person follows a link from this shared content on feed. - - Returns: The ref for the content. - */ -@property (nonatomic, copy) NSString *ref; - -/** - For shares into Messenger, this pageID will be used to map the app to page and attach attribution to the share. - - Returns: The ID of the Facebok page this share is associated with. - */ -@property (nonatomic, copy) NSString *pageID; - -/** - A unique identifier for a share involving this content, useful for tracking purposes. - - Returns: A unique string identifying this share data. - */ -@property (nonatomic, copy, readonly) NSString *shareUUID; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCameraEffectArguments+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCameraEffectArguments+Internal.h deleted file mode 100644 index 73e0cc463..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCameraEffectArguments+Internal.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKCameraEffectArguments () - -- (NSDictionary *)allArguments; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCameraEffectTextures+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCameraEffectTextures+Internal.h deleted file mode 100644 index dda27ba60..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCameraEffectTextures+Internal.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKCameraEffectTextures () - -- (NSDictionary *)allTextures; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h deleted file mode 100644 index 06fde3475..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKCoreKit+Internal.h" - -@interface FBSDKCheckmarkIcon : FBSDKIcon - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.m deleted file mode 100644 index 7f4da893f..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.m +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKCheckmarkIcon.h" - -@implementation FBSDKCheckmarkIcon - -- (CGPathRef)pathWithSize:(CGSize)size -{ - CGAffineTransform transformValue = CGAffineTransformMakeScale(size.width / 100.0, size.height / 100.0); - CGAffineTransform *transform = &transformValue; - CGMutablePathRef path = CGPathCreateMutable(); - CGPathMoveToPoint(path, transform, 0.0, 50.0); - const CGPoint points[] = { - CGPointMake(12.0, 38.0), - CGPointMake(37.0, 63.0), - CGPointMake(87.0, 13.0), - CGPointMake(99.0, 25.0), - CGPointMake(37.0, 87.0), - CGPointMake(0.0, 48.0), - }; - CGPathAddLines(path, transform, points, sizeof(points) / sizeof(points[0])); - CGPathRef result = CGPathCreateCopy(path); - CGPathRelease(path); - return CFAutorelease(result); -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h deleted file mode 100644 index ad0a20e0c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKGameRequestFrictionlessRecipientCache : NSObject - -- (BOOL)recipientsAreFrictionless:(id)recipients; -- (void)updateWithResults:(NSDictionary *)results; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.m deleted file mode 100644 index 02e6e6108..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.m +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKGameRequestFrictionlessRecipientCache.h" - -#import - -#import "FBSDKCoreKit+Internal.h" - -@implementation FBSDKGameRequestFrictionlessRecipientCache -{ - NSSet *_recipientIDs; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - if ((self = [super init])) { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_accessTokenDidChangeNotification:) - name:FBSDKAccessTokenDidChangeNotification - object:nil]; - [self _updateCache]; - } - return self; -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - Public API - -- (BOOL)recipientsAreFrictionless:(id)recipients -{ - if (!recipients) { - return NO; - } - NSArray *recipientIDArray = [FBSDKTypeUtility arrayValue:recipients]; - if (!recipientIDArray && [recipients isKindOfClass:[NSString class]]) { - recipientIDArray = [recipients componentsSeparatedByString:@","]; - } - NSSet *recipientIDs = [[NSSet alloc] initWithArray:recipientIDArray]; - return [recipientIDs isSubsetOfSet:_recipientIDs]; -} - -- (void)updateWithResults:(NSDictionary *)results -{ - if ([FBSDKTypeUtility boolValue:results[@"updated_frictionless"]]) { - [self _updateCache]; - } -} - -#pragma mark - Helper Methods - -- (void)_accessTokenDidChangeNotification:(NSNotification *)notification -{ - if (![notification.userInfo[FBSDKAccessTokenDidChangeUserID] boolValue]) { - return; - } - _recipientIDs = nil; - [self _updateCache]; -} - -- (void)_updateCache -{ - if (![FBSDKAccessToken currentAccessToken]) { - _recipientIDs = nil; - return; - } - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/apprequestformerrecipients" - parameters:@{@"fields":@""} - flags:(FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | - FBSDKGraphRequestFlagDisableErrorRecovery)]; - [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - if (!error) { - NSArray *items = [FBSDKTypeUtility arrayValue:result[@"data"]]; - NSArray *recipientIDs = [items valueForKey:@"recipient_id"]; - _recipientIDs = [[NSSet alloc] initWithArray:recipientIDs]; - } - }]; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h deleted file mode 100644 index 234c8d65b..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -#import - -#import - -FBSDK_EXTERN NSString *const FBSDKLikeActionControllerDidDisableNotification; -FBSDK_EXTERN NSString *const FBSDKLikeActionControllerDidResetNotification; -FBSDK_EXTERN NSString *const FBSDKLikeActionControllerDidUpdateNotification; -FBSDK_EXTERN NSString *const FBSDKLikeActionControllerAnimatedKey; - -@interface FBSDKLikeActionController : NSObject - -+ (BOOL)isDisabled; - -// this method will call beginContentAccess before returning the instance -+ (instancetype)likeActionControllerForObjectID:(NSString *)objectID objectType:(FBSDKLikeObjectType)objectType; - -@property (nonatomic, copy, readonly) NSDate *lastUpdateTime; -@property (nonatomic, copy, readonly) NSString *likeCountString; -@property (nonatomic, copy, readonly) NSString *objectID; -@property (nonatomic, assign, readonly) FBSDKLikeObjectType objectType; -@property (nonatomic, assign, readonly) BOOL objectIsLiked; -@property (nonatomic, copy, readonly) NSString *socialSentence; - -- (void)refresh; -- (void)toggleLikeWithSoundEnabled:(BOOL)soundEnabled analyticsParameters:(NSDictionary *)analyticsParameters fromViewController:(UIViewController *)fromViewController; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.m deleted file mode 100644 index 04e8826ee..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.m +++ /dev/null @@ -1,1069 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLikeActionController.h" - -#import - -#import - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKLikeActionControllerCache.h" -#import "FBSDKLikeButtonPopWAV.h" -#import "FBSDKLikeDialog.h" - -NSString *const FBSDKLikeActionControllerDidDisableNotification = @"FBSDKLikeActionControllerDidDisableNotification"; -NSString *const FBSDKLikeActionControllerDidResetNotification = @"FBSDKLikeActionControllerDidResetNotification"; -NSString *const FBSDKLikeActionControllerDidUpdateNotification = @"FBSDKLikeActionControllerDidUpdateNotification"; -NSString *const FBSDKLikeActionControllerAnimatedKey = @"animated"; - -#define FBSDK_LIKE_ACTION_CONTROLLER_ANIMATION_DELAY 0.5 -#define FBSDK_LIKE_ACTION_CONTROLLER_SOUND_DELAY 0.15 -#define FBSDK_LIKE_ACTION_CONTROLLER_API_VERSION @"v2.1" - -#define FBSDK_LIKE_ACTION_CONTROLLER_LIKE_PROPERTY_KEY @"like" -#define FBSDK_LIKE_ACTION_CONTROLLER_REFRESH_PROPERTY_KEY @"refresh" - -#define FBSDK_LIKE_ACTION_CONTROLLER_LAST_UPDATE_TIME_KEY @"lastUpdateTime" -#define FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITH_LIKE_KEY @"likeCountStringWithLike" -#define FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITHOUT_LIKE_KEY @"likeCountStringWithoutLike" -#define FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_ID_KEY @"objectID" -#define FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_IS_LIKED_KEY @"objectIsLiked" -#define FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_TYPE_KEY @"objectType" -#define FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITH_LIKE_KEY @"socialSentenceWithLike" -#define FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITHOUT_LIKE_KEY @"socialSentenceWithoutLike" -#define FBSDK_LIKE_ACTION_CONTROLLER_UNLIKE_TOKEN_KEY @"unlikeToken" -#define FBSDK_LIKE_ACTION_CONTROLLER_VERSION_KEY @"version" - -#define FBSDK_LIKE_ACTION_CONTROLLER_VERSION 4 - -typedef NS_ENUM(NSUInteger, FBSDKLikeActionControllerRefreshMode) -{ - FBSDKLikeActionControllerRefreshModeInitial, - FBSDKLikeActionControllerRefreshModeForce, -}; - -typedef NS_ENUM(NSUInteger, FBSDKLikeActionControllerRefreshState) -{ - FBSDKLikeActionControllerRefreshStateNone, - FBSDKLikeActionControllerRefreshStateActive, - FBSDKLikeActionControllerRefreshStateComplete, -}; - -typedef void(^fbsdk_like_action_block)(FBSDKTriStateBOOL objectIsLiked, - NSString *likeCountStringWithLike, - NSString *likeCountStringWithoutLike, - NSString *socialSentenceWithLike, - NSString *socialSentenceWithoutLike, - NSString *unlikeToken, - BOOL likeStateChanged, - BOOL animated); - -typedef void(^fbsdk_like_action_controller_ensure_verified_object_id_completion_block)(NSString *verifiedObjectID); - -@interface FBSDKLikeActionController () -@end - -@implementation FBSDKLikeActionController -{ - FBSDKAccessToken *_accessToken; - NSUInteger _contentAccessCount; - BOOL _contentDiscarded; - NSMapTable *_dialogToAnalyticsParametersMap; - NSMapTable *_dialogToUpdateBlockMap; - NSString *_likeCountStringWithLike; - NSString *_likeCountStringWithoutLike; - BOOL _objectIsLikedIsPending; - BOOL _objectIsLikedOnServer; - BOOL _objectIsPage; - FBSDKLikeActionControllerRefreshState _refreshState; - NSString *_socialSentenceWithLike; - NSString *_socialSentenceWithoutLike; - NSString *_unlikeToken; - NSString *_verifiedObjectID; -} - -#pragma mark - Class Methods - -static BOOL _fbsdkLikeActionControllerDisabled = YES; - -+ (BOOL)isDisabled -{ - return _fbsdkLikeActionControllerDisabled; -} - -static FBSDKLikeActionControllerCache *_cache = nil; - -+ (void)initialize -{ - if (self == [FBSDKLikeActionController class]) { - NSString *accessTokenString = [FBSDKAccessToken currentAccessToken].tokenString; - if (accessTokenString) { - NSURL *fileURL = [self _cacheFileURL]; - NSData *data = [[NSData alloc] initWithContentsOfURL:fileURL]; - if (data) { - NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; - unarchiver.requiresSecureCoding = YES; - @try { - _cache = [unarchiver decodeObjectOfClass:[FBSDKLikeActionControllerCache class] - forKey:NSKeyedArchiveRootObjectKey]; - } - @catch (NSException *ex) { - // ignore decoding exceptions from previous versions of the archive, etc - } - if (![_cache.accessTokenString isEqualToString:accessTokenString]) { - _cache = nil; - } - } - } - if (!_cache) { - _cache = [[FBSDKLikeActionControllerCache alloc] initWithAccessTokenString:accessTokenString]; - } - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:self - selector:@selector(_accessTokenDidChangeNotification:) - name:FBSDKAccessTokenDidChangeNotification - object:nil]; - [nc addObserver:self - selector:@selector(_applicationWillResignActiveNotification:) - name:UIApplicationWillResignActiveNotification - object:nil]; - } -} - -+ (void)_accessTokenDidChangeNotification:(NSNotification *)notification -{ - NSString *accessTokenString = [FBSDKAccessToken currentAccessToken].tokenString; - if ([accessTokenString isEqualToString:_cache.accessTokenString]) { - return; - } - [_cache resetForAccessTokenString:accessTokenString]; - [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKLikeActionControllerDidResetNotification object:nil]; -} - -+ (void)_applicationWillResignActiveNotification:(NSNotification *)notification -{ - NSURL *fileURL = [self _cacheFileURL]; - if (!fileURL) { - return; - } - NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_cache]; - if (data) { - [data writeToURL:fileURL atomically:YES]; - } else { - [[[NSFileManager alloc] init] removeItemAtURL:fileURL error:NULL]; - } -} - -+ (NSURL *)_cacheFileURL -{ - NSURL *directoryURL = [[[NSFileManager alloc] init] URLForDirectory:NSLibraryDirectory - inDomain:NSUserDomainMask - appropriateForURL:nil - create:YES - error:NULL]; - return [directoryURL URLByAppendingPathComponent:@"com-facebook-sdk-like-data"]; -} - - -+ (instancetype)likeActionControllerForObjectID:(NSString *)objectID objectType:(FBSDKLikeObjectType)objectType -{ - if (!objectID) { - return nil; - } - @synchronized(self) { - FBSDKLikeActionController *controller = _cache[objectID]; - FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken]; - if (controller) { - [controller beginContentAccess]; - } else { - controller = [[self alloc] initWithObjectID:objectID objectType:objectType accessToken:accessToken]; - _cache[objectID] = controller; - } - [controller _refreshWithMode:FBSDKLikeActionControllerRefreshModeInitial]; - return controller; - } -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithObjectID:(NSString *)objectID - objectType:(FBSDKLikeObjectType)objectType - accessToken:(FBSDKAccessToken *)accessToken -{ - if ((self = [super init])) { - _objectID = [objectID copy]; - _objectType = objectType; - _accessToken = [accessToken copy]; - - [self _configure]; - } - return self; -} - -- (instancetype)init -{ - return [self initWithObjectID:nil objectType:FBSDKLikeObjectTypeUnknown accessToken:nil]; -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder -{ - if ([decoder decodeIntegerForKey:FBSDK_LIKE_ACTION_CONTROLLER_VERSION_KEY] != FBSDK_LIKE_ACTION_CONTROLLER_VERSION) { - return nil; - } - - NSString *objectID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_ID_KEY]; - if (!objectID) { - return nil; - } - - if ((self = [super init])) { - _objectID = [objectID copy]; - _accessToken = [FBSDKAccessToken currentAccessToken]; - - _lastUpdateTime = [[decoder decodeObjectOfClass:[NSDate class] forKey:FBSDK_LIKE_ACTION_CONTROLLER_LAST_UPDATE_TIME_KEY] copy]; - _likeCountStringWithLike = [[decoder decodeObjectOfClass:[NSString class] - forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITH_LIKE_KEY] copy]; - _likeCountStringWithoutLike = [[decoder decodeObjectOfClass:[NSString class] - forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITHOUT_LIKE_KEY] copy]; - _objectIsLiked = [decoder decodeBoolForKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_IS_LIKED_KEY]; - _objectType = [decoder decodeIntegerForKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_TYPE_KEY]; - _socialSentenceWithLike = [[decoder decodeObjectOfClass:[NSString class] - forKey:FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITH_LIKE_KEY] copy]; - _socialSentenceWithoutLike = [[decoder decodeObjectOfClass:[NSString class] - forKey:FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITHOUT_LIKE_KEY] copy]; - _unlikeToken = [[decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_LIKE_ACTION_CONTROLLER_UNLIKE_TOKEN_KEY] copy]; - - [self _configure]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)coder -{ - [coder encodeObject:_lastUpdateTime forKey:FBSDK_LIKE_ACTION_CONTROLLER_LAST_UPDATE_TIME_KEY]; - [coder encodeObject:_likeCountStringWithLike forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITH_LIKE_KEY]; - [coder encodeObject:_likeCountStringWithoutLike - forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_COUNT_STRING_WITHOUT_LIKE_KEY]; - [coder encodeObject:_objectID forKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_ID_KEY]; - [coder encodeBool:_objectIsLiked forKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_IS_LIKED_KEY]; - [coder encodeInteger:_objectType forKey:FBSDK_LIKE_ACTION_CONTROLLER_OBJECT_TYPE_KEY]; - [coder encodeObject:_socialSentenceWithLike forKey:FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITH_LIKE_KEY]; - [coder encodeObject:_socialSentenceWithoutLike forKey:FBSDK_LIKE_ACTION_CONTROLLER_SOCIAL_SENTENCE_WITHOUT_LIKE_KEY]; - [coder encodeObject:_unlikeToken forKey:FBSDK_LIKE_ACTION_CONTROLLER_UNLIKE_TOKEN_KEY]; - [coder encodeInteger:FBSDK_LIKE_ACTION_CONTROLLER_VERSION forKey:FBSDK_LIKE_ACTION_CONTROLLER_VERSION_KEY]; -} - -#pragma mark - Properties - -- (NSString *)likeCountString -{ - return (_objectIsLiked ? _likeCountStringWithLike : _likeCountStringWithoutLike); -} - -- (NSString *)socialSentence -{ - return (_objectIsLiked ? _socialSentenceWithLike : _socialSentenceWithoutLike); -} - -#pragma mark - Public API - -- (void)refresh -{ - [self _refreshWithMode:FBSDKLikeActionControllerRefreshModeForce]; -} - -- (void)toggleLikeWithSoundEnabled:(BOOL)soundEnabled analyticsParameters:(NSDictionary *)analyticsParameters fromViewController:(UIViewController *)fromViewController -{ - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKLikeControlDidTap - valueToSum:nil - parameters:analyticsParameters - accessToken:_accessToken]; - - [self _setExecuting:YES forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_PROPERTY_KEY]; - - BOOL useOGLike = [self _useOGLike]; - BOOL deferred = !useOGLike; - - fbsdk_like_action_block updateBlock = ^(FBSDKTriStateBOOL objectIsLiked, - NSString *likeCountStringWithLike, - NSString *likeCountStringWithoutLike, - NSString *socialSentenceWithLike, - NSString *socialSentenceWithoutLike, - NSString *unlikeToken, - BOOL likeStateChanged, - BOOL animated){ - [self _updateWithObjectIsLiked:objectIsLiked - likeCountStringWithLike:likeCountStringWithLike - likeCountStringWithoutLike:likeCountStringWithoutLike - socialSentenceWithLike:socialSentenceWithLike - socialSentenceWithoutLike:socialSentenceWithoutLike - unlikeToken:unlikeToken - soundEnabled:soundEnabled && likeStateChanged - animated:animated && likeStateChanged - deferred:deferred]; - }; - - BOOL objectIsLiked = !_objectIsLiked; - - // optimistically update if using og.like (FAS will defer the update) - if (useOGLike) { - updateBlock(FBSDKTriStateBOOLFromBOOL(objectIsLiked), - _likeCountStringWithLike, - _likeCountStringWithoutLike, - _socialSentenceWithLike, - _socialSentenceWithoutLike, - _unlikeToken, - YES, - YES); - if (_objectIsLikedIsPending) { - return; - } - } - - if (objectIsLiked) { - if (useOGLike) { - [self _publishLikeWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; - } else { - [self _presentLikeDialogWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; - } - } else { - if (useOGLike && _unlikeToken) { - [self _publishUnlikeWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; - } else { - [self _presentLikeDialogWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; - } - } -} - -#pragma mark - NSDiscardableContent - -- (BOOL)beginContentAccess -{ - _contentDiscarded = NO; - _contentAccessCount++; - return YES; -} - -- (void)endContentAccess -{ - _contentAccessCount--; -} - -- (void)discardContentIfPossible -{ - if (_contentAccessCount == 0) { - _contentDiscarded = YES; - } -} - -- (BOOL)isContentDiscarded -{ - return _contentDiscarded; -} - -#pragma mark - FBSDKLikeDialogDelegate - -- (void)likeDialog:(FBSDKLikeDialog *)likeDialog didCompleteWithResults:(NSDictionary *)results -{ - FBSDKTriStateBOOL objectIsLiked = FBSDKTriStateBOOLFromNSNumber(results[@"object_is_liked"]); - NSString *likeCountString = [FBSDKTypeUtility stringValue:results[@"like_count_string"]]; - NSString *socialSentence = [FBSDKTypeUtility stringValue:results[@"social_sentence"]]; - NSString *unlikeToken = [FBSDKTypeUtility stringValue:results[@"unlike_token"]]; - BOOL likeStateChanged = ![[FBSDKTypeUtility stringValue:results[@"completionGesture"]] isEqualToString:@"cancel"]; - - fbsdk_like_action_block updateBlock = [_dialogToUpdateBlockMap objectForKey:likeDialog]; - if (updateBlock != NULL) { - // we do not need to specify values for with/without like, since we will fast-app-switch to change - // the value - updateBlock(objectIsLiked, - likeCountString, - likeCountString, - socialSentence, - socialSentence, - unlikeToken, - likeStateChanged, - YES); - } - [self _setExecuting:NO forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_PROPERTY_KEY]; -} - -- (void)likeDialog:(FBSDKLikeDialog *)likeDialog didFailWithError:(NSError *)error -{ - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorUIControlErrors - formatString:@"Like dialog error for %@(%@): %@", _objectID, NSStringFromFBSDKLikeObjectType(_objectType), error]; - - if ([error.userInfo[@"error_reason"] isEqualToString:@"dialog_disabled"]) { - _fbsdkLikeActionControllerDisabled = YES; - - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKLikeControlDidDisable - valueToSum:nil - parameters:[_dialogToAnalyticsParametersMap objectForKey:likeDialog] - accessToken:_accessToken]; - - [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKLikeActionControllerDidDisableNotification - object:self - userInfo:nil]; - } else { - FBSDKLikeActionControllerLogError(@"present_dialog", _objectID, _objectType, _accessToken, error); - } - [self _setExecuting:NO forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_PROPERTY_KEY]; -} - -#pragma mark - Helper Methods - -- (void)_configure -{ - NSPointerFunctionsOptions keyOptions = (NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPersonality); - NSPointerFunctionsOptions valueOptions = (NSPointerFunctionsStrongMemory | - NSPointerFunctionsObjectPersonality | - NSPointerFunctionsCopyIn); - _dialogToAnalyticsParametersMap = [[NSMapTable alloc] initWithKeyOptions:keyOptions valueOptions:valueOptions capacity:0]; - _dialogToUpdateBlockMap = [[NSMapTable alloc] initWithKeyOptions:keyOptions valueOptions:valueOptions capacity:0]; - - _contentAccessCount = 1; -} - -static void FBSDKLikeActionControllerLogError(NSString *currentAction, - NSString *objectID, - FBSDKLikeObjectType objectType, - FBSDKAccessToken *accessToken, - NSError *error) -{ - NSDictionary *parameters = @{ - @"object_id": objectID, - @"object_type": NSStringFromFBSDKLikeObjectType(objectType), - @"current_action": currentAction, - @"error": [error description] ?: @"", - }; - NSString *eventName = ([FBSDKError errorIsNetworkError:error] ? - FBSDKAppEventNameFBSDKLikeControlNetworkUnavailable : - FBSDKAppEventNameFBSDKLikeControlError); - [FBSDKAppEvents logImplicitEvent:eventName - valueToSum:nil - parameters:parameters - accessToken:accessToken]; -} - -typedef void(^fbsdk_like_action_controller_get_engagement_completion_block)(BOOL success, - NSString *likeCountStringWithLike, - NSString *likeCountStringWithoutLike, - NSString *socialSentenceWithLike, - NSString *socialSentenceWithoutLike); -static void FBSDKLikeActionControllerAddGetEngagementRequest(FBSDKAccessToken *accessToken, - FBSDKGraphRequestConnection *connection, - NSString *objectID, - FBSDKLikeObjectType objectType, - fbsdk_like_action_controller_get_engagement_completion_block completionHandler) -{ - if (completionHandler == NULL) { - return; - } - NSString *fields = @"engagement.fields(count_string_with_like,count_string_without_like,social_sentence_with_like," - @"social_sentence_without_like)"; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:objectID - parameters:@{ @"fields": fields, - @"locale": [NSLocale currentLocale].localeIdentifier - } - tokenString:accessToken.tokenString - HTTPMethod:@"GET" - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { - BOOL success = NO; - NSString *likeCountStringWithLike = nil; - NSString *likeCountStringWithoutLike = nil; - NSString *socialSentenceWithLike = nil; - NSString *socialSentenceWithoutLike = nil; - if (error) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorUIControlErrors - formatString:@"Error fetching engagement for %@ (%@): %@", - objectID, - NSStringFromFBSDKLikeObjectType(objectType), - error]; - FBSDKLikeActionControllerLogError(@"get_engagement", objectID, objectType, accessToken, error); - } else { - success = YES; - result = [FBSDKTypeUtility dictionaryValue:result]; - likeCountStringWithLike = [FBSDKTypeUtility stringValue:[result valueForKeyPath:@"engagement.count_string_with_like"]]; - likeCountStringWithoutLike = [FBSDKTypeUtility stringValue:[result valueForKeyPath:@"engagement.count_string_without_like"]]; - socialSentenceWithLike = [FBSDKTypeUtility stringValue:[result valueForKeyPath:@"engagement.social_sentence_with_like"]]; - socialSentenceWithoutLike = [FBSDKTypeUtility stringValue:[result valueForKeyPath:@"engagement.social_sentence_without_like"]]; - } - completionHandler(success, - likeCountStringWithLike, - likeCountStringWithoutLike, - socialSentenceWithLike, - socialSentenceWithoutLike); - }]; -} - -typedef void(^fbsdk_like_action_controller_get_object_id_completion_block)(BOOL success, - NSString *verifiedObjectID, - BOOL objectIsPage); -static void FBSDKLikeActionControllerAddGetObjectIDRequest(FBSDKAccessToken *accessToken, - FBSDKGraphRequestConnection *connection, - NSString *objectID, - fbsdk_like_action_controller_get_object_id_completion_block completionHandler) -{ - if (completionHandler == NULL) { - return; - } - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"" - parameters:@{ - @"fields": @"id", - @"id": objectID, - @"metadata": @"1", - @"type": @"og", - @"locale": [NSLocale currentLocale].localeIdentifier - } - tokenString:accessToken.tokenString - HTTPMethod:@"GET" - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - - [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { - result = [FBSDKTypeUtility dictionaryValue:result]; - NSString *verifiedObjectID = [FBSDKTypeUtility stringValue:result[@"id"]]; - BOOL objectIsPage = [FBSDKTypeUtility boolValue:[result valueForKeyPath:@"metadata.type"]]; - completionHandler(verifiedObjectID != nil, verifiedObjectID, objectIsPage); - }]; -} - -static void FBSDKLikeActionControllerAddGetObjectIDWithObjectURLRequest(FBSDKAccessToken *accessToken, - FBSDKGraphRequestConnection *connection, - NSString *objectID, - fbsdk_like_action_controller_get_object_id_completion_block completionHandler) -{ - if (completionHandler == NULL) { - return; - } - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"" - parameters:@{ - @"fields": @"og_object.fields(id)", - @"id": objectID, - @"locale": [NSLocale currentLocale].localeIdentifier - } - tokenString:accessToken.tokenString - HTTPMethod:@"GET" - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { - result = [FBSDKTypeUtility dictionaryValue:result]; - NSString *verifiedObjectID = [FBSDKTypeUtility stringValue:[result valueForKeyPath:@"og_object.id"]]; - completionHandler(verifiedObjectID != nil, verifiedObjectID, NO); - }]; -} - -typedef void(^fbsdk_like_action_controller_get_og_object_like_completion_block)(BOOL success, - FBSDKTriStateBOOL objectIsLiked, - NSString *unlikeToken); -static void FBSDKLikeActionControllerAddGetOGObjectLikeRequest(FBSDKAccessToken *accessToken, - FBSDKGraphRequestConnection *connection, - NSString *objectID, - FBSDKLikeObjectType objectType, - fbsdk_like_action_controller_get_og_object_like_completion_block completionHandler) -{ - if (completionHandler == NULL) { - return; - } - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/og.likes" - parameters:@{ - @"fields": @"id,application", - @"object": objectID, - @"locale": [NSLocale currentLocale].localeIdentifier - } - tokenString:accessToken.tokenString - HTTPMethod:@"GET" - flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery]; - - [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { - BOOL success = NO; - FBSDKTriStateBOOL objectIsLiked = FBSDKTriStateBOOLValueUnknown; - NSString *unlikeToken = nil; - if (error) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorUIControlErrors - formatString:@"Error fetching like state for %@(%@): %@", objectID, NSStringFromFBSDKLikeObjectType(objectType), error]; - FBSDKLikeActionControllerLogError(@"get_og_object_like", objectID, objectType, accessToken, error); - } else { - success = YES; - result = [FBSDKTypeUtility dictionaryValue:result]; - NSArray *dataSet = [FBSDKTypeUtility arrayValue:result[@"data"]]; - for (NSDictionary *data in dataSet) { - objectIsLiked = FBSDKTriStateBOOLValueYES; - NSString *applicationID = [FBSDKTypeUtility stringValue:[data valueForKeyPath:@"application.id"]]; - if ([accessToken.appID isEqualToString:applicationID]) { - unlikeToken = [FBSDKTypeUtility stringValue:data[@"id"]]; - break; - } - } - } - completionHandler(success, objectIsLiked, unlikeToken); - }]; -} - -typedef void(^fbsdk_like_action_controller_publish_like_completion_block)(BOOL success, NSString *unlikeToken); -static void FBSDKLikeActionControllerAddPublishLikeRequest(FBSDKAccessToken *accessToken, - FBSDKGraphRequestConnection *connection, - NSString *objectID, - FBSDKLikeObjectType objectType, - fbsdk_like_action_controller_publish_like_completion_block completionHandler) -{ - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/og.likes" - parameters:@{ @"object": objectID, - @"locale": [NSLocale currentLocale].localeIdentifier - } - tokenString:accessToken.tokenString - version:nil - HTTPMethod:@"POST"]; - [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { - BOOL success = NO; - NSString *unlikeToken = nil; - if (error) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorUIControlErrors - formatString:@"Error liking object %@(%@): %@", objectID, NSStringFromFBSDKLikeObjectType(objectType), error]; - FBSDKLikeActionControllerLogError(@"publish_like", objectID, objectType, accessToken, error); - } else { - success = YES; - result = [FBSDKTypeUtility dictionaryValue:result]; - unlikeToken = [FBSDKTypeUtility stringValue:result[@"id"]]; - } - if (completionHandler != NULL) { - completionHandler(success, unlikeToken); - } - }]; -} - -typedef void(^fbsdk_like_action_controller_publish_unlike_completion_block)(BOOL success); -static void FBSDKLikeActionControllerAddPublishUnlikeRequest(FBSDKAccessToken *accessToken, - FBSDKGraphRequestConnection *connection, - NSString *unlikeToken, - FBSDKLikeObjectType objectType, - fbsdk_like_action_controller_publish_unlike_completion_block completionHandler) -{ - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:unlikeToken - parameters:nil - tokenString:accessToken.tokenString - version:nil - HTTPMethod:@"DELETE"]; - [connection addRequest:request completionHandler:^(FBSDKGraphRequestConnection *innerConnection, id result, NSError *error) { - BOOL success = NO; - if (error) { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorUIControlErrors - formatString:@"Error unliking object with unlike token %@(%@): %@", unlikeToken, NSStringFromFBSDKLikeObjectType(objectType), error]; - FBSDKLikeActionControllerLogError(@"publish_unlike", unlikeToken, objectType, accessToken, error); - } else { - success = YES; - } - if (completionHandler != NULL) { - completionHandler(success); - } - }]; -} - -static void FBSDKLikeActionControllerAddRefreshRequests(FBSDKAccessToken *accessToken, - FBSDKGraphRequestConnection *connection, - NSString *objectID, - FBSDKLikeObjectType objectType, - fbsdk_like_action_block completionHandler) -{ - if (completionHandler == NULL) { - return; - } - __block FBSDKTriStateBOOL objectIsLiked = FBSDKTriStateBOOLValueUnknown; - __block NSString *likeCountStringWithLike = nil; - __block NSString *likeCountStringWithoutLike = nil; - __block NSString *socialSentenceWithLike = nil; - __block NSString *socialSentenceWithoutLike = nil; - __block NSString *unlikeToken = nil; - - void(^handleResults)(void) = ^{ - completionHandler(objectIsLiked, - likeCountStringWithLike, - likeCountStringWithoutLike, - socialSentenceWithLike, - socialSentenceWithoutLike, - unlikeToken, - NO, - NO); - }; - - fbsdk_like_action_controller_get_og_object_like_completion_block getLikeStateCompletionBlock = ^(BOOL success, - FBSDKTriStateBOOL innerObjectIsLiked, - NSString *innerUnlikeToken) { - if (success) { - objectIsLiked = innerObjectIsLiked; - if (innerUnlikeToken) { - unlikeToken = [innerUnlikeToken copy]; - } - } - }; - FBSDKLikeActionControllerAddGetOGObjectLikeRequest(accessToken, - connection, - objectID, - objectType, - getLikeStateCompletionBlock); - - fbsdk_like_action_controller_get_engagement_completion_block engagementCompletionBlock = ^(BOOL success, - NSString *innerLikeCountStringWithLike, - NSString *innerLikeCountStringWithoutLike, - NSString *innerSocialSentenceWithLike, - NSString *innerSocialSentenceWithoutLike) { - if (success) { - // Don't lose cached state if certain properties were not included - likeCountStringWithLike = [innerLikeCountStringWithLike copy]; - likeCountStringWithoutLike = [innerLikeCountStringWithoutLike copy]; - socialSentenceWithLike = [innerSocialSentenceWithLike copy]; - socialSentenceWithoutLike = [innerSocialSentenceWithoutLike copy]; - - handleResults(); - } - }; - FBSDKLikeActionControllerAddGetEngagementRequest(accessToken, - connection, - objectID, - objectType, - engagementCompletionBlock); -} - - -- (void)_ensureVerifiedObjectID:(fbsdk_like_action_controller_ensure_verified_object_id_completion_block)completion -{ - if (completion == NULL) { - return; - } - FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; - [connection overrideVersionPartWith:FBSDK_LIKE_ACTION_CONTROLLER_API_VERSION]; - if ([_objectID rangeOfString:@"://"].location != NSNotFound) { - FBSDKLikeActionControllerAddGetObjectIDWithObjectURLRequest(_accessToken, connection, _objectID, ^(BOOL success, - NSString *innerVerifiedObjectID, - BOOL innerObjectIsPage) { - if (success) { - _verifiedObjectID = [innerVerifiedObjectID copy]; - _objectIsPage = innerObjectIsPage; - } - }); - } - - FBSDKLikeActionControllerAddGetObjectIDRequest(_accessToken, connection, _objectID, ^(BOOL success, - NSString *innerVerifiedObjectID, - BOOL innerObjectIsPage) { - if (success) { - // if this was an URL based request, then we want to use the objectID from that request - this value will just - // be an echo of the URL - if (!_verifiedObjectID) { - _verifiedObjectID = [innerVerifiedObjectID copy]; - } - _objectIsPage = innerObjectIsPage; - } - if (_verifiedObjectID) { - completion(_verifiedObjectID); - } - }); - [connection start]; -} - -- (void)_presentLikeDialogWithUpdateBlock:(fbsdk_like_action_block)updateBlock - analyticsParameters:(NSDictionary *)analyticsParameters - fromViewController:(UIViewController *)fromViewController -{ - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKLikeControlDidPresentDialog - valueToSum:nil - parameters:analyticsParameters - accessToken:_accessToken]; - FBSDKLikeDialog *dialog = [[FBSDKLikeDialog alloc] init]; - dialog.objectID = _objectID; - dialog.objectType = _objectType; - dialog.delegate = self; - dialog.fromViewController = fromViewController; - [_dialogToUpdateBlockMap setObject:updateBlock forKey:dialog]; - [_dialogToAnalyticsParametersMap setObject:analyticsParameters forKey:dialog]; - if (![dialog like]) { - [self _setExecuting:NO forKey:FBSDK_LIKE_ACTION_CONTROLLER_LIKE_PROPERTY_KEY]; - } -} - -- (void)_publishIfNeededWithUpdateBlock:(fbsdk_like_action_block)updateBlock - analyticsParameters:(NSDictionary *)analyticsParameters - fromViewController:(UIViewController *)fromViewController -{ - BOOL objectIsLiked = _objectIsLiked; - if (_objectIsLikedOnServer != objectIsLiked) { - if (objectIsLiked) { - [self _publishLikeWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; - } else { - [self _publishUnlikeWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; - } - } -} - -- (void)_publishLikeWithUpdateBlock:(fbsdk_like_action_block)updateBlock - analyticsParameters:(NSDictionary *)analyticsParameters - fromViewController:(UIViewController *)fromViewController -{ - _objectIsLikedIsPending = YES; - [self _ensureVerifiedObjectID:^(NSString *verifiedObjectID) { - FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; - [connection overrideVersionPartWith:FBSDK_LIKE_ACTION_CONTROLLER_API_VERSION]; - fbsdk_like_action_controller_publish_like_completion_block completionHandler = ^(BOOL success, - NSString *unlikeToken) { - _objectIsLikedIsPending = NO; - if (success) { - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKLikeControlDidLike - valueToSum:nil - parameters:analyticsParameters - accessToken:_accessToken]; - _objectIsLikedOnServer = YES; - _unlikeToken = [unlikeToken copy]; - if (updateBlock != NULL) { - updateBlock(FBSDKTriStateBOOLFromBOOL(self.objectIsLiked), - _likeCountStringWithLike, - _likeCountStringWithoutLike, - _socialSentenceWithLike, - _socialSentenceWithoutLike, - _unlikeToken, - NO, - NO); - } - [self _publishIfNeededWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; - } else { - [self _presentLikeDialogWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; - } - }; - FBSDKLikeActionControllerAddPublishLikeRequest(_accessToken, - connection, - verifiedObjectID, - _objectType, - completionHandler); - [connection start]; - }]; -} - -- (void)_publishUnlikeWithUpdateBlock:(fbsdk_like_action_block)updateBlock - analyticsParameters:(NSDictionary *)analyticsParameters - fromViewController:(UIViewController *)fromViewController -{ - _objectIsLikedIsPending = YES; - FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; - [connection overrideVersionPartWith:FBSDK_LIKE_ACTION_CONTROLLER_API_VERSION]; - fbsdk_like_action_controller_publish_unlike_completion_block completionHandler = ^(BOOL success) { - _objectIsLikedIsPending = NO; - if (success) { - [FBSDKAppEvents logImplicitEvent:FBSDKAppEventNameFBSDKLikeControlDidUnlike - valueToSum:nil - parameters:analyticsParameters - accessToken:_accessToken]; - _objectIsLikedOnServer = NO; - _unlikeToken = nil; - if (updateBlock != NULL) { - updateBlock(FBSDKTriStateBOOLFromBOOL(self.objectIsLiked), - _likeCountStringWithLike, - _likeCountStringWithoutLike, - _socialSentenceWithLike, - _socialSentenceWithoutLike, - _unlikeToken, - NO, - NO); - } - [self _publishIfNeededWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; - } else { - [self _presentLikeDialogWithUpdateBlock:updateBlock analyticsParameters:analyticsParameters fromViewController:fromViewController]; - } - }; - FBSDKLikeActionControllerAddPublishUnlikeRequest(_accessToken, - connection, - _unlikeToken, - _objectType, - completionHandler); - [connection start]; -} - -- (void)_refreshWithMode:(FBSDKLikeActionControllerRefreshMode)mode -{ - switch (mode) { - case FBSDKLikeActionControllerRefreshModeForce:{ - // if we're already refreshing, skip - if (_refreshState == FBSDKLikeActionControllerRefreshStateActive) { - return; - } - break; - } - case FBSDKLikeActionControllerRefreshModeInitial:{ - // if we've already started any refresh, skip this - if (_refreshState != FBSDKLikeActionControllerRefreshStateNone) { - return; - } - break; - } - } - - // You must be logged in to fetch the like status - if (!_accessToken) { - return; - } - - [self _setExecuting:YES forKey:FBSDK_LIKE_ACTION_CONTROLLER_REFRESH_PROPERTY_KEY]; - _refreshState = FBSDKLikeActionControllerRefreshStateActive; - - [self _ensureVerifiedObjectID:^(NSString *verifiedObjectID) { - FBSDKGraphRequestConnection *connection = [[FBSDKGraphRequestConnection alloc] init]; - [connection overrideVersionPartWith:FBSDK_LIKE_ACTION_CONTROLLER_API_VERSION]; - FBSDKLikeActionControllerAddRefreshRequests(_accessToken, - connection, - verifiedObjectID, - _objectType, - ^(FBSDKTriStateBOOL objectIsLiked, - NSString *likeCountStringWithLike, - NSString *likeCountStringWithoutLike, - NSString *socialSentenceWithLike, - NSString *socialSentenceWithoutLike, - NSString *unlikeToken, - BOOL likeStateChanged, - BOOL animated) { - [self _updateWithObjectIsLiked:objectIsLiked - likeCountStringWithLike:likeCountStringWithLike - likeCountStringWithoutLike:likeCountStringWithoutLike - socialSentenceWithLike:socialSentenceWithLike - socialSentenceWithoutLike:socialSentenceWithoutLike - unlikeToken:unlikeToken - soundEnabled:NO - animated:NO - deferred:NO]; - [self _setExecuting:NO forKey:FBSDK_LIKE_ACTION_CONTROLLER_REFRESH_PROPERTY_KEY]; - _refreshState = FBSDKLikeActionControllerRefreshStateComplete; - }); - [connection start]; - }]; -} - -- (void)_setExecuting:(BOOL)executing forKey:(NSString *)key -{ - static NSMapTable *_executing = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - _executing = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsCopyIn valueOptions:NSPointerFunctionsStrongMemory capacity:0]; - }); - - NSString *objectKey = [NSString stringWithFormat: - @"%@:%@:%@", - _objectID, - NSStringFromFBSDKLikeObjectType(_objectType), - key]; - if (executing) { - [self beginContentAccess]; - [_executing setObject:self forKey:objectKey]; - } else { - [_executing removeObjectForKey:objectKey]; - [self endContentAccess]; - } -} - -- (void)_updateWithObjectIsLiked:(FBSDKTriStateBOOL)objectIsLikedTriState - likeCountStringWithLike:(NSString *)likeCountStringWithLike - likeCountStringWithoutLike:(NSString *)likeCountStringWithoutLike - socialSentenceWithLike:(NSString *)socialSentenceWithLike - socialSentenceWithoutLike:(NSString *)socialSentenceWithoutLike - unlikeToken:(NSString *)unlikeToken - soundEnabled:(BOOL)soundEnabled - animated:(BOOL)animated - deferred:(BOOL)deferred -{ - if (objectIsLikedTriState != FBSDKTriStateBOOLValueUnknown) { - _lastUpdateTime = [NSDate date]; - } - - // This value will not be useable if objectIsLikedTriState is FBSDKTriStateBOOLValueUnknown - BOOL objectIsLiked = BOOLFromFBSDKTriStateBOOL(objectIsLikedTriState, NO); - - // So always check objectIsLikedChanged before using objectIsLiked. - // If the new like state is unknown, we don't consider the state to have changed. - BOOL objectIsLikedChanged = (objectIsLikedTriState != FBSDKTriStateBOOLValueUnknown) && (self.objectIsLiked != objectIsLiked); - - if (!objectIsLikedChanged && - [FBSDKInternalUtility object:_likeCountStringWithLike isEqualToObject:likeCountStringWithLike] && - [FBSDKInternalUtility object:_likeCountStringWithoutLike isEqualToObject:likeCountStringWithoutLike] && - [FBSDKInternalUtility object:_socialSentenceWithLike isEqualToObject:socialSentenceWithLike] && - [FBSDKInternalUtility object:_socialSentenceWithoutLike isEqualToObject:socialSentenceWithoutLike] && - [FBSDKInternalUtility object:_unlikeToken isEqualToObject:unlikeToken]) { - // check if the like state changed and only animate if it did - return; - } - - void(^updateBlock)(void) = ^{ - if (objectIsLikedChanged) { - _objectIsLiked = objectIsLiked; - } - - if (likeCountStringWithLike) { - _likeCountStringWithLike = [likeCountStringWithLike copy]; - } - if (likeCountStringWithoutLike) { - _likeCountStringWithoutLike = [likeCountStringWithoutLike copy]; - } - if (socialSentenceWithLike) { - _socialSentenceWithLike = [socialSentenceWithLike copy]; - } - if (socialSentenceWithoutLike) { - _socialSentenceWithoutLike = [socialSentenceWithoutLike copy]; - } - if (unlikeToken) { - _unlikeToken = [unlikeToken copy]; - } - - // if only meta data changed, don't play the sound - FBSDKLikeButtonPopWAV *likeSound = (objectIsLikedChanged && objectIsLiked && soundEnabled ? [FBSDKLikeButtonPopWAV sharedLoader] : nil); - - void(^notificationBlock)(void) = ^{ - if (likeSound) { - dispatch_time_t soundPopTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(FBSDK_LIKE_ACTION_CONTROLLER_SOUND_DELAY * NSEC_PER_SEC)); - dispatch_after(soundPopTime, dispatch_get_main_queue(), ^(void){ - [likeSound playSound]; - }); - } - NSDictionary *userInfo = @{FBSDKLikeActionControllerAnimatedKey: @(animated)}; - [[NSNotificationCenter defaultCenter] postNotificationName:FBSDKLikeActionControllerDidUpdateNotification - object:self - userInfo:userInfo]; - }; - - notificationBlock(); - }; - - // if only meta data changed, don't defer - if (deferred && objectIsLikedChanged) { - double delayInSeconds = FBSDK_LIKE_ACTION_CONTROLLER_ANIMATION_DELAY; - dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); - dispatch_after(popTime, dispatch_get_main_queue(), updateBlock); - } else { - updateBlock(); - } -} - -- (BOOL)_useOGLike -{ - return (_accessToken && - !_objectIsPage && - _verifiedObjectID && - [_accessToken.permissions containsObject:@"publish_actions"]); -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h deleted file mode 100644 index e1f30c8be..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKLikeActionControllerCache : NSObject - -- (instancetype)initWithAccessTokenString:(NSString *)accessTokenString NS_DESIGNATED_INITIALIZER; - -@property (nonatomic, copy, readonly) NSString *accessTokenString; - -- (id)objectForKeyedSubscript:(id)key; -- (void)resetForAccessTokenString:(NSString *)accessTokenString; -- (void)setObject:(id)object forKeyedSubscript:(id)key; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.m deleted file mode 100644 index 746e81903..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.m +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLikeActionControllerCache.h" - -#import - -#import "FBSDKLikeActionController.h" - -// after 1 day, expire the cached states -#define FBSDK_LIKE_ACTION_CONTROLLER_CACHE_TIMEOUT 60 * 24 - -#define FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ACCESS_TOKEN_KEY @"accessTokenString" -#define FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ITEMS_KEY @"items" - -@implementation FBSDKLikeActionControllerCache -{ - NSString *_accessTokenString; - NSMutableDictionary *_items; -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithAccessTokenString:(NSString *)accessTokenString -{ - if ((self = [super init])) { - _accessTokenString = [accessTokenString copy]; - _items = [[NSMutableDictionary alloc] init]; - } - return self; -} - -- (instancetype)init -{ - FBSDK_NOT_DESIGNATED_INITIALIZER(initWithAccessTokenString:); - return [self initWithAccessTokenString:nil]; -} - -#pragma mark - NSCoding - -+ (BOOL)supportsSecureCoding -{ - return YES; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - NSString *accessTokenString = [decoder decodeObjectOfClass:[NSString class] - forKey:FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ACCESS_TOKEN_KEY]; - if ((self = [self initWithAccessTokenString:accessTokenString])) { - NSSet *allowedClasses = [NSSet setWithObjects:[NSDictionary class], [FBSDKLikeActionController class], nil]; - NSDictionary *items = [decoder decodeObjectOfClasses:allowedClasses - forKey:FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ITEMS_KEY]; - _items = [[NSMutableDictionary alloc] initWithDictionary:items]; - [self _prune]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)encoder -{ - [encoder encodeObject:_accessTokenString forKey:FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ACCESS_TOKEN_KEY]; - [encoder encodeObject:_items forKey:FBSDK_LIKE_ACTION_CONTROLLER_CACHE_ITEMS_KEY]; -} - -#pragma mark - Public Methods - -- (id)objectForKeyedSubscript:(id)key -{ - return _items[key]; -} - -- (void)resetForAccessTokenString:(NSString *)accessTokenString -{ - _accessTokenString = [accessTokenString copy]; - [_items removeAllObjects]; -} - -- (void)setObject:(id)object forKeyedSubscript:(id)key -{ - _items[key] = object; -} - -#pragma mark - Helper Methods - -- (void)_prune -{ - NSMutableArray *keysToRemove = [[NSMutableArray alloc] init]; - [_items enumerateKeysAndObjectsUsingBlock:^(NSString *objectID, - FBSDKLikeActionController *likeActionController, - BOOL *stop) { - NSDate *lastUpdateTime = likeActionController.lastUpdateTime; - if (!lastUpdateTime || - ([[NSDate date] timeIntervalSinceDate:lastUpdateTime] > FBSDK_LIKE_ACTION_CONTROLLER_CACHE_TIMEOUT)) { - [keysToRemove addObject:objectID]; - } - }]; - [_items removeObjectsForKeys:keysToRemove]; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h deleted file mode 100644 index 8ad46b6ac..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKLikeBoxView.h" - -@interface FBSDKLikeBoxBorderView : UIView - -@property (nonatomic, assign) CGFloat borderCornerRadius; -@property (nonatomic, assign) CGFloat borderWidth; -@property (nonatomic, assign) FBSDKLikeBoxCaretPosition caretPosition; -@property (nonatomic, assign, readonly) UIEdgeInsets contentInsets; -@property (nonatomic, strong) UIView *contentView; -@property (nonatomic, strong) UIColor *fillColor; -@property (nonatomic, strong) UIColor *foregroundColor; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.m deleted file mode 100644 index 71faf0f46..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.m +++ /dev/null @@ -1,323 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLikeBoxBorderView.h" - -#import "FBSDKCoreKit+Internal.h" - -#define FBSDK_LIKE_BOX_BORDER_CARET_WIDTH 6.0 -#define FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT 3.0 -#define FBSDK_LIKE_BOX_BORDER_CARET_PADDING 3.0 -#define FBSDK_LIKE_BOX_BORDER_CONTENT_PADDING 4.0 - -@implementation FBSDKLikeBoxBorderView - -#pragma mark - Object Lifecycle - -- (instancetype)initWithFrame:(CGRect)frame -{ - if ((self = [super initWithFrame:frame])) { - [self _initializeContent]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [super initWithCoder:decoder])) { - [self _initializeContent]; - } - return self; -} - -#pragma mark - Properties - -- (void)setBackgroundColor:(UIColor *)backgroundColor -{ - if (![self.backgroundColor isEqual:backgroundColor]) { - [super setBackgroundColor:backgroundColor]; - [self setNeedsDisplay]; - } -} - -- (void)setBorderCornerRadius:(CGFloat)borderCornerRadius -{ - if (_borderCornerRadius != borderCornerRadius) { - _borderCornerRadius = borderCornerRadius; - [self setNeedsDisplay]; - } -} - -- (void)setBorderWidth:(CGFloat)borderWidth -{ - if (_borderWidth != borderWidth) { - _borderWidth = borderWidth; - [self setNeedsDisplay]; - [self invalidateIntrinsicContentSize]; - } -} - -- (void)setCaretPosition:(FBSDKLikeBoxCaretPosition)caretPosition -{ - if (_caretPosition != caretPosition) { - _caretPosition = caretPosition; - [self setNeedsLayout]; - [self setNeedsDisplay]; - [self invalidateIntrinsicContentSize]; - } -} - -- (UIEdgeInsets)contentInsets -{ - UIEdgeInsets borderInsets = [self _borderInsets]; - return UIEdgeInsetsMake(borderInsets.top + FBSDK_LIKE_BOX_BORDER_CONTENT_PADDING, - borderInsets.left + FBSDK_LIKE_BOX_BORDER_CONTENT_PADDING, - borderInsets.bottom + FBSDK_LIKE_BOX_BORDER_CONTENT_PADDING, - borderInsets.right + FBSDK_LIKE_BOX_BORDER_CONTENT_PADDING); -} - -- (void)setContentView:(UIView *)contentView -{ - if (_contentView != contentView) { - [_contentView removeFromSuperview]; - _contentView = contentView; - [self addSubview:_contentView]; - [self setNeedsLayout]; - [self invalidateIntrinsicContentSize]; - } -} - -- (void)setFillColor:(UIColor *)fillColor -{ - if (![_fillColor isEqual:fillColor]) { - _fillColor = fillColor; - [self setNeedsDisplay]; - } -} - -- (void)setForegroundColor:(UIColor *)foregroundColor -{ - if (![_foregroundColor isEqual:foregroundColor]) { - _foregroundColor = foregroundColor; - [self setNeedsDisplay]; - } -} - -#pragma mark - Layout - -- (CGSize)intrinsicContentSize -{ - return FBSDKEdgeInsetsOutsetSize(self.contentView.intrinsicContentSize, self.contentInsets); -} - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - self.contentView.frame = UIEdgeInsetsInsetRect(self.bounds, self.contentInsets); -} - -- (CGSize)sizeThatFits:(CGSize)size -{ - UIEdgeInsets contentInsets = self.contentInsets; - size = FBSDKEdgeInsetsInsetSize(size, contentInsets); - size = [self.contentView sizeThatFits:size]; - size = FBSDKEdgeInsetsOutsetSize(size, contentInsets); - return size; -} - -#pragma mark - Drawing - -- (void)drawRect:(CGRect)rect -{ - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextSaveGState(context); - - // read the configuration properties - CGRect bounds = self.bounds; - CGFloat borderWidth = self.borderWidth; - CGFloat borderCornerRadius = self.borderCornerRadius; - CGFloat contentScaleFactor = self.contentScaleFactor; - - // fill the background - if (self.backgroundColor) { - [self.backgroundColor setFill]; - CGContextFillRect(context, bounds); - } - - // configure the colors and lines - [self.fillColor setFill]; - [self.foregroundColor setStroke]; - CGContextSetLineJoin(context, kCGLineJoinRound); - CGContextSetLineWidth(context, borderWidth); - - // get the frame of the box - CGRect borderFrame = UIEdgeInsetsInsetRect(bounds, [self _borderInsets]); - - // define the arcs for the corners - const int start = 0; - const int tangent = 1; - const int end = 2; - CGPoint topLeftArc[3] = { - CGPointMake(CGRectGetMinX(borderFrame) + borderCornerRadius, CGRectGetMinY(borderFrame)), - CGPointMake(CGRectGetMinX(borderFrame), CGRectGetMinY(borderFrame)), - CGPointMake(CGRectGetMinX(borderFrame), CGRectGetMinY(borderFrame) + borderCornerRadius), - }; - CGPoint bottomLeftArc[3] = { - CGPointMake(CGRectGetMinX(borderFrame), CGRectGetMaxY(borderFrame) - borderCornerRadius), - CGPointMake(CGRectGetMinX(borderFrame), CGRectGetMaxY(borderFrame)), - CGPointMake(CGRectGetMinX(borderFrame) + borderCornerRadius, CGRectGetMaxY(borderFrame)), - }; - CGPoint bottomRightArc[3] = { - CGPointMake(CGRectGetMaxX(borderFrame) - borderCornerRadius, CGRectGetMaxY(borderFrame)), - CGPointMake(CGRectGetMaxX(borderFrame), CGRectGetMaxY(borderFrame)), - CGPointMake(CGRectGetMaxX(borderFrame), CGRectGetMaxY(borderFrame) - borderCornerRadius), - }; - CGPoint topRightArc[3] = { - CGPointMake(CGRectGetMaxX(borderFrame), CGRectGetMinY(borderFrame) + borderCornerRadius), - CGPointMake(CGRectGetMaxX(borderFrame), CGRectGetMinY(borderFrame)), - CGPointMake(CGRectGetMaxX(borderFrame) - borderCornerRadius, CGRectGetMinY(borderFrame)), - }; - - // start a path on the context - CGContextBeginPath(context); - - // position the caret and decide which lines to draw - CGPoint caretPoints[3]; - switch (self.caretPosition) { - case FBSDKLikeBoxCaretPositionTop: - CGContextMoveToPoint(context, topRightArc[end].x, topRightArc[end].y); - caretPoints[0] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame) + (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2)), - CGRectGetMinY(borderFrame)); - caretPoints[1] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame)), - CGRectGetMinY(borderFrame) - FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT); - caretPoints[2] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame) - (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2)), - CGRectGetMinY(borderFrame)); - CGContextAddLines(context, caretPoints, sizeof(caretPoints) / sizeof(caretPoints[0])); - CGContextAddArcToPoint(context, topLeftArc[tangent].x, topLeftArc[tangent].y, topLeftArc[end].x, topLeftArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, bottomLeftArc[start].x, bottomLeftArc[start].y); - CGContextAddArcToPoint(context, bottomLeftArc[tangent].x, bottomLeftArc[tangent].y, bottomLeftArc[end].x, bottomLeftArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, bottomRightArc[start].x, bottomRightArc[start].y); - CGContextAddArcToPoint(context, bottomRightArc[tangent].x, bottomRightArc[tangent].y, bottomRightArc[end].x, bottomRightArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, topRightArc[start].x, topRightArc[start].y); - CGContextAddArcToPoint(context, topRightArc[tangent].x, topRightArc[tangent].y, topRightArc[end].x, topRightArc[end].y, borderCornerRadius); - break; - case FBSDKLikeBoxCaretPositionLeft: - CGContextMoveToPoint(context, topLeftArc[end].x, topLeftArc[end].y); - caretPoints[0] = CGPointMake(CGRectGetMinX(borderFrame), - FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame) - (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2))); - caretPoints[1] = CGPointMake(CGRectGetMinX(borderFrame) - FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT, - FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame))); - caretPoints[2] = CGPointMake(CGRectGetMinX(borderFrame), - FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame) + (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2))); - CGContextAddLines(context, caretPoints, sizeof(caretPoints) / sizeof(caretPoints[0])); - CGContextAddArcToPoint(context, bottomLeftArc[tangent].x, bottomLeftArc[tangent].y, bottomLeftArc[end].x, bottomLeftArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, bottomRightArc[start].x, bottomRightArc[start].y); - CGContextAddArcToPoint(context, bottomRightArc[tangent].x, bottomRightArc[tangent].y, bottomRightArc[end].x, bottomRightArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, topRightArc[start].x, topRightArc[start].y); - CGContextAddArcToPoint(context, topRightArc[tangent].x, topRightArc[tangent].y, topRightArc[end].x, topRightArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, topLeftArc[start].x, topLeftArc[start].y); - CGContextAddArcToPoint(context, topLeftArc[tangent].x, topLeftArc[tangent].y, topLeftArc[end].x, topLeftArc[end].y, borderCornerRadius); - break; - case FBSDKLikeBoxCaretPositionBottom: - CGContextMoveToPoint(context, bottomLeftArc[end].x, bottomLeftArc[end].y); - caretPoints[0] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame) - (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2)), - CGRectGetMaxY(borderFrame)); - caretPoints[1] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame)), - CGRectGetMaxY(borderFrame) + FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT); - caretPoints[2] = CGPointMake(FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidX(borderFrame) + (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2)), - CGRectGetMaxY(borderFrame)); - CGContextAddLines(context, caretPoints, sizeof(caretPoints) / sizeof(caretPoints[0])); - CGContextAddArcToPoint(context, bottomRightArc[tangent].x, bottomRightArc[tangent].y, bottomRightArc[end].x, bottomRightArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, topRightArc[start].x, topRightArc[start].y); - CGContextAddArcToPoint(context, topRightArc[tangent].x, topRightArc[tangent].y, topRightArc[end].x, topRightArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, topLeftArc[start].x, topLeftArc[start].y); - CGContextAddArcToPoint(context, topLeftArc[tangent].x, topLeftArc[tangent].y, topLeftArc[end].x, topLeftArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, bottomLeftArc[start].x, bottomLeftArc[start].y); - CGContextAddArcToPoint(context, bottomLeftArc[tangent].x, bottomLeftArc[tangent].y, bottomLeftArc[end].x, bottomLeftArc[end].y, borderCornerRadius); - break; - case FBSDKLikeBoxCaretPositionRight: - CGContextMoveToPoint(context, bottomRightArc[end].x, bottomRightArc[end].y); - caretPoints[0] = CGPointMake(CGRectGetMaxX(borderFrame), - FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame) + (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2))); - caretPoints[1] = CGPointMake(CGRectGetMaxX(borderFrame) + FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT, - FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame))); - caretPoints[2] = CGPointMake(CGRectGetMaxX(borderFrame), - FBSDKPointsForScreenPixels(floorf, contentScaleFactor, CGRectGetMidY(borderFrame) - (FBSDK_LIKE_BOX_BORDER_CARET_WIDTH / 2))); - CGContextAddLines(context, caretPoints, sizeof(caretPoints) / sizeof(caretPoints[0])); - CGContextAddArcToPoint(context, topRightArc[tangent].x, topRightArc[tangent].y, topRightArc[end].x, topRightArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, topLeftArc[start].x, topLeftArc[start].y); - CGContextAddArcToPoint(context, topLeftArc[tangent].x, topLeftArc[tangent].y, topLeftArc[end].x, topLeftArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, bottomLeftArc[start].x, bottomLeftArc[start].y); - CGContextAddArcToPoint(context, bottomLeftArc[tangent].x, bottomLeftArc[tangent].y, bottomLeftArc[end].x, bottomLeftArc[end].y, borderCornerRadius); - CGContextAddLineToPoint(context, bottomRightArc[start].x, bottomRightArc[start].y); - CGContextAddArcToPoint(context, bottomRightArc[tangent].x, bottomRightArc[tangent].y, bottomRightArc[end].x, bottomRightArc[end].y, borderCornerRadius); - break; - } - - // close and draw now that we have it all - CGContextClosePath(context); - CGContextDrawPath(context, kCGPathFillStroke); - - CGContextRestoreGState(context); -} - -#pragma mark - Helper Methods - -- (UIEdgeInsets)_borderInsets -{ - // inset the border bounds by 1/2 of the border width, since it is drawn split between inside and outside of the path - CGFloat scale = self.contentScaleFactor; - CGFloat halfBorderWidth = FBSDKPointsForScreenPixels(ceilf, scale, self.borderWidth / 2); - UIEdgeInsets borderInsets = UIEdgeInsetsMake(halfBorderWidth, halfBorderWidth, halfBorderWidth, halfBorderWidth); - - // adjust the insets for the caret position - switch (self.caretPosition) { - case FBSDKLikeBoxCaretPositionTop:{ - borderInsets.top += FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT + FBSDK_LIKE_BOX_BORDER_CARET_PADDING; - break; - } - case FBSDKLikeBoxCaretPositionLeft:{ - borderInsets.left += FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT + FBSDK_LIKE_BOX_BORDER_CARET_PADDING; - break; - } - case FBSDKLikeBoxCaretPositionBottom:{ - borderInsets.bottom += FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT + FBSDK_LIKE_BOX_BORDER_CARET_PADDING; - break; - } - case FBSDKLikeBoxCaretPositionRight:{ - borderInsets.right += FBSDK_LIKE_BOX_BORDER_CARET_HEIGHT + FBSDK_LIKE_BOX_BORDER_CARET_PADDING; - break; - } - } - - return borderInsets; -} - -- (void)_initializeContent -{ - self.backgroundColor = [UIColor clearColor]; - self.borderCornerRadius = 3.0; - self.borderWidth = 1.0; - self.contentMode = UIViewContentModeRedraw; - self.fillColor = [UIColor whiteColor]; - self.foregroundColor = FBSDKUIColorWithRGB(0x6A, 0x71, 0x80); - self.opaque = NO; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h deleted file mode 100644 index 9f7a3daa0..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/** - NS_ENUM(NSUInteger, FBSDKLikeBoxCaretPosition) - - Specifies the position of the caret relative to the box. - */ -typedef NS_ENUM(NSUInteger, FBSDKLikeBoxCaretPosition) -{ - /** The caret is on the top of the box. */ - FBSDKLikeBoxCaretPositionTop, - /** The caret is on the left of the box. */ - FBSDKLikeBoxCaretPositionLeft, - /** The caret is on the bottom of the box. */ - FBSDKLikeBoxCaretPositionBottom, - /** The caret is on the right of the box. */ - FBSDKLikeBoxCaretPositionRight, -}; - -@interface FBSDKLikeBoxView : UIView - -@property (nonatomic, assign) FBSDKLikeBoxCaretPosition caretPosition; -@property (nonatomic, copy) NSString *text; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.m deleted file mode 100644 index e0afeacf7..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.m +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLikeBoxView.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKLikeBoxBorderView.h" - -@implementation FBSDKLikeBoxView -{ - FBSDKLikeBoxBorderView *_borderView; - UILabel *_likeCountLabel; -} - -#pragma mark - Object Lifecycle - -- (instancetype)initWithFrame:(CGRect)frame -{ - if ((self = [super initWithFrame:frame])) { - [self _initializeContent]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)decoder -{ - if ((self = [super initWithCoder:decoder])) { - [self _initializeContent]; - } - return self; -} - -#pragma mark - Properties - -- (void)setCaretPosition:(FBSDKLikeBoxCaretPosition)caretPosition -{ - if (_caretPosition != caretPosition) { - _caretPosition = caretPosition; - _borderView.caretPosition = _caretPosition; - [self setNeedsLayout]; - [self invalidateIntrinsicContentSize]; - } -} - -- (NSString *)text -{ - return _likeCountLabel.text; -} - -- (void)setText:(NSString *)text -{ - if (![_likeCountLabel.text isEqualToString:text]) { - _likeCountLabel.text = text; - [self setNeedsLayout]; - [self invalidateIntrinsicContentSize]; - } -} - -#pragma mark - Layout - -- (CGSize)intrinsicContentSize -{ - return _borderView.intrinsicContentSize; -} - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - CGRect bounds = self.bounds; - _borderView.frame = bounds; -} - -- (CGSize)sizeThatFits:(CGSize)size -{ - return [_borderView sizeThatFits:size]; -} - -#pragma mark - Helper Methods - -- (void)_initializeContent -{ - _borderView = [[FBSDKLikeBoxBorderView alloc] initWithFrame:CGRectZero]; - [self addSubview:_borderView]; - - _likeCountLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _likeCountLabel.font = [UIFont systemFontOfSize:11.0]; - _likeCountLabel.textAlignment = NSTextAlignmentCenter; - _likeCountLabel.textColor = FBSDKUIColorWithRGB(0x6A, 0x71, 0x80); - _borderView.contentView = _likeCountLabel; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h deleted file mode 100644 index 032d30d54..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKLikeActionController.h" -#import "FBSDKLikeButton.h" - -@interface FBSDKLikeButton () - -@property (nonatomic, strong, readwrite) FBSDKLikeActionController *likeActionController; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h deleted file mode 100644 index aa4c1d833..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKCoreKit+Internal.h" - -@interface FBSDKLikeButtonPopWAV : FBSDKAudioResourceLoader -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.m deleted file mode 100644 index c02129337..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.m +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLikeButtonPopWAV.h" - -@implementation FBSDKLikeButtonPopWAV - -+ (NSString *)name -{ - return @"FBSDKLikeButtonPop.wav"; -} - -+ (NSData *)data -{ - const Byte bytes[] = { -0x52, 0x49, 0x46, 0x46, 0xfc, 0x57, 0x02, 0x00, 0x57, 0x41, 0x56, 0x45, 0x4a, 0x55, 0x4e, 0x4b, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x65, 0x78, 0x74, 0x5a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x72, 0x6f, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x68, 0x72, 0x72, 0x48, 0x37, 0x38, 0x21, 0x54, 0x66, 0x61, 0x61, 0x61, 0x61, 0x47, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x00, 0x31, 0x35, 0x3a, 0x32, 0x38, 0x3a, 0x30, 0x31, 0xf7, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6d, 0x74, 0x20, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x80, 0xbb, 0x00, 0x00, 0x00, 0xee, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x6e, 0x66, 0x10, 0x00, 0x00, 0x00, 0x70, 0xe2, 0xe6, 0xc4, 0xdb, 0x13, 0xcf, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x6c, 0x6d, 0x31, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x61, 0x74, 0x61, 0x80, 0x53, 0x02, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x19, 0x00, 0x19, 0x00, 0x12, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x30, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x13, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x02, 0x00, 0x08, 0x00, 0x08, 0x00, 0x11, 0x00, 0x11, 0x00, 0x17, 0x00, 0x17, 0x00, 0x18, 0x00, 0x18, 0x00, 0x17, 0x00, 0x17, 0x00, 0x14, 0x00, 0x14, 0x00, 0x17, 0x00, 0x17, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x21, 0x00, 0x21, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x05, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xca, 0xff, 0xca, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xea, 0xff, 0xea, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x10, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0x17, 0x00, 0x17, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x33, 0x00, 0x33, 0x00, 0x11, 0x00, 0x11, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0x02, 0x00, 0x02, 0x00, 0x17, 0x00, 0x17, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x41, 0xff, 0x41, 0xff, 0xe7, 0xfe, 0xe7, 0xfe, 0xb8, 0xfe, 0xb8, 0xfe, 0xb2, 0xfe, 0xb2, 0xfe, 0x39, 0xfe, 0x39, 0xfe, 0xb3, 0xfc, 0xb3, 0xfc, 0x5e, 0xfa, 0x5e, 0xfa, 0x25, 0xf8, 0x25, 0xf8, 0x22, 0xf7, 0x22, 0xf7, 0xc1, 0xf7, 0xc1, 0xf7, 0x5e, 0xf9, 0x5e, 0xf9, 0xec, 0xfa, 0xec, 0xfa, 0xb2, 0xfb, 0xb2, 0xfb, 0x96, 0xfb, 0x96, 0xfb, 0x0a, 0xfb, 0x0a, 0xfb, 0x9a, 0xfa, 0x9a, 0xfa, 0x94, 0xfa, 0x94, 0xfa, 0x1b, 0xfb, 0x1b, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0x6f, 0xfc, 0x6f, 0xfc, 0xba, 0xfb, 0xba, 0xfb, 0xbc, 0xf9, 0xbc, 0xf9, 0x08, 0xf7, 0x08, 0xf7, 0xe5, 0xf4, 0xe5, 0xf4, 0x7f, 0xf4, 0x7f, 0xf4, 0xde, 0xf5, 0xde, 0xf5, 0x1e, 0xf8, 0x1e, 0xf8, 0x5a, 0xfa, 0x5a, 0xfa, 0x26, 0xfc, 0x26, 0xfc, 0xca, 0xfd, 0xca, 0xfd, 0xdb, 0xff, 0xdb, 0xff, 0x61, 0x02, 0x61, 0x02, 0xc6, 0x04, 0xc6, 0x04, 0x54, 0x06, 0x54, 0x06, 0xb4, 0x06, 0xb4, 0x06, 0x24, 0x06, 0x24, 0x06, 0x3b, 0x05, 0x3b, 0x05, 0x72, 0x04, 0x72, 0x04, 0x27, 0x04, 0x27, 0x04, 0x8e, 0x04, 0x8e, 0x04, 0x73, 0x05, 0x73, 0x05, 0x7f, 0x06, 0x7f, 0x06, 0x72, 0x07, 0x72, 0x07, 0x28, 0x08, 0x28, 0x08, 0xeb, 0x08, 0xeb, 0x08, 0x57, 0x0a, 0x57, 0x0a, 0x8c, 0x0c, 0x8c, 0x0c, 0x00, 0x0f, 0x00, 0x0f, 0xf6, 0x10, 0xf6, 0x10, 0xf2, 0x11, 0xf2, 0x11, 0x14, 0x12, 0x14, 0x12, 0xfa, 0x11, 0xfa, 0x11, 0x1e, 0x12, 0x1e, 0x12, 0x82, 0x12, 0x82, 0x12, 0xc4, 0x12, 0xc4, 0x12, 0x75, 0x12, 0x75, 0x12, 0x86, 0x11, 0x86, 0x11, 0x35, 0x10, 0x35, 0x10, 0xba, 0x0e, 0xba, 0x0e, 0x62, 0x0d, 0x62, 0x0d, 0x79, 0x0c, 0x79, 0x0c, 0x01, 0x0c, 0x01, 0x0c, 0xcf, 0x0b, 0xcf, 0x0b, 0xa7, 0x0b, 0xa7, 0x0b, 0x27, 0x0b, 0x27, 0x0b, 0x32, 0x0a, 0x32, 0x0a, 0x1d, 0x09, 0x1d, 0x09, 0x35, 0x08, 0x35, 0x08, 0x88, 0x07, 0x88, 0x07, 0xf7, 0x06, 0xf7, 0x06, 0x38, 0x06, 0x38, 0x06, 0x1c, 0x05, 0x1c, 0x05, 0xab, 0x03, 0xab, 0x03, 0xea, 0x01, 0xea, 0x01, 0xd7, 0xff, 0xd7, 0xff, 0x72, 0xfd, 0x72, 0xfd, 0xc3, 0xfa, 0xc3, 0xfa, 0x04, 0xf8, 0x04, 0xf8, 0x88, 0xf5, 0x88, 0xf5, 0x63, 0xf3, 0x63, 0xf3, 0x93, 0xf1, 0x93, 0xf1, 0x18, 0xf0, 0x18, 0xf0, 0xe7, 0xee, 0xe7, 0xee, 0x07, 0xee, 0x07, 0xee, 0x8a, 0xed, 0x8a, 0xed, 0x62, 0xed, 0x62, 0xed, 0x68, 0xed, 0x68, 0xed, 0x87, 0xed, 0x87, 0xed, 0xb5, 0xed, 0xb5, 0xed, 0xde, 0xed, 0xde, 0xed, 0xf0, 0xed, 0xf0, 0xed, 0xe5, 0xed, 0xe5, 0xed, 0xe2, 0xed, 0xe2, 0xed, 0x0a, 0xee, 0x0a, 0xee, 0x63, 0xee, 0x63, 0xee, 0xdb, 0xee, 0xdb, 0xee, 0x47, 0xef, 0x47, 0xef, 0x81, 0xef, 0x81, 0xef, 0xb5, 0xef, 0xb5, 0xef, 0x45, 0xf0, 0x45, 0xf0, 0x7b, 0xf1, 0x7b, 0xf1, 0x6c, 0xf3, 0x6c, 0xf3, 0xf1, 0xf5, 0xf1, 0xf5, 0xbf, 0xf8, 0xbf, 0xf8, 0x86, 0xfb, 0x86, 0xfb, 0x15, 0xfe, 0x15, 0xfe, 0x6c, 0x00, 0x6c, 0x00, 0xb3, 0x02, 0xb3, 0x02, 0x1f, 0x05, 0x1f, 0x05, 0xd0, 0x07, 0xd0, 0x07, 0xad, 0x0a, 0xad, 0x0a, 0x48, 0x0d, 0x48, 0x0d, 0x2a, 0x0f, 0x2a, 0x0f, 0x2c, 0x10, 0x2c, 0x10, 0x83, 0x10, 0x83, 0x10, 0xa3, 0x10, 0xa3, 0x10, 0xf5, 0x10, 0xf5, 0x10, 0x93, 0x11, 0x93, 0x11, 0x47, 0x12, 0x47, 0x12, 0xba, 0x12, 0xba, 0x12, 0xb3, 0x12, 0xb3, 0x12, 0x3d, 0x12, 0x3d, 0x12, 0x9c, 0x11, 0x9c, 0x11, 0x26, 0x11, 0x26, 0x11, 0x20, 0x11, 0x20, 0x11, 0x81, 0x11, 0x81, 0x11, 0xdb, 0x11, 0xdb, 0x11, 0xac, 0x11, 0xac, 0x11, 0x90, 0x10, 0x90, 0x10, 0x86, 0x0e, 0x86, 0x0e, 0x06, 0x0c, 0x06, 0x0c, 0xa0, 0x09, 0xa0, 0x09, 0x8b, 0x07, 0x8b, 0x07, 0x97, 0x05, 0x97, 0x05, 0x5a, 0x03, 0x5a, 0x03, 0x73, 0x00, 0x73, 0x00, 0xe1, 0xfc, 0xe1, 0xfc, 0x09, 0xf9, 0x09, 0xf9, 0x6f, 0xf5, 0x6f, 0xf5, 0x7e, 0xf2, 0x7e, 0xf2, 0x4b, 0xf0, 0x4b, 0xf0, 0x99, 0xee, 0x99, 0xee, 0x07, 0xed, 0x07, 0xed, 0x4f, 0xeb, 0x4f, 0xeb, 0x79, 0xe9, 0x79, 0xe9, 0xd4, 0xe7, 0xd4, 0xe7, 0xcc, 0xe6, 0xcc, 0xe6, 0x81, 0xe6, 0x81, 0xe6, 0xc2, 0xe6, 0xc2, 0xe6, 0x2a, 0xe7, 0x2a, 0xe7, 0x4d, 0xe7, 0x4d, 0xe7, 0x09, 0xe7, 0x09, 0xe7, 0x8b, 0xe6, 0x8b, 0xe6, 0x23, 0xe6, 0x23, 0xe6, 0x17, 0xe6, 0x17, 0xe6, 0x7b, 0xe6, 0x7b, 0xe6, 0x38, 0xe7, 0x38, 0xe7, 0x2b, 0xe8, 0x2b, 0xe8, 0x49, 0xe9, 0x49, 0xe9, 0xa6, 0xea, 0xa6, 0xea, 0x72, 0xec, 0x72, 0xec, 0xc5, 0xee, 0xc5, 0xee, 0x92, 0xf1, 0x92, 0xf1, 0xc2, 0xf4, 0xc2, 0xf4, 0x2b, 0xf8, 0x2b, 0xf8, 0xaa, 0xfb, 0xaa, 0xfb, 0x2d, 0xff, 0x2d, 0xff, 0xa6, 0x02, 0xa6, 0x02, 0xff, 0x05, 0xff, 0x05, 0x23, 0x09, 0x23, 0x09, 0xf9, 0x0b, 0xf9, 0x0b, 0x72, 0x0e, 0x72, 0x0e, 0x92, 0x10, 0x92, 0x10, 0x60, 0x12, 0x60, 0x12, 0xe5, 0x13, 0xe5, 0x13, 0x1b, 0x15, 0x1b, 0x15, 0xf4, 0x15, 0xf4, 0x15, 0x79, 0x16, 0x79, 0x16, 0xc1, 0x16, 0xc1, 0x16, 0xf4, 0x16, 0xf4, 0x16, 0x35, 0x17, 0x35, 0x17, 0x95, 0x17, 0x95, 0x17, 0xfc, 0x17, 0xfc, 0x17, 0x39, 0x18, 0x39, 0x18, 0x1d, 0x18, 0x1d, 0x18, 0x92, 0x17, 0x92, 0x17, 0xa8, 0x16, 0xa8, 0x16, 0x86, 0x15, 0x86, 0x15, 0x41, 0x14, 0x41, 0x14, 0xc8, 0x12, 0xc8, 0x12, 0xeb, 0x10, 0xeb, 0x10, 0x84, 0x0e, 0x84, 0x0e, 0x9e, 0x0b, 0x9e, 0x0b, 0x65, 0x08, 0x65, 0x08, 0x10, 0x05, 0x10, 0x05, 0xc8, 0x01, 0xc8, 0x01, 0x9e, 0xfe, 0x9e, 0xfe, 0x8f, 0xfb, 0x8f, 0xfb, 0x9d, 0xf8, 0x9d, 0xf8, 0xd8, 0xf5, 0xd8, 0xf5, 0x5f, 0xf3, 0x5f, 0xf3, 0x5a, 0xf1, 0x5a, 0xf1, 0xe7, 0xef, 0xe7, 0xef, 0xf7, 0xee, 0xf7, 0xee, 0x62, 0xee, 0x62, 0xee, 0x00, 0xee, 0x00, 0xee, 0xb5, 0xed, 0xb5, 0xed, 0x84, 0xed, 0x84, 0xed, 0x80, 0xed, 0x80, 0xed, 0xb9, 0xed, 0xb9, 0xed, 0x26, 0xee, 0x26, 0xee, 0xa8, 0xee, 0xa8, 0xee, 0x24, 0xef, 0x24, 0xef, 0xa1, 0xef, 0xa1, 0xef, 0x37, 0xf0, 0x37, 0xf0, 0x0d, 0xf1, 0x0d, 0xf1, 0x46, 0xf2, 0x46, 0xf2, 0xe5, 0xf3, 0xe5, 0xf3, 0xd2, 0xf5, 0xd2, 0xf5, 0xf9, 0xf7, 0xf9, 0xf7, 0x59, 0xfa, 0x59, 0xfa, 0xf4, 0xfc, 0xf4, 0xfc, 0xd3, 0xff, 0xd3, 0xff, 0xf3, 0x02, 0xf3, 0x02, 0x35, 0x06, 0x35, 0x06, 0x5f, 0x09, 0x5f, 0x09, 0x36, 0x0c, 0x36, 0x0c, 0x97, 0x0e, 0x97, 0x0e, 0x7b, 0x10, 0x7b, 0x10, 0xf1, 0x11, 0xf1, 0x11, 0x0c, 0x13, 0x0c, 0x13, 0xcf, 0x13, 0xcf, 0x13, 0x2a, 0x14, 0x2a, 0x14, 0x15, 0x14, 0x15, 0x14, 0xa2, 0x13, 0xa2, 0x13, 0xf2, 0x12, 0xf2, 0x12, 0x25, 0x12, 0x25, 0x12, 0x57, 0x11, 0x57, 0x11, 0x81, 0x10, 0x81, 0x10, 0x8b, 0x0f, 0x8b, 0x0f, 0x6e, 0x0e, 0x6e, 0x0e, 0x32, 0x0d, 0x32, 0x0d, 0xe7, 0x0b, 0xe7, 0x0b, 0x9b, 0x0a, 0x9b, 0x0a, 0x4f, 0x09, 0x4f, 0x09, 0xec, 0x07, 0xec, 0x07, 0x50, 0x06, 0x50, 0x06, 0x69, 0x04, 0x69, 0x04, 0x3c, 0x02, 0x3c, 0x02, 0xda, 0xff, 0xda, 0xff, 0x5e, 0xfd, 0x5e, 0xfd, 0xe4, 0xfa, 0xe4, 0xfa, 0x7c, 0xf8, 0x7c, 0xf8, 0x29, 0xf6, 0x29, 0xf6, 0xfc, 0xf3, 0xfc, 0xf3, 0x11, 0xf2, 0x11, 0xf2, 0x88, 0xf0, 0x88, 0xf0, 0x81, 0xef, 0x81, 0xef, 0x01, 0xef, 0x01, 0xef, 0xf0, 0xee, 0xf0, 0xee, 0x2c, 0xef, 0x2c, 0xef, 0xb0, 0xef, 0xb0, 0xef, 0x91, 0xf0, 0x91, 0xf0, 0xe6, 0xf1, 0xe6, 0xf1, 0xa9, 0xf3, 0xa9, 0xf3, 0xb9, 0xf5, 0xb9, 0xf5, 0xde, 0xf7, 0xde, 0xf7, 0xdd, 0xf9, 0xdd, 0xf9, 0x8e, 0xfb, 0x8e, 0xfb, 0xe7, 0xfc, 0xe7, 0xfc, 0xfe, 0xfd, 0xfe, 0xfd, 0xf0, 0xfe, 0xf0, 0xfe, 0xd2, 0xff, 0xd2, 0xff, 0xb0, 0x00, 0xb0, 0x00, 0x89, 0x01, 0x89, 0x01, 0x57, 0x02, 0x57, 0x02, 0x25, 0x03, 0x25, 0x03, 0x1b, 0x04, 0x1b, 0x04, 0x64, 0x05, 0x64, 0x05, 0x0a, 0x07, 0x0a, 0x07, 0xf4, 0x08, 0xf4, 0x08, 0xe4, 0x0a, 0xe4, 0x0a, 0x88, 0x0c, 0x88, 0x0c, 0xbf, 0x0d, 0xbf, 0x0d, 0x7c, 0x0e, 0x7c, 0x0e, 0xd1, 0x0e, 0xd1, 0x0e, 0xca, 0x0e, 0xca, 0x0e, 0x48, 0x0e, 0x48, 0x0e, 0x33, 0x0d, 0x33, 0x0d, 0x8f, 0x0b, 0x8f, 0x0b, 0x74, 0x09, 0x74, 0x09, 0x0f, 0x07, 0x0f, 0x07, 0x97, 0x04, 0x97, 0x04, 0x37, 0x02, 0x37, 0x02, 0x11, 0x00, 0x11, 0x00, 0x42, 0xfe, 0x42, 0xfe, 0xe1, 0xfc, 0xe1, 0xfc, 0xfe, 0xfb, 0xfe, 0xfb, 0x91, 0xfb, 0x91, 0xfb, 0x7d, 0xfb, 0x7d, 0xfb, 0x9b, 0xfb, 0x9b, 0xfb, 0xd4, 0xfb, 0xd4, 0xfb, 0x12, 0xfc, 0x12, 0xfc, 0x39, 0xfc, 0x39, 0xfc, 0x2f, 0xfc, 0x2f, 0xfc, 0xe5, 0xfb, 0xe5, 0xfb, 0x56, 0xfb, 0x56, 0xfb, 0x8f, 0xfa, 0x8f, 0xfa, 0xab, 0xf9, 0xab, 0xf9, 0xc8, 0xf8, 0xc8, 0xf8, 0x02, 0xf8, 0x02, 0xf8, 0x6c, 0xf7, 0x6c, 0xf7, 0x1a, 0xf7, 0x1a, 0xf7, 0x25, 0xf7, 0x25, 0xf7, 0xa0, 0xf7, 0xa0, 0xf7, 0x95, 0xf8, 0x95, 0xf8, 0xf5, 0xf9, 0xf5, 0xf9, 0xa0, 0xfb, 0xa0, 0xfb, 0x76, 0xfd, 0x76, 0xfd, 0x68, 0xff, 0x68, 0xff, 0x62, 0x01, 0x62, 0x01, 0x3d, 0x03, 0x3d, 0x03, 0xbb, 0x04, 0xbb, 0x04, 0xa6, 0x05, 0xa6, 0x05, 0xef, 0x05, 0xef, 0x05, 0xac, 0x05, 0xac, 0x05, 0xfe, 0x04, 0xfe, 0x04, 0x03, 0x04, 0x03, 0x04, 0xc8, 0x02, 0xc8, 0x02, 0x61, 0x01, 0x61, 0x01, 0xf5, 0xff, 0xf5, 0xff, 0xb9, 0xfe, 0xb9, 0xfe, 0xd6, 0xfd, 0xd6, 0xfd, 0x5a, 0xfd, 0x5a, 0xfd, 0x3b, 0xfd, 0x3b, 0xfd, 0x62, 0xfd, 0x62, 0xfd, 0xb8, 0xfd, 0xb8, 0xfd, 0x3a, 0xfe, 0x3a, 0xfe, 0xde, 0xfe, 0xde, 0xfe, 0x87, 0xff, 0x87, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x33, 0x00, 0x33, 0x00, 0xc8, 0xff, 0xc8, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x41, 0xfe, 0x41, 0xfe, 0x4a, 0xfd, 0x4a, 0xfd, 0x4b, 0xfc, 0x4b, 0xfc, 0x68, 0xfb, 0x68, 0xfb, 0xd0, 0xfa, 0xd0, 0xfa, 0xb3, 0xfa, 0xb3, 0xfa, 0x2b, 0xfb, 0x2b, 0xfb, 0x38, 0xfc, 0x38, 0xfc, 0xbd, 0xfd, 0xbd, 0xfd, 0x95, 0xff, 0x95, 0xff, 0xa5, 0x01, 0xa5, 0x01, 0xd7, 0x03, 0xd7, 0x03, 0x07, 0x06, 0x07, 0x06, 0x02, 0x08, 0x02, 0x08, 0x9a, 0x09, 0x9a, 0x09, 0xb6, 0x0a, 0xb6, 0x0a, 0x4b, 0x0b, 0x4b, 0x0b, 0x57, 0x0b, 0x57, 0x0b, 0xd9, 0x0a, 0xd9, 0x0a, 0xdb, 0x09, 0xdb, 0x09, 0x7c, 0x08, 0x7c, 0x08, 0xe8, 0x06, 0xe8, 0x06, 0x48, 0x05, 0x48, 0x05, 0xaf, 0x03, 0xaf, 0x03, 0x28, 0x02, 0x28, 0x02, 0xcf, 0x00, 0xcf, 0x00, 0xce, 0xff, 0xce, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0xd1, 0xfe, 0xd1, 0xfe, 0x7c, 0xfe, 0x7c, 0xfe, 0x09, 0xfe, 0x09, 0xfe, 0x76, 0xfd, 0x76, 0xfd, 0xda, 0xfc, 0xda, 0xfc, 0x37, 0xfc, 0x37, 0xfc, 0x68, 0xfb, 0x68, 0xfb, 0x4b, 0xfa, 0x4b, 0xfa, 0xd8, 0xf8, 0xd8, 0xf8, 0x1e, 0xf7, 0x1e, 0xf7, 0x3a, 0xf5, 0x3a, 0xf5, 0x5d, 0xf3, 0x5d, 0xf3, 0xce, 0xf1, 0xce, 0xf1, 0xda, 0xf0, 0xda, 0xf0, 0xba, 0xf0, 0xba, 0xf0, 0x69, 0xf1, 0x69, 0xf1, 0x8d, 0xf2, 0x8d, 0xf2, 0xc6, 0xf3, 0xc6, 0xf3, 0x20, 0xf5, 0x20, 0xf5, 0x11, 0xf7, 0x11, 0xf7, 0xf4, 0xf9, 0xf4, 0xf9, 0x96, 0xfd, 0x96, 0xfd, 0x4d, 0x01, 0x4d, 0x01, 0x79, 0x04, 0x79, 0x04, 0xe9, 0x06, 0xe9, 0x06, 0xd0, 0x08, 0xd0, 0x08, 0x6b, 0x0a, 0x6b, 0x0a, 0xb5, 0x0b, 0xb5, 0x0b, 0x80, 0x0c, 0x80, 0x0c, 0xcb, 0x0c, 0xcb, 0x0c, 0xd4, 0x0c, 0xd4, 0x0c, 0xda, 0x0c, 0xda, 0x0c, 0xdd, 0x0c, 0xdd, 0x0c, 0xae, 0x0c, 0xae, 0x0c, 0x4a, 0x0c, 0x4a, 0x0c, 0xee, 0x0b, 0xee, 0x0b, 0xdf, 0x0b, 0xdf, 0x0b, 0x13, 0x0c, 0x13, 0x0c, 0x26, 0x0c, 0x26, 0x0c, 0xb3, 0x0b, 0xb3, 0x0b, 0xa5, 0x0a, 0xa5, 0x0a, 0x34, 0x09, 0x34, 0x09, 0x7d, 0x07, 0x7d, 0x07, 0x55, 0x05, 0x55, 0x05, 0x7c, 0x02, 0x7c, 0x02, 0xfd, 0xfe, 0xfd, 0xfe, 0x35, 0xfb, 0x35, 0xfb, 0x85, 0xf7, 0x85, 0xf7, 0x10, 0xf4, 0x10, 0xf4, 0xc9, 0xf0, 0xc9, 0xf0, 0xc0, 0xed, 0xc0, 0xed, 0x3b, 0xeb, 0x3b, 0xeb, 0x95, 0xe9, 0x95, 0xe9, 0xf6, 0xe8, 0xf6, 0xe8, 0x3a, 0xe9, 0x3a, 0xe9, 0x2d, 0xea, 0x2d, 0xea, 0xb6, 0xeb, 0xb6, 0xeb, 0xcd, 0xed, 0xcd, 0xed, 0x55, 0xf0, 0x55, 0xf0, 0x13, 0xf3, 0x13, 0xf3, 0xda, 0xf5, 0xda, 0xf5, 0xa6, 0xf8, 0xa6, 0xf8, 0x8d, 0xfb, 0x8d, 0xfb, 0x87, 0xfe, 0x87, 0xfe, 0x5c, 0x01, 0x5c, 0x01, 0xd9, 0x03, 0xd9, 0x03, 0x0b, 0x06, 0x0b, 0x06, 0x38, 0x08, 0x38, 0x08, 0x96, 0x0a, 0x96, 0x0a, 0x14, 0x0d, 0x14, 0x0d, 0x78, 0x0f, 0x78, 0x0f, 0xa7, 0x11, 0xa7, 0x11, 0xae, 0x13, 0xae, 0x13, 0xa2, 0x15, 0xa2, 0x15, 0x72, 0x17, 0x72, 0x17, 0xe1, 0x18, 0xe1, 0x18, 0xae, 0x19, 0xae, 0x19, 0xb8, 0x19, 0xb8, 0x19, 0x03, 0x19, 0x03, 0x19, 0x8f, 0x17, 0x8f, 0x17, 0x4b, 0x15, 0x4b, 0x15, 0x33, 0x12, 0x33, 0x12, 0x68, 0x0e, 0x68, 0x0e, 0x22, 0x0a, 0x22, 0x0a, 0x91, 0x05, 0x91, 0x05, 0xcb, 0x00, 0xcb, 0x00, 0xea, 0xfb, 0xea, 0xfb, 0x1b, 0xf7, 0x1b, 0xf7, 0x9f, 0xf2, 0x9f, 0xf2, 0xa8, 0xee, 0xa8, 0xee, 0x47, 0xeb, 0x47, 0xeb, 0x76, 0xe8, 0x76, 0xe8, 0x3a, 0xe6, 0x3a, 0xe6, 0x9d, 0xe4, 0x9d, 0xe4, 0xaa, 0xe3, 0xaa, 0xe3, 0x51, 0xe3, 0x51, 0xe3, 0x77, 0xe3, 0x77, 0xe3, 0x08, 0xe4, 0x08, 0xe4, 0x02, 0xe5, 0x02, 0xe5, 0x70, 0xe6, 0x70, 0xe6, 0x56, 0xe8, 0x56, 0xe8, 0xb1, 0xea, 0xb1, 0xea, 0x82, 0xed, 0x82, 0xed, 0xd8, 0xf0, 0xd8, 0xf0, 0xba, 0xf4, 0xba, 0xf4, 0x1b, 0xf9, 0x1b, 0xf9, 0xd9, 0xfd, 0xd9, 0xfd, 0xd2, 0x02, 0xd2, 0x02, 0xec, 0x07, 0xec, 0x07, 0x05, 0x0d, 0x05, 0x0d, 0xec, 0x11, 0xec, 0x11, 0x6c, 0x16, 0x6c, 0x16, 0x59, 0x1a, 0x59, 0x1a, 0x93, 0x1d, 0x93, 0x1d, 0x03, 0x20, 0x03, 0x20, 0x96, 0x21, 0x96, 0x21, 0x38, 0x22, 0x38, 0x22, 0xd9, 0x21, 0xd9, 0x21, 0x7f, 0x20, 0x7f, 0x20, 0x44, 0x1e, 0x44, 0x1e, 0x51, 0x1b, 0x51, 0x1b, 0xcf, 0x17, 0xcf, 0x17, 0xe0, 0x13, 0xe0, 0x13, 0xa4, 0x0f, 0xa4, 0x0f, 0x34, 0x0b, 0x34, 0x0b, 0xa9, 0x06, 0xa9, 0x06, 0x13, 0x02, 0x13, 0x02, 0x89, 0xfd, 0x89, 0xfd, 0x21, 0xf9, 0x21, 0xf9, 0xea, 0xf4, 0xea, 0xf4, 0xe9, 0xf0, 0xe9, 0xf0, 0x20, 0xed, 0x20, 0xed, 0x97, 0xe9, 0x97, 0xe9, 0x60, 0xe6, 0x60, 0xe6, 0x9f, 0xe3, 0x9f, 0xe3, 0x70, 0xe1, 0x70, 0xe1, 0xe6, 0xdf, 0xe6, 0xdf, 0x10, 0xdf, 0x10, 0xdf, 0x03, 0xdf, 0x03, 0xdf, 0xd2, 0xdf, 0xd2, 0xdf, 0x85, 0xe1, 0x85, 0xe1, 0x1d, 0xe4, 0x1d, 0xe4, 0x94, 0xe7, 0x94, 0xe7, 0xd8, 0xeb, 0xd8, 0xeb, 0xd0, 0xf0, 0xd0, 0xf0, 0x51, 0xf6, 0x51, 0xf6, 0x25, 0xfc, 0x25, 0xfc, 0x0f, 0x02, 0x0f, 0x02, 0xdb, 0x07, 0xdb, 0x07, 0x5c, 0x0d, 0x5c, 0x0d, 0x6c, 0x12, 0x6c, 0x12, 0xe0, 0x16, 0xe0, 0x16, 0x99, 0x1a, 0x99, 0x1a, 0x81, 0x1d, 0x81, 0x1d, 0x95, 0x1f, 0x95, 0x1f, 0xd7, 0x20, 0xd7, 0x20, 0x48, 0x21, 0x48, 0x21, 0xee, 0x20, 0xee, 0x20, 0xd3, 0x1f, 0xd3, 0x1f, 0x0d, 0x1e, 0x0d, 0x1e, 0xae, 0x1b, 0xae, 0x1b, 0xc5, 0x18, 0xc5, 0x18, 0x5c, 0x15, 0x5c, 0x15, 0x7b, 0x11, 0x7b, 0x11, 0x31, 0x0d, 0x31, 0x0d, 0x92, 0x08, 0x92, 0x08, 0xb2, 0x03, 0xb2, 0x03, 0xa4, 0xfe, 0xa4, 0xfe, 0x80, 0xf9, 0x80, 0xf9, 0x67, 0xf4, 0x67, 0xf4, 0x7f, 0xef, 0x7f, 0xef, 0xef, 0xea, 0xef, 0xea, 0xe2, 0xe6, 0xe2, 0xe6, 0x78, 0xe3, 0x78, 0xe3, 0xd2, 0xe0, 0xd2, 0xe0, 0x0f, 0xdf, 0x0f, 0xdf, 0x40, 0xde, 0x40, 0xde, 0x65, 0xde, 0x65, 0xde, 0x73, 0xdf, 0x73, 0xdf, 0x5c, 0xe1, 0x5c, 0xe1, 0x09, 0xe4, 0x09, 0xe4, 0x62, 0xe7, 0x62, 0xe7, 0x4f, 0xeb, 0x4f, 0xeb, 0xab, 0xef, 0xab, 0xef, 0x53, 0xf4, 0x53, 0xf4, 0x29, 0xf9, 0x29, 0xf9, 0x0e, 0xfe, 0x0e, 0xfe, 0xe3, 0x02, 0xe3, 0x02, 0x8a, 0x07, 0x8a, 0x07, 0xe8, 0x0b, 0xe8, 0x0b, 0xeb, 0x0f, 0xeb, 0x0f, 0x7b, 0x13, 0x7b, 0x13, 0x89, 0x16, 0x89, 0x16, 0x09, 0x19, 0x09, 0x19, 0xf3, 0x1a, 0xf3, 0x1a, 0x3a, 0x1c, 0x3a, 0x1c, 0xcb, 0x1c, 0xcb, 0x1c, 0x9b, 0x1c, 0x9b, 0x1c, 0xa8, 0x1b, 0xa8, 0x1b, 0xf8, 0x19, 0xf8, 0x19, 0x99, 0x17, 0x99, 0x17, 0x9d, 0x14, 0x9d, 0x14, 0x15, 0x11, 0x15, 0x11, 0x13, 0x0d, 0x13, 0x0d, 0xac, 0x08, 0xac, 0x08, 0x09, 0x04, 0x09, 0x04, 0x55, 0xff, 0x55, 0xff, 0xb8, 0xfa, 0xb8, 0xfa, 0x59, 0xf6, 0x59, 0xf6, 0x5a, 0xf2, 0x5a, 0xf2, 0xd4, 0xee, 0xd4, 0xee, 0xe1, 0xeb, 0xe1, 0xeb, 0x95, 0xe9, 0x95, 0xe9, 0xfb, 0xe7, 0xfb, 0xe7, 0x1d, 0xe7, 0x1d, 0xe7, 0x01, 0xe7, 0x01, 0xe7, 0xa4, 0xe7, 0xa4, 0xe7, 0xf6, 0xe8, 0xf6, 0xe8, 0xe1, 0xea, 0xe1, 0xea, 0x50, 0xed, 0x50, 0xed, 0x2d, 0xf0, 0x2d, 0xf0, 0x5e, 0xf3, 0x5e, 0xf3, 0xc7, 0xf6, 0xc7, 0xf6, 0x4d, 0xfa, 0x4d, 0xfa, 0xd9, 0xfd, 0xd9, 0xfd, 0x55, 0x01, 0x55, 0x01, 0xb0, 0x04, 0xb0, 0x04, 0xdd, 0x07, 0xdd, 0x07, 0xc8, 0x0a, 0xc8, 0x0a, 0x5f, 0x0d, 0x5f, 0x0d, 0x94, 0x0f, 0x94, 0x0f, 0x5d, 0x11, 0x5d, 0x11, 0xa4, 0x12, 0xa4, 0x12, 0x5c, 0x13, 0x5c, 0x13, 0x7c, 0x13, 0x7c, 0x13, 0x0a, 0x13, 0x0a, 0x13, 0x0e, 0x12, 0x0e, 0x12, 0x93, 0x10, 0x93, 0x10, 0xa2, 0x0e, 0xa2, 0x0e, 0x3f, 0x0c, 0x3f, 0x0c, 0x75, 0x09, 0x75, 0x09, 0x5d, 0x06, 0x5d, 0x06, 0x19, 0x03, 0x19, 0x03, 0xc4, 0xff, 0xc4, 0xff, 0x7b, 0xfc, 0x7b, 0xfc, 0x5f, 0xf9, 0x5f, 0xf9, 0x8b, 0xf6, 0x8b, 0xf6, 0x1b, 0xf4, 0x1b, 0xf4, 0x1f, 0xf2, 0x1f, 0xf2, 0xa2, 0xf0, 0xa2, 0xf0, 0xa4, 0xef, 0xa4, 0xef, 0x27, 0xef, 0x27, 0xef, 0x31, 0xef, 0x31, 0xef, 0xbd, 0xef, 0xbd, 0xef, 0xbf, 0xf0, 0xbf, 0xf0, 0x29, 0xf2, 0x29, 0xf2, 0xf1, 0xf3, 0xf1, 0xf3, 0x0a, 0xf6, 0x0a, 0xf6, 0x66, 0xf8, 0x66, 0xf8, 0xf4, 0xfa, 0xf4, 0xfa, 0x9d, 0xfd, 0x9d, 0xfd, 0x49, 0x00, 0x49, 0x00, 0xe7, 0x02, 0xe7, 0x02, 0x65, 0x05, 0x65, 0x05, 0xb2, 0x07, 0xb2, 0x07, 0xbb, 0x09, 0xbb, 0x09, 0x75, 0x0b, 0x75, 0x0b, 0xd7, 0x0c, 0xd7, 0x0c, 0xda, 0x0d, 0xda, 0x0d, 0x78, 0x0e, 0x78, 0x0e, 0xa9, 0x0e, 0xa9, 0x0e, 0x6d, 0x0e, 0x6d, 0x0e, 0xc4, 0x0d, 0xc4, 0x0d, 0xb6, 0x0c, 0xb6, 0x0c, 0x4e, 0x0b, 0x4e, 0x0b, 0xa2, 0x09, 0xa2, 0x09, 0xba, 0x07, 0xba, 0x07, 0xa8, 0x05, 0xa8, 0x05, 0x82, 0x03, 0x82, 0x03, 0x5c, 0x01, 0x5c, 0x01, 0x41, 0xff, 0x41, 0xff, 0x3e, 0xfd, 0x3e, 0xfd, 0x65, 0xfb, 0x65, 0xfb, 0xc6, 0xf9, 0xc6, 0xf9, 0x69, 0xf8, 0x69, 0xf8, 0x55, 0xf7, 0x55, 0xf7, 0x8f, 0xf6, 0x8f, 0xf6, 0x15, 0xf6, 0x15, 0xf6, 0xea, 0xf5, 0xea, 0xf5, 0x17, 0xf6, 0x17, 0xf6, 0x99, 0xf6, 0x99, 0xf6, 0x6f, 0xf7, 0x6f, 0xf7, 0x8a, 0xf8, 0x8a, 0xf8, 0xe0, 0xf9, 0xe0, 0xf9, 0x58, 0xfb, 0x58, 0xfb, 0xe7, 0xfc, 0xe7, 0xfc, 0x86, 0xfe, 0x86, 0xfe, 0x2a, 0x00, 0x2a, 0x00, 0xc3, 0x01, 0xc3, 0x01, 0x44, 0x03, 0x44, 0x03, 0x9e, 0x04, 0x9e, 0x04, 0xc3, 0x05, 0xc3, 0x05, 0xaf, 0x06, 0xaf, 0x06, 0x5b, 0x07, 0x5b, 0x07, 0xbe, 0x07, 0xbe, 0x07, 0xd5, 0x07, 0xd5, 0x07, 0xa1, 0x07, 0xa1, 0x07, 0x25, 0x07, 0x25, 0x07, 0x6c, 0x06, 0x6c, 0x06, 0x84, 0x05, 0x84, 0x05, 0x7d, 0x04, 0x7d, 0x04, 0x5d, 0x03, 0x5d, 0x03, 0x2b, 0x02, 0x2b, 0x02, 0xf3, 0x00, 0xf3, 0x00, 0xbd, 0xff, 0xbd, 0xff, 0x91, 0xfe, 0x91, 0xfe, 0x7b, 0xfd, 0x7b, 0xfd, 0x86, 0xfc, 0x86, 0xfc, 0xbb, 0xfb, 0xbb, 0xfb, 0x23, 0xfb, 0x23, 0xfb, 0xc1, 0xfa, 0xc1, 0xfa, 0x8b, 0xfa, 0x8b, 0xfa, 0x76, 0xfa, 0x76, 0xfa, 0x7f, 0xfa, 0x7f, 0xfa, 0xad, 0xfa, 0xad, 0xfa, 0x09, 0xfb, 0x09, 0xfb, 0x94, 0xfb, 0x94, 0xfb, 0x47, 0xfc, 0x47, 0xfc, 0x0c, 0xfd, 0x0c, 0xfd, 0xd4, 0xfd, 0xd4, 0xfd, 0xa0, 0xfe, 0xa0, 0xfe, 0x74, 0xff, 0x74, 0xff, 0x56, 0x00, 0x56, 0x00, 0x3b, 0x01, 0x3b, 0x01, 0x13, 0x02, 0x13, 0x02, 0xcc, 0x02, 0xcc, 0x02, 0x5e, 0x03, 0x5e, 0x03, 0xce, 0x03, 0xce, 0x03, 0x17, 0x04, 0x17, 0x04, 0x36, 0x04, 0x36, 0x04, 0x26, 0x04, 0x26, 0x04, 0xec, 0x03, 0xec, 0x03, 0x95, 0x03, 0x95, 0x03, 0x28, 0x03, 0x28, 0x03, 0xab, 0x02, 0xab, 0x02, 0x23, 0x02, 0x23, 0x02, 0x8c, 0x01, 0x8c, 0x01, 0xe8, 0x00, 0xe8, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x85, 0xff, 0x85, 0xff, 0xca, 0xfe, 0xca, 0xfe, 0x0d, 0xfe, 0x0d, 0xfe, 0x59, 0xfd, 0x59, 0xfd, 0xb7, 0xfc, 0xb7, 0xfc, 0x2b, 0xfc, 0x2b, 0xfc, 0xbc, 0xfb, 0xbc, 0xfb, 0x6d, 0xfb, 0x6d, 0xfb, 0x44, 0xfb, 0x44, 0xfb, 0x53, 0xfb, 0x53, 0xfb, 0xa7, 0xfb, 0xa7, 0xfb, 0x3f, 0xfc, 0x3f, 0xfc, 0x0e, 0xfd, 0x0e, 0xfd, 0x00, 0xfe, 0x00, 0xfe, 0xfd, 0xfe, 0xfd, 0xfe, 0xf6, 0xff, 0xf6, 0xff, 0xe0, 0x00, 0xe0, 0x00, 0xb2, 0x01, 0xb2, 0x01, 0x58, 0x02, 0x58, 0x02, 0xbd, 0x02, 0xbd, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xa5, 0x02, 0xa5, 0x02, 0x3a, 0x02, 0x3a, 0x02, 0xa4, 0x01, 0xa4, 0x01, 0xff, 0x00, 0xff, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0xd6, 0xff, 0xd6, 0xff, 0x73, 0xff, 0x73, 0xff, 0x35, 0xff, 0x35, 0xff, 0x12, 0xff, 0x12, 0xff, 0x01, 0xff, 0x01, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0x12, 0xff, 0x12, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0x71, 0xff, 0x71, 0xff, 0x94, 0xff, 0x94, 0xff, 0x91, 0xff, 0x91, 0xff, 0x67, 0xff, 0x67, 0xff, 0x2d, 0xff, 0x2d, 0xff, 0x03, 0xff, 0x03, 0xff, 0xfb, 0xfe, 0xfb, 0xfe, 0x12, 0xff, 0x12, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0x70, 0xff, 0x70, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x40, 0x00, 0x40, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xa0, 0x01, 0xa0, 0x01, 0x7b, 0x02, 0x7b, 0x02, 0xfc, 0x02, 0xfc, 0x02, 0xe0, 0x02, 0xe0, 0x02, 0x47, 0x02, 0x47, 0x02, 0xa9, 0x01, 0xa9, 0x01, 0x87, 0x01, 0x87, 0x01, 0x0b, 0x02, 0x0b, 0x02, 0xe2, 0x02, 0xe2, 0x02, 0x6c, 0x03, 0x6c, 0x03, 0x3d, 0x03, 0x3d, 0x03, 0x5e, 0x02, 0x5e, 0x02, 0x39, 0x01, 0x39, 0x01, 0x4e, 0x00, 0x4e, 0x00, 0xee, 0xff, 0xee, 0xff, 0x19, 0x00, 0x19, 0x00, 0x87, 0x00, 0x87, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x5b, 0xff, 0x5b, 0xff, 0xdf, 0xfd, 0xdf, 0xfd, 0x9c, 0xfc, 0x9c, 0xfc, 0x1e, 0xfc, 0x1e, 0xfc, 0x7e, 0xfc, 0x7e, 0xfc, 0x5d, 0xfd, 0x5d, 0xfd, 0x24, 0xfe, 0x24, 0xfe, 0x69, 0xfe, 0x69, 0xfe, 0x2b, 0xfe, 0x2b, 0xfe, 0xcb, 0xfd, 0xcb, 0xfd, 0xb2, 0xfd, 0xb2, 0xfd, 0x0b, 0xfe, 0x0b, 0xfe, 0xbb, 0xfe, 0xbb, 0xfe, 0x8b, 0xff, 0x8b, 0xff, 0x4c, 0x00, 0x4c, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0x27, 0x01, 0x27, 0x01, 0x35, 0x01, 0x35, 0x01, 0x27, 0x01, 0x27, 0x01, 0x27, 0x01, 0x27, 0x01, 0x41, 0x01, 0x41, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x39, 0x01, 0x39, 0x01, 0xfd, 0x00, 0xfd, 0x00, 0xba, 0x00, 0xba, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x03, 0x00, 0x03, 0x00, 0x7b, 0xff, 0x7b, 0xff, 0xf2, 0xfe, 0xf2, 0xfe, 0x9e, 0xfe, 0x9e, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0xc5, 0xfe, 0xc5, 0xfe, 0xf3, 0xfe, 0xf3, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xe8, 0xfe, 0xe8, 0xfe, 0xd2, 0xfe, 0xd2, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0x12, 0xff, 0x12, 0xff, 0x68, 0xff, 0x68, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0x5a, 0x00, 0x5a, 0x00, 0xde, 0x00, 0xde, 0x00, 0x4d, 0x01, 0x4d, 0x01, 0x97, 0x01, 0x97, 0x01, 0xc2, 0x01, 0xc2, 0x01, 0xe9, 0x01, 0xe9, 0x01, 0x22, 0x02, 0x22, 0x02, 0x69, 0x02, 0x69, 0x02, 0xad, 0x02, 0xad, 0x02, 0xda, 0x02, 0xda, 0x02, 0xe2, 0x02, 0xe2, 0x02, 0xbc, 0x02, 0xbc, 0x02, 0x61, 0x02, 0x61, 0x02, 0xd1, 0x01, 0xd1, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x65, 0x00, 0x65, 0x00, 0xcf, 0xff, 0xcf, 0xff, 0x62, 0xff, 0x62, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0xbb, 0xfe, 0xbb, 0xfe, 0x5c, 0xfe, 0x5c, 0xfe, 0xf8, 0xfd, 0xf8, 0xfd, 0xa6, 0xfd, 0xa6, 0xfd, 0x7b, 0xfd, 0x7b, 0xfd, 0x7c, 0xfd, 0x7c, 0xfd, 0xa6, 0xfd, 0xa6, 0xfd, 0xf2, 0xfd, 0xf2, 0xfd, 0x5b, 0xfe, 0x5b, 0xfe, 0xd1, 0xfe, 0xd1, 0xfe, 0x41, 0xff, 0x41, 0xff, 0x98, 0xff, 0x98, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0x01, 0x00, 0x01, 0x00, 0x28, 0x00, 0x28, 0x00, 0x53, 0x00, 0x53, 0x00, 0x86, 0x00, 0x86, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xef, 0x00, 0xef, 0x00, 0x0f, 0x01, 0x0f, 0x01, 0x12, 0x01, 0x12, 0x01, 0xff, 0x00, 0xff, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0xda, 0x00, 0xda, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x63, 0x00, 0x63, 0x00, 0x14, 0x00, 0x14, 0x00, 0xb2, 0xff, 0xb2, 0xff, 0x42, 0xff, 0x42, 0xff, 0xca, 0xfe, 0xca, 0xfe, 0x58, 0xfe, 0x58, 0xfe, 0xfa, 0xfd, 0xfa, 0xfd, 0xae, 0xfd, 0xae, 0xfd, 0x6b, 0xfd, 0x6b, 0xfd, 0x33, 0xfd, 0x33, 0xfd, 0x11, 0xfd, 0x11, 0xfd, 0x1a, 0xfd, 0x1a, 0xfd, 0x50, 0xfd, 0x50, 0xfd, 0xac, 0xfd, 0xac, 0xfd, 0x22, 0xfe, 0x22, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x3d, 0xff, 0x3d, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0x73, 0x00, 0x73, 0x00, 0x03, 0x01, 0x03, 0x01, 0x85, 0x01, 0x85, 0x01, 0xfd, 0x01, 0xfd, 0x01, 0x6f, 0x02, 0x6f, 0x02, 0xd6, 0x02, 0xd6, 0x02, 0x24, 0x03, 0x24, 0x03, 0x4c, 0x03, 0x4c, 0x03, 0x48, 0x03, 0x48, 0x03, 0x23, 0x03, 0x23, 0x03, 0xe5, 0x02, 0xe5, 0x02, 0x94, 0x02, 0x94, 0x02, 0x34, 0x02, 0x34, 0x02, 0xcf, 0x01, 0xcf, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x04, 0x01, 0x04, 0x01, 0x9b, 0x00, 0x9b, 0x00, 0x29, 0x00, 0x29, 0x00, 0xb2, 0xff, 0xb2, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0xde, 0xfe, 0xde, 0xfe, 0x94, 0xfe, 0x94, 0xfe, 0x5a, 0xfe, 0x5a, 0xfe, 0x20, 0xfe, 0x20, 0xfe, 0xe7, 0xfd, 0xe7, 0xfd, 0xb7, 0xfd, 0xb7, 0xfd, 0x9d, 0xfd, 0x9d, 0xfd, 0x9f, 0xfd, 0x9f, 0xfd, 0xb4, 0xfd, 0xb4, 0xfd, 0xd6, 0xfd, 0xd6, 0xfd, 0x04, 0xfe, 0x04, 0xfe, 0x40, 0xfe, 0x40, 0xfe, 0x8d, 0xfe, 0x8d, 0xfe, 0xec, 0xfe, 0xec, 0xfe, 0x5a, 0xff, 0x5a, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0x4a, 0x00, 0x4a, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0x12, 0x01, 0x12, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x6c, 0x01, 0x6c, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x63, 0x01, 0x63, 0x01, 0x54, 0x01, 0x54, 0x01, 0x45, 0x01, 0x45, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0x11, 0x01, 0x11, 0x01, 0xec, 0x00, 0xec, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x44, 0x00, 0x44, 0x00, 0x30, 0x00, 0x30, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0x96, 0xff, 0x96, 0xff, 0x68, 0xff, 0x68, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x12, 0xff, 0x12, 0xff, 0xf5, 0xfe, 0xf5, 0xfe, 0xe8, 0xfe, 0xe8, 0xfe, 0xea, 0xfe, 0xea, 0xfe, 0xf4, 0xfe, 0xf4, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0x0d, 0xff, 0x0d, 0xff, 0x27, 0xff, 0x27, 0xff, 0x58, 0xff, 0x58, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x4f, 0x00, 0x4f, 0x00, 0x98, 0x00, 0x98, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0x14, 0x01, 0x14, 0x01, 0x50, 0x01, 0x50, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0xcb, 0x01, 0xcb, 0x01, 0x02, 0x02, 0x02, 0x02, 0x2e, 0x02, 0x2e, 0x02, 0x4a, 0x02, 0x4a, 0x02, 0x53, 0x02, 0x53, 0x02, 0x45, 0x02, 0x45, 0x02, 0x27, 0x02, 0x27, 0x02, 0xfc, 0x01, 0xfc, 0x01, 0xc9, 0x01, 0xc9, 0x01, 0x8d, 0x01, 0x8d, 0x01, 0x43, 0x01, 0x43, 0x01, 0xe9, 0x00, 0xe9, 0x00, 0x82, 0x00, 0x82, 0x00, 0x16, 0x00, 0x16, 0x00, 0xad, 0xff, 0xad, 0xff, 0x49, 0xff, 0x49, 0xff, 0xeb, 0xfe, 0xeb, 0xfe, 0x94, 0xfe, 0x94, 0xfe, 0x47, 0xfe, 0x47, 0xfe, 0x04, 0xfe, 0x04, 0xfe, 0xcb, 0xfd, 0xcb, 0xfd, 0x9e, 0xfd, 0x9e, 0xfd, 0x81, 0xfd, 0x81, 0xfd, 0x76, 0xfd, 0x76, 0xfd, 0x80, 0xfd, 0x80, 0xfd, 0x98, 0xfd, 0x98, 0xfd, 0xb9, 0xfd, 0xb9, 0xfd, 0xdf, 0xfd, 0xdf, 0xfd, 0x08, 0xfe, 0x08, 0xfe, 0x36, 0xfe, 0x36, 0xfe, 0x6f, 0xfe, 0x6f, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0xf4, 0xfe, 0xf4, 0xfe, 0x35, 0xff, 0x35, 0xff, 0x70, 0xff, 0x70, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0x27, 0x00, 0x27, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0xbb, 0x00, 0xbb, 0x00, 0x06, 0x01, 0x06, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0x8c, 0x01, 0x8c, 0x01, 0xcc, 0x01, 0xcc, 0x01, 0x0c, 0x02, 0x0c, 0x02, 0x42, 0x02, 0x42, 0x02, 0x6e, 0x02, 0x6e, 0x02, 0x8f, 0x02, 0x8f, 0x02, 0x9e, 0x02, 0x9e, 0x02, 0x95, 0x02, 0x95, 0x02, 0x72, 0x02, 0x72, 0x02, 0x3e, 0x02, 0x3e, 0x02, 0x00, 0x02, 0x00, 0x02, 0xbe, 0x01, 0xbe, 0x01, 0x7e, 0x01, 0x7e, 0x01, 0x40, 0x01, 0x40, 0x01, 0x04, 0x01, 0x04, 0x01, 0xc8, 0x00, 0xc8, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x55, 0x00, 0x55, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0xe8, 0xff, 0xe8, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x49, 0xff, 0x49, 0xff, 0x11, 0xff, 0x11, 0xff, 0xd3, 0xfe, 0xd3, 0xfe, 0x90, 0xfe, 0x90, 0xfe, 0x4a, 0xfe, 0x4a, 0xfe, 0x04, 0xfe, 0x04, 0xfe, 0xc4, 0xfd, 0xc4, 0xfd, 0x8c, 0xfd, 0x8c, 0xfd, 0x60, 0xfd, 0x60, 0xfd, 0x41, 0xfd, 0x41, 0xfd, 0x31, 0xfd, 0x31, 0xfd, 0x2b, 0xfd, 0x2b, 0xfd, 0x2f, 0xfd, 0x2f, 0xfd, 0x40, 0xfd, 0x40, 0xfd, 0x61, 0xfd, 0x61, 0xfd, 0x94, 0xfd, 0x94, 0xfd, 0xd4, 0xfd, 0xd4, 0xfd, 0x1a, 0xfe, 0x1a, 0xfe, 0x62, 0xfe, 0x62, 0xfe, 0xaa, 0xfe, 0xaa, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe, 0x37, 0xff, 0x37, 0xff, 0x80, 0xff, 0x80, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x48, 0x00, 0x48, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0xae, 0x00, 0xae, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x09, 0x01, 0x09, 0x01, 0x39, 0x01, 0x39, 0x01, 0x67, 0x01, 0x67, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0xa7, 0x01, 0xa7, 0x01, 0xbc, 0x01, 0xbc, 0x01, 0xc9, 0x01, 0xc9, 0x01, 0xcd, 0x01, 0xcd, 0x01, 0xc5, 0x01, 0xc5, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0x57, 0x01, 0x57, 0x01, 0x19, 0x01, 0x19, 0x01, 0xdb, 0x00, 0xdb, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x71, 0x00, 0x71, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x39, 0x00, 0x39, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x92, 0x00, 0x92, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xec, 0x00, 0xec, 0x00, 0x0f, 0x01, 0x0f, 0x01, 0x25, 0x01, 0x25, 0x01, 0x2b, 0x01, 0x2b, 0x01, 0x20, 0x01, 0x20, 0x01, 0x06, 0x01, 0x06, 0x01, 0xdd, 0x00, 0xdd, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0x65, 0x00, 0x65, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0xce, 0xff, 0xce, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x24, 0xff, 0x24, 0xff, 0xcf, 0xfe, 0xcf, 0xfe, 0x7c, 0xfe, 0x7c, 0xfe, 0x2e, 0xfe, 0x2e, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xaa, 0xfd, 0xaa, 0xfd, 0x7a, 0xfd, 0x7a, 0xfd, 0x55, 0xfd, 0x55, 0xfd, 0x3c, 0xfd, 0x3c, 0xfd, 0x2c, 0xfd, 0x2c, 0xfd, 0x24, 0xfd, 0x24, 0xfd, 0x29, 0xfd, 0x29, 0xfd, 0x3c, 0xfd, 0x3c, 0xfd, 0x63, 0xfd, 0x63, 0xfd, 0x9d, 0xfd, 0x9d, 0xfd, 0xe7, 0xfd, 0xe7, 0xfd, 0x40, 0xfe, 0x40, 0xfe, 0xa9, 0xfe, 0xa9, 0xfe, 0x24, 0xff, 0x24, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0x53, 0x00, 0x53, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xa9, 0x01, 0xa9, 0x01, 0x4b, 0x02, 0x4b, 0x02, 0xe0, 0x02, 0xe0, 0x02, 0x66, 0x03, 0x66, 0x03, 0xd9, 0x03, 0xd9, 0x03, 0x32, 0x04, 0x32, 0x04, 0x6c, 0x04, 0x6c, 0x04, 0x83, 0x04, 0x83, 0x04, 0x75, 0x04, 0x75, 0x04, 0x45, 0x04, 0x45, 0x04, 0xfa, 0x03, 0xfa, 0x03, 0x97, 0x03, 0x97, 0x03, 0x1f, 0x03, 0x1f, 0x03, 0x96, 0x02, 0x96, 0x02, 0xfb, 0x01, 0xfb, 0x01, 0x53, 0x01, 0x53, 0x01, 0x9f, 0x00, 0x9f, 0x00, 0xe5, 0xff, 0xe5, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x7e, 0xfe, 0x7e, 0xfe, 0xd8, 0xfd, 0xd8, 0xfd, 0x3a, 0xfd, 0x3a, 0xfd, 0xa6, 0xfc, 0xa6, 0xfc, 0x21, 0xfc, 0x21, 0xfc, 0xb5, 0xfb, 0xb5, 0xfb, 0x6c, 0xfb, 0x6c, 0xfb, 0x47, 0xfb, 0x47, 0xfb, 0x47, 0xfb, 0x47, 0xfb, 0x6a, 0xfb, 0x6a, 0xfb, 0xaf, 0xfb, 0xaf, 0xfb, 0x17, 0xfc, 0x17, 0xfc, 0xa1, 0xfc, 0xa1, 0xfc, 0x48, 0xfd, 0x48, 0xfd, 0x08, 0xfe, 0x08, 0xfe, 0xda, 0xfe, 0xda, 0xfe, 0xb8, 0xff, 0xb8, 0xff, 0x98, 0x00, 0x98, 0x00, 0x78, 0x01, 0x78, 0x01, 0x52, 0x02, 0x52, 0x02, 0x22, 0x03, 0x22, 0x03, 0xe8, 0x03, 0xe8, 0x03, 0x9b, 0x04, 0x9b, 0x04, 0x33, 0x05, 0x33, 0x05, 0xa6, 0x05, 0xa6, 0x05, 0xf2, 0x05, 0xf2, 0x05, 0x19, 0x06, 0x19, 0x06, 0x1f, 0x06, 0x1f, 0x06, 0x04, 0x06, 0x04, 0x06, 0xc4, 0x05, 0xc4, 0x05, 0x5b, 0x05, 0x5b, 0x05, 0xc7, 0x04, 0xc7, 0x04, 0x0e, 0x04, 0x0e, 0x04, 0x3b, 0x03, 0x3b, 0x03, 0x55, 0x02, 0x55, 0x02, 0x60, 0x01, 0x60, 0x01, 0x61, 0x00, 0x61, 0x00, 0x5a, 0xff, 0x5a, 0xff, 0x4d, 0xfe, 0x4d, 0xfe, 0x47, 0xfd, 0x47, 0xfd, 0x52, 0xfc, 0x52, 0xfc, 0x77, 0xfb, 0x77, 0xfb, 0xb9, 0xfa, 0xb9, 0xfa, 0x1d, 0xfa, 0x1d, 0xfa, 0xa7, 0xf9, 0xa7, 0xf9, 0x57, 0xf9, 0x57, 0xf9, 0x30, 0xf9, 0x30, 0xf9, 0x36, 0xf9, 0x36, 0xf9, 0x69, 0xf9, 0x69, 0xf9, 0xc6, 0xf9, 0xc6, 0xf9, 0x4a, 0xfa, 0x4a, 0xfa, 0xf0, 0xfa, 0xf0, 0xfa, 0xb0, 0xfb, 0xb0, 0xfb, 0x81, 0xfc, 0x81, 0xfc, 0x61, 0xfd, 0x61, 0xfd, 0x4a, 0xfe, 0x4a, 0xfe, 0x3c, 0xff, 0x3c, 0xff, 0x31, 0x00, 0x31, 0x00, 0x23, 0x01, 0x23, 0x01, 0x0f, 0x02, 0x0f, 0x02, 0xf1, 0x02, 0xf1, 0x02, 0xc7, 0x03, 0xc7, 0x03, 0x8d, 0x04, 0x8d, 0x04, 0x3c, 0x05, 0x3c, 0x05, 0xce, 0x05, 0xce, 0x05, 0x3d, 0x06, 0x3d, 0x06, 0x88, 0x06, 0x88, 0x06, 0xae, 0x06, 0xae, 0x06, 0xaf, 0x06, 0xaf, 0x06, 0x87, 0x06, 0x87, 0x06, 0x35, 0x06, 0x35, 0x06, 0xbc, 0x05, 0xbc, 0x05, 0x1d, 0x05, 0x1d, 0x05, 0x5f, 0x04, 0x5f, 0x04, 0x88, 0x03, 0x88, 0x03, 0xa2, 0x02, 0xa2, 0x02, 0xb1, 0x01, 0xb1, 0x01, 0xbe, 0x00, 0xbe, 0x00, 0xd2, 0xff, 0xd2, 0xff, 0xf0, 0xfe, 0xf0, 0xfe, 0x1c, 0xfe, 0x1c, 0xfe, 0x5b, 0xfd, 0x5b, 0xfd, 0xb5, 0xfc, 0xb5, 0xfc, 0x2e, 0xfc, 0x2e, 0xfc, 0xc5, 0xfb, 0xc5, 0xfb, 0x75, 0xfb, 0x75, 0xfb, 0x3d, 0xfb, 0x3d, 0xfb, 0x1d, 0xfb, 0x1d, 0xfb, 0x19, 0xfb, 0x19, 0xfb, 0x31, 0xfb, 0x31, 0xfb, 0x65, 0xfb, 0x65, 0xfb, 0xae, 0xfb, 0xae, 0xfb, 0x06, 0xfc, 0x06, 0xfc, 0x66, 0xfc, 0x66, 0xfc, 0xce, 0xfc, 0xce, 0xfc, 0x41, 0xfd, 0x41, 0xfd, 0xbf, 0xfd, 0xbf, 0xfd, 0x47, 0xfe, 0x47, 0xfe, 0xd0, 0xfe, 0xd0, 0xfe, 0x5b, 0xff, 0x5b, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0x5b, 0x00, 0x5b, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x1f, 0x01, 0x1f, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0xa9, 0x01, 0xa9, 0x01, 0xda, 0x01, 0xda, 0x01, 0xfc, 0x01, 0xfc, 0x01, 0x0e, 0x02, 0x0e, 0x02, 0x0b, 0x02, 0x0b, 0x02, 0xf9, 0x01, 0xf9, 0x01, 0xda, 0x01, 0xda, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x60, 0x01, 0x60, 0x01, 0x34, 0x01, 0x34, 0x01, 0x05, 0x01, 0x05, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x62, 0x00, 0x62, 0x00, 0x55, 0x00, 0x55, 0x00, 0x53, 0x00, 0x53, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x63, 0x00, 0x63, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x60, 0x00, 0x56, 0x00, 0x56, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0xe9, 0xff, 0xe9, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0x78, 0xff, 0x78, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xdc, 0xfe, 0xdc, 0xfe, 0xad, 0xfe, 0xad, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0x53, 0xfe, 0x53, 0xfe, 0x2d, 0xfe, 0x2d, 0xfe, 0x11, 0xfe, 0x11, 0xfe, 0xfc, 0xfd, 0xfc, 0xfd, 0xec, 0xfd, 0xec, 0xfd, 0xdf, 0xfd, 0xdf, 0xfd, 0xd3, 0xfd, 0xd3, 0xfd, 0xc9, 0xfd, 0xc9, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xcc, 0xfd, 0xcc, 0xfd, 0xe3, 0xfd, 0xe3, 0xfd, 0x0b, 0xfe, 0x0b, 0xfe, 0x45, 0xfe, 0x45, 0xfe, 0x90, 0xfe, 0x90, 0xfe, 0xe9, 0xfe, 0xe9, 0xfe, 0x53, 0xff, 0x53, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0x50, 0x00, 0x50, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0x6c, 0x01, 0x6c, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0x79, 0x02, 0x79, 0x02, 0xea, 0x02, 0xea, 0x02, 0x4b, 0x03, 0x4b, 0x03, 0x98, 0x03, 0x98, 0x03, 0xd1, 0x03, 0xd1, 0x03, 0xf4, 0x03, 0xf4, 0x03, 0x03, 0x04, 0x03, 0x04, 0xfd, 0x03, 0xfd, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xab, 0x03, 0xab, 0x03, 0x5e, 0x03, 0x5e, 0x03, 0xfe, 0x02, 0xfe, 0x02, 0x8c, 0x02, 0x8c, 0x02, 0x09, 0x02, 0x09, 0x02, 0x7b, 0x01, 0x7b, 0x01, 0xe2, 0x00, 0xe2, 0x00, 0x44, 0x00, 0x44, 0x00, 0xa4, 0xff, 0xa4, 0xff, 0x08, 0xff, 0x08, 0xff, 0x74, 0xfe, 0x74, 0xfe, 0xeb, 0xfd, 0xeb, 0xfd, 0x6e, 0xfd, 0x6e, 0xfd, 0xfd, 0xfc, 0xfd, 0xfc, 0x99, 0xfc, 0x99, 0xfc, 0x47, 0xfc, 0x47, 0xfc, 0x0c, 0xfc, 0x0c, 0xfc, 0xec, 0xfb, 0xec, 0xfb, 0xea, 0xfb, 0xea, 0xfb, 0x05, 0xfc, 0x05, 0xfc, 0x38, 0xfc, 0x38, 0xfc, 0x7d, 0xfc, 0x7d, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0x33, 0xfd, 0x33, 0xfd, 0xad, 0xfd, 0xad, 0xfd, 0x3e, 0xfe, 0x3e, 0xfe, 0xe4, 0xfe, 0xe4, 0xfe, 0x97, 0xff, 0x97, 0xff, 0x50, 0x00, 0x50, 0x00, 0x03, 0x01, 0x03, 0x01, 0xa6, 0x01, 0xa6, 0x01, 0x36, 0x02, 0x36, 0x02, 0xb8, 0x02, 0xb8, 0x02, 0x2c, 0x03, 0x2c, 0x03, 0x91, 0x03, 0x91, 0x03, 0xe4, 0x03, 0xe4, 0x03, 0x1d, 0x04, 0x1d, 0x04, 0x35, 0x04, 0x35, 0x04, 0x27, 0x04, 0x27, 0x04, 0xf7, 0x03, 0xf7, 0x03, 0xb1, 0x03, 0xb1, 0x03, 0x5b, 0x03, 0x5b, 0x03, 0xf7, 0x02, 0xf7, 0x02, 0x83, 0x02, 0x83, 0x02, 0xfa, 0x01, 0xfa, 0x01, 0x61, 0x01, 0x61, 0x01, 0xbe, 0x00, 0xbe, 0x00, 0x19, 0x00, 0x19, 0x00, 0x7c, 0xff, 0x7c, 0xff, 0xf0, 0xfe, 0xf0, 0xfe, 0x78, 0xfe, 0x78, 0xfe, 0x14, 0xfe, 0x14, 0xfe, 0xbf, 0xfd, 0xbf, 0xfd, 0x75, 0xfd, 0x75, 0xfd, 0x38, 0xfd, 0x38, 0xfd, 0x0c, 0xfd, 0x0c, 0xfd, 0xf6, 0xfc, 0xf6, 0xfc, 0xf4, 0xfc, 0xf4, 0xfc, 0x06, 0xfd, 0x06, 0xfd, 0x26, 0xfd, 0x26, 0xfd, 0x4e, 0xfd, 0x4e, 0xfd, 0x7d, 0xfd, 0x7d, 0xfd, 0xb4, 0xfd, 0xb4, 0xfd, 0xf7, 0xfd, 0xf7, 0xfd, 0x48, 0xfe, 0x48, 0xfe, 0xaa, 0xfe, 0xaa, 0xfe, 0x1c, 0xff, 0x1c, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x22, 0x00, 0x22, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x1c, 0x01, 0x1c, 0x01, 0x87, 0x01, 0x87, 0x01, 0xe5, 0x01, 0xe5, 0x01, 0x35, 0x02, 0x35, 0x02, 0x75, 0x02, 0x75, 0x02, 0x9f, 0x02, 0x9f, 0x02, 0xaf, 0x02, 0xaf, 0x02, 0xa3, 0x02, 0xa3, 0x02, 0x7d, 0x02, 0x7d, 0x02, 0x42, 0x02, 0x42, 0x02, 0xf9, 0x01, 0xf9, 0x01, 0xaa, 0x01, 0xaa, 0x01, 0x57, 0x01, 0x57, 0x01, 0x04, 0x01, 0x04, 0x01, 0xad, 0x00, 0xad, 0x00, 0x53, 0x00, 0x53, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0x97, 0xff, 0x97, 0xff, 0x44, 0xff, 0x44, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xc9, 0xfe, 0xc9, 0xfe, 0x9c, 0xfe, 0x9c, 0xfe, 0x76, 0xfe, 0x76, 0xfe, 0x57, 0xfe, 0x57, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0x3a, 0xfe, 0x3a, 0xfe, 0x3d, 0xfe, 0x3d, 0xfe, 0x4a, 0xfe, 0x4a, 0xfe, 0x5b, 0xfe, 0x5b, 0xfe, 0x71, 0xfe, 0x71, 0xfe, 0x8c, 0xfe, 0x8c, 0xfe, 0xac, 0xfe, 0xac, 0xfe, 0xd6, 0xfe, 0xd6, 0xfe, 0x09, 0xff, 0x09, 0xff, 0x48, 0xff, 0x48, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0x25, 0x00, 0x25, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x48, 0x01, 0x48, 0x01, 0xad, 0x01, 0xad, 0x01, 0x07, 0x02, 0x07, 0x02, 0x4f, 0x02, 0x4f, 0x02, 0x82, 0x02, 0x82, 0x02, 0x9e, 0x02, 0x9e, 0x02, 0xa7, 0x02, 0xa7, 0x02, 0xa3, 0x02, 0xa3, 0x02, 0x90, 0x02, 0x90, 0x02, 0x6a, 0x02, 0x6a, 0x02, 0x2f, 0x02, 0x2f, 0x02, 0xe2, 0x01, 0xe2, 0x01, 0x86, 0x01, 0x86, 0x01, 0x24, 0x01, 0x24, 0x01, 0xc4, 0x00, 0xc4, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0xcf, 0xff, 0xcf, 0xff, 0x84, 0xff, 0x84, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0xf4, 0xfe, 0xf4, 0xfe, 0xb2, 0xfe, 0xb2, 0xfe, 0x72, 0xfe, 0x72, 0xfe, 0x30, 0xfe, 0x30, 0xfe, 0xeb, 0xfd, 0xeb, 0xfd, 0xa7, 0xfd, 0xa7, 0xfd, 0x67, 0xfd, 0x67, 0xfd, 0x2f, 0xfd, 0x2f, 0xfd, 0x02, 0xfd, 0x02, 0xfd, 0xe2, 0xfc, 0xe2, 0xfc, 0xd1, 0xfc, 0xd1, 0xfc, 0xd1, 0xfc, 0xd1, 0xfc, 0xe5, 0xfc, 0xe5, 0xfc, 0x10, 0xfd, 0x10, 0xfd, 0x53, 0xfd, 0x53, 0xfd, 0xab, 0xfd, 0xab, 0xfd, 0x15, 0xfe, 0x15, 0xfe, 0x8a, 0xfe, 0x8a, 0xfe, 0x08, 0xff, 0x08, 0xff, 0x87, 0xff, 0x87, 0xff, 0x04, 0x00, 0x04, 0x00, 0x80, 0x00, 0x80, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x6c, 0x01, 0x6c, 0x01, 0xcf, 0x01, 0xcf, 0x01, 0x1f, 0x02, 0x1f, 0x02, 0x59, 0x02, 0x59, 0x02, 0x81, 0x02, 0x81, 0x02, 0x99, 0x02, 0x99, 0x02, 0xa5, 0x02, 0xa5, 0x02, 0xa8, 0x02, 0xa8, 0x02, 0x9e, 0x02, 0x9e, 0x02, 0x87, 0x02, 0x87, 0x02, 0x65, 0x02, 0x65, 0x02, 0x3b, 0x02, 0x3b, 0x02, 0x0d, 0x02, 0x0d, 0x02, 0xd9, 0x01, 0xd9, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0x5e, 0x01, 0x5e, 0x01, 0x11, 0x01, 0x11, 0x01, 0xba, 0x00, 0xba, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x41, 0xff, 0x41, 0xff, 0xea, 0xfe, 0xea, 0xfe, 0x95, 0xfe, 0x95, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0xf7, 0xfd, 0xf7, 0xfd, 0xba, 0xfd, 0xba, 0xfd, 0x92, 0xfd, 0x92, 0xfd, 0x87, 0xfd, 0x87, 0xfd, 0x97, 0xfd, 0x97, 0xfd, 0xb8, 0xfd, 0xb8, 0xfd, 0xe5, 0xfd, 0xe5, 0xfd, 0x19, 0xfe, 0x19, 0xfe, 0x53, 0xfe, 0x53, 0xfe, 0x94, 0xfe, 0x94, 0xfe, 0xdb, 0xfe, 0xdb, 0xfe, 0x28, 0xff, 0x28, 0xff, 0x77, 0xff, 0x77, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0x00, 0x2e, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x69, 0x00, 0x69, 0x00, 0x84, 0x00, 0x84, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xda, 0x00, 0xda, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x04, 0x01, 0x04, 0x01, 0x14, 0x01, 0x14, 0x01, 0x24, 0x01, 0x24, 0x01, 0x34, 0x01, 0x34, 0x01, 0x40, 0x01, 0x40, 0x01, 0x45, 0x01, 0x45, 0x01, 0x40, 0x01, 0x40, 0x01, 0x30, 0x01, 0x30, 0x01, 0x18, 0x01, 0x18, 0x01, 0xfb, 0x00, 0xfb, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0x9e, 0x00, 0x9e, 0x00, 0x81, 0x00, 0x81, 0x00, 0x69, 0x00, 0x69, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x64, 0x00, 0x64, 0x00, 0x73, 0x00, 0x73, 0x00, 0x83, 0x00, 0x83, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x55, 0x00, 0x55, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x19, 0x00, 0x19, 0x00, 0xeb, 0xff, 0xeb, 0xff, 0xac, 0xff, 0xac, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x0c, 0xff, 0x0c, 0xff, 0xbd, 0xfe, 0xbd, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0x3e, 0xfe, 0x3e, 0xfe, 0x10, 0xfe, 0x10, 0xfe, 0xeb, 0xfd, 0xeb, 0xfd, 0xce, 0xfd, 0xce, 0xfd, 0xb9, 0xfd, 0xb9, 0xfd, 0xad, 0xfd, 0xad, 0xfd, 0xac, 0xfd, 0xac, 0xfd, 0xb6, 0xfd, 0xb6, 0xfd, 0xce, 0xfd, 0xce, 0xfd, 0xf1, 0xfd, 0xf1, 0xfd, 0x1a, 0xfe, 0x1a, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x73, 0xfe, 0x73, 0xfe, 0xa2, 0xfe, 0xa2, 0xfe, 0xd4, 0xfe, 0xd4, 0xfe, 0x07, 0xff, 0x07, 0xff, 0x3e, 0xff, 0x3e, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0x26, 0x00, 0x26, 0x00, 0x85, 0x00, 0x85, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0x3e, 0x01, 0x3e, 0x01, 0x93, 0x01, 0x93, 0x01, 0xe3, 0x01, 0xe3, 0x01, 0x2c, 0x02, 0x2c, 0x02, 0x6e, 0x02, 0x6e, 0x02, 0xa5, 0x02, 0xa5, 0x02, 0xd0, 0x02, 0xd0, 0x02, 0xea, 0x02, 0xea, 0x02, 0xf0, 0x02, 0xf0, 0x02, 0xe8, 0x02, 0xe8, 0x02, 0xd5, 0x02, 0xd5, 0x02, 0xc0, 0x02, 0xc0, 0x02, 0xad, 0x02, 0xad, 0x02, 0x9d, 0x02, 0x9d, 0x02, 0x8b, 0x02, 0x8b, 0x02, 0x76, 0x02, 0x76, 0x02, 0x5f, 0x02, 0x5f, 0x02, 0x48, 0x02, 0x48, 0x02, 0x32, 0x02, 0x32, 0x02, 0x1b, 0x02, 0x1b, 0x02, 0xff, 0x01, 0xff, 0x01, 0xdb, 0x01, 0xdb, 0x01, 0xae, 0x01, 0xae, 0x01, 0x75, 0x01, 0x75, 0x01, 0x37, 0x01, 0x37, 0x01, 0xf5, 0x00, 0xf5, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0x79, 0x00, 0x79, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x03, 0x00, 0xc7, 0xff, 0xc7, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x54, 0xff, 0x54, 0xff, 0x22, 0xff, 0x22, 0xff, 0xf2, 0xfe, 0xf2, 0xfe, 0xbf, 0xfe, 0xbf, 0xfe, 0x85, 0xfe, 0x85, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0xf9, 0xfd, 0xf9, 0xfd, 0xad, 0xfd, 0xad, 0xfd, 0x63, 0xfd, 0x63, 0xfd, 0x20, 0xfd, 0x20, 0xfd, 0xe3, 0xfc, 0xe3, 0xfc, 0xa9, 0xfc, 0xa9, 0xfc, 0x73, 0xfc, 0x73, 0xfc, 0x45, 0xfc, 0x45, 0xfc, 0x24, 0xfc, 0x24, 0xfc, 0x15, 0xfc, 0x15, 0xfc, 0x1b, 0xfc, 0x1b, 0xfc, 0x35, 0xfc, 0x35, 0xfc, 0x61, 0xfc, 0x61, 0xfc, 0x9c, 0xfc, 0x9c, 0xfc, 0xe5, 0xfc, 0xe5, 0xfc, 0x3c, 0xfd, 0x3c, 0xfd, 0x9f, 0xfd, 0x9f, 0xfd, 0x11, 0xfe, 0x11, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x15, 0xff, 0x15, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x29, 0x00, 0x29, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0x32, 0x01, 0x32, 0x01, 0xae, 0x01, 0xae, 0x01, 0x22, 0x02, 0x22, 0x02, 0x8e, 0x02, 0x8e, 0x02, 0xef, 0x02, 0xef, 0x02, 0x3f, 0x03, 0x3f, 0x03, 0x82, 0x03, 0x82, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0xe9, 0x03, 0xe9, 0x03, 0x0c, 0x04, 0x0c, 0x04, 0x1e, 0x04, 0x1e, 0x04, 0x1f, 0x04, 0x1f, 0x04, 0x0a, 0x04, 0x0a, 0x04, 0xde, 0x03, 0xde, 0x03, 0x9c, 0x03, 0x9c, 0x03, 0x4a, 0x03, 0x4a, 0x03, 0xed, 0x02, 0xed, 0x02, 0x88, 0x02, 0x88, 0x02, 0x19, 0x02, 0x19, 0x02, 0xa0, 0x01, 0xa0, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x94, 0x00, 0x94, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x86, 0xff, 0x86, 0xff, 0x0e, 0xff, 0x0e, 0xff, 0xa3, 0xfe, 0xa3, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0xf5, 0xfd, 0xf5, 0xfd, 0xae, 0xfd, 0xae, 0xfd, 0x73, 0xfd, 0x73, 0xfd, 0x45, 0xfd, 0x45, 0xfd, 0x22, 0xfd, 0x22, 0xfd, 0x0d, 0xfd, 0x0d, 0xfd, 0x05, 0xfd, 0x05, 0xfd, 0x07, 0xfd, 0x07, 0xfd, 0x11, 0xfd, 0x11, 0xfd, 0x21, 0xfd, 0x21, 0xfd, 0x3b, 0xfd, 0x3b, 0xfd, 0x5e, 0xfd, 0x5e, 0xfd, 0x8c, 0xfd, 0x8c, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0x0b, 0xfe, 0x0b, 0xfe, 0x5c, 0xfe, 0x5c, 0xfe, 0xb3, 0xfe, 0xb3, 0xfe, 0x0d, 0xff, 0x0d, 0xff, 0x65, 0xff, 0x65, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0x16, 0x00, 0x16, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x10, 0x01, 0x10, 0x01, 0x4e, 0x01, 0x4e, 0x01, 0x7f, 0x01, 0x7f, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xb0, 0x01, 0xb0, 0x01, 0xae, 0x01, 0xae, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x7e, 0x01, 0x7e, 0x01, 0x58, 0x01, 0x58, 0x01, 0x27, 0x01, 0x27, 0x01, 0xf1, 0x00, 0xf1, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x41, 0x00, 0x41, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xd9, 0xff, 0xd9, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0x80, 0xff, 0x80, 0xff, 0x5c, 0xff, 0x5c, 0xff, 0x40, 0xff, 0x40, 0xff, 0x2b, 0xff, 0x2b, 0xff, 0x17, 0xff, 0x17, 0xff, 0x04, 0xff, 0x04, 0xff, 0xf3, 0xfe, 0xf3, 0xfe, 0xe4, 0xfe, 0xe4, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0xdc, 0xfe, 0xdc, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0x01, 0xff, 0x01, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x45, 0xff, 0x45, 0xff, 0x79, 0xff, 0x79, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x47, 0x00, 0x47, 0x00, 0x90, 0x00, 0x90, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x18, 0x01, 0x18, 0x01, 0x53, 0x01, 0x53, 0x01, 0x8a, 0x01, 0x8a, 0x01, 0xb8, 0x01, 0xb8, 0x01, 0xda, 0x01, 0xda, 0x01, 0xf0, 0x01, 0xf0, 0x01, 0xf8, 0x01, 0xf8, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0xef, 0x01, 0xef, 0x01, 0xe2, 0x01, 0xe2, 0x01, 0xd2, 0x01, 0xd2, 0x01, 0xbc, 0x01, 0xbc, 0x01, 0x9c, 0x01, 0x9c, 0x01, 0x73, 0x01, 0x73, 0x01, 0x44, 0x01, 0x44, 0x01, 0x13, 0x01, 0x13, 0x01, 0xe2, 0x00, 0xe2, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0x77, 0x00, 0x77, 0x00, 0x38, 0x00, 0x38, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xab, 0xff, 0xab, 0xff, 0x62, 0xff, 0x62, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0xd7, 0xfe, 0xd7, 0xfe, 0x96, 0xfe, 0x96, 0xfe, 0x5a, 0xfe, 0x5a, 0xfe, 0x22, 0xfe, 0x22, 0xfe, 0xf2, 0xfd, 0xf2, 0xfd, 0xcb, 0xfd, 0xcb, 0xfd, 0xb1, 0xfd, 0xb1, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xa6, 0xfd, 0xa6, 0xfd, 0xb6, 0xfd, 0xb6, 0xfd, 0xd0, 0xfd, 0xd0, 0xfd, 0xf5, 0xfd, 0xf5, 0xfd, 0x24, 0xfe, 0x24, 0xfe, 0x5b, 0xfe, 0x5b, 0xfe, 0x9a, 0xfe, 0x9a, 0xfe, 0xe2, 0xfe, 0xe2, 0xfe, 0x30, 0xff, 0x30, 0xff, 0x82, 0xff, 0x82, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0x3b, 0x00, 0x3b, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0x14, 0x01, 0x14, 0x01, 0x82, 0x01, 0x82, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0x46, 0x02, 0x46, 0x02, 0x99, 0x02, 0x99, 0x02, 0xdd, 0x02, 0xdd, 0x02, 0x11, 0x03, 0x11, 0x03, 0x32, 0x03, 0x32, 0x03, 0x3c, 0x03, 0x3c, 0x03, 0x30, 0x03, 0x30, 0x03, 0x0a, 0x03, 0x0a, 0x03, 0xcf, 0x02, 0xcf, 0x02, 0x83, 0x02, 0x83, 0x02, 0x2d, 0x02, 0x2d, 0x02, 0xd3, 0x01, 0xd3, 0x01, 0x76, 0x01, 0x76, 0x01, 0x16, 0x01, 0x16, 0x01, 0xb3, 0x00, 0xb3, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xe7, 0xff, 0xe7, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x18, 0xff, 0x18, 0xff, 0xb2, 0xfe, 0xb2, 0xfe, 0x50, 0xfe, 0x50, 0xfe, 0xf2, 0xfd, 0xf2, 0xfd, 0x97, 0xfd, 0x97, 0xfd, 0x42, 0xfd, 0x42, 0xfd, 0xf8, 0xfc, 0xf8, 0xfc, 0xbc, 0xfc, 0xbc, 0xfc, 0x93, 0xfc, 0x93, 0xfc, 0x81, 0xfc, 0x81, 0xfc, 0x85, 0xfc, 0x85, 0xfc, 0xa0, 0xfc, 0xa0, 0xfc, 0xcd, 0xfc, 0xcd, 0xfc, 0x09, 0xfd, 0x09, 0xfd, 0x54, 0xfd, 0x54, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0x1a, 0xfe, 0x1a, 0xfe, 0x8f, 0xfe, 0x8f, 0xfe, 0x0b, 0xff, 0x0b, 0xff, 0x88, 0xff, 0x88, 0xff, 0x02, 0x00, 0x02, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0x6f, 0x01, 0x6f, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0x58, 0x02, 0x58, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xfd, 0x02, 0xfd, 0x02, 0x2b, 0x03, 0x2b, 0x03, 0x46, 0x03, 0x46, 0x03, 0x53, 0x03, 0x53, 0x03, 0x56, 0x03, 0x56, 0x03, 0x4e, 0x03, 0x4e, 0x03, 0x36, 0x03, 0x36, 0x03, 0x0c, 0x03, 0x0c, 0x03, 0xd2, 0x02, 0xd2, 0x02, 0x8b, 0x02, 0x8b, 0x02, 0x3f, 0x02, 0x3f, 0x02, 0xf2, 0x01, 0xf2, 0x01, 0xa6, 0x01, 0xa6, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0x07, 0x01, 0x07, 0x01, 0xa6, 0x00, 0xa6, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0xc7, 0xff, 0xc7, 0xff, 0x55, 0xff, 0x55, 0xff, 0xe7, 0xfe, 0xe7, 0xfe, 0x80, 0xfe, 0x80, 0xfe, 0x1e, 0xfe, 0x1e, 0xfe, 0xc3, 0xfd, 0xc3, 0xfd, 0x70, 0xfd, 0x70, 0xfd, 0x2d, 0xfd, 0x2d, 0xfd, 0xfe, 0xfc, 0xfe, 0xfc, 0xe6, 0xfc, 0xe6, 0xfc, 0xe5, 0xfc, 0xe5, 0xfc, 0xf8, 0xfc, 0xf8, 0xfc, 0x19, 0xfd, 0x19, 0xfd, 0x45, 0xfd, 0x45, 0xfd, 0x7a, 0xfd, 0x7a, 0xfd, 0xb6, 0xfd, 0xb6, 0xfd, 0xf3, 0xfd, 0xf3, 0xfd, 0x35, 0xfe, 0x35, 0xfe, 0x7b, 0xfe, 0x7b, 0xfe, 0xc6, 0xfe, 0xc6, 0xfe, 0x0f, 0xff, 0x0f, 0xff, 0x56, 0xff, 0x56, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0x32, 0x00, 0x32, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0x1a, 0x01, 0x1a, 0x01, 0x6e, 0x01, 0x6e, 0x01, 0xc3, 0x01, 0xc3, 0x01, 0x14, 0x02, 0x14, 0x02, 0x60, 0x02, 0x60, 0x02, 0xa4, 0x02, 0xa4, 0x02, 0xde, 0x02, 0xde, 0x02, 0x0e, 0x03, 0x0e, 0x03, 0x31, 0x03, 0x31, 0x03, 0x45, 0x03, 0x45, 0x03, 0x46, 0x03, 0x46, 0x03, 0x33, 0x03, 0x33, 0x03, 0x0a, 0x03, 0x0a, 0x03, 0xce, 0x02, 0xce, 0x02, 0x86, 0x02, 0x86, 0x02, 0x32, 0x02, 0x32, 0x02, 0xd7, 0x01, 0xd7, 0x01, 0x74, 0x01, 0x74, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0xa2, 0x00, 0xa2, 0x00, 0x38, 0x00, 0x38, 0x00, 0xce, 0xff, 0xce, 0xff, 0x66, 0xff, 0x66, 0xff, 0x03, 0xff, 0x03, 0xff, 0xa4, 0xfe, 0xa4, 0xfe, 0x48, 0xfe, 0x48, 0xfe, 0xef, 0xfd, 0xef, 0xfd, 0x95, 0xfd, 0x95, 0xfd, 0x3c, 0xfd, 0x3c, 0xfd, 0xe5, 0xfc, 0xe5, 0xfc, 0x94, 0xfc, 0x94, 0xfc, 0x4f, 0xfc, 0x4f, 0xfc, 0x15, 0xfc, 0x15, 0xfc, 0xe8, 0xfb, 0xe8, 0xfb, 0xcc, 0xfb, 0xcc, 0xfb, 0xc3, 0xfb, 0xc3, 0xfb, 0xcf, 0xfb, 0xcf, 0xfb, 0xf2, 0xfb, 0xf2, 0xfb, 0x2f, 0xfc, 0x2f, 0xfc, 0x84, 0xfc, 0x84, 0xfc, 0xee, 0xfc, 0xee, 0xfc, 0x67, 0xfd, 0x67, 0xfd, 0xee, 0xfd, 0xee, 0xfd, 0x81, 0xfe, 0x81, 0xfe, 0x1f, 0xff, 0x1f, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0x6d, 0x00, 0x6d, 0x00, 0x13, 0x01, 0x13, 0x01, 0xb1, 0x01, 0xb1, 0x01, 0x42, 0x02, 0x42, 0x02, 0xc6, 0x02, 0xc6, 0x02, 0x3a, 0x03, 0x3a, 0x03, 0x9e, 0x03, 0x9e, 0x03, 0xf3, 0x03, 0xf3, 0x03, 0x38, 0x04, 0x38, 0x04, 0x6a, 0x04, 0x6a, 0x04, 0x89, 0x04, 0x89, 0x04, 0x95, 0x04, 0x95, 0x04, 0x8e, 0x04, 0x8e, 0x04, 0x78, 0x04, 0x78, 0x04, 0x51, 0x04, 0x51, 0x04, 0x19, 0x04, 0x19, 0x04, 0xcd, 0x03, 0xcd, 0x03, 0x6d, 0x03, 0x6d, 0x03, 0xf9, 0x02, 0xf9, 0x02, 0x73, 0x02, 0x73, 0x02, 0xde, 0x01, 0xde, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x97, 0x00, 0x97, 0x00, 0xe8, 0xff, 0xe8, 0xff, 0x36, 0xff, 0x36, 0xff, 0x88, 0xfe, 0x88, 0xfe, 0xe1, 0xfd, 0xe1, 0xfd, 0x47, 0xfd, 0x47, 0xfd, 0xc0, 0xfc, 0xc0, 0xfc, 0x51, 0xfc, 0x51, 0xfc, 0x01, 0xfc, 0x01, 0xfc, 0xcc, 0xfb, 0xcc, 0xfb, 0xaf, 0xfb, 0xaf, 0xfb, 0xa9, 0xfb, 0xa9, 0xfb, 0xb9, 0xfb, 0xb9, 0xfb, 0xe0, 0xfb, 0xe0, 0xfb, 0x1a, 0xfc, 0x1a, 0xfc, 0x66, 0xfc, 0x66, 0xfc, 0xc0, 0xfc, 0xc0, 0xfc, 0x23, 0xfd, 0x23, 0xfd, 0x8c, 0xfd, 0x8c, 0xfd, 0xfc, 0xfd, 0xfc, 0xfd, 0x73, 0xfe, 0x73, 0xfe, 0xf2, 0xfe, 0xf2, 0xfe, 0x75, 0xff, 0x75, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x80, 0x00, 0x80, 0x00, 0x05, 0x01, 0x05, 0x01, 0x86, 0x01, 0x86, 0x01, 0xfd, 0x01, 0xfd, 0x01, 0x67, 0x02, 0x67, 0x02, 0xc2, 0x02, 0xc2, 0x02, 0x0c, 0x03, 0x0c, 0x03, 0x43, 0x03, 0x43, 0x03, 0x60, 0x03, 0x60, 0x03, 0x64, 0x03, 0x64, 0x03, 0x4a, 0x03, 0x4a, 0x03, 0x16, 0x03, 0x16, 0x03, 0xc9, 0x02, 0xc9, 0x02, 0x64, 0x02, 0x64, 0x02, 0xeb, 0x01, 0xeb, 0x01, 0x62, 0x01, 0x62, 0x01, 0xd0, 0x00, 0xd0, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0xae, 0xff, 0xae, 0xff, 0x29, 0xff, 0x29, 0xff, 0xae, 0xfe, 0xae, 0xfe, 0x40, 0xfe, 0x40, 0xfe, 0xe2, 0xfd, 0xe2, 0xfd, 0x96, 0xfd, 0x96, 0xfd, 0x5a, 0xfd, 0x5a, 0xfd, 0x2d, 0xfd, 0x2d, 0xfd, 0x12, 0xfd, 0x12, 0xfd, 0x0c, 0xfd, 0x0c, 0xfd, 0x1b, 0xfd, 0x1b, 0xfd, 0x3c, 0xfd, 0x3c, 0xfd, 0x70, 0xfd, 0x70, 0xfd, 0xb4, 0xfd, 0xb4, 0xfd, 0x08, 0xfe, 0x08, 0xfe, 0x6b, 0xfe, 0x6b, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0x5a, 0xff, 0x5a, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0x6a, 0x00, 0x6a, 0x00, 0xf5, 0x00, 0xf5, 0x00, 0x7f, 0x01, 0x7f, 0x01, 0x01, 0x02, 0x01, 0x02, 0x76, 0x02, 0x76, 0x02, 0xdd, 0x02, 0xdd, 0x02, 0x35, 0x03, 0x35, 0x03, 0x7d, 0x03, 0x7d, 0x03, 0xaf, 0x03, 0xaf, 0x03, 0xcb, 0x03, 0xcb, 0x03, 0xcf, 0x03, 0xcf, 0x03, 0xbb, 0x03, 0xbb, 0x03, 0x93, 0x03, 0x93, 0x03, 0x59, 0x03, 0x59, 0x03, 0x0b, 0x03, 0x0b, 0x03, 0xaa, 0x02, 0xaa, 0x02, 0x39, 0x02, 0x39, 0x02, 0xb9, 0x01, 0xb9, 0x01, 0x2d, 0x01, 0x2d, 0x01, 0x99, 0x00, 0x99, 0x00, 0x02, 0x00, 0x02, 0x00, 0x6d, 0xff, 0x6d, 0xff, 0xe0, 0xfe, 0xe0, 0xfe, 0x59, 0xfe, 0x59, 0xfe, 0xd9, 0xfd, 0xd9, 0xfd, 0x64, 0xfd, 0x64, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xa7, 0xfc, 0xa7, 0xfc, 0x69, 0xfc, 0x69, 0xfc, 0x47, 0xfc, 0x47, 0xfc, 0x41, 0xfc, 0x41, 0xfc, 0x56, 0xfc, 0x56, 0xfc, 0x83, 0xfc, 0x83, 0xfc, 0xc5, 0xfc, 0xc5, 0xfc, 0x1b, 0xfd, 0x1b, 0xfd, 0x84, 0xfd, 0x84, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0x88, 0xfe, 0x88, 0xfe, 0x1a, 0xff, 0x1a, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0x3e, 0x00, 0x3e, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x43, 0x01, 0x43, 0x01, 0xb3, 0x01, 0xb3, 0x01, 0x14, 0x02, 0x14, 0x02, 0x65, 0x02, 0x65, 0x02, 0xa7, 0x02, 0xa7, 0x02, 0xd8, 0x02, 0xd8, 0x02, 0xf9, 0x02, 0xf9, 0x02, 0x06, 0x03, 0x06, 0x03, 0x03, 0x03, 0x03, 0x03, 0xf0, 0x02, 0xf0, 0x02, 0xcf, 0x02, 0xcf, 0x02, 0xa2, 0x02, 0xa2, 0x02, 0x68, 0x02, 0x68, 0x02, 0x26, 0x02, 0x26, 0x02, 0xd9, 0x01, 0xd9, 0x01, 0x81, 0x01, 0x81, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0xad, 0x00, 0xad, 0x00, 0x37, 0x00, 0x37, 0x00, 0xbf, 0xff, 0xbf, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0xe2, 0xfe, 0xe2, 0xfe, 0x84, 0xfe, 0x84, 0xfe, 0x32, 0xfe, 0x32, 0xfe, 0xed, 0xfd, 0xed, 0xfd, 0xb3, 0xfd, 0xb3, 0xfd, 0x89, 0xfd, 0x89, 0xfd, 0x70, 0xfd, 0x70, 0xfd, 0x6b, 0xfd, 0x6b, 0xfd, 0x7b, 0xfd, 0x7b, 0xfd, 0x9e, 0xfd, 0x9e, 0xfd, 0xcc, 0xfd, 0xcc, 0xfd, 0x00, 0xfe, 0x00, 0xfe, 0x36, 0xfe, 0x36, 0xfe, 0x6f, 0xfe, 0x6f, 0xfe, 0xab, 0xfe, 0xab, 0xfe, 0xea, 0xfe, 0xea, 0xfe, 0x2a, 0xff, 0x2a, 0xff, 0x67, 0xff, 0x67, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0x09, 0x00, 0x09, 0x00, 0x26, 0x00, 0x26, 0x00, 0x43, 0x00, 0x43, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x75, 0x00, 0x75, 0x00, 0x86, 0x00, 0x86, 0x00, 0x93, 0x00, 0x93, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0xec, 0x00, 0xec, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf2, 0x00, 0xf2, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0x01, 0x01, 0x01, 0x01, 0x11, 0x01, 0x11, 0x01, 0x20, 0x01, 0x20, 0x01, 0x2b, 0x01, 0x2b, 0x01, 0x32, 0x01, 0x32, 0x01, 0x37, 0x01, 0x37, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x48, 0x01, 0x48, 0x01, 0x56, 0x01, 0x56, 0x01, 0x62, 0x01, 0x62, 0x01, 0x68, 0x01, 0x68, 0x01, 0x62, 0x01, 0x62, 0x01, 0x4e, 0x01, 0x4e, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x04, 0x01, 0x04, 0x01, 0xd2, 0x00, 0xd2, 0x00, 0x96, 0x00, 0x96, 0x00, 0x50, 0x00, 0x50, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0xd8, 0xfe, 0xd8, 0xfe, 0x72, 0xfe, 0x72, 0xfe, 0x10, 0xfe, 0x10, 0xfe, 0xb4, 0xfd, 0xb4, 0xfd, 0x5f, 0xfd, 0x5f, 0xfd, 0x16, 0xfd, 0x16, 0xfd, 0xdb, 0xfc, 0xdb, 0xfc, 0xb3, 0xfc, 0xb3, 0xfc, 0x9f, 0xfc, 0x9f, 0xfc, 0xa1, 0xfc, 0xa1, 0xfc, 0xb6, 0xfc, 0xb6, 0xfc, 0xe0, 0xfc, 0xe0, 0xfc, 0x1e, 0xfd, 0x1e, 0xfd, 0x6f, 0xfd, 0x6f, 0xfd, 0xd0, 0xfd, 0xd0, 0xfd, 0x3b, 0xfe, 0x3b, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0x2b, 0xff, 0x2b, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0x2a, 0x00, 0x2a, 0x00, 0xab, 0x00, 0xab, 0x00, 0x2d, 0x01, 0x2d, 0x01, 0xac, 0x01, 0xac, 0x01, 0x23, 0x02, 0x23, 0x02, 0x91, 0x02, 0x91, 0x02, 0xf2, 0x02, 0xf2, 0x02, 0x46, 0x03, 0x46, 0x03, 0x8c, 0x03, 0x8c, 0x03, 0xc4, 0x03, 0xc4, 0x03, 0xea, 0x03, 0xea, 0x03, 0xfb, 0x03, 0xfb, 0x03, 0xf3, 0x03, 0xf3, 0x03, 0xd2, 0x03, 0xd2, 0x03, 0x99, 0x03, 0x99, 0x03, 0x49, 0x03, 0x49, 0x03, 0xe6, 0x02, 0xe6, 0x02, 0x70, 0x02, 0x70, 0x02, 0xe7, 0x01, 0xe7, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0xa2, 0x00, 0xa2, 0x00, 0xf1, 0xff, 0xf1, 0xff, 0x41, 0xff, 0x41, 0xff, 0x9d, 0xfe, 0x9d, 0xfe, 0x09, 0xfe, 0x09, 0xfe, 0x82, 0xfd, 0x82, 0xfd, 0x08, 0xfd, 0x08, 0xfd, 0x9e, 0xfc, 0x9e, 0xfc, 0x48, 0xfc, 0x48, 0xfc, 0x09, 0xfc, 0x09, 0xfc, 0xe8, 0xfb, 0xe8, 0xfb, 0xe4, 0xfb, 0xe4, 0xfb, 0xf9, 0xfb, 0xf9, 0xfb, 0x24, 0xfc, 0x24, 0xfc, 0x5f, 0xfc, 0x5f, 0xfc, 0xac, 0xfc, 0xac, 0xfc, 0x08, 0xfd, 0x08, 0xfd, 0x78, 0xfd, 0x78, 0xfd, 0xf6, 0xfd, 0xf6, 0xfd, 0x81, 0xfe, 0x81, 0xfe, 0x15, 0xff, 0x15, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0x3a, 0x00, 0x3a, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x51, 0x01, 0x51, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0x4c, 0x02, 0x4c, 0x02, 0xb2, 0x02, 0xb2, 0x02, 0x03, 0x03, 0x03, 0x03, 0x40, 0x03, 0x40, 0x03, 0x66, 0x03, 0x66, 0x03, 0x78, 0x03, 0x78, 0x03, 0x77, 0x03, 0x77, 0x03, 0x64, 0x03, 0x64, 0x03, 0x3d, 0x03, 0x3d, 0x03, 0x01, 0x03, 0x01, 0x03, 0xb1, 0x02, 0xb1, 0x02, 0x4f, 0x02, 0x4f, 0x02, 0xe1, 0x01, 0xe1, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0xff, 0x00, 0xff, 0x00, 0x91, 0x00, 0x91, 0x00, 0x25, 0x00, 0x25, 0x00, 0xb8, 0xff, 0xb8, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0xf0, 0xfe, 0xf0, 0xfe, 0x9f, 0xfe, 0x9f, 0xfe, 0x5f, 0xfe, 0x5f, 0xfe, 0x31, 0xfe, 0x31, 0xfe, 0x14, 0xfe, 0x14, 0xfe, 0x03, 0xfe, 0x03, 0xfe, 0xfb, 0xfd, 0xfb, 0xfd, 0xfb, 0xfd, 0xfb, 0xfd, 0x04, 0xfe, 0x04, 0xfe, 0x19, 0xfe, 0x19, 0xfe, 0x3c, 0xfe, 0x3c, 0xfe, 0x70, 0xfe, 0x70, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0x3f, 0xff, 0x3f, 0xff, 0x88, 0xff, 0x88, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0x20, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0x0b, 0x01, 0x0b, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x87, 0x01, 0x87, 0x01, 0xac, 0x01, 0xac, 0x01, 0xbd, 0x01, 0xbd, 0x01, 0xbd, 0x01, 0xbd, 0x01, 0xad, 0x01, 0xad, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0x5e, 0x01, 0x5e, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0xd7, 0x00, 0xd7, 0x00, 0x87, 0x00, 0x87, 0x00, 0x32, 0x00, 0x32, 0x00, 0xdc, 0xff, 0xdc, 0xff, 0x87, 0xff, 0x87, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0xf9, 0xfe, 0xf9, 0xfe, 0xc6, 0xfe, 0xc6, 0xfe, 0xa0, 0xfe, 0xa0, 0xfe, 0x89, 0xfe, 0x89, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0x8a, 0xfe, 0x8a, 0xfe, 0x9e, 0xfe, 0x9e, 0xfe, 0xbb, 0xfe, 0xbb, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0x0e, 0xff, 0x0e, 0xff, 0x41, 0xff, 0x41, 0xff, 0x79, 0xff, 0x79, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0x31, 0x00, 0x31, 0x00, 0x71, 0x00, 0x71, 0x00, 0xad, 0x00, 0xad, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0x1e, 0x01, 0x1e, 0x01, 0x4d, 0x01, 0x4d, 0x01, 0x72, 0x01, 0x72, 0x01, 0x88, 0x01, 0x88, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0x83, 0x01, 0x83, 0x01, 0x68, 0x01, 0x68, 0x01, 0x40, 0x01, 0x40, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0xc9, 0x00, 0xc9, 0x00, 0x81, 0x00, 0x81, 0x00, 0x34, 0x00, 0x34, 0x00, 0xe2, 0xff, 0xe2, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0x38, 0xff, 0x38, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0x9d, 0xfe, 0x9d, 0xfe, 0x5e, 0xfe, 0x5e, 0xfe, 0x2f, 0xfe, 0x2f, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe, 0xfa, 0xfd, 0xfa, 0xfd, 0xf4, 0xfd, 0xf4, 0xfd, 0xfa, 0xfd, 0xfa, 0xfd, 0x0e, 0xfe, 0x0e, 0xfe, 0x32, 0xfe, 0x32, 0xfe, 0x67, 0xfe, 0x67, 0xfe, 0xad, 0xfe, 0xad, 0xfe, 0xfd, 0xfe, 0xfd, 0xfe, 0x55, 0xff, 0x55, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x70, 0x00, 0x70, 0x00, 0xce, 0x00, 0xce, 0x00, 0x28, 0x01, 0x28, 0x01, 0x7a, 0x01, 0x7a, 0x01, 0xc2, 0x01, 0xc2, 0x01, 0xfc, 0x01, 0xfc, 0x01, 0x29, 0x02, 0x29, 0x02, 0x47, 0x02, 0x47, 0x02, 0x58, 0x02, 0x58, 0x02, 0x5b, 0x02, 0x5b, 0x02, 0x4d, 0x02, 0x4d, 0x02, 0x31, 0x02, 0x31, 0x02, 0x05, 0x02, 0x05, 0x02, 0xca, 0x01, 0xca, 0x01, 0x81, 0x01, 0x81, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0xd1, 0x00, 0xd1, 0x00, 0x73, 0x00, 0x73, 0x00, 0x11, 0x00, 0x11, 0x00, 0xad, 0xff, 0xad, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0xed, 0xfe, 0xed, 0xfe, 0x9b, 0xfe, 0x9b, 0xfe, 0x58, 0xfe, 0x58, 0xfe, 0x24, 0xfe, 0x24, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0xef, 0xfd, 0xef, 0xfd, 0xeb, 0xfd, 0xeb, 0xfd, 0xf4, 0xfd, 0xf4, 0xfd, 0x09, 0xfe, 0x09, 0xfe, 0x28, 0xfe, 0x28, 0xfe, 0x54, 0xfe, 0x54, 0xfe, 0x8b, 0xfe, 0x8b, 0xfe, 0xce, 0xfe, 0xce, 0xfe, 0x15, 0xff, 0x15, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xed, 0xff, 0xed, 0xff, 0x2f, 0x00, 0x2f, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0x08, 0x01, 0x08, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x44, 0x01, 0x44, 0x01, 0x3b, 0x01, 0x3b, 0x01, 0x28, 0x01, 0x28, 0x01, 0x0d, 0x01, 0x0d, 0x01, 0xee, 0x00, 0xee, 0x00, 0xca, 0x00, 0xca, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x71, 0x00, 0x71, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xd9, 0xff, 0xd9, 0xff, 0xab, 0xff, 0xab, 0xff, 0x82, 0xff, 0x82, 0xff, 0x62, 0xff, 0x62, 0xff, 0x47, 0xff, 0x47, 0xff, 0x31, 0xff, 0x31, 0xff, 0x22, 0xff, 0x22, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0x24, 0xff, 0x24, 0xff, 0x39, 0xff, 0x39, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x89, 0xff, 0x89, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x85, 0x00, 0x85, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0x06, 0x01, 0x06, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x6c, 0x01, 0x6c, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0xa2, 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0xa5, 0x01, 0xa5, 0x01, 0x99, 0x01, 0x99, 0x01, 0x81, 0x01, 0x81, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0xf4, 0x00, 0xf4, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x64, 0x00, 0x64, 0x00, 0x17, 0x00, 0x17, 0x00, 0xc8, 0xff, 0xc8, 0xff, 0x79, 0xff, 0x79, 0xff, 0x28, 0xff, 0x28, 0xff, 0xd8, 0xfe, 0xd8, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x4e, 0xfe, 0x4e, 0xfe, 0x1c, 0xfe, 0x1c, 0xfe, 0xf8, 0xfd, 0xf8, 0xfd, 0xe2, 0xfd, 0xe2, 0xfd, 0xda, 0xfd, 0xda, 0xfd, 0xe0, 0xfd, 0xe0, 0xfd, 0xf4, 0xfd, 0xf4, 0xfd, 0x14, 0xfe, 0x14, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0x82, 0xfe, 0x82, 0xfe, 0xcc, 0xfe, 0xcc, 0xfe, 0x1f, 0xff, 0x1f, 0xff, 0x75, 0xff, 0x75, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0x23, 0x00, 0x23, 0x00, 0x77, 0x00, 0x77, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x12, 0x01, 0x12, 0x01, 0x53, 0x01, 0x53, 0x01, 0x8d, 0x01, 0x8d, 0x01, 0xbc, 0x01, 0xbc, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0xf7, 0x01, 0xf7, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xf5, 0x01, 0xf5, 0x01, 0xdc, 0x01, 0xdc, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0x85, 0x01, 0x85, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0xc7, 0x00, 0xc7, 0x00, 0x81, 0x00, 0x81, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x37, 0xff, 0x37, 0xff, 0x16, 0xff, 0x16, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0xf5, 0xfe, 0xf5, 0xfe, 0xfd, 0xfe, 0xfd, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x12, 0xff, 0x12, 0xff, 0x22, 0xff, 0x22, 0xff, 0x34, 0xff, 0x34, 0xff, 0x49, 0xff, 0x49, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x73, 0xff, 0x73, 0xff, 0x85, 0xff, 0x85, 0xff, 0x95, 0xff, 0x95, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xac, 0xff, 0xac, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x15, 0x00, 0x15, 0x00, 0x31, 0x00, 0x31, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x68, 0x00, 0x68, 0x00, 0x85, 0x00, 0x85, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xca, 0x00, 0xca, 0x00, 0xce, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x83, 0x00, 0x83, 0x00, 0x67, 0x00, 0x67, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x35, 0x00, 0x35, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xce, 0xff, 0xce, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x15, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x69, 0x00, 0x69, 0x00, 0x71, 0x00, 0x71, 0x00, 0x74, 0x00, 0x74, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x42, 0x00, 0x42, 0x00, 0x24, 0x00, 0x24, 0x00, 0x02, 0x00, 0x02, 0x00, 0xdc, 0xff, 0xdc, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x62, 0xff, 0x62, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x16, 0xff, 0x16, 0xff, 0xf9, 0xfe, 0xf9, 0xfe, 0xe2, 0xfe, 0xe2, 0xfe, 0xd3, 0xfe, 0xd3, 0xfe, 0xcd, 0xfe, 0xcd, 0xfe, 0xd1, 0xfe, 0xd1, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xfc, 0xfe, 0xfc, 0xfe, 0x20, 0xff, 0x20, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x82, 0xff, 0x82, 0xff, 0xba, 0xff, 0xba, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x3e, 0x00, 0x3e, 0x00, 0x86, 0x00, 0x86, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x0d, 0x01, 0x0d, 0x01, 0x44, 0x01, 0x44, 0x01, 0x71, 0x01, 0x71, 0x01, 0x94, 0x01, 0x94, 0x01, 0xae, 0x01, 0xae, 0x01, 0xbc, 0x01, 0xbc, 0x01, 0xbe, 0x01, 0xbe, 0x01, 0xb3, 0x01, 0xb3, 0x01, 0x98, 0x01, 0x98, 0x01, 0x70, 0x01, 0x70, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x02, 0x01, 0x02, 0x01, 0xc1, 0x00, 0xc1, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0xda, 0xff, 0xda, 0xff, 0x83, 0xff, 0x83, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0xd6, 0xfe, 0xd6, 0xfe, 0x88, 0xfe, 0x88, 0xfe, 0x41, 0xfe, 0x41, 0xfe, 0x03, 0xfe, 0x03, 0xfe, 0xd1, 0xfd, 0xd1, 0xfd, 0xae, 0xfd, 0xae, 0xfd, 0x9b, 0xfd, 0x9b, 0xfd, 0x9d, 0xfd, 0x9d, 0xfd, 0xb4, 0xfd, 0xb4, 0xfd, 0xe1, 0xfd, 0xe1, 0xfd, 0x23, 0xfe, 0x23, 0xfe, 0x74, 0xfe, 0x74, 0xfe, 0xd1, 0xfe, 0xd1, 0xfe, 0x38, 0xff, 0x38, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x92, 0x00, 0x92, 0x00, 0x05, 0x01, 0x05, 0x01, 0x70, 0x01, 0x70, 0x01, 0xce, 0x01, 0xce, 0x01, 0x1d, 0x02, 0x1d, 0x02, 0x5c, 0x02, 0x5c, 0x02, 0x8b, 0x02, 0x8b, 0x02, 0xa9, 0x02, 0xa9, 0x02, 0xb6, 0x02, 0xb6, 0x02, 0xb1, 0x02, 0xb1, 0x02, 0x99, 0x02, 0x99, 0x02, 0x6d, 0x02, 0x6d, 0x02, 0x32, 0x02, 0x32, 0x02, 0xe9, 0x01, 0xe9, 0x01, 0x95, 0x01, 0x95, 0x01, 0x33, 0x01, 0x33, 0x01, 0xc5, 0x00, 0xc5, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0xcf, 0xff, 0xcf, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0xcd, 0xfe, 0xcd, 0xfe, 0x52, 0xfe, 0x52, 0xfe, 0xe1, 0xfd, 0xe1, 0xfd, 0x7a, 0xfd, 0x7a, 0xfd, 0x22, 0xfd, 0x22, 0xfd, 0xd7, 0xfc, 0xd7, 0xfc, 0x9c, 0xfc, 0x9c, 0xfc, 0x75, 0xfc, 0x75, 0xfc, 0x61, 0xfc, 0x61, 0xfc, 0x63, 0xfc, 0x63, 0xfc, 0x79, 0xfc, 0x79, 0xfc, 0xa3, 0xfc, 0xa3, 0xfc, 0xe2, 0xfc, 0xe2, 0xfc, 0x35, 0xfd, 0x35, 0xfd, 0x9b, 0xfd, 0x9b, 0xfd, 0x10, 0xfe, 0x10, 0xfe, 0x95, 0xfe, 0x95, 0xfe, 0x23, 0xff, 0x23, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0x4c, 0x00, 0x4c, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x6f, 0x01, 0x6f, 0x01, 0xf2, 0x01, 0xf2, 0x01, 0x68, 0x02, 0x68, 0x02, 0xcd, 0x02, 0xcd, 0x02, 0x21, 0x03, 0x21, 0x03, 0x60, 0x03, 0x60, 0x03, 0x8d, 0x03, 0x8d, 0x03, 0xa7, 0x03, 0xa7, 0x03, 0xaf, 0x03, 0xaf, 0x03, 0xa6, 0x03, 0xa6, 0x03, 0x8a, 0x03, 0x8a, 0x03, 0x5f, 0x03, 0x5f, 0x03, 0x26, 0x03, 0x26, 0x03, 0xde, 0x02, 0xde, 0x02, 0x89, 0x02, 0x89, 0x02, 0x29, 0x02, 0x29, 0x02, 0xbe, 0x01, 0xbe, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0xc5, 0xff, 0xc5, 0xff, 0x3e, 0xff, 0x3e, 0xff, 0xbb, 0xfe, 0xbb, 0xfe, 0x3b, 0xfe, 0x3b, 0xfe, 0xc6, 0xfd, 0xc6, 0xfd, 0x5e, 0xfd, 0x5e, 0xfd, 0x05, 0xfd, 0x05, 0xfd, 0xbe, 0xfc, 0xbe, 0xfc, 0x8c, 0xfc, 0x8c, 0xfc, 0x70, 0xfc, 0x70, 0xfc, 0x67, 0xfc, 0x67, 0xfc, 0x77, 0xfc, 0x77, 0xfc, 0x9c, 0xfc, 0x9c, 0xfc, 0xd6, 0xfc, 0xd6, 0xfc, 0x21, 0xfd, 0x21, 0xfd, 0x7c, 0xfd, 0x7c, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x59, 0xfe, 0x59, 0xfe, 0xd0, 0xfe, 0xd0, 0xfe, 0x49, 0xff, 0x49, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0x35, 0x00, 0x35, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x14, 0x01, 0x14, 0x01, 0x7d, 0x01, 0x7d, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0x3c, 0x02, 0x3c, 0x02, 0x91, 0x02, 0x91, 0x02, 0xde, 0x02, 0xde, 0x02, 0x20, 0x03, 0x20, 0x03, 0x55, 0x03, 0x55, 0x03, 0x7f, 0x03, 0x7f, 0x03, 0x9a, 0x03, 0x9a, 0x03, 0xa4, 0x03, 0xa4, 0x03, 0x99, 0x03, 0x99, 0x03, 0x78, 0x03, 0x78, 0x03, 0x43, 0x03, 0x43, 0x03, 0xfa, 0x02, 0xfa, 0x02, 0xa0, 0x02, 0xa0, 0x02, 0x34, 0x02, 0x34, 0x02, 0xba, 0x01, 0xba, 0x01, 0x34, 0x01, 0x34, 0x01, 0xa8, 0x00, 0xa8, 0x00, 0x19, 0x00, 0x19, 0x00, 0x8d, 0xff, 0x8d, 0xff, 0x08, 0xff, 0x08, 0xff, 0x8b, 0xfe, 0x8b, 0xfe, 0x1d, 0xfe, 0x1d, 0xfe, 0xbc, 0xfd, 0xbc, 0xfd, 0x6b, 0xfd, 0x6b, 0xfd, 0x2a, 0xfd, 0x2a, 0xfd, 0xf5, 0xfc, 0xf5, 0xfc, 0xcd, 0xfc, 0xcd, 0xfc, 0xb2, 0xfc, 0xb2, 0xfc, 0xa4, 0xfc, 0xa4, 0xfc, 0xa1, 0xfc, 0xa1, 0xfc, 0xab, 0xfc, 0xab, 0xfc, 0xbf, 0xfc, 0xbf, 0xfc, 0xe1, 0xfc, 0xe1, 0xfc, 0x14, 0xfd, 0x14, 0xfd, 0x55, 0xfd, 0x55, 0xfd, 0xa4, 0xfd, 0xa4, 0xfd, 0xfe, 0xfd, 0xfe, 0xfd, 0x62, 0xfe, 0x62, 0xfe, 0xcd, 0xfe, 0xcd, 0xfe, 0x3e, 0xff, 0x3e, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0x2c, 0x00, 0x2c, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x0d, 0x01, 0x0d, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0xc3, 0x01, 0xc3, 0x01, 0x06, 0x02, 0x06, 0x02, 0x3a, 0x02, 0x3a, 0x02, 0x5b, 0x02, 0x5b, 0x02, 0x6d, 0x02, 0x6d, 0x02, 0x6f, 0x02, 0x6f, 0x02, 0x62, 0x02, 0x62, 0x02, 0x4c, 0x02, 0x4c, 0x02, 0x2a, 0x02, 0x2a, 0x02, 0x02, 0x02, 0x02, 0x02, 0xd1, 0x01, 0xd1, 0x01, 0x9c, 0x01, 0x9c, 0x01, 0x63, 0x01, 0x63, 0x01, 0x24, 0x01, 0x24, 0x01, 0xe4, 0x00, 0xe4, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x68, 0x00, 0x68, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0xf8, 0xff, 0xf8, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x74, 0xff, 0x74, 0xff, 0x54, 0xff, 0x54, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x2b, 0xff, 0x2b, 0xff, 0x22, 0xff, 0x22, 0xff, 0x20, 0xff, 0x20, 0xff, 0x24, 0xff, 0x24, 0xff, 0x30, 0xff, 0x30, 0xff, 0x43, 0xff, 0x43, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x77, 0xff, 0x77, 0xff, 0x99, 0xff, 0x99, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0x09, 0x00, 0x09, 0x00, 0x25, 0x00, 0x25, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x57, 0x00, 0x57, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x53, 0x00, 0x53, 0x00, 0x42, 0x00, 0x42, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xee, 0xff, 0xee, 0xff, 0xce, 0xff, 0xce, 0xff, 0xac, 0xff, 0xac, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x70, 0xff, 0x70, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x4c, 0xff, 0x4c, 0xff, 0x43, 0xff, 0x43, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0x43, 0xff, 0x43, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x6f, 0xff, 0x6f, 0xff, 0x84, 0xff, 0x84, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x23, 0x00, 0x23, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x72, 0x00, 0x72, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0xe6, 0x00, 0xe6, 0x00, 0x05, 0x01, 0x05, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x21, 0x01, 0x21, 0x01, 0x0f, 0x01, 0x0f, 0x01, 0xf6, 0x00, 0xf6, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x32, 0x00, 0x32, 0x00, 0x08, 0x00, 0x08, 0x00, 0xde, 0xff, 0xde, 0xff, 0xba, 0xff, 0xba, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x82, 0xff, 0x82, 0xff, 0x6f, 0xff, 0x6f, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x52, 0xff, 0x52, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0x48, 0xff, 0x48, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x51, 0xff, 0x51, 0xff, 0x58, 0xff, 0x58, 0xff, 0x61, 0xff, 0x61, 0xff, 0x6f, 0xff, 0x6f, 0xff, 0x80, 0xff, 0x80, 0xff, 0x96, 0xff, 0x96, 0xff, 0xac, 0xff, 0xac, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x18, 0x00, 0x18, 0x00, 0x37, 0x00, 0x37, 0x00, 0x54, 0x00, 0x54, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x81, 0x00, 0x81, 0x00, 0x92, 0x00, 0x92, 0x00, 0x9e, 0x00, 0x9e, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x93, 0x00, 0x93, 0x00, 0x84, 0x00, 0x84, 0x00, 0x74, 0x00, 0x74, 0x00, 0x62, 0x00, 0x62, 0x00, 0x50, 0x00, 0x50, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x28, 0x00, 0x28, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xef, 0xff, 0xea, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x12, 0x00, 0x13, 0x00, 0x13, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x03, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xab, 0xff, 0xab, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x96, 0xff, 0x96, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x75, 0xff, 0x75, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x67, 0xff, 0x67, 0xff, 0x61, 0xff, 0x61, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x63, 0xff, 0x63, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x52, 0x00, 0x52, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x82, 0x00, 0x82, 0x00, 0x93, 0x00, 0x93, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0xad, 0x00, 0xad, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x99, 0x00, 0x99, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x79, 0x00, 0x79, 0x00, 0x64, 0x00, 0x64, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xef, 0xff, 0xef, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xae, 0xff, 0xae, 0xff, 0x90, 0xff, 0x90, 0xff, 0x73, 0xff, 0x73, 0xff, 0x59, 0xff, 0x59, 0xff, 0x45, 0xff, 0x45, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x39, 0xff, 0x39, 0xff, 0x41, 0xff, 0x41, 0xff, 0x52, 0xff, 0x52, 0xff, 0x68, 0xff, 0x68, 0xff, 0x85, 0xff, 0x85, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xce, 0xff, 0xce, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x24, 0x00, 0x24, 0x00, 0x53, 0x00, 0x53, 0x00, 0x82, 0x00, 0x82, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x14, 0x01, 0x14, 0x01, 0x2a, 0x01, 0x2a, 0x01, 0x39, 0x01, 0x39, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x39, 0x01, 0x39, 0x01, 0x28, 0x01, 0x28, 0x01, 0x0e, 0x01, 0x0e, 0x01, 0xec, 0x00, 0xec, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x93, 0x00, 0x93, 0x00, 0x58, 0x00, 0x58, 0x00, 0x17, 0x00, 0x17, 0x00, 0xcf, 0xff, 0xcf, 0xff, 0x81, 0xff, 0x81, 0xff, 0x33, 0xff, 0x33, 0xff, 0xe9, 0xfe, 0xe9, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x5b, 0xfe, 0x5b, 0xfe, 0x1a, 0xfe, 0x1a, 0xfe, 0xe2, 0xfd, 0xe2, 0xfd, 0xb5, 0xfd, 0xb5, 0xfd, 0x95, 0xfd, 0x95, 0xfd, 0x86, 0xfd, 0x86, 0xfd, 0x8a, 0xfd, 0x8a, 0xfd, 0xa0, 0xfd, 0xa0, 0xfd, 0xc7, 0xfd, 0xc7, 0xfd, 0xfe, 0xfd, 0xfe, 0xfd, 0x43, 0xfe, 0x43, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0xf7, 0xfe, 0xf7, 0xfe, 0x5e, 0xff, 0x5e, 0xff, 0xca, 0xff, 0xca, 0xff, 0x35, 0x00, 0x35, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x00, 0x01, 0x00, 0x01, 0x5b, 0x01, 0x5b, 0x01, 0xab, 0x01, 0xab, 0x01, 0xf0, 0x01, 0xf0, 0x01, 0x29, 0x02, 0x29, 0x02, 0x56, 0x02, 0x56, 0x02, 0x76, 0x02, 0x76, 0x02, 0x8a, 0x02, 0x8a, 0x02, 0x92, 0x02, 0x92, 0x02, 0x8c, 0x02, 0x8c, 0x02, 0x7a, 0x02, 0x7a, 0x02, 0x5c, 0x02, 0x5c, 0x02, 0x2f, 0x02, 0x2f, 0x02, 0xf2, 0x01, 0xf2, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0x52, 0x01, 0x52, 0x01, 0xf3, 0x00, 0xf3, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x24, 0x00, 0x24, 0x00, 0xb7, 0xff, 0xb7, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0xe6, 0xfe, 0xe6, 0xfe, 0x8c, 0xfe, 0x8c, 0xfe, 0x42, 0xfe, 0x42, 0xfe, 0x0a, 0xfe, 0x0a, 0xfe, 0xe7, 0xfd, 0xe7, 0xfd, 0xda, 0xfd, 0xda, 0xfd, 0xdf, 0xfd, 0xdf, 0xfd, 0xf9, 0xfd, 0xf9, 0xfd, 0x26, 0xfe, 0x26, 0xfe, 0x63, 0xfe, 0x63, 0xfe, 0xad, 0xfe, 0xad, 0xfe, 0x02, 0xff, 0x02, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0xba, 0xff, 0xba, 0xff, 0x11, 0x00, 0x11, 0x00, 0x64, 0x00, 0x64, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x2b, 0x01, 0x2b, 0x01, 0x5c, 0x01, 0x5c, 0x01, 0x80, 0x01, 0x80, 0x01, 0x98, 0x01, 0x98, 0x01, 0xa2, 0x01, 0xa2, 0x01, 0x9e, 0x01, 0x9e, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0x40, 0x01, 0x40, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0x84, 0x00, 0x84, 0x00, 0x31, 0x00, 0x31, 0x00, 0xd9, 0xff, 0xd9, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x28, 0xff, 0x28, 0xff, 0xd6, 0xfe, 0xd6, 0xfe, 0x8b, 0xfe, 0x8b, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x09, 0xfe, 0x09, 0xfe, 0xdb, 0xfd, 0xdb, 0xfd, 0xba, 0xfd, 0xba, 0xfd, 0xaa, 0xfd, 0xaa, 0xfd, 0xad, 0xfd, 0xad, 0xfd, 0xc3, 0xfd, 0xc3, 0xfd, 0xeb, 0xfd, 0xeb, 0xfd, 0x24, 0xfe, 0x24, 0xfe, 0x6d, 0xfe, 0x6d, 0xfe, 0xc4, 0xfe, 0xc4, 0xfe, 0x25, 0xff, 0x25, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x6d, 0x00, 0x6d, 0x00, 0xda, 0x00, 0xda, 0x00, 0x3d, 0x01, 0x3d, 0x01, 0x97, 0x01, 0x97, 0x01, 0xe7, 0x01, 0xe7, 0x01, 0x2b, 0x02, 0x2b, 0x02, 0x60, 0x02, 0x60, 0x02, 0x83, 0x02, 0x83, 0x02, 0x95, 0x02, 0x95, 0x02, 0x94, 0x02, 0x94, 0x02, 0x81, 0x02, 0x81, 0x02, 0x5d, 0x02, 0x5d, 0x02, 0x2b, 0x02, 0x2b, 0x02, 0xec, 0x01, 0xec, 0x01, 0xa4, 0x01, 0xa4, 0x01, 0x55, 0x01, 0x55, 0x01, 0xff, 0x00, 0xff, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x44, 0x00, 0x44, 0x00, 0xe7, 0xff, 0xe7, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x32, 0xff, 0x32, 0xff, 0xdf, 0xfe, 0xdf, 0xfe, 0x92, 0xfe, 0x92, 0xfe, 0x4e, 0xfe, 0x4e, 0xfe, 0x15, 0xfe, 0x15, 0xfe, 0xe6, 0xfd, 0xe6, 0xfd, 0xc4, 0xfd, 0xc4, 0xfd, 0xad, 0xfd, 0xad, 0xfd, 0xa3, 0xfd, 0xa3, 0xfd, 0xa9, 0xfd, 0xa9, 0xfd, 0xc0, 0xfd, 0xc0, 0xfd, 0xe8, 0xfd, 0xe8, 0xfd, 0x20, 0xfe, 0x20, 0xfe, 0x6a, 0xfe, 0x6a, 0xfe, 0xc4, 0xfe, 0xc4, 0xfe, 0x2a, 0xff, 0x2a, 0xff, 0x96, 0xff, 0x96, 0xff, 0x04, 0x00, 0x04, 0x00, 0x71, 0x00, 0x71, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x3d, 0x01, 0x3d, 0x01, 0x93, 0x01, 0x93, 0x01, 0xdd, 0x01, 0xdd, 0x01, 0x16, 0x02, 0x16, 0x02, 0x3c, 0x02, 0x3c, 0x02, 0x4f, 0x02, 0x4f, 0x02, 0x53, 0x02, 0x53, 0x02, 0x48, 0x02, 0x48, 0x02, 0x2e, 0x02, 0x2e, 0x02, 0x0a, 0x02, 0x0a, 0x02, 0xde, 0x01, 0xde, 0x01, 0xaa, 0x01, 0xaa, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0xe9, 0x00, 0xe9, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x15, 0x00, 0x15, 0x00, 0xce, 0xff, 0xce, 0xff, 0x87, 0xff, 0x87, 0xff, 0x40, 0xff, 0x40, 0xff, 0xfa, 0xfe, 0xfa, 0xfe, 0xb7, 0xfe, 0xb7, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0x3d, 0xfe, 0x3d, 0xfe, 0x0a, 0xfe, 0x0a, 0xfe, 0xe1, 0xfd, 0xe1, 0xfd, 0xc3, 0xfd, 0xc3, 0xfd, 0xb5, 0xfd, 0xb5, 0xfd, 0xb6, 0xfd, 0xb6, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xe4, 0xfd, 0xe4, 0xfd, 0x11, 0xfe, 0x11, 0xfe, 0x4e, 0xfe, 0x4e, 0xfe, 0x98, 0xfe, 0x98, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0x39, 0xff, 0x39, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0x32, 0x00, 0x32, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0x26, 0x01, 0x26, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x70, 0x01, 0x70, 0x01, 0x8b, 0x01, 0x8b, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0xae, 0x01, 0xae, 0x01, 0xb9, 0x01, 0xb9, 0x01, 0xc2, 0x01, 0xc2, 0x01, 0xc6, 0x01, 0xc6, 0x01, 0xc4, 0x01, 0xc4, 0x01, 0xbc, 0x01, 0xbc, 0x01, 0xaa, 0x01, 0xaa, 0x01, 0x93, 0x01, 0x93, 0x01, 0x75, 0x01, 0x75, 0x01, 0x52, 0x01, 0x52, 0x01, 0x29, 0x01, 0x29, 0x01, 0xfa, 0x00, 0xfa, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x90, 0x00, 0x90, 0x00, 0x58, 0x00, 0x58, 0x00, 0x21, 0x00, 0x21, 0x00, 0xec, 0xff, 0xec, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0x88, 0xff, 0x88, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x04, 0xff, 0x04, 0xff, 0xf2, 0xfe, 0xf2, 0xfe, 0xe5, 0xfe, 0xe5, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xdf, 0xfe, 0xdf, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xec, 0xfe, 0xec, 0xfe, 0xf4, 0xfe, 0xf4, 0xfe, 0xfc, 0xfe, 0xfc, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x10, 0xff, 0x10, 0xff, 0x19, 0xff, 0x19, 0xff, 0x24, 0xff, 0x24, 0xff, 0x32, 0xff, 0x32, 0xff, 0x42, 0xff, 0x42, 0xff, 0x53, 0xff, 0x53, 0xff, 0x65, 0xff, 0x65, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x92, 0xff, 0x92, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x27, 0x00, 0x27, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x60, 0x00, 0x60, 0x00, 0x67, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x74, 0x00, 0x78, 0x00, 0x78, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x80, 0x00, 0x80, 0x00, 0x84, 0x00, 0x84, 0x00, 0x89, 0x00, 0x89, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x95, 0x00, 0x95, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x95, 0x00, 0x95, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x82, 0x00, 0x82, 0x00, 0x72, 0x00, 0x72, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x47, 0x00, 0x47, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x15, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xff, 0xec, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0x95, 0xff, 0x95, 0xff, 0x84, 0xff, 0x84, 0xff, 0x75, 0xff, 0x75, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x64, 0xff, 0x64, 0xff, 0x60, 0xff, 0x60, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x54, 0xff, 0x54, 0xff, 0x50, 0xff, 0x50, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x46, 0xff, 0x46, 0xff, 0x43, 0xff, 0x43, 0xff, 0x43, 0xff, 0x43, 0xff, 0x49, 0xff, 0x49, 0xff, 0x53, 0xff, 0x53, 0xff, 0x60, 0xff, 0x60, 0xff, 0x71, 0xff, 0x71, 0xff, 0x89, 0xff, 0x89, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x24, 0x00, 0x24, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x77, 0x00, 0x77, 0x00, 0x99, 0x00, 0x99, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0xe7, 0x00, 0xe7, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xff, 0x00, 0xff, 0x00, 0x05, 0x01, 0x05, 0x01, 0x09, 0x01, 0x09, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0x09, 0x01, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0xf6, 0x00, 0xf6, 0x00, 0xe6, 0x00, 0xe6, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0x89, 0x00, 0x89, 0x00, 0x59, 0x00, 0x59, 0x00, 0x21, 0x00, 0x21, 0x00, 0xe5, 0xff, 0xe5, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x69, 0xff, 0x69, 0xff, 0x2c, 0xff, 0x2c, 0xff, 0xf3, 0xfe, 0xf3, 0xfe, 0xbd, 0xfe, 0xbd, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x69, 0xfe, 0x69, 0xfe, 0x4d, 0xfe, 0x4d, 0xfe, 0x3f, 0xfe, 0x3f, 0xfe, 0x3c, 0xfe, 0x3c, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0x52, 0xfe, 0x52, 0xfe, 0x6a, 0xfe, 0x6a, 0xfe, 0x89, 0xfe, 0x89, 0xfe, 0xb1, 0xfe, 0xb1, 0xfe, 0xe2, 0xfe, 0xe2, 0xfe, 0x17, 0xff, 0x17, 0xff, 0x53, 0xff, 0x53, 0xff, 0x94, 0xff, 0x94, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0x1b, 0x00, 0x1b, 0x00, 0x60, 0x00, 0x60, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xee, 0x00, 0xee, 0x00, 0x31, 0x01, 0x31, 0x01, 0x70, 0x01, 0x70, 0x01, 0xac, 0x01, 0xac, 0x01, 0xe5, 0x01, 0xe5, 0x01, 0x17, 0x02, 0x17, 0x02, 0x3c, 0x02, 0x3c, 0x02, 0x53, 0x02, 0x53, 0x02, 0x5d, 0x02, 0x5d, 0x02, 0x57, 0x02, 0x57, 0x02, 0x41, 0x02, 0x41, 0x02, 0x1c, 0x02, 0x1c, 0x02, 0xe9, 0x01, 0xe9, 0x01, 0xa8, 0x01, 0xa8, 0x01, 0x5b, 0x01, 0x5b, 0x01, 0x03, 0x01, 0x03, 0x01, 0xa4, 0x00, 0xa4, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0xd8, 0xff, 0xd8, 0xff, 0x71, 0xff, 0x71, 0xff, 0x0e, 0xff, 0x0e, 0xff, 0xb0, 0xfe, 0xb0, 0xfe, 0x5a, 0xfe, 0x5a, 0xfe, 0x0c, 0xfe, 0x0c, 0xfe, 0xcd, 0xfd, 0xcd, 0xfd, 0x9f, 0xfd, 0x9f, 0xfd, 0x7f, 0xfd, 0x7f, 0xfd, 0x71, 0xfd, 0x71, 0xfd, 0x73, 0xfd, 0x73, 0xfd, 0x82, 0xfd, 0x82, 0xfd, 0x9e, 0xfd, 0x9e, 0xfd, 0xc7, 0xfd, 0xc7, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0x42, 0xfe, 0x42, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0xe2, 0xfe, 0xe2, 0xfe, 0x3b, 0xff, 0x3b, 0xff, 0x98, 0xff, 0x98, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x59, 0x00, 0x59, 0x00, 0xba, 0x00, 0xba, 0x00, 0x1a, 0x01, 0x1a, 0x01, 0x74, 0x01, 0x74, 0x01, 0xc6, 0x01, 0xc6, 0x01, 0x0d, 0x02, 0x0d, 0x02, 0x48, 0x02, 0x48, 0x02, 0x78, 0x02, 0x78, 0x02, 0x98, 0x02, 0x98, 0x02, 0xa9, 0x02, 0xa9, 0x02, 0xa9, 0x02, 0xa9, 0x02, 0x9b, 0x02, 0x9b, 0x02, 0x7d, 0x02, 0x7d, 0x02, 0x4f, 0x02, 0x4f, 0x02, 0x10, 0x02, 0x10, 0x02, 0xc3, 0x01, 0xc3, 0x01, 0x6d, 0x01, 0x6d, 0x01, 0x12, 0x01, 0x12, 0x01, 0xb2, 0x00, 0xb2, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0xe5, 0xff, 0xe5, 0xff, 0x84, 0xff, 0x84, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0xd6, 0xfe, 0xd6, 0xfe, 0x8a, 0xfe, 0x8a, 0xfe, 0x49, 0xfe, 0x49, 0xfe, 0x15, 0xfe, 0x15, 0xfe, 0xef, 0xfd, 0xef, 0xfd, 0xd6, 0xfd, 0xd6, 0xfd, 0xca, 0xfd, 0xca, 0xfd, 0xc9, 0xfd, 0xc9, 0xfd, 0xd4, 0xfd, 0xd4, 0xfd, 0xe6, 0xfd, 0xe6, 0xfd, 0x03, 0xfe, 0x03, 0xfe, 0x29, 0xfe, 0x29, 0xfe, 0x57, 0xfe, 0x57, 0xfe, 0x8d, 0xfe, 0x8d, 0xfe, 0xc8, 0xfe, 0xc8, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x46, 0xff, 0x46, 0xff, 0x87, 0xff, 0x87, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0x07, 0x00, 0x07, 0x00, 0x41, 0x00, 0x41, 0x00, 0x77, 0x00, 0x77, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xed, 0x00, 0xed, 0x00, 0x03, 0x01, 0x03, 0x01, 0x10, 0x01, 0x10, 0x01, 0x15, 0x01, 0x15, 0x01, 0x13, 0x01, 0x13, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0xfb, 0x00, 0xfb, 0x00, 0xe6, 0x00, 0xe6, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0x94, 0x00, 0x94, 0x00, 0x78, 0x00, 0x78, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x37, 0x00, 0x37, 0x00, 0x35, 0x00, 0x35, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x71, 0x00, 0x71, 0x00, 0x85, 0x00, 0x85, 0x00, 0x97, 0x00, 0x97, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xca, 0x00, 0xca, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x99, 0x00, 0x99, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x58, 0x00, 0x58, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0x86, 0xff, 0x86, 0xff, 0x47, 0xff, 0x47, 0xff, 0x06, 0xff, 0x06, 0xff, 0xc6, 0xfe, 0xc6, 0xfe, 0x88, 0xfe, 0x88, 0xfe, 0x51, 0xfe, 0x51, 0xfe, 0x23, 0xfe, 0x23, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xe5, 0xfd, 0xe5, 0xfd, 0xd6, 0xfd, 0xd6, 0xfd, 0xd4, 0xfd, 0xd4, 0xfd, 0xdd, 0xfd, 0xdd, 0xfd, 0xf5, 0xfd, 0xf5, 0xfd, 0x18, 0xfe, 0x18, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x7d, 0xfe, 0x7d, 0xfe, 0xba, 0xfe, 0xba, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x43, 0xff, 0x43, 0xff, 0x87, 0xff, 0x87, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x51, 0x00, 0x51, 0x00, 0x90, 0x00, 0x90, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x26, 0x01, 0x26, 0x01, 0x4c, 0x01, 0x4c, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0x83, 0x01, 0x83, 0x01, 0x91, 0x01, 0x91, 0x01, 0x95, 0x01, 0x95, 0x01, 0x90, 0x01, 0x90, 0x01, 0x84, 0x01, 0x84, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x52, 0x01, 0x52, 0x01, 0x2f, 0x01, 0x2f, 0x01, 0x08, 0x01, 0x08, 0x01, 0xde, 0x00, 0xde, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0x81, 0x00, 0x81, 0x00, 0x54, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xef, 0xff, 0xef, 0xff, 0xda, 0xff, 0xda, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x29, 0x00, 0x29, 0x00, 0x31, 0x00, 0x31, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x24, 0x00, 0x24, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0xea, 0xff, 0xea, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0x85, 0xff, 0x85, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x38, 0xff, 0x38, 0xff, 0x13, 0xff, 0x13, 0xff, 0xef, 0xfe, 0xef, 0xfe, 0xcc, 0xfe, 0xcc, 0xfe, 0xac, 0xfe, 0xac, 0xfe, 0x91, 0xfe, 0x91, 0xfe, 0x7a, 0xfe, 0x7a, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x59, 0xfe, 0x59, 0xfe, 0x54, 0xfe, 0x54, 0xfe, 0x55, 0xfe, 0x55, 0xfe, 0x60, 0xfe, 0x60, 0xfe, 0x76, 0xfe, 0x76, 0xfe, 0x96, 0xfe, 0x96, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe, 0x2b, 0xff, 0x2b, 0xff, 0x70, 0xff, 0x70, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x08, 0x01, 0x08, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0xa7, 0x01, 0xa7, 0x01, 0xec, 0x01, 0xec, 0x01, 0x27, 0x02, 0x27, 0x02, 0x57, 0x02, 0x57, 0x02, 0x7e, 0x02, 0x7e, 0x02, 0x9a, 0x02, 0x9a, 0x02, 0xa8, 0x02, 0xa8, 0x02, 0xa8, 0x02, 0xa8, 0x02, 0x99, 0x02, 0x99, 0x02, 0x7c, 0x02, 0x7c, 0x02, 0x52, 0x02, 0x52, 0x02, 0x1a, 0x02, 0x1a, 0x02, 0xdb, 0x01, 0xdb, 0x01, 0x95, 0x01, 0x95, 0x01, 0x49, 0x01, 0x49, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x47, 0xff, 0x47, 0xff, 0xf9, 0xfe, 0xf9, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0x6b, 0xfe, 0x6b, 0xfe, 0x2d, 0xfe, 0x2d, 0xfe, 0xf4, 0xfd, 0xf4, 0xfd, 0xc3, 0xfd, 0xc3, 0xfd, 0x9d, 0xfd, 0x9d, 0xfd, 0x86, 0xfd, 0x86, 0xfd, 0x7c, 0xfd, 0x7c, 0xfd, 0x7c, 0xfd, 0x7c, 0xfd, 0x89, 0xfd, 0x89, 0xfd, 0xa2, 0xfd, 0xa2, 0xfd, 0xc7, 0xfd, 0xc7, 0xfd, 0xf7, 0xfd, 0xf7, 0xfd, 0x30, 0xfe, 0x30, 0xfe, 0x72, 0xfe, 0x72, 0xfe, 0xb8, 0xfe, 0xb8, 0xfe, 0x00, 0xff, 0x00, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x96, 0xff, 0x96, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0x30, 0x00, 0x30, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0x12, 0x01, 0x12, 0x01, 0x50, 0x01, 0x50, 0x01, 0x86, 0x01, 0x86, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0x02, 0x02, 0x02, 0x02, 0x1d, 0x02, 0x1d, 0x02, 0x2d, 0x02, 0x2d, 0x02, 0x34, 0x02, 0x34, 0x02, 0x2f, 0x02, 0x2f, 0x02, 0x21, 0x02, 0x21, 0x02, 0x0b, 0x02, 0x0b, 0x02, 0xec, 0x01, 0xec, 0x01, 0xc4, 0x01, 0xc4, 0x01, 0x98, 0x01, 0x98, 0x01, 0x67, 0x01, 0x67, 0x01, 0x30, 0x01, 0x30, 0x01, 0xf3, 0x00, 0xf3, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x70, 0x00, 0x70, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0xee, 0xff, 0xee, 0xff, 0xac, 0xff, 0xac, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x28, 0xff, 0x28, 0xff, 0xe8, 0xfe, 0xe8, 0xfe, 0xad, 0xfe, 0xad, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x1b, 0xfe, 0x1b, 0xfe, 0xf9, 0xfd, 0xf9, 0xfd, 0xde, 0xfd, 0xde, 0xfd, 0xca, 0xfd, 0xca, 0xfd, 0xc2, 0xfd, 0xc2, 0xfd, 0xc5, 0xfd, 0xc5, 0xfd, 0xd6, 0xfd, 0xd6, 0xfd, 0xf3, 0xfd, 0xf3, 0xfd, 0x19, 0xfe, 0x19, 0xfe, 0x48, 0xfe, 0x48, 0xfe, 0x81, 0xfe, 0x81, 0xfe, 0xc4, 0xfe, 0xc4, 0xfe, 0x10, 0xff, 0x10, 0xff, 0x65, 0xff, 0x65, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0x1b, 0x00, 0x1b, 0x00, 0x78, 0x00, 0x78, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x27, 0x01, 0x27, 0x01, 0x78, 0x01, 0x78, 0x01, 0xc2, 0x01, 0xc2, 0x01, 0x04, 0x02, 0x04, 0x02, 0x3d, 0x02, 0x3d, 0x02, 0x6a, 0x02, 0x6a, 0x02, 0x8c, 0x02, 0x8c, 0x02, 0xa4, 0x02, 0xa4, 0x02, 0xb3, 0x02, 0xb3, 0x02, 0xb9, 0x02, 0xb9, 0x02, 0xb5, 0x02, 0xb5, 0x02, 0xa5, 0x02, 0xa5, 0x02, 0x88, 0x02, 0x88, 0x02, 0x61, 0x02, 0x61, 0x02, 0x2e, 0x02, 0x2e, 0x02, 0xf0, 0x01, 0xf0, 0x01, 0xa7, 0x01, 0xa7, 0x01, 0x55, 0x01, 0x55, 0x01, 0xfc, 0x00, 0xfc, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x35, 0x00, 0x35, 0x00, 0xc9, 0xff, 0xc9, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0xf1, 0xfe, 0xf1, 0xfe, 0x89, 0xfe, 0x89, 0xfe, 0x28, 0xfe, 0x28, 0xfe, 0xd1, 0xfd, 0xd1, 0xfd, 0x89, 0xfd, 0x89, 0xfd, 0x4f, 0xfd, 0x4f, 0xfd, 0x24, 0xfd, 0x24, 0xfd, 0x08, 0xfd, 0x08, 0xfd, 0xfb, 0xfc, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0x0b, 0xfd, 0x0b, 0xfd, 0x29, 0xfd, 0x29, 0xfd, 0x53, 0xfd, 0x53, 0xfd, 0x89, 0xfd, 0x89, 0xfd, 0xc9, 0xfd, 0xc9, 0xfd, 0x10, 0xfe, 0x10, 0xfe, 0x5c, 0xfe, 0x5c, 0xfe, 0xae, 0xfe, 0xae, 0xfe, 0x01, 0xff, 0x01, 0xff, 0x55, 0xff, 0x55, 0xff, 0xad, 0xff, 0xad, 0xff, 0x07, 0x00, 0x07, 0x00, 0x60, 0x00, 0x60, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0x0b, 0x01, 0x0b, 0x01, 0x5b, 0x01, 0x5b, 0x01, 0xa5, 0x01, 0xa5, 0x01, 0xe6, 0x01, 0xe6, 0x01, 0x1f, 0x02, 0x1f, 0x02, 0x4d, 0x02, 0x4d, 0x02, 0x6f, 0x02, 0x6f, 0x02, 0x85, 0x02, 0x85, 0x02, 0x8e, 0x02, 0x8e, 0x02, 0x89, 0x02, 0x89, 0x02, 0x76, 0x02, 0x76, 0x02, 0x55, 0x02, 0x55, 0x02, 0x28, 0x02, 0x28, 0x02, 0xf2, 0x01, 0xf2, 0x01, 0xb1, 0x01, 0xb1, 0x01, 0x68, 0x01, 0x68, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0xcd, 0x00, 0xcd, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0xe5, 0xff, 0xe5, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x28, 0xff, 0x28, 0xff, 0xf7, 0xfe, 0xf7, 0xfe, 0xce, 0xfe, 0xce, 0xfe, 0xab, 0xfe, 0xab, 0xfe, 0x90, 0xfe, 0x90, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0x73, 0xfe, 0x73, 0xfe, 0x6f, 0xfe, 0x6f, 0xfe, 0x71, 0xfe, 0x71, 0xfe, 0x7b, 0xfe, 0x7b, 0xfe, 0x8b, 0xfe, 0x8b, 0xfe, 0xa0, 0xfe, 0xa0, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xec, 0xff, 0xec, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xed, 0x00, 0xed, 0x00, 0x00, 0x01, 0x00, 0x01, 0x08, 0x01, 0x08, 0x01, 0x06, 0x01, 0x06, 0x01, 0xfa, 0x00, 0xfa, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x81, 0x00, 0x81, 0x00, 0x59, 0x00, 0x59, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x05, 0x00, 0x05, 0x00, 0xdf, 0xff, 0xdf, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x87, 0xff, 0x87, 0xff, 0x76, 0xff, 0x76, 0xff, 0x68, 0xff, 0x68, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x53, 0xff, 0x53, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x50, 0xff, 0x50, 0xff, 0x56, 0xff, 0x56, 0xff, 0x60, 0xff, 0x60, 0xff, 0x6d, 0xff, 0x6d, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x95, 0xff, 0x95, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x1e, 0x00, 0x1e, 0x00, 0x49, 0x00, 0x49, 0x00, 0x76, 0x00, 0x76, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0x00, 0x01, 0x00, 0x01, 0x0e, 0x01, 0x0e, 0x01, 0x11, 0x01, 0x11, 0x01, 0x07, 0x01, 0x07, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xce, 0x00, 0xce, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x17, 0x00, 0x17, 0x00, 0xe1, 0xff, 0xe1, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x84, 0xff, 0x84, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x40, 0xff, 0x40, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x18, 0xff, 0x18, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0x03, 0xff, 0x03, 0xff, 0x02, 0xff, 0x02, 0xff, 0x07, 0xff, 0x07, 0xff, 0x10, 0xff, 0x10, 0xff, 0x20, 0xff, 0x20, 0xff, 0x36, 0xff, 0x36, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0x16, 0x00, 0x16, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x17, 0x01, 0x17, 0x01, 0x2d, 0x01, 0x2d, 0x01, 0x38, 0x01, 0x38, 0x01, 0x38, 0x01, 0x38, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x12, 0x01, 0x12, 0x01, 0xef, 0x00, 0xef, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x51, 0x00, 0x51, 0x00, 0x18, 0x00, 0x18, 0x00, 0xe1, 0xff, 0xe1, 0xff, 0xad, 0xff, 0xad, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x55, 0xff, 0x55, 0xff, 0x34, 0xff, 0x34, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x0d, 0xff, 0x0d, 0xff, 0x09, 0xff, 0x09, 0xff, 0x0a, 0xff, 0x0a, 0xff, 0x11, 0xff, 0x11, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x30, 0xff, 0x30, 0xff, 0x49, 0xff, 0x49, 0xff, 0x65, 0xff, 0x65, 0xff, 0x85, 0xff, 0x85, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x28, 0x00, 0x28, 0x00, 0x58, 0x00, 0x58, 0x00, 0x89, 0x00, 0x89, 0x00, 0xba, 0x00, 0xba, 0x00, 0xe7, 0x00, 0xe7, 0x00, 0x11, 0x01, 0x11, 0x01, 0x35, 0x01, 0x35, 0x01, 0x50, 0x01, 0x50, 0x01, 0x61, 0x01, 0x61, 0x01, 0x66, 0x01, 0x66, 0x01, 0x60, 0x01, 0x60, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x27, 0x01, 0x27, 0x01, 0xf9, 0x00, 0xf9, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x85, 0x00, 0x85, 0x00, 0x44, 0x00, 0x44, 0x00, 0x03, 0x00, 0x03, 0x00, 0xc3, 0xff, 0xc3, 0xff, 0x86, 0xff, 0x86, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0xf5, 0xfe, 0xf5, 0xfe, 0xcf, 0xfe, 0xcf, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0x86, 0xfe, 0x86, 0xfe, 0x7c, 0xfe, 0x7c, 0xfe, 0x79, 0xfe, 0x79, 0xfe, 0x7d, 0xfe, 0x7d, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0xaf, 0xfe, 0xaf, 0xfe, 0xcf, 0xfe, 0xcf, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0x24, 0xff, 0x24, 0xff, 0x58, 0xff, 0x58, 0xff, 0x92, 0xff, 0x92, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x48, 0x00, 0x48, 0x00, 0x82, 0x00, 0x82, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xe7, 0x00, 0xe7, 0x00, 0x11, 0x01, 0x11, 0x01, 0x31, 0x01, 0x31, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0x5c, 0x01, 0x5c, 0x01, 0x64, 0x01, 0x64, 0x01, 0x65, 0x01, 0x65, 0x01, 0x60, 0x01, 0x60, 0x01, 0x57, 0x01, 0x57, 0x01, 0x45, 0x01, 0x45, 0x01, 0x2b, 0x01, 0x2b, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0xe6, 0x00, 0xe6, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x98, 0x00, 0x98, 0x00, 0x71, 0x00, 0x71, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x25, 0x00, 0x25, 0x00, 0x02, 0x00, 0x02, 0x00, 0xe2, 0xff, 0xe2, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xac, 0xff, 0xac, 0xff, 0x98, 0xff, 0x98, 0xff, 0x88, 0xff, 0x88, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0x71, 0xff, 0x71, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x68, 0xff, 0x68, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x72, 0xff, 0x72, 0xff, 0x79, 0xff, 0x79, 0xff, 0x81, 0xff, 0x81, 0xff, 0x89, 0xff, 0x89, 0xff, 0x91, 0xff, 0x91, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xad, 0xff, 0xad, 0xff, 0xae, 0xff, 0xae, 0xff, 0xac, 0xff, 0xac, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x93, 0xff, 0x93, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x89, 0xff, 0x89, 0xff, 0x88, 0xff, 0x88, 0xff, 0x87, 0xff, 0x87, 0xff, 0x89, 0xff, 0x89, 0xff, 0x90, 0xff, 0x90, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x10, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x42, 0x00, 0x42, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xde, 0x00, 0xde, 0x00, 0x00, 0x01, 0x00, 0x01, 0x1e, 0x01, 0x1e, 0x01, 0x36, 0x01, 0x36, 0x01, 0x48, 0x01, 0x48, 0x01, 0x54, 0x01, 0x54, 0x01, 0x59, 0x01, 0x59, 0x01, 0x54, 0x01, 0x54, 0x01, 0x45, 0x01, 0x45, 0x01, 0x2d, 0x01, 0x2d, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0xe4, 0x00, 0xe4, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x44, 0x00, 0x44, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xd3, 0xff, 0xd3, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x12, 0xff, 0x12, 0xff, 0xee, 0xfe, 0xee, 0xfe, 0xce, 0xfe, 0xce, 0xfe, 0xb2, 0xfe, 0xb2, 0xfe, 0x99, 0xfe, 0x99, 0xfe, 0x86, 0xfe, 0x86, 0xfe, 0x7a, 0xfe, 0x7a, 0xfe, 0x72, 0xfe, 0x72, 0xfe, 0x71, 0xfe, 0x71, 0xfe, 0x7a, 0xfe, 0x7a, 0xfe, 0x8c, 0xfe, 0x8c, 0xfe, 0xa6, 0xfe, 0xa6, 0xfe, 0xc9, 0xfe, 0xc9, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe, 0x1e, 0xff, 0x1e, 0xff, 0x54, 0xff, 0x54, 0xff, 0x91, 0xff, 0x91, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0x19, 0x00, 0x19, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0xd9, 0x00, 0xd9, 0x00, 0x10, 0x01, 0x10, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x62, 0x01, 0x62, 0x01, 0x7b, 0x01, 0x7b, 0x01, 0x89, 0x01, 0x89, 0x01, 0x8d, 0x01, 0x8d, 0x01, 0x88, 0x01, 0x88, 0x01, 0x7f, 0x01, 0x7f, 0x01, 0x70, 0x01, 0x70, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x1e, 0x01, 0x1e, 0x01, 0xfa, 0x00, 0xfa, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0xab, 0x00, 0xab, 0x00, 0x81, 0x00, 0x81, 0x00, 0x54, 0x00, 0x54, 0x00, 0x23, 0x00, 0x23, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xba, 0xff, 0xba, 0xff, 0x83, 0xff, 0x83, 0xff, 0x50, 0xff, 0x50, 0xff, 0x23, 0xff, 0x23, 0xff, 0xfd, 0xfe, 0xfd, 0xfe, 0xda, 0xfe, 0xda, 0xfe, 0xbd, 0xfe, 0xbd, 0xfe, 0xa7, 0xfe, 0xa7, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0x8f, 0xfe, 0x8f, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x95, 0xfe, 0x95, 0xfe, 0xa3, 0xfe, 0xa3, 0xfe, 0xb8, 0xfe, 0xb8, 0xfe, 0xd3, 0xfe, 0xd3, 0xfe, 0xf3, 0xfe, 0xf3, 0xfe, 0x18, 0xff, 0x18, 0xff, 0x40, 0xff, 0x40, 0xff, 0x69, 0xff, 0x69, 0xff, 0x92, 0xff, 0x92, 0xff, 0xba, 0xff, 0xba, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x33, 0x00, 0x33, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x82, 0x00, 0x82, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0xec, 0x00, 0xec, 0x00, 0x07, 0x01, 0x07, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x30, 0x01, 0x30, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x47, 0x01, 0x47, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0x47, 0x01, 0x47, 0x01, 0x38, 0x01, 0x38, 0x01, 0x20, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0xba, 0x00, 0xba, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x60, 0x00, 0x60, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xca, 0xff, 0xca, 0xff, 0x99, 0xff, 0x99, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x42, 0xff, 0x42, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0xfb, 0xfe, 0xfb, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xcd, 0xfe, 0xcd, 0xfe, 0xc2, 0xfe, 0xc2, 0xfe, 0xbe, 0xfe, 0xbe, 0xfe, 0xc2, 0xfe, 0xc2, 0xfe, 0xcf, 0xfe, 0xcf, 0xfe, 0xe3, 0xfe, 0xe3, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0x21, 0xff, 0x21, 0xff, 0x48, 0xff, 0x48, 0xff, 0x73, 0xff, 0x73, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0x09, 0x00, 0x09, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x21, 0x01, 0x21, 0x01, 0x41, 0x01, 0x41, 0x01, 0x5a, 0x01, 0x5a, 0x01, 0x6b, 0x01, 0x6b, 0x01, 0x74, 0x01, 0x74, 0x01, 0x75, 0x01, 0x75, 0x01, 0x6c, 0x01, 0x6c, 0x01, 0x57, 0x01, 0x57, 0x01, 0x36, 0x01, 0x36, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0xda, 0x00, 0xda, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0xda, 0xff, 0xda, 0xff, 0x92, 0xff, 0x92, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0x06, 0xff, 0x06, 0xff, 0xcc, 0xfe, 0xcc, 0xfe, 0x97, 0xfe, 0x97, 0xfe, 0x6b, 0xfe, 0x6b, 0xfe, 0x49, 0xfe, 0x49, 0xfe, 0x33, 0xfe, 0x33, 0xfe, 0x2a, 0xfe, 0x2a, 0xfe, 0x2b, 0xfe, 0x2b, 0xfe, 0x39, 0xfe, 0x39, 0xfe, 0x54, 0xfe, 0x54, 0xfe, 0x7e, 0xfe, 0x7e, 0xfe, 0xb2, 0xfe, 0xb2, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe, 0x34, 0xff, 0x34, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0xba, 0x00, 0xba, 0x00, 0x03, 0x01, 0x03, 0x01, 0x45, 0x01, 0x45, 0x01, 0x80, 0x01, 0x80, 0x01, 0xb4, 0x01, 0xb4, 0x01, 0xdd, 0x01, 0xdd, 0x01, 0xfb, 0x01, 0xfb, 0x01, 0x0c, 0x02, 0x0c, 0x02, 0x10, 0x02, 0x10, 0x02, 0x07, 0x02, 0x07, 0x02, 0xf2, 0x01, 0xf2, 0x01, 0xd1, 0x01, 0xd1, 0x01, 0xa4, 0x01, 0xa4, 0x01, 0x6e, 0x01, 0x6e, 0x01, 0x2d, 0x01, 0x2d, 0x01, 0xe4, 0x00, 0xe4, 0x00, 0x94, 0x00, 0x94, 0x00, 0x40, 0x00, 0x40, 0x00, 0xeb, 0xff, 0xeb, 0xff, 0x96, 0xff, 0x96, 0xff, 0x44, 0xff, 0x44, 0xff, 0xf6, 0xfe, 0xf6, 0xfe, 0xac, 0xfe, 0xac, 0xfe, 0x6a, 0xfe, 0x6a, 0xfe, 0x33, 0xfe, 0x33, 0xfe, 0x09, 0xfe, 0x09, 0xfe, 0xeb, 0xfd, 0xeb, 0xfd, 0xda, 0xfd, 0xda, 0xfd, 0xd6, 0xfd, 0xd6, 0xfd, 0xe0, 0xfd, 0xe0, 0xfd, 0xf6, 0xfd, 0xf6, 0xfd, 0x1b, 0xfe, 0x1b, 0xfe, 0x4e, 0xfe, 0x4e, 0xfe, 0x8b, 0xfe, 0x8b, 0xfe, 0xd0, 0xfe, 0xd0, 0xfe, 0x17, 0xff, 0x17, 0xff, 0x62, 0xff, 0x62, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4a, 0x00, 0x4a, 0x00, 0x91, 0x00, 0x91, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0x0c, 0x01, 0x0c, 0x01, 0x3c, 0x01, 0x3c, 0x01, 0x61, 0x01, 0x61, 0x01, 0x7f, 0x01, 0x7f, 0x01, 0x94, 0x01, 0x94, 0x01, 0x9e, 0x01, 0x9e, 0x01, 0xa2, 0x01, 0xa2, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0x92, 0x01, 0x92, 0x01, 0x7a, 0x01, 0x7a, 0x01, 0x59, 0x01, 0x59, 0x01, 0x31, 0x01, 0x31, 0x01, 0x05, 0x01, 0x05, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x39, 0x00, 0x39, 0x00, 0x05, 0x00, 0x05, 0x00, 0xd3, 0xff, 0xd3, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0x80, 0xff, 0x80, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x43, 0xff, 0x43, 0xff, 0x32, 0xff, 0x32, 0xff, 0x29, 0xff, 0x29, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x31, 0xff, 0x31, 0xff, 0x41, 0xff, 0x41, 0xff, 0x56, 0xff, 0x56, 0xff, 0x71, 0xff, 0x71, 0xff, 0x91, 0xff, 0x91, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x16, 0x00, 0x16, 0x00, 0x34, 0x00, 0x34, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x62, 0x00, 0x62, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x74, 0x00, 0x73, 0x00, 0x73, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x65, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x51, 0x00, 0x51, 0x00, 0x40, 0x00, 0x40, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x16, 0x00, 0x16, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x92, 0xff, 0x92, 0xff, 0x74, 0xff, 0x74, 0xff, 0x57, 0xff, 0x57, 0xff, 0x40, 0xff, 0x40, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x14, 0xff, 0x14, 0xff, 0x10, 0xff, 0x10, 0xff, 0x15, 0xff, 0x15, 0xff, 0x22, 0xff, 0x22, 0xff, 0x37, 0xff, 0x37, 0xff, 0x53, 0xff, 0x53, 0xff, 0x74, 0xff, 0x74, 0xff, 0x98, 0xff, 0x98, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0x15, 0x00, 0x15, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x64, 0x00, 0x64, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x19, 0x01, 0x19, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x3c, 0x01, 0x3c, 0x01, 0x47, 0x01, 0x47, 0x01, 0x4e, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x4b, 0x01, 0x4b, 0x01, 0x40, 0x01, 0x40, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x16, 0x01, 0x16, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0xad, 0x00, 0xad, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x14, 0x00, 0x14, 0x00, 0xdf, 0xff, 0xdf, 0xff, 0xab, 0xff, 0xab, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x4c, 0xff, 0x4c, 0xff, 0x21, 0xff, 0x21, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xc7, 0xfe, 0xc7, 0xfe, 0xb2, 0xfe, 0xb2, 0xfe, 0xa4, 0xfe, 0xa4, 0xfe, 0x9f, 0xfe, 0x9f, 0xfe, 0xa4, 0xfe, 0xa4, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0xc0, 0xfe, 0xc0, 0xfe, 0xd3, 0xfe, 0xd3, 0xfe, 0xe8, 0xfe, 0xe8, 0xfe, 0x02, 0xff, 0x02, 0xff, 0x22, 0xff, 0x22, 0xff, 0x43, 0xff, 0x43, 0xff, 0x66, 0xff, 0x66, 0xff, 0x88, 0xff, 0x88, 0xff, 0xab, 0xff, 0xab, 0xff, 0xce, 0xff, 0xce, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0x14, 0x00, 0x14, 0x00, 0x36, 0x00, 0x36, 0x00, 0x53, 0x00, 0x53, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x87, 0x00, 0x87, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0x92, 0x00, 0x92, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x57, 0x00, 0x57, 0x00, 0x44, 0x00, 0x44, 0x00, 0x34, 0x00, 0x34, 0x00, 0x28, 0x00, 0x28, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x18, 0x00, 0x18, 0x00, 0x15, 0x00, 0x15, 0x00, 0x16, 0x00, 0x16, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x19, 0x00, 0x19, 0x00, 0x17, 0x00, 0x17, 0x00, 0x11, 0x00, 0x11, 0x00, 0x09, 0x00, 0x09, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xad, 0xff, 0xad, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xae, 0xff, 0xae, 0xff, 0xae, 0xff, 0xae, 0xff, 0xad, 0xff, 0xad, 0xff, 0xab, 0xff, 0xab, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xac, 0xff, 0xac, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xee, 0xff, 0xee, 0xff, 0x05, 0x00, 0x05, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x77, 0x00, 0x77, 0x00, 0x90, 0x00, 0x90, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x74, 0x00, 0x74, 0x00, 0x57, 0x00, 0x57, 0x00, 0x35, 0x00, 0x35, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xe6, 0xff, 0xe6, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x62, 0xff, 0x62, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x35, 0xff, 0x35, 0xff, 0x23, 0xff, 0x23, 0xff, 0x14, 0xff, 0x14, 0xff, 0x07, 0xff, 0x07, 0xff, 0xfc, 0xfe, 0xfc, 0xfe, 0xf3, 0xfe, 0xf3, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xf5, 0xfe, 0xf5, 0xfe, 0x03, 0xff, 0x03, 0xff, 0x17, 0xff, 0x17, 0xff, 0x33, 0xff, 0x33, 0xff, 0x54, 0xff, 0x54, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0x23, 0x00, 0x23, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x92, 0x00, 0x92, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0xf2, 0x00, 0xf2, 0x00, 0x1b, 0x01, 0x1b, 0x01, 0x39, 0x01, 0x39, 0x01, 0x4c, 0x01, 0x4c, 0x01, 0x56, 0x01, 0x56, 0x01, 0x58, 0x01, 0x58, 0x01, 0x55, 0x01, 0x55, 0x01, 0x4c, 0x01, 0x4c, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x17, 0x01, 0x17, 0x01, 0xfc, 0x00, 0xfc, 0x00, 0xda, 0x00, 0xda, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x88, 0x00, 0x88, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x27, 0x00, 0x27, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x58, 0xff, 0x58, 0xff, 0x28, 0xff, 0x28, 0xff, 0xfd, 0xfe, 0xfd, 0xfe, 0xd9, 0xfe, 0xd9, 0xfe, 0xbf, 0xfe, 0xbf, 0xfe, 0xb0, 0xfe, 0xb0, 0xfe, 0xae, 0xfe, 0xae, 0xfe, 0xb5, 0xfe, 0xb5, 0xfe, 0xc3, 0xfe, 0xc3, 0xfe, 0xd9, 0xfe, 0xd9, 0xfe, 0xfb, 0xfe, 0xfb, 0xfe, 0x24, 0xff, 0x24, 0xff, 0x53, 0xff, 0x53, 0xff, 0x86, 0xff, 0x86, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x2a, 0x00, 0x2a, 0x00, 0x61, 0x00, 0x61, 0x00, 0x94, 0x00, 0x94, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0x09, 0x01, 0x09, 0x01, 0x24, 0x01, 0x24, 0x01, 0x37, 0x01, 0x37, 0x01, 0x41, 0x01, 0x41, 0x01, 0x45, 0x01, 0x45, 0x01, 0x43, 0x01, 0x43, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x30, 0x01, 0x30, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0xff, 0x00, 0xff, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x42, 0x00, 0x42, 0x00, 0x06, 0x00, 0x06, 0x00, 0xc5, 0xff, 0xc5, 0xff, 0x82, 0xff, 0x82, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x03, 0xff, 0x03, 0xff, 0xcf, 0xfe, 0xcf, 0xfe, 0xa3, 0xfe, 0xa3, 0xfe, 0x7d, 0xfe, 0x7d, 0xfe, 0x61, 0xfe, 0x61, 0xfe, 0x4d, 0xfe, 0x4d, 0xfe, 0x44, 0xfe, 0x44, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x54, 0xfe, 0x54, 0xfe, 0x6c, 0xfe, 0x6c, 0xfe, 0x8c, 0xfe, 0x8c, 0xfe, 0xb4, 0xfe, 0xb4, 0xfe, 0xe3, 0xfe, 0xe3, 0xfe, 0x19, 0xff, 0x19, 0xff, 0x53, 0xff, 0x53, 0xff, 0x92, 0xff, 0x92, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0x14, 0x00, 0x14, 0x00, 0x57, 0x00, 0x57, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0xde, 0x00, 0xde, 0x00, 0x1f, 0x01, 0x1f, 0x01, 0x5d, 0x01, 0x5d, 0x01, 0x96, 0x01, 0x96, 0x01, 0xcb, 0x01, 0xcb, 0x01, 0xf9, 0x01, 0xf9, 0x01, 0x1d, 0x02, 0x1d, 0x02, 0x35, 0x02, 0x35, 0x02, 0x41, 0x02, 0x41, 0x02, 0x3f, 0x02, 0x3f, 0x02, 0x30, 0x02, 0x30, 0x02, 0x13, 0x02, 0x13, 0x02, 0xe9, 0x01, 0xe9, 0x01, 0xb3, 0x01, 0xb3, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x24, 0x01, 0x24, 0x01, 0xd2, 0x00, 0xd2, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x29, 0x00, 0x29, 0x00, 0xd5, 0xff, 0xd5, 0xff, 0x84, 0xff, 0x84, 0xff, 0x36, 0xff, 0x36, 0xff, 0xec, 0xfe, 0xec, 0xfe, 0xab, 0xfe, 0xab, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0x4c, 0xfe, 0x4c, 0xfe, 0x2b, 0xfe, 0x2b, 0xfe, 0x12, 0xfe, 0x12, 0xfe, 0x02, 0xfe, 0x02, 0xfe, 0xf9, 0xfd, 0xf9, 0xfd, 0xf6, 0xfd, 0xf6, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0x0b, 0xfe, 0x0b, 0xfe, 0x21, 0xfe, 0x21, 0xfe, 0x40, 0xfe, 0x40, 0xfe, 0x6c, 0xfe, 0x6c, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0x20, 0xff, 0x20, 0xff, 0x67, 0xff, 0x67, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x91, 0x00, 0x91, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0x0a, 0x01, 0x0a, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x67, 0x01, 0x67, 0x01, 0x84, 0x01, 0x84, 0x01, 0x96, 0x01, 0x96, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0x9f, 0x01, 0x95, 0x01, 0x95, 0x01, 0x85, 0x01, 0x85, 0x01, 0x70, 0x01, 0x70, 0x01, 0x54, 0x01, 0x54, 0x01, 0x31, 0x01, 0x31, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x19, 0x00, 0x19, 0x00, 0xe6, 0xff, 0xe6, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0x85, 0xff, 0x85, 0xff, 0x58, 0xff, 0x58, 0xff, 0x2d, 0xff, 0x2d, 0xff, 0x09, 0xff, 0x09, 0xff, 0xed, 0xfe, 0xed, 0xfe, 0xd7, 0xfe, 0xd7, 0xfe, 0xc7, 0xfe, 0xc7, 0xfe, 0xbc, 0xfe, 0xbc, 0xfe, 0xb8, 0xfe, 0xb8, 0xfe, 0xb7, 0xfe, 0xb7, 0xfe, 0xbf, 0xfe, 0xbf, 0xfe, 0xd3, 0xfe, 0xd3, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0x10, 0xff, 0x10, 0xff, 0x35, 0xff, 0x35, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0x24, 0x00, 0x24, 0x00, 0x55, 0x00, 0x55, 0x00, 0x80, 0x00, 0x80, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x0d, 0x01, 0x0d, 0x01, 0x17, 0x01, 0x17, 0x01, 0x19, 0x01, 0x19, 0x01, 0x16, 0x01, 0x16, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0xfd, 0x00, 0xfd, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x90, 0x00, 0x90, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x42, 0x00, 0x42, 0x00, 0x16, 0x00, 0x16, 0x00, 0xe7, 0xff, 0xe7, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x63, 0xff, 0x63, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x01, 0xff, 0x01, 0xff, 0xec, 0xfe, 0xec, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0x01, 0xff, 0x01, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0x3e, 0xff, 0x3e, 0xff, 0x67, 0xff, 0x67, 0xff, 0x95, 0xff, 0x95, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0x22, 0x00, 0x22, 0x00, 0x53, 0x00, 0x53, 0x00, 0x84, 0x00, 0x84, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xde, 0x00, 0xde, 0x00, 0x03, 0x01, 0x03, 0x01, 0x21, 0x01, 0x21, 0x01, 0x36, 0x01, 0x36, 0x01, 0x41, 0x01, 0x41, 0x01, 0x44, 0x01, 0x44, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x2b, 0x01, 0x2b, 0x01, 0x11, 0x01, 0x11, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x92, 0x00, 0x92, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0xdd, 0xff, 0xdd, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x65, 0xff, 0x65, 0xff, 0x30, 0xff, 0x30, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xd6, 0xfe, 0xd6, 0xfe, 0xb4, 0xfe, 0xb4, 0xfe, 0x9c, 0xfe, 0x9c, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x8a, 0xfe, 0x8a, 0xfe, 0x8e, 0xfe, 0x8e, 0xfe, 0x9e, 0xfe, 0x9e, 0xfe, 0xb8, 0xfe, 0xb8, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0x0b, 0xff, 0x0b, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0xba, 0xff, 0xba, 0xff, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x46, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x0f, 0x01, 0x0f, 0x01, 0x48, 0x01, 0x48, 0x01, 0x7a, 0x01, 0x7a, 0x01, 0xa5, 0x01, 0xa5, 0x01, 0xc7, 0x01, 0xc7, 0x01, 0xdc, 0x01, 0xdc, 0x01, 0xe5, 0x01, 0xe5, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0xce, 0x01, 0xce, 0x01, 0xaf, 0x01, 0xaf, 0x01, 0x84, 0x01, 0x84, 0x01, 0x4e, 0x01, 0x4e, 0x01, 0x0f, 0x01, 0x0f, 0x01, 0xca, 0x00, 0xca, 0x00, 0x80, 0x00, 0x80, 0x00, 0x31, 0x00, 0x31, 0x00, 0xdf, 0xff, 0xdf, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0xf1, 0xfe, 0xf1, 0xfe, 0xb1, 0xfe, 0xb1, 0xfe, 0x7d, 0xfe, 0x7d, 0xfe, 0x54, 0xfe, 0x54, 0xfe, 0x36, 0xfe, 0x36, 0xfe, 0x25, 0xfe, 0x25, 0xfe, 0x1e, 0xfe, 0x1e, 0xfe, 0x22, 0xfe, 0x22, 0xfe, 0x30, 0xfe, 0x30, 0xfe, 0x4d, 0xfe, 0x4d, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0xa7, 0xfe, 0xa7, 0xfe, 0xdc, 0xfe, 0xdc, 0xfe, 0x14, 0xff, 0x14, 0xff, 0x51, 0xff, 0x51, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0x07, 0x00, 0x07, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0x11, 0x01, 0x11, 0x01, 0x32, 0x01, 0x32, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x59, 0x01, 0x59, 0x01, 0x62, 0x01, 0x62, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x52, 0x01, 0x52, 0x01, 0x39, 0x01, 0x39, 0x01, 0x18, 0x01, 0x18, 0x01, 0xf1, 0x00, 0xf1, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x97, 0x00, 0x97, 0x00, 0x65, 0x00, 0x65, 0x00, 0x33, 0x00, 0x33, 0x00, 0x05, 0x00, 0x05, 0x00, 0xda, 0xff, 0xda, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0x93, 0xff, 0x93, 0xff, 0x79, 0xff, 0x79, 0xff, 0x63, 0xff, 0x63, 0xff, 0x54, 0xff, 0x54, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x48, 0xff, 0x48, 0xff, 0x46, 0xff, 0x46, 0xff, 0x47, 0xff, 0x47, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x74, 0xff, 0x74, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xea, 0xff, 0xea, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x86, 0x00, 0x86, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0xad, 0x00, 0xad, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xab, 0x00, 0xab, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x85, 0x00, 0x85, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xe9, 0xff, 0xe9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0x81, 0xff, 0x81, 0xff, 0x61, 0xff, 0x61, 0xff, 0x43, 0xff, 0x43, 0xff, 0x27, 0xff, 0x27, 0xff, 0x11, 0xff, 0x11, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xf1, 0xfe, 0xf1, 0xfe, 0xe7, 0xfe, 0xe7, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xe1, 0xfe, 0xe1, 0xfe, 0xe9, 0xfe, 0xe9, 0xfe, 0xf9, 0xfe, 0xf9, 0xfe, 0x10, 0xff, 0x10, 0xff, 0x2d, 0xff, 0x2d, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x73, 0xff, 0x73, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0x22, 0x00, 0x22, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x77, 0x00, 0x77, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x12, 0x01, 0x12, 0x01, 0x25, 0x01, 0x25, 0x01, 0x34, 0x01, 0x34, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x43, 0x01, 0x43, 0x01, 0x46, 0x01, 0x46, 0x01, 0x45, 0x01, 0x45, 0x01, 0x40, 0x01, 0x40, 0x01, 0x37, 0x01, 0x37, 0x01, 0x28, 0x01, 0x28, 0x01, 0x14, 0x01, 0x14, 0x01, 0xfb, 0x00, 0xfb, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0x98, 0x00, 0x98, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x43, 0x00, 0x43, 0x00, 0x18, 0x00, 0x18, 0x00, 0xec, 0xff, 0xec, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0x94, 0xff, 0x94, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x45, 0xff, 0x45, 0xff, 0x22, 0xff, 0x22, 0xff, 0x05, 0xff, 0x05, 0xff, 0xec, 0xfe, 0xec, 0xfe, 0xd8, 0xfe, 0xd8, 0xfe, 0xc8, 0xfe, 0xc8, 0xfe, 0xbd, 0xfe, 0xbd, 0xfe, 0xb7, 0xfe, 0xb7, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0xb9, 0xfe, 0xb9, 0xfe, 0xc1, 0xfe, 0xc1, 0xfe, 0xce, 0xfe, 0xce, 0xfe, 0xdd, 0xfe, 0xdd, 0xfe, 0xef, 0xfe, 0xef, 0xfe, 0x06, 0xff, 0x06, 0xff, 0x20, 0xff, 0x20, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x64, 0xff, 0x64, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0x16, 0x00, 0x16, 0x00, 0x47, 0x00, 0x47, 0x00, 0x79, 0x00, 0x79, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x1b, 0x01, 0x1b, 0x01, 0x35, 0x01, 0x35, 0x01, 0x48, 0x01, 0x48, 0x01, 0x52, 0x01, 0x52, 0x01, 0x53, 0x01, 0x53, 0x01, 0x4c, 0x01, 0x4c, 0x01, 0x40, 0x01, 0x40, 0x01, 0x2e, 0x01, 0x2e, 0x01, 0x19, 0x01, 0x19, 0x01, 0x01, 0x01, 0x01, 0x01, 0xe8, 0x00, 0xe8, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0xae, 0x00, 0xae, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x69, 0x00, 0x69, 0x00, 0x46, 0x00, 0x46, 0x00, 0x20, 0x00, 0x20, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x33, 0xff, 0x33, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x0d, 0xff, 0x0d, 0xff, 0x05, 0xff, 0x05, 0xff, 0x03, 0xff, 0x03, 0xff, 0x09, 0xff, 0x09, 0xff, 0x12, 0xff, 0x12, 0xff, 0x1e, 0xff, 0x1e, 0xff, 0x2c, 0xff, 0x2c, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x53, 0xff, 0x53, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x85, 0xff, 0x85, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x37, 0x00, 0x37, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x53, 0x00, 0x53, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x60, 0x00, 0x61, 0x00, 0x61, 0x00, 0x62, 0x00, 0x62, 0x00, 0x62, 0x00, 0x62, 0x00, 0x62, 0x00, 0x62, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x56, 0x00, 0x56, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x52, 0x00, 0x53, 0x00, 0x53, 0x00, 0x50, 0x00, 0x50, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x50, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x46, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xce, 0xff, 0xce, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x81, 0xff, 0x81, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x59, 0xff, 0x59, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x47, 0xff, 0x47, 0xff, 0x45, 0xff, 0x45, 0xff, 0x46, 0xff, 0x46, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x91, 0xff, 0x91, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xda, 0xff, 0xda, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x14, 0x00, 0x14, 0x00, 0x31, 0x00, 0x31, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x68, 0x00, 0x68, 0x00, 0x84, 0x00, 0x84, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0xda, 0x00, 0xda, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xab, 0x00, 0xab, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x45, 0x00, 0x45, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xca, 0xff, 0xca, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x42, 0xff, 0x42, 0xff, 0x2f, 0xff, 0x2f, 0xff, 0x22, 0xff, 0x22, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0x24, 0xff, 0x24, 0xff, 0x34, 0xff, 0x34, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0x64, 0xff, 0x64, 0xff, 0x84, 0xff, 0x84, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xce, 0xff, 0xce, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x43, 0x00, 0x43, 0x00, 0x66, 0x00, 0x66, 0x00, 0x86, 0x00, 0x86, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0xca, 0x00, 0xca, 0x00, 0xbb, 0x00, 0xbb, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x73, 0x00, 0x73, 0x00, 0x56, 0x00, 0x56, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x21, 0x00, 0x21, 0x00, 0x07, 0x00, 0x07, 0x00, 0xed, 0xff, 0xed, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0x96, 0xff, 0x96, 0xff, 0x92, 0xff, 0x92, 0xff, 0x93, 0xff, 0x93, 0xff, 0x99, 0xff, 0x99, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xed, 0xff, 0xed, 0xff, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x29, 0x00, 0x32, 0x00, 0x32, 0x00, 0x36, 0x00, 0x36, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x73, 0xff, 0x73, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x66, 0xff, 0x66, 0xff, 0x69, 0xff, 0x69, 0xff, 0x73, 0xff, 0x73, 0xff, 0x82, 0xff, 0x82, 0xff, 0x95, 0xff, 0x95, 0xff, 0xac, 0xff, 0xac, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d, 0x00, 0x1d, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x54, 0x00, 0x54, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x82, 0x00, 0x82, 0x00, 0x98, 0x00, 0x98, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x70, 0x00, 0x70, 0x00, 0x52, 0x00, 0x52, 0x00, 0x30, 0x00, 0x30, 0x00, 0x08, 0x00, 0x08, 0x00, 0xde, 0xff, 0xde, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0x89, 0xff, 0x89, 0xff, 0x64, 0xff, 0x64, 0xff, 0x46, 0xff, 0x46, 0xff, 0x31, 0xff, 0x31, 0xff, 0x22, 0xff, 0x22, 0xff, 0x1a, 0xff, 0x1a, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x42, 0xff, 0x42, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0x0e, 0x00, 0x0e, 0x00, 0x34, 0x00, 0x34, 0x00, 0x56, 0x00, 0x56, 0x00, 0x72, 0x00, 0x72, 0x00, 0x87, 0x00, 0x87, 0x00, 0x99, 0x00, 0x99, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0xab, 0x00, 0xab, 0x00, 0xab, 0x00, 0xab, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x98, 0x00, 0x98, 0x00, 0x89, 0x00, 0x89, 0x00, 0x77, 0x00, 0x77, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x45, 0x00, 0x45, 0x00, 0x26, 0x00, 0x26, 0x00, 0x02, 0x00, 0x02, 0x00, 0xde, 0xff, 0xde, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0x95, 0xff, 0x95, 0xff, 0x74, 0xff, 0x74, 0xff, 0x54, 0xff, 0x54, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x29, 0xff, 0x29, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x18, 0xff, 0x18, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x2d, 0xff, 0x2d, 0xff, 0x43, 0xff, 0x43, 0xff, 0x60, 0xff, 0x60, 0xff, 0x83, 0xff, 0x83, 0xff, 0xac, 0xff, 0xac, 0xff, 0xda, 0xff, 0xda, 0xff, 0x09, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x68, 0x00, 0x68, 0x00, 0x92, 0x00, 0x92, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0x92, 0x00, 0x92, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x42, 0x00, 0x42, 0x00, 0x16, 0x00, 0x16, 0x00, 0xe8, 0xff, 0xe8, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x69, 0xff, 0x69, 0xff, 0x4a, 0xff, 0x4a, 0xff, 0x31, 0xff, 0x31, 0xff, 0x1e, 0xff, 0x1e, 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x07, 0xff, 0x07, 0xff, 0x06, 0xff, 0x06, 0xff, 0x0e, 0xff, 0x0e, 0xff, 0x1e, 0xff, 0x1e, 0xff, 0x35, 0xff, 0x35, 0xff, 0x53, 0xff, 0x53, 0xff, 0x73, 0xff, 0x73, 0xff, 0x95, 0xff, 0x95, 0xff, 0xba, 0xff, 0xba, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x35, 0x00, 0x35, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x81, 0x00, 0x81, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xda, 0x00, 0xda, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x90, 0x00, 0x90, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x48, 0x00, 0x48, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x79, 0xff, 0x79, 0xff, 0x59, 0xff, 0x59, 0xff, 0x40, 0xff, 0x40, 0xff, 0x30, 0xff, 0x30, 0xff, 0x24, 0xff, 0x24, 0xff, 0x21, 0xff, 0x21, 0xff, 0x25, 0xff, 0x25, 0xff, 0x30, 0xff, 0x30, 0xff, 0x42, 0xff, 0x42, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x76, 0xff, 0x76, 0xff, 0x96, 0xff, 0x96, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0x06, 0x00, 0x06, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x55, 0x00, 0x55, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xeb, 0x00, 0xeb, 0x00, 0xf9, 0x00, 0xf9, 0x00, 0x00, 0x01, 0x00, 0x01, 0xff, 0x00, 0xff, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0x84, 0x00, 0x84, 0x00, 0x57, 0x00, 0x57, 0x00, 0x28, 0x00, 0x28, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x42, 0xff, 0x42, 0xff, 0x2f, 0xff, 0x2f, 0xff, 0x23, 0xff, 0x23, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x28, 0xff, 0x28, 0xff, 0x38, 0xff, 0x38, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x67, 0xff, 0x67, 0xff, 0x83, 0xff, 0x83, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0x10, 0x00, 0x10, 0x00, 0x36, 0x00, 0x36, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xca, 0x00, 0xca, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0xde, 0x00, 0xde, 0x00, 0xde, 0x00, 0xde, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0x95, 0x00, 0x95, 0x00, 0x73, 0x00, 0x73, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x63, 0xff, 0x63, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x36, 0xff, 0x36, 0xff, 0x37, 0xff, 0x37, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x64, 0xff, 0x64, 0xff, 0x81, 0xff, 0x81, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xee, 0xff, 0xee, 0xff, 0x15, 0x00, 0x15, 0x00, 0x38, 0x00, 0x38, 0x00, 0x58, 0x00, 0x58, 0x00, 0x75, 0x00, 0x75, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0xae, 0x00, 0xae, 0x00, 0xb1, 0x00, 0xb1, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0xac, 0x00, 0xac, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x72, 0x00, 0x72, 0x00, 0x51, 0x00, 0x51, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x05, 0x00, 0x05, 0x00, 0xdc, 0xff, 0xdc, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0x87, 0xff, 0x87, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x0a, 0xff, 0x0a, 0xff, 0xfb, 0xfe, 0xfb, 0xfe, 0xf5, 0xfe, 0xf5, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0x00, 0xff, 0x00, 0xff, 0x13, 0xff, 0x13, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x50, 0xff, 0x50, 0xff, 0x78, 0xff, 0x78, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xda, 0xff, 0xda, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x71, 0x00, 0x71, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x10, 0x01, 0x10, 0x01, 0x29, 0x01, 0x29, 0x01, 0x38, 0x01, 0x38, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x3e, 0x01, 0x3e, 0x01, 0x31, 0x01, 0x31, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x01, 0x01, 0x01, 0x01, 0xe3, 0x00, 0xe3, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x75, 0x00, 0x75, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xad, 0xff, 0xad, 0xff, 0x89, 0xff, 0x89, 0xff, 0x69, 0xff, 0x69, 0xff, 0x50, 0xff, 0x50, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x27, 0xff, 0x27, 0xff, 0x27, 0xff, 0x27, 0xff, 0x2f, 0xff, 0x2f, 0xff, 0x3c, 0xff, 0x3c, 0xff, 0x50, 0xff, 0x50, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x89, 0xff, 0x89, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0x01, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x41, 0x00, 0x44, 0x00, 0x44, 0x00, 0x41, 0x00, 0x41, 0x00, 0x39, 0x00, 0x39, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x16, 0x00, 0x16, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x69, 0xff, 0x69, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x53, 0xff, 0x53, 0xff, 0x53, 0xff, 0x53, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x68, 0xff, 0x68, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x95, 0xff, 0x95, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0x07, 0x00, 0x07, 0x00, 0x32, 0x00, 0x32, 0x00, 0x60, 0x00, 0x60, 0x00, 0x90, 0x00, 0x90, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xec, 0x00, 0xec, 0x00, 0x13, 0x01, 0x13, 0x01, 0x35, 0x01, 0x35, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x5f, 0x01, 0x5f, 0x01, 0x67, 0x01, 0x67, 0x01, 0x66, 0x01, 0x66, 0x01, 0x5b, 0x01, 0x5b, 0x01, 0x45, 0x01, 0x45, 0x01, 0x25, 0x01, 0x25, 0x01, 0xfe, 0x00, 0xfe, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0xdb, 0xff, 0xdb, 0xff, 0x95, 0xff, 0x95, 0xff, 0x52, 0xff, 0x52, 0xff, 0x12, 0xff, 0x12, 0xff, 0xd7, 0xfe, 0xd7, 0xfe, 0xa1, 0xfe, 0xa1, 0xfe, 0x78, 0xfe, 0x78, 0xfe, 0x5a, 0xfe, 0x5a, 0xfe, 0x46, 0xfe, 0x46, 0xfe, 0x3b, 0xfe, 0x3b, 0xfe, 0x3c, 0xfe, 0x3c, 0xfe, 0x4b, 0xfe, 0x4b, 0xfe, 0x65, 0xfe, 0x65, 0xfe, 0x8b, 0xfe, 0x8b, 0xfe, 0xbc, 0xfe, 0xbc, 0xfe, 0xf5, 0xfe, 0xf5, 0xfe, 0x35, 0xff, 0x35, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0x13, 0x00, 0x13, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xee, 0x00, 0xee, 0x00, 0x2c, 0x01, 0x2c, 0x01, 0x64, 0x01, 0x64, 0x01, 0x92, 0x01, 0x92, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xce, 0x01, 0xce, 0x01, 0xd9, 0x01, 0xd9, 0x01, 0xd7, 0x01, 0xd7, 0x01, 0xc8, 0x01, 0xc8, 0x01, 0xad, 0x01, 0xad, 0x01, 0x86, 0x01, 0x86, 0x01, 0x55, 0x01, 0x55, 0x01, 0x1a, 0x01, 0x1a, 0x01, 0xdb, 0x00, 0xdb, 0x00, 0x98, 0x00, 0x98, 0x00, 0x51, 0x00, 0x51, 0x00, 0x06, 0x00, 0x06, 0x00, 0xbb, 0xff, 0xbb, 0xff, 0x77, 0xff, 0x77, 0xff, 0x39, 0xff, 0x39, 0xff, 0x02, 0xff, 0x02, 0xff, 0xd0, 0xfe, 0xd0, 0xfe, 0xa5, 0xfe, 0xa5, 0xfe, 0x81, 0xfe, 0x81, 0xfe, 0x66, 0xfe, 0x66, 0xfe, 0x55, 0xfe, 0x55, 0xfe, 0x52, 0xfe, 0x52, 0xfe, 0x59, 0xfe, 0x59, 0xfe, 0x6b, 0xfe, 0x6b, 0xfe, 0x87, 0xfe, 0x87, 0xfe, 0xab, 0xfe, 0xab, 0xfe, 0xd7, 0xfe, 0xd7, 0xfe, 0x0c, 0xff, 0x0c, 0xff, 0x4c, 0xff, 0x4c, 0xff, 0x91, 0xff, 0x91, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0x1b, 0x00, 0x1b, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x0c, 0x01, 0x0c, 0x01, 0x34, 0x01, 0x34, 0x01, 0x50, 0x01, 0x50, 0x01, 0x61, 0x01, 0x61, 0x01, 0x69, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x6a, 0x01, 0x63, 0x01, 0x63, 0x01, 0x53, 0x01, 0x53, 0x01, 0x3c, 0x01, 0x3c, 0x01, 0x1e, 0x01, 0x1e, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0x9e, 0x00, 0x9e, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x36, 0x00, 0x36, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0x90, 0xff, 0x90, 0xff, 0x5c, 0xff, 0x5c, 0xff, 0x2e, 0xff, 0x2e, 0xff, 0x08, 0xff, 0x08, 0xff, 0xe9, 0xfe, 0xe9, 0xfe, 0xd5, 0xfe, 0xd5, 0xfe, 0xcb, 0xfe, 0xcb, 0xfe, 0xc9, 0xfe, 0xc9, 0xfe, 0xce, 0xfe, 0xce, 0xfe, 0xd9, 0xfe, 0xd9, 0xfe, 0xec, 0xfe, 0xec, 0xfe, 0x05, 0xff, 0x05, 0xff, 0x27, 0xff, 0x27, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0xad, 0xff, 0xad, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0x15, 0x00, 0x15, 0x00, 0x47, 0x00, 0x47, 0x00, 0x76, 0x00, 0x76, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0xff, 0x00, 0xff, 0x00, 0x14, 0x01, 0x14, 0x01, 0x20, 0x01, 0x20, 0x01, 0x24, 0x01, 0x24, 0x01, 0x1e, 0x01, 0x1e, 0x01, 0x11, 0x01, 0x11, 0x01, 0xfd, 0x00, 0xfd, 0x00, 0xe5, 0x00, 0xe5, 0x00, 0xca, 0x00, 0xca, 0x00, 0xac, 0x00, 0xac, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x66, 0x00, 0x66, 0x00, 0x40, 0x00, 0x40, 0x00, 0x19, 0x00, 0x19, 0x00, 0xf1, 0xff, 0xf1, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0x82, 0xff, 0x82, 0xff, 0x63, 0xff, 0x63, 0xff, 0x49, 0xff, 0x49, 0xff, 0x34, 0xff, 0x34, 0xff, 0x24, 0xff, 0x24, 0xff, 0x1a, 0xff, 0x1a, 0xff, 0x17, 0xff, 0x17, 0xff, 0x1d, 0xff, 0x1d, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x40, 0xff, 0x40, 0xff, 0x57, 0xff, 0x57, 0xff, 0x70, 0xff, 0x70, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xca, 0xff, 0xca, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0x05, 0x00, 0x05, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x36, 0x00, 0x36, 0x00, 0x48, 0x00, 0x48, 0x00, 0x57, 0x00, 0x57, 0x00, 0x62, 0x00, 0x62, 0x00, 0x68, 0x00, 0x68, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x66, 0x00, 0x66, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x54, 0x00, 0x54, 0x00, 0x49, 0x00, 0x49, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x07, 0x00, 0x07, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x01, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x24, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x29, 0x00, 0x29, 0x00, 0x26, 0x00, 0x26, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x13, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x02, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xea, 0xff, 0xea, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x07, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x14, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x23, 0x00, 0x23, 0x00, 0x24, 0x00, 0x24, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x03, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xed, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x17, 0x00, 0x25, 0x00, 0x25, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x56, 0x00, 0x56, 0x00, 0x59, 0x00, 0x59, 0x00, 0x58, 0x00, 0x58, 0x00, 0x54, 0x00, 0x54, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x41, 0x00, 0x31, 0x00, 0x31, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x06, 0x00, 0x06, 0x00, 0xef, 0xff, 0xef, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x79, 0xff, 0x79, 0xff, 0x6d, 0xff, 0x6d, 0xff, 0x67, 0xff, 0x67, 0xff, 0x66, 0xff, 0x66, 0xff, 0x68, 0xff, 0x68, 0xff, 0x70, 0xff, 0x70, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x88, 0xff, 0x88, 0xff, 0x99, 0xff, 0x99, 0xff, 0xae, 0xff, 0xae, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x39, 0x00, 0x39, 0x00, 0x54, 0x00, 0x54, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x87, 0x00, 0x87, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xba, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0x99, 0x00, 0x99, 0x00, 0x80, 0x00, 0x80, 0x00, 0x64, 0x00, 0x64, 0x00, 0x45, 0x00, 0x45, 0x00, 0x22, 0x00, 0x22, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0x96, 0xff, 0x96, 0xff, 0x79, 0xff, 0x79, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x47, 0xff, 0x47, 0xff, 0x34, 0xff, 0x34, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x26, 0xff, 0x26, 0xff, 0x27, 0xff, 0x27, 0xff, 0x2f, 0xff, 0x2f, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x60, 0xff, 0x60, 0xff, 0x79, 0xff, 0x79, 0xff, 0x96, 0xff, 0x96, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x15, 0x00, 0x27, 0x00, 0x27, 0x00, 0x35, 0x00, 0x35, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x48, 0x00, 0x48, 0x00, 0x45, 0x00, 0x45, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x35, 0x00, 0x35, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x28, 0x00, 0x28, 0x00, 0x20, 0x00, 0x20, 0x00, 0x19, 0x00, 0x19, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xed, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x40, 0x00, 0x40, 0x00, 0x52, 0x00, 0x52, 0x00, 0x63, 0x00, 0x63, 0x00, 0x70, 0x00, 0x70, 0x00, 0x79, 0x00, 0x79, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x83, 0x00, 0x80, 0x00, 0x80, 0x00, 0x76, 0x00, 0x76, 0x00, 0x66, 0x00, 0x66, 0x00, 0x51, 0x00, 0x51, 0x00, 0x38, 0x00, 0x38, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x91, 0xff, 0x91, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x68, 0xff, 0x68, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x4e, 0xff, 0x4e, 0xff, 0x46, 0xff, 0x46, 0xff, 0x43, 0xff, 0x43, 0xff, 0x44, 0xff, 0x44, 0xff, 0x49, 0xff, 0x49, 0xff, 0x52, 0xff, 0x52, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x81, 0xff, 0x81, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xda, 0xff, 0xda, 0xff, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x27, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x74, 0x00, 0x74, 0x00, 0x98, 0x00, 0x98, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xed, 0x00, 0xed, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x51, 0x00, 0x51, 0x00, 0x24, 0x00, 0x24, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x79, 0xff, 0x79, 0xff, 0x57, 0xff, 0x57, 0xff, 0x38, 0xff, 0x38, 0xff, 0x1e, 0xff, 0x1e, 0xff, 0x0a, 0xff, 0x0a, 0xff, 0xfa, 0xfe, 0xfa, 0xfe, 0xf1, 0xfe, 0xf1, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0x02, 0xff, 0x02, 0xff, 0x13, 0xff, 0x13, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x47, 0xff, 0x47, 0xff, 0x67, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0xae, 0xff, 0xae, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x2c, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x84, 0x00, 0x84, 0x00, 0xad, 0x00, 0xad, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x0d, 0x01, 0x0d, 0x01, 0x23, 0x01, 0x23, 0x01, 0x34, 0x01, 0x34, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x3f, 0x01, 0x3f, 0x01, 0x3b, 0x01, 0x3b, 0x01, 0x30, 0x01, 0x30, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x03, 0x01, 0x03, 0x01, 0xe4, 0x00, 0xe4, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x78, 0x00, 0x78, 0x00, 0x50, 0x00, 0x50, 0x00, 0x26, 0x00, 0x26, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xad, 0xff, 0xad, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x50, 0xff, 0x50, 0xff, 0x36, 0xff, 0x36, 0xff, 0x20, 0xff, 0x20, 0xff, 0x0d, 0xff, 0x0d, 0xff, 0x00, 0xff, 0x00, 0xff, 0xf8, 0xfe, 0xf8, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0xf6, 0xfe, 0xfb, 0xfe, 0xfb, 0xfe, 0x05, 0xff, 0x05, 0xff, 0x12, 0xff, 0x12, 0xff, 0x24, 0xff, 0x24, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x59, 0xff, 0x59, 0xff, 0x78, 0xff, 0x78, 0xff, 0x99, 0xff, 0x99, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0x03, 0x00, 0x03, 0x00, 0x26, 0x00, 0x26, 0x00, 0x48, 0x00, 0x48, 0x00, 0x65, 0x00, 0x65, 0x00, 0x80, 0x00, 0x80, 0x00, 0x96, 0x00, 0x96, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x68, 0x00, 0x68, 0x00, 0x54, 0x00, 0x54, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x25, 0x00, 0x25, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf8, 0xff, 0xf8, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xce, 0xff, 0xce, 0xff, 0xba, 0xff, 0xba, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x95, 0xff, 0x95, 0xff, 0x85, 0xff, 0x85, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x75, 0xff, 0x75, 0xff, 0x72, 0xff, 0x72, 0xff, 0x70, 0xff, 0x70, 0xff, 0x72, 0xff, 0x72, 0xff, 0x78, 0xff, 0x78, 0xff, 0x81, 0xff, 0x81, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x97, 0xff, 0x97, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x34, 0x00, 0x34, 0x00, 0x48, 0x00, 0x48, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x99, 0x00, 0x99, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0x9e, 0x00, 0x9e, 0x00, 0x93, 0x00, 0x93, 0x00, 0x86, 0x00, 0x86, 0x00, 0x77, 0x00, 0x77, 0x00, 0x67, 0x00, 0x67, 0x00, 0x55, 0x00, 0x55, 0x00, 0x41, 0x00, 0x41, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x15, 0x00, 0x15, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x85, 0xff, 0x85, 0xff, 0x72, 0xff, 0x72, 0xff, 0x61, 0xff, 0x61, 0xff, 0x53, 0xff, 0x53, 0xff, 0x48, 0xff, 0x48, 0xff, 0x40, 0xff, 0x40, 0xff, 0x3a, 0xff, 0x3a, 0xff, 0x37, 0xff, 0x37, 0xff, 0x38, 0xff, 0x38, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x4c, 0xff, 0x4c, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x76, 0xff, 0x76, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xba, 0xff, 0xba, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x67, 0x00, 0x67, 0x00, 0x80, 0x00, 0x80, 0x00, 0x97, 0x00, 0x97, 0x00, 0xae, 0x00, 0xae, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0xea, 0x00, 0xea, 0x00, 0xee, 0x00, 0xee, 0x00, 0xee, 0x00, 0xee, 0x00, 0xe8, 0x00, 0xe8, 0x00, 0xde, 0x00, 0xde, 0x00, 0xce, 0x00, 0xce, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x81, 0x00, 0x81, 0x00, 0x62, 0x00, 0x62, 0x00, 0x40, 0x00, 0x40, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x83, 0xff, 0x83, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x53, 0xff, 0x53, 0xff, 0x40, 0xff, 0x40, 0xff, 0x2f, 0xff, 0x2f, 0xff, 0x23, 0xff, 0x23, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1b, 0xff, 0x1b, 0xff, 0x20, 0xff, 0x20, 0xff, 0x2b, 0xff, 0x2b, 0xff, 0x3b, 0xff, 0x3b, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x64, 0xff, 0x64, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x96, 0xff, 0x96, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0x01, 0x00, 0x01, 0x00, 0x26, 0x00, 0x26, 0x00, 0x46, 0x00, 0x46, 0x00, 0x62, 0x00, 0x62, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x92, 0x00, 0x92, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0xba, 0x00, 0xba, 0x00, 0xad, 0x00, 0xad, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x78, 0x00, 0x78, 0x00, 0x63, 0x00, 0x63, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x39, 0x00, 0x39, 0x00, 0x24, 0x00, 0x24, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0x97, 0xff, 0x97, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x82, 0xff, 0x82, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0x80, 0xff, 0x80, 0xff, 0x86, 0xff, 0x86, 0xff, 0x90, 0xff, 0x90, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x04, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16, 0x00, 0x15, 0x00, 0x15, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x15, 0x00, 0x15, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x25, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x34, 0x00, 0x34, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x46, 0x00, 0x46, 0x00, 0x40, 0x00, 0x40, 0x00, 0x37, 0x00, 0x37, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x25, 0x00, 0x25, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x11, 0x00, 0x11, 0x00, 0x06, 0x00, 0x06, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x98, 0xff, 0x98, 0xff, 0x95, 0xff, 0x95, 0xff, 0x98, 0xff, 0x98, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x56, 0x00, 0x56, 0x00, 0x60, 0x00, 0x60, 0x00, 0x65, 0x00, 0x65, 0x00, 0x69, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x68, 0x00, 0x68, 0x00, 0x66, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x51, 0x00, 0x51, 0x00, 0x46, 0x00, 0x46, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x21, 0x00, 0x21, 0x00, 0x13, 0x00, 0x13, 0x00, 0x07, 0x00, 0x07, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xad, 0xff, 0xad, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xac, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x06, 0x00, 0x06, 0x00, 0x14, 0x00, 0x14, 0x00, 0x23, 0x00, 0x23, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x57, 0x00, 0x57, 0x00, 0x61, 0x00, 0x61, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x76, 0x00, 0x76, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x83, 0x00, 0x83, 0x00, 0x85, 0x00, 0x85, 0x00, 0x82, 0x00, 0x82, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x75, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x61, 0x00, 0x54, 0x00, 0x54, 0x00, 0x46, 0x00, 0x46, 0x00, 0x36, 0x00, 0x36, 0x00, 0x26, 0x00, 0x26, 0x00, 0x15, 0x00, 0x15, 0x00, 0x05, 0x00, 0x05, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xad, 0xff, 0xad, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xad, 0xff, 0xad, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x05, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x18, 0x00, 0x21, 0x00, 0x21, 0x00, 0x24, 0x00, 0x24, 0x00, 0x23, 0x00, 0x23, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x16, 0x00, 0x16, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x04, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xca, 0xff, 0xca, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x07, 0x00, 0x07, 0x00, 0x19, 0x00, 0x19, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x66, 0x00, 0x66, 0x00, 0x72, 0x00, 0x72, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x82, 0x00, 0x82, 0x00, 0x86, 0x00, 0x86, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x87, 0x00, 0x87, 0x00, 0x83, 0x00, 0x83, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x77, 0x00, 0x77, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x35, 0x00, 0x35, 0x00, 0x20, 0x00, 0x20, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0x98, 0xff, 0x98, 0xff, 0x81, 0xff, 0x81, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x52, 0xff, 0x52, 0xff, 0x3d, 0xff, 0x3d, 0xff, 0x2b, 0xff, 0x2b, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x17, 0xff, 0x17, 0xff, 0x16, 0xff, 0x16, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0x27, 0xff, 0x27, 0xff, 0x37, 0xff, 0x37, 0xff, 0x48, 0xff, 0x48, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x78, 0xff, 0x78, 0xff, 0x96, 0xff, 0x96, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0x10, 0x00, 0x10, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x47, 0x00, 0x47, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x73, 0x00, 0x73, 0x00, 0x85, 0x00, 0x85, 0x00, 0x93, 0x00, 0x93, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xab, 0x00, 0xab, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xba, 0x00, 0xba, 0x00, 0xbb, 0x00, 0xbb, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x77, 0x00, 0x77, 0x00, 0x61, 0x00, 0x61, 0x00, 0x49, 0x00, 0x49, 0x00, 0x30, 0x00, 0x30, 0x00, 0x14, 0x00, 0x14, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xde, 0xff, 0xde, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x92, 0xff, 0x92, 0xff, 0x87, 0xff, 0x87, 0xff, 0x80, 0xff, 0x80, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x85, 0xff, 0x85, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0x98, 0xff, 0x98, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x06, 0x00, 0x06, 0x00, 0x16, 0x00, 0x16, 0x00, 0x24, 0x00, 0x24, 0x00, 0x32, 0x00, 0x32, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x61, 0x00, 0x61, 0x00, 0x61, 0x00, 0x61, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x57, 0x00, 0x57, 0x00, 0x52, 0x00, 0x52, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x22, 0x00, 0x22, 0x00, 0x15, 0x00, 0x15, 0x00, 0x08, 0x00, 0x08, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xed, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x97, 0xff, 0x97, 0xff, 0x96, 0xff, 0x96, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xad, 0xff, 0xad, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x23, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x51, 0x00, 0x51, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x83, 0x00, 0x83, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0xae, 0x00, 0xae, 0x00, 0xbd, 0x00, 0xbd, 0x00, 0xca, 0x00, 0xca, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0xd9, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xda, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x71, 0x00, 0x71, 0x00, 0x52, 0x00, 0x52, 0x00, 0x32, 0x00, 0x32, 0x00, 0x11, 0x00, 0x11, 0x00, 0xef, 0xff, 0xef, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x84, 0xff, 0x84, 0xff, 0x63, 0xff, 0x63, 0xff, 0x43, 0xff, 0x43, 0xff, 0x26, 0xff, 0x26, 0xff, 0x0d, 0xff, 0x0d, 0xff, 0xf6, 0xfe, 0xf6, 0xfe, 0xe6, 0xfe, 0xe6, 0xfe, 0xdb, 0xfe, 0xdb, 0xfe, 0xd4, 0xfe, 0xd4, 0xfe, 0xd3, 0xfe, 0xd3, 0xfe, 0xda, 0xfe, 0xda, 0xfe, 0xe9, 0xfe, 0xe9, 0xfe, 0xfd, 0xfe, 0xfd, 0xfe, 0x17, 0xff, 0x17, 0xff, 0x34, 0xff, 0x34, 0xff, 0x56, 0xff, 0x56, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xce, 0xff, 0xce, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x25, 0x00, 0x25, 0x00, 0x50, 0x00, 0x50, 0x00, 0x78, 0x00, 0x78, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xf9, 0x00, 0xf9, 0x00, 0x0a, 0x01, 0x0a, 0x01, 0x16, 0x01, 0x16, 0x01, 0x1a, 0x01, 0x1a, 0x01, 0x18, 0x01, 0x18, 0x01, 0x13, 0x01, 0x13, 0x01, 0x07, 0x01, 0x07, 0x01, 0xf6, 0x00, 0xf6, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0xab, 0x00, 0xab, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x62, 0x00, 0x62, 0x00, 0x37, 0x00, 0x37, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xe1, 0xff, 0xe1, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0x98, 0xff, 0x98, 0xff, 0x78, 0xff, 0x78, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x29, 0xff, 0x29, 0xff, 0x18, 0xff, 0x18, 0xff, 0x0c, 0xff, 0x0c, 0xff, 0x04, 0xff, 0x04, 0xff, 0x02, 0xff, 0x02, 0xff, 0x08, 0xff, 0x08, 0xff, 0x17, 0xff, 0x17, 0xff, 0x2a, 0xff, 0x2a, 0xff, 0x40, 0xff, 0x40, 0xff, 0x58, 0xff, 0x58, 0xff, 0x73, 0xff, 0x73, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0xab, 0xff, 0xab, 0xff, 0xca, 0xff, 0xca, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0x08, 0x00, 0x08, 0x00, 0x25, 0x00, 0x25, 0x00, 0x43, 0x00, 0x43, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x75, 0x00, 0x75, 0x00, 0x89, 0x00, 0x89, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0xca, 0x00, 0xca, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xb9, 0x00, 0xb9, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x94, 0x00, 0x94, 0x00, 0x82, 0x00, 0x82, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x54, 0x00, 0x54, 0x00, 0x39, 0x00, 0x39, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x01, 0x00, 0xe2, 0xff, 0xe2, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0x85, 0xff, 0x85, 0xff, 0x68, 0xff, 0x68, 0xff, 0x4c, 0xff, 0x4c, 0xff, 0x34, 0xff, 0x34, 0xff, 0x21, 0xff, 0x21, 0xff, 0x13, 0xff, 0x13, 0xff, 0x08, 0xff, 0x08, 0xff, 0x03, 0xff, 0x03, 0xff, 0x01, 0xff, 0x01, 0xff, 0x00, 0xff, 0x00, 0xff, 0x03, 0xff, 0x03, 0xff, 0x0a, 0xff, 0x0a, 0xff, 0x15, 0xff, 0x15, 0xff, 0x23, 0xff, 0x23, 0xff, 0x36, 0xff, 0x36, 0xff, 0x4d, 0xff, 0x4d, 0xff, 0x68, 0xff, 0x68, 0xff, 0x85, 0xff, 0x85, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x32, 0x00, 0x32, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x85, 0x00, 0x85, 0x00, 0xac, 0x00, 0xac, 0x00, 0xce, 0x00, 0xce, 0x00, 0xed, 0x00, 0xed, 0x00, 0x0b, 0x01, 0x0b, 0x01, 0x27, 0x01, 0x27, 0x01, 0x41, 0x01, 0x41, 0x01, 0x57, 0x01, 0x57, 0x01, 0x66, 0x01, 0x66, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x6f, 0x01, 0x66, 0x01, 0x66, 0x01, 0x59, 0x01, 0x59, 0x01, 0x48, 0x01, 0x48, 0x01, 0x31, 0x01, 0x31, 0x01, 0x16, 0x01, 0x16, 0x01, 0xf5, 0x00, 0xf5, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x74, 0x00, 0x74, 0x00, 0x43, 0x00, 0x43, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xda, 0xff, 0xda, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0x74, 0xff, 0x74, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x0b, 0xff, 0x0b, 0xff, 0xdd, 0xfe, 0xdd, 0xfe, 0xb6, 0xfe, 0xb6, 0xfe, 0x95, 0xfe, 0x95, 0xfe, 0x77, 0xfe, 0x77, 0xfe, 0x5f, 0xfe, 0x5f, 0xfe, 0x4e, 0xfe, 0x4e, 0xfe, 0x43, 0xfe, 0x43, 0xfe, 0x3d, 0xfe, 0x3d, 0xfe, 0x41, 0xfe, 0x41, 0xfe, 0x4c, 0xfe, 0x4c, 0xfe, 0x5f, 0xfe, 0x5f, 0xfe, 0x7a, 0xfe, 0x7a, 0xfe, 0x9e, 0xfe, 0x9e, 0xfe, 0xcb, 0xfe, 0xcb, 0xfe, 0xfc, 0xfe, 0xfc, 0xfe, 0x31, 0xff, 0x31, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0x27, 0x00, 0x27, 0x00, 0x65, 0x00, 0x65, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0x12, 0x01, 0x12, 0x01, 0x43, 0x01, 0x43, 0x01, 0x6d, 0x01, 0x6d, 0x01, 0x8e, 0x01, 0x8e, 0x01, 0xa9, 0x01, 0xa9, 0x01, 0xbe, 0x01, 0xbe, 0x01, 0xcb, 0x01, 0xcb, 0x01, 0xd0, 0x01, 0xd0, 0x01, 0xcd, 0x01, 0xcd, 0x01, 0xc1, 0x01, 0xc1, 0x01, 0xad, 0x01, 0xad, 0x01, 0x91, 0x01, 0x91, 0x01, 0x6d, 0x01, 0x6d, 0x01, 0x42, 0x01, 0x42, 0x01, 0x11, 0x01, 0x11, 0x01, 0xda, 0x00, 0xda, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x66, 0x00, 0x66, 0x00, 0x29, 0x00, 0x29, 0x00, 0xee, 0xff, 0xee, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x45, 0xff, 0x45, 0xff, 0x14, 0xff, 0x14, 0xff, 0xea, 0xfe, 0xea, 0xfe, 0xc8, 0xfe, 0xc8, 0xfe, 0xad, 0xfe, 0xad, 0xfe, 0x9d, 0xfe, 0x9d, 0xfe, 0x94, 0xfe, 0x94, 0xfe, 0x8f, 0xfe, 0x8f, 0xfe, 0x91, 0xfe, 0x91, 0xfe, 0x9e, 0xfe, 0x9e, 0xfe, 0xb4, 0xfe, 0xb4, 0xfe, 0xcd, 0xfe, 0xcd, 0xfe, 0xeb, 0xfe, 0xeb, 0xfe, 0x0c, 0xff, 0x0c, 0xff, 0x30, 0xff, 0x30, 0xff, 0x55, 0xff, 0x55, 0xff, 0x79, 0xff, 0x79, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0x1c, 0x00, 0x1c, 0x00, 0x45, 0x00, 0x45, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0xbb, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xdf, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0xba, 0x00, 0xba, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0x95, 0x00, 0x95, 0x00, 0x80, 0x00, 0x80, 0x00, 0x69, 0x00, 0x69, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x37, 0x00, 0x37, 0x00, 0x22, 0x00, 0x22, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xee, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xce, 0xff, 0xce, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x02, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x10, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x23, 0x00, 0x23, 0x00, 0x25, 0x00, 0x25, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x14, 0x00, 0x14, 0x00, 0x09, 0x00, 0x09, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xed, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x09, 0x00, 0x11, 0x00, 0x11, 0x00, 0x19, 0x00, 0x19, 0x00, 0x21, 0x00, 0x21, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x35, 0x00, 0x35, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x54, 0x00, 0x54, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x66, 0x00, 0x66, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x76, 0x00, 0x76, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x81, 0x00, 0x81, 0x00, 0x80, 0x00, 0x80, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x74, 0x00, 0x74, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x63, 0x00, 0x63, 0x00, 0x57, 0x00, 0x57, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x39, 0x00, 0x39, 0x00, 0x28, 0x00, 0x28, 0x00, 0x14, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0xef, 0xff, 0xef, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x97, 0xff, 0x97, 0xff, 0x92, 0xff, 0x92, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x88, 0xff, 0x88, 0xff, 0x84, 0xff, 0x84, 0xff, 0x83, 0xff, 0x83, 0xff, 0x84, 0xff, 0x84, 0xff, 0x89, 0xff, 0x89, 0xff, 0x92, 0xff, 0x92, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xab, 0xff, 0xab, 0xff, 0xba, 0xff, 0xba, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x0e, 0x00, 0x0e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x33, 0x00, 0x33, 0x00, 0x42, 0x00, 0x42, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x60, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x52, 0x00, 0x52, 0x00, 0x47, 0x00, 0x47, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x30, 0x00, 0x30, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x04, 0x00, 0x04, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xca, 0xff, 0xca, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xae, 0xff, 0xae, 0xff, 0xad, 0xff, 0xad, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x28, 0x00, 0x28, 0x00, 0x31, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x46, 0x00, 0x46, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x14, 0x00, 0x14, 0x00, 0x06, 0x00, 0x06, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xca, 0xff, 0xca, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xda, 0xff, 0xda, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x03, 0x00, 0x03, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x29, 0x00, 0x29, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x45, 0x00, 0x45, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x49, 0x00, 0x49, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x32, 0x00, 0x32, 0x00, 0x23, 0x00, 0x23, 0x00, 0x10, 0x00, 0x10, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xad, 0xff, 0xad, 0xff, 0xac, 0xff, 0xac, 0xff, 0xab, 0xff, 0xab, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0x06, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x35, 0x00, 0x35, 0x00, 0x46, 0x00, 0x46, 0x00, 0x54, 0x00, 0x54, 0x00, 0x62, 0x00, 0x62, 0x00, 0x73, 0x00, 0x73, 0x00, 0x81, 0x00, 0x81, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x92, 0x00, 0x92, 0x00, 0x91, 0x00, 0x91, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x85, 0x00, 0x85, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x71, 0x00, 0x71, 0x00, 0x62, 0x00, 0x62, 0x00, 0x51, 0x00, 0x51, 0x00, 0x41, 0x00, 0x41, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x07, 0x00, 0x07, 0x00, 0xf0, 0xff, 0xf0, 0xff, 0xda, 0xff, 0xda, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0x91, 0xff, 0x91, 0xff, 0x83, 0xff, 0x83, 0xff, 0x77, 0xff, 0x77, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x67, 0xff, 0x67, 0xff, 0x62, 0xff, 0x62, 0xff, 0x63, 0xff, 0x63, 0xff, 0x69, 0xff, 0x69, 0xff, 0x6f, 0xff, 0x6f, 0xff, 0x76, 0xff, 0x76, 0xff, 0x80, 0xff, 0x80, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xed, 0xff, 0xed, 0xff, 0x06, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x32, 0x00, 0x32, 0x00, 0x44, 0x00, 0x44, 0x00, 0x55, 0x00, 0x55, 0x00, 0x67, 0x00, 0x67, 0x00, 0x78, 0x00, 0x78, 0x00, 0x86, 0x00, 0x86, 0x00, 0x91, 0x00, 0x91, 0x00, 0x98, 0x00, 0x98, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x9d, 0x00, 0x9d, 0x00, 0x93, 0x00, 0x93, 0x00, 0x85, 0x00, 0x85, 0x00, 0x76, 0x00, 0x76, 0x00, 0x65, 0x00, 0x65, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x38, 0x00, 0x38, 0x00, 0x20, 0x00, 0x20, 0x00, 0x07, 0x00, 0x07, 0x00, 0xec, 0xff, 0xec, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0x99, 0xff, 0x99, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x89, 0xff, 0x89, 0xff, 0x85, 0xff, 0x85, 0xff, 0x81, 0xff, 0x81, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x80, 0xff, 0x80, 0xff, 0x85, 0xff, 0x85, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x95, 0xff, 0x95, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0xad, 0xff, 0xad, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xde, 0xff, 0xde, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x05, 0x00, 0x05, 0x00, 0x18, 0x00, 0x18, 0x00, 0x28, 0x00, 0x28, 0x00, 0x36, 0x00, 0x36, 0x00, 0x43, 0x00, 0x43, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x63, 0x00, 0x63, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x66, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x57, 0x00, 0x57, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x36, 0x00, 0x36, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x07, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x14, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x22, 0x00, 0x22, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x33, 0x00, 0x33, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x44, 0x00, 0x44, 0x00, 0x46, 0x00, 0x46, 0x00, 0x44, 0x00, 0x44, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x22, 0x00, 0x22, 0x00, 0x16, 0x00, 0x16, 0x00, 0x09, 0x00, 0x09, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xad, 0xff, 0xad, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x7c, 0xff, 0x7c, 0xff, 0x6f, 0xff, 0x6f, 0xff, 0x66, 0xff, 0x66, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x65, 0xff, 0x65, 0xff, 0x70, 0xff, 0x70, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xba, 0xff, 0xba, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xee, 0xff, 0xee, 0xff, 0x0e, 0x00, 0x0e, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x68, 0x00, 0x68, 0x00, 0x83, 0x00, 0x83, 0x00, 0x99, 0x00, 0x99, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x75, 0x00, 0x75, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x40, 0x00, 0x40, 0x00, 0x23, 0x00, 0x23, 0x00, 0x06, 0x00, 0x06, 0x00, 0xe6, 0xff, 0xe6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x74, 0xff, 0x74, 0xff, 0x60, 0xff, 0x60, 0xff, 0x51, 0xff, 0x51, 0xff, 0x48, 0xff, 0x48, 0xff, 0x44, 0xff, 0x44, 0xff, 0x43, 0xff, 0x43, 0xff, 0x48, 0xff, 0x48, 0xff, 0x53, 0xff, 0x53, 0xff, 0x65, 0xff, 0x65, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x95, 0xff, 0x95, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x19, 0x00, 0x30, 0x00, 0x30, 0x00, 0x45, 0x00, 0x45, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x72, 0x00, 0x72, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x60, 0x00, 0x60, 0x00, 0x55, 0x00, 0x55, 0x00, 0x48, 0x00, 0x48, 0x00, 0x38, 0x00, 0x38, 0x00, 0x27, 0x00, 0x27, 0x00, 0x16, 0x00, 0x16, 0x00, 0x03, 0x00, 0x03, 0x00, 0xed, 0xff, 0xed, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0x97, 0xff, 0x97, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x84, 0xff, 0x84, 0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0xff, 0x86, 0xff, 0x86, 0xff, 0x90, 0xff, 0x90, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0x01, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x51, 0x00, 0x51, 0x00, 0x67, 0x00, 0x67, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0xa7, 0x00, 0xa7, 0x00, 0xae, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x98, 0x00, 0x98, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x57, 0x00, 0x57, 0x00, 0x41, 0x00, 0x41, 0x00, 0x26, 0x00, 0x26, 0x00, 0x09, 0x00, 0x09, 0x00, 0xee, 0xff, 0xee, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x93, 0xff, 0x93, 0xff, 0x81, 0xff, 0x81, 0xff, 0x73, 0xff, 0x73, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x64, 0xff, 0x64, 0xff, 0x62, 0xff, 0x62, 0xff, 0x66, 0xff, 0x66, 0xff, 0x73, 0xff, 0x73, 0xff, 0x85, 0xff, 0x85, 0xff, 0x99, 0xff, 0x99, 0xff, 0xae, 0xff, 0xae, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xde, 0xff, 0xde, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x12, 0x00, 0x12, 0x00, 0x29, 0x00, 0x29, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x66, 0x00, 0x66, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x64, 0x00, 0x64, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x52, 0x00, 0x52, 0x00, 0x44, 0x00, 0x44, 0x00, 0x33, 0x00, 0x33, 0x00, 0x20, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0x99, 0xff, 0x99, 0xff, 0x86, 0xff, 0x86, 0xff, 0x75, 0xff, 0x75, 0xff, 0x68, 0xff, 0x68, 0xff, 0x60, 0xff, 0x60, 0xff, 0x5e, 0xff, 0x5e, 0xff, 0x62, 0xff, 0x62, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x74, 0xff, 0x74, 0xff, 0x82, 0xff, 0x82, 0xff, 0x92, 0xff, 0x92, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0x02, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x41, 0x00, 0x41, 0x00, 0x52, 0x00, 0x52, 0x00, 0x64, 0x00, 0x64, 0x00, 0x77, 0x00, 0x77, 0x00, 0x88, 0x00, 0x88, 0x00, 0x97, 0x00, 0x97, 0x00, 0xa4, 0x00, 0xa4, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x76, 0x00, 0x76, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x45, 0x00, 0x45, 0x00, 0x29, 0x00, 0x29, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xf2, 0xff, 0xf2, 0xff, 0xda, 0xff, 0xda, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x77, 0xff, 0x77, 0xff, 0x62, 0xff, 0x62, 0xff, 0x50, 0xff, 0x50, 0xff, 0x41, 0xff, 0x41, 0xff, 0x34, 0xff, 0x34, 0xff, 0x29, 0xff, 0x29, 0xff, 0x1e, 0xff, 0x1e, 0xff, 0x19, 0xff, 0x19, 0xff, 0x19, 0xff, 0x19, 0xff, 0x1c, 0xff, 0x1c, 0xff, 0x23, 0xff, 0x23, 0xff, 0x30, 0xff, 0x30, 0xff, 0x43, 0xff, 0x43, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x75, 0xff, 0x75, 0xff, 0x91, 0xff, 0x91, 0xff, 0xad, 0xff, 0xad, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x97, 0x00, 0x97, 0x00, 0xab, 0x00, 0xab, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xca, 0x00, 0xca, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xda, 0x00, 0xda, 0x00, 0xde, 0x00, 0xde, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0x97, 0x00, 0x97, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x64, 0x00, 0x64, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x12, 0x00, 0x12, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x79, 0xff, 0x79, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x61, 0xff, 0x61, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x59, 0xff, 0x59, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x60, 0xff, 0x60, 0xff, 0x6a, 0xff, 0x6a, 0xff, 0x75, 0xff, 0x75, 0xff, 0x84, 0xff, 0x84, 0xff, 0x96, 0xff, 0x96, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xec, 0xff, 0xec, 0xff, 0x04, 0x00, 0x04, 0x00, 0x19, 0x00, 0x19, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x48, 0x00, 0x48, 0x00, 0x52, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x61, 0x00, 0x61, 0x00, 0x68, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x72, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x67, 0x00, 0x67, 0x00, 0x63, 0x00, 0x63, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x52, 0x00, 0x52, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x16, 0x00, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0xef, 0xff, 0xef, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xab, 0xff, 0xab, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x99, 0xff, 0x99, 0xff, 0x92, 0xff, 0x92, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x88, 0xff, 0x88, 0xff, 0x87, 0xff, 0x87, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x91, 0xff, 0x91, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x06, 0x00, 0x06, 0x00, 0x14, 0x00, 0x14, 0x00, 0x23, 0x00, 0x23, 0x00, 0x32, 0x00, 0x32, 0x00, 0x41, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x62, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x70, 0x00, 0x70, 0x00, 0x74, 0x00, 0x74, 0x00, 0x76, 0x00, 0x76, 0x00, 0x72, 0x00, 0x72, 0x00, 0x69, 0x00, 0x69, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x15, 0x00, 0x15, 0x00, 0x03, 0x00, 0x03, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x03, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x18, 0x00, 0x18, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x07, 0x00, 0x03, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x38, 0x00, 0x38, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x52, 0x00, 0x52, 0x00, 0x54, 0x00, 0x54, 0x00, 0x52, 0x00, 0x52, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x42, 0x00, 0x42, 0x00, 0x37, 0x00, 0x37, 0x00, 0x27, 0x00, 0x27, 0x00, 0x14, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xce, 0xff, 0xce, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x00, 0x11, 0x00, 0x24, 0x00, 0x24, 0x00, 0x36, 0x00, 0x36, 0x00, 0x46, 0x00, 0x46, 0x00, 0x54, 0x00, 0x54, 0x00, 0x60, 0x00, 0x60, 0x00, 0x69, 0x00, 0x69, 0x00, 0x72, 0x00, 0x72, 0x00, 0x78, 0x00, 0x78, 0x00, 0x79, 0x00, 0x79, 0x00, 0x77, 0x00, 0x77, 0x00, 0x74, 0x00, 0x74, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x28, 0x00, 0x28, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xff, 0xec, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xad, 0xff, 0xad, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x91, 0xff, 0x91, 0xff, 0x85, 0xff, 0x85, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x76, 0xff, 0x76, 0xff, 0x75, 0xff, 0x75, 0xff, 0x79, 0xff, 0x79, 0xff, 0x80, 0xff, 0x80, 0xff, 0x88, 0xff, 0x88, 0xff, 0x92, 0xff, 0x92, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xad, 0xff, 0xad, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xef, 0xff, 0xef, 0xff, 0x03, 0x00, 0x03, 0x00, 0x14, 0x00, 0x14, 0x00, 0x25, 0x00, 0x25, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x47, 0x00, 0x47, 0x00, 0x50, 0x00, 0x50, 0x00, 0x56, 0x00, 0x56, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x64, 0x00, 0x64, 0x00, 0x67, 0x00, 0x67, 0x00, 0x65, 0x00, 0x65, 0x00, 0x61, 0x00, 0x61, 0x00, 0x59, 0x00, 0x59, 0x00, 0x50, 0x00, 0x50, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x35, 0x00, 0x35, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x09, 0x00, 0x09, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xee, 0xff, 0xee, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x07, 0x00, 0x07, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x26, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x30, 0x00, 0x34, 0x00, 0x34, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x35, 0x00, 0x35, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x11, 0x00, 0x06, 0x00, 0x06, 0x00, 0xf8, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xea, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0x02, 0x00, 0x02, 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x24, 0x00, 0x31, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x46, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x51, 0x00, 0x51, 0x00, 0x55, 0x00, 0x55, 0x00, 0x57, 0x00, 0x57, 0x00, 0x54, 0x00, 0x54, 0x00, 0x50, 0x00, 0x50, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x30, 0x00, 0x30, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x04, 0x00, 0x04, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xac, 0xff, 0xac, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x91, 0xff, 0x91, 0xff, 0x86, 0xff, 0x86, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x79, 0xff, 0x79, 0xff, 0x79, 0xff, 0x79, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x84, 0xff, 0x84, 0xff, 0x90, 0xff, 0x90, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xde, 0xff, 0xde, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x21, 0x00, 0x34, 0x00, 0x34, 0x00, 0x46, 0x00, 0x46, 0x00, 0x59, 0x00, 0x59, 0x00, 0x67, 0x00, 0x67, 0x00, 0x73, 0x00, 0x73, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x85, 0x00, 0x85, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x85, 0x00, 0x85, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x73, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x54, 0x00, 0x54, 0x00, 0x45, 0x00, 0x45, 0x00, 0x36, 0x00, 0x36, 0x00, 0x26, 0x00, 0x26, 0x00, 0x13, 0x00, 0x13, 0x00, 0x01, 0x00, 0x01, 0x00, 0xef, 0xff, 0xef, 0xff, 0xde, 0xff, 0xde, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xae, 0xff, 0xae, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x97, 0xff, 0x97, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x88, 0xff, 0x88, 0xff, 0x83, 0xff, 0x83, 0xff, 0x84, 0xff, 0x84, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x95, 0xff, 0x95, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0xad, 0xff, 0xad, 0xff, 0xba, 0xff, 0xba, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x09, 0x00, 0x09, 0x00, 0x18, 0x00, 0x18, 0x00, 0x26, 0x00, 0x26, 0x00, 0x31, 0x00, 0x31, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x46, 0x00, 0x47, 0x00, 0x47, 0x00, 0x47, 0x00, 0x47, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x48, 0x00, 0x48, 0x00, 0x46, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xee, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xce, 0xff, 0xce, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xca, 0xff, 0xca, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x09, 0x00, 0x09, 0x00, 0x11, 0x00, 0x11, 0x00, 0x16, 0x00, 0x16, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x17, 0x00, 0x11, 0x00, 0x11, 0x00, 0x09, 0x00, 0x09, 0x00, 0x03, 0x00, 0x03, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x05, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x12, 0x00, 0x13, 0x00, 0x13, 0x00, 0x14, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xed, 0xff, 0xed, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x11, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x27, 0x00, 0x27, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x33, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x31, 0x00, 0x31, 0x00, 0x28, 0x00, 0x28, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xef, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x08, 0x00, 0x08, 0x00, 0x19, 0x00, 0x19, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x86, 0x00, 0x86, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x92, 0x00, 0x92, 0x00, 0x94, 0x00, 0x94, 0x00, 0x91, 0x00, 0x91, 0x00, 0x8a, 0x00, 0x8a, 0x00, 0x80, 0x00, 0x80, 0x00, 0x73, 0x00, 0x73, 0x00, 0x64, 0x00, 0x64, 0x00, 0x52, 0x00, 0x52, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x18, 0x00, 0x18, 0x00, 0x02, 0x00, 0x02, 0x00, 0xeb, 0xff, 0xeb, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xba, 0xff, 0xba, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0x95, 0xff, 0x95, 0xff, 0x87, 0xff, 0x87, 0xff, 0x79, 0xff, 0x79, 0xff, 0x6d, 0xff, 0x6d, 0xff, 0x68, 0xff, 0x68, 0xff, 0x69, 0xff, 0x69, 0xff, 0x6e, 0xff, 0x6e, 0xff, 0x75, 0xff, 0x75, 0xff, 0x7e, 0xff, 0x7e, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xea, 0xff, 0xea, 0xff, 0x02, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x35, 0x00, 0x35, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0xab, 0x00, 0xab, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x98, 0x00, 0x98, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x81, 0x00, 0x81, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x43, 0x00, 0x43, 0x00, 0x28, 0x00, 0x28, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x60, 0xff, 0x60, 0xff, 0x5a, 0xff, 0x5a, 0xff, 0x57, 0xff, 0x57, 0xff, 0x59, 0xff, 0x59, 0xff, 0x62, 0xff, 0x62, 0xff, 0x71, 0xff, 0x71, 0xff, 0x83, 0xff, 0x83, 0xff, 0x95, 0xff, 0x95, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x27, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x55, 0x00, 0x55, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x88, 0x00, 0x88, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0xb7, 0x00, 0xb7, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xaf, 0x00, 0xaf, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x52, 0x00, 0x52, 0x00, 0x35, 0x00, 0x35, 0x00, 0x19, 0x00, 0x19, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x6b, 0xff, 0x6b, 0xff, 0x5d, 0xff, 0x5d, 0xff, 0x50, 0xff, 0x50, 0xff, 0x48, 0xff, 0x48, 0xff, 0x49, 0xff, 0x49, 0xff, 0x4f, 0xff, 0x4f, 0xff, 0x5b, 0xff, 0x5b, 0xff, 0x69, 0xff, 0x69, 0xff, 0x78, 0xff, 0x78, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x1d, 0x00, 0x1d, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x58, 0x00, 0x58, 0x00, 0x72, 0x00, 0x72, 0x00, 0x88, 0x00, 0x88, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0xa6, 0x00, 0xa6, 0x00, 0xb0, 0x00, 0xb0, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xb8, 0x00, 0xb8, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0xae, 0x00, 0xae, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x67, 0x00, 0x67, 0x00, 0x51, 0x00, 0x51, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x26, 0x00, 0x26, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xf1, 0xff, 0xf1, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xba, 0xff, 0xba, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x77, 0xff, 0x77, 0xff, 0x68, 0xff, 0x68, 0xff, 0x5c, 0xff, 0x5c, 0xff, 0x52, 0xff, 0x52, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x48, 0xff, 0x48, 0xff, 0x4b, 0xff, 0x4b, 0xff, 0x51, 0xff, 0x51, 0xff, 0x5c, 0xff, 0x5c, 0xff, 0x69, 0xff, 0x69, 0xff, 0x79, 0xff, 0x79, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xba, 0xff, 0xba, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0x0e, 0x00, 0x0e, 0x00, 0x28, 0x00, 0x28, 0x00, 0x41, 0x00, 0x41, 0x00, 0x59, 0x00, 0x59, 0x00, 0x71, 0x00, 0x71, 0x00, 0x85, 0x00, 0x85, 0x00, 0x95, 0x00, 0x95, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0xac, 0x00, 0xac, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x98, 0x00, 0x98, 0x00, 0x88, 0x00, 0x88, 0x00, 0x77, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x52, 0x00, 0x52, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x23, 0x00, 0x23, 0x00, 0x09, 0x00, 0x09, 0x00, 0xee, 0xff, 0xee, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x91, 0xff, 0x91, 0xff, 0x89, 0xff, 0x89, 0xff, 0x87, 0xff, 0x87, 0xff, 0x86, 0xff, 0x86, 0xff, 0x84, 0xff, 0x84, 0xff, 0x83, 0xff, 0x83, 0xff, 0x86, 0xff, 0x86, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x98, 0xff, 0x98, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xed, 0xff, 0xed, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x29, 0x00, 0x29, 0x00, 0x33, 0x00, 0x33, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x16, 0x00, 0x16, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x02, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x09, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x07, 0x00, 0x07, 0x00, 0x10, 0x00, 0x10, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x24, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x37, 0x00, 0x37, 0x00, 0x35, 0x00, 0x35, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x25, 0x00, 0x25, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x05, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x03, 0x00, 0x03, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x28, 0x00, 0x28, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x43, 0x00, 0x43, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x53, 0x00, 0x53, 0x00, 0x59, 0x00, 0x59, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x54, 0x00, 0x54, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x43, 0x00, 0x43, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x30, 0x00, 0x30, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xec, 0xff, 0xec, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x0d, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x31, 0x00, 0x31, 0x00, 0x41, 0x00, 0x41, 0x00, 0x51, 0x00, 0x51, 0x00, 0x60, 0x00, 0x60, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x85, 0x00, 0x85, 0x00, 0x8b, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x88, 0x00, 0x88, 0x00, 0x80, 0x00, 0x80, 0x00, 0x75, 0x00, 0x75, 0x00, 0x65, 0x00, 0x65, 0x00, 0x52, 0x00, 0x52, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x21, 0x00, 0x21, 0x00, 0x07, 0x00, 0x07, 0x00, 0xed, 0xff, 0xed, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x70, 0xff, 0x70, 0xff, 0x68, 0xff, 0x68, 0xff, 0x64, 0xff, 0x64, 0xff, 0x62, 0xff, 0x62, 0xff, 0x65, 0xff, 0x65, 0xff, 0x6c, 0xff, 0x6c, 0xff, 0x79, 0xff, 0x79, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xef, 0xff, 0xef, 0xff, 0x07, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x35, 0x00, 0x35, 0x00, 0x49, 0x00, 0x49, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x70, 0x00, 0x70, 0x00, 0x81, 0x00, 0x81, 0x00, 0x8e, 0x00, 0x8e, 0x00, 0x96, 0x00, 0x96, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0x98, 0x00, 0x98, 0x00, 0x92, 0x00, 0x92, 0x00, 0x89, 0x00, 0x89, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x02, 0x00, 0x02, 0x00, 0xed, 0xff, 0xed, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0x90, 0xff, 0x90, 0xff, 0x83, 0xff, 0x83, 0xff, 0x7b, 0xff, 0x7b, 0xff, 0x76, 0xff, 0x76, 0xff, 0x76, 0xff, 0x76, 0xff, 0x77, 0xff, 0x77, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x99, 0xff, 0x99, 0xff, 0xab, 0xff, 0xab, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0x08, 0x00, 0x08, 0x00, 0x18, 0x00, 0x18, 0x00, 0x25, 0x00, 0x25, 0x00, 0x31, 0x00, 0x31, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x47, 0x00, 0x47, 0x00, 0x50, 0x00, 0x50, 0x00, 0x55, 0x00, 0x55, 0x00, 0x57, 0x00, 0x57, 0x00, 0x59, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x59, 0x00, 0x59, 0x00, 0x57, 0x00, 0x57, 0x00, 0x52, 0x00, 0x52, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x41, 0x00, 0x41, 0x00, 0x35, 0x00, 0x35, 0x00, 0x29, 0x00, 0x29, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xea, 0xff, 0xea, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x17, 0x00, 0x23, 0x00, 0x23, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x45, 0x00, 0x45, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x48, 0x00, 0x48, 0x00, 0x43, 0x00, 0x43, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x39, 0x00, 0x39, 0x00, 0x36, 0x00, 0x36, 0x00, 0x32, 0x00, 0x32, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x17, 0x00, 0x17, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x04, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xed, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xba, 0xff, 0xba, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x93, 0xff, 0x93, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x91, 0xff, 0x91, 0xff, 0x90, 0xff, 0x90, 0xff, 0x90, 0xff, 0x90, 0xff, 0x91, 0xff, 0x91, 0xff, 0x96, 0xff, 0x96, 0xff, 0xa0, 0xff, 0xa0, 0xff, 0xae, 0xff, 0xae, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xea, 0xff, 0xea, 0xff, 0x01, 0x00, 0x01, 0x00, 0x18, 0x00, 0x18, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x66, 0x00, 0x66, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x73, 0x00, 0x73, 0x00, 0x76, 0x00, 0x76, 0x00, 0x75, 0x00, 0x75, 0x00, 0x72, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x62, 0x00, 0x62, 0x00, 0x58, 0x00, 0x58, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xde, 0xff, 0xde, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x91, 0xff, 0x91, 0xff, 0x8d, 0xff, 0x8d, 0xff, 0x8c, 0xff, 0x8c, 0xff, 0x8f, 0xff, 0x8f, 0xff, 0x93, 0xff, 0x93, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0x03, 0x00, 0x03, 0x00, 0x13, 0x00, 0x13, 0x00, 0x22, 0x00, 0x22, 0x00, 0x31, 0x00, 0x31, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x45, 0x00, 0x45, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x46, 0x00, 0x46, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xee, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x0a, 0x00, 0x0a, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x64, 0x00, 0x64, 0x00, 0x69, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x68, 0x00, 0x68, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x47, 0x00, 0x47, 0x00, 0x34, 0x00, 0x34, 0x00, 0x24, 0x00, 0x24, 0x00, 0x14, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0xed, 0xff, 0xed, 0xff, 0xda, 0xff, 0xda, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xba, 0xff, 0xba, 0xff, 0xae, 0xff, 0xae, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x95, 0xff, 0x95, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x89, 0xff, 0x89, 0xff, 0x89, 0xff, 0x89, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x8e, 0xff, 0x8e, 0xff, 0x93, 0xff, 0x93, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x13, 0x00, 0x13, 0x00, 0x26, 0x00, 0x26, 0x00, 0x37, 0x00, 0x37, 0x00, 0x47, 0x00, 0x47, 0x00, 0x58, 0x00, 0x58, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x77, 0x00, 0x77, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x80, 0x00, 0x80, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x75, 0x00, 0x75, 0x00, 0x71, 0x00, 0x71, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x32, 0x00, 0x32, 0x00, 0x25, 0x00, 0x25, 0x00, 0x16, 0x00, 0x16, 0x00, 0x07, 0x00, 0x07, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x99, 0xff, 0x99, 0xff, 0x99, 0xff, 0x99, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x05, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x37, 0x00, 0x37, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x37, 0x00, 0x37, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x35, 0x00, 0x35, 0x00, 0x30, 0x00, 0x30, 0x00, 0x27, 0x00, 0x27, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x16, 0x00, 0x16, 0x00, 0x13, 0x00, 0x13, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x09, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xde, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xda, 0xff, 0xda, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xda, 0xff, 0xda, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x05, 0x00, 0x05, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x34, 0x00, 0x34, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x39, 0x00, 0x39, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x26, 0x00, 0x26, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x15, 0x00, 0x15, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xef, 0xff, 0xee, 0xff, 0xee, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x18, 0x00, 0x23, 0x00, 0x23, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x35, 0x00, 0x35, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x33, 0x00, 0x33, 0x00, 0x26, 0x00, 0x26, 0x00, 0x18, 0x00, 0x18, 0x00, 0x06, 0x00, 0x06, 0x00, 0xf4, 0xff, 0xf4, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0x05, 0x00, 0x05, 0x00, 0x15, 0x00, 0x15, 0x00, 0x22, 0x00, 0x22, 0x00, 0x30, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0x51, 0x00, 0x51, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x66, 0x00, 0x66, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x67, 0x00, 0x67, 0x00, 0x60, 0x00, 0x60, 0x00, 0x59, 0x00, 0x59, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x44, 0x00, 0x39, 0x00, 0x39, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x14, 0x00, 0x14, 0x00, 0x09, 0x00, 0x09, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xed, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0x97, 0xff, 0x97, 0xff, 0x85, 0xff, 0x85, 0xff, 0x74, 0xff, 0x74, 0xff, 0x69, 0xff, 0x69, 0xff, 0x63, 0xff, 0x63, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x5f, 0xff, 0x62, 0xff, 0x62, 0xff, 0x69, 0xff, 0x69, 0xff, 0x73, 0xff, 0x73, 0xff, 0x81, 0xff, 0x81, 0xff, 0x93, 0xff, 0x93, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xee, 0xff, 0xee, 0xff, 0x07, 0x00, 0x07, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x42, 0x00, 0x42, 0x00, 0x55, 0x00, 0x55, 0x00, 0x67, 0x00, 0x67, 0x00, 0x76, 0x00, 0x76, 0x00, 0x84, 0x00, 0x84, 0x00, 0x8d, 0x00, 0x8d, 0x00, 0x95, 0x00, 0x95, 0x00, 0x9b, 0x00, 0x9b, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x96, 0x00, 0x96, 0x00, 0x88, 0x00, 0x88, 0x00, 0x75, 0x00, 0x75, 0x00, 0x61, 0x00, 0x61, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x25, 0x00, 0x25, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0x97, 0xff, 0x97, 0xff, 0x89, 0xff, 0x89, 0xff, 0x80, 0xff, 0x80, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x79, 0xff, 0x79, 0xff, 0x7a, 0xff, 0x7a, 0xff, 0x7d, 0xff, 0x7d, 0xff, 0x82, 0xff, 0x82, 0xff, 0x89, 0xff, 0x89, 0xff, 0x91, 0xff, 0x91, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0xac, 0xff, 0xac, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x0c, 0x00, 0x0c, 0x00, 0x20, 0x00, 0x20, 0x00, 0x31, 0x00, 0x31, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x54, 0x00, 0x54, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x60, 0x00, 0x60, 0x00, 0x65, 0x00, 0x65, 0x00, 0x67, 0x00, 0x67, 0x00, 0x66, 0x00, 0x66, 0x00, 0x62, 0x00, 0x62, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x54, 0x00, 0x54, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x30, 0x00, 0x30, 0x00, 0x24, 0x00, 0x24, 0x00, 0x16, 0x00, 0x16, 0x00, 0x06, 0x00, 0x06, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xac, 0xff, 0xac, 0xff, 0xae, 0xff, 0xae, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xda, 0xff, 0xda, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x02, 0x00, 0x02, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x35, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x51, 0x00, 0x51, 0x00, 0x56, 0x00, 0x56, 0x00, 0x58, 0x00, 0x58, 0x00, 0x55, 0x00, 0x55, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x45, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x10, 0x00, 0x10, 0x00, 0x03, 0x00, 0x03, 0x00, 0xf5, 0xff, 0xf5, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xed, 0xff, 0xed, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x08, 0x00, 0x08, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x25, 0x00, 0x25, 0x00, 0x29, 0x00, 0x29, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x26, 0x00, 0x26, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x05, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x03, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x21, 0x00, 0x21, 0x00, 0x26, 0x00, 0x26, 0x00, 0x29, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x29, 0x00, 0x29, 0x00, 0x27, 0x00, 0x27, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xed, 0xff, 0xed, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xda, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xed, 0xff, 0xed, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x06, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x27, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x22, 0x00, 0x22, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xbb, 0xff, 0xbb, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x05, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x14, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x23, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x31, 0x00, 0x35, 0x00, 0x35, 0x00, 0x35, 0x00, 0x35, 0x00, 0x33, 0x00, 0x33, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x27, 0x00, 0x27, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xec, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xca, 0xff, 0xca, 0xff, 0xca, 0xff, 0xca, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x03, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x11, 0x00, 0x14, 0x00, 0x14, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x21, 0x00, 0x24, 0x00, 0x24, 0x00, 0x26, 0x00, 0x26, 0x00, 0x29, 0x00, 0x29, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x28, 0x00, 0x28, 0x00, 0x26, 0x00, 0x26, 0x00, 0x26, 0x00, 0x26, 0x00, 0x25, 0x00, 0x25, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xee, 0xff, 0xee, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xee, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x08, 0x00, 0x08, 0x00, 0x17, 0x00, 0x17, 0x00, 0x28, 0x00, 0x28, 0x00, 0x39, 0x00, 0x39, 0x00, 0x49, 0x00, 0x49, 0x00, 0x57, 0x00, 0x57, 0x00, 0x62, 0x00, 0x62, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x75, 0x00, 0x75, 0x00, 0x7b, 0x00, 0x7b, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x78, 0x00, 0x78, 0x00, 0x71, 0x00, 0x71, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x60, 0x00, 0x60, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xed, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xa8, 0xff, 0xa8, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0x99, 0xff, 0x99, 0xff, 0x98, 0xff, 0x98, 0xff, 0x9a, 0xff, 0x9a, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x04, 0x00, 0x04, 0x00, 0x14, 0x00, 0x14, 0x00, 0x24, 0x00, 0x24, 0x00, 0x32, 0x00, 0x32, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x58, 0x00, 0x58, 0x00, 0x62, 0x00, 0x62, 0x00, 0x69, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x65, 0x00, 0x65, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x43, 0x00, 0x43, 0x00, 0x38, 0x00, 0x38, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xb4, 0xff, 0xb4, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb2, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x09, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfc, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x11, 0x00, 0x12, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xed, 0xff, 0xed, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x06, 0x00, 0x06, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x34, 0x00, 0x34, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x46, 0x00, 0x46, 0x00, 0x4d, 0x00, 0x4d, 0x00, 0x54, 0x00, 0x54, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x64, 0x00, 0x64, 0x00, 0x67, 0x00, 0x67, 0x00, 0x68, 0x00, 0x68, 0x00, 0x65, 0x00, 0x65, 0x00, 0x61, 0x00, 0x61, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x54, 0x00, 0x54, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x45, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xb9, 0xff, 0xb9, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xa2, 0xff, 0xa2, 0xff, 0xa3, 0xff, 0xa3, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xac, 0xff, 0xac, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0x06, 0x00, 0x06, 0x00, 0x12, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x28, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x42, 0x00, 0x49, 0x00, 0x49, 0x00, 0x50, 0x00, 0x50, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5f, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x58, 0x00, 0x58, 0x00, 0x55, 0x00, 0x55, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x45, 0x00, 0x45, 0x00, 0x39, 0x00, 0x39, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xec, 0xff, 0xec, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xba, 0xff, 0xba, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xa7, 0xff, 0xa7, 0xff, 0xa1, 0xff, 0xa1, 0xff, 0x9c, 0xff, 0x9c, 0xff, 0x98, 0xff, 0x98, 0xff, 0x93, 0xff, 0x93, 0xff, 0x92, 0xff, 0x92, 0xff, 0x97, 0xff, 0x97, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x06, 0x00, 0x06, 0x00, 0x17, 0x00, 0x17, 0x00, 0x27, 0x00, 0x27, 0x00, 0x39, 0x00, 0x39, 0x00, 0x48, 0x00, 0x48, 0x00, 0x54, 0x00, 0x54, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x64, 0x00, 0x64, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x71, 0x00, 0x71, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x69, 0x00, 0x5e, 0x00, 0x5e, 0x00, 0x50, 0x00, 0x50, 0x00, 0x41, 0x00, 0x41, 0x00, 0x32, 0x00, 0x32, 0x00, 0x21, 0x00, 0x21, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xb8, 0xff, 0xb8, 0xff, 0xab, 0xff, 0xab, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x91, 0xff, 0x91, 0xff, 0x88, 0xff, 0x88, 0xff, 0x83, 0xff, 0x83, 0xff, 0x82, 0xff, 0x82, 0xff, 0x86, 0xff, 0x86, 0xff, 0x8b, 0xff, 0x8b, 0xff, 0x92, 0xff, 0x92, 0xff, 0x9f, 0xff, 0x9f, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x08, 0x00, 0x08, 0x00, 0x15, 0x00, 0x15, 0x00, 0x21, 0x00, 0x21, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x37, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x48, 0x00, 0x48, 0x00, 0x50, 0x00, 0x50, 0x00, 0x56, 0x00, 0x56, 0x00, 0x58, 0x00, 0x58, 0x00, 0x57, 0x00, 0x57, 0x00, 0x55, 0x00, 0x55, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x43, 0x00, 0x34, 0x00, 0x34, 0x00, 0x24, 0x00, 0x24, 0x00, 0x15, 0x00, 0x15, 0x00, 0x04, 0x00, 0x04, 0x00, 0xf2, 0xff, 0xf2, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xbc, 0xff, 0xbc, 0xff, 0xb3, 0xff, 0xb3, 0xff, 0xab, 0xff, 0xab, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0x98, 0xff, 0x98, 0xff, 0x95, 0xff, 0x95, 0xff, 0x96, 0xff, 0x96, 0xff, 0x9b, 0xff, 0x9b, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xb1, 0xff, 0xb1, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0x09, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x40, 0x00, 0x40, 0x00, 0x50, 0x00, 0x50, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x64, 0x00, 0x64, 0x00, 0x69, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x69, 0x00, 0x64, 0x00, 0x64, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x54, 0x00, 0x54, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x31, 0x00, 0x31, 0x00, 0x24, 0x00, 0x24, 0x00, 0x17, 0x00, 0x17, 0x00, 0x08, 0x00, 0x08, 0x00, 0xf9, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xec, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xca, 0xff, 0xca, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb0, 0xff, 0xb0, 0xff, 0xab, 0xff, 0xab, 0xff, 0xa5, 0xff, 0xa5, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xa6, 0xff, 0xa6, 0xff, 0xa9, 0xff, 0xa9, 0xff, 0xaf, 0xff, 0xaf, 0xff, 0xb6, 0xff, 0xb6, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xce, 0xff, 0xce, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x08, 0x00, 0x08, 0x00, 0x15, 0x00, 0x15, 0x00, 0x21, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x46, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x52, 0x00, 0x54, 0x00, 0x54, 0x00, 0x53, 0x00, 0x53, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x43, 0x00, 0x43, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x21, 0x00, 0x21, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xed, 0xff, 0xed, 0xff, 0xec, 0xff, 0xec, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xef, 0xff, 0xec, 0xff, 0xec, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x20, 0x00, 0x24, 0x00, 0x24, 0x00, 0x27, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x28, 0x00, 0x28, 0x00, 0x27, 0x00, 0x27, 0x00, 0x26, 0x00, 0x26, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x05, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xce, 0xff, 0xce, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xbe, 0xff, 0xbe, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xca, 0xff, 0xca, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x14, 0x00, 0x19, 0x00, 0x19, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x21, 0x00, 0x21, 0x00, 0x26, 0x00, 0x26, 0x00, 0x28, 0x00, 0x28, 0x00, 0x27, 0x00, 0x27, 0x00, 0x26, 0x00, 0x26, 0x00, 0x25, 0x00, 0x25, 0x00, 0x23, 0x00, 0x23, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x19, 0x00, 0x19, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xda, 0xff, 0xda, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0x10, 0x00, 0x10, 0x00, 0x16, 0x00, 0x16, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x35, 0x00, 0x37, 0x00, 0x37, 0x00, 0x36, 0x00, 0x36, 0x00, 0x31, 0x00, 0x31, 0x00, 0x29, 0x00, 0x29, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x17, 0x00, 0x17, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x02, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xd6, 0xff, 0xd6, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0x02, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x27, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x31, 0x00, 0x32, 0x00, 0x32, 0x00, 0x33, 0x00, 0x33, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x34, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x27, 0x00, 0x27, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x17, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x04, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xee, 0xff, 0xee, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd8, 0xff, 0xd8, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc2, 0xff, 0xc2, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xc5, 0xff, 0xc5, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0x03, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x19, 0x00, 0x22, 0x00, 0x22, 0x00, 0x29, 0x00, 0x29, 0x00, 0x30, 0x00, 0x30, 0x00, 0x35, 0x00, 0x35, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x43, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x44, 0x00, 0x44, 0x00, 0x43, 0x00, 0x43, 0x00, 0x43, 0x00, 0x43, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x34, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x23, 0x00, 0x23, 0x00, 0x19, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xed, 0xff, 0xde, 0xff, 0xde, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc6, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xca, 0xff, 0xca, 0xff, 0xce, 0xff, 0xce, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xea, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x02, 0x00, 0x02, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x21, 0x00, 0x24, 0x00, 0x24, 0x00, 0x27, 0x00, 0x27, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x28, 0x00, 0x28, 0x00, 0x23, 0x00, 0x23, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x17, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xec, 0xff, 0xec, 0xff, 0xee, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x09, 0x00, 0x10, 0x00, 0x10, 0x00, 0x15, 0x00, 0x15, 0x00, 0x18, 0x00, 0x18, 0x00, 0x19, 0x00, 0x19, 0x00, 0x18, 0x00, 0x18, 0x00, 0x17, 0x00, 0x17, 0x00, 0x16, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x13, 0x00, 0x13, 0x00, 0x13, 0x00, 0x13, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x07, 0x00, 0x07, 0x00, 0x03, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xef, 0xff, 0xef, 0xff, 0xed, 0xff, 0xed, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xde, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xe3, 0xff, 0xe3, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xea, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x07, 0x00, 0x07, 0x00, 0x03, 0x00, 0x03, 0x00, 0xfb, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xc8, 0xff, 0xc8, 0xff, 0xca, 0xff, 0xca, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xd9, 0xff, 0xd9, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x09, 0x00, 0x14, 0x00, 0x14, 0x00, 0x23, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x25, 0x00, 0x25, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x13, 0x00, 0x13, 0x00, 0x08, 0x00, 0x08, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xef, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xd5, 0xff, 0xd5, 0xff, 0xce, 0xff, 0xce, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xcc, 0xff, 0xcf, 0xff, 0xcf, 0xff, 0xd0, 0xff, 0xd0, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xd4, 0xff, 0xd4, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x02, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x07, 0x00, 0x07, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1b, 0x00, 0x1b, 0x00, 0x16, 0x00, 0x16, 0x00, 0x11, 0x00, 0x11, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xed, 0xff, 0xed, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe5, 0xff, 0xe5, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xca, 0xff, 0xca, 0xff, 0xd1, 0xff, 0xd1, 0xff, 0xde, 0xff, 0xde, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x15, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x47, 0x00, 0x47, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x55, 0x00, 0x55, 0x00, 0x59, 0x00, 0x59, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x58, 0x00, 0x58, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x45, 0x00, 0x45, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x42, 0x00, 0x49, 0x00, 0x49, 0x00, 0x42, 0x00, 0x42, 0x00, 0x39, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x33, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x33, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x08, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xea, 0xff, 0xea, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0x04, 0x00, 0x04, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x28, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x59, 0x00, 0x59, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x75, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x66, 0x00, 0x74, 0x00, 0x74, 0x00, 0x87, 0x00, 0x87, 0x00, 0x81, 0x00, 0x81, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x65, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x50, 0x00, 0x45, 0x00, 0x45, 0x00, 0x37, 0x00, 0x37, 0x00, 0x21, 0x00, 0x21, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x15, 0x00, 0xfd, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xee, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0x05, 0x00, 0x05, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0x0b, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x24, 0x00, 0x25, 0x00, 0x25, 0x00, 0x2c, 0x00, 0x2c, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x57, 0x00, 0x57, 0x00, 0x39, 0x00, 0x39, 0x00, 0x35, 0x00, 0x35, 0x00, 0x5d, 0x00, 0x5d, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x6b, 0x00, 0x6b, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x84, 0x00, 0x84, 0x00, 0xde, 0x00, 0xde, 0x00, 0xab, 0x00, 0xab, 0x00, 0x89, 0xff, 0x89, 0xff, 0x52, 0xfd, 0x52, 0xfd, 0xba, 0xfa, 0xba, 0xfa, 0x11, 0xfa, 0x11, 0xfa, 0x79, 0xfc, 0x79, 0xfc, 0x96, 0xff, 0x96, 0xff, 0xee, 0x00, 0xee, 0x00, 0x69, 0x00, 0x69, 0x00, 0x63, 0xfe, 0x63, 0xfe, 0xa0, 0xfb, 0xa0, 0xfb, 0xdd, 0xf9, 0xdd, 0xf9, 0x58, 0xf9, 0x58, 0xf9, 0xec, 0xf8, 0xed, 0xf8, 0x22, 0xf9, 0x22, 0xf9, 0x2b, 0xfb, 0x2b, 0xfb, 0x4b, 0xfe, 0x4b, 0xfe, 0xaa, 0x00, 0xaa, 0x00, 0x0c, 0x01, 0x0c, 0x01, 0x5a, 0xff, 0x5a, 0xff, 0xcc, 0xfc, 0xcc, 0xfc, 0x43, 0xfb, 0x44, 0xfb, 0x0b, 0xfc, 0x0b, 0xfc, 0xb1, 0xfe, 0xb2, 0xfe, 0x15, 0x01, 0x15, 0x01, 0x81, 0x01, 0x81, 0x01, 0x2d, 0x00, 0x2d, 0x00, 0x02, 0xfe, 0x02, 0xfe, 0xdd, 0xfb, 0xdd, 0xfb, 0xed, 0xfa, 0xed, 0xfa, 0x80, 0xfb, 0x81, 0xfb, 0x7f, 0xfc, 0x7f, 0xfc, 0x1a, 0xfd, 0x1a, 0xfd, 0x75, 0xfd, 0x75, 0xfd, 0x8c, 0xfd, 0x8c, 0xfd, 0x22, 0xfd, 0x22, 0xfd, 0xa2, 0xfc, 0xa2, 0xfc, 0xf1, 0xfc, 0xf1, 0xfc, 0x38, 0xfe, 0x38, 0xfe, 0xcb, 0xff, 0xcb, 0xff, 0x06, 0x01, 0x07, 0x01, 0x92, 0x01, 0x92, 0x01, 0x93, 0x01, 0x93, 0x01, 0x11, 0x02, 0x11, 0x02, 0xc7, 0x03, 0xc7, 0x03, 0xdb, 0x05, 0xdb, 0x05, 0x16, 0x07, 0x16, 0x07, 0x51, 0x07, 0x51, 0x07, 0x18, 0x07, 0x18, 0x07, 0xfa, 0x06, 0xfa, 0x06, 0x08, 0x07, 0x08, 0x07, 0xf5, 0x06, 0xf5, 0x06, 0xd8, 0x06, 0xd8, 0x06, 0x09, 0x07, 0x09, 0x07, 0x4c, 0x07, 0x4c, 0x07, 0xff, 0x06, 0xff, 0x06, 0x8c, 0x05, 0x8b, 0x05, 0xfa, 0x02, 0xfa, 0x02, 0xa8, 0x00, 0xa8, 0x00, 0x29, 0x00, 0x28, 0x00, 0x52, 0x01, 0x51, 0x01, 0xa4, 0x02, 0xa3, 0x02, 0x03, 0x03, 0x02, 0x03, 0x4e, 0x02, 0x4d, 0x02, 0x10, 0x01, 0x10, 0x01, 0xe1, 0xff, 0xe1, 0xff, 0x2d, 0xff, 0x2d, 0xff, 0x64, 0xff, 0x64, 0xff, 0x9d, 0x00, 0x9d, 0x00, 0x6c, 0x02, 0x6c, 0x02, 0x44, 0x04, 0x43, 0x04, 0x7c, 0x05, 0x7c, 0x05, 0xb4, 0x05, 0xb3, 0x05, 0x75, 0x05, 0x74, 0x05, 0x84, 0x05, 0x83, 0x05, 0x16, 0x06, 0x16, 0x06, 0x35, 0x07, 0x35, 0x07, 0xcb, 0x08, 0xcb, 0x08, 0x6a, 0x0a, 0x6a, 0x0a, 0xaa, 0x0b, 0xa9, 0x0b, 0x4b, 0x0c, 0x4b, 0x0c, 0x50, 0x0c, 0x4f, 0x0c, 0x34, 0x0c, 0x34, 0x0c, 0x6c, 0x0c, 0x6b, 0x0c, 0xfc, 0x0c, 0xfc, 0x0c, 0x99, 0x0d, 0x99, 0x0d, 0x9b, 0x0d, 0x9a, 0x0d, 0x7c, 0x0c, 0x7b, 0x0c, 0x8e, 0x0a, 0x8e, 0x0a, 0x64, 0x08, 0x64, 0x08, 0x4f, 0x06, 0x4e, 0x06, 0xe7, 0x04, 0xe6, 0x04, 0x8f, 0x04, 0x8f, 0x04, 0x8b, 0x04, 0x8a, 0x04, 0xb7, 0x03, 0xb6, 0x03, 0xa6, 0x01, 0xa6, 0x01, 0xb9, 0xfe, 0xb9, 0xfe, 0xe5, 0xfb, 0xe5, 0xfb, 0x3f, 0xfa, 0x3e, 0xfa, 0x23, 0xfa, 0x23, 0xfa, 0x03, 0xfb, 0x02, 0xfb, 0xf5, 0xfb, 0xf4, 0xfb, 0x3b, 0xfc, 0x3a, 0xfc, 0x7b, 0xfb, 0x7a, 0xfb, 0xc9, 0xf9, 0xc8, 0xf9, 0xaf, 0xf7, 0xaf, 0xf7, 0x22, 0xf6, 0x21, 0xf6, 0xe7, 0xf5, 0xe6, 0xf5, 0xfc, 0xf6, 0xfb, 0xf6, 0x97, 0xf8, 0x97, 0xf8, 0xc5, 0xf9, 0xc5, 0xf9, 0xf9, 0xf9, 0xf8, 0xf9, 0x40, 0xf9, 0x40, 0xf9, 0x35, 0xf8, 0x35, 0xf8, 0x8b, 0xf7, 0x8b, 0xf7, 0x9b, 0xf7, 0x9b, 0xf7, 0x33, 0xf8, 0x33, 0xf8, 0xd7, 0xf8, 0xd7, 0xf8, 0xf0, 0xf8, 0xf1, 0xf8, 0x09, 0xf8, 0x0a, 0xf8, 0x77, 0xf6, 0x78, 0xf6, 0x48, 0xf5, 0x49, 0xf5, 0x5a, 0xf5, 0x5b, 0xf5, 0xb5, 0xf6, 0xb6, 0xf6, 0x89, 0xf8, 0x8a, 0xf8, 0xa0, 0xf9, 0xa1, 0xf9, 0x5a, 0xf9, 0x5b, 0xf9, 0x24, 0xf8, 0x25, 0xf8, 0xe7, 0xf6, 0xe8, 0xf6, 0x6f, 0xf6, 0x70, 0xf6, 0x1c, 0xf7, 0x1d, 0xf7, 0xa8, 0xf8, 0xa9, 0xf8, 0x5a, 0xfa, 0x5a, 0xfa, 0x8d, 0xfb, 0x8d, 0xfb, 0xeb, 0xfb, 0xeb, 0xfb, 0x7b, 0xfb, 0x7b, 0xfb, 0xb2, 0xfa, 0xb2, 0xfa, 0x2c, 0xfa, 0x2c, 0xfa, 0x48, 0xfa, 0x48, 0xfa, 0x1a, 0xfb, 0x19, 0xfb, 0x7e, 0xfc, 0x7d, 0xfc, 0x12, 0xfe, 0x11, 0xfe, 0x50, 0xff, 0x4f, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xec, 0xff, 0xea, 0xff, 0xea, 0xff, 0xe9, 0xff, 0x55, 0x00, 0x54, 0x00, 0x3a, 0x01, 0x39, 0x01, 0x2f, 0x02, 0x2d, 0x02, 0x9d, 0x02, 0x9b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0xaf, 0x01, 0xb6, 0x01, 0x7d, 0x01, 0x8b, 0x01, 0x0a, 0x02, 0x1e, 0x02, 0x2a, 0x03, 0x3f, 0x03, 0x6b, 0x04, 0x7d, 0x04, 0x3f, 0x05, 0x4b, 0x05, 0x34, 0x05, 0x3a, 0x05, 0x4e, 0x04, 0x4f, 0x04, 0x0d, 0x03, 0x0e, 0x03, 0xfe, 0x01, 0x05, 0x02, 0x7e, 0x01, 0x8e, 0x01, 0xb3, 0x01, 0xcb, 0x01, 0x63, 0x02, 0x7e, 0x02, 0x00, 0x03, 0x18, 0x03, 0x13, 0x03, 0x21, 0x03, 0x86, 0x02, 0x87, 0x02, 0x78, 0x01, 0x6f, 0x01, 0x22, 0x00, 0x13, 0x00, 0xeb, 0xfe, 0xdb, 0xfe, 0x3e, 0xfe, 0x32, 0xfe, 0x1c, 0xfe, 0x14, 0xfe, 0x26, 0xfe, 0x20, 0xfe, 0x08, 0xfe, 0x00, 0xfe, 0x9a, 0xfd, 0x90, 0xfd, 0xe8, 0xfc, 0xdb, 0xfc, 0x36, 0xfc, 0x29, 0xfc, 0xc0, 0xfb, 0xb7, 0xfb, 0x75, 0xfb, 0x74, 0xfb, 0x18, 0xfb, 0x1e, 0xfb, 0x8c, 0xfa, 0x97, 0xfa, 0xd2, 0xf9, 0xde, 0xf9, 0x07, 0xf9, 0x11, 0xf9, 0x76, 0xf8, 0x7d, 0xf8, 0x62, 0xf8, 0x66, 0xf8, 0xc7, 0xf8, 0xc9, 0xf8, 0x64, 0xf9, 0x65, 0xf9, 0xe0, 0xf9, 0xde, 0xf9, 0xed, 0xf9, 0xe9, 0xf9, 0x75, 0xf9, 0x6c, 0xf9, 0xaa, 0xf8, 0x9b, 0xf8, 0xfb, 0xf7, 0xe8, 0xf7, 0xd5, 0xf7, 0xbe, 0xf7, 0x56, 0xf8, 0x3a, 0xf8, 0x55, 0xf9, 0x35, 0xf9, 0x8a, 0xfa, 0x66, 0xfa, 0x92, 0xfb, 0x6b, 0xfb, 0x20, 0xfc, 0xf7, 0xfb, 0x40, 0xfc, 0x17, 0xfc, 0x47, 0xfc, 0x20, 0xfc, 0x6b, 0xfc, 0x48, 0xfc, 0xc4, 0xfc, 0xa6, 0xfc, 0x60, 0xfd, 0x48, 0xfd, 0x21, 0xfe, 0x12, 0xfe, 0xe4, 0xfe, 0xe0, 0xfe, 0xaa, 0xff, 0xb0, 0xff, 0x78, 0x00, 0x86, 0x00, 0x42, 0x01, 0x56, 0x01, 0x06, 0x02, 0x1f, 0x02, 0xc5, 0x02, 0xe1, 0x02, 0x66, 0x03, 0x87, 0x03, 0xd0, 0x03, 0xf6, 0x03, 0x03, 0x04, 0x2c, 0x04, 0x1d, 0x04, 0x49, 0x04, 0x56, 0x04, 0x86, 0x04, 0xdd, 0x04, 0x13, 0x05, 0xbd, 0x05, 0xf3, 0x05, 0xcd, 0x06, 0xfd, 0x06, 0xbc, 0x07, 0xe1, 0x07, 0x3f, 0x08, 0x59, 0x08, 0x57, 0x08, 0x6c, 0x08, 0x2f, 0x08, 0x47, 0x08, 0xff, 0x07, 0x1e, 0x08, 0x02, 0x08, 0x24, 0x08, 0x5a, 0x08, 0x78, 0x08, 0xf5, 0x08, 0x0a, 0x09, 0xa0, 0x09, 0xa9, 0x09, 0x29, 0x0a, 0x27, 0x0a, 0x69, 0x0a, 0x61, 0x0a, 0x4d, 0x0a, 0x48, 0x0a, 0xe5, 0x09, 0xeb, 0x09, 0x4f, 0x09, 0x61, 0x09, 0xa2, 0x08, 0xbd, 0x08, 0xf5, 0x07, 0x10, 0x08, 0x65, 0x07, 0x75, 0x07, 0x09, 0x07, 0x0a, 0x07, 0xda, 0x06, 0xd1, 0x06, 0xb4, 0x06, 0xac, 0x06, 0x6e, 0x06, 0x6d, 0x06, 0xf4, 0x05, 0xfd, 0x05, 0x43, 0x05, 0x54, 0x05, 0x67, 0x04, 0x7a, 0x04, 0x76, 0x03, 0x83, 0x03, 0x7e, 0x02, 0x81, 0x02, 0x99, 0x01, 0x8f, 0x01, 0xe5, 0x00, 0xd2, 0x00, 0x71, 0x00, 0x5e, 0x00, 0x2c, 0x00, 0x24, 0x00, 0xe8, 0xff, 0xf0, 0xff, 0x83, 0xff, 0x93, 0xff, 0xfd, 0xfe, 0x0a, 0xff, 0x5c, 0xfe, 0x5c, 0xfe, 0xad, 0xfd, 0x9c, 0xfd, 0xff, 0xfc, 0xe2, 0xfc, 0x5e, 0xfc, 0x3f, 0xfc, 0xd9, 0xfb, 0xbe, 0xfb, 0x91, 0xfb, 0x7b, 0xfb, 0x93, 0xfb, 0x7c, 0xfb, 0xc1, 0xfb, 0xa2, 0xfb, 0xf8, 0xfb, 0xcb, 0xfb, 0x0d, 0xfc, 0xd1, 0xfb, 0xe4, 0xfb, 0x9a, 0xfb, 0x93, 0xfb, 0x3e, 0xfb, 0x40, 0xfb, 0xe3, 0xfa, 0xf9, 0xfa, 0x98, 0xfa, 0xda, 0xfa, 0x76, 0xfa, 0xf9, 0xfa, 0x92, 0xfa, 0x4b, 0xfb, 0xe2, 0xfa, 0xc6, 0xfb, 0x5e, 0xfb, 0x55, 0xfc, 0xf3, 0xfb, 0xc9, 0xfc, 0x70, 0xfc, 0x01, 0xfd, 0xb0, 0xfc, 0x0d, 0xfd, 0xc1, 0xfc, 0x13, 0xfd, 0xc8, 0xfc, 0x33, 0xfd, 0xeb, 0xfc, 0x76, 0xfd, 0x36, 0xfd, 0xc5, 0xfd, 0x95, 0xfd, 0x1b, 0xfe, 0xfc, 0xfd, 0x8c, 0xfe, 0x7c, 0xfe, 0x23, 0xff, 0x1a, 0xff, 0xcd, 0xff, 0xc6, 0xff, 0x62, 0x00, 0x55, 0x00, 0xbb, 0x00, 0xa6, 0x00, 0xde, 0x00, 0xc0, 0x00, 0xfb, 0x00, 0xd8, 0x00, 0x35, 0x01, 0x13, 0x01, 0x90, 0x01, 0x6e, 0x01, 0xfe, 0x01, 0xd7, 0x01, 0x8b, 0x02, 0x58, 0x02, 0x46, 0x03, 0x02, 0x03, 0x21, 0x04, 0xcc, 0x03, 0xf1, 0x04, 0x90, 0x04, 0x7a, 0x05, 0x12, 0x05, 0xa2, 0x05, 0x35, 0x05, 0x9a, 0x05, 0x2a, 0x05, 0xac, 0x05, 0x3b, 0x05, 0xf3, 0x05, 0x84, 0x05, 0x5f, 0x06, 0xf9, 0x05, 0xd8, 0x06, 0x80, 0x06, 0x42, 0x07, 0xfd, 0x06, 0x97, 0x07, 0x62, 0x07, 0xd6, 0x07, 0xaf, 0x07, 0xe7, 0x07, 0xca, 0x07, 0xbb, 0x07, 0xa8, 0x07, 0x67, 0x07, 0x62, 0x07, 0x00, 0x07, 0x0f, 0x07, 0x93, 0x06, 0xc0, 0x06, 0x2c, 0x06, 0x7f, 0x06, 0xca, 0x05, 0x49, 0x06, 0x6d, 0x05, 0x17, 0x06, 0x1a, 0x05, 0xe6, 0x05, 0xbc, 0x04, 0x9c, 0x05, 0x35, 0x04, 0x1e, 0x05, 0x83, 0x03, 0x71, 0x04, 0xad, 0x02, 0xa8, 0x03, 0xc9, 0x01, 0xdb, 0x02, 0xf9, 0x00, 0x27, 0x02, 0x47, 0x00, 0x8b, 0x01, 0xa7, 0xff, 0xf6, 0x00, 0x1a, 0xff, 0x65, 0x00, 0x9f, 0xfe, 0xdd, 0xff, 0x21, 0xfe, 0x50, 0xff, 0x94, 0xfd, 0xb7, 0xfe, 0xf3, 0xfc, 0x11, 0xfe, 0x3b, 0xfc, 0x5c, 0xfd, 0x78, 0xfb, 0xa1, 0xfc, 0xc2, 0xfa, 0xf3, 0xfb, 0x2e, 0xfa, 0x62, 0xfb, 0xd0, 0xf9, 0xf9, 0xfa, 0xa7, 0xf9, 0xba, 0xfa, 0x9b, 0xf9, 0x95, 0xfa, 0x8b, 0xf9, 0x70, 0xfa, 0x5f, 0xf9, 0x38, 0xfa, 0x16, 0xf9, 0xe5, 0xf9, 0xc8, 0xf8, 0x88, 0xf9, 0x90, 0xf8, 0x39, 0xf9, 0x72, 0xf8, 0x01, 0xf9, 0x71, 0xf8, 0xeb, 0xf8, 0x98, 0xf8, 0x01, 0xf9, 0xeb, 0xf8, 0x43, 0xf9, 0x5b, 0xf9, 0x9b, 0xf9, 0xd1, 0xf9, 0xee, 0xf9, 0x3a, 0xfa, 0x2b, 0xfa, 0x8c, 0xfa, 0x4c, 0xfa, 0xcd, 0xfa, 0x5c, 0xfa, 0x11, 0xfb, 0x74, 0xfa, 0x5f, 0xfb, 0xa5, 0xfa, 0xc1, 0xfb, 0xf5, 0xfa, 0x3b, 0xfc, 0x65, 0xfb, 0xcf, 0xfc, 0xf1, 0xfb, 0x73, 0xfd, 0x8a, 0xfc, 0x19, 0xfe, 0x20, 0xfd, 0xae, 0xfe, 0xa6, 0xfd, 0x26, 0xff, 0x14, 0xfe, 0x84, 0xff, 0x71, 0xfe, 0xd3, 0xff, 0xc8, 0xfe, 0x28, 0x00, 0x2b, 0xff, 0x99, 0x00, 0xac, 0xff, 0x26, 0x01, 0x47, 0x00, 0xca, 0x01, 0xf2, 0x00, 0x76, 0x02, 0x9c, 0x01, 0x12, 0x03, 0x33, 0x02, 0x98, 0x03, 0xb3, 0x02, 0x02, 0x04, 0x1c, 0x03, 0x51, 0x04, 0x6b, 0x03, 0x8d, 0x04, 0xa6, 0x03, 0xc9, 0x04, 0xd8, 0x03, 0x18, 0x05, 0x10, 0x04, 0x83, 0x05, 0x5c, 0x04, 0xfe, 0x05, 0xb6, 0x04, 0x72, 0x06, 0x0f, 0x05, 0xc8, 0x06, 0x57, 0x05, 0xfa, 0x06, 0x84, 0x05, 0x0e, 0x07, 0x95, 0x05, 0x05, 0x07, 0x86, 0x05, 0xe8, 0x06, 0x5f, 0x05, 0xbe, 0x06, 0x2e, 0x05, 0x92, 0x06, 0xfd, 0x04, 0x6f, 0x06, 0xe1, 0x04, 0x5c, 0x06, 0xdd, 0x04, 0x46, 0x06, 0xe1, 0x04, 0x1a, 0x06, 0xd8, 0x04, 0xd1, 0x05, 0xb9, 0x04, 0x65, 0x05, 0x79, 0x04, 0xd1, 0x04, 0x15, 0x04, 0x26, 0x04, 0x9e, 0x03, 0x74, 0x03, 0x25, 0x03, 0xcb, 0x02, 0xb7, 0x02, 0x3c, 0x02, 0x5f, 0x02, 0xc0, 0x01, 0x16, 0x02, 0x44, 0x01, 0xc7, 0x01, 0xbd, 0x00, 0x6a, 0x01, 0x28, 0x00, 0xfe, 0x00, 0x84, 0xff, 0x7f, 0x00, 0xd7, 0xfe, 0xf0, 0xff, 0x26, 0xfe, 0x54, 0xff, 0x79, 0xfd, 0xb1, 0xfe, 0xe1, 0xfc, 0x17, 0xfe, 0x63, 0xfc, 0x8e, 0xfd, 0xf3, 0xfb, 0x0f, 0xfd, 0x87, 0xfb, 0x95, 0xfc, 0x1e, 0xfb, 0x21, 0xfc, 0xb8, 0xfa, 0xb2, 0xfb, 0x57, 0xfa, 0x46, 0xfb, 0xfa, 0xf9, 0xda, 0xfa, 0x9c, 0xf9, 0x68, 0xfa, 0x43, 0xf9, 0xf3, 0xf9, 0xfb, 0xf8, 0x8d, 0xf9, 0xd1, 0xf8, 0x47, 0xf9, 0xc6, 0xf8, 0x2c, 0xf9, 0xd5, 0xf8, 0x3b, 0xf9, 0xea, 0xf8, 0x60, 0xf9, 0xf5, 0xf8, 0x83, 0xf9, 0xf4, 0xf8, 0x9d, 0xf9, 0xef, 0xf8, 0xb0, 0xf9, 0xeb, 0xf8, 0xc1, 0xf9, 0xf2, 0xf8, 0xdb, 0xf9, 0x13, 0xf9, 0x0e, 0xfa, 0x50, 0xf9, 0x5d, 0xfa, 0xa3, 0xf9, 0xc5, 0xfa, 0x0c, 0xfa, 0x45, 0xfb, 0x81, 0xfa, 0xd0, 0xfb, 0xf8, 0xfa, 0x57, 0xfc, 0x6e, 0xfb, 0xd1, 0xfc, 0xe3, 0xfb, 0x40, 0xfd, 0x58, 0xfc, 0xaa, 0xfd, 0xd2, 0xfc, 0x16, 0xfe, 0x54, 0xfd, 0x88, 0xfe, 0xe0, 0xfd, 0xfe, 0xfe, 0x76, 0xfe, 0x76, 0xff, 0x14, 0xff, 0xf2, 0xff, 0xb5, 0xff, 0x70, 0x00, 0x52, 0x00, 0xed, 0x00, 0xe2, 0x00, 0x63, 0x01, 0x5e, 0x01, 0xc8, 0x01, 0xc6, 0x01, 0x1a, 0x02, 0x1c, 0x02, 0x5c, 0x02, 0x6d, 0x02, 0x96, 0x02, 0xc8, 0x02, 0xd5, 0x02, 0x33, 0x03, 0x21, 0x03, 0xa3, 0x03, 0x79, 0x03, 0x0c, 0x04, 0xd5, 0x03, 0x61, 0x04, 0x2b, 0x04, 0x95, 0x04, 0x6a, 0x04, 0xa4, 0x04, 0x89, 0x04, 0x9d, 0x04, 0x8f, 0x04, 0x93, 0x04, 0x8e, 0x04, 0x86, 0x04, 0x8a, 0x04, 0x77, 0x04, 0x84, 0x04, 0x6f, 0x04, 0x84, 0x04, 0x6c, 0x04, 0x86, 0x04, 0x67, 0x04, 0x85, 0x04, 0x5d, 0x04, 0x7c, 0x04, 0x40, 0x04, 0x63, 0x04, 0x08, 0x04, 0x32, 0x04, 0xbc, 0x03, 0xed, 0x03, 0x6b, 0x03, 0xa1, 0x03, 0x1f, 0x03, 0x56, 0x03, 0xdd, 0x02, 0x0f, 0x03, 0xa4, 0x02, 0xcc, 0x02, 0x6d, 0x02, 0x87, 0x02, 0x34, 0x02, 0x3d, 0x02, 0xef, 0x01, 0xe8, 0x01, 0x95, 0x01, 0x81, 0x01, 0x27, 0x01, 0x0c, 0x01, 0xaf, 0x00, 0x92, 0x00, 0x34, 0x00, 0x19, 0x00, 0xc1, 0xff, 0xa2, 0xff, 0x5f, 0xff, 0x35, 0xff, 0x08, 0xff, 0xca, 0xfe, 0xb4, 0xfe, 0x5e, 0xfe, 0x64, 0xfe, 0xf8, 0xfd, 0x18, 0xfe, 0x9a, 0xfd, 0xc8, 0xfd, 0x3b, 0xfd, 0x74, 0xfd, 0xd9, 0xfc, 0x1e, 0xfd, 0x76, 0xfc, 0xc3, 0xfc, 0x0e, 0xfc, 0x69, 0xfc, 0xa9, 0xfb, 0x1d, 0xfc, 0x50, 0xfb, 0xe7, 0xfb, 0x0a, 0xfb, 0xcc, 0xfb, 0xdc, 0xfa, 0xc9, 0xfb, 0xc5, 0xfa, 0xd2, 0xfb, 0xbd, 0xfa, 0xdd, 0xfb, 0xbb, 0xfa, 0xdd, 0xfb, 0xb2, 0xfa, 0xcd, 0xfb, 0x9b, 0xfa, 0xbc, 0xfb, 0x85, 0xfa, 0xb7, 0xfb, 0x80, 0xfa, 0xbe, 0xfb, 0x8c, 0xfa, 0xcf, 0xfb, 0xa4, 0xfa, 0xeb, 0xfb, 0xc7, 0xfa, 0x10, 0xfc, 0xee, 0xfa, 0x39, 0xfc, 0x14, 0xfb, 0x65, 0xfc, 0x42, 0xfb, 0x96, 0xfc, 0x80, 0xfb, 0xc0, 0xfc, 0xc5, 0xfb, 0xe8, 0xfc, 0x0e, 0xfc, 0x1a, 0xfd, 0x5f, 0xfc, 0x5f, 0xfd, 0xb8, 0xfc, 0xb1, 0xfd, 0x12, 0xfd, 0x0e, 0xfe, 0x6a, 0xfd, 0x79, 0xfe, 0xc9, 0xfd, 0xea, 0xfe, 0x2e, 0xfe, 0x5a, 0xff, 0x97, 0xfe, 0xcb, 0xff, 0x0d, 0xff, 0x39, 0x00, 0x8d, 0xff, 0x9f, 0x00, 0x08, 0x00, 0x06, 0x01, 0x7d, 0x00, 0x75, 0x01, 0xec, 0x00, 0xee, 0x01, 0x59, 0x01, 0x71, 0x02, 0xc8, 0x01, 0xf7, 0x02, 0x3d, 0x02, 0x7b, 0x03, 0xb6, 0x02, 0xf3, 0x03, 0x27, 0x03, 0x56, 0x04, 0x85, 0x03, 0xa9, 0x04, 0xd2, 0x03, 0xf1, 0x04, 0x0c, 0x04, 0x2b, 0x05, 0x31, 0x04, 0x5f, 0x05, 0x49, 0x04, 0x9b, 0x05, 0x6c, 0x04, 0xdf, 0x05, 0xa0, 0x04, 0x1d, 0x06, 0xda, 0x04, 0x51, 0x06, 0x14, 0x05, 0x78, 0x06, 0x44, 0x05, 0x88, 0x06, 0x5d, 0x05, 0x85, 0x06, 0x62, 0x05, 0x76, 0x06, 0x5f, 0x05, 0x5c, 0x06, 0x58, 0x05, 0x39, 0x06, 0x4e, 0x05, 0x14, 0x06, 0x46, 0x05, 0xe8, 0x05, 0x3e, 0x05, 0xab, 0x05, 0x2c, 0x05, 0x63, 0x05, 0x14, 0x05, 0x19, 0x05, 0xfc, 0x04, 0xca, 0x04, 0xdd, 0x04, 0x75, 0x04, 0xb4, 0x04, 0x19, 0x04, 0x82, 0x04, 0xb2, 0x03, 0x46, 0x04, 0x3d, 0x03, 0xfd, 0x03, 0xbb, 0x02, 0xa9, 0x03, 0x3a, 0x02, 0x56, 0x03, 0xc2, 0x01, 0x0b, 0x03, 0x5d, 0x01, 0xcb, 0x02, 0x03, 0x01, 0x8a, 0x02, 0xaa, 0x00, 0x38, 0x02, 0x42, 0x00, 0xc9, 0x01, 0xbe, 0xff, 0x3f, 0x01, 0x26, 0xff, 0xac, 0x00, 0x90, 0xfe, 0x27, 0x00, 0x08, 0xfe, 0xb6, 0xff, 0x97, 0xfd, 0x58, 0xff, 0x44, 0xfd, 0x0e, 0xff, 0x02, 0xfd, 0xcc, 0xfe, 0xc0, 0xfc, 0x84, 0xfe, 0x73, 0xfc, 0x2c, 0xfe, 0x1c, 0xfc, 0xc8, 0xfd, 0xb9, 0xfb, 0x5d, 0xfd, 0x53, 0xfb, 0xfe, 0xfc, 0xfd, 0xfa, 0xc0, 0xfc, 0xbc, 0xfa, 0x9e, 0xfc, 0x92, 0xfa, 0x8d, 0xfc, 0x85, 0xfa, 0x86, 0xfc, 0x8f, 0xfa, 0x84, 0xfc, 0x97, 0xfa, 0x7c, 0xfc, 0x96, 0xfa, 0x72, 0xfc, 0x8e, 0xfa, 0x70, 0xfc, 0x88, 0xfa, 0x77, 0xfc, 0x8d, 0xfa, 0x86, 0xfc, 0xaa, 0xfa, 0xa3, 0xfc, 0xe0, 0xfa, 0xcb, 0xfc, 0x24, 0xfb, 0xf9, 0xfc, 0x6f, 0xfb, 0x2c, 0xfd, 0xb7, 0xfb, 0x61, 0xfd, 0xf8, 0xfb, 0x98, 0xfd, 0x33, 0xfc, 0xcd, 0xfd, 0x6c, 0xfc, 0xfb, 0xfd, 0xa9, 0xfc, 0x1c, 0xfe, 0xec, 0xfc, 0x31, 0xfe, 0x2f, 0xfd, 0x3c, 0xfe, 0x70, 0xfd, 0x46, 0xfe, 0xb4, 0xfd, 0x60, 0xfe, 0xff, 0xfd, 0x90, 0xfe, 0x56, 0xfe, 0xd5, 0xfe, 0xb0, 0xfe, 0x21, 0xff, 0x04, 0xff, 0x64, 0xff, 0x49, 0xff, 0x91, 0xff, 0x80, 0xff, 0xa7, 0xff, 0xb5, 0xff, 0xb5, 0xff, 0xf1, 0xff, 0xc8, 0xff, 0x38, 0x00, 0xf1, 0xff, 0x86, 0x00, 0x31, 0x00, 0xd1, 0x00, 0x7d, 0x00, 0x13, 0x01, 0xc0, 0x00, 0x4d, 0x01, 0xf0, 0x00, 0x7e, 0x01, 0x0a, 0x01, 0xa5, 0x01, 0x17, 0x01, 0xc7, 0x01, 0x28, 0x01, 0xe9, 0x01, 0x44, 0x01, 0x12, 0x02, 0x6a, 0x01, 0x41, 0x02, 0x96, 0x01, 0x76, 0x02, 0xc3, 0x01, 0xa1, 0x02, 0xea, 0x01, 0xbe, 0x02, 0x0c, 0x02, 0xcd, 0x02, 0x27, 0x02, 0xd6, 0x02, 0x3b, 0x02, 0xde, 0x02, 0x49, 0x02, 0xe7, 0x02, 0x52, 0x02, 0xef, 0x02, 0x58, 0x02, 0xef, 0x02, 0x50, 0x02, 0xe1, 0x02, 0x37, 0x02, 0xc4, 0x02, 0x11, 0x02, 0xa8, 0x02, 0xf2, 0x01, 0x93, 0x02, 0xe6, 0x01, 0x85, 0x02, 0xeb, 0x01, 0x79, 0x02, 0xf5, 0x01, 0x60, 0x02, 0xec, 0x01, 0x2a, 0x02, 0xc0, 0x01, 0xd5, 0x01, 0x72, 0x01, 0x6d, 0x01, 0x15, 0x01, 0xff, 0x00, 0xb8, 0x00, 0x98, 0x00, 0x65, 0x00, 0x46, 0x00, 0x28, 0x00, 0x0a, 0x00, 0xff, 0xff, 0xd3, 0xff, 0xd9, 0xff, 0x92, 0xff, 0xa9, 0xff, 0x3a, 0xff, 0x66, 0xff, 0xca, 0xfe, 0x10, 0xff, 0x50, 0xfe, 0xb6, 0xfe, 0xe3, 0xfd, 0x6d, 0xfe, 0x94, 0xfd, 0x3a, 0xfe, 0x5e, 0xfd, 0x0f, 0xfe, 0x3e, 0xfd, 0xe6, 0xfd, 0x29, 0xfd, 0xbb, 0xfd, 0x16, 0xfd, 0x8e, 0xfd, 0x02, 0xfd, 0x66, 0xfd, 0xea, 0xfc, 0x41, 0xfd, 0xd2, 0xfc, 0x1d, 0xfd, 0xbf, 0xfc, 0xf3, 0xfc, 0xb5, 0xfc, 0xc4, 0xfc, 0xb7, 0xfc, 0x94, 0xfc, 0xcf, 0xfc, 0x70, 0xfc, 0xf9, 0xfc, 0x5d, 0xfc, 0x30, 0xfd, 0x5c, 0xfc, 0x6a, 0xfd, 0x68, 0xfc, 0xa0, 0xfd, 0x77, 0xfc, 0xcf, 0xfd, 0x81, 0xfc, 0xfa, 0xfd, 0x80, 0xfc, 0x23, 0xfe, 0x73, 0xfc, 0x49, 0xfe, 0x5d, 0xfc, 0x6c, 0xfe, 0x4a, 0xfc, 0x91, 0xfe, 0x4b, 0xfc, 0xc2, 0xfe, 0x68, 0xfc, 0x06, 0xff, 0x9d, 0xfc, 0x5c, 0xff, 0xde, 0xfc, 0xba, 0xff, 0x1b, 0xfd, 0x0d, 0x00, 0x49, 0xfd, 0x54, 0x00, 0x74, 0xfd, 0x91, 0x00, 0xa9, 0xfd, 0xd0, 0x00, 0xf2, 0xfd, 0x19, 0x01, 0x50, 0xfe, 0x75, 0x01, 0xc1, 0xfe, 0xe4, 0x01, 0x3c, 0xff, 0x57, 0x02, 0xb1, 0xff, 0xc2, 0x02, 0x16, 0x00, 0x1b, 0x03, 0x69, 0x00, 0x5f, 0x03, 0xb1, 0x00, 0x95, 0x03, 0xfa, 0x00, 0xbf, 0x03, 0x4c, 0x01, 0xe5, 0x03, 0xa7, 0x01, 0x17, 0x04, 0x0b, 0x02, 0x57, 0x04, 0x6f, 0x02, 0x9b, 0x04, 0xc8, 0x02, 0xd8, 0x04, 0x13, 0x03, 0x00, 0x05, 0x4d, 0x03, 0x0e, 0x05, 0x78, 0x03, 0x0b, 0x05, 0x9e, 0x03, 0x09, 0x05, 0xcf, 0x03, 0x0d, 0x05, 0x0a, 0x04, 0x11, 0x05, 0x47, 0x04, 0x0c, 0x05, 0x78, 0x04, 0xf5, 0x04, 0x90, 0x04, 0xcc, 0x04, 0x90, 0x04, 0x99, 0x04, 0x80, 0x04, 0x67, 0x04, 0x71, 0x04, 0x3f, 0x04, 0x6f, 0x04, 0x20, 0x04, 0x78, 0x04, 0xfd, 0x03, 0x82, 0x04, 0xcb, 0x03, 0x7e, 0x04, 0x87, 0x03, 0x66, 0x04, 0x37, 0x03, 0x41, 0x04, 0xe8, 0x02, 0x19, 0x04, 0xa5, 0x02, 0xf5, 0x03, 0x69, 0x02, 0xd3, 0x03, 0x28, 0x02, 0xa6, 0x03, 0xe5, 0x01, 0x70, 0x03, 0xa4, 0x01, 0x3b, 0x03, 0x5a, 0x01, 0x01, 0x03, 0x05, 0x01, 0xc4, 0x02, 0xaa, 0x00, 0x87, 0x02, 0x4f, 0x00, 0x4c, 0x02, 0xfa, 0xff, 0x15, 0x02, 0xab, 0xff, 0xde, 0x01, 0x5a, 0xff, 0xa0, 0x01, 0xf9, 0xfe, 0x52, 0x01, 0x8d, 0xfe, 0xfa, 0x00, 0x27, 0xfe, 0xa6, 0x00, 0xcf, 0xfd, 0x61, 0x00, 0x89, 0xfd, 0x2b, 0x00, 0x4c, 0xfd, 0xfb, 0xff, 0x0b, 0xfd, 0xc4, 0xff, 0xc1, 0xfc, 0x83, 0xff, 0x79, 0xfc, 0x3f, 0xff, 0x3b, 0xfc, 0x00, 0xff, 0x0e, 0xfc, 0xcc, 0xfe, 0xf7, 0xfb, 0xa9, 0xfe, 0xe9, 0xfb, 0x8d, 0xfe, 0xd4, 0xfb, 0x68, 0xfe, 0xb3, 0xfb, 0x34, 0xfe, 0x8a, 0xfb, 0xf3, 0xfd, 0x68, 0xfb, 0xb4, 0xfd, 0x5f, 0xfb, 0x88, 0xfd, 0x75, 0xfb, 0x78, 0xfd, 0x9f, 0xfb, 0x78, 0xfd, 0xcf, 0xfb, 0x76, 0xfd, 0x01, 0xfc, 0x6c, 0xfd, 0x2c, 0xfc, 0x55, 0xfd, 0x50, 0xfc, 0x30, 0xfd, 0x75, 0xfc, 0x08, 0xfd, 0xa5, 0xfc, 0xe3, 0xfc, 0xe8, 0xfc, 0xcd, 0xfc, 0x41, 0xfd, 0xcc, 0xfc, 0xb0, 0xfd, 0xe7, 0xfc, 0x28, 0xfe, 0x16, 0xfd, 0x9b, 0xfe, 0x4a, 0xfd, 0xfd, 0xfe, 0x70, 0xfd, 0x4f, 0xff, 0x81, 0xfd, 0x97, 0xff, 0x88, 0xfd, 0xe6, 0xff, 0x97, 0xfd, 0x47, 0x00, 0xc0, 0xfd, 0xb8, 0x00, 0x0c, 0xfe, 0x2a, 0x01, 0x72, 0xfe, 0x85, 0x01, 0xd6, 0xfe, 0xbd, 0x01, 0x28, 0xff, 0xdb, 0x01, 0x6b, 0xff, 0xed, 0x01, 0xa7, 0xff, 0x00, 0x02, 0xe5, 0xff, 0x1d, 0x02, 0x2c, 0x00, 0x40, 0x02, 0x7d, 0x00, 0x61, 0x02, 0xd3, 0x00, 0x81, 0x02, 0x2e, 0x01, 0xa0, 0x02, 0x90, 0x01, 0xb7, 0x02, 0xec, 0x01, 0xc2, 0x02, 0x33, 0x02, 0xc9, 0x02, 0x67, 0x02, 0xd5, 0x02, 0x94, 0x02, 0xe7, 0x02, 0xbd, 0x02, 0xfc, 0x02, 0xe1, 0x02, 0x0f, 0x03, 0x01, 0x03, 0x1b, 0x03, 0x1d, 0x03, 0x21, 0x03, 0x33, 0x03, 0x1f, 0x03, 0x41, 0x03, 0x1c, 0x03, 0x4d, 0x03, 0x1b, 0x03, 0x5a, 0x03, 0x19, 0x03, 0x63, 0x03, 0x0f, 0x03, 0x69, 0x03, 0xf6, 0x02, 0x68, 0x03, 0xc7, 0x02, 0x56, 0x03, 0x84, 0x02, 0x31, 0x03, 0x36, 0x02, 0x01, 0x03, 0xec, 0x01, 0xd6, 0x02, 0xb3, 0x01, 0xbb, 0x02, 0x81, 0x01, 0xa9, 0x02, 0x48, 0x01, 0x93, 0x02, 0xff, 0x00, 0x6d, 0x02, 0xa5, 0x00, 0x33, 0x02, 0x3b, 0x00, 0xe7, 0x01, 0xcd, 0xff, 0x94, 0x01, 0x63, 0xff, 0x42, 0x01, 0xfe, 0xfe, 0xef, 0x00, 0x9e, 0xfe, 0x9b, 0x00, 0x47, 0xfe, 0x4a, 0x00, 0xf9, 0xfd, 0xfa, 0xff, 0xaf, 0xfd, 0xa8, 0xff, 0x6a, 0xfd, 0x54, 0xff, 0x2d, 0xfd, 0xfe, 0xfe, 0xf4, 0xfc, 0x9f, 0xfe, 0xbe, 0xfc, 0x3c, 0xfe, 0x92, 0xfc, 0xe0, 0xfd, 0x71, 0xfc, 0x8e, 0xfd, 0x53, 0xfc, 0x40, 0xfd, 0x3d, 0xfc, 0xf3, 0xfc, 0x36, 0xfc, 0xae, 0xfc, 0x40, 0xfc, 0x74, 0xfc, 0x53, 0xfc, 0x47, 0xfc, 0x68, 0xfc, 0x26, 0xfc, 0x7c, 0xfc, 0x08, 0xfc, 0x88, 0xfc, 0xe6, 0xfb, 0x8f, 0xfc, 0xc0, 0xfb, 0x9f, 0xfc, 0xa5, 0xfb, 0xbf, 0xfc, 0x9e, 0xfb, 0xe7, 0xfc, 0xa9, 0xfb, 0x14, 0xfd, 0xc2, 0xfb, 0x48, 0xfd, 0xee, 0xfb, 0x7a, 0xfd, 0x2a, 0xfc, 0xa3, 0xfd, 0x6e, 0xfc, 0xc3, 0xfd, 0xb2, 0xfc, 0xe3, 0xfd, 0xf4, 0xfc, 0x03, 0xfe, 0x31, 0xfd, 0x22, 0xfe, 0x6b, 0xfd, 0x47, 0xfe, 0xb1, 0xfd, 0x71, 0xfe, 0x0b, 0xfe, 0x95, 0xfe, 0x6b, 0xfe, 0xb8, 0xfe, 0xcb, 0xfe, 0xe8, 0xfe, 0x2d, 0xff, 0x27, 0xff, 0x8c, 0xff, 0x6d, 0xff, 0xde, 0xff, 0xb6, 0xff, 0x26, 0x00, 0xfe, 0xff, 0x64, 0x00, 0x3d, 0x00, 0x9a, 0x00, 0x77, 0x00, 0xcf, 0x00, 0xb7, 0x00, 0x0e, 0x01, 0xff, 0x00, 0x57, 0x01, 0x4c, 0x01, 0x9e, 0x01, 0x9e, 0x01, 0xde, 0x01, 0xf3, 0x01, 0x0e, 0x02, 0x3f, 0x02, 0x2f, 0x02, 0x7e, 0x02, 0x4b, 0x02, 0xa9, 0x02, 0x6b, 0x02, 0xc5, 0x02, 0x92, 0x02, 0xdb, 0x02, 0xc1, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0x1a, 0x03, 0x31, 0x03, 0x44, 0x03, 0x70, 0x03, 0x68, 0x03, 0xad, 0x03, 0x7c, 0x03, 0xe1, 0x03, 0x80, 0x03, 0x03, 0x04, 0x73, 0x03, 0x11, 0x04, 0x54, 0x03, 0x0e, 0x04, 0x24, 0x03, 0x02, 0x04, 0xe8, 0x02, 0xf5, 0x03, 0xa4, 0x02, 0xe8, 0x03, 0x60, 0x02, 0xd8, 0x03, 0x20, 0x02, 0xbf, 0x03, 0xe1, 0x01, 0x94, 0x03, 0x9f, 0x01, 0x53, 0x03, 0x5a, 0x01, 0x04, 0x03, 0x17, 0x01, 0xb3, 0x02, 0xd7, 0x00, 0x6a, 0x02, 0x94, 0x00, 0x28, 0x02, 0x48, 0x00, 0xe4, 0x01, 0xf3, 0xff, 0x97, 0x01, 0x9b, 0xff, 0x3d, 0x01, 0x46, 0xff, 0xd5, 0x00, 0xfd, 0xfe, 0x64, 0x00, 0xc3, 0xfe, 0xf2, 0xff, 0x93, 0xfe, 0x85, 0xff, 0x62, 0xfe, 0x1d, 0xff, 0x2b, 0xfe, 0xbd, 0xfe, 0xf0, 0xfd, 0x63, 0xfe, 0xb6, 0xfd, 0x0e, 0xfe, 0x83, 0xfd, 0xb7, 0xfd, 0x61, 0xfd, 0x62, 0xfd, 0x4f, 0xfd, 0x12, 0xfd, 0x47, 0xfd, 0xc7, 0xfc, 0x44, 0xfd, 0x83, 0xfc, 0x44, 0xfd, 0x47, 0xfc, 0x41, 0xfd, 0x12, 0xfc, 0x3c, 0xfd, 0xe2, 0xfb, 0x3a, 0xfd, 0xb8, 0xfb, 0x39, 0xfd, 0x98, 0xfb, 0x35, 0xfd, 0x7e, 0xfb, 0x2e, 0xfd, 0x67, 0xfb, 0x2b, 0xfd, 0x56, 0xfb, 0x32, 0xfd, 0x50, 0xfb, 0x42, 0xfd, 0x53, 0xfb, 0x5f, 0xfd, 0x63, 0xfb, 0x87, 0xfd, 0x83, 0xfb, 0xb1, 0xfd, 0xaa, 0xfb, 0xd8, 0xfd, 0xcf, 0xfb, 0xfe, 0xfd, 0xf2, 0xfb, 0x24, 0xfe, 0x16, 0xfc, 0x47, 0xfe, 0x39, 0xfc, 0x6c, 0xfe, 0x5e, 0xfc, 0x9b, 0xfe, 0x8e, 0xfc, 0xd4, 0xfe, 0xc5, 0xfc, 0x0d, 0xff, 0xfa, 0xfc, 0x45, 0xff, 0x2c, 0xfd, 0x7f, 0xff, 0x61, 0xfd, 0xbc, 0xff, 0x9a, 0xfd, 0x01, 0x00, 0xdb, 0xfd, 0x4e, 0x00, 0x24, 0xfe, 0x98, 0x00, 0x6d, 0xfe, 0xd6, 0x00, 0xad, 0xfe, 0x08, 0x01, 0xe5, 0xfe, 0x31, 0x01, 0x1e, 0xff, 0x58, 0x01, 0x5d, 0xff, 0x89, 0x01, 0xa6, 0xff, 0xc7, 0x01, 0xf8, 0xff, 0x0e, 0x02, 0x4b, 0x00, 0x55, 0x02, 0x99, 0x00, 0x91, 0x02, 0xe0, 0x00, 0xbf, 0x02, 0x21, 0x01, 0xd9, 0x02, 0x5c, 0x01, 0xe7, 0x02, 0x8f, 0x01, 0xed, 0x02, 0xb8, 0x01, 0xf8, 0x02, 0xd9, 0x01, 0x0e, 0x03, 0xf9, 0x01, 0x2c, 0x03, 0x18, 0x02, 0x49, 0x03, 0x38, 0x02, 0x5a, 0x03, 0x56, 0x02, 0x56, 0x03, 0x69, 0x02, 0x3d, 0x03, 0x6f, 0x02, 0x1c, 0x03, 0x72, 0x02, 0x02, 0x03, 0x79, 0x02, 0xed, 0x02, 0x82, 0x02, 0xdb, 0x02, 0x86, 0x02, 0xcc, 0x02, 0x84, 0x02, 0xbb, 0x02, 0x7e, 0x02, 0xa5, 0x02, 0x73, 0x02, 0x89, 0x02, 0x67, 0x02, 0x66, 0x02, 0x58, 0x02, 0x3c, 0x02, 0x43, 0x02, 0x0d, 0x02, 0x27, 0x02, 0xda, 0x01, 0x05, 0x02, 0xa2, 0x01, 0xdf, 0x01, 0x64, 0x01, 0xb4, 0x01, 0x24, 0x01, 0x81, 0x01, 0xe3, 0x00, 0x44, 0x01, 0xa4, 0x00, 0x02, 0x01, 0x68, 0x00, 0xc2, 0x00, 0x2c, 0x00, 0x88, 0x00, 0xeb, 0xff, 0x50, 0x00, 0xa6, 0xff, 0x1a, 0x00, 0x5d, 0xff, 0xe3, 0xff, 0x0e, 0xff, 0xa3, 0xff, 0xba, 0xfe, 0x5d, 0xff, 0x64, 0xfe, 0x11, 0xff, 0x15, 0xfe, 0xcc, 0xfe, 0xd3, 0xfd, 0x98, 0xfe, 0x9d, 0xfd, 0x79, 0xfe, 0x6e, 0xfd, 0x69, 0xfe, 0x3f, 0xfd, 0x5c, 0xfe, 0x11, 0xfd, 0x48, 0xfe, 0xe5, 0xfc, 0x2a, 0xfe, 0xc5, 0xfc, 0x0a, 0xfe, 0xb8, 0xfc, 0xf5, 0xfd, 0xbe, 0xfc, 0xf0, 0xfd, 0xcb, 0xfc, 0xf9, 0xfd, 0xe1, 0xfc, 0x13, 0xfe, 0x01, 0xfd, 0x39, 0xfe, 0x29, 0xfd, 0x63, 0xfe, 0x5d, 0xfd, 0x89, 0xfe, 0x9f, 0xfd, 0xb0, 0xfe, 0xe7, 0xfd, 0xd5, 0xfe, 0x27, 0xfe, 0xf8, 0xfe, 0x5f, 0xfe, 0x1c, 0xff, 0x8e, 0xfe, 0x43, 0xff, 0xb9, 0xfe, 0x6c, 0xff, 0xe5, 0xfe, 0x97, 0xff, 0x1a, 0xff, 0xc6, 0xff, 0x5c, 0xff, 0xfc, 0xff, 0xa8, 0xff, 0x36, 0x00, 0xf6, 0xff, 0x72, 0x00, 0x3a, 0x00, 0xaf, 0x00, 0x70, 0x00, 0xed, 0x00, 0x99, 0x00, 0x28, 0x01, 0xbd, 0x00, 0x5e, 0x01, 0xe4, 0x00, 0x8c, 0x01, 0x14, 0x01, 0xb5, 0x01, 0x4f, 0x01, 0xe0, 0x01, 0x8e, 0x01, 0x12, 0x02, 0xcf, 0x01, 0x4c, 0x02, 0x09, 0x02, 0x85, 0x02, 0x32, 0x02, 0xb2, 0x02, 0x4f, 0x02, 0xd0, 0x02, 0x67, 0x02, 0xe5, 0x02, 0x83, 0x02, 0xf8, 0x02, 0xa5, 0x02, 0x0e, 0x03, 0xca, 0x02, 0x25, 0x03, 0xe8, 0x02, 0x34, 0x03, 0xfe, 0x02, 0x38, 0x03, 0x0e, 0x03, 0x37, 0x03, 0x19, 0x03, 0x34, 0x03, 0x1c, 0x03, 0x2e, 0x03, 0x14, 0x03, 0x21, 0x03, 0xfe, 0x02, 0x07, 0x03, 0xdd, 0x02, 0xe0, 0x02, 0xb6, 0x02, 0xb2, 0x02, 0x92, 0x02, 0x8a, 0x02, 0x71, 0x02, 0x67, 0x02, 0x56, 0x02, 0x46, 0x02, 0x44, 0x02, 0x27, 0x02, 0x32, 0x02, 0x09, 0x02, 0x16, 0x02, 0xed, 0x01, 0xee, 0x01, 0xd3, 0x01, 0xb7, 0x01, 0xb3, 0x01, 0x74, 0x01, 0x87, 0x01, 0x30, 0x01, 0x50, 0x01, 0xf1, 0x00, 0x18, 0x01, 0xbd, 0x00, 0xe9, 0x00, 0x90, 0x00, 0xc2, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x39, 0x00, 0x7f, 0x00, 0x08, 0x00, 0x59, 0x00, 0xd2, 0xff, 0x2c, 0x00, 0x99, 0xff, 0xf8, 0xff, 0x62, 0xff, 0xbf, 0xff, 0x30, 0xff, 0x83, 0xff, 0x0a, 0xff, 0x4b, 0xff, 0xf1, 0xfe, 0x1d, 0xff, 0xe1, 0xfe, 0xf8, 0xfe, 0xd4, 0xfe, 0xd9, 0xfe, 0xc5, 0xfe, 0xbc, 0xfe, 0xb3, 0xfe, 0x9e, 0xfe, 0x9a, 0xfe, 0x80, 0xfe, 0x7c, 0xfe, 0x60, 0xfe, 0x5d, 0xfe, 0x43, 0xfe, 0x3d, 0xfe, 0x28, 0xfe, 0x1c, 0xfe, 0x0c, 0xfe, 0xfb, 0xfd, 0xf2, 0xfd, 0xdb, 0xfd, 0xdb, 0xfd, 0xb7, 0xfd, 0xc4, 0xfd, 0x8e, 0xfd, 0xad, 0xfd, 0x69, 0xfd, 0x9f, 0xfd, 0x4e, 0xfd, 0x9f, 0xfd, 0x39, 0xfd, 0xaa, 0xfd, 0x23, 0xfd, 0xbf, 0xfd, 0x08, 0xfd, 0xd6, 0xfd, 0xed, 0xfc, 0xe9, 0xfd, 0xe0, 0xfc, 0xfc, 0xfd, 0xeb, 0xfc, 0x18, 0xfe, 0x09, 0xfd, 0x40, 0xfe, 0x2f, 0xfd, 0x74, 0xfe, 0x50, 0xfd, 0xa9, 0xfe, 0x6c, 0xfd, 0xdb, 0xfe, 0x91, 0xfd, 0x08, 0xff, 0xc3, 0xfd, 0x37, 0xff, 0x03, 0xfe, 0x6d, 0xff, 0x49, 0xfe, 0xad, 0xff, 0x8e, 0xfe, 0xef, 0xff, 0xcd, 0xfe, 0x29, 0x00, 0x05, 0xff, 0x58, 0x00, 0x40, 0xff, 0x81, 0x00, 0x7f, 0xff, 0xab, 0x00, 0xc3, 0xff, 0xd7, 0x00, 0x09, 0x00, 0x00, 0x01, 0x4b, 0x00, 0x19, 0x01, 0x7f, 0x00, 0x1c, 0x01, 0xa2, 0x00, 0x14, 0x01, 0xc0, 0x00, 0x10, 0x01, 0xdd, 0x00, 0x14, 0x01, 0xf9, 0x00, 0x17, 0x01, 0x17, 0x01, 0x15, 0x01, 0x3a, 0x01, 0x10, 0x01, 0x5e, 0x01, 0x06, 0x01, 0x7c, 0x01, 0x00, 0x01, 0x96, 0x01, 0x01, 0x01, 0xa7, 0x01, 0x05, 0x01, 0xaf, 0x01, 0x07, 0x01, 0xad, 0x01, 0x08, 0x01, 0xaa, 0x01, 0x08, 0x01, 0xa7, 0x01, 0x04, 0x01, 0x9e, 0x01, 0xf7, 0x00, 0x90, 0x01, 0xe4, 0x00, 0x7f, 0x01, 0xd1, 0x00, 0x6a, 0x01, 0xc1, 0x00, 0x52, 0x01, 0xb6, 0x00, 0x39, 0x01, 0xa9, 0x00, 0x1e, 0x01, 0x95, 0x00, 0xff, 0x00, 0x73, 0x00, 0xd9, 0x00, 0x44, 0x00, 0xb1, 0x00, 0x0f, 0x00, 0x89, 0x00, 0xd7, 0xff, 0x62, 0x00, 0xa1, 0xff, 0x41, 0x00, 0x70, 0xff, 0x27, 0x00, 0x46, 0xff, 0x0f, 0x00, 0x21, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xe0, 0xff, 0xde, 0xfe, 0xc6, 0xff, 0xb8, 0xfe, 0xa9, 0xff, 0x8e, 0xfe, 0x8e, 0xff, 0x6b, 0xfe, 0x75, 0xff, 0x51, 0xfe, 0x5d, 0xff, 0x3a, 0xfe, 0x40, 0xff, 0x1e, 0xfe, 0x22, 0xff, 0x01, 0xfe, 0x02, 0xff, 0xe5, 0xfd, 0xd9, 0xfe, 0xcd, 0xfd, 0xa9, 0xfe, 0xbf, 0xfd, 0x77, 0xfe, 0xb6, 0xfd, 0x47, 0xfe, 0xab, 0xfd, 0x1a, 0xfe, 0x96, 0xfd, 0xf5, 0xfd, 0x80, 0xfd, 0xdc, 0xfd, 0x70, 0xfd, 0xc9, 0xfd, 0x69, 0xfd, 0xc0, 0xfd, 0x73, 0xfd, 0xc5, 0xfd, 0x8f, 0xfd, 0xd2, 0xfd, 0xb9, 0xfd, 0xdd, 0xfd, 0xe1, 0xfd, 0xe0, 0xfd, 0xff, 0xfd, 0xda, 0xfd, 0x0f, 0xfe, 0xca, 0xfd, 0x13, 0xfe, 0xb7, 0xfd, 0x15, 0xfe, 0xa7, 0xfd, 0x22, 0xfe, 0xa4, 0xfd, 0x43, 0xfe, 0xae, 0xfd, 0x77, 0xfe, 0xbd, 0xfd, 0xb1, 0xfe, 0xcf, 0xfd, 0xef, 0xfe, 0xe9, 0xfd, 0x2e, 0xff, 0x06, 0xfe, 0x68, 0xff, 0x20, 0xfe, 0x96, 0xff, 0x3b, 0xfe, 0xc0, 0xff, 0x5d, 0xfe, 0xf0, 0xff, 0x83, 0xfe, 0x29, 0x00, 0xb2, 0xfe, 0x6d, 0x00, 0xec, 0xfe, 0xb6, 0x00, 0x2b, 0xff, 0xf9, 0x00, 0x66, 0xff, 0x2f, 0x01, 0x9e, 0xff, 0x5f, 0x01, 0xd6, 0xff, 0x8e, 0x01, 0x11, 0x00, 0xbf, 0x01, 0x4f, 0x00, 0xf1, 0x01, 0x8c, 0x00, 0x1d, 0x02, 0xc3, 0x00, 0x3d, 0x02, 0xf1, 0x00, 0x52, 0x02, 0x1b, 0x01, 0x63, 0x02, 0x4c, 0x01, 0x7a, 0x02, 0x8c, 0x01, 0x9d, 0x02, 0xd3, 0x01, 0xc4, 0x02, 0x11, 0x02, 0xe2, 0x02, 0x3e, 0x02, 0xef, 0x02, 0x58, 0x02, 0xe9, 0x02, 0x68, 0x02, 0xd8, 0x02, 0x7a, 0x02, 0xc3, 0x02, 0x96, 0x02, 0xb5, 0x02, 0xb1, 0x02, 0xa7, 0x02, 0xc3, 0x02, 0x96, 0x02, 0xd0, 0x02, 0x86, 0x02, 0xda, 0x02, 0x74, 0x02, 0xe4, 0x02, 0x5f, 0x02, 0xf4, 0x02, 0x4a, 0x02, 0x05, 0x03, 0x33, 0x02, 0x09, 0x03, 0x16, 0x02, 0xfc, 0x02, 0xf1, 0x01, 0xe4, 0x02, 0xcb, 0x01, 0xbf, 0x02, 0x9f, 0x01, 0x93, 0x02, 0x6f, 0x01, 0x67, 0x02, 0x3f, 0x01, 0x3c, 0x02, 0x0e, 0x01, 0x0e, 0x02, 0xd6, 0x00, 0xd6, 0x01, 0x96, 0x00, 0x96, 0x01, 0x57, 0x00, 0x4f, 0x01, 0x1e, 0x00, 0x01, 0x01, 0xeb, 0xff, 0xb2, 0x00, 0xbc, 0xff, 0x64, 0x00, 0x87, 0xff, 0x1e, 0x00, 0x4f, 0xff, 0xe2, 0xff, 0x17, 0xff, 0xac, 0xff, 0xe2, 0xfe, 0x77, 0xff, 0xb0, 0xfe, 0x3d, 0xff, 0x83, 0xfe, 0xfa, 0xfe, 0x56, 0xfe, 0xaf, 0xfe, 0x27, 0xfe, 0x68, 0xfe, 0xff, 0xfd, 0x2d, 0xfe, 0xde, 0xfd, 0x00, 0xfe, 0xc4, 0xfd, 0xde, 0xfd, 0xb0, 0xfd, 0xbf, 0xfd, 0xa0, 0xfd, 0x9b, 0xfd, 0x90, 0xfd, 0x79, 0xfd, 0x85, 0xfd, 0x5f, 0xfd, 0x82, 0xfd, 0x50, 0xfd, 0x83, 0xfd, 0x4d, 0xfd, 0x86, 0xfd, 0x53, 0xfd, 0x8f, 0xfd, 0x61, 0xfd, 0xa5, 0xfd, 0x6e, 0xfd, 0xc4, 0xfd, 0x7c, 0xfd, 0xed, 0xfd, 0x8b, 0xfd, 0x17, 0xfe, 0x97, 0xfd, 0x3a, 0xfe, 0xaa, 0xfd, 0x58, 0xfe, 0xc7, 0xfd, 0x76, 0xfe, 0xe9, 0xfd, 0x97, 0xfe, 0x12, 0xfe, 0xc1, 0xfe, 0x3a, 0xfe, 0xf1, 0xfe, 0x5b, 0xfe, 0x1e, 0xff, 0x73, 0xfe, 0x43, 0xff, 0x8b, 0xfe, 0x62, 0xff, 0xa9, 0xfe, 0x7e, 0xff, 0xd2, 0xfe, 0x98, 0xff, 0x0b, 0xff, 0xba, 0xff, 0x4e, 0xff, 0xe6, 0xff, 0x97, 0xff, 0x1a, 0x00, 0xdd, 0xff, 0x51, 0x00, 0x18, 0x00, 0x7e, 0x00, 0x47, 0x00, 0x97, 0x00, 0x72, 0x00, 0xa1, 0x00, 0xa9, 0x00, 0xab, 0x00, 0xf0, 0x00, 0xbe, 0x00, 0x48, 0x01, 0xdf, 0x00, 0xa5, 0x01, 0x08, 0x01, 0xf9, 0x01, 0x2f, 0x01, 0x43, 0x02, 0x4d, 0x01, 0x85, 0x02, 0x65, 0x01, 0xc4, 0x02, 0x78, 0x01, 0x03, 0x03, 0x8a, 0x01, 0x3d, 0x03, 0x95, 0x01, 0x6d, 0x03, 0x98, 0x01, 0x92, 0x03, 0x98, 0x01, 0xb1, 0x03, 0x96, 0x01, 0xd0, 0x03, 0x92, 0x01, 0xed, 0x03, 0x8b, 0x01, 0x09, 0x04, 0x7e, 0x01, 0x1d, 0x04, 0x66, 0x01, 0x25, 0x04, 0x44, 0x01, 0x23, 0x04, 0x1d, 0x01, 0x1a, 0x04, 0xf6, 0x00, 0x0a, 0x04, 0xce, 0x00, 0xf2, 0x03, 0xa2, 0x00, 0xd1, 0x03, 0x70, 0x00, 0xac, 0x03, 0x39, 0x00, 0x89, 0x03, 0x05, 0x00, 0x66, 0x03, 0xd4, 0xff, 0x3d, 0x03, 0xa4, 0xff, 0x08, 0x03, 0x73, 0xff, 0xc0, 0x02, 0x3d, 0xff, 0x6b, 0x02, 0xff, 0xfe, 0x13, 0x02, 0xbf, 0xfe, 0xc0, 0x01, 0x7e, 0xfe, 0x6f, 0x01, 0x41, 0xfe, 0x19, 0x01, 0x09, 0xfe, 0xbf, 0x00, 0xdb, 0xfd, 0x60, 0x00, 0xb9, 0xfd, 0xfe, 0xff, 0x9e, 0xfd, 0x9a, 0xff, 0x82, 0xfd, 0x38, 0xff, 0x61, 0xfd, 0xda, 0xfe, 0x3d, 0xfd, 0x81, 0xfe, 0x1a, 0xfd, 0x31, 0xfe, 0x00, 0xfd, 0xe9, 0xfd, 0xf3, 0xfc, 0xa3, 0xfd, 0xf3, 0xfc, 0x5e, 0xfd, 0xfa, 0xfc, 0x1b, 0xfd, 0x05, 0xfd, 0xdf, 0xfc, 0x10, 0xfd, 0xaf, 0xfc, 0x1a, 0xfd, 0x8b, 0xfc, 0x26, 0xfd, 0x74, 0xfc, 0x37, 0xfd, 0x64, 0xfc, 0x52, 0xfd, 0x52, 0xfc, 0x71, 0xfd, 0x3c, 0xfc, 0x95, 0xfd, 0x29, 0xfc, 0xbe, 0xfd, 0x1e, 0xfc, 0xeb, 0xfd, 0x22, 0xfc, 0x1d, 0xfe, 0x37, 0xfc, 0x57, 0xfe, 0x5d, 0xfc, 0x9c, 0xfe, 0x8a, 0xfc, 0xe7, 0xfe, 0xb1, 0xfc, 0x31, 0xff, 0xce, 0xfc, 0x73, 0xff, 0xe4, 0xfc, 0xaf, 0xff, 0xfe, 0xfc, 0xe9, 0xff, 0x25, 0xfd, 0x27, 0x00, 0x5c, 0xfd, 0x6c, 0x00, 0x9f, 0xfd, 0xbb, 0x00, 0xe9, 0xfd, 0x13, 0x01, 0x36, 0xfe, 0x72, 0x01, 0x86, 0xfe, 0xd2, 0x01, 0xd8, 0xfe, 0x29, 0x02, 0x2a, 0xff, 0x70, 0x02, 0x7e, 0xff, 0xab, 0x02, 0xd6, 0xff, 0xe4, 0x02, 0x34, 0x00, 0x20, 0x03, 0x93, 0x00, 0x5b, 0x03, 0xea, 0x00, 0x91, 0x03, 0x35, 0x01, 0xbd, 0x03, 0x77, 0x01, 0xdd, 0x03, 0xb7, 0x01, 0xf1, 0x03, 0xf9, 0x01, 0xf6, 0x03, 0x3a, 0x02, 0xee, 0x03, 0x74, 0x02, 0xda, 0x03, 0xa3, 0x02, 0xc1, 0x03, 0xc8, 0x02, 0xa7, 0x03, 0xea, 0x02, 0x8d, 0x03, 0x0e, 0x03, 0x73, 0x03, 0x2e, 0x03, 0x4f, 0x03, 0x43, 0x03, 0x20, 0x03, 0x50, 0x03, 0xed, 0x02, 0x56, 0x03, 0xba, 0x02, 0x55, 0x03, 0x86, 0x02, 0x4c, 0x03, 0x51, 0x02, 0x3b, 0x03, 0x18, 0x02, 0x21, 0x03, 0xda, 0x01, 0x02, 0x03, 0x99, 0x01, 0xe3, 0x02, 0x5b, 0x01, 0xc2, 0x02, 0x1f, 0x01, 0x9b, 0x02, 0xe4, 0x00, 0x6d, 0x02, 0xa8, 0x00, 0x37, 0x02, 0x68, 0x00, 0x01, 0x02, 0x2a, 0x00, 0xd1, 0x01, 0xf0, 0xff, 0xa9, 0x01, 0xbc, 0xff, 0x85, 0x01, 0x8e, 0xff, 0x5c, 0x01, 0x64, 0xff, 0x24, 0x01, 0x37, 0xff, 0xdf, 0x00, 0x05, 0xff, 0x97, 0x00, 0xd3, 0xfe, 0x58, 0x00, 0xa8, 0xfe, 0x20, 0x00, 0x81, 0xfe, 0xf5, 0xff, 0x66, 0xfe, 0xd3, 0xff, 0x59, 0xfe, 0xac, 0xff, 0x4f, 0xfe, 0x78, 0xff, 0x43, 0xfe, 0x37, 0xff, 0x3b, 0xfe, 0xed, 0xfe, 0x38, 0xfe, 0x9f, 0xfe, 0x37, 0xfe, 0x5c, 0xfe, 0x3b, 0xfe, 0x2a, 0xfe, 0x43, 0xfe, 0x03, 0xfe, 0x4b, 0xfe, 0xdf, 0xfd, 0x56, 0xfe, 0xb8, 0xfd, 0x6a, 0xfe, 0x86, 0xfd, 0x83, 0xfe, 0x4d, 0xfd, 0x9c, 0xfe, 0x16, 0xfd, 0xb6, 0xfe, 0xe9, 0xfc, 0xd2, 0xfe, 0xcf, 0xfc, 0xf6, 0xfe, 0xc6, 0xfc, 0x1c, 0xff, 0xc7, 0xfc, 0x3f, 0xff, 0xcd, 0xfc, 0x5f, 0xff, 0xd3, 0xfc, 0x7c, 0xff, 0xd4, 0xfc, 0x99, 0xff, 0xd5, 0xfc, 0xba, 0xff, 0xe1, 0xfc, 0xe2, 0xff, 0xfe, 0xfc, 0x14, 0x00, 0x2a, 0xfd, 0x4e, 0x00, 0x60, 0xfd, 0x8b, 0x00, 0x98, 0xfd, 0xc8, 0x00, 0xc7, 0xfd, 0xfc, 0x00, 0xef, 0xfd, 0x2a, 0x01, 0x19, 0xfe, 0x5a, 0x01, 0x41, 0xfe, 0x89, 0x01, 0x6a, 0xfe, 0xb7, 0x01, 0x97, 0xfe, 0xe8, 0x01, 0xc5, 0xfe, 0x17, 0x02, 0xf4, 0xfe, 0x42, 0x02, 0x22, 0xff, 0x66, 0x02, 0x54, 0xff, 0x86, 0x02, 0x86, 0xff, 0x9e, 0x02, 0xb5, 0xff, 0xac, 0x02, 0xe1, 0xff, 0xb3, 0x02, 0x0b, 0x00, 0xb6, 0x02, 0x38, 0x00, 0xbc, 0x02, 0x68, 0x00, 0xc0, 0x02, 0x9b, 0x00, 0xbf, 0x02, 0xd2, 0x00, 0xb3, 0x02, 0x0a, 0x01, 0x9a, 0x02, 0x3f, 0x01, 0x77, 0x02, 0x6c, 0x01, 0x4e, 0x02, 0x94, 0x01, 0x29, 0x02, 0xba, 0x01, 0x08, 0x02, 0xe2, 0x01, 0xe9, 0x01, 0x10, 0x02, 0xc8, 0x01, 0x40, 0x02, 0xa3, 0x01, 0x69, 0x02, 0x76, 0x01, 0x86, 0x02, 0x40, 0x01, 0x97, 0x02, 0x0a, 0x01, 0x9a, 0x02, 0xd2, 0x00, 0x93, 0x02, 0x9d, 0x00, 0x87, 0x02, 0x6a, 0x00, 0x7b, 0x02, 0x38, 0x00, 0x72, 0x02, 0x03, 0x00, 0x6c, 0x02, 0xcf, 0xff, 0x62, 0x02, 0x9b, 0xff, 0x4e, 0x02, 0x66, 0xff, 0x2d, 0x02, 0x31, 0xff, 0x00, 0x02, 0xfa, 0xfe, 0xcb, 0x01, 0xbf, 0xfe, 0x92, 0x01, 0x82, 0xfe, 0x5b, 0x01, 0x45, 0xfe, 0x29, 0x01, 0x09, 0xfe, 0xfb, 0x00, 0xcf, 0xfd, 0xd1, 0x00, 0x9d, 0xfd, 0xaa, 0x00, 0x78, 0xfd, 0x81, 0x00, 0x61, 0xfd, 0x51, 0x00, 0x4e, 0xfd, 0x15, 0x00, 0x33, 0xfd, 0xd3, 0xff, 0x11, 0xfd, 0x8f, 0xff, 0xec, 0xfc, 0x52, 0xff, 0xcc, 0xfc, 0x23, 0xff, 0xc0, 0xfc, 0xfe, 0xfe, 0xc1, 0xfc, 0xda, 0xfe, 0xc5, 0xfc, 0xac, 0xfe, 0xc3, 0xfc, 0x71, 0xfe, 0xbb, 0xfc, 0x31, 0xfe, 0xb5, 0xfc, 0xf6, 0xfd, 0xb9, 0xfc, 0xc7, 0xfd, 0xcd, 0xfc, 0xa9, 0xfd, 0xf4, 0xfc, 0x9b, 0xfd, 0x28, 0xfd, 0x93, 0xfd, 0x61, 0xfd, 0x88, 0xfd, 0x96, 0xfd, 0x7b, 0xfd, 0xc8, 0xfd, 0x71, 0xfd, 0xfb, 0xfd, 0x6e, 0xfd, 0x2f, 0xfe, 0x76, 0xfd, 0x67, 0xfe, 0x8c, 0xfd, 0xa9, 0xfe, 0xae, 0xfd, 0xf4, 0xfe, 0xd2, 0xfd, 0x41, 0xff, 0xf8, 0xfd, 0x8d, 0xff, 0x20, 0xfe, 0xd1, 0xff, 0x4b, 0xfe, 0x0d, 0x00, 0x79, 0xfe, 0x42, 0x00, 0xaa, 0xfe, 0x75, 0x00, 0xdd, 0xfe, 0xae, 0x00, 0x18, 0xff, 0xf1, 0x00, 0x59, 0xff, 0x3c, 0x01, 0x9a, 0xff, 0x83, 0x01, 0xd3, 0xff, 0xbd, 0x01, 0x09, 0x00, 0xeb, 0x01, 0x3e, 0x00, 0x0f, 0x02, 0x73, 0x00, 0x30, 0x02, 0xa9, 0x00, 0x53, 0x02, 0xdf, 0x00, 0x7a, 0x02, 0x17, 0x01, 0xa3, 0x02, 0x4b, 0x01, 0xc7, 0x02, 0x7a, 0x01, 0xe2, 0x02, 0xa3, 0x01, 0xf6, 0x02, 0xc3, 0x01, 0x01, 0x03, 0xde, 0x01, 0x07, 0x03, 0xf9, 0x01, 0x0b, 0x03, 0x17, 0x02, 0x0b, 0x03, 0x34, 0x02, 0x01, 0x03, 0x4d, 0x02, 0xe9, 0x02, 0x62, 0x02, 0xc5, 0x02, 0x75, 0x02, 0x9c, 0x02, 0x7f, 0x02, 0x6e, 0x02, 0x81, 0x02, 0x3d, 0x02, 0x7f, 0x02, 0x0e, 0x02, 0x7e, 0x02, 0xe0, 0x01, 0x81, 0x02, 0xb1, 0x01, 0x8d, 0x02, 0x82, 0x01, 0x9f, 0x02, 0x53, 0x01, 0xad, 0x02, 0x20, 0x01, 0xb4, 0x02, 0xed, 0x00, 0xb5, 0x02, 0xbd, 0x00, 0xae, 0x02, 0x91, 0x00, 0xa4, 0x02, 0x67, 0x00, 0x9e, 0x02, 0x44, 0x00, 0x9b, 0x02, 0x23, 0x00, 0x91, 0x02, 0xfe, 0xff, 0x7d, 0x02, 0xd6, 0xff, 0x5d, 0x02, 0xaf, 0xff, 0x31, 0x02, 0x8b, 0xff, 0xfd, 0x01, 0x68, 0xff, 0xc5, 0x01, 0x45, 0xff, 0x87, 0x01, 0x1c, 0xff, 0x45, 0x01, 0xf0, 0xfe, 0x00, 0x01, 0xc8, 0xfe, 0xbb, 0x00, 0xa9, 0xfe, 0x77, 0x00, 0x96, 0xfe, 0x2f, 0x00, 0x86, 0xfe, 0xe1, 0xff, 0x71, 0xfe, 0x8f, 0xff, 0x56, 0xfe, 0x41, 0xff, 0x3b, 0xfe, 0xfe, 0xfe, 0x23, 0xfe, 0xc6, 0xfe, 0x11, 0xfe, 0x94, 0xfe, 0x03, 0xfe, 0x63, 0xfe, 0xfb, 0xfd, 0x33, 0xfe, 0xf7, 0xfd, 0x05, 0xfe, 0xf6, 0xfd, 0xdd, 0xfd, 0xf6, 0xfd, 0xb9, 0xfd, 0xf2, 0xfd, 0x9c, 0xfd, 0xeb, 0xfd, 0x83, 0xfd, 0xe4, 0xfd, 0x6b, 0xfd, 0xe1, 0xfd, 0x56, 0xfd, 0xe5, 0xfd, 0x4a, 0xfd, 0xf8, 0xfd, 0x4a, 0xfd, 0x1a, 0xfe, 0x55, 0xfd, 0x48, 0xfe, 0x62, 0xfd, 0x75, 0xfe, 0x65, 0xfd, 0x99, 0xfe, 0x60, 0xfd, 0xb5, 0xfe, 0x5b, 0xfd, 0xd3, 0xfe, 0x5f, 0xfd, 0xfb, 0xfe, 0x72, 0xfd, 0x30, 0xff, 0x8e, 0xfd, 0x70, 0xff, 0xaa, 0xfd, 0xb2, 0xff, 0xc0, 0xfd, 0xef, 0xff, 0xd0, 0xfd, 0x23, 0x00, 0xdf, 0xfd, 0x54, 0x00, 0xf3, 0xfd, 0x85, 0x00, 0x09, 0xfe, 0xb7, 0x00, 0x26, 0xfe, 0xea, 0x00, 0x4a, 0xfe, 0x1e, 0x01, 0x75, 0xfe, 0x4d, 0x01, 0xa0, 0xfe, 0x73, 0x01, 0xce, 0xfe, 0x91, 0x01, 0xf9, 0xfe, 0xa4, 0x01, 0x23, 0xff, 0xaf, 0x01, 0x4f, 0xff, 0xb8, 0x01, 0x7d, 0xff, 0xc0, 0x01, 0xae, 0xff, 0xc9, 0x01, 0xe0, 0xff, 0xcd, 0x01, 0x14, 0x00, 0xc8, 0x01, 0x4a, 0x00, 0xbb, 0x01, 0x80, 0x00, 0xa4, 0x01, 0xb5, 0x00, 0x89, 0x01, 0xe7, 0x00, 0x6c, 0x01, 0x14, 0x01, 0x4e, 0x01, 0x3b, 0x01, 0x2d, 0x01, 0x5b, 0x01, 0x0a, 0x01, 0x75, 0x01, 0xe5, 0x00, 0x87, 0x01, 0xbc, 0x00, 0x94, 0x01, 0x90, 0x00, 0x9c, 0x01, 0x61, 0x00, 0xa2, 0x01, 0x2e, 0x00, 0xa3, 0x01, 0xf8, 0xff, 0xa1, 0x01, 0xc6, 0xff, 0x96, 0x01, 0x94, 0xff, 0x80, 0x01, 0x64, 0xff, 0x60, 0x01, 0x34, 0xff, 0x3d, 0x01, 0x07, 0xff, 0x1b, 0x01, 0xdb, 0xfe, 0xfc, 0x00, 0xac, 0xfe, 0xe1, 0x00, 0x7a, 0xfe, 0xc9, 0x00, 0x46, 0xfe, 0xad, 0x00, 0x12, 0xfe, 0x8b, 0x00, 0xde, 0xfd, 0x65, 0x00, 0xae, 0xfd, 0x3b, 0x00, 0x83, 0xfd, 0x11, 0x00, 0x60, 0xfd, 0xe9, 0xff, 0x44, 0xfd, 0xc1, 0xff, 0x2c, 0xfd, 0x94, 0xff, 0x13, 0xfd, 0x66, 0xff, 0xf9, 0xfc, 0x3d, 0xff, 0xe0, 0xfc, 0x15, 0xff, 0xc6, 0xfc, 0xef, 0xfe, 0xb3, 0xfc, 0xcd, 0xfe, 0xaa, 0xfc, 0xac, 0xfe, 0xb2, 0xfc, 0x8b, 0xfe, 0xc8, 0xfc, 0x6a, 0xfe, 0xe9, 0xfc, 0x4b, 0xfe, 0x0e, 0xfd, 0x26, 0xfe, 0x2e, 0xfd, 0xfe, 0xfd, 0x49, 0xfd, 0xda, 0xfd, 0x65, 0xfd, 0xc1, 0xfd, 0x89, 0xfd, 0xb2, 0xfd, 0xb3, 0xfd, 0xa7, 0xfd, 0xe1, 0xfd, 0x9a, 0xfd, 0x10, 0xfe, 0x88, 0xfd, 0x41, 0xfe, 0x76, 0xfd, 0x78, 0xfe, 0x6f, 0xfd, 0xb6, 0xfe, 0x78, 0xfd, 0xf8, 0xfe, 0x8f, 0xfd, 0x38, 0xff, 0xae, 0xfd, 0x72, 0xff, 0xca, 0xfd, 0xa1, 0xff, 0xde, 0xfd, 0xc7, 0xff, 0xf0, 0xfd, 0xed, 0xff, 0x07, 0xfe, 0x1b, 0x00, 0x2b, 0xfe, 0x54, 0x00, 0x60, 0xfe, 0x99, 0x00, 0xa3, 0xfe, 0xe0, 0x00, 0xe9, 0xfe, 0x1f, 0x01, 0x2c, 0xff, 0x53, 0x01, 0x65, 0xff, 0x7d, 0x01, 0x98, 0xff, 0xa4, 0x01, 0xc8, 0xff, 0xca, 0x01, 0xfe, 0xff, 0xf2, 0x01, 0x3e, 0x00, 0x1d, 0x02, 0x81, 0x00, 0x46, 0x02, 0xc5, 0x00, 0x6e, 0x02, 0x06, 0x01, 0x96, 0x02, 0x3e, 0x01, 0xb9, 0x02, 0x6c, 0x01, 0xd5, 0x02, 0x92, 0x01, 0xea, 0x02, 0xb3, 0x01, 0xf8, 0x02, 0xd4, 0x01, 0x03, 0x03, 0xf4, 0x01, 0x0c, 0x03, 0x12, 0x02, 0x12, 0x03, 0x2c, 0x02, 0x11, 0x03, 0x3f, 0x02, 0x09, 0x03, 0x4a, 0x02, 0xfa, 0x02, 0x51, 0x02, 0xe8, 0x02, 0x59, 0x02, 0xd3, 0x02, 0x65, 0x02, 0xbb, 0x02, 0x72, 0x02, 0x9d, 0x02, 0x7f, 0x02, 0x7a, 0x02, 0x88, 0x02, 0x55, 0x02, 0x8c, 0x02, 0x2f, 0x02, 0x8d, 0x02, 0x09, 0x02, 0x8b, 0x02, 0xde, 0x01, 0x89, 0x02, 0xad, 0x01, 0x84, 0x02, 0x78, 0x01, 0x81, 0x02, 0x44, 0x01, 0x7a, 0x02, 0x13, 0x01, 0x6f, 0x02, 0xe3, 0x00, 0x61, 0x02, 0xb7, 0x00, 0x52, 0x02, 0x8b, 0x00, 0x40, 0x02, 0x5b, 0x00, 0x2b, 0x02, 0x28, 0x00, 0x15, 0x02, 0xf3, 0xff, 0xf8, 0x01, 0xbd, 0xff, 0xd7, 0x01, 0x8c, 0xff, 0xb4, 0x01, 0x63, 0xff, 0x8f, 0x01, 0x42, 0xff, 0x6a, 0x01, 0x29, 0xff, 0x47, 0x01, 0x18, 0xff, 0x25, 0x01, 0x09, 0xff, 0x01, 0x01, 0xf5, 0xfe, 0xda, 0x00, 0xdf, 0xfe, 0xac, 0x00, 0xc8, 0xfe, 0x7d, 0x00, 0xb9, 0xfe, 0x4d, 0x00, 0xb5, 0xfe, 0x23, 0x00, 0xc0, 0xfe, 0xfd, 0xff, 0xcf, 0xfe, 0xd8, 0xff, 0xd9, 0xfe, 0xb4, 0xff, 0xdf, 0xfe, 0x8f, 0xff, 0xe6, 0xfe, 0x69, 0xff, 0xf0, 0xfe, 0x42, 0xff, 0x01, 0xff, 0x1b, 0xff, 0x17, 0xff, 0xf7, 0xfe, 0x2e, 0xff, 0xdf, 0xfe, 0x4a, 0xff, 0xd1, 0xfe, 0x67, 0xff, 0xc5, 0xfe, 0x7f, 0xff, 0xb5, 0xfe, 0x90, 0xff, 0x9f, 0xfe, 0x9b, 0xff, 0x87, 0xfe, 0xa5, 0xff, 0x74, 0xfe, 0xb3, 0xff, 0x6d, 0xfe, 0xc6, 0xff, 0x6f, 0xfe, 0xd9, 0xff, 0x76, 0xfe, 0xea, 0xff, 0x80, 0xfe, 0xf7, 0xff, 0x8c, 0xfe, 0x05, 0x00, 0x97, 0xfe, 0x17, 0x00, 0xa5, 0xfe, 0x31, 0x00, 0xb6, 0xfe, 0x51, 0x00, 0xcc, 0xfe, 0x73, 0x00, 0xe5, 0xfe, 0x91, 0x00, 0x02, 0xff, 0xa7, 0x00, 0x23, 0xff, 0xb6, 0x00, 0x49, 0xff, 0xc9, 0x00, 0x70, 0xff, 0xe4, 0x00, 0x93, 0xff, 0x03, 0x01, 0xb0, 0xff, 0x23, 0x01, 0xce, 0xff, 0x41, 0x01, 0xf6, 0xff, 0x60, 0x01, 0x2b, 0x00, 0x7e, 0x01, 0x65, 0x00, 0x99, 0x01, 0x96, 0x00, 0xaa, 0x01, 0xb8, 0x00, 0xb3, 0x01, 0xd2, 0x00, 0xbc, 0x01, 0xeb, 0x00, 0xc8, 0x01, 0x0b, 0x01, 0xd8, 0x01, 0x2e, 0x01, 0xe4, 0x01, 0x4e, 0x01, 0xe5, 0x01, 0x64, 0x01, 0xd6, 0x01, 0x6d, 0x01, 0xb8, 0x01, 0x6c, 0x01, 0x94, 0x01, 0x67, 0x01, 0x71, 0x01, 0x62, 0x01, 0x51, 0x01, 0x62, 0x01, 0x33, 0x01, 0x63, 0x01, 0x0f, 0x01, 0x64, 0x01, 0xe3, 0x00, 0x5a, 0x01, 0xae, 0x00, 0x47, 0x01, 0x76, 0x00, 0x2d, 0x01, 0x3f, 0x00, 0x10, 0x01, 0x0e, 0x00, 0xf9, 0x00, 0xe6, 0xff, 0xe8, 0x00, 0xc5, 0xff, 0xdd, 0x00, 0xa9, 0xff, 0xd5, 0x00, 0x8b, 0xff, 0xcb, 0x00, 0x69, 0xff, 0xbc, 0x00, 0x45, 0xff, 0xa5, 0x00, 0x21, 0xff, 0x89, 0x00, 0x03, 0xff, 0x6b, 0x00, 0xea, 0xfe, 0x50, 0x00, 0xd9, 0xfe, 0x3a, 0x00, 0xcd, 0xfe, 0x23, 0x00, 0xbf, 0xfe, 0x08, 0x00, 0xb1, 0xfe, 0xe6, 0xff, 0xa1, 0xfe, 0xbf, 0xff, 0x8f, 0xfe, 0x97, 0xff, 0x7b, 0xfe, 0x77, 0xff, 0x6b, 0xfe, 0x5f, 0xff, 0x5f, 0xfe, 0x48, 0xff, 0x53, 0xfe, 0x2d, 0xff, 0x46, 0xfe, 0x0d, 0xff, 0x39, 0xfe, 0xe5, 0xfe, 0x2a, 0xfe, 0xba, 0xfe, 0x19, 0xfe, 0x97, 0xfe, 0x0f, 0xfe, 0x83, 0xfe, 0x0e, 0xfe, 0x79, 0xfe, 0x0f, 0xfe, 0x73, 0xfe, 0x11, 0xfe, 0x6e, 0xfe, 0x13, 0xfe, 0x63, 0xfe, 0x16, 0xfe, 0x51, 0xfe, 0x1b, 0xfe, 0x3e, 0xfe, 0x27, 0xfe, 0x2b, 0xfe, 0x36, 0xfe, 0x20, 0xfe, 0x47, 0xfe, 0x20, 0xfe, 0x5a, 0xfe, 0x2c, 0xfe, 0x72, 0xfe, 0x3f, 0xfe, 0x8f, 0xfe, 0x55, 0xfe, 0xb0, 0xfe, 0x6a, 0xfe, 0xd3, 0xfe, 0x7b, 0xfe, 0xf9, 0xfe, 0x8a, 0xfe, 0x1e, 0xff, 0x99, 0xfe, 0x43, 0xff, 0xb0, 0xfe, 0x6a, 0xff, 0xd2, 0xfe, 0x93, 0xff, 0xfa, 0xfe, 0xbc, 0xff, 0x1e, 0xff, 0xe2, 0xff, 0x3d, 0xff, 0x08, 0x00, 0x54, 0xff, 0x2a, 0x00, 0x66, 0xff, 0x48, 0x00, 0x7d, 0xff, 0x65, 0x00, 0x9a, 0xff, 0x82, 0x00, 0xbb, 0xff, 0xa1, 0x00, 0xda, 0xff, 0xbc, 0x00, 0xf6, 0xff, 0xd6, 0x00, 0x0d, 0x00, 0xea, 0x00, 0x21, 0x00, 0xfa, 0x00, 0x38, 0x00, 0x0b, 0x01, 0x54, 0x00, 0x21, 0x01, 0x76, 0x00, 0x39, 0x01, 0x9d, 0x00, 0x55, 0x01, 0xc7, 0x00, 0x70, 0x01, 0xec, 0x00, 0x85, 0x01, 0x07, 0x01, 0x92, 0x01, 0x15, 0x01, 0x98, 0x01, 0x1d, 0x01, 0x99, 0x01, 0x25, 0x01, 0x99, 0x01, 0x35, 0x01, 0x9c, 0x01, 0x52, 0x01, 0xa4, 0x01, 0x77, 0x01, 0xae, 0x01, 0x97, 0x01, 0xb4, 0x01, 0xa8, 0x01, 0xb0, 0x01, 0xa6, 0x01, 0xa0, 0x01, 0x97, 0x01, 0x85, 0x01, 0x82, 0x01, 0x64, 0x01, 0x6f, 0x01, 0x40, 0x01, 0x61, 0x01, 0x20, 0x01, 0x5a, 0x01, 0x06, 0x01, 0x51, 0x01, 0xee, 0x00, 0x44, 0x01, 0xd5, 0x00, 0x32, 0x01, 0xbb, 0x00, 0x17, 0x01, 0x9e, 0x00, 0xf9, 0x00, 0x7f, 0x00, 0xdb, 0x00, 0x61, 0x00, 0xc0, 0x00, 0x43, 0x00, 0xaa, 0x00, 0x29, 0x00, 0x98, 0x00, 0x14, 0x00, 0x8c, 0x00, 0x05, 0x00, 0x7b, 0x00, 0xf4, 0xff, 0x5e, 0x00, 0xdc, 0xff, 0x3b, 0x00, 0xc1, 0xff, 0x1a, 0x00, 0xa9, 0xff, 0xfe, 0xff, 0x95, 0xff, 0xea, 0xff, 0x87, 0xff, 0xdc, 0xff, 0x7d, 0xff, 0xca, 0xff, 0x70, 0xff, 0xb2, 0xff, 0x62, 0xff, 0x97, 0xff, 0x54, 0xff, 0x7e, 0xff, 0x47, 0xff, 0x69, 0xff, 0x3a, 0xff, 0x56, 0xff, 0x2d, 0xff, 0x46, 0xff, 0x21, 0xff, 0x3a, 0xff, 0x19, 0xff, 0x30, 0xff, 0x15, 0xff, 0x28, 0xff, 0x12, 0xff, 0x22, 0xff, 0x0e, 0xff, 0x1f, 0xff, 0x0b, 0xff, 0x1d, 0xff, 0x09, 0xff, 0x17, 0xff, 0x04, 0xff, 0x0a, 0xff, 0xfc, 0xfe, 0xf9, 0xfe, 0xf2, 0xfe, 0xeb, 0xfe, 0xed, 0xfe, 0xe5, 0xfe, 0xef, 0xfe, 0xe8, 0xfe, 0xf9, 0xfe, 0xee, 0xfe, 0x06, 0xff, 0xf0, 0xfe, 0x11, 0xff, 0xeb, 0xfe, 0x19, 0xff, 0xde, 0xfe, 0x1b, 0xff, 0xcf, 0xfe, 0x1c, 0xff, 0xc3, 0xfe, 0x23, 0xff, 0xc2, 0xfe, 0x34, 0xff, 0xce, 0xfe, 0x52, 0xff, 0xe7, 0xfe, 0x7d, 0xff, 0x0a, 0xff, 0xb0, 0xff, 0x2f, 0xff, 0xe4, 0xff, 0x51, 0xff, 0x15, 0x00, 0x70, 0xff, 0x43, 0x00, 0x8a, 0xff, 0x6c, 0x00, 0xa4, 0xff, 0x94, 0x00, 0xc3, 0xff, 0xc2, 0x00, 0xed, 0xff, 0xfa, 0x00, 0x1f, 0x00, 0x37, 0x01, 0x53, 0x00, 0x73, 0x01, 0x82, 0x00, 0xa9, 0x01, 0xa4, 0x00, 0xd3, 0x01, 0xb7, 0x00, 0xed, 0x01, 0xc0, 0x00, 0xfb, 0x01, 0xca, 0x00, 0x03, 0x02, 0xd8, 0x00, 0x08, 0x02, 0xed, 0x00, 0x0f, 0x02, 0x07, 0x01, 0x19, 0x02, 0x1c, 0x01, 0x21, 0x02, 0x25, 0x01, 0x20, 0x02, 0x22, 0x01, 0x15, 0x02, 0x15, 0x01, 0x01, 0x02, 0x03, 0x01, 0xe5, 0x01, 0xf3, 0x00, 0xc3, 0x01, 0xe9, 0x00, 0x9c, 0x01, 0xe7, 0x00, 0x75, 0x01, 0xe6, 0x00, 0x4e, 0x01, 0xe2, 0x00, 0x27, 0x01, 0xd9, 0x00, 0x05, 0x01, 0xcc, 0x00, 0xe6, 0x00, 0xbd, 0x00, 0xc7, 0x00, 0xb0, 0x00, 0xa5, 0x00, 0xa8, 0x00, 0x81, 0x00, 0xa7, 0x00, 0x62, 0x00, 0xaa, 0x00, 0x4c, 0x00, 0xaa, 0x00, 0x3b, 0x00, 0x9d, 0x00, 0x28, 0x00, 0x84, 0x00, 0x0f, 0x00, 0x6a, 0x00, 0xf6, 0xff, 0x59, 0x00, 0xe1, 0xff, 0x54, 0x00, 0xd5, 0xff, 0x56, 0x00, 0xcf, 0xff, 0x51, 0x00, 0xc6, 0xff, 0x44, 0x00, 0xb7, 0xff, 0x2e, 0x00, 0xa2, 0xff, 0x15, 0x00, 0x8a, 0xff, 0xfb, 0xff, 0x6e, 0xff, 0xe3, 0xff, 0x51, 0xff, 0xcc, 0xff, 0x34, 0xff, 0xb4, 0xff, 0x14, 0xff, 0x99, 0xff, 0xf4, 0xfe, 0x7c, 0xff, 0xd4, 0xfe, 0x60, 0xff, 0xb7, 0xfe, 0x44, 0xff, 0x9e, 0xfe, 0x2d, 0xff, 0x87, 0xfe, 0x1c, 0xff, 0x73, 0xfe, 0x0c, 0xff, 0x5b, 0xfe, 0xfb, 0xfe, 0x3c, 0xfe, 0xe6, 0xfe, 0x1a, 0xfe, 0xcc, 0xfe, 0xf7, 0xfd, 0xb0, 0xfe, 0xd8, 0xfd, 0x9b, 0xfe, 0xc7, 0xfd, 0x94, 0xfe, 0xc4, 0xfd, 0x9a, 0xfe, 0xcc, 0xfd, 0xab, 0xfe, 0xdb, 0xfd, 0xc1, 0xfe, 0xec, 0xfd, 0xd1, 0xfe, 0xf9, 0xfd, 0xd3, 0xfe, 0xf9, 0xfd, 0xcb, 0xfe, 0xf4, 0xfd, 0xc5, 0xfe, 0xf6, 0xfd, 0xca, 0xfe, 0x07, 0xfe, 0xe0, 0xfe, 0x2d, 0xfe, 0x06, 0xff, 0x61, 0xfe, 0x32, 0xff, 0x97, 0xfe, 0x58, 0xff, 0xc4, 0xfe, 0x72, 0xff, 0xe4, 0xfe, 0x85, 0xff, 0xfd, 0xfe, 0x97, 0xff, 0x17, 0xff, 0xb1, 0xff, 0x39, 0xff, 0xd4, 0xff, 0x65, 0xff, 0xf9, 0xff, 0x97, 0xff, 0x19, 0x00, 0xc7, 0xff, 0x32, 0x00, 0xf3, 0xff, 0x47, 0x00, 0x18, 0x00, 0x5c, 0x00, 0x3c, 0x00, 0x76, 0x00, 0x61, 0x00, 0x95, 0x00, 0x87, 0x00, 0xb6, 0x00, 0xae, 0x00, 0xd5, 0x00, 0xcf, 0x00, 0xe6, 0x00, 0xe3, 0x00, 0xe7, 0x00, 0xe6, 0x00, 0xe2, 0x00, 0xe5, 0x00, 0xdd, 0x00, 0xe6, 0x00, 0xe0, 0x00, 0xed, 0x00, 0xf2, 0x00, 0x00, 0x01, 0x0f, 0x01, 0x1b, 0x01, 0x29, 0x01, 0x32, 0x01, 0x36, 0x01, 0x3a, 0x01, 0x32, 0x01, 0x34, 0x01, 0x24, 0x01, 0x25, 0x01, 0x12, 0x01, 0x12, 0x01, 0x04, 0x01, 0x01, 0x01, 0x05, 0x01, 0xfa, 0x00, 0x0f, 0x01, 0xfa, 0x00, 0x1c, 0x01, 0xfa, 0x00, 0x22, 0x01, 0xf4, 0x00, 0x1f, 0x01, 0xe7, 0x00, 0x14, 0x01, 0xd3, 0x00, 0x08, 0x01, 0xbb, 0x00, 0x02, 0x01, 0xa6, 0x00, 0x02, 0x01, 0x95, 0x00, 0x02, 0x01, 0x85, 0x00, 0xfa, 0x00, 0x73, 0x00, 0xeb, 0x00, 0x5f, 0x00, 0xd3, 0x00, 0x49, 0x00, 0xb9, 0x00, 0x35, 0x00, 0xa4, 0x00, 0x28, 0x00, 0x96, 0x00, 0x20, 0x00, 0x87, 0x00, 0x16, 0x00, 0x73, 0x00, 0x04, 0x00, 0x56, 0x00, 0xeb, 0xff, 0x32, 0x00, 0xce, 0xff, 0x06, 0x00, 0xb0, 0xff, 0xd6, 0xff, 0x93, 0xff, 0xaf, 0xff, 0x82, 0xff, 0x93, 0xff, 0x79, 0xff, 0x7f, 0xff, 0x73, 0xff, 0x6b, 0xff, 0x68, 0xff, 0x51, 0xff, 0x56, 0xff, 0x2e, 0xff, 0x3c, 0xff, 0x03, 0xff, 0x1c, 0xff, 0xda, 0xfe, 0xfd, 0xfe, 0xb7, 0xfe, 0xe4, 0xfe, 0x9f, 0xfe, 0xd3, 0xfe, 0x93, 0xfe, 0xcc, 0xfe, 0x90, 0xfe, 0xce, 0xfe, 0x8d, 0xfe, 0xce, 0xfe, 0x86, 0xfe, 0xcc, 0xfe, 0x7f, 0xfe, 0xca, 0xfe, 0x79, 0xfe, 0xca, 0xfe, 0x73, 0xfe, 0xcc, 0xfe, 0x71, 0xfe, 0xd3, 0xfe, 0x78, 0xfe, 0xe4, 0xfe, 0x84, 0xfe, 0xfa, 0xfe, 0x8f, 0xfe, 0x12, 0xff, 0x98, 0xfe, 0x29, 0xff, 0xa3, 0xfe, 0x41, 0xff, 0xb0, 0xfe, 0x5a, 0xff, 0xbe, 0xfe, 0x73, 0xff, 0xcf, 0xfe, 0x8d, 0xff, 0xe1, 0xfe, 0xa7, 0xff, 0xf3, 0xfe, 0xc0, 0xff, 0x05, 0xff, 0xdb, 0xff, 0x16, 0xff, 0xf6, 0xff, 0x26, 0xff, 0x10, 0x00, 0x37, 0xff, 0x2c, 0x00, 0x4c, 0xff, 0x4a, 0x00, 0x65, 0xff, 0x68, 0x00, 0x7c, 0xff, 0x83, 0x00, 0x91, 0xff, 0x9e, 0x00, 0xa1, 0xff, 0xb5, 0x00, 0xa7, 0xff, 0xc6, 0x00, 0xa8, 0xff, 0xcf, 0x00, 0xa7, 0xff, 0xd2, 0x00, 0xa9, 0xff, 0xd4, 0x00, 0xb2, 0xff, 0xdb, 0x00, 0xc5, 0xff, 0xea, 0x00, 0xdd, 0xff, 0xfc, 0x00, 0xf2, 0xff, 0x0a, 0x01, 0x04, 0x00, 0x12, 0x01, 0x10, 0x00, 0x11, 0x01, 0x19, 0x00, 0x0b, 0x01, 0x22, 0x00, 0x02, 0x01, 0x28, 0x00, 0xf5, 0x00, 0x2f, 0x00, 0xe8, 0x00, 0x37, 0x00, 0xdd, 0x00, 0x3e, 0x00, 0xd4, 0x00, 0x47, 0x00, 0xcd, 0x00, 0x54, 0x00, 0xc6, 0x00, 0x63, 0x00, 0xbd, 0x00, 0x73, 0x00, 0xb1, 0x00, 0x7e, 0x00, 0xa1, 0x00, 0x80, 0x00, 0x8c, 0x00, 0x76, 0x00, 0x71, 0x00, 0x66, 0x00, 0x55, 0x00, 0x58, 0x00, 0x3e, 0x00, 0x4f, 0x00, 0x2d, 0x00, 0x4d, 0x00, 0x24, 0x00, 0x4e, 0x00, 0x1d, 0x00, 0x4c, 0x00, 0x13, 0x00, 0x41, 0x00, 0x01, 0x00, 0x2d, 0x00, 0xe6, 0xff, 0x17, 0x00, 0xcb, 0xff, 0xff, 0xff, 0xb1, 0xff, 0xe5, 0xff, 0x95, 0xff, 0xcd, 0xff, 0x79, 0xff, 0xb6, 0xff, 0x5f, 0xff, 0xa3, 0xff, 0x49, 0xff, 0x93, 0xff, 0x36, 0xff, 0x89, 0xff, 0x28, 0xff, 0x82, 0xff, 0x1d, 0xff, 0x7e, 0xff, 0x10, 0xff, 0x7b, 0xff, 0x04, 0xff, 0x79, 0xff, 0xf9, 0xfe, 0x79, 0xff, 0xf2, 0xfe, 0x77, 0xff, 0xeb, 0xfe, 0x73, 0xff, 0xe2, 0xfe, 0x6f, 0xff, 0xda, 0xfe, 0x6c, 0xff, 0xd6, 0xfe, 0x6f, 0xff, 0xd7, 0xfe, 0x77, 0xff, 0xde, 0xfe, 0x82, 0xff, 0xe7, 0xfe, 0x8a, 0xff, 0xee, 0xfe, 0x8d, 0xff, 0xee, 0xfe, 0x8c, 0xff, 0xec, 0xfe, 0x8b, 0xff, 0xee, 0xfe, 0x92, 0xff, 0xfa, 0xfe, 0xa2, 0xff, 0x12, 0xff, 0xb9, 0xff, 0x2f, 0xff, 0xd3, 0xff, 0x4f, 0xff, 0xeb, 0xff, 0x6c, 0xff, 0x03, 0x00, 0x8a, 0xff, 0x1a, 0x00, 0xa6, 0xff, 0x2f, 0x00, 0xc2, 0xff, 0x43, 0x00, 0xde, 0xff, 0x56, 0x00, 0xfa, 0xff, 0x6a, 0x00, 0x17, 0x00, 0x80, 0x00, 0x35, 0x00, 0x9a, 0x00, 0x56, 0x00, 0xb6, 0x00, 0x7a, 0x00, 0xd2, 0x00, 0xa0, 0x00, 0xec, 0x00, 0xc6, 0x00, 0x04, 0x01, 0xea, 0x00, 0x18, 0x01, 0x08, 0x01, 0x28, 0x01, 0x1e, 0x01, 0x31, 0x01, 0x2c, 0x01, 0x31, 0x01, 0x33, 0x01, 0x30, 0x01, 0x3b, 0x01, 0x32, 0x01, 0x4a, 0x01, 0x39, 0x01, 0x5e, 0x01, 0x44, 0x01, 0x74, 0x01, 0x53, 0x01, 0x88, 0x01, 0x60, 0x01, 0x93, 0x01, 0x63, 0x01, 0x91, 0x01, 0x5c, 0x01, 0x85, 0x01, 0x51, 0x01, 0x76, 0x01, 0x44, 0x01, 0x6a, 0x01, 0x38, 0x01, 0x62, 0x01, 0x33, 0x01, 0x61, 0x01, 0x32, 0x01, 0x63, 0x01, 0x32, 0x01, 0x60, 0x01, 0x31, 0x01, 0x54, 0x01, 0x2e, 0x01, 0x43, 0x01, 0x29, 0x01, 0x30, 0x01, 0x20, 0x01, 0x1a, 0x01, 0x15, 0x01, 0x04, 0x01, 0x08, 0x01, 0xee, 0x00, 0xff, 0x00, 0xd9, 0x00, 0xf9, 0x00, 0xc4, 0x00, 0xf3, 0x00, 0xac, 0x00, 0xeb, 0x00, 0x91, 0x00, 0xe2, 0x00, 0x76, 0x00, 0xdb, 0x00, 0x5d, 0x00, 0xcf, 0x00, 0x42, 0x00, 0xc2, 0x00, 0x28, 0x00, 0xb7, 0x00, 0x14, 0x00, 0xae, 0x00, 0x04, 0x00, 0xa5, 0x00, 0xf7, 0xff, 0x9f, 0x00, 0xee, 0xff, 0x99, 0x00, 0xe9, 0xff, 0x91, 0x00, 0xe4, 0xff, 0x85, 0x00, 0xe0, 0xff, 0x76, 0x00, 0xdc, 0xff, 0x66, 0x00, 0xd6, 0xff, 0x55, 0x00, 0xd0, 0xff, 0x46, 0x00, 0xcd, 0xff, 0x38, 0x00, 0xcc, 0xff, 0x28, 0x00, 0xcf, 0xff, 0x14, 0x00, 0xcf, 0xff, 0xfd, 0xff, 0xcb, 0xff, 0xe7, 0xff, 0xc6, 0xff, 0xd2, 0xff, 0xbe, 0xff, 0xc1, 0xff, 0xb5, 0xff, 0xb4, 0xff, 0xae, 0xff, 0xac, 0xff, 0xa8, 0xff, 0xa9, 0xff, 0xa5, 0xff, 0xa8, 0xff, 0xa5, 0xff, 0xa9, 0xff, 0xa8, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0x9a, 0xff, 0x9b, 0xff, 0x90, 0xff, 0x92, 0xff, 0x8a, 0xff, 0x8b, 0xff, 0x8a, 0xff, 0x8a, 0xff, 0x92, 0xff, 0x91, 0xff, 0x9d, 0xff, 0x9d, 0xff, 0xa6, 0xff, 0xa7, 0xff, 0xae, 0xff, 0xb1, 0xff, 0xba, 0xff, 0xbb, 0xff, 0xc6, 0xff, 0xc8, 0xff, 0xce, 0xff, 0xd4, 0xff, 0xd3, 0xff, 0xe1, 0xff, 0xd7, 0xff, 0xf1, 0xff, 0xd9, 0xff, 0x00, 0x00, 0xda, 0xff, 0x0f, 0x00, 0xdf, 0xff, 0x1e, 0x00, 0xeb, 0xff, 0x31, 0x00, 0xf8, 0xff, 0x42, 0x00, 0x02, 0x00, 0x4f, 0x00, 0x07, 0x00, 0x59, 0x00, 0x08, 0x00, 0x65, 0x00, 0x09, 0x00, 0x77, 0x00, 0x08, 0x00, 0x89, 0x00, 0x08, 0x00, 0x99, 0x00, 0x06, 0x00, 0xa3, 0x00, 0x03, 0x00, 0xa7, 0x00, 0x01, 0x00, 0xac, 0x00, 0xfd, 0xff, 0xae, 0x00, 0xf5, 0xff, 0xaf, 0x00, 0xec, 0xff, 0xb1, 0x00, 0xe4, 0xff, 0xb5, 0x00, 0xe1, 0xff, 0xbd, 0x00, 0xde, 0xff, 0xc0, 0x00, 0xd8, 0xff, 0xbc, 0x00, 0xcc, 0xff, 0xad, 0x00, 0xbb, 0xff, 0x98, 0x00, 0xa9, 0xff, 0x81, 0x00, 0x9a, 0xff, 0x6c, 0x00, 0x90, 0xff, 0x5b, 0x00, 0x88, 0xff, 0x49, 0x00, 0x7f, 0xff, 0x34, 0x00, 0x70, 0xff, 0x1b, 0x00, 0x5e, 0xff, 0xfd, 0xff, 0x4a, 0xff, 0xdf, 0xff, 0x39, 0xff, 0xc3, 0xff, 0x32, 0xff, 0xae, 0xff, 0x37, 0xff, 0xa0, 0xff, 0x44, 0xff, 0x98, 0xff, 0x52, 0xff, 0x90, 0xff, 0x5c, 0xff, 0x86, 0xff, 0x62, 0xff, 0x7b, 0xff, 0x62, 0xff, 0x6f, 0xff, 0x5f, 0xff, 0x65, 0xff, 0x5d, 0xff, 0x60, 0xff, 0x5e, 0xff, 0x5f, 0xff, 0x66, 0xff, 0x62, 0xff, 0x76, 0xff, 0x69, 0xff, 0x86, 0xff, 0x6d, 0xff, 0x91, 0xff, 0x6a, 0xff, 0x97, 0xff, 0x67, 0xff, 0x9d, 0xff, 0x67, 0xff, 0xa2, 0xff, 0x6b, 0xff, 0xa8, 0xff, 0x70, 0xff, 0xac, 0xff, 0x74, 0xff, 0xad, 0xff, 0x73, 0xff, 0xa8, 0xff, 0x68, 0xff, 0x9d, 0xff, 0x54, 0xff, 0x91, 0xff, 0x3c, 0xff, 0x85, 0xff, 0x26, 0xff, 0x7a, 0xff, 0x15, 0xff, 0x77, 0xff, 0x0e, 0xff, 0x7b, 0xff, 0x11, 0xff, 0x81, 0xff, 0x15, 0xff, 0x81, 0xff, 0x12, 0xff, 0x79, 0xff, 0x05, 0xff, 0x6d, 0xff, 0xf5, 0xfe, 0x66, 0xff, 0xe8, 0xfe, 0x68, 0xff, 0xe4, 0xfe, 0x74, 0xff, 0xea, 0xfe, 0x86, 0xff, 0xf7, 0xfe, 0x96, 0xff, 0x00, 0xff, 0xa3, 0xff, 0x09, 0xff, 0xb0, 0xff, 0x16, 0xff, 0xbe, 0xff, 0x25, 0xff, 0xcd, 0xff, 0x3a, 0xff, 0xdf, 0xff, 0x53, 0xff, 0xf4, 0xff, 0x72, 0xff, 0x06, 0x00, 0x8e, 0xff, 0x16, 0x00, 0xa7, 0xff, 0x25, 0x00, 0xbe, 0xff, 0x35, 0x00, 0xd5, 0xff, 0x48, 0x00, 0xee, 0xff, 0x5b, 0x00, 0x09, 0x00, 0x6e, 0x00, 0x29, 0x00, 0x7b, 0x00, 0x46, 0x00, 0x7d, 0x00, 0x57, 0x00, 0x74, 0x00, 0x5e, 0x00, 0x67, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5d, 0x00, 0x5b, 0x00, 0x62, 0x00, 0x60, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x7b, 0x00, 0x6e, 0x00, 0x85, 0x00, 0x6b, 0x00, 0x88, 0x00, 0x5c, 0x00, 0x80, 0x00, 0x47, 0x00, 0x71, 0x00, 0x33, 0x00, 0x61, 0x00, 0x29, 0x00, 0x58, 0x00, 0x2b, 0x00, 0x58, 0x00, 0x36, 0x00, 0x5f, 0x00, 0x43, 0x00, 0x67, 0x00, 0x4a, 0x00, 0x68, 0x00, 0x49, 0x00, 0x61, 0x00, 0x44, 0x00, 0x56, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x3e, 0x00, 0x47, 0x00, 0x44, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x4f, 0x00, 0x57, 0x00, 0x54, 0x00, 0x5f, 0x00, 0x55, 0x00, 0x64, 0x00, 0x50, 0x00, 0x60, 0x00, 0x43, 0x00, 0x5c, 0x00, 0x38, 0x00, 0x5e, 0x00, 0x34, 0x00, 0x64, 0x00, 0x36, 0x00, 0x6a, 0x00, 0x3a, 0x00, 0x6e, 0x00, 0x3c, 0x00, 0x6f, 0x00, 0x3a, 0x00, 0x6d, 0x00, 0x34, 0x00, 0x69, 0x00, 0x2b, 0x00, 0x65, 0x00, 0x1f, 0x00, 0x63, 0x00, 0x15, 0x00, 0x60, 0x00, 0x0d, 0x00, 0x5c, 0x00, 0x07, 0x00, 0x5a, 0x00, 0x02, 0x00, 0x54, 0x00, 0xf8, 0xff, 0x4b, 0x00, 0xeb, 0xff, 0x3f, 0x00, 0xd9, 0xff, 0x31, 0x00, 0xc5, 0xff, 0x25, 0x00, 0xb4, 0xff, 0x1e, 0x00, 0xa8, 0xff, 0x17, 0x00, 0x9d, 0xff, 0x0d, 0x00, 0x90, 0xff, 0x01, 0x00, 0x82, 0xff, 0xf3, 0xff, 0x73, 0xff, 0xe2, 0xff, 0x63, 0xff, 0xd5, 0xff, 0x58, 0xff, 0xcb, 0xff, 0x53, 0xff, 0xc3, 0xff, 0x54, 0xff, 0xbc, 0xff, 0x57, 0xff, 0xb5, 0xff, 0x59, 0xff, 0xae, 0xff, 0x5a, 0xff, 0xa6, 0xff, 0x58, 0xff, 0xa1, 0xff, 0x59, 0xff, 0xa3, 0xff, 0x61, 0xff, 0xa8, 0xff, 0x6e, 0xff, 0xae, 0xff, 0x7f, 0xff, 0xb3, 0xff, 0x91, 0xff, 0xb2, 0xff, 0x9e, 0xff, 0xab, 0xff, 0xa5, 0xff, 0xa2, 0xff, 0xab, 0xff, 0x9e, 0xff, 0xb4, 0xff, 0xa4, 0xff, 0xc7, 0xff, 0xb4, 0xff, 0xe2, 0xff, 0xc8, 0xff, 0x02, 0x00, 0xdb, 0xff, 0x22, 0x00, 0xe8, 0xff, 0x3c, 0x00, 0xf0, 0xff, 0x53, 0x00, 0xf5, 0xff, 0x66, 0x00, 0xf9, 0xff, 0x77, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x0c, 0x00, 0xa1, 0x00, 0x1e, 0x00, 0xbe, 0x00, 0x32, 0x00, 0xdd, 0x00, 0x44, 0x00, 0xf8, 0x00, 0x50, 0x00, 0x0c, 0x01, 0x54, 0x00, 0x16, 0x01, 0x57, 0x00, 0x1d, 0x01, 0x59, 0x00, 0x25, 0x01, 0x5b, 0x00, 0x2b, 0x01, 0x5e, 0x00, 0x31, 0x01, 0x5e, 0x00, 0x33, 0x01, 0x58, 0x00, 0x2c, 0x01, 0x4e, 0x00, 0x1d, 0x01, 0x45, 0x00, 0x0a, 0x01, 0x41, 0x00, 0xf7, 0x00, 0x3f, 0x00, 0xe3, 0x00, 0x3d, 0x00, 0xd1, 0x00, 0x3e, 0x00, 0xc6, 0x00, 0x3e, 0x00, 0xbb, 0x00, 0x38, 0x00, 0xad, 0x00, 0x2e, 0x00, 0x9b, 0x00, 0x24, 0x00, 0x84, 0x00, 0x19, 0x00, 0x6a, 0x00, 0x12, 0x00, 0x4e, 0x00, 0x0c, 0x00, 0x32, 0x00, 0x07, 0x00, 0x17, 0x00, 0x01, 0x00, 0xfd, 0xff, 0xf7, 0xff, 0xe1, 0xff, 0xe4, 0xff, 0xc1, 0xff, 0xcf, 0xff, 0xa3, 0xff, 0xc1, 0xff, 0x8f, 0xff, 0xbc, 0xff, 0x85, 0xff, 0xbe, 0xff, 0x81, 0xff, 0xc4, 0xff, 0x81, 0xff, 0xca, 0xff, 0x7e, 0xff, 0xca, 0xff, 0x78, 0xff, 0xc3, 0xff, 0x6d, 0xff, 0xb8, 0xff, 0x63, 0xff, 0xac, 0xff, 0x5b, 0xff, 0xa6, 0xff, 0x5d, 0xff, 0xa6, 0xff, 0x68, 0xff, 0xa7, 0xff, 0x75, 0xff, 0xa6, 0xff, 0x7c, 0xff, 0xa0, 0xff, 0x7c, 0xff, 0x99, 0xff, 0x76, 0xff, 0x92, 0xff, 0x6e, 0xff, 0x91, 0xff, 0x6c, 0xff, 0x97, 0xff, 0x74, 0xff, 0xa2, 0xff, 0x82, 0xff, 0xb0, 0xff, 0x92, 0xff, 0xba, 0xff, 0x9f, 0xff, 0xbd, 0xff, 0xa4, 0xff, 0xbb, 0xff, 0xa0, 0xff, 0xb4, 0xff, 0x94, 0xff, 0xb2, 0xff, 0x8a, 0xff, 0xb6, 0xff, 0x83, 0xff, 0xbe, 0xff, 0x82, 0xff, 0xc5, 0xff, 0x85, 0xff, 0xc7, 0xff, 0x87, 0xff, 0xc3, 0xff, 0x87, 0xff, 0xbc, 0xff, 0x83, 0xff, 0xb7, 0xff, 0x82, 0xff, 0xb8, 0xff, 0x87, 0xff, 0xc0, 0xff, 0x94, 0xff, 0xcc, 0xff, 0xa5, 0xff, 0xd9, 0xff, 0xbb, 0xff, 0xe3, 0xff, 0xd1, 0xff, 0xe7, 0xff, 0xe2, 0xff, 0xe7, 0xff, 0xf3, 0xff, 0xe9, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x21, 0x00, 0x03, 0x00, 0x3f, 0x00, 0x14, 0x00, 0x5c, 0x00, 0x22, 0x00, 0x74, 0x00, 0x2e, 0x00, 0x87, 0x00, 0x3c, 0x00, 0x9c, 0x00, 0x4d, 0x00, 0xb2, 0x00, 0x62, 0x00, 0xc7, 0x00, 0x74, 0x00, 0xd8, 0x00, 0x81, 0x00, 0xe4, 0x00, 0x8a, 0x00, 0xec, 0x00, 0x90, 0x00, 0xf1, 0x00, 0x93, 0x00, 0xf4, 0x00, 0x91, 0x00, 0xf3, 0x00, 0x8d, 0x00, 0xed, 0x00, 0x8e, 0x00, 0xe9, 0x00, 0x97, 0x00, 0xeb, 0x00, 0xa5, 0x00, 0xef, 0x00, 0xae, 0x00, 0xee, 0x00, 0xac, 0x00, 0xe5, 0x00, 0xa4, 0x00, 0xd9, 0x00, 0x96, 0x00, 0xca, 0x00, 0x84, 0x00, 0xb9, 0x00, 0x6f, 0x00, 0xa3, 0x00, 0x5b, 0x00, 0x8d, 0x00, 0x4f, 0x00, 0x7d, 0x00, 0x47, 0x00, 0x70, 0x00, 0x3b, 0x00, 0x5e, 0x00, 0x25, 0x00, 0x46, 0x00, 0x0a, 0x00, 0x29, 0x00, 0xef, 0xff, 0x10, 0x00, 0xd9, 0xff, 0xfc, 0xff, 0xc8, 0xff, 0xec, 0xff, 0xba, 0xff, 0xdd, 0xff, 0xac, 0xff, 0xcb, 0xff, 0xa0, 0xff, 0xb9, 0xff, 0x98, 0xff, 0xa9, 0xff, 0x96, 0xff, 0x9e, 0xff, 0x98, 0xff, 0x98, 0xff, 0x9a, 0xff, 0x92, 0xff, 0x9d, 0xff, 0x8d, 0xff, 0xa4, 0xff, 0x8d, 0xff, 0xaf, 0xff, 0x90, 0xff, 0xb9, 0xff, 0x92, 0xff, 0xc0, 0xff, 0x8f, 0xff, 0xc2, 0xff, 0x88, 0xff, 0xc3, 0xff, 0x7f, 0xff, 0xc6, 0xff, 0x76, 0xff, 0xd0, 0xff, 0x73, 0xff, 0xe3, 0xff, 0x78, 0xff, 0xf5, 0xff, 0x80, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0x80, 0xff, 0xf4, 0xff, 0x77, 0xff, 0xe7, 0xff, 0x6e, 0xff, 0xe0, 0xff, 0x6b, 0xff, 0xe2, 0xff, 0x70, 0xff, 0xe6, 0xff, 0x79, 0xff, 0xec, 0xff, 0x84, 0xff, 0xef, 0xff, 0x8e, 0xff, 0xe8, 0xff, 0x90, 0xff, 0xd6, 0xff, 0x89, 0xff, 0xc6, 0xff, 0x83, 0xff, 0xbe, 0xff, 0x87, 0xff, 0xbe, 0xff, 0x92, 0xff, 0xc1, 0xff, 0xa0, 0xff, 0xc3, 0xff, 0xaf, 0xff, 0xc1, 0xff, 0xba, 0xff, 0xb8, 0xff, 0xbd, 0xff, 0xaf, 0xff, 0xbe, 0xff, 0xac, 0xff, 0xc1, 0xff, 0xb1, 0xff, 0xc8, 0xff, 0xbc, 0xff, 0xd5, 0xff, 0xcd, 0xff, 0xe7, 0xff, 0xdd, 0xff, 0xf9, 0xff, 0xe4, 0xff, 0x03, 0x00, 0xe2, 0xff, 0x07, 0x00, 0xde, 0xff, 0x09, 0x00, 0xde, 0xff, 0x0e, 0x00, 0xe7, 0xff, 0x19, 0x00, 0xfc, 0xff, 0x2c, 0x00, 0x15, 0x00, 0x41, 0x00, 0x29, 0x00, 0x52, 0x00, 0x30, 0x00, 0x59, 0x00, 0x2a, 0x00, 0x57, 0x00, 0x21, 0x00, 0x54, 0x00, 0x1c, 0x00, 0x55, 0x00, 0x21, 0x00, 0x5e, 0x00, 0x2d, 0x00, 0x6b, 0x00, 0x3c, 0x00, 0x7a, 0x00, 0x48, 0x00, 0x85, 0x00, 0x4c, 0x00, 0x88, 0x00, 0x49, 0x00, 0x87, 0x00, 0x3f, 0x00, 0x82, 0x00, 0x33, 0x00, 0x7d, 0x00, 0x2b, 0x00, 0x7d, 0x00, 0x28, 0x00, 0x81, 0x00, 0x29, 0x00, 0x86, 0x00, 0x29, 0x00, 0x88, 0x00, 0x26, 0x00, 0x87, 0x00, 0x1c, 0x00, 0x7f, 0x00, 0x0c, 0x00, 0x70, 0x00, 0xfc, 0xff, 0x61, 0x00, 0xf3, 0xff, 0x58, 0x00, 0xee, 0xff, 0x52, 0x00, 0xe6, 0xff, 0x4a, 0x00, 0xdb, 0xff, 0x3f, 0x00, 0xca, 0xff, 0x2d, 0x00, 0xb9, 0xff, 0x16, 0x00, 0xab, 0xff, 0x00, 0x00, 0xa2, 0xff, 0xeb, 0xff, 0x9d, 0xff, 0xdb, 0xff, 0x99, 0xff, 0xcb, 0xff, 0x93, 0xff, 0xb8, 0xff, 0x86, 0xff, 0x9f, 0xff, 0x74, 0xff, 0x80, 0xff, 0x62, 0xff, 0x64, 0xff, 0x5b, 0xff, 0x50, 0xff, 0x5f, 0xff, 0x45, 0xff, 0x68, 0xff, 0x3f, 0xff, 0x71, 0xff, 0x36, 0xff, 0x76, 0xff, 0x2b, 0xff, 0x79, 0xff, 0x20, 0xff, 0x7f, 0xff, 0x1a, 0xff, 0x8b, 0xff, 0x1b, 0xff, 0x9a, 0xff, 0x1f, 0xff, 0xac, 0xff, 0x26, 0xff, 0xc2, 0xff, 0x33, 0xff, 0xda, 0xff, 0x43, 0xff, 0xeb, 0xff, 0x51, 0xff, 0xf2, 0xff, 0x57, 0xff, 0xf1, 0xff, 0x58, 0xff, 0xf0, 0xff, 0x59, 0xff, 0xf6, 0xff, 0x63, 0xff, 0x02, 0x00, 0x72, 0xff, 0x0c, 0x00, 0x81, 0xff, 0x0e, 0x00, 0x8c, 0xff, 0x0b, 0x00, 0x93, 0xff, 0x04, 0x00, 0x99, 0xff, 0xfb, 0xff, 0x9f, 0xff, 0xf3, 0xff, 0xa5, 0xff, 0xf1, 0xff, 0xb1, 0xff, 0xfb, 0xff, 0xc5, 0xff, 0x0c, 0x00, 0xdd, 0xff, 0x1e, 0x00, 0xf6, 0xff, 0x2e, 0x00, 0x0c, 0x00, 0x37, 0x00, 0x1c, 0x00, 0x39, 0x00, 0x26, 0x00, 0x3d, 0x00, 0x31, 0x00, 0x48, 0x00, 0x42, 0x00, 0x5a, 0x00, 0x59, 0x00, 0x74, 0x00, 0x74, 0x00, 0x96, 0x00, 0x95, 0x00, 0xb6, 0x00, 0xb2, 0x00, 0xcc, 0x00, 0xc5, 0x00, 0xdc, 0x00, 0xd2, 0x00, 0xe9, 0x00, 0xdd, 0x00, 0xf2, 0x00, 0xe3, 0x00, 0xf8, 0x00, 0xe6, 0x00, 0xf9, 0x00, 0xe5, 0x00, 0xfb, 0x00, 0xe6, 0x00, 0xfe, 0x00, 0xea, 0x00, 0x06, 0x01, 0xf1, 0x00, 0x0d, 0x01, 0xf5, 0x00, 0x0c, 0x01, 0xf0, 0x00, 0x05, 0x01, 0xe6, 0x00, 0xfb, 0x00, 0xd9, 0x00, 0xf1, 0x00, 0xce, 0x00, 0xea, 0x00, 0xc9, 0x00, 0xeb, 0x00, 0xcb, 0x00, 0xed, 0x00, 0xce, 0x00, 0xe5, 0x00, 0xc7, 0x00, 0xd5, 0x00, 0xb9, 0x00, 0xbf, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x78, 0x00, 0x7d, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x52, 0x00, 0x57, 0x00, 0x3f, 0x00, 0x47, 0x00, 0x2e, 0x00, 0x3c, 0x00, 0x22, 0x00, 0x30, 0x00, 0x16, 0x00, 0x22, 0x00, 0x07, 0x00, 0x0f, 0x00, 0xf4, 0xff, 0xfb, 0xff, 0xe1, 0xff, 0xec, 0xff, 0xd1, 0xff, 0xe6, 0xff, 0xc9, 0xff, 0xe5, 0xff, 0xc5, 0xff, 0xe4, 0xff, 0xc1, 0xff, 0xdf, 0xff, 0xba, 0xff, 0xd5, 0xff, 0xb1, 0xff, 0xc6, 0xff, 0xa5, 0xff, 0xb5, 0xff, 0x98, 0xff, 0xa8, 0xff, 0x8e, 0xff, 0x9e, 0xff, 0x86, 0xff, 0x97, 0xff, 0x7e, 0xff, 0x90, 0xff, 0x77, 0xff, 0x89, 0xff, 0x71, 0xff, 0x83, 0xff, 0x6f, 0xff, 0x7d, 0xff, 0x70, 0xff, 0x74, 0xff, 0x71, 0xff, 0x68, 0xff, 0x70, 0xff, 0x5d, 0xff, 0x6c, 0xff, 0x57, 0xff, 0x6a, 0xff, 0x56, 0xff, 0x69, 0xff, 0x5a, 0xff, 0x6d, 0xff, 0x61, 0xff, 0x75, 0xff, 0x67, 0xff, 0x7f, 0xff, 0x6b, 0xff, 0x87, 0xff, 0x6d, 0xff, 0x8d, 0xff, 0x70, 0xff, 0x91, 0xff, 0x75, 0xff, 0x97, 0xff, 0x78, 0xff, 0x9a, 0xff, 0x7b, 0xff, 0x9e, 0xff, 0x7c, 0xff, 0xa3, 0xff, 0x81, 0xff, 0xac, 0xff, 0x8a, 0xff, 0xba, 0xff, 0x96, 0xff, 0xc9, 0xff, 0xa4, 0xff, 0xd9, 0xff, 0xb4, 0xff, 0xe7, 0xff, 0xc1, 0xff, 0xf4, 0xff, 0xcd, 0xff, 0x00, 0x00, 0xd8, 0xff, 0x0e, 0x00, 0xe5, 0xff, 0x23, 0x00, 0xf9, 0xff, 0x3f, 0x00, 0x11, 0x00, 0x5f, 0x00, 0x2d, 0x00, 0x7f, 0x00, 0x47, 0x00, 0x9a, 0x00, 0x56, 0x00, 0xab, 0x00, 0x5e, 0x00, 0xb6, 0x00, 0x5f, 0x00, 0xbe, 0x00, 0x5d, 0x00, 0xc5, 0x00, 0x5a, 0x00, 0xce, 0x00, 0x57, 0x00, 0xd6, 0x00, 0x53, 0x00, 0xdc, 0x00, 0x4c, 0x00, 0xdd, 0x00, 0x42, 0x00, 0xd9, 0x00, 0x32, 0x00, 0xcc, 0x00, 0x1c, 0x00, 0xba, 0x00, 0x08, 0x00, 0xa8, 0x00, 0xf7, 0xff, 0x99, 0x00, 0xe9, 0xff, 0x8c, 0x00, 0xdb, 0xff, 0x7e, 0x00, 0xcd, 0xff, 0x70, 0x00, 0xbf, 0xff, 0x5f, 0x00, 0xac, 0xff, 0x49, 0x00, 0x9a, 0xff, 0x31, 0x00, 0x8d, 0xff, 0x1d, 0x00, 0x87, 0xff, 0x0d, 0x00, 0x86, 0xff, 0xff, 0xff, 0x83, 0xff, 0xed, 0xff, 0x7c, 0xff, 0xd8, 0xff, 0x73, 0xff, 0xc0, 0xff, 0x64, 0xff, 0xa8, 0xff, 0x55, 0xff, 0x90, 0xff, 0x47, 0xff, 0x7a, 0xff, 0x41, 0xff, 0x69, 0xff, 0x43, 0xff, 0x5e, 0xff, 0x4a, 0xff, 0x55, 0xff, 0x53, 0xff, 0x4d, 0xff, 0x58, 0xff, 0x44, 0xff, 0x5c, 0xff, 0x3b, 0xff, 0x5e, 0xff, 0x35, 0xff, 0x5f, 0xff, 0x2e, 0xff, 0x5c, 0xff, 0x25, 0xff, 0x56, 0xff, 0x1b, 0xff, 0x59, 0xff, 0x19, 0xff, 0x6d, 0xff, 0x26, 0xff, 0x8b, 0xff, 0x3e, 0xff, 0x9e, 0xff, 0x4b, 0xff, 0x9c, 0xff, 0x45, 0xff, 0x92, 0xff, 0x37, 0xff, 0x90, 0xff, 0x34, 0xff, 0x9a, 0xff, 0x3c, 0xff, 0xa0, 0xff, 0x43, 0xff, 0x9d, 0xff, 0x42, 0xff, 0x9e, 0xff, 0x45, 0xff, 0xb0, 0xff, 0x5a, 0xff, 0xcd, 0xff, 0x7a, 0xff, 0xe4, 0xff, 0x94, 0xff, 0xeb, 0xff, 0x9f, 0xff, 0xe5, 0xff, 0x9b, 0xff, 0xd9, 0xff, 0x90, 0xff, 0xcc, 0xff, 0x85, 0xff, 0xca, 0xff, 0x85, 0xff, 0xd5, 0xff, 0x95, 0xff, 0xeb, 0xff, 0xae, 0xff, 0xfb, 0xff, 0xc0, 0xff, 0xfd, 0xff, 0xc0, 0xff, 0xf4, 0xff, 0xb2, 0xff, 0xed, 0xff, 0xa7, 0xff, 0xf4, 0xff, 0xac, 0xff, 0x05, 0x00, 0xbd, 0xff, 0x19, 0x00, 0xd3, 0xff, 0x2b, 0x00, 0xe6, 0xff, 0x37, 0x00, 0xf1, 0xff, 0x3e, 0x00, 0xf5, 0xff, 0x44, 0x00, 0xf6, 0xff, 0x49, 0x00, 0xf3, 0xff, 0x4e, 0x00, 0xf1, 0xff, 0x57, 0x00, 0xf6, 0xff, 0x6e, 0x00, 0x0c, 0x00, 0x97, 0x00, 0x36, 0x00, 0xc2, 0x00, 0x62, 0x00, 0xda, 0x00, 0x79, 0x00, 0xda, 0x00, 0x77, 0x00, 0xd3, 0x00, 0x6c, 0x00, 0xd5, 0x00, 0x6e, 0x00, 0xe5, 0x00, 0x82, 0x00, 0xfd, 0x00, 0xa2, 0x00, 0x16, 0x01, 0xc2, 0x00, 0x30, 0x01, 0xe2, 0x00, 0x44, 0x01, 0xfa, 0x00, 0x4b, 0x01, 0x03, 0x01, 0x46, 0x01, 0xfe, 0x00, 0x38, 0x01, 0xef, 0x00, 0x27, 0x01, 0xdf, 0x00, 0x1a, 0x01, 0xd7, 0x00, 0x18, 0x01, 0xdb, 0x00, 0x1d, 0x01, 0xe7, 0x00, 0x22, 0x01, 0xf0, 0x00, 0x18, 0x01, 0xe6, 0x00, 0xf7, 0x00, 0xc1, 0x00, 0xc5, 0x00, 0x8b, 0x00, 0x93, 0x00, 0x58, 0x00, 0x77, 0x00, 0x3b, 0x00, 0x72, 0x00, 0x37, 0x00, 0x7a, 0x00, 0x3e, 0x00, 0x78, 0x00, 0x38, 0x00, 0x5f, 0x00, 0x1c, 0x00, 0x35, 0x00, 0xee, 0xff, 0x0a, 0x00, 0xc3, 0xff, 0xf0, 0xff, 0xa8, 0xff, 0xe6, 0xff, 0xa0, 0xff, 0xde, 0xff, 0x9b, 0xff, 0xcc, 0xff, 0x8b, 0xff, 0xb2, 0xff, 0x72, 0xff, 0x97, 0xff, 0x5a, 0xff, 0x84, 0xff, 0x4c, 0xff, 0x79, 0xff, 0x48, 0xff, 0x6e, 0xff, 0x45, 0xff, 0x66, 0xff, 0x45, 0xff, 0x61, 0xff, 0x48, 0xff, 0x65, 0xff, 0x4f, 0xff, 0x70, 0xff, 0x5b, 0xff, 0x84, 0xff, 0x6f, 0xff, 0x9e, 0xff, 0x89, 0xff, 0xb5, 0xff, 0xa2, 0xff, 0xc3, 0xff, 0xb6, 0xff, 0xcc, 0xff, 0xc5, 0xff, 0xd8, 0xff, 0xd6, 0xff, 0xea, 0xff, 0xee, 0xff, 0x03, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x2f, 0x00, 0x31, 0x00, 0x3c, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x4b, 0x00, 0x4d, 0x00, 0x59, 0x00, 0x53, 0x00, 0x6a, 0x00, 0x5a, 0x00, 0x7b, 0x00, 0x60, 0x00, 0x89, 0x00, 0x61, 0x00, 0x8f, 0x00, 0x5e, 0x00, 0x90, 0x00, 0x60, 0x00, 0x95, 0x00, 0x67, 0x00, 0xa0, 0x00, 0x6f, 0x00, 0xae, 0x00, 0x75, 0x00, 0xbb, 0x00, 0x74, 0x00, 0xc1, 0x00, 0x6b, 0x00, 0xbe, 0x00, 0x5f, 0x00, 0xb6, 0x00, 0x54, 0x00, 0xb0, 0x00, 0x51, 0x00, 0xb2, 0x00, 0x56, 0x00, 0xbd, 0x00, 0x5c, 0x00, 0xc9, 0x00, 0x58, 0x00, 0xca, 0x00, 0x45, 0x00, 0xb8, 0x00, 0x26, 0x00, 0x97, 0x00, 0x0c, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x01, 0x00, 0x68, 0x00, 0x08, 0x00, 0x6d, 0x00, 0x0c, 0x00, 0x70, 0x00, 0x04, 0x00, 0x67, 0x00, 0xf3, 0xff, 0x52, 0x00, 0xdd, 0xff, 0x33, 0x00, 0xc6, 0xff, 0x13, 0x00, 0xb1, 0xff, 0xf3, 0xff, 0x9c, 0xff, 0xd8, 0xff, 0x8e, 0xff, 0xc5, 0xff, 0x84, 0xff, 0xb9, 0xff, 0x7f, 0xff, 0xaf, 0xff, 0x79, 0xff, 0xa1, 0xff, 0x6b, 0xff, 0x89, 0xff, 0x55, 0xff, 0x69, 0xff, 0x3d, 0xff, 0x48, 0xff, 0x2e, 0xff, 0x32, 0xff, 0x2b, 0xff, 0x2a, 0xff, 0x2f, 0xff, 0x2d, 0xff, 0x36, 0xff, 0x35, 0xff, 0x38, 0xff, 0x3a, 0xff, 0x33, 0xff, 0x38, 0xff, 0x2e, 0xff, 0x36, 0xff, 0x2f, 0xff, 0x3a, 0xff, 0x39, 0xff, 0x49, 0xff, 0x44, 0xff, 0x5c, 0xff, 0x4d, 0xff, 0x6c, 0xff, 0x54, 0xff, 0x77, 0xff, 0x59, 0xff, 0x7e, 0xff, 0x65, 0xff, 0x89, 0xff, 0x77, 0xff, 0x9b, 0xff, 0x87, 0xff, 0xac, 0xff, 0x91, 0xff, 0xb8, 0xff, 0x96, 0xff, 0xc0, 0xff, 0x98, 0xff, 0xc7, 0xff, 0x9c, 0xff, 0xcd, 0xff, 0xa2, 0xff, 0xd4, 0xff, 0xac, 0xff, 0xdb, 0xff, 0xb9, 0xff, 0xe3, 0xff, 0xc9, 0xff, 0xeb, 0xff, 0xdb, 0xff, 0xf8, 0xff, 0xec, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x10, 0x00, 0x00, 0x00, 0x13, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x09, 0x00, 0x06, 0x00, 0x07, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x18, 0x00, 0x28, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x19, 0x00, 0x27, 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x01, 0x00, 0x15, 0x00, 0xf8, 0xff, 0x16, 0x00, 0xf8, 0xff, 0x20, 0x00, 0x01, 0x00, 0x2e, 0x00, 0x0d, 0x00, 0x3d, 0x00, 0x18, 0x00, 0x4a, 0x00, 0x21, 0x00, 0x52, 0x00, 0x22, 0x00, 0x56, 0x00, 0x20, 0x00, 0x5a, 0x00, 0x1f, 0x00, 0x5f, 0x00, 0x22, 0x00, 0x67, 0x00, 0x2a, 0x00, 0x74, 0x00, 0x38, 0x00, 0x85, 0x00, 0x48, 0x00, 0x95, 0x00, 0x53, 0x00, 0x9d, 0x00, 0x57, 0x00, 0x9f, 0x00, 0x54, 0x00, 0xa0, 0x00, 0x52, 0x00, 0xa6, 0x00, 0x56, 0x00, 0xb3, 0x00, 0x64, 0x00, 0xc2, 0x00, 0x76, 0x00, 0xcf, 0x00, 0x87, 0x00, 0xd3, 0x00, 0x91, 0x00, 0xca, 0x00, 0x8e, 0x00, 0xb8, 0x00, 0x82, 0x00, 0xa6, 0x00, 0x76, 0x00, 0x98, 0x00, 0x70, 0x00, 0x8c, 0x00, 0x6e, 0x00, 0x81, 0x00, 0x6d, 0x00, 0x77, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6a, 0x00, 0x5b, 0x00, 0x61, 0x00, 0x46, 0x00, 0x54, 0x00, 0x30, 0x00, 0x47, 0x00, 0x1c, 0x00, 0x3e, 0x00, 0x08, 0x00, 0x37, 0x00, 0xf3, 0xff, 0x2f, 0x00, 0xdc, 0xff, 0x24, 0x00, 0xc0, 0xff, 0x12, 0x00, 0xa3, 0xff, 0xfc, 0xff, 0x88, 0xff, 0xe4, 0xff, 0x73, 0xff, 0xcf, 0xff, 0x64, 0xff, 0xc1, 0xff, 0x57, 0xff, 0xb9, 0xff, 0x45, 0xff, 0xb1, 0xff, 0x2d, 0xff, 0xa5, 0xff, 0x13, 0xff, 0x96, 0xff, 0xfc, 0xfe, 0x88, 0xff, 0xec, 0xfe, 0x7d, 0xff, 0xe3, 0xfe, 0x79, 0xff, 0xe4, 0xfe, 0x7e, 0xff, 0xec, 0xfe, 0x8a, 0xff, 0xf6, 0xfe, 0x98, 0xff, 0xfe, 0xfe, 0xa7, 0xff, 0x03, 0xff, 0xb4, 0xff, 0x08, 0xff, 0xc1, 0xff, 0x0d, 0xff, 0xcc, 0xff, 0x15, 0xff, 0xd9, 0xff, 0x22, 0xff, 0xe8, 0xff, 0x34, 0xff, 0xfa, 0xff, 0x46, 0xff, 0x0b, 0x00, 0x55, 0xff, 0x17, 0x00, 0x61, 0xff, 0x1f, 0x00, 0x69, 0xff, 0x21, 0x00, 0x74, 0xff, 0x25, 0x00, 0x88, 0xff, 0x31, 0x00, 0xa6, 0xff, 0x45, 0x00, 0xc9, 0xff, 0x5e, 0x00, 0xea, 0xff, 0x71, 0x00, 0x04, 0x00, 0x7c, 0x00, 0x1a, 0x00, 0x82, 0x00, 0x33, 0x00, 0x8a, 0x00, 0x51, 0x00, 0x97, 0x00, 0x75, 0x00, 0xa9, 0x00, 0x9b, 0x00, 0xbc, 0x00, 0xb8, 0x00, 0xc9, 0x00, 0xc7, 0x00, 0xc9, 0x00, 0xc8, 0x00, 0xbd, 0x00, 0xc4, 0x00, 0xab, 0x00, 0xc5, 0x00, 0x9d, 0x00, 0xce, 0x00, 0x95, 0x00, 0xdf, 0x00, 0x94, 0x00, 0xef, 0x00, 0x93, 0x00, 0xf8, 0x00, 0x8d, 0x00, 0xf8, 0x00, 0x82, 0x00, 0xf4, 0x00, 0x78, 0x00, 0xee, 0x00, 0x6f, 0x00, 0xe6, 0x00, 0x66, 0x00, 0xe3, 0x00, 0x60, 0x00, 0xe2, 0x00, 0x5a, 0x00, 0xe1, 0x00, 0x52, 0x00, 0xda, 0x00, 0x45, 0x00, 0xcf, 0x00, 0x35, 0x00, 0xc0, 0x00, 0x25, 0x00, 0xb1, 0x00, 0x17, 0x00, 0xa8, 0x00, 0x10, 0x00, 0xa5, 0x00, 0x0f, 0x00, 0xa4, 0x00, 0x11, 0x00, 0xa2, 0x00, 0x0f, 0x00, 0x98, 0x00, 0x07, 0x00, 0x85, 0x00, 0xf6, 0xff, 0x6f, 0x00, 0xe2, 0xff, 0x5b, 0x00, 0xd1, 0xff, 0x4d, 0x00, 0xc8, 0xff, 0x45, 0x00, 0xc6, 0xff, 0x3b, 0x00, 0xc3, 0xff, 0x2f, 0x00, 0xc0, 0xff, 0x1b, 0x00, 0xb9, 0xff, 0xfe, 0xff, 0xaa, 0xff, 0xda, 0xff, 0x96, 0xff, 0xb4, 0xff, 0x7e, 0xff, 0x94, 0xff, 0x69, 0xff, 0x7f, 0xff, 0x5e, 0xff, 0x72, 0xff, 0x5b, 0xff, 0x69, 0xff, 0x5f, 0xff, 0x5e, 0xff, 0x65, 0xff, 0x4e, 0xff, 0x6a, 0xff, 0x37, 0xff, 0x66, 0xff, 0x1b, 0xff, 0x5a, 0xff, 0x01, 0xff, 0x4c, 0xff, 0xea, 0xfe, 0x3d, 0xff, 0xd7, 0xfe, 0x30, 0xff, 0xc7, 0xfe, 0x26, 0xff, 0xba, 0xfe, 0x1f, 0xff, 0xad, 0xfe, 0x17, 0xff, 0xa0, 0xfe, 0x0f, 0xff, 0x96, 0xfe, 0x08, 0xff, 0x92, 0xfe, 0x04, 0xff, 0x95, 0xfe, 0x06, 0xff, 0x9c, 0xfe, 0x0a, 0xff, 0xa5, 0xfe, 0x10, 0xff, 0xac, 0xfe, 0x14, 0xff, 0xb4, 0xfe, 0x19, 0xff, 0xc2, 0xfe, 0x20, 0xff, 0xd5, 0xfe, 0x2a, 0xff, 0xf1, 0xfe, 0x37, 0xff, 0x13, 0xff, 0x4a, 0xff, 0x3a, 0xff, 0x61, 0xff, 0x5d, 0xff, 0x79, 0xff, 0x7a, 0xff, 0x8e, 0xff, 0x92, 0xff, 0xa0, 0xff, 0xa8, 0xff, 0xae, 0xff, 0xc1, 0xff, 0xbc, 0xff, 0xe1, 0xff, 0xcc, 0xff, 0x05, 0x00, 0xe0, 0xff, 0x2d, 0x00, 0xf7, 0xff, 0x57, 0x00, 0x11, 0x00, 0x7f, 0x00, 0x2b, 0x00, 0xa2, 0x00, 0x44, 0x00, 0xbb, 0x00, 0x55, 0x00, 0xcc, 0x00, 0x5f, 0x00, 0xde, 0x00, 0x69, 0x00, 0xf1, 0x00, 0x74, 0x00, 0x04, 0x01, 0x7f, 0x00, 0x17, 0x01, 0x89, 0x00, 0x2c, 0x01, 0x94, 0x00, 0x40, 0x01, 0x9d, 0x00, 0x52, 0x01, 0xa4, 0x00, 0x60, 0x01, 0xa6, 0x00, 0x68, 0x01, 0xa6, 0x00, 0x67, 0x01, 0xa1, 0x00, 0x5e, 0x01, 0x97, 0x00, 0x4e, 0x01, 0x8a, 0x00, 0x3c, 0x01, 0x79, 0x00, 0x2a, 0x01, 0x66, 0x00, 0x1a, 0x01, 0x4f, 0x00, 0x09, 0x01, 0x37, 0x00, 0xf9, 0x00, 0x23, 0x00, 0xeb, 0x00, 0x15, 0x00, 0xdd, 0x00, 0x0e, 0x00, 0xce, 0x00, 0x09, 0x00, 0xbc, 0x00, 0x02, 0x00, 0xaa, 0x00, 0xf8, 0xff, 0x98, 0x00, 0xeb, 0xff, 0x89, 0x00, 0xdd, 0xff, 0x7f, 0x00, 0xd2, 0xff, 0x77, 0x00, 0xca, 0xff, 0x6e, 0x00, 0xc6, 0xff, 0x62, 0x00, 0xc4, 0xff, 0x55, 0x00, 0xc5, 0xff, 0x48, 0x00, 0xc7, 0xff, 0x38, 0x00, 0xc5, 0xff, 0x24, 0x00, 0xbd, 0xff, 0x0d, 0x00, 0xb2, 0xff, 0xf4, 0xff, 0xa7, 0xff, 0xdc, 0xff, 0x9e, 0xff, 0xc9, 0xff, 0x9d, 0xff, 0xb6, 0xff, 0x9f, 0xff, 0xa3, 0xff, 0xa1, 0xff, 0x91, 0xff, 0xa4, 0xff, 0x81, 0xff, 0xaa, 0xff, 0x73, 0xff, 0xb1, 0xff, 0x63, 0xff, 0xb6, 0xff, 0x4f, 0xff, 0xb7, 0xff, 0x38, 0xff, 0xb2, 0xff, 0x21, 0xff, 0xab, 0xff, 0x10, 0xff, 0xa6, 0xff, 0x06, 0xff, 0xa6, 0xff, 0xff, 0xfe, 0xa8, 0xff, 0xf9, 0xfe, 0xaa, 0xff, 0xf2, 0xfe, 0xac, 0xff, 0xee, 0xfe, 0xaf, 0xff, 0xef, 0xfe, 0xb6, 0xff, 0xef, 0xfe, 0xb9, 0xff, 0xf0, 0xfe, 0xba, 0xff, 0xf0, 0xfe, 0xb9, 0xff, 0xf6, 0xfe, 0xb9, 0xff, 0x00, 0xff, 0xbe, 0xff, 0x0f, 0xff, 0xca, 0xff, 0x24, 0xff, 0xde, 0xff, 0x3d, 0xff, 0xf7, 0xff, 0x57, 0xff, 0x0f, 0x00, 0x6e, 0xff, 0x21, 0x00, 0x82, 0xff, 0x2d, 0x00, 0x93, 0xff, 0x35, 0x00, 0xa3, 0xff, 0x3f, 0x00, 0xb7, 0xff, 0x4f, 0x00, 0xd1, 0xff, 0x65, 0x00, 0xed, 0xff, 0x7c, 0x00, 0x0b, 0x00, 0x93, 0x00, 0x28, 0x00, 0xa6, 0x00, 0x41, 0x00, 0xb7, 0x00, 0x54, 0x00, 0xc5, 0x00, 0x64, 0x00, 0xd2, 0x00, 0x74, 0x00, 0xe0, 0x00, 0x85, 0x00, 0xed, 0x00, 0x95, 0x00, 0xf8, 0x00, 0xa3, 0x00, 0xfd, 0x00, 0xab, 0x00, 0xfd, 0x00, 0xac, 0x00, 0xf6, 0x00, 0xab, 0x00, 0xee, 0x00, 0xa9, 0x00, 0xe7, 0x00, 0xa5, 0x00, 0xde, 0x00, 0x9f, 0x00, 0xd3, 0x00, 0x98, 0x00, 0xc4, 0x00, 0x95, 0x00, 0xb7, 0x00, 0x96, 0x00, 0xa8, 0x00, 0x96, 0x00, 0x95, 0x00, 0x93, 0x00, 0x7f, 0x00, 0x91, 0x00, 0x6a, 0x00, 0x90, 0x00, 0x5a, 0x00, 0x93, 0x00, 0x50, 0x00, 0x99, 0x00, 0x48, 0x00, 0x9c, 0x00, 0x3e, 0x00, 0x99, 0x00, 0x2b, 0x00, 0x8e, 0x00, 0x10, 0x00, 0x7e, 0x00, 0xf4, 0xff, 0x72, 0x00, 0xe0, 0xff, 0x69, 0x00, 0xd3, 0xff, 0x63, 0x00, 0xcb, 0xff, 0x63, 0x00, 0xc8, 0xff, 0x64, 0x00, 0xc4, 0xff, 0x63, 0x00, 0xbf, 0xff, 0x60, 0x00, 0xba, 0xff, 0x5b, 0x00, 0xb9, 0xff, 0x54, 0x00, 0xba, 0xff, 0x4a, 0x00, 0xbb, 0xff, 0x3f, 0x00, 0xba, 0xff, 0x34, 0x00, 0xb9, 0xff, 0x2a, 0x00, 0xb5, 0xff, 0x1e, 0x00, 0xae, 0xff, 0x12, 0x00, 0xa9, 0xff, 0x06, 0x00, 0xa5, 0xff, 0xf7, 0xff, 0xa3, 0xff, 0xe9, 0xff, 0xa4, 0xff, 0xdd, 0xff, 0xa4, 0xff, 0xcf, 0xff, 0xa1, 0xff, 0xc0, 0xff, 0x96, 0xff, 0xb0, 0xff, 0x87, 0xff, 0xa0, 0xff, 0x77, 0xff, 0x8d, 0xff, 0x65, 0xff, 0x7b, 0xff, 0x58, 0xff, 0x71, 0xff, 0x54, 0xff, 0x6c, 0xff, 0x55, 0xff, 0x68, 0xff, 0x54, 0xff, 0x66, 0xff, 0x51, 0xff, 0x62, 0xff, 0x4b, 0xff, 0x5f, 0xff, 0x43, 0xff, 0x60, 0xff, 0x40, 0xff, 0x66, 0xff, 0x43, 0xff, 0x6d, 0xff, 0x4a, 0xff, 0x78, 0xff, 0x55, 0xff, 0x87, 0xff, 0x64, 0xff, 0x99, 0xff, 0x75, 0xff, 0xa9, 0xff, 0x83, 0xff, 0xb7, 0xff, 0x91, 0xff, 0xc6, 0xff, 0xa3, 0xff, 0xd6, 0xff, 0xb7, 0xff, 0xe6, 0xff, 0xcb, 0xff, 0xf6, 0xff, 0xdf, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x15, 0x00, 0x04, 0x00, 0x22, 0x00, 0x17, 0x00, 0x2c, 0x00, 0x28, 0x00, 0x32, 0x00, 0x34, 0x00, 0x39, 0x00, 0x3f, 0x00, 0x43, 0x00, 0x4b, 0x00, 0x4d, 0x00, 0x55, 0x00, 0x53, 0x00, 0x5b, 0x00, 0x54, 0x00, 0x5e, 0x00, 0x52, 0x00, 0x5f, 0x00, 0x53, 0x00, 0x62, 0x00, 0x5a, 0x00, 0x6a, 0x00, 0x69, 0x00, 0x78, 0x00, 0x7a, 0x00, 0x85, 0x00, 0x88, 0x00, 0x8f, 0x00, 0x93, 0x00, 0x94, 0x00, 0x9a, 0x00, 0x94, 0x00, 0x9d, 0x00, 0x92, 0x00, 0x9d, 0x00, 0x90, 0x00, 0x9a, 0x00, 0x8e, 0x00, 0x98, 0x00, 0x8e, 0x00, 0x9e, 0x00, 0x93, 0x00, 0xaa, 0x00, 0x9b, 0x00, 0xb6, 0x00, 0xa0, 0x00, 0xbf, 0x00, 0xa3, 0x00, 0xc4, 0x00, 0xa5, 0x00, 0xc6, 0x00, 0xa6, 0x00, 0xc1, 0x00, 0xa3, 0x00, 0xbb, 0x00, 0x9d, 0x00, 0xb9, 0x00, 0x98, 0x00, 0xba, 0x00, 0x94, 0x00, 0xbb, 0x00, 0x8e, 0x00, 0xb5, 0x00, 0x85, 0x00, 0xa8, 0x00, 0x76, 0x00, 0x98, 0x00, 0x69, 0x00, 0x8c, 0x00, 0x62, 0x00, 0x85, 0x00, 0x61, 0x00, 0x7e, 0x00, 0x60, 0x00, 0x74, 0x00, 0x5c, 0x00, 0x63, 0x00, 0x51, 0x00, 0x4b, 0x00, 0x3e, 0x00, 0x2d, 0x00, 0x26, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xd8, 0xff, 0xf5, 0xff, 0xbf, 0xff, 0xef, 0xff, 0xa9, 0xff, 0xea, 0xff, 0x92, 0xff, 0xe1, 0xff, 0x79, 0xff, 0xd2, 0xff, 0x5f, 0xff, 0xc3, 0xff, 0x49, 0xff, 0xbc, 0xff, 0x35, 0xff, 0xba, 0xff, 0x24, 0xff, 0xbc, 0xff, 0x18, 0xff, 0xbd, 0xff, 0x11, 0xff, 0xbb, 0xff, 0x0d, 0xff, 0xb8, 0xff, 0x10, 0xff, 0xb9, 0xff, 0x15, 0xff, 0xbd, 0xff, 0x1b, 0xff, 0xc2, 0xff, 0x23, 0xff, 0xc9, 0xff, 0x2d, 0xff, 0xd4, 0xff, 0x3a, 0xff, 0xdf, 0xff, 0x47, 0xff, 0xe5, 0xff, 0x4f, 0xff, 0xe5, 0xff, 0x59, 0xff, 0xe2, 0xff, 0x63, 0xff, 0xe0, 0xff, 0x6c, 0xff, 0xe2, 0xff, 0x77, 0xff, 0xe8, 0xff, 0x80, 0xff, 0xef, 0xff, 0x89, 0xff, 0xf5, 0xff, 0x94, 0xff, 0xfa, 0xff, 0xa0, 0xff, 0xfb, 0xff, 0xaa, 0xff, 0xfa, 0xff, 0xb5, 0xff, 0xfa, 0xff, 0xc1, 0xff, 0xfc, 0xff, 0xcf, 0xff, 0x05, 0x00, 0xe1, 0xff, 0x11, 0x00, 0xf1, 0xff, 0x1b, 0x00, 0xfc, 0xff, 0x1e, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x09, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x21, 0x00, 0x16, 0x00, 0x2f, 0x00, 0x19, 0x00, 0x3e, 0x00, 0x1e, 0x00, 0x4e, 0x00, 0x23, 0x00, 0x5b, 0x00, 0x23, 0x00, 0x65, 0x00, 0x1f, 0x00, 0x70, 0x00, 0x1c, 0x00, 0x7f, 0x00, 0x20, 0x00, 0x91, 0x00, 0x29, 0x00, 0xa3, 0x00, 0x34, 0x00, 0xaf, 0x00, 0x3a, 0x00, 0xb8, 0x00, 0x3c, 0x00, 0xbc, 0x00, 0x38, 0x00, 0xbc, 0x00, 0x2f, 0x00, 0xbc, 0x00, 0x25, 0x00, 0xbe, 0x00, 0x20, 0x00, 0xc2, 0x00, 0x21, 0x00, 0xc2, 0x00, 0x22, 0x00, 0xbf, 0x00, 0x23, 0x00, 0xba, 0x00, 0x22, 0x00, 0xb1, 0x00, 0x1c, 0x00, 0xa2, 0x00, 0x0f, 0x00, 0x92, 0x00, 0x00, 0x00, 0x84, 0x00, 0xf6, 0xff, 0x78, 0x00, 0xf1, 0xff, 0x6b, 0x00, 0xf1, 0xff, 0x5f, 0x00, 0xf6, 0xff, 0x51, 0x00, 0xf9, 0xff, 0x3c, 0x00, 0xf4, 0xff, 0x21, 0x00, 0xe5, 0xff, 0x00, 0x00, 0xd1, 0xff, 0xe0, 0xff, 0xbe, 0xff, 0xc4, 0xff, 0xb3, 0xff, 0xae, 0xff, 0xad, 0xff, 0x9c, 0xff, 0xaa, 0xff, 0x89, 0xff, 0xa5, 0xff, 0x70, 0xff, 0x99, 0xff, 0x4f, 0xff, 0x84, 0xff, 0x2d, 0xff, 0x6d, 0xff, 0x14, 0xff, 0x5f, 0xff, 0x0c, 0xff, 0x64, 0xff, 0x07, 0xff, 0x6a, 0xff, 0xf5, 0xfe, 0x63, 0xff, 0xda, 0xfe, 0x50, 0xff, 0xc8, 0xfe, 0x44, 0xff, 0xc5, 0xfe, 0x46, 0xff, 0xc6, 0xfe, 0x4c, 0xff, 0xc0, 0xfe, 0x4f, 0xff, 0xb2, 0xfe, 0x4b, 0xff, 0xa8, 0xfe, 0x4b, 0xff, 0xae, 0xfe, 0x59, 0xff, 0xc1, 0xfe, 0x71, 0xff, 0xd1, 0xfe, 0x81, 0xff, 0xd5, 0xfe, 0x82, 0xff, 0xd7, 0xfe, 0x81, 0xff, 0xe0, 0xfe, 0x89, 0xff, 0xf3, 0xfe, 0x9c, 0xff, 0x0e, 0xff, 0xb7, 0xff, 0x29, 0xff, 0xce, 0xff, 0x38, 0xff, 0xd4, 0xff, 0x40, 0xff, 0xce, 0xff, 0x4f, 0xff, 0xcd, 0xff, 0x67, 0xff, 0xd8, 0xff, 0x81, 0xff, 0xe6, 0xff, 0x96, 0xff, 0xf1, 0xff, 0xa8, 0xff, 0xf8, 0xff, 0xba, 0xff, 0xf9, 0xff, 0xce, 0xff, 0xf5, 0xff, 0xe4, 0xff, 0xef, 0xff, 0xfa, 0xff, 0xec, 0xff, 0x10, 0x00, 0xec, 0xff, 0x25, 0x00, 0xf0, 0xff, 0x38, 0x00, 0xf4, 0xff, 0x45, 0x00, 0xf0, 0xff, 0x50, 0x00, 0xeb, 0xff, 0x60, 0x00, 0xeb, 0xff, 0x76, 0x00, 0xf5, 0xff, 0x8e, 0x00, 0x02, 0x00, 0xa2, 0x00, 0x10, 0x00, 0xb0, 0x00, 0x1d, 0x00, 0xb8, 0x00, 0x27, 0x00, 0xbd, 0x00, 0x30, 0x00, 0xc4, 0x00, 0x3b, 0x00, 0xd0, 0x00, 0x48, 0x00, 0xdd, 0x00, 0x54, 0x00, 0xe0, 0x00, 0x59, 0x00, 0xdd, 0x00, 0x5a, 0x00, 0xd8, 0x00, 0x5d, 0x00, 0xd7, 0x00, 0x65, 0x00, 0xd6, 0x00, 0x6f, 0x00, 0xd2, 0x00, 0x74, 0x00, 0xce, 0x00, 0x77, 0x00, 0xcd, 0x00, 0x7d, 0x00, 0xce, 0x00, 0x85, 0x00, 0xcd, 0x00, 0x8e, 0x00, 0xcc, 0x00, 0x96, 0x00, 0xcb, 0x00, 0x9e, 0x00, 0xcc, 0x00, 0xa6, 0x00, 0xcc, 0x00, 0xab, 0x00, 0xcc, 0x00, 0xaf, 0x00, 0xc9, 0x00, 0xb0, 0x00, 0xc2, 0x00, 0xaf, 0x00, 0xb8, 0x00, 0xaf, 0x00, 0xab, 0x00, 0xad, 0x00, 0x9c, 0x00, 0xab, 0x00, 0x8e, 0x00, 0xa6, 0x00, 0x7e, 0x00, 0x9c, 0x00, 0x6a, 0x00, 0x8d, 0x00, 0x56, 0x00, 0x81, 0x00, 0x44, 0x00, 0x7b, 0x00, 0x31, 0x00, 0x75, 0x00, 0x1c, 0x00, 0x6a, 0x00, 0x05, 0x00, 0x59, 0x00, 0xf1, 0xff, 0x48, 0x00, 0xdc, 0xff, 0x36, 0x00, 0xc4, 0xff, 0x22, 0x00, 0xa8, 0xff, 0x0a, 0x00, 0x89, 0xff, 0xef, 0xff, 0x6c, 0xff, 0xd5, 0xff, 0x52, 0xff, 0xbf, 0xff, 0x3c, 0xff, 0xae, 0xff, 0x27, 0xff, 0x9e, 0xff, 0x16, 0xff, 0x91, 0xff, 0x0b, 0xff, 0x85, 0xff, 0x03, 0xff, 0x7b, 0xff, 0xfd, 0xfe, 0x73, 0xff, 0xf8, 0xfe, 0x6f, 0xff, 0xf8, 0xfe, 0x6f, 0xff, 0xfb, 0xfe, 0x70, 0xff, 0x03, 0xff, 0x70, 0xff, 0x0c, 0xff, 0x6d, 0xff, 0x16, 0xff, 0x6a, 0xff, 0x26, 0xff, 0x6d, 0xff, 0x38, 0xff, 0x74, 0xff, 0x49, 0xff, 0x7a, 0xff, 0x57, 0xff, 0x7a, 0xff, 0x67, 0xff, 0x77, 0xff, 0x7a, 0xff, 0x75, 0xff, 0x91, 0xff, 0x77, 0xff, 0xac, 0xff, 0x7f, 0xff, 0xc4, 0xff, 0x89, 0xff, 0xd9, 0xff, 0x93, 0xff, 0xed, 0xff, 0x9f, 0xff, 0x07, 0x00, 0xb0, 0xff, 0x22, 0x00, 0xc1, 0xff, 0x3a, 0x00, 0xce, 0xff, 0x4f, 0x00, 0xd9, 0xff, 0x5c, 0x00, 0xe1, 0xff, 0x66, 0x00, 0xea, 0xff, 0x70, 0x00, 0xf7, 0xff, 0x7d, 0x00, 0x06, 0x00, 0x89, 0x00, 0x15, 0x00, 0x92, 0x00, 0x1e, 0x00, 0x99, 0x00, 0x24, 0x00, 0xa3, 0x00, 0x2c, 0x00, 0xad, 0x00, 0x33, 0x00, 0xb4, 0x00, 0x38, 0x00, 0xb7, 0x00, 0x3b, 0x00, 0xb8, 0x00, 0x3e, 0x00, 0xbc, 0x00, 0x41, 0x00, 0xbf, 0x00, 0x42, 0x00, 0xc5, 0x00, 0x42, 0x00, 0xca, 0x00, 0x40, 0x00, 0xd1, 0x00, 0x41, 0x00, 0xd9, 0x00, 0x46, 0x00, 0xe0, 0x00, 0x4a, 0x00, 0xe5, 0x00, 0x4d, 0x00, 0xec, 0x00, 0x52, 0x00, 0xf4, 0x00, 0x57, 0x00, 0xfa, 0x00, 0x59, 0x00, 0xff, 0x00, 0x5b, 0x00, 0x02, 0x01, 0x5e, 0x00, 0x02, 0x01, 0x61, 0x00, 0xfe, 0x00, 0x63, 0x00, 0xf4, 0x00, 0x63, 0x00, 0xe7, 0x00, 0x62, 0x00, 0xd5, 0x00, 0x5b, 0x00, 0xc5, 0x00, 0x54, 0x00, 0xc0, 0x00, 0x56, 0x00, 0xbc, 0x00, 0x5a, 0x00, 0xae, 0x00, 0x56, 0x00, 0x98, 0x00, 0x4e, 0x00, 0x83, 0x00, 0x4a, 0x00, 0x74, 0x00, 0x4e, 0x00, 0x66, 0x00, 0x57, 0x00, 0x4f, 0x00, 0x57, 0x00, 0x25, 0x00, 0x44, 0x00, 0xf7, 0xff, 0x29, 0x00, 0xdd, 0xff, 0x1e, 0x00, 0xd9, 0xff, 0x28, 0x00, 0xd2, 0xff, 0x2d, 0x00, 0xb2, 0xff, 0x19, 0x00, 0x80, 0xff, 0xf3, 0xff, 0x51, 0xff, 0xd1, 0xff, 0x32, 0xff, 0xbf, 0xff, 0x1e, 0xff, 0xb6, 0xff, 0x07, 0xff, 0xa7, 0xff, 0xe8, 0xfe, 0x8a, 0xff, 0xca, 0xfe, 0x68, 0xff, 0xbd, 0xfe, 0x53, 0xff, 0xbb, 0xfe, 0x48, 0xff, 0xb8, 0xfe, 0x41, 0xff, 0xb2, 0xfe, 0x39, 0xff, 0xaf, 0xfe, 0x36, 0xff, 0xb2, 0xfe, 0x38, 0xff, 0xbb, 0xfe, 0x3d, 0xff, 0xc8, 0xfe, 0x41, 0xff, 0xd9, 0xfe, 0x46, 0xff, 0xed, 0xfe, 0x4e, 0xff, 0xfc, 0xfe, 0x55, 0xff, 0x05, 0xff, 0x59, 0xff, 0x09, 0xff, 0x5f, 0xff, 0x11, 0xff, 0x68, 0xff, 0x1f, 0xff, 0x76, 0xff, 0x32, 0xff, 0x84, 0xff, 0x43, 0xff, 0x90, 0xff, 0x4f, 0xff, 0x97, 0xff, 0x56, 0xff, 0x9a, 0xff, 0x58, 0xff, 0x9d, 0xff, 0x5b, 0xff, 0xa2, 0xff, 0x62, 0xff, 0xab, 0xff, 0x6e, 0xff, 0xb9, 0xff, 0x7e, 0xff, 0xc9, 0xff, 0x8f, 0xff, 0xd9, 0xff, 0xa2, 0xff, 0xea, 0xff, 0xb4, 0xff, 0xfa, 0xff, 0xc6, 0xff, 0x0c, 0x00, 0xd9, 0xff, 0x22, 0x00, 0xee, 0xff, 0x39, 0x00, 0x03, 0x00, 0x4f, 0x00, 0x18, 0x00, 0x62, 0x00, 0x2c, 0x00, 0x74, 0x00, 0x42, 0x00, 0x87, 0x00, 0x54, 0x00, 0x9b, 0x00, 0x64, 0x00, 0xaf, 0x00, 0x72, 0x00, 0xc0, 0x00, 0x7e, 0x00, 0xcf, 0x00, 0x8b, 0x00, 0xdc, 0x00, 0x96, 0x00, 0xe6, 0x00, 0x9e, 0x00, 0xef, 0x00, 0xa5, 0x00, 0xf8, 0x00, 0xb1, 0x00, 0x07, 0x01, 0xbc, 0x00, 0x16, 0x01, 0xc0, 0x00, 0x1f, 0x01, 0xbe, 0x00, 0x23, 0x01, 0xb7, 0x00, 0x20, 0x01, 0xb1, 0x00, 0x1c, 0x01, 0xae, 0x00, 0x17, 0x01, 0xaf, 0x00, 0x10, 0x01, 0xae, 0x00, 0x06, 0x01, 0xa4, 0x00, 0xf4, 0x00, 0x95, 0x00, 0xde, 0x00, 0x88, 0x00, 0xc9, 0x00, 0x80, 0x00, 0xb9, 0x00, 0x7e, 0x00, 0xac, 0x00, 0x7b, 0x00, 0x9d, 0x00, 0x73, 0x00, 0x8a, 0x00, 0x69, 0x00, 0x78, 0x00, 0x62, 0x00, 0x69, 0x00, 0x5d, 0x00, 0x5a, 0x00, 0x54, 0x00, 0x45, 0x00, 0x49, 0x00, 0x2b, 0x00, 0x3d, 0x00, 0x11, 0x00, 0x33, 0x00, 0xfd, 0xff, 0x2b, 0x00, 0xf2, 0xff, 0x21, 0x00, 0xe9, 0xff, 0x13, 0x00, 0xdd, 0xff, 0x01, 0x00, 0xcb, 0xff, 0xf0, 0xff, 0xb4, 0xff, 0xde, 0xff, 0x9b, 0xff, 0xcb, 0xff, 0x81, 0xff, 0xb5, 0xff, 0x66, 0xff, 0x9b, 0xff, 0x4a, 0xff, 0x7e, 0xff, 0x2d, 0xff, 0x63, 0xff, 0x14, 0xff, 0x51, 0xff, 0x04, 0xff, 0x47, 0xff, 0xfa, 0xfe, 0x3e, 0xff, 0xef, 0xfe, 0x31, 0xff, 0xdf, 0xfe, 0x25, 0xff, 0xcd, 0xfe, 0x1f, 0xff, 0xc1, 0xfe, 0x25, 0xff, 0xc3, 0xfe, 0x34, 0xff, 0xd2, 0xfe, 0x43, 0xff, 0xe6, 0xfe, 0x4e, 0xff, 0xf6, 0xfe, 0x54, 0xff, 0x01, 0xff, 0x5f, 0xff, 0x0f, 0xff, 0x6f, 0xff, 0x20, 0xff, 0x82, 0xff, 0x37, 0xff, 0x97, 0xff, 0x50, 0xff, 0xae, 0xff, 0x69, 0xff, 0xc6, 0xff, 0x81, 0xff, 0xe2, 0xff, 0x99, 0xff, 0x01, 0x00, 0xb0, 0xff, 0x1d, 0x00, 0xc5, 0xff, 0x32, 0x00, 0xd7, 0xff, 0x43, 0x00, 0xe7, 0xff, 0x53, 0x00, 0xf8, 0xff, 0x69, 0x00, 0x0f, 0x00, 0x84, 0x00, 0x2b, 0x00, 0x9e, 0x00, 0x45, 0x00, 0xb2, 0x00, 0x57, 0x00, 0xba, 0x00, 0x5d, 0x00, 0xbd, 0x00, 0x5d, 0x00, 0xc1, 0x00, 0x60, 0x00, 0xc6, 0x00, 0x6a, 0x00, 0xcd, 0x00, 0x7b, 0x00, 0xd1, 0x00, 0x8a, 0x00, 0xcf, 0x00, 0x90, 0x00, 0xca, 0x00, 0x90, 0x00, 0xc8, 0x00, 0x8e, 0x00, 0xc9, 0x00, 0x8f, 0x00, 0xc7, 0x00, 0x91, 0x00, 0xc0, 0x00, 0x92, 0x00, 0xb7, 0x00, 0x94, 0x00, 0xb0, 0x00, 0x97, 0x00, 0xa8, 0x00, 0x99, 0x00, 0xa3, 0x00, 0x99, 0x00, 0xa2, 0x00, 0x9b, 0x00, 0xa5, 0x00, 0xa0, 0x00, 0xa5, 0x00, 0xa5, 0x00, 0xa2, 0x00, 0xa9, 0x00, 0x9e, 0x00, 0xac, 0x00, 0x97, 0x00, 0xac, 0x00, 0x90, 0x00, 0xab, 0x00, 0x8c, 0x00, 0xaa, 0x00, 0x89, 0x00, 0xaa, 0x00, 0x83, 0x00, 0xaa, 0x00, 0x78, 0x00, 0xa6, 0x00, 0x68, 0x00, 0xa0, 0x00, 0x57, 0x00, 0x97, 0x00, 0x42, 0x00, 0x8a, 0x00, 0x28, 0x00, 0x75, 0x00, 0x0b, 0x00, 0x5b, 0x00, 0xee, 0xff, 0x41, 0x00, 0xd3, 0xff, 0x27, 0x00, 0xbb, 0xff, 0x0d, 0x00, 0xa2, 0xff, 0xf3, 0xff, 0x83, 0xff, 0xd5, 0xff, 0x60, 0xff, 0xb6, 0xff, 0x40, 0xff, 0x9a, 0xff, 0x24, 0xff, 0x82, 0xff, 0x0e, 0xff, 0x6e, 0xff, 0xfd, 0xfe, 0x5b, 0xff, 0xf3, 0xfe, 0x4f, 0xff, 0xec, 0xfe, 0x45, 0xff, 0xe5, 0xfe, 0x39, 0xff, 0xdc, 0xfe, 0x2a, 0xff, 0xd6, 0xfe, 0x1a, 0xff, 0xd7, 0xfe, 0x12, 0xff, 0xde, 0xfe, 0x10, 0xff, 0xec, 0xfe, 0x17, 0xff, 0xfe, 0xfe, 0x24, 0xff, 0x10, 0xff, 0x33, 0xff, 0x20, 0xff, 0x3d, 0xff, 0x2c, 0xff, 0x41, 0xff, 0x39, 0xff, 0x44, 0xff, 0x49, 0xff, 0x49, 0xff, 0x61, 0xff, 0x56, 0xff, 0x7e, 0xff, 0x6c, 0xff, 0x9e, 0xff, 0x86, 0xff, 0xbc, 0xff, 0xa0, 0xff, 0xd2, 0xff, 0xb3, 0xff, 0xe0, 0xff, 0xbb, 0xff, 0xe8, 0xff, 0xbc, 0xff, 0xf1, 0xff, 0xbe, 0xff, 0xfa, 0xff, 0xc3, 0xff, 0x03, 0x00, 0xcc, 0xff, 0x0c, 0x00, 0xd7, 0xff, 0x11, 0x00, 0xdf, 0xff, 0x16, 0x00, 0xe3, 0xff, 0x19, 0x00, 0xe5, 0xff, 0x1d, 0x00, 0xe5, 0xff, 0x20, 0x00, 0xe6, 0xff, 0x25, 0x00, 0xe9, 0xff, 0x2b, 0x00, 0xed, 0xff, 0x33, 0x00, 0xf4, 0xff, 0x40, 0x00, 0x02, 0x00, 0x51, 0x00, 0x14, 0x00, 0x65, 0x00, 0x26, 0x00, 0x78, 0x00, 0x33, 0x00, 0x8a, 0x00, 0x3f, 0x00, 0x9e, 0x00, 0x4f, 0x00, 0xad, 0x00, 0x5f, 0x00, 0xb9, 0x00, 0x6f, 0x00, 0xc5, 0x00, 0x7f, 0x00, 0xd5, 0x00, 0x8f, 0x00, 0xe5, 0x00, 0x9c, 0x00, 0xf2, 0x00, 0xa7, 0x00, 0xfc, 0x00, 0xb1, 0x00, 0xff, 0x00, 0xb8, 0x00, 0xfd, 0x00, 0xbf, 0x00, 0xf7, 0x00, 0xc4, 0x00, 0xec, 0x00, 0xc5, 0x00, 0xdd, 0x00, 0xc0, 0x00, 0xca, 0x00, 0xb6, 0x00, 0xb5, 0x00, 0xa9, 0x00, 0xa0, 0x00, 0x9c, 0x00, 0x8e, 0x00, 0x92, 0x00, 0x7c, 0x00, 0x8d, 0x00, 0x67, 0x00, 0x85, 0x00, 0x4e, 0x00, 0x79, 0x00, 0x32, 0x00, 0x67, 0x00, 0x18, 0x00, 0x53, 0x00, 0x02, 0x00, 0x40, 0x00, 0xf1, 0xff, 0x33, 0x00, 0xe3, 0xff, 0x2c, 0x00, 0xd5, 0xff, 0x28, 0x00, 0xc3, 0xff, 0x20, 0x00, 0xae, 0xff, 0x10, 0x00, 0x99, 0xff, 0xfa, 0xff, 0x84, 0xff, 0xe0, 0xff, 0x78, 0xff, 0xcc, 0xff, 0x76, 0xff, 0xc2, 0xff, 0x7a, 0xff, 0xc1, 0xff, 0x7d, 0xff, 0xc0, 0xff, 0x7b, 0xff, 0xbd, 0xff, 0x77, 0xff, 0xb7, 0xff, 0x70, 0xff, 0xaf, 0xff, 0x69, 0xff, 0xa4, 0xff, 0x63, 0xff, 0x9c, 0xff, 0x5d, 0xff, 0x96, 0xff, 0x59, 0xff, 0x94, 0xff, 0x59, 0xff, 0x93, 0xff, 0x5d, 0xff, 0x96, 0xff, 0x5e, 0xff, 0x95, 0xff, 0x58, 0xff, 0x8d, 0xff, 0x4d, 0xff, 0x81, 0xff, 0x3f, 0xff, 0x75, 0xff, 0x33, 0xff, 0x6d, 0xff, 0x2e, 0xff, 0x6d, 0xff, 0x30, 0xff, 0x75, 0xff, 0x34, 0xff, 0x7c, 0xff, 0x37, 0xff, 0x7e, 0xff, 0x3d, 0xff, 0x7f, 0xff, 0x45, 0xff, 0x7d, 0xff, 0x4d, 0xff, 0x7c, 0xff, 0x59, 0xff, 0x80, 0xff, 0x6b, 0xff, 0x8c, 0xff, 0x80, 0xff, 0x9e, 0xff, 0x9a, 0xff, 0xb2, 0xff, 0xb7, 0xff, 0xc5, 0xff, 0xd6, 0xff, 0xd3, 0xff, 0xf2, 0xff, 0xda, 0xff, 0x0b, 0x00, 0xde, 0xff, 0x21, 0x00, 0xe5, 0xff, 0x34, 0x00, 0xee, 0xff, 0x44, 0x00, 0xfa, 0xff, 0x54, 0x00, 0x09, 0x00, 0x66, 0x00, 0x19, 0x00, 0x79, 0x00, 0x28, 0x00, 0x8e, 0x00, 0x37, 0x00, 0xa0, 0x00, 0x43, 0x00, 0xab, 0x00, 0x4c, 0x00, 0xb3, 0x00, 0x57, 0x00, 0xbb, 0x00, 0x64, 0x00, 0xc0, 0x00, 0x70, 0x00, 0xc2, 0x00, 0x7a, 0x00, 0xc2, 0x00, 0x84, 0x00, 0xbd, 0x00, 0x8c, 0x00, 0xb8, 0x00, 0x94, 0x00, 0xb7, 0x00, 0xa1, 0x00, 0xbc, 0x00, 0xb2, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0xc8, 0x00, 0xd1, 0x00, 0xc7, 0x00, 0xd8, 0x00, 0xbf, 0x00, 0xd9, 0x00, 0xb5, 0x00, 0xd7, 0x00, 0xac, 0x00, 0xd4, 0x00, 0xa2, 0x00, 0xce, 0x00, 0x99, 0x00, 0xc5, 0x00, 0x8d, 0x00, 0xb7, 0x00, 0x7e, 0x00, 0xa1, 0x00, 0x6d, 0x00, 0x89, 0x00, 0x5c, 0x00, 0x71, 0x00, 0x4a, 0x00, 0x59, 0x00, 0x38, 0x00, 0x41, 0x00, 0x2a, 0x00, 0x2d, 0x00, 0x1f, 0x00, 0x1b, 0x00, 0x13, 0x00, 0x08, 0x00, 0x03, 0x00, 0xf3, 0xff, 0xf3, 0xff, 0xdf, 0xff, 0xe5, 0xff, 0xd0, 0xff, 0xda, 0xff, 0xc7, 0xff, 0xd2, 0xff, 0xc4, 0xff, 0xd1, 0xff, 0xc7, 0xff, 0xd2, 0xff, 0xc9, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xd7, 0xff, 0xd0, 0xff, 0xd9, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0xdd, 0xff, 0xd0, 0xff, 0xe2, 0xff, 0xc9, 0xff, 0xe8, 0xff, 0xc5, 0xff, 0xf1, 0xff, 0xc4, 0xff, 0xf9, 0xff, 0xc7, 0xff, 0x00, 0x00, 0xca, 0xff, 0x01, 0x00, 0xcb, 0xff, 0xfd, 0xff, 0xcb, 0xff, 0xf6, 0xff, 0xca, 0xff, 0xf0, 0xff, 0xcd, 0xff, 0xf0, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0xdc, 0xff, 0xfd, 0xff, 0xe3, 0xff, 0x00, 0x00, 0xe5, 0xff, 0xfd, 0xff, 0xe5, 0xff, 0xf2, 0xff, 0xe4, 0xff, 0xe1, 0xff, 0xe7, 0xff, 0xd2, 0xff, 0xf0, 0xff, 0xc9, 0xff, 0xf8, 0xff, 0xc1, 0xff, 0xfb, 0xff, 0xb7, 0xff, 0xfb, 0xff, 0xac, 0xff, 0xf8, 0xff, 0xa0, 0xff, 0xf8, 0xff, 0x97, 0xff, 0xfc, 0xff, 0x93, 0xff, 0x05, 0x00, 0x93, 0xff, 0x10, 0x00, 0x94, 0xff, 0x1d, 0x00, 0x93, 0xff, 0x2d, 0x00, 0x94, 0xff, 0x3b, 0x00, 0x94, 0xff, 0x44, 0x00, 0x95, 0xff, 0x42, 0x00, 0x8f, 0xff, 0x3c, 0x00, 0x8a, 0xff, 0x3e, 0x00, 0x90, 0xff, 0x4d, 0x00, 0xa3, 0xff, 0x64, 0x00, 0xbc, 0xff, 0x7b, 0x00, 0xd2, 0xff, 0x8d, 0x00, 0xe2, 0xff, 0x97, 0x00, 0xe9, 0xff, 0x9a, 0x00, 0xec, 0xff, 0x96, 0x00, 0xef, 0xff, 0x8b, 0x00, 0xf4, 0xff, 0x78, 0x00, 0xf8, 0xff, 0x63, 0x00, 0xfa, 0xff, 0x52, 0x00, 0xfc, 0xff, 0x46, 0x00, 0xfd, 0xff, 0x3e, 0x00, 0xfd, 0xff, 0x34, 0x00, 0xfa, 0xff, 0x26, 0x00, 0xf6, 0xff, 0x14, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf2, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf3, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xe8, 0xff, 0x0a, 0x00, 0xde, 0xff, 0x06, 0x00, 0xd8, 0xff, 0x05, 0x00, 0xd8, 0xff, 0x0a, 0x00, 0xe1, 0xff, 0x16, 0x00, 0xec, 0xff, 0x23, 0x00, 0xf7, 0xff, 0x2b, 0x00, 0xfa, 0xff, 0x28, 0x00, 0xf1, 0xff, 0x19, 0x00, 0xe4, 0xff, 0x08, 0x00, 0xdb, 0xff, 0xfd, 0xff, 0xd7, 0xff, 0xfa, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xcc, 0xff, 0xee, 0xff, 0xc0, 0xff, 0xe2, 0xff, 0xb0, 0xff, 0xd1, 0xff, 0xa2, 0xff, 0xc3, 0xff, 0x96, 0xff, 0xb9, 0xff, 0x8a, 0xff, 0xb1, 0xff, 0x7e, 0xff, 0xaa, 0xff, 0x71, 0xff, 0xa2, 0xff, 0x61, 0xff, 0x97, 0xff, 0x51, 0xff, 0x8a, 0xff, 0x47, 0xff, 0x84, 0xff, 0x41, 0xff, 0x85, 0xff, 0x3b, 0xff, 0x89, 0xff, 0x38, 0xff, 0x90, 0xff, 0x3b, 0xff, 0x9a, 0xff, 0x40, 0xff, 0xa4, 0xff, 0x42, 0xff, 0xaa, 0xff, 0x3f, 0xff, 0xa8, 0xff, 0x33, 0xff, 0x9f, 0xff, 0x25, 0xff, 0x96, 0xff, 0x1e, 0xff, 0x95, 0xff, 0x23, 0xff, 0x9e, 0xff, 0x30, 0xff, 0xaa, 0xff, 0x41, 0xff, 0xb4, 0xff, 0x5a, 0xff, 0xbf, 0xff, 0x75, 0xff, 0xc8, 0xff, 0x8c, 0xff, 0xcc, 0xff, 0x9a, 0xff, 0xc9, 0xff, 0xa2, 0xff, 0xc5, 0xff, 0xa9, 0xff, 0xc5, 0xff, 0xb7, 0xff, 0xce, 0xff, 0xcc, 0xff, 0xdc, 0xff, 0xe2, 0xff, 0xe7, 0xff, 0xf6, 0xff, 0xeb, 0xff, 0x06, 0x00, 0xea, 0xff, 0x13, 0x00, 0xea, 0xff, 0x1d, 0x00, 0xee, 0xff, 0x21, 0x00, 0xf0, 0xff, 0x22, 0x00, 0xf0, 0xff, 0x22, 0x00, 0xf1, 0xff, 0x1f, 0x00, 0xf1, 0xff, 0x16, 0x00, 0xee, 0xff, 0x05, 0x00, 0xe4, 0xff, 0xf4, 0xff, 0xdb, 0xff, 0xeb, 0xff, 0xd8, 0xff, 0xef, 0xff, 0xe0, 0xff, 0xf9, 0xff, 0xee, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0xdd, 0xff, 0xfa, 0xff, 0xd9, 0xff, 0xff, 0xff, 0xde, 0xff, 0x0b, 0x00, 0xeb, 0xff, 0x1f, 0x00, 0xfa, 0xff, 0x33, 0x00, 0x09, 0x00, 0x45, 0x00, 0x17, 0x00, 0x53, 0x00, 0x24, 0x00, 0x5f, 0x00, 0x34, 0x00, 0x70, 0x00, 0x48, 0x00, 0x86, 0x00, 0x5c, 0x00, 0x9f, 0x00, 0x6d, 0x00, 0xb2, 0x00, 0x79, 0x00, 0xbf, 0x00, 0x84, 0x00, 0xc8, 0x00, 0x8a, 0x00, 0xc9, 0x00, 0x8c, 0x00, 0xc5, 0x00, 0x8d, 0x00, 0xbf, 0x00, 0x8b, 0x00, 0xb9, 0x00, 0x84, 0x00, 0xad, 0x00, 0x74, 0x00, 0x98, 0x00, 0x64, 0x00, 0x82, 0x00, 0x52, 0x00, 0x6b, 0x00, 0x3c, 0x00, 0x52, 0x00, 0x25, 0x00, 0x3b, 0x00, 0x12, 0x00, 0x2a, 0x00, 0x04, 0x00, 0x1c, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xf2, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xd3, 0xff, 0xd8, 0xff, 0xb9, 0xff, 0xc0, 0xff, 0xa1, 0xff, 0xb0, 0xff, 0x90, 0xff, 0xaa, 0xff, 0x83, 0xff, 0xa9, 0xff, 0x79, 0xff, 0xa8, 0xff, 0x78, 0xff, 0xab, 0xff, 0x7f, 0xff, 0xb3, 0xff, 0x88, 0xff, 0xba, 0xff, 0x91, 0xff, 0xc0, 0xff, 0x9b, 0xff, 0xc8, 0xff, 0xa6, 0xff, 0xd3, 0xff, 0xb5, 0xff, 0xe3, 0xff, 0xc7, 0xff, 0xf7, 0xff, 0xd5, 0xff, 0x07, 0x00, 0xda, 0xff, 0x0d, 0x00, 0xdc, 0xff, 0x0d, 0x00, 0xe3, 0xff, 0x0d, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xef, 0xff, 0x09, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf6, 0xff, 0xff, 0xff, 0x02, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf6, 0xff, 0x14, 0x00, 0xff, 0xff, 0x1d, 0x00, 0x07, 0x00, 0x24, 0x00, 0x08, 0x00, 0x26, 0x00, 0x06, 0x00, 0x2b, 0x00, 0x02, 0x00, 0x36, 0x00, 0xfd, 0xff, 0x46, 0x00, 0xf7, 0xff, 0x56, 0x00, 0xf0, 0xff, 0x62, 0x00, 0xee, 0xff, 0x6c, 0x00, 0xf6, 0xff, 0x7b, 0x00, 0x08, 0x00, 0x8f, 0x00, 0x1b, 0x00, 0xa3, 0x00, 0x29, 0x00, 0xb1, 0x00, 0x33, 0x00, 0xbe, 0x00, 0x3b, 0x00, 0xca, 0x00, 0x3d, 0x00, 0xd1, 0x00, 0x3b, 0x00, 0xd0, 0x00, 0x3f, 0x00, 0xcc, 0x00, 0x4a, 0x00, 0xc9, 0x00, 0x56, 0x00, 0xc5, 0x00, 0x5f, 0x00, 0xbe, 0x00, 0x66, 0x00, 0xb6, 0x00, 0x6f, 0x00, 0xad, 0x00, 0x78, 0x00, 0xa0, 0x00, 0x7f, 0x00, 0x8e, 0x00, 0x87, 0x00, 0x7e, 0x00, 0x8b, 0x00, 0x6c, 0x00, 0x88, 0x00, 0x58, 0x00, 0x83, 0x00, 0x47, 0x00, 0x84, 0x00, 0x40, 0x00, 0x87, 0x00, 0x3d, 0x00, 0x89, 0x00, 0x36, 0x00, 0x8d, 0x00, 0x2e, 0x00, 0x92, 0x00, 0x26, 0x00, 0x95, 0x00, 0x1f, 0x00, 0x96, 0x00, 0x19, 0x00, 0x96, 0x00, 0x16, 0x00, 0x95, 0x00, 0x15, 0x00, 0x92, 0x00, 0x15, 0x00, 0x92, 0x00, 0x17, 0x00, 0x92, 0x00, 0x18, 0x00, 0x8d, 0x00, 0x11, 0x00, 0x84, 0x00, 0x04, 0x00, 0x7b, 0x00, 0xf7, 0xff, 0x74, 0x00, 0xee, 0xff, 0x6e, 0x00, 0xe6, 0xff, 0x67, 0x00, 0xe0, 0xff, 0x60, 0x00, 0xd9, 0xff, 0x52, 0x00, 0xcc, 0xff, 0x3f, 0x00, 0xbc, 0xff, 0x29, 0x00, 0xaa, 0xff, 0x15, 0x00, 0x99, 0xff, 0x02, 0x00, 0x86, 0xff, 0xf3, 0xff, 0x75, 0xff, 0xeb, 0xff, 0x6a, 0xff, 0xe8, 0xff, 0x64, 0xff, 0xe5, 0xff, 0x63, 0xff, 0xe2, 0xff, 0x66, 0xff, 0xdd, 0xff, 0x6a, 0xff, 0xd8, 0xff, 0x6f, 0xff, 0xd2, 0xff, 0x70, 0xff, 0xcf, 0xff, 0x6f, 0xff, 0xd3, 0xff, 0x72, 0xff, 0xda, 0xff, 0x76, 0xff, 0xe0, 0xff, 0x7b, 0xff, 0xe1, 0xff, 0x83, 0xff, 0xdc, 0xff, 0x8a, 0xff, 0xd5, 0xff, 0x92, 0xff, 0xd3, 0xff, 0x9d, 0xff, 0xd4, 0xff, 0xa7, 0xff, 0xd3, 0xff, 0xad, 0xff, 0xd3, 0xff, 0xb1, 0xff, 0xd3, 0xff, 0xb7, 0xff, 0xd2, 0xff, 0xbc, 0xff, 0xce, 0xff, 0xbf, 0xff, 0xcc, 0xff, 0xc5, 0xff, 0xce, 0xff, 0xcd, 0xff, 0xd1, 0xff, 0xd5, 0xff, 0xd7, 0xff, 0xdf, 0xff, 0xe1, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0x02, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x15, 0x00, 0x21, 0x00, 0x21, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x40, 0x00, 0x32, 0x00, 0x4e, 0x00, 0x37, 0x00, 0x58, 0x00, 0x3a, 0x00, 0x5e, 0x00, 0x3d, 0x00, 0x63, 0x00, 0x40, 0x00, 0x67, 0x00, 0x44, 0x00, 0x68, 0x00, 0x42, 0x00, 0x63, 0x00, 0x3a, 0x00, 0x5d, 0x00, 0x31, 0x00, 0x57, 0x00, 0x27, 0x00, 0x54, 0x00, 0x20, 0x00, 0x51, 0x00, 0x19, 0x00, 0x4d, 0x00, 0x13, 0x00, 0x45, 0x00, 0x0b, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x31, 0x00, 0xf7, 0xff, 0x2a, 0x00, 0xec, 0xff, 0x24, 0x00, 0xe1, 0xff, 0x1c, 0x00, 0xd4, 0xff, 0x18, 0x00, 0xc9, 0xff, 0x17, 0x00, 0xbf, 0xff, 0x19, 0x00, 0xb5, 0xff, 0x1c, 0x00, 0xa9, 0xff, 0x1e, 0x00, 0x9e, 0xff, 0x20, 0x00, 0x92, 0xff, 0x1e, 0x00, 0x85, 0xff, 0x1d, 0x00, 0x7d, 0xff, 0x21, 0x00, 0x7b, 0xff, 0x28, 0x00, 0x7c, 0xff, 0x31, 0x00, 0x7c, 0xff, 0x39, 0x00, 0x78, 0xff, 0x40, 0x00, 0x72, 0xff, 0x46, 0x00, 0x70, 0xff, 0x4d, 0x00, 0x74, 0xff, 0x54, 0x00, 0x7d, 0xff, 0x5b, 0x00, 0x86, 0xff, 0x5c, 0x00, 0x8c, 0xff, 0x5a, 0x00, 0x90, 0xff, 0x53, 0x00, 0x92, 0xff, 0x48, 0x00, 0x95, 0xff, 0x3b, 0x00, 0x97, 0xff, 0x2e, 0x00, 0x9d, 0xff, 0x21, 0x00, 0xa7, 0xff, 0x14, 0x00, 0xb6, 0xff, 0x04, 0x00, 0xc6, 0xff, 0xf2, 0xff, 0xd4, 0xff, 0xe1, 0xff, 0xe1, 0xff, 0xd2, 0xff, 0xec, 0xff, 0xc2, 0xff, 0xf5, 0xff, 0xb3, 0xff, 0xff, 0xff, 0xa4, 0xff, 0x0c, 0x00, 0x8f, 0xff, 0x16, 0x00, 0x76, 0xff, 0x1a, 0x00, 0x5b, 0xff, 0x18, 0x00, 0x40, 0xff, 0x14, 0x00, 0x29, 0xff, 0x11, 0x00, 0x18, 0xff, 0x17, 0x00, 0x0d, 0xff, 0x22, 0x00, 0x03, 0xff, 0x2e, 0x00, 0xfa, 0xfe, 0x35, 0x00, 0xf1, 0xfe, 0x39, 0x00, 0xea, 0xfe, 0x3c, 0x00, 0xe0, 0xfe, 0x3c, 0x00, 0xda, 0xfe, 0x3c, 0x00, 0xdc, 0xfe, 0x40, 0x00, 0xe7, 0xfe, 0x4a, 0x00, 0xf6, 0xfe, 0x59, 0x00, 0x04, 0xff, 0x67, 0x00, 0x0e, 0xff, 0x72, 0x00, 0x13, 0xff, 0x76, 0x00, 0x1a, 0xff, 0x79, 0x00, 0x25, 0xff, 0x80, 0x00, 0x34, 0xff, 0x8a, 0x00, 0x44, 0xff, 0x91, 0x00, 0x56, 0xff, 0x97, 0x00, 0x6b, 0xff, 0x9c, 0x00, 0x7f, 0xff, 0x9f, 0x00, 0x8f, 0xff, 0xa2, 0x00, 0x9a, 0xff, 0xa4, 0x00, 0xa5, 0xff, 0xa7, 0x00, 0xaf, 0xff, 0xa6, 0x00, 0xba, 0xff, 0xa3, 0x00, 0xc8, 0xff, 0xa0, 0x00, 0xd8, 0xff, 0x9a, 0x00, 0xe5, 0xff, 0x90, 0x00, 0xf5, 0xff, 0x89, 0x00, 0x09, 0x00, 0x88, 0x00, 0x1f, 0x00, 0x8d, 0x00, 0x2f, 0x00, 0x8f, 0x00, 0x38, 0x00, 0x88, 0x00, 0x40, 0x00, 0x7c, 0x00, 0x46, 0x00, 0x69, 0x00, 0x4a, 0x00, 0x50, 0x00, 0x50, 0x00, 0x37, 0x00, 0x5c, 0x00, 0x23, 0x00, 0x6b, 0x00, 0x16, 0x00, 0x7a, 0x00, 0x0d, 0x00, 0x86, 0x00, 0x04, 0x00, 0x8f, 0x00, 0xf9, 0xff, 0x97, 0x00, 0xee, 0xff, 0x9f, 0x00, 0xe1, 0xff, 0xa5, 0x00, 0xd1, 0xff, 0xa4, 0x00, 0xb9, 0xff, 0xa0, 0x00, 0x9d, 0xff, 0x9e, 0x00, 0x84, 0xff, 0x9f, 0x00, 0x73, 0xff, 0xa2, 0x00, 0x69, 0xff, 0x9e, 0x00, 0x5e, 0xff, 0x92, 0x00, 0x4f, 0xff, 0x81, 0x00, 0x3e, 0xff, 0x75, 0x00, 0x30, 0xff, 0x73, 0x00, 0x2a, 0xff, 0x7b, 0x00, 0x2c, 0xff, 0x82, 0x00, 0x2d, 0xff, 0x82, 0x00, 0x2a, 0xff, 0x80, 0x00, 0x29, 0xff, 0x81, 0x00, 0x32, 0xff, 0x83, 0x00, 0x41, 0xff, 0x81, 0x00, 0x4e, 0xff, 0x7c, 0x00, 0x59, 0xff, 0x79, 0x00, 0x62, 0xff, 0x78, 0x00, 0x6c, 0xff, 0x76, 0x00, 0x76, 0xff, 0x72, 0x00, 0x7f, 0xff, 0x6b, 0x00, 0x88, 0xff, 0x5f, 0x00, 0x92, 0xff, 0x4f, 0x00, 0x9a, 0xff, 0x3a, 0x00, 0x9d, 0xff, 0x1f, 0x00, 0x9a, 0xff, 0xfe, 0xff, 0x8f, 0xff, 0xd8, 0xff, 0x80, 0xff, 0xb2, 0xff, 0x71, 0xff, 0x90, 0xff, 0x68, 0xff, 0x78, 0xff, 0x6b, 0xff, 0x69, 0xff, 0x78, 0xff, 0x61, 0xff, 0x8c, 0xff, 0x67, 0xff, 0xab, 0xff, 0x79, 0xff, 0xd5, 0xff, 0x8a, 0xff, 0xfb, 0xff, 0x8d, 0xff, 0x13, 0x00, 0x86, 0xff, 0x20, 0x00, 0x83, 0xff, 0x30, 0x00, 0x88, 0xff, 0x46, 0x00, 0x93, 0xff, 0x60, 0x00, 0x9f, 0xff, 0x79, 0x00, 0xa8, 0xff, 0x8c, 0x00, 0xb0, 0xff, 0x9b, 0x00, 0xb8, 0xff, 0xa7, 0x00, 0xbe, 0xff, 0xb1, 0x00, 0xb9, 0xff, 0xad, 0x00, 0xaa, 0xff, 0xa0, 0x00, 0x9d, 0xff, 0x92, 0x00, 0x98, 0xff, 0x88, 0x00, 0x97, 0xff, 0x7d, 0x00, 0x91, 0xff, 0x69, 0x00, 0x86, 0xff, 0x4e, 0x00, 0x7f, 0xff, 0x37, 0x00, 0x80, 0xff, 0x29, 0x00, 0x8b, 0xff, 0x25, 0x00, 0x9d, 0xff, 0x27, 0x00, 0xb3, 0xff, 0x2d, 0x00, 0xca, 0xff, 0x34, 0x00, 0xe7, 0xff, 0x43, 0x00, 0x0b, 0x00, 0x59, 0x00, 0x2f, 0x00, 0x70, 0x00, 0x4d, 0x00, 0x81, 0x00, 0x68, 0x00, 0x90, 0x00, 0x80, 0x00, 0x9b, 0x00, 0x90, 0x00, 0x9e, 0x00, 0x95, 0x00, 0x97, 0x00, 0x93, 0x00, 0x8b, 0x00, 0x8c, 0x00, 0x7e, 0x00, 0x81, 0x00, 0x71, 0x00, 0x72, 0x00, 0x61, 0x00, 0x61, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x2d, 0x00, 0x35, 0x00, 0x0a, 0x00, 0x20, 0x00, 0xea, 0xff, 0x10, 0x00, 0xd0, 0xff, 0x05, 0x00, 0xbf, 0xff, 0x03, 0x00, 0xb8, 0xff, 0x07, 0x00, 0xb8, 0xff, 0x13, 0x00, 0xbe, 0xff, 0x22, 0x00, 0xc7, 0xff, 0x37, 0x00, 0xd4, 0xff, 0x4d, 0x00, 0xe4, 0xff, 0x5e, 0x00, 0xf0, 0xff, 0x6a, 0x00, 0xfb, 0xff, 0x6e, 0x00, 0x01, 0x00, 0x71, 0x00, 0x06, 0x00, 0x70, 0x00, 0x08, 0x00, 0x69, 0x00, 0x01, 0x00, 0x59, 0x00, 0xf1, 0xff, 0x42, 0x00, 0xdc, 0xff, 0x25, 0x00, 0xc5, 0xff, 0x01, 0x00, 0xad, 0xff, 0xda, 0xff, 0x97, 0xff, 0xb3, 0xff, 0x86, 0xff, 0x90, 0xff, 0x7a, 0xff, 0x71, 0xff, 0x72, 0xff, 0x55, 0xff, 0x6b, 0xff, 0x3e, 0xff, 0x67, 0xff, 0x2b, 0xff, 0x6a, 0xff, 0x20, 0xff, 0x77, 0xff, 0x1c, 0xff, 0x8f, 0xff, 0x1d, 0xff, 0xae, 0xff, 0x22, 0xff, 0xd0, 0xff, 0x29, 0xff, 0xf0, 0xff, 0x32, 0xff, 0x0f, 0x00, 0x3d, 0xff, 0x2f, 0x00, 0x4b, 0xff, 0x50, 0x00, 0x57, 0xff, 0x6c, 0x00, 0x5f, 0xff, 0x81, 0x00, 0x65, 0xff, 0x91, 0x00, 0x68, 0xff, 0x9f, 0x00, 0x66, 0xff, 0xa6, 0x00, 0x61, 0xff, 0xa9, 0x00, 0x5a, 0xff, 0xa5, 0x00, 0x51, 0xff, 0x9a, 0x00, 0x47, 0xff, 0x8b, 0x00, 0x41, 0xff, 0x7f, 0x00, 0x42, 0xff, 0x79, 0x00, 0x4a, 0xff, 0x77, 0x00, 0x57, 0xff, 0x77, 0x00, 0x6c, 0xff, 0x7e, 0x00, 0x8a, 0xff, 0x90, 0x00, 0xaa, 0xff, 0xa7, 0x00, 0xca, 0xff, 0xc0, 0x00, 0xe8, 0xff, 0xd4, 0x00, 0x01, 0x00, 0xe0, 0x00, 0x19, 0x00, 0xe7, 0x00, 0x3d, 0x00, 0xfb, 0x00, 0x73, 0x00, 0x1f, 0x01, 0xac, 0x00, 0x47, 0x01, 0xda, 0x00, 0x64, 0x01, 0xf5, 0x00, 0x6d, 0x01, 0xfb, 0x00, 0x5f, 0x01, 0xee, 0x00, 0x38, 0x01, 0xdd, 0x00, 0x09, 0x01, 0xd1, 0x00, 0xdb, 0x00, 0xc6, 0x00, 0xac, 0x00, 0xb7, 0x00, 0x7c, 0x00, 0xac, 0x00, 0x52, 0x00, 0xab, 0x00, 0x31, 0x00, 0xb4, 0x00, 0x1b, 0x00, 0xc3, 0x00, 0x07, 0x00, 0xca, 0x00, 0xe9, 0xff, 0xbe, 0x00, 0xb8, 0xff, 0xac, 0x00, 0x81, 0xff, 0xaf, 0x00, 0x64, 0xff, 0xd4, 0x00, 0x6c, 0xff, 0x07, 0x01, 0x87, 0xff, 0x2e, 0x01, 0x99, 0xff, 0x3d, 0x01, 0x93, 0xff, 0x3c, 0x01, 0x7f, 0xff, 0x3b, 0x01, 0x70, 0xff, 0x44, 0x01, 0x70, 0xff, 0x51, 0x01, 0x7b, 0xff, 0x54, 0x01, 0x83, 0xff, 0x45, 0x01, 0x7d, 0xff, 0x27, 0x01, 0x6a, 0xff, 0x01, 0x01, 0x4f, 0xff, 0xdb, 0x00, 0x34, 0xff, 0xb4, 0x00, 0x1c, 0xff, 0x8c, 0x00, 0x08, 0xff, 0x65, 0x00, 0xfb, 0xfe, 0x39, 0x00, 0xed, 0xfe, 0x0b, 0x00, 0xdd, 0xfe, 0xe5, 0xff, 0xd2, 0xfe, 0xcf, 0xff, 0xd1, 0xfe, 0xc9, 0xff, 0xda, 0xfe, 0xc7, 0xff, 0xe6, 0xfe, 0xc5, 0xff, 0xf3, 0xfe, 0xc6, 0xff, 0x07, 0xff, 0xcb, 0xff, 0x26, 0xff, 0xd7, 0xff, 0x51, 0xff, 0xe6, 0xff, 0x7c, 0xff, 0xf1, 0xff, 0xa0, 0xff, 0xf9, 0xff, 0xba, 0xff, 0xf8, 0xff, 0xca, 0xff, 0xf1, 0xff, 0xd2, 0xff, 0xe7, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xe9, 0xff, 0xc9, 0xff, 0xf2, 0xff, 0xad, 0xff, 0xf0, 0xff, 0x84, 0xff, 0xe0, 0xff, 0x57, 0xff, 0xc8, 0xff, 0x2b, 0xff, 0xae, 0xff, 0x06, 0xff, 0x9a, 0xff, 0xef, 0xfe, 0x94, 0xff, 0xde, 0xfe, 0x97, 0xff, 0xd4, 0xfe, 0xa2, 0xff, 0xd3, 0xfe, 0xb7, 0xff, 0xdd, 0xfe, 0xd5, 0xff, 0xef, 0xfe, 0xf8, 0xff, 0x09, 0xff, 0x1e, 0x00, 0x2e, 0xff, 0x4b, 0x00, 0x59, 0xff, 0x7e, 0x00, 0x82, 0xff, 0xae, 0x00, 0xa3, 0xff, 0xd4, 0x00, 0xbb, 0xff, 0xee, 0x00, 0xcc, 0xff, 0xfd, 0x00, 0xd7, 0xff, 0x03, 0x01, 0xdc, 0xff, 0x01, 0x01, 0xda, 0xff, 0xf7, 0x00, 0xd4, 0xff, 0xe9, 0x00, 0xca, 0xff, 0xd4, 0x00, 0xbc, 0xff, 0xb8, 0x00, 0xae, 0xff, 0x97, 0x00, 0xa0, 0xff, 0x71, 0x00, 0x97, 0xff, 0x4b, 0x00, 0x95, 0xff, 0x2a, 0x00, 0xa2, 0xff, 0x18, 0x00, 0xbc, 0xff, 0x16, 0x00, 0xd9, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x42, 0x00, 0x20, 0x00, 0x6b, 0x00, 0x24, 0x00, 0x97, 0x00, 0x2b, 0x00, 0xc0, 0x00, 0x35, 0x00, 0xdd, 0x00, 0x3a, 0x00, 0xec, 0x00, 0x34, 0x00, 0xf4, 0x00, 0x2c, 0x00, 0xf6, 0x00, 0x1f, 0x00, 0xec, 0x00, 0x07, 0x00, 0xdc, 0x00, 0xec, 0xff, 0xc9, 0x00, 0xcf, 0xff, 0xaf, 0x00, 0xb0, 0xff, 0x8f, 0x00, 0x8f, 0xff, 0x71, 0x00, 0x74, 0xff, 0x55, 0x00, 0x5d, 0xff, 0x37, 0x00, 0x46, 0xff, 0x20, 0x00, 0x32, 0xff, 0x17, 0x00, 0x2b, 0xff, 0x13, 0x00, 0x2a, 0xff, 0x0e, 0x00, 0x2c, 0xff, 0x0e, 0x00, 0x3a, 0xff, 0x10, 0x00, 0x4d, 0xff, 0x0e, 0x00, 0x5c, 0xff, 0x0d, 0x00, 0x68, 0xff, 0x16, 0x00, 0x7b, 0xff, 0x1c, 0x00, 0x8b, 0xff, 0x18, 0x00, 0x92, 0xff, 0x16, 0x00, 0x9c, 0xff, 0x11, 0x00, 0xa4, 0xff, 0xfd, 0xff, 0x9a, 0xff, 0xdf, 0xff, 0x86, 0xff, 0xce, 0xff, 0x7c, 0xff, 0xc5, 0xff, 0x7c, 0xff, 0xb6, 0xff, 0x75, 0xff, 0xa1, 0xff, 0x69, 0xff, 0x8e, 0xff, 0x5f, 0xff, 0x80, 0xff, 0x5b, 0xff, 0x7d, 0xff, 0x65, 0xff, 0x89, 0xff, 0x80, 0xff, 0x92, 0xff, 0x99, 0xff, 0x90, 0xff, 0xa5, 0xff, 0x96, 0xff, 0xb8, 0xff, 0xac, 0xff, 0xdc, 0xff, 0xbe, 0xff, 0xfc, 0xff, 0xc7, 0xff, 0x15, 0x00, 0xce, 0xff, 0x2b, 0x00, 0xcb, 0xff, 0x36, 0x00, 0xbd, 0xff, 0x33, 0x00, 0xaf, 0xff, 0x31, 0x00, 0xa4, 0xff, 0x33, 0x00, 0x92, 0xff, 0x31, 0x00, 0x89, 0xff, 0x3a, 0x00, 0x97, 0xff, 0x5a, 0x00, 0x98, 0xff, 0x6b, 0x00, 0x7e, 0xff, 0x59, 0x00, 0x77, 0xff, 0x55, 0x00, 0xa0, 0xff, 0x7a, 0x00, 0xc8, 0xff, 0x9c, 0x00, 0xca, 0xff, 0x96, 0x00, 0xc4, 0xff, 0x88, 0x00, 0xcb, 0xff, 0x87, 0x00, 0xdf, 0xff, 0x8e, 0x00, 0x03, 0x00, 0xa1, 0x00, 0x2b, 0x00, 0xb3, 0x00, 0x35, 0x00, 0xa2, 0x00, 0x23, 0x00, 0x78, 0x00, 0x28, 0x00, 0x64, 0x00, 0x45, 0x00, 0x6b, 0x00, 0x4d, 0x00, 0x60, 0x00, 0x44, 0x00, 0x45, 0x00, 0x48, 0x00, 0x36, 0x00, 0x52, 0x00, 0x2d, 0x00, 0x55, 0x00, 0x1d, 0x00, 0x61, 0x00, 0x19, 0x00, 0x72, 0x00, 0x21, 0x00, 0x73, 0x00, 0x1e, 0x00, 0x72, 0x00, 0x1c, 0x00, 0x84, 0x00, 0x2e, 0x00, 0x9a, 0x00, 0x40, 0x00, 0xa4, 0x00, 0x42, 0x00, 0xb2, 0x00, 0x46, 0x00, 0xc5, 0x00, 0x53, 0x00, 0xcb, 0x00, 0x56, 0x00, 0xc3, 0x00, 0x4f, 0x00, 0xbc, 0x00, 0x4a, 0x00, 0xad, 0x00, 0x3a, 0x00, 0x93, 0x00, 0x1b, 0x00, 0x7f, 0x00, 0xfc, 0xff, 0x6d, 0x00, 0xdd, 0xff, 0x4b, 0x00, 0xae, 0xff, 0x2a, 0x00, 0x83, 0xff, 0x1c, 0x00, 0x6f, 0xff, 0x0f, 0x00, 0x5c, 0xff, 0xf4, 0xff, 0x3d, 0xff, 0xe4, 0xff, 0x2a, 0xff, 0xe9, 0xff, 0x2f, 0xff, 0xec, 0xff, 0x35, 0xff, 0xe5, 0xff, 0x32, 0xff, 0xe1, 0xff, 0x35, 0xff, 0xe1, 0xff, 0x3e, 0xff, 0xde, 0xff, 0x47, 0xff, 0xdd, 0xff, 0x53, 0xff, 0xdf, 0xff, 0x63, 0xff, 0xd8, 0xff, 0x6b, 0xff, 0xcc, 0xff, 0x70, 0xff, 0xc3, 0xff, 0x78, 0xff, 0xb5, 0xff, 0x7d, 0xff, 0x9d, 0xff, 0x7b, 0xff, 0x8a, 0xff, 0x7d, 0xff, 0x7b, 0xff, 0x81, 0xff, 0x6c, 0xff, 0x81, 0xff, 0x63, 0xff, 0x86, 0xff, 0x61, 0xff, 0x93, 0xff, 0x5c, 0xff, 0xa1, 0xff, 0x54, 0xff, 0xaf, 0xff, 0x5b, 0xff, 0xce, 0xff, 0x6e, 0xff, 0xf9, 0xff, 0x7f, 0xff, 0x1e, 0x00, 0x90, 0xff, 0x40, 0x00, 0xa8, 0xff, 0x65, 0x00, 0xba, 0xff, 0x83, 0x00, 0xc4, 0xff, 0x99, 0x00, 0xd4, 0xff, 0xb5, 0x00, 0xe6, 0xff, 0xd3, 0x00, 0xe5, 0xff, 0xe0, 0x00, 0xd5, 0xff, 0xde, 0x00, 0xce, 0xff, 0xe1, 0x00, 0xcf, 0xff, 0xe9, 0x00, 0xc9, 0xff, 0xe9, 0x00, 0xb8, 0xff, 0xdb, 0x00, 0xa1, 0xff, 0xc5, 0x00, 0x8f, 0xff, 0xb6, 0x00, 0x8e, 0xff, 0xba, 0x00, 0x9c, 0xff, 0xcd, 0x00, 0xa8, 0xff, 0xde, 0x00, 0xab, 0xff, 0xe2, 0x00, 0xae, 0xff, 0xe5, 0x00, 0xbb, 0xff, 0xef, 0x00, 0xcf, 0xff, 0xff, 0x00, 0xe8, 0xff, 0x12, 0x01, 0x02, 0x00, 0x23, 0x01, 0x16, 0x00, 0x2a, 0x01, 0x25, 0x00, 0x2c, 0x01, 0x37, 0x00, 0x30, 0x01, 0x47, 0x00, 0x34, 0x01, 0x4f, 0x00, 0x2d, 0x01, 0x54, 0x00, 0x22, 0x01, 0x62, 0x00, 0x1c, 0x01, 0x74, 0x00, 0x19, 0x01, 0x80, 0x00, 0x0e, 0x01, 0x82, 0x00, 0xfa, 0x00, 0x7f, 0x00, 0xde, 0x00, 0x77, 0x00, 0xbb, 0x00, 0x75, 0x00, 0x9b, 0x00, 0x7a, 0x00, 0x84, 0x00, 0x7f, 0x00, 0x70, 0x00, 0x7c, 0x00, 0x5c, 0x00, 0x77, 0x00, 0x49, 0x00, 0x76, 0x00, 0x3c, 0x00, 0x73, 0x00, 0x2c, 0x00, 0x6b, 0x00, 0x17, 0x00, 0x64, 0x00, 0x02, 0x00, 0x60, 0x00, 0xf2, 0xff, 0x58, 0x00, 0xdf, 0xff, 0x4d, 0x00, 0xc6, 0xff, 0x42, 0x00, 0xae, 0xff, 0x37, 0x00, 0x96, 0xff, 0x29, 0x00, 0x7a, 0xff, 0x14, 0x00, 0x5a, 0xff, 0xff, 0xff, 0x3a, 0xff, 0xef, 0xff, 0x1e, 0xff, 0xe6, 0xff, 0x07, 0xff, 0xe6, 0xff, 0xfa, 0xfe, 0xec, 0xff, 0xf4, 0xfe, 0xf0, 0xff, 0xf3, 0xfe, 0xef, 0xff, 0xef, 0xfe, 0xe8, 0xff, 0xea, 0xfe, 0xe1, 0xff, 0xe7, 0xfe, 0xdb, 0xff, 0xe9, 0xfe, 0xdb, 0xff, 0xf0, 0xfe, 0xde, 0xff, 0xfa, 0xfe, 0xe2, 0xff, 0x05, 0xff, 0xe5, 0xff, 0x0e, 0xff, 0xe5, 0xff, 0x16, 0xff, 0xe0, 0xff, 0x1c, 0xff, 0xda, 0xff, 0x21, 0xff, 0xd6, 0xff, 0x2a, 0xff, 0xd1, 0xff, 0x33, 0xff, 0xcf, 0xff, 0x40, 0xff, 0xd2, 0xff, 0x54, 0xff, 0xd6, 0xff, 0x6e, 0xff, 0xd7, 0xff, 0x82, 0xff, 0xd0, 0xff, 0x8c, 0xff, 0xca, 0xff, 0x91, 0xff, 0xc8, 0xff, 0x98, 0xff, 0xc7, 0xff, 0xa2, 0xff, 0xc2, 0xff, 0xae, 0xff, 0xb9, 0xff, 0xba, 0xff, 0xaa, 0xff, 0xc3, 0xff, 0x9c, 0xff, 0xca, 0xff, 0x96, 0xff, 0xd5, 0xff, 0x95, 0xff, 0xe1, 0xff, 0x94, 0xff, 0xe9, 0xff, 0x94, 0xff, 0xef, 0xff, 0x98, 0xff, 0xfc, 0xff, 0x9e, 0xff, 0x0e, 0x00, 0xa6, 0xff, 0x25, 0x00, 0xad, 0xff, 0x38, 0x00, 0xb5, 0xff, 0x47, 0x00, 0xc0, 0xff, 0x54, 0x00, 0xd4, 0xff, 0x66, 0x00, 0xf0, 0xff, 0x82, 0x00, 0x08, 0x00, 0x98, 0x00, 0x16, 0x00, 0xa5, 0x00, 0x26, 0x00, 0xb0, 0x00, 0x3b, 0x00, 0xbc, 0x00, 0x4c, 0x00, 0xc4, 0x00, 0x5c, 0x00, 0xca, 0x00, 0x6a, 0x00, 0xce, 0x00, 0x74, 0x00, 0xce, 0x00, 0x7b, 0x00, 0xcb, 0x00, 0x80, 0x00, 0xc6, 0x00, 0x83, 0x00, 0xbc, 0x00, 0x77, 0x00, 0xa1, 0x00, 0x60, 0x00, 0x78, 0x00, 0x4b, 0x00, 0x51, 0x00, 0x46, 0x00, 0x3c, 0x00, 0x53, 0x00, 0x3e, 0x00, 0x6c, 0x00, 0x50, 0x00, 0x82, 0x00, 0x61, 0x00, 0x8c, 0x00, 0x62, 0x00, 0x8a, 0x00, 0x53, 0x00, 0x7d, 0x00, 0x36, 0x00, 0x65, 0x00, 0x10, 0x00, 0x4a, 0x00, 0xe9, 0xff, 0x30, 0x00, 0xcb, 0xff, 0x16, 0x00, 0xb1, 0xff, 0x03, 0x00, 0xa0, 0xff, 0x04, 0x00, 0xa4, 0xff, 0x13, 0x00, 0xb4, 0xff, 0x1a, 0x00, 0xbb, 0xff, 0x0d, 0x00, 0xaf, 0xff, 0xf0, 0xff, 0x98, 0xff, 0xcf, 0xff, 0x80, 0xff, 0xb6, 0xff, 0x72, 0xff, 0xb2, 0xff, 0x78, 0xff, 0xbd, 0xff, 0x88, 0xff, 0xc3, 0xff, 0x8e, 0xff, 0xc1, 0xff, 0x87, 0xff, 0xc0, 0xff, 0x7f, 0xff, 0xc0, 0xff, 0x7b, 0xff, 0xbd, 0xff, 0x76, 0xff, 0xbb, 0xff, 0x75, 0xff, 0xbf, 0xff, 0x7a, 0xff, 0xc1, 0xff, 0x79, 0xff, 0xbb, 0xff, 0x6d, 0xff, 0xb9, 0xff, 0x62, 0xff, 0xbe, 0xff, 0x5e, 0xff, 0xc5, 0xff, 0x61, 0xff, 0xca, 0xff, 0x66, 0xff, 0xcb, 0xff, 0x69, 0xff, 0xc3, 0xff, 0x65, 0xff, 0xb3, 0xff, 0x58, 0xff, 0xa6, 0xff, 0x4c, 0xff, 0x9f, 0xff, 0x48, 0xff, 0xa0, 0xff, 0x4e, 0xff, 0xa8, 0xff, 0x60, 0xff, 0xb3, 0xff, 0x79, 0xff, 0xbf, 0xff, 0x9a, 0xff, 0xd0, 0xff, 0xc1, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xfd, 0xff, 0x15, 0x00, 0x09, 0x00, 0x34, 0x00, 0x0d, 0x00, 0x4c, 0x00, 0x15, 0x00, 0x69, 0x00, 0x1f, 0x00, 0x89, 0x00, 0x24, 0x00, 0xa2, 0x00, 0x22, 0x00, 0xad, 0x00, 0x20, 0x00, 0xb2, 0x00, 0x23, 0x00, 0xb9, 0x00, 0x26, 0x00, 0xbf, 0x00, 0x24, 0x00, 0xc3, 0x00, 0x1e, 0x00, 0xc6, 0x00, 0x14, 0x00, 0xc7, 0x00, 0x0a, 0x00, 0xc7, 0x00, 0x08, 0x00, 0xcb, 0x00, 0x10, 0x00, 0xd3, 0x00, 0x17, 0x00, 0xd6, 0x00, 0x1c, 0x00, 0xd4, 0x00, 0x23, 0x00, 0xd6, 0x00, 0x29, 0x00, 0xda, 0x00, 0x29, 0x00, 0xda, 0x00, 0x29, 0x00, 0xda, 0x00, 0x2d, 0x00, 0xdd, 0x00, 0x2f, 0x00, 0xdb, 0x00, 0x2b, 0x00, 0xcd, 0x00, 0x27, 0x00, 0xbe, 0x00, 0x23, 0x00, 0xae, 0x00, 0x17, 0x00, 0x98, 0x00, 0x08, 0x00, 0x7f, 0x00, 0xfc, 0xff, 0x6b, 0x00, 0xf5, 0xff, 0x57, 0x00, 0xeb, 0xff, 0x3e, 0x00, 0xe4, 0xff, 0x23, 0x00, 0xe1, 0xff, 0x0e, 0x00, 0xe3, 0xff, 0x03, 0x00, 0xe6, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfe, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xea, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe3, 0xff, 0xdb, 0xff, 0xd6, 0xff, 0xd1, 0xff, 0xc9, 0xff, 0xc9, 0xff, 0xbe, 0xff, 0xc1, 0xff, 0xb2, 0xff, 0xb7, 0xff, 0xa4, 0xff, 0xb0, 0xff, 0x98, 0xff, 0xb0, 0xff, 0x91, 0xff, 0xae, 0xff, 0x89, 0xff, 0xa5, 0xff, 0x7b, 0xff, 0x97, 0xff, 0x67, 0xff, 0x8a, 0xff, 0x53, 0xff, 0x80, 0xff, 0x3d, 0xff, 0x78, 0xff, 0x26, 0xff, 0x73, 0xff, 0x10, 0xff, 0x74, 0xff, 0xfd, 0xfe, 0x7c, 0xff, 0xf1, 0xfe, 0x84, 0xff, 0xe8, 0xfe, 0x8a, 0xff, 0xe2, 0xfe, 0x8e, 0xff, 0xe1, 0xfe, 0x95, 0xff, 0xe8, 0xfe, 0xa5, 0xff, 0xf8, 0xfe, 0xba, 0xff, 0x0d, 0xff, 0xd2, 0xff, 0x23, 0xff, 0xe8, 0xff, 0x37, 0xff, 0xf9, 0xff, 0x4b, 0xff, 0x06, 0x00, 0x5d, 0xff, 0x0d, 0x00, 0x6e, 0xff, 0x12, 0x00, 0x7e, 0xff, 0x15, 0x00, 0x8c, 0xff, 0x12, 0x00, 0x92, 0xff, 0x0a, 0x00, 0x92, 0xff, 0x02, 0x00, 0x94, 0xff, 0xff, 0xff, 0x9a, 0xff, 0xfc, 0xff, 0xa2, 0xff, 0xfd, 0xff, 0xae, 0xff, 0x02, 0x00, 0xbc, 0xff, 0x0a, 0x00, 0xcd, 0xff, 0x17, 0x00, 0xe1, 0xff, 0x24, 0x00, 0xf6, 0xff, 0x31, 0x00, 0x0b, 0x00, 0x3f, 0x00, 0x22, 0x00, 0x51, 0x00, 0x3a, 0x00, 0x66, 0x00, 0x53, 0x00, 0x80, 0x00, 0x69, 0x00, 0x9c, 0x00, 0x7d, 0x00, 0xba, 0x00, 0x91, 0x00, 0xd3, 0x00, 0xa1, 0x00, 0xe3, 0x00, 0xab, 0x00, 0xeb, 0x00, 0xb3, 0x00, 0xf2, 0x00, 0xb9, 0x00, 0xf9, 0x00, 0xc0, 0x00, 0x05, 0x01, 0xca, 0x00, 0x13, 0x01, 0xd1, 0x00, 0x1f, 0x01, 0xd2, 0x00, 0x2c, 0x01, 0xd1, 0x00, 0x38, 0x01, 0xcf, 0x00, 0x3f, 0x01, 0xcd, 0x00, 0x3c, 0x01, 0xc3, 0x00, 0x30, 0x01, 0xb2, 0x00, 0x25, 0x01, 0xa0, 0x00, 0x1c, 0x01, 0x91, 0x00, 0x13, 0x01, 0x84, 0x00, 0x0a, 0x01, 0x77, 0x00, 0xfc, 0x00, 0x68, 0x00, 0xeb, 0x00, 0x55, 0x00, 0xd6, 0x00, 0x3f, 0x00, 0xbf, 0x00, 0x2a, 0x00, 0xa8, 0x00, 0x18, 0x00, 0x8f, 0x00, 0x09, 0x00, 0x72, 0x00, 0xfb, 0xff, 0x53, 0x00, 0xec, 0xff, 0x35, 0x00, 0xdc, 0xff, 0x19, 0x00, 0xca, 0xff, 0x00, 0x00, 0xb6, 0xff, 0xe8, 0xff, 0xa0, 0xff, 0xcd, 0xff, 0x8a, 0xff, 0xb1, 0xff, 0x78, 0xff, 0x96, 0xff, 0x6d, 0xff, 0x7d, 0xff, 0x66, 0xff, 0x67, 0xff, 0x63, 0xff, 0x58, 0xff, 0x61, 0xff, 0x53, 0xff, 0x64, 0xff, 0x57, 0xff, 0x67, 0xff, 0x5d, 0xff, 0x6b, 0xff, 0x63, 0xff, 0x6f, 0xff, 0x65, 0xff, 0x75, 0xff, 0x62, 0xff, 0x7d, 0xff, 0x5f, 0xff, 0x87, 0xff, 0x5c, 0xff, 0x8e, 0xff, 0x5b, 0xff, 0x90, 0xff, 0x59, 0xff, 0x8b, 0xff, 0x56, 0xff, 0x85, 0xff, 0x53, 0xff, 0x7f, 0xff, 0x4e, 0xff, 0x7d, 0xff, 0x47, 0xff, 0x7f, 0xff, 0x40, 0xff, 0x81, 0xff, 0x39, 0xff, 0x82, 0xff, 0x33, 0xff, 0x81, 0xff, 0x2f, 0xff, 0x7f, 0xff, 0x31, 0xff, 0x7f, 0xff, 0x3b, 0xff, 0x86, 0xff, 0x4b, 0xff, 0x93, 0xff, 0x5b, 0xff, 0xa0, 0xff, 0x6d, 0xff, 0xb0, 0xff, 0x81, 0xff, 0xc2, 0xff, 0x96, 0xff, 0xd8, 0xff, 0xac, 0xff, 0xf0, 0xff, 0xbf, 0xff, 0x05, 0x00, 0xcf, 0xff, 0x15, 0x00, 0xdf, 0xff, 0x20, 0x00, 0xef, 0xff, 0x2a, 0x00, 0xfd, 0xff, 0x31, 0x00, 0x09, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3d, 0x00, 0x1c, 0x00, 0x44, 0x00, 0x23, 0x00, 0x4d, 0x00, 0x2a, 0x00, 0x59, 0x00, 0x31, 0x00, 0x67, 0x00, 0x36, 0x00, 0x71, 0x00, 0x3e, 0x00, 0x77, 0x00, 0x4b, 0x00, 0x7a, 0x00, 0x5c, 0x00, 0x7f, 0x00, 0x6f, 0x00, 0x88, 0x00, 0x7d, 0x00, 0x92, 0x00, 0x85, 0x00, 0x9b, 0x00, 0x8a, 0x00, 0xa2, 0x00, 0x8d, 0x00, 0xa2, 0x00, 0x90, 0x00, 0x9d, 0x00, 0x93, 0x00, 0x94, 0x00, 0x99, 0x00, 0x8c, 0x00, 0xa0, 0x00, 0x87, 0x00, 0xa6, 0x00, 0x84, 0x00, 0xa4, 0x00, 0x7d, 0x00, 0x9d, 0x00, 0x74, 0x00, 0x96, 0x00, 0x6c, 0x00, 0x8f, 0x00, 0x61, 0x00, 0x8a, 0x00, 0x55, 0x00, 0x83, 0x00, 0x47, 0x00, 0x7c, 0x00, 0x3a, 0x00, 0x71, 0x00, 0x2d, 0x00, 0x63, 0x00, 0x22, 0x00, 0x54, 0x00, 0x1b, 0x00, 0x45, 0x00, 0x15, 0x00, 0x38, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x12, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xf9, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xe6, 0xff, 0xfc, 0xff, 0xd8, 0xff, 0xfd, 0xff, 0xcb, 0xff, 0xf9, 0xff, 0xbd, 0xff, 0xf2, 0xff, 0xab, 0xff, 0xe6, 0xff, 0x96, 0xff, 0xdb, 0xff, 0x7e, 0xff, 0xd3, 0xff, 0x64, 0xff, 0xce, 0xff, 0x4a, 0xff, 0xc9, 0xff, 0x35, 0xff, 0xc2, 0xff, 0x25, 0xff, 0xba, 0xff, 0x19, 0xff, 0xb3, 0xff, 0x0e, 0xff, 0xae, 0xff, 0x04, 0xff, 0xab, 0xff, 0xfa, 0xfe, 0xac, 0xff, 0xf2, 0xfe, 0xae, 0xff, 0xf0, 0xfe, 0xb4, 0xff, 0xf4, 0xfe, 0xbc, 0xff, 0xfc, 0xfe, 0xc4, 0xff, 0x06, 0xff, 0xca, 0xff, 0x0e, 0xff, 0xcf, 0xff, 0x14, 0xff, 0xd8, 0xff, 0x18, 0xff, 0xe3, 0xff, 0x1c, 0xff, 0xf0, 0xff, 0x23, 0xff, 0xfc, 0xff, 0x30, 0xff, 0x08, 0x00, 0x43, 0xff, 0x13, 0x00, 0x56, 0xff, 0x1a, 0x00, 0x69, 0xff, 0x23, 0x00, 0x7c, 0xff, 0x2d, 0x00, 0x8e, 0xff, 0x3c, 0x00, 0xa2, 0xff, 0x4c, 0x00, 0xb6, 0xff, 0x5b, 0x00, 0xcd, 0xff, 0x69, 0x00, 0xe4, 0xff, 0x75, 0x00, 0xfc, 0xff, 0x7d, 0x00, 0x11, 0x00, 0x85, 0x00, 0x22, 0x00, 0x8f, 0x00, 0x2e, 0x00, 0x98, 0x00, 0x35, 0x00, 0xa0, 0x00, 0x3a, 0x00, 0xa5, 0x00, 0x40, 0x00, 0xa6, 0x00, 0x4a, 0x00, 0xa6, 0x00, 0x57, 0x00, 0xa4, 0x00, 0x63, 0x00, 0xa0, 0x00, 0x6d, 0x00, 0x9e, 0x00, 0x75, 0x00, 0x9e, 0x00, 0x7c, 0x00, 0xa0, 0x00, 0x82, 0x00, 0xa1, 0x00, 0x89, 0x00, 0x9f, 0x00, 0x90, 0x00, 0x9a, 0x00, 0x97, 0x00, 0x93, 0x00, 0x9e, 0x00, 0x8c, 0x00, 0xa5, 0x00, 0x87, 0x00, 0xac, 0x00, 0x83, 0x00, 0xb1, 0x00, 0x7e, 0x00, 0xb4, 0x00, 0x79, 0x00, 0xb5, 0x00, 0x71, 0x00, 0xb5, 0x00, 0x68, 0x00, 0xb4, 0x00, 0x5e, 0x00, 0xaf, 0x00, 0x54, 0x00, 0xa7, 0x00, 0x4c, 0x00, 0x9a, 0x00, 0x46, 0x00, 0x8f, 0x00, 0x41, 0x00, 0x82, 0x00, 0x3b, 0x00, 0x73, 0x00, 0x2f, 0x00, 0x63, 0x00, 0x22, 0x00, 0x53, 0x00, 0x15, 0x00, 0x43, 0x00, 0x0d, 0x00, 0x32, 0x00, 0x05, 0x00, 0x1f, 0x00, 0xfa, 0xff, 0x0d, 0x00, 0xf1, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xf5, 0xff, 0xe1, 0xff, 0xf2, 0xff, 0xdf, 0xff, 0xf1, 0xff, 0xdd, 0xff, 0xec, 0xff, 0xd8, 0xff, 0xe5, 0xff, 0xd0, 0xff, 0xdc, 0xff, 0xc6, 0xff, 0xd1, 0xff, 0xb9, 0xff, 0xc5, 0xff, 0xa9, 0xff, 0xb9, 0xff, 0x9a, 0xff, 0xac, 0xff, 0x8c, 0xff, 0x9f, 0xff, 0x82, 0xff, 0x94, 0xff, 0x7c, 0xff, 0x8a, 0xff, 0x78, 0xff, 0x83, 0xff, 0x74, 0xff, 0x7d, 0xff, 0x6c, 0xff, 0x79, 0xff, 0x61, 0xff, 0x74, 0xff, 0x55, 0xff, 0x6f, 0xff, 0x49, 0xff, 0x6e, 0xff, 0x44, 0xff, 0x70, 0xff, 0x45, 0xff, 0x70, 0xff, 0x45, 0xff, 0x72, 0xff, 0x43, 0xff, 0x77, 0xff, 0x3f, 0xff, 0x80, 0xff, 0x3a, 0xff, 0x89, 0xff, 0x31, 0xff, 0x90, 0xff, 0x27, 0xff, 0x98, 0xff, 0x22, 0xff, 0xa0, 0xff, 0x22, 0xff, 0xa9, 0xff, 0x24, 0xff, 0xb3, 0xff, 0x26, 0xff, 0xbc, 0xff, 0x25, 0xff, 0xc8, 0xff, 0x25, 0xff, 0xd6, 0xff, 0x27, 0xff, 0xe7, 0xff, 0x2f, 0xff, 0xfb, 0xff, 0x3e, 0xff, 0x12, 0x00, 0x52, 0xff, 0x2a, 0x00, 0x6b, 0xff, 0x41, 0x00, 0x85, 0xff, 0x56, 0x00, 0x9c, 0xff, 0x6b, 0x00, 0xb2, 0xff, 0x7d, 0x00, 0xc5, 0xff, 0x8c, 0x00, 0xd5, 0xff, 0x95, 0x00, 0xe5, 0xff, 0x97, 0x00, 0xf5, 0xff, 0x96, 0x00, 0x04, 0x00, 0x94, 0x00, 0x10, 0x00, 0x93, 0x00, 0x18, 0x00, 0x95, 0x00, 0x1d, 0x00, 0x95, 0x00, 0x21, 0x00, 0x95, 0x00, 0x25, 0x00, 0x95, 0x00, 0x2b, 0x00, 0x98, 0x00, 0x36, 0x00, 0x9a, 0x00, 0x43, 0x00, 0x9c, 0x00, 0x51, 0x00, 0x9c, 0x00, 0x5c, 0x00, 0x9a, 0x00, 0x63, 0x00, 0x98, 0x00, 0x65, 0x00, 0x97, 0x00, 0x63, 0x00, 0x92, 0x00, 0x5b, 0x00, 0x86, 0x00, 0x4f, 0x00, 0x78, 0x00, 0x44, 0x00, 0x69, 0x00, 0x3b, 0x00, 0x59, 0x00, 0x32, 0x00, 0x47, 0x00, 0x27, 0x00, 0x36, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x0c, 0x00, 0x19, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xe9, 0xff, 0xfd, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xcc, 0xff, 0xf3, 0xff, 0xcd, 0xff, 0xf8, 0xff, 0xd7, 0xff, 0xfe, 0xff, 0xe3, 0xff, 0x01, 0x00, 0xea, 0xff, 0x05, 0x00, 0xf1, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0xee, 0xff, 0x00, 0x00, 0xdd, 0xff, 0xfb, 0xff, 0xce, 0xff, 0xf7, 0xff, 0xc3, 0xff, 0xf6, 0xff, 0xbb, 0xff, 0xf8, 0xff, 0xaf, 0xff, 0xf9, 0xff, 0x9d, 0xff, 0xf6, 0xff, 0x88, 0xff, 0xf0, 0xff, 0x71, 0xff, 0xe4, 0xff, 0x5a, 0xff, 0xd2, 0xff, 0x46, 0xff, 0xbe, 0xff, 0x37, 0xff, 0xa9, 0xff, 0x2b, 0xff, 0x95, 0xff, 0x22, 0xff, 0x84, 0xff, 0x1e, 0xff, 0x78, 0xff, 0x1d, 0xff, 0x70, 0xff, 0x20, 0xff, 0x6c, 0xff, 0x2a, 0xff, 0x6c, 0xff, 0x3c, 0xff, 0x6e, 0xff, 0x4f, 0xff, 0x6f, 0xff, 0x5d, 0xff, 0x6a, 0xff, 0x67, 0xff, 0x66, 0xff, 0x71, 0xff, 0x69, 0xff, 0x7a, 0xff, 0x71, 0xff, 0x85, 0xff, 0x7e, 0xff, 0x92, 0xff, 0x90, 0xff, 0xa3, 0xff, 0xa5, 0xff, 0xb6, 0xff, 0xbd, 0xff, 0xc8, 0xff, 0xd4, 0xff, 0xd6, 0xff, 0xeb, 0xff, 0xde, 0xff, 0xfc, 0xff, 0xe1, 0xff, 0x09, 0x00, 0xe5, 0xff, 0x13, 0x00, 0xea, 0xff, 0x1c, 0x00, 0xf5, 0xff, 0x28, 0x00, 0x0a, 0x00, 0x3d, 0x00, 0x27, 0x00, 0x59, 0x00, 0x41, 0x00, 0x70, 0x00, 0x52, 0x00, 0x7e, 0x00, 0x60, 0x00, 0x89, 0x00, 0x67, 0x00, 0x8d, 0x00, 0x6d, 0x00, 0x8e, 0x00, 0x72, 0x00, 0x8d, 0x00, 0x79, 0x00, 0x8a, 0x00, 0x7c, 0x00, 0x87, 0x00, 0x7b, 0x00, 0x86, 0x00, 0x79, 0x00, 0x8a, 0x00, 0x70, 0x00, 0x8d, 0x00, 0x64, 0x00, 0x8e, 0x00, 0x5c, 0x00, 0x91, 0x00, 0x52, 0x00, 0x92, 0x00, 0x46, 0x00, 0x90, 0x00, 0x3e, 0x00, 0x92, 0x00, 0x3e, 0x00, 0x9f, 0x00, 0x46, 0x00, 0xb5, 0x00, 0x51, 0x00, 0xce, 0x00, 0x55, 0x00, 0xdd, 0x00, 0x50, 0x00, 0xe1, 0x00, 0x43, 0x00, 0xda, 0x00, 0x32, 0x00, 0xce, 0x00, 0x24, 0x00, 0xc5, 0x00, 0x1a, 0x00, 0xbf, 0x00, 0x14, 0x00, 0xbc, 0x00, 0x15, 0x00, 0xbf, 0x00, 0x22, 0x00, 0xcd, 0x00, 0x30, 0x00, 0xdc, 0x00, 0x37, 0x00, 0xe3, 0x00, 0x2e, 0x00, 0xdc, 0x00, 0x12, 0x00, 0xc6, 0x00, 0xed, 0xff, 0xa9, 0x00, 0xcd, 0xff, 0x94, 0x00, 0xbb, 0xff, 0x89, 0x00, 0xb7, 0xff, 0x86, 0x00, 0xbe, 0xff, 0x88, 0x00, 0xca, 0xff, 0x8a, 0x00, 0xd3, 0xff, 0x88, 0x00, 0xd7, 0xff, 0x81, 0x00, 0xd4, 0xff, 0x76, 0x00, 0xc9, 0xff, 0x61, 0x00, 0xb6, 0xff, 0x40, 0x00, 0xa2, 0xff, 0x18, 0x00, 0x96, 0xff, 0xf2, 0xff, 0x95, 0xff, 0xd5, 0xff, 0x9f, 0xff, 0xc6, 0xff, 0xb1, 0xff, 0xc3, 0xff, 0xc4, 0xff, 0xc4, 0xff, 0xd5, 0xff, 0xc5, 0xff, 0xe0, 0xff, 0xc3, 0xff, 0xe8, 0xff, 0xc1, 0xff, 0xeb, 0xff, 0xbe, 0xff, 0xe9, 0xff, 0xb7, 0xff, 0xe4, 0xff, 0xaf, 0xff, 0xdf, 0xff, 0xa7, 0xff, 0xe1, 0xff, 0xa6, 0xff, 0xee, 0xff, 0xaf, 0xff, 0x06, 0x00, 0xc0, 0xff, 0x20, 0x00, 0xd1, 0xff, 0x37, 0x00, 0xdf, 0xff, 0x46, 0x00, 0xe9, 0xff, 0x4f, 0x00, 0xef, 0xff, 0x55, 0x00, 0xf4, 0xff, 0x5c, 0x00, 0xf7, 0xff, 0x65, 0x00, 0xf9, 0xff, 0x6f, 0x00, 0xf7, 0xff, 0x7f, 0x00, 0xf8, 0xff, 0x94, 0x00, 0xfd, 0xff, 0xa6, 0x00, 0x06, 0x00, 0xb1, 0x00, 0x0f, 0x00, 0xae, 0x00, 0x12, 0x00, 0xa0, 0x00, 0x0c, 0x00, 0x8a, 0x00, 0xfb, 0xff, 0x75, 0x00, 0xe6, 0xff, 0x66, 0x00, 0xd6, 0xff, 0x64, 0x00, 0xd4, 0xff, 0x6e, 0x00, 0xe3, 0xff, 0x7c, 0x00, 0xfd, 0xff, 0x8a, 0x00, 0x1a, 0x00, 0x97, 0x00, 0x33, 0x00, 0x9f, 0x00, 0x44, 0x00, 0xa0, 0x00, 0x4b, 0x00, 0x9e, 0x00, 0x48, 0x00, 0x95, 0x00, 0x3c, 0x00, 0x8c, 0x00, 0x31, 0x00, 0x85, 0x00, 0x2c, 0x00, 0x85, 0x00, 0x2e, 0x00, 0x90, 0x00, 0x3c, 0x00, 0xa5, 0x00, 0x50, 0x00, 0xb8, 0x00, 0x60, 0x00, 0xc7, 0x00, 0x6c, 0x00, 0xcf, 0x00, 0x74, 0x00, 0xc8, 0x00, 0x71, 0x00, 0xb4, 0x00, 0x68, 0x00, 0x9b, 0x00, 0x5e, 0x00, 0x80, 0x00, 0x54, 0x00, 0x65, 0x00, 0x48, 0x00, 0x52, 0x00, 0x40, 0x00, 0x48, 0x00, 0x3d, 0x00, 0x43, 0x00, 0x3e, 0x00, 0x3c, 0x00, 0x3e, 0x00, 0x30, 0x00, 0x3a, 0x00, 0x1b, 0x00, 0x2f, 0x00, 0x01, 0x00, 0x1c, 0x00, 0xe4, 0xff, 0x02, 0x00, 0xcd, 0xff, 0xe9, 0xff, 0xc2, 0xff, 0xd6, 0xff, 0xbe, 0xff, 0xc9, 0xff, 0xba, 0xff, 0xba, 0xff, 0xb8, 0xff, 0xaf, 0xff, 0xba, 0xff, 0xaa, 0xff, 0xb0, 0xff, 0x99, 0xff, 0x98, 0xff, 0x78, 0xff, 0x84, 0xff, 0x58, 0xff, 0x72, 0xff, 0x3b, 0xff, 0x5e, 0xff, 0x1b, 0xff, 0x5e, 0xff, 0x12, 0xff, 0x7b, 0xff, 0x29, 0xff, 0x94, 0xff, 0x3d, 0xff, 0x9f, 0xff, 0x46, 0xff, 0xa6, 0xff, 0x4a, 0xff, 0xa2, 0xff, 0x41, 0xff, 0x90, 0xff, 0x29, 0xff, 0x81, 0xff, 0x14, 0xff, 0x7a, 0xff, 0x07, 0xff, 0x78, 0xff, 0x00, 0xff, 0x83, 0xff, 0x07, 0xff, 0x9a, 0xff, 0x1a, 0xff, 0xb0, 0xff, 0x2c, 0xff, 0xc0, 0xff, 0x38, 0xff, 0xc7, 0xff, 0x3d, 0xff, 0xba, 0xff, 0x2f, 0xff, 0xa1, 0xff, 0x17, 0xff, 0x97, 0xff, 0x12, 0xff, 0x9a, 0xff, 0x1b, 0xff, 0xa7, 0xff, 0x2c, 0xff, 0xd2, 0xff, 0x58, 0xff, 0x11, 0x00, 0x99, 0xff, 0x34, 0x00, 0xc3, 0xff, 0x27, 0x00, 0xc2, 0xff, 0xf2, 0xff, 0x9e, 0xff, 0x9e, 0xff, 0x5a, 0xff, 0x53, 0xff, 0x1d, 0xff, 0x33, 0xff, 0x0a, 0xff, 0x39, 0xff, 0x1d, 0xff, 0x67, 0xff, 0x58, 0xff, 0xcb, 0xff, 0xc9, 0xff, 0x44, 0x00, 0x4b, 0x00, 0xa2, 0x00, 0xb2, 0x00, 0xc9, 0x00, 0xde, 0x00, 0x96, 0x00, 0xad, 0x00, 0x1a, 0x00, 0x30, 0x00, 0xa1, 0xff, 0xb3, 0xff, 0x58, 0xff, 0x66, 0xff, 0x55, 0xff, 0x63, 0xff, 0xae, 0xff, 0xc3, 0xff, 0x3b, 0x00, 0x5d, 0x00, 0xb5, 0x00, 0xe4, 0x00, 0xf6, 0x00, 0x2f, 0x01, 0xe5, 0x00, 0x24, 0x01, 0x8b, 0x00, 0xcd, 0x00, 0x29, 0x00, 0x6f, 0x00, 0xf1, 0xff, 0x42, 0x00, 0xf4, 0xff, 0x55, 0x00, 0x32, 0x00, 0xa7, 0x00, 0x71, 0x00, 0xfa, 0x00, 0x6c, 0x00, 0x05, 0x01, 0x0d, 0x00, 0xb0, 0x00, 0x60, 0xff, 0x09, 0x00, 0xae, 0xfe, 0x5b, 0xff, 0x66, 0xfe, 0x14, 0xff, 0xbf, 0xfe, 0x6d, 0xff, 0xb2, 0xff, 0x61, 0x00, 0xfb, 0x00, 0xaa, 0x01, 0x0e, 0x02, 0xbd, 0x02, 0x7e, 0x02, 0x2d, 0x03, 0x15, 0x02, 0xc0, 0x02, 0xb1, 0x00, 0x52, 0x01, 0xcc, 0xfe, 0x5e, 0xff, 0x6a, 0xfd, 0xea, 0xfd, 0x17, 0xfd, 0x86, 0xfd, 0xee, 0xfd, 0x4f, 0xfe, 0xd1, 0xff, 0x29, 0x00, 0xf6, 0x01, 0x46, 0x02, 0x61, 0x03, 0xa9, 0x03, 0xad, 0x03, 0xea, 0x03, 0xb2, 0x02, 0xe1, 0x02, 0xa7, 0x00, 0xca, 0x00, 0x8d, 0xfe, 0xa2, 0xfe, 0x50, 0xfd, 0x56, 0xfd, 0x3d, 0xfd, 0x33, 0xfd, 0x52, 0xfe, 0x39, 0xfe, 0x0b, 0x00, 0xe6, 0xff, 0x88, 0x01, 0x5b, 0x01, 0x42, 0x02, 0x10, 0x02, 0x02, 0x02, 0xcb, 0x01, 0xd8, 0x00, 0x9d, 0x00, 0x58, 0xff, 0x18, 0xff, 0x22, 0xfe, 0xe0, 0xfd, 0x98, 0xfd, 0x54, 0xfd, 0xee, 0xfd, 0xa9, 0xfd, 0xeb, 0xfe, 0xa7, 0xfe, 0xff, 0xff, 0xbd, 0xff, 0xc7, 0x00, 0x8c, 0x00, 0xfd, 0x00, 0xcc, 0x00, 0x7b, 0x00, 0x54, 0x00, 0x8a, 0xff, 0x68, 0xff, 0x84, 0xfe, 0x63, 0xfe, 0xbe, 0xfd, 0x9a, 0xfd, 0xa2, 0xfd, 0x7d, 0xfd, 0x33, 0xfe, 0x0e, 0xfe, 0x12, 0xff, 0xf2, 0xfe, 0x01, 0x00, 0xe9, 0xff, 0xb4, 0x00, 0xa7, 0x00, 0xe0, 0x00, 0xde, 0x00, 0x9a, 0x00, 0xa0, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x39, 0xff, 0x40, 0xff, 0x90, 0xfe, 0x95, 0xfe, 0x49, 0xfe, 0x4e, 0xfe, 0x69, 0xfe, 0x72, 0xfe, 0x02, 0xff, 0x13, 0xff, 0xe8, 0xff, 0x06, 0x00, 0xac, 0x00, 0xd8, 0x00, 0x19, 0x01, 0x51, 0x01, 0x12, 0x01, 0x51, 0x01, 0x84, 0x00, 0xc7, 0x00, 0xbb, 0xff, 0x00, 0x00, 0x0b, 0xff, 0x50, 0xff, 0x98, 0xfe, 0xde, 0xfe, 0xa4, 0xfe, 0xeb, 0xfe, 0x39, 0xff, 0x80, 0xff, 0xf2, 0xff, 0x39, 0x00, 0x85, 0x00, 0xcb, 0x00, 0xd3, 0x00, 0x17, 0x01, 0xb6, 0x00, 0xf8, 0x00, 0x4f, 0x00, 0x90, 0x00, 0xf2, 0xff, 0x32, 0x00, 0xbe, 0xff, 0xfc, 0xff, 0xba, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0x39, 0x00, 0x5f, 0x00, 0xa2, 0x00, 0xc3, 0x00, 0x0c, 0x01, 0xfb, 0x00, 0x4b, 0x01, 0xe0, 0x00, 0x35, 0x01, 0x75, 0x00, 0xcf, 0x00, 0xeb, 0xff, 0x49, 0x00, 0x7f, 0xff, 0xe0, 0xff, 0x6d, 0xff, 0xcf, 0xff, 0xc9, 0xff, 0x29, 0x00, 0x63, 0x00, 0xc2, 0x00, 0xfd, 0x00, 0x5b, 0x01, 0x60, 0x01, 0xbe, 0x01, 0x58, 0x01, 0xb4, 0x01, 0xda, 0x00, 0x31, 0x01, 0x11, 0x00, 0x61, 0x00, 0x37, 0xff, 0x7e, 0xff, 0xa0, 0xfe, 0xdf, 0xfe, 0xad, 0xfe, 0xe4, 0xfe, 0x6b, 0xff, 0x9a, 0xff, 0x7b, 0x00, 0x9e, 0x00, 0x63, 0x01, 0x79, 0x01, 0xce, 0x01, 0xd5, 0x01, 0x95, 0x01, 0x8a, 0x01, 0xcb, 0x00, 0xac, 0x00, 0xc0, 0xff, 0x8c, 0xff, 0xe7, 0xfe, 0x9f, 0xfe, 0xa9, 0xfe, 0x4f, 0xfe, 0x36, 0xff, 0xce, 0xfe, 0x6e, 0x00, 0xfa, 0xff, 0xc9, 0x01, 0x48, 0x01, 0x7b, 0x02, 0xea, 0x01, 0x0f, 0x02, 0x6b, 0x01, 0xc1, 0x00, 0x08, 0x00, 0x17, 0xff, 0x4f, 0xfe, 0xba, 0xfd, 0xea, 0xfc, 0x6e, 0xfd, 0x9f, 0xfc, 0x70, 0xfe, 0xa7, 0xfd, 0x34, 0x00, 0x75, 0xff, 0xf4, 0x01, 0x40, 0x01, 0xe6, 0x02, 0x3e, 0x02, 0x6e, 0x02, 0xd2, 0x01, 0xbe, 0x00, 0x2f, 0x00, 0xb3, 0xfe, 0x32, 0xfe, 0x27, 0xfd, 0xb7, 0xfc, 0xa8, 0xfc, 0x50, 0xfc, 0x5c, 0xfd, 0x22, 0xfd, 0xf2, 0xfe, 0xd8, 0xfe, 0xb9, 0x00, 0xbc, 0x00, 0xdc, 0x01, 0xf8, 0x01, 0xdf, 0x01, 0x0e, 0x02, 0xe2, 0x00, 0x21, 0x01, 0x52, 0xff, 0x9e, 0xff, 0xc4, 0xfd, 0x1c, 0xfe, 0xfa, 0xfc, 0x59, 0xfd, 0x47, 0xfd, 0xaa, 0xfd, 0x5b, 0xfe, 0xc0, 0xfe, 0xc4, 0xff, 0x2c, 0x00, 0x0a, 0x01, 0x76, 0x01, 0xa5, 0x01, 0x14, 0x02, 0x63, 0x01, 0xd4, 0x01, 0x85, 0x00, 0xf6, 0x00, 0x76, 0xff, 0xe6, 0xff, 0x96, 0xfe, 0x03, 0xff, 0x10, 0xfe, 0x7e, 0xfe, 0x22, 0xfe, 0x93, 0xfe, 0xf7, 0xfe, 0x6e, 0xff, 0x22, 0x00, 0x9f, 0x00, 0x18, 0x01, 0x9b, 0x01, 0xbf, 0x01, 0x46, 0x02, 0xf5, 0x01, 0x7d, 0x02, 0x78, 0x01, 0xff, 0x01, 0x90, 0x00, 0x14, 0x01, 0xa5, 0xff, 0x22, 0x00, 0xd1, 0xfe, 0x48, 0xff, 0x71, 0xfe, 0xe5, 0xfe, 0xf0, 0xfe, 0x62, 0xff, 0x25, 0x00, 0x96, 0x00, 0x7d, 0x01, 0xeb, 0x01, 0x62, 0x02, 0xc7, 0x02, 0x76, 0x02, 0xd1, 0x02, 0xbb, 0x01, 0x09, 0x02, 0x80, 0x00, 0xc3, 0x00, 0x58, 0xff, 0x8f, 0xff, 0xdf, 0xfe, 0x0d, 0xff, 0x3e, 0xff, 0x65, 0xff, 0x2f, 0x00, 0x52, 0x00, 0x5b, 0x01, 0x7c, 0x01, 0x43, 0x02, 0x61, 0x02, 0x68, 0x02, 0x81, 0x02, 0xcb, 0x01, 0xde, 0x01, 0xd0, 0x00, 0xda, 0x00, 0xe4, 0xff, 0xe2, 0xff, 0x69, 0xff, 0x58, 0xff, 0x7f, 0xff, 0x5e, 0xff, 0x06, 0x00, 0xd6, 0xff, 0xc5, 0x00, 0x87, 0x00, 0x66, 0x01, 0x1c, 0x01, 0xa8, 0x01, 0x53, 0x01, 0x8a, 0x01, 0x2c, 0x01, 0x0b, 0x01, 0xa5, 0x00, 0x4f, 0x00, 0xe1, 0xff, 0xbd, 0xff, 0x41, 0xff, 0x80, 0xff, 0xf0, 0xfe, 0x86, 0xff, 0xe0, 0xfe, 0xd7, 0xff, 0x1f, 0xff, 0x4f, 0x00, 0x8d, 0xff, 0xa0, 0x00, 0xdc, 0xff, 0xb5, 0x00, 0xf4, 0xff, 0x93, 0x00, 0xd6, 0xff, 0x3c, 0x00, 0x82, 0xff, 0xd1, 0xff, 0x18, 0xff, 0x7d, 0xff, 0xc3, 0xfe, 0x56, 0xff, 0x9a, 0xfe, 0x67, 0xff, 0xa9, 0xfe, 0x9a, 0xff, 0xda, 0xfe, 0xd9, 0xff, 0x19, 0xff, 0x1d, 0x00, 0x61, 0xff, 0x3e, 0x00, 0x89, 0xff, 0x23, 0x00, 0x75, 0xff, 0xe8, 0xff, 0x43, 0xff, 0xaa, 0xff, 0x0d, 0xff, 0x77, 0xff, 0xe4, 0xfe, 0x70, 0xff, 0xe9, 0xfe, 0x9c, 0xff, 0x23, 0xff, 0xd9, 0xff, 0x72, 0xff, 0x0c, 0x00, 0xbc, 0xff, 0x13, 0x00, 0xde, 0xff, 0xe3, 0xff, 0xce, 0xff, 0x99, 0xff, 0xa4, 0xff, 0x49, 0xff, 0x74, 0xff, 0x14, 0xff, 0x58, 0xff, 0x1f, 0xff, 0x74, 0xff, 0x54, 0xff, 0xb5, 0xff, 0x84, 0xff, 0xef, 0xff, 0xab, 0xff, 0x1e, 0x00, 0xbe, 0xff, 0x38, 0x00, 0xa6, 0xff, 0x26, 0x00, 0x7d, 0xff, 0x04, 0x00, 0x60, 0xff, 0xee, 0xff, 0x4d, 0xff, 0xe1, 0xff, 0x49, 0xff, 0xe0, 0xff, 0x52, 0xff, 0xe7, 0xff, 0x5e, 0xff, 0xec, 0xff, 0x73, 0xff, 0xf7, 0xff, 0x8b, 0xff, 0x06, 0x00, 0xa1, 0xff, 0x16, 0x00, 0xbc, 0xff, 0x2d, 0x00, 0xce, 0xff, 0x3d, 0x00, 0xcd, 0xff, 0x3c, 0x00, 0xcd, 0xff, 0x3a, 0x00, 0xd4, 0xff, 0x3b, 0x00, 0xd7, 0xff, 0x36, 0x00, 0xea, 0xff, 0x40, 0x00, 0x15, 0x00, 0x60, 0x00, 0x35, 0x00, 0x7a, 0x00, 0x3f, 0x00, 0x81, 0x00, 0x2f, 0x00, 0x73, 0x00, 0x01, 0x00, 0x47, 0x00, 0xca, 0xff, 0x0e, 0x00, 0xb4, 0xff, 0xf0, 0xff, 0xe0, 0xff, 0x0d, 0x00, 0x44, 0x00, 0x5e, 0x00, 0xa0, 0x00, 0xa7, 0x00, 0xc6, 0x00, 0xc0, 0x00, 0xbf, 0x00, 0xb2, 0x00, 0x8f, 0x00, 0x82, 0x00, 0x3a, 0x00, 0x2b, 0x00, 0xdb, 0xff, 0xc6, 0xff, 0x91, 0xff, 0x6d, 0xff, 0x7f, 0xff, 0x46, 0xff, 0xcf, 0xff, 0x7b, 0xff, 0x62, 0x00, 0xf4, 0xff, 0xdb, 0x00, 0x58, 0x00, 0xf6, 0x00, 0x64, 0x00, 0xac, 0x00, 0x10, 0x00, 0x24, 0x00, 0x82, 0xff, 0xa7, 0xff, 0xfc, 0xfe, 0x67, 0xff, 0xad, 0xfe, 0x7e, 0xff, 0xae, 0xfe, 0xef, 0xff, 0x06, 0xff, 0x80, 0x00, 0x81, 0xff, 0xdc, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0xcd, 0xff, 0x8c, 0x00, 0x83, 0xff, 0x15, 0x00, 0x18, 0xff, 0xbe, 0xff, 0xce, 0xfe, 0xa9, 0xff, 0xc6, 0xfe, 0xcb, 0xff, 0xf4, 0xfe, 0x0e, 0x00, 0x42, 0xff, 0x54, 0x00, 0x92, 0xff, 0x79, 0x00, 0xc5, 0xff, 0x74, 0x00, 0xd1, 0xff, 0x47, 0x00, 0xbb, 0xff, 0x03, 0x00, 0x93, 0xff, 0xcb, 0xff, 0x77, 0xff, 0xad, 0xff, 0x70, 0xff, 0xa9, 0xff, 0x7c, 0xff, 0xbe, 0xff, 0x9c, 0xff, 0xdd, 0xff, 0xc5, 0xff, 0xf0, 0xff, 0xe1, 0xff, 0xef, 0xff, 0xeb, 0xff, 0xd9, 0xff, 0xe2, 0xff, 0xb0, 0xff, 0xc8, 0xff, 0x88, 0xff, 0xb1, 0xff, 0x72, 0xff, 0xad, 0xff, 0x73, 0xff, 0xc0, 0xff, 0x85, 0xff, 0xe0, 0xff, 0x99, 0xff, 0x01, 0x00, 0xa0, 0xff, 0x13, 0x00, 0xa1, 0xff, 0x1f, 0x00, 0xa0, 0xff, 0x27, 0x00, 0x9a, 0xff, 0x2b, 0x00, 0x9d, 0xff, 0x39, 0x00, 0xa7, 0xff, 0x4e, 0x00, 0xae, 0xff, 0x61, 0x00, 0xae, 0xff, 0x6d, 0x00, 0xac, 0xff, 0x74, 0x00, 0xb2, 0xff, 0x80, 0x00, 0xcb, 0xff, 0x9a, 0x00, 0xee, 0xff, 0xb7, 0x00, 0x07, 0x00, 0xc8, 0x00, 0x11, 0x00, 0xc9, 0x00, 0x0f, 0x00, 0xc2, 0x00, 0x07, 0x00, 0xbe, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x0a, 0x00, 0xd2, 0x00, 0x23, 0x00, 0xef, 0x00, 0x4b, 0x00, 0x12, 0x01, 0x6b, 0x00, 0x25, 0x01, 0x7e, 0x00, 0x27, 0x01, 0x84, 0x00, 0x1e, 0x01, 0x7a, 0x00, 0x0b, 0x01, 0x64, 0x00, 0xf5, 0x00, 0x52, 0x00, 0xe9, 0x00, 0x4c, 0x00, 0xec, 0x00, 0x4c, 0x00, 0xf3, 0x00, 0x54, 0x00, 0xf9, 0x00, 0x5e, 0x00, 0xf8, 0x00, 0x6a, 0x00, 0xf0, 0x00, 0x76, 0x00, 0xe2, 0x00, 0x7c, 0x00, 0xd0, 0x00, 0x7d, 0x00, 0xc2, 0x00, 0x72, 0x00, 0xb2, 0x00, 0x5b, 0x00, 0x9d, 0x00, 0x48, 0x00, 0x8c, 0x00, 0x40, 0x00, 0x7f, 0x00, 0x40, 0x00, 0x72, 0x00, 0x48, 0x00, 0x63, 0x00, 0x58, 0x00, 0x58, 0x00, 0x68, 0x00, 0x4e, 0x00, 0x71, 0x00, 0x45, 0x00, 0x6b, 0x00, 0x38, 0x00, 0x58, 0x00, 0x2b, 0x00, 0x43, 0x00, 0x20, 0x00, 0x33, 0x00, 0x17, 0x00, 0x2d, 0x00, 0x0b, 0x00, 0x37, 0x00, 0x01, 0x00, 0x4e, 0x00, 0xfc, 0xff, 0x6a, 0x00, 0xfb, 0xff, 0x7e, 0x00, 0xfc, 0xff, 0x7c, 0x00, 0xf6, 0xff, 0x62, 0x00, 0xe5, 0xff, 0x3d, 0x00, 0xd2, 0xff, 0x1d, 0x00, 0xc2, 0xff, 0x08, 0x00, 0xb5, 0xff, 0x08, 0x00, 0xae, 0xff, 0x18, 0x00, 0xad, 0xff, 0x2c, 0x00, 0xaf, 0xff, 0x3a, 0x00, 0xaf, 0xff, 0x34, 0x00, 0xa8, 0xff, 0x18, 0x00, 0x99, 0xff, 0xf2, 0xff, 0x8b, 0xff, 0xd0, 0xff, 0x87, 0xff, 0xb8, 0xff, 0x8c, 0xff, 0xb0, 0xff, 0x9d, 0xff, 0xb4, 0xff, 0xb1, 0xff, 0xbb, 0xff, 0xc0, 0xff, 0xc7, 0xff, 0xcb, 0xff, 0xd0, 0xff, 0xd2, 0xff, 0xd0, 0xff, 0xd3, 0xff, 0xc8, 0xff, 0xd4, 0xff, 0xbb, 0xff, 0xd8, 0xff, 0xae, 0xff, 0xe2, 0xff, 0xa8, 0xff, 0xf1, 0xff, 0xac, 0xff, 0x05, 0x00, 0xb6, 0xff, 0x18, 0x00, 0xc3, 0xff, 0x24, 0x00, 0xcf, 0xff, 0x27, 0x00, 0xd5, 0xff, 0x22, 0x00, 0xd6, 0xff, 0x1a, 0x00, 0xd1, 0xff, 0x11, 0x00, 0xc7, 0xff, 0x09, 0x00, 0xbf, 0xff, 0x06, 0x00, 0xbe, 0xff, 0x08, 0x00, 0xc6, 0xff, 0x0d, 0x00, 0xd8, 0xff, 0x14, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0x12, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2a, 0x00, 0x23, 0x00, 0x21, 0x00, 0x0f, 0x00, 0x15, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xf1, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0x0e, 0x00, 0xf1, 0xff, 0x25, 0x00, 0xf1, 0xff, 0x30, 0x00, 0xeb, 0xff, 0x30, 0x00, 0xe4, 0xff, 0x25, 0x00, 0xde, 0xff, 0x14, 0x00, 0xd8, 0xff, 0x05, 0x00, 0xd6, 0xff, 0xfc, 0xff, 0xd4, 0xff, 0xf7, 0xff, 0xce, 0xff, 0xf4, 0xff, 0xc3, 0xff, 0xf2, 0xff, 0xb6, 0xff, 0xf1, 0xff, 0xab, 0xff, 0xeb, 0xff, 0xa0, 0xff, 0xe1, 0xff, 0x97, 0xff, 0xd6, 0xff, 0x91, 0xff, 0xd0, 0xff, 0x91, 0xff, 0xcd, 0xff, 0x93, 0xff, 0xcd, 0xff, 0x93, 0xff, 0xd0, 0xff, 0x90, 0xff, 0xd1, 0xff, 0x85, 0xff, 0xcf, 0xff, 0x72, 0xff, 0xcc, 0xff, 0x5c, 0xff, 0xc7, 0xff, 0x47, 0xff, 0xbe, 0xff, 0x32, 0xff, 0xb2, 0xff, 0x1f, 0xff, 0xa9, 0xff, 0x11, 0xff, 0xa3, 0xff, 0x06, 0xff, 0xa1, 0xff, 0xf9, 0xfe, 0xa4, 0xff, 0xeb, 0xfe, 0xae, 0xff, 0xe1, 0xfe, 0xbc, 0xff, 0xdc, 0xfe, 0xc8, 0xff, 0xda, 0xfe, 0xcd, 0xff, 0xdc, 0xfe, 0xc9, 0xff, 0xe1, 0xfe, 0xbe, 0xff, 0xe5, 0xfe, 0xb1, 0xff, 0xe8, 0xfe, 0xa6, 0xff, 0xe8, 0xfe, 0x9f, 0xff, 0xe3, 0xfe, 0xa3, 0xff, 0xe1, 0xfe, 0xae, 0xff, 0xe3, 0xfe, 0xba, 0xff, 0xec, 0xfe, 0xbd, 0xff, 0xf3, 0xfe, 0xb4, 0xff, 0xfa, 0xfe, 0xa5, 0xff, 0x06, 0xff, 0x93, 0xff, 0x12, 0xff, 0x85, 0xff, 0x21, 0xff, 0x81, 0xff, 0x30, 0xff, 0x89, 0xff, 0x40, 0xff, 0x9a, 0xff, 0x4e, 0xff, 0xad, 0xff, 0x5a, 0xff, 0xbe, 0xff, 0x67, 0xff, 0xc5, 0xff, 0x77, 0xff, 0xc5, 0xff, 0x8a, 0xff, 0xc3, 0xff, 0xa3, 0xff, 0xc5, 0xff, 0xc0, 0xff, 0xcd, 0xff, 0xdd, 0xff, 0xdb, 0xff, 0xf8, 0xff, 0xed, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x22, 0x00, 0x0e, 0x00, 0x31, 0x00, 0x15, 0x00, 0x38, 0x00, 0x13, 0x00, 0x3a, 0x00, 0x0a, 0x00, 0x3c, 0x00, 0xff, 0xff, 0x44, 0x00, 0xf8, 0xff, 0x57, 0x00, 0xf7, 0xff, 0x6f, 0x00, 0xfc, 0xff, 0x85, 0x00, 0x07, 0x00, 0x97, 0x00, 0x17, 0x00, 0xa6, 0x00, 0x23, 0x00, 0xae, 0x00, 0x28, 0x00, 0xb1, 0x00, 0x2b, 0x00, 0xba, 0x00, 0x2f, 0x00, 0xce, 0x00, 0x35, 0x00, 0xed, 0x00, 0x3d, 0x00, 0x11, 0x01, 0x46, 0x00, 0x33, 0x01, 0x4f, 0x00, 0x48, 0x01, 0x52, 0x00, 0x4a, 0x01, 0x4f, 0x00, 0x3d, 0x01, 0x4e, 0x00, 0x31, 0x01, 0x4e, 0x00, 0x2b, 0x01, 0x4b, 0x00, 0x2a, 0x01, 0x49, 0x00, 0x2e, 0x01, 0x47, 0x00, 0x33, 0x01, 0x47, 0x00, 0x33, 0x01, 0x49, 0x00, 0x2c, 0x01, 0x49, 0x00, 0x1a, 0x01, 0x48, 0x00, 0x03, 0x01, 0x43, 0x00, 0xeb, 0x00, 0x3b, 0x00, 0xd5, 0x00, 0x36, 0x00, 0xc7, 0x00, 0x33, 0x00, 0xbc, 0x00, 0x35, 0x00, 0xb3, 0x00, 0x3b, 0x00, 0xa9, 0x00, 0x44, 0x00, 0x9b, 0x00, 0x4d, 0x00, 0x89, 0x00, 0x53, 0x00, 0x78, 0x00, 0x55, 0x00, 0x68, 0x00, 0x51, 0x00, 0x5c, 0x00, 0x49, 0x00, 0x55, 0x00, 0x3d, 0x00, 0x4e, 0x00, 0x2d, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x26, 0x00, 0x15, 0x00, 0x0e, 0x00, 0x18, 0x00, 0xfa, 0xff, 0x1d, 0x00, 0xea, 0xff, 0x1d, 0x00, 0xdb, 0xff, 0x19, 0x00, 0xd2, 0xff, 0x14, 0x00, 0xcd, 0xff, 0x0b, 0x00, 0xc5, 0xff, 0xfd, 0xff, 0xb5, 0xff, 0xf4, 0xff, 0xa5, 0xff, 0xf6, 0xff, 0x9b, 0xff, 0x00, 0x00, 0x95, 0xff, 0x12, 0x00, 0x98, 0xff, 0x28, 0x00, 0xa3, 0xff, 0x3d, 0x00, 0xb6, 0xff, 0x46, 0x00, 0xc7, 0xff, 0x3f, 0x00, 0xce, 0xff, 0x30, 0x00, 0xcb, 0xff, 0x20, 0x00, 0xc1, 0xff, 0x15, 0x00, 0xb4, 0xff, 0x14, 0x00, 0xac, 0xff, 0x1b, 0x00, 0xa9, 0xff, 0x26, 0x00, 0xab, 0xff, 0x30, 0x00, 0xb3, 0xff, 0x37, 0x00, 0xc4, 0xff, 0x3a, 0x00, 0xd9, 0xff, 0x36, 0x00, 0xeb, 0xff, 0x2b, 0x00, 0xf4, 0xff, 0x20, 0x00, 0xf4, 0xff, 0x18, 0x00, 0xf0, 0xff, 0x17, 0x00, 0xf0, 0xff, 0x1e, 0x00, 0xf9, 0xff, 0x2a, 0x00, 0x0a, 0x00, 0x37, 0x00, 0x21, 0x00, 0x41, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x52, 0x00, 0x42, 0x00, 0x66, 0x00, 0x39, 0x00, 0x72, 0x00, 0x31, 0x00, 0x7b, 0x00, 0x2c, 0x00, 0x82, 0x00, 0x28, 0x00, 0x87, 0x00, 0x21, 0x00, 0x89, 0x00, 0x19, 0x00, 0x8e, 0x00, 0x0e, 0x00, 0x93, 0x00, 0x05, 0x00, 0x98, 0x00, 0x00, 0x00, 0x9c, 0x00, 0xfc, 0xff, 0x9c, 0x00, 0xf8, 0xff, 0x98, 0x00, 0xf0, 0xff, 0x8f, 0x00, 0xe7, 0xff, 0x85, 0x00, 0xdc, 0xff, 0x7e, 0x00, 0xd0, 0xff, 0x78, 0x00, 0xc7, 0xff, 0x79, 0x00, 0xc4, 0xff, 0x80, 0x00, 0xc7, 0xff, 0x87, 0x00, 0xce, 0xff, 0x8a, 0x00, 0xdb, 0xff, 0x89, 0x00, 0xe8, 0xff, 0x86, 0x00, 0xf2, 0xff, 0x82, 0x00, 0xf8, 0xff, 0x7f, 0x00, 0xfd, 0xff, 0x7e, 0x00, 0x04, 0x00, 0x7d, 0x00, 0x0e, 0x00, 0x79, 0x00, 0x19, 0x00, 0x73, 0x00, 0x24, 0x00, 0x68, 0x00, 0x2d, 0x00, 0x58, 0x00, 0x2f, 0x00, 0x41, 0x00, 0x2c, 0x00, 0x28, 0x00, 0x25, 0x00, 0x11, 0x00, 0x1d, 0x00, 0xfb, 0xff, 0x18, 0x00, 0xe7, 0xff, 0x1c, 0x00, 0xd6, 0xff, 0x26, 0x00, 0xc8, 0xff, 0x2e, 0x00, 0xb7, 0xff, 0x30, 0x00, 0xa3, 0xff, 0x27, 0x00, 0x8c, 0xff, 0x15, 0x00, 0x76, 0xff, 0xfe, 0xff, 0x65, 0xff, 0xe6, 0xff, 0x5a, 0xff, 0xd4, 0xff, 0x56, 0xff, 0xc9, 0xff, 0x54, 0xff, 0xc7, 0xff, 0x50, 0xff, 0xca, 0xff, 0x4a, 0xff, 0xcb, 0xff, 0x40, 0xff, 0xc6, 0xff, 0x34, 0xff, 0xbc, 0xff, 0x2b, 0xff, 0xac, 0xff, 0x25, 0xff, 0x9c, 0xff, 0x22, 0xff, 0x94, 0xff, 0x27, 0xff, 0x97, 0xff, 0x32, 0xff, 0x9d, 0xff, 0x3b, 0xff, 0x9f, 0xff, 0x3d, 0xff, 0x9d, 0xff, 0x3c, 0xff, 0x98, 0xff, 0x37, 0xff, 0x91, 0xff, 0x30, 0xff, 0x8d, 0xff, 0x2f, 0xff, 0x94, 0xff, 0x36, 0xff, 0x9f, 0xff, 0x43, 0xff, 0xa9, 0xff, 0x50, 0xff, 0xae, 0xff, 0x5a, 0xff, 0xaf, 0xff, 0x66, 0xff, 0xaf, 0xff, 0x75, 0xff, 0xad, 0xff, 0x87, 0xff, 0xad, 0xff, 0x9b, 0xff, 0xb2, 0xff, 0xb0, 0xff, 0xbf, 0xff, 0xc5, 0xff, 0xd1, 0xff, 0xd7, 0xff, 0xe5, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x23, 0x00, 0xfe, 0xff, 0x3f, 0x00, 0xfd, 0xff, 0x5b, 0x00, 0x02, 0x00, 0x74, 0x00, 0x0d, 0x00, 0x86, 0x00, 0x1b, 0x00, 0x8f, 0x00, 0x27, 0x00, 0x92, 0x00, 0x2c, 0x00, 0x92, 0x00, 0x2a, 0x00, 0x96, 0x00, 0x20, 0x00, 0xa1, 0x00, 0x14, 0x00, 0xb5, 0x00, 0x0b, 0x00, 0xcf, 0x00, 0x07, 0x00, 0xe4, 0x00, 0x07, 0x00, 0xec, 0x00, 0x0c, 0x00, 0xe4, 0x00, 0x13, 0x00, 0xd3, 0x00, 0x19, 0x00, 0xbe, 0x00, 0x19, 0x00, 0xab, 0x00, 0x16, 0x00, 0xa1, 0x00, 0x0e, 0x00, 0x9f, 0x00, 0x04, 0x00, 0xa3, 0x00, 0xfd, 0xff, 0xaa, 0x00, 0xfc, 0xff, 0xaf, 0x00, 0x00, 0x00, 0xad, 0x00, 0x04, 0x00, 0x9f, 0x00, 0x06, 0x00, 0x88, 0x00, 0x07, 0x00, 0x71, 0x00, 0x05, 0x00, 0x5e, 0x00, 0x01, 0x00, 0x51, 0x00, 0xff, 0xff, 0x4c, 0x00, 0x02, 0x00, 0x4f, 0x00, 0x0a, 0x00, 0x56, 0x00, 0x15, 0x00, 0x5b, 0x00, 0x20, 0x00, 0x5d, 0x00, 0x26, 0x00, 0x56, 0x00, 0x24, 0x00, 0x46, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x19, 0x00, 0x17, 0x00, 0x19, 0x00, 0x04, 0x00, 0x1f, 0x00, 0xf5, 0xff, 0x2c, 0x00, 0xee, 0xff, 0x3a, 0x00, 0xeb, 0xff, 0x46, 0x00, 0xe7, 0xff, 0x4e, 0x00, 0xe1, 0xff, 0x50, 0x00, 0xd7, 0xff, 0x4d, 0x00, 0xc7, 0xff, 0x46, 0x00, 0xaf, 0xff, 0x41, 0x00, 0x98, 0xff, 0x44, 0x00, 0x89, 0xff, 0x4c, 0x00, 0x83, 0xff, 0x53, 0x00, 0x81, 0xff, 0x57, 0x00, 0x84, 0xff, 0x57, 0x00, 0x87, 0xff, 0x50, 0x00, 0x81, 0xff, 0x46, 0x00, 0x75, 0xff, 0x3d, 0x00, 0x64, 0xff, 0x38, 0x00, 0x55, 0xff, 0x34, 0x00, 0x4c, 0xff, 0x31, 0x00, 0x4a, 0xff, 0x2e, 0x00, 0x50, 0xff, 0x29, 0x00, 0x58, 0xff, 0x25, 0x00, 0x60, 0xff, 0x21, 0x00, 0x67, 0xff, 0x1f, 0x00, 0x6c, 0xff, 0x1b, 0x00, 0x6d, 0xff, 0x1a, 0x00, 0x6f, 0xff, 0x1c, 0x00, 0x75, 0xff, 0x1f, 0x00, 0x7e, 0xff, 0x1f, 0x00, 0x88, 0xff, 0x1b, 0x00, 0x92, 0xff, 0x16, 0x00, 0x9c, 0xff, 0x11, 0x00, 0xa4, 0xff, 0x0c, 0x00, 0xa8, 0xff, 0x07, 0x00, 0xa9, 0xff, 0x03, 0x00, 0xaa, 0xff, 0xfb, 0xff, 0xaa, 0xff, 0xf0, 0xff, 0xab, 0xff, 0xe6, 0xff, 0xae, 0xff, 0xdc, 0xff, 0xb1, 0xff, 0xd5, 0xff, 0xb7, 0xff, 0xd5, 0xff, 0xc4, 0xff, 0xdc, 0xff, 0xd6, 0xff, 0xe3, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xe3, 0xff, 0xf6, 0xff, 0xdb, 0xff, 0xfb, 0xff, 0xd0, 0xff, 0x01, 0x00, 0xc5, 0xff, 0x0c, 0x00, 0xbb, 0xff, 0x19, 0x00, 0xb3, 0xff, 0x25, 0x00, 0xaf, 0xff, 0x2f, 0x00, 0xad, 0xff, 0x33, 0x00, 0xad, 0xff, 0x32, 0x00, 0xab, 0xff, 0x29, 0x00, 0xa8, 0xff, 0x23, 0x00, 0xa9, 0xff, 0x28, 0x00, 0xad, 0xff, 0x37, 0x00, 0xae, 0xff, 0x4a, 0x00, 0xad, 0xff, 0x5b, 0x00, 0xae, 0xff, 0x67, 0x00, 0xac, 0xff, 0x65, 0x00, 0xaa, 0xff, 0x58, 0x00, 0xa7, 0xff, 0x44, 0x00, 0xa3, 0xff, 0x30, 0x00, 0xa1, 0xff, 0x25, 0x00, 0xa2, 0xff, 0x25, 0x00, 0xa5, 0xff, 0x2d, 0x00, 0xaa, 0xff, 0x38, 0x00, 0xaf, 0xff, 0x3d, 0x00, 0xb1, 0xff, 0x37, 0x00, 0xb0, 0xff, 0x28, 0x00, 0xac, 0xff, 0x0f, 0x00, 0xa8, 0xff, 0xf8, 0xff, 0xa9, 0xff, 0xea, 0xff, 0xae, 0xff, 0xe2, 0xff, 0xb4, 0xff, 0xdf, 0xff, 0xbd, 0xff, 0xde, 0xff, 0xc8, 0xff, 0xde, 0xff, 0xd1, 0xff, 0xdb, 0xff, 0xd7, 0xff, 0xd6, 0xff, 0xda, 0xff, 0xcf, 0xff, 0xdc, 0xff, 0xc7, 0xff, 0xdd, 0xff, 0xbe, 0xff, 0xde, 0xff, 0xb3, 0xff, 0xe2, 0xff, 0xaa, 0xff, 0xe8, 0xff, 0xa5, 0xff, 0xf0, 0xff, 0xa2, 0xff, 0xf9, 0xff, 0xa6, 0xff, 0x05, 0x00, 0xb0, 0xff, 0x14, 0x00, 0xbb, 0xff, 0x23, 0x00, 0xc2, 0xff, 0x2f, 0x00, 0xc1, 0xff, 0x37, 0x00, 0xb9, 0xff, 0x37, 0x00, 0xab, 0xff, 0x34, 0x00, 0x9e, 0xff, 0x33, 0x00, 0x99, 0xff, 0x34, 0x00, 0x9c, 0xff, 0x3b, 0x00, 0xa6, 0xff, 0x45, 0x00, 0xb4, 0xff, 0x51, 0x00, 0xc0, 0xff, 0x58, 0x00, 0xc3, 0xff, 0x59, 0x00, 0xbf, 0xff, 0x53, 0x00, 0xba, 0xff, 0x40, 0x00, 0xb4, 0xff, 0x29, 0x00, 0xb3, 0xff, 0x18, 0x00, 0xbd, 0xff, 0x15, 0x00, 0xd4, 0xff, 0x23, 0x00, 0xf1, 0xff, 0x37, 0x00, 0x08, 0x00, 0x45, 0x00, 0x12, 0x00, 0x44, 0x00, 0x11, 0x00, 0x35, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x07, 0x00, 0x08, 0x00, 0x0a, 0x00, 0xf6, 0xff, 0x11, 0x00, 0xf2, 0xff, 0x1d, 0x00, 0xfd, 0xff, 0x2b, 0x00, 0x12, 0x00, 0x3a, 0x00, 0x28, 0x00, 0x46, 0x00, 0x35, 0x00, 0x4e, 0x00, 0x34, 0x00, 0x51, 0x00, 0x25, 0x00, 0x51, 0x00, 0x11, 0x00, 0x52, 0x00, 0x01, 0x00, 0x56, 0x00, 0xf7, 0xff, 0x5c, 0x00, 0xf6, 0xff, 0x64, 0x00, 0xfd, 0xff, 0x6d, 0x00, 0x0a, 0x00, 0x78, 0x00, 0x18, 0x00, 0x84, 0x00, 0x22, 0x00, 0x8b, 0x00, 0x21, 0x00, 0x8a, 0x00, 0x13, 0x00, 0x81, 0x00, 0xfe, 0xff, 0x76, 0x00, 0xeb, 0xff, 0x72, 0x00, 0xe0, 0xff, 0x75, 0x00, 0xdb, 0xff, 0x79, 0x00, 0xde, 0xff, 0x7d, 0x00, 0xe6, 0xff, 0x7c, 0x00, 0xef, 0xff, 0x76, 0x00, 0xf7, 0xff, 0x68, 0x00, 0xfe, 0xff, 0x56, 0x00, 0x04, 0x00, 0x47, 0x00, 0x06, 0x00, 0x3f, 0x00, 0x03, 0x00, 0x3d, 0x00, 0xfc, 0xff, 0x3e, 0x00, 0xf4, 0xff, 0x3d, 0x00, 0xeb, 0xff, 0x31, 0x00, 0xe7, 0xff, 0x1e, 0x00, 0xe7, 0xff, 0x06, 0x00, 0xea, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x09, 0x00, 0xf2, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x09, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf5, 0xff, 0x21, 0x00, 0xff, 0xff, 0x29, 0x00, 0x11, 0x00, 0x2c, 0x00, 0x23, 0x00, 0x23, 0x00, 0x2c, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x01, 0x00, 0x21, 0x00, 0xf3, 0xff, 0x13, 0x00, 0xeb, 0xff, 0x06, 0x00, 0xeb, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf1, 0xff, 0x00, 0x00, 0xde, 0xff, 0xfd, 0xff, 0xca, 0xff, 0xf7, 0xff, 0xbb, 0xff, 0xee, 0xff, 0xb5, 0xff, 0xe3, 0xff, 0xb7, 0xff, 0xd4, 0xff, 0xbf, 0xff, 0xc5, 0xff, 0xce, 0xff, 0xbd, 0xff, 0xdc, 0xff, 0xc1, 0xff, 0xe2, 0xff, 0xd0, 0xff, 0xe2, 0xff, 0xe6, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xda, 0xff, 0x09, 0x00, 0xd7, 0xff, 0x07, 0x00, 0xd8, 0xff, 0xf8, 0xff, 0xdf, 0xff, 0xea, 0xff, 0xec, 0xff, 0xe5, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0x0c, 0x00, 0x11, 0x00, 0x17, 0x00, 0x36, 0x00, 0x1b, 0x00, 0x55, 0x00, 0x1c, 0x00, 0x65, 0x00, 0x1a, 0x00, 0x61, 0x00, 0x15, 0x00, 0x4d, 0x00, 0x11, 0x00, 0x35, 0x00, 0x10, 0x00, 0x27, 0x00, 0x10, 0x00, 0x25, 0x00, 0x0f, 0x00, 0x2e, 0x00, 0x0c, 0x00, 0x3e, 0x00, 0x0c, 0x00, 0x4b, 0x00, 0x0f, 0x00, 0x4f, 0x00, 0x14, 0x00, 0x47, 0x00, 0x1d, 0x00, 0x38, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x19, 0x00, 0x22, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x28, 0x00, 0x0c, 0x00, 0x34, 0x00, 0x06, 0x00, 0x3d, 0x00, 0x03, 0x00, 0x42, 0x00, 0x01, 0x00, 0x3f, 0x00, 0xff, 0xff, 0x3b, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x05, 0x00, 0x3d, 0x00, 0x0a, 0x00, 0x42, 0x00, 0x0e, 0x00, 0x4e, 0x00, 0x14, 0x00, 0x5b, 0x00, 0x19, 0x00, 0x65, 0x00, 0x19, 0x00, 0x6a, 0x00, 0x15, 0x00, 0x67, 0x00, 0x0c, 0x00, 0x5f, 0x00, 0x02, 0x00, 0x51, 0x00, 0xf6, 0xff, 0x43, 0x00, 0xec, 0xff, 0x3b, 0x00, 0xe4, 0xff, 0x39, 0x00, 0xd9, 0xff, 0x3c, 0x00, 0xc9, 0xff, 0x44, 0x00, 0xb4, 0xff, 0x4b, 0x00, 0x9c, 0xff, 0x4d, 0x00, 0x85, 0xff, 0x4d, 0x00, 0x75, 0xff, 0x4b, 0x00, 0x6f, 0xff, 0x46, 0x00, 0x6e, 0xff, 0x3e, 0x00, 0x6f, 0xff, 0x35, 0x00, 0x6e, 0xff, 0x2f, 0x00, 0x6a, 0xff, 0x2e, 0x00, 0x61, 0xff, 0x35, 0x00, 0x59, 0xff, 0x44, 0x00, 0x57, 0xff, 0x56, 0x00, 0x5d, 0xff, 0x60, 0x00, 0x69, 0xff, 0x5e, 0x00, 0x78, 0xff, 0x4f, 0x00, 0x87, 0xff, 0x37, 0x00, 0x8e, 0xff, 0x1e, 0x00, 0x8d, 0xff, 0x09, 0x00, 0x88, 0xff, 0x01, 0x00, 0x85, 0xff, 0x00, 0x00, 0x85, 0xff, 0x04, 0x00, 0x8e, 0xff, 0x0c, 0x00, 0xa2, 0xff, 0x10, 0x00, 0xba, 0xff, 0x0b, 0x00, 0xd0, 0xff, 0xfe, 0xff, 0xde, 0xff, 0xec, 0xff, 0xe2, 0xff, 0xda, 0xff, 0xdd, 0xff, 0xcd, 0xff, 0xd3, 0xff, 0xc9, 0xff, 0xc8, 0xff, 0xce, 0xff, 0xc1, 0xff, 0xd8, 0xff, 0xc5, 0xff, 0xe3, 0xff, 0xd3, 0xff, 0xeb, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xdd, 0xff, 0x02, 0x00, 0xcf, 0xff, 0x04, 0x00, 0xc4, 0xff, 0x00, 0x00, 0xbf, 0xff, 0xf9, 0xff, 0xc0, 0xff, 0xf1, 0xff, 0xc7, 0xff, 0xef, 0xff, 0xd1, 0xff, 0xf6, 0xff, 0xd9, 0xff, 0x05, 0x00, 0xdd, 0xff, 0x1c, 0x00, 0xe0, 0xff, 0x37, 0x00, 0xdd, 0xff, 0x4f, 0x00, 0xd7, 0xff, 0x5e, 0x00, 0xd1, 0xff, 0x65, 0x00, 0xcf, 0xff, 0x67, 0x00, 0xcf, 0xff, 0x66, 0x00, 0xd2, 0xff, 0x66, 0x00, 0xda, 0xff, 0x6d, 0x00, 0xe5, 0xff, 0x7e, 0x00, 0xee, 0xff, 0x95, 0x00, 0xf3, 0xff, 0xac, 0x00, 0xf2, 0xff, 0xc0, 0x00, 0xeb, 0xff, 0xc8, 0x00, 0xe2, 0xff, 0xc6, 0x00, 0xdc, 0xff, 0xbd, 0x00, 0xdb, 0xff, 0xae, 0x00, 0xdd, 0xff, 0xa1, 0x00, 0xe4, 0xff, 0x9b, 0x00, 0xef, 0xff, 0xa2, 0x00, 0xfc, 0xff, 0xb1, 0x00, 0x04, 0x00, 0xbf, 0x00, 0x06, 0x00, 0xc3, 0x00, 0x04, 0x00, 0xba, 0x00, 0xfb, 0xff, 0xa0, 0x00, 0xf0, 0xff, 0x7c, 0x00, 0xed, 0xff, 0x5d, 0x00, 0xf2, 0xff, 0x4b, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x14, 0x00, 0x5b, 0x00, 0x25, 0x00, 0x6f, 0x00, 0x2d, 0x00, 0x7c, 0x00, 0x2b, 0x00, 0x7b, 0x00, 0x25, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x55, 0x00, 0x1f, 0x00, 0x39, 0x00, 0x25, 0x00, 0x25, 0x00, 0x31, 0x00, 0x1d, 0x00, 0x3d, 0x00, 0x22, 0x00, 0x45, 0x00, 0x2c, 0x00, 0x45, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x38, 0x00, 0x32, 0x00, 0x33, 0x00, 0x26, 0x00, 0x28, 0x00, 0x20, 0x00, 0x1b, 0x00, 0x21, 0x00, 0x0e, 0x00, 0x23, 0x00, 0x00, 0x00, 0x25, 0x00, 0xf4, 0xff, 0x21, 0x00, 0xe8, 0xff, 0x13, 0x00, 0xdb, 0xff, 0x00, 0x00, 0xce, 0xff, 0xed, 0xff, 0xc4, 0xff, 0xe0, 0xff, 0xbd, 0xff, 0xda, 0xff, 0xba, 0xff, 0xda, 0xff, 0xba, 0xff, 0xdd, 0xff, 0xbb, 0xff, 0xe1, 0xff, 0xbf, 0xff, 0xe1, 0xff, 0xc4, 0xff, 0xda, 0xff, 0xc6, 0xff, 0xce, 0xff, 0xc5, 0xff, 0xbe, 0xff, 0xc3, 0xff, 0xb1, 0xff, 0xc3, 0xff, 0xaa, 0xff, 0xc5, 0xff, 0xac, 0xff, 0xc9, 0xff, 0xb3, 0xff, 0xcf, 0xff, 0xbb, 0xff, 0xd5, 0xff, 0xbf, 0xff, 0xdb, 0xff, 0xbd, 0xff, 0xe0, 0xff, 0xb5, 0xff, 0xe1, 0xff, 0xad, 0xff, 0xe1, 0xff, 0xa9, 0xff, 0xe2, 0xff, 0xac, 0xff, 0xe2, 0xff, 0xb5, 0xff, 0xe6, 0xff, 0xc3, 0xff, 0xed, 0xff, 0xd2, 0xff, 0xf8, 0xff, 0xdc, 0xff, 0x07, 0x00, 0xe3, 0xff, 0x17, 0x00, 0xe5, 0xff, 0x26, 0x00, 0xe0, 0xff, 0x2c, 0x00, 0xd7, 0xff, 0x28, 0x00, 0xcd, 0xff, 0x1f, 0x00, 0xc8, 0xff, 0x19, 0x00, 0xca, 0xff, 0x1b, 0x00, 0xd0, 0xff, 0x24, 0x00, 0xd5, 0xff, 0x31, 0x00, 0xd5, 0xff, 0x3b, 0x00, 0xd0, 0xff, 0x40, 0x00, 0xc7, 0xff, 0x3f, 0x00, 0xbd, 0xff, 0x39, 0x00, 0xb4, 0xff, 0x2f, 0x00, 0xb0, 0xff, 0x28, 0x00, 0xb6, 0xff, 0x29, 0x00, 0xc3, 0xff, 0x2f, 0x00, 0xd0, 0xff, 0x37, 0x00, 0xdc, 0xff, 0x3d, 0x00, 0xe5, 0xff, 0x3e, 0x00, 0xea, 0xff, 0x38, 0x00, 0xe7, 0xff, 0x2b, 0x00, 0xe0, 0xff, 0x18, 0x00, 0xd9, 0xff, 0x05, 0x00, 0xd6, 0xff, 0xf5, 0xff, 0xd7, 0xff, 0xe9, 0xff, 0xde, 0xff, 0xdf, 0xff, 0xe9, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xce, 0xff, 0xff, 0xff, 0xc6, 0xff, 0x05, 0x00, 0xbe, 0xff, 0x05, 0x00, 0xb6, 0xff, 0xfe, 0xff, 0xaa, 0xff, 0xf2, 0xff, 0x99, 0xff, 0xe6, 0xff, 0x83, 0xff, 0xe0, 0xff, 0x6f, 0xff, 0xe1, 0xff, 0x5e, 0xff, 0xec, 0xff, 0x55, 0xff, 0xfd, 0xff, 0x55, 0xff, 0x0f, 0x00, 0x5c, 0xff, 0x19, 0x00, 0x63, 0xff, 0x18, 0x00, 0x66, 0xff, 0x0f, 0x00, 0x66, 0xff, 0xff, 0xff, 0x61, 0xff, 0xed, 0xff, 0x5b, 0xff, 0xe0, 0xff, 0x56, 0xff, 0xde, 0xff, 0x59, 0xff, 0xe9, 0xff, 0x65, 0xff, 0xfa, 0xff, 0x72, 0xff, 0x07, 0x00, 0x7b, 0xff, 0x0a, 0x00, 0x7f, 0xff, 0x01, 0x00, 0x7b, 0xff, 0xf0, 0xff, 0x76, 0xff, 0xe0, 0xff, 0x75, 0xff, 0xd4, 0xff, 0x78, 0xff, 0xcf, 0xff, 0x7c, 0xff, 0xd2, 0xff, 0x81, 0xff, 0xdd, 0xff, 0x85, 0xff, 0xee, 0xff, 0x89, 0xff, 0xfd, 0xff, 0x8c, 0xff, 0x06, 0x00, 0x8f, 0xff, 0x05, 0x00, 0x8e, 0xff, 0xfe, 0xff, 0x8a, 0xff, 0xf1, 0xff, 0x82, 0xff, 0xe3, 0xff, 0x79, 0xff, 0xdb, 0xff, 0x75, 0xff, 0xd9, 0xff, 0x78, 0xff, 0xdf, 0xff, 0x85, 0xff, 0xeb, 0xff, 0x9c, 0xff, 0xf8, 0xff, 0xb6, 0xff, 0x00, 0x00, 0xca, 0xff, 0xfd, 0xff, 0xd3, 0xff, 0xf1, 0xff, 0xd2, 0xff, 0xe1, 0xff, 0xcc, 0xff, 0xd3, 0xff, 0xca, 0xff, 0xca, 0xff, 0xcf, 0xff, 0xcd, 0xff, 0xe2, 0xff, 0xdb, 0xff, 0x01, 0x00, 0xef, 0xff, 0x24, 0x00, 0x00, 0x00, 0x41, 0x00, 0x0c, 0x00, 0x51, 0x00, 0x12, 0x00, 0x56, 0x00, 0x12, 0x00, 0x51, 0x00, 0x10, 0x00, 0x4a, 0x00, 0x12, 0x00, 0x47, 0x00, 0x19, 0x00, 0x4e, 0x00, 0x25, 0x00, 0x5c, 0x00, 0x36, 0x00, 0x6f, 0x00, 0x4a, 0x00, 0x82, 0x00, 0x5c, 0x00, 0x8f, 0x00, 0x6b, 0x00, 0x94, 0x00, 0x73, 0x00, 0x92, 0x00, 0x77, 0x00, 0x8d, 0x00, 0x79, 0x00, 0x89, 0x00, 0x7c, 0x00, 0x87, 0x00, 0x81, 0x00, 0x88, 0x00, 0x85, 0x00, 0x89, 0x00, 0x88, 0x00, 0x87, 0x00, 0x88, 0x00, 0x81, 0x00, 0x85, 0x00, 0x77, 0x00, 0x7f, 0x00, 0x6a, 0x00, 0x78, 0x00, 0x5d, 0x00, 0x6d, 0x00, 0x4f, 0x00, 0x62, 0x00, 0x43, 0x00, 0x58, 0x00, 0x39, 0x00, 0x4e, 0x00, 0x33, 0x00, 0x43, 0x00, 0x2e, 0x00, 0x39, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x2e, 0x00, 0x28, 0x00, 0x2b, 0x00, 0x21, 0x00, 0x23, 0x00, 0x1c, 0x00, 0x17, 0x00, 0x19, 0x00, 0x08, 0x00, 0x18, 0x00, 0xfd, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x17, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfa, 0xff, 0xef, 0xff, 0xef, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xd2, 0xff, 0xbc, 0xff, 0xd5, 0xff, 0xb2, 0xff, 0xdd, 0xff, 0xb2, 0xff, 0xe7, 0xff, 0xb9, 0xff, 0xea, 0xff, 0xbd, 0xff, 0xe5, 0xff, 0xba, 0xff, 0xd8, 0xff, 0xaf, 0xff, 0xcb, 0xff, 0xa1, 0xff, 0xbf, 0xff, 0x93, 0xff, 0xb6, 0xff, 0x8b, 0xff, 0xb1, 0xff, 0x8c, 0xff, 0xb2, 0xff, 0x94, 0xff, 0xb5, 0xff, 0xa1, 0xff, 0xba, 0xff, 0xad, 0xff, 0xbd, 0xff, 0xb5, 0xff, 0xbe, 0xff, 0xb8, 0xff, 0xbc, 0xff, 0xb6, 0xff, 0xba, 0xff, 0xb2, 0xff, 0xb9, 0xff, 0xb2, 0xff, 0xb9, 0xff, 0xb4, 0xff, 0xbb, 0xff, 0xba, 0xff, 0xbd, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xc8, 0xff, 0xc7, 0xff, 0xd0, 0xff, 0xce, 0xff, 0xda, 0xff, 0xd4, 0xff, 0xe3, 0xff, 0xda, 0xff, 0xec, 0xff, 0xdd, 0xff, 0xf0, 0xff, 0xde, 0xff, 0xf1, 0xff, 0xde, 0xff, 0xee, 0xff, 0xdf, 0xff, 0xeb, 0xff, 0xe2, 0xff, 0xed, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0x12, 0x00, 0x10, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x45, 0x00, 0x28, 0x00, 0x52, 0x00, 0x31, 0x00, 0x56, 0x00, 0x38, 0x00, 0x51, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x57, 0x00, 0x64, 0x00, 0x6b, 0x00, 0x73, 0x00, 0x7f, 0x00, 0x81, 0x00, 0x90, 0x00, 0x8b, 0x00, 0x96, 0x00, 0x8e, 0x00, 0x91, 0x00, 0x88, 0x00, 0x81, 0x00, 0x7e, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x64, 0x00, 0x72, 0x00, 0x61, 0x00, 0x71, 0x00, 0x67, 0x00, 0x74, 0x00, 0x70, 0x00, 0x7a, 0x00, 0x78, 0x00, 0x81, 0x00, 0x7a, 0x00, 0x85, 0x00, 0x74, 0x00, 0x83, 0x00, 0x65, 0x00, 0x78, 0x00, 0x52, 0x00, 0x67, 0x00, 0x40, 0x00, 0x56, 0x00, 0x34, 0x00, 0x48, 0x00, 0x32, 0x00, 0x3d, 0x00, 0x35, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x33, 0x00, 0x3d, 0x00, 0x2e, 0x00, 0x3a, 0x00, 0x28, 0x00, 0x2e, 0x00, 0x1e, 0x00, 0x1b, 0x00, 0x14, 0x00, 0x08, 0x00, 0x0c, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfb, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xde, 0xff, 0x0a, 0x00, 0xc9, 0xff, 0x09, 0x00, 0xb3, 0xff, 0x02, 0x00, 0xa1, 0xff, 0xf6, 0xff, 0x95, 0xff, 0xe7, 0xff, 0x8e, 0xff, 0xd8, 0xff, 0x8e, 0xff, 0xd2, 0xff, 0x90, 0xff, 0xd5, 0xff, 0x92, 0xff, 0xe2, 0xff, 0x8e, 0xff, 0xf0, 0xff, 0x84, 0xff, 0xf8, 0xff, 0x75, 0xff, 0xf5, 0xff, 0x68, 0xff, 0xe9, 0xff, 0x63, 0xff, 0xd9, 0xff, 0x68, 0xff, 0xcd, 0xff, 0x73, 0xff, 0xca, 0xff, 0x7f, 0xff, 0xce, 0xff, 0x87, 0xff, 0xd7, 0xff, 0x8a, 0xff, 0xe2, 0xff, 0x8a, 0xff, 0xec, 0xff, 0x88, 0xff, 0xef, 0xff, 0x87, 0xff, 0xe8, 0xff, 0x8b, 0xff, 0xd9, 0xff, 0x95, 0xff, 0xc9, 0xff, 0xa4, 0xff, 0xbd, 0xff, 0xb2, 0xff, 0xb9, 0xff, 0xbd, 0xff, 0xbe, 0xff, 0xc1, 0xff, 0xc9, 0xff, 0xc1, 0xff, 0xd3, 0xff, 0xc0, 0xff, 0xda, 0xff, 0xc5, 0xff, 0xdd, 0xff, 0xcf, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xd7, 0xff, 0xed, 0xff, 0xd0, 0xff, 0xfc, 0xff, 0xc9, 0xff, 0x0b, 0x00, 0xc8, 0xff, 0x18, 0x00, 0xce, 0xff, 0x23, 0x00, 0xdc, 0xff, 0x2e, 0x00, 0xef, 0xff, 0x34, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x0c, 0x00, 0x40, 0x00, 0x10, 0x00, 0x48, 0x00, 0x0f, 0x00, 0x56, 0x00, 0x0f, 0x00, 0x67, 0x00, 0x13, 0x00, 0x7b, 0x00, 0x1e, 0x00, 0x8e, 0x00, 0x2f, 0x00, 0x9c, 0x00, 0x42, 0x00, 0xa3, 0x00, 0x53, 0x00, 0xa5, 0x00, 0x5e, 0x00, 0xa2, 0x00, 0x62, 0x00, 0x9e, 0x00, 0x5f, 0x00, 0x9b, 0x00, 0x5b, 0x00, 0x9d, 0x00, 0x5a, 0x00, 0xa2, 0x00, 0x5d, 0x00, 0xa6, 0x00, 0x63, 0x00, 0xa8, 0x00, 0x6b, 0x00, 0xa2, 0x00, 0x70, 0x00, 0x94, 0x00, 0x6e, 0x00, 0x7e, 0x00, 0x65, 0x00, 0x68, 0x00, 0x58, 0x00, 0x58, 0x00, 0x4d, 0x00, 0x51, 0x00, 0x47, 0x00, 0x50, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x42, 0x00, 0x4a, 0x00, 0x42, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x31, 0x00, 0x09, 0x00, 0x23, 0x00, 0xf2, 0xff, 0x16, 0x00, 0xe2, 0xff, 0x0c, 0x00, 0xda, 0xff, 0x07, 0x00, 0xd9, 0xff, 0x06, 0x00, 0xdb, 0xff, 0x07, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xd6, 0xff, 0x0e, 0x00, 0xcf, 0xff, 0x12, 0x00, 0xc6, 0xff, 0x14, 0x00, 0xbc, 0xff, 0x11, 0x00, 0xb1, 0xff, 0x08, 0x00, 0xa6, 0xff, 0xfb, 0xff, 0x9f, 0xff, 0xee, 0xff, 0x9c, 0xff, 0xe8, 0xff, 0x9a, 0xff, 0xe8, 0xff, 0x9c, 0xff, 0xef, 0xff, 0xa0, 0xff, 0xfc, 0xff, 0xa4, 0xff, 0x09, 0x00, 0xa5, 0xff, 0x10, 0x00, 0xa1, 0xff, 0x0e, 0x00, 0x9a, 0xff, 0x03, 0x00, 0x90, 0xff, 0xf1, 0xff, 0x88, 0xff, 0xe2, 0xff, 0x84, 0xff, 0xd8, 0xff, 0x87, 0xff, 0xd6, 0xff, 0x8d, 0xff, 0xdb, 0xff, 0x95, 0xff, 0xe1, 0xff, 0x9b, 0xff, 0xe6, 0xff, 0x9d, 0xff, 0xe8, 0xff, 0x9e, 0xff, 0xe7, 0xff, 0x9e, 0xff, 0xe6, 0xff, 0xa1, 0xff, 0xe6, 0xff, 0xab, 0xff, 0xe8, 0xff, 0xbc, 0xff, 0xed, 0xff, 0xd2, 0xff, 0xf5, 0xff, 0xe7, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x14, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xfd, 0xff, 0x21, 0x00, 0x00, 0x00, 0x23, 0x00, 0x08, 0x00, 0x22, 0x00, 0x16, 0x00, 0x22, 0x00, 0x28, 0x00, 0x25, 0x00, 0x39, 0x00, 0x2d, 0x00, 0x45, 0x00, 0x38, 0x00, 0x49, 0x00, 0x42, 0x00, 0x47, 0x00, 0x49, 0x00, 0x43, 0x00, 0x4a, 0x00, 0x42, 0x00, 0x45, 0x00, 0x44, 0x00, 0x3c, 0x00, 0x4a, 0x00, 0x35, 0x00, 0x53, 0x00, 0x35, 0x00, 0x5b, 0x00, 0x3b, 0x00, 0x5f, 0x00, 0x44, 0x00, 0x5f, 0x00, 0x4e, 0x00, 0x5b, 0x00, 0x53, 0x00, 0x55, 0x00, 0x52, 0x00, 0x50, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x41, 0x00, 0x50, 0x00, 0x3b, 0x00, 0x54, 0x00, 0x38, 0x00, 0x56, 0x00, 0x39, 0x00, 0x56, 0x00, 0x3e, 0x00, 0x52, 0x00, 0x44, 0x00, 0x45, 0x00, 0x44, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x24, 0x00, 0x33, 0x00, 0x16, 0x00, 0x24, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xda, 0xff, 0xfd, 0xff, 0xc1, 0xff, 0xef, 0xff, 0xac, 0xff, 0xdc, 0xff, 0x9e, 0xff, 0xc9, 0xff, 0x9a, 0xff, 0xbb, 0xff, 0x9b, 0xff, 0xb2, 0xff, 0x9c, 0xff, 0xaf, 0xff, 0x96, 0xff, 0xb0, 0xff, 0x86, 0xff, 0xb2, 0xff, 0x70, 0xff, 0xb3, 0xff, 0x57, 0xff, 0xad, 0xff, 0x45, 0xff, 0xa3, 0xff, 0x3e, 0xff, 0x96, 0xff, 0x41, 0xff, 0x87, 0xff, 0x4a, 0xff, 0x78, 0xff, 0x51, 0xff, 0x6d, 0xff, 0x52, 0xff, 0x69, 0xff, 0x4e, 0xff, 0x6d, 0xff, 0x47, 0xff, 0x76, 0xff, 0x43, 0xff, 0x7e, 0xff, 0x48, 0xff, 0x82, 0xff, 0x57, 0xff, 0x7f, 0xff, 0x6f, 0xff, 0x78, 0xff, 0x89, 0xff, 0x6f, 0xff, 0xa1, 0xff, 0x68, 0xff, 0xb1, 0xff, 0x64, 0xff, 0xbc, 0xff, 0x65, 0xff, 0xc3, 0xff, 0x69, 0xff, 0xca, 0xff, 0x6e, 0xff, 0xd7, 0xff, 0x74, 0xff, 0xec, 0xff, 0x79, 0xff, 0x07, 0x00, 0x7d, 0xff, 0x20, 0x00, 0x7c, 0xff, 0x34, 0x00, 0x76, 0xff, 0x42, 0x00, 0x71, 0xff, 0x4e, 0x00, 0x71, 0xff, 0x59, 0x00, 0x78, 0xff, 0x63, 0x00, 0x83, 0xff, 0x6d, 0x00, 0x91, 0xff, 0x77, 0x00, 0x9c, 0xff, 0x81, 0x00, 0xa4, 0xff, 0x8c, 0x00, 0xa8, 0xff, 0x96, 0x00, 0xaa, 0xff, 0x9f, 0x00, 0xac, 0xff, 0xa8, 0x00, 0xb2, 0xff, 0xb2, 0x00, 0xbe, 0xff, 0xbc, 0x00, 0xd3, 0xff, 0xc5, 0x00, 0xed, 0xff, 0xca, 0x00, 0x08, 0x00, 0xcc, 0x00, 0x1e, 0x00, 0xcd, 0x00, 0x2b, 0x00, 0xcd, 0x00, 0x2f, 0x00, 0xcd, 0x00, 0x2d, 0x00, 0xcf, 0x00, 0x2c, 0x00, 0xd2, 0x00, 0x2f, 0x00, 0xd5, 0x00, 0x3a, 0x00, 0xd7, 0x00, 0x4c, 0x00, 0xd6, 0x00, 0x5f, 0x00, 0xd0, 0x00, 0x6f, 0x00, 0xc8, 0x00, 0x78, 0x00, 0xbe, 0x00, 0x79, 0x00, 0xb1, 0x00, 0x72, 0x00, 0xa1, 0x00, 0x65, 0x00, 0x91, 0x00, 0x58, 0x00, 0x84, 0x00, 0x50, 0x00, 0x79, 0x00, 0x4b, 0x00, 0x6f, 0x00, 0x4c, 0x00, 0x64, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x51, 0x00, 0x43, 0x00, 0x50, 0x00, 0x30, 0x00, 0x4c, 0x00, 0x1d, 0x00, 0x44, 0x00, 0x0b, 0x00, 0x3a, 0x00, 0xfe, 0xff, 0x31, 0x00, 0xf3, 0xff, 0x2c, 0x00, 0xe8, 0xff, 0x2a, 0x00, 0xda, 0xff, 0x2b, 0x00, 0xc8, 0xff, 0x2d, 0x00, 0xb5, 0xff, 0x30, 0x00, 0xa3, 0xff, 0x2e, 0x00, 0x93, 0xff, 0x27, 0x00, 0x89, 0xff, 0x1d, 0x00, 0x84, 0xff, 0x10, 0x00, 0x82, 0xff, 0x05, 0x00, 0x81, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xfe, 0xff, 0x72, 0xff, 0x01, 0x00, 0x65, 0xff, 0x02, 0x00, 0x59, 0xff, 0x01, 0x00, 0x54, 0xff, 0xfb, 0xff, 0x56, 0xff, 0xf2, 0xff, 0x5e, 0xff, 0xe8, 0xff, 0x68, 0xff, 0xe2, 0xff, 0x71, 0xff, 0xde, 0xff, 0x72, 0xff, 0xd9, 0xff, 0x6f, 0xff, 0xd5, 0xff, 0x6b, 0xff, 0xd0, 0xff, 0x68, 0xff, 0xcb, 0xff, 0x6c, 0xff, 0xc8, 0xff, 0x76, 0xff, 0xc6, 0xff, 0x81, 0xff, 0xc6, 0xff, 0x8a, 0xff, 0xc6, 0xff, 0x8f, 0xff, 0xc8, 0xff, 0x91, 0xff, 0xca, 0xff, 0x92, 0xff, 0xc9, 0xff, 0x96, 0xff, 0xc9, 0xff, 0xa1, 0xff, 0xcb, 0xff, 0xb4, 0xff, 0xd2, 0xff, 0xcb, 0xff, 0xdc, 0xff, 0xe0, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x09, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x14, 0x00, 0x22, 0x00, 0x1c, 0x00, 0x30, 0x00, 0x26, 0x00, 0x43, 0x00, 0x30, 0x00, 0x59, 0x00, 0x3a, 0x00, 0x6c, 0x00, 0x40, 0x00, 0x78, 0x00, 0x41, 0x00, 0x7c, 0x00, 0x3f, 0x00, 0x7d, 0x00, 0x3f, 0x00, 0x7c, 0x00, 0x42, 0x00, 0x7c, 0x00, 0x4a, 0x00, 0x7e, 0x00, 0x51, 0x00, 0x81, 0x00, 0x54, 0x00, 0x85, 0x00, 0x55, 0x00, 0x88, 0x00, 0x51, 0x00, 0x89, 0x00, 0x4b, 0x00, 0x85, 0x00, 0x47, 0x00, 0x7d, 0x00, 0x47, 0x00, 0x71, 0x00, 0x4b, 0x00, 0x66, 0x00, 0x55, 0x00, 0x5d, 0x00, 0x60, 0x00, 0x56, 0x00, 0x65, 0x00, 0x51, 0x00, 0x65, 0x00, 0x4b, 0x00, 0x5e, 0x00, 0x3f, 0x00, 0x54, 0x00, 0x2f, 0x00, 0x4d, 0x00, 0x18, 0x00, 0x48, 0x00, 0x01, 0x00, 0x46, 0x00, 0xed, 0xff, 0x45, 0x00, 0xe2, 0xff, 0x44, 0x00, 0xe0, 0xff, 0x41, 0x00, 0xe0, 0xff, 0x3b, 0x00, 0xdd, 0xff, 0x2f, 0x00, 0xd2, 0xff, 0x21, 0x00, 0xbf, 0xff, 0x13, 0x00, 0xa7, 0xff, 0x06, 0x00, 0x8f, 0xff, 0xfd, 0xff, 0x7e, 0xff, 0xfa, 0xff, 0x77, 0xff, 0xfb, 0xff, 0x78, 0xff, 0xff, 0xff, 0x80, 0xff, 0x05, 0x00, 0x89, 0xff, 0x08, 0x00, 0x8d, 0xff, 0x06, 0x00, 0x8c, 0xff, 0xfe, 0xff, 0x86, 0xff, 0xef, 0xff, 0x7e, 0xff, 0xdf, 0xff, 0x79, 0xff, 0xd3, 0xff, 0x79, 0xff, 0xcf, 0xff, 0x7e, 0xff, 0xd1, 0xff, 0x86, 0xff, 0xd7, 0xff, 0x90, 0xff, 0xdd, 0xff, 0x9a, 0xff, 0xdc, 0xff, 0x9e, 0xff, 0xd0, 0xff, 0x9f, 0xff, 0xbe, 0xff, 0xa1, 0xff, 0xaa, 0xff, 0xa3, 0xff, 0x9a, 0xff, 0xa6, 0xff, 0x91, 0xff, 0xaa, 0xff, 0x90, 0xff, 0xb3, 0xff, 0x95, 0xff, 0xbf, 0xff, 0x9a, 0xff, 0xcc, 0xff, 0x9a, 0xff, 0xd8, 0xff, 0x92, 0xff, 0xe0, 0xff, 0x87, 0xff, 0xe4, 0xff, 0x7b, 0xff, 0xe3, 0xff, 0x72, 0xff, 0xe1, 0xff, 0x70, 0xff, 0xe1, 0xff, 0x75, 0xff, 0xe5, 0xff, 0x7f, 0xff, 0xef, 0xff, 0x8b, 0xff, 0xfc, 0xff, 0x93, 0xff, 0x0b, 0x00, 0x98, 0xff, 0x18, 0x00, 0x9a, 0xff, 0x21, 0x00, 0x9c, 0xff, 0x24, 0x00, 0xa1, 0xff, 0x26, 0x00, 0xac, 0xff, 0x2a, 0x00, 0xbc, 0xff, 0x32, 0x00, 0xcf, 0xff, 0x3e, 0x00, 0xe2, 0xff, 0x4c, 0x00, 0xf4, 0xff, 0x5a, 0x00, 0x04, 0x00, 0x66, 0x00, 0x13, 0x00, 0x6c, 0x00, 0x21, 0x00, 0x6e, 0x00, 0x2f, 0x00, 0x6f, 0x00, 0x3c, 0x00, 0x72, 0x00, 0x49, 0x00, 0x77, 0x00, 0x53, 0x00, 0x7f, 0x00, 0x5a, 0x00, 0x88, 0x00, 0x5f, 0x00, 0x92, 0x00, 0x63, 0x00, 0x99, 0x00, 0x66, 0x00, 0x9c, 0x00, 0x69, 0x00, 0x9c, 0x00, 0x6a, 0x00, 0x98, 0x00, 0x69, 0x00, 0x90, 0x00, 0x65, 0x00, 0x85, 0x00, 0x5e, 0x00, 0x79, 0x00, 0x54, 0x00, 0x6f, 0x00, 0x4a, 0x00, 0x69, 0x00, 0x42, 0x00, 0x66, 0x00, 0x3a, 0x00, 0x62, 0x00, 0x33, 0x00, 0x5a, 0x00, 0x2e, 0x00, 0x4d, 0x00, 0x2c, 0x00, 0x39, 0x00, 0x2d, 0x00, 0x21, 0x00, 0x2e, 0x00, 0x07, 0x00, 0x30, 0x00, 0xf0, 0xff, 0x31, 0x00, 0xe0, 0xff, 0x32, 0x00, 0xda, 0xff, 0x32, 0x00, 0xdc, 0xff, 0x31, 0x00, 0xe0, 0xff, 0x30, 0x00, 0xe0, 0xff, 0x2e, 0x00, 0xd7, 0xff, 0x2e, 0x00, 0xc4, 0xff, 0x2f, 0x00, 0xac, 0xff, 0x2f, 0x00, 0x97, 0xff, 0x30, 0x00, 0x8d, 0xff, 0x32, 0x00, 0x8c, 0xff, 0x31, 0x00, 0x91, 0xff, 0x2a, 0x00, 0x99, 0xff, 0x1e, 0x00, 0x9d, 0xff, 0x0f, 0x00, 0x97, 0xff, 0xff, 0xff, 0x88, 0xff, 0xf1, 0xff, 0x76, 0xff, 0xe9, 0xff, 0x68, 0xff, 0xe7, 0xff, 0x61, 0xff, 0xeb, 0xff, 0x65, 0xff, 0xf1, 0xff, 0x71, 0xff, 0xf7, 0xff, 0x80, 0xff, 0xf9, 0xff, 0x8c, 0xff, 0xf5, 0xff, 0x92, 0xff, 0xee, 0xff, 0x91, 0xff, 0xe8, 0xff, 0x8d, 0xff, 0xe7, 0xff, 0x8a, 0xff, 0xec, 0xff, 0x8b, 0xff, 0xf6, 0xff, 0x93, 0xff, 0x01, 0x00, 0xa0, 0xff, 0x09, 0x00, 0xaf, 0xff, 0x0c, 0x00, 0xbe, 0xff, 0x09, 0x00, 0xcb, 0xff, 0x03, 0x00, 0xd4, 0xff, 0xfc, 0xff, 0xdb, 0xff, 0xf9, 0xff, 0xe1, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0x03, 0x00, 0xea, 0xff, 0x0a, 0x00, 0xef, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x12, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x2e, 0x00, 0xff, 0xff, 0x39, 0x00, 0xf6, 0xff, 0x3e, 0x00, 0xf0, 0xff, 0x3f, 0x00, 0xee, 0xff, 0x40, 0x00, 0xf2, 0xff, 0x45, 0x00, 0xf8, 0xff, 0x4d, 0x00, 0xfd, 0xff, 0x58, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x72, 0x00, 0xfd, 0xff, 0x78, 0x00, 0xf7, 0xff, 0x77, 0x00, 0xf1, 0xff, 0x71, 0x00, 0xee, 0xff, 0x6c, 0x00, 0xf2, 0xff, 0x6a, 0x00, 0xfc, 0xff, 0x6c, 0x00, 0x08, 0x00, 0x70, 0x00, 0x11, 0x00, 0x74, 0x00, 0x16, 0x00, 0x76, 0x00, 0x16, 0x00, 0x74, 0x00, 0x13, 0x00, 0x6c, 0x00, 0x10, 0x00, 0x61, 0x00, 0x0e, 0x00, 0x55, 0x00, 0x11, 0x00, 0x4a, 0x00, 0x15, 0x00, 0x40, 0x00, 0x19, 0x00, 0x37, 0x00, 0x1c, 0x00, 0x30, 0x00, 0x19, 0x00, 0x27, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x03, 0x00, 0x10, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xe6, 0xff, 0xf9, 0xff, 0xe1, 0xff, 0xf0, 0xff, 0xe3, 0xff, 0xe9, 0xff, 0xea, 0xff, 0xe2, 0xff, 0xf1, 0xff, 0xd9, 0xff, 0xf3, 0xff, 0xd2, 0xff, 0xef, 0xff, 0xcc, 0xff, 0xe7, 0xff, 0xc9, 0xff, 0xde, 0xff, 0xc7, 0xff, 0xd7, 0xff, 0xc4, 0xff, 0xd1, 0xff, 0xc0, 0xff, 0xcf, 0xff, 0xbb, 0xff, 0xd1, 0xff, 0xb8, 0xff, 0xd6, 0xff, 0xb5, 0xff, 0xda, 0xff, 0xb5, 0xff, 0xdd, 0xff, 0xb7, 0xff, 0xde, 0xff, 0xbc, 0xff, 0xdc, 0xff, 0xc3, 0xff, 0xd7, 0xff, 0xc7, 0xff, 0xcf, 0xff, 0xc7, 0xff, 0xc7, 0xff, 0xc5, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc3, 0xff, 0xc4, 0xff, 0xc9, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xdc, 0xff, 0xd4, 0xff, 0xe7, 0xff, 0xd3, 0xff, 0xeb, 0xff, 0xce, 0xff, 0xea, 0xff, 0xc9, 0xff, 0xe9, 0xff, 0xca, 0xff, 0xec, 0xff, 0xd0, 0xff, 0xf3, 0xff, 0xd8, 0xff, 0xfd, 0xff, 0xde, 0xff, 0x07, 0x00, 0xe0, 0xff, 0x10, 0x00, 0xdf, 0xff, 0x16, 0x00, 0xdb, 0xff, 0x1a, 0x00, 0xd8, 0xff, 0x1c, 0x00, 0xd9, 0xff, 0x1c, 0x00, 0xdf, 0xff, 0x1d, 0x00, 0xe7, 0xff, 0x24, 0x00, 0xf1, 0xff, 0x31, 0x00, 0xfb, 0xff, 0x41, 0x00, 0xff, 0xff, 0x50, 0x00, 0xfe, 0xff, 0x5b, 0x00, 0xfc, 0xff, 0x62, 0x00, 0xfc, 0xff, 0x66, 0x00, 0xff, 0xff, 0x6b, 0x00, 0x07, 0x00, 0x70, 0x00, 0x11, 0x00, 0x76, 0x00, 0x1a, 0x00, 0x7d, 0x00, 0x21, 0x00, 0x83, 0x00, 0x22, 0x00, 0x87, 0x00, 0x1e, 0x00, 0x88, 0x00, 0x18, 0x00, 0x84, 0x00, 0x12, 0x00, 0x7d, 0x00, 0x10, 0x00, 0x76, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x18, 0x00, 0x68, 0x00, 0x1e, 0x00, 0x62, 0x00, 0x23, 0x00, 0x5e, 0x00, 0x27, 0x00, 0x5a, 0x00, 0x2a, 0x00, 0x55, 0x00, 0x2a, 0x00, 0x4d, 0x00, 0x28, 0x00, 0x40, 0x00, 0x25, 0x00, 0x32, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x16, 0x00, 0x34, 0x00, 0x13, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x42, 0x00, 0x0b, 0x00, 0x46, 0x00, 0x05, 0x00, 0x47, 0x00, 0xfb, 0xff, 0x44, 0x00, 0xed, 0xff, 0x3f, 0x00, 0xde, 0xff, 0x3b, 0x00, 0xcf, 0xff, 0x38, 0x00, 0xc2, 0xff, 0x39, 0x00, 0xba, 0xff, 0x3c, 0x00, 0xb5, 0xff, 0x3e, 0x00, 0xb1, 0xff, 0x3d, 0x00, 0xab, 0xff, 0x36, 0x00, 0xa2, 0xff, 0x2b, 0x00, 0x97, 0xff, 0x1e, 0x00, 0x8a, 0xff, 0x14, 0x00, 0x81, 0xff, 0x10, 0x00, 0x7b, 0xff, 0x11, 0x00, 0x78, 0xff, 0x17, 0x00, 0x78, 0xff, 0x1d, 0x00, 0x7a, 0xff, 0x21, 0x00, 0x7c, 0xff, 0x1f, 0x00, 0x7d, 0xff, 0x18, 0x00, 0x7e, 0xff, 0x10, 0x00, 0x7f, 0xff, 0x0a, 0x00, 0x80, 0xff, 0x04, 0x00, 0x82, 0xff, 0x02, 0x00, 0x86, 0xff, 0x04, 0x00, 0x8c, 0xff, 0x08, 0x00, 0x92, 0xff, 0x0b, 0x00, 0x9a, 0xff, 0x0b, 0x00, 0xa5, 0xff, 0x09, 0x00, 0xb1, 0xff, 0x03, 0x00, 0xbe, 0xff, 0xfb, 0xff, 0xcd, 0xff, 0xf5, 0xff, 0xde, 0xff, 0xf2, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x0e, 0x00, 0xff, 0xff, 0x1c, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x08, 0x00, 0x47, 0x00, 0x02, 0x00, 0x4e, 0x00, 0xf7, 0xff, 0x4f, 0x00, 0xec, 0xff, 0x4b, 0x00, 0xe3, 0xff, 0x44, 0x00, 0xde, 0xff, 0x3f, 0x00, 0xdc, 0xff, 0x3f, 0x00, 0xde, 0xff, 0x46, 0x00, 0xe5, 0xff, 0x51, 0x00, 0xed, 0xff, 0x59, 0x00, 0xf0, 0xff, 0x5d, 0x00, 0xef, 0xff, 0x5b, 0x00, 0xea, 0xff, 0x51, 0x00, 0xe2, 0xff, 0x44, 0x00, 0xde, 0xff, 0x3a, 0x00, 0xdf, 0xff, 0x37, 0x00, 0xe6, 0xff, 0x3c, 0x00, 0xef, 0xff, 0x46, 0x00, 0xf9, 0xff, 0x52, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x05, 0x00, 0x5c, 0x00, 0x07, 0x00, 0x55, 0x00, 0x04, 0x00, 0x4a, 0x00, 0xff, 0xff, 0x40, 0x00, 0xfc, 0xff, 0x3b, 0x00, 0xfe, 0xff, 0x3d, 0x00, 0x04, 0x00, 0x45, 0x00, 0x0e, 0x00, 0x4c, 0x00, 0x17, 0x00, 0x4e, 0x00, 0x1b, 0x00, 0x48, 0x00, 0x1a, 0x00, 0x3a, 0x00, 0x16, 0x00, 0x2a, 0x00, 0x11, 0x00, 0x1c, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x05, 0x00, 0x13, 0x00, 0xfc, 0xff, 0x13, 0x00, 0xed, 0xff, 0x11, 0x00, 0xda, 0xff, 0x0e, 0x00, 0xc7, 0xff, 0x0a, 0x00, 0xb7, 0xff, 0x05, 0x00, 0xac, 0xff, 0x00, 0x00, 0xa4, 0xff, 0xf8, 0xff, 0x9c, 0xff, 0xf0, 0xff, 0x92, 0xff, 0xe9, 0xff, 0x88, 0xff, 0xe6, 0xff, 0x7d, 0xff, 0xe6, 0xff, 0x71, 0xff, 0xe6, 0xff, 0x67, 0xff, 0xe5, 0xff, 0x61, 0xff, 0xe1, 0xff, 0x60, 0xff, 0xdd, 0xff, 0x64, 0xff, 0xda, 0xff, 0x6a, 0xff, 0xd8, 0xff, 0x71, 0xff, 0xd9, 0xff, 0x77, 0xff, 0xdb, 0xff, 0x79, 0xff, 0xdb, 0xff, 0x79, 0xff, 0xda, 0xff, 0x7a, 0xff, 0xda, 0xff, 0x7e, 0xff, 0xd9, 0xff, 0x86, 0xff, 0xd9, 0xff, 0x93, 0xff, 0xd9, 0xff, 0xa4, 0xff, 0xd9, 0xff, 0xb4, 0xff, 0xd8, 0xff, 0xc2, 0xff, 0xd5, 0xff, 0xcd, 0xff, 0xd2, 0xff, 0xd3, 0xff, 0xce, 0xff, 0xd6, 0xff, 0xca, 0xff, 0xd9, 0xff, 0xc8, 0xff, 0xdf, 0xff, 0xc9, 0xff, 0xe8, 0xff, 0xcb, 0xff, 0xf4, 0xff, 0xcd, 0xff, 0x02, 0x00, 0xcc, 0xff, 0x10, 0x00, 0xc8, 0xff, 0x1b, 0x00, 0xc2, 0xff, 0x22, 0x00, 0xbc, 0xff, 0x28, 0x00, 0xb8, 0xff, 0x2c, 0x00, 0xba, 0xff, 0x2f, 0x00, 0xbe, 0xff, 0x32, 0x00, 0xc5, 0xff, 0x38, 0x00, 0xca, 0xff, 0x3f, 0x00, 0xcf, 0xff, 0x49, 0x00, 0xd2, 0xff, 0x52, 0x00, 0xd2, 0xff, 0x5a, 0x00, 0xd1, 0xff, 0x62, 0x00, 0xd2, 0xff, 0x69, 0x00, 0xd5, 0xff, 0x6e, 0x00, 0xda, 0xff, 0x6f, 0x00, 0xe0, 0xff, 0x71, 0x00, 0xe6, 0xff, 0x73, 0x00, 0xec, 0xff, 0x78, 0x00, 0xf2, 0xff, 0x7f, 0x00, 0xf7, 0xff, 0x86, 0x00, 0xfc, 0xff, 0x8b, 0x00, 0x01, 0x00, 0x8d, 0x00, 0x05, 0x00, 0x89, 0x00, 0x09, 0x00, 0x7f, 0x00, 0x0b, 0x00, 0x74, 0x00, 0x0e, 0x00, 0x6a, 0x00, 0x13, 0x00, 0x64, 0x00, 0x1a, 0x00, 0x61, 0x00, 0x25, 0x00, 0x5f, 0x00, 0x30, 0x00, 0x5a, 0x00, 0x39, 0x00, 0x4f, 0x00, 0x3d, 0x00, 0x3f, 0x00, 0x3d, 0x00, 0x2c, 0x00, 0x3b, 0x00, 0x19, 0x00, 0x3c, 0x00, 0x0a, 0x00, 0x41, 0x00, 0xfe, 0xff, 0x48, 0x00, 0xf8, 0xff, 0x52, 0x00, 0xf8, 0xff, 0x5d, 0x00, 0xfa, 0xff, 0x66, 0x00, 0xfa, 0xff, 0x6a, 0x00, 0xf2, 0xff, 0x67, 0x00, 0xe4, 0xff, 0x5e, 0x00, 0xd3, 0xff, 0x53, 0x00, 0xc4, 0xff, 0x4c, 0x00, 0xbb, 0xff, 0x49, 0x00, 0xba, 0xff, 0x4b, 0x00, 0xbe, 0xff, 0x4f, 0x00, 0xc3, 0xff, 0x50, 0x00, 0xc6, 0xff, 0x4e, 0x00, 0xc5, 0xff, 0x49, 0x00, 0xbe, 0xff, 0x42, 0x00, 0xb2, 0xff, 0x39, 0x00, 0xa5, 0xff, 0x30, 0x00, 0x99, 0xff, 0x26, 0x00, 0x94, 0xff, 0x1f, 0x00, 0x95, 0xff, 0x1b, 0x00, 0x9b, 0xff, 0x1c, 0x00, 0xa2, 0xff, 0x1f, 0x00, 0xa4, 0xff, 0x22, 0x00, 0xa0, 0xff, 0x23, 0x00, 0x99, 0xff, 0x21, 0x00, 0x91, 0xff, 0x1c, 0x00, 0x8d, 0xff, 0x12, 0x00, 0x8e, 0xff, 0x07, 0x00, 0x94, 0xff, 0xfe, 0xff, 0x9e, 0xff, 0xfb, 0xff, 0xa9, 0xff, 0xfd, 0xff, 0xb3, 0xff, 0x05, 0x00, 0xbc, 0xff, 0x0d, 0x00, 0xc4, 0xff, 0x13, 0x00, 0xcc, 0xff, 0x14, 0x00, 0xd5, 0xff, 0x0e, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xeb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x1a, 0x00, 0xf8, 0xff, 0x26, 0x00, 0xfc, 0xff, 0x30, 0x00, 0xfd, 0xff, 0x39, 0x00, 0xfb, 0xff, 0x41, 0x00, 0xf7, 0xff, 0x4a, 0x00, 0xf2, 0xff, 0x53, 0x00, 0xee, 0xff, 0x5b, 0x00, 0xea, 0xff, 0x61, 0x00, 0xe6, 0xff, 0x64, 0x00, 0xe3, 0xff, 0x66, 0x00, 0xe1, 0xff, 0x65, 0x00, 0xe0, 0xff, 0x64, 0x00, 0xde, 0xff, 0x65, 0x00, 0xdc, 0xff, 0x66, 0x00, 0xdb, 0xff, 0x67, 0x00, 0xdb, 0xff, 0x6a, 0x00, 0xdc, 0xff, 0x6c, 0x00, 0xde, 0xff, 0x6c, 0x00, 0xe0, 0xff, 0x68, 0x00, 0xe0, 0xff, 0x61, 0x00, 0xde, 0xff, 0x58, 0x00, 0xda, 0xff, 0x50, 0x00, 0xd8, 0xff, 0x4a, 0x00, 0xd9, 0xff, 0x47, 0x00, 0xdd, 0xff, 0x45, 0x00, 0xe4, 0xff, 0x43, 0x00, 0xea, 0xff, 0x41, 0x00, 0xee, 0xff, 0x3e, 0x00, 0xf0, 0xff, 0x3a, 0x00, 0xf0, 0xff, 0x33, 0x00, 0xef, 0xff, 0x2c, 0x00, 0xee, 0xff, 0x24, 0x00, 0xed, 0xff, 0x1e, 0x00, 0xf0, 0xff, 0x1b, 0x00, 0xf4, 0xff, 0x1c, 0x00, 0xfa, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x22, 0x00, 0x04, 0x00, 0x23, 0x00, 0x08, 0x00, 0x1f, 0x00, 0x08, 0x00, 0x16, 0x00, 0x04, 0x00, 0x0a, 0x00, 0xfe, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xe7, 0xff, 0xed, 0xff, 0xe6, 0xff, 0xee, 0xff, 0xe5, 0xff, 0xed, 0xff, 0xe1, 0xff, 0xea, 0xff, 0xd8, 0xff, 0xe4, 0xff, 0xcd, 0xff, 0xdc, 0xff, 0xbf, 0xff, 0xd6, 0xff, 0xb1, 0xff, 0xcf, 0xff, 0xa6, 0xff, 0xcc, 0xff, 0xa0, 0xff, 0xcb, 0xff, 0x9e, 0xff, 0xcc, 0xff, 0xa0, 0xff, 0xcd, 0xff, 0xa4, 0xff, 0xcd, 0xff, 0xa7, 0xff, 0xcd, 0xff, 0xa8, 0xff, 0xcd, 0xff, 0xa8, 0xff, 0xcd, 0xff, 0xa8, 0xff, 0xd1, 0xff, 0xa9, 0xff, 0xd7, 0xff, 0xac, 0xff, 0xde, 0xff, 0xb3, 0xff, 0xe5, 0xff, 0xbe, 0xff, 0xe9, 0xff, 0xc8, 0xff, 0xeb, 0xff, 0xd0, 0xff, 0xeb, 0xff, 0xd6, 0xff, 0xed, 0xff, 0xda, 0xff, 0xf1, 0xff, 0xdc, 0xff, 0xf5, 0xff, 0xde, 0xff, 0xfa, 0xff, 0xe0, 0xff, 0xfd, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xed, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x15, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x05, 0x00, 0x1c, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x0b, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x22, 0x00, 0x0f, 0x00, 0x25, 0x00, 0x12, 0x00, 0x29, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x1b, 0x00, 0x2d, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x23, 0x00, 0x2b, 0x00, 0x25, 0x00, 0x2a, 0x00, 0x26, 0x00, 0x29, 0x00, 0x27, 0x00, 0x29, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2b, 0x00, 0x28, 0x00, 0x30, 0x00, 0x24, 0x00, 0x35, 0x00, 0x1f, 0x00, 0x39, 0x00, 0x19, 0x00, 0x3b, 0x00, 0x15, 0x00, 0x3b, 0x00, 0x15, 0x00, 0x39, 0x00, 0x16, 0x00, 0x37, 0x00, 0x17, 0x00, 0x34, 0x00, 0x15, 0x00, 0x33, 0x00, 0x11, 0x00, 0x34, 0x00, 0x0a, 0x00, 0x36, 0x00, 0x02, 0x00, 0x37, 0x00, 0xfb, 0xff, 0x35, 0x00, 0xf5, 0xff, 0x32, 0x00, 0xf1, 0xff, 0x2d, 0x00, 0xef, 0xff, 0x28, 0x00, 0xed, 0xff, 0x25, 0x00, 0xea, 0xff, 0x24, 0x00, 0xe7, 0xff, 0x25, 0x00, 0xe3, 0xff, 0x25, 0x00, 0xde, 0xff, 0x25, 0x00, 0xd7, 0xff, 0x22, 0x00, 0xcf, 0xff, 0x1d, 0x00, 0xc6, 0xff, 0x16, 0x00, 0xbd, 0xff, 0x10, 0x00, 0xb6, 0xff, 0x0b, 0x00, 0xb0, 0xff, 0x08, 0x00, 0xac, 0xff, 0x05, 0x00, 0xab, 0xff, 0x03, 0x00, 0xac, 0xff, 0x02, 0x00, 0xad, 0xff, 0x01, 0x00, 0xab, 0xff, 0xfd, 0xff, 0xa6, 0xff, 0xf6, 0xff, 0x9f, 0xff, 0xed, 0xff, 0x9a, 0xff, 0xe4, 0xff, 0x9a, 0xff, 0xdd, 0xff, 0x9e, 0xff, 0xd9, 0xff, 0xa7, 0xff, 0xd9, 0xff, 0xb2, 0xff, 0xdd, 0xff, 0xb9, 0xff, 0xe0, 0xff, 0xbd, 0xff, 0xe1, 0xff, 0xbf, 0xff, 0xe0, 0xff, 0xc1, 0xff, 0xdd, 0xff, 0xc4, 0xff, 0xd8, 0xff, 0xc9, 0xff, 0xd3, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xdd, 0xff, 0xd4, 0xff, 0xe8, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xde, 0xff, 0xf8, 0xff, 0xe1, 0xff, 0xfe, 0xff, 0xe1, 0xff, 0x02, 0x00, 0xde, 0xff, 0x07, 0x00, 0xdb, 0xff, 0x0c, 0x00, 0xd8, 0xff, 0x13, 0x00, 0xd8, 0xff, 0x1c, 0x00, 0xd9, 0xff, 0x24, 0x00, 0xdb, 0xff, 0x2c, 0x00, 0xdc, 0xff, 0x33, 0x00, 0xda, 0xff, 0x38, 0x00, 0xd6, 0xff, 0x3e, 0x00, 0xd1, 0xff, 0x43, 0x00, 0xcb, 0xff, 0x46, 0x00, 0xc6, 0xff, 0x46, 0x00, 0xc2, 0xff, 0x43, 0x00, 0xc1, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0x3d, 0x00, 0xc2, 0xff, 0x3f, 0x00, 0xc5, 0xff, 0x44, 0x00, 0xca, 0xff, 0x49, 0x00, 0xce, 0xff, 0x4c, 0x00, 0xd1, 0xff, 0x4d, 0x00, 0xd5, 0xff, 0x4c, 0x00, 0xda, 0xff, 0x4a, 0x00, 0xe1, 0xff, 0x47, 0x00, 0xe9, 0xff, 0x45, 0x00, 0xf1, 0xff, 0x46, 0x00, 0xfb, 0xff, 0x48, 0x00, 0x04, 0x00, 0x4a, 0x00, 0x0c, 0x00, 0x4a, 0x00, 0x14, 0x00, 0x48, 0x00, 0x1a, 0x00, 0x43, 0x00, 0x1e, 0x00, 0x3d, 0x00, 0x21, 0x00, 0x36, 0x00, 0x25, 0x00, 0x30, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x32, 0x00, 0x29, 0x00, 0x38, 0x00, 0x26, 0x00, 0x3b, 0x00, 0x21, 0x00, 0x3a, 0x00, 0x1c, 0x00, 0x36, 0x00, 0x16, 0x00, 0x33, 0x00, 0x10, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x34, 0x00, 0x05, 0x00, 0x37, 0x00, 0xff, 0xff, 0x3a, 0x00, 0xf9, 0xff, 0x3a, 0x00, 0xf4, 0xff, 0x37, 0x00, 0xef, 0xff, 0x30, 0x00, 0xec, 0xff, 0x29, 0x00, 0xe9, 0xff, 0x23, 0x00, 0xe6, 0xff, 0x1d, 0x00, 0xe0, 0xff, 0x19, 0x00, 0xd9, 0xff, 0x16, 0x00, 0xd3, 0xff, 0x14, 0x00, 0xcc, 0xff, 0x11, 0x00, 0xc7, 0xff, 0x0c, 0x00, 0xc5, 0xff, 0x08, 0x00, 0xc5, 0xff, 0x06, 0x00, 0xc5, 0xff, 0x04, 0x00, 0xc5, 0xff, 0x03, 0x00, 0xc5, 0xff, 0x02, 0x00, 0xc3, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xfa, 0xff, 0xbe, 0xff, 0xf5, 0xff, 0xbd, 0xff, 0xf1, 0xff, 0xbe, 0xff, 0xed, 0xff, 0xc0, 0xff, 0xeb, 0xff, 0xc3, 0xff, 0xe9, 0xff, 0xc8, 0xff, 0xe8, 0xff, 0xcc, 0xff, 0xe6, 0xff, 0xcf, 0xff, 0xe3, 0xff, 0xd3, 0xff, 0xdf, 0xff, 0xd9, 0xff, 0xdd, 0xff, 0xe2, 0xff, 0xde, 0xff, 0xec, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xe5, 0xff, 0xfe, 0xff, 0xe6, 0xff, 0x03, 0x00, 0xe7, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x09, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xe9, 0xff, 0x0e, 0x00, 0xee, 0xff, 0x12, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0x06, 0x00, 0x20, 0x00, 0x0e, 0x00, 0x20, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x13, 0x00, 0x19, 0x00, 0x12, 0x00, 0x14, 0x00, 0x11, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x18, 0x00, 0xfe, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x09, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x14, 0x00, 0x09, 0x00, 0x18, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x05, 0x00, 0x1b, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x04, 0x00, 0x25, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x14, 0x00, 0x34, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x26, 0x00, 0x42, 0x00, 0x2c, 0x00, 0x46, 0x00, 0x30, 0x00, 0x45, 0x00, 0x32, 0x00, 0x41, 0x00, 0x34, 0x00, 0x3b, 0x00, 0x38, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x32, 0x00, 0x46, 0x00, 0x2f, 0x00, 0x4b, 0x00, 0x2d, 0x00, 0x4e, 0x00, 0x2b, 0x00, 0x4e, 0x00, 0x26, 0x00, 0x4b, 0x00, 0x1f, 0x00, 0x47, 0x00, 0x16, 0x00, 0x43, 0x00, 0x0d, 0x00, 0x40, 0x00, 0x04, 0x00, 0x3c, 0x00, 0xfd, 0xff, 0x38, 0x00, 0xf9, 0xff, 0x32, 0x00, 0xf7, 0xff, 0x27, 0x00, 0xf4, 0xff, 0x19, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xf2, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xed, 0xff, 0xec, 0xff, 0xea, 0xff, 0xeb, 0xff, 0xe6, 0xff, 0xeb, 0xff, 0xe1, 0xff, 0xeb, 0xff, 0xda, 0xff, 0xed, 0xff, 0xd5, 0xff, 0xf0, 0xff, 0xd3, 0xff, 0xf5, 0xff, 0xd3, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xfd, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xd8, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0xfa, 0xff, 0xe1, 0xff, 0xf9, 0xff, 0xe2, 0xff, 0xf8, 0xff, 0xe1, 0xff, 0xf8, 0xff, 0xde, 0xff, 0xf9, 0xff, 0xdb, 0xff, 0xf8, 0xff, 0xd7, 0xff, 0xf5, 0xff, 0xd3, 0xff, 0xf2, 0xff, 0xd0, 0xff, 0xf1, 0xff, 0xcf, 0xff, 0xf0, 0xff, 0xcd, 0xff, 0xf1, 0xff, 0xca, 0xff, 0xf4, 0xff, 0xc6, 0xff, 0xfa, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xbc, 0xff, 0x04, 0x00, 0xb7, 0xff, 0x08, 0x00, 0xb6, 0xff, 0x0c, 0x00, 0xb7, 0xff, 0x10, 0x00, 0xba, 0xff, 0x16, 0x00, 0xbe, 0xff, 0x1c, 0x00, 0xc1, 0xff, 0x1f, 0x00, 0xc2, 0xff, 0x21, 0x00, 0xc1, 0xff, 0x22, 0x00, 0xc0, 0xff, 0x22, 0x00, 0xbf, 0xff, 0x23, 0x00, 0xc0, 0xff, 0x24, 0x00, 0xc2, 0xff, 0x26, 0x00, 0xc8, 0xff, 0x28, 0x00, 0xcf, 0xff, 0x2a, 0x00, 0xd6, 0xff, 0x2b, 0x00, 0xdd, 0xff, 0x2a, 0x00, 0xe2, 0xff, 0x26, 0x00, 0xe5, 0xff, 0x21, 0x00, 0xe6, 0xff, 0x1c, 0x00, 0xe7, 0xff, 0x19, 0x00, 0xe9, 0xff, 0x16, 0x00, 0xea, 0xff, 0x12, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xf1, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0x05, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x0d, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x13, 0x00, 0x19, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x16, 0x00, 0x1b, 0x00, 0x13, 0x00, 0x19, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x0c, 0x00, 0x11, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x13, 0x00, 0x10, 0x00, 0x16, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x06, 0x00, 0x13, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xf6, 0xff, 0x0b, 0x00, 0xef, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x05, 0x00, 0xe3, 0xff, 0x03, 0x00, 0xde, 0xff, 0x00, 0x00, 0xd9, 0xff, 0x00, 0x00, 0xd6, 0xff, 0xff, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xfe, 0xff, 0xd1, 0xff, 0xfc, 0xff, 0xd3, 0xff, 0xfa, 0xff, 0xd6, 0xff, 0xf7, 0xff, 0xda, 0xff, 0xf4, 0xff, 0xde, 0xff, 0xf0, 0xff, 0xe1, 0xff, 0xec, 0xff, 0xe3, 0xff, 0xe6, 0xff, 0xe5, 0xff, 0xe3, 0xff, 0xe8, 0xff, 0xe3, 0xff, 0xeb, 0xff, 0xe4, 0xff, 0xed, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xe9, 0xff, 0xde, 0xff, 0xe4, 0xff, 0xd8, 0xff, 0xe0, 0xff, 0xd5, 0xff, 0xdf, 0xff, 0xd4, 0xff, 0xdf, 0xff, 0xd4, 0xff, 0xde, 0xff, 0xd3, 0xff, 0xda, 0xff, 0xd3, 0xff, 0xd5, 0xff, 0xd3, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xc8, 0xff, 0xd2, 0xff, 0xc2, 0xff, 0xd3, 0xff, 0xbe, 0xff, 0xd5, 0xff, 0xbb, 0xff, 0xd8, 0xff, 0xbb, 0xff, 0xde, 0xff, 0xbd, 0xff, 0xe6, 0xff, 0xc1, 0xff, 0xef, 0xff, 0xc6, 0xff, 0xf7, 0xff, 0xca, 0xff, 0xff, 0xff, 0xcd, 0xff, 0x05, 0x00, 0xd0, 0xff, 0x0d, 0x00, 0xd5, 0xff, 0x17, 0x00, 0xdd, 0xff, 0x24, 0x00, 0xe5, 0xff, 0x33, 0x00, 0xeb, 0xff, 0x41, 0x00, 0xee, 0xff, 0x4c, 0x00, 0xf1, 0xff, 0x56, 0x00, 0xf8, 0xff, 0x5e, 0x00, 0x02, 0x00, 0x66, 0x00, 0x0d, 0x00, 0x6e, 0x00, 0x14, 0x00, 0x74, 0x00, 0x15, 0x00, 0x7a, 0x00, 0x12, 0x00, 0x7f, 0x00, 0x0f, 0x00, 0x85, 0x00, 0x0e, 0x00, 0x8c, 0x00, 0x0e, 0x00, 0x91, 0x00, 0x0f, 0x00, 0x92, 0x00, 0x10, 0x00, 0x8d, 0x00, 0x0f, 0x00, 0x86, 0x00, 0x0f, 0x00, 0x7e, 0x00, 0x0d, 0x00, 0x79, 0x00, 0x0a, 0x00, 0x76, 0x00, 0x05, 0x00, 0x76, 0x00, 0x00, 0x00, 0x76, 0x00, 0xfb, 0xff, 0x75, 0x00, 0xf7, 0xff, 0x71, 0x00, 0xf3, 0xff, 0x6a, 0x00, 0xef, 0xff, 0x5d, 0x00, 0xea, 0xff, 0x4f, 0x00, 0xe7, 0xff, 0x41, 0x00, 0xe7, 0xff, 0x37, 0x00, 0xe8, 0xff, 0x33, 0x00, 0xeb, 0xff, 0x31, 0x00, 0xec, 0xff, 0x2f, 0x00, 0xec, 0xff, 0x2b, 0x00, 0xeb, 0xff, 0x22, 0x00, 0xec, 0xff, 0x16, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xef, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xed, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xe7, 0xff, 0xef, 0xff, 0xe4, 0xff, 0xea, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xe5, 0xff, 0xdf, 0xff, 0xe9, 0xff, 0xdb, 0xff, 0xee, 0xff, 0xd8, 0xff, 0xf1, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0xd4, 0xff, 0xef, 0xff, 0xd2, 0xff, 0xe7, 0xff, 0xcf, 0xff, 0xdd, 0xff, 0xcc, 0xff, 0xd3, 0xff, 0xca, 0xff, 0xcc, 0xff, 0xca, 0xff, 0xc9, 0xff, 0xcc, 0xff, 0xca, 0xff, 0xd3, 0xff, 0xce, 0xff, 0xda, 0xff, 0xd1, 0xff, 0xe2, 0xff, 0xd0, 0xff, 0xe9, 0xff, 0xcc, 0xff, 0xed, 0xff, 0xc6, 0xff, 0xf2, 0xff, 0xc1, 0xff, 0xf7, 0xff, 0xc0, 0xff, 0xfe, 0xff, 0xc2, 0xff, 0x07, 0x00, 0xc8, 0xff, 0x11, 0x00, 0xd1, 0xff, 0x1a, 0x00, 0xdb, 0xff, 0x22, 0x00, 0xe4, 0xff, 0x28, 0x00, 0xea, 0xff, 0x2d, 0x00, 0xed, 0xff, 0x30, 0x00, 0xee, 0xff, 0x32, 0x00, 0xee, 0xff, 0x35, 0x00, 0xef, 0xff, 0x39, 0x00, 0xf3, 0xff, 0x3e, 0x00, 0xfb, 0xff, 0x41, 0x00, 0x04, 0x00, 0x42, 0x00, 0x0e, 0x00, 0x3f, 0x00, 0x17, 0x00, 0x3a, 0x00, 0x1e, 0x00, 0x35, 0x00, 0x21, 0x00, 0x30, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x28, 0x00, 0x27, 0x00, 0x24, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x31, 0x00, 0x1a, 0x00, 0x31, 0x00, 0x15, 0x00, 0x2d, 0x00, 0x0e, 0x00, 0x24, 0x00, 0x06, 0x00, 0x19, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf1, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xf2, 0xff, 0xef, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xd9, 0xff, 0xe8, 0xff, 0xce, 0xff, 0xe5, 0xff, 0xc8, 0xff, 0xe2, 0xff, 0xc7, 0xff, 0xe0, 0xff, 0xc7, 0xff, 0xe1, 0xff, 0xc8, 0xff, 0xe4, 0xff, 0xc6, 0xff, 0xe6, 0xff, 0xc1, 0xff, 0xe8, 0xff, 0xba, 0xff, 0xe8, 0xff, 0xb4, 0xff, 0xe6, 0xff, 0xb0, 0xff, 0xe2, 0xff, 0xaf, 0xff, 0xdc, 0xff, 0xae, 0xff, 0xd5, 0xff, 0xae, 0xff, 0xd1, 0xff, 0xad, 0xff, 0xcf, 0xff, 0xac, 0xff, 0xd0, 0xff, 0xaa, 0xff, 0xd2, 0xff, 0xa7, 0xff, 0xd6, 0xff, 0xa4, 0xff, 0xd9, 0xff, 0xa2, 0xff, 0xdc, 0xff, 0xa1, 0xff, 0xde, 0xff, 0xa4, 0xff, 0xe1, 0xff, 0xa9, 0xff, 0xe4, 0xff, 0xae, 0xff, 0xe8, 0xff, 0xb4, 0xff, 0xee, 0xff, 0xb9, 0xff, 0xf6, 0xff, 0xbd, 0xff, 0x00, 0x00, 0xc1, 0xff, 0x0c, 0x00, 0xc5, 0xff, 0x18, 0x00, 0xcb, 0xff, 0x21, 0x00, 0xd2, 0xff, 0x28, 0x00, 0xd9, 0xff, 0x2c, 0x00, 0xe1, 0xff, 0x2f, 0x00, 0xeb, 0xff, 0x33, 0x00, 0xf5, 0xff, 0x39, 0x00, 0xfd, 0xff, 0x41, 0x00, 0x04, 0x00, 0x49, 0x00, 0x08, 0x00, 0x50, 0x00, 0x0b, 0x00, 0x55, 0x00, 0x0f, 0x00, 0x58, 0x00, 0x16, 0x00, 0x5a, 0x00, 0x20, 0x00, 0x5d, 0x00, 0x2c, 0x00, 0x5f, 0x00, 0x35, 0x00, 0x62, 0x00, 0x3c, 0x00, 0x66, 0x00, 0x3f, 0x00, 0x6a, 0x00, 0x41, 0x00, 0x6d, 0x00, 0x41, 0x00, 0x6d, 0x00, 0x40, 0x00, 0x6b, 0x00, 0x40, 0x00, 0x6a, 0x00, 0x40, 0x00, 0x6a, 0x00, 0x40, 0x00, 0x6c, 0x00, 0x40, 0x00, 0x6d, 0x00, 0x3f, 0x00, 0x6e, 0x00, 0x3e, 0x00, 0x6d, 0x00, 0x3c, 0x00, 0x69, 0x00, 0x39, 0x00, 0x65, 0x00, 0x35, 0x00, 0x62, 0x00, 0x30, 0x00, 0x5e, 0x00, 0x2b, 0x00, 0x5c, 0x00, 0x26, 0x00, 0x5b, 0x00, 0x22, 0x00, 0x5c, 0x00, 0x20, 0x00, 0x5d, 0x00, 0x21, 0x00, 0x5e, 0x00, 0x24, 0x00, 0x5f, 0x00, 0x29, 0x00, 0x5e, 0x00, 0x2e, 0x00, 0x5d, 0x00, 0x31, 0x00, 0x5b, 0x00, 0x32, 0x00, 0x58, 0x00, 0x32, 0x00, 0x53, 0x00, 0x30, 0x00, 0x4b, 0x00, 0x2e, 0x00, 0x43, 0x00, 0x2d, 0x00, 0x3a, 0x00, 0x2d, 0x00, 0x33, 0x00, 0x2e, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x17, 0x00, 0x2a, 0x00, 0x0a, 0x00, 0x25, 0x00, 0xfd, 0xff, 0x1f, 0x00, 0xef, 0xff, 0x16, 0x00, 0xe3, 0xff, 0x0f, 0x00, 0xd8, 0xff, 0x09, 0x00, 0xce, 0xff, 0x05, 0x00, 0xc5, 0xff, 0x02, 0x00, 0xbb, 0xff, 0xff, 0xff, 0xb1, 0xff, 0xfb, 0xff, 0xa8, 0xff, 0xf4, 0xff, 0x9f, 0xff, 0xec, 0xff, 0x99, 0xff, 0xe5, 0xff, 0x97, 0xff, 0xe0, 0xff, 0x96, 0xff, 0xde, 0xff, 0x96, 0xff, 0xdd, 0xff, 0x97, 0xff, 0xdd, 0xff, 0x97, 0xff, 0xdd, 0xff, 0x98, 0xff, 0xdb, 0xff, 0x99, 0xff, 0xd9, 0xff, 0x9c, 0xff, 0xd5, 0xff, 0xa0, 0xff, 0xd0, 0xff, 0xa4, 0xff, 0xcd, 0xff, 0xa9, 0xff, 0xcd, 0xff, 0xb0, 0xff, 0xcd, 0xff, 0xb7, 0xff, 0xcf, 0xff, 0xbf, 0xff, 0xd2, 0xff, 0xc8, 0xff, 0xd6, 0xff, 0xd1, 0xff, 0xda, 0xff, 0xda, 0xff, 0xdf, 0xff, 0xe1, 0xff, 0xe3, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xed, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x08, 0x00, 0xf5, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x16, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xfb, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xff, 0xff, 0x1b, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x05, 0x00, 0x1f, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xf6, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xef, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xef, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xe4, 0xff, 0xe9, 0xff, 0xdf, 0xff, 0xe3, 0xff, 0xd9, 0xff, 0xdc, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xcd, 0xff, 0xcd, 0xff, 0xcf, 0xff, 0xcd, 0xff, 0xd4, 0xff, 0xce, 0xff, 0xd7, 0xff, 0xcf, 0xff, 0xd8, 0xff, 0xcf, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xd1, 0xff, 0xc7, 0xff, 0xcc, 0xff, 0xc2, 0xff, 0xcb, 0xff, 0xbf, 0xff, 0xcd, 0xff, 0xc0, 0xff, 0xd0, 0xff, 0xc6, 0xff, 0xd3, 0xff, 0xcf, 0xff, 0xd4, 0xff, 0xda, 0xff, 0xd3, 0xff, 0xe2, 0xff, 0xd3, 0xff, 0xe7, 0xff, 0xd2, 0xff, 0xe8, 0xff, 0xd3, 0xff, 0xe8, 0xff, 0xd5, 0xff, 0xe7, 0xff, 0xd6, 0xff, 0xe8, 0xff, 0xd8, 0xff, 0xed, 0xff, 0xd9, 0xff, 0xf3, 0xff, 0xda, 0xff, 0xfa, 0xff, 0xdb, 0xff, 0xfe, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xfe, 0xff, 0xe5, 0xff, 0xfc, 0xff, 0xea, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xff, 0xff, 0xee, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x12, 0x00, 0x04, 0x00, 0x17, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x0c, 0x00, 0x29, 0x00, 0x0c, 0x00, 0x2c, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x13, 0x00, 0x2e, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x2f, 0x00, 0x36, 0x00, 0x31, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x3b, 0x00, 0x36, 0x00, 0x38, 0x00, 0x3b, 0x00, 0x33, 0x00, 0x42, 0x00, 0x2d, 0x00, 0x49, 0x00, 0x29, 0x00, 0x4f, 0x00, 0x26, 0x00, 0x54, 0x00, 0x24, 0x00, 0x57, 0x00, 0x22, 0x00, 0x5a, 0x00, 0x20, 0x00, 0x5b, 0x00, 0x1d, 0x00, 0x5c, 0x00, 0x1b, 0x00, 0x5d, 0x00, 0x19, 0x00, 0x5d, 0x00, 0x15, 0x00, 0x5c, 0x00, 0x11, 0x00, 0x58, 0x00, 0x0d, 0x00, 0x54, 0x00, 0x08, 0x00, 0x50, 0x00, 0x04, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x4c, 0x00, 0xfd, 0xff, 0x4a, 0x00, 0xfa, 0xff, 0x46, 0x00, 0xf8, 0xff, 0x3f, 0x00, 0xf5, 0xff, 0x36, 0x00, 0xf1, 0xff, 0x2d, 0x00, 0xeb, 0xff, 0x25, 0x00, 0xe5, 0xff, 0x1e, 0x00, 0xdf, 0xff, 0x18, 0x00, 0xdb, 0xff, 0x12, 0x00, 0xd8, 0xff, 0x0a, 0x00, 0xd7, 0xff, 0x01, 0x00, 0xd6, 0xff, 0xf7, 0xff, 0xd5, 0xff, 0xef, 0xff, 0xd2, 0xff, 0xe9, 0xff, 0xce, 0xff, 0xe5, 0xff, 0xcb, 0xff, 0xe4, 0xff, 0xc9, 0xff, 0xe1, 0xff, 0xc9, 0xff, 0xdb, 0xff, 0xca, 0xff, 0xd1, 0xff, 0xcc, 0xff, 0xc6, 0xff, 0xcd, 0xff, 0xbd, 0xff, 0xce, 0xff, 0xb7, 0xff, 0xce, 0xff, 0xb4, 0xff, 0xcd, 0xff, 0xb5, 0xff, 0xce, 0xff, 0xb7, 0xff, 0xd1, 0xff, 0xb8, 0xff, 0xd6, 0xff, 0xb7, 0xff, 0xdb, 0xff, 0xb4, 0xff, 0xe1, 0xff, 0xb0, 0xff, 0xe5, 0xff, 0xaf, 0xff, 0xe8, 0xff, 0xb2, 0xff, 0xeb, 0xff, 0xb9, 0xff, 0xef, 0xff, 0xc1, 0xff, 0xf4, 0xff, 0xc7, 0xff, 0xfc, 0xff, 0xcb, 0xff, 0x05, 0x00, 0xce, 0xff, 0x0e, 0x00, 0xd1, 0xff, 0x15, 0x00, 0xd4, 0xff, 0x18, 0x00, 0xda, 0xff, 0x18, 0x00, 0xe1, 0xff, 0x19, 0x00, 0xe9, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x1c, 0x00, 0xfc, 0xff, 0x1d, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x1e, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x21, 0x00, 0x15, 0x00, 0x25, 0x00, 0x13, 0x00, 0x28, 0x00, 0x10, 0x00, 0x2c, 0x00, 0x0e, 0x00, 0x30, 0x00, 0x0b, 0x00, 0x33, 0x00, 0x09, 0x00, 0x36, 0x00, 0x07, 0x00, 0x36, 0x00, 0x07, 0x00, 0x33, 0x00, 0x0a, 0x00, 0x2d, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x11, 0x00, 0x21, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x17, 0x00, 0x18, 0x00, 0x18, 0x00, 0x16, 0x00, 0x1b, 0x00, 0x13, 0x00, 0x21, 0x00, 0x0f, 0x00, 0x28, 0x00, 0x07, 0x00, 0x30, 0x00, 0xfe, 0xff, 0x37, 0x00, 0xf6, 0xff, 0x3c, 0x00, 0xf1, 0xff, 0x3d, 0x00, 0xee, 0xff, 0x3b, 0x00, 0xed, 0xff, 0x38, 0x00, 0xec, 0xff, 0x36, 0x00, 0xec, 0xff, 0x37, 0x00, 0xe9, 0xff, 0x3b, 0x00, 0xe5, 0xff, 0x41, 0x00, 0xdf, 0xff, 0x45, 0x00, 0xda, 0xff, 0x47, 0x00, 0xd5, 0xff, 0x45, 0x00, 0xd3, 0xff, 0x40, 0x00, 0xd3, 0xff, 0x3a, 0x00, 0xd3, 0xff, 0x35, 0x00, 0xd2, 0xff, 0x32, 0x00, 0xd0, 0xff, 0x30, 0x00, 0xcc, 0xff, 0x31, 0x00, 0xc6, 0xff, 0x32, 0x00, 0xc1, 0xff, 0x31, 0x00, 0xbd, 0xff, 0x2d, 0x00, 0xbc, 0xff, 0x27, 0x00, 0xbc, 0xff, 0x20, 0x00, 0xbf, 0xff, 0x18, 0x00, 0xc2, 0xff, 0x12, 0x00, 0xc5, 0xff, 0x0d, 0x00, 0xc6, 0xff, 0x09, 0x00, 0xc5, 0xff, 0x08, 0x00, 0xc3, 0xff, 0x07, 0x00, 0xc2, 0xff, 0x06, 0x00, 0xc2, 0xff, 0x04, 0x00, 0xc4, 0xff, 0x01, 0x00, 0xc9, 0xff, 0xfd, 0xff, 0xcf, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0xd9, 0xff, 0xf7, 0xff, 0xdb, 0xff, 0xfb, 0xff, 0xdc, 0xff, 0x01, 0x00, 0xdd, 0xff, 0x08, 0x00, 0xe0, 0xff, 0x0d, 0x00, 0xe4, 0xff, 0x0e, 0x00, 0xeb, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x02, 0x00, 0x25, 0x00, 0xff, 0xff, 0x29, 0x00, 0xfc, 0xff, 0x2c, 0x00, 0xf8, 0xff, 0x2e, 0x00, 0xf5, 0xff, 0x30, 0x00, 0xf2, 0xff, 0x33, 0x00, 0xee, 0xff, 0x37, 0x00, 0xeb, 0xff, 0x3c, 0x00, 0xe9, 0xff, 0x41, 0x00, 0xe9, 0xff, 0x44, 0x00, 0xea, 0xff, 0x46, 0x00, 0xe9, 0xff, 0x46, 0x00, 0xe6, 0xff, 0x45, 0x00, 0xe1, 0xff, 0x45, 0x00, 0xdb, 0xff, 0x44, 0x00, 0xd7, 0xff, 0x43, 0x00, 0xd5, 0xff, 0x44, 0x00, 0xd6, 0xff, 0x46, 0x00, 0xd8, 0xff, 0x48, 0x00, 0xdb, 0xff, 0x4a, 0x00, 0xdc, 0xff, 0x49, 0x00, 0xdb, 0xff, 0x46, 0x00, 0xd9, 0xff, 0x41, 0x00, 0xd7, 0xff, 0x3c, 0x00, 0xd6, 0xff, 0x37, 0x00, 0xd7, 0xff, 0x34, 0x00, 0xda, 0xff, 0x31, 0x00, 0xdc, 0xff, 0x30, 0x00, 0xde, 0xff, 0x2e, 0x00, 0xdf, 0xff, 0x2c, 0x00, 0xde, 0xff, 0x2a, 0x00, 0xdd, 0xff, 0x27, 0x00, 0xdc, 0xff, 0x23, 0x00, 0xdc, 0xff, 0x1e, 0x00, 0xdc, 0xff, 0x18, 0x00, 0xdc, 0xff, 0x13, 0x00, 0xdc, 0xff, 0x0e, 0x00, 0xdb, 0xff, 0x09, 0x00, 0xda, 0xff, 0x04, 0x00, 0xdb, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xfa, 0xff, 0xdc, 0xff, 0xf7, 0xff, 0xdb, 0xff, 0xf4, 0xff, 0xd9, 0xff, 0xf2, 0xff, 0xd8, 0xff, 0xf0, 0xff, 0xd7, 0xff, 0xef, 0xff, 0xd7, 0xff, 0xef, 0xff, 0xda, 0xff, 0xef, 0xff, 0xde, 0xff, 0xef, 0xff, 0xe3, 0xff, 0xee, 0xff, 0xe7, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xed, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0x02, 0x00, 0xff, 0xff, 0x08, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x12, 0x00, 0x05, 0x00, 0x15, 0x00, 0x04, 0x00, 0x19, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x1e, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x1b, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1a, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x12, 0x00, 0x21, 0x00, 0x10, 0x00, 0x20, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x09, 0x00, 0x1f, 0x00, 0x04, 0x00, 0x22, 0x00, 0xff, 0xff, 0x26, 0x00, 0xf9, 0xff, 0x2a, 0x00, 0xf5, 0xff, 0x2e, 0x00, 0xf3, 0xff, 0x31, 0x00, 0xf2, 0xff, 0x33, 0x00, 0xf2, 0xff, 0x33, 0x00, 0xf2, 0xff, 0x31, 0x00, 0xf2, 0xff, 0x2f, 0x00, 0xf2, 0xff, 0x2f, 0x00, 0xf3, 0xff, 0x30, 0x00, 0xf4, 0xff, 0x32, 0x00, 0xf5, 0xff, 0x33, 0x00, 0xf5, 0xff, 0x33, 0x00, 0xf5, 0xff, 0x2f, 0x00, 0xf4, 0xff, 0x29, 0x00, 0xf4, 0xff, 0x1f, 0x00, 0xf5, 0xff, 0x14, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x03, 0x00, 0xd0, 0xff, 0x08, 0x00, 0xc8, 0xff, 0x0e, 0x00, 0xc1, 0xff, 0x13, 0x00, 0xbc, 0xff, 0x16, 0x00, 0xb9, 0xff, 0x17, 0x00, 0xb7, 0xff, 0x16, 0x00, 0xb3, 0xff, 0x15, 0x00, 0xaf, 0xff, 0x16, 0x00, 0xaa, 0xff, 0x17, 0x00, 0xa8, 0xff, 0x1a, 0x00, 0xa8, 0xff, 0x1d, 0x00, 0xab, 0xff, 0x1d, 0x00, 0xb0, 0xff, 0x1c, 0x00, 0xb3, 0xff, 0x1a, 0x00, 0xb3, 0xff, 0x18, 0x00, 0xb1, 0xff, 0x17, 0x00, 0xb0, 0xff, 0x17, 0x00, 0xb0, 0xff, 0x17, 0x00, 0xb3, 0xff, 0x18, 0x00, 0xb5, 0xff, 0x1a, 0x00, 0xb7, 0xff, 0x1c, 0x00, 0xb6, 0xff, 0x20, 0x00, 0xb5, 0xff, 0x23, 0x00, 0xb3, 0xff, 0x27, 0x00, 0xb1, 0xff, 0x29, 0x00, 0xb0, 0xff, 0x2b, 0x00, 0xb1, 0xff, 0x2c, 0x00, 0xb5, 0xff, 0x2e, 0x00, 0xb9, 0xff, 0x2f, 0x00, 0xbe, 0xff, 0x32, 0x00, 0xc0, 0xff, 0x35, 0x00, 0xc2, 0xff, 0x3a, 0x00, 0xc3, 0xff, 0x3f, 0x00, 0xc5, 0xff, 0x43, 0x00, 0xca, 0xff, 0x43, 0x00, 0xd2, 0xff, 0x3e, 0x00, 0xdb, 0xff, 0x37, 0x00, 0xe6, 0xff, 0x30, 0x00, 0xf1, 0xff, 0x2a, 0x00, 0xfc, 0xff, 0x26, 0x00, 0x06, 0x00, 0x23, 0x00, 0x10, 0x00, 0x20, 0x00, 0x1a, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x17, 0x00, 0x31, 0x00, 0x10, 0x00, 0x3d, 0x00, 0x08, 0x00, 0x49, 0x00, 0xff, 0xff, 0x53, 0x00, 0xf8, 0xff, 0x5c, 0x00, 0xf1, 0xff, 0x64, 0x00, 0xed, 0xff, 0x6b, 0x00, 0xea, 0xff, 0x71, 0x00, 0xe6, 0xff, 0x74, 0x00, 0xe1, 0xff, 0x75, 0x00, 0xdb, 0xff, 0x75, 0x00, 0xd6, 0xff, 0x75, 0x00, 0xd2, 0xff, 0x77, 0x00, 0xce, 0xff, 0x79, 0x00, 0xcb, 0xff, 0x7a, 0x00, 0xc9, 0xff, 0x77, 0x00, 0xc8, 0xff, 0x72, 0x00, 0xc9, 0xff, 0x6b, 0x00, 0xcc, 0xff, 0x63, 0x00, 0xd0, 0xff, 0x5b, 0x00, 0xd3, 0xff, 0x54, 0x00, 0xd5, 0xff, 0x4e, 0x00, 0xd6, 0xff, 0x49, 0x00, 0xd5, 0xff, 0x45, 0x00, 0xd3, 0xff, 0x3f, 0x00, 0xd3, 0xff, 0x35, 0x00, 0xd5, 0xff, 0x2a, 0x00, 0xd8, 0xff, 0x1f, 0x00, 0xdc, 0xff, 0x17, 0x00, 0xe0, 0xff, 0x13, 0x00, 0xe2, 0xff, 0x11, 0x00, 0xe1, 0xff, 0x0e, 0x00, 0xe0, 0xff, 0x08, 0x00, 0xde, 0xff, 0x00, 0x00, 0xde, 0xff, 0xf6, 0xff, 0xe0, 0xff, 0xed, 0xff, 0xe3, 0xff, 0xe7, 0xff, 0xe7, 0xff, 0xe5, 0xff, 0xeb, 0xff, 0xe4, 0xff, 0xef, 0xff, 0xe4, 0xff, 0xf3, 0xff, 0xe2, 0xff, 0xf5, 0xff, 0xdc, 0xff, 0xf7, 0xff, 0xd3, 0xff, 0xf9, 0xff, 0xc9, 0xff, 0xfc, 0xff, 0xbf, 0xff, 0x01, 0x00, 0xb8, 0xff, 0x06, 0x00, 0xb5, 0xff, 0x0a, 0x00, 0xb4, 0xff, 0x0d, 0x00, 0xb5, 0xff, 0x10, 0x00, 0xb6, 0xff, 0x12, 0x00, 0xb5, 0xff, 0x13, 0x00, 0xb3, 0xff, 0x14, 0x00, 0xaf, 0xff, 0x14, 0x00, 0xaa, 0xff, 0x15, 0x00, 0xa5, 0xff, 0x14, 0x00, 0xa2, 0xff, 0x14, 0x00, 0xa2, 0xff, 0x12, 0x00, 0xa4, 0xff, 0x11, 0x00, 0xa8, 0xff, 0x10, 0x00, 0xad, 0xff, 0x0e, 0x00, 0xb4, 0xff, 0x0b, 0x00, 0xba, 0xff, 0x08, 0x00, 0xbe, 0xff, 0x03, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xfc, 0xff, 0xbe, 0xff, 0xfb, 0xff, 0xc0, 0xff, 0xfa, 0xff, 0xc7, 0xff, 0xf8, 0xff, 0xd2, 0xff, 0xf4, 0xff, 0xdf, 0xff, 0xef, 0xff, 0xe9, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xe5, 0xff, 0xf1, 0xff, 0xe2, 0xff, 0xf1, 0xff, 0xe2, 0xff, 0xf2, 0xff, 0xe3, 0xff, 0xf7, 0xff, 0xe5, 0xff, 0x01, 0x00, 0xe6, 0xff, 0x0f, 0x00, 0xe5, 0xff, 0x1d, 0x00, 0xe2, 0xff, 0x28, 0x00, 0xdf, 0xff, 0x2f, 0x00, 0xdd, 0xff, 0x32, 0x00, 0xdd, 0xff, 0x31, 0x00, 0xde, 0xff, 0x31, 0x00, 0xe0, 0xff, 0x33, 0x00, 0xe0, 0xff, 0x39, 0x00, 0xde, 0xff, 0x42, 0x00, 0xda, 0xff, 0x4a, 0x00, 0xd5, 0xff, 0x4f, 0x00, 0xd2, 0xff, 0x4f, 0x00, 0xd0, 0xff, 0x4b, 0x00, 0xd0, 0xff, 0x46, 0x00, 0xd2, 0xff, 0x42, 0x00, 0xd3, 0xff, 0x41, 0x00, 0xd4, 0xff, 0x41, 0x00, 0xd4, 0xff, 0x41, 0x00, 0xd4, 0xff, 0x41, 0x00, 0xd5, 0xff, 0x3f, 0x00, 0xd8, 0xff, 0x3c, 0x00, 0xdc, 0xff, 0x37, 0x00, 0xe1, 0xff, 0x32, 0x00, 0xe6, 0xff, 0x2d, 0x00, 0xeb, 0xff, 0x27, 0x00, 0xf1, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x17, 0x00, 0x07, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x09, 0x00, 0x14, 0x00, 0x02, 0x00, 0x16, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xee, 0xff, 0x19, 0x00, 0xe2, 0xff, 0x1d, 0x00, 0xd7, 0xff, 0x24, 0x00, 0xce, 0xff, 0x2b, 0x00, 0xc7, 0xff, 0x2f, 0x00, 0xc4, 0xff, 0x30, 0x00, 0xc3, 0xff, 0x2f, 0x00, 0xc1, 0xff, 0x2d, 0x00, 0xbd, 0xff, 0x2b, 0x00, 0xb7, 0xff, 0x2a, 0x00, 0xae, 0xff, 0x2b, 0x00, 0xa7, 0xff, 0x2d, 0x00, 0xa4, 0xff, 0x2f, 0x00, 0xa6, 0xff, 0x31, 0x00, 0xac, 0xff, 0x31, 0x00, 0xb4, 0xff, 0x30, 0x00, 0xb9, 0xff, 0x2f, 0x00, 0xbb, 0xff, 0x2c, 0x00, 0xba, 0xff, 0x29, 0x00, 0xb9, 0xff, 0x24, 0x00, 0xb9, 0xff, 0x1e, 0x00, 0xbb, 0xff, 0x18, 0x00, 0xc1, 0xff, 0x12, 0x00, 0xc8, 0xff, 0x0d, 0x00, 0xd1, 0xff, 0x0a, 0x00, 0xd8, 0xff, 0x08, 0x00, 0xdd, 0xff, 0x05, 0x00, 0xdf, 0xff, 0x01, 0x00, 0xe0, 0xff, 0xfb, 0xff, 0xe1, 0xff, 0xf5, 0xff, 0xe5, 0xff, 0xf0, 0xff, 0xed, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xed, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x14, 0x00, 0xf6, 0xff, 0x1a, 0x00, 0xf7, 0xff, 0x1e, 0x00, 0xf5, 0xff, 0x22, 0x00, 0xf1, 0xff, 0x28, 0x00, 0xed, 0xff, 0x2f, 0x00, 0xeb, 0xff, 0x38, 0x00, 0xec, 0xff, 0x41, 0x00, 0xf1, 0xff, 0x4a, 0x00, 0xf8, 0xff, 0x52, 0x00, 0xfe, 0xff, 0x58, 0x00, 0x02, 0x00, 0x5c, 0x00, 0x03, 0x00, 0x5e, 0x00, 0x03, 0x00, 0x5f, 0x00, 0x01, 0x00, 0x61, 0x00, 0xff, 0xff, 0x64, 0x00, 0xff, 0xff, 0x69, 0x00, 0x01, 0x00, 0x70, 0x00, 0x06, 0x00, 0x76, 0x00, 0x0d, 0x00, 0x7a, 0x00, 0x14, 0x00, 0x7a, 0x00, 0x1b, 0x00, 0x75, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x23, 0x00, 0x65, 0x00, 0x25, 0x00, 0x5f, 0x00, 0x26, 0x00, 0x5c, 0x00, 0x28, 0x00, 0x5b, 0x00, 0x2b, 0x00, 0x5a, 0x00, 0x2e, 0x00, 0x57, 0x00, 0x31, 0x00, 0x52, 0x00, 0x33, 0x00, 0x48, 0x00, 0x32, 0x00, 0x3b, 0x00, 0x2f, 0x00, 0x2d, 0x00, 0x2a, 0x00, 0x21, 0x00, 0x24, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x08, 0x00, 0x17, 0x00, 0x01, 0x00, 0x17, 0x00, 0xf7, 0xff, 0x17, 0x00, 0xeb, 0xff, 0x16, 0x00, 0xdf, 0xff, 0x13, 0x00, 0xd2, 0xff, 0x11, 0x00, 0xc8, 0xff, 0x11, 0x00, 0xbf, 0xff, 0x15, 0x00, 0xb7, 0xff, 0x1b, 0x00, 0xb1, 0xff, 0x20, 0x00, 0xac, 0xff, 0x24, 0x00, 0xa8, 0xff, 0x25, 0x00, 0xa4, 0xff, 0x24, 0x00, 0x9e, 0xff, 0x22, 0x00, 0x98, 0xff, 0x1f, 0x00, 0x90, 0xff, 0x1c, 0x00, 0x89, 0xff, 0x19, 0x00, 0x84, 0xff, 0x16, 0x00, 0x82, 0xff, 0x13, 0x00, 0x84, 0xff, 0x0f, 0x00, 0x88, 0xff, 0x0a, 0x00, 0x8d, 0xff, 0x04, 0x00, 0x90, 0xff, 0xfe, 0xff, 0x92, 0xff, 0xf7, 0xff, 0x92, 0xff, 0xf0, 0xff, 0x92, 0xff, 0xe9, 0xff, 0x94, 0xff, 0xe3, 0xff, 0x98, 0xff, 0xdf, 0xff, 0xa1, 0xff, 0xdb, 0xff, 0xab, 0xff, 0xd7, 0xff, 0xb7, 0xff, 0xd1, 0xff, 0xc1, 0xff, 0xcb, 0xff, 0xc7, 0xff, 0xc5, 0xff, 0xcc, 0xff, 0xbf, 0xff, 0xd0, 0xff, 0xba, 0xff, 0xd5, 0xff, 0xb8, 0xff, 0xdd, 0xff, 0xb8, 0xff, 0xe6, 0xff, 0xbb, 0xff, 0xf0, 0xff, 0xbd, 0xff, 0xfb, 0xff, 0xbd, 0xff, 0x04, 0x00, 0xbd, 0xff, 0x0d, 0x00, 0xbb, 0xff, 0x16, 0x00, 0xbb, 0xff, 0x1e, 0x00, 0xbd, 0xff, 0x27, 0x00, 0xc1, 0xff, 0x31, 0x00, 0xc7, 0xff, 0x3b, 0x00, 0xcf, 0xff, 0x43, 0x00, 0xd6, 0xff, 0x4b, 0x00, 0xdc, 0xff, 0x52, 0x00, 0xe1, 0xff, 0x5a, 0x00, 0xe4, 0xff, 0x63, 0x00, 0xe7, 0xff, 0x6b, 0x00, 0xea, 0xff, 0x70, 0x00, 0xed, 0xff, 0x72, 0x00, 0xef, 0xff, 0x71, 0x00, 0xee, 0xff, 0x6f, 0x00, 0xed, 0xff, 0x6d, 0x00, 0xec, 0xff, 0x6b, 0x00, 0xeb, 0xff, 0x68, 0x00, 0xea, 0xff, 0x64, 0x00, 0xea, 0xff, 0x60, 0x00, 0xea, 0xff, 0x5a, 0x00, 0xea, 0xff, 0x51, 0x00, 0xe9, 0xff, 0x46, 0x00, 0xe9, 0xff, 0x3b, 0x00, 0xe9, 0xff, 0x32, 0x00, 0xed, 0xff, 0x2a, 0x00, 0xf5, 0xff, 0x23, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x14, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x09, 0x00, 0x1c, 0x00, 0x05, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x22, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x32, 0x00, 0xff, 0xff, 0x38, 0x00, 0xfc, 0xff, 0x3b, 0x00, 0xfa, 0xff, 0x39, 0x00, 0xf7, 0xff, 0x36, 0x00, 0xf4, 0xff, 0x31, 0x00, 0xf2, 0xff, 0x2d, 0x00, 0xf1, 0xff, 0x29, 0x00, 0xef, 0xff, 0x26, 0x00, 0xed, 0xff, 0x25, 0x00, 0xea, 0xff, 0x24, 0x00, 0xe6, 0xff, 0x23, 0x00, 0xe3, 0xff, 0x21, 0x00, 0xdf, 0xff, 0x1f, 0x00, 0xda, 0xff, 0x1c, 0x00, 0xd6, 0xff, 0x18, 0x00, 0xd1, 0xff, 0x12, 0x00, 0xcc, 0xff, 0x0c, 0x00, 0xc8, 0xff, 0x05, 0x00, 0xc5, 0xff, 0x00, 0x00, 0xc2, 0xff, 0xfe, 0xff, 0xc0, 0xff, 0xfe, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xfd, 0xff, 0xb7, 0xff, 0xf8, 0xff, 0xb4, 0xff, 0xf1, 0xff, 0xb2, 0xff, 0xe7, 0xff, 0xb4, 0xff, 0xde, 0xff, 0xb8, 0xff, 0xd8, 0xff, 0xbe, 0xff, 0xd6, 0xff, 0xc4, 0xff, 0xd9, 0xff, 0xc8, 0xff, 0xde, 0xff, 0xcb, 0xff, 0xe1, 0xff, 0xcc, 0xff, 0xe0, 0xff, 0xcd, 0xff, 0xdb, 0xff, 0xd0, 0xff, 0xd7, 0xff, 0xd5, 0xff, 0xd4, 0xff, 0xde, 0xff, 0xd4, 0xff, 0xe9, 0xff, 0xd8, 0xff, 0xf5, 0xff, 0xdd, 0xff, 0x00, 0x00, 0xe2, 0xff, 0x09, 0x00, 0xe5, 0xff, 0x0f, 0x00, 0xe6, 0xff, 0x15, 0x00, 0xe6, 0xff, 0x1a, 0x00, 0xe6, 0xff, 0x20, 0x00, 0xe5, 0xff, 0x27, 0x00, 0xe5, 0xff, 0x2f, 0x00, 0xe7, 0xff, 0x37, 0x00, 0xeb, 0xff, 0x3f, 0x00, 0xef, 0xff, 0x45, 0x00, 0xf2, 0xff, 0x49, 0x00, 0xf6, 0xff, 0x4b, 0x00, 0xf8, 0xff, 0x4c, 0x00, 0xfb, 0xff, 0x4d, 0x00, 0xfe, 0xff, 0x4e, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x02, 0x00, 0x4f, 0x00, 0x04, 0x00, 0x4e, 0x00, 0x07, 0x00, 0x4b, 0x00, 0x0b, 0x00, 0x47, 0x00, 0x10, 0x00, 0x43, 0x00, 0x15, 0x00, 0x3d, 0x00, 0x18, 0x00, 0x36, 0x00, 0x19, 0x00, 0x2f, 0x00, 0x18, 0x00, 0x29, 0x00, 0x17, 0x00, 0x22, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x19, 0x00, 0x16, 0x00, 0x1d, 0x00, 0x11, 0x00, 0x25, 0x00, 0x0c, 0x00, 0x2d, 0x00, 0x07, 0x00, 0x34, 0x00, 0x01, 0x00, 0x39, 0x00, 0xfa, 0xff, 0x3c, 0x00, 0xf2, 0xff, 0x3e, 0x00, 0xec, 0xff, 0x40, 0x00, 0xe7, 0xff, 0x44, 0x00, 0xe3, 0xff, 0x49, 0x00, 0xe1, 0xff, 0x4f, 0x00, 0xe0, 0xff, 0x54, 0x00, 0xde, 0xff, 0x57, 0x00, 0xdd, 0xff, 0x56, 0x00, 0xda, 0xff, 0x54, 0x00, 0xd5, 0xff, 0x51, 0x00, 0xcf, 0xff, 0x4e, 0x00, 0xc9, 0xff, 0x4a, 0x00, 0xc4, 0xff, 0x45, 0x00, 0xc1, 0xff, 0x3e, 0x00, 0xc1, 0xff, 0x37, 0x00, 0xc4, 0xff, 0x2f, 0x00, 0xc7, 0xff, 0x26, 0x00, 0xc8, 0xff, 0x1c, 0x00, 0xc7, 0xff, 0x12, 0x00, 0xc4, 0xff, 0x06, 0x00, 0xc0, 0xff, 0xfa, 0xff, 0xbc, 0xff, 0xed, 0xff, 0xbb, 0xff, 0xe1, 0xff, 0xbd, 0xff, 0xd7, 0xff, 0xc1, 0xff, 0xcf, 0xff, 0xc6, 0xff, 0xcb, 0xff, 0xcb, 0xff, 0xc8, 0xff, 0xcd, 0xff, 0xc5, 0xff, 0xcc, 0xff, 0xc0, 0xff, 0xcb, 0xff, 0xba, 0xff, 0xcb, 0xff, 0xb3, 0xff, 0xd0, 0xff, 0xb0, 0xff, 0xd9, 0xff, 0xb0, 0xff, 0xe4, 0xff, 0xb5, 0xff, 0xf0, 0xff, 0xbc, 0xff, 0xfa, 0xff, 0xc3, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x03, 0x00, 0xc9, 0xff, 0x04, 0x00, 0xca, 0xff, 0x07, 0x00, 0xca, 0xff, 0x0d, 0x00, 0xcd, 0xff, 0x16, 0x00, 0xd3, 0xff, 0x22, 0x00, 0xdd, 0xff, 0x2e, 0x00, 0xe8, 0xff, 0x39, 0x00, 0xf2, 0xff, 0x40, 0x00, 0xf9, 0xff, 0x43, 0x00, 0xfd, 0xff, 0x44, 0x00, 0xfe, 0xff, 0x43, 0x00, 0xfd, 0xff, 0x43, 0x00, 0xfe, 0xff, 0x45, 0x00, 0x01, 0x00, 0x48, 0x00, 0x06, 0x00, 0x4c, 0x00, 0x0b, 0x00, 0x4e, 0x00, 0x11, 0x00, 0x4f, 0x00, 0x14, 0x00, 0x4d, 0x00, 0x16, 0x00, 0x4a, 0x00, 0x16, 0x00, 0x47, 0x00, 0x15, 0x00, 0x45, 0x00, 0x13, 0x00, 0x44, 0x00, 0x13, 0x00, 0x45, 0x00, 0x14, 0x00, 0x46, 0x00, 0x18, 0x00, 0x47, 0x00, 0x1e, 0x00, 0x48, 0x00, 0x25, 0x00, 0x48, 0x00, 0x29, 0x00, 0x47, 0x00, 0x2b, 0x00, 0x46, 0x00, 0x2b, 0x00, 0x43, 0x00, 0x2a, 0x00, 0x3f, 0x00, 0x29, 0x00, 0x3b, 0x00, 0x2a, 0x00, 0x37, 0x00, 0x30, 0x00, 0x33, 0x00, 0x38, 0x00, 0x30, 0x00, 0x40, 0x00, 0x2d, 0x00, 0x46, 0x00, 0x2a, 0x00, 0x48, 0x00, 0x26, 0x00, 0x46, 0x00, 0x20, 0x00, 0x43, 0x00, 0x18, 0x00, 0x40, 0x00, 0x0e, 0x00, 0x3f, 0x00, 0x04, 0x00, 0x40, 0x00, 0xfa, 0xff, 0x43, 0x00, 0xf1, 0xff, 0x44, 0x00, 0xea, 0xff, 0x42, 0x00, 0xe4, 0xff, 0x3c, 0x00, 0xde, 0xff, 0x32, 0x00, 0xd7, 0xff, 0x27, 0x00, 0xcf, 0xff, 0x1d, 0x00, 0xc6, 0xff, 0x17, 0x00, 0xbe, 0xff, 0x13, 0x00, 0xb5, 0xff, 0x10, 0x00, 0xad, 0xff, 0x0c, 0x00, 0xa6, 0xff, 0x07, 0x00, 0xa1, 0xff, 0xff, 0xff, 0x9d, 0xff, 0xf7, 0xff, 0x9b, 0xff, 0xf0, 0xff, 0x9a, 0xff, 0xea, 0xff, 0x99, 0xff, 0xe7, 0xff, 0x9a, 0xff, 0xe4, 0xff, 0x9b, 0xff, 0xe1, 0xff, 0x9f, 0xff, 0xdd, 0xff, 0xa4, 0xff, 0xd8, 0xff, 0xab, 0xff, 0xd3, 0xff, 0xb0, 0xff, 0xcf, 0xff, 0xb5, 0xff, 0xcb, 0xff, 0xb8, 0xff, 0xc8, 0xff, 0xba, 0xff, 0xc4, 0xff, 0xbb, 0xff, 0xc0, 0xff, 0xbd, 0xff, 0xbd, 0xff, 0xc0, 0xff, 0xbb, 0xff, 0xc4, 0xff, 0xba, 0xff, 0xcb, 0xff, 0xb9, 0xff, 0xd2, 0xff, 0xba, 0xff, 0xd6, 0xff, 0xba, 0xff, 0xd7, 0xff, 0xbb, 0xff, 0xd5, 0xff, 0xbb, 0xff, 0xd2, 0xff, 0xba, 0xff, 0xd1, 0xff, 0xbb, 0xff, 0xd2, 0xff, 0xbd, 0xff, 0xd6, 0xff, 0xc2, 0xff, 0xdd, 0xff, 0xc8, 0xff, 0xe4, 0xff, 0xce, 0xff, 0xeb, 0xff, 0xd3, 0xff, 0xf0, 0xff, 0xd6, 0xff, 0xf4, 0xff, 0xd8, 0xff, 0xf7, 0xff, 0xd9, 0xff, 0xf9, 0xff, 0xdb, 0xff, 0xfc, 0xff, 0xdf, 0xff, 0x00, 0x00, 0xe2, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x12, 0x00, 0xe9, 0xff, 0x17, 0x00, 0xe9, 0xff, 0x1b, 0x00, 0xe8, 0xff, 0x1d, 0x00, 0xe8, 0xff, 0x1e, 0x00, 0xe9, 0xff, 0x1e, 0x00, 0xea, 0xff, 0x20, 0x00, 0xec, 0xff, 0x23, 0x00, 0xef, 0xff, 0x28, 0x00, 0xf3, 0xff, 0x2e, 0x00, 0xf7, 0xff, 0x36, 0x00, 0xfd, 0xff, 0x3d, 0x00, 0x02, 0x00, 0x41, 0x00, 0x06, 0x00, 0x44, 0x00, 0x09, 0x00, 0x46, 0x00, 0x0b, 0x00, 0x48, 0x00, 0x0b, 0x00, 0x4a, 0x00, 0x0c, 0x00, 0x4d, 0x00, 0x0e, 0x00, 0x4f, 0x00, 0x12, 0x00, 0x50, 0x00, 0x18, 0x00, 0x4e, 0x00, 0x1d, 0x00, 0x4b, 0x00, 0x21, 0x00, 0x45, 0x00, 0x21, 0x00, 0x3d, 0x00, 0x1f, 0x00, 0x36, 0x00, 0x1b, 0x00, 0x2f, 0x00, 0x18, 0x00, 0x29, 0x00, 0x18, 0x00, 0x22, 0x00, 0x19, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x1c, 0x00, 0xfe, 0xff, 0x19, 0x00, 0xf4, 0xff, 0x14, 0x00, 0xeb, 0xff, 0x0e, 0x00, 0xe3, 0xff, 0x08, 0x00, 0xdb, 0xff, 0x03, 0x00, 0xd3, 0xff, 0xff, 0xff, 0xcc, 0xff, 0xfd, 0xff, 0xc6, 0xff, 0xfd, 0xff, 0xc1, 0xff, 0xfc, 0xff, 0xbc, 0xff, 0xf9, 0xff, 0xb6, 0xff, 0xf5, 0xff, 0xb1, 0xff, 0xf0, 0xff, 0xad, 0xff, 0xec, 0xff, 0xab, 0xff, 0xeb, 0xff, 0xaa, 0xff, 0xeb, 0xff, 0xad, 0xff, 0xee, 0xff, 0xb2, 0xff, 0xf2, 0xff, 0xba, 0xff, 0xf6, 0xff, 0xc2, 0xff, 0xfa, 0xff, 0xca, 0xff, 0xfc, 0xff, 0xcf, 0xff, 0xfd, 0xff, 0xd4, 0xff, 0xfe, 0xff, 0xd7, 0xff, 0x00, 0x00, 0xdd, 0xff, 0x03, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xee, 0xff, 0x0b, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0x06, 0x00, 0x11, 0x00, 0x10, 0x00, 0x12, 0x00, 0x17, 0x00, 0x11, 0x00, 0x19, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x21, 0x00, 0x09, 0x00, 0x26, 0x00, 0x08, 0x00, 0x2b, 0x00, 0x08, 0x00, 0x30, 0x00, 0x06, 0x00, 0x35, 0x00, 0x04, 0x00, 0x38, 0x00, 0x01, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x01, 0x00, 0x44, 0x00, 0x04, 0x00, 0x4c, 0x00, 0x07, 0x00, 0x55, 0x00, 0x0a, 0x00, 0x5d, 0x00, 0x0b, 0x00, 0x63, 0x00, 0x09, 0x00, 0x69, 0x00, 0x07, 0x00, 0x6f, 0x00, 0x04, 0x00, 0x75, 0x00, 0x03, 0x00, 0x79, 0x00, 0x04, 0x00, 0x7c, 0x00, 0x06, 0x00, 0x7e, 0x00, 0x08, 0x00, 0x80, 0x00, 0x09, 0x00, 0x80, 0x00, 0x08, 0x00, 0x80, 0x00, 0x05, 0x00, 0x7e, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x02, 0x00, 0x69, 0x00, 0x04, 0x00, 0x61, 0x00, 0x04, 0x00, 0x59, 0x00, 0x02, 0x00, 0x51, 0x00, 0xfe, 0xff, 0x49, 0x00, 0xf8, 0xff, 0x40, 0x00, 0xf4, 0xff, 0x37, 0x00, 0xf0, 0xff, 0x2c, 0x00, 0xef, 0xff, 0x20, 0x00, 0xee, 0xff, 0x15, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xe9, 0xff, 0x04, 0x00, 0xe5, 0xff, 0xfd, 0xff, 0xe0, 0xff, 0xf5, 0xff, 0xdc, 0xff, 0xeb, 0xff, 0xda, 0xff, 0xe0, 0xff, 0xdb, 0xff, 0xd5, 0xff, 0xdd, 0xff, 0xcb, 0xff, 0xe1, 0xff, 0xc2, 0xff, 0xe3, 0xff, 0xbc, 0xff, 0xe2, 0xff, 0xb7, 0xff, 0xe1, 0xff, 0xb2, 0xff, 0xe0, 0xff, 0xac, 0xff, 0xe1, 0xff, 0xa4, 0xff, 0xe6, 0xff, 0x9c, 0xff, 0xed, 0xff, 0x96, 0xff, 0xf5, 0xff, 0x91, 0xff, 0xfd, 0xff, 0x8e, 0xff, 0x02, 0x00, 0x8d, 0xff, 0x04, 0x00, 0x8c, 0xff, 0x06, 0x00, 0x8b, 0xff, 0x07, 0x00, 0x8a, 0xff, 0x0a, 0x00, 0x8a, 0xff, 0x0c, 0x00, 0x8c, 0xff, 0x0e, 0x00, 0x92, 0xff, 0x0f, 0x00, 0x9a, 0xff, 0x0e, 0x00, 0xa2, 0xff, 0x0c, 0x00, 0xaa, 0xff, 0x0a, 0x00, 0xb1, 0xff, 0x0a, 0x00, 0xb7, 0xff, 0x0c, 0x00, 0xbd, 0xff, 0x11, 0x00, 0xc4, 0xff, 0x15, 0x00, 0xcc, 0xff, 0x18, 0x00, 0xd5, 0xff, 0x19, 0x00, 0xdf, 0xff, 0x17, 0x00, 0xe8, 0xff, 0x14, 0x00, 0xf0, 0xff, 0x12, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x14, 0x00, 0x01, 0x00, 0x18, 0x00, 0x06, 0x00, 0x1b, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x16, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x17, 0x00, 0x17, 0x00, 0x19, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x0a, 0x00, 0x2c, 0x00, 0x0c, 0x00, 0x2d, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x12, 0x00, 0x28, 0x00, 0x12, 0x00, 0x25, 0x00, 0x0f, 0x00, 0x25, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x09, 0x00, 0x2e, 0x00, 0x08, 0x00, 0x33, 0x00, 0x0c, 0x00, 0x36, 0x00, 0x11, 0x00, 0x36, 0x00, 0x17, 0x00, 0x34, 0x00, 0x1a, 0x00, 0x30, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x15, 0x00, 0x2e, 0x00, 0x0f, 0x00, 0x2f, 0x00, 0x09, 0x00, 0x30, 0x00, 0x07, 0x00, 0x30, 0x00, 0x09, 0x00, 0x2d, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x0b, 0x00, 0xec, 0xff, 0x10, 0x00, 0xe4, 0xff, 0x16, 0x00, 0xdc, 0xff, 0x1c, 0x00, 0xd3, 0xff, 0x1f, 0x00, 0xca, 0xff, 0x20, 0x00, 0xc1, 0xff, 0x21, 0x00, 0xba, 0xff, 0x23, 0x00, 0xb5, 0xff, 0x26, 0x00, 0xb2, 0xff, 0x29, 0x00, 0xb1, 0xff, 0x28, 0x00, 0xb2, 0xff, 0x25, 0x00, 0xb5, 0xff, 0x1f, 0x00, 0xb9, 0xff, 0x18, 0x00, 0xbd, 0xff, 0x12, 0x00, 0xbf, 0xff, 0x10, 0x00, 0xbe, 0xff, 0x10, 0x00, 0xbd, 0xff, 0x12, 0x00, 0xbd, 0xff, 0x14, 0x00, 0xc0, 0xff, 0x13, 0x00, 0xc5, 0xff, 0x0e, 0x00, 0xcb, 0xff, 0x07, 0x00, 0xd0, 0xff, 0x01, 0x00, 0xd4, 0xff, 0xfd, 0xff, 0xd5, 0xff, 0xfd, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xd9, 0xff, 0x02, 0x00, 0xdc, 0xff, 0x03, 0x00, 0xdf, 0xff, 0x01, 0x00, 0xe4, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xef, 0xff, 0xed, 0xff, 0xed, 0xff, 0xef, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe1, 0xff, 0x04, 0x00, 0xdb, 0xff, 0x06, 0x00, 0xd4, 0xff, 0x05, 0x00, 0xce, 0xff, 0x04, 0x00, 0xc9, 0xff, 0x03, 0x00, 0xc5, 0xff, 0x05, 0x00, 0xc1, 0xff, 0x09, 0x00, 0xbe, 0xff, 0x0e, 0x00, 0xbd, 0xff, 0x14, 0x00, 0xbc, 0xff, 0x1a, 0x00, 0xbc, 0xff, 0x1e, 0x00, 0xbb, 0xff, 0x22, 0x00, 0xb8, 0xff, 0x24, 0x00, 0xb5, 0xff, 0x25, 0x00, 0xb2, 0xff, 0x25, 0x00, 0xaf, 0xff, 0x24, 0x00, 0xad, 0xff, 0x24, 0x00, 0xac, 0xff, 0x23, 0x00, 0xaa, 0xff, 0x22, 0x00, 0xa9, 0xff, 0x22, 0x00, 0xa7, 0xff, 0x23, 0x00, 0xa6, 0xff, 0x23, 0x00, 0xa7, 0xff, 0x23, 0x00, 0xab, 0xff, 0x21, 0x00, 0xb2, 0xff, 0x1d, 0x00, 0xbb, 0xff, 0x17, 0x00, 0xc4, 0xff, 0x11, 0x00, 0xcd, 0xff, 0x0e, 0x00, 0xd4, 0xff, 0x0e, 0x00, 0xdb, 0xff, 0x10, 0x00, 0xe2, 0xff, 0x14, 0x00, 0xec, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x14, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x07, 0x00, 0x21, 0x00, 0x00, 0x00, 0x2a, 0x00, 0xfb, 0xff, 0x31, 0x00, 0xfb, 0xff, 0x35, 0x00, 0xff, 0xff, 0x3b, 0x00, 0x03, 0x00, 0x43, 0x00, 0x06, 0x00, 0x4e, 0x00, 0x06, 0x00, 0x5a, 0x00, 0x02, 0x00, 0x64, 0x00, 0xfc, 0xff, 0x6a, 0x00, 0xf5, 0xff, 0x6a, 0x00, 0xf0, 0xff, 0x66, 0x00, 0xed, 0xff, 0x62, 0x00, 0xee, 0xff, 0x5e, 0x00, 0xf2, 0xff, 0x5e, 0x00, 0xf6, 0xff, 0x61, 0x00, 0xf9, 0xff, 0x64, 0x00, 0xfa, 0xff, 0x66, 0x00, 0xfa, 0xff, 0x65, 0x00, 0xf7, 0xff, 0x61, 0x00, 0xf3, 0xff, 0x5a, 0x00, 0xef, 0xff, 0x51, 0x00, 0xed, 0xff, 0x48, 0x00, 0xed, 0xff, 0x41, 0x00, 0xf0, 0xff, 0x3a, 0x00, 0xf5, 0xff, 0x35, 0x00, 0xfb, 0xff, 0x31, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x03, 0x00, 0x27, 0x00, 0x03, 0x00, 0x20, 0x00, 0x03, 0x00, 0x19, 0x00, 0x03, 0x00, 0x12, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x1d, 0x00, 0xfd, 0xff, 0x23, 0x00, 0xf9, 0xff, 0x27, 0x00, 0xf3, 0xff, 0x29, 0x00, 0xeb, 0xff, 0x2a, 0x00, 0xe2, 0xff, 0x2c, 0x00, 0xda, 0xff, 0x31, 0x00, 0xd4, 0xff, 0x36, 0x00, 0xd0, 0xff, 0x3b, 0x00, 0xcd, 0xff, 0x3e, 0x00, 0xca, 0xff, 0x3d, 0x00, 0xc5, 0xff, 0x3a, 0x00, 0xbe, 0xff, 0x36, 0x00, 0xb4, 0xff, 0x34, 0x00, 0xa8, 0xff, 0x34, 0x00, 0x9d, 0xff, 0x34, 0x00, 0x94, 0xff, 0x34, 0x00, 0x8e, 0xff, 0x32, 0x00, 0x8d, 0xff, 0x2d, 0x00, 0x8f, 0xff, 0x27, 0x00, 0x92, 0xff, 0x22, 0x00, 0x94, 0xff, 0x1d, 0x00, 0x95, 0xff, 0x1b, 0x00, 0x96, 0xff, 0x19, 0x00, 0x98, 0xff, 0x18, 0x00, 0x9c, 0xff, 0x16, 0x00, 0xa2, 0xff, 0x12, 0x00, 0xab, 0xff, 0x0d, 0x00, 0xb4, 0xff, 0x07, 0x00, 0xbd, 0xff, 0x00, 0x00, 0xc6, 0xff, 0xfb, 0xff, 0xce, 0xff, 0xf6, 0xff, 0xd5, 0xff, 0xf4, 0xff, 0xdc, 0xff, 0xf3, 0xff, 0xe4, 0xff, 0xf4, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xe2, 0xff, 0x05, 0x00, 0xd8, 0xff, 0x0b, 0x00, 0xd1, 0xff, 0x10, 0x00, 0xce, 0xff, 0x13, 0x00, 0xce, 0xff, 0x16, 0x00, 0xd1, 0xff, 0x19, 0x00, 0xd5, 0xff, 0x1e, 0x00, 0xd8, 0xff, 0x25, 0x00, 0xd8, 0xff, 0x2d, 0x00, 0xd5, 0xff, 0x36, 0x00, 0xd0, 0xff, 0x3e, 0x00, 0xca, 0xff, 0x46, 0x00, 0xc7, 0xff, 0x4d, 0x00, 0xc7, 0xff, 0x51, 0x00, 0xcd, 0xff, 0x53, 0x00, 0xd6, 0xff, 0x53, 0x00, 0xdf, 0xff, 0x55, 0x00, 0xe7, 0xff, 0x58, 0x00, 0xec, 0xff, 0x5e, 0x00, 0xed, 0xff, 0x65, 0x00, 0xec, 0xff, 0x6b, 0x00, 0xeb, 0xff, 0x6d, 0x00, 0xec, 0xff, 0x6d, 0x00, 0xf0, 0xff, 0x6a, 0x00, 0xf6, 0xff, 0x65, 0x00, 0xfe, 0xff, 0x61, 0x00, 0x05, 0x00, 0x5e, 0x00, 0x0a, 0x00, 0x5d, 0x00, 0x0b, 0x00, 0x5b, 0x00, 0x08, 0x00, 0x58, 0x00, 0x04, 0x00, 0x50, 0x00, 0xff, 0xff, 0x46, 0x00, 0xfe, 0xff, 0x39, 0x00, 0xff, 0xff, 0x2b, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x05, 0x00, 0x15, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xe7, 0xff, 0xf2, 0xff, 0xd6, 0xff, 0xee, 0xff, 0xc6, 0xff, 0xee, 0xff, 0xba, 0xff, 0xf1, 0xff, 0xb2, 0xff, 0xf8, 0xff, 0xae, 0xff, 0xff, 0xff, 0xac, 0xff, 0x05, 0x00, 0xab, 0xff, 0x08, 0x00, 0xa9, 0xff, 0x09, 0x00, 0xa5, 0xff, 0x09, 0x00, 0xa1, 0xff, 0x0b, 0x00, 0x9c, 0xff, 0x0d, 0x00, 0x97, 0xff, 0x10, 0x00, 0x94, 0xff, 0x15, 0x00, 0x95, 0xff, 0x1b, 0x00, 0x99, 0xff, 0x21, 0x00, 0x9f, 0xff, 0x25, 0x00, 0xa4, 0xff, 0x26, 0x00, 0xa8, 0xff, 0x24, 0x00, 0xa8, 0xff, 0x1f, 0x00, 0xa6, 0xff, 0x1a, 0x00, 0xa3, 0xff, 0x15, 0x00, 0xa2, 0xff, 0x10, 0x00, 0xa3, 0xff, 0x0c, 0x00, 0xa8, 0xff, 0x08, 0x00, 0xaf, 0xff, 0x04, 0x00, 0xb6, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xf8, 0xff, 0xc0, 0xff, 0xf1, 0xff, 0xc4, 0xff, 0xea, 0xff, 0xc8, 0xff, 0xe4, 0xff, 0xcd, 0xff, 0xe1, 0xff, 0xd4, 0xff, 0xe0, 0xff, 0xde, 0xff, 0xdf, 0xff, 0xea, 0xff, 0xde, 0xff, 0xf8, 0xff, 0xdc, 0xff, 0x07, 0x00, 0xda, 0xff, 0x14, 0x00, 0xd8, 0xff, 0x20, 0x00, 0xd8, 0xff, 0x29, 0x00, 0xdb, 0xff, 0x30, 0x00, 0xdf, 0xff, 0x38, 0x00, 0xe3, 0xff, 0x41, 0x00, 0xe6, 0xff, 0x4b, 0x00, 0xe9, 0xff, 0x55, 0x00, 0xea, 0xff, 0x5e, 0x00, 0xeb, 0xff, 0x67, 0x00, 0xeb, 0xff, 0x6e, 0x00, 0xed, 0xff, 0x74, 0x00, 0xf2, 0xff, 0x76, 0x00, 0xf8, 0xff, 0x75, 0x00, 0xff, 0xff, 0x72, 0x00, 0x04, 0x00, 0x70, 0x00, 0x07, 0x00, 0x6f, 0x00, 0x08, 0x00, 0x71, 0x00, 0x08, 0x00, 0x73, 0x00, 0x08, 0x00, 0x73, 0x00, 0x08, 0x00, 0x72, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x0d, 0x00, 0x68, 0x00, 0x10, 0x00, 0x61, 0x00, 0x15, 0x00, 0x5b, 0x00, 0x18, 0x00, 0x55, 0x00, 0x19, 0x00, 0x50, 0x00, 0x18, 0x00, 0x4c, 0x00, 0x15, 0x00, 0x4a, 0x00, 0x12, 0x00, 0x45, 0x00, 0x0f, 0x00, 0x3f, 0x00, 0x0f, 0x00, 0x35, 0x00, 0x13, 0x00, 0x2a, 0x00, 0x19, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, 0x25, 0x00, 0x13, 0x00, 0x26, 0x00, 0x0e, 0x00, 0x24, 0x00, 0x0a, 0x00, 0x20, 0x00, 0x05, 0x00, 0x1b, 0x00, 0xfe, 0xff, 0x17, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xed, 0xff, 0x16, 0x00, 0xe5, 0xff, 0x18, 0x00, 0xde, 0xff, 0x19, 0x00, 0xd9, 0xff, 0x17, 0x00, 0xd5, 0xff, 0x12, 0x00, 0xcf, 0xff, 0x09, 0x00, 0xc8, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xf8, 0xff, 0xb7, 0xff, 0xf3, 0xff, 0xb0, 0xff, 0xf2, 0xff, 0xa9, 0xff, 0xf2, 0xff, 0xa4, 0xff, 0xf2, 0xff, 0xa1, 0xff, 0xf2, 0xff, 0x9e, 0xff, 0xf0, 0xff, 0x9b, 0xff, 0xee, 0xff, 0x98, 0xff, 0xeb, 0xff, 0x97, 0xff, 0xe8, 0xff, 0x97, 0xff, 0xe6, 0xff, 0x99, 0xff, 0xe5, 0xff, 0x9c, 0xff, 0xe8, 0xff, 0xa0, 0xff, 0xeb, 0xff, 0xa3, 0xff, 0xed, 0xff, 0xa7, 0xff, 0xee, 0xff, 0xac, 0xff, 0xec, 0xff, 0xb4, 0xff, 0xea, 0xff, 0xbd, 0xff, 0xe9, 0xff, 0xc7, 0xff, 0xe8, 0xff, 0xd0, 0xff, 0xe6, 0xff, 0xd9, 0xff, 0xe4, 0xff, 0xe0, 0xff, 0xe1, 0xff, 0xe6, 0xff, 0xe0, 0xff, 0xec, 0xff, 0xdf, 0xff, 0xf3, 0xff, 0xdd, 0xff, 0xfb, 0xff, 0xdc, 0xff, 0x04, 0x00, 0xdb, 0xff, 0x0e, 0x00, 0xda, 0xff, 0x19, 0x00, 0xda, 0xff, 0x23, 0x00, 0xdc, 0xff, 0x2a, 0x00, 0xdd, 0xff, 0x30, 0x00, 0xdd, 0xff, 0x34, 0x00, 0xdc, 0xff, 0x39, 0x00, 0xdb, 0xff, 0x41, 0x00, 0xdb, 0xff, 0x4a, 0x00, 0xdd, 0xff, 0x55, 0x00, 0xe1, 0xff, 0x60, 0x00, 0xe6, 0xff, 0x69, 0x00, 0xeb, 0xff, 0x6e, 0x00, 0xee, 0xff, 0x71, 0x00, 0xf2, 0xff, 0x73, 0x00, 0xf4, 0xff, 0x76, 0x00, 0xf6, 0xff, 0x7a, 0x00, 0xf9, 0xff, 0x7e, 0x00, 0xfc, 0xff, 0x82, 0x00, 0x00, 0x00, 0x84, 0x00, 0x05, 0x00, 0x84, 0x00, 0x0c, 0x00, 0x82, 0x00, 0x14, 0x00, 0x7e, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x24, 0x00, 0x71, 0x00, 0x2b, 0x00, 0x6a, 0x00, 0x32, 0x00, 0x64, 0x00, 0x39, 0x00, 0x5e, 0x00, 0x40, 0x00, 0x56, 0x00, 0x45, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x30, 0x00, 0x4d, 0x00, 0x22, 0x00, 0x4f, 0x00, 0x15, 0x00, 0x52, 0x00, 0x09, 0x00, 0x56, 0x00, 0x00, 0x00, 0x5a, 0x00, 0xf7, 0xff, 0x5c, 0x00, 0xef, 0xff, 0x5e, 0x00, 0xe4, 0xff, 0x60, 0x00, 0xd7, 0xff, 0x60, 0x00, 0xc8, 0xff, 0x60, 0x00, 0xba, 0xff, 0x5f, 0x00, 0xad, 0xff, 0x5e, 0x00, 0xa4, 0xff, 0x5d, 0x00, 0x9f, 0xff, 0x5a, 0x00, 0x9c, 0xff, 0x56, 0x00, 0x9a, 0xff, 0x52, 0x00, 0x96, 0xff, 0x4d, 0x00, 0x90, 0xff, 0x48, 0x00, 0x88, 0xff, 0x42, 0x00, 0x7e, 0xff, 0x3c, 0x00, 0x75, 0xff, 0x35, 0x00, 0x71, 0xff, 0x2d, 0x00, 0x71, 0xff, 0x25, 0x00, 0x74, 0xff, 0x1b, 0x00, 0x7a, 0xff, 0x11, 0x00, 0x7e, 0xff, 0x07, 0x00, 0x81, 0xff, 0xfe, 0xff, 0x82, 0xff, 0xf7, 0xff, 0x81, 0xff, 0xf3, 0xff, 0x81, 0xff, 0xf1, 0xff, 0x83, 0xff, 0xef, 0xff, 0x87, 0xff, 0xec, 0xff, 0x8f, 0xff, 0xe8, 0xff, 0x99, 0xff, 0xe4, 0xff, 0xa2, 0xff, 0xdf, 0xff, 0xa9, 0xff, 0xdb, 0xff, 0xaf, 0xff, 0xd9, 0xff, 0xb4, 0xff, 0xda, 0xff, 0xbb, 0xff, 0xdd, 0xff, 0xc4, 0xff, 0xe1, 0xff, 0xce, 0xff, 0xe4, 0xff, 0xd9, 0xff, 0xe5, 0xff, 0xe3, 0xff, 0xe4, 0xff, 0xec, 0xff, 0xe3, 0xff, 0xf3, 0xff, 0xe3, 0xff, 0xfb, 0xff, 0xe4, 0xff, 0x04, 0x00, 0xe8, 0xff, 0x0e, 0x00, 0xec, 0xff, 0x19, 0x00, 0xef, 0xff, 0x24, 0x00, 0xf0, 0xff, 0x2d, 0x00, 0xf1, 0xff, 0x34, 0x00, 0xf2, 0xff, 0x38, 0x00, 0xf5, 0xff, 0x3c, 0x00, 0xf9, 0xff, 0x40, 0x00, 0x00, 0x00, 0x44, 0x00, 0x07, 0x00, 0x49, 0x00, 0x0e, 0x00, 0x4e, 0x00, 0x13, 0x00, 0x4f, 0x00, 0x15, 0x00, 0x4d, 0x00, 0x13, 0x00, 0x48, 0x00, 0x10, 0x00, 0x42, 0x00, 0x0d, 0x00, 0x3d, 0x00, 0x0b, 0x00, 0x3c, 0x00, 0x0a, 0x00, 0x3c, 0x00, 0x0a, 0x00, 0x3d, 0x00, 0x09, 0x00, 0x3c, 0x00, 0x08, 0x00, 0x38, 0x00, 0x05, 0x00, 0x34, 0x00, 0x01, 0x00, 0x2f, 0x00, 0xff, 0xff, 0x2d, 0x00, 0xfe, 0xff, 0x2d, 0x00, 0xff, 0xff, 0x2e, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2e, 0x00, 0xfe, 0xff, 0x2b, 0x00, 0xfb, 0xff, 0x26, 0x00, 0xf9, 0xff, 0x1f, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xfb, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x10, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfc, 0xff, 0xf8, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xe3, 0xff, 0xec, 0xff, 0xda, 0xff, 0xe7, 0xff, 0xd1, 0xff, 0xe2, 0xff, 0xca, 0xff, 0xdd, 0xff, 0xc5, 0xff, 0xd7, 0xff, 0xc0, 0xff, 0xd1, 0xff, 0xba, 0xff, 0xcb, 0xff, 0xb5, 0xff, 0xc7, 0xff, 0xaf, 0xff, 0xc3, 0xff, 0xab, 0xff, 0xc1, 0xff, 0xa6, 0xff, 0xbc, 0xff, 0xa2, 0xff, 0xb6, 0xff, 0x9e, 0xff, 0xaf, 0xff, 0x9a, 0xff, 0xa8, 0xff, 0x97, 0xff, 0xa2, 0xff, 0x96, 0xff, 0x9e, 0xff, 0x97, 0xff, 0x9b, 0xff, 0x9a, 0xff, 0x98, 0xff, 0x9d, 0xff, 0x95, 0xff, 0xa1, 0xff, 0x91, 0xff, 0xa5, 0xff, 0x8e, 0xff, 0xa9, 0xff, 0x8c, 0xff, 0xae, 0xff, 0x8c, 0xff, 0xb6, 0xff, 0x8e, 0xff, 0xc2, 0xff, 0x90, 0xff, 0xd0, 0xff, 0x93, 0xff, 0xe0, 0xff, 0x94, 0xff, 0xef, 0xff, 0x96, 0xff, 0xfc, 0xff, 0x98, 0xff, 0x07, 0x00, 0x9e, 0xff, 0x11, 0x00, 0xa6, 0xff, 0x1a, 0x00, 0xb1, 0xff, 0x25, 0x00, 0xbd, 0xff, 0x31, 0x00, 0xc9, 0xff, 0x3e, 0x00, 0xd4, 0xff, 0x49, 0x00, 0xdd, 0xff, 0x53, 0x00, 0xe3, 0xff, 0x5c, 0x00, 0xe7, 0xff, 0x62, 0x00, 0xec, 0xff, 0x67, 0x00, 0xf1, 0xff, 0x6b, 0x00, 0xf9, 0xff, 0x6f, 0x00, 0x00, 0x00, 0x72, 0x00, 0x07, 0x00, 0x75, 0x00, 0x0c, 0x00, 0x77, 0x00, 0x0f, 0x00, 0x78, 0x00, 0x11, 0x00, 0x79, 0x00, 0x13, 0x00, 0x7a, 0x00, 0x16, 0x00, 0x7b, 0x00, 0x1a, 0x00, 0x7b, 0x00, 0x1f, 0x00, 0x78, 0x00, 0x26, 0x00, 0x75, 0x00, 0x2e, 0x00, 0x71, 0x00, 0x35, 0x00, 0x6f, 0x00, 0x3a, 0x00, 0x6e, 0x00, 0x3f, 0x00, 0x6d, 0x00, 0x42, 0x00, 0x6b, 0x00, 0x43, 0x00, 0x67, 0x00, 0x45, 0x00, 0x61, 0x00, 0x46, 0x00, 0x59, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x51, 0x00, 0x3c, 0x00, 0x55, 0x00, 0x34, 0x00, 0x57, 0x00, 0x2f, 0x00, 0x56, 0x00, 0x2a, 0x00, 0x52, 0x00, 0x25, 0x00, 0x4a, 0x00, 0x1f, 0x00, 0x41, 0x00, 0x17, 0x00, 0x3a, 0x00, 0x0e, 0x00, 0x37, 0x00, 0x04, 0x00, 0x37, 0x00, 0xfb, 0xff, 0x38, 0x00, 0xf3, 0xff, 0x39, 0x00, 0xec, 0xff, 0x37, 0x00, 0xe6, 0xff, 0x33, 0x00, 0xe2, 0xff, 0x2b, 0x00, 0xde, 0xff, 0x23, 0x00, 0xd9, 0xff, 0x1a, 0x00, 0xd4, 0xff, 0x14, 0x00, 0xcd, 0xff, 0x10, 0x00, 0xc4, 0xff, 0x0d, 0x00, 0xba, 0xff, 0x0b, 0x00, 0xb1, 0xff, 0x06, 0x00, 0xa9, 0xff, 0x01, 0x00, 0xa3, 0xff, 0xf9, 0xff, 0xa0, 0xff, 0xf2, 0xff, 0x9f, 0xff, 0xea, 0xff, 0x9e, 0xff, 0xe4, 0xff, 0x9d, 0xff, 0xdf, 0xff, 0x9a, 0xff, 0xda, 0xff, 0x96, 0xff, 0xd7, 0xff, 0x92, 0xff, 0xd3, 0xff, 0x8f, 0xff, 0xd1, 0xff, 0x8f, 0xff, 0xcf, 0xff, 0x92, 0xff, 0xcd, 0xff, 0x98, 0xff, 0xcc, 0xff, 0xa0, 0xff, 0xcb, 0xff, 0xa9, 0xff, 0xcb, 0xff, 0xb0, 0xff, 0xcb, 0xff, 0xb6, 0xff, 0xce, 0xff, 0xbb, 0xff, 0xd2, 0xff, 0xbf, 0xff, 0xd8, 0xff, 0xc4, 0xff, 0xdf, 0xff, 0xcb, 0xff, 0xe4, 0xff, 0xd4, 0xff, 0xe8, 0xff, 0xe0, 0xff, 0xea, 0xff, 0xec, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xef, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0x03, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x19, 0x00, 0x26, 0x00, 0x1d, 0x00, 0x30, 0x00, 0x1f, 0x00, 0x3a, 0x00, 0x22, 0x00, 0x41, 0x00, 0x26, 0x00, 0x47, 0x00, 0x2b, 0x00, 0x4a, 0x00, 0x31, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x4e, 0x00, 0x3a, 0x00, 0x50, 0x00, 0x3e, 0x00, 0x51, 0x00, 0x40, 0x00, 0x52, 0x00, 0x44, 0x00, 0x51, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x51, 0x00, 0x49, 0x00, 0x56, 0x00, 0x48, 0x00, 0x59, 0x00, 0x47, 0x00, 0x5c, 0x00, 0x48, 0x00, 0x5c, 0x00, 0x49, 0x00, 0x5b, 0x00, 0x4a, 0x00, 0x5a, 0x00, 0x4a, 0x00, 0x59, 0x00, 0x47, 0x00, 0x5a, 0x00, 0x44, 0x00, 0x5b, 0x00, 0x3f, 0x00, 0x5b, 0x00, 0x3b, 0x00, 0x5a, 0x00, 0x37, 0x00, 0x58, 0x00, 0x33, 0x00, 0x54, 0x00, 0x2e, 0x00, 0x4d, 0x00, 0x29, 0x00, 0x46, 0x00, 0x22, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x37, 0x00, 0x16, 0x00, 0x32, 0x00, 0x10, 0x00, 0x2f, 0x00, 0x0a, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2b, 0x00, 0xf5, 0xff, 0x26, 0x00, 0xe8, 0xff, 0x1d, 0x00, 0xdd, 0xff, 0x11, 0x00, 0xd5, 0xff, 0x04, 0x00, 0xcf, 0xff, 0xf7, 0xff, 0xcc, 0xff, 0xee, 0xff, 0xca, 0xff, 0xe8, 0xff, 0xc7, 0xff, 0xe5, 0xff, 0xc2, 0xff, 0xe3, 0xff, 0xbc, 0xff, 0xe0, 0xff, 0xb5, 0xff, 0xd9, 0xff, 0xb0, 0xff, 0xcf, 0xff, 0xab, 0xff, 0xc2, 0xff, 0xaa, 0xff, 0xb6, 0xff, 0xa9, 0xff, 0xad, 0xff, 0xa8, 0xff, 0xa7, 0xff, 0xa6, 0xff, 0xa4, 0xff, 0xa4, 0xff, 0xa2, 0xff, 0xa1, 0xff, 0xa0, 0xff, 0x9e, 0xff, 0x9c, 0xff, 0x9d, 0xff, 0x97, 0xff, 0x9e, 0xff, 0x90, 0xff, 0xa1, 0xff, 0x8b, 0xff, 0xa4, 0xff, 0x88, 0xff, 0xa7, 0xff, 0x87, 0xff, 0xab, 0xff, 0x89, 0xff, 0xb1, 0xff, 0x8b, 0xff, 0xb8, 0xff, 0x8e, 0xff, 0xc2, 0xff, 0x92, 0xff, 0xcc, 0xff, 0x95, 0xff, 0xd5, 0xff, 0x98, 0xff, 0xdd, 0xff, 0x9a, 0xff, 0xe2, 0xff, 0x9c, 0xff, 0xe5, 0xff, 0x9e, 0xff, 0xe9, 0xff, 0xa3, 0xff, 0xee, 0xff, 0xaa, 0xff, 0xf4, 0xff, 0xb3, 0xff, 0xfc, 0xff, 0xbd, 0xff, 0x03, 0x00, 0xc9, 0xff, 0x08, 0x00, 0xd5, 0xff, 0x0b, 0x00, 0xde, 0xff, 0x0d, 0x00, 0xe6, 0xff, 0x0e, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x11, 0x00, 0x05, 0x00, 0x13, 0x00, 0x11, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x1a, 0x00, 0x2b, 0x00, 0x1f, 0x00, 0x35, 0x00, 0x24, 0x00, 0x3c, 0x00, 0x29, 0x00, 0x40, 0x00, 0x2d, 0x00, 0x43, 0x00, 0x30, 0x00, 0x45, 0x00, 0x30, 0x00, 0x48, 0x00, 0x2f, 0x00, 0x4c, 0x00, 0x2d, 0x00, 0x50, 0x00, 0x2d, 0x00, 0x54, 0x00, 0x2d, 0x00, 0x58, 0x00, 0x2f, 0x00, 0x5a, 0x00, 0x30, 0x00, 0x5a, 0x00, 0x30, 0x00, 0x57, 0x00, 0x2e, 0x00, 0x55, 0x00, 0x2a, 0x00, 0x53, 0x00, 0x27, 0x00, 0x53, 0x00, 0x23, 0x00, 0x52, 0x00, 0x21, 0x00, 0x50, 0x00, 0x1e, 0x00, 0x4d, 0x00, 0x1b, 0x00, 0x4b, 0x00, 0x17, 0x00, 0x4a, 0x00, 0x11, 0x00, 0x48, 0x00, 0x0c, 0x00, 0x45, 0x00, 0x07, 0x00, 0x3f, 0x00, 0x02, 0x00, 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0xff, 0xff, 0x29, 0x00, 0x00, 0x00, 0x24, 0x00, 0xff, 0xff, 0x21, 0x00, 0xfb, 0xff, 0x20, 0x00, 0xf4, 0xff, 0x1c, 0x00, 0xec, 0xff, 0x17, 0x00, 0xe6, 0xff, 0x0e, 0x00, 0xe3, 0xff, 0x03, 0x00, 0xe3, 0xff, 0xf7, 0xff, 0xe5, 0xff, 0xed, 0xff, 0xe8, 0xff, 0xe6, 0xff, 0xe8, 0xff, 0xe3, 0xff, 0xe6, 0xff, 0xe2, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xdc, 0xff, 0xdf, 0xff, 0xd8, 0xff, 0xda, 0xff, 0xd8, 0xff, 0xd5, 0xff, 0xda, 0xff, 0xd0, 0xff, 0xe0, 0xff, 0xcc, 0xff, 0xe6, 0xff, 0xc9, 0xff, 0xeb, 0xff, 0xc8, 0xff, 0xed, 0xff, 0xc7, 0xff, 0xec, 0xff, 0xc7, 0xff, 0xe8, 0xff, 0xc8, 0xff, 0xe6, 0xff, 0xc8, 0xff, 0xe6, 0xff, 0xc9, 0xff, 0xe9, 0xff, 0xcb, 0xff, 0xf1, 0xff, 0xce, 0xff, 0xf9, 0xff, 0xd2, 0xff, 0x01, 0x00, 0xd6, 0xff, 0x06, 0x00, 0xda, 0xff, 0x09, 0x00, 0xdc, 0xff, 0x09, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x06, 0x00, 0xee, 0xff, 0x07, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x11, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x05, 0x00, 0x24, 0x00, 0x09, 0x00, 0x2d, 0x00, 0x0e, 0x00, 0x32, 0x00, 0x15, 0x00, 0x34, 0x00, 0x1d, 0x00, 0x33, 0x00, 0x26, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x33, 0x00, 0x34, 0x00, 0x37, 0x00, 0x38, 0x00, 0x3d, 0x00, 0x3a, 0x00, 0x45, 0x00, 0x3c, 0x00, 0x4c, 0x00, 0x40, 0x00, 0x51, 0x00, 0x43, 0x00, 0x52, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x48, 0x00, 0x4a, 0x00, 0x48, 0x00, 0x46, 0x00, 0x47, 0x00, 0x44, 0x00, 0x46, 0x00, 0x45, 0x00, 0x47, 0x00, 0x49, 0x00, 0x48, 0x00, 0x4d, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x48, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x48, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3b, 0x00, 0x38, 0x00, 0x36, 0x00, 0x32, 0x00, 0x34, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x27, 0x00, 0x2d, 0x00, 0x23, 0x00, 0x26, 0x00, 0x1b, 0x00, 0x1e, 0x00, 0x11, 0x00, 0x18, 0x00, 0x05, 0x00, 0x11, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xea, 0xff, 0xfe, 0xff, 0xe7, 0xff, 0xf6, 0xff, 0xe5, 0xff, 0xef, 0xff, 0xe5, 0xff, 0xe7, 0xff, 0xe3, 0xff, 0xe0, 0xff, 0xe0, 0xff, 0xd9, 0xff, 0xda, 0xff, 0xd2, 0xff, 0xd2, 0xff, 0xcb, 0xff, 0xca, 0xff, 0xc3, 0xff, 0xc4, 0xff, 0xba, 0xff, 0xc0, 0xff, 0xb2, 0xff, 0xc0, 0xff, 0xac, 0xff, 0xc2, 0xff, 0xa7, 0xff, 0xc4, 0xff, 0xa4, 0xff, 0xc5, 0xff, 0xa1, 0xff, 0xc5, 0xff, 0x9d, 0xff, 0xc2, 0xff, 0x99, 0xff, 0xbf, 0xff, 0x94, 0xff, 0xbd, 0xff, 0x8f, 0xff, 0xbc, 0xff, 0x8c, 0xff, 0xbd, 0xff, 0x8c, 0xff, 0xbf, 0xff, 0x8e, 0xff, 0xc3, 0xff, 0x93, 0xff, 0xc7, 0xff, 0x97, 0xff, 0xcc, 0xff, 0x9b, 0xff, 0xd2, 0xff, 0x9e, 0xff, 0xd8, 0xff, 0xa0, 0xff, 0xde, 0xff, 0xa3, 0xff, 0xe6, 0xff, 0xa7, 0xff, 0xee, 0xff, 0xad, 0xff, 0xf5, 0xff, 0xb5, 0xff, 0xfa, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xc8, 0xff, 0x05, 0x00, 0xd2, 0xff, 0x0b, 0x00, 0xdb, 0xff, 0x13, 0x00, 0xe4, 0xff, 0x1c, 0x00, 0xeb, 0xff, 0x24, 0x00, 0xf0, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x30, 0x00, 0xf9, 0xff, 0x32, 0x00, 0xfd, 0xff, 0x33, 0x00, 0x01, 0x00, 0x33, 0x00, 0x06, 0x00, 0x33, 0x00, 0x0b, 0x00, 0x34, 0x00, 0x10, 0x00, 0x36, 0x00, 0x15, 0x00, 0x37, 0x00, 0x19, 0x00, 0x39, 0x00, 0x1a, 0x00, 0x3b, 0x00, 0x19, 0x00, 0x3c, 0x00, 0x18, 0x00, 0x3c, 0x00, 0x18, 0x00, 0x3b, 0x00, 0x18, 0x00, 0x3a, 0x00, 0x19, 0x00, 0x37, 0x00, 0x1a, 0x00, 0x35, 0x00, 0x1a, 0x00, 0x32, 0x00, 0x18, 0x00, 0x30, 0x00, 0x16, 0x00, 0x2f, 0x00, 0x12, 0x00, 0x2f, 0x00, 0x0e, 0x00, 0x2f, 0x00, 0x0a, 0x00, 0x2f, 0x00, 0x08, 0x00, 0x2d, 0x00, 0x06, 0x00, 0x2a, 0x00, 0x03, 0x00, 0x25, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xfe, 0xff, 0x19, 0x00, 0xfd, 0xff, 0x15, 0x00, 0xfb, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x0c, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xf8, 0xff, 0xe1, 0xff, 0xf6, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xcf, 0xff, 0xec, 0xff, 0xc4, 0xff, 0xe7, 0xff, 0xbc, 0xff, 0xe3, 0xff, 0xb8, 0xff, 0xe1, 0xff, 0xb9, 0xff, 0xe1, 0xff, 0xbb, 0xff, 0xe0, 0xff, 0xbd, 0xff, 0xde, 0xff, 0xbb, 0xff, 0xda, 0xff, 0xb7, 0xff, 0xd4, 0xff, 0xb2, 0xff, 0xcf, 0xff, 0xaf, 0xff, 0xcc, 0xff, 0xae, 0xff, 0xcb, 0xff, 0xb2, 0xff, 0xcd, 0xff, 0xb9, 0xff, 0xd1, 0xff, 0xc1, 0xff, 0xd7, 0xff, 0xc7, 0xff, 0xdc, 0xff, 0xcb, 0xff, 0xe1, 0xff, 0xcd, 0xff, 0xe4, 0xff, 0xcf, 0xff, 0xe6, 0xff, 0xd0, 0xff, 0xe9, 0xff, 0xd4, 0xff, 0xed, 0xff, 0xda, 0xff, 0xf4, 0xff, 0xe0, 0xff, 0xfd, 0xff, 0xe7, 0xff, 0x08, 0x00, 0xec, 0xff, 0x12, 0x00, 0xef, 0xff, 0x1c, 0x00, 0xf0, 0xff, 0x23, 0x00, 0xf1, 0xff, 0x28, 0x00, 0xf2, 0xff, 0x2c, 0x00, 0xf4, 0xff, 0x2f, 0x00, 0xf6, 0xff, 0x32, 0x00, 0xf9, 0xff, 0x35, 0x00, 0xfd, 0xff, 0x3a, 0x00, 0x01, 0x00, 0x40, 0x00, 0x06, 0x00, 0x45, 0x00, 0x0c, 0x00, 0x49, 0x00, 0x10, 0x00, 0x4a, 0x00, 0x14, 0x00, 0x49, 0x00, 0x15, 0x00, 0x47, 0x00, 0x15, 0x00, 0x46, 0x00, 0x16, 0x00, 0x46, 0x00, 0x18, 0x00, 0x49, 0x00, 0x1d, 0x00, 0x4c, 0x00, 0x24, 0x00, 0x4f, 0x00, 0x2d, 0x00, 0x51, 0x00, 0x35, 0x00, 0x4f, 0x00, 0x3b, 0x00, 0x4c, 0x00, 0x3f, 0x00, 0x49, 0x00, 0x40, 0x00, 0x48, 0x00, 0x40, 0x00, 0x49, 0x00, 0x40, 0x00, 0x4c, 0x00, 0x42, 0x00, 0x51, 0x00, 0x46, 0x00, 0x55, 0x00, 0x48, 0x00, 0x58, 0x00, 0x48, 0x00, 0x57, 0x00, 0x45, 0x00, 0x53, 0x00, 0x3e, 0x00, 0x4c, 0x00, 0x36, 0x00, 0x46, 0x00, 0x2f, 0x00, 0x40, 0x00, 0x28, 0x00, 0x3b, 0x00, 0x22, 0x00, 0x38, 0x00, 0x1c, 0x00, 0x34, 0x00, 0x15, 0x00, 0x30, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x26, 0x00, 0xf3, 0xff, 0x20, 0x00, 0xe6, 0xff, 0x18, 0x00, 0xd9, 0xff, 0x10, 0x00, 0xce, 0xff, 0x0a, 0x00, 0xc6, 0xff, 0x06, 0x00, 0xbf, 0xff, 0x04, 0x00, 0xb9, 0xff, 0x01, 0x00, 0xb4, 0xff, 0xfe, 0xff, 0xae, 0xff, 0xf9, 0xff, 0xa8, 0xff, 0xf3, 0xff, 0xa3, 0xff, 0xec, 0xff, 0x9e, 0xff, 0xe4, 0xff, 0x9b, 0xff, 0xdd, 0xff, 0x99, 0xff, 0xd7, 0xff, 0x97, 0xff, 0xd2, 0xff, 0x96, 0xff, 0xcf, 0xff, 0x95, 0xff, 0xcf, 0xff, 0x96, 0xff, 0xcf, 0xff, 0x97, 0xff, 0xcf, 0xff, 0x99, 0xff, 0xcd, 0xff, 0x9a, 0xff, 0xc9, 0xff, 0x9b, 0xff, 0xc5, 0xff, 0x9b, 0xff, 0xc2, 0xff, 0x9b, 0xff, 0xc1, 0xff, 0x9c, 0xff, 0xc1, 0xff, 0x9f, 0xff, 0xc5, 0xff, 0xa2, 0xff, 0xcc, 0xff, 0xa7, 0xff, 0xd2, 0xff, 0xaa, 0xff, 0xd6, 0xff, 0xac, 0xff, 0xd8, 0xff, 0xad, 0xff, 0xd7, 0xff, 0xaf, 0xff, 0xd6, 0xff, 0xb2, 0xff, 0xd6, 0xff, 0xb7, 0xff, 0xd8, 0xff, 0xbe, 0xff, 0xdb, 0xff, 0xc5, 0xff, 0xdf, 0xff, 0xcd, 0xff, 0xe3, 0xff, 0xd3, 0xff, 0xe6, 0xff, 0xd8, 0xff, 0xe8, 0xff, 0xdc, 0xff, 0xe8, 0xff, 0xe1, 0xff, 0xe9, 0xff, 0xe6, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x0a, 0x00, 0x04, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x0c, 0x00, 0x2a, 0x00, 0x0b, 0x00, 0x2b, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x0e, 0x00, 0x2e, 0x00, 0x12, 0x00, 0x33, 0x00, 0x17, 0x00, 0x39, 0x00, 0x1d, 0x00, 0x3f, 0x00, 0x20, 0x00, 0x43, 0x00, 0x20, 0x00, 0x43, 0x00, 0x1c, 0x00, 0x3f, 0x00, 0x16, 0x00, 0x39, 0x00, 0x10, 0x00, 0x33, 0x00, 0x0d, 0x00, 0x2d, 0x00, 0x0e, 0x00, 0x2b, 0x00, 0x12, 0x00, 0x2a, 0x00, 0x17, 0x00, 0x2c, 0x00, 0x1d, 0x00, 0x2e, 0x00, 0x1f, 0x00, 0x2d, 0x00, 0x1f, 0x00, 0x29, 0x00, 0x1d, 0x00, 0x23, 0x00, 0x19, 0x00, 0x1b, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x11, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x10, 0x00, 0x16, 0x00, 0x13, 0x00, 0x15, 0x00, 0x15, 0x00, 0x12, 0x00, 0x15, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x03, 0x00, 0x0f, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xef, 0xff, 0x01, 0x00, 0xea, 0xff, 0x02, 0x00, 0xe4, 0xff, 0x01, 0x00, 0xdd, 0xff, 0xff, 0xff, 0xd8, 0xff, 0xfc, 0xff, 0xd3, 0xff, 0xf9, 0xff, 0xd0, 0xff, 0xf7, 0xff, 0xce, 0xff, 0xf5, 0xff, 0xcb, 0xff, 0xf4, 0xff, 0xc9, 0xff, 0xf4, 0xff, 0xc8, 0xff, 0xf5, 0xff, 0xc7, 0xff, 0xf6, 0xff, 0xc8, 0xff, 0xf7, 0xff, 0xc9, 0xff, 0xf7, 0xff, 0xca, 0xff, 0xf5, 0xff, 0xcc, 0xff, 0xf4, 0xff, 0xcd, 0xff, 0xf4, 0xff, 0xce, 0xff, 0xf6, 0xff, 0xd1, 0xff, 0xfa, 0xff, 0xd5, 0xff, 0xfe, 0xff, 0xd9, 0xff, 0x04, 0x00, 0xde, 0xff, 0x08, 0x00, 0xe2, 0xff, 0x0b, 0x00, 0xe6, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xf0, 0xff, 0x0c, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x0e, 0x00, 0x07, 0x00, 0x11, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x13, 0x00, 0x26, 0x00, 0x13, 0x00, 0x2c, 0x00, 0x14, 0x00, 0x31, 0x00, 0x17, 0x00, 0x33, 0x00, 0x20, 0x00, 0x34, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x38, 0x00, 0x37, 0x00, 0x40, 0x00, 0x3b, 0x00, 0x44, 0x00, 0x3f, 0x00, 0x43, 0x00, 0x43, 0x00, 0x40, 0x00, 0x47, 0x00, 0x3d, 0x00, 0x4b, 0x00, 0x3c, 0x00, 0x4e, 0x00, 0x3e, 0x00, 0x50, 0x00, 0x42, 0x00, 0x52, 0x00, 0x47, 0x00, 0x53, 0x00, 0x4c, 0x00, 0x56, 0x00, 0x50, 0x00, 0x58, 0x00, 0x52, 0x00, 0x5a, 0x00, 0x51, 0x00, 0x5b, 0x00, 0x50, 0x00, 0x5b, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x4b, 0x00, 0x57, 0x00, 0x48, 0x00, 0x56, 0x00, 0x47, 0x00, 0x54, 0x00, 0x46, 0x00, 0x52, 0x00, 0x48, 0x00, 0x51, 0x00, 0x4a, 0x00, 0x4f, 0x00, 0x4c, 0x00, 0x4e, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x47, 0x00, 0x46, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3b, 0x00, 0x38, 0x00, 0x37, 0x00, 0x30, 0x00, 0x34, 0x00, 0x29, 0x00, 0x33, 0x00, 0x24, 0x00, 0x32, 0x00, 0x20, 0x00, 0x30, 0x00, 0x1d, 0x00, 0x2c, 0x00, 0x18, 0x00, 0x25, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x02, 0x00, 0x10, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xed, 0xff, 0x09, 0x00, 0xe9, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x04, 0x00, 0xe5, 0xff, 0xff, 0xff, 0xe5, 0xff, 0xf8, 0xff, 0xe5, 0xff, 0xf2, 0xff, 0xe4, 0xff, 0xed, 0xff, 0xe2, 0xff, 0xeb, 0xff, 0xe2, 0xff, 0xe9, 0xff, 0xe2, 0xff, 0xe8, 0xff, 0xe4, 0xff, 0xe4, 0xff, 0xe5, 0xff, 0xdf, 0xff, 0xe5, 0xff, 0xd8, 0xff, 0xe5, 0xff, 0xd0, 0xff, 0xe5, 0xff, 0xca, 0xff, 0xe5, 0xff, 0xc6, 0xff, 0xe5, 0xff, 0xc5, 0xff, 0xe4, 0xff, 0xc4, 0xff, 0xe2, 0xff, 0xc4, 0xff, 0xdf, 0xff, 0xc4, 0xff, 0xdd, 0xff, 0xc3, 0xff, 0xdd, 0xff, 0xc2, 0xff, 0xdf, 0xff, 0xc0, 0xff, 0xe1, 0xff, 0xbd, 0xff, 0xe3, 0xff, 0xbb, 0xff, 0xe4, 0xff, 0xbb, 0xff, 0xe2, 0xff, 0xbb, 0xff, 0xde, 0xff, 0xbe, 0xff, 0xda, 0xff, 0xc3, 0xff, 0xd8, 0xff, 0xc8, 0xff, 0xd8, 0xff, 0xcd, 0xff, 0xdb, 0xff, 0xd0, 0xff, 0xe0, 0xff, 0xd1, 0xff, 0xe5, 0xff, 0xd0, 0xff, 0xe8, 0xff, 0xce, 0xff, 0xe9, 0xff, 0xcf, 0xff, 0xe7, 0xff, 0xd2, 0xff, 0xe4, 0xff, 0xd8, 0xff, 0xe2, 0xff, 0xe0, 0xff, 0xe3, 0xff, 0xe7, 0xff, 0xe5, 0xff, 0xec, 0xff, 0xea, 0xff, 0xed, 0xff, 0xee, 0xff, 0xec, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xf3, 0xff, 0xe7, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x13, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, 0x07, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xf6, 0xff, 0x0b, 0x00, 0xef, 0xff, 0x0b, 0x00, 0xec, 0xff, 0x09, 0x00, 0xed, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf2, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xd7, 0xff, 0xf7, 0xff, 0xce, 0xff, 0xf8, 0xff, 0xca, 0xff, 0xf7, 0xff, 0xca, 0xff, 0xf5, 0xff, 0xcd, 0xff, 0xf0, 0xff, 0xd0, 0xff, 0xea, 0xff, 0xd0, 0xff, 0xe4, 0xff, 0xcb, 0xff, 0xe0, 0xff, 0xc2, 0xff, 0xde, 0xff, 0xb8, 0xff, 0xdf, 0xff, 0xb0, 0xff, 0xe2, 0xff, 0xae, 0xff, 0xe5, 0xff, 0xb1, 0xff, 0xe6, 0xff, 0xb8, 0xff, 0xe4, 0xff, 0xc1, 0xff, 0xdf, 0xff, 0xc8, 0xff, 0xd8, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xd1, 0xff, 0xd0, 0xff, 0xd2, 0xff, 0xd3, 0xff, 0xd2, 0xff, 0xda, 0xff, 0xd3, 0xff, 0xe2, 0xff, 0xd7, 0xff, 0xe7, 0xff, 0xdf, 0xff, 0xe8, 0xff, 0xe8, 0xff, 0xe3, 0xff, 0xf1, 0xff, 0xdc, 0xff, 0xf8, 0xff, 0xd7, 0xff, 0xfc, 0xff, 0xd6, 0xff, 0xfd, 0xff, 0xdb, 0xff, 0xfd, 0xff, 0xe4, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0x01, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xec, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x0a, 0x00, 0xe6, 0xff, 0x09, 0x00, 0xe9, 0xff, 0x09, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0x09, 0x00, 0x10, 0x00, 0x10, 0x00, 0x15, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x08, 0x00, 0x26, 0x00, 0x08, 0x00, 0x27, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x15, 0x00, 0x28, 0x00, 0x20, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x30, 0x00, 0x33, 0x00, 0x33, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x24, 0x00, 0x36, 0x00, 0x1a, 0x00, 0x38, 0x00, 0x14, 0x00, 0x3a, 0x00, 0x14, 0x00, 0x3c, 0x00, 0x18, 0x00, 0x3c, 0x00, 0x1d, 0x00, 0x39, 0x00, 0x22, 0x00, 0x35, 0x00, 0x22, 0x00, 0x30, 0x00, 0x1d, 0x00, 0x2c, 0x00, 0x14, 0x00, 0x29, 0x00, 0x09, 0x00, 0x27, 0x00, 0x02, 0x00, 0x25, 0x00, 0x01, 0x00, 0x21, 0x00, 0x05, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x07, 0x00, 0x18, 0x00, 0x06, 0x00, 0x13, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x07, 0x00, 0x09, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x01, 0x00, 0x0b, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x0e, 0x00, 0xf6, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x02, 0x00, 0x07, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xf6, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf0, 0xff, 0x08, 0x00, 0xf0, 0xff, 0x02, 0x00, 0xf0, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xed, 0xff, 0x02, 0x00, 0xea, 0xff, 0x06, 0x00, 0xe8, 0xff, 0x0a, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x08, 0x00, 0xe8, 0xff, 0x03, 0x00, 0xe8, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xee, 0xff, 0xf5, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfe, 0xff, 0xf0, 0xff, 0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xee, 0xff, 0x07, 0x00, 0xec, 0xff, 0x0c, 0x00, 0xe9, 0xff, 0x11, 0x00, 0xe7, 0xff, 0x16, 0x00, 0xe7, 0xff, 0x1a, 0x00, 0xe9, 0xff, 0x1c, 0x00, 0xee, 0xff, 0x1d, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0xf6, 0xff, 0x1f, 0x00, 0xf7, 0xff, 0x22, 0x00, 0xf7, 0xff, 0x27, 0x00, 0xf4, 0xff, 0x2b, 0x00, 0xf3, 0xff, 0x2d, 0x00, 0xf2, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x27, 0x00, 0xf9, 0xff, 0x21, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x17, 0x00, 0xfc, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x1b, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xed, 0xff, 0x19, 0x00, 0xec, 0xff, 0x14, 0x00, 0xed, 0xff, 0x0d, 0x00, 0xef, 0xff, 0x08, 0x00, 0xf0, 0xff, 0x07, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xe9, 0xff, 0x15, 0x00, 0xe6, 0xff, 0x19, 0x00, 0xe5, 0xff, 0x1b, 0x00, 0xe6, 0xff, 0x1a, 0x00, 0xe9, 0xff, 0x18, 0x00, 0xec, 0xff, 0x14, 0x00, 0xee, 0xff, 0x10, 0x00, 0xef, 0xff, 0x0f, 0x00, 0xed, 0xff, 0x11, 0x00, 0xea, 0xff, 0x15, 0x00, 0xe8, 0xff, 0x1a, 0x00, 0xe6, 0xff, 0x1e, 0x00, 0xe5, 0xff, 0x1d, 0x00, 0xe4, 0xff, 0x19, 0x00, 0xe5, 0xff, 0x11, 0x00, 0xe5, 0xff, 0x08, 0x00, 0xe5, 0xff, 0xff, 0xff, 0xe4, 0xff, 0xf9, 0xff, 0xe3, 0xff, 0xf6, 0xff, 0xe2, 0xff, 0xf5, 0xff, 0xe1, 0xff, 0xf6, 0xff, 0xdf, 0xff, 0xf5, 0xff, 0xde, 0xff, 0xf2, 0xff, 0xde, 0xff, 0xec, 0xff, 0xe0, 0xff, 0xe4, 0xff, 0xe3, 0xff, 0xdc, 0xff, 0xe7, 0xff, 0xd7, 0xff, 0xea, 0xff, 0xd6, 0xff, 0xed, 0xff, 0xd9, 0xff, 0xee, 0xff, 0xdf, 0xff, 0xed, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xea, 0xff, 0xef, 0xff, 0xea, 0xff, 0xef, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x10, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x06, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x11, 0x00, 0x09, 0x00, 0x16, 0x00, 0x08, 0x00, 0x19, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xfc, 0xff, 0x1e, 0x00, 0xf9, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x27, 0x00, 0xf9, 0xff, 0x2c, 0x00, 0xfb, 0xff, 0x31, 0x00, 0xfd, 0xff, 0x36, 0x00, 0xff, 0xff, 0x3b, 0x00, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x46, 0x00, 0x01, 0x00, 0x4a, 0x00, 0x01, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x01, 0x00, 0x4a, 0x00, 0x04, 0x00, 0x48, 0x00, 0x08, 0x00, 0x46, 0x00, 0x0c, 0x00, 0x45, 0x00, 0x0f, 0x00, 0x45, 0x00, 0x10, 0x00, 0x44, 0x00, 0x0f, 0x00, 0x41, 0x00, 0x0c, 0x00, 0x3b, 0x00, 0x08, 0x00, 0x33, 0x00, 0x04, 0x00, 0x2b, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x00, 0x20, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0xff, 0xff, 0x1f, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xf4, 0xff, 0x13, 0x00, 0xf4, 0xff, 0x15, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf5, 0xff, 0x1a, 0x00, 0xf6, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x09, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xee, 0xff, 0x05, 0x00, 0xe8, 0xff, 0x07, 0x00, 0xe3, 0xff, 0x09, 0x00, 0xde, 0xff, 0x0a, 0x00, 0xdb, 0xff, 0x08, 0x00, 0xda, 0xff, 0x03, 0x00, 0xd9, 0xff, 0xff, 0xff, 0xd7, 0xff, 0xfb, 0xff, 0xd5, 0xff, 0xfa, 0xff, 0xd1, 0xff, 0xfa, 0xff, 0xcb, 0xff, 0xfb, 0xff, 0xc5, 0xff, 0xfd, 0xff, 0xc2, 0xff, 0xfd, 0xff, 0xc2, 0xff, 0xfd, 0xff, 0xc5, 0xff, 0xfb, 0xff, 0xcb, 0xff, 0xfa, 0xff, 0xd0, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xf8, 0xff, 0xd6, 0xff, 0xf7, 0xff, 0xd6, 0xff, 0xf6, 0xff, 0xd6, 0xff, 0xf4, 0xff, 0xd8, 0xff, 0xf3, 0xff, 0xdc, 0xff, 0xf1, 0xff, 0xe4, 0xff, 0xef, 0xff, 0xec, 0xff, 0xed, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xfd, 0xff, 0xec, 0xff, 0x02, 0x00, 0xec, 0xff, 0x06, 0x00, 0xed, 0xff, 0x08, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xf1, 0xff, 0x0c, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x11, 0x00, 0xf4, 0xff, 0x13, 0x00, 0xf4, 0xff, 0x16, 0x00, 0xf4, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x1d, 0x00, 0xfa, 0xff, 0x20, 0x00, 0xff, 0xff, 0x22, 0x00, 0x04, 0x00, 0x22, 0x00, 0x07, 0x00, 0x20, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x18, 0x00, 0x02, 0x00, 0x16, 0x00, 0xff, 0xff, 0x16, 0x00, 0xfe, 0xff, 0x1a, 0x00, 0xff, 0xff, 0x1e, 0x00, 0x04, 0x00, 0x22, 0x00, 0x09, 0x00, 0x24, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x0d, 0x00, 0x22, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x08, 0x00, 0x20, 0x00, 0x06, 0x00, 0x21, 0x00, 0x05, 0x00, 0x24, 0x00, 0x06, 0x00, 0x27, 0x00, 0x07, 0x00, 0x28, 0x00, 0x07, 0x00, 0x28, 0x00, 0x06, 0x00, 0x27, 0x00, 0x04, 0x00, 0x25, 0x00, 0xff, 0xff, 0x23, 0x00, 0xfb, 0xff, 0x22, 0x00, 0xf7, 0xff, 0x20, 0x00, 0xf4, 0xff, 0x1e, 0x00, 0xf2, 0xff, 0x1c, 0x00, 0xef, 0xff, 0x19, 0x00, 0xe9, 0xff, 0x17, 0x00, 0xe3, 0xff, 0x16, 0x00, 0xdd, 0xff, 0x16, 0x00, 0xd8, 0xff, 0x15, 0x00, 0xd4, 0xff, 0x14, 0x00, 0xd2, 0xff, 0x11, 0x00, 0xd1, 0xff, 0x0d, 0x00, 0xd0, 0xff, 0x08, 0x00, 0xcf, 0xff, 0x04, 0x00, 0xcd, 0xff, 0x03, 0x00, 0xcc, 0xff, 0x03, 0x00, 0xcc, 0xff, 0x05, 0x00, 0xce, 0xff, 0x06, 0x00, 0xcf, 0xff, 0x06, 0x00, 0xd0, 0xff, 0x03, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xce, 0xff, 0xfa, 0xff, 0xcd, 0xff, 0xf6, 0xff, 0xcd, 0xff, 0xf3, 0xff, 0xce, 0xff, 0xf3, 0xff, 0xd0, 0xff, 0xf4, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf9, 0xff, 0xd0, 0xff, 0xfa, 0xff, 0xcd, 0xff, 0xf9, 0xff, 0xcb, 0xff, 0xf7, 0xff, 0xc9, 0xff, 0xf3, 0xff, 0xc9, 0xff, 0xf0, 0xff, 0xca, 0xff, 0xed, 0xff, 0xcc, 0xff, 0xec, 0xff, 0xce, 0xff, 0xee, 0xff, 0xd0, 0xff, 0xf2, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd3, 0xff, 0xfb, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x01, 0x00, 0xe1, 0xff, 0x03, 0x00, 0xe7, 0xff, 0x04, 0x00, 0xed, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x06, 0x00, 0xf5, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0x01, 0x00, 0x11, 0x00, 0x06, 0x00, 0x12, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x12, 0x00, 0x16, 0x00, 0x13, 0x00, 0x17, 0x00, 0x13, 0x00, 0x18, 0x00, 0x13, 0x00, 0x18, 0x00, 0x13, 0x00, 0x19, 0x00, 0x14, 0x00, 0x19, 0x00, 0x15, 0x00, 0x19, 0x00, 0x13, 0x00, 0x18, 0x00, 0x12, 0x00, 0x15, 0x00, 0x10, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x09, 0x00, 0x17, 0x00, 0x09, 0x00, 0x18, 0x00, 0x0a, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x09, 0x00, 0x21, 0x00, 0x04, 0x00, 0x27, 0x00, 0xff, 0xff, 0x2c, 0x00, 0xf9, 0xff, 0x2e, 0x00, 0xf4, 0xff, 0x2e, 0x00, 0xf3, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x27, 0x00, 0xf8, 0xff, 0x22, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x20, 0x00, 0xfc, 0xff, 0x22, 0x00, 0xf8, 0xff, 0x22, 0x00, 0xf3, 0xff, 0x1e, 0x00, 0xf0, 0xff, 0x18, 0x00, 0xef, 0xff, 0x11, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xef, 0xff, 0x06, 0x00, 0xef, 0xff, 0x04, 0x00, 0xed, 0xff, 0x04, 0x00, 0xeb, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x05, 0x00, 0xe2, 0xff, 0x04, 0x00, 0xde, 0xff, 0x00, 0x00, 0xdb, 0xff, 0xfb, 0xff, 0xd9, 0xff, 0xf6, 0xff, 0xd7, 0xff, 0xf4, 0xff, 0xd5, 0xff, 0xf4, 0xff, 0xd2, 0xff, 0xf6, 0xff, 0xcf, 0xff, 0xfa, 0xff, 0xcd, 0xff, 0xfd, 0xff, 0xcb, 0xff, 0x00, 0x00, 0xcc, 0xff, 0x00, 0x00, 0xcf, 0xff, 0xfe, 0xff, 0xd3, 0xff, 0xfa, 0xff, 0xd8, 0xff, 0xf7, 0xff, 0xdd, 0xff, 0xf5, 0xff, 0xe0, 0xff, 0xf6, 0xff, 0xe3, 0xff, 0xf9, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x04, 0x00, 0xec, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x05, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x14, 0x00, 0xfd, 0xff, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x07, 0x00, 0x19, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x09, 0x00, 0x22, 0x00, 0x08, 0x00, 0x25, 0x00, 0x06, 0x00, 0x27, 0x00, 0x06, 0x00, 0x26, 0x00, 0x0a, 0x00, 0x22, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1e, 0x00, 0x19, 0x00, 0x23, 0x00, 0x18, 0x00, 0x26, 0x00, 0x19, 0x00, 0x26, 0x00, 0x1a, 0x00, 0x24, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x04, 0x00, 0x16, 0x00, 0x04, 0x00, 0x10, 0x00, 0x05, 0x00, 0x08, 0x00, 0x07, 0x00, 0x01, 0x00, 0x09, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xed, 0xff, 0xfb, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xe6, 0xff, 0xf9, 0xff, 0xe4, 0xff, 0xf4, 0xff, 0xe4, 0xff, 0xec, 0xff, 0xe7, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xda, 0xff, 0xf1, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xd8, 0xff, 0xf4, 0xff, 0xdb, 0xff, 0xf1, 0xff, 0xdb, 0xff, 0xf0, 0xff, 0xd8, 0xff, 0xf0, 0xff, 0xd2, 0xff, 0xf3, 0xff, 0xca, 0xff, 0xf6, 0xff, 0xc3, 0xff, 0xfa, 0xff, 0xbf, 0xff, 0xfb, 0xff, 0xc0, 0xff, 0xf9, 0xff, 0xc4, 0xff, 0xf5, 0xff, 0xca, 0xff, 0xf2, 0xff, 0xd1, 0xff, 0xf1, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0xd9, 0xff, 0xf6, 0xff, 0xd8, 0xff, 0xfb, 0xff, 0xd6, 0xff, 0xfe, 0xff, 0xd5, 0xff, 0x00, 0x00, 0xd6, 0xff, 0x00, 0x00, 0xdb, 0xff, 0xfd, 0xff, 0xe4, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x10, 0x00, 0x1a, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x19, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x16, 0x00, 0x22, 0x00, 0x16, 0x00, 0x24, 0x00, 0x19, 0x00, 0x23, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x23, 0x00, 0x1f, 0x00, 0x28, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x22, 0x00, 0x2f, 0x00, 0x29, 0x00, 0x32, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x33, 0x00, 0x38, 0x00, 0x32, 0x00, 0x39, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x26, 0x00, 0x38, 0x00, 0x1f, 0x00, 0x37, 0x00, 0x1a, 0x00, 0x36, 0x00, 0x18, 0x00, 0x36, 0x00, 0x18, 0x00, 0x35, 0x00, 0x19, 0x00, 0x35, 0x00, 0x19, 0x00, 0x34, 0x00, 0x17, 0x00, 0x32, 0x00, 0x13, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0x28, 0x00, 0x07, 0x00, 0x20, 0x00, 0x02, 0x00, 0x18, 0x00, 0xff, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xf1, 0xff, 0xe7, 0xff, 0xef, 0xff, 0xe2, 0xff, 0xef, 0xff, 0xdd, 0xff, 0xf1, 0xff, 0xda, 0xff, 0xf4, 0xff, 0xd9, 0xff, 0xf6, 0xff, 0xdc, 0xff, 0xf7, 0xff, 0xe1, 0xff, 0xf7, 0xff, 0xe7, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x01, 0x00, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x15, 0x00, 0xef, 0xff, 0x1c, 0x00, 0xeb, 0xff, 0x22, 0x00, 0xe8, 0xff, 0x25, 0x00, 0xe7, 0xff, 0x26, 0x00, 0xe9, 0xff, 0x26, 0x00, 0xeb, 0xff, 0x26, 0x00, 0xec, 0xff, 0x26, 0x00, 0xec, 0xff, 0x28, 0x00, 0xe8, 0xff, 0x2a, 0x00, 0xe3, 0xff, 0x2c, 0x00, 0xde, 0xff, 0x2e, 0x00, 0xda, 0xff, 0x2d, 0x00, 0xd8, 0xff, 0x2a, 0x00, 0xd8, 0xff, 0x25, 0x00, 0xda, 0xff, 0x20, 0x00, 0xdc, 0xff, 0x1a, 0x00, 0xde, 0xff, 0x14, 0x00, 0xde, 0xff, 0x10, 0x00, 0xdc, 0xff, 0x0b, 0x00, 0xd9, 0xff, 0x08, 0x00, 0xd6, 0xff, 0x04, 0x00, 0xd5, 0xff, 0x00, 0x00, 0xd7, 0xff, 0xfa, 0xff, 0xda, 0xff, 0xf4, 0xff, 0xe0, 0xff, 0xed, 0xff, 0xe5, 0xff, 0xe6, 0xff, 0xe9, 0xff, 0xe0, 0xff, 0xea, 0xff, 0xdc, 0xff, 0xe8, 0xff, 0xd9, 0xff, 0xe7, 0xff, 0xd9, 0xff, 0xe6, 0xff, 0xda, 0xff, 0xe8, 0xff, 0xda, 0xff, 0xed, 0xff, 0xd9, 0xff, 0xf3, 0xff, 0xd6, 0xff, 0xfa, 0xff, 0xd2, 0xff, 0x01, 0x00, 0xce, 0xff, 0x05, 0x00, 0xcb, 0xff, 0x06, 0x00, 0xcb, 0xff, 0x05, 0x00, 0xce, 0xff, 0x03, 0x00, 0xd2, 0xff, 0x03, 0x00, 0xd4, 0xff, 0x05, 0x00, 0xd4, 0xff, 0x09, 0x00, 0xd0, 0xff, 0x0f, 0x00, 0xcc, 0xff, 0x13, 0x00, 0xc7, 0xff, 0x16, 0x00, 0xc5, 0xff, 0x17, 0x00, 0xc7, 0xff, 0x17, 0x00, 0xcb, 0xff, 0x17, 0x00, 0xd1, 0xff, 0x18, 0x00, 0xd4, 0xff, 0x1b, 0x00, 0xd6, 0xff, 0x1e, 0x00, 0xd6, 0xff, 0x21, 0x00, 0xd6, 0xff, 0x21, 0x00, 0xd8, 0xff, 0x1e, 0x00, 0xde, 0xff, 0x1a, 0x00, 0xe7, 0xff, 0x17, 0x00, 0xf1, 0xff, 0x15, 0x00, 0xfb, 0xff, 0x16, 0x00, 0x02, 0x00, 0x18, 0x00, 0x06, 0x00, 0x19, 0x00, 0x08, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x20, 0x00, 0x0b, 0x00, 0x2b, 0x00, 0x0b, 0x00, 0x35, 0x00, 0x0c, 0x00, 0x3b, 0x00, 0x0d, 0x00, 0x3d, 0x00, 0x0c, 0x00, 0x3c, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x05, 0x00, 0x39, 0x00, 0x00, 0x00, 0x3b, 0x00, 0xfb, 0xff, 0x3f, 0x00, 0xf6, 0xff, 0x44, 0x00, 0xf3, 0xff, 0x49, 0x00, 0xf0, 0xff, 0x4c, 0x00, 0xee, 0xff, 0x4c, 0x00, 0xed, 0xff, 0x49, 0x00, 0xed, 0xff, 0x43, 0x00, 0xec, 0xff, 0x3c, 0x00, 0xea, 0xff, 0x36, 0x00, 0xe6, 0xff, 0x32, 0x00, 0xe0, 0xff, 0x30, 0x00, 0xd9, 0xff, 0x2f, 0x00, 0xd2, 0xff, 0x2e, 0x00, 0xcc, 0xff, 0x2c, 0x00, 0xca, 0xff, 0x28, 0x00, 0xcb, 0xff, 0x23, 0x00, 0xce, 0xff, 0x1c, 0x00, 0xd1, 0xff, 0x16, 0x00, 0xd1, 0xff, 0x10, 0x00, 0xce, 0xff, 0x0c, 0x00, 0xc9, 0xff, 0x09, 0x00, 0xc4, 0xff, 0x07, 0x00, 0xc1, 0xff, 0x05, 0x00, 0xc2, 0xff, 0x04, 0x00, 0xc7, 0xff, 0x02, 0x00, 0xce, 0xff, 0xfe, 0xff, 0xd6, 0xff, 0xfa, 0xff, 0xdb, 0xff, 0xf5, 0xff, 0xde, 0xff, 0xf0, 0xff, 0xdd, 0xff, 0xed, 0xff, 0xdc, 0xff, 0xea, 0xff, 0xdb, 0xff, 0xe8, 0xff, 0xdf, 0xff, 0xe5, 0xff, 0xe7, 0xff, 0xe1, 0xff, 0xf2, 0xff, 0xdc, 0xff, 0xfd, 0xff, 0xd7, 0xff, 0x07, 0x00, 0xd0, 0xff, 0x0f, 0x00, 0xc9, 0xff, 0x13, 0x00, 0xc3, 0xff, 0x14, 0x00, 0xbf, 0xff, 0x14, 0x00, 0xbd, 0xff, 0x14, 0x00, 0xbf, 0xff, 0x14, 0x00, 0xc2, 0xff, 0x17, 0x00, 0xc6, 0xff, 0x1d, 0x00, 0xc8, 0xff, 0x23, 0x00, 0xc9, 0xff, 0x2a, 0x00, 0xca, 0xff, 0x30, 0x00, 0xca, 0xff, 0x32, 0x00, 0xcc, 0xff, 0x31, 0x00, 0xd0, 0xff, 0x2e, 0x00, 0xd5, 0xff, 0x2b, 0x00, 0xde, 0xff, 0x2a, 0x00, 0xe7, 0xff, 0x2c, 0x00, 0xf1, 0xff, 0x30, 0x00, 0xf9, 0xff, 0x34, 0x00, 0xfd, 0xff, 0x38, 0x00, 0xff, 0xff, 0x39, 0x00, 0xff, 0xff, 0x37, 0x00, 0xff, 0xff, 0x31, 0x00, 0x01, 0x00, 0x2c, 0x00, 0x05, 0x00, 0x28, 0x00, 0x0a, 0x00, 0x27, 0x00, 0x10, 0x00, 0x29, 0x00, 0x14, 0x00, 0x2c, 0x00, 0x16, 0x00, 0x2e, 0x00, 0x16, 0x00, 0x2e, 0x00, 0x14, 0x00, 0x2b, 0x00, 0x13, 0x00, 0x28, 0x00, 0x14, 0x00, 0x26, 0x00, 0x17, 0x00, 0x25, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x22, 0x00, 0x27, 0x00, 0x27, 0x00, 0x28, 0x00, 0x28, 0x00, 0x27, 0x00, 0x28, 0x00, 0x25, 0x00, 0x26, 0x00, 0x21, 0x00, 0x25, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x1c, 0x00, 0x27, 0x00, 0x1b, 0x00, 0x2b, 0x00, 0x1a, 0x00, 0x2f, 0x00, 0x19, 0x00, 0x32, 0x00, 0x15, 0x00, 0x32, 0x00, 0x11, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x2b, 0x00, 0x08, 0x00, 0x26, 0x00, 0x06, 0x00, 0x22, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x04, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xe9, 0xff, 0xf8, 0xff, 0xe4, 0xff, 0xf8, 0xff, 0xdf, 0xff, 0xf8, 0xff, 0xda, 0xff, 0xfa, 0xff, 0xd7, 0xff, 0xfc, 0xff, 0xd3, 0xff, 0xfd, 0xff, 0xd0, 0xff, 0xfd, 0xff, 0xce, 0xff, 0xfd, 0xff, 0xcc, 0xff, 0xfb, 0xff, 0xcc, 0xff, 0xf9, 0xff, 0xcc, 0xff, 0xf8, 0xff, 0xce, 0xff, 0xf9, 0xff, 0xd1, 0xff, 0xfa, 0xff, 0xd4, 0xff, 0xfb, 0xff, 0xd6, 0xff, 0xfd, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xd6, 0xff, 0x00, 0x00, 0xd6, 0xff, 0x01, 0x00, 0xd7, 0xff, 0x00, 0x00, 0xd9, 0xff, 0xff, 0xff, 0xde, 0xff, 0xfe, 0xff, 0xe3, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xfd, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xed, 0xff, 0x00, 0x00, 0xed, 0xff, 0x01, 0x00, 0xec, 0xff, 0x01, 0x00, 0xec, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x13, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x01, 0x00, 0x21, 0x00, 0x03, 0x00, 0x24, 0x00, 0x05, 0x00, 0x26, 0x00, 0x07, 0x00, 0x25, 0x00, 0x07, 0x00, 0x24, 0x00, 0x06, 0x00, 0x23, 0x00, 0x03, 0x00, 0x26, 0x00, 0x00, 0x00, 0x2b, 0x00, 0xfd, 0xff, 0x33, 0x00, 0xfc, 0xff, 0x3a, 0x00, 0xfb, 0xff, 0x3f, 0x00, 0xfb, 0xff, 0x41, 0x00, 0xf9, 0xff, 0x40, 0x00, 0xf6, 0xff, 0x3c, 0x00, 0xf1, 0xff, 0x38, 0x00, 0xeb, 0xff, 0x34, 0x00, 0xe6, 0xff, 0x31, 0x00, 0xe2, 0xff, 0x31, 0x00, 0xe0, 0xff, 0x32, 0x00, 0xdf, 0xff, 0x34, 0x00, 0xdf, 0xff, 0x34, 0x00, 0xde, 0xff, 0x34, 0x00, 0xda, 0xff, 0x31, 0x00, 0xd6, 0xff, 0x2b, 0x00, 0xd1, 0xff, 0x25, 0x00, 0xcd, 0xff, 0x1f, 0x00, 0xcb, 0xff, 0x1a, 0x00, 0xcb, 0xff, 0x19, 0x00, 0xcc, 0xff, 0x19, 0x00, 0xce, 0xff, 0x1a, 0x00, 0xd0, 0xff, 0x1a, 0x00, 0xd3, 0xff, 0x18, 0x00, 0xd6, 0xff, 0x13, 0x00, 0xd9, 0xff, 0x0e, 0x00, 0xdb, 0xff, 0x07, 0x00, 0xdd, 0xff, 0x02, 0x00, 0xdf, 0xff, 0xfc, 0xff, 0xe2, 0xff, 0xf8, 0xff, 0xe4, 0xff, 0xf6, 0xff, 0xe8, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xee, 0xff, 0xef, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xe5, 0xff, 0xf6, 0xff, 0xdf, 0xff, 0xf9, 0xff, 0xd9, 0xff, 0xfa, 0xff, 0xd4, 0xff, 0xfc, 0xff, 0xd1, 0xff, 0xfe, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xd0, 0xff, 0x01, 0x00, 0xd1, 0xff, 0x02, 0x00, 0xd2, 0xff, 0x02, 0x00, 0xd1, 0xff, 0x02, 0x00, 0xce, 0xff, 0x03, 0x00, 0xca, 0xff, 0x04, 0x00, 0xc6, 0xff, 0x05, 0x00, 0xc4, 0xff, 0x07, 0x00, 0xc3, 0xff, 0x08, 0x00, 0xc5, 0xff, 0x09, 0x00, 0xc8, 0xff, 0x0a, 0x00, 0xcc, 0xff, 0x0b, 0x00, 0xcf, 0xff, 0x0d, 0x00, 0xd0, 0xff, 0x10, 0x00, 0xcf, 0xff, 0x13, 0x00, 0xcd, 0xff, 0x15, 0x00, 0xcc, 0xff, 0x16, 0x00, 0xce, 0xff, 0x16, 0x00, 0xd2, 0xff, 0x15, 0x00, 0xd7, 0xff, 0x14, 0x00, 0xdd, 0xff, 0x15, 0x00, 0xe1, 0xff, 0x18, 0x00, 0xe4, 0xff, 0x1d, 0x00, 0xe4, 0xff, 0x22, 0x00, 0xe3, 0xff, 0x25, 0x00, 0xe2, 0xff, 0x25, 0x00, 0xe1, 0xff, 0x23, 0x00, 0xe3, 0xff, 0x1f, 0x00, 0xe7, 0xff, 0x1a, 0x00, 0xed, 0xff, 0x16, 0x00, 0xf2, 0xff, 0x13, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf7, 0xff, 0x12, 0x00, 0xf7, 0xff, 0x14, 0x00, 0xf7, 0xff, 0x16, 0x00, 0xf7, 0xff, 0x15, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0x02, 0x00, 0x08, 0x00, 0x06, 0x00, 0x04, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x15, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x02, 0x00, 0x1f, 0x00, 0xfb, 0xff, 0x20, 0x00, 0xf4, 0xff, 0x20, 0x00, 0xf1, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xf1, 0xff, 0x19, 0x00, 0xf3, 0xff, 0x17, 0x00, 0xf4, 0xff, 0x15, 0x00, 0xf2, 0xff, 0x15, 0x00, 0xee, 0xff, 0x16, 0x00, 0xe9, 0xff, 0x17, 0x00, 0xe5, 0xff, 0x18, 0x00, 0xe4, 0xff, 0x16, 0x00, 0xe6, 0xff, 0x13, 0x00, 0xea, 0xff, 0x0f, 0x00, 0xed, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x13, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf6, 0xff, 0x19, 0x00, 0xfb, 0xff, 0x19, 0x00, 0x00, 0x00, 0x18, 0x00, 0x05, 0x00, 0x16, 0x00, 0x08, 0x00, 0x16, 0x00, 0x08, 0x00, 0x17, 0x00, 0x06, 0x00, 0x18, 0x00, 0x03, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x18, 0x00, 0x04, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x11, 0x00, 0x10, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x09, 0x00, 0x11, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x13, 0x00, 0x14, 0x00, 0x17, 0x00, 0x14, 0x00, 0x19, 0x00, 0x13, 0x00, 0x18, 0x00, 0x13, 0x00, 0x16, 0x00, 0x13, 0x00, 0x14, 0x00, 0x12, 0x00, 0x13, 0x00, 0x11, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x0c, 0x00, 0x1f, 0x00, 0x09, 0x00, 0x23, 0x00, 0x05, 0x00, 0x25, 0x00, 0x01, 0x00, 0x24, 0x00, 0xfd, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x1f, 0x00, 0xf6, 0xff, 0x1d, 0x00, 0xf4, 0xff, 0x1c, 0x00, 0xf0, 0xff, 0x1e, 0x00, 0xec, 0xff, 0x1f, 0x00, 0xe7, 0xff, 0x20, 0x00, 0xe3, 0xff, 0x20, 0x00, 0xe1, 0xff, 0x1d, 0x00, 0xe1, 0xff, 0x18, 0x00, 0xe2, 0xff, 0x14, 0x00, 0xe5, 0xff, 0x0f, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x03, 0x00, 0xe2, 0xff, 0x02, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xe1, 0xff, 0xfc, 0xff, 0xe4, 0xff, 0xf7, 0xff, 0xe9, 0xff, 0xf1, 0xff, 0xee, 0xff, 0xeb, 0xff, 0xf2, 0xff, 0xe5, 0xff, 0xf3, 0xff, 0xe0, 0xff, 0xf2, 0xff, 0xdd, 0xff, 0xf1, 0xff, 0xdb, 0xff, 0xf0, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xd8, 0xff, 0xf4, 0xff, 0xd7, 0xff, 0xf7, 0xff, 0xd4, 0xff, 0xfb, 0xff, 0xd1, 0xff, 0xfd, 0xff, 0xcd, 0xff, 0xfe, 0xff, 0xc9, 0xff, 0xfe, 0xff, 0xc7, 0xff, 0xfd, 0xff, 0xc7, 0xff, 0xfc, 0xff, 0xc9, 0xff, 0xfc, 0xff, 0xcc, 0xff, 0xfd, 0xff, 0xce, 0xff, 0xfe, 0xff, 0xd0, 0xff, 0x00, 0x00, 0xd0, 0xff, 0x01, 0x00, 0xcf, 0xff, 0x01, 0x00, 0xce, 0xff, 0x01, 0x00, 0xcd, 0xff, 0x01, 0x00, 0xcc, 0xff, 0x02, 0x00, 0xcc, 0xff, 0x04, 0x00, 0xcd, 0xff, 0x06, 0x00, 0xcf, 0xff, 0x07, 0x00, 0xd1, 0xff, 0x09, 0x00, 0xd3, 0xff, 0x0b, 0x00, 0xd4, 0xff, 0x0d, 0x00, 0xd4, 0xff, 0x11, 0x00, 0xd4, 0xff, 0x14, 0x00, 0xd4, 0xff, 0x16, 0x00, 0xd7, 0xff, 0x17, 0x00, 0xdb, 0xff, 0x18, 0x00, 0xe0, 0xff, 0x1a, 0x00, 0xe5, 0xff, 0x1c, 0x00, 0xea, 0xff, 0x1f, 0x00, 0xef, 0xff, 0x22, 0x00, 0xf4, 0xff, 0x24, 0x00, 0xf8, 0xff, 0x24, 0x00, 0xfd, 0xff, 0x22, 0x00, 0x02, 0x00, 0x20, 0x00, 0x07, 0x00, 0x1d, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x18, 0x00, 0x23, 0x00, 0x14, 0x00, 0x24, 0x00, 0x10, 0x00, 0x23, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x1d, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x08, 0x00, 0x1f, 0x00, 0x03, 0x00, 0x21, 0x00, 0xfe, 0xff, 0x22, 0x00, 0xfa, 0xff, 0x21, 0x00, 0xf7, 0xff, 0x1e, 0x00, 0xf4, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x16, 0x00, 0xef, 0xff, 0x13, 0x00, 0xed, 0xff, 0x12, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xe5, 0xff, 0x13, 0x00, 0xe1, 0xff, 0x13, 0x00, 0xde, 0xff, 0x12, 0x00, 0xdb, 0xff, 0x0f, 0x00, 0xd9, 0xff, 0x0b, 0x00, 0xd8, 0xff, 0x06, 0x00, 0xd6, 0xff, 0x03, 0x00, 0xd5, 0xff, 0x01, 0x00, 0xd4, 0xff, 0x01, 0x00, 0xd3, 0xff, 0x01, 0x00, 0xd3, 0xff, 0x01, 0x00, 0xd3, 0xff, 0x00, 0x00, 0xd2, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xfd, 0xff, 0xd3, 0xff, 0xfa, 0xff, 0xd4, 0xff, 0xf5, 0xff, 0xd6, 0xff, 0xef, 0xff, 0xd7, 0xff, 0xe9, 0xff, 0xd8, 0xff, 0xe4, 0xff, 0xd9, 0xff, 0xe1, 0xff, 0xdc, 0xff, 0xde, 0xff, 0xe0, 0xff, 0xdc, 0xff, 0xe5, 0xff, 0xda, 0xff, 0xea, 0xff, 0xd8, 0xff, 0xed, 0xff, 0xd6, 0xff, 0xef, 0xff, 0xd4, 0xff, 0xf0, 0xff, 0xd4, 0xff, 0xf0, 0xff, 0xd5, 0xff, 0xf2, 0xff, 0xd7, 0xff, 0xf5, 0xff, 0xda, 0xff, 0xfa, 0xff, 0xde, 0xff, 0x00, 0x00, 0xe1, 0xff, 0x06, 0x00, 0xe5, 0xff, 0x0a, 0x00, 0xe9, 0xff, 0x0b, 0x00, 0xee, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x17, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x02, 0x00, 0x22, 0x00, 0x02, 0x00, 0x23, 0x00, 0x02, 0x00, 0x22, 0x00, 0x04, 0x00, 0x20, 0x00, 0x05, 0x00, 0x1f, 0x00, 0x06, 0x00, 0x20, 0x00, 0x05, 0x00, 0x23, 0x00, 0x03, 0x00, 0x26, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, 0x00, 0x25, 0x00, 0x03, 0x00, 0x20, 0x00, 0x06, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x06, 0x00, 0x16, 0x00, 0x02, 0x00, 0x19, 0x00, 0xfe, 0xff, 0x1b, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf5, 0xff, 0x1c, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xec, 0xff, 0x1d, 0x00, 0xe9, 0xff, 0x1d, 0x00, 0xe7, 0xff, 0x1d, 0x00, 0xe5, 0xff, 0x1e, 0x00, 0xe5, 0xff, 0x1f, 0x00, 0xe5, 0xff, 0x20, 0x00, 0xe5, 0xff, 0x20, 0x00, 0xe4, 0xff, 0x20, 0x00, 0xe1, 0xff, 0x1f, 0x00, 0xdd, 0xff, 0x1f, 0x00, 0xd9, 0xff, 0x20, 0x00, 0xd5, 0xff, 0x21, 0x00, 0xd4, 0xff, 0x22, 0x00, 0xd4, 0xff, 0x23, 0x00, 0xd5, 0xff, 0x23, 0x00, 0xd6, 0xff, 0x22, 0x00, 0xd7, 0xff, 0x21, 0x00, 0xd8, 0xff, 0x1f, 0x00, 0xd9, 0xff, 0x1d, 0x00, 0xd9, 0xff, 0x1a, 0x00, 0xd9, 0xff, 0x19, 0x00, 0xda, 0xff, 0x18, 0x00, 0xdd, 0xff, 0x17, 0x00, 0xe1, 0xff, 0x14, 0x00, 0xe6, 0xff, 0x10, 0x00, 0xec, 0xff, 0x0a, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x23, 0x00, 0xf0, 0xff, 0x2b, 0x00, 0xeb, 0xff, 0x30, 0x00, 0xe6, 0xff, 0x32, 0x00, 0xe1, 0xff, 0x33, 0x00, 0xdf, 0xff, 0x32, 0x00, 0xde, 0xff, 0x32, 0x00, 0xde, 0xff, 0x33, 0x00, 0xdd, 0xff, 0x36, 0x00, 0xdb, 0xff, 0x3b, 0x00, 0xd9, 0xff, 0x41, 0x00, 0xd6, 0xff, 0x44, 0x00, 0xd4, 0xff, 0x45, 0x00, 0xd3, 0xff, 0x43, 0x00, 0xd3, 0xff, 0x3e, 0x00, 0xd6, 0xff, 0x3a, 0x00, 0xda, 0xff, 0x37, 0x00, 0xdf, 0xff, 0x37, 0x00, 0xe4, 0xff, 0x38, 0x00, 0xe8, 0xff, 0x3a, 0x00, 0xec, 0xff, 0x3b, 0x00, 0xf1, 0xff, 0x3b, 0x00, 0xf6, 0xff, 0x39, 0x00, 0xfd, 0xff, 0x37, 0x00, 0x04, 0x00, 0x35, 0x00, 0x0b, 0x00, 0x36, 0x00, 0x11, 0x00, 0x37, 0x00, 0x17, 0x00, 0x38, 0x00, 0x1b, 0x00, 0x36, 0x00, 0x1f, 0x00, 0x33, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x25, 0x00, 0x29, 0x00, 0x28, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x23, 0x00, 0x2d, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x21, 0x00, 0x2c, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x1a, 0x00, 0x25, 0x00, 0x13, 0x00, 0x22, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x03, 0x00, 0x1f, 0x00, 0xfd, 0xff, 0x1e, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf0, 0xff, 0x15, 0x00, 0xea, 0xff, 0x12, 0x00, 0xe5, 0xff, 0x11, 0x00, 0xe0, 0xff, 0x10, 0x00, 0xdd, 0xff, 0x0f, 0x00, 0xdb, 0xff, 0x0d, 0x00, 0xdb, 0xff, 0x0b, 0x00, 0xda, 0xff, 0x08, 0x00, 0xda, 0xff, 0x06, 0x00, 0xd9, 0xff, 0x04, 0x00, 0xd8, 0xff, 0x04, 0x00, 0xd6, 0xff, 0x04, 0x00, 0xd3, 0xff, 0x03, 0x00, 0xd1, 0xff, 0x02, 0x00, 0xce, 0xff, 0x00, 0x00, 0xcc, 0xff, 0xfd, 0xff, 0xcb, 0xff, 0xfb, 0xff, 0xca, 0xff, 0xfb, 0xff, 0xcc, 0xff, 0xfb, 0xff, 0xce, 0xff, 0xfc, 0xff, 0xd1, 0xff, 0xfb, 0xff, 0xd3, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0xd2, 0xff, 0xf2, 0xff, 0xcf, 0xff, 0xee, 0xff, 0xcd, 0xff, 0xeb, 0xff, 0xcb, 0xff, 0xea, 0xff, 0xcd, 0xff, 0xe9, 0xff, 0xd2, 0xff, 0xe8, 0xff, 0xd9, 0xff, 0xe7, 0xff, 0xe1, 0xff, 0xe5, 0xff, 0xe8, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe0, 0xff, 0xf0, 0xff, 0xde, 0xff, 0xf2, 0xff, 0xdb, 0xff, 0xf4, 0xff, 0xd8, 0xff, 0xf7, 0xff, 0xd7, 0xff, 0xfc, 0xff, 0xd8, 0xff, 0x01, 0x00, 0xda, 0xff, 0x08, 0x00, 0xdd, 0xff, 0x0d, 0x00, 0xe0, 0xff, 0x12, 0x00, 0xe1, 0xff, 0x15, 0x00, 0xe0, 0xff, 0x17, 0x00, 0xdd, 0xff, 0x1a, 0x00, 0xda, 0xff, 0x1c, 0x00, 0xd8, 0xff, 0x1d, 0x00, 0xd8, 0xff, 0x1e, 0x00, 0xdb, 0xff, 0x1f, 0x00, 0xe1, 0xff, 0x21, 0x00, 0xe7, 0xff, 0x23, 0x00, 0xed, 0xff, 0x24, 0x00, 0xf0, 0xff, 0x25, 0x00, 0xf0, 0xff, 0x24, 0x00, 0xef, 0xff, 0x21, 0x00, 0xed, 0xff, 0x1d, 0x00, 0xee, 0xff, 0x19, 0x00, 0xf1, 0xff, 0x16, 0x00, 0xf8, 0xff, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0x07, 0x00, 0x15, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x07, 0x00, 0x16, 0x00, 0x04, 0x00, 0x19, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x03, 0x00, 0x20, 0x00, 0x03, 0x00, 0x22, 0x00, 0x02, 0x00, 0x22, 0x00, 0x01, 0x00, 0x21, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xfe, 0xff, 0x1c, 0x00, 0xfc, 0xff, 0x18, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xf8, 0xff, 0x13, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x12, 0x00, 0xf1, 0xff, 0x12, 0x00, 0xee, 0xff, 0x10, 0x00, 0xed, 0xff, 0x0d, 0x00, 0xed, 0xff, 0x09, 0x00, 0xed, 0xff, 0x04, 0x00, 0xec, 0xff, 0x01, 0x00, 0xeb, 0xff, 0xff, 0xff, 0xea, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x01, 0x00, 0xe7, 0xff, 0x01, 0x00, 0xe7, 0xff, 0x01, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xea, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfc, 0xff, 0xeb, 0xff, 0xfc, 0xff, 0xea, 0xff, 0xfd, 0xff, 0xea, 0xff, 0x00, 0x00, 0xea, 0xff, 0x01, 0x00, 0xec, 0xff, 0x01, 0x00, 0xee, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xf5, 0xff, 0xee, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xf1, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xff, 0xff, 0x16, 0x00, 0x03, 0x00, 0x1b, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x0e, 0x00, 0x20, 0x00, 0x0e, 0x00, 0x20, 0x00, 0x10, 0x00, 0x20, 0x00, 0x12, 0x00, 0x21, 0x00, 0x15, 0x00, 0x22, 0x00, 0x16, 0x00, 0x23, 0x00, 0x17, 0x00, 0x23, 0x00, 0x16, 0x00, 0x22, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x1b, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x09, 0x00, 0x20, 0x00, 0x08, 0x00, 0x22, 0x00, 0x05, 0x00, 0x23, 0x00, 0x01, 0x00, 0x22, 0x00, 0xfc, 0xff, 0x21, 0x00, 0xf6, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0x1e, 0x00, 0xeb, 0xff, 0x1f, 0x00, 0xe8, 0xff, 0x21, 0x00, 0xe6, 0xff, 0x24, 0x00, 0xe5, 0xff, 0x28, 0x00, 0xe4, 0xff, 0x29, 0x00, 0xe3, 0xff, 0x27, 0x00, 0xe0, 0xff, 0x23, 0x00, 0xdd, 0xff, 0x1c, 0x00, 0xd9, 0xff, 0x15, 0x00, 0xd5, 0xff, 0x0e, 0x00, 0xd2, 0xff, 0x0a, 0x00, 0xd1, 0xff, 0x08, 0x00, 0xd1, 0xff, 0x06, 0x00, 0xd2, 0xff, 0x04, 0x00, 0xd3, 0xff, 0xff, 0xff, 0xd4, 0xff, 0xf9, 0xff, 0xd5, 0xff, 0xef, 0xff, 0xd6, 0xff, 0xe4, 0xff, 0xd7, 0xff, 0xda, 0xff, 0xd7, 0xff, 0xd1, 0xff, 0xd8, 0xff, 0xcb, 0xff, 0xda, 0xff, 0xc8, 0xff, 0xde, 0xff, 0xc8, 0xff, 0xe2, 0xff, 0xc9, 0xff, 0xe6, 0xff, 0xc9, 0xff, 0xea, 0xff, 0xc6, 0xff, 0xed, 0xff, 0xc2, 0xff, 0xee, 0xff, 0xbd, 0xff, 0xef, 0xff, 0xb9, 0xff, 0xf0, 0xff, 0xb7, 0xff, 0xf2, 0xff, 0xb8, 0xff, 0xf5, 0xff, 0xbc, 0xff, 0xf9, 0xff, 0xc3, 0xff, 0xfe, 0xff, 0xc9, 0xff, 0x03, 0x00, 0xcf, 0xff, 0x07, 0x00, 0xd2, 0xff, 0x0a, 0x00, 0xd4, 0xff, 0x0b, 0x00, 0xd5, 0xff, 0x0b, 0x00, 0xd7, 0xff, 0x0c, 0x00, 0xd9, 0xff, 0x0f, 0x00, 0xdd, 0xff, 0x13, 0x00, 0xe3, 0xff, 0x17, 0x00, 0xe8, 0xff, 0x1c, 0x00, 0xed, 0xff, 0x20, 0x00, 0xef, 0xff, 0x23, 0x00, 0xef, 0xff, 0x25, 0x00, 0xed, 0xff, 0x25, 0x00, 0xec, 0xff, 0x24, 0x00, 0xec, 0xff, 0x24, 0x00, 0xee, 0xff, 0x25, 0x00, 0xf2, 0xff, 0x27, 0x00, 0xf8, 0xff, 0x29, 0x00, 0xfd, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x25, 0x00, 0xff, 0xff, 0x22, 0x00, 0xfe, 0xff, 0x20, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x02, 0x00, 0x20, 0x00, 0x07, 0x00, 0x21, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x10, 0x00, 0x20, 0x00, 0x14, 0x00, 0x1e, 0x00, 0x15, 0x00, 0x1c, 0x00, 0x16, 0x00, 0x1b, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x1d, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x18, 0x00, 0x1d, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x14, 0x00, 0x1a, 0x00, 0x13, 0x00, 0x19, 0x00, 0x13, 0x00, 0x18, 0x00, 0x13, 0x00, 0x18, 0x00, 0x12, 0x00, 0x17, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x09, 0x00, 0xf3, 0xff, 0x08, 0x00, 0xee, 0xff, 0x06, 0x00, 0xea, 0xff, 0x03, 0x00, 0xe7, 0xff, 0x00, 0x00, 0xe4, 0xff, 0xfc, 0xff, 0xe2, 0xff, 0xfa, 0xff, 0xe0, 0xff, 0xf9, 0xff, 0xdc, 0xff, 0xf8, 0xff, 0xd8, 0xff, 0xf8, 0xff, 0xd4, 0xff, 0xf6, 0xff, 0xd0, 0xff, 0xf3, 0xff, 0xcd, 0xff, 0xf0, 0xff, 0xcd, 0xff, 0xef, 0xff, 0xce, 0xff, 0xf1, 0xff, 0xd1, 0xff, 0xf4, 0xff, 0xd3, 0xff, 0xf8, 0xff, 0xd5, 0xff, 0xfa, 0xff, 0xd4, 0xff, 0xfa, 0xff, 0xd3, 0xff, 0xf9, 0xff, 0xd2, 0xff, 0xf7, 0xff, 0xd2, 0xff, 0xf6, 0xff, 0xd5, 0xff, 0xf7, 0xff, 0xda, 0xff, 0xfa, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x05, 0x00, 0xea, 0xff, 0x08, 0x00, 0xed, 0xff, 0x09, 0x00, 0xed, 0xff, 0x07, 0x00, 0xed, 0xff, 0x05, 0x00, 0xed, 0xff, 0x02, 0x00, 0xef, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0c, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x13, 0x00, 0x02, 0x00, 0x14, 0x00, 0x09, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x17, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x12, 0x00, 0x20, 0x00, 0x11, 0x00, 0x22, 0x00, 0x0f, 0x00, 0x24, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x0b, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x3a, 0x00, 0x0b, 0x00, 0x41, 0x00, 0x0a, 0x00, 0x47, 0x00, 0x08, 0x00, 0x4b, 0x00, 0x04, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4d, 0x00, 0xfc, 0xff, 0x4d, 0x00, 0xfa, 0xff, 0x4c, 0x00, 0xf8, 0xff, 0x4b, 0x00, 0xf9, 0xff, 0x4a, 0x00, 0xf9, 0xff, 0x4a, 0x00, 0xf9, 0xff, 0x49, 0x00, 0xf7, 0xff, 0x47, 0x00, 0xf2, 0xff, 0x44, 0x00, 0xed, 0xff, 0x41, 0x00, 0xe9, 0xff, 0x3e, 0x00, 0xe6, 0xff, 0x3a, 0x00, 0xe5, 0xff, 0x35, 0x00, 0xe4, 0xff, 0x2f, 0x00, 0xe4, 0xff, 0x2a, 0x00, 0xe3, 0xff, 0x24, 0x00, 0xe1, 0xff, 0x20, 0x00, 0xde, 0xff, 0x1d, 0x00, 0xdb, 0xff, 0x1b, 0x00, 0xd9, 0xff, 0x19, 0x00, 0xd9, 0xff, 0x17, 0x00, 0xd9, 0xff, 0x13, 0x00, 0xdb, 0xff, 0x0d, 0x00, 0xdc, 0xff, 0x06, 0x00, 0xdd, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xfa, 0xff, 0xdd, 0xff, 0xf9, 0xff, 0xde, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xfe, 0xff, 0xe0, 0xff, 0x01, 0x00, 0xe1, 0xff, 0x02, 0x00, 0xe2, 0xff, 0x00, 0x00, 0xe4, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xee, 0xff, 0x02, 0x00, 0xee, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0c, 0x00, 0xf7, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x11, 0x00, 0xf3, 0xff, 0x13, 0x00, 0xf3, 0xff, 0x15, 0x00, 0xf5, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf9, 0xff, 0x1e, 0x00, 0xfc, 0xff, 0x22, 0x00, 0xfd, 0xff, 0x25, 0x00, 0xfd, 0xff, 0x26, 0x00, 0xfc, 0xff, 0x26, 0x00, 0xfa, 0xff, 0x26, 0x00, 0xf9, 0xff, 0x26, 0x00, 0xf9, 0xff, 0x27, 0x00, 0xfb, 0xff, 0x29, 0x00, 0xfe, 0xff, 0x2c, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x07, 0x00, 0x29, 0x00, 0x08, 0x00, 0x25, 0x00, 0x09, 0x00, 0x22, 0x00, 0x09, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf9, 0xff, 0xef, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xe9, 0xff, 0xf6, 0xff, 0xe7, 0xff, 0xf6, 0xff, 0xe5, 0xff, 0xf7, 0xff, 0xe2, 0xff, 0xf8, 0xff, 0xe0, 0xff, 0xf9, 0xff, 0xde, 0xff, 0xf9, 0xff, 0xdc, 0xff, 0xf7, 0xff, 0xda, 0xff, 0xf4, 0xff, 0xda, 0xff, 0xf3, 0xff, 0xd9, 0xff, 0xf2, 0xff, 0xd9, 0xff, 0xf3, 0xff, 0xd8, 0xff, 0xf5, 0xff, 0xd7, 0xff, 0xf8, 0xff, 0xd5, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xfa, 0xff, 0xd4, 0xff, 0xfa, 0xff, 0xd5, 0xff, 0xfa, 0xff, 0xd8, 0xff, 0xfa, 0xff, 0xdd, 0xff, 0xfa, 0xff, 0xe2, 0xff, 0xfa, 0xff, 0xe5, 0xff, 0xfb, 0xff, 0xe8, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x02, 0x00, 0xe6, 0xff, 0x04, 0x00, 0xe7, 0xff, 0x05, 0x00, 0xeb, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x06, 0x00, 0xff, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xff, 0xff, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0f, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x11, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xff, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xf5, 0xff, 0x12, 0x00, 0xf4, 0xff, 0x12, 0x00, 0xf5, 0xff, 0x12, 0x00, 0xf6, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xf5, 0xff, 0x11, 0x00, 0xf1, 0xff, 0x12, 0x00, 0xed, 0xff, 0x12, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xe7, 0xff, 0x11, 0x00, 0xe7, 0xff, 0x10, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0xe9, 0xff, 0x0e, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x0e, 0x00, 0xe6, 0xff, 0x0e, 0x00, 0xe5, 0xff, 0x0e, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x0a, 0x00, 0xe6, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x05, 0x00, 0xec, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0d, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf2, 0xff, 0x0d, 0x00, 0xf2, 0xff, 0x0f, 0x00, 0xf1, 0xff, 0x12, 0x00, 0xef, 0xff, 0x15, 0x00, 0xed, 0xff, 0x16, 0x00, 0xeb, 0xff, 0x16, 0x00, 0xeb, 0xff, 0x13, 0x00, 0xea, 0xff, 0x10, 0x00, 0xea, 0xff, 0x0d, 0x00, 0xeb, 0xff, 0x0a, 0x00, 0xed, 0xff, 0x07, 0x00, 0xef, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x07, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfb, 0xff, 0x17, 0x00, 0xfc, 0xff, 0x1c, 0x00, 0xfd, 0xff, 0x20, 0x00, 0xff, 0xff, 0x22, 0x00, 0x00, 0x00, 0x24, 0x00, 0xfe, 0xff, 0x25, 0x00, 0xfc, 0xff, 0x26, 0x00, 0xf9, 0xff, 0x27, 0x00, 0xf7, 0xff, 0x29, 0x00, 0xf7, 0xff, 0x2b, 0x00, 0xf9, 0xff, 0x2e, 0x00, 0xfa, 0xff, 0x30, 0x00, 0xfb, 0xff, 0x31, 0x00, 0xf9, 0xff, 0x32, 0x00, 0xf6, 0xff, 0x32, 0x00, 0xf1, 0xff, 0x31, 0x00, 0xec, 0xff, 0x30, 0x00, 0xea, 0xff, 0x2e, 0x00, 0xeb, 0xff, 0x2c, 0x00, 0xec, 0xff, 0x2b, 0x00, 0xee, 0xff, 0x2a, 0x00, 0xef, 0xff, 0x28, 0x00, 0xed, 0xff, 0x25, 0x00, 0xe9, 0xff, 0x22, 0x00, 0xe5, 0xff, 0x1e, 0x00, 0xe2, 0xff, 0x1a, 0x00, 0xe0, 0xff, 0x15, 0x00, 0xe1, 0xff, 0x10, 0x00, 0xe3, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x06, 0x00, 0xe6, 0xff, 0x02, 0x00, 0xe5, 0xff, 0xfe, 0xff, 0xe4, 0xff, 0xfb, 0xff, 0xe2, 0xff, 0xf7, 0xff, 0xe1, 0xff, 0xf2, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xe1, 0xff, 0xf4, 0xff, 0xde, 0xff, 0xfc, 0xff, 0xdc, 0xff, 0x02, 0x00, 0xdc, 0xff, 0x07, 0x00, 0xdc, 0xff, 0x0a, 0x00, 0xdb, 0xff, 0x0c, 0x00, 0xda, 0xff, 0x0e, 0x00, 0xd8, 0xff, 0x10, 0x00, 0xd5, 0xff, 0x14, 0x00, 0xd2, 0xff, 0x1a, 0x00, 0xd1, 0xff, 0x22, 0x00, 0xd0, 0xff, 0x29, 0x00, 0xd2, 0xff, 0x2f, 0x00, 0xd4, 0xff, 0x31, 0x00, 0xd5, 0xff, 0x30, 0x00, 0xd7, 0xff, 0x2d, 0x00, 0xd7, 0xff, 0x28, 0x00, 0xd7, 0xff, 0x24, 0x00, 0xd7, 0xff, 0x23, 0x00, 0xd7, 0xff, 0x25, 0x00, 0xd8, 0xff, 0x27, 0x00, 0xda, 0xff, 0x28, 0x00, 0xdd, 0xff, 0x26, 0x00, 0xe1, 0xff, 0x21, 0x00, 0xe3, 0xff, 0x1a, 0x00, 0xe4, 0xff, 0x13, 0x00, 0xe3, 0xff, 0x0d, 0x00, 0xe1, 0xff, 0x0a, 0x00, 0xdf, 0xff, 0x09, 0x00, 0xe0, 0xff, 0x0a, 0x00, 0xe2, 0xff, 0x0b, 0x00, 0xe7, 0xff, 0x0a, 0x00, 0xed, 0xff, 0x08, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf5, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x13, 0x00, 0x07, 0x00, 0x19, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xfc, 0xff, 0x20, 0x00, 0xfb, 0xff, 0x23, 0x00, 0xfa, 0xff, 0x26, 0x00, 0xfb, 0xff, 0x2a, 0x00, 0xfc, 0xff, 0x2d, 0x00, 0xfb, 0xff, 0x2e, 0x00, 0xf8, 0xff, 0x2f, 0x00, 0xf4, 0xff, 0x2e, 0x00, 0xef, 0xff, 0x2c, 0x00, 0xeb, 0xff, 0x2a, 0x00, 0xe8, 0xff, 0x29, 0x00, 0xe6, 0xff, 0x28, 0x00, 0xe5, 0xff, 0x27, 0x00, 0xe4, 0xff, 0x27, 0x00, 0xe3, 0xff, 0x26, 0x00, 0xe1, 0xff, 0x25, 0x00, 0xe0, 0xff, 0x23, 0x00, 0xe0, 0xff, 0x20, 0x00, 0xe0, 0xff, 0x1c, 0x00, 0xe0, 0xff, 0x18, 0x00, 0xe1, 0xff, 0x14, 0x00, 0xe2, 0xff, 0x11, 0x00, 0xe3, 0xff, 0x0f, 0x00, 0xe3, 0xff, 0x0d, 0x00, 0xe3, 0xff, 0x0a, 0x00, 0xe5, 0xff, 0x06, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xee, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xed, 0xff, 0x01, 0x00, 0xe8, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe5, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x0f, 0x00, 0xe1, 0xff, 0x13, 0x00, 0xde, 0xff, 0x18, 0x00, 0xd9, 0xff, 0x1d, 0x00, 0xd3, 0xff, 0x22, 0x00, 0xcf, 0xff, 0x26, 0x00, 0xcc, 0xff, 0x28, 0x00, 0xca, 0xff, 0x28, 0x00, 0xc8, 0xff, 0x27, 0x00, 0xc6, 0xff, 0x27, 0x00, 0xc5, 0xff, 0x26, 0x00, 0xc3, 0xff, 0x25, 0x00, 0xc0, 0xff, 0x25, 0x00, 0xbe, 0xff, 0x25, 0x00, 0xbc, 0xff, 0x25, 0x00, 0xbc, 0xff, 0x26, 0x00, 0xbd, 0xff, 0x26, 0x00, 0xc0, 0xff, 0x25, 0x00, 0xc4, 0xff, 0x23, 0x00, 0xc9, 0xff, 0x20, 0x00, 0xce, 0xff, 0x1d, 0x00, 0xd3, 0xff, 0x1a, 0x00, 0xd8, 0xff, 0x19, 0x00, 0xdb, 0xff, 0x18, 0x00, 0xdd, 0xff, 0x18, 0x00, 0xdf, 0xff, 0x18, 0x00, 0xe3, 0xff, 0x17, 0x00, 0xe8, 0xff, 0x16, 0x00, 0xf0, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x11, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x09, 0x00, 0x05, 0x00, 0x07, 0x00, 0x04, 0x00, 0x09, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x15, 0x00, 0xff, 0xff, 0x1c, 0x00, 0xfc, 0xff, 0x20, 0x00, 0xfa, 0xff, 0x21, 0x00, 0xf7, 0xff, 0x1f, 0x00, 0xf5, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xef, 0xff, 0x1d, 0x00, 0xec, 0xff, 0x21, 0x00, 0xe9, 0xff, 0x27, 0x00, 0xe6, 0xff, 0x2c, 0x00, 0xe2, 0xff, 0x30, 0x00, 0xdd, 0xff, 0x30, 0x00, 0xd9, 0xff, 0x2f, 0x00, 0xd4, 0xff, 0x2d, 0x00, 0xd2, 0xff, 0x2c, 0x00, 0xd0, 0xff, 0x2d, 0x00, 0xd1, 0xff, 0x30, 0x00, 0xd2, 0xff, 0x33, 0x00, 0xd4, 0xff, 0x36, 0x00, 0xd5, 0xff, 0x38, 0x00, 0xd5, 0xff, 0x38, 0x00, 0xd5, 0xff, 0x36, 0x00, 0xd5, 0xff, 0x33, 0x00, 0xd6, 0xff, 0x31, 0x00, 0xd9, 0xff, 0x2f, 0x00, 0xdd, 0xff, 0x2e, 0x00, 0xe2, 0xff, 0x2e, 0x00, 0xe7, 0xff, 0x2c, 0x00, 0xec, 0xff, 0x2b, 0x00, 0xef, 0xff, 0x28, 0x00, 0xf3, 0xff, 0x25, 0x00, 0xf6, 0xff, 0x21, 0x00, 0xf8, 0xff, 0x1c, 0x00, 0xfa, 0xff, 0x17, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x05, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xef, 0xff, 0x07, 0x00, 0xeb, 0xff, 0x07, 0x00, 0xea, 0xff, 0x07, 0x00, 0xea, 0xff, 0x0a, 0x00, 0xeb, 0xff, 0x0e, 0x00, 0xec, 0xff, 0x11, 0x00, 0xec, 0xff, 0x13, 0x00, 0xeb, 0xff, 0x13, 0x00, 0xea, 0xff, 0x13, 0x00, 0xe8, 0xff, 0x11, 0x00, 0xe8, 0xff, 0x11, 0x00, 0xea, 0xff, 0x12, 0x00, 0xed, 0xff, 0x15, 0x00, 0xf1, 0xff, 0x19, 0x00, 0xf4, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1e, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0xf9, 0xff, 0x1e, 0x00, 0xfa, 0xff, 0x1d, 0x00, 0xfb, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x18, 0x00, 0xff, 0xff, 0x16, 0x00, 0x01, 0x00, 0x14, 0x00, 0x02, 0x00, 0x12, 0x00, 0x03, 0x00, 0x11, 0x00, 0x04, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x0b, 0x00, 0xef, 0xff, 0x0b, 0x00, 0xed, 0xff, 0x0b, 0x00, 0xea, 0xff, 0x0b, 0x00, 0xe6, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x0f, 0x00, 0xe2, 0xff, 0x11, 0x00, 0xe3, 0xff, 0x12, 0x00, 0xe4, 0xff, 0x12, 0x00, 0xe3, 0xff, 0x10, 0x00, 0xe1, 0xff, 0x0e, 0x00, 0xde, 0xff, 0x0c, 0x00, 0xdd, 0xff, 0x0b, 0x00, 0xdb, 0xff, 0x0a, 0x00, 0xdb, 0xff, 0x0b, 0x00, 0xdc, 0xff, 0x0a, 0x00, 0xdd, 0xff, 0x08, 0x00, 0xde, 0xff, 0x04, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xfb, 0xff, 0xe1, 0xff, 0xf7, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xe4, 0xff, 0xf5, 0xff, 0xe6, 0xff, 0xf4, 0xff, 0xe8, 0xff, 0xf3, 0xff, 0xea, 0xff, 0xf0, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xee, 0xff, 0xe6, 0xff, 0xf1, 0xff, 0xe1, 0xff, 0xf5, 0xff, 0xdd, 0xff, 0xfa, 0xff, 0xdb, 0xff, 0xfe, 0xff, 0xda, 0xff, 0x02, 0x00, 0xda, 0xff, 0x05, 0x00, 0xda, 0xff, 0x07, 0x00, 0xdb, 0xff, 0x0a, 0x00, 0xda, 0xff, 0x0d, 0x00, 0xda, 0xff, 0x11, 0x00, 0xd9, 0xff, 0x15, 0x00, 0xd9, 0xff, 0x19, 0x00, 0xda, 0xff, 0x1d, 0x00, 0xdb, 0xff, 0x1f, 0x00, 0xdc, 0xff, 0x21, 0x00, 0xde, 0xff, 0x22, 0x00, 0xe1, 0xff, 0x24, 0x00, 0xe3, 0xff, 0x27, 0x00, 0xe5, 0xff, 0x29, 0x00, 0xe7, 0xff, 0x2b, 0x00, 0xe8, 0xff, 0x2c, 0x00, 0xea, 0xff, 0x2d, 0x00, 0xeb, 0xff, 0x2d, 0x00, 0xec, 0xff, 0x2e, 0x00, 0xee, 0xff, 0x30, 0x00, 0xf0, 0xff, 0x32, 0x00, 0xf2, 0xff, 0x33, 0x00, 0xf4, 0xff, 0x34, 0x00, 0xf4, 0xff, 0x34, 0x00, 0xf5, 0xff, 0x32, 0x00, 0xf7, 0xff, 0x30, 0x00, 0xf9, 0xff, 0x2e, 0x00, 0xfc, 0xff, 0x2d, 0x00, 0xff, 0xff, 0x2d, 0x00, 0x03, 0x00, 0x2e, 0x00, 0x07, 0x00, 0x2e, 0x00, 0x0b, 0x00, 0x2d, 0x00, 0x0e, 0x00, 0x2b, 0x00, 0x10, 0x00, 0x28, 0x00, 0x13, 0x00, 0x25, 0x00, 0x16, 0x00, 0x21, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x19, 0x00, 0x26, 0x00, 0x16, 0x00, 0x29, 0x00, 0x14, 0x00, 0x2b, 0x00, 0x10, 0x00, 0x2d, 0x00, 0x0c, 0x00, 0x2e, 0x00, 0x07, 0x00, 0x2e, 0x00, 0x01, 0x00, 0x2e, 0x00, 0xfd, 0xff, 0x2e, 0x00, 0xf9, 0xff, 0x2d, 0x00, 0xf6, 0xff, 0x2c, 0x00, 0xf4, 0xff, 0x2b, 0x00, 0xf1, 0xff, 0x29, 0x00, 0xee, 0xff, 0x27, 0x00, 0xea, 0xff, 0x24, 0x00, 0xe7, 0xff, 0x21, 0x00, 0xe4, 0xff, 0x1e, 0x00, 0xe1, 0xff, 0x1b, 0x00, 0xde, 0xff, 0x17, 0x00, 0xdb, 0xff, 0x13, 0x00, 0xd7, 0xff, 0x0e, 0x00, 0xd5, 0xff, 0x08, 0x00, 0xd5, 0xff, 0x02, 0x00, 0xd6, 0xff, 0xfc, 0xff, 0xd7, 0xff, 0xf7, 0xff, 0xd9, 0xff, 0xf3, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xd8, 0xff, 0xef, 0xff, 0xd6, 0xff, 0xed, 0xff, 0xd3, 0xff, 0xea, 0xff, 0xd2, 0xff, 0xe6, 0xff, 0xd2, 0xff, 0xe1, 0xff, 0xd5, 0xff, 0xdc, 0xff, 0xd8, 0xff, 0xd6, 0xff, 0xdc, 0xff, 0xd0, 0xff, 0xdf, 0xff, 0xcc, 0xff, 0xe1, 0xff, 0xcb, 0xff, 0xe1, 0xff, 0xca, 0xff, 0xe1, 0xff, 0xca, 0xff, 0xe1, 0xff, 0xca, 0xff, 0xe4, 0xff, 0xc8, 0xff, 0xe8, 0xff, 0xc6, 0xff, 0xec, 0xff, 0xc5, 0xff, 0xf0, 0xff, 0xc4, 0xff, 0xf3, 0xff, 0xc6, 0xff, 0xf6, 0xff, 0xc9, 0xff, 0xf7, 0xff, 0xcd, 0xff, 0xfa, 0xff, 0xd3, 0xff, 0xfd, 0xff, 0xd8, 0xff, 0x00, 0x00, 0xde, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x08, 0x00, 0xe4, 0xff, 0x0b, 0x00, 0xe5, 0xff, 0x0e, 0x00, 0xe6, 0xff, 0x10, 0x00, 0xe8, 0xff, 0x13, 0x00, 0xeb, 0xff, 0x16, 0x00, 0xf0, 0xff, 0x1b, 0x00, 0xf6, 0xff, 0x1e, 0x00, 0xfc, 0xff, 0x21, 0x00, 0x02, 0x00, 0x22, 0x00, 0x05, 0x00, 0x23, 0x00, 0x08, 0x00, 0x23, 0x00, 0x09, 0x00, 0x23, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x0c, 0x00, 0x25, 0x00, 0x10, 0x00, 0x26, 0x00, 0x16, 0x00, 0x26, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x24, 0x00, 0x21, 0x00, 0x2a, 0x00, 0x1d, 0x00, 0x2e, 0x00, 0x19, 0x00, 0x2f, 0x00, 0x16, 0x00, 0x2f, 0x00, 0x14, 0x00, 0x2f, 0x00, 0x13, 0x00, 0x2f, 0x00, 0x11, 0x00, 0x31, 0x00, 0x0f, 0x00, 0x34, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x0b, 0x00, 0x3a, 0x00, 0x09, 0x00, 0x3b, 0x00, 0x06, 0x00, 0x3a, 0x00, 0x04, 0x00, 0x38, 0x00, 0x00, 0x00, 0x36, 0x00, 0xfe, 0xff, 0x33, 0x00, 0xfc, 0xff, 0x31, 0x00, 0xfb, 0xff, 0x30, 0x00, 0xfb, 0xff, 0x30, 0x00, 0xfb, 0xff, 0x2f, 0x00, 0xfa, 0xff, 0x2d, 0x00, 0xf6, 0xff, 0x2a, 0x00, 0xf1, 0xff, 0x27, 0x00, 0xec, 0xff, 0x24, 0x00, 0xe6, 0xff, 0x20, 0x00, 0xe1, 0xff, 0x1d, 0x00, 0xde, 0xff, 0x19, 0x00, 0xdd, 0xff, 0x15, 0x00, 0xdd, 0xff, 0x11, 0x00, 0xdd, 0xff, 0x0c, 0x00, 0xdb, 0xff, 0x08, 0x00, 0xd8, 0xff, 0x03, 0x00, 0xd4, 0xff, 0xfe, 0xff, 0xd2, 0xff, 0xfa, 0xff, 0xd1, 0xff, 0xf6, 0xff, 0xd2, 0xff, 0xf4, 0xff, 0xd5, 0xff, 0xf3, 0xff, 0xd8, 0xff, 0xf2, 0xff, 0xda, 0xff, 0xf0, 0xff, 0xdb, 0xff, 0xee, 0xff, 0xda, 0xff, 0xec, 0xff, 0xda, 0xff, 0xea, 0xff, 0xdc, 0xff, 0xea, 0xff, 0xdf, 0xff, 0xe9, 0xff, 0xe4, 0xff, 0xe9, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xef, 0xff, 0xe9, 0xff, 0xf3, 0xff, 0xe8, 0xff, 0xf6, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0xe4, 0xff, 0xfe, 0xff, 0xe3, 0xff, 0x03, 0x00, 0xe2, 0xff, 0x09, 0x00, 0xe2, 0xff, 0x0f, 0x00, 0xe3, 0xff, 0x15, 0x00, 0xe3, 0xff, 0x19, 0x00, 0xe4, 0xff, 0x1c, 0x00, 0xe3, 0xff, 0x20, 0x00, 0xe3, 0xff, 0x23, 0x00, 0xe4, 0xff, 0x27, 0x00, 0xe5, 0xff, 0x2b, 0x00, 0xe8, 0xff, 0x2e, 0x00, 0xeb, 0xff, 0x2f, 0x00, 0xef, 0xff, 0x2f, 0x00, 0xf2, 0xff, 0x2e, 0x00, 0xf3, 0xff, 0x2c, 0x00, 0xf4, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x2b, 0x00, 0xf6, 0xff, 0x2c, 0x00, 0xf8, 0xff, 0x2b, 0x00, 0xfb, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x29, 0x00, 0x05, 0x00, 0x27, 0x00, 0x09, 0x00, 0x25, 0x00, 0x0d, 0x00, 0x24, 0x00, 0x0e, 0x00, 0x23, 0x00, 0x0f, 0x00, 0x23, 0x00, 0x0f, 0x00, 0x23, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x15, 0x00, 0x19, 0x00, 0x18, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x16, 0x00, 0x1d, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x04, 0x00, 0x1d, 0x00, 0xff, 0xff, 0x1c, 0x00, 0xfa, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf6, 0xff, 0x1f, 0x00, 0xf4, 0xff, 0x21, 0x00, 0xf1, 0xff, 0x22, 0x00, 0xee, 0xff, 0x21, 0x00, 0xeb, 0xff, 0x20, 0x00, 0xe7, 0xff, 0x1d, 0x00, 0xe4, 0xff, 0x1a, 0x00, 0xe2, 0xff, 0x19, 0x00, 0xe0, 0xff, 0x18, 0x00, 0xde, 0xff, 0x18, 0x00, 0xdc, 0xff, 0x18, 0x00, 0xdb, 0xff, 0x18, 0x00, 0xda, 0xff, 0x17, 0x00, 0xda, 0xff, 0x15, 0x00, 0xd9, 0xff, 0x13, 0x00, 0xd8, 0xff, 0x0f, 0x00, 0xd6, 0xff, 0x0b, 0x00, 0xd3, 0xff, 0x07, 0x00, 0xd1, 0xff, 0x04, 0x00, 0xd0, 0xff, 0x02, 0x00, 0xd0, 0xff, 0x01, 0x00, 0xd2, 0xff, 0x00, 0x00, 0xd5, 0xff, 0x00, 0x00, 0xd8, 0xff, 0xfe, 0xff, 0xda, 0xff, 0xfc, 0xff, 0xdb, 0xff, 0xf8, 0xff, 0xdb, 0xff, 0xf3, 0xff, 0xdb, 0xff, 0xef, 0xff, 0xdd, 0xff, 0xec, 0xff, 0xe1, 0xff, 0xeb, 0xff, 0xe6, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xeb, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xec, 0xff, 0xf5, 0xff, 0xea, 0xff, 0xf8, 0xff, 0xe8, 0xff, 0xfb, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xe3, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x0b, 0x00, 0xe2, 0xff, 0x10, 0x00, 0xe3, 0xff, 0x15, 0x00, 0xe4, 0xff, 0x18, 0x00, 0xe5, 0xff, 0x1a, 0x00, 0xe6, 0xff, 0x1d, 0x00, 0xe5, 0xff, 0x20, 0x00, 0xe4, 0xff, 0x23, 0x00, 0xe2, 0xff, 0x27, 0x00, 0xe1, 0xff, 0x2a, 0x00, 0xe0, 0xff, 0x2c, 0x00, 0xdf, 0xff, 0x2b, 0x00, 0xde, 0xff, 0x2a, 0x00, 0xde, 0xff, 0x29, 0x00, 0xdd, 0xff, 0x29, 0x00, 0xdd, 0xff, 0x29, 0x00, 0xdc, 0xff, 0x2a, 0x00, 0xdc, 0xff, 0x2b, 0x00, 0xdc, 0xff, 0x2a, 0x00, 0xdd, 0xff, 0x27, 0x00, 0xdd, 0xff, 0x23, 0x00, 0xdf, 0xff, 0x1e, 0x00, 0xe2, 0xff, 0x1a, 0x00, 0xe6, 0xff, 0x18, 0x00, 0xeb, 0xff, 0x17, 0x00, 0xf0, 0xff, 0x16, 0x00, 0xf5, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x10, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x09, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xf7, 0xff, 0x12, 0x00, 0xf5, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x0d, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xec, 0xff, 0x08, 0x00, 0xea, 0xff, 0x07, 0x00, 0xe7, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe5, 0xff, 0x08, 0x00, 0xe3, 0xff, 0x08, 0x00, 0xe1, 0xff, 0x05, 0x00, 0xdf, 0xff, 0x01, 0x00, 0xdb, 0xff, 0xfc, 0xff, 0xd7, 0xff, 0xf9, 0xff, 0xd4, 0xff, 0xf7, 0xff, 0xd2, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf7, 0xff, 0xd1, 0xff, 0xf5, 0xff, 0xd3, 0xff, 0xf4, 0xff, 0xd7, 0xff, 0xf3, 0xff, 0xdc, 0xff, 0xf4, 0xff, 0xe2, 0xff, 0xf6, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x17, 0x00, 0xfe, 0xff, 0x1b, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x04, 0x00, 0x21, 0x00, 0x05, 0x00, 0x22, 0x00, 0x06, 0x00, 0x24, 0x00, 0x04, 0x00, 0x26, 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x04, 0x00, 0x29, 0x00, 0x08, 0x00, 0x27, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x0d, 0x00, 0x23, 0x00, 0x0d, 0x00, 0x21, 0x00, 0x0c, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x13, 0x00, 0x15, 0x00, 0x17, 0x00, 0x13, 0x00, 0x19, 0x00, 0x10, 0x00, 0x1a, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x1b, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x09, 0x00, 0x18, 0x00, 0x09, 0x00, 0x15, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x06, 0x00, 0x08, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf5, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xe5, 0xff, 0xfb, 0xff, 0xe3, 0xff, 0xfb, 0xff, 0xe1, 0xff, 0xfa, 0xff, 0xe0, 0xff, 0xf9, 0xff, 0xdf, 0xff, 0xf8, 0xff, 0xdf, 0xff, 0xf9, 0xff, 0xdf, 0xff, 0xfa, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xde, 0xff, 0x01, 0x00, 0xde, 0xff, 0x03, 0x00, 0xdd, 0xff, 0x03, 0x00, 0xde, 0xff, 0x01, 0x00, 0xdf, 0xff, 0xfe, 0xff, 0xe1, 0xff, 0xfb, 0xff, 0xe3, 0xff, 0xf9, 0xff, 0xe5, 0xff, 0xfa, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xe9, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xed, 0xff, 0x00, 0x00, 0xf1, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x09, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x11, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x07, 0x00, 0x16, 0x00, 0x02, 0x00, 0x15, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x15, 0x00, 0xfb, 0xff, 0x17, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x18, 0x00, 0xf5, 0xff, 0x16, 0x00, 0xf4, 0xff, 0x14, 0x00, 0xf6, 0xff, 0x11, 0x00, 0xf7, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0b, 0x00, 0x02, 0x00, 0x08, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x0c, 0x00, 0xf1, 0xff, 0x0c, 0x00, 0xf1, 0xff, 0x0d, 0x00, 0xf0, 0xff, 0x0e, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0xee, 0xff, 0x0e, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xe5, 0xff, 0x09, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xdb, 0xff, 0x07, 0x00, 0xd9, 0xff, 0x07, 0x00, 0xd8, 0xff, 0x09, 0x00, 0xda, 0xff, 0x0b, 0x00, 0xdb, 0xff, 0x0c, 0x00, 0xdb, 0xff, 0x0c, 0x00, 0xda, 0xff, 0x0c, 0x00, 0xd8, 0xff, 0x0c, 0x00, 0xd6, 0xff, 0x0c, 0x00, 0xd3, 0xff, 0x0e, 0x00, 0xd2, 0xff, 0x10, 0x00, 0xd3, 0xff, 0x13, 0x00, 0xd5, 0xff, 0x16, 0x00, 0xd8, 0xff, 0x19, 0x00, 0xdb, 0xff, 0x1c, 0x00, 0xdc, 0xff, 0x1e, 0x00, 0xdc, 0xff, 0x21, 0x00, 0xda, 0xff, 0x22, 0x00, 0xd9, 0xff, 0x23, 0x00, 0xda, 0xff, 0x22, 0x00, 0xdd, 0xff, 0x20, 0x00, 0xe1, 0xff, 0x1f, 0x00, 0xe6, 0xff, 0x1f, 0x00, 0xea, 0xff, 0x1f, 0x00, 0xed, 0xff, 0x1f, 0x00, 0xee, 0xff, 0x1e, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x14, 0x00, 0x08, 0x00, 0x17, 0x00, 0x08, 0x00, 0x19, 0x00, 0x06, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x20, 0x00, 0xfd, 0xff, 0x24, 0x00, 0xfb, 0xff, 0x28, 0x00, 0xfa, 0xff, 0x2c, 0x00, 0xfa, 0xff, 0x2f, 0x00, 0xf9, 0xff, 0x30, 0x00, 0xf8, 0xff, 0x2f, 0x00, 0xf7, 0xff, 0x2d, 0x00, 0xf6, 0xff, 0x2c, 0x00, 0xf4, 0xff, 0x2a, 0x00, 0xf3, 0xff, 0x2a, 0x00, 0xf3, 0xff, 0x2b, 0x00, 0xf3, 0xff, 0x2c, 0x00, 0xf3, 0xff, 0x2d, 0x00, 0xf3, 0xff, 0x2c, 0x00, 0xf2, 0xff, 0x2b, 0x00, 0xf2, 0xff, 0x28, 0x00, 0xf2, 0xff, 0x25, 0x00, 0xf2, 0xff, 0x21, 0x00, 0xf1, 0xff, 0x1e, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xef, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x1b, 0x00, 0xec, 0xff, 0x19, 0x00, 0xea, 0xff, 0x17, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xe9, 0xff, 0x0e, 0x00, 0xe8, 0xff, 0x09, 0x00, 0xe7, 0xff, 0x06, 0x00, 0xe6, 0xff, 0x03, 0x00, 0xe4, 0xff, 0x02, 0x00, 0xe4, 0xff, 0x00, 0x00, 0xe4, 0xff, 0xfc, 0xff, 0xe4, 0xff, 0xf7, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xe9, 0xff, 0xe9, 0xff, 0xe3, 0xff, 0xea, 0xff, 0xdf, 0xff, 0xea, 0xff, 0xde, 0xff, 0xea, 0xff, 0xdd, 0xff, 0xeb, 0xff, 0xdd, 0xff, 0xed, 0xff, 0xdb, 0xff, 0xf1, 0xff, 0xd8, 0xff, 0xf5, 0xff, 0xd4, 0xff, 0xf8, 0xff, 0xd0, 0xff, 0xf9, 0xff, 0xcd, 0xff, 0xfa, 0xff, 0xcb, 0xff, 0xf9, 0xff, 0xcb, 0xff, 0xf9, 0xff, 0xcc, 0xff, 0xf9, 0xff, 0xcd, 0xff, 0xfa, 0xff, 0xcf, 0xff, 0xfb, 0xff, 0xd0, 0xff, 0xfe, 0xff, 0xd1, 0xff, 0x00, 0x00, 0xd2, 0xff, 0x03, 0x00, 0xd3, 0xff, 0x05, 0x00, 0xd4, 0xff, 0x06, 0x00, 0xd6, 0xff, 0x08, 0x00, 0xd8, 0xff, 0x09, 0x00, 0xd9, 0xff, 0x0b, 0x00, 0xdb, 0xff, 0x0c, 0x00, 0xde, 0xff, 0x0d, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xe6, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x11, 0x00, 0xf0, 0xff, 0x11, 0x00, 0xf3, 0xff, 0x11, 0x00, 0xf6, 0xff, 0x10, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x11, 0x00, 0x05, 0x00, 0x16, 0x00, 0x05, 0x00, 0x1a, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x20, 0x00, 0xfc, 0xff, 0x23, 0x00, 0xf9, 0xff, 0x26, 0x00, 0xf6, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x30, 0x00, 0xf4, 0xff, 0x35, 0x00, 0xf4, 0xff, 0x37, 0x00, 0xf3, 0xff, 0x37, 0x00, 0xf2, 0xff, 0x35, 0x00, 0xf0, 0xff, 0x32, 0x00, 0xef, 0xff, 0x2e, 0x00, 0xed, 0xff, 0x2b, 0x00, 0xec, 0xff, 0x2a, 0x00, 0xed, 0xff, 0x2a, 0x00, 0xee, 0xff, 0x2a, 0x00, 0xf0, 0xff, 0x29, 0x00, 0xf1, 0xff, 0x28, 0x00, 0xf2, 0xff, 0x24, 0x00, 0xf4, 0xff, 0x1e, 0x00, 0xf7, 0xff, 0x16, 0x00, 0xfb, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x07, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf2, 0xff, 0x0a, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xe7, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x0a, 0x00, 0xe3, 0xff, 0x08, 0x00, 0xe3, 0xff, 0x07, 0x00, 0xe3, 0xff, 0x07, 0x00, 0xe1, 0xff, 0x07, 0x00, 0xde, 0xff, 0x08, 0x00, 0xd9, 0xff, 0x09, 0x00, 0xd4, 0xff, 0x09, 0x00, 0xd1, 0xff, 0x08, 0x00, 0xcf, 0xff, 0x08, 0x00, 0xd0, 0xff, 0x08, 0x00, 0xd0, 0xff, 0x09, 0x00, 0xd0, 0xff, 0x0c, 0x00, 0xd0, 0xff, 0x0f, 0x00, 0xce, 0xff, 0x12, 0x00, 0xcd, 0xff, 0x13, 0x00, 0xcd, 0xff, 0x14, 0x00, 0xcf, 0xff, 0x14, 0x00, 0xd2, 0xff, 0x13, 0x00, 0xd5, 0xff, 0x12, 0x00, 0xd7, 0xff, 0x11, 0x00, 0xda, 0xff, 0x10, 0x00, 0xdc, 0xff, 0x0f, 0x00, 0xdf, 0xff, 0x0c, 0x00, 0xe3, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x03, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x17, 0x00, 0xf0, 0xff, 0x1d, 0x00, 0xed, 0xff, 0x23, 0x00, 0xeb, 0xff, 0x2a, 0x00, 0xeb, 0xff, 0x2f, 0x00, 0xeb, 0xff, 0x34, 0x00, 0xeb, 0xff, 0x38, 0x00, 0xea, 0xff, 0x3b, 0x00, 0xe8, 0xff, 0x3d, 0x00, 0xe7, 0xff, 0x3f, 0x00, 0xe7, 0xff, 0x40, 0x00, 0xe6, 0xff, 0x40, 0x00, 0xe6, 0xff, 0x40, 0x00, 0xe5, 0xff, 0x40, 0x00, 0xe3, 0xff, 0x40, 0x00, 0xe2, 0xff, 0x41, 0x00, 0xe1, 0xff, 0x41, 0x00, 0xe2, 0xff, 0x41, 0x00, 0xe4, 0xff, 0x40, 0x00, 0xe6, 0xff, 0x3d, 0x00, 0xe9, 0xff, 0x3a, 0x00, 0xea, 0xff, 0x36, 0x00, 0xeb, 0xff, 0x32, 0x00, 0xea, 0xff, 0x2d, 0x00, 0xea, 0xff, 0x2a, 0x00, 0xeb, 0xff, 0x26, 0x00, 0xed, 0xff, 0x23, 0x00, 0xf0, 0xff, 0x20, 0x00, 0xf2, 0xff, 0x1c, 0x00, 0xf3, 0xff, 0x18, 0x00, 0xf3, 0xff, 0x12, 0x00, 0xf2, 0xff, 0x0b, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf1, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe2, 0xff, 0xfc, 0xff, 0xdc, 0xff, 0xfd, 0xff, 0xd5, 0xff, 0xff, 0xff, 0xce, 0xff, 0x02, 0x00, 0xc8, 0xff, 0x06, 0x00, 0xc5, 0xff, 0x0a, 0x00, 0xc3, 0xff, 0x0d, 0x00, 0xc2, 0xff, 0x0f, 0x00, 0xc2, 0xff, 0x11, 0x00, 0xc0, 0xff, 0x12, 0x00, 0xbc, 0xff, 0x12, 0x00, 0xb7, 0xff, 0x13, 0x00, 0xb3, 0xff, 0x13, 0x00, 0xaf, 0xff, 0x12, 0x00, 0xae, 0xff, 0x10, 0x00, 0xb0, 0xff, 0x0e, 0x00, 0xb4, 0xff, 0x0c, 0x00, 0xb9, 0xff, 0x0a, 0x00, 0xbd, 0xff, 0x0a, 0x00, 0xc0, 0xff, 0x0b, 0x00, 0xc2, 0xff, 0x0b, 0x00, 0xc3, 0xff, 0x0b, 0x00, 0xc5, 0xff, 0x0b, 0x00, 0xc8, 0xff, 0x0b, 0x00, 0xcc, 0xff, 0x0b, 0x00, 0xd3, 0xff, 0x0d, 0x00, 0xda, 0xff, 0x0e, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xe8, 0xff, 0x10, 0x00, 0xee, 0xff, 0x10, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xff, 0xff, 0x10, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x09, 0x00, 0x21, 0x00, 0x07, 0x00, 0x28, 0x00, 0x04, 0x00, 0x2f, 0x00, 0x02, 0x00, 0x36, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x46, 0x00, 0x01, 0x00, 0x46, 0x00, 0x02, 0x00, 0x46, 0x00, 0x04, 0x00, 0x48, 0x00, 0x05, 0x00, 0x49, 0x00, 0x05, 0x00, 0x4a, 0x00, 0x06, 0x00, 0x4a, 0x00, 0x07, 0x00, 0x49, 0x00, 0x08, 0x00, 0x46, 0x00, 0x0b, 0x00, 0x40, 0x00, 0x0e, 0x00, 0x3a, 0x00, 0x10, 0x00, 0x34, 0x00, 0x12, 0x00, 0x2f, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x14, 0x00, 0x28, 0x00, 0x13, 0x00, 0x25, 0x00, 0x12, 0x00, 0x21, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x11, 0x00, 0x18, 0x00, 0x13, 0x00, 0x12, 0x00, 0x16, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x07, 0x00, 0x19, 0x00, 0x02, 0x00, 0x19, 0x00, 0xfe, 0xff, 0x19, 0x00, 0xfa, 0xff, 0x19, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x1b, 0x00, 0xf1, 0xff, 0x1d, 0x00, 0xed, 0xff, 0x1e, 0x00, 0xe9, 0xff, 0x1e, 0x00, 0xe5, 0xff, 0x1e, 0x00, 0xe0, 0xff, 0x1d, 0x00, 0xdc, 0xff, 0x1b, 0x00, 0xd7, 0xff, 0x19, 0x00, 0xd4, 0xff, 0x18, 0x00, 0xd1, 0xff, 0x17, 0x00, 0xcf, 0xff, 0x17, 0x00, 0xcc, 0xff, 0x16, 0x00, 0xca, 0xff, 0x15, 0x00, 0xc7, 0xff, 0x13, 0x00, 0xc5, 0xff, 0x11, 0x00, 0xc3, 0xff, 0x10, 0x00, 0xc2, 0xff, 0x0f, 0x00, 0xc1, 0xff, 0x0e, 0x00, 0xc0, 0xff, 0x0d, 0x00, 0xc0, 0xff, 0x0a, 0x00, 0xc1, 0xff, 0x06, 0x00, 0xc2, 0xff, 0x01, 0x00, 0xc3, 0xff, 0xfe, 0xff, 0xc5, 0xff, 0xfc, 0xff, 0xc7, 0xff, 0xfc, 0xff, 0xcb, 0xff, 0xfe, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xd4, 0xff, 0xfd, 0xff, 0xda, 0xff, 0xfa, 0xff, 0xe1, 0xff, 0xf4, 0xff, 0xe9, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xed, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf6, 0xff, 0x14, 0x00, 0xf7, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x1f, 0x00, 0xf5, 0xff, 0x25, 0x00, 0xf5, 0xff, 0x2b, 0x00, 0xf5, 0xff, 0x31, 0x00, 0xf7, 0xff, 0x36, 0x00, 0xfa, 0xff, 0x3a, 0x00, 0xfc, 0xff, 0x3b, 0x00, 0xfe, 0xff, 0x3c, 0x00, 0xff, 0xff, 0x3d, 0x00, 0xfe, 0xff, 0x3f, 0x00, 0xfc, 0xff, 0x41, 0x00, 0xfa, 0xff, 0x44, 0x00, 0xf8, 0xff, 0x47, 0x00, 0xf6, 0xff, 0x4a, 0x00, 0xf5, 0xff, 0x4b, 0x00, 0xf6, 0xff, 0x4c, 0x00, 0xf6, 0xff, 0x4b, 0x00, 0xf5, 0xff, 0x4a, 0x00, 0xf3, 0xff, 0x4a, 0x00, 0xef, 0xff, 0x49, 0x00, 0xeb, 0xff, 0x48, 0x00, 0xe8, 0xff, 0x46, 0x00, 0xe6, 0xff, 0x43, 0x00, 0xe6, 0xff, 0x40, 0x00, 0xe7, 0xff, 0x3c, 0x00, 0xe9, 0xff, 0x38, 0x00, 0xea, 0xff, 0x34, 0x00, 0xeb, 0xff, 0x30, 0x00, 0xeb, 0xff, 0x2c, 0x00, 0xeb, 0xff, 0x27, 0x00, 0xec, 0xff, 0x22, 0x00, 0xee, 0xff, 0x1d, 0x00, 0xf0, 0xff, 0x19, 0x00, 0xf3, 0xff, 0x15, 0x00, 0xf4, 0xff, 0x12, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf4, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf7, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf3, 0xff, 0xe7, 0xff, 0xef, 0xff, 0xe4, 0xff, 0xed, 0xff, 0xe1, 0xff, 0xeb, 0xff, 0xde, 0xff, 0xec, 0xff, 0xd9, 0xff, 0xed, 0xff, 0xd3, 0xff, 0xee, 0xff, 0xcd, 0xff, 0xed, 0xff, 0xc7, 0xff, 0xea, 0xff, 0xc4, 0xff, 0xe5, 0xff, 0xc2, 0xff, 0xe2, 0xff, 0xc3, 0xff, 0xe0, 0xff, 0xc6, 0xff, 0xdf, 0xff, 0xca, 0xff, 0xe1, 0xff, 0xcc, 0xff, 0xe3, 0xff, 0xcd, 0xff, 0xe5, 0xff, 0xcc, 0xff, 0xe5, 0xff, 0xcb, 0xff, 0xe4, 0xff, 0xcb, 0xff, 0xe3, 0xff, 0xcb, 0xff, 0xe1, 0xff, 0xce, 0xff, 0xe0, 0xff, 0xd2, 0xff, 0xe1, 0xff, 0xd7, 0xff, 0xe3, 0xff, 0xdc, 0xff, 0xe4, 0xff, 0xe1, 0xff, 0xe6, 0xff, 0xe4, 0xff, 0xe8, 0xff, 0xe6, 0xff, 0xe9, 0xff, 0xe8, 0xff, 0xea, 0xff, 0xea, 0xff, 0xeb, 0xff, 0xed, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xed, 0xff, 0xfd, 0xff, 0xee, 0xff, 0x02, 0x00, 0xee, 0xff, 0x08, 0x00, 0xef, 0xff, 0x0d, 0x00, 0xf0, 0xff, 0x12, 0x00, 0xf1, 0xff, 0x15, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf6, 0xff, 0x1a, 0x00, 0xf8, 0xff, 0x1c, 0x00, 0xfb, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x22, 0x00, 0x01, 0x00, 0x25, 0x00, 0x03, 0x00, 0x27, 0x00, 0x06, 0x00, 0x28, 0x00, 0x09, 0x00, 0x29, 0x00, 0x0d, 0x00, 0x2a, 0x00, 0x11, 0x00, 0x29, 0x00, 0x17, 0x00, 0x2a, 0x00, 0x1d, 0x00, 0x2a, 0x00, 0x22, 0x00, 0x2b, 0x00, 0x26, 0x00, 0x2c, 0x00, 0x29, 0x00, 0x2c, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x28, 0x00, 0x2d, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x24, 0x00, 0x31, 0x00, 0x23, 0x00, 0x34, 0x00, 0x21, 0x00, 0x37, 0x00, 0x1f, 0x00, 0x38, 0x00, 0x1b, 0x00, 0x37, 0x00, 0x16, 0x00, 0x34, 0x00, 0x10, 0x00, 0x30, 0x00, 0x0a, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x2c, 0x00, 0xfe, 0xff, 0x2c, 0x00, 0xf8, 0xff, 0x2c, 0x00, 0xf2, 0xff, 0x2b, 0x00, 0xeb, 0xff, 0x29, 0x00, 0xe4, 0xff, 0x25, 0x00, 0xdc, 0xff, 0x21, 0x00, 0xd4, 0xff, 0x1d, 0x00, 0xcd, 0xff, 0x1b, 0x00, 0xc8, 0xff, 0x19, 0x00, 0xc4, 0xff, 0x18, 0x00, 0xc1, 0xff, 0x17, 0x00, 0xbd, 0xff, 0x16, 0x00, 0xba, 0xff, 0x13, 0x00, 0xb6, 0xff, 0x10, 0x00, 0xb2, 0xff, 0x0e, 0x00, 0xb0, 0xff, 0x0c, 0x00, 0xae, 0xff, 0x0a, 0x00, 0xac, 0xff, 0x08, 0x00, 0xac, 0xff, 0x05, 0x00, 0xad, 0xff, 0x02, 0x00, 0xae, 0xff, 0xff, 0xff, 0xb0, 0xff, 0xfd, 0xff, 0xb2, 0xff, 0xfc, 0xff, 0xb5, 0xff, 0xfc, 0xff, 0xb8, 0xff, 0xfd, 0xff, 0xbc, 0xff, 0xfd, 0xff, 0xc0, 0xff, 0xfc, 0xff, 0xc5, 0xff, 0xfa, 0xff, 0xca, 0xff, 0xf7, 0xff, 0xcf, 0xff, 0xf3, 0xff, 0xd4, 0xff, 0xf1, 0xff, 0xd9, 0xff, 0xef, 0xff, 0xdf, 0xff, 0xee, 0xff, 0xe5, 0xff, 0xee, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0x01, 0x00, 0xe6, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x09, 0x00, 0xe6, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x11, 0x00, 0xeb, 0xff, 0x14, 0x00, 0xed, 0xff, 0x17, 0x00, 0xef, 0xff, 0x1a, 0x00, 0xef, 0xff, 0x1d, 0x00, 0xf0, 0xff, 0x1f, 0x00, 0xf1, 0xff, 0x21, 0x00, 0xf3, 0xff, 0x24, 0x00, 0xf6, 0xff, 0x27, 0x00, 0xfa, 0xff, 0x2a, 0x00, 0xff, 0xff, 0x2e, 0x00, 0x04, 0x00, 0x32, 0x00, 0x09, 0x00, 0x35, 0x00, 0x0d, 0x00, 0x37, 0x00, 0x10, 0x00, 0x37, 0x00, 0x12, 0x00, 0x37, 0x00, 0x14, 0x00, 0x37, 0x00, 0x16, 0x00, 0x38, 0x00, 0x18, 0x00, 0x3b, 0x00, 0x1b, 0x00, 0x3e, 0x00, 0x1e, 0x00, 0x40, 0x00, 0x21, 0x00, 0x41, 0x00, 0x23, 0x00, 0x3e, 0x00, 0x24, 0x00, 0x3a, 0x00, 0x23, 0x00, 0x35, 0x00, 0x21, 0x00, 0x30, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x1f, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x12, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x03, 0x00, 0x12, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x0b, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xeb, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x05, 0x00, 0xe3, 0xff, 0x02, 0x00, 0xe0, 0xff, 0xfd, 0xff, 0xdd, 0xff, 0xf9, 0xff, 0xda, 0xff, 0xf6, 0xff, 0xd8, 0xff, 0xf3, 0xff, 0xd4, 0xff, 0xf0, 0xff, 0xd1, 0xff, 0xed, 0xff, 0xcf, 0xff, 0xe9, 0xff, 0xcd, 0xff, 0xe5, 0xff, 0xcc, 0xff, 0xe1, 0xff, 0xcc, 0xff, 0xdd, 0xff, 0xcd, 0xff, 0xda, 0xff, 0xcd, 0xff, 0xd8, 0xff, 0xcd, 0xff, 0xd7, 0xff, 0xcc, 0xff, 0xd6, 0xff, 0xcc, 0xff, 0xd4, 0xff, 0xcc, 0xff, 0xd1, 0xff, 0xcd, 0xff, 0xce, 0xff, 0xd0, 0xff, 0xca, 0xff, 0xd4, 0xff, 0xc8, 0xff, 0xd7, 0xff, 0xc6, 0xff, 0xdb, 0xff, 0xc5, 0xff, 0xde, 0xff, 0xc4, 0xff, 0xe1, 0xff, 0xc3, 0xff, 0xe4, 0xff, 0xc2, 0xff, 0xe7, 0xff, 0xc2, 0xff, 0xeb, 0xff, 0xc2, 0xff, 0xef, 0xff, 0xc3, 0xff, 0xf4, 0xff, 0xc5, 0xff, 0xf9, 0xff, 0xc7, 0xff, 0xfe, 0xff, 0xc9, 0xff, 0x02, 0x00, 0xcc, 0xff, 0x07, 0x00, 0xce, 0xff, 0x0c, 0x00, 0xd1, 0xff, 0x11, 0x00, 0xd5, 0xff, 0x16, 0x00, 0xdb, 0xff, 0x1b, 0x00, 0xe0, 0xff, 0x1f, 0x00, 0xe5, 0xff, 0x23, 0x00, 0xea, 0xff, 0x27, 0x00, 0xed, 0xff, 0x2a, 0x00, 0xf0, 0xff, 0x2e, 0x00, 0xf3, 0xff, 0x31, 0x00, 0xf8, 0xff, 0x34, 0x00, 0xfd, 0xff, 0x37, 0x00, 0x03, 0x00, 0x39, 0x00, 0x09, 0x00, 0x3a, 0x00, 0x0d, 0x00, 0x3a, 0x00, 0x10, 0x00, 0x3a, 0x00, 0x13, 0x00, 0x3a, 0x00, 0x16, 0x00, 0x39, 0x00, 0x1a, 0x00, 0x37, 0x00, 0x1f, 0x00, 0x34, 0x00, 0x24, 0x00, 0x30, 0x00, 0x2a, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2b, 0x00, 0x31, 0x00, 0x2b, 0x00, 0x34, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x29, 0x00, 0x37, 0x00, 0x26, 0x00, 0x38, 0x00, 0x23, 0x00, 0x3a, 0x00, 0x20, 0x00, 0x3c, 0x00, 0x1d, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x40, 0x00, 0x1c, 0x00, 0x41, 0x00, 0x1c, 0x00, 0x42, 0x00, 0x1c, 0x00, 0x42, 0x00, 0x1a, 0x00, 0x42, 0x00, 0x18, 0x00, 0x41, 0x00, 0x14, 0x00, 0x3f, 0x00, 0x0f, 0x00, 0x3c, 0x00, 0x0b, 0x00, 0x3a, 0x00, 0x06, 0x00, 0x38, 0x00, 0x02, 0x00, 0x38, 0x00, 0xff, 0xff, 0x38, 0x00, 0xfc, 0xff, 0x37, 0x00, 0xf8, 0xff, 0x35, 0x00, 0xf4, 0xff, 0x31, 0x00, 0xef, 0xff, 0x2d, 0x00, 0xea, 0xff, 0x28, 0x00, 0xe6, 0xff, 0x23, 0x00, 0xe3, 0xff, 0x1e, 0x00, 0xe1, 0xff, 0x1a, 0x00, 0xe0, 0xff, 0x16, 0x00, 0xdf, 0xff, 0x12, 0x00, 0xdf, 0xff, 0x0d, 0x00, 0xdf, 0xff, 0x06, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xf8, 0xff, 0xe0, 0xff, 0xf2, 0xff, 0xe0, 0xff, 0xee, 0xff, 0xe2, 0xff, 0xec, 0xff, 0xe4, 0xff, 0xeb, 0xff, 0xe8, 0xff, 0xe9, 0xff, 0xed, 0xff, 0xe7, 0xff, 0xf3, 0xff, 0xe4, 0xff, 0xf9, 0xff, 0xe0, 0xff, 0xfe, 0xff, 0xdd, 0xff, 0x02, 0x00, 0xdb, 0xff, 0x05, 0x00, 0xda, 0xff, 0x07, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xda, 0xff, 0x0e, 0x00, 0xda, 0xff, 0x12, 0x00, 0xda, 0xff, 0x17, 0x00, 0xda, 0xff, 0x1c, 0x00, 0xd9, 0xff, 0x20, 0x00, 0xd9, 0xff, 0x23, 0x00, 0xd9, 0xff, 0x24, 0x00, 0xda, 0xff, 0x25, 0x00, 0xdc, 0xff, 0x24, 0x00, 0xdf, 0xff, 0x23, 0x00, 0xe2, 0xff, 0x24, 0x00, 0xe5, 0xff, 0x24, 0x00, 0xe8, 0xff, 0x25, 0x00, 0xe9, 0xff, 0x26, 0x00, 0xeb, 0xff, 0x25, 0x00, 0xed, 0xff, 0x24, 0x00, 0xf1, 0xff, 0x23, 0x00, 0xf5, 0xff, 0x22, 0x00, 0xfa, 0xff, 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, 0x05, 0x00, 0x22, 0x00, 0x08, 0x00, 0x23, 0x00, 0x09, 0x00, 0x23, 0x00, 0x09, 0x00, 0x23, 0x00, 0x08, 0x00, 0x23, 0x00, 0x08, 0x00, 0x23, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x14, 0x00, 0x20, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x19, 0x00, 0x1c, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x15, 0x00, 0x17, 0x00, 0x14, 0x00, 0x13, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x03, 0x00, 0x1d, 0x00, 0xfd, 0xff, 0x1d, 0x00, 0xf8, 0xff, 0x1b, 0x00, 0xf3, 0xff, 0x17, 0x00, 0xee, 0xff, 0x12, 0x00, 0xea, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x0a, 0x00, 0xe0, 0xff, 0x08, 0x00, 0xd9, 0xff, 0x07, 0x00, 0xd3, 0xff, 0x06, 0x00, 0xcd, 0xff, 0x03, 0x00, 0xca, 0xff, 0x00, 0x00, 0xc9, 0xff, 0xfb, 0xff, 0xc8, 0xff, 0xf6, 0xff, 0xc8, 0xff, 0xf2, 0xff, 0xc8, 0xff, 0xee, 0xff, 0xc7, 0xff, 0xea, 0xff, 0xc5, 0xff, 0xe8, 0xff, 0xc4, 0xff, 0xe6, 0xff, 0xc3, 0xff, 0xe5, 0xff, 0xc3, 0xff, 0xe4, 0xff, 0xc6, 0xff, 0xe3, 0xff, 0xca, 0xff, 0xe0, 0xff, 0xce, 0xff, 0xdd, 0xff, 0xd1, 0xff, 0xd9, 0xff, 0xd2, 0xff, 0xd6, 0xff, 0xd1, 0xff, 0xd3, 0xff, 0xcf, 0xff, 0xd1, 0xff, 0xce, 0xff, 0xd2, 0xff, 0xcf, 0xff, 0xd3, 0xff, 0xd2, 0xff, 0xd4, 0xff, 0xd6, 0xff, 0xd5, 0xff, 0xda, 0xff, 0xd4, 0xff, 0xdd, 0xff, 0xd3, 0xff, 0xdf, 0xff, 0xd2, 0xff, 0xe0, 0xff, 0xd1, 0xff, 0xe0, 0xff, 0xd2, 0xff, 0xe0, 0xff, 0xd3, 0xff, 0xe1, 0xff, 0xd5, 0xff, 0xe5, 0xff, 0xd8, 0xff, 0xea, 0xff, 0xdb, 0xff, 0xf0, 0xff, 0xdd, 0xff, 0xf5, 0xff, 0xdf, 0xff, 0xfa, 0xff, 0xe1, 0xff, 0xfe, 0xff, 0xe4, 0xff, 0x01, 0x00, 0xe7, 0xff, 0x03, 0x00, 0xeb, 0xff, 0x04, 0x00, 0xef, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x17, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00, 0x21, 0x00, 0x08, 0x00, 0x24, 0x00, 0x0b, 0x00, 0x25, 0x00, 0x0e, 0x00, 0x25, 0x00, 0x11, 0x00, 0x24, 0x00, 0x14, 0x00, 0x24, 0x00, 0x18, 0x00, 0x24, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x20, 0x00, 0x28, 0x00, 0x20, 0x00, 0x27, 0x00, 0x1f, 0x00, 0x25, 0x00, 0x1f, 0x00, 0x21, 0x00, 0x20, 0x00, 0x1c, 0x00, 0x23, 0x00, 0x17, 0x00, 0x26, 0x00, 0x14, 0x00, 0x29, 0x00, 0x11, 0x00, 0x2b, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x0d, 0x00, 0x28, 0x00, 0x0b, 0x00, 0x25, 0x00, 0x07, 0x00, 0x22, 0x00, 0x03, 0x00, 0x21, 0x00, 0xff, 0xff, 0x23, 0x00, 0xfc, 0xff, 0x25, 0x00, 0xf9, 0xff, 0x27, 0x00, 0xf8, 0xff, 0x28, 0x00, 0xf7, 0xff, 0x25, 0x00, 0xf5, 0xff, 0x21, 0x00, 0xf4, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x18, 0x00, 0xf0, 0xff, 0x15, 0x00, 0xed, 0xff, 0x15, 0x00, 0xea, 0xff, 0x15, 0x00, 0xe7, 0xff, 0x14, 0x00, 0xe4, 0xff, 0x13, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0x0a, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xde, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xfc, 0xff, 0xdc, 0xff, 0xfa, 0xff, 0xda, 0xff, 0xf9, 0xff, 0xd8, 0xff, 0xf8, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xd5, 0xff, 0xf0, 0xff, 0xd5, 0xff, 0xeb, 0xff, 0xd6, 0xff, 0xe6, 0xff, 0xd9, 0xff, 0xe2, 0xff, 0xdb, 0xff, 0xdf, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xde, 0xff, 0xde, 0xff, 0xdf, 0xff, 0xde, 0xff, 0xe2, 0xff, 0xdd, 0xff, 0xe5, 0xff, 0xdc, 0xff, 0xe9, 0xff, 0xdc, 0xff, 0xec, 0xff, 0xdc, 0xff, 0xed, 0xff, 0xdf, 0xff, 0xee, 0xff, 0xe1, 0xff, 0xf0, 0xff, 0xe5, 0xff, 0xf3, 0xff, 0xe9, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xfb, 0xff, 0xef, 0xff, 0x00, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf1, 0xff, 0x08, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf6, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xfe, 0xff, 0x1a, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x06, 0x00, 0x22, 0x00, 0x09, 0x00, 0x25, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x0c, 0x00, 0x2a, 0x00, 0x0d, 0x00, 0x2c, 0x00, 0x0f, 0x00, 0x2c, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x17, 0x00, 0x2c, 0x00, 0x1c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x25, 0x00, 0x2d, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x26, 0x00, 0x28, 0x00, 0x28, 0x00, 0x24, 0x00, 0x29, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x1c, 0x00, 0x2c, 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x1a, 0x00, 0x2b, 0x00, 0x19, 0x00, 0x29, 0x00, 0x17, 0x00, 0x27, 0x00, 0x13, 0x00, 0x24, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x08, 0x00, 0x21, 0x00, 0x02, 0x00, 0x20, 0x00, 0xff, 0xff, 0x20, 0x00, 0xfd, 0xff, 0x1f, 0x00, 0xfc, 0xff, 0x1e, 0x00, 0xfb, 0xff, 0x1c, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xf7, 0xff, 0x16, 0x00, 0xf4, 0xff, 0x13, 0x00, 0xf1, 0xff, 0x10, 0x00, 0xee, 0xff, 0x0e, 0x00, 0xec, 0xff, 0x0c, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xec, 0xff, 0x09, 0x00, 0xed, 0xff, 0x05, 0x00, 0xee, 0xff, 0x01, 0x00, 0xee, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xed, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe8, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfe, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x02, 0x00, 0xe4, 0xff, 0x06, 0x00, 0xe2, 0xff, 0x0c, 0x00, 0xe0, 0xff, 0x12, 0x00, 0xde, 0xff, 0x16, 0x00, 0xdd, 0xff, 0x1a, 0x00, 0xde, 0xff, 0x1d, 0x00, 0xdf, 0xff, 0x1f, 0x00, 0xe1, 0xff, 0x21, 0x00, 0xe3, 0xff, 0x23, 0x00, 0xe6, 0xff, 0x26, 0x00, 0xe8, 0xff, 0x29, 0x00, 0xeb, 0xff, 0x2d, 0x00, 0xef, 0xff, 0x31, 0x00, 0xf3, 0xff, 0x35, 0x00, 0xf8, 0xff, 0x38, 0x00, 0xfc, 0xff, 0x3a, 0x00, 0x01, 0x00, 0x3b, 0x00, 0x05, 0x00, 0x3b, 0x00, 0x09, 0x00, 0x39, 0x00, 0x0c, 0x00, 0x38, 0x00, 0x0f, 0x00, 0x36, 0x00, 0x12, 0x00, 0x35, 0x00, 0x14, 0x00, 0x35, 0x00, 0x16, 0x00, 0x34, 0x00, 0x17, 0x00, 0x32, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x17, 0x00, 0x2a, 0x00, 0x18, 0x00, 0x24, 0x00, 0x18, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x17, 0x00, 0x17, 0x00, 0x13, 0x00, 0x16, 0x00, 0x11, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x0c, 0x00, 0x16, 0x00, 0x07, 0x00, 0x17, 0x00, 0x00, 0x00, 0x17, 0x00, 0xfa, 0xff, 0x17, 0x00, 0xf4, 0xff, 0x16, 0x00, 0xf0, 0xff, 0x14, 0x00, 0xee, 0xff, 0x11, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xeb, 0xff, 0x0b, 0x00, 0xea, 0xff, 0x08, 0x00, 0xe8, 0xff, 0x06, 0x00, 0xe5, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x02, 0x00, 0xdf, 0xff, 0xfe, 0xff, 0xdc, 0xff, 0xfa, 0xff, 0xd9, 0xff, 0xf6, 0xff, 0xd8, 0xff, 0xf2, 0xff, 0xd7, 0xff, 0xef, 0xff, 0xd7, 0xff, 0xed, 0xff, 0xd8, 0xff, 0xeb, 0xff, 0xd9, 0xff, 0xe9, 0xff, 0xd9, 0xff, 0xe7, 0xff, 0xd9, 0xff, 0xe5, 0xff, 0xd8, 0xff, 0xe2, 0xff, 0xd6, 0xff, 0xe0, 0xff, 0xd3, 0xff, 0xde, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xd6, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xdb, 0xff, 0xe1, 0xff, 0xdc, 0xff, 0xe7, 0xff, 0xdb, 0xff, 0xeb, 0xff, 0xda, 0xff, 0xec, 0xff, 0xd9, 0xff, 0xeb, 0xff, 0xd8, 0xff, 0xea, 0xff, 0xd7, 0xff, 0xeb, 0xff, 0xd6, 0xff, 0xee, 0xff, 0xd6, 0xff, 0xf2, 0xff, 0xd6, 0xff, 0xf8, 0xff, 0xd7, 0xff, 0xfc, 0xff, 0xd8, 0xff, 0xfe, 0xff, 0xda, 0xff, 0xfc, 0xff, 0xdc, 0xff, 0xf9, 0xff, 0xdd, 0xff, 0xf5, 0xff, 0xdf, 0xff, 0xf3, 0xff, 0xe1, 0xff, 0xf3, 0xff, 0xe3, 0xff, 0xf5, 0xff, 0xe5, 0xff, 0xf8, 0xff, 0xe7, 0xff, 0xf9, 0xff, 0xe9, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf5, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf5, 0xff, 0x0b, 0x00, 0xf6, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x0f, 0x00, 0xf2, 0xff, 0x10, 0x00, 0xef, 0xff, 0x11, 0x00, 0xed, 0xff, 0x14, 0x00, 0xed, 0xff, 0x17, 0x00, 0xee, 0xff, 0x1a, 0x00, 0xf0, 0xff, 0x1d, 0x00, 0xf2, 0xff, 0x1e, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0xf2, 0xff, 0x1c, 0x00, 0xee, 0xff, 0x1b, 0x00, 0xe9, 0xff, 0x19, 0x00, 0xe5, 0xff, 0x19, 0x00, 0xe2, 0xff, 0x1a, 0x00, 0xe2, 0xff, 0x1b, 0x00, 0xe3, 0xff, 0x1c, 0x00, 0xe5, 0xff, 0x1c, 0x00, 0xe7, 0xff, 0x1b, 0x00, 0xe6, 0xff, 0x1a, 0x00, 0xe5, 0xff, 0x19, 0x00, 0xe2, 0xff, 0x18, 0x00, 0xe1, 0xff, 0x17, 0x00, 0xe2, 0xff, 0x16, 0x00, 0xe5, 0xff, 0x15, 0x00, 0xe9, 0xff, 0x15, 0x00, 0xee, 0xff, 0x14, 0x00, 0xf3, 0xff, 0x14, 0x00, 0xf7, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x08, 0x00, 0x07, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x10, 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x16, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0xfd, 0xff, 0x1a, 0x00, 0xf8, 0xff, 0x1b, 0x00, 0xf2, 0xff, 0x1d, 0x00, 0xed, 0xff, 0x1f, 0x00, 0xea, 0xff, 0x22, 0x00, 0xea, 0xff, 0x26, 0x00, 0xeb, 0xff, 0x29, 0x00, 0xee, 0xff, 0x2b, 0x00, 0xef, 0xff, 0x2c, 0x00, 0xee, 0xff, 0x2b, 0x00, 0xec, 0xff, 0x29, 0x00, 0xe9, 0xff, 0x28, 0x00, 0xe6, 0xff, 0x28, 0x00, 0xe5, 0xff, 0x29, 0x00, 0xe5, 0xff, 0x2b, 0x00, 0xe6, 0xff, 0x2d, 0x00, 0xe8, 0xff, 0x2e, 0x00, 0xea, 0xff, 0x2d, 0x00, 0xeb, 0xff, 0x2b, 0x00, 0xed, 0xff, 0x28, 0x00, 0xee, 0xff, 0x26, 0x00, 0xf0, 0xff, 0x26, 0x00, 0xf2, 0xff, 0x27, 0x00, 0xf5, 0xff, 0x29, 0x00, 0xf7, 0xff, 0x2b, 0x00, 0xf9, 0xff, 0x2c, 0x00, 0xfc, 0xff, 0x2b, 0x00, 0x00, 0x00, 0x29, 0x00, 0x04, 0x00, 0x25, 0x00, 0x07, 0x00, 0x22, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x0d, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x13, 0x00, 0x15, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x03, 0x00, 0x14, 0x00, 0xff, 0xff, 0x14, 0x00, 0xfc, 0xff, 0x14, 0x00, 0xfb, 0xff, 0x16, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x1b, 0x00, 0xf1, 0xff, 0x1b, 0x00, 0xef, 0xff, 0x19, 0x00, 0xec, 0xff, 0x18, 0x00, 0xeb, 0xff, 0x17, 0x00, 0xea, 0xff, 0x17, 0x00, 0xe9, 0xff, 0x19, 0x00, 0xe9, 0xff, 0x1c, 0x00, 0xea, 0xff, 0x1f, 0x00, 0xeb, 0xff, 0x21, 0x00, 0xec, 0xff, 0x21, 0x00, 0xeb, 0xff, 0x20, 0x00, 0xea, 0xff, 0x1e, 0x00, 0xe9, 0xff, 0x1d, 0x00, 0xe8, 0xff, 0x1d, 0x00, 0xe8, 0xff, 0x1d, 0x00, 0xe8, 0xff, 0x1e, 0x00, 0xea, 0xff, 0x1e, 0x00, 0xeb, 0xff, 0x1e, 0x00, 0xed, 0xff, 0x1c, 0x00, 0xee, 0xff, 0x1a, 0x00, 0xed, 0xff, 0x17, 0x00, 0xec, 0xff, 0x13, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x0d, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xee, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x09, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x01, 0x00, 0xf3, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xf5, 0xff, 0xf3, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xee, 0xff, 0x06, 0x00, 0xe9, 0xff, 0x09, 0x00, 0xe5, 0xff, 0x0a, 0x00, 0xe5, 0xff, 0x0b, 0x00, 0xe6, 0xff, 0x0c, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xed, 0xff, 0x10, 0x00, 0xec, 0xff, 0x11, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xe6, 0xff, 0x12, 0x00, 0xe4, 0xff, 0x11, 0x00, 0xe4, 0xff, 0x0f, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x0a, 0x00, 0xeb, 0xff, 0x08, 0x00, 0xed, 0xff, 0x06, 0x00, 0xee, 0xff, 0x04, 0x00, 0xee, 0xff, 0x03, 0x00, 0xed, 0xff, 0x01, 0x00, 0xec, 0xff, 0xfe, 0xff, 0xec, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xf9, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0x01, 0x00, 0xef, 0xff, 0x03, 0x00, 0xed, 0xff, 0x03, 0x00, 0xeb, 0xff, 0x02, 0x00, 0xea, 0xff, 0x02, 0x00, 0xe9, 0xff, 0x03, 0x00, 0xe9, 0xff, 0x06, 0x00, 0xe9, 0xff, 0x0a, 0x00, 0xe9, 0xff, 0x0e, 0x00, 0xe9, 0xff, 0x11, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xe9, 0xff, 0x0f, 0x00, 0xea, 0xff, 0x0b, 0x00, 0xea, 0xff, 0x07, 0x00, 0xeb, 0xff, 0x03, 0x00, 0xec, 0xff, 0x02, 0x00, 0xec, 0xff, 0x03, 0x00, 0xed, 0xff, 0x04, 0x00, 0xee, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x02, 0x00, 0xf3, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xff, 0xff, 0x13, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x00, 0x16, 0x00, 0x04, 0x00, 0x15, 0x00, 0x05, 0x00, 0x12, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x11, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x09, 0x00, 0x16, 0x00, 0x05, 0x00, 0x17, 0x00, 0x01, 0x00, 0x18, 0x00, 0xfc, 0xff, 0x1a, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf8, 0xff, 0x1c, 0x00, 0xfa, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x1a, 0x00, 0xfa, 0xff, 0x1a, 0x00, 0xf9, 0xff, 0x1b, 0x00, 0xf7, 0xff, 0x1b, 0x00, 0xf7, 0xff, 0x1b, 0x00, 0xf8, 0xff, 0x1a, 0x00, 0xfb, 0xff, 0x17, 0x00, 0xff, 0xff, 0x14, 0x00, 0x02, 0x00, 0x12, 0x00, 0x04, 0x00, 0x11, 0x00, 0x05, 0x00, 0x13, 0x00, 0x04, 0x00, 0x15, 0x00, 0x04, 0x00, 0x17, 0x00, 0x03, 0x00, 0x16, 0x00, 0x03, 0x00, 0x13, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x02, 0x00, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x09, 0x00, 0xef, 0xff, 0x0c, 0x00, 0xee, 0xff, 0x0f, 0x00, 0xed, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe6, 0xff, 0x0a, 0x00, 0xe4, 0xff, 0x08, 0x00, 0xe2, 0xff, 0x07, 0x00, 0xe0, 0xff, 0x08, 0x00, 0xdf, 0xff, 0x0b, 0x00, 0xdf, 0xff, 0x0e, 0x00, 0xdf, 0xff, 0x10, 0x00, 0xe1, 0xff, 0x10, 0x00, 0xe3, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x04, 0x00, 0xe8, 0xff, 0x01, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xe9, 0xff, 0x02, 0x00, 0xeb, 0xff, 0x04, 0x00, 0xef, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xfd, 0xff, 0xfc, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xee, 0xff, 0x03, 0x00, 0xed, 0xff, 0x03, 0x00, 0xed, 0xff, 0x04, 0x00, 0xed, 0xff, 0x06, 0x00, 0xed, 0xff, 0x08, 0x00, 0xeb, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x0c, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe1, 0xff, 0x0d, 0x00, 0xde, 0xff, 0x0c, 0x00, 0xdc, 0xff, 0x0b, 0x00, 0xdc, 0xff, 0x0b, 0x00, 0xde, 0xff, 0x0b, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0xe1, 0xff, 0x0c, 0x00, 0xe1, 0xff, 0x0d, 0x00, 0xe0, 0xff, 0x0e, 0x00, 0xde, 0xff, 0x0f, 0x00, 0xdc, 0xff, 0x10, 0x00, 0xdb, 0xff, 0x11, 0x00, 0xda, 0xff, 0x12, 0x00, 0xda, 0xff, 0x13, 0x00, 0xdb, 0xff, 0x14, 0x00, 0xdc, 0xff, 0x15, 0x00, 0xdd, 0xff, 0x16, 0x00, 0xdc, 0xff, 0x16, 0x00, 0xdb, 0xff, 0x17, 0x00, 0xd9, 0xff, 0x16, 0x00, 0xd8, 0xff, 0x15, 0x00, 0xd9, 0xff, 0x14, 0x00, 0xda, 0xff, 0x13, 0x00, 0xdc, 0xff, 0x13, 0x00, 0xdf, 0xff, 0x13, 0x00, 0xe0, 0xff, 0x14, 0x00, 0xe0, 0xff, 0x13, 0x00, 0xe0, 0xff, 0x11, 0x00, 0xdf, 0xff, 0x0e, 0x00, 0xde, 0xff, 0x0b, 0x00, 0xdf, 0xff, 0x08, 0x00, 0xe2, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x03, 0x00, 0xe8, 0xff, 0x01, 0x00, 0xeb, 0xff, 0xff, 0xff, 0xec, 0xff, 0xfc, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xee, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xff, 0xff, 0xeb, 0xff, 0x03, 0x00, 0xe8, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x06, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe2, 0xff, 0x08, 0x00, 0xe2, 0xff, 0x0a, 0x00, 0xe1, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x10, 0x00, 0xe2, 0xff, 0x13, 0x00, 0xe3, 0xff, 0x15, 0x00, 0xe3, 0xff, 0x16, 0x00, 0xe4, 0xff, 0x15, 0x00, 0xe5, 0xff, 0x13, 0x00, 0xe7, 0xff, 0x11, 0x00, 0xe7, 0xff, 0x10, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0xe8, 0xff, 0x10, 0x00, 0xea, 0xff, 0x11, 0x00, 0xed, 0xff, 0x12, 0x00, 0xf0, 0xff, 0x11, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf6, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf7, 0xff, 0x10, 0x00, 0xf8, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x14, 0x00, 0x01, 0x00, 0x14, 0x00, 0x05, 0x00, 0x14, 0x00, 0x09, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x11, 0x00, 0x14, 0x00, 0x14, 0x00, 0x15, 0x00, 0x17, 0x00, 0x15, 0x00, 0x1a, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x14, 0x00, 0x20, 0x00, 0x13, 0x00, 0x24, 0x00, 0x12, 0x00, 0x27, 0x00, 0x10, 0x00, 0x2a, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x0f, 0x00, 0x2a, 0x00, 0x0f, 0x00, 0x29, 0x00, 0x10, 0x00, 0x28, 0x00, 0x10, 0x00, 0x27, 0x00, 0x10, 0x00, 0x27, 0x00, 0x0e, 0x00, 0x26, 0x00, 0x0c, 0x00, 0x26, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x0a, 0x00, 0x21, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x0b, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0d, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfb, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x16, 0x00, 0xf8, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x18, 0x00, 0xf3, 0xff, 0x18, 0x00, 0xf1, 0xff, 0x18, 0x00, 0xf0, 0xff, 0x18, 0x00, 0xf0, 0xff, 0x19, 0x00, 0xf1, 0xff, 0x1b, 0x00, 0xf1, 0xff, 0x1d, 0x00, 0xf1, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0x21, 0x00, 0xee, 0xff, 0x21, 0x00, 0xec, 0xff, 0x1f, 0x00, 0xeb, 0xff, 0x1d, 0x00, 0xeb, 0xff, 0x1c, 0x00, 0xec, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x1b, 0x00, 0xee, 0xff, 0x1b, 0x00, 0xee, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x1b, 0x00, 0xec, 0xff, 0x19, 0x00, 0xeb, 0xff, 0x16, 0x00, 0xea, 0xff, 0x14, 0x00, 0xea, 0xff, 0x12, 0x00, 0xea, 0xff, 0x12, 0x00, 0xea, 0xff, 0x12, 0x00, 0xec, 0xff, 0x12, 0x00, 0xee, 0xff, 0x12, 0x00, 0xf1, 0xff, 0x12, 0x00, 0xf4, 0xff, 0x11, 0x00, 0xf7, 0xff, 0x0f, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x07, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x1f, 0x00, 0xff, 0xff, 0x21, 0x00, 0xfd, 0xff, 0x22, 0x00, 0xfb, 0xff, 0x24, 0x00, 0xf9, 0xff, 0x25, 0x00, 0xf8, 0xff, 0x25, 0x00, 0xf7, 0xff, 0x25, 0x00, 0xf6, 0xff, 0x25, 0x00, 0xf4, 0xff, 0x24, 0x00, 0xf2, 0xff, 0x23, 0x00, 0xf0, 0xff, 0x20, 0x00, 0xef, 0xff, 0x1e, 0x00, 0xee, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x19, 0x00, 0xec, 0xff, 0x18, 0x00, 0xeb, 0xff, 0x17, 0x00, 0xeb, 0xff, 0x16, 0x00, 0xea, 0xff, 0x15, 0x00, 0xeb, 0xff, 0x13, 0x00, 0xeb, 0xff, 0x0f, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xed, 0xff, 0x06, 0x00, 0xec, 0xff, 0x02, 0x00, 0xeb, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0xfb, 0xff, 0xe9, 0xff, 0xf6, 0xff, 0xe9, 0xff, 0xf1, 0xff, 0xea, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xe2, 0xff, 0xed, 0xff, 0xdf, 0xff, 0xec, 0xff, 0xdc, 0xff, 0xeb, 0xff, 0xda, 0xff, 0xea, 0xff, 0xd8, 0xff, 0xeb, 0xff, 0xd4, 0xff, 0xed, 0xff, 0xd0, 0xff, 0xef, 0xff, 0xcc, 0xff, 0xf3, 0xff, 0xc9, 0xff, 0xf6, 0xff, 0xc7, 0xff, 0xf7, 0xff, 0xc7, 0xff, 0xf7, 0xff, 0xc7, 0xff, 0xf5, 0xff, 0xc7, 0xff, 0xf3, 0xff, 0xc8, 0xff, 0xf2, 0xff, 0xc8, 0xff, 0xf2, 0xff, 0xc8, 0xff, 0xf4, 0xff, 0xc9, 0xff, 0xf7, 0xff, 0xcb, 0xff, 0xf9, 0xff, 0xcd, 0xff, 0xfb, 0xff, 0xcf, 0xff, 0xfb, 0xff, 0xd1, 0xff, 0xfa, 0xff, 0xd2, 0xff, 0xf8, 0xff, 0xd3, 0xff, 0xf6, 0xff, 0xd4, 0xff, 0xf4, 0xff, 0xd6, 0xff, 0xf4, 0xff, 0xd9, 0xff, 0xf4, 0xff, 0xdc, 0xff, 0xf4, 0xff, 0xe0, 0xff, 0xf4, 0xff, 0xe3, 0xff, 0xf4, 0xff, 0xe6, 0xff, 0xf3, 0xff, 0xe9, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xee, 0xff, 0xed, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xfe, 0xff, 0xe6, 0xff, 0x02, 0x00, 0xe5, 0xff, 0x07, 0x00, 0xe5, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x0f, 0x00, 0xe3, 0xff, 0x13, 0x00, 0xe1, 0xff, 0x16, 0x00, 0xdf, 0xff, 0x1a, 0x00, 0xdd, 0xff, 0x1f, 0x00, 0xdb, 0xff, 0x23, 0x00, 0xdb, 0xff, 0x28, 0x00, 0xdd, 0xff, 0x2c, 0x00, 0xdf, 0xff, 0x31, 0x00, 0xe1, 0xff, 0x35, 0x00, 0xe2, 0xff, 0x39, 0x00, 0xe1, 0xff, 0x3b, 0x00, 0xe0, 0xff, 0x3c, 0x00, 0xdf, 0xff, 0x3d, 0x00, 0xdf, 0xff, 0x3d, 0x00, 0xe0, 0xff, 0x3e, 0x00, 0xe2, 0xff, 0x3e, 0x00, 0xe5, 0xff, 0x3c, 0x00, 0xe9, 0xff, 0x39, 0x00, 0xec, 0xff, 0x35, 0x00, 0xef, 0xff, 0x31, 0x00, 0xf0, 0xff, 0x2c, 0x00, 0xf1, 0xff, 0x27, 0x00, 0xf2, 0xff, 0x23, 0x00, 0xf3, 0xff, 0x1e, 0x00, 0xf5, 0xff, 0x1a, 0x00, 0xf7, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xef, 0xff, 0x05, 0x00, 0xec, 0xff, 0x06, 0x00, 0xea, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x09, 0x00, 0xe6, 0xff, 0x09, 0x00, 0xe6, 0xff, 0x09, 0x00, 0xe5, 0xff, 0x09, 0x00, 0xe4, 0xff, 0x0a, 0x00, 0xe2, 0xff, 0x0c, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0x12, 0x00, 0xe0, 0xff, 0x14, 0x00, 0xe0, 0xff, 0x16, 0x00, 0xdf, 0xff, 0x17, 0x00, 0xde, 0xff, 0x17, 0x00, 0xdc, 0xff, 0x18, 0x00, 0xda, 0xff, 0x19, 0x00, 0xd9, 0xff, 0x1c, 0x00, 0xd9, 0xff, 0x1f, 0x00, 0xd9, 0xff, 0x22, 0x00, 0xdb, 0xff, 0x24, 0x00, 0xdd, 0xff, 0x24, 0x00, 0xdf, 0xff, 0x23, 0x00, 0xdf, 0xff, 0x22, 0x00, 0xdf, 0xff, 0x20, 0x00, 0xdf, 0xff, 0x20, 0x00, 0xdf, 0xff, 0x21, 0x00, 0xe1, 0xff, 0x22, 0x00, 0xe4, 0xff, 0x23, 0x00, 0xe8, 0xff, 0x23, 0x00, 0xed, 0xff, 0x22, 0x00, 0xf1, 0xff, 0x1e, 0x00, 0xf3, 0xff, 0x1a, 0x00, 0xf5, 0xff, 0x17, 0x00, 0xf7, 0xff, 0x15, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xfe, 0xff, 0x16, 0x00, 0x04, 0x00, 0x19, 0x00, 0x0a, 0x00, 0x1a, 0x00, 0x10, 0x00, 0x19, 0x00, 0x16, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x0e, 0x00, 0x21, 0x00, 0x0c, 0x00, 0x25, 0x00, 0x0d, 0x00, 0x29, 0x00, 0x0d, 0x00, 0x2d, 0x00, 0x0f, 0x00, 0x32, 0x00, 0x10, 0x00, 0x35, 0x00, 0x0f, 0x00, 0x37, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x0b, 0x00, 0x39, 0x00, 0x08, 0x00, 0x39, 0x00, 0x04, 0x00, 0x39, 0x00, 0x02, 0x00, 0x38, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x02, 0x00, 0x32, 0x00, 0x03, 0x00, 0x2e, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, 0x00, 0x22, 0x00, 0xfd, 0xff, 0x1d, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf1, 0xff, 0x03, 0x00, 0xef, 0xff, 0x02, 0x00, 0xee, 0xff, 0x00, 0x00, 0xed, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xfe, 0xff, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x03, 0x00, 0xeb, 0xff, 0x04, 0x00, 0xea, 0xff, 0x03, 0x00, 0xea, 0xff, 0x01, 0x00, 0xea, 0xff, 0x00, 0x00, 0xeb, 0xff, 0xff, 0xff, 0xec, 0xff, 0xff, 0xff, 0xee, 0xff, 0x01, 0x00, 0xef, 0xff, 0x04, 0x00, 0xef, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0b, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xf5, 0xff, 0x12, 0x00, 0xf4, 0xff, 0x15, 0x00, 0xf5, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1f, 0x00, 0xf8, 0xff, 0x21, 0x00, 0xf8, 0xff, 0x21, 0x00, 0xf8, 0xff, 0x1f, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf5, 0xff, 0x1b, 0x00, 0xf4, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x19, 0x00, 0xf2, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf1, 0xff, 0x19, 0x00, 0xf0, 0xff, 0x16, 0x00, 0xef, 0xff, 0x13, 0x00, 0xef, 0xff, 0x11, 0x00, 0xef, 0xff, 0x10, 0x00, 0xf0, 0xff, 0x10, 0x00, 0xf1, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf6, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xed, 0xff, 0x04, 0x00, 0xeb, 0xff, 0x04, 0x00, 0xe8, 0xff, 0x04, 0x00, 0xe5, 0xff, 0x05, 0x00, 0xe1, 0xff, 0x06, 0x00, 0xde, 0xff, 0x07, 0x00, 0xdc, 0xff, 0x08, 0x00, 0xda, 0xff, 0x08, 0x00, 0xd9, 0xff, 0x07, 0x00, 0xd9, 0xff, 0x06, 0x00, 0xd8, 0xff, 0x04, 0x00, 0xd7, 0xff, 0x03, 0x00, 0xd6, 0xff, 0x03, 0x00, 0xd6, 0xff, 0x04, 0x00, 0xd6, 0xff, 0x05, 0x00, 0xd8, 0xff, 0x06, 0x00, 0xda, 0xff, 0x07, 0x00, 0xdd, 0xff, 0x08, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xe4, 0xff, 0x05, 0x00, 0xe7, 0xff, 0x02, 0x00, 0xe9, 0xff, 0x00, 0x00, 0xec, 0xff, 0xff, 0xff, 0xee, 0xff, 0x00, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xfb, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x00, 0x09, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0xfd, 0xff, 0x17, 0x00, 0xfb, 0xff, 0x18, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xf8, 0xff, 0x17, 0x00, 0xf8, 0xff, 0x17, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xfb, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x1f, 0x00, 0xfb, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x24, 0x00, 0xf6, 0xff, 0x24, 0x00, 0xf4, 0xff, 0x23, 0x00, 0xf4, 0xff, 0x21, 0x00, 0xf4, 0xff, 0x1f, 0x00, 0xf6, 0xff, 0x1e, 0x00, 0xf8, 0xff, 0x1d, 0x00, 0xfb, 0xff, 0x1d, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xfe, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x18, 0x00, 0xfc, 0xff, 0x15, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0c, 0x00, 0x02, 0x00, 0x09, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf4, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xec, 0xff, 0xfc, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf4, 0xff, 0xef, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xee, 0xff, 0xed, 0xff, 0xed, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xe6, 0xff, 0xec, 0xff, 0xe7, 0xff, 0xec, 0xff, 0xe9, 0xff, 0xea, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xed, 0xff, 0xe6, 0xff, 0xee, 0xff, 0xe5, 0xff, 0xee, 0xff, 0xe5, 0xff, 0xef, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe8, 0xff, 0xf2, 0xff, 0xe9, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xf8, 0xff, 0xe9, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0x00, 0x00, 0xe6, 0xff, 0x03, 0x00, 0xe5, 0xff, 0x05, 0x00, 0xe4, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x05, 0x00, 0xe7, 0xff, 0x04, 0x00, 0xea, 0xff, 0x04, 0x00, 0xec, 0xff, 0x04, 0x00, 0xee, 0xff, 0x04, 0x00, 0xef, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xfa, 0xff, 0x14, 0x00, 0xfb, 0xff, 0x17, 0x00, 0xfa, 0xff, 0x1b, 0x00, 0xf8, 0xff, 0x20, 0x00, 0xf6, 0xff, 0x25, 0x00, 0xf5, 0xff, 0x29, 0x00, 0xf6, 0xff, 0x2b, 0x00, 0xf8, 0xff, 0x2d, 0x00, 0xfa, 0xff, 0x2e, 0x00, 0xfc, 0xff, 0x2e, 0x00, 0xfc, 0xff, 0x2f, 0x00, 0xfc, 0xff, 0x31, 0x00, 0xf9, 0xff, 0x33, 0x00, 0xf7, 0xff, 0x36, 0x00, 0xf4, 0xff, 0x38, 0x00, 0xf3, 0xff, 0x39, 0x00, 0xf3, 0xff, 0x39, 0x00, 0xf4, 0xff, 0x37, 0x00, 0xf4, 0xff, 0x33, 0x00, 0xf5, 0xff, 0x30, 0x00, 0xf4, 0xff, 0x2d, 0x00, 0xf2, 0xff, 0x2b, 0x00, 0xf0, 0xff, 0x2b, 0x00, 0xef, 0xff, 0x2b, 0x00, 0xee, 0xff, 0x2c, 0x00, 0xee, 0xff, 0x2b, 0x00, 0xef, 0xff, 0x29, 0x00, 0xf0, 0xff, 0x25, 0x00, 0xf1, 0xff, 0x22, 0x00, 0xf3, 0xff, 0x1e, 0x00, 0xf3, 0xff, 0x1c, 0x00, 0xf4, 0xff, 0x1b, 0x00, 0xf5, 0xff, 0x1b, 0x00, 0xf5, 0xff, 0x1c, 0x00, 0xf6, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1b, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xfc, 0xff, 0x14, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x02, 0x00, 0x0a, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x12, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xf6, 0xff, 0x0e, 0x00, 0xf5, 0xff, 0x0a, 0x00, 0xf5, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x0a, 0x00, 0xef, 0xff, 0x0d, 0x00, 0xed, 0xff, 0x0f, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x0f, 0x00, 0xea, 0xff, 0x0d, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xeb, 0xff, 0x0d, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xed, 0xff, 0x14, 0x00, 0xee, 0xff, 0x18, 0x00, 0xf0, 0xff, 0x1a, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf4, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xf8, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xfa, 0xff, 0x16, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0xff, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xf4, 0xff, 0xe9, 0xff, 0xf4, 0xff, 0xe6, 0xff, 0xf3, 0xff, 0xe3, 0xff, 0xf0, 0xff, 0xe1, 0xff, 0xee, 0xff, 0xe0, 0xff, 0xeb, 0xff, 0xdf, 0xff, 0xe9, 0xff, 0xdf, 0xff, 0xe8, 0xff, 0xde, 0xff, 0xe7, 0xff, 0xdd, 0xff, 0xe7, 0xff, 0xdb, 0xff, 0xe7, 0xff, 0xd7, 0xff, 0xe7, 0xff, 0xd3, 0xff, 0xe7, 0xff, 0xd0, 0xff, 0xe6, 0xff, 0xce, 0xff, 0xe5, 0xff, 0xce, 0xff, 0xe4, 0xff, 0xd0, 0xff, 0xe3, 0xff, 0xd2, 0xff, 0xe4, 0xff, 0xd2, 0xff, 0xe5, 0xff, 0xd0, 0xff, 0xe8, 0xff, 0xcd, 0xff, 0xeb, 0xff, 0xcb, 0xff, 0xee, 0xff, 0xca, 0xff, 0xf0, 0xff, 0xcc, 0xff, 0xf1, 0xff, 0xd1, 0xff, 0xf2, 0xff, 0xd7, 0xff, 0xf3, 0xff, 0xdc, 0xff, 0xf5, 0xff, 0xdf, 0xff, 0xf8, 0xff, 0xe0, 0xff, 0xfc, 0xff, 0xe0, 0xff, 0x01, 0x00, 0xe2, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x08, 0x00, 0xe9, 0xff, 0x0a, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0d, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x0a, 0x00, 0x18, 0x00, 0x09, 0x00, 0x18, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x0f, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x09, 0x00, 0x21, 0x00, 0x07, 0x00, 0x21, 0x00, 0x05, 0x00, 0x20, 0x00, 0x05, 0x00, 0x1e, 0x00, 0x07, 0x00, 0x1c, 0x00, 0x09, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x07, 0x00, 0x15, 0x00, 0x04, 0x00, 0x15, 0x00, 0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x12, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x09, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xef, 0xff, 0x02, 0x00, 0xec, 0xff, 0x04, 0x00, 0xea, 0xff, 0x07, 0x00, 0xeb, 0xff, 0x0a, 0x00, 0xed, 0xff, 0x0d, 0x00, 0xf1, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x0c, 0x00, 0xf5, 0xff, 0x0a, 0x00, 0xf5, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf3, 0xff, 0x08, 0x00, 0xf5, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x11, 0x00, 0x06, 0x00, 0x13, 0x00, 0x05, 0x00, 0x15, 0x00, 0x06, 0x00, 0x16, 0x00, 0x07, 0x00, 0x17, 0x00, 0x09, 0x00, 0x19, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x10, 0x00, 0x20, 0x00, 0x12, 0x00, 0x25, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x14, 0x00, 0x2d, 0x00, 0x13, 0x00, 0x30, 0x00, 0x12, 0x00, 0x31, 0x00, 0x11, 0x00, 0x31, 0x00, 0x10, 0x00, 0x31, 0x00, 0x11, 0x00, 0x32, 0x00, 0x12, 0x00, 0x35, 0x00, 0x12, 0x00, 0x38, 0x00, 0x11, 0x00, 0x3a, 0x00, 0x0f, 0x00, 0x3c, 0x00, 0x0c, 0x00, 0x3c, 0x00, 0x09, 0x00, 0x3b, 0x00, 0x07, 0x00, 0x39, 0x00, 0x05, 0x00, 0x36, 0x00, 0x03, 0x00, 0x33, 0x00, 0x02, 0x00, 0x2f, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x01, 0x00, 0x28, 0x00, 0xff, 0xff, 0x25, 0x00, 0xfc, 0xff, 0x21, 0x00, 0xfa, 0xff, 0x1d, 0x00, 0xf8, 0xff, 0x19, 0x00, 0xf7, 0xff, 0x15, 0x00, 0xf7, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xef, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xeb, 0xff, 0xfa, 0xff, 0xe9, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xf8, 0xff, 0xe5, 0xff, 0xf5, 0xff, 0xe2, 0xff, 0xf3, 0xff, 0xe0, 0xff, 0xf1, 0xff, 0xde, 0xff, 0xf0, 0xff, 0xdc, 0xff, 0xf0, 0xff, 0xda, 0xff, 0xf0, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xd8, 0xff, 0xf1, 0xff, 0xd7, 0xff, 0xf1, 0xff, 0xd6, 0xff, 0xf0, 0xff, 0xd5, 0xff, 0xef, 0xff, 0xd4, 0xff, 0xee, 0xff, 0xd4, 0xff, 0xed, 0xff, 0xd3, 0xff, 0xee, 0xff, 0xd3, 0xff, 0xf0, 0xff, 0xd4, 0xff, 0xf3, 0xff, 0xd6, 0xff, 0xf5, 0xff, 0xd9, 0xff, 0xf6, 0xff, 0xdc, 0xff, 0xf6, 0xff, 0xdf, 0xff, 0xf5, 0xff, 0xe1, 0xff, 0xf4, 0xff, 0xe2, 0xff, 0xf2, 0xff, 0xe3, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xe9, 0xff, 0xf0, 0xff, 0xed, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0x0e, 0x00, 0xf6, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x15, 0x00, 0xfc, 0xff, 0x16, 0x00, 0xfe, 0xff, 0x16, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0xff, 0x11, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x15, 0x00, 0x05, 0x00, 0x18, 0x00, 0x06, 0x00, 0x18, 0x00, 0x07, 0x00, 0x17, 0x00, 0x07, 0x00, 0x15, 0x00, 0x05, 0x00, 0x12, 0x00, 0x03, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0xff, 0x12, 0x00, 0xff, 0xff, 0x14, 0x00, 0xff, 0xff, 0x16, 0x00, 0xfe, 0xff, 0x17, 0x00, 0xfc, 0xff, 0x17, 0x00, 0xfa, 0xff, 0x16, 0x00, 0xf7, 0xff, 0x13, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf1, 0xff, 0x0c, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf2, 0xff, 0x0b, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xed, 0xff, 0x00, 0x00, 0xec, 0xff, 0x03, 0x00, 0xea, 0xff, 0x05, 0x00, 0xe7, 0xff, 0x08, 0x00, 0xe4, 0xff, 0x0a, 0x00, 0xe1, 0xff, 0x0c, 0x00, 0xde, 0xff, 0x0d, 0x00, 0xde, 0xff, 0x0e, 0x00, 0xdf, 0xff, 0x0f, 0x00, 0xe1, 0xff, 0x11, 0x00, 0xe3, 0xff, 0x13, 0x00, 0xe4, 0xff, 0x15, 0x00, 0xe4, 0xff, 0x16, 0x00, 0xe4, 0xff, 0x15, 0x00, 0xe3, 0xff, 0x13, 0x00, 0xe4, 0xff, 0x11, 0x00, 0xe6, 0xff, 0x10, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xef, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x10, 0x00, 0xf4, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x09, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x14, 0x00, 0xfd, 0xff, 0x17, 0x00, 0xfd, 0xff, 0x19, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xfd, 0xff, 0x1e, 0x00, 0xfd, 0xff, 0x20, 0x00, 0xfc, 0xff, 0x22, 0x00, 0xfc, 0xff, 0x23, 0x00, 0xfb, 0xff, 0x22, 0x00, 0xfb, 0xff, 0x20, 0x00, 0xfa, 0xff, 0x1d, 0x00, 0xfa, 0xff, 0x19, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x08, 0x00, 0xf0, 0xff, 0x08, 0x00, 0xed, 0xff, 0x08, 0x00, 0xeb, 0xff, 0x07, 0x00, 0xea, 0xff, 0x06, 0x00, 0xe9, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x07, 0x00, 0xea, 0xff, 0x08, 0x00, 0xea, 0xff, 0x08, 0x00, 0xea, 0xff, 0x08, 0x00, 0xe9, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x06, 0x00, 0xe6, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x03, 0x00, 0xe4, 0xff, 0x01, 0x00, 0xe5, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xea, 0xff, 0xfb, 0xff, 0xeb, 0xff, 0xfa, 0xff, 0xeb, 0xff, 0xfa, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf5, 0xff, 0xee, 0xff, 0xf3, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf2, 0xff, 0x10, 0x00, 0xf1, 0xff, 0x13, 0x00, 0xf0, 0xff, 0x15, 0x00, 0xf0, 0xff, 0x18, 0x00, 0xf1, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf3, 0xff, 0x1a, 0x00, 0xf3, 0xff, 0x1a, 0x00, 0xf3, 0xff, 0x19, 0x00, 0xf3, 0xff, 0x18, 0x00, 0xf4, 0xff, 0x18, 0x00, 0xf5, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x17, 0x00, 0xf8, 0xff, 0x17, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xfc, 0xff, 0x13, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0c, 0x00, 0xf0, 0xff, 0x0c, 0x00, 0xee, 0xff, 0x0c, 0x00, 0xec, 0xff, 0x0c, 0x00, 0xec, 0xff, 0x0d, 0x00, 0xee, 0xff, 0x0f, 0x00, 0xef, 0xff, 0x10, 0x00, 0xf0, 0xff, 0x11, 0x00, 0xef, 0xff, 0x11, 0x00, 0xee, 0xff, 0x11, 0x00, 0xec, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xec, 0xff, 0x11, 0x00, 0xee, 0xff, 0x11, 0x00, 0xf0, 0xff, 0x11, 0x00, 0xf3, 0xff, 0x11, 0x00, 0xf5, 0xff, 0x10, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf7, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfa, 0xff, 0x0b, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf5, 0xff, 0x10, 0x00, 0xf5, 0xff, 0x11, 0x00, 0xf4, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x13, 0x00, 0xf2, 0xff, 0x14, 0x00, 0xf1, 0xff, 0x14, 0x00, 0xef, 0xff, 0x14, 0x00, 0xee, 0xff, 0x14, 0x00, 0xed, 0xff, 0x15, 0x00, 0xee, 0xff, 0x15, 0x00, 0xef, 0xff, 0x15, 0x00, 0xf0, 0xff, 0x14, 0x00, 0xf1, 0xff, 0x13, 0x00, 0xf1, 0xff, 0x11, 0x00, 0xf2, 0xff, 0x0f, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf3, 0xff, 0x09, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xef, 0xff, 0x02, 0x00, 0xeb, 0xff, 0x03, 0x00, 0xe6, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x04, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xdc, 0xff, 0x05, 0x00, 0xda, 0xff, 0x06, 0x00, 0xd9, 0xff, 0x07, 0x00, 0xd8, 0xff, 0x0a, 0x00, 0xd7, 0xff, 0x0c, 0x00, 0xd6, 0xff, 0x0d, 0x00, 0xd5, 0xff, 0x0e, 0x00, 0xd5, 0xff, 0x0f, 0x00, 0xd6, 0xff, 0x0f, 0x00, 0xd7, 0xff, 0x0f, 0x00, 0xd9, 0xff, 0x10, 0x00, 0xdc, 0xff, 0x10, 0x00, 0xde, 0xff, 0x11, 0x00, 0xe1, 0xff, 0x12, 0x00, 0xe3, 0xff, 0x13, 0x00, 0xe4, 0xff, 0x14, 0x00, 0xe5, 0xff, 0x15, 0x00, 0xe7, 0xff, 0x15, 0x00, 0xe9, 0xff, 0x15, 0x00, 0xeb, 0xff, 0x15, 0x00, 0xee, 0xff, 0x14, 0x00, 0xf1, 0xff, 0x13, 0x00, 0xf3, 0xff, 0x12, 0x00, 0xf5, 0xff, 0x12, 0x00, 0xf6, 0xff, 0x13, 0x00, 0xf8, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf6, 0xff, 0x09, 0x00, 0xf5, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x12, 0x00, 0xf1, 0xff, 0x14, 0x00, 0xf0, 0xff, 0x15, 0x00, 0xef, 0xff, 0x16, 0x00, 0xee, 0xff, 0x16, 0x00, 0xee, 0xff, 0x17, 0x00, 0xed, 0xff, 0x18, 0x00, 0xec, 0xff, 0x19, 0x00, 0xea, 0xff, 0x1a, 0x00, 0xe9, 0xff, 0x19, 0x00, 0xe9, 0xff, 0x18, 0x00, 0xea, 0xff, 0x16, 0x00, 0xeb, 0xff, 0x14, 0x00, 0xed, 0xff, 0x11, 0x00, 0xee, 0xff, 0x0f, 0x00, 0xef, 0xff, 0x0e, 0x00, 0xf0, 0xff, 0x0c, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x12, 0x00, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, 0x00, 0x19, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x08, 0x00, 0x17, 0x00, 0x09, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0b, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x14, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xf9, 0xff, 0x1a, 0x00, 0xf9, 0xff, 0x1b, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xfa, 0xff, 0x1a, 0x00, 0xfb, 0xff, 0x1a, 0x00, 0xfc, 0xff, 0x1a, 0x00, 0xfd, 0xff, 0x1a, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfc, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x1a, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xf7, 0xff, 0x17, 0x00, 0xf5, 0xff, 0x15, 0x00, 0xf4, 0xff, 0x13, 0x00, 0xf3, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x0e, 0x00, 0xf3, 0xff, 0x0d, 0x00, 0xf3, 0xff, 0x0b, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xef, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xf1, 0xff, 0x00, 0x00, 0xf2, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf3, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xed, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xed, 0xff, 0xf4, 0xff, 0xed, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xed, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xee, 0xff, 0xf5, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xeb, 0xff, 0xf3, 0xff, 0xec, 0xff, 0xf1, 0xff, 0xed, 0xff, 0xf1, 0xff, 0xee, 0xff, 0xf2, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xea, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x10, 0x00, 0x12, 0x00, 0x13, 0x00, 0x12, 0x00, 0x16, 0x00, 0x11, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x0c, 0x00, 0x1b, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x06, 0x00, 0x19, 0x00, 0x07, 0x00, 0x18, 0x00, 0x07, 0x00, 0x17, 0x00, 0x07, 0x00, 0x17, 0x00, 0x06, 0x00, 0x17, 0x00, 0x04, 0x00, 0x17, 0x00, 0x01, 0x00, 0x17, 0x00, 0xfe, 0xff, 0x17, 0x00, 0xfd, 0xff, 0x16, 0x00, 0xfd, 0xff, 0x15, 0x00, 0xfd, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x12, 0x00, 0xff, 0xff, 0x11, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x10, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x07, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x12, 0x00, 0x07, 0x00, 0x14, 0x00, 0x07, 0x00, 0x15, 0x00, 0x07, 0x00, 0x16, 0x00, 0x05, 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x00, 0x01, 0x00, 0x16, 0x00, 0xff, 0xff, 0x16, 0x00, 0xfe, 0xff, 0x16, 0x00, 0xfe, 0xff, 0x16, 0x00, 0xff, 0xff, 0x16, 0x00, 0xff, 0xff, 0x15, 0x00, 0xff, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xed, 0xff, 0xf2, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xf2, 0xff, 0xe8, 0xff, 0xf4, 0xff, 0xe8, 0xff, 0xf7, 0xff, 0xe8, 0xff, 0xfa, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfe, 0xff, 0xe8, 0xff, 0x01, 0x00, 0xea, 0xff, 0x03, 0x00, 0xec, 0xff, 0x05, 0x00, 0xef, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xfa, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x15, 0x00, 0x00, 0x00, 0x15, 0x00, 0x01, 0x00, 0x15, 0x00, 0x02, 0x00, 0x15, 0x00, 0x03, 0x00, 0x15, 0x00, 0x03, 0x00, 0x15, 0x00, 0x04, 0x00, 0x15, 0x00, 0x06, 0x00, 0x16, 0x00, 0x08, 0x00, 0x17, 0x00, 0x0a, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x10, 0x00, 0x17, 0x00, 0x10, 0x00, 0x16, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x10, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0e, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf3, 0xff, 0x01, 0x00, 0xf2, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf4, 0xff, 0xf4, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfe, 0xff, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x10, 0x00, 0x02, 0x00, 0x11, 0x00, 0x02, 0x00, 0x12, 0x00, 0x02, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x03, 0x00, 0x15, 0x00, 0x05, 0x00, 0x13, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0b, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x08, 0x00, 0xef, 0xff, 0x06, 0x00, 0xed, 0xff, 0x05, 0x00, 0xeb, 0xff, 0x05, 0x00, 0xe8, 0xff, 0x04, 0x00, 0xe6, 0xff, 0x04, 0x00, 0xe5, 0xff, 0x02, 0x00, 0xe4, 0xff, 0x00, 0x00, 0xe5, 0xff, 0xfe, 0xff, 0xe6, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0xe5, 0xff, 0xf9, 0xff, 0xe5, 0xff, 0xf8, 0xff, 0xe4, 0xff, 0xf7, 0xff, 0xe4, 0xff, 0xf6, 0xff, 0xe4, 0xff, 0xf5, 0xff, 0xe5, 0xff, 0xf3, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe8, 0xff, 0xef, 0xff, 0xe9, 0xff, 0xed, 0xff, 0xea, 0xff, 0xec, 0xff, 0xea, 0xff, 0xea, 0xff, 0xeb, 0xff, 0xe9, 0xff, 0xec, 0xff, 0xe8, 0xff, 0xed, 0xff, 0xe7, 0xff, 0xef, 0xff, 0xe6, 0xff, 0xf1, 0xff, 0xe6, 0xff, 0xf3, 0xff, 0xe6, 0xff, 0xf5, 0xff, 0xe7, 0xff, 0xf7, 0xff, 0xe8, 0xff, 0xf8, 0xff, 0xe9, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x04, 0x00, 0x09, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x11, 0x00, 0x11, 0x00, 0x14, 0x00, 0x11, 0x00, 0x16, 0x00, 0x10, 0x00, 0x18, 0x00, 0x11, 0x00, 0x18, 0x00, 0x11, 0x00, 0x18, 0x00, 0x10, 0x00, 0x18, 0x00, 0x10, 0x00, 0x19, 0x00, 0x0f, 0x00, 0x19, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x0f, 0x00, 0x19, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x10, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0xfe, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x11, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xff, 0xff, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf2, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xea, 0xff, 0xfa, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xfc, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe8, 0xff, 0xfb, 0xff, 0xe7, 0xff, 0xfa, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xfd, 0xff, 0xe7, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xf1, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xfa, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x0f, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xff, 0xff, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0b, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x11, 0x00, 0xf1, 0xff, 0x13, 0x00, 0xf1, 0xff, 0x13, 0x00, 0xf1, 0xff, 0x12, 0x00, 0xf2, 0xff, 0x11, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf2, 0xff, 0x0f, 0x00, 0xf1, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x0e, 0x00, 0xf0, 0xff, 0x0c, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xf1, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf5, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xef, 0xff, 0x00, 0x00, 0xef, 0xff, 0x00, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xff, 0xff, 0x11, 0x00, 0x02, 0x00, 0x12, 0x00, 0x05, 0x00, 0x12, 0x00, 0x08, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x12, 0x00, 0x07, 0x00, 0x15, 0x00, 0x06, 0x00, 0x19, 0x00, 0x05, 0x00, 0x1b, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x01, 0x00, 0x1c, 0x00, 0xfe, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x1a, 0x00, 0xf7, 0xff, 0x1a, 0x00, 0xf5, 0xff, 0x1b, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0xf2, 0xff, 0x1f, 0x00, 0xf2, 0xff, 0x1f, 0x00, 0xf1, 0xff, 0x1e, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xf1, 0xff, 0x19, 0x00, 0xf0, 0xff, 0x16, 0x00, 0xef, 0xff, 0x13, 0x00, 0xed, 0xff, 0x10, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xeb, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x0a, 0x00, 0xeb, 0xff, 0x07, 0x00, 0xed, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xf3, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf3, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x08, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf4, 0xff, 0x0e, 0x00, 0xf4, 0xff, 0x11, 0x00, 0xf6, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xfa, 0xff, 0x14, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x15, 0x00, 0xf8, 0xff, 0x15, 0x00, 0xf7, 0xff, 0x14, 0x00, 0xf8, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xfb, 0xff, 0x14, 0x00, 0xfd, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x14, 0x00, 0xff, 0xff, 0x13, 0x00, 0xff, 0xff, 0x12, 0x00, 0xff, 0xff, 0x10, 0x00, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x09, 0x00, 0x16, 0x00, 0x08, 0x00, 0x16, 0x00, 0x06, 0x00, 0x15, 0x00, 0x05, 0x00, 0x12, 0x00, 0x03, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf4, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xef, 0xff, 0xe9, 0xff, 0xef, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xe5, 0xff, 0xf5, 0xff, 0xe4, 0xff, 0xf6, 0xff, 0xe3, 0xff, 0xf7, 0xff, 0xe1, 0xff, 0xf7, 0xff, 0xdf, 0xff, 0xf8, 0xff, 0xdd, 0xff, 0xf8, 0xff, 0xdc, 0xff, 0xf9, 0xff, 0xdc, 0xff, 0xfa, 0xff, 0xdd, 0xff, 0xfc, 0xff, 0xde, 0xff, 0xfe, 0xff, 0xde, 0xff, 0x00, 0x00, 0xdf, 0xff, 0x02, 0x00, 0xdf, 0xff, 0x03, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xe0, 0xff, 0x05, 0x00, 0xe1, 0xff, 0x06, 0x00, 0xe2, 0xff, 0x06, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x07, 0x00, 0xea, 0xff, 0x08, 0x00, 0xec, 0xff, 0x08, 0x00, 0xee, 0xff, 0x09, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x13, 0x00, 0x05, 0x00, 0x15, 0x00, 0x05, 0x00, 0x16, 0x00, 0x05, 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x00, 0x01, 0x00, 0x17, 0x00, 0xff, 0xff, 0x19, 0x00, 0xfc, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x1d, 0x00, 0xfa, 0xff, 0x1f, 0x00, 0xfa, 0xff, 0x20, 0x00, 0xf9, 0xff, 0x20, 0x00, 0xf9, 0xff, 0x1f, 0x00, 0xf8, 0xff, 0x1e, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf5, 0xff, 0x1c, 0x00, 0xf3, 0xff, 0x1b, 0x00, 0xf2, 0xff, 0x1a, 0x00, 0xf1, 0xff, 0x18, 0x00, 0xf1, 0xff, 0x17, 0x00, 0xf2, 0xff, 0x14, 0x00, 0xf2, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0d, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xf0, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf8, 0xff, 0xeb, 0xff, 0xfa, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe5, 0xff, 0xfd, 0xff, 0xe3, 0xff, 0xfe, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xe3, 0xff, 0x01, 0x00, 0xe5, 0xff, 0x03, 0x00, 0xe6, 0xff, 0x05, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe6, 0xff, 0x0a, 0x00, 0xe5, 0xff, 0x0b, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe7, 0xff, 0x0e, 0x00, 0xea, 0xff, 0x0e, 0x00, 0xed, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x12, 0x00, 0xf5, 0xff, 0x13, 0x00, 0xf7, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x03, 0x00, 0x13, 0x00, 0x06, 0x00, 0x14, 0x00, 0x08, 0x00, 0x15, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x0b, 0x00, 0x1b, 0x00, 0x09, 0x00, 0x1d, 0x00, 0x05, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x20, 0x00, 0xff, 0xff, 0x20, 0x00, 0xfc, 0xff, 0x21, 0x00, 0xfb, 0xff, 0x22, 0x00, 0xfa, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x23, 0x00, 0xf7, 0xff, 0x23, 0x00, 0xf5, 0xff, 0x24, 0x00, 0xf2, 0xff, 0x23, 0x00, 0xf0, 0xff, 0x22, 0x00, 0xed, 0xff, 0x20, 0x00, 0xeb, 0xff, 0x1e, 0x00, 0xea, 0xff, 0x1b, 0x00, 0xe9, 0xff, 0x18, 0x00, 0xe9, 0xff, 0x15, 0x00, 0xe9, 0xff, 0x12, 0x00, 0xea, 0xff, 0x0f, 0x00, 0xe9, 0xff, 0x0c, 0x00, 0xe8, 0xff, 0x08, 0x00, 0xe6, 0xff, 0x05, 0x00, 0xe4, 0xff, 0x02, 0x00, 0xe3, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xfc, 0xff, 0xe4, 0xff, 0xf9, 0xff, 0xe6, 0xff, 0xf5, 0xff, 0xe8, 0xff, 0xf1, 0xff, 0xea, 0xff, 0xed, 0xff, 0xeb, 0xff, 0xe9, 0xff, 0xeb, 0xff, 0xe7, 0xff, 0xea, 0xff, 0xe5, 0xff, 0xea, 0xff, 0xe4, 0xff, 0xeb, 0xff, 0xe3, 0xff, 0xed, 0xff, 0xe1, 0xff, 0xf1, 0xff, 0xdf, 0xff, 0xf4, 0xff, 0xdd, 0xff, 0xf7, 0xff, 0xdb, 0xff, 0xf8, 0xff, 0xda, 0xff, 0xf8, 0xff, 0xda, 0xff, 0xf7, 0xff, 0xda, 0xff, 0xf7, 0xff, 0xdb, 0xff, 0xf7, 0xff, 0xdb, 0xff, 0xf9, 0xff, 0xdc, 0xff, 0xfb, 0xff, 0xdc, 0xff, 0xfe, 0xff, 0xdc, 0xff, 0x01, 0x00, 0xdc, 0xff, 0x03, 0x00, 0xdd, 0xff, 0x05, 0x00, 0xde, 0xff, 0x06, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xe3, 0xff, 0x08, 0x00, 0xe5, 0xff, 0x09, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xec, 0xff, 0x0e, 0x00, 0xee, 0xff, 0x11, 0x00, 0xf0, 0xff, 0x13, 0x00, 0xf2, 0xff, 0x15, 0x00, 0xf5, 0xff, 0x16, 0x00, 0xf8, 0xff, 0x16, 0x00, 0xfb, 0xff, 0x15, 0x00, 0xff, 0xff, 0x13, 0x00, 0x03, 0x00, 0x12, 0x00, 0x06, 0x00, 0x11, 0x00, 0x09, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x1b, 0x00, 0x0c, 0x00, 0x1f, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x0c, 0x00, 0x28, 0x00, 0x0c, 0x00, 0x28, 0x00, 0x0b, 0x00, 0x29, 0x00, 0x09, 0x00, 0x2b, 0x00, 0x07, 0x00, 0x2c, 0x00, 0x05, 0x00, 0x2e, 0x00, 0x04, 0x00, 0x2e, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x2c, 0x00, 0x03, 0x00, 0x2a, 0x00, 0x02, 0x00, 0x27, 0x00, 0xff, 0xff, 0x25, 0x00, 0xfc, 0xff, 0x22, 0x00, 0xf9, 0xff, 0x1f, 0x00, 0xf7, 0xff, 0x1d, 0x00, 0xf5, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x17, 0x00, 0xf3, 0xff, 0x13, 0x00, 0xf2, 0xff, 0x0e, 0x00, 0xf1, 0xff, 0x09, 0x00, 0xef, 0xff, 0x04, 0x00, 0xee, 0xff, 0xff, 0xff, 0xec, 0xff, 0xfb, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xed, 0xff, 0xeb, 0xff, 0xea, 0xff, 0xeb, 0xff, 0xe7, 0xff, 0xea, 0xff, 0xe6, 0xff, 0xea, 0xff, 0xe5, 0xff, 0xeb, 0xff, 0xe6, 0xff, 0xed, 0xff, 0xe6, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xf3, 0xff, 0xe5, 0xff, 0xf7, 0xff, 0xe3, 0xff, 0xf9, 0xff, 0xe1, 0xff, 0xfa, 0xff, 0xe0, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xfc, 0xff, 0xe0, 0xff, 0xfd, 0xff, 0xe1, 0xff, 0x01, 0x00, 0xe2, 0xff, 0x05, 0x00, 0xe2, 0xff, 0x09, 0x00, 0xe2, 0xff, 0x0c, 0x00, 0xe2, 0xff, 0x0e, 0x00, 0xe3, 0xff, 0x0d, 0x00, 0xe4, 0xff, 0x0c, 0x00, 0xe6, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xeb, 0xff, 0x0b, 0x00, 0xee, 0xff, 0x0d, 0x00, 0xf2, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x0e, 0x00, 0x25, 0x00, 0x0d, 0x00, 0x29, 0x00, 0x0d, 0x00, 0x2c, 0x00, 0x0d, 0x00, 0x2e, 0x00, 0x0d, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0x2d, 0x00, 0x0d, 0x00, 0x2a, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x0b, 0x00, 0x25, 0x00, 0x09, 0x00, 0x23, 0x00, 0x07, 0x00, 0x22, 0x00, 0x05, 0x00, 0x22, 0x00, 0x03, 0x00, 0x20, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x11, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf6, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf6, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf0, 0xff, 0xf5, 0xff, 0xed, 0xff, 0xf6, 0xff, 0xe9, 0xff, 0xf7, 0xff, 0xe5, 0xff, 0xf7, 0xff, 0xe2, 0xff, 0xf7, 0xff, 0xe0, 0xff, 0xf8, 0xff, 0xe1, 0xff, 0xfa, 0xff, 0xe2, 0xff, 0xfd, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xe4, 0xff, 0x02, 0x00, 0xe3, 0xff, 0x04, 0x00, 0xe1, 0xff, 0x05, 0x00, 0xdf, 0xff, 0x07, 0x00, 0xde, 0xff, 0x08, 0x00, 0xde, 0xff, 0x0a, 0x00, 0xdf, 0xff, 0x0b, 0x00, 0xe2, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x0f, 0x00, 0xe9, 0xff, 0x10, 0x00, 0xec, 0xff, 0x12, 0x00, 0xee, 0xff, 0x12, 0x00, 0xef, 0xff, 0x13, 0x00, 0xf1, 0xff, 0x14, 0x00, 0xf3, 0xff, 0x15, 0x00, 0xf6, 0xff, 0x15, 0x00, 0xfa, 0xff, 0x16, 0x00, 0xfd, 0xff, 0x17, 0x00, 0x01, 0x00, 0x17, 0x00, 0x05, 0x00, 0x17, 0x00, 0x09, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x11, 0x00, 0x17, 0x00, 0x13, 0x00, 0x17, 0x00, 0x14, 0x00, 0x16, 0x00, 0x16, 0x00, 0x15, 0x00, 0x19, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x12, 0x00, 0x1f, 0x00, 0x12, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x0f, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x0b, 0x00, 0x1e, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x08, 0x00, 0x20, 0x00, 0x07, 0x00, 0x20, 0x00, 0x06, 0x00, 0x20, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x1c, 0x00, 0xff, 0xff, 0x1a, 0x00, 0xfb, 0xff, 0x18, 0x00, 0xf9, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x17, 0x00, 0xf6, 0xff, 0x16, 0x00, 0xf5, 0xff, 0x14, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x0d, 0x00, 0xf0, 0xff, 0x0a, 0x00, 0xee, 0xff, 0x08, 0x00, 0xee, 0xff, 0x06, 0x00, 0xee, 0xff, 0x05, 0x00, 0xef, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf5, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf2, 0xff, 0xef, 0xff, 0xf2, 0xff, 0xed, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf3, 0xff, 0xe8, 0xff, 0xf4, 0xff, 0xe6, 0xff, 0xf4, 0xff, 0xe3, 0xff, 0xf5, 0xff, 0xe1, 0xff, 0xf5, 0xff, 0xde, 0xff, 0xf4, 0xff, 0xdc, 0xff, 0xf3, 0xff, 0xdb, 0xff, 0xf2, 0xff, 0xd9, 0xff, 0xf1, 0xff, 0xd8, 0xff, 0xf1, 0xff, 0xd7, 0xff, 0xf1, 0xff, 0xd6, 0xff, 0xf3, 0xff, 0xd7, 0xff, 0xf5, 0xff, 0xd8, 0xff, 0xf8, 0xff, 0xd8, 0xff, 0xf9, 0xff, 0xd8, 0xff, 0xfa, 0xff, 0xd9, 0xff, 0xf9, 0xff, 0xd9, 0xff, 0xf8, 0xff, 0xda, 0xff, 0xf8, 0xff, 0xdb, 0xff, 0xfa, 0xff, 0xdc, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0x01, 0x00, 0xe1, 0xff, 0x04, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x08, 0x00, 0xe8, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x08, 0x00, 0xea, 0xff, 0x09, 0x00, 0xed, 0xff, 0x0b, 0x00, 0xf0, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x0e, 0x00, 0xf7, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x12, 0x00, 0x03, 0x00, 0x15, 0x00, 0x02, 0x00, 0x17, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0xff, 0xff, 0x1a, 0x00, 0xfe, 0xff, 0x1a, 0x00, 0xfd, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xfd, 0xff, 0x1d, 0x00, 0xfd, 0xff, 0x1d, 0x00, 0xfe, 0xff, 0x1d, 0x00, 0xfe, 0xff, 0x1d, 0x00, 0xfe, 0xff, 0x1b, 0x00, 0xfe, 0xff, 0x1a, 0x00, 0xfc, 0xff, 0x18, 0x00, 0xfb, 0xff, 0x16, 0x00, 0xfa, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x14, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf6, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf1, 0xff, 0x03, 0x00, 0xef, 0xff, 0x02, 0x00, 0xef, 0xff, 0x00, 0x00, 0xef, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xe9, 0xff, 0xf2, 0xff, 0xe8, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xef, 0xff, 0xed, 0xff, 0xee, 0xff, 0xef, 0xff, 0xec, 0xff, 0xf1, 0xff, 0xe9, 0xff, 0xf1, 0xff, 0xe7, 0xff, 0xf1, 0xff, 0xe4, 0xff, 0xf2, 0xff, 0xe2, 0xff, 0xf3, 0xff, 0xe1, 0xff, 0xf5, 0xff, 0xe0, 0xff, 0xf8, 0xff, 0xe0, 0xff, 0xfc, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xe0, 0xff, 0x01, 0x00, 0xdf, 0xff, 0x03, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xde, 0xff, 0x04, 0x00, 0xdd, 0xff, 0x04, 0x00, 0xdd, 0xff, 0x03, 0x00, 0xde, 0xff, 0x03, 0x00, 0xe0, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x06, 0x00, 0xe7, 0xff, 0x08, 0x00, 0xea, 0xff, 0x08, 0x00, 0xee, 0xff, 0x08, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xff, 0xff, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x07, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x12, 0x00, 0x06, 0x00, 0x15, 0x00, 0x04, 0x00, 0x17, 0x00, 0x05, 0x00, 0x19, 0x00, 0x06, 0x00, 0x1b, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x0d, 0x00, 0x24, 0x00, 0x0d, 0x00, 0x26, 0x00, 0x0c, 0x00, 0x27, 0x00, 0x0c, 0x00, 0x28, 0x00, 0x0c, 0x00, 0x28, 0x00, 0x0d, 0x00, 0x29, 0x00, 0x0f, 0x00, 0x2a, 0x00, 0x10, 0x00, 0x2a, 0x00, 0x12, 0x00, 0x2b, 0x00, 0x12, 0x00, 0x2b, 0x00, 0x11, 0x00, 0x2b, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x0e, 0x00, 0x2a, 0x00, 0x0c, 0x00, 0x29, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x0b, 0x00, 0x27, 0x00, 0x0a, 0x00, 0x26, 0x00, 0x09, 0x00, 0x25, 0x00, 0x08, 0x00, 0x24, 0x00, 0x06, 0x00, 0x22, 0x00, 0x05, 0x00, 0x20, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0xfe, 0xff, 0x18, 0x00, 0xfc, 0xff, 0x16, 0x00, 0xfb, 0xff, 0x15, 0x00, 0xfb, 0xff, 0x13, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x01, 0x00, 0xf2, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xec, 0xff, 0xef, 0xff, 0xee, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xed, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xeb, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf5, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf8, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfe, 0xff, 0xe6, 0xff, 0xfe, 0xff, 0xe5, 0xff, 0xfd, 0xff, 0xe4, 0xff, 0xfc, 0xff, 0xe4, 0xff, 0xfb, 0xff, 0xe4, 0xff, 0xfa, 0xff, 0xe4, 0xff, 0xfb, 0xff, 0xe3, 0xff, 0xfc, 0xff, 0xe1, 0xff, 0xfd, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x01, 0x00, 0xdf, 0xff, 0x02, 0x00, 0xe0, 0xff, 0x02, 0x00, 0xe2, 0xff, 0x01, 0x00, 0xe4, 0xff, 0x01, 0x00, 0xe6, 0xff, 0x01, 0x00, 0xe7, 0xff, 0x03, 0x00, 0xe7, 0xff, 0x06, 0x00, 0xe7, 0xff, 0x0a, 0x00, 0xe8, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x10, 0x00, 0xe9, 0xff, 0x11, 0x00, 0xea, 0xff, 0x11, 0x00, 0xeb, 0xff, 0x10, 0x00, 0xec, 0xff, 0x10, 0x00, 0xed, 0xff, 0x10, 0x00, 0xee, 0xff, 0x11, 0x00, 0xef, 0xff, 0x13, 0x00, 0xf0, 0xff, 0x15, 0x00, 0xf0, 0xff, 0x16, 0x00, 0xf0, 0xff, 0x16, 0x00, 0xf1, 0xff, 0x15, 0x00, 0xf2, 0xff, 0x13, 0x00, 0xf3, 0xff, 0x11, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf6, 0xff, 0x10, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x10, 0x00, 0x06, 0x00, 0x11, 0x00, 0x06, 0x00, 0x12, 0x00, 0x05, 0x00, 0x14, 0x00, 0x05, 0x00, 0x16, 0x00, 0x03, 0x00, 0x19, 0x00, 0x01, 0x00, 0x1b, 0x00, 0xff, 0xff, 0x1c, 0x00, 0xfc, 0xff, 0x1d, 0x00, 0xfa, 0xff, 0x1d, 0x00, 0xf9, 0xff, 0x1c, 0x00, 0xf8, 0xff, 0x1c, 0x00, 0xf7, 0xff, 0x1c, 0x00, 0xf6, 0xff, 0x1c, 0x00, 0xf5, 0xff, 0x1c, 0x00, 0xf3, 0xff, 0x1c, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xee, 0xff, 0x1a, 0x00, 0xeb, 0xff, 0x18, 0x00, 0xea, 0xff, 0x15, 0x00, 0xe8, 0xff, 0x13, 0x00, 0xe7, 0xff, 0x11, 0x00, 0xe7, 0xff, 0x10, 0x00, 0xe7, 0xff, 0x0f, 0x00, 0xe6, 0xff, 0x0d, 0x00, 0xe5, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x09, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe4, 0xff, 0x05, 0x00, 0xe5, 0xff, 0x04, 0x00, 0xe7, 0xff, 0x02, 0x00, 0xe9, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xf3, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0x00, 0x00, 0xf1, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x08, 0x00, 0xf1, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x0a, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0e, 0x00, 0xf5, 0xff, 0x10, 0x00, 0xf7, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x12, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x14, 0x00, 0xfc, 0xff, 0x15, 0x00, 0xff, 0xff, 0x16, 0x00, 0x01, 0x00, 0x16, 0x00, 0x03, 0x00, 0x16, 0x00, 0x05, 0x00, 0x16, 0x00, 0x06, 0x00, 0x16, 0x00, 0x07, 0x00, 0x16, 0x00, 0x09, 0x00, 0x15, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x10, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x0a, 0x00, 0x17, 0x00, 0x08, 0x00, 0x19, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x04, 0x00, 0x1f, 0x00, 0x03, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x20, 0x00, 0xff, 0xff, 0x21, 0x00, 0xfd, 0xff, 0x23, 0x00, 0xfc, 0xff, 0x25, 0x00, 0xfb, 0xff, 0x26, 0x00, 0xfb, 0xff, 0x27, 0x00, 0xfa, 0xff, 0x26, 0x00, 0xfa, 0xff, 0x25, 0x00, 0xf9, 0xff, 0x24, 0x00, 0xf7, 0xff, 0x22, 0x00, 0xf6, 0xff, 0x22, 0x00, 0xf5, 0xff, 0x22, 0x00, 0xf4, 0xff, 0x21, 0x00, 0xf3, 0xff, 0x20, 0x00, 0xf2, 0xff, 0x1e, 0x00, 0xf1, 0xff, 0x1a, 0x00, 0xef, 0xff, 0x17, 0x00, 0xed, 0xff, 0x13, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x09, 0x00, 0xea, 0xff, 0x07, 0x00, 0xe9, 0xff, 0x04, 0x00, 0xe9, 0xff, 0x01, 0x00, 0xe9, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0xfb, 0xff, 0xe8, 0xff, 0xf7, 0xff, 0xe8, 0xff, 0xf4, 0xff, 0xe9, 0xff, 0xf0, 0xff, 0xea, 0xff, 0xec, 0xff, 0xec, 0xff, 0xe9, 0xff, 0xee, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe6, 0xff, 0xf2, 0xff, 0xe5, 0xff, 0xf4, 0xff, 0xe4, 0xff, 0xf5, 0xff, 0xe4, 0xff, 0xf7, 0xff, 0xe4, 0xff, 0xf9, 0xff, 0xe3, 0xff, 0xfc, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x03, 0x00, 0xde, 0xff, 0x06, 0x00, 0xdf, 0xff, 0x09, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0xe1, 0xff, 0x0d, 0x00, 0xe2, 0xff, 0x0f, 0x00, 0xe3, 0xff, 0x11, 0x00, 0xe2, 0xff, 0x13, 0x00, 0xe0, 0xff, 0x15, 0x00, 0xdf, 0xff, 0x18, 0x00, 0xdf, 0xff, 0x1a, 0x00, 0xdf, 0xff, 0x1b, 0x00, 0xe1, 0xff, 0x1c, 0x00, 0xe3, 0xff, 0x1d, 0x00, 0xe5, 0xff, 0x1d, 0x00, 0xe6, 0xff, 0x1d, 0x00, 0xe7, 0xff, 0x1c, 0x00, 0xe7, 0xff, 0x1c, 0x00, 0xe7, 0xff, 0x1c, 0x00, 0xe8, 0xff, 0x1c, 0x00, 0xe9, 0xff, 0x1c, 0x00, 0xeb, 0xff, 0x1b, 0x00, 0xed, 0xff, 0x1a, 0x00, 0xf0, 0xff, 0x18, 0x00, 0xf4, 0xff, 0x16, 0x00, 0xf7, 0xff, 0x14, 0x00, 0xfb, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xff, 0xff, 0x12, 0x00, 0x01, 0x00, 0x12, 0x00, 0x02, 0x00, 0x12, 0x00, 0x04, 0x00, 0x11, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x09, 0x00, 0x13, 0x00, 0x09, 0x00, 0x13, 0x00, 0x08, 0x00, 0x12, 0x00, 0x07, 0x00, 0x11, 0x00, 0x05, 0x00, 0x11, 0x00, 0x02, 0x00, 0x12, 0x00, 0xff, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xf7, 0xff, 0x10, 0x00, 0xf5, 0xff, 0x0f, 0x00, 0xf3, 0xff, 0x0e, 0x00, 0xf1, 0xff, 0x0d, 0x00, 0xef, 0xff, 0x0d, 0x00, 0xed, 0xff, 0x0d, 0x00, 0xeb, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x0c, 0x00, 0xe6, 0xff, 0x0c, 0x00, 0xe4, 0xff, 0x0b, 0x00, 0xe2, 0xff, 0x0b, 0x00, 0xe1, 0xff, 0x0b, 0x00, 0xe1, 0xff, 0x0b, 0x00, 0xe1, 0xff, 0x0a, 0x00, 0xe2, 0xff, 0x0a, 0x00, 0xe3, 0xff, 0x09, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe4, 0xff, 0x06, 0x00, 0xe4, 0xff, 0x05, 0x00, 0xe4, 0xff, 0x04, 0x00, 0xe4, 0xff, 0x03, 0x00, 0xe6, 0xff, 0x01, 0x00, 0xe8, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xfd, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xea, 0xff, 0x01, 0x00, 0xea, 0xff, 0x03, 0x00, 0xe9, 0xff, 0x06, 0x00, 0xe8, 0xff, 0x09, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xe7, 0xff, 0x0c, 0x00, 0xe7, 0xff, 0x0c, 0x00, 0xe8, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x0d, 0x00, 0xeb, 0xff, 0x0d, 0x00, 0xed, 0xff, 0x0f, 0x00, 0xee, 0xff, 0x11, 0x00, 0xef, 0xff, 0x12, 0x00, 0xef, 0xff, 0x13, 0x00, 0xef, 0xff, 0x12, 0x00, 0xf0, 0xff, 0x11, 0x00, 0xf1, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf6, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x11, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x10, 0x00, 0x06, 0x00, 0x11, 0x00, 0x03, 0x00, 0x12, 0x00, 0x01, 0x00, 0x13, 0x00, 0xfe, 0xff, 0x14, 0x00, 0xfc, 0xff, 0x15, 0x00, 0xf9, 0xff, 0x17, 0x00, 0xf7, 0xff, 0x18, 0x00, 0xf4, 0xff, 0x19, 0x00, 0xf0, 0xff, 0x19, 0x00, 0xed, 0xff, 0x19, 0x00, 0xeb, 0xff, 0x18, 0x00, 0xe9, 0xff, 0x18, 0x00, 0xe7, 0xff, 0x19, 0x00, 0xe6, 0xff, 0x1a, 0x00, 0xe4, 0xff, 0x1a, 0x00, 0xe2, 0xff, 0x1b, 0x00, 0xe0, 0xff, 0x1a, 0x00, 0xde, 0xff, 0x18, 0x00, 0xdd, 0xff, 0x15, 0x00, 0xdd, 0xff, 0x13, 0x00, 0xdd, 0xff, 0x11, 0x00, 0xde, 0xff, 0x10, 0x00, 0xdf, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0x0e, 0x00, 0xe1, 0xff, 0x0c, 0x00, 0xe2, 0xff, 0x0a, 0x00, 0xe3, 0xff, 0x08, 0x00, 0xe5, 0xff, 0x05, 0x00, 0xe8, 0xff, 0x03, 0x00, 0xeb, 0xff, 0x02, 0x00, 0xee, 0xff, 0x01, 0x00, 0xf1, 0xff, 0x00, 0x00, 0xf4, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x11, 0x00, 0xf7, 0xff, 0x13, 0x00, 0xf7, 0xff, 0x15, 0x00, 0xf6, 0xff, 0x16, 0x00, 0xf5, 0xff, 0x18, 0x00, 0xf5, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x1d, 0x00, 0xf4, 0xff, 0x1f, 0x00, 0xf4, 0xff, 0x22, 0x00, 0xf4, 0xff, 0x25, 0x00, 0xf4, 0xff, 0x28, 0x00, 0xf3, 0xff, 0x29, 0x00, 0xf2, 0xff, 0x2a, 0x00, 0xf1, 0xff, 0x2b, 0x00, 0xf0, 0xff, 0x2b, 0x00, 0xf0, 0xff, 0x2b, 0x00, 0xf0, 0xff, 0x2c, 0x00, 0xf2, 0xff, 0x2d, 0x00, 0xf4, 0xff, 0x2d, 0x00, 0xf6, 0xff, 0x2d, 0x00, 0xf6, 0xff, 0x2c, 0x00, 0xf7, 0xff, 0x2a, 0x00, 0xf6, 0xff, 0x27, 0x00, 0xf6, 0xff, 0x24, 0x00, 0xf6, 0xff, 0x21, 0x00, 0xf7, 0xff, 0x1e, 0x00, 0xf9, 0xff, 0x1b, 0x00, 0xfb, 0xff, 0x18, 0x00, 0xfe, 0xff, 0x15, 0x00, 0xff, 0xff, 0x12, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xf2, 0xff, 0x09, 0x00, 0xf1, 0xff, 0x09, 0x00, 0xef, 0xff, 0x08, 0x00, 0xed, 0xff, 0x07, 0x00, 0xea, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x07, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe5, 0xff, 0x08, 0x00, 0xe4, 0xff, 0x08, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe3, 0xff, 0x06, 0x00, 0xe2, 0xff, 0x04, 0x00, 0xe2, 0xff, 0x02, 0x00, 0xe1, 0xff, 0x01, 0x00, 0xe0, 0xff, 0x01, 0x00, 0xe0, 0xff, 0x01, 0x00, 0xe1, 0xff, 0x02, 0x00, 0xe2, 0xff, 0x03, 0x00, 0xe4, 0xff, 0x02, 0x00, 0xe5, 0xff, 0x02, 0x00, 0xe6, 0xff, 0x01, 0x00, 0xe6, 0xff, 0x00, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xe9, 0xff, 0x01, 0x00, 0xeb, 0xff, 0x02, 0x00, 0xed, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x10, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x16, 0x00, 0xf9, 0xff, 0x19, 0x00, 0xfb, 0xff, 0x1b, 0x00, 0xfd, 0xff, 0x1c, 0x00, 0xff, 0xff, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xff, 0xff, 0x1d, 0x00, 0xff, 0xff, 0x1d, 0x00, 0xfe, 0xff, 0x1e, 0x00, 0xff, 0xff, 0x1f, 0x00, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x02, 0x00, 0x18, 0x00, 0x02, 0x00, 0x15, 0x00, 0x01, 0x00, 0x13, 0x00, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x05, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf2, 0xff, 0x0d, 0x00, 0xef, 0xff, 0x0c, 0x00, 0xec, 0xff, 0x0b, 0x00, 0xe9, 0xff, 0x0b, 0x00, 0xe7, 0xff, 0x0b, 0x00, 0xe6, 0xff, 0x0c, 0x00, 0xe5, 0xff, 0x0d, 0x00, 0xe3, 0xff, 0x0e, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xdf, 0xff, 0x0f, 0x00, 0xde, 0xff, 0x0f, 0x00, 0xdc, 0xff, 0x0e, 0x00, 0xdb, 0xff, 0x0d, 0x00, 0xda, 0xff, 0x0c, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xda, 0xff, 0x0a, 0x00, 0xdb, 0xff, 0x09, 0x00, 0xdc, 0xff, 0x08, 0x00, 0xde, 0xff, 0x06, 0x00, 0xe0, 0xff, 0x03, 0x00, 0xe2, 0xff, 0x01, 0x00, 0xe3, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xfe, 0xff, 0xe4, 0xff, 0xfe, 0xff, 0xe5, 0xff, 0xfe, 0xff, 0xe8, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x0d, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x12, 0x00, 0xf3, 0xff, 0x14, 0x00, 0xf4, 0xff, 0x16, 0x00, 0xf6, 0xff, 0x17, 0x00, 0xf7, 0xff, 0x18, 0x00, 0xf7, 0xff, 0x19, 0x00, 0xf6, 0xff, 0x1a, 0x00, 0xf4, 0xff, 0x1a, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xf1, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x1d, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0xf4, 0xff, 0x1d, 0x00, 0xf3, 0xff, 0x1d, 0x00, 0xf2, 0xff, 0x1d, 0x00, 0xf1, 0xff, 0x1d, 0x00, 0xf0, 0xff, 0x1d, 0x00, 0xef, 0xff, 0x1d, 0x00, 0xf0, 0xff, 0x1c, 0x00, 0xf2, 0xff, 0x1a, 0x00, 0xf5, 0xff, 0x17, 0x00, 0xf7, 0xff, 0x14, 0x00, 0xf8, 0xff, 0x11, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x09, 0x00, 0xf5, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf7, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xfd, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xed, 0xff, 0x00, 0x00, 0xee, 0xff, 0x01, 0x00, 0xef, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x10, 0x00, 0x05, 0x00, 0x13, 0x00, 0x05, 0x00, 0x15, 0x00, 0x04, 0x00, 0x17, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x18, 0x00, 0x03, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x18, 0x00, 0x02, 0x00, 0x18, 0x00, 0x02, 0x00, 0x18, 0x00, 0x02, 0x00, 0x19, 0x00, 0x01, 0x00, 0x19, 0x00, 0xff, 0xff, 0x19, 0x00, 0xfe, 0xff, 0x19, 0x00, 0xfd, 0xff, 0x18, 0x00, 0xfd, 0xff, 0x17, 0x00, 0xfd, 0xff, 0x15, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x10, 0x00, 0xf7, 0xff, 0x0e, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xf4, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xee, 0xff, 0xf5, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xe8, 0xff, 0xf8, 0xff, 0xe6, 0xff, 0xfa, 0xff, 0xe4, 0xff, 0xfc, 0xff, 0xe3, 0xff, 0xfe, 0xff, 0xe2, 0xff, 0x00, 0x00, 0xe1, 0xff, 0x02, 0x00, 0xe0, 0xff, 0x03, 0x00, 0xdf, 0xff, 0x04, 0x00, 0xde, 0xff, 0x06, 0x00, 0xdd, 0xff, 0x07, 0x00, 0xdc, 0xff, 0x09, 0x00, 0xdc, 0xff, 0x0b, 0x00, 0xdc, 0xff, 0x0d, 0x00, 0xdc, 0xff, 0x0e, 0x00, 0xdd, 0xff, 0x0f, 0x00, 0xde, 0xff, 0x0f, 0x00, 0xe0, 0xff, 0x0e, 0x00, 0xe1, 0xff, 0x0e, 0x00, 0xe3, 0xff, 0x0e, 0x00, 0xe5, 0xff, 0x0e, 0x00, 0xe6, 0xff, 0x0e, 0x00, 0xe7, 0xff, 0x0d, 0x00, 0xe8, 0xff, 0x0c, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xeb, 0xff, 0x0b, 0x00, 0xed, 0xff, 0x0b, 0x00, 0xef, 0xff, 0x0b, 0x00, 0xf1, 0xff, 0x0c, 0x00, 0xf2, 0xff, 0x0d, 0x00, 0xf3, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x0d, 0x00, 0xf4, 0xff, 0x0d, 0x00, 0xf5, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x11, 0x00, 0xff, 0xff, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0d, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x17, 0x00, 0x09, 0x00, 0x18, 0x00, 0x08, 0x00, 0x18, 0x00, 0x06, 0x00, 0x18, 0x00, 0x04, 0x00, 0x17, 0x00, 0x02, 0x00, 0x16, 0x00, 0x01, 0x00, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0xff, 0xff, 0x14, 0x00, 0xfe, 0xff, 0x13, 0x00, 0xfd, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x11, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf5, 0xff, 0x0e, 0x00, 0xf5, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf4, 0xff, 0x0a, 0x00, 0xf5, 0xff, 0x09, 0x00, 0xf5, 0xff, 0x08, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x08, 0x00, 0xf3, 0xff, 0x0a, 0x00, 0xf3, 0xff, 0x0b, 0x00, 0xf3, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0b, 0x00, 0xf7, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0c, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x08, 0x00, 0x11, 0x00, 0x05, 0x00, 0x11, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x02, 0x00, 0xef, 0xff, 0x00, 0x00, 0xef, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xe9, 0xff, 0xf4, 0xff, 0xe8, 0xff, 0xf4, 0xff, 0xe7, 0xff, 0xf3, 0xff, 0xe7, 0xff, 0xf2, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe8, 0xff, 0xef, 0xff, 0xe9, 0xff, 0xee, 0xff, 0xea, 0xff, 0xee, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xec, 0xff, 0xee, 0xff, 0xec, 0xff, 0xee, 0xff, 0xed, 0xff, 0xee, 0xff, 0xed, 0xff, 0xee, 0xff, 0xee, 0xff, 0xee, 0xff, 0xee, 0xff, 0xee, 0xff, 0xef, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xf0, 0xff, 0xf1, 0xff, 0xf1, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x10, 0x00, 0x07, 0x00, 0x11, 0x00, 0x07, 0x00, 0x13, 0x00, 0x07, 0x00, 0x15, 0x00, 0x08, 0x00, 0x15, 0x00, 0x08, 0x00, 0x15, 0x00, 0x07, 0x00, 0x14, 0x00, 0x05, 0x00, 0x14, 0x00, 0x03, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0xfe, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x0e, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfd, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xec, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xea, 0xff, 0x00, 0x00, 0xe9, 0xff, 0x00, 0x00, 0xe8, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xec, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x02, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0e, 0x00, 0x01, 0x00, 0x10, 0x00, 0x04, 0x00, 0x11, 0x00, 0x06, 0x00, 0x12, 0x00, 0x09, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0c, 0x00, 0x11, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x05, 0x00, 0x13, 0x00, 0x04, 0x00, 0x12, 0x00, 0x02, 0x00, 0x11, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf5, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xf0, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xed, 0xff, 0xee, 0xff, 0xed, 0xff, 0xed, 0xff, 0xed, 0xff, 0xec, 0xff, 0xee, 0xff, 0xeb, 0xff, 0xef, 0xff, 0xeb, 0xff, 0xf0, 0xff, 0xeb, 0xff, 0xf2, 0xff, 0xeb, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xeb, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xe9, 0xff, 0xf7, 0xff, 0xe9, 0xff, 0xf9, 0xff, 0xe9, 0xff, 0xfb, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xff, 0xff, 0xef, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x08, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x11, 0x00, 0x04, 0x00, 0x12, 0x00, 0x05, 0x00, 0x13, 0x00, 0x05, 0x00, 0x13, 0x00, 0x05, 0x00, 0x13, 0x00, 0x06, 0x00, 0x13, 0x00, 0x08, 0x00, 0x13, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x09, 0x00, 0x11, 0x00, 0x08, 0x00, 0x12, 0x00, 0x06, 0x00, 0x11, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xff, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf1, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xfc, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x02, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf2, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x07, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x13, 0x00, 0x09, 0x00, 0x15, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x09, 0x00, 0x17, 0x00, 0x08, 0x00, 0x18, 0x00, 0x07, 0x00, 0x18, 0x00, 0x08, 0x00, 0x19, 0x00, 0x09, 0x00, 0x19, 0x00, 0x09, 0x00, 0x17, 0x00, 0x09, 0x00, 0x16, 0x00, 0x08, 0x00, 0x14, 0x00, 0x07, 0x00, 0x13, 0x00, 0x06, 0x00, 0x12, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xf1, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xef, 0xff, 0xf2, 0xff, 0xee, 0xff, 0xf1, 0xff, 0xed, 0xff, 0xf1, 0xff, 0xec, 0xff, 0xf0, 0xff, 0xec, 0xff, 0xef, 0xff, 0xeb, 0xff, 0xee, 0xff, 0xec, 0xff, 0xee, 0xff, 0xec, 0xff, 0xee, 0xff, 0xec, 0xff, 0xed, 0xff, 0xeb, 0xff, 0xed, 0xff, 0xea, 0xff, 0xee, 0xff, 0xe9, 0xff, 0xef, 0xff, 0xe8, 0xff, 0xf1, 0xff, 0xe8, 0xff, 0xf3, 0xff, 0xe9, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xee, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x00, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x00, 0x17, 0x00, 0x03, 0x00, 0x18, 0x00, 0x04, 0x00, 0x19, 0x00, 0x05, 0x00, 0x1b, 0x00, 0x06, 0x00, 0x1d, 0x00, 0x06, 0x00, 0x1e, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x08, 0x00, 0x1f, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x0c, 0x00, 0x16, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x09, 0x00, 0x01, 0x00, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x10, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x08, 0x00, 0x12, 0x00, 0x07, 0x00, 0x12, 0x00, 0x06, 0x00, 0x12, 0x00, 0x06, 0x00, 0x12, 0x00, 0x05, 0x00, 0x11, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf6, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xf0, 0xff, 0xf4, 0xff, 0xf0, 0xff, 0xf3, 0xff, 0xef, 0xff, 0xf1, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xee, 0xff, 0xf0, 0xff, 0xef, 0xff, 0xf1, 0xff, 0xef, 0xff, 0xf3, 0xff, 0xef, 0xff, 0xf4, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf6, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xef, 0xff, 0x06, 0x00, 0xed, 0xff, 0x06, 0x00, 0xec, 0xff, 0x06, 0x00, 0xeb, 0xff, 0x06, 0x00, 0xeb, 0xff, 0x07, 0x00, 0xec, 0xff, 0x08, 0x00, 0xed, 0xff, 0x08, 0x00, 0xee, 0xff, 0x08, 0x00, 0xef, 0xff, 0x08, 0x00, 0xef, 0xff, 0x07, 0x00, 0xee, 0xff, 0x06, 0x00, 0xee, 0xff, 0x05, 0x00, 0xee, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfb, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x11, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xf8, 0xff, 0x14, 0x00, 0xf7, 0xff, 0x13, 0x00, 0xf7, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xf9, 0xff, 0x0f, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x09, 0x00, 0x03, 0x00, 0x07, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x07, 0x00, 0xef, 0xff, 0x08, 0x00, 0xef, 0xff, 0x08, 0x00, 0xee, 0xff, 0x09, 0x00, 0xef, 0xff, 0x0a, 0x00, 0xf0, 0xff, 0x0b, 0x00, 0xf2, 0xff, 0x0c, 0x00, 0xf4, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x0b, 0x00, 0xf7, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf6, 0xff, 0x0c, 0x00, 0xf6, 0xff, 0x0d, 0x00, 0xf6, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x05, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x09, 0x00, 0x05, 0x00, 0x09, 0x00, 0x04, 0x00, 0x09, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf3, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xef, 0xff, 0x06, 0x00, 0xee, 0xff, 0x06, 0x00, 0xed, 0xff, 0x05, 0x00, 0xed, 0xff, 0x04, 0x00, 0xed, 0xff, 0x04, 0x00, 0xec, 0xff, 0x03, 0x00, 0xeb, 0xff, 0x03, 0x00, 0xea, 0xff, 0x03, 0x00, 0xe9, 0xff, 0x03, 0x00, 0xe8, 0xff, 0x02, 0x00, 0xe8, 0xff, 0x02, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xe9, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf2, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf1, 0xff, 0x01, 0x00, 0xf0, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xef, 0xff, 0x05, 0x00, 0xef, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xef, 0xff, 0x06, 0x00, 0xef, 0xff, 0x06, 0x00, 0xed, 0xff, 0x08, 0x00, 0xec, 0xff, 0x09, 0x00, 0xea, 0xff, 0x0b, 0x00, 0xea, 0xff, 0x0c, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe9, 0xff, 0x0c, 0x00, 0xe9, 0xff, 0x0c, 0x00, 0xe9, 0xff, 0x0d, 0x00, 0xe9, 0xff, 0x0e, 0x00, 0xe9, 0xff, 0x0f, 0x00, 0xe9, 0xff, 0x10, 0x00, 0xe9, 0xff, 0x11, 0x00, 0xe9, 0xff, 0x10, 0x00, 0xea, 0xff, 0x10, 0x00, 0xeb, 0xff, 0x0f, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xed, 0xff, 0x0f, 0x00, 0xee, 0xff, 0x10, 0x00, 0xf0, 0xff, 0x10, 0x00, 0xf1, 0xff, 0x10, 0x00, 0xf1, 0xff, 0x10, 0x00, 0xf2, 0xff, 0x10, 0x00, 0xf3, 0xff, 0x10, 0x00, 0xf4, 0xff, 0x10, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf8, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x09, 0x00, 0x09, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x11, 0x00, 0xfc, 0xff, 0x12, 0x00, 0xfb, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x11, 0x00, 0xfa, 0xff, 0x10, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x10, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xf8, 0xff, 0x10, 0x00, 0xf8, 0xff, 0x0e, 0x00, 0xf8, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x04, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xef, 0xff, 0x06, 0x00, 0xef, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x07, 0x00, 0xf0, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x01, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x11, 0x00, 0x01, 0x00, 0x12, 0x00, 0x02, 0x00, 0x14, 0x00, 0x02, 0x00, 0x15, 0x00, 0x02, 0x00, 0x16, 0x00, 0x02, 0x00, 0x16, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0xff, 0xff, 0x12, 0x00, 0xfe, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf0, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x11, 0x00, 0x04, 0x00, 0x12, 0x00, 0x03, 0x00, 0x12, 0x00, 0x02, 0x00, 0x11, 0x00, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x03, 0x00, 0x11, 0x00, 0x04, 0x00, 0x11, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x05, 0x00, 0x11, 0x00, 0x04, 0x00, 0x11, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x09, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf2, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf8, 0xff, 0xf3, 0xff, 0xf9, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x10, 0x00, 0x06, 0x00, 0x10, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf3, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf7, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xf8, 0xff, 0xe9, 0xff, 0xf9, 0xff, 0xe8, 0xff, 0xfa, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe7, 0xff, 0xfb, 0xff, 0xe7, 0xff, 0xfa, 0xff, 0xe7, 0xff, 0xf9, 0xff, 0xe7, 0xff, 0xf9, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xe8, 0xff, 0xf9, 0xff, 0xe8, 0xff, 0xfa, 0xff, 0xe9, 0xff, 0xfb, 0xff, 0xea, 0xff, 0xfd, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xed, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x01, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x11, 0x00, 0x09, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x09, 0x00, 0x15, 0x00, 0x09, 0x00, 0x16, 0x00, 0x08, 0x00, 0x17, 0x00, 0x07, 0x00, 0x16, 0x00, 0x06, 0x00, 0x15, 0x00, 0x06, 0x00, 0x14, 0x00, 0x06, 0x00, 0x12, 0x00, 0x06, 0x00, 0x10, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, 0x08, 0x00, 0x07, 0x00, 0x08, 0x00, 0x07, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0xff, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfb, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xf8, 0xff, 0xf3, 0xff, 0xf6, 0xff, 0xf3, 0xff, 0xf5, 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xff, 0xec, 0xff, 0xf5, 0xff, 0xeb, 0xff, 0xf5, 0xff, 0xea, 0xff, 0xf4, 0xff, 0xea, 0xff, 0xf2, 0xff, 0xea, 0xff, 0xf1, 0xff, 0xeb, 0xff, 0xf1, 0xff, 0xec, 0xff, 0xf2, 0xff, 0xec, 0xff, 0xf3, 0xff, 0xeb, 0xff, 0xf5, 0xff, 0xeb, 0xff, 0xf6, 0xff, 0xea, 0xff, 0xf7, 0xff, 0xea, 0xff, 0xf7, 0xff, 0xeb, 0xff, 0xf7, 0xff, 0xec, 0xff, 0xf6, 0xff, 0xed, 0xff, 0xf6, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf9, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x14, 0x00, 0x08, 0x00, 0x18, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x0a, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x0d, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x1d, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x0c, 0x00, 0x21, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x0c, 0x00, 0x1d, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x16, 0x00, 0x0e, 0x00, 0x15, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x0c, 0x00, 0x12, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x08, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf2, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf3, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xed, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xf1, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xff, 0x00, 0x00, 0xee, 0xff, 0x00, 0x00, 0xed, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xea, 0xff, 0x00, 0x00, 0xe8, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x00, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xe9, 0xff, 0x01, 0x00, 0xe9, 0xff, 0x01, 0x00, 0xea, 0xff, 0x01, 0x00, 0xe9, 0xff, 0x00, 0x00, 0xe8, 0xff, 0x00, 0x00, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xea, 0xff, 0xff, 0xff, 0xec, 0xff, 0xff, 0xff, 0xee, 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x11, 0x00, 0x06, 0x00, 0x12, 0x00, 0x06, 0x00, 0x12, 0x00, 0x06, 0x00, 0x11, 0x00, 0x06, 0x00, 0x10, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x0a, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0c, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x04, 0x00, 0xf1, 0xff, 0x03, 0x00, 0xf1, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xef, 0xff, 0xff, 0xff, 0xee, 0xff, 0xfe, 0xff, 0xed, 0xff, 0xfd, 0xff, 0xed, 0xff, 0xfc, 0xff, 0xed, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xef, 0xff, 0xf9, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf6, 0xff, 0xf3, 0xff, 0xf4, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf3, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xf1, 0xff, 0xf4, 0xff, 0xf1, 0xff, 0xf5, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xef, 0xff, 0xf9, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xfa, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x09, 0x00, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0xff, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x09, 0x00, 0xf4, 0xff, 0x0a, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0c, 0x00, 0xf7, 0xff, 0x0d, 0x00, 0xf8, 0xff, 0x0f, 0x00, 0xf9, 0xff, 0x11, 0x00, 0xf9, 0xff, 0x12, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xf9, 0xff, 0x13, 0x00, 0xfa, 0xff, 0x13, 0x00, 0xfb, 0xff, 0x12, 0x00, 0xfc, 0xff, 0x11, 0x00, 0xfe, 0xff, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x03, 0x00, 0x11, 0x00, 0x05, 0x00, 0x11, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x09, 0x00, 0x09, 0x00, 0x08, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x01, 0x00, 0xee, 0xff, 0x00, 0x00, 0xec, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfc, 0xff, 0xea, 0xff, 0xfa, 0xff, 0xeb, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xee, 0xff, 0xf8, 0xff, 0xef, 0xff, 0xf8, 0xff, 0xf0, 0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf2, 0xff, 0xf8, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf5, 0xff, 0xf6, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf3, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x0e, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0xff, 0x10, 0x00, 0xff, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x12, 0x00, 0xfd, 0xff, 0x11, 0x00, 0xfd, 0xff, 0x10, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x09, 0x00, 0xf7, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf7, 0xff, 0x0c, 0x00, 0xf8, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0d, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x10, 0x00, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf2, 0xff, 0x03, 0x00, 0xf1, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf0, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x05, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xf0, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x05, 0x00, 0xf2, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x05, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x03, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0x00, 0x06, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x10, 0x00, 0x02, 0x00, 0x10, 0x00, 0x02, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0b, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf4, 0xff, 0x06, 0x00, 0xf3, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf1, 0xff, 0x06, 0x00, 0xf1, 0xff, 0x04, 0x00, 0xf0, 0xff, 0x02, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xef, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xf0, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf6, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf6, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xf9, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfa, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x04, 0x00, 0x09, 0x00, 0x05, 0x00, 0x09, 0x00, 0x07, 0x00, 0x09, 0x00, 0x08, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x10, 0x00, 0x03, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x06, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xf9, 0xff, 0xec, 0xff, 0xf9, 0xff, 0xeb, 0xff, 0xf8, 0xff, 0xea, 0xff, 0xf9, 0xff, 0xea, 0xff, 0xfa, 0xff, 0xea, 0xff, 0xfb, 0xff, 0xeb, 0xff, 0xfb, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xec, 0xff, 0xfa, 0xff, 0xed, 0xff, 0xf9, 0xff, 0xed, 0xff, 0xf8, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xed, 0xff, 0xf7, 0xff, 0xee, 0xff, 0xf7, 0xff, 0xf0, 0xff, 0xf7, 0xff, 0xf2, 0xff, 0xf7, 0xff, 0xf4, 0xff, 0xf7, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x05, 0x00, 0x10, 0x00, 0x05, 0x00, 0x10, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xed, 0xff, 0x00, 0x00, 0xed, 0xff, 0x01, 0x00, 0xed, 0xff, 0x02, 0x00, 0xed, 0xff, 0x02, 0x00, 0xed, 0xff, 0x02, 0x00, 0xee, 0xff, 0x02, 0x00, 0xef, 0xff, 0x01, 0x00, 0xf1, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf4, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0e, 0x00, 0xfd, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xfb, 0xff, 0xf4, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfa, 0xff, 0xf1, 0xff, 0xfb, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf1, 0xff, 0x00, 0x00, 0xf1, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x10, 0x00, 0x09, 0x00, 0x11, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x09, 0x00, 0x16, 0x00, 0x08, 0x00, 0x17, 0x00, 0x08, 0x00, 0x18, 0x00, 0x08, 0x00, 0x18, 0x00, 0x08, 0x00, 0x19, 0x00, 0x08, 0x00, 0x19, 0x00, 0x09, 0x00, 0x19, 0x00, 0x08, 0x00, 0x18, 0x00, 0x07, 0x00, 0x16, 0x00, 0x06, 0x00, 0x14, 0x00, 0x04, 0x00, 0x13, 0x00, 0x03, 0x00, 0x12, 0x00, 0x02, 0x00, 0x12, 0x00, 0x02, 0x00, 0x11, 0x00, 0x02, 0x00, 0x11, 0x00, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xec, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xfe, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe9, 0xff, 0xfd, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe8, 0xff, 0xfc, 0xff, 0xe9, 0xff, 0xfc, 0xff, 0xeb, 0xff, 0xfd, 0xff, 0xec, 0xff, 0xfd, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf4, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xff, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xf9, 0xff, 0xf6, 0xff, 0xf8, 0xff, 0xf5, 0xff, 0xf8, 0xff, 0xf4, 0xff, 0xf9, 0xff, 0xf3, 0xff, 0xfa, 0xff, 0xf3, 0xff, 0xfb, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf2, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xf0, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xfd, 0xff, 0xf2, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x09, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf6, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfa, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xf6, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfe, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x01, 0x00, 0xf3, 0xff, 0x01, 0x00, 0xf3, 0xff, 0x02, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf4, 0xff, 0x04, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf8, 0xff, 0x0a, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xf9, 0xff, 0x0c, 0x00, 0xfa, 0xff, 0x0c, 0x00, 0xfb, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0xff, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfb, 0xff, 0x0a, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x05, 0x00, 0xf4, 0xff, 0x04, 0x00, 0xf3, 0xff, 0x03, 0x00, 0xf2, 0xff, 0x02, 0x00, 0xf2, 0xff, 0x01, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf2, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf3, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xfe, 0xff, 0xf2, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf3, 0xff, 0xfc, 0xff, 0xf4, 0xff, 0xfc, 0xff, 0xf5, 0xff, 0xfc, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x05, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf5, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xf8, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x0b, 0x00, 0xf9, 0xff, 0x0c, 0x00, 0xf8, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x0d, 0x00, 0xf9, 0xff, 0x0e, 0x00, 0xfa, 0xff, 0x0e, 0x00, 0xfb, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x0e, 0x00, 0xfc, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x09, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf4, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfd, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x09, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xff, 0xff, 0x0d, 0x00, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf4, 0xff, 0x00, 0x00, 0xf3, 0xff, 0x00, 0x00, 0xf3, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x03, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfc, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfd, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0d, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0c, 0x00, 0xfd, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf9, 0xff, 0xf8, 0xff, 0xfa, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x06, 0x00, 0x09, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf5, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xf9, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x01, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf5, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf6, 0xff, 0x03, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf6, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf5, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfc, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf8, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x07, 0x00, 0xf9, 0xff, 0x08, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xf9, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x09, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x08, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x09, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x09, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x09, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfc, 0xff, 0x08, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x07, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x03, 0x00, 0x09, 0x00, 0x03, 0x00, 0x09, 0x00, 0x03, 0x00, 0x09, 0x00, 0x04, 0x00, 0x09, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xfa, 0xff, 0x06, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf9, 0xff, 0x05, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x01, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0xff, 0x00, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xf9, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfc, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfd, 0xff, 0xf9, 0xff, 0xfe, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x03, 0x00, 0x06, 0x00, 0x03, 0x00, 0x05, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfc, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x05, 0x00, 0xfb, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xfa, 0xff, 0x04, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x03, 0x00, 0xf9, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfe, 0xff, 0xf8, 0xff, 0xfd, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfc, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf8, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xf9, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x04, 0x00, 0x07, 0x00, 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x04, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x03, 0x00, 0x09, 0x00, 0x03, 0x00, 0x09, 0x00, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x09, 0x00, 0xff, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x00, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfc, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x09, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x0a, 0x00, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x02, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xfb, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x02, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfa, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfb, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0xff, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x07, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x06, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x05, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x04, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x03, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x03, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x02, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfd, 0xff, 0x01, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x72, 0x65, 0x67, 0x6e, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x6d, 0xff, 0xce, 0xe1, 0x45, 0x11, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x50, 0x6f, 0x70, 0x5f, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x65, 0x64, 0x5f, 0x32, 0x00, 0x00, 0x58, 0x99, 0xd6, 0x39, 0x01, 0x00, 0x00, 0x00, 0x90, 0x6e, 0xc5, 0xbc, 0xa6, 0x7f, 0x00, 0x00, 0x75, 0x6d, 0x69, 0x64, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x6d, 0xff, 0xce, 0xe1, 0x45, 0x11, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - NSUInteger length = sizeof(bytes) / sizeof(Byte); - return [NSData dataWithBytesNoCopy:(void *)bytes length:length freeWhenDone:NO]; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h deleted file mode 100644 index 13890a6c4..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKLikeControl.h" - -@interface FBSDKLikeControl () - -- (NSDictionary *)analyticsParameters; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h deleted file mode 100644 index 9d7748f99..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -#import - -@protocol FBSDKLikeDialogDelegate; - -@interface FBSDKLikeDialog : NSObject - -+ (instancetype)likeWithObjectID:(NSString *)objectID - objectType:(FBSDKLikeObjectType)objectType - delegate:(id)delegate; - -@property (nonatomic, weak) id delegate; -@property (nonatomic, copy) NSString *objectID; -@property (nonatomic, assign) FBSDKLikeObjectType objectType; -@property (nonatomic, assign) BOOL shouldFailOnDataError; -@property (nonatomic, weak) UIViewController *fromViewController; - -- (BOOL)canLike; -- (BOOL)like; -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; - -@end - -@protocol FBSDKLikeDialogDelegate - -- (void)likeDialog:(FBSDKLikeDialog *)likeDialog didCompleteWithResults:(NSDictionary *)results; -- (void)likeDialog:(FBSDKLikeDialog *)likeDialog didFailWithError:(NSError *)error; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.m deleted file mode 100644 index ea2abf6ee..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.m +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKLikeDialog.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareConstants.h" -#import "FBSDKShareDefines.h" -#import "FBSDKShareError.h" - -@implementation FBSDKLikeDialog - -#define FBSDK_LIKE_METHOD_MIN_VERSION @"20140410" -#define FBSDK_LIKE_METHOD_NAME @"like" -#define FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_LIKE @"like" -#define FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_UNLIKE @"unlike" - -#pragma mark - Class Methods - -+ (void)initialize -{ - if ([FBSDKLikeDialog class] == self) { - [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL]; - } -} - -+ (instancetype)likeWithObjectID:(NSString *)objectID - objectType:(FBSDKLikeObjectType)objectType - delegate:(id)delegate -{ - FBSDKLikeDialog *dialog = [[self alloc] init]; - dialog.objectID = objectID; - dialog.objectType = objectType; - dialog.delegate = delegate; - [dialog like]; - return dialog; -} - -#pragma mark - Public Methods - -- (BOOL)canLike -{ - return YES; -} - -- (BOOL)like -{ - NSError *error; - if (![self canLike]) { - error = [FBSDKShareError errorWithCode:FBSDKShareDialogNotAvailableErrorCode - message:@"Like dialog is not available."]; - [_delegate likeDialog:self didFailWithError:error]; - return NO; - } - if (![self validateWithError:&error]) { - [_delegate likeDialog:self didFailWithError:error]; - return NO; - } - - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - [FBSDKInternalUtility dictionary:parameters setObject:self.objectID forKey:@"object_id"]; - [FBSDKInternalUtility dictionary:parameters - setObject:NSStringFromFBSDKLikeObjectType(self.objectType) - forKey:@"object_type"]; - FBSDKBridgeAPIRequest * webRequest = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeWeb - scheme:FBSDK_SHARE_JS_DIALOG_SCHEME - methodName:FBSDK_LIKE_METHOD_NAME - methodVersion:nil - parameters:parameters - userInfo:nil]; - FBSDKBridgeAPICallbackBlock completionBlock = ^(FBSDKBridgeAPIResponse *response) { - [self _handleCompletionWithDialogResults:response.responseParameters error:response.error]; - }; - - FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - BOOL useSafariViewController = [configuration useSafariViewControllerForDialogName:FBSDKDialogConfigurationNameLike]; - if ([self _canLikeNative]) { - FBSDKBridgeAPIRequest *nativeRequest = [FBSDKBridgeAPIRequest bridgeAPIRequestWithProtocolType:FBSDKBridgeAPIProtocolTypeNative - scheme:FBSDK_CANOPENURL_FACEBOOK - methodName:FBSDK_LIKE_METHOD_NAME - methodVersion:FBSDK_LIKE_METHOD_MIN_VERSION - parameters:parameters - userInfo:nil]; - void (^networkCompletionBlock)(FBSDKBridgeAPIResponse *) = ^(FBSDKBridgeAPIResponse *response) { - if (response.error.code == FBSDKAppVersionUnsupportedErrorCode) { - [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:webRequest - useSafariViewController:useSafariViewController - fromViewController:self.fromViewController - completionBlock:completionBlock]; - } else { - completionBlock(response); - } - }; - [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:nativeRequest - useSafariViewController:useSafariViewController - fromViewController:self.fromViewController - completionBlock:networkCompletionBlock]; - } else { - [[FBSDKApplicationDelegate sharedInstance] openBridgeAPIRequest:webRequest - useSafariViewController:useSafariViewController - fromViewController:self.fromViewController - completionBlock:completionBlock]; - } - - return YES; -} - -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef -{ - if (![self.objectID length]) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"objectID" message:nil]; - } - return NO; - } - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; -} - -#pragma mark - Helper Methods - -- (BOOL)_canLikeNative -{ - FBSDKServerConfiguration *configuration = [FBSDKServerConfigurationManager cachedServerConfiguration]; - BOOL useNativeDialog = [configuration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLike]; - return (useNativeDialog && [FBSDKInternalUtility isFacebookAppInstalled]); -} - -- (void)_handleCompletionWithDialogResults:(NSDictionary *)results error:(NSError *)error -{ - if (!_delegate) { - return; - } - NSString *completionGesture = results[FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY]; - if (completionGesture && !error) { - [_delegate likeDialog:self didCompleteWithResults:[results copy]]; - } else { - [_delegate likeDialog:self didFailWithError:error]; - } -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h deleted file mode 100644 index b3b6965ff..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKCoreKit+Internal.h" - -@interface FBSDKMessengerIcon : FBSDKIcon - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.m deleted file mode 100644 index 2f5a22f27..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.m +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKMessengerIcon.h" - -@implementation FBSDKMessengerIcon - -- (CGPathRef)pathWithSize:(CGSize)size -{ - CGAffineTransform transformValue = CGAffineTransformMakeScale(size.width / 61.0, size.height / 61.0); - const CGAffineTransform *transform = &transformValue; - CGMutablePathRef path = CGPathCreateMutable(); - CGPathMoveToPoint(path, transform, 30.001, 0.962); - CGPathAddCurveToPoint(path, transform, 13.439, 0.962, 0.014, 13.462, 0.014, 28.882); - CGPathAddCurveToPoint(path, transform, 0.014, 37.165, 3.892, 44.516, 10.046, 49.549); - CGPathAddLineToPoint(path, transform, 10.046, 61.176); - CGPathAddLineToPoint(path, transform, 19.351, 54.722); - CGPathAddCurveToPoint(path, transform, 22.662, 55.870, 26.250, 56.502, 30.002, 56.502); - CGPathAddCurveToPoint(path, transform, 46.565, 56.502, 59.990, 44.301, 59.990, 28.882); - CGPathAddCurveToPoint(path, transform, 59.989, 13.462, 46.564, 0.962, 30.001, 0.962); - CGPathCloseSubpath(path); - CGPathMoveToPoint(path, transform, 33.159, 37.473); - CGPathAddLineToPoint(path, transform, 25.403, 29.484); - CGPathAddLineToPoint(path, transform, 10.467, 37.674); - CGPathAddLineToPoint(path, transform, 26.843, 20.445); - CGPathAddLineToPoint(path, transform, 34.599, 28.433); - CGPathAddLineToPoint(path, transform, 49.535, 20.244); - CGPathAddLineToPoint(path, transform, 33.159, 37.473); - CGPathCloseSubpath(path); - CGPathRef result = CGPathCreateCopy(path); - CGPathRelease(path); - return CFAutorelease(result); -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h deleted file mode 100644 index d3d8565e4..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#define FBSDK_SHARE_JS_DIALOG_SCHEME @"web" -#define FBSDK_SHARE_CAMERA_METHOD_NAME @"camera" -#define FBSDK_SHARE_METHOD_NAME @"share" -#define FBSDK_SHARE_OPEN_GRAPH_METHOD_NAME @"ogshare" -#define FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY @"completionGesture" -#define FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_CANCEL @"cancel" -#define FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST @"post" -#define FBSDK_SHARE_RESULT_DID_COMPLETE_KEY @"didComplete" -#define FBSDK_SHARE_RESULT_PHOTO_IDS_KEY @"photo_ids" -#define FBSDK_SHARE_RESULT_POST_ID_KEY @"postId" -#define FBSDK_SHARE_VIDEO_END_OFFSET @"end_offset" -#define FBSDK_SHARE_VIDEO_FILE_CHUNK @"video_file_chunk" -#define FBSDK_SHARE_VIDEO_ID @"video_id" -#define FBSDK_SHARE_VIDEO_SIZE @"file_size" -#define FBSDK_SHARE_VIDEO_START_OFFSET @"start_offset" -#define FBSDK_SHARE_VIDEO_UPLOAD_PHASE @"upload_phase" -#define FBSDK_SHARE_VIDEO_UPLOAD_PHASE_FINISH @"finish" -#define FBSDK_SHARE_VIDEO_UPLOAD_PHASE_START @"start" -#define FBSDK_SHARE_VIDEO_UPLOAD_PHASE_TRANSFER @"transfer" -#define FBSDK_SHARE_VIDEO_UPLOAD_SESSION_ID @"upload_session_id" -#define FBSDK_SHARE_VIDEO_UPLOAD_SUCCESS @"success" -#define FBSDK_SHARE_WEB_PARAM_POST_ID_KEY @"post_id" -#define FBSDK_SHARE_WEB_SCHEME @"https" diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h deleted file mode 100644 index ad835229b..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKCoreKit+Internal.h" - -@interface FBSDKShareError : FBSDKError - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.m deleted file mode 100644 index 46896cc05..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.m +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareError.h" - -#import "FBSDKShareConstants.h" - -@implementation FBSDKShareError - -+ (NSString *)errorDomain -{ - return FBSDKShareErrorDomain; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h deleted file mode 100644 index a17f2fd97..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKShareDefines.h" -#import "FBSDKShareError.h" -#import "FBSDKShareOpenGraphValueContainer+Internal.h" -#import "FBSDKShareUtility.h" -#import "FBSDKVideoUploader.h" diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h deleted file mode 100644 index c9269dea8..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareLinkContent.h" - -@interface FBSDKShareLinkContent () - -// Deprecated parameters for Feed Dialog - for usage with Unity only. -@property (nonatomic, copy) NSDictionary *feedParameters; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareMessengerContentUtility.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareMessengerContentUtility.h deleted file mode 100644 index 6ada37674..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareMessengerContentUtility.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKShareMessengerGenericTemplateContent; -@class FBSDKShareMessengerMediaTemplateContent; -@class FBSDKShareMessengerOpenGraphMusicTemplateContent; - -@interface FBSDKShareMessengerContentUtility : NSObject - -+ (void)addToParameters:(NSMutableDictionary *)parameters -forShareMessengerGenericTemplateContent:(FBSDKShareMessengerGenericTemplateContent *)genericTemplateContent; - -+ (void)addToParameters:(NSMutableDictionary *)parameters -forShareMessengerMediaTemplateContent:(FBSDKShareMessengerMediaTemplateContent *)mediaTemplateContent; - -+ (void)addToParameters:(NSMutableDictionary *)parameters -forShareMessengerOpenGraphMusicTemplateContent:(FBSDKShareMessengerOpenGraphMusicTemplateContent *)openGraphMusicTemplate; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareMessengerContentUtility.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareMessengerContentUtility.m deleted file mode 100644 index 9337e5872..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareMessengerContentUtility.m +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareMessengerContentUtility.h" - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareMessengerGenericTemplateContent.h" -#import "FBSDKShareMessengerGenericTemplateElement.h" -#import "FBSDKShareMessengerMediaTemplateContent.h" -#import "FBSDKShareMessengerOpenGraphMusicTemplateContent.h" -#import "FBSDKShareMessengerURLActionButton.h" - -static NSString *const kTemplateTypeKey = @"template_type"; -static NSString *const kTemplateKey = @"template"; -static NSString *const kPayloadKey = @"payload"; -static NSString *const kTypeKey = @"type"; -static NSString *const kAttachmentKey = @"attachment"; -static NSString *const kElementsKey = @"elements"; -static NSString *const kButtonsKey = @"buttons"; - -@implementation FBSDKShareMessengerContentUtility - -static BOOL _URLHasFacebookDomain(NSURL *URL) -{ - NSString *urlHost = [URL.host lowercaseString]; - NSArray *pathComponents = [URL pathComponents]; - - /** - Check the following three different cases... - 1. Check if host is facebook.com, such as in 'https://facebok.com/test' - 2. Check if host is someprefix.facebook.com, such as in 'https://www.facebook.com/test' - 3. Check if host is null, but the first path component is facebook.com - */ - return [urlHost isEqualToString:@"facebook.com"] || - [urlHost hasSuffix:@".facebook.com"] || - ([[[pathComponents firstObject] lowercaseString] hasSuffix:@"facebook.com"]); -} - -static void _AddToContentPreviewDictionaryForURLButton(NSMutableDictionary *dictionary, - FBSDKShareMessengerURLActionButton *urlButton) -{ - NSString *urlString = urlButton.url.absoluteString; - NSString *urlStringPath = urlButton.url.path; - NSRange rangeOfPath = [urlString rangeOfString:urlStringPath]; - NSString *shortURLString = urlString; - if (rangeOfPath.location != NSNotFound) { - shortURLString = [urlString substringWithRange:NSMakeRange(0, rangeOfPath.location)]; - } - - NSString *previewString = urlButton.title.length > 0 ? [NSString stringWithFormat:@"%@ - %@", urlButton.title, shortURLString] : shortURLString; - [FBSDKInternalUtility dictionary:dictionary setObject:previewString forKey:@"target_display"]; - [FBSDKInternalUtility dictionary:dictionary setObject:urlButton.url.absoluteString forKey:@"item_url"]; -} - -static void _AddToContentPreviewDictionaryForButton(NSMutableDictionary *dictionary, - id button) -{ - if ([button isKindOfClass:[FBSDKShareMessengerURLActionButton class]]) { - _AddToContentPreviewDictionaryForURLButton(dictionary, button); - } -} - -static NSString *_WebviewHeightRatioString(FBSDKShareMessengerURLActionButtonWebviewHeightRatio heightRatio) { - switch (heightRatio) { - case FBSDKShareMessengerURLActionButtonWebviewHeightRatioFull: - return @"full"; - case FBSDKShareMessengerURLActionButtonWebviewHeightRatioTall: - return @"tall"; - case FBSDKShareMessengerURLActionButtonWebviewHeightRatioCompact: - return @"compact"; - } -} - -static NSString *_MediaTypeString(FBSDKShareMessengerMediaTemplateMediaType mediaType) -{ - switch (mediaType) { - case FBSDKShareMessengerMediaTemplateMediaTypeImage: - return @"image"; - case FBSDKShareMessengerMediaTemplateMediaTypeVideo: - return @"video"; - } -} - -static NSString *_WebviewShareButtonString(BOOL shouldHideWebviewShareButton) { - return shouldHideWebviewShareButton ? @"hide" : nil; -} - -static NSString *_ImageAspectRatioString(FBSDKShareMessengerGenericTemplateImageAspectRatio imageAspectRatio) -{ - switch (imageAspectRatio) { - case FBSDKShareMessengerGenericTemplateImageAspectRatioSquare: - return @"square"; - case FBSDKShareMessengerGenericTemplateImageAspectRatioHorizontal: - return @"horizontal"; - } -} - -static NSDictionary *_SerializableButtonFromURLButton(FBSDKShareMessengerURLActionButton *button, BOOL isDefaultAction) -{ - NSMutableDictionary *serializableButton = [NSMutableDictionary dictionary]; - - // Strip out title for default action - if (!isDefaultAction) { - [FBSDKInternalUtility dictionary:serializableButton setObject:button.title forKey:@"title"]; - } - - [FBSDKInternalUtility dictionary:serializableButton setObject:@"web_url" forKey:@"type"]; - [FBSDKInternalUtility dictionary:serializableButton setObject:button.url.absoluteString forKey:@"url"]; - [FBSDKInternalUtility dictionary:serializableButton setObject:_WebviewHeightRatioString(button.webviewHeightRatio) forKey:@"webview_height_ratio"]; - [FBSDKInternalUtility dictionary:serializableButton setObject:@(button.isMessengerExtensionURL) forKey:@"messenger_extensions"]; - [FBSDKInternalUtility dictionary:serializableButton setObject:button.fallbackURL.absoluteString forKey:@"fallback_url"]; - [FBSDKInternalUtility dictionary:serializableButton setObject:_WebviewShareButtonString(button.shouldHideWebviewShareButton) forKey:@"webview_share_button"]; - return serializableButton; -} - -static NSArray *_SerializableButtonsFromButton(id button) -{ - // Return NSArray even though there is just one button to match proper json structure - NSMutableArray *serializableButtons = [NSMutableArray array]; - if ([button isKindOfClass:[FBSDKShareMessengerURLActionButton class]]) { - [FBSDKInternalUtility array:serializableButtons addObject:_SerializableButtonFromURLButton(button, NO)]; - } - - return serializableButtons; -} - -static NSArray *_SerializableGenericTemplateElementsFromElements(NSArray *elements) -{ - NSMutableArray *serializableElements = [NSMutableArray array]; - for (FBSDKShareMessengerGenericTemplateElement *element in elements) { - NSMutableDictionary *elementDictionary = [NSMutableDictionary dictionary]; - [FBSDKInternalUtility dictionary:elementDictionary setObject:element.title forKey:@"title"]; - [FBSDKInternalUtility dictionary:elementDictionary setObject:element.subtitle forKey:@"subtitle"]; - [FBSDKInternalUtility dictionary:elementDictionary setObject:element.imageURL.absoluteString forKey:@"image_url"]; - [FBSDKInternalUtility dictionary:elementDictionary setObject:_SerializableButtonsFromButton(element.button) forKey:kButtonsKey]; - if ([element.defaultAction isKindOfClass:[FBSDKShareMessengerURLActionButton class]]) { - [FBSDKInternalUtility dictionary:elementDictionary setObject:_SerializableButtonFromURLButton(element.defaultAction, YES) forKey:@"default_action"]; - } - - [serializableElements addObject:elementDictionary]; - } - - return serializableElements; -} - -static NSArray *_SerializableMediaTemplateContentFromContent(FBSDKShareMessengerMediaTemplateContent *mediaTemplateContent) -{ - NSMutableArray *serializableMediaTemplateContent = [NSMutableArray array]; - - NSMutableDictionary *mediaTemplateContentDictionary = [NSMutableDictionary dictionary]; - [FBSDKInternalUtility dictionary:mediaTemplateContentDictionary setObject:_MediaTypeString(mediaTemplateContent.mediaType) forKey:@"media_type"]; - [FBSDKInternalUtility dictionary:mediaTemplateContentDictionary setObject:mediaTemplateContent.mediaURL.absoluteString forKey:@"url"]; - [FBSDKInternalUtility dictionary:mediaTemplateContentDictionary setObject:mediaTemplateContent.attachmentID forKey:@"attachment_id"]; - [FBSDKInternalUtility dictionary:mediaTemplateContentDictionary setObject:_SerializableButtonsFromButton(mediaTemplateContent.button) forKey:kButtonsKey]; - [serializableMediaTemplateContent addObject:mediaTemplateContentDictionary]; - - return serializableMediaTemplateContent; -} - -static NSArray *_SerializableOpenGraphMusicTemplateContentFromContent(FBSDKShareMessengerOpenGraphMusicTemplateContent *openGraphMusicTemplateContent) -{ - NSMutableArray *serializableOpenGraphMusicTemplateContent = [NSMutableArray array]; - - NSMutableDictionary *openGraphMusicTemplateContentDictionary = [NSMutableDictionary dictionary]; - [FBSDKInternalUtility dictionary:openGraphMusicTemplateContentDictionary setObject:openGraphMusicTemplateContent.url.absoluteString forKey:@"url"]; - [FBSDKInternalUtility dictionary:openGraphMusicTemplateContentDictionary setObject:_SerializableButtonsFromButton(openGraphMusicTemplateContent.button) forKey:kButtonsKey]; - [serializableOpenGraphMusicTemplateContent addObject:openGraphMusicTemplateContentDictionary]; - - return serializableOpenGraphMusicTemplateContent; -} - -static NSString *_MediaTemplateURLSerializationKey(NSURL *mediaURL) -{ - if (_URLHasFacebookDomain(mediaURL)) { - return @"facebook_media_url"; - } else { - return @"image_url"; - } -} - -+ (void)_addToParameters:(NSMutableDictionary *)parameters - contentForShare:(NSMutableDictionary *)contentForShare - contentForPreview:(NSMutableDictionary *)contentForPreview -{ - NSError *error = nil; - NSData *contentForShareData = [NSJSONSerialization dataWithJSONObject:contentForShare options:kNilOptions error:&error]; - if (!error && contentForShareData) { - NSString *contentForShareDataString = [[NSString alloc] initWithData:contentForShareData encoding:NSUTF8StringEncoding]; - - NSMutableDictionary *messengerShareContent = [NSMutableDictionary dictionary]; - [FBSDKInternalUtility dictionary:messengerShareContent setObject:contentForShareDataString forKey:@"content_for_share"]; - [FBSDKInternalUtility dictionary:messengerShareContent setObject:contentForPreview forKey:@"content_for_preview"]; - [FBSDKInternalUtility dictionary:parameters setObject:messengerShareContent forKey:@"messenger_share_content"]; - } -} - -+ (void)addToParameters:(NSMutableDictionary *)parameters -forShareMessengerGenericTemplateContent:(FBSDKShareMessengerGenericTemplateContent *)genericTemplateContent -{ - NSMutableDictionary *payload = [NSMutableDictionary dictionary]; - [payload setObject:@"generic" forKey:kTemplateTypeKey]; - [payload setObject:@(genericTemplateContent.isSharable) forKey:@"sharable"]; - [payload setObject:_ImageAspectRatioString(genericTemplateContent.imageAspectRatio) forKey:@"image_aspect_ratio"]; - [payload setObject:_SerializableGenericTemplateElementsFromElements(@[genericTemplateContent.element]) forKey:kElementsKey]; - - NSMutableDictionary *attachment = [NSMutableDictionary dictionary]; - [attachment setObject:kTemplateKey forKey:kTypeKey]; - [attachment setObject:payload forKey:kPayloadKey]; - - NSMutableDictionary *contentForShare = [NSMutableDictionary dictionary]; - [contentForShare setObject:attachment forKey:kAttachmentKey]; - - FBSDKShareMessengerGenericTemplateElement *firstElement = genericTemplateContent.element; - NSMutableDictionary *contentForPreview = [NSMutableDictionary dictionary]; - [FBSDKInternalUtility dictionary:contentForPreview setObject:@"DEFAULT" forKey:@"preview_type"]; - [FBSDKInternalUtility dictionary:contentForPreview setObject:firstElement.title forKey:@"title"]; - [FBSDKInternalUtility dictionary:contentForPreview setObject:firstElement.subtitle forKey:@"subtitle"]; - [FBSDKInternalUtility dictionary:contentForPreview setObject:firstElement.imageURL.absoluteString forKey:@"image_url"]; - if (firstElement.button) { - _AddToContentPreviewDictionaryForButton(contentForPreview, firstElement.button); - } else { - _AddToContentPreviewDictionaryForButton(contentForPreview, firstElement.defaultAction); - } - - [self _addToParameters:parameters contentForShare:contentForShare contentForPreview:contentForPreview]; -} - -+ (void)addToParameters:(NSMutableDictionary *)parameters -forShareMessengerMediaTemplateContent:(FBSDKShareMessengerMediaTemplateContent *)mediaTemplateContent -{ - NSMutableDictionary *payload = [NSMutableDictionary dictionary]; - [payload setObject:@"media" forKey:kTemplateTypeKey]; - [payload setObject:_SerializableMediaTemplateContentFromContent(mediaTemplateContent) forKey:kElementsKey]; - - NSMutableDictionary *attachment = [NSMutableDictionary dictionary]; - [attachment setObject:kTemplateKey forKey:kTypeKey]; - [attachment setObject:payload forKey:kPayloadKey]; - - NSMutableDictionary *contentForShare = [NSMutableDictionary dictionary]; - [contentForShare setObject:attachment forKey:kAttachmentKey]; - - NSMutableDictionary *contentForPreview = [NSMutableDictionary dictionary]; - [FBSDKInternalUtility dictionary:contentForPreview setObject:@"DEFAULT" forKey:@"preview_type"]; - [FBSDKInternalUtility dictionary:contentForPreview setObject:mediaTemplateContent.attachmentID forKey:@"attachment_id"]; - [FBSDKInternalUtility dictionary:contentForPreview - setObject:mediaTemplateContent.mediaURL.absoluteString - forKey:_MediaTemplateURLSerializationKey(mediaTemplateContent.mediaURL)]; - [FBSDKInternalUtility dictionary:contentForPreview setObject:_MediaTypeString(mediaTemplateContent.mediaType) forKey:@"media_type"]; - _AddToContentPreviewDictionaryForButton(contentForPreview, mediaTemplateContent.button); - - [self _addToParameters:parameters contentForShare:contentForShare contentForPreview:contentForPreview]; -} - -+ (void)addToParameters:(NSMutableDictionary *)parameters -forShareMessengerOpenGraphMusicTemplateContent:(FBSDKShareMessengerOpenGraphMusicTemplateContent *)openGraphMusicTemplate -{ - NSMutableDictionary *payload = [NSMutableDictionary dictionary]; - [payload setObject:@"open_graph" forKey:kTemplateTypeKey]; - [payload setObject:_SerializableOpenGraphMusicTemplateContentFromContent(openGraphMusicTemplate) forKey:kElementsKey]; - - NSMutableDictionary *attachment = [NSMutableDictionary dictionary]; - [attachment setObject:kTemplateKey forKey:kTypeKey]; - [attachment setObject:payload forKey:kPayloadKey]; - - NSMutableDictionary *contentForShare = [NSMutableDictionary dictionary]; - [contentForShare setObject:attachment forKey:kAttachmentKey]; - - NSMutableDictionary *contentForPreview = [NSMutableDictionary dictionary]; - [FBSDKInternalUtility dictionary:contentForPreview setObject:@"OPEN_GRAPH" forKey:@"preview_type"]; - [FBSDKInternalUtility dictionary:contentForPreview setObject:openGraphMusicTemplate.url.absoluteString forKey:@"open_graph_url"]; - _AddToContentPreviewDictionaryForButton(contentForPreview, openGraphMusicTemplate.button); - - [self _addToParameters:parameters contentForShare:contentForShare contentForPreview:contentForPreview]; -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h deleted file mode 100644 index 5d9382ec3..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@interface FBSDKShareOpenGraphValueContainer () - -- (NSDictionary *)allProperties; -- (BOOL)isEqualToShareOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)object; -- (BOOL)requireKeyNamespace; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h deleted file mode 100644 index 66cc8cd20..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import -#import -#import -#import - -#if !TARGET_OS_TV -#import -#import -#import -#endif - -@interface FBSDKShareUtility : NSObject - -+ (void)assertCollection:(id)collection ofClass:itemClass name:(NSString *)name; -+ (void)assertCollection:(id)collection ofClassStrings:(NSArray *)classStrings name:(NSString *)name; -+ (void)assertOpenGraphKey:(id)key requireNamespace:(BOOL)requireNamespace; -+ (void)assertOpenGraphValue:(id)value; -+ (void)assertOpenGraphValues:(NSDictionary *)dictionary requireKeyNamespace:(BOOL)requireKeyNamespace; -+ (id)convertOpenGraphValue:(id)value; -+ (BOOL)buildWebShareContent:(id)content - methodName:(NSString *__autoreleasing *)methodNameRef - parameters:(NSDictionary *__autoreleasing *)parametersRef - error:(NSError *__autoreleasing *)errorRef; -+ (void)buildAsyncWebPhotoContent:(FBSDKSharePhotoContent *)content - completionHandler:(void(^)(BOOL, NSString *, NSDictionary *))completion; -+ (NSDictionary *)convertOpenGraphValues:(NSDictionary *)dictionary; -+ (NSDictionary *)feedShareDictionaryForContent:(id)content; -+ (NSString *)hashtagStringFromHashtag:(FBSDKHashtag *)hashtag; -+ (UIImage *)imageWithCircleColor:(UIColor *)color - canvasSize:(CGSize)canvasSize - circleSize:(CGSize)circleSize; -+ (NSDictionary *)parametersForShareContent:(id)shareContent - shouldFailOnDataError:(BOOL)shouldFailOnDataError; -+ (void)testShareContent:(id)shareContent - containsMedia:(BOOL *)containsMediaRef - containsPhotos:(BOOL *)containsPhotosRef - containsVideos:(BOOL *)containsVideosRef; -+ (BOOL)shareMediaContentContainsPhotosAndVideos:(FBSDKShareMediaContent *)shareMediaContent; -+ (BOOL)validateAssetLibraryURLWithShareVideoContent:(FBSDKShareVideoContent *)videoContent name:(NSString *)name error:(NSError *__autoreleasing *)errorRef; -+ (BOOL)validateAssetLibraryURLsWithShareMediaContent:(FBSDKShareMediaContent *)mediaContent name:(NSString *)name error:(NSError *__autoreleasing *)errorRef; -+ (BOOL)validateShareContent:(id)shareContent error:(NSError *__autoreleasing *)errorRef; -+ (BOOL)validateShareLinkContent:(FBSDKShareLinkContent *)linkContent error:(NSError *__autoreleasing *)errorRef; -+ (BOOL)validateShareMediaContent:(FBSDKShareMediaContent *)mediaContent error:(NSError *__autoreleasing *)errorRef; -+ (BOOL)validateShareOpenGraphContent:(FBSDKShareOpenGraphContent *)openGraphContent - error:(NSError *__autoreleasing *)errorRef; -+ (BOOL)validateSharePhotoContent:(FBSDKSharePhotoContent *)photoContent error:(NSError *__autoreleasing *)errorRef; -+ (NSString *)getOpenGraphNameAndNamespaceFromFullName:(NSString *)fullName namespace:(NSString **)namespace; - -#if !TARGET_OS_TV -+ (BOOL)validateAppInviteContent:(FBSDKAppInviteContent *)appInviteContent error:(NSError *__autoreleasing *)errorRef; -+ (BOOL)validateShareCameraEffectContent:(FBSDKShareCameraEffectContent *)ShareCameraEffectContent - error:(NSError *__autoreleasing *)errorRef; -+ (BOOL)validateGameRequestContent:(FBSDKGameRequestContent *)gameRequestContent error:(NSError *__autoreleasing *)errorRef; -#endif -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.m deleted file mode 100644 index 51f1065e3..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.m +++ /dev/null @@ -1,1208 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKShareUtility.h" - -#import - -#import "FBSDKCoreKit+Internal.h" -#import "FBSDKShareConstants.h" -#import "FBSDKShareError.h" -#import "FBSDKShareLinkContent+Internal.h" -#import "FBSDKShareMediaContent.h" -#import "FBSDKShareOpenGraphContent.h" -#import "FBSDKShareOpenGraphObject.h" -#import "FBSDKSharePhoto.h" -#import "FBSDKSharePhotoContent.h" -#import "FBSDKShareVideo.h" -#import "FBSDKShareVideoContent.h" -#import "FBSDKSharingContent.h" - -#if !TARGET_OS_TV -#import "FBSDKCameraEffectArguments+Internal.h" -#import "FBSDKCameraEffectTextures+Internal.h" -#import "FBSDKShareMessengerContentUtility.h" -#import "FBSDKShareMessengerGenericTemplateContent.h" -#import "FBSDKShareMessengerGenericTemplateElement.h" -#import "FBSDKShareMessengerMediaTemplateContent.h" -#import "FBSDKShareMessengerOpenGraphMusicTemplateContent.h" -#import "FBSDKShareMessengerURLActionButton.h" -#endif - -@implementation FBSDKShareUtility - -#pragma mark - Class Methods - -+ (void)assertCollection:(id)collection ofClassStrings:(NSArray *)classStrings name:(NSString *)name -{ - for (id item in collection) { - BOOL validClass = NO; - for (NSString *classString in classStrings) { - if ([item isKindOfClass:NSClassFromString(classString)]) { - validClass = YES; - break; - } - } - if (!validClass) { - NSString *reason = [[NSString alloc] initWithFormat: - @"Invalid value found in %@: %@ - %@", - name, - item, - collection]; - @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; - } - } -} - -+ (void)assertCollection:(id)collection ofClass:itemClass name:(NSString *)name -{ - for (id item in collection) { - if (![item isKindOfClass:itemClass]) { - NSString *reason = [[NSString alloc] initWithFormat: - @"Invalid value found in %@: %@ - %@", - name, - item, - collection]; - @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; - } - } -} - -+ (void)assertOpenGraphKey:(id)key requireNamespace:(BOOL)requireNamespace -{ - if (![key isKindOfClass:[NSString class]]) { - NSString *reason = [[NSString alloc] initWithFormat:@"Invalid key found in Open Graph dictionary: %@", key]; - @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; - } - if (!requireNamespace) { - return; - } - NSArray *components = [key componentsSeparatedByString:@":"]; - if ([components count] < 2) { - NSString *reason = [[NSString alloc] initWithFormat:@"Open Graph keys must be namespaced: %@", key]; - @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; - } - for (NSString *component in components) { - if (![component length]) { - NSString *reason = [[NSString alloc] initWithFormat:@"Invalid key found in Open Graph dictionary: %@", key]; - @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; - } - } -} - -+ (void)assertOpenGraphValue:(id)value -{ - if ([self _isOpenGraphValue:value]) { - return; - } - if ([value isKindOfClass:[NSDictionary class]]) { - [self assertOpenGraphValues:(NSDictionary *)value requireKeyNamespace:YES]; - return; - } - if ([value isKindOfClass:[NSArray class]]) { - for (id subValue in (NSArray *)value) { - [self assertOpenGraphValue:subValue]; - } - return; - } - NSString *reason = [[NSString alloc] initWithFormat:@"Invalid Open Graph value found: %@", value]; - @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:nil]; -} - -+ (void)assertOpenGraphValues:(NSDictionary *)dictionary requireKeyNamespace:(BOOL)requireKeyNamespace -{ - [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { - [self assertOpenGraphKey:key requireNamespace:requireKeyNamespace]; - [self assertOpenGraphValue:value]; - }]; -} - -+ (BOOL)buildWebShareContent:(id)content - methodName:(NSString *__autoreleasing *)methodNameRef - parameters:(NSDictionary *__autoreleasing *)parametersRef - error:(NSError *__autoreleasing *)errorRef -{ - NSString *methodName = nil; - NSDictionary *parameters = nil; - if ([content isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - methodName = @"share_open_graph"; - FBSDKShareOpenGraphContent *openGraphContent = (FBSDKShareOpenGraphContent *)content; - FBSDKShareOpenGraphAction *action = openGraphContent.action; - NSDictionary *properties = [self _convertOpenGraphValueContainer:action requireNamespace:NO]; - NSString *propertiesJSON = [FBSDKInternalUtility JSONStringForObject:properties - error:errorRef - invalidObjectHandler:NULL]; - parameters = @{ - @"action_type": action.actionType, - @"action_properties": propertiesJSON, - }; - } else if ([content isKindOfClass:[FBSDKShareLinkContent class]]) { - FBSDKShareLinkContent *linkContent = (FBSDKShareLinkContent *)content; - methodName = @"share"; - if (linkContent.contentURL != nil) { - parameters = @{ @"href": linkContent.contentURL.absoluteString }; - } - } - NSString *hashtagString = [self hashtagStringFromHashtag:content.hashtag]; - if (hashtagString != nil) { - NSMutableDictionary *mutableParameters = [parameters mutableCopy]; - [FBSDKInternalUtility dictionary:mutableParameters setObject:hashtagString forKey:@"hashtag"]; - parameters = [mutableParameters copy]; - } - if (methodNameRef != NULL) { - *methodNameRef = methodName; - } - if (parametersRef != NULL) { - *parametersRef = parameters; - } - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; -} - -+ (void)buildAsyncWebPhotoContent:(FBSDKSharePhotoContent *)content - completionHandler:(void(^)(BOOL, NSString *, NSDictionary *))completion -{ - void(^stageImageCompletion)(NSArray *) = ^(NSArray *stagedURIs) { - NSString *methodName = @"share"; - NSMutableDictionary *parameters = [[FBSDKShareUtility parametersForShareContent:content - shouldFailOnDataError:NO] mutableCopy]; - [parameters removeObjectForKey:@"photos"]; - - NSString *stagedURIJSONString = [FBSDKInternalUtility JSONStringForObject:stagedURIs - error:nil - invalidObjectHandler:NULL]; - [FBSDKInternalUtility dictionary:parameters - setObject:stagedURIJSONString - forKey:@"media"]; - - NSString *hashtagString = [self hashtagStringFromHashtag:content.hashtag]; - if (hashtagString != nil) { - [FBSDKInternalUtility dictionary:parameters - setObject:hashtagString - forKey:@"hashtag"]; - } - - if (completion != NULL) { - completion(YES, methodName, [parameters copy]); - } - }; - - [self _stageImagesForPhotoContent:(FBSDKSharePhotoContent *)content - withCompletionHandler:stageImageCompletion]; -} - -+ (id)convertOpenGraphValue:(id)value -{ - if ([self _isOpenGraphValue:value]) { - return value; - } else if ([value isKindOfClass:[NSDictionary class]]) { - NSDictionary *properties = (NSDictionary *)value; - if ([FBSDKTypeUtility stringValue:properties[@"type"]]) { - return [FBSDKShareOpenGraphObject objectWithProperties:properties]; - } else { - NSURL *imageURL = [FBSDKTypeUtility URLValue:properties[@"url"]]; - if (imageURL) { - FBSDKSharePhoto *sharePhoto = [FBSDKSharePhoto photoWithImageURL:imageURL - userGenerated:[FBSDKTypeUtility boolValue:properties[@"user_generated"]]]; - sharePhoto.caption = [FBSDKTypeUtility stringValue:properties[@"caption"]]; - return sharePhoto; - } else { - return nil; - } - } - } else if ([value isKindOfClass:[NSArray class]]) { - NSMutableArray *array = [[NSMutableArray alloc] init]; - for (id subValue in (NSArray *)value) { - [FBSDKInternalUtility array:array addObject:[self convertOpenGraphValue:subValue]]; - } - return [array copy]; - } else { - return nil; - } -} - -+ (NSDictionary *)convertOpenGraphValues:(NSDictionary *)dictionary -{ - NSMutableDictionary *convertedDictionary = [[NSMutableDictionary alloc] init]; - [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - [FBSDKInternalUtility dictionary:convertedDictionary setObject:[self convertOpenGraphValue:obj] forKey:key]; - }]; - return [convertedDictionary copy]; -} - -+ (NSDictionary *)feedShareDictionaryForContent:(id)content -{ - NSMutableDictionary *parameters = nil; -#pragma clang diagnostic pop -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - if ([content isKindOfClass:[FBSDKShareLinkContent class]]) { - FBSDKShareLinkContent *linkContent = (FBSDKShareLinkContent *)content; - parameters = [[NSMutableDictionary alloc] initWithDictionary:linkContent.feedParameters]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentDescription forKey:@"description"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentURL forKey:@"link"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.quote forKey:@"quote"]; - [FBSDKInternalUtility dictionary:parameters setObject:[self hashtagStringFromHashtag:linkContent.hashtag] forKey:@"hashtag"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentTitle forKey:@"name"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.imageURL forKey:@"picture"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.ref forKey:@"ref"]; - } -#pragma clang diagnostic pop - return [parameters copy]; -} - -+ (NSString *)hashtagStringFromHashtag:(FBSDKHashtag *)hashtag -{ - if (!hashtag) { - return nil; - } - if (hashtag.isValid) { - return hashtag.stringRepresentation; - } else { - [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors - formatString:@"Invalid hashtag: '%@'", hashtag.stringRepresentation]; - return nil; - } -} - -+ (UIImage *)imageWithCircleColor:(UIColor *)color - canvasSize:(CGSize)canvasSize - circleSize:(CGSize)circleSize -{ - CGRect circleFrame = CGRectMake((canvasSize.width - circleSize.width) / 2.0, - (canvasSize.height - circleSize.height) / 2.0, - circleSize.width, - circleSize.height); - UIGraphicsBeginImageContextWithOptions(canvasSize, NO, 0); - CGContextRef context = UIGraphicsGetCurrentContext(); - [color setFill]; - CGContextFillEllipseInRect(context, circleFrame); - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - return image; -} - -+ (NSDictionary *)parametersForShareContent:(id)shareContent - shouldFailOnDataError:(BOOL)shouldFailOnDataError -{ - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - [self _addToParameters:parameters forShareContent:shareContent]; - parameters[@"dataFailuresFatal"] = @(shouldFailOnDataError); - if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - [self _addToParameters:parameters forShareLinkContent:(FBSDKShareLinkContent *)shareContent]; - } else if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - [self _addToParameters:parameters forSharePhotoContent:(FBSDKSharePhotoContent *)shareContent]; - } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - [self _addToParameters:parameters forShareVideoContent:(FBSDKShareVideoContent *)shareContent]; - } else if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - [self _addToParameters:parameters forShareOpenGraphContent:(FBSDKShareOpenGraphContent *)shareContent]; -#if !TARGET_OS_TV - } else if ([shareContent isKindOfClass:[FBSDKShareMessengerGenericTemplateContent class]]) { - [FBSDKShareMessengerContentUtility addToParameters:parameters - forShareMessengerGenericTemplateContent:(FBSDKShareMessengerGenericTemplateContent *)shareContent]; - } else if ([shareContent isKindOfClass:[FBSDKShareMessengerMediaTemplateContent class]]) { - [FBSDKShareMessengerContentUtility addToParameters:parameters - forShareMessengerMediaTemplateContent:(FBSDKShareMessengerMediaTemplateContent *)shareContent]; - } else if ([shareContent isKindOfClass:[FBSDKShareMessengerOpenGraphMusicTemplateContent class]]) { - [FBSDKShareMessengerContentUtility addToParameters:parameters - forShareMessengerOpenGraphMusicTemplateContent:(FBSDKShareMessengerOpenGraphMusicTemplateContent *)shareContent]; - } else if ([shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - [self _addToParameters:parameters forShareCameraEffectContent:(FBSDKShareCameraEffectContent *)shareContent]; -#endif - } - return [parameters copy]; -} - -+ (void)testShareContent:(id)shareContent - containsMedia:(BOOL *)containsMediaRef - containsPhotos:(BOOL *)containsPhotosRef - containsVideos:(BOOL *)containsVideosRef -{ - BOOL containsMedia = NO; - BOOL containsPhotos = NO; - BOOL containsVideos = NO; - if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - containsMedia = NO; - containsPhotos = NO; - containsVideos = NO; - } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - containsMedia = YES; - containsVideos = YES; - containsPhotos = NO; - } else if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - [self _testObject:((FBSDKSharePhotoContent *)shareContent).photos - containsMedia:&containsMedia - containsPhotos:&containsPhotos - containsVideos:&containsVideos]; - } else if ([shareContent isKindOfClass:[FBSDKShareMediaContent class]]) { - [self _testObject:((FBSDKShareMediaContent *)shareContent).media - containsMedia:&containsMedia - containsPhotos:&containsPhotos - containsVideos:&containsVideos]; - } else if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - [self _testOpenGraphValueContainer:((FBSDKShareOpenGraphContent *)shareContent).action - containsMedia:&containsMedia - containsPhotos:&containsPhotos - containsVideos:&containsVideos]; - } - if (containsMediaRef != NULL) { - *containsMediaRef = containsMedia; - } - if (containsPhotosRef != NULL) { - *containsPhotosRef = containsPhotos; - } - if (containsVideosRef != NULL) { - *containsVideosRef = containsVideos; - } -} - -#if !TARGET_OS_TV -+ (BOOL)validateAppInviteContent:(FBSDKAppInviteContent *)appInviteContent error:(NSError *__autoreleasing *)errorRef -{ - return ([self _validateRequiredValue:appInviteContent name:@"content" error:errorRef] && - [self _validateRequiredValue:appInviteContent.appLinkURL name:@"appLinkURL" error:errorRef] && - [self _validateNetworkURL:appInviteContent.appLinkURL name:@"appLinkURL" error:errorRef] && - [self _validateNetworkURL:appInviteContent.appInvitePreviewImageURL name:@"appInvitePreviewImageURL" error:errorRef] && - [self validatePromoCodeWithError:appInviteContent error:errorRef]); -} - -+ (BOOL)validatePromoCodeWithError:(FBSDKAppInviteContent *)appInviteContent error:(NSError *__autoreleasing *)errorRef -{ - NSString *promoText = appInviteContent.promotionText; - NSString *promoCode = appInviteContent.promotionCode; - NSMutableCharacterSet *alphanumericWithSpaces = [NSMutableCharacterSet alphanumericCharacterSet]; - [alphanumericWithSpaces formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; - - if ([promoText length] > 0 || [promoCode length] > 0) { - - // Check for validity of promo text and promo code. - if (!([promoText length] > 0 && [promoText length] <= 80)) { - if (errorRef != NULL) { - *errorRef = [FBSDKError invalidArgumentErrorWithName:@"promotionText" value:promoText message:@"Invalid value for promotionText, promotionText has to be between 1 and 80 characters long."]; - } - return NO; - } - - if (!([promoCode length] <= 10)) { - if (errorRef != NULL) { - *errorRef = [FBSDKError invalidArgumentErrorWithName:@"promotionCode" value:promoCode message:@"Invalid value for promotionCode, promotionCode has to be between 0 and 10 characters long and is required when promoCode is set."]; - } - return NO; - } - - if ([promoText rangeOfCharacterFromSet:[alphanumericWithSpaces invertedSet]].location != NSNotFound) { - if(errorRef != NULL) { - *errorRef = [FBSDKError invalidArgumentErrorWithName:@"promotionText" value:promoText message:@"Invalid value for promotionText, promotionText can contain only alphanumeric characters and spaces."]; - } - return NO; - } - - if ([promoCode length] > 0 && [promoCode rangeOfCharacterFromSet:[alphanumericWithSpaces invertedSet]].location != NSNotFound) { - if (errorRef != NULL) { - *errorRef = [FBSDKError invalidArgumentErrorWithName:@"promotionCode" value:promoCode message:@"Invalid value for promotionCode, promotionCode can contain only alphanumeric characters and spaces."]; - } - return NO; - } - - } - - if (errorRef != NULL) { - *errorRef = nil; - } - - return YES; -} - -+ (BOOL)validateShareCameraEffectContent:(FBSDKShareCameraEffectContent *)ShareCameraEffectContent - error:(NSError *__autoreleasing *)errorRef { - NSString *effectID = ShareCameraEffectContent.effectID; - NSCharacterSet* nonDigitCharacters = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; - - if ([effectID length] > 0) { - if ([effectID rangeOfCharacterFromSet:nonDigitCharacters].location != NSNotFound) { - if (errorRef != NULL) { - *errorRef = [FBSDKError invalidArgumentErrorWithName:@"effectID" - value:effectID - message:@"Invalid value for effectID, effectID can contain only numerical characters."]; - } - return NO; - } - } - - return YES; -} -#endif - -+ (BOOL)validateAssetLibraryURLWithShareVideoContent:(FBSDKShareVideoContent *)videoContent name:(NSString *)name error:(NSError *__autoreleasing *)errorRef -{ - FBSDKShareVideo *video = videoContent.video; - NSURL *videoURL = video.videoURL; - return [self _validateAssetLibraryVideoURL:videoURL name:name error:errorRef]; -} - -+ (BOOL)validateAssetLibraryURLsWithShareMediaContent:(FBSDKShareMediaContent *)mediaContent name:(NSString *)name error:(NSError *__autoreleasing *)errorRef -{ - for (id media in mediaContent.media) { - if ([media isKindOfClass:[FBSDKShareVideo class]]) { - FBSDKShareVideo *video = (FBSDKShareVideo *)media; - if (![self _validateAssetLibraryVideoURL:video.videoURL name:name error:errorRef]) { - return NO; - } - } - } - return YES; -} - -#if !TARGET_OS_TV -+ (BOOL)validateGameRequestContent:(FBSDKGameRequestContent *)gameRequestContent error:(NSError *__autoreleasing *)errorRef -{ - if (![self _validateRequiredValue:gameRequestContent name:@"content" error:errorRef] - || ![self _validateRequiredValue:gameRequestContent.message name:@"message" error:errorRef]) { - return NO; - } - BOOL mustHaveobjectID = gameRequestContent.actionType == FBSDKGameRequestActionTypeSend - || gameRequestContent.actionType == FBSDKGameRequestActionTypeAskFor; - BOOL hasobjectID = [gameRequestContent.objectID length] > 0; - if (mustHaveobjectID ^ hasobjectID) { - if (errorRef != NULL) { - NSString *message = @"The objectID is required when the actionType is either send or askfor."; - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"objectID" message:message]; - } - return NO; - } - BOOL hasTo = [gameRequestContent.recipients count] > 0; - BOOL hasFilters = gameRequestContent.filters != FBSDKGameRequestFilterNone; - BOOL hasSuggestions = [gameRequestContent.recipientSuggestions count] > 0; - if (hasTo && hasFilters) { - if (errorRef != NULL) { - NSString *message = @"Cannot specify to and filters at the same time."; - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"recipients" value:gameRequestContent.recipients message:message]; - } - return NO; - } - if (hasTo && hasSuggestions) { - if (errorRef != NULL) { - NSString *message = @"Cannot specify to and suggestions at the same time."; - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"recipients" value:gameRequestContent.recipients message:message]; - } - return NO; - } - - if (hasFilters && hasSuggestions) { - if (errorRef != NULL) { - NSString *message = @"Cannot specify filters and suggestions at the same time."; - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"recipientSuggestions" value:gameRequestContent.recipientSuggestions message:message]; - } - return NO; - } - - if ([gameRequestContent.data length] > 255) { - if (errorRef != NULL) { - NSString *message = @"The data cannot be longer than 255 characters"; - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"data" value:gameRequestContent.data message:message]; - } - return NO; - } - - if (errorRef != NULL) { - *errorRef = nil; - } - - return [self _validateArgumentWithName:@"actionType" - value:gameRequestContent.actionType - isIn:@[@(FBSDKGameRequestActionTypeNone), - @(FBSDKGameRequestActionTypeSend), - @(FBSDKGameRequestActionTypeAskFor), - @(FBSDKGameRequestActionTypeTurn)] - error:errorRef] - && [self _validateArgumentWithName:@"filters" - value:gameRequestContent.filters - isIn:@[@(FBSDKGameRequestFilterNone), - @(FBSDKGameRequestFilterAppUsers), - @(FBSDKGameRequestFilterAppNonUsers)] - error:errorRef]; -} -#endif - -+ (BOOL)validateShareContent:(id)shareContent error:(NSError *__autoreleasing *)errorRef -{ - if (![self _validateRequiredValue:shareContent name:@"shareContent" error:errorRef]) { - return NO; - } else if ([shareContent isKindOfClass:[FBSDKShareLinkContent class]]) { - return [self validateShareLinkContent:(FBSDKShareLinkContent *)shareContent error:errorRef]; - } else if ([shareContent isKindOfClass:[FBSDKSharePhotoContent class]]) { - return [self validateSharePhotoContent:(FBSDKSharePhotoContent *)shareContent error:errorRef]; - } else if ([shareContent isKindOfClass:[FBSDKShareVideoContent class]]) { - return [self validateShareVideoContent:(FBSDKShareVideoContent *)shareContent error:errorRef]; - } else if ([shareContent isKindOfClass:[FBSDKShareMediaContent class]]) { - return [self validateShareMediaContent:(FBSDKShareMediaContent *)shareContent error:errorRef]; - } else if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - return [self validateShareOpenGraphContent:(FBSDKShareOpenGraphContent *)shareContent error:errorRef]; -#if !TARGET_OS_TV - } else if ([shareContent isKindOfClass:[FBSDKShareMessengerMediaTemplateContent class]]) { - return [self validateMessengerMediaTemplateContent:(FBSDKShareMessengerMediaTemplateContent *)shareContent error:errorRef]; - } else if ([shareContent isKindOfClass:[FBSDKShareMessengerGenericTemplateContent class]]) { - return [self validateMessengerGenericTemplateContent:(FBSDKShareMessengerGenericTemplateContent *)shareContent error:errorRef]; - } else if ([shareContent isKindOfClass:[FBSDKShareMessengerOpenGraphMusicTemplateContent class]]) { - return [self validateMessengerOpenGraphMusicTemplateContent:(FBSDKShareMessengerOpenGraphMusicTemplateContent *)shareContent error:errorRef]; - } else if ([shareContent isKindOfClass:[FBSDKShareCameraEffectContent class]]) { - return [self validateShareCameraEffectContent:(FBSDKShareCameraEffectContent *)shareContent error:errorRef]; -#endif - } else { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"shareContent" value:shareContent message:nil]; - } - return NO; - } -} - -+ (BOOL)validateShareOpenGraphContent:(FBSDKShareOpenGraphContent *)openGraphContent - error:(NSError *__autoreleasing *)errorRef -{ - FBSDKShareOpenGraphAction *action = openGraphContent.action; - NSString *previewPropertyName = openGraphContent.previewPropertyName; - id object = action[previewPropertyName]; - return ([self _validateRequiredValue:openGraphContent name:@"shareContent" error:errorRef] && - [self _validateRequiredValue:action name:@"action" error:errorRef] && - [self _validateRequiredValue:previewPropertyName name:@"previewPropertyName" error:errorRef] && - [self _validateRequiredValue:object name:previewPropertyName error:errorRef]); -} - -+ (BOOL)validateSharePhotoContent:(FBSDKSharePhotoContent *)photoContent error:(NSError *__autoreleasing *)errorRef -{ - NSArray *photos = photoContent.photos; - if (![self _validateRequiredValue:photoContent name:@"shareContent" error:errorRef] || - ![self _validateArray:photos minCount:1 maxCount:6 name:@"photos" error:errorRef]) { - return NO; - } - for (FBSDKSharePhoto *photo in photos) { - if (!photo.image) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"photos" - value:photos - message:@"photos must have UIImages"]; - } - return NO; - } - } - return YES; -} - -+ (BOOL)validateShareMediaContent:(FBSDKShareMediaContent *)mediaContent error:(NSError *__autoreleasing *)errorRef -{ - NSArray *medias = mediaContent.media; - if (![self _validateRequiredValue:mediaContent name:@"shareContent" error:errorRef] || - ![self _validateArray:medias minCount:1 maxCount:20 name:@"photos" error:errorRef]) { - return NO; - } - int videoCount = 0; - for (id media in medias) { - if ([media isKindOfClass:[FBSDKSharePhoto class]]) { - FBSDKSharePhoto *photo = (FBSDKSharePhoto *)media; - if (!photo.image) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"media" - value:media - message:@"photos must have UIImages"]; - } - return NO; - } - } else if ([media isKindOfClass:[FBSDKShareVideo class]]) { - if (videoCount > 0) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"media" - value:media - message:@"Only 1 video is allowed"]; - return NO; - } - } - videoCount++; - FBSDKShareVideo *video = (FBSDKShareVideo *)media; - NSURL *videoURL = video.videoURL; - if (![self _validateRequiredValue:video name:@"video" error:errorRef] && - [self _validateRequiredValue:videoURL name:@"videoURL" error:errorRef]) { - return NO; - } - - } else { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"media" - value:media - message:@"Only FBSDKSharePhoto and FBSDKShareVideo are allowed in `media` property"]; - } - return NO; - } - } - return YES; -} - -+ (BOOL)validateShareLinkContent:(FBSDKShareLinkContent *)linkContent error:(NSError *__autoreleasing *)errorRef -{ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - return ([self _validateRequiredValue:linkContent name:@"shareContent" error:errorRef] && - [self _validateNetworkURL:linkContent.contentURL name:@"contentURL" error:errorRef] && - [self _validateNetworkURL:linkContent.imageURL name:@"imageURL" error:errorRef]); -#pragma clang diagnostic pop -} - -+ (BOOL)validateShareVideoContent:(FBSDKShareVideoContent *)videoContent error:(NSError *__autoreleasing *)errorRef -{ - FBSDKShareVideo *video = videoContent.video; - NSURL *videoURL = video.videoURL; - return ([self _validateRequiredValue:videoContent name:@"videoContent" error:errorRef] && - [self _validateRequiredValue:video name:@"video" error:errorRef] && - [self _validateRequiredValue:videoURL name:@"videoURL" error:errorRef]); -} - -#if !TARGET_OS_TV - -+ (BOOL)validateMessengerMediaTemplateContent:(FBSDKShareMessengerMediaTemplateContent *)messengerMediaTemplateContent - error:(NSError *__autoreleasing *)errorRef -{ - if (!messengerMediaTemplateContent.mediaURL && !messengerMediaTemplateContent.attachmentID) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:@"attachmentID/mediaURL" message:@"Must specify either attachmentID or mediaURL"]; - } - return NO; - } - return [self _validateMessengerActionButton:messengerMediaTemplateContent.button - isDefaultActionButton:NO - pageID:messengerMediaTemplateContent.pageID - error:errorRef]; -} - -+ (BOOL)validateMessengerGenericTemplateContent:(FBSDKShareMessengerGenericTemplateContent *)genericTemplateContent - error:(NSError *__autoreleasing *)errorRef -{ - return [self _validateRequiredValue:genericTemplateContent.element.title name:@"element.title" error:errorRef] && - [self _validateMessengerActionButton:genericTemplateContent.element.defaultAction - isDefaultActionButton:YES - pageID:genericTemplateContent.pageID - error:errorRef] && - [self _validateMessengerActionButton:genericTemplateContent.element.button - isDefaultActionButton:NO - pageID:genericTemplateContent.pageID - error:errorRef]; -} - -+ (BOOL)validateMessengerOpenGraphMusicTemplateContent:(FBSDKShareMessengerOpenGraphMusicTemplateContent *)openGraphMusicTemplateContent - error:(NSError *__autoreleasing *)errorRef -{ - return [self _validateRequiredValue:openGraphMusicTemplateContent.url name:@"url" error:errorRef] && - [self _validateRequiredValue:openGraphMusicTemplateContent.pageID name:@"pageID" error:errorRef] && - [self _validateMessengerActionButton:openGraphMusicTemplateContent.button - isDefaultActionButton:NO - pageID:openGraphMusicTemplateContent.pageID - error:errorRef]; -} - -+ (BOOL)_validateMessengerActionButton:(id)button - isDefaultActionButton:(BOOL)isDefaultActionButton - pageID:(NSString *)pageID - error:(NSError *__autoreleasing *)errorRef -{ - if (!button) { - return YES; - } - - if ([button isKindOfClass:[FBSDKShareMessengerURLActionButton class]]) { - return [self _validateURLActionButton:(FBSDKShareMessengerURLActionButton *)button - isDefaultActionButton:isDefaultActionButton - pageID:pageID - error:errorRef]; - } else { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:@"buttons" value:button message:nil]; - } - return NO; - } -} - -+ (BOOL)_validateURLActionButton:(FBSDKShareMessengerURLActionButton *)urlActionButton - isDefaultActionButton:(BOOL)isDefaultActionButton - pageID:(NSString *)pageID - error:(NSError *__autoreleasing *)errorRef -{ - return [self _validateRequiredValue:urlActionButton.url name:@"button.url" error:errorRef] && - (!isDefaultActionButton ? [self _validateRequiredValue:urlActionButton.title name:@"button.title" error:errorRef] : YES) && - (urlActionButton.isMessengerExtensionURL ? [self _validateRequiredValue:pageID name:@"content pageID" error:errorRef] : YES); -} - -#endif - -+ (BOOL)shareMediaContentContainsPhotosAndVideos:(FBSDKShareMediaContent *)shareMediaContent -{ - BOOL containsPhotos = NO; - BOOL containsVideos = NO; - [self testShareContent:shareMediaContent containsMedia:NULL containsPhotos:&containsPhotos containsVideos:&containsVideos]; - return containsVideos && containsPhotos; -} - -#pragma mark - Object Lifecycle - -- (instancetype)init -{ - FBSDK_NO_DESIGNATED_INITIALIZER(); - return nil; -} - -#pragma mark - Helper Methods - -+ (void)_addToParameters:(NSMutableDictionary *)parameters forShareContent:(id)shareContent -{ - NSString *hashtagString = [self hashtagStringFromHashtag:shareContent.hashtag]; - if (hashtagString != nil) { - [FBSDKInternalUtility dictionary:parameters setObject:@[hashtagString] forKey:@"hashtags"]; - } - - [FBSDKInternalUtility dictionary:parameters setObject:shareContent.pageID forKey:@"pageID"]; - [FBSDKInternalUtility dictionary:parameters setObject:shareContent.shareUUID forKey:@"shareUUID"]; - - if ([shareContent isKindOfClass:[FBSDKShareOpenGraphContent class]]) { - FBSDKShareOpenGraphAction *action = ((FBSDKShareOpenGraphContent *)shareContent).action; - [action setArray:shareContent.peopleIDs forKey:@"tags"]; - [action setString:shareContent.placeID forKey:@"place"]; - [action setString:shareContent.ref forKey:@"ref"]; - } else { - [FBSDKInternalUtility dictionary:parameters setObject:shareContent.peopleIDs forKey:@"tags"]; - [FBSDKInternalUtility dictionary:parameters setObject:shareContent.placeID forKey:@"place"]; - [FBSDKInternalUtility dictionary:parameters setObject:shareContent.ref forKey:@"ref"]; - } -} - -+ (void)_addToParameters:(NSMutableDictionary *)parameters -forShareOpenGraphContent:(FBSDKShareOpenGraphContent *)openGraphContent -{ - NSString *previewPropertyName = [self getOpenGraphNameAndNamespaceFromFullName:openGraphContent.previewPropertyName namespace:nil]; - [FBSDKInternalUtility dictionary:parameters - setObject:previewPropertyName - forKey:@"previewPropertyName"]; - [FBSDKInternalUtility dictionary:parameters setObject:openGraphContent.action.actionType forKey:@"actionType"]; - [FBSDKInternalUtility dictionary:parameters - setObject:[self _convertOpenGraphValueContainer:openGraphContent.action requireNamespace:NO] - forKey:@"action"]; -} - -+ (void)_addToParameters:(NSMutableDictionary *)parameters - forSharePhotoContent:(FBSDKSharePhotoContent *)photoContent -{ - [FBSDKInternalUtility dictionary:parameters - setObject:[photoContent.photos valueForKeyPath:@"image"] - forKey:@"photos"]; -} - -+ (void)_addToParameters:(NSMutableDictionary *)parameters - forShareLinkContent:(FBSDKShareLinkContent *)linkContent -{ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentURL forKey:@"link"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentTitle forKey:@"name"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentDescription forKey:@"description"]; - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.imageURL forKey:@"picture"]; - - /** - Pass link parameter as "messenger_link" due to versioning requirements for message dialog flow. - We will only use the new share flow we developed if messenger_link is present, not link. - */ - [FBSDKInternalUtility dictionary:parameters setObject:linkContent.contentURL forKey:@"messenger_link"]; -#pragma clang diagnostic pop -} - -+ (void)_addToParameters:(NSMutableDictionary *)parameters - forShareVideoContent:(FBSDKShareVideoContent *)videoContent -{ - NSMutableDictionary *videoParameters = [[NSMutableDictionary alloc] init]; - FBSDKShareVideo *video = videoContent.video; - NSURL *videoURL = video.videoURL; - if (videoURL) { - videoParameters[@"assetURL"] = videoURL; - } - [FBSDKInternalUtility dictionary:videoParameters - setObject:[self _convertPhoto:videoContent.previewPhoto] - forKey:@"previewPhoto"]; - parameters[@"video"] = videoParameters; -} - -#if !TARGET_OS_TV -+ (void)_addToParameters:(NSMutableDictionary *)parameters -forShareCameraEffectContent:(FBSDKShareCameraEffectContent *)cameraEffectContent -{ - [FBSDKInternalUtility dictionary:parameters - setObject:cameraEffectContent.effectID - forKey:@"effect_id"]; - [FBSDKInternalUtility dictionary:parameters - setObject:[self _convertCameraEffectArguments:cameraEffectContent.effectArguments] - forKey:@"effect_arguments"]; - [FBSDKInternalUtility dictionary:parameters - setObject:[self _convertCameraEffectTextures:cameraEffectContent.effectTextures] - forKey:@"effect_textures"]; -} - -+ (NSString *)_convertCameraEffectArguments:(FBSDKCameraEffectArguments *)arguments -{ - // Convert a camera effect arguments container to a JSON string. - if (arguments == nil) { - return nil; - } - return [FBSDKInternalUtility JSONStringForObject:[arguments allArguments] - error:NULL - invalidObjectHandler:NULL]; -} - -+ (NSData *)_convertCameraEffectTextures:(FBSDKCameraEffectTextures *)textures -{ - if (textures == nil) { - return nil; - } - // Convert the entire textures dictionary into one NSData, because - // the existing API protocol only allows one value to be put into the pasteboard. - NSDictionary *texturesDict = [textures allTextures]; - NSMutableDictionary *texturesDataDict = [NSMutableDictionary dictionaryWithCapacity:texturesDict.count]; - [texturesDict enumerateKeysAndObjectsUsingBlock:^(NSString *key, UIImage *img, BOOL *stop) { - // Convert UIImages to NSData, because UIImage is not archivable. - [texturesDataDict setObject:UIImagePNGRepresentation(img) forKey:key]; - }]; - return [NSKeyedArchiver archivedDataWithRootObject:texturesDataDict]; -} -#endif - -+ (id)_convertObject:(id)object -{ - if ([object isKindOfClass:[FBSDKShareOpenGraphValueContainer class]]) { - object = [self _convertOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)object requireNamespace:YES]; - } else if ([object isKindOfClass:[FBSDKSharePhoto class]]) { - object = [self _convertPhoto:(FBSDKSharePhoto *)object]; - } else if ([object isKindOfClass:[NSArray class]]) { - NSMutableArray *array = [[NSMutableArray alloc] init]; - for (id item in (NSArray *)object) { - [FBSDKInternalUtility array:array addObject:[self _convertObject:item]]; - } - object = array; - } - return object; -} - -+ (NSDictionary *)_convertOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)container - requireNamespace:(BOOL)requireNamespace -{ - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - NSMutableDictionary *data = [[NSMutableDictionary alloc] init]; - [container enumerateKeysAndObjectsUsingBlock:^(NSString *key, id object, BOOL *stop) { - // if we have an FBSDKShareOpenGraphObject and a type, then we are creating a new object instance; set the flag - if ([key isEqualToString:@"og:type"] && [container isKindOfClass:[FBSDKShareOpenGraphObject class]]) { - dictionary[@"fbsdk:create_object"] = @YES; - dictionary[key] = object; - } - id value = [self _convertObject:object]; - if (value) { - NSString *namespace; - key = [self getOpenGraphNameAndNamespaceFromFullName:key namespace:&namespace]; - - if (requireNamespace) { - if ([namespace isEqualToString:@"og"]) { - dictionary[key] = value; - } else { - data[key] = value; - } - } else { - dictionary[key] = value; - } - } - }]; - if ([data count]) { - dictionary[@"data"] = data; - } - return dictionary; -} - -+ (NSString *)getOpenGraphNameAndNamespaceFromFullName:(NSString *)fullName namespace:(NSString **)namespace { - if (namespace) { - *namespace = nil; - } - - if ([fullName isEqualToString:@"fb:explicitly_shared"]) { - return fullName; - } - - NSUInteger index = [fullName rangeOfString:@":"].location; - if ((index != NSNotFound) && (fullName.length > index + 1)) { - if (namespace) { - *namespace = [fullName substringToIndex:index]; - } - - return [fullName substringFromIndex:index + 1]; - } - - return fullName; -} - -+ (NSDictionary *)_convertPhoto:(FBSDKSharePhoto *)photo -{ - if (!photo) { - return nil; - } - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - dictionary[@"user_generated"] = @(photo.userGenerated); - [FBSDKInternalUtility dictionary:dictionary setObject:photo.caption forKey:@"caption"]; - - [FBSDKInternalUtility dictionary:dictionary setObject:photo.image ?: photo.imageURL.absoluteString forKey:@"url"]; - return dictionary; -} - -+ (BOOL)_isOpenGraphValue:(id)value -{ - return ((value == nil) || - [value isKindOfClass:[NSNull class]] || - [value isKindOfClass:[NSNumber class]] || - [value isKindOfClass:[NSString class]] || - [value isKindOfClass:[NSURL class]] || - [value isKindOfClass:[FBSDKSharePhoto class]] || - [value isKindOfClass:[FBSDKShareOpenGraphObject class]]); -} - -+ (void)_stageImagesForPhotoContent:(FBSDKSharePhotoContent *)content - withCompletionHandler:(void(^)(NSArray *))completion -{ - __block NSMutableArray *stagedURIs = [NSMutableArray array]; - dispatch_group_t group = dispatch_group_create(); - for (FBSDKSharePhoto *photo in content.photos) { - if (photo.image != nil) { - dispatch_group_enter(group); - NSDictionary *stagingParameters = @{ - @"file" : photo.image, - }; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me/staging_resources" - parameters:stagingParameters - HTTPMethod:@"POST"]; - [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - NSString *photoStagedURI = result[@"uri"]; - if (photoStagedURI != nil) { - [stagedURIs addObject:photoStagedURI]; - dispatch_group_leave(group); - } - }]; - } - } - - dispatch_group_notify(group, dispatch_get_main_queue(), ^{ - if (completion != NULL) { - completion([stagedURIs copy]); - } - }); -} - -+ (void)_testObject:(id)object containsMedia:(BOOL *)containsMediaRef containsPhotos:(BOOL *)containsPhotosRef containsVideos:(BOOL *)containsVideosRef -{ - BOOL containsMedia = NO; - BOOL containsPhotos = NO; - BOOL containsVideos = NO; - if ([object isKindOfClass:[FBSDKSharePhoto class]]) { - containsMedia = (((FBSDKSharePhoto *)object).image != nil); - containsPhotos = YES; - } else if ([object isKindOfClass:[FBSDKShareVideo class]]) { - containsMedia = YES; - containsVideos = YES; - } else if ([object isKindOfClass:[FBSDKShareOpenGraphValueContainer class]]) { - [self _testOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)object - containsMedia:&containsMedia - containsPhotos:&containsPhotos - containsVideos:&containsVideos]; - } else if ([object isKindOfClass:[NSArray class]]) { - for (id item in (NSArray *)object) { - BOOL itemContainsMedia = NO; - BOOL itemContainsPhotos = NO; - BOOL itemContainsVideos = NO; - [self _testObject:item containsMedia:&itemContainsMedia containsPhotos:&itemContainsPhotos containsVideos:&itemContainsVideos]; - containsMedia |= itemContainsMedia; - containsPhotos |= itemContainsPhotos; - containsVideos |= itemContainsVideos; - if (containsMedia && containsPhotos && containsVideos) { - break; - } - } - } - if (containsMediaRef != NULL) { - *containsMediaRef = containsMedia; - } - if (containsPhotosRef != NULL) { - *containsPhotosRef = containsPhotos; - } - if (containsVideosRef != NULL) { - *containsVideosRef = containsVideos; - } -} - -+ (void)_testOpenGraphValueContainer:(FBSDKShareOpenGraphValueContainer *)container - containsMedia:(BOOL *)containsMediaRef - containsPhotos:(BOOL *)containsPhotosRef - containsVideos:(BOOL *)containsVideosRef -{ - __block BOOL containsMedia = NO; - __block BOOL containsPhotos = NO; - __block BOOL containsVideos = NO; - [container enumerateKeysAndObjectsUsingBlock:^(NSString *key, id object, BOOL *stop) { - BOOL itemContainsMedia = NO; - BOOL itemContainsPhotos = NO; - BOOL itemContainsVideos = NO; - [self _testObject:object containsMedia:&itemContainsMedia containsPhotos:&itemContainsPhotos containsVideos:&itemContainsVideos]; - containsMedia |= itemContainsMedia; - containsPhotos |= itemContainsPhotos; - containsVideos |= itemContainsVideos; - if (containsMedia && containsPhotos && containsVideosRef) { - *stop = YES; - } - }]; - if (containsMediaRef != NULL) { - *containsMediaRef = containsMedia; - } - if (containsPhotosRef != NULL) { - *containsPhotosRef = containsPhotos; - } - if (containsVideosRef != NULL) { - *containsVideosRef = containsVideos; - } -} - -+ (BOOL)_validateArray:(NSArray *)array - minCount:(NSUInteger)minCount - maxCount:(NSUInteger)maxCount - name:(NSString *)name - error:(NSError *__autoreleasing *)errorRef -{ - NSUInteger count = [array count]; - if ((count < minCount) || (count > maxCount)) { - if (errorRef != NULL) { - NSString *message = [[NSString alloc] initWithFormat:@"%@ must have %lu to %lu values", - name, - (unsigned long)minCount, - (unsigned long)maxCount]; - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:name value:array message:message]; - } - return NO; - } else { - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; - } -} - -+ (BOOL)_validateFileURL:(NSURL *)URL name:(NSString *)name error:(NSError *__autoreleasing *)errorRef -{ - if (!URL) { - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; - } - if (!URL.isFileURL) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:name value:URL message:nil]; - } - return NO; - } - // ensure that the file exists. per the latest spec for NSFileManager, we should not be checking for file existence, - // so they have removed that option for URLs and discourage it for paths, so we just construct a mapped NSData. - NSError *fileError; - if (![[NSData alloc] initWithContentsOfURL:URL - options:NSDataReadingMapped - error:&fileError]) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:name - value:URL - message:@"Error reading file" - underlyingError:fileError]; - } - return NO; - } - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; -} - -+ (BOOL)_validateNetworkURL:(NSURL *)URL name:(NSString *)name error:(NSError *__autoreleasing *)errorRef -{ - if (!URL || [FBSDKInternalUtility isBrowserURL:URL]) { - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; - } else { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:name value:URL message:nil]; - } - return NO; - } -} - -+ (BOOL)_validateRequiredValue:(id)value name:(NSString *)name error:(NSError *__autoreleasing *)errorRef -{ - if (!value || - ([value isKindOfClass:[NSString class]] && ![(NSString *)value length]) || - ([value isKindOfClass:[NSArray class]] && ![(NSArray *)value count]) || - ([value isKindOfClass:[NSDictionary class]] && ![(NSDictionary *)value count])) { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError requiredArgumentErrorWithName:name message:nil]; - } - return NO; - } - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; -} - -+ (BOOL)_validateArgumentWithName:(NSString *)argumentName - value:(NSUInteger)value - isIn:(NSArray *)possibleValues - error:(NSError *__autoreleasing *)errorRef -{ - for (NSNumber *possibleValue in possibleValues) { - if (value == [possibleValue unsignedIntegerValue]) { - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; - } - } - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:argumentName value:@(value) message:nil]; - } - return NO; -} - -+ (BOOL)_validateAssetLibraryVideoURL:(NSURL *)videoURL name:(NSString *)name error:(NSError *__autoreleasing *)errorRef -{ - if (!videoURL || [[videoURL.scheme lowercaseString] isEqualToString:@"assets-library"]) { - if (errorRef != NULL) { - *errorRef = nil; - } - return YES; - } else { - if (errorRef != NULL) { - *errorRef = [FBSDKShareError invalidArgumentErrorWithName:name value:videoURL message:nil]; - } - return NO; - } -} - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKVideoUploader.h b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKVideoUploader.h deleted file mode 100644 index 53d24a29c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKVideoUploader.h +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import -#import - -@protocol FBSDKVideoUploaderDelegate; - -/** - A utility class for uploading through the chunk upload graph API. Using this class requires an access token in - `[FBSDKAccessToken currentAccessToken]` that has been granted the "publish_actions" permission. - - see https://developers.facebook.com/docs/graph-api/video-uploads - */ -@interface FBSDKVideoUploader : NSObject - -/** - Initialize videoUploader - - Parameter videoName: The file name of the video to be uploaded - - Parameter videoSize: The size of the video to be uploaded - - Parameter parameters: Optional parameters for video uploads. See Graph API documentation for the full list of parameters https://developers.facebook.com/docs/graph-api/reference/video - - Parameter delegate: Receiver's delegate - */ -- (instancetype)initWithVideoName:(NSString *)videoName videoSize:(NSUInteger)videoSize parameters:(NSDictionary *)parameters delegate:(id)delegate -NS_DESIGNATED_INITIALIZER; - - -/** - The video to be uploaded. - */ -@property (readonly, copy, nonatomic) FBSDKShareVideo *video; - -/** - Optional parameters for video uploads. See Graph API documentation for the full list of parameters https://developers.facebook.com/docs/graph-api/reference/video - */ -@property (copy, nonatomic) NSDictionary *parameters; - -/** - The graph node to which video should be uploaded - */ -@property (nonatomic, copy) NSString *graphNode; - -/** - Receiver's delegate - */ -@property (weak, nonatomic) id delegate; - -/** - Start upload process - */ -//TODO #6229672 add cancel and/or pause -- (void)start; - -@end - -/** - A delegate for `FBSDKVideoUploader`. - - The delegate passes video chunk to `FBSDKVideoUploader` object in `NSData` format and is notified with the results of the uploader. - */ -@protocol FBSDKVideoUploaderDelegate - -/** - get chunk of the video to be uploaded in 'NSData' format - - Parameter videoUploader: The `FBSDKVideoUploader` object which is performing the upload process - - Parameter startOffset: The start offset of video chunk to be uploaded - - Parameter endOffset: The end offset of video chunk being to be uploaded - */ -- (NSData *)videoChunkDataForVideoUploader:(FBSDKVideoUploader *)videoUploader startOffset:(NSUInteger) startOffset endOffset:(NSUInteger) endOffset; - -/** - Notify the delegate that upload process success. - - Parameter videoUploader: The `FBSDKVideoUploader` object which is performing the upload process - - Parameter results: The result from successful upload - */ -- (void)videoUploader:(FBSDKVideoUploader *)videoUploader didCompleteWithResults:(NSDictionary *)results; - -/** - Notify the delegate that upload process fails. - - Parameter videoUploader: The `FBSDKVideoUploader` object which is performing the upload process - - Parameter error: The error object from unsuccessful upload - */ -- (void)videoUploader:(FBSDKVideoUploader *)videoUploader didFailWithError:(NSError *)error; - -@end diff --git a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKVideoUploader.m b/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKVideoUploader.m deleted file mode 100644 index 0864d0c1c..000000000 --- a/Pods/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKVideoUploader.m +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKVideoUploader.h" - -#import - -#import - -#import - -#import "FBSDKShareDefines.h" -#import "FBSDKShareError.h" - -static NSString *const FBSDKVideoUploaderDefaultGraphNode = @"me"; -static NSString *const FBSDKVideoUploaderEdge = @"videos"; - -@implementation FBSDKVideoUploader -{ - NSNumber *_videoID; - NSNumber *_uploadSessionID; - NSNumberFormatter *_numberFormatter; - NSString *_graphPath; - NSString *_videoName; - NSUInteger _videoSize; -} - -- (instancetype)init NS_UNAVAILABLE -{ - assert(0); -} - -#pragma Public Method -- (instancetype)initWithVideoName:(NSString *)videoName videoSize:(NSUInteger)videoSize parameters:(NSDictionary *)parameters delegate:(id)delegate -{ - self = [super init]; - if (self) { - _parameters = [parameters copy]; - _delegate = delegate; - _graphNode = FBSDKVideoUploaderDefaultGraphNode; - _videoName = videoName; - _videoSize = videoSize; - } - return self; -} - -- (void)start -{ - _graphPath = [self _graphPathWithSuffix:FBSDKVideoUploaderEdge, nil]; - [self _postStartRequest]; -} - -#pragma Helper Method - -- (void)_postStartRequest -{ - FBSDKGraphRequestHandler startRequestCompletionHandler = ^(FBSDKGraphRequestConnection *connection, id result, NSError *error) - { - if (error) { - [self.delegate videoUploader:self didFailWithError:error]; - return; - } else { - result = [FBSDKTypeUtility dictionaryValue:result]; - NSNumber *uploadSessionID = [self.numberFormatter numberFromString:result[FBSDK_SHARE_VIDEO_UPLOAD_SESSION_ID]]; - NSNumber *videoID = [self.numberFormatter numberFromString:result[FBSDK_SHARE_VIDEO_ID]]; - NSDictionary *offsetDictionary = [self _extractOffsetsFromResultDictionary:result]; - if (uploadSessionID == nil || videoID == nil) { - [self.delegate videoUploader:self didFailWithError:[ - FBSDKShareError errorWithCode:FBSDKShareUnknownErrorCode - message:@"Failed to get valid upload_session_id or video_id."]]; - return; - } else if (offsetDictionary == nil) { - return; - } - _uploadSessionID = uploadSessionID; - _videoID = videoID; - [self _startTransferRequestWithOffsetDictionary:offsetDictionary]; - } - }; - if (_videoSize == 0) { - [self.delegate videoUploader:self didFailWithError:[ - FBSDKShareError errorWithCode:FBSDKShareUnknownErrorCode - message:[NSString stringWithFormat:@"Invalid video size: %lu", (unsigned long)_videoSize]]]; - return; - } - [[[FBSDKGraphRequest alloc] initWithGraphPath:_graphPath - parameters:@{ - FBSDK_SHARE_VIDEO_UPLOAD_PHASE: FBSDK_SHARE_VIDEO_UPLOAD_PHASE_START, - FBSDK_SHARE_VIDEO_SIZE: [NSString stringWithFormat:@"%tu", _videoSize], - } - HTTPMethod:@"POST"] startWithCompletionHandler:startRequestCompletionHandler]; -} - -- (void)_startTransferRequestWithOffsetDictionary:(NSDictionary *)offsetDictionary -{ - dispatch_queue_t dataQueue; - NSOperatingSystemVersion iOS8Version = { .majorVersion = 8, .minorVersion = 0, .patchVersion = 0 }; - if ([FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS8Version]) { - dataQueue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0); - } else { - dataQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); - } - NSUInteger startOffset = [offsetDictionary[FBSDK_SHARE_VIDEO_START_OFFSET] unsignedIntegerValue]; - NSUInteger endOffset = [offsetDictionary[FBSDK_SHARE_VIDEO_END_OFFSET] unsignedIntegerValue]; - if (startOffset == endOffset) { - [self _postFinishRequest]; - return; - } else { - dispatch_async(dataQueue, ^{ - size_t chunkSize = (unsigned long)(endOffset - startOffset); - NSData *data = [self.delegate videoChunkDataForVideoUploader:self startOffset:startOffset endOffset:endOffset]; - if (data == nil || data.length != chunkSize) { - [self.delegate videoUploader:self didFailWithError:[FBSDKShareError errorWithCode:FBSDKShareUnknownErrorCode message: - [NSString stringWithFormat:@"Fail to get video chunk with start offset: %lu, end offset : %lu.", (unsigned long)startOffset, (unsigned long)endOffset]]]; - return; - } - dispatch_async(dispatch_get_main_queue(), ^{ - FBSDKGraphRequestDataAttachment *dataAttachment = [[FBSDKGraphRequestDataAttachment alloc] initWithData:data - filename:_videoName - contentType:nil]; - FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:_graphPath - parameters:@{ - FBSDK_SHARE_VIDEO_UPLOAD_PHASE: FBSDK_SHARE_VIDEO_UPLOAD_PHASE_TRANSFER, - FBSDK_SHARE_VIDEO_START_OFFSET: offsetDictionary[FBSDK_SHARE_VIDEO_START_OFFSET], - FBSDK_SHARE_VIDEO_UPLOAD_SESSION_ID: _uploadSessionID, - FBSDK_SHARE_VIDEO_FILE_CHUNK: dataAttachment, - } - HTTPMethod:@"POST"]; - [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *innerError) { - if (innerError) { - [self.delegate videoUploader:self didFailWithError:innerError]; - return; - } - NSDictionary *innerOffsetDictionary = [self _extractOffsetsFromResultDictionary:result]; - if (innerOffsetDictionary == nil) { - return; - } - [self _startTransferRequestWithOffsetDictionary:innerOffsetDictionary]; - }]; - }); - }); - } -} - -- (void)_postFinishRequest -{ - NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; - parameters[FBSDK_SHARE_VIDEO_UPLOAD_PHASE] = FBSDK_SHARE_VIDEO_UPLOAD_PHASE_FINISH; - parameters[FBSDK_SHARE_VIDEO_UPLOAD_SESSION_ID] = _uploadSessionID; - [parameters addEntriesFromDictionary:self.parameters]; - [[[FBSDKGraphRequest alloc] initWithGraphPath:_graphPath - parameters:parameters - HTTPMethod:@"POST"] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { - if (error) { - [self.delegate videoUploader:self didFailWithError:error]; - } else { - result = [FBSDKTypeUtility dictionaryValue:result]; - if (result[FBSDK_SHARE_VIDEO_UPLOAD_SUCCESS] == nil) { - [self.delegate videoUploader:self didFailWithError:[FBSDKShareError errorWithCode:FBSDKShareUnknownErrorCode - message:@"Failed to finish uploading."]]; - return; - } - NSMutableDictionary *shareResult = [[NSMutableDictionary alloc] init]; - shareResult[FBSDK_SHARE_VIDEO_UPLOAD_SUCCESS] = result[FBSDK_SHARE_VIDEO_UPLOAD_SUCCESS]; - shareResult[FBSDK_SHARE_RESULT_COMPLETION_GESTURE_KEY] = FBSDK_SHARE_RESULT_COMPLETION_GESTURE_VALUE_POST; - shareResult[FBSDK_SHARE_VIDEO_ID] = _videoID; - [self.delegate videoUploader:self didCompleteWithResults:shareResult]; - } - }]; -} - -- (NSDictionary *)_extractOffsetsFromResultDictionary:(id)result -{ - result = [FBSDKTypeUtility dictionaryValue:result]; - NSNumber *startNum = [self.numberFormatter numberFromString:result[FBSDK_SHARE_VIDEO_START_OFFSET]]; - NSNumber *endNum = [self.numberFormatter numberFromString:result[FBSDK_SHARE_VIDEO_END_OFFSET]]; - if (startNum == nil || endNum == nil) { - [self.delegate videoUploader:self didFailWithError:[FBSDKShareError errorWithCode:FBSDKShareUnknownErrorCode - message:@"Fail to get valid start_offset or end_offset."]]; - return nil; - } - if ([startNum compare:endNum] == NSOrderedDescending) { - [self.delegate videoUploader:self didFailWithError:[FBSDKShareError errorWithCode:FBSDKShareUnknownErrorCode - message:@"Invalid offset: start_offset is greater than end_offset."]]; - return nil; - } - - NSMutableDictionary *shareResults = [[NSMutableDictionary alloc] init]; - shareResults[FBSDK_SHARE_VIDEO_START_OFFSET] = startNum; - shareResults[FBSDK_SHARE_VIDEO_END_OFFSET] = endNum; - return shareResults; -} - -- (NSNumberFormatter *)numberFormatter -{ - if (!_numberFormatter) { - _numberFormatter = [[NSNumberFormatter alloc] init]; - _numberFormatter.numberStyle = NSNumberFormatterDecimalStyle; - } - return _numberFormatter; -} - -- (NSString *)_graphPathWithSuffix:(NSString *)suffix, ... NS_REQUIRES_NIL_TERMINATION -{ - NSMutableString *graphPath = [[NSMutableString alloc] initWithString:self.graphNode]; - va_list args; - va_start(args, suffix); - for (NSString *arg = suffix; arg != nil; arg = va_arg(args, NSString *)) { - [graphPath appendFormat:@"/%@", arg]; - } - va_end(args); - return graphPath; -} - -@end diff --git a/Pods/FBSDKShareKit/LICENSE b/Pods/FBSDKShareKit/LICENSE deleted file mode 100644 index bdb9fc54b..000000000 --- a/Pods/FBSDKShareKit/LICENSE +++ /dev/null @@ -1,17 +0,0 @@ -Copyright (c) 2014-present, Facebook, Inc. All rights reserved. - -You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -copy, modify, and distribute this software in source code or binary form for use -in connection with the web services and APIs provided by Facebook. - -As with any software that integrates with the Facebook platform, your use of -this software is subject to the Facebook Developer Principles and Policies -[http://developers.facebook.com/policy/]. This copyright notice shall be -included in all copies or substantial portions of the software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/FBSDKShareKit/README.mdown b/Pods/FBSDKShareKit/README.mdown deleted file mode 100644 index 4e6580c19..000000000 --- a/Pods/FBSDKShareKit/README.mdown +++ /dev/null @@ -1,46 +0,0 @@ -Facebook SDK for iOS -==================== - -This open-source library allows you to integrate Facebook into your iOS app. - -Learn more about the provided samples, documentation, integrating the SDK into your app, accessing source code, and more at https://developers.facebook.com/docs/ios - -NOTE: By default, the Facebook SDK for iOS is installed in ~/Documents/FacebookSDK - -TRY IT OUT ----------- -1. Download the SDK at https://developers.facebook.com/docs/ios or via CocoaPods by adding the 'FBSDKCoreKit', 'FBSDKLoginKit', and 'FBSDKShareKit' pods. -2. Test your install: build and run the project at ~/Documents/FacebookSDK/Samples/Scrumptious/Scrumptious.xcodeproj -3. Check-out the tutorials available online at: https://developers.facebook.com/docs/ios/getting-started -4. Start coding! Visit https://developers.facebook.com/docs/ios for tutorials and reference documentation. - -FEATURES --------- -* Login - https://developers.facebook.com/docs/facebook-login -* Sharing - https://developers.facebook.com/docs/sharing -* App Links - https://developers.facebook.com/docs/applinks -* Graph API - https://developers.facebook.com/docs/ios/graph -* Analytics - https://developers.facebook.com/docs/analytics - -GIVE FEEDBACK -------------- -Please report bugs or issues to https://developers.facebook.com/bugs/ - -You can also join the Facebook Developers Group on Facebook (https://www.facebook.com/groups/fbdevelopers/) or ask questions on Stack Overflow (http://facebook.stackoverflow.com) - -LICENSE -------- -See the LICENSE file. - -DEVELOPER TERMS ---------------- - -- By enabling Facebook integrations, including through this SDK, you can share information with Facebook, including information about people’s use of your app. Facebook will use information received in accordance with our Data Use Policy [https://www.facebook.com/about/privacy/], including to provide you with insights about the effectiveness of your ads and the use of your app. These integrations also enable us and our partners to serve ads on and off Facebook. - -- You may limit your sharing of information with us by updating the Insights control in the developer tool [https://developers.facebook.com/apps/{app_id}/settings/advanced]. - -- If you use a Facebook integration, including to share information with us, you agree and confirm that you have provided appropriate and sufficiently prominent notice to and obtained the appropriate consent from your users regarding such collection, use, and disclosure (including, at a minimum, through your privacy policy). You further agree that you will not share information with us about children under the age of 13. - -- You agree to comply with all applicable laws and regulations and also agree to our Terms , including our Platform Policies .and Advertising Guidelines, as applicable . - -By using the Facebook SDK for iOS you agree to these terms. diff --git a/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView.h b/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView.h deleted file mode 100644 index 25dd44371..000000000 --- a/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView.h +++ /dev/null @@ -1,61 +0,0 @@ -// -// FFCircularProgressBar.h -// FFCircularProgressBar -// -// Created by Fabiano Francesconi on 16/07/13. -// Copyright (c) 2013 Fabiano Francesconi. All rights reserved. -// - -#import -#import -#import - -@interface FFCircularProgressView : UIView - -/** - * The progress of the view. - **/ -@property (nonatomic, assign) CGFloat progress; - -/** - * The width of the line used to draw the progress view. - **/ -@property (nonatomic, assign) CGFloat lineWidth; - -/** - * The color of the progress view - */ -@property (nonatomic, strong) UIColor *tintColor; - -/** - * The color of the tick view - */ -@property (nonatomic, strong) UIColor *tickColor; - -/** - * Icon view to be rendered instead of default arrow - */ -@property (nonatomic, strong) UIView* iconView; - -/** - * Bezier path to be rendered instead of icon view or default arrow - */ -@property (nonatomic, strong) UIBezierPath* iconPath; - -/** - * You can hide the icons which are shown during progress - */ -@property (readwrite) BOOL hideProgressIcons; - -/** - * Make the background layer to spin around its center. This should be called in the main thread. - */ -- (void) startSpinProgressBackgroundLayer; - -/** - * Stop the spinning of the background layer. This should be called in the main thread. - * WARN: This implementation remove all animations from background layer. - **/ -- (void) stopSpinProgressBackgroundLayer; - -@end diff --git a/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView.m b/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView.m deleted file mode 100644 index aeccec810..000000000 --- a/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView.m +++ /dev/null @@ -1,315 +0,0 @@ -// -// FFCircularProgressBar.m -// FFCircularProgressBar -// -// Created by Fabiano Francesconi on 16/07/13. -// Copyright (c) 2013 Fabiano Francesconi. All rights reserved. -// - -#import "FFCircularProgressView.h" -#import "UIColor+iOS7.h" - -@interface FFCircularProgressView() -@property (nonatomic, strong) CAShapeLayer *progressBackgroundLayer; -@property (nonatomic, strong) CAShapeLayer *progressLayer; -@property (nonatomic, strong) CAShapeLayer *iconLayer; - -@property (nonatomic, assign) BOOL isSpinning; -@end - -@implementation FFCircularProgressView - -#define kArrowSizeRatio .12 -#define kStopSizeRatio .3 -#define kTickWidthRatio .3 - -- (id)initWithFrame:(CGRect)frame -{ - self = [super initWithFrame:frame]; - if (self) { - [self setup]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if (self) { - [self setup]; - } - return self; -} - -- (void)setIconView:(UIView *)iconView -{ - if (_iconView) - { - [_iconView removeFromSuperview]; - } - - _iconView = iconView; - [self addSubview:_iconView]; -} - -- (void)setup { - - self.backgroundColor = [UIColor clearColor]; - - _lineWidth = fmaxf(self.frame.size.width * 0.025, 1.f); - _tintColor = [UIColor ios7Blue]; - _tickColor = [UIColor whiteColor]; - - self.progressBackgroundLayer = [CAShapeLayer layer]; - _progressBackgroundLayer.strokeColor = _tintColor.CGColor; - _progressBackgroundLayer.fillColor = self.backgroundColor.CGColor; - _progressBackgroundLayer.lineCap = kCALineCapRound; - _progressBackgroundLayer.lineWidth = _lineWidth; - [self.layer addSublayer:_progressBackgroundLayer]; - - self.progressLayer = [CAShapeLayer layer]; - _progressLayer.strokeColor = _tintColor.CGColor; - _progressLayer.fillColor = nil; - _progressLayer.lineCap = kCALineCapSquare; - _progressLayer.lineWidth = _lineWidth * 2.0; - [self.layer addSublayer:_progressLayer]; - - self.iconLayer = [CAShapeLayer layer]; - _iconLayer.strokeColor = _tintColor.CGColor; - _iconLayer.fillColor = nil; - _iconLayer.lineCap = kCALineCapButt; - _iconLayer.lineWidth = _lineWidth; - _iconLayer.fillRule = kCAFillRuleNonZero; - [self.layer addSublayer:_iconLayer]; -} - -- (void)setTintColor:(UIColor *)tintColor -{ - _tintColor = tintColor; - _progressBackgroundLayer.strokeColor = tintColor.CGColor; - _progressLayer.strokeColor = tintColor.CGColor; - _iconLayer.strokeColor = tintColor.CGColor; -} - -- (void)setTickColor:(UIColor *)tickColor -{ - _tickColor = tickColor; -} - -- (void)drawRect:(CGRect)rect -{ - // Make sure the layers cover the whole view - _progressBackgroundLayer.frame = self.bounds; - _progressLayer.frame = self.bounds; - _iconLayer.frame = self.bounds; - - CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); - CGFloat radius = (self.bounds.size.width - _lineWidth)/2; - - // Draw background - [self drawBackgroundCircle:_isSpinning]; - - // Draw progress - CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees - // CGFloat endAngle = (2 * (float)M_PI) + startAngle; - CGFloat endAngle = (self.progress * 2 * (float)M_PI) + startAngle; - UIBezierPath *processPath = [UIBezierPath bezierPath]; - processPath.lineCapStyle = kCGLineCapButt; - processPath.lineWidth = _lineWidth; - - radius = (self.bounds.size.width - _lineWidth*3) / 2.0; - [processPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; - - [_progressLayer setPath:processPath.CGPath]; - - if ([self progress] == 1.0) { - [self drawTick]; - } else if (([self progress] > 0) && [self progress] < 1.0) { - - if (!_hideProgressIcons) - [self drawStop]; - - } else { - if (!self.iconView && !self.iconPath) - { - if (!_hideProgressIcons) - [self drawArrow]; - } - else if (self.iconPath) - { - _iconLayer.path = self.iconPath.CGPath; - _iconLayer.fillColor = nil; - } - } -} - -#pragma mark - -#pragma mark Setters - -- (void)setLineWidth:(CGFloat)lineWidth { - _lineWidth = fmaxf(lineWidth, 1.f); - - _progressBackgroundLayer.lineWidth = _lineWidth; - _progressLayer.lineWidth = _lineWidth * 2.0; - _iconLayer.lineWidth = _lineWidth; -} - -#pragma mark - -#pragma mark Drawing - -- (void) drawBackgroundCircle:(BOOL) partial { - CGFloat startAngle = - ((float)M_PI / 2); // 90 degrees - CGFloat endAngle = (2 * (float)M_PI) + startAngle; - CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2); - CGFloat radius = (self.bounds.size.width - _lineWidth)/2; - - // Draw background - UIBezierPath *processBackgroundPath = [UIBezierPath bezierPath]; - processBackgroundPath.lineWidth = _lineWidth; - processBackgroundPath.lineCapStyle = kCGLineCapRound; - - // Recompute the end angle to make it at 90% of the progress - if (partial) { - endAngle = (1.8F * (float)M_PI) + startAngle; - } - - [processBackgroundPath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; - - _progressBackgroundLayer.path = processBackgroundPath.CGPath; -} - -- (void) drawTick { - CGFloat radius = MIN(self.frame.size.width, self.frame.size.height)/2; - - /* - First draw a tick that looks like this: - - A---F - | | - | E-------D - | | - B-----------C - - (Remember: (0,0) is top left) - */ - UIBezierPath *tickPath = [UIBezierPath bezierPath]; - CGFloat tickWidth = radius * kTickWidthRatio; - [tickPath moveToPoint:CGPointMake(0, 0)]; // A - [tickPath addLineToPoint:CGPointMake(0, tickWidth * 2)]; // B - [tickPath addLineToPoint:CGPointMake(tickWidth * 3, tickWidth * 2)]; // C - [tickPath addLineToPoint:CGPointMake(tickWidth * 3, tickWidth)]; // D - [tickPath addLineToPoint:CGPointMake(tickWidth, tickWidth)]; // E - [tickPath addLineToPoint:CGPointMake(tickWidth, 0)]; // F - [tickPath closePath]; - - // Now rotate it through -45 degrees... - [tickPath applyTransform:CGAffineTransformMakeRotation(-M_PI_4)]; - - // ...and move it into the right place. - [tickPath applyTransform:CGAffineTransformMakeTranslation(radius * .46, 1.02 * radius)]; - - [_iconLayer setPath:tickPath.CGPath]; - [_iconLayer setFillColor:self.tickColor.CGColor]; - [_progressBackgroundLayer setFillColor:_progressLayer.strokeColor]; -} - -- (void) drawStop { - CGFloat radius = (self.bounds.size.width)/2; - CGFloat ratio = kStopSizeRatio; - CGFloat sideSize = self.bounds.size.width * ratio; - - UIBezierPath *stopPath = [UIBezierPath bezierPath]; - [stopPath moveToPoint:CGPointMake(0, 0)]; - [stopPath addLineToPoint:CGPointMake(sideSize, 0.0)]; - [stopPath addLineToPoint:CGPointMake(sideSize, sideSize)]; - [stopPath addLineToPoint:CGPointMake(0.0, sideSize)]; - [stopPath closePath]; - - // ...and move it into the right place. - [stopPath applyTransform:CGAffineTransformMakeTranslation(radius * (1-ratio), radius* (1-ratio))]; - - [_iconLayer setPath:stopPath.CGPath]; - [_iconLayer setStrokeColor:_progressLayer.strokeColor]; - [_iconLayer setFillColor:self.tintColor.CGColor]; -} - -- (void) drawArrow { - CGFloat radius = (self.bounds.size.width)/2; - CGFloat ratio = kArrowSizeRatio; - CGFloat segmentSize = self.bounds.size.width * ratio; - - // Draw icon - - UIBezierPath *path = [UIBezierPath bezierPath]; - [path moveToPoint:CGPointMake(0.0, 0.0)]; - [path addLineToPoint:CGPointMake(segmentSize * 2.0, 0.0)]; - [path addLineToPoint:CGPointMake(segmentSize * 2.0, segmentSize)]; - [path addLineToPoint:CGPointMake(segmentSize * 3.0, segmentSize)]; - [path addLineToPoint:CGPointMake(segmentSize, segmentSize * 3.3)]; - [path addLineToPoint:CGPointMake(-segmentSize, segmentSize)]; - [path addLineToPoint:CGPointMake(0.0, segmentSize)]; - [path addLineToPoint:CGPointMake(0.0, 0.0)]; - [path closePath]; - - [path applyTransform:CGAffineTransformMakeTranslation(-segmentSize /2.0, -segmentSize / 1.2)]; - [path applyTransform:CGAffineTransformMakeTranslation(radius * (1-ratio), radius* (1-ratio))]; - _iconLayer.path = path.CGPath; - _iconLayer.fillColor = nil; -} - -#pragma mark Setters - -- (void)setProgress:(CGFloat)progress { - if (progress > 1.0) progress = 1.0; - - if (_progress != progress) { - _progress = progress; - - if (_progress == 1.0) { - [self animateProgressBackgroundLayerFillColor]; - } - - if (_progress == 0.0) { - _progressBackgroundLayer.fillColor = self.backgroundColor.CGColor; - } - - [self setNeedsDisplay]; - } -} - -#pragma mark Animations - -- (void) animateProgressBackgroundLayerFillColor { - CABasicAnimation *colorAnimation = [CABasicAnimation animationWithKeyPath:@"fillColor"]; - - colorAnimation.duration = .5; - colorAnimation.repeatCount = 1.0; - colorAnimation.removedOnCompletion = NO; - - colorAnimation.fromValue = (__bridge id) _progressBackgroundLayer.backgroundColor; - colorAnimation.toValue = (__bridge id) _progressLayer.strokeColor; - - colorAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; - - [_progressBackgroundLayer addAnimation:colorAnimation forKey:@"colorAnimation"]; -} - -- (void) startSpinProgressBackgroundLayer { - self.isSpinning = YES; - [self drawBackgroundCircle:YES]; - - CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; - rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0]; - rotationAnimation.duration = 1; - rotationAnimation.cumulative = YES; - rotationAnimation.repeatCount = HUGE_VALF; - [_progressBackgroundLayer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; -} - -- (void) stopSpinProgressBackgroundLayer { - [self drawBackgroundCircle:NO]; - - [_progressBackgroundLayer removeAllAnimations]; - self.isSpinning = NO; -} - -@end diff --git a/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/UIColor+iOS7.h b/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/UIColor+iOS7.h deleted file mode 100644 index 6e636a98c..000000000 --- a/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/UIColor+iOS7.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// UIColor+iOS7.h -// FFCircularProgressView -// -// Created by Fabiano Francesconi on 16/07/13. -// Copyright (c) 2013 Fabiano Francesconi. All rights reserved. -// - -#import - -@interface UIColor (iOS7) - -+ (UIColor *) ios7Blue; -+ (UIColor *) ios7Gray; - -@end diff --git a/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/UIColor+iOS7.m b/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/UIColor+iOS7.m deleted file mode 100644 index bf7b0ee51..000000000 --- a/Pods/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/UIColor+iOS7.m +++ /dev/null @@ -1,21 +0,0 @@ -// -// UIColor+iOS7.m -// FFCircularProgressView -// -// Created by Fabiano Francesconi on 16/07/13. -// Copyright (c) 2013 Fabiano Francesconi. All rights reserved. -// - -#import "UIColor+iOS7.h" - -@implementation UIColor (iOS7) - -+ (UIColor *) ios7Blue { - return [self colorWithRed:0 green:122/255.0 blue:1.0 alpha:1.0]; -} - -+ (UIColor *) ios7Gray { - return [self colorWithRed:181/255.0 green:182/255.0 blue:183/255.0 alpha:1.0]; -} - -@end diff --git a/Pods/FFCircularProgressView/LICENSE b/Pods/FFCircularProgressView/LICENSE deleted file mode 100644 index 3cdd0c8b6..000000000 --- a/Pods/FFCircularProgressView/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2013 Fabiano Francesconi - -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. \ No newline at end of file diff --git a/Pods/FFCircularProgressView/README.md b/Pods/FFCircularProgressView/README.md deleted file mode 100644 index e6b400cbc..000000000 --- a/Pods/FFCircularProgressView/README.md +++ /dev/null @@ -1,91 +0,0 @@ -FFCircularProgressView [![Build Status](https://travis-ci.org/elbryan/FFCircularProgressView.png?branch=master)](https://travis-ci.org/elbryan/FFCircularProgressView) -====================== - -FFCircularProgressView - An iOS 7-inspired blue circular progress view - -![ss1](https://raw.github.com/elbryan/FFCircularProgressView/master/Media/ss1.png) ![ss2](https://raw.github.com/elbryan/FFCircularProgressView/master/Media/ss2.png) ![ss3](https://raw.github.com/elbryan/FFCircularProgressView/master/Media/ss3.png) ![ss4](https://raw.github.com/elbryan/FFCircularProgressView/master/Media/ss4.png) - -This progress view is inspired by the new progress view in the App Store, iOS 7. Also the colors are taken from there. - -## See it in action - - [![sample](https://raw.github.com/elbryan/FFCircularProgressView/master/Media/sample.gif)](https://raw.github.com/elbryan/FFCircularProgressView/master/Media/sample.mov) - -## Requirements - -FFCircularProgressView works on iOS version > 5 and is compatible with both ARC and non-ARC projects. It depends on the following Apple frameworks, which should already be included with most Xcode templates: - -* Foundation.framework -* UIKit.framework -* CoreGraphics.framework -* QuartzCore.framework - -You will need LLVM 3.0 or later in order to build FFCircularProgressView. - -## Adding FFCircularProgressView to your project - -There are plenty of ways to add this view to your project. -Make sure you add the aforementioned frameworks to your project as well. - -### GIT submodule - -You have the canonical `git submodule` option. Simply issue `git submodule add https://github.com/elbryan/FFCircularProgressView.git ` in your root folder of your repository. - -### CocoaPods - -1. Add a pod entry to your [Podfile](https://github.com/CocoaPods/CocoaPods/wiki/A-Podfile) dependencies file such as `pod 'FFCircularProgressView', '>= 0.1'`. -2. Install the pod(s) by running `pod install`. -3. Import the progress view with `#import "FFCircularProgressView.h" wherever you need in your project. - -### Source files - -Manually add the source files to your project. The files you need are 'FFCircularProgressView.h', 'FFCircularProgressView.m', 'UIColor+iOS7.h', 'UIColor+iOS7.m'. - -## Usage - -Just use it as it is a normal UIProgressView. Make sure you set the progress value in the main thread ;) - -```objective-c -double delayInSeconds = 2.0; -dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); -dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{ - for (float i=0; i<1.1; i+=0.01F) { - dispatch_async(dispatch_get_main_queue(), ^{ - [circularProgressView setProgress:i]; - }); - usleep(10000); - } - }); -}); -``` - -You can also control the progress view spin animation by using the following two methods to start and stop the spinning, respectively: - -```objective-c -// Start spinning -[circularProgressView startSpinProgressBackgroundLayer]; - -// Stop spinning -[circularProgressView stopSpinProgressBackgroundLayer]; -``` - -## Acknowledgments - -The code to draw the tick has been adapted from [GSProgressView](https://github.com/goosoftware/GSProgressView/blob/master/GSProgressView.m). - -## License - -This code is distributed under the terms and conditions of the [MIT license](LICENSE). - -## Attributions - -I do not demand to be mentioned in your apps nor to receive any kind of compensation if you use this code. Yet, I would like to have feedbacks if you use it and you like it. - -Follow me on Twitter: [@elbryanlos](https://twitter.com/elbryanlos) - -## Android - -Are you an Android developer and you love this progress view? No problem! A couple of folks ported it to Android OS and you can get it [here](https://github.com/torryharris/TH-ProgressButton). - -Thank you guys! diff --git a/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h b/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h deleted file mode 100644 index f056c3b9e..000000000 --- a/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h +++ /dev/null @@ -1,84 +0,0 @@ -// -// FLAnimatedImage.h -// Flipboard -// -// Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2015 Flipboard. All rights reserved. -// - - -#import - -// Allow user classes conveniently just importing one header. -#import "FLAnimatedImageView.h" - - -#ifndef NS_DESIGNATED_INITIALIZER - #if __has_attribute(objc_designated_initializer) - #define NS_DESIGNATED_INITIALIZER __attribute((objc_designated_initializer)) - #else - #define NS_DESIGNATED_INITIALIZER - #endif -#endif - -extern const NSTimeInterval kFLAnimatedImageDelayTimeIntervalMinimum; - -// -// An `FLAnimatedImage`'s job is to deliver frames in a highly performant way and works in conjunction with `FLAnimatedImageView`. -// It subclasses `NSObject` and not `UIImage` because it's only an "image" in the sense that a sea lion is a lion. -// It tries to intelligently choose the frame cache size depending on the image and memory situation with the goal to lower CPU usage for smaller ones, lower memory usage for larger ones and always deliver frames for high performant play-back. -// Note: `posterImage`, `size`, `loopCount`, `delayTimes` and `frameCount` don't change after successful initialization. -// -@interface FLAnimatedImage : NSObject - -@property (nonatomic, strong, readonly) UIImage *posterImage; // Guaranteed to be loaded; usually equivalent to `-imageLazilyCachedAtIndex:0` -@property (nonatomic, assign, readonly) CGSize size; // The `.posterImage`'s `.size` - -@property (nonatomic, assign, readonly) NSUInteger loopCount; // 0 means repeating the animation indefinitely -@property (nonatomic, strong, readonly) NSDictionary *delayTimesForIndexes; // Of type `NSTimeInterval` boxed in `NSNumber`s -@property (nonatomic, assign, readonly) NSUInteger frameCount; // Number of valid frames; equal to `[.delayTimes count]` - -@property (nonatomic, assign, readonly) NSUInteger frameCacheSizeCurrent; // Current size of intelligently chosen buffer window; can range in the interval [1..frameCount] -@property (nonatomic, assign) NSUInteger frameCacheSizeMax; // Allow to cap the cache size; 0 means no specific limit (default) - -// Intended to be called from main thread synchronously; will return immediately. -// If the result isn't cached, will return `nil`; the caller should then pause playback, not increment frame counter and keep polling. -// After an initial loading time, depending on `frameCacheSize`, frames should be available immediately from the cache. -- (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index; - -// Pass either a `UIImage` or an `FLAnimatedImage` and get back its size -+ (CGSize)sizeForImage:(id)image; - -// On success, the initializers return an `FLAnimatedImage` with all fields initialized, on failure they return `nil` and an error will be logged. -- (instancetype)initWithAnimatedGIFData:(NSData *)data; -// Pass 0 for optimalFrameCacheSize to get the default, predrawing is enabled by default. -- (instancetype)initWithAnimatedGIFData:(NSData *)data optimalFrameCacheSize:(NSUInteger)optimalFrameCacheSize predrawingEnabled:(BOOL)isPredrawingEnabled NS_DESIGNATED_INITIALIZER; -+ (instancetype)animatedImageWithGIFData:(NSData *)data; - -@property (nonatomic, strong, readonly) NSData *data; // The data the receiver was initialized with; read-only - -@end - -typedef NS_ENUM(NSUInteger, FLLogLevel) { - FLLogLevelNone = 0, - FLLogLevelError, - FLLogLevelWarn, - FLLogLevelInfo, - FLLogLevelDebug, - FLLogLevelVerbose -}; - -@interface FLAnimatedImage (Logging) - -+ (void)setLogBlock:(void (^)(NSString *logString, FLLogLevel logLevel))logBlock logLevel:(FLLogLevel)logLevel; -+ (void)logStringFromBlock:(NSString *(^)(void))stringBlock withLevel:(FLLogLevel)level; - -@end - -#define FLLog(logLevel, format, ...) [FLAnimatedImage logStringFromBlock:^NSString *{ return [NSString stringWithFormat:(format), ## __VA_ARGS__]; } withLevel:(logLevel)] - -@interface FLWeakProxy : NSProxy - -+ (instancetype)weakProxyForObject:(id)targetObject; - -@end diff --git a/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m b/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m deleted file mode 100755 index 3fdddc969..000000000 --- a/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.m +++ /dev/null @@ -1,816 +0,0 @@ -// -// FLAnimatedImage.m -// Flipboard -// -// Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2015 Flipboard. All rights reserved. -// - - -#import "FLAnimatedImage.h" -#import -#import - - -// From vm_param.h, define for iOS 8.0 or higher to build on device. -#ifndef BYTE_SIZE - #define BYTE_SIZE 8 // byte size in bits -#endif - -#define MEGABYTE (1024 * 1024) - -// This is how the fastest browsers do it as per 2012: http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser-compatibility -const NSTimeInterval kFLAnimatedImageDelayTimeIntervalMinimum = 0.02; - -// An animated image's data size (dimensions * frameCount) category; its value is the max allowed memory (in MB). -// E.g.: A 100x200px GIF with 30 frames is ~2.3MB in our pixel format and would fall into the `FLAnimatedImageDataSizeCategoryAll` category. -typedef NS_ENUM(NSUInteger, FLAnimatedImageDataSizeCategory) { - FLAnimatedImageDataSizeCategoryAll = 10, // All frames permanently in memory (be nice to the CPU) - FLAnimatedImageDataSizeCategoryDefault = 75, // A frame cache of default size in memory (usually real-time performance and keeping low memory profile) - FLAnimatedImageDataSizeCategoryOnDemand = 250, // Only keep one frame at the time in memory (easier on memory, slowest performance) - FLAnimatedImageDataSizeCategoryUnsupported // Even for one frame too large, computer says no. -}; - -typedef NS_ENUM(NSUInteger, FLAnimatedImageFrameCacheSize) { - FLAnimatedImageFrameCacheSizeNoLimit = 0, // 0 means no specific limit - FLAnimatedImageFrameCacheSizeLowMemory = 1, // The minimum frame cache size; this will produce frames on-demand. - FLAnimatedImageFrameCacheSizeGrowAfterMemoryWarning = 2, // If we can produce the frames faster than we consume, one frame ahead will already result in a stutter-free playback. - FLAnimatedImageFrameCacheSizeDefault = 5 // Build up a comfy buffer window to cope with CPU hiccups etc. -}; - - -#if defined(DEBUG) && DEBUG -@protocol FLAnimatedImageDebugDelegate -@optional -- (void)debug_animatedImage:(FLAnimatedImage *)animatedImage didUpdateCachedFrames:(NSIndexSet *)indexesOfFramesInCache; -- (void)debug_animatedImage:(FLAnimatedImage *)animatedImage didRequestCachedFrame:(NSUInteger)index; -- (CGFloat)debug_animatedImagePredrawingSlowdownFactor:(FLAnimatedImage *)animatedImage; -@end -#endif - - -@interface FLAnimatedImage () - -@property (nonatomic, assign, readonly) NSUInteger frameCacheSizeOptimal; // The optimal number of frames to cache based on image size & number of frames; never changes -@property (nonatomic, assign, readonly, getter=isPredrawingEnabled) BOOL predrawingEnabled; // Enables predrawing of images to improve performance. -@property (nonatomic, assign) NSUInteger frameCacheSizeMaxInternal; // Allow to cap the cache size e.g. when memory warnings occur; 0 means no specific limit (default) -@property (nonatomic, assign) NSUInteger requestedFrameIndex; // Most recently requested frame index -@property (nonatomic, assign, readonly) NSUInteger posterImageFrameIndex; // Index of non-purgable poster image; never changes -@property (nonatomic, strong, readonly) NSMutableDictionary *cachedFramesForIndexes; -@property (nonatomic, strong, readonly) NSMutableIndexSet *cachedFrameIndexes; // Indexes of cached frames -@property (nonatomic, strong, readonly) NSMutableIndexSet *requestedFrameIndexes; // Indexes of frames that are currently produced in the background -@property (nonatomic, strong, readonly) NSIndexSet *allFramesIndexSet; // Default index set with the full range of indexes; never changes -@property (nonatomic, assign) NSUInteger memoryWarningCount; -@property (nonatomic, strong, readonly) dispatch_queue_t serialQueue; -@property (nonatomic, strong, readonly) __attribute__((NSObject)) CGImageSourceRef imageSource; - -// The weak proxy is used to break retain cycles with delayed actions from memory warnings. -// We are lying about the actual type here to gain static type checking and eliminate casts. -// The actual type of the object is `FLWeakProxy`. -@property (nonatomic, strong, readonly) FLAnimatedImage *weakProxy; - -#if defined(DEBUG) && DEBUG -@property (nonatomic, weak) id debug_delegate; -#endif - -@end - - -// For custom dispatching of memory warnings to avoid deallocation races since NSNotificationCenter doesn't retain objects it is notifying. -static NSHashTable *allAnimatedImagesWeak; - -@implementation FLAnimatedImage - -#pragma mark - Accessors -#pragma mark Public - -// This is the definite value the frame cache needs to size itself to. -- (NSUInteger)frameCacheSizeCurrent -{ - NSUInteger frameCacheSizeCurrent = self.frameCacheSizeOptimal; - - // If set, respect the caps. - if (self.frameCacheSizeMax > FLAnimatedImageFrameCacheSizeNoLimit) { - frameCacheSizeCurrent = MIN(frameCacheSizeCurrent, self.frameCacheSizeMax); - } - - if (self.frameCacheSizeMaxInternal > FLAnimatedImageFrameCacheSizeNoLimit) { - frameCacheSizeCurrent = MIN(frameCacheSizeCurrent, self.frameCacheSizeMaxInternal); - } - - return frameCacheSizeCurrent; -} - - -- (void)setFrameCacheSizeMax:(NSUInteger)frameCacheSizeMax -{ - if (_frameCacheSizeMax != frameCacheSizeMax) { - - // Remember whether the new cap will cause the current cache size to shrink; then we'll make sure to purge from the cache if needed. - BOOL willFrameCacheSizeShrink = (frameCacheSizeMax < self.frameCacheSizeCurrent); - - // Update the value - _frameCacheSizeMax = frameCacheSizeMax; - - if (willFrameCacheSizeShrink) { - [self purgeFrameCacheIfNeeded]; - } - } -} - - -#pragma mark Private - -- (void)setFrameCacheSizeMaxInternal:(NSUInteger)frameCacheSizeMaxInternal -{ - if (_frameCacheSizeMaxInternal != frameCacheSizeMaxInternal) { - - // Remember whether the new cap will cause the current cache size to shrink; then we'll make sure to purge from the cache if needed. - BOOL willFrameCacheSizeShrink = (frameCacheSizeMaxInternal < self.frameCacheSizeCurrent); - - // Update the value - _frameCacheSizeMaxInternal = frameCacheSizeMaxInternal; - - if (willFrameCacheSizeShrink) { - [self purgeFrameCacheIfNeeded]; - } - } -} - - -#pragma mark - Life Cycle - -+ (void)initialize -{ - if (self == [FLAnimatedImage class]) { - // UIKit memory warning notification handler shared by all of the instances - allAnimatedImagesWeak = [NSHashTable weakObjectsHashTable]; - - [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:nil usingBlock:^(NSNotification *note) { - // UIKit notifications are posted on the main thread. didReceiveMemoryWarning: is expecting the main run loop, and we don't lock on allAnimatedImagesWeak - NSAssert([NSThread isMainThread], @"Received memory warning on non-main thread"); - // Get a strong reference to all of the images. If an instance is returned in this array, it is still live and has not entered dealloc. - // Note that FLAnimatedImages can be created on any thread, so the hash table must be locked. - NSArray *images = nil; - @synchronized(allAnimatedImagesWeak) { - images = [[allAnimatedImagesWeak allObjects] copy]; - } - // Now issue notifications to all of the images while holding a strong reference to them - [images makeObjectsPerformSelector:@selector(didReceiveMemoryWarning:) withObject:note]; - }]; - } -} - - -- (instancetype)init -{ - FLAnimatedImage *animatedImage = [self initWithAnimatedGIFData:nil]; - if (!animatedImage) { - FLLog(FLLogLevelError, @"Use `-initWithAnimatedGIFData:` and supply the animated GIF data as an argument to initialize an object of type `FLAnimatedImage`."); - } - return animatedImage; -} - - -- (instancetype)initWithAnimatedGIFData:(NSData *)data -{ - return [self initWithAnimatedGIFData:data optimalFrameCacheSize:0 predrawingEnabled:YES]; -} - -- (instancetype)initWithAnimatedGIFData:(NSData *)data optimalFrameCacheSize:(NSUInteger)optimalFrameCacheSize predrawingEnabled:(BOOL)isPredrawingEnabled -{ - // Early return if no data supplied! - BOOL hasData = ([data length] > 0); - if (!hasData) { - FLLog(FLLogLevelError, @"No animated GIF data supplied."); - return nil; - } - - self = [super init]; - if (self) { - // Do one-time initializations of `readonly` properties directly to ivar to prevent implicit actions and avoid need for private `readwrite` property overrides. - - // Keep a strong reference to `data` and expose it read-only publicly. - // However, we will use the `_imageSource` as handler to the image data throughout our life cycle. - _data = data; - _predrawingEnabled = isPredrawingEnabled; - - // Initialize internal data structures - _cachedFramesForIndexes = [[NSMutableDictionary alloc] init]; - _cachedFrameIndexes = [[NSMutableIndexSet alloc] init]; - _requestedFrameIndexes = [[NSMutableIndexSet alloc] init]; - - // Note: We could leverage `CGImageSourceCreateWithURL` too to add a second initializer `-initWithAnimatedGIFContentsOfURL:`. - _imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)data, - (__bridge CFDictionaryRef)@{(NSString *)kCGImageSourceShouldCache: @NO}); - // Early return on failure! - if (!_imageSource) { - FLLog(FLLogLevelError, @"Failed to `CGImageSourceCreateWithData` for animated GIF data %@", data); - return nil; - } - - // Early return if not GIF! - CFStringRef imageSourceContainerType = CGImageSourceGetType(_imageSource); - BOOL isGIFData = UTTypeConformsTo(imageSourceContainerType, kUTTypeGIF); - if (!isGIFData) { - FLLog(FLLogLevelError, @"Supplied data is of type %@ and doesn't seem to be GIF data %@", imageSourceContainerType, data); - return nil; - } - - // Get `LoopCount` - // Note: 0 means repeating the animation indefinitely. - // Image properties example: - // { - // FileSize = 314446; - // "{GIF}" = { - // HasGlobalColorMap = 1; - // LoopCount = 0; - // }; - // } - NSDictionary *imageProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyProperties(_imageSource, NULL); - _loopCount = [[[imageProperties objectForKey:(id)kCGImagePropertyGIFDictionary] objectForKey:(id)kCGImagePropertyGIFLoopCount] unsignedIntegerValue]; - - // Iterate through frame images - size_t imageCount = CGImageSourceGetCount(_imageSource); - NSUInteger skippedFrameCount = 0; - NSMutableDictionary *delayTimesForIndexesMutable = [NSMutableDictionary dictionaryWithCapacity:imageCount]; - for (size_t i = 0; i < imageCount; i++) { - @autoreleasepool { - CGImageRef frameImageRef = CGImageSourceCreateImageAtIndex(_imageSource, i, NULL); - if (frameImageRef) { - UIImage *frameImage = [UIImage imageWithCGImage:frameImageRef]; - // Check for valid `frameImage` before parsing its properties as frames can be corrupted (and `frameImage` even `nil` when `frameImageRef` was valid). - if (frameImage) { - // Set poster image - if (!self.posterImage) { - _posterImage = frameImage; - // Set its size to proxy our size. - _size = _posterImage.size; - // Remember index of poster image so we never purge it; also add it to the cache. - _posterImageFrameIndex = i; - [self.cachedFramesForIndexes setObject:self.posterImage forKey:@(self.posterImageFrameIndex)]; - [self.cachedFrameIndexes addIndex:self.posterImageFrameIndex]; - } - - // Get `DelayTime` - // Note: It's not in (1/100) of a second like still falsely described in the documentation as per iOS 8 (rdar://19507384) but in seconds stored as `kCFNumberFloat32Type`. - // Frame properties example: - // { - // ColorModel = RGB; - // Depth = 8; - // PixelHeight = 960; - // PixelWidth = 640; - // "{GIF}" = { - // DelayTime = "0.4"; - // UnclampedDelayTime = "0.4"; - // }; - // } - - NSDictionary *frameProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(_imageSource, i, NULL); - NSDictionary *framePropertiesGIF = [frameProperties objectForKey:(id)kCGImagePropertyGIFDictionary]; - - // Try to use the unclamped delay time; fall back to the normal delay time. - NSNumber *delayTime = [framePropertiesGIF objectForKey:(id)kCGImagePropertyGIFUnclampedDelayTime]; - if (!delayTime) { - delayTime = [framePropertiesGIF objectForKey:(id)kCGImagePropertyGIFDelayTime]; - } - // If we don't get a delay time from the properties, fall back to `kDelayTimeIntervalDefault` or carry over the preceding frame's value. - const NSTimeInterval kDelayTimeIntervalDefault = 0.1; - if (!delayTime) { - if (i == 0) { - FLLog(FLLogLevelInfo, @"Falling back to default delay time for first frame %@ because none found in GIF properties %@", frameImage, frameProperties); - delayTime = @(kDelayTimeIntervalDefault); - } else { - FLLog(FLLogLevelInfo, @"Falling back to preceding delay time for frame %zu %@ because none found in GIF properties %@", i, frameImage, frameProperties); - delayTime = delayTimesForIndexesMutable[@(i - 1)]; - } - } - // Support frame delays as low as `kFLAnimatedImageDelayTimeIntervalMinimum`, with anything below being rounded up to `kDelayTimeIntervalDefault` for legacy compatibility. - // To support the minimum even when rounding errors occur, use an epsilon when comparing. We downcast to float because that's what we get for delayTime from ImageIO. - if ([delayTime floatValue] < ((float)kFLAnimatedImageDelayTimeIntervalMinimum - FLT_EPSILON)) { - FLLog(FLLogLevelInfo, @"Rounding frame %zu's `delayTime` from %f up to default %f (minimum supported: %f).", i, [delayTime floatValue], kDelayTimeIntervalDefault, kFLAnimatedImageDelayTimeIntervalMinimum); - delayTime = @(kDelayTimeIntervalDefault); - } - delayTimesForIndexesMutable[@(i)] = delayTime; - } else { - skippedFrameCount++; - FLLog(FLLogLevelInfo, @"Dropping frame %zu because valid `CGImageRef` %@ did result in `nil`-`UIImage`.", i, frameImageRef); - } - CFRelease(frameImageRef); - } else { - skippedFrameCount++; - FLLog(FLLogLevelInfo, @"Dropping frame %zu because failed to `CGImageSourceCreateImageAtIndex` with image source %@", i, _imageSource); - } - } - } - _delayTimesForIndexes = [delayTimesForIndexesMutable copy]; - _frameCount = imageCount; - - if (self.frameCount == 0) { - FLLog(FLLogLevelInfo, @"Failed to create any valid frames for GIF with properties %@", imageProperties); - return nil; - } else if (self.frameCount == 1) { - // Warn when we only have a single frame but return a valid GIF. - FLLog(FLLogLevelInfo, @"Created valid GIF but with only a single frame. Image properties: %@", imageProperties); - } else { - // We have multiple frames, rock on! - } - - // If no value is provided, select a default based on the GIF. - if (optimalFrameCacheSize == 0) { - // Calculate the optimal frame cache size: try choosing a larger buffer window depending on the predicted image size. - // It's only dependent on the image size & number of frames and never changes. - CGFloat animatedImageDataSize = CGImageGetBytesPerRow(self.posterImage.CGImage) * self.size.height * (self.frameCount - skippedFrameCount) / MEGABYTE; - if (animatedImageDataSize <= FLAnimatedImageDataSizeCategoryAll) { - _frameCacheSizeOptimal = self.frameCount; - } else if (animatedImageDataSize <= FLAnimatedImageDataSizeCategoryDefault) { - // This value doesn't depend on device memory much because if we're not keeping all frames in memory we will always be decoding 1 frame up ahead per 1 frame that gets played and at this point we might as well just keep a small buffer just large enough to keep from running out of frames. - _frameCacheSizeOptimal = FLAnimatedImageFrameCacheSizeDefault; - } else { - // The predicted size exceeds the limits to build up a cache and we go into low memory mode from the beginning. - _frameCacheSizeOptimal = FLAnimatedImageFrameCacheSizeLowMemory; - } - } else { - // Use the provided value. - _frameCacheSizeOptimal = optimalFrameCacheSize; - } - // In any case, cap the optimal cache size at the frame count. - _frameCacheSizeOptimal = MIN(_frameCacheSizeOptimal, self.frameCount); - - // Convenience/minor performance optimization; keep an index set handy with the full range to return in `-frameIndexesToCache`. - _allFramesIndexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(0, self.frameCount)]; - - // See the property declarations for descriptions. - _weakProxy = (id)[FLWeakProxy weakProxyForObject:self]; - - // Register this instance in the weak table for memory notifications. The NSHashTable will clean up after itself when we're gone. - // Note that FLAnimatedImages can be created on any thread, so the hash table must be locked. - @synchronized(allAnimatedImagesWeak) { - [allAnimatedImagesWeak addObject:self]; - } - } - return self; -} - - -+ (instancetype)animatedImageWithGIFData:(NSData *)data -{ - FLAnimatedImage *animatedImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:data]; - return animatedImage; -} - - -- (void)dealloc -{ - if (_weakProxy) { - [NSObject cancelPreviousPerformRequestsWithTarget:_weakProxy]; - } - - if (_imageSource) { - CFRelease(_imageSource); - } -} - - -#pragma mark - Public Methods - -// See header for more details. -// Note: both consumer and producer are throttled: consumer by frame timings and producer by the available memory (max buffer window size). -- (UIImage *)imageLazilyCachedAtIndex:(NSUInteger)index -{ - // Early return if the requested index is beyond bounds. - // Note: We're comparing an index with a count and need to bail on greater than or equal to. - if (index >= self.frameCount) { - FLLog(FLLogLevelWarn, @"Skipping requested frame %lu beyond bounds (total frame count: %lu) for animated image: %@", (unsigned long)index, (unsigned long)self.frameCount, self); - return nil; - } - - // Remember requested frame index, this influences what we should cache next. - self.requestedFrameIndex = index; -#if defined(DEBUG) && DEBUG - if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImage:didRequestCachedFrame:)]) { - [self.debug_delegate debug_animatedImage:self didRequestCachedFrame:index]; - } -#endif - - // Quick check to avoid doing any work if we already have all possible frames cached, a common case. - if ([self.cachedFrameIndexes count] < self.frameCount) { - // If we have frames that should be cached but aren't and aren't requested yet, request them. - // Exclude existing cached frames, frames already requested, and specially cached poster image. - NSMutableIndexSet *frameIndexesToAddToCacheMutable = [self frameIndexesToCache]; - [frameIndexesToAddToCacheMutable removeIndexes:self.cachedFrameIndexes]; - [frameIndexesToAddToCacheMutable removeIndexes:self.requestedFrameIndexes]; - [frameIndexesToAddToCacheMutable removeIndex:self.posterImageFrameIndex]; - NSIndexSet *frameIndexesToAddToCache = [frameIndexesToAddToCacheMutable copy]; - - // Asynchronously add frames to our cache. - if ([frameIndexesToAddToCache count] > 0) { - [self addFrameIndexesToCache:frameIndexesToAddToCache]; - } - } - - // Get the specified image. - UIImage *image = self.cachedFramesForIndexes[@(index)]; - - // Purge if needed based on the current playhead position. - [self purgeFrameCacheIfNeeded]; - - return image; -} - - -// Only called once from `-imageLazilyCachedAtIndex` but factored into its own method for logical grouping. -- (void)addFrameIndexesToCache:(NSIndexSet *)frameIndexesToAddToCache -{ - // Order matters. First, iterate over the indexes starting from the requested frame index. - // Then, if there are any indexes before the requested frame index, do those. - NSRange firstRange = NSMakeRange(self.requestedFrameIndex, self.frameCount - self.requestedFrameIndex); - NSRange secondRange = NSMakeRange(0, self.requestedFrameIndex); - if (firstRange.length + secondRange.length != self.frameCount) { - FLLog(FLLogLevelWarn, @"Two-part frame cache range doesn't equal full range."); - } - - // Add to the requested list before we actually kick them off, so they don't get into the queue twice. - [self.requestedFrameIndexes addIndexes:frameIndexesToAddToCache]; - - // Lazily create dedicated isolation queue. - if (!self.serialQueue) { - _serialQueue = dispatch_queue_create("com.flipboard.framecachingqueue", DISPATCH_QUEUE_SERIAL); - } - - // Start streaming requested frames in the background into the cache. - // Avoid capturing self in the block as there's no reason to keep doing work if the animated image went away. - FLAnimatedImage * __weak weakSelf = self; - dispatch_async(self.serialQueue, ^{ - // Produce and cache next needed frame. - void (^frameRangeBlock)(NSRange, BOOL *) = ^(NSRange range, BOOL *stop) { - // Iterate through contiguous indexes; can be faster than `enumerateIndexesInRange:options:usingBlock:`. - for (NSUInteger i = range.location; i < NSMaxRange(range); i++) { -#if defined(DEBUG) && DEBUG - CFTimeInterval predrawBeginTime = CACurrentMediaTime(); -#endif - UIImage *image = [weakSelf imageAtIndex:i]; -#if defined(DEBUG) && DEBUG - CFTimeInterval predrawDuration = CACurrentMediaTime() - predrawBeginTime; - CFTimeInterval slowdownDuration = 0.0; - if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImagePredrawingSlowdownFactor:)]) { - CGFloat predrawingSlowdownFactor = [self.debug_delegate debug_animatedImagePredrawingSlowdownFactor:self]; - slowdownDuration = predrawDuration * predrawingSlowdownFactor - predrawDuration; - [NSThread sleepForTimeInterval:slowdownDuration]; - } - FLLog(FLLogLevelVerbose, @"Predrew frame %lu in %f ms for animated image: %@", (unsigned long)i, (predrawDuration + slowdownDuration) * 1000, self); -#endif - // The results get returned one by one as soon as they're ready (and not in batch). - // The benefits of having the first frames as quick as possible outweigh building up a buffer to cope with potential hiccups when the CPU suddenly gets busy. - if (image && weakSelf) { - dispatch_async(dispatch_get_main_queue(), ^{ - weakSelf.cachedFramesForIndexes[@(i)] = image; - [weakSelf.cachedFrameIndexes addIndex:i]; - [weakSelf.requestedFrameIndexes removeIndex:i]; -#if defined(DEBUG) && DEBUG - if ([weakSelf.debug_delegate respondsToSelector:@selector(debug_animatedImage:didUpdateCachedFrames:)]) { - [weakSelf.debug_delegate debug_animatedImage:weakSelf didUpdateCachedFrames:weakSelf.cachedFrameIndexes]; - } -#endif - }); - } - } - }; - - [frameIndexesToAddToCache enumerateRangesInRange:firstRange options:0 usingBlock:frameRangeBlock]; - [frameIndexesToAddToCache enumerateRangesInRange:secondRange options:0 usingBlock:frameRangeBlock]; - }); -} - - -+ (CGSize)sizeForImage:(id)image -{ - CGSize imageSize = CGSizeZero; - - // Early return for nil - if (!image) { - return imageSize; - } - - if ([image isKindOfClass:[UIImage class]]) { - UIImage *uiImage = (UIImage *)image; - imageSize = uiImage.size; - } else if ([image isKindOfClass:[FLAnimatedImage class]]) { - FLAnimatedImage *animatedImage = (FLAnimatedImage *)image; - imageSize = animatedImage.size; - } else { - // Bear trap to capture bad images; we have seen crashers cropping up on iOS 7. - FLLog(FLLogLevelError, @"`image` isn't of expected types `UIImage` or `FLAnimatedImage`: %@", image); - } - - return imageSize; -} - - -#pragma mark - Private Methods -#pragma mark Frame Loading - -- (UIImage *)imageAtIndex:(NSUInteger)index -{ - // It's very important to use the cached `_imageSource` since the random access to a frame with `CGImageSourceCreateImageAtIndex` turns from an O(1) into an O(n) operation when re-initializing the image source every time. - CGImageRef imageRef = CGImageSourceCreateImageAtIndex(_imageSource, index, NULL); - - // Early return for nil - if (!imageRef) { - return nil; - } - - UIImage *image = [UIImage imageWithCGImage:imageRef]; - CFRelease(imageRef); - - // Loading in the image object is only half the work, the displaying image view would still have to synchronosly wait and decode the image, so we go ahead and do that here on the background thread. - if (self.isPredrawingEnabled) { - image = [[self class] predrawnImageFromImage:image]; - } - - return image; -} - - -#pragma mark Frame Caching - -- (NSMutableIndexSet *)frameIndexesToCache -{ - NSMutableIndexSet *indexesToCache = nil; - // Quick check to avoid building the index set if the number of frames to cache equals the total frame count. - if (self.frameCacheSizeCurrent == self.frameCount) { - indexesToCache = [self.allFramesIndexSet mutableCopy]; - } else { - indexesToCache = [[NSMutableIndexSet alloc] init]; - - // Add indexes to the set in two separate blocks- the first starting from the requested frame index, up to the limit or the end. - // The second, if needed, the remaining number of frames beginning at index zero. - NSUInteger firstLength = MIN(self.frameCacheSizeCurrent, self.frameCount - self.requestedFrameIndex); - NSRange firstRange = NSMakeRange(self.requestedFrameIndex, firstLength); - [indexesToCache addIndexesInRange:firstRange]; - NSUInteger secondLength = self.frameCacheSizeCurrent - firstLength; - if (secondLength > 0) { - NSRange secondRange = NSMakeRange(0, secondLength); - [indexesToCache addIndexesInRange:secondRange]; - } - // Double check our math, before we add the poster image index which may increase it by one. - if ([indexesToCache count] != self.frameCacheSizeCurrent) { - FLLog(FLLogLevelWarn, @"Number of frames to cache doesn't equal expected cache size."); - } - - [indexesToCache addIndex:self.posterImageFrameIndex]; - } - - return indexesToCache; -} - - -- (void)purgeFrameCacheIfNeeded -{ - // Purge frames that are currently cached but don't need to be. - // But not if we're still under the number of frames to cache. - // This way, if all frames are allowed to be cached (the common case), we can skip all the `NSIndexSet` math below. - if ([self.cachedFrameIndexes count] > self.frameCacheSizeCurrent) { - NSMutableIndexSet *indexesToPurge = [self.cachedFrameIndexes mutableCopy]; - [indexesToPurge removeIndexes:[self frameIndexesToCache]]; - [indexesToPurge enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { - // Iterate through contiguous indexes; can be faster than `enumerateIndexesInRange:options:usingBlock:`. - for (NSUInteger i = range.location; i < NSMaxRange(range); i++) { - [self.cachedFrameIndexes removeIndex:i]; - [self.cachedFramesForIndexes removeObjectForKey:@(i)]; - // Note: Don't `CGImageSourceRemoveCacheAtIndex` on the image source for frames that we don't want cached any longer to maintain O(1) time access. -#if defined(DEBUG) && DEBUG - if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImage:didUpdateCachedFrames:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self.debug_delegate debug_animatedImage:self didUpdateCachedFrames:self.cachedFrameIndexes]; - }); - } -#endif - } - }]; - } -} - - -- (void)growFrameCacheSizeAfterMemoryWarning:(NSNumber *)frameCacheSize -{ - self.frameCacheSizeMaxInternal = [frameCacheSize unsignedIntegerValue]; - FLLog(FLLogLevelDebug, @"Grew frame cache size max to %lu after memory warning for animated image: %@", (unsigned long)self.frameCacheSizeMaxInternal, self); - - // Schedule resetting the frame cache size max completely after a while. - const NSTimeInterval kResetDelay = 3.0; - [self.weakProxy performSelector:@selector(resetFrameCacheSizeMaxInternal) withObject:nil afterDelay:kResetDelay]; -} - - -- (void)resetFrameCacheSizeMaxInternal -{ - self.frameCacheSizeMaxInternal = FLAnimatedImageFrameCacheSizeNoLimit; - FLLog(FLLogLevelDebug, @"Reset frame cache size max (current frame cache size: %lu) for animated image: %@", (unsigned long)self.frameCacheSizeCurrent, self); -} - - -#pragma mark System Memory Warnings Notification Handler - -- (void)didReceiveMemoryWarning:(NSNotification *)notification -{ - self.memoryWarningCount++; - - // If we were about to grow larger, but got rapped on our knuckles by the system again, cancel. - [NSObject cancelPreviousPerformRequestsWithTarget:self.weakProxy selector:@selector(growFrameCacheSizeAfterMemoryWarning:) object:@(FLAnimatedImageFrameCacheSizeGrowAfterMemoryWarning)]; - [NSObject cancelPreviousPerformRequestsWithTarget:self.weakProxy selector:@selector(resetFrameCacheSizeMaxInternal) object:nil]; - - // Go down to the minimum and by that implicitly immediately purge from the cache if needed to not get jettisoned by the system and start producing frames on-demand. - FLLog(FLLogLevelDebug, @"Attempt setting frame cache size max to %lu (previous was %lu) after memory warning #%lu for animated image: %@", (unsigned long)FLAnimatedImageFrameCacheSizeLowMemory, (unsigned long)self.frameCacheSizeMaxInternal, (unsigned long)self.memoryWarningCount, self); - self.frameCacheSizeMaxInternal = FLAnimatedImageFrameCacheSizeLowMemory; - - // Schedule growing larger again after a while, but cap our attempts to prevent a periodic sawtooth wave (ramps upward and then sharply drops) of memory usage. - // - // [mem]^ (2) (5) (6) 1) Loading frames for the first time - // (*)| , , , 2) Mem warning #1; purge cache - // | /| (4)/| /| 3) Grow cache size a bit after a while, if no mem warning occurs - // | / | _/ | _/ | 4) Try to grow cache size back to optimum after a while, if no mem warning occurs - // |(1)/ |_/ |/ |__(7) 5) Mem warning #2; purge cache - // |__/ (3) 6) After repetition of (3) and (4), mem warning #3; purge cache - // +----------------------> 7) After 3 mem warnings, stay at minimum cache size - // [t] - // *) The mem high water mark before we get warned might change for every cycle. - // - const NSUInteger kGrowAttemptsMax = 2; - const NSTimeInterval kGrowDelay = 2.0; - if ((self.memoryWarningCount - 1) <= kGrowAttemptsMax) { - [self.weakProxy performSelector:@selector(growFrameCacheSizeAfterMemoryWarning:) withObject:@(FLAnimatedImageFrameCacheSizeGrowAfterMemoryWarning) afterDelay:kGrowDelay]; - } - - // Note: It's not possible to get the level of a memory warning with a public API: http://stackoverflow.com/questions/2915247/iphone-os-memory-warnings-what-do-the-different-levels-mean/2915477#2915477 -} - - -#pragma mark Image Decoding - -// Decodes the image's data and draws it off-screen fully in memory; it's thread-safe and hence can be called on a background thread. -// On success, the returned object is a new `UIImage` instance with the same content as the one passed in. -// On failure, the returned object is the unchanged passed in one; the data will not be predrawn in memory though and an error will be logged. -// First inspired by & good Karma to: https://gist.github.com/steipete/1144242 -+ (UIImage *)predrawnImageFromImage:(UIImage *)imageToPredraw -{ - // Always use a device RGB color space for simplicity and predictability what will be going on. - CGColorSpaceRef colorSpaceDeviceRGBRef = CGColorSpaceCreateDeviceRGB(); - // Early return on failure! - if (!colorSpaceDeviceRGBRef) { - FLLog(FLLogLevelError, @"Failed to `CGColorSpaceCreateDeviceRGB` for image %@", imageToPredraw); - return imageToPredraw; - } - - // Even when the image doesn't have transparency, we have to add the extra channel because Quartz doesn't support other pixel formats than 32 bpp/8 bpc for RGB: - // kCGImageAlphaNoneSkipFirst, kCGImageAlphaNoneSkipLast, kCGImageAlphaPremultipliedFirst, kCGImageAlphaPremultipliedLast - // (source: docs "Quartz 2D Programming Guide > Graphics Contexts > Table 2-1 Pixel formats supported for bitmap graphics contexts") - size_t numberOfComponents = CGColorSpaceGetNumberOfComponents(colorSpaceDeviceRGBRef) + 1; // 4: RGB + A - - // "In iOS 4.0 and later, and OS X v10.6 and later, you can pass NULL if you want Quartz to allocate memory for the bitmap." (source: docs) - void *data = NULL; - size_t width = imageToPredraw.size.width; - size_t height = imageToPredraw.size.height; - size_t bitsPerComponent = CHAR_BIT; - - size_t bitsPerPixel = (bitsPerComponent * numberOfComponents); - size_t bytesPerPixel = (bitsPerPixel / BYTE_SIZE); - size_t bytesPerRow = (bytesPerPixel * width); - - CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; - - CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageToPredraw.CGImage); - // If the alpha info doesn't match to one of the supported formats (see above), pick a reasonable supported one. - // "For bitmaps created in iOS 3.2 and later, the drawing environment uses the premultiplied ARGB format to store the bitmap data." (source: docs) - if (alphaInfo == kCGImageAlphaNone || alphaInfo == kCGImageAlphaOnly) { - alphaInfo = kCGImageAlphaNoneSkipFirst; - } else if (alphaInfo == kCGImageAlphaFirst) { - alphaInfo = kCGImageAlphaPremultipliedFirst; - } else if (alphaInfo == kCGImageAlphaLast) { - alphaInfo = kCGImageAlphaPremultipliedLast; - } - // "The constants for specifying the alpha channel information are declared with the `CGImageAlphaInfo` type but can be passed to this parameter safely." (source: docs) - bitmapInfo |= alphaInfo; - - // Create our own graphics context to draw to; `UIGraphicsGetCurrentContext`/`UIGraphicsBeginImageContextWithOptions` doesn't create a new context but returns the current one which isn't thread-safe (e.g. main thread could use it at the same time). - // Note: It's not worth caching the bitmap context for multiple frames ("unique key" would be `width`, `height` and `hasAlpha`), it's ~50% slower. Time spent in libRIP's `CGSBlendBGRA8888toARGB8888` suddenly shoots up -- not sure why. - CGContextRef bitmapContextRef = CGBitmapContextCreate(data, width, height, bitsPerComponent, bytesPerRow, colorSpaceDeviceRGBRef, bitmapInfo); - CGColorSpaceRelease(colorSpaceDeviceRGBRef); - // Early return on failure! - if (!bitmapContextRef) { - FLLog(FLLogLevelError, @"Failed to `CGBitmapContextCreate` with color space %@ and parameters (width: %zu height: %zu bitsPerComponent: %zu bytesPerRow: %zu) for image %@", colorSpaceDeviceRGBRef, width, height, bitsPerComponent, bytesPerRow, imageToPredraw); - return imageToPredraw; - } - - // Draw image in bitmap context and create image by preserving receiver's properties. - CGContextDrawImage(bitmapContextRef, CGRectMake(0.0, 0.0, imageToPredraw.size.width, imageToPredraw.size.height), imageToPredraw.CGImage); - CGImageRef predrawnImageRef = CGBitmapContextCreateImage(bitmapContextRef); - UIImage *predrawnImage = [UIImage imageWithCGImage:predrawnImageRef scale:imageToPredraw.scale orientation:imageToPredraw.imageOrientation]; - CGImageRelease(predrawnImageRef); - CGContextRelease(bitmapContextRef); - - // Early return on failure! - if (!predrawnImage) { - FLLog(FLLogLevelError, @"Failed to `imageWithCGImage:scale:orientation:` with image ref %@ created with color space %@ and bitmap context %@ and properties and properties (scale: %f orientation: %ld) for image %@", predrawnImageRef, colorSpaceDeviceRGBRef, bitmapContextRef, imageToPredraw.scale, (long)imageToPredraw.imageOrientation, imageToPredraw); - return imageToPredraw; - } - - return predrawnImage; -} - - -#pragma mark - Description - -- (NSString *)description -{ - NSString *description = [super description]; - - description = [description stringByAppendingFormat:@" size=%@", NSStringFromCGSize(self.size)]; - description = [description stringByAppendingFormat:@" frameCount=%lu", (unsigned long)self.frameCount]; - - return description; -} - - -@end - -#pragma mark - Logging - -@implementation FLAnimatedImage (Logging) - -static void (^_logBlock)(NSString *logString, FLLogLevel logLevel) = nil; -static FLLogLevel _logLevel; - -+ (void)setLogBlock:(void (^)(NSString *logString, FLLogLevel logLevel))logBlock logLevel:(FLLogLevel)logLevel -{ - _logBlock = logBlock; - _logLevel = logLevel; -} - -+ (void)logStringFromBlock:(NSString *(^)(void))stringBlock withLevel:(FLLogLevel)level -{ - if (level <= _logLevel && _logBlock && stringBlock) { - _logBlock(stringBlock(), level); - } -} - -@end - - -#pragma mark - FLWeakProxy - -@interface FLWeakProxy () - -@property (nonatomic, weak) id target; - -@end - - -@implementation FLWeakProxy - -#pragma mark Life Cycle - -// This is the designated creation method of an `FLWeakProxy` and -// as a subclass of `NSProxy` it doesn't respond to or need `-init`. -+ (instancetype)weakProxyForObject:(id)targetObject -{ - FLWeakProxy *weakProxy = [FLWeakProxy alloc]; - weakProxy.target = targetObject; - return weakProxy; -} - - -#pragma mark Forwarding Messages - -- (id)forwardingTargetForSelector:(SEL)selector -{ - // Keep it lightweight: access the ivar directly - return _target; -} - - -#pragma mark - NSWeakProxy Method Overrides -#pragma mark Handling Unimplemented Methods - -- (void)forwardInvocation:(NSInvocation *)invocation -{ - // Fallback for when target is nil. Don't do anything, just return 0/NULL/nil. - // The method signature we've received to get here is just a dummy to keep `doesNotRecognizeSelector:` from firing. - // We can't really handle struct return types here because we don't know the length. - void *nullPointer = NULL; - [invocation setReturnValue:&nullPointer]; -} - - -- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector -{ - // We only get here if `forwardingTargetForSelector:` returns nil. - // In that case, our weak target has been reclaimed. Return a dummy method signature to keep `doesNotRecognizeSelector:` from firing. - // We'll emulate the Obj-c messaging nil behavior by setting the return value to nil in `forwardInvocation:`, but we'll assume that the return value is `sizeof(void *)`. - // Other libraries handle this situation by making use of a global method signature cache, but that seems heavier than necessary and has issues as well. - // See https://www.mikeash.com/pyblog/friday-qa-2010-02-26-futures.html and https://github.com/steipete/PSTDelegateProxy/issues/1 for examples of using a method signature cache. - return [NSObject instanceMethodSignatureForSelector:@selector(init)]; -} - - -@end diff --git a/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h b/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h deleted file mode 100644 index c0d527aa6..000000000 --- a/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// FLAnimatedImageView.h -// Flipboard -// -// Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2015 Flipboard. All rights reserved. -// - - -#import - -@class FLAnimatedImage; -@protocol FLAnimatedImageViewDebugDelegate; - - -// -// An `FLAnimatedImageView` can take an `FLAnimatedImage` and plays it automatically when in view hierarchy and stops when removed. -// The animation can also be controlled with the `UIImageView` methods `-start/stop/isAnimating`. -// It is a fully compatible `UIImageView` subclass and can be used as a drop-in component to work with existing code paths expecting to display a `UIImage`. -// Under the hood it uses a `CADisplayLink` for playback, which can be inspected with `currentFrame` & `currentFrameIndex`. -// -@interface FLAnimatedImageView : UIImageView - -// Setting `[UIImageView.image]` to a non-`nil` value clears out existing `animatedImage`. -// And vice versa, setting `animatedImage` will initially populate the `[UIImageView.image]` to its `posterImage` and then start animating and hold `currentFrame`. -@property (nonatomic, strong) FLAnimatedImage *animatedImage; -@property (nonatomic, copy) void(^loopCompletionBlock)(NSUInteger loopCountRemaining); - -@property (nonatomic, strong, readonly) UIImage *currentFrame; -@property (nonatomic, assign, readonly) NSUInteger currentFrameIndex; - -// The animation runloop mode. Enables playback during scrolling by allowing timer events (i.e. animation) with NSRunLoopCommonModes. -// To keep scrolling smooth on single-core devices such as iPhone 3GS/4 and iPod Touch 4th gen, the default run loop mode is NSDefaultRunLoopMode. Otherwise, the default is NSDefaultRunLoopMode. -@property (nonatomic, copy) NSString *runLoopMode; - -@end diff --git a/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m b/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m deleted file mode 100755 index ffbb65811..000000000 --- a/Pods/FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.m +++ /dev/null @@ -1,437 +0,0 @@ -// -// FLAnimatedImageView.h -// Flipboard -// -// Created by Raphael Schaad on 7/8/13. -// Copyright (c) 2013-2015 Flipboard. All rights reserved. -// - - -#import "FLAnimatedImageView.h" -#import "FLAnimatedImage.h" -#import - - -#if defined(DEBUG) && DEBUG -@protocol FLAnimatedImageViewDebugDelegate -@optional -- (void)debug_animatedImageView:(FLAnimatedImageView *)animatedImageView waitingForFrame:(NSUInteger)index duration:(NSTimeInterval)duration; -@end -#endif - - -@interface FLAnimatedImageView () - -// Override of public `readonly` properties as private `readwrite` -@property (nonatomic, strong, readwrite) UIImage *currentFrame; -@property (nonatomic, assign, readwrite) NSUInteger currentFrameIndex; - -@property (nonatomic, assign) NSUInteger loopCountdown; -@property (nonatomic, assign) NSTimeInterval accumulator; -@property (nonatomic, strong) CADisplayLink *displayLink; - -@property (nonatomic, assign) BOOL shouldAnimate; // Before checking this value, call `-updateShouldAnimate` whenever the animated image or visibility (window, superview, hidden, alpha) has changed. -@property (nonatomic, assign) BOOL needsDisplayWhenImageBecomesAvailable; - -#if defined(DEBUG) && DEBUG -@property (nonatomic, weak) id debug_delegate; -#endif - -@end - - -@implementation FLAnimatedImageView -@synthesize runLoopMode = _runLoopMode; - -#pragma mark - Initializers - -// -initWithImage: isn't documented as a designated initializer of UIImageView, but it actually seems to be. -// Using -initWithImage: doesn't call any of the other designated initializers. -- (instancetype)initWithImage:(UIImage *)image -{ - self = [super initWithImage:image]; - if (self) { - [self commonInit]; - } - return self; -} - -// -initWithImage:highlightedImage: also isn't documented as a designated initializer of UIImageView, but it doesn't call any other designated initializers. -- (instancetype)initWithImage:(UIImage *)image highlightedImage:(UIImage *)highlightedImage -{ - self = [super initWithImage:image highlightedImage:highlightedImage]; - if (self) { - [self commonInit]; - } - return self; -} - -- (instancetype)initWithFrame:(CGRect)frame -{ - self = [super initWithFrame:frame]; - if (self) { - [self commonInit]; - } - return self; -} - -- (instancetype)initWithCoder:(NSCoder *)aDecoder -{ - self = [super initWithCoder:aDecoder]; - if (self) { - [self commonInit]; - } - return self; -} - -- (void)commonInit -{ - self.runLoopMode = [[self class] defaultRunLoopMode]; -} - - -#pragma mark - Accessors -#pragma mark Public - -- (void)setAnimatedImage:(FLAnimatedImage *)animatedImage -{ - if (![_animatedImage isEqual:animatedImage]) { - if (animatedImage) { - // Clear out the image. - super.image = nil; - // Ensure disabled highlighting; it's not supported (see `-setHighlighted:`). - super.highlighted = NO; - // UIImageView seems to bypass some accessors when calculating its intrinsic content size, so this ensures its intrinsic content size comes from the animated image. - [self invalidateIntrinsicContentSize]; - } else { - // Stop animating before the animated image gets cleared out. - [self stopAnimating]; - } - - _animatedImage = animatedImage; - - self.currentFrame = animatedImage.posterImage; - self.currentFrameIndex = 0; - if (animatedImage.loopCount > 0) { - self.loopCountdown = animatedImage.loopCount; - } else { - self.loopCountdown = NSUIntegerMax; - } - self.accumulator = 0.0; - - // Start animating after the new animated image has been set. - [self updateShouldAnimate]; - if (self.shouldAnimate) { - [self startAnimating]; - } - - [self.layer setNeedsDisplay]; - } -} - - -#pragma mark - Life Cycle - -- (void)dealloc -{ - // Removes the display link from all run loop modes. - [_displayLink invalidate]; -} - - -#pragma mark - UIView Method Overrides -#pragma mark Observing View-Related Changes - -- (void)didMoveToSuperview -{ - [super didMoveToSuperview]; - - [self updateShouldAnimate]; - if (self.shouldAnimate) { - [self startAnimating]; - } else { - [self stopAnimating]; - } -} - - -- (void)didMoveToWindow -{ - [super didMoveToWindow]; - - [self updateShouldAnimate]; - if (self.shouldAnimate) { - [self startAnimating]; - } else { - [self stopAnimating]; - } -} - -- (void)setAlpha:(CGFloat)alpha -{ - [super setAlpha:alpha]; - - [self updateShouldAnimate]; - if (self.shouldAnimate) { - [self startAnimating]; - } else { - [self stopAnimating]; - } -} - -- (void)setHidden:(BOOL)hidden -{ - [super setHidden:hidden]; - - [self updateShouldAnimate]; - if (self.shouldAnimate) { - [self startAnimating]; - } else { - [self stopAnimating]; - } -} - - -#pragma mark Auto Layout - -- (CGSize)intrinsicContentSize -{ - // Default to let UIImageView handle the sizing of its image, and anything else it might consider. - CGSize intrinsicContentSize = [super intrinsicContentSize]; - - // If we have have an animated image, use its image size. - // UIImageView's intrinsic content size seems to be the size of its image. The obvious approach, simply calling `-invalidateIntrinsicContentSize` when setting an animated image, results in UIImageView steadfastly returning `{UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric}` for its intrinsicContentSize. - // (Perhaps UIImageView bypasses its `-image` getter in its implementation of `-intrinsicContentSize`, as `-image` is not called after calling `-invalidateIntrinsicContentSize`.) - if (self.animatedImage) { - intrinsicContentSize = self.image.size; - } - - return intrinsicContentSize; -} - - -#pragma mark - UIImageView Method Overrides -#pragma mark Image Data - -- (UIImage *)image -{ - UIImage *image = nil; - if (self.animatedImage) { - // Initially set to the poster image. - image = self.currentFrame; - } else { - image = super.image; - } - return image; -} - - -- (void)setImage:(UIImage *)image -{ - if (image) { - // Clear out the animated image and implicitly pause animation playback. - self.animatedImage = nil; - } - - super.image = image; -} - - -#pragma mark Animating Images - -- (NSTimeInterval)frameDelayGreatestCommonDivisor -{ - // Presision is set to half of the `kFLAnimatedImageDelayTimeIntervalMinimum` in order to minimize frame dropping. - const NSTimeInterval kGreatestCommonDivisorPrecision = 2.0 / kFLAnimatedImageDelayTimeIntervalMinimum; - - NSArray *delays = self.animatedImage.delayTimesForIndexes.allValues; - - // Scales the frame delays by `kGreatestCommonDivisorPrecision` - // then converts it to an UInteger for in order to calculate the GCD. - NSUInteger scaledGCD = lrint([delays.firstObject floatValue] * kGreatestCommonDivisorPrecision); - for (NSNumber *value in delays) { - scaledGCD = gcd(lrint([value floatValue] * kGreatestCommonDivisorPrecision), scaledGCD); - } - - // Reverse to scale to get the value back into seconds. - return scaledGCD / kGreatestCommonDivisorPrecision; -} - - -static NSUInteger gcd(NSUInteger a, NSUInteger b) -{ - // http://en.wikipedia.org/wiki/Greatest_common_divisor - if (a < b) { - return gcd(b, a); - } else if (a == b) { - return b; - } - - while (true) { - NSUInteger remainder = a % b; - if (remainder == 0) { - return b; - } - a = b; - b = remainder; - } -} - - -- (void)startAnimating -{ - if (self.animatedImage) { - // Lazily create the display link. - if (!self.displayLink) { - // It is important to note the use of a weak proxy here to avoid a retain cycle. `-displayLinkWithTarget:selector:` - // will retain its target until it is invalidated. We use a weak proxy so that the image view will get deallocated - // independent of the display link's lifetime. Upon image view deallocation, we invalidate the display - // link which will lead to the deallocation of both the display link and the weak proxy. - FLWeakProxy *weakProxy = [FLWeakProxy weakProxyForObject:self]; - self.displayLink = [CADisplayLink displayLinkWithTarget:weakProxy selector:@selector(displayDidRefresh:)]; - - [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:self.runLoopMode]; - } - - // Note: The display link's `.frameInterval` value of 1 (default) means getting callbacks at the refresh rate of the display (~60Hz). - // Setting it to 2 divides the frame rate by 2 and hence calls back at every other display refresh. - const NSTimeInterval kDisplayRefreshRate = 60.0; // 60Hz - self.displayLink.frameInterval = MAX([self frameDelayGreatestCommonDivisor] * kDisplayRefreshRate, 1); - - self.displayLink.paused = NO; - } else { - [super startAnimating]; - } -} - -- (void)setRunLoopMode:(NSString *)runLoopMode -{ - if (![@[NSDefaultRunLoopMode, NSRunLoopCommonModes] containsObject:runLoopMode]) { - NSAssert(NO, @"Invalid run loop mode: %@", runLoopMode); - _runLoopMode = [[self class] defaultRunLoopMode]; - } else { - _runLoopMode = runLoopMode; - } -} - -- (void)stopAnimating -{ - if (self.animatedImage) { - self.displayLink.paused = YES; - } else { - [super stopAnimating]; - } -} - - -- (BOOL)isAnimating -{ - BOOL isAnimating = NO; - if (self.animatedImage) { - isAnimating = self.displayLink && !self.displayLink.isPaused; - } else { - isAnimating = [super isAnimating]; - } - return isAnimating; -} - - -#pragma mark Highlighted Image Unsupport - -- (void)setHighlighted:(BOOL)highlighted -{ - // Highlighted image is unsupported for animated images, but implementing it breaks the image view when embedded in a UICollectionViewCell. - if (!self.animatedImage) { - [super setHighlighted:highlighted]; - } -} - - -#pragma mark - Private Methods -#pragma mark Animation - -// Don't repeatedly check our window & superview in `-displayDidRefresh:` for performance reasons. -// Just update our cached value whenever the animated image or visibility (window, superview, hidden, alpha) is changed. -- (void)updateShouldAnimate -{ - BOOL isVisible = self.window && self.superview && ![self isHidden] && self.alpha > 0.0; - self.shouldAnimate = self.animatedImage && isVisible; -} - - -- (void)displayDidRefresh:(CADisplayLink *)displayLink -{ - // If for some reason a wild call makes it through when we shouldn't be animating, bail. - // Early return! - if (!self.shouldAnimate) { - FLLog(FLLogLevelWarn, @"Trying to animate image when we shouldn't: %@", self); - return; - } - - NSNumber *delayTimeNumber = [self.animatedImage.delayTimesForIndexes objectForKey:@(self.currentFrameIndex)]; - // If we don't have a frame delay (e.g. corrupt frame), don't update the view but skip the playhead to the next frame (in else-block). - if (delayTimeNumber) { - NSTimeInterval delayTime = [delayTimeNumber floatValue]; - // If we have a nil image (e.g. waiting for frame), don't update the view nor playhead. - UIImage *image = [self.animatedImage imageLazilyCachedAtIndex:self.currentFrameIndex]; - if (image) { - FLLog(FLLogLevelVerbose, @"Showing frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage); - self.currentFrame = image; - if (self.needsDisplayWhenImageBecomesAvailable) { - [self.layer setNeedsDisplay]; - self.needsDisplayWhenImageBecomesAvailable = NO; - } - - self.accumulator += displayLink.duration * displayLink.frameInterval; - - // While-loop first inspired by & good Karma to: https://github.com/ondalabs/OLImageView/blob/master/OLImageView.m - while (self.accumulator >= delayTime) { - self.accumulator -= delayTime; - self.currentFrameIndex++; - if (self.currentFrameIndex >= self.animatedImage.frameCount) { - // If we've looped the number of times that this animated image describes, stop looping. - self.loopCountdown--; - if (self.loopCompletionBlock) { - self.loopCompletionBlock(self.loopCountdown); - } - - if (self.loopCountdown == 0) { - [self stopAnimating]; - return; - } - self.currentFrameIndex = 0; - } - // Calling `-setNeedsDisplay` will just paint the current frame, not the new frame that we may have moved to. - // Instead, set `needsDisplayWhenImageBecomesAvailable` to `YES` -- this will paint the new image once loaded. - self.needsDisplayWhenImageBecomesAvailable = YES; - } - } else { - FLLog(FLLogLevelDebug, @"Waiting for frame %lu for animated image: %@", (unsigned long)self.currentFrameIndex, self.animatedImage); -#if defined(DEBUG) && DEBUG - if ([self.debug_delegate respondsToSelector:@selector(debug_animatedImageView:waitingForFrame:duration:)]) { - [self.debug_delegate debug_animatedImageView:self waitingForFrame:self.currentFrameIndex duration:(NSTimeInterval)displayLink.duration * displayLink.frameInterval]; - } -#endif - } - } else { - self.currentFrameIndex++; - } -} - -+ (NSString *)defaultRunLoopMode -{ - // Key off `activeProcessorCount` (as opposed to `processorCount`) since the system could shut down cores in certain situations. - return [NSProcessInfo processInfo].activeProcessorCount > 1 ? NSRunLoopCommonModes : NSDefaultRunLoopMode; -} - - -#pragma mark - CALayerDelegate (Informal) -#pragma mark Providing the Layer's Content - -- (void)displayLayer:(CALayer *)layer -{ - layer.contents = (__bridge id)self.image.CGImage; -} - - -@end diff --git a/Pods/FLAnimatedImage/LICENSE b/Pods/FLAnimatedImage/LICENSE deleted file mode 100644 index 632653f9a..000000000 --- a/Pods/FLAnimatedImage/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2016 Flipboard - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Pods/FLAnimatedImage/README.md b/Pods/FLAnimatedImage/README.md deleted file mode 100644 index 384122cd0..000000000 --- a/Pods/FLAnimatedImage/README.md +++ /dev/null @@ -1,103 +0,0 @@ -FLAnimatedImage is a performant animated GIF engine for iOS: - -- Plays multiple GIFs simultaneously with a playback speed comparable to desktop browsers -- Honors variable frame delays -- Behaves gracefully under memory pressure -- Eliminates delays or blocking during the first playback loop -- Interprets the frame delays of fast GIFs the same way modern browsers do - -It's a well-tested [component that powers all GIFs in Flipboard](http://engineering.flipboard.com/2014/05/animated-gif/). To understand its behavior it comes with an interactive demo: - -![Flipboard playing multiple GIFs](https://github.com/Flipboard/FLAnimatedImage/raw/master/images/flanimatedimage-demo-player.gif) - -## Who is this for? - -- Apps that don't support animated GIFs yet -- Apps that already support animated GIFs but want a higher performance solution -- People who want to tinker with the code ([the corresponding blog post](http://engineering.flipboard.com/2014/05/animated-gif/) is a great place to start; also see the *To Do* section below) - -## Installation & Usage - -FLAnimatedImage is a well encapsulated drop-in component. Simply replace your `UIImageView` instances with instances of `FLAnimatedImageView` to get animated GIF support. There is no central cache or state to manage. - -If using CocoaPods, the quickest way to try it out is to type this on the command line: - -```shell -$ pod try FLAnimatedImage -``` - -To add it to your app, copy the two classes `FLAnimatedImage.h/.m` and `FLAnimatedImageView.h/.m` into your Xcode project or add via [CocoaPods](http://cocoapods.org) by adding this to your Podfile: - -```ruby -pod 'FLAnimatedImage', '~> 1.0' -``` - -If using [Carthage](https://github.com/Carthage/Carthage), add following line into your `Cartfile` - -``` -github "Flipboard/FLAnimatedImage" -``` - -In your code, `#import "FLAnimatedImage.h"`, create an image from an animated GIF, and setup the image view to display it: - -```objective-c -FLAnimatedImage *image = [FLAnimatedImage animatedImageWithGIFData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif"]]]; -FLAnimatedImageView *imageView = [[FLAnimatedImageView alloc] init]; -imageView.animatedImage = image; -imageView.frame = CGRectMake(0.0, 0.0, 100.0, 100.0); -[self.view addSubview:imageView]; -``` - -It's flexible to integrate in your custom image loading stack and backwards compatible to iOS 6. - -It uses ARC and the Apple frameworks `QuartzCore`, `ImageIO`, `MobileCoreServices`, and `CoreGraphics`. - -It is capable of fine-grained logging. A block can be set on `FLAnimatedImage` that's invoked when logging occurs with various log levels via the `+setLogBlock:logLevel:` method. For example: - -```objective-c -// Set up FLAnimatedImage logging. -[FLAnimatedImage setLogBlock:^(NSString *logString, FLLogLevel logLevel) { - // Using NSLog - NSLog(@"%@", logString); - - // ...or CocoaLumberjackLogger only logging warnings and errors - if (logLevel == FLLogLevelError) { - DDLogError(@"%@", logString); - } else if (logLevel == FLLogLevelWarn) { - DDLogWarn(@"%@", logString); - } -} logLevel:FLLogLevelWarn]; -``` - -Since FLAnimatedImage is licensed under MIT, it's compatible with the terms of using it for any app on the App Store. - -## To Do -- Support other animated image formats such as APNG or WebP (WebP support implemented [here](https://github.com/Flipboard/FLAnimatedImage/pull/86)) -- Integration into network libraries and image caches -- Investigate whether `FLAnimatedImage` should become a `UIImage` subclass -- Smarter buffering -- Bring demo app to iPhone - -This has successfully shipped to many people as is, but please do come with your questions, issues and pull requests! - -## Select apps using FLAnimatedImage -- [Dropbox](https://www.dropbox.com) -- [Medium](https://medium.com) -- [Facebook](https://facebook.com) -- [Pinterest](https://pinterest.com) -- [LiveBooth](http://www.liveboothapp.com) -- [Design Shots](https://itunes.apple.com/app/id792517951) -- [lWlVl Festival](http://lwlvl.com) -- [Close-up](http://closeu.pe) -- [Zip Code Finder](https://itunes.apple.com/app/id893031254) -- [getGIF](https://itunes.apple.com/app/id964784701) -- [Giffage](http://giffage.com) -- [Flipboard](https://flipboard.com) -- [Gifalicious](https://itunes.apple.com/us/app/gifalicious-see-your-gifs/id965346708?mt=8) -- [Slack](https://slack.com/) -- [Telegram](https://telegram.org/) -- [HashPhotos](https://itunes.apple.com/app/id685784609) -- [Ello](https://ello.co/) -- [Dumpert](http://dumpert.nl) - -If you're using FLAnimatedImage in your app please open a PR to add it to this list! diff --git a/Pods/Fabric/Fabric.framework/README b/Pods/Fabric/Fabric.framework/README deleted file mode 100644 index 3b1fbe24e..000000000 --- a/Pods/Fabric/Fabric.framework/README +++ /dev/null @@ -1 +0,0 @@ -We've now combined all our supported platforms into a single podspec. As a result, we moved our run script to a new location for Cocoapods projects: ${PODS_ROOT}/Fabric/run. To avoid breaking builds that reference the old location of the run script, we've placed this dummy script that calls to the correct location, while providing a helpful warning in Xcode if it is invoked. This bridge for backwards compatibility will be removed in a future release, so please heed the warning! diff --git a/Pods/Fabric/Fabric.framework/run b/Pods/Fabric/Fabric.framework/run deleted file mode 100755 index b9edd17f9..000000000 --- a/Pods/Fabric/Fabric.framework/run +++ /dev/null @@ -1,6 +0,0 @@ -if [[ -z $PODS_ROOT ]]; then - echo "error: The run binary delivered by cocoapods is in a new location, under '$"{"PODS_ROOT"}"/Fabric/run'. This script was put in place for backwards compatibility, but it relies on PODS_ROOT, which does not have a value in your current setup. Please update the path to the run binary to fix this issue." -else - echo "warning: The run script is now located at '$"{"PODS_ROOT"}"/Fabric/run'. To remove this warning, update your Run Script Build Phase to point to this new location." - sh "${PODS_ROOT}/Fabric/run" "$@" -fi diff --git a/Pods/Fabric/README.md b/Pods/Fabric/README.md deleted file mode 100644 index 9eca6105a..000000000 --- a/Pods/Fabric/README.md +++ /dev/null @@ -1,42 +0,0 @@ -![Fabric Header](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-fabric-header.png) - -# Fabric - -## Overview - -[Fabric](https://get.fabric.io) provides developers with the tools they need to build the best apps. Developed and maintained by Google and the team that built Crashlytics, Fabric provides an easy way to manage all your SDKs so that you’ll never have to worry about tedious configurations or juggling different accounts. We let you get right into coding and building the next big app. - -For a full list of SDK provided through Fabric visit [https://fabric.io/kits](https://fabric.io/kits). - -## Setup - -The Fabric Pod is a dependency for all Fabric SDKs and is included when installing any Fabric related Pods. General setup instructions are shown below; however, these vary depending on the selected SDK. - -1. Visit [https://fabric.io/sign_up](https://fabric.io/sign_up) to create your Fabric account and to download Fabric.app. - -1. Open Fabric.app, login and select an SDK to install. - - ![Fabric Plugin](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-fabric-plugin.png) - -1. The Fabric app automatically detects when a project uses CocoaPods and gives you the option to install via the Podfile or Xcode. - - ![Fabric Installation Options](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-pod-installation-option.png) - -1. Select the Podfile option and follow the installation instructions to update your Podfile. Note: the example below is for the Crashlytics SDK. The instructions will vary based on the selected SDK. - - ![Fabric Podfile Instructions](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-podfile-instructions.png) - -1. Add a Run Script Build Phase and build your app. - - ![Fabric Run Script Build Phase](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-rsbp.png) - -1. Initialize the SDK by inserting code outlined in Fabric.app. - -1. Run your app to finish the installation. - -## Resources - -* [Documentation](https://docs.fabric.io/) -* [Forums](https://stackoverflow.com/questions/tagged/google-fabric) -* [Website](https://get.fabric.io) -* Follow us on Twitter: [@fabric](https://twitter.com/fabric) diff --git a/Pods/Fabric/iOS/Fabric.framework/Fabric b/Pods/Fabric/iOS/Fabric.framework/Fabric deleted file mode 100755 index 32ee036ba..000000000 Binary files a/Pods/Fabric/iOS/Fabric.framework/Fabric and /dev/null differ diff --git a/Pods/Fabric/iOS/Fabric.framework/Headers/FABAttributes.h b/Pods/Fabric/iOS/Fabric.framework/Headers/FABAttributes.h deleted file mode 100644 index 3a9355a7c..000000000 --- a/Pods/Fabric/iOS/Fabric.framework/Headers/FABAttributes.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// FABAttributes.h -// Fabric -// -// Copyright (C) 2015 Twitter, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#pragma once - -#define FAB_UNAVAILABLE(x) __attribute__((unavailable(x))) - -#if !__has_feature(nullability) - #define nonnull - #define nullable - #define _Nullable - #define _Nonnull -#endif - -#ifndef NS_ASSUME_NONNULL_BEGIN - #define NS_ASSUME_NONNULL_BEGIN -#endif - -#ifndef NS_ASSUME_NONNULL_END - #define NS_ASSUME_NONNULL_END -#endif - - -/** - * The following macros are defined here to provide - * backwards compatability. If you are still using - * them you should migrate to the native nullability - * macros. - */ -#define fab_nullable nullable -#define fab_nonnull nonnull -#define FAB_NONNULL __fab_nonnull -#define FAB_NULLABLE __fab_nullable -#define FAB_START_NONNULL NS_ASSUME_NONNULL_BEGIN -#define FAB_END_NONNULL NS_ASSUME_NONNULL_END diff --git a/Pods/Fabric/iOS/Fabric.framework/Headers/Fabric.h b/Pods/Fabric/iOS/Fabric.framework/Headers/Fabric.h deleted file mode 100644 index ecbdb53b8..000000000 --- a/Pods/Fabric/iOS/Fabric.framework/Headers/Fabric.h +++ /dev/null @@ -1,82 +0,0 @@ -// -// Fabric.h -// Fabric -// -// Copyright (C) 2015 Twitter, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import -#import "FABAttributes.h" - -NS_ASSUME_NONNULL_BEGIN - -#if TARGET_OS_IPHONE -#if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 - #error "Fabric's minimum iOS version is 6.0" -#endif -#else -#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070 - #error "Fabric's minimum OS X version is 10.7" -#endif -#endif - -/** - * Fabric Base. Coordinates configuration and starts all provided kits. - */ -@interface Fabric : NSObject - -/** - * Initialize Fabric and all provided kits. Call this method within your App Delegate's `application:didFinishLaunchingWithOptions:` and provide the kits you wish to use. - * - * For example, in Objective-C: - * - * `[Fabric with:@[[Crashlytics class], [Twitter class], [Digits class], [MoPub class]]];` - * - * Swift: - * - * `Fabric.with([Crashlytics.self(), Twitter.self(), Digits.self(), MoPub.self()])` - * - * Only the first call to this method is honored. Subsequent calls are no-ops. - * - * @param kitClasses An array of kit Class objects - * - * @return Returns the shared Fabric instance. In most cases this can be ignored. - */ -+ (instancetype)with:(NSArray *)kitClasses; - -/** - * Returns the Fabric singleton object. - */ -+ (instancetype)sharedSDK; - -/** - * This BOOL enables or disables debug logging, such as kit version information. The default value is NO. - */ -@property (nonatomic, assign) BOOL debug; - -/** - * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. - */ -- (id)init FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance."); - -/** - * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. - */ -+ (instancetype)new FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance."); - -@end - -NS_ASSUME_NONNULL_END - diff --git a/Pods/Fabric/iOS/Fabric.framework/Info.plist b/Pods/Fabric/iOS/Fabric.framework/Info.plist deleted file mode 100644 index 3aaa42cd1..000000000 Binary files a/Pods/Fabric/iOS/Fabric.framework/Info.plist and /dev/null differ diff --git a/Pods/Fabric/iOS/Fabric.framework/Modules/module.modulemap b/Pods/Fabric/iOS/Fabric.framework/Modules/module.modulemap deleted file mode 100644 index 2a312239d..000000000 --- a/Pods/Fabric/iOS/Fabric.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Fabric { - umbrella header "Fabric.h" - - export * - module * { export * } -} \ No newline at end of file diff --git a/Pods/Fabric/iOS/Fabric.framework/run b/Pods/Fabric/iOS/Fabric.framework/run deleted file mode 100755 index 9058ea62c..000000000 --- a/Pods/Fabric/iOS/Fabric.framework/run +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -# run -# -# Copyright (c) 2015 Crashlytics. All rights reserved. - -# Figure out where we're being called from -DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) - -# Quote path in case of spaces or special chars -DIR="\"${DIR}" - -PATH_SEP="/" -VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" -UPLOAD_COMMAND="uploadDSYM\" $@ run-script" - -# Ensure params are as expected, run in sync mode to validate -eval $DIR$PATH_SEP$VALIDATE_COMMAND -return_code=$? - -if [[ $return_code != 0 ]]; then - exit $return_code -fi - -# Verification passed, upload dSYM in background to prevent Xcode from waiting -# Note: Validation is performed again before upload. -# Output can still be found in Console.app -eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & diff --git a/Pods/Fabric/iOS/Fabric.framework/uploadDSYM b/Pods/Fabric/iOS/Fabric.framework/uploadDSYM deleted file mode 100755 index 6e867cd99..000000000 Binary files a/Pods/Fabric/iOS/Fabric.framework/uploadDSYM and /dev/null differ diff --git a/Pods/Fabric/run b/Pods/Fabric/run deleted file mode 100755 index 9058ea62c..000000000 --- a/Pods/Fabric/run +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -# run -# -# Copyright (c) 2015 Crashlytics. All rights reserved. - -# Figure out where we're being called from -DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) - -# Quote path in case of spaces or special chars -DIR="\"${DIR}" - -PATH_SEP="/" -VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" -UPLOAD_COMMAND="uploadDSYM\" $@ run-script" - -# Ensure params are as expected, run in sync mode to validate -eval $DIR$PATH_SEP$VALIDATE_COMMAND -return_code=$? - -if [[ $return_code != 0 ]]; then - exit $return_code -fi - -# Verification passed, upload dSYM in background to prevent Xcode from waiting -# Note: Validation is performed again before upload. -# Output can still be found in Console.app -eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & diff --git a/Pods/Fabric/upload-symbols b/Pods/Fabric/upload-symbols deleted file mode 100755 index 48d1de9e4..000000000 Binary files a/Pods/Fabric/upload-symbols and /dev/null differ diff --git a/Pods/Fabric/uploadDSYM b/Pods/Fabric/uploadDSYM deleted file mode 100755 index 6e867cd99..000000000 Binary files a/Pods/Fabric/uploadDSYM and /dev/null differ diff --git a/Pods/Firebase/Core/Sources/Firebase.h b/Pods/Firebase/Core/Sources/Firebase.h deleted file mode 100755 index 818011166..000000000 --- a/Pods/Firebase/Core/Sources/Firebase.h +++ /dev/null @@ -1,68 +0,0 @@ -#import -#import - -#if !defined(__has_include) - #error "Firebase.h won't import anything if your compiler doesn't support __has_include. Please \ - import the headers individually." -#else - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - -#endif // defined(__has_include) diff --git a/Pods/Firebase/Core/Sources/module.modulemap b/Pods/Firebase/Core/Sources/module.modulemap deleted file mode 100755 index 3685b54a6..000000000 --- a/Pods/Firebase/Core/Sources/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module Firebase { - export * - header "Firebase.h" -} \ No newline at end of file diff --git a/Pods/Firebase/README.md b/Pods/Firebase/README.md deleted file mode 100755 index 0a7837ecc..000000000 --- a/Pods/Firebase/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# Firebase APIs for iOS - -Simplify your iOS development, grow your user base, and monetize more -effectively with Firebase services. - -Much more information can be found at [https://firebase.google.com](https://firebase.google.com). - -## Install a Firebase SDK using CocoaPods - -Firebase distributes several iOS specific APIs and SDKs via CocoaPods. -You can install the CocoaPods tool on OS X by running the following command from -the terminal. Detailed information is available in the [Getting Started -guide](https://guides.cocoapods.org/using/getting-started.html#getting-started). - -``` -$ sudo gem install cocoapods -``` - -## Try out an SDK - -You can try any of the SDKs with `pod try`. Run the following command and select -the SDK you are interested in when prompted: - -``` -$ pod try Firebase -``` - -Note that some SDKs may require credentials. More information is available in -the SDK-specific documentation at [https://firebase.google.com/docs/](https://firebase.google.com/docs/). - -## Add a Firebase SDK to your iOS app - -CocoaPods is used to install and manage dependencies in existing Xcode projects. - -1. Create an Xcode project, and save it to your local machine. -2. Create a file named `Podfile` in your project directory. This file defines - your project's dependencies, and is commonly referred to as a Podspec. -3. Open `Podfile`, and add your dependencies. A simple Podspec is shown here: - - ``` - platform :ios, '7.0' - pod 'Firebase' - ``` - -4. Save the file. -5. Open a terminal and `cd` to the directory containing the Podfile. - - ``` - $ cd /project/ - ``` - -6. Run the `pod install` command. This will install the SDKs specified in the - Podspec, along with any dependencies they may have. - - ``` - $ pod install - ``` - -7. Open your app's `.xcworkspace` file to launch Xcode. - Use this file for all development on your app. -8. You can also install other Firebase SDKs by adding the subspecs in the - Podfile. - - ``` - pod 'Firebase/AdMob' - pod 'Firebase/Analytics' - pod 'Firebase/Auth' - pod 'Firebase/Crash' - pod 'Firebase/Database' - pod 'Firebase/DynamicLinks' - pod 'Firebase/Invites' - pod 'Firebase/Messaging' - pod 'Firebase/Performance' - pod 'Firebase/RemoteConfig' - pod 'Firebase/Storage' - ``` diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics deleted file mode 100755 index e359be866..000000000 Binary files a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics and /dev/null differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h deleted file mode 100755 index d499af668..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h +++ /dev/null @@ -1,62 +0,0 @@ -#import - -#import "FIRAnalytics.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * Provides App Delegate handlers to be used in your App Delegate. - * - * To save time integrating Firebase Analytics in an application, Firebase Analytics does not - * require delegation implementation from the AppDelegate. Instead this is automatically done by - * Firebase Analytics. Should you choose instead to delegate manually, you can turn off the App - * Delegate Proxy by adding FirebaseAppDelegateProxyEnabled into your app's Info.plist and setting - * it to NO, and adding the methods in this category to corresponding delegation handlers. - * - * To handle Universal Links, you must return YES in - * [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - */ -@interface FIRAnalytics (AppDelegate) - -/** - * Handles events related to a URL session that are waiting to be processed. - * - * For optimal use of Firebase Analytics, call this method from the - * [UIApplicationDelegate application:handleEventsForBackgroundURLSession:completionHandler] - * method of the app delegate in your app. - * - * @param identifier The identifier of the URL session requiring attention. - * @param completionHandler The completion handler to call when you finish processing the events. - * Calling this completion handler lets the system know that your app's user interface is - * updated and a new snapshot can be taken. - */ -+ (void)handleEventsForBackgroundURLSession:(NSString *)identifier - completionHandler:(nullable void (^)(void))completionHandler; - -/** - * Handles the event when the app is launched by a URL. - * - * Call this method from [UIApplicationDelegate application:openURL:options:] (on iOS 9.0 and - * above), or [UIApplicationDelegate application:openURL:sourceApplication:annotation:] (on - * iOS 8.x and below) in your app. - * - * @param url The URL resource to open. This resource can be a network resource or a file. - */ -+ (void)handleOpenURL:(NSURL *)url; - -/** - * Handles the event when the app receives data associated with user activity that includes a - * Universal Link (on iOS 9.0 and above). - * - * Call this method from [UIApplication continueUserActivity:restorationHandler:] in your app - * delegate (on iOS 9.0 and above). - * - * @param userActivity The activity object containing the data associated with the task the user - * was performing. - */ -+ (void)handleUserActivity:(id)userActivity; - -@end - -NS_ASSUME_NONNULL_END - diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h deleted file mode 100755 index 7c891ab6f..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h +++ /dev/null @@ -1,115 +0,0 @@ -#import - -#import "FIREventNames.h" -#import "FIRParameterNames.h" -#import "FIRUserPropertyNames.h" - -NS_ASSUME_NONNULL_BEGIN - -/// The top level Firebase Analytics singleton that provides methods for logging events and setting -/// user properties. See the developer guides for general -/// information on using Firebase Analytics in your apps. -NS_SWIFT_NAME(Analytics) -@interface FIRAnalytics : NSObject - -/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have -/// the same parameters. Up to 500 event names are supported. Using predefined events and/or -/// parameters is recommended for optimal reporting. -/// -/// The following event names are reserved and cannot be used: -///
    -///
  • ad_activeview
  • -///
  • ad_click
  • -///
  • ad_exposure
  • -///
  • ad_impression
  • -///
  • ad_query
  • -///
  • adunit_exposure
  • -///
  • app_clear_data
  • -///
  • app_remove
  • -///
  • app_update
  • -///
  • error
  • -///
  • first_open
  • -///
  • in_app_purchase
  • -///
  • notification_dismiss
  • -///
  • notification_foreground
  • -///
  • notification_open
  • -///
  • notification_receive
  • -///
  • os_update
  • -///
  • screen_view
  • -///
  • session_start
  • -///
  • user_engagement
  • -///
-/// -/// @param name The name of the event. Should contain 1 to 40 alphanumeric characters or -/// underscores. The name must start with an alphabetic character. Some event names are -/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_", -/// "google_", and "ga_" prefixes are reserved and should not be used. Note that event names are -/// case-sensitive and that logging two events whose names differ only in case will result in -/// two distinct events. -/// @param parameters The dictionary of event parameters. Passing nil indicates that the event has -/// no parameters. Parameter names can be up to 40 characters long and must start with an -/// alphabetic character and contain only alphanumeric characters and underscores. Only NSString -/// and NSNumber (signed 64-bit integer and 64-bit floating-point number) parameter types are -/// supported. NSString parameter values can be up to 100 characters long. The "firebase_", -/// "google_", and "ga_" prefixes are reserved and should not be used for parameter names. -+ (void)logEventWithName:(NSString *)name - parameters:(nullable NSDictionary *)parameters - NS_SWIFT_NAME(logEvent(_:parameters:)); - -/// Sets a user property to a given value. Up to 25 user property names are supported. Once set, -/// user property values persist throughout the app lifecycle and across sessions. -/// -/// The following user property names are reserved and cannot be used: -///
    -///
  • first_open_time
  • -///
  • last_deep_link_referrer
  • -///
  • user_id
  • -///
-/// -/// @param value The value of the user property. Values can be up to 36 characters long. Setting the -/// value to nil removes the user property. -/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters -/// or underscores and must start with an alphabetic character. The "firebase_", "google_", and -/// "ga_" prefixes are reserved and should not be used for user property names. -+ (void)setUserPropertyString:(nullable NSString *)value forName:(NSString *)name - NS_SWIFT_NAME(setUserProperty(_:forName:)); - -/// Sets the user ID property. This feature must be used in accordance with -/// Google's Privacy Policy -/// -/// @param userID The user ID to ascribe to the user of this app on this device, which must be -/// non-empty and no more than 36 characters long. Setting userID to nil removes the user ID. -+ (void)setUserID:(nullable NSString *)userID; - -/// Sets the current screen name, which specifies the current visual context in your app. This helps -/// identify the areas in your app where users spend their time and how they interact with your app. -/// Must be called on the main thread. -/// -/// Note that screen reporting is enabled automatically and records the class name of the current -/// UIViewController for you without requiring you to call this method. If you implement -/// viewDidAppear in your UIViewController but do not call [super viewDidAppear:], that screen class -/// will not be automatically tracked. The class name can optionally be overridden by calling this -/// method in the viewDidAppear callback of your UIViewController and specifying the -/// screenClassOverride parameter. setScreenName:screenClass: must be called after -/// [super viewDidAppear:]. -/// -/// If your app does not use a distinct UIViewController for each screen, you should call this -/// method and specify a distinct screenName each time a new screen is presented to the user. -/// -/// The screen name and screen class remain in effect until the current UIViewController changes or -/// a new call to setScreenName:screenClass: is made. -/// -/// @param screenName The name of the current screen. Should contain 1 to 100 characters. Set to nil -/// to clear the current screen name. -/// @param screenClassOverride The name of the screen class. Should contain 1 to 100 characters. By -/// default this is the class name of the current UIViewController. Set to nil to revert to the -/// default class name. -+ (void)setScreenName:(nullable NSString *)screenName - screenClass:(nullable NSString *)screenClassOverride; - -/// The unique ID for this instance of the application. -+ (NSString *)appInstanceID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsConfiguration.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsConfiguration.h deleted file mode 100755 index dc227a4c3..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsConfiguration.h +++ /dev/null @@ -1 +0,0 @@ -#import diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsSwiftNameSupport.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsSwiftNameSupport.h deleted file mode 100755 index 50fbf2e2d..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsSwiftNameSupport.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef FIR_SWIFT_NAME - -#import - -// NS_SWIFT_NAME can only translate factory methods before the iOS 9.3 SDK. -// Wrap it in our own macro if it's a non-compatible SDK. -#ifdef __IPHONE_9_3 -#define FIR_SWIFT_NAME(X) NS_SWIFT_NAME(X) -#else -#define FIR_SWIFT_NAME(X) // Intentionally blank. -#endif // #ifdef __IPHONE_9_3 - -#endif // FIR_SWIFT_NAME diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRApp.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRApp.h deleted file mode 100755 index de24da17d..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRApp.h +++ /dev/null @@ -1 +0,0 @@ -#import diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRConfiguration.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRConfiguration.h deleted file mode 100755 index be2ff7bff..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRConfiguration.h +++ /dev/null @@ -1 +0,0 @@ -#import diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h deleted file mode 100755 index 3bad502ed..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h +++ /dev/null @@ -1,389 +0,0 @@ -/// @file FIREventNames.h -/// -/// Predefined event names. -/// -/// An Event is an important occurrence in your app that you want to measure. You can report up to -/// 500 different types of Events per app and you can associate up to 25 unique parameters with each -/// Event type. Some common events are suggested below, but you may also choose to specify custom -/// Event types that are associated with your specific app. Each event type is identified by a -/// unique name. Event names can be up to 40 characters long, may only contain alphanumeric -/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_", -/// "google_", and "ga_" prefixes are reserved and should not be used. - -/// Add Payment Info event. This event signifies that a user has submitted their payment information -/// to your app. -static NSString *const kFIREventAddPaymentInfo NS_SWIFT_NAME(AnalyticsEventAddPaymentInfo) = - @"add_payment_info"; - -/// E-Commerce Add To Cart event. This event signifies that an item was added to a cart for -/// purchase. Add this event to a funnel with kFIREventEcommercePurchase to gauge the effectiveness -/// of your checkout process. Note: If you supply the @c kFIRParameterValue parameter, you must -/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed -/// accurately. Params: -/// -///
    -///
  • @c kFIRParameterQuantity (signed 64-bit integer as NSNumber)
  • -///
  • @c kFIRParameterItemID (NSString)
  • -///
  • @c kFIRParameterItemName (NSString)
  • -///
  • @c kFIRParameterItemCategory (NSString)
  • -///
  • @c kFIRParameterItemLocationID (NSString) (optional)
  • -///
  • @c kFIRParameterPrice (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterCurrency (NSString) (optional)
  • -///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterOrigin (NSString) (optional)
  • -///
  • @c kFIRParameterDestination (NSString) (optional)
  • -///
  • @c kFIRParameterStartDate (NSString) (optional)
  • -///
  • @c kFIRParameterEndDate (NSString) (optional)
  • -///
-static NSString *const kFIREventAddToCart NS_SWIFT_NAME(AnalyticsEventAddToCart) = @"add_to_cart"; - -/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. -/// Use this event to identify popular gift items in your app. Note: If you supply the -/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency -/// parameter so that revenue metrics can be computed accurately. Params: -/// -///
    -///
  • @c kFIRParameterQuantity (signed 64-bit integer as NSNumber)
  • -///
  • @c kFIRParameterItemID (NSString)
  • -///
  • @c kFIRParameterItemName (NSString)
  • -///
  • @c kFIRParameterItemCategory (NSString)
  • -///
  • @c kFIRParameterItemLocationID (NSString) (optional)
  • -///
  • @c kFIRParameterPrice (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterCurrency (NSString) (optional)
  • -///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • -///
-static NSString *const kFIREventAddToWishlist NS_SWIFT_NAME(AnalyticsEventAddToWishlist) = - @"add_to_wishlist"; - -/// App Open event. By logging this event when an App is moved to the foreground, developers can -/// understand how often users leave and return during the course of a Session. Although Sessions -/// are automatically reported, this event can provide further clarification around the continuous -/// engagement of app-users. -static NSString *const kFIREventAppOpen NS_SWIFT_NAME(AnalyticsEventAppOpen) = @"app_open"; - -/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of -/// checking out. Add this event to a funnel with your kFIREventEcommercePurchase event to gauge the -/// effectiveness of your checkout process. Note: If you supply the @c kFIRParameterValue -/// parameter, you must also supply the @c kFIRParameterCurrency parameter so that revenue -/// metrics can be computed accurately. Params: -/// -///
    -///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterCurrency (NSString) (optional)
  • -///
  • @c kFIRParameterTransactionID (NSString) (optional)
  • -///
  • @c kFIRParameterStartDate (NSString) (optional)
  • -///
  • @c kFIRParameterEndDate (NSString) (optional)
  • -///
  • @c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • @c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • @c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • @c kFIRParameterOrigin (NSString) (optional)
  • -///
  • @c kFIRParameterDestination (NSString) (optional)
  • -///
  • @c kFIRParameterTravelClass (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventBeginCheckout NS_SWIFT_NAME(AnalyticsEventBeginCheckout) = - @"begin_checkout"; - -/// Campaign Detail event. Log this event to supply the referral details of a re-engagement -/// campaign. Note: you must supply at least one of the required parameters kFIRParameterSource, -/// kFIRParameterMedium or kFIRParameterCampaign. Params: -/// -///
    -///
  • @c kFIRParameterSource (NSString)
  • -///
  • @c kFIRParameterMedium (NSString)
  • -///
  • @c kFIRParameterCampaign (NSString)
  • -///
  • @c kFIRParameterTerm (NSString) (optional)
  • -///
  • @c kFIRParameterContent (NSString) (optional)
  • -///
  • @c kFIRParameterAdNetworkClickID (NSString) (optional)
  • -///
  • @c kFIRParameterCP1 (NSString) (optional)
  • -///
-static NSString *const kFIREventCampaignDetails NS_SWIFT_NAME(AnalyticsEventCampaignDetails) = - @"campaign_details"; - -/// Checkout progress. Params: -/// -///
    -///
  • @c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)
  • -///
  • @c kFIRParameterCheckoutOption (NSString) (optional)
  • -///
-static NSString *const kFIREventCheckoutProgress NS_SWIFT_NAME(AnalyticsEventCheckoutProgress) = - @"checkout_progress"; - -/// Earn Virtual Currency event. This event tracks the awarding of virtual currency in your app. Log -/// this along with @c kFIREventSpendVirtualCurrency to better understand your virtual economy. -/// Params: -/// -///
    -///
  • @c kFIRParameterVirtualCurrencyName (NSString)
  • -///
  • @c kFIRParameterValue (signed 64-bit integer or double as NSNumber)
  • -///
-static NSString *const kFIREventEarnVirtualCurrency - NS_SWIFT_NAME(AnalyticsEventEarnVirtualCurrency) = @"earn_virtual_currency"; - -/// E-Commerce Purchase event. This event signifies that an item was purchased by a user. Note: -/// This is different from the in-app purchase event, which is reported automatically for App -/// Store-based apps. Note: If you supply the @c kFIRParameterValue parameter, you must also -/// supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed -/// accurately. Params: -/// -///
    -///
  • @c kFIRParameterCurrency (NSString) (optional)
  • -///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterTransactionID (NSString) (optional)
  • -///
  • @c kFIRParameterTax (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterShipping (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterCoupon (NSString) (optional)
  • -///
  • @c kFIRParameterLocation (NSString) (optional)
  • -///
  • @c kFIRParameterStartDate (NSString) (optional)
  • -///
  • @c kFIRParameterEndDate (NSString) (optional)
  • -///
  • @c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • @c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • @c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • @c kFIRParameterOrigin (NSString) (optional)
  • -///
  • @c kFIRParameterDestination (NSString) (optional)
  • -///
  • @c kFIRParameterTravelClass (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventEcommercePurchase NS_SWIFT_NAME(AnalyticsEventEcommercePurchase) = - @"ecommerce_purchase"; - -/// Generate Lead event. Log this event when a lead has been generated in the app to understand the -/// efficacy of your install and re-engagement campaigns. Note: If you supply the -/// @c kFIRParameterValue parameter, you must also supply the @c kFIRParameterCurrency -/// parameter so that revenue metrics can be computed accurately. Params: -/// -///
    -///
  • @c kFIRParameterCurrency (NSString) (optional)
  • -///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • -///
-static NSString *const kFIREventGenerateLead NS_SWIFT_NAME(AnalyticsEventGenerateLead) = - @"generate_lead"; - -/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use -/// this event to analyze how popular certain groups or social features are in your app. Params: -/// -///
    -///
  • @c kFIRParameterGroupID (NSString)
  • -///
-static NSString *const kFIREventJoinGroup NS_SWIFT_NAME(AnalyticsEventJoinGroup) = @"join_group"; - -/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can -/// help you gauge the level distribution of your userbase and help you identify certain levels that -/// are difficult to pass. Params: -/// -///
    -///
  • @c kFIRParameterLevel (signed 64-bit integer as NSNumber)
  • -///
  • @c kFIRParameterCharacter (NSString) (optional)
  • -///
-static NSString *const kFIREventLevelUp NS_SWIFT_NAME(AnalyticsEventLevelUp) = @"level_up"; - -/// Login event. Apps with a login feature can report this event to signify that a user has logged -/// in. -static NSString *const kFIREventLogin NS_SWIFT_NAME(AnalyticsEventLogin) = @"login"; - -/// Post Score event. Log this event when the user posts a score in your gaming app. This event can -/// help you understand how users are actually performing in your game and it can help you correlate -/// high scores with certain audiences or behaviors. Params: -/// -///
    -///
  • @c kFIRParameterScore (signed 64-bit integer as NSNumber)
  • -///
  • @c kFIRParameterLevel (signed 64-bit integer as NSNumber) (optional)
  • -///
  • @c kFIRParameterCharacter (NSString) (optional)
  • -///
-static NSString *const kFIREventPostScore NS_SWIFT_NAME(AnalyticsEventPostScore) = @"post_score"; - -/// Present Offer event. This event signifies that the app has presented a purchase offer to a user. -/// Add this event to a funnel with the kFIREventAddToCart and kFIREventEcommercePurchase to gauge -/// your conversion process. Note: If you supply the @c kFIRParameterValue parameter, you must -/// also supply the @c kFIRParameterCurrency parameter so that revenue metrics can be computed -/// accurately. Params: -/// -///
    -///
  • @c kFIRParameterQuantity (signed 64-bit integer as NSNumber)
  • -///
  • @c kFIRParameterItemID (NSString)
  • -///
  • @c kFIRParameterItemName (NSString)
  • -///
  • @c kFIRParameterItemCategory (NSString)
  • -///
  • @c kFIRParameterItemLocationID (NSString) (optional)
  • -///
  • @c kFIRParameterPrice (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterCurrency (NSString) (optional)
  • -///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • -///
-static NSString *const kFIREventPresentOffer NS_SWIFT_NAME(AnalyticsEventPresentOffer) = - @"present_offer"; - -/// E-Commerce Purchase Refund event. This event signifies that an item purchase was refunded. -/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the -/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. -/// Params: -/// -///
    -///
  • @c kFIRParameterCurrency (NSString) (optional)
  • -///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterTransactionID (NSString) (optional)
  • -///
-static NSString *const kFIREventPurchaseRefund NS_SWIFT_NAME(AnalyticsEventPurchaseRefund) = - @"purchase_refund"; - -/// Remove from cart event. Params: -/// -///
    -///
  • @c kFIRParameterQuantity (signed 64-bit integer as NSNumber)
  • -///
  • @c kFIRParameterItemID (NSString)
  • -///
  • @c kFIRParameterItemName (NSString)
  • -///
  • @c kFIRParameterItemCategory (NSString)
  • -///
  • @c kFIRParameterItemLocationID (NSString) (optional)
  • -///
  • @c kFIRParameterPrice (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterCurrency (NSString) (optional)
  • -///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterOrigin (NSString) (optional)
  • -///
  • @c kFIRParameterDestination (NSString) (optional)
  • -///
  • @c kFIRParameterStartDate (NSString) (optional)
  • -///
  • @c kFIRParameterEndDate (NSString) (optional)
  • -///
-static NSString *const kFIREventRemoveFromCart NS_SWIFT_NAME(AnalyticsEventRemoveFromCart) = - @"remove_from_cart"; - -/// Search event. Apps that support search features can use this event to contextualize search -/// operations by supplying the appropriate, corresponding parameters. This event can help you -/// identify the most popular content in your app. Params: -/// -///
    -///
  • @c kFIRParameterSearchTerm (NSString)
  • -///
  • @c kFIRParameterStartDate (NSString) (optional)
  • -///
  • @c kFIRParameterEndDate (NSString) (optional)
  • -///
  • @c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • @c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • @c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • @c kFIRParameterOrigin (NSString) (optional)
  • -///
  • @c kFIRParameterDestination (NSString) (optional)
  • -///
  • @c kFIRParameterTravelClass (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventSearch NS_SWIFT_NAME(AnalyticsEventSearch) = @"search"; - -/// Select Content event. This general purpose event signifies that a user has selected some content -/// of a certain type in an app. The content can be any object in your app. This event can help you -/// identify popular content and categories of content in your app. Params: -/// -///
    -///
  • @c kFIRParameterContentType (NSString)
  • -///
  • @c kFIRParameterItemID (NSString)
  • -///
-static NSString *const kFIREventSelectContent NS_SWIFT_NAME(AnalyticsEventSelectContent) = - @"select_content"; - -/// Set checkout option. Params: -/// -///
    -///
  • @c kFIRParameterCheckoutStep (unsigned 64-bit integer as NSNumber)
  • -///
  • @c kFIRParameterCheckoutOption (NSString)
  • -///
-static NSString *const kFIREventSetCheckoutOption NS_SWIFT_NAME(AnalyticsEventSetCheckoutOption) = - @"set_checkout_option"; - -/// Share event. Apps with social features can log the Share event to identify the most viral -/// content. Params: -/// -///
    -///
  • @c kFIRParameterContentType (NSString)
  • -///
  • @c kFIRParameterItemID (NSString)
  • -///
-static NSString *const kFIREventShare NS_SWIFT_NAME(AnalyticsEventShare) = @"share"; - -/// Sign Up event. This event indicates that a user has signed up for an account in your app. The -/// parameter signifies the method by which the user signed up. Use this event to understand the -/// different behaviors between logged in and logged out users. Params: -/// -///
    -///
  • @c kFIRParameterSignUpMethod (NSString)
  • -///
-static NSString *const kFIREventSignUp NS_SWIFT_NAME(AnalyticsEventSignUp) = @"sign_up"; - -/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can -/// help you identify which virtual goods are the most popular objects of purchase. Params: -/// -///
    -///
  • @c kFIRParameterItemName (NSString)
  • -///
  • @c kFIRParameterVirtualCurrencyName (NSString)
  • -///
  • @c kFIRParameterValue (signed 64-bit integer or double as NSNumber)
  • -///
-static NSString *const kFIREventSpendVirtualCurrency - NS_SWIFT_NAME(AnalyticsEventSpendVirtualCurrency) = @"spend_virtual_currency"; - -/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use -/// this in a funnel with kFIREventTutorialComplete to understand how many users complete this -/// process and move on to the full app experience. -static NSString *const kFIREventTutorialBegin NS_SWIFT_NAME(AnalyticsEventTutorialBegin) = - @"tutorial_begin"; - -/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding -/// process. Add this to a funnel with kFIREventTutorialBegin to gauge the completion rate of your -/// on-boarding process. -static NSString *const kFIREventTutorialComplete NS_SWIFT_NAME(AnalyticsEventTutorialComplete) = - @"tutorial_complete"; - -/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your -/// game. Since achievements generally represent the breadth of a gaming experience, this event can -/// help you understand how many users are experiencing all that your game has to offer. Params: -/// -///
    -///
  • @c kFIRParameterAchievementID (NSString)
  • -///
-static NSString *const kFIREventUnlockAchievement NS_SWIFT_NAME(AnalyticsEventUnlockAchievement) = - @"unlock_achievement"; - -/// View Item event. This event signifies that some content was shown to the user. This content may -/// be a product, a webpage or just a simple image or text. Use the appropriate parameters to -/// contextualize the event. Use this event to discover the most popular items viewed in your app. -/// Note: If you supply the @c kFIRParameterValue parameter, you must also supply the -/// @c kFIRParameterCurrency parameter so that revenue metrics can be computed accurately. -/// Params: -/// -///
    -///
  • @c kFIRParameterItemID (NSString)
  • -///
  • @c kFIRParameterItemName (NSString)
  • -///
  • @c kFIRParameterItemCategory (NSString)
  • -///
  • @c kFIRParameterItemLocationID (NSString) (optional)
  • -///
  • @c kFIRParameterPrice (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterQuantity (signed 64-bit integer as NSNumber) (optional)
  • -///
  • @c kFIRParameterCurrency (NSString) (optional)
  • -///
  • @c kFIRParameterValue (double as NSNumber) (optional)
  • -///
  • @c kFIRParameterStartDate (NSString) (optional)
  • -///
  • @c kFIRParameterEndDate (NSString) (optional)
  • -///
  • @c kFIRParameterFlightNumber (NSString) (optional) for travel bookings
  • -///
  • @c kFIRParameterNumberOfPassengers (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • @c kFIRParameterNumberOfNights (signed 64-bit integer as NSNumber) (optional) for -/// travel bookings
  • -///
  • @c kFIRParameterNumberOfRooms (signed 64-bit integer as NSNumber) (optional) for -/// travel bookings
  • -///
  • @c kFIRParameterOrigin (NSString) (optional)
  • -///
  • @c kFIRParameterDestination (NSString) (optional)
  • -///
  • @c kFIRParameterSearchTerm (NSString) (optional) for travel bookings
  • -///
  • @c kFIRParameterTravelClass (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventViewItem NS_SWIFT_NAME(AnalyticsEventViewItem) = @"view_item"; - -/// View Item List event. Log this event when the user has been presented with a list of items of a -/// certain category. Params: -/// -///
    -///
  • @c kFIRParameterItemCategory (NSString)
  • -///
-static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewItemList) = - @"view_item_list"; - -/// View Search Results event. Log this event when the user has been presented with the results of a -/// search. Params: -/// -///
    -///
  • @c kFIRParameterSearchTerm (NSString)
  • -///
-static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) = - @"view_search_results"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIROptions.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIROptions.h deleted file mode 100755 index 126824b02..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIROptions.h +++ /dev/null @@ -1 +0,0 @@ -#import diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h deleted file mode 100755 index e04146f85..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h +++ /dev/null @@ -1,485 +0,0 @@ -/// @file FIRParameterNames.h -/// -/// Predefined event parameter names. -/// -/// Params supply information that contextualize Events. You can associate up to 25 unique Params -/// with each Event type. Some Params are suggested below for certain common Events, but you are -/// not limited to these. You may supply extra Params for suggested Events or custom Params for -/// Custom events. Param names can be up to 40 characters long, may only contain alphanumeric -/// characters and underscores ("_"), and must start with an alphabetic character. Param values can -/// be up to 100 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and -/// should not be used. - -/// Game achievement ID (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterAchievementID : @"10_matches_won",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterAchievementID NS_SWIFT_NAME(AnalyticsParameterAchievementID) = - @"achievement_id"; - -/// Ad Network Click ID (NSString). Used for network-specific click IDs which vary in format. -///
-///     NSDictionary *params = @{
-///       kFIRParameterAdNetworkClickID : @"1234567",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterAdNetworkClickID - NS_SWIFT_NAME(AnalyticsParameterAdNetworkClickID) = @"aclid"; - -/// The store or affiliation from which this transaction occurred (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterAffiliation : @"Google Store",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterAffiliation NS_SWIFT_NAME(AnalyticsParameterAffiliation) = - @"affiliation"; - -/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to -/// capture campaign information, otherwise can be populated by developer. Highly Recommended -/// (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCampaign : @"winter_promotion",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) = - @"campaign"; - -/// Character used in game (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCharacter : @"beat_boss",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCharacter NS_SWIFT_NAME(AnalyticsParameterCharacter) = - @"character"; - -/// The checkout step (1..N) (unsigned 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCheckoutStep : @"1",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCheckoutStep NS_SWIFT_NAME(AnalyticsParameterCheckoutStep) = - @"checkout_step"; - -/// Some option on a step in an ecommerce flow (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCheckoutOption : @"Visa",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCheckoutOption - NS_SWIFT_NAME(AnalyticsParameterCheckoutOption) = @"checkout_option"; - -/// Campaign content (NSString). -static NSString *const kFIRParameterContent NS_SWIFT_NAME(AnalyticsParameterContent) = @"content"; - -/// Type of content selected (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterContentType : @"news article",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterContentType NS_SWIFT_NAME(AnalyticsParameterContentType) = - @"content_type"; - -/// Coupon code for a purchasable item (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCoupon : @"zz123",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCoupon NS_SWIFT_NAME(AnalyticsParameterCoupon) = @"coupon"; - -/// Campaign custom parameter (NSString). Used as a method of capturing custom data in a campaign. -/// Use varies by network. -///
-///     NSDictionary *params = @{
-///       kFIRParameterCP1 : @"custom_data",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCP1 NS_SWIFT_NAME(AnalyticsParameterCP1) = @"cp1"; - -/// The name of a creative used in a promotional spot (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCreativeName : @"Summer Sale",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCreativeName NS_SWIFT_NAME(AnalyticsParameterCreativeName) = - @"creative_name"; - -/// The name of a creative slot (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCreativeSlot : @"summer_banner2",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCreativeSlot NS_SWIFT_NAME(AnalyticsParameterCreativeSlot) = - @"creative_slot"; - -/// Purchase currency in 3-letter -/// ISO_4217 format (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCurrency : @"USD",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCurrency NS_SWIFT_NAME(AnalyticsParameterCurrency) = - @"currency"; - -/// Flight or Travel destination (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterDestination : @"Mountain View, CA",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterDestination NS_SWIFT_NAME(AnalyticsParameterDestination) = - @"destination"; - -/// The arrival date, check-out date or rental end date for the item. This should be in -/// YYYY-MM-DD format (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterEndDate : @"2015-09-14",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterEndDate NS_SWIFT_NAME(AnalyticsParameterEndDate) = @"end_date"; - -/// Flight number for travel events (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterFlightNumber : @"ZZ800",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterFlightNumber NS_SWIFT_NAME(AnalyticsParameterFlightNumber) = - @"flight_number"; - -/// Group/clan/guild ID (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterGroupID : @"g1",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterGroupID NS_SWIFT_NAME(AnalyticsParameterGroupID) = @"group_id"; - -/// Index of an item in a list (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterIndex : @(1),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterIndex NS_SWIFT_NAME(AnalyticsParameterIndex) = @"index"; - -/// Item brand (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemBrand : @"Google",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemBrand NS_SWIFT_NAME(AnalyticsParameterItemBrand) = - @"item_brand"; - -/// Item category (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemCategory : @"t-shirts",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemCategory NS_SWIFT_NAME(AnalyticsParameterItemCategory) = - @"item_category"; - -/// Item ID (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemID : @"p7654",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemID NS_SWIFT_NAME(AnalyticsParameterItemID) = @"item_id"; - -/// The Google Place ID (NSString) that -/// corresponds to the associated item. Alternatively, you can supply your own custom Location ID. -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemLocationID : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemLocationID - NS_SWIFT_NAME(AnalyticsParameterItemLocationID) = @"item_location_id"; - -/// Item name (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemName : @"abc",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemName NS_SWIFT_NAME(AnalyticsParameterItemName) = - @"item_name"; - -/// The list in which the item was presented to the user (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemList : @"Search Results",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemList NS_SWIFT_NAME(AnalyticsParameterItemList) = - @"item_list"; - -/// Item variant (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemVariant : @"Red",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemVariant NS_SWIFT_NAME(AnalyticsParameterItemVariant) = - @"item_variant"; - -/// Level in game (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterLevel : @(42),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterLevel NS_SWIFT_NAME(AnalyticsParameterLevel) = @"level"; - -/// Location (NSString). The Google Place ID -/// that corresponds to the associated event. Alternatively, you can supply your own custom -/// Location ID. -///
-///     NSDictionary *params = @{
-///       kFIRParameterLocation : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterLocation NS_SWIFT_NAME(AnalyticsParameterLocation) = - @"location"; - -/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended -/// (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterMedium : @"email",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium"; - -/// Number of nights staying at hotel (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterNumberOfNights : @(3),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterNumberOfNights - NS_SWIFT_NAME(AnalyticsParameterNumberOfNights) = @"number_of_nights"; - -/// Number of passengers traveling (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterNumberOfPassengers : @(11),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterNumberOfPassengers - NS_SWIFT_NAME(AnalyticsParameterNumberOfPassengers) = @"number_of_passengers"; - -/// Number of rooms for travel events (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterNumberOfRooms : @(2),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterNumberOfRooms NS_SWIFT_NAME(AnalyticsParameterNumberOfRooms) = - @"number_of_rooms"; - -/// Flight or Travel origin (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterOrigin : @"Mountain View, CA",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterOrigin NS_SWIFT_NAME(AnalyticsParameterOrigin) = @"origin"; - -/// Purchase price (double as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterPrice : @(1.0),
-///       kFIRParameterCurrency : @"USD",  // e.g. $1.00 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterPrice NS_SWIFT_NAME(AnalyticsParameterPrice) = @"price"; - -/// Purchase quantity (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterQuantity : @(1),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterQuantity NS_SWIFT_NAME(AnalyticsParameterQuantity) = - @"quantity"; - -/// Score in game (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterScore : @(4200),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterScore NS_SWIFT_NAME(AnalyticsParameterScore) = @"score"; - -/// The search string/keywords used (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterSearchTerm : @"periodic table",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterSearchTerm NS_SWIFT_NAME(AnalyticsParameterSearchTerm) = - @"search_term"; - -/// Shipping cost (double as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterShipping : @(9.50),
-///       kFIRParameterCurrency : @"USD",  // e.g. $9.50 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterShipping NS_SWIFT_NAME(AnalyticsParameterShipping) = - @"shipping"; - -/// Sign up method (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterSignUpMethod : @"google",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterSignUpMethod NS_SWIFT_NAME(AnalyticsParameterSignUpMethod) = - @"sign_up_method"; - -/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban -/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your -/// property. Highly recommended (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterSource : @"InMobi",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source"; - -/// The departure date, check-in date or rental start date for the item. This should be in -/// YYYY-MM-DD format (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterStartDate : @"2015-09-14",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterStartDate NS_SWIFT_NAME(AnalyticsParameterStartDate) = - @"start_date"; - -/// Tax amount (double as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterTax : @(1.0),
-///       kFIRParameterCurrency : @"USD",  // e.g. $1.00 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterTax NS_SWIFT_NAME(AnalyticsParameterTax) = @"tax"; - -/// If you're manually tagging keyword campaigns, you should use utm_term to specify the keyword -/// (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterTerm : @"game",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterTerm NS_SWIFT_NAME(AnalyticsParameterTerm) = @"term"; - -/// A single ID for a ecommerce group transaction (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterTransactionID : @"ab7236dd9823",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterTransactionID NS_SWIFT_NAME(AnalyticsParameterTransactionID) = - @"transaction_id"; - -/// Travel class (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterTravelClass : @"business",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterTravelClass NS_SWIFT_NAME(AnalyticsParameterTravelClass) = - @"travel_class"; - -/// A context-specific numeric value which is accumulated automatically for each event type. This is -/// a general purpose parameter that is useful for accumulating a key metric that pertains to an -/// event. Examples include revenue, distance, time and points. Value should be specified as signed -/// 64-bit integer or double as NSNumber. Notes: Values for pre-defined currency-related events -/// (such as @c kFIREventAddToCart) should be supplied using double as NSNumber and must be -/// accompanied by a @c kFIRParameterCurrency parameter. The valid range of accumulated values is -/// [-9,223,372,036,854.77, 9,223,372,036,854.77]. Supplying a non-numeric value, omitting the -/// corresponding @c kFIRParameterCurrency parameter, or supplying an invalid -/// currency code for conversion events will cause that -/// conversion to be omitted from reporting. -///
-///     NSDictionary *params = @{
-///       kFIRParameterValue : @(3.99),
-///       kFIRParameterCurrency : @"USD",  // e.g. $3.99 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterValue NS_SWIFT_NAME(AnalyticsParameterValue) = @"value"; - -/// Name of virtual currency type (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterVirtualCurrencyName : @"virtual_currency_name",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterVirtualCurrencyName - NS_SWIFT_NAME(AnalyticsParameterVirtualCurrencyName) = @"virtual_currency_name"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h deleted file mode 100755 index b984aa84e..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h +++ /dev/null @@ -1,15 +0,0 @@ -/// @file FIRUserPropertyNames.h -/// -/// Predefined user property names. -/// -/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can -/// later analyze different behaviors of various segments of your userbase. You may supply up to 25 -/// unique UserProperties per app, and you can use the name and value of your choosing for each one. -/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and -/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to -/// 36 characters long. The "firebase_", "google_", and "ga_" prefixes are reserved and should not -/// be used. - -/// The method used to sign in. For example, "google", "facebook" or "twitter". -static NSString *const kFIRUserPropertySignUpMethod - NS_SWIFT_NAME(AnalyticsUserPropertySignUpMethod) = @"sign_up_method"; diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h deleted file mode 100755 index e1e96f6df..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h +++ /dev/null @@ -1,10 +0,0 @@ -#import "FIRAnalyticsConfiguration.h" -#import "FIRApp.h" -#import "FIRConfiguration.h" -#import "FIROptions.h" -#import "FIRAnalytics+AppDelegate.h" -#import "FIRAnalytics.h" -#import "FIRAnalyticsSwiftNameSupport.h" -#import "FIREventNames.h" -#import "FIRParameterNames.h" -#import "FIRUserPropertyNames.h" diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap deleted file mode 100755 index ef80595cd..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Modules/module.modulemap +++ /dev/null @@ -1,10 +0,0 @@ -framework module FirebaseAnalytics { - umbrella header "FirebaseAnalytics.h" - export * - module * { export *} - link "sqlite3" - link "z" - link framework "Security" - link framework "StoreKit" - link framework "SystemConfiguration" - link framework "UIKit"} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/FirebaseCoreDiagnostics b/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/FirebaseCoreDiagnostics deleted file mode 100755 index 87e93860d..000000000 Binary files a/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/FirebaseCoreDiagnostics and /dev/null differ diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/Modules/module.modulemap b/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/Modules/module.modulemap deleted file mode 100755 index bbcb94e31..000000000 --- a/Pods/FirebaseAnalytics/Frameworks/FirebaseCoreDiagnostics.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module FirebaseCoreDiagnostics { - export * - module * { export *} - link "z" - link framework "Security" - link framework "SystemConfiguration"} diff --git a/Pods/FirebaseAnalytics/Frameworks/FirebaseNanoPB.framework/FirebaseNanoPB b/Pods/FirebaseAnalytics/Frameworks/FirebaseNanoPB.framework/FirebaseNanoPB deleted file mode 100755 index 6f22b024a..000000000 Binary files a/Pods/FirebaseAnalytics/Frameworks/FirebaseNanoPB.framework/FirebaseNanoPB and /dev/null differ diff --git a/Pods/FirebaseAuth/CHANGELOG.md b/Pods/FirebaseAuth/CHANGELOG.md deleted file mode 100755 index 176ae3b2b..000000000 --- a/Pods/FirebaseAuth/CHANGELOG.md +++ /dev/null @@ -1,112 +0,0 @@ -# v4.4.1 -- Fixes bug where the FIRAuthResult object returned following a Phone Number authentication - always contained a nil FIRAdditionalUserInfo object. Now the FIRAdditionalUserInfo object is - never nil and its newUser field is populated correctly. - -# v4.4.0 -- Adds new APIs which return an AuthDataResult object after successfully creating an - Email/Password user, signing in anonymously, signing in with Email/Password and signing - in with Custom Token. The AuthDataResult object contains the new user and additional - information pertaining to the new user. - -# v4.3.2 -- Improves error handling for the phone number sign-in reCAPTCHA flow. -- Improves error handling for phone number linking flow. -- Fixes issue where after linking an anonymous user to a phone number the user remained - anonymous. - -# v4.3.1 -- Internal clean up. - -# v4.3.0 -- Provides account creation and last sign-in dates as metadata to the user - object. -- Returns more descriptive errors for some error cases of the phone number - sign-in reCAPTCHA flow. -- Fixes an issue that invalid users were not automatically signed out earlier. -- Fixes an issue that ID token listeners were not fired in some cases. - -# v4.2.1 -- Fixes a threading issue in phone number auth that completion block was not - executed on the main thread in some error cases. - -# v4.2.0 -- Adds new phone number verification API which makes use of an intelligent reCAPTCHA to verify the application. - -# v4.1.1 -- Improves some method documentation in headers. - -# v4.1.0 -- Allows the app to handle continue URL natively, e.g., from password reset - email. -- Allows the app to set language code, e.g., for sending password reset email. -- Fixes an issue that user's phone number did not persist on client. -- Fixes an issue that recover email action code type was reported as unknown. -- Improves app start-up time by moving initialization off from the main - thread. -- Better reports missing email error when creating a new password user. -- Changes console message logging levels to be more consistent with other - Firebase products on the iOS platform. - -# 2017-05-17 -- v4.0.0 -- Adds Phone Number Authentication. -- Adds support for generic OAuth2 identity providers. -- Adds methods that return additional user data from identity providers if - available when authenticating users. -- Improves session management by automatically refreshing tokens if possible - and signing out users if the session is detected invalidated, for example, - after the user changed password or deleted account from another device. -- Fixes an issue that reauthentication creates new user account if the user - credential is valid but does not match the currently signed in user. -- Fixes an issue that the "password" provider is not immediately listed on the - client side after adding a password to an account. -- Changes factory methods to return non-null FIRAuth instances or raises an - exception, instead of returning nullable instances. -- Changes auth state change listener to only be triggered when the user changes. -- Adds a new listener which is triggered whenever the ID token is changed. -- Switches ERROR_EMAIL_ALREADY_IN_USE to - ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL when the email used in the - signInWithCredential: call is already in use by another account. -- Deprecates FIREmailPasswordAuthProvider in favor of FIREmailAuthProvider. -- Deprecates getTokenWithCompletion in favor of getIDTokenWithCompletion on - FIRUser. -- Changes Swift API names to better align with Swift convention. - -# 2017-02-06 -- v3.1.1 -- Allows handling of additional errors when sending OOB action emails. The - server can respond with the following new error messages: - INVALID_MESSAGE_PAYLOAD,INVALID_SENDER and INVALID_RECIPIENT_EMAIL. -- Removes incorrect reference to FIRAuthErrorCodeCredentialTooOld in FIRUser.h. -- Provides additional error information from server if available. - -# 2016-12-13 -- v3.1.0 -- Adds FIRAuth methods that enable the app to follow up with user actions - delivered by email, such as verifying email address or reset password. -- No longer applies the keychain workaround introduced in v3.0.5 on iOS 10.2 - simulator or above since the issue has been fixed. -- Fixes nullability compilation warnings when used in Swift. -- Better reports missing password error. - -# 2016-10-24 -- v3.0.6 -- Switches to depend on open sourced GoogleToolboxForMac and GTMSessionFetcher. -- Improves logging of keychain error when initializing. - -# 2016-09-14 -- v3.0.5 -- Works around a keychain issue in iOS 10 simulator. -- Reports the correct error for invalid email when signing in with email and - password. - -# 2016-07-18 -- v3.0.4 -- Fixes a race condition bug that could crash the app with an exception from - NSURLSession on iOS 9. - -# 2016-06-20 -- v3.0.3 -- Adds documentation for all possible errors returned by each method. -- Improves error handling and messages for a variety of error conditions. -- Whether or not an user is considered anonymous is now consistent with other - platforms. -- A saved signed in user is now siloed between different Firebase projects - within the same app. - -# 2016-05-18 -- v3.0.2 -- Initial public release. diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/FirebaseAuth b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/FirebaseAuth deleted file mode 100755 index 6bb955f82..000000000 Binary files a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/FirebaseAuth and /dev/null differ diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRActionCodeSettings.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRActionCodeSettings.h deleted file mode 100755 index 6eb4c89d9..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRActionCodeSettings.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - #import - - NS_ASSUME_NONNULL_BEGIN - - /** @class FIRActionCodeSettings - @brief Used to set and retrieve settings related to handling action codes. - */ - NS_SWIFT_NAME(ActionCodeSettings) - @interface FIRActionCodeSettings : NSObject - - /** @property URL - @brief This URL represents the state/Continue URL in the form of a universal link. - @remarks This URL can should be contructed as a universal link that would either directly open - the app where the action code would be handled or continue to the app after the action code - is handled by Firebase. - */ - @property(nonatomic, copy, nullable) NSURL *URL; - - /** @property handleCodeInApp - @brief Indicates whether the action code link will open the app directly or after being - redirected from a Firebase owned web widget. - */ - @property(assign, nonatomic) BOOL handleCodeInApp; - - /** @property iOSBundleID - @brief The iOS bundle ID, if available. The default value is the current app's bundle ID. - */ - @property(copy, nonatomic, readonly, nullable) NSString *iOSBundleID; - - /** @property androidPackageName - @brief The Android package name, if available. - */ - @property(nonatomic, copy, readonly, nullable) NSString *androidPackageName; - - /** @property androidMinimumVersion - @brief The minimum Android version supported, if available. - */ - @property(nonatomic, copy, readonly, nullable) NSString *androidMinimumVersion; - - /** @property androidInstallIfNotAvailable - @brief Indicates whether the Android app should be installed on a device where it is not - available. - */ - @property(nonatomic, assign, readonly) BOOL androidInstallIfNotAvailable; - - /** @fn setIOSBundleID - @brief Sets the iOS bundle Id. - @param iOSBundleID The iOS bundle ID. - */ - - (void)setIOSBundleID:(NSString *)iOSBundleID; - - /** @fn setAndroidPackageName:installIfNotAvailable:minimumVersion: - @brief Sets the Android package name, the flag to indicate whether or not to install the app and - the minimum Android version supported. - @param androidPackageName The Android package name. - @param installIfNotAvailable Indicates whether or not the app should be installed if not - available. - @param minimumVersion The minimum version of Android supported. - @remarks If installIfNotAvailable is set to YES and the link is opened on an android device, it - will try to install the app if not already available. Otherwise the web URL is used. - */ - - (void)setAndroidPackageName:(NSString *)androidPackageName - installIfNotAvailable:(BOOL)installIfNotAvailable - minimumVersion:(nullable NSString *)minimumVersion; - - @end - - NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAdditionalUserInfo.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAdditionalUserInfo.h deleted file mode 100755 index 4f6947ac8..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAdditionalUserInfo.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -@class FIRVerifyAssertionResponse; - -NS_ASSUME_NONNULL_BEGIN - -/** @class FIRAdditionalUserInfo - @brief Represents additional user data returned from an identity provider. - */ -NS_SWIFT_NAME(AdditionalUserInfo) -@interface FIRAdditionalUserInfo : NSObject - -/** @fn init - @brief This class should not be initialized manually. `FIRAdditionalUserInfo` can be retrieved - from from an instance of `FIRAuthDataResult`. - */ -- (instancetype)init NS_UNAVAILABLE; - -/** @property providerID - @brief The provider identifier. - */ -@property(nonatomic, readonly) NSString *providerID; - -/** @property profile - @brief Dictionary containing the additional IdP specific information. - */ -@property(nonatomic, readonly, nullable) NSDictionary *profile; - -/** @property username - @brief username The name of the user. - */ -@property(nonatomic, readonly, nullable) NSString *username; - -/** @property newUser - @brief Indicates whether or not the current user was signed in for the first time. - */ -@property(nonatomic, readonly, getter=isNewUser) BOOL newUser; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuth.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuth.h deleted file mode 100755 index f18a3d0b5..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuth.h +++ /dev/null @@ -1,775 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#import "FIRAuthErrors.h" - -#if TARGET_OS_IOS -#import "FIRAuthAPNSTokenType.h" -#endif - -@class FIRActionCodeSettings; -@class FIRApp; -@class FIRAuth; -@class FIRAuthCredential; -@class FIRAuthDataResult; -@class FIRUser; -@protocol FIRAuthStateListener; - -NS_ASSUME_NONNULL_BEGIN - -/** @typedef FIRAuthStateDidChangeListenerHandle - @brief The type of handle returned by `FIRAuth.addAuthStateDidChangeListener:`. - */ -typedef id FIRAuthStateDidChangeListenerHandle - NS_SWIFT_NAME(AuthStateDidChangeListenerHandle); - -/** @typedef FIRAuthStateDidChangeListenerBlock - @brief The type of block which can be registered as a listener for auth state did change events. - - @param auth The FIRAuth object on which state changes occurred. - @param user Optionally; the current signed in user, if any. - */ -typedef void(^FIRAuthStateDidChangeListenerBlock)(FIRAuth *auth, FIRUser *_Nullable user) - NS_SWIFT_NAME(AuthStateDidChangeListenerBlock); - -/** @typedef FIRIDTokenDidChangeListenerHandle - @brief The type of handle returned by `FIRAuth.addIDTokenDidChangeListener:`. - */ -typedef id FIRIDTokenDidChangeListenerHandle - NS_SWIFT_NAME(IDTokenDidChangeListenerHandle); - -/** @typedef FIRIDTokenDidChangeListenerBlock - @brief The type of block which can be registered as a listener for ID token did change events. - - @param auth The FIRAuth object on which ID token changes occurred. - @param user Optionally; the current signed in user, if any. - */ -typedef void(^FIRIDTokenDidChangeListenerBlock)(FIRAuth *auth, FIRUser *_Nullable user) - NS_SWIFT_NAME(IDTokenDidChangeListenerBlock); - -/** @typedef FIRAuthDataResultCallback - @brief The type of block invoked when sign-in related events complete. - - @param authResult Optionally; Result of sign-in request containing both the user and - the additional user info associated with the user. - @param error Optionally; the error which occurred - or nil if the request was successful. - */ -typedef void (^FIRAuthDataResultCallback)(FIRAuthDataResult *_Nullable authResult, - NSError *_Nullable error) - NS_SWIFT_NAME(AuthDataResultCallback); - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -/** - @brief The name of the `NSNotificationCenter` notification which is posted when the auth state - changes (for example, a new token has been produced, a user signs in or signs out). The - object parameter of the notification is the sender `FIRAuth` instance. - */ -extern const NSNotificationName FIRAuthStateDidChangeNotification - NS_SWIFT_NAME(AuthStateDidChange); -#else -/** - @brief The name of the `NSNotificationCenter` notification which is posted when the auth state - changes (for example, a new token has been produced, a user signs in or signs out). The - object parameter of the notification is the sender `FIRAuth` instance. - */ -extern NSString *const FIRAuthStateDidChangeNotification - NS_SWIFT_NAME(AuthStateDidChangeNotification); -#endif // defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - -/** @typedef FIRAuthResultCallback - @brief The type of block invoked when sign-in related events complete. - - @param user Optionally; the signed in user, if any. - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRAuthResultCallback)(FIRUser *_Nullable user, NSError *_Nullable error) - NS_SWIFT_NAME(AuthResultCallback); - -/** @typedef FIRProviderQueryCallback - @brief The type of block invoked when a list of identity providers for a given email address is - requested. - - @param providers Optionally; a list of provider identifiers, if any. - @see FIRGoogleAuthProviderID etc. - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRProviderQueryCallback)(NSArray *_Nullable providers, - NSError *_Nullable error) - NS_SWIFT_NAME(ProviderQueryCallback); - -/** @typedef FIRSendPasswordResetCallback - @brief The type of block invoked when sending a password reset email. - - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRSendPasswordResetCallback)(NSError *_Nullable error) - NS_SWIFT_NAME(SendPasswordResetCallback); - -/** @typedef FIRConfirmPasswordResetCallback - @brief The type of block invoked when performing a password reset. - - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRConfirmPasswordResetCallback)(NSError *_Nullable error) - NS_SWIFT_NAME(ConfirmPasswordResetCallback); - -/** @typedef FIRVerifyPasswordResetCodeCallback - @brief The type of block invoked when verifying that an out of band code should be used to - perform password reset. - - @param email Optionally; the email address of the user for which the out of band code applies. - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRVerifyPasswordResetCodeCallback)(NSString *_Nullable email, - NSError *_Nullable error) - NS_SWIFT_NAME(VerifyPasswordResetCodeCallback); - -/** @typedef FIRApplyActionCodeCallback - @brief The type of block invoked when applying an action code. - - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRApplyActionCodeCallback)(NSError *_Nullable error) - NS_SWIFT_NAME(ApplyActionCodeCallback); - -/** - @brief Keys used to retrieve operation data from a `FIRActionCodeInfo` object by the - `dataForKey` method. - */ -typedef NS_ENUM(NSInteger, FIRActionDataKey) { - /** - * The email address to which the code was sent. - * For FIRActionCodeOperationRecoverEmail, the new email address for the account. - */ - FIRActionCodeEmailKey = 0, - - /** For FIRActionCodeOperationRecoverEmail, the current email address for the account. */ - FIRActionCodeFromEmailKey = 1 -} NS_SWIFT_NAME(ActionDataKey); - -/** @class FIRActionCodeInfo - @brief Manages information regarding action codes. - */ -NS_SWIFT_NAME(ActionCodeInfo) -@interface FIRActionCodeInfo : NSObject - -/** - @brief Operations which can be performed with action codes. - */ -typedef NS_ENUM(NSInteger, FIRActionCodeOperation) { - /** Action code for unknown operation. */ - FIRActionCodeOperationUnknown = 0, - - /** Action code for password reset operation. */ - FIRActionCodeOperationPasswordReset = 1, - - /** Action code for verify email operation. */ - FIRActionCodeOperationVerifyEmail = 2, - - /** Action code for recover email operation. */ - FIRActionCodeOperationRecoverEmail = 3, - -} NS_SWIFT_NAME(ActionCodeOperation); - -/** - @brief The operation being performed. - */ -@property(nonatomic, readonly) FIRActionCodeOperation operation; - -/** @fn dataForKey: - @brief The operation being performed. - - @param key The FIRActionDataKey value used to retrieve the operation data. - - @return The operation data pertaining to the provided action code key. - */ -- (NSString *)dataForKey:(FIRActionDataKey)key; - -/** @fn init - @brief please use initWithOperation: instead. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -/** @typedef FIRCheckActionCodeCallBack - @brief The type of block invoked when performing a check action code operation. - - @param info Metadata corresponding to the action code. - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRCheckActionCodeCallBack)(FIRActionCodeInfo *_Nullable info, - NSError *_Nullable error) - NS_SWIFT_NAME(CheckActionCodeCallback); - -/** @class FIRAuth - @brief Manages authentication for Firebase apps. - @remarks This class is thread-safe. - */ -NS_SWIFT_NAME(Auth) -@interface FIRAuth : NSObject - -/** @fn auth - @brief Gets the auth object for the default Firebase app. - @remarks The default Firebase app must have already been configured or an exception will be - raised. - */ -+ (FIRAuth *)auth NS_SWIFT_NAME(auth()); - -/** @fn authWithApp: - @brief Gets the auth object for a `FIRApp`. - - @param app The FIRApp for which to retrieve the associated FIRAuth instance. - @return The FIRAuth instance associated with the given FIRApp. - */ -+ (FIRAuth *)authWithApp:(FIRApp *)app NS_SWIFT_NAME(auth(app:)); - -/** @property app - @brief Gets the `FIRApp` object that this auth object is connected to. - */ -@property(nonatomic, weak, readonly, nullable) FIRApp *app; - -/** @property currentUser - @brief Synchronously gets the cached current user, or null if there is none. - */ -@property(nonatomic, strong, readonly, nullable) FIRUser *currentUser; - -/** @property languageCode - @brief The current user language code. This property can be set to the app's current language by - calling `useAppLanguage`. - - @remarks The string used to set this property must be a language code that follows BCP 47. - */ -@property (nonatomic, copy, nullable) NSString *languageCode; - -#if TARGET_OS_IOS -/** @property APNSToken - @brief The APNs token used for phone number authentication. The type of the token (production - or sandbox) will be attempted to be automatcially detected. - @remarks If swizzling is disabled, the APNs Token must be set for phone number auth to work, - by either setting this property or by calling `setAPNSToken:type:` - */ -@property(nonatomic, strong, nullable) NSData *APNSToken; -#endif - -/** @fn init - @brief Please access auth instances using `FIRAuth.auth` and `FIRAuth.authForApp:`. - */ -- (instancetype)init NS_UNAVAILABLE; - -/** @fn fetchProvidersForEmail:completion: - @brief Fetches the list of IdPs that can be used for signing in with the provided email address. - Useful for an "identifier-first" sign-in flow. - - @param email The email address for which to obtain a list of identity providers. - @param completion Optionally; a block which is invoked when the list of providers for the - specified email address is ready or an error was encountered. Invoked asynchronously on the - main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)fetchProvidersForEmail:(NSString *)email - completion:(nullable FIRProviderQueryCallback)completion; - -/** @fn signInWithEmail:password:completion: - @brief Signs in using an email address and password. - - @param email The user's email address. - @param password The user's password. - @param completion Optionally; a block which is invoked when the sign in flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that email and password - accounts are not enabled. Enable them in the Auth section of the - Firebase console. - + `FIRAuthErrorCodeUserDisabled` - Indicates the user's account is disabled. - + `FIRAuthErrorCodeWrongPassword` - Indicates the user attempted - sign in with an incorrect password. - + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. - - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)signInWithEmail:(NSString *)email - password:(NSString *)password - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn signInAndRetrieveDataWithEmail:password:completion: - @brief Signs in using an email address and password. - - @param email The user's email address. - @param password The user's password. - @param completion Optionally; a block which is invoked when the sign in flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that email and password - accounts are not enabled. Enable them in the Auth section of the - Firebase console. - + `FIRAuthErrorCodeUserDisabled` - Indicates the user's account is disabled. - + `FIRAuthErrorCodeWrongPassword` - Indicates the user attempted - sign in with an incorrect password. - + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. - - - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - - @remarks This method will only exist until the next major Firebase release following 4.x.x. - After the next major release the method `signInWithEmail:password:completion:` will support - the `FIRAuthDataResultCallback`. - */ -- (void)signInAndRetrieveDataWithEmail:(NSString *)email - password:(NSString *)password - completion:(nullable FIRAuthDataResultCallback)completion; - -/** @fn signInWithCredential:completion: - @brief Convenience method for `signInAndRetrieveDataWithCredential:completion:` This method - doesn't return additional identity provider data. - */ -- (void)signInWithCredential:(FIRAuthCredential *)credential - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn signInAndRetrieveDataWithCredential:completion: - @brief Asynchronously signs in to Firebase with the given 3rd-party credentials (e.g. a Facebook - login Access Token, a Google ID Token/Access Token pair, etc.) and returns additional - identity provider data. - - @param credential The credential supplied by the IdP. - @param completion Optionally; a block which is invoked when the sign in flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidCredential` - Indicates the supplied credential is invalid. - This could happen if it has expired or it is malformed. - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that accounts - with the identity provider represented by the credential are not enabled. - Enable them in the Auth section of the Firebase console. - + `FIRAuthErrorCodeAccountExistsWithDifferentCredential` - Indicates the email asserted - by the credential (e.g. the email in a Facebook access token) is already in use by an - existing account, that cannot be authenticated with this sign-in method. Call - fetchProvidersForEmail for this user’s email and then prompt them to sign in with any of - the sign-in providers returned. This error will only be thrown if the "One account per - email address" setting is enabled in the Firebase console, under Auth settings. - + `FIRAuthErrorCodeUserDisabled` - Indicates the user's account is disabled. - + `FIRAuthErrorCodeWrongPassword` - Indicates the user attempted sign in with an - incorrect password, if credential is of the type EmailPasswordAuthCredential. - + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. - + `FIRAuthErrorCodeMissingVerificationID` - Indicates that the phone auth credential was - created with an empty verification ID. - + `FIRAuthErrorCodeMissingVerificationCode` - Indicates that the phone auth credential - was created with an empty verification code. - + `FIRAuthErrorCodeInvalidVerificationCode` - Indicates that the phone auth credential - was created with an invalid verification Code. - + `FIRAuthErrorCodeInvalidVerificationID` - Indicates that the phone auth credential was - created with an invalid verification ID. - + `FIRAuthErrorCodeSessionExpired` - Indicates that the SMS code has expired. - - - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)signInAndRetrieveDataWithCredential:(FIRAuthCredential *)credential - completion:(nullable FIRAuthDataResultCallback)completion; - -/** @fn signInAnonymouslyWithCompletion: - @brief Asynchronously creates and becomes an anonymous user. - @param completion Optionally; a block which is invoked when the sign in finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - - @remarks If there is already an anonymous user signed in, that user will be returned instead. - If there is any other existing user signed in, that user will be signed out. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that anonymous accounts are - not enabled. Enable them in the Auth section of the Firebase console. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)signInAnonymouslyWithCompletion:(nullable FIRAuthResultCallback)completion; - -/** @fn signInAnonymouslyAndRetrieveDataWithCompletion: - @brief Asynchronously creates and becomes an anonymous user. - @param completion Optionally; a block which is invoked when the sign in finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - - @remarks If there is already an anonymous user signed in, that user will be returned instead. - If there is any other existing user signed in, that user will be signed out. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that anonymous accounts are - not enabled. Enable them in the Auth section of the Firebase console. - - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - - @remarks This method will only exist until the next major Firebase release following 4.x.x. - After the next major release the method `signInAnonymouslyWithCompletion` will support the - `FIRAuthDataResultCallback`. - */ -- (void)signInAnonymouslyAndRetrieveDataWithCompletion: - (nullable FIRAuthDataResultCallback)completion; - -/** @fn signInWithCustomToken:completion: - @brief Asynchronously signs in to Firebase with the given Auth token. - - @param token A self-signed custom auth token. - @param completion Optionally; a block which is invoked when the sign in finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidCustomToken` - Indicates a validation error with - the custom token. - + `FIRAuthErrorCodeCustomTokenMismatch` - Indicates the service account and the API key - belong to different projects. - - - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)signInWithCustomToken:(NSString *)token - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn signInAndRetrieveDataWithCustomToken:completion: - @brief Asynchronously signs in to Firebase with the given Auth token. - - @param token A self-signed custom auth token. - @param completion Optionally; a block which is invoked when the sign in finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidCustomToken` - Indicates a validation error with - the custom token. - - + `FIRAuthErrorCodeCustomTokenMismatch` - Indicates the service account and the API key - belong to different projects. - - - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - - @remarks This method will only exist until the next major Firebase release following 4.x.x. - After the next major release the method `createUserWithEmail:password:completion:` will - support the `FIRAuthDataResultCallback`. - */ -- (void)signInAndRetrieveDataWithCustomToken:(NSString *)token - completion:(nullable FIRAuthDataResultCallback)completion; - - -/** @fn createUserWithEmail:password:completion: - @brief Creates and, on success, signs in a user with the given email address and password. - - @param email The user's email address. - @param password The user's desired password. - @param completion Optionally; a block which is invoked when the sign up flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. - + `FIRAuthErrorCodeEmailAlreadyInUse` - Indicates the email used to attempt sign up - already exists. Call fetchProvidersForEmail to check which sign-in mechanisms the user - used, and prompt the user to sign in with one of those. - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that email and password accounts - are not enabled. Enable them in the Auth section of the Firebase console. - + `FIRAuthErrorCodeWeakPassword` - Indicates an attempt to set a password that is - considered too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo - dictionary object will contain more detailed explanation that can be shown to the user. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)createUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn createUserAndRetrieveDataWithEmail:password:completion: - @brief Creates and, on success, signs in a user with the given email address and password. - - @param email The user's email address. - @param password The user's desired password. - @param completion Optionally; a block which is invoked when the sign up flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. - + `FIRAuthErrorCodeEmailAlreadyInUse` - Indicates the email used to attempt sign up - already exists. Call fetchProvidersForEmail to check which sign-in mechanisms the user - used, and prompt the user to sign in with one of those. - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that email and password accounts - are not enabled. Enable them in the Auth section of the Firebase console. - + `FIRAuthErrorCodeWeakPassword` - Indicates an attempt to set a password that is - considered too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo - dictionary object will contain more detailed explanation that can be shown to the user. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - - @remarks This method will only exist until the next major Firebase release following 4.x.x. - After the next major release the method `createUserWithEmail:password:completion:` will - support the `FIRAuthDataResultCallback`. - */ -- (void)createUserAndRetrieveDataWithEmail:(NSString *)email - password:(NSString *)password - completion:(nullable FIRAuthDataResultCallback)completion; - -/** @fn confirmPasswordResetWithCode:newPassword:completion: - @brief Resets the password given a code sent to the user outside of the app and a new password - for the user. - - @param newPassword The new password. - @param completion Optionally; a block which is invoked when the request finishes. Invoked - asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeWeakPassword` - Indicates an attempt to set a password that is - considered too weak. - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates the administrator disabled sign - in with the specified identity provider. - + `FIRAuthErrorCodeExpiredActionCode` - Indicates the OOB code is expired. - + `FIRAuthErrorCodeInvalidActionCode` - Indicates the OOB code is invalid. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)confirmPasswordResetWithCode:(NSString *)code - newPassword:(NSString *)newPassword - completion:(FIRConfirmPasswordResetCallback)completion; - -/** @fn checkActionCode:completion: - @brief Checks the validity of an out of band code. - - @param code The out of band code to check validity. - @param completion Optionally; a block which is invoked when the request finishes. Invoked - asynchronously on the main thread in the future. - */ -- (void)checkActionCode:(NSString *)code completion:(FIRCheckActionCodeCallBack)completion; - -/** @fn verifyPasswordResetCode:completion: - @brief Checks the validity of a verify password reset code. - - @param code The password reset code to be verified. - @param completion Optionally; a block which is invoked when the request finishes. Invoked - asynchronously on the main thread in the future. - */ -- (void)verifyPasswordResetCode:(NSString *)code - completion:(FIRVerifyPasswordResetCodeCallback)completion; - -/** @fn applyActionCode:completion: - @brief Applies out of band code. - - @param code The out of band code to be applied. - @param completion Optionally; a block which is invoked when the request finishes. Invoked - asynchronously on the main thread in the future. - - @remarks This method will not work for out of band codes which require an additional parameter, - such as password reset code. - */ -- (void)applyActionCode:(NSString *)code - completion:(FIRApplyActionCodeCallback)completion; - -/** @fn sendPasswordResetWithEmail:completion: - @brief Initiates a password reset for the given email address. - - @param email The email address of the user. - @param completion Optionally; a block which is invoked when the request finishes. Invoked - asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidRecipientEmail` - Indicates an invalid recipient email was - sent in the request. - + `FIRAuthErrorCodeInvalidSender` - Indicates an invalid sender email is set in - the console for this action. - + `FIRAuthErrorCodeInvalidMessagePayload` - Indicates an invalid email template for - sending update email. - - - */ -- (void)sendPasswordResetWithEmail:(NSString *)email - completion:(nullable FIRSendPasswordResetCallback)completion; - -/** @fn sendPasswordResetWithEmail:actionCodeSetting:completion: - @brief Initiates a password reset for the given email address and @FIRActionCodeSettings object. - - @param email The email address of the user. - @param actionCodeSettings An `FIRActionCodeSettings` object containing settings related to - handling action codes. - @param completion Optionally; a block which is invoked when the request finishes. Invoked - asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidRecipientEmail` - Indicates an invalid recipient email was - sent in the request. - + `FIRAuthErrorCodeInvalidSender` - Indicates an invalid sender email is set in - the console for this action. - + `FIRAuthErrorCodeInvalidMessagePayload` - Indicates an invalid email template for - sending update email. - + `FIRAuthErrorCodeMissingIosBundleID` - Indicates that the iOS bundle ID is missing when - `handleCodeInApp` is set to YES. - + `FIRAuthErrorCodeMissingAndroidPackageName` - Indicates that the android package name - is missing when the `androidInstallApp` flag is set to true. - + `FIRAuthErrorCodeUnauthorizedDomain` - Indicates that the domain specified in the - continue URL is not whitelisted in the Firebase console. - + `FIRAuthErrorCodeInvalidContinueURI` - Indicates that the domain specified in the - continue URI is not valid. - - - */ - - (void)sendPasswordResetWithEmail:(NSString *)email - actionCodeSettings:(FIRActionCodeSettings *)actionCodeSettings - completion:(nullable FIRSendPasswordResetCallback)completion; - -/** @fn signOut: - @brief Signs out the current user. - - @param error Optionally; if an error occurs, upon return contains an NSError object that - describes the problem; is nil otherwise. - @return @YES when the sign out request was successful. @NO otherwise. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeKeychainError` - Indicates an error occurred when accessing the - keychain. The `NSLocalizedFailureReasonErrorKey` field in the `NSError.userInfo` - dictionary will contain more information about the error encountered. - - - - */ -- (BOOL)signOut:(NSError *_Nullable *_Nullable)error; - -/** @fn addAuthStateDidChangeListener: - @brief Registers a block as an "auth state did change" listener. To be invoked when: - - + The block is registered as a listener, - + A user with a different UID from the current user has signed in, or - + The current user has signed out. - - @param listener The block to be invoked. The block is always invoked asynchronously on the main - thread, even for it's initial invocation after having been added as a listener. - - @remarks The block is invoked immediately after adding it according to it's standard invocation - semantics, asynchronously on the main thread. Users should pay special attention to - making sure the block does not inadvertently retain objects which should not be retained by - the long-lived block. The block itself will be retained by `FIRAuth` until it is - unregistered or until the `FIRAuth` instance is otherwise deallocated. - - @return A handle useful for manually unregistering the block as a listener. - */ -- (FIRAuthStateDidChangeListenerHandle)addAuthStateDidChangeListener: - (FIRAuthStateDidChangeListenerBlock)listener; - -/** @fn removeAuthStateDidChangeListener: - @brief Unregisters a block as an "auth state did change" listener. - - @param listenerHandle The handle for the listener. - */ -- (void)removeAuthStateDidChangeListener:(FIRAuthStateDidChangeListenerHandle)listenerHandle; - -/** @fn addIDTokenDidChangeListener: - @brief Registers a block as an "ID token did change" listener. To be invoked when: - - + The block is registered as a listener, - + A user with a different UID from the current user has signed in, - + The ID token of the current user has been refreshed, or - + The current user has signed out. - - @param listener The block to be invoked. The block is always invoked asynchronously on the main - thread, even for it's initial invocation after having been added as a listener. - - @remarks The block is invoked immediately after adding it according to it's standard invocation - semantics, asynchronously on the main thread. Users should pay special attention to - making sure the block does not inadvertently retain objects which should not be retained by - the long-lived block. The block itself will be retained by `FIRAuth` until it is - unregistered or until the `FIRAuth` instance is otherwise deallocated. - - @return A handle useful for manually unregistering the block as a listener. - */ -- (FIRIDTokenDidChangeListenerHandle)addIDTokenDidChangeListener: - (FIRIDTokenDidChangeListenerBlock)listener; - -/** @fn removeIDTokenDidChangeListener: - @brief Unregisters a block as an "ID token did change" listener. - - @param listenerHandle The handle for the listener. - */ -- (void)removeIDTokenDidChangeListener:(FIRIDTokenDidChangeListenerHandle)listenerHandle; - -/** @fn useAppLanguage - @brief Sets `languageCode` to the app's current language. - */ -- (void)useAppLanguage; - -#if TARGET_OS_IOS - -/** @fn canHandleURL: - @brief Whether the specific URL is handled by `FIRAuth` . - @param URL The URL received by the application delegate from any of the openURL method. - @return Whether or the URL is handled. YES means the URL is for Firebase Auth - so the caller should ignore the URL from further processing, and NO means the - the URL is for the app (or another libaray) so the caller should continue handling - this URL as usual. - @remarks If swizzling is disabled, URLs received by the application delegate must be forwarded - to this method for phone number auth to work. - */ -- (BOOL)canHandleURL:(nonnull NSURL *)URL; - -/** @fn setAPNSToken:type: - @brief Sets the APNs token along with its type. - @remarks If swizzling is disabled, the APNs Token must be set for phone number auth to work, - by either setting calling this method or by setting the `APNSToken` property. - */ -- (void)setAPNSToken:(NSData *)token type:(FIRAuthAPNSTokenType)type; - -/** @fn canHandleNotification: - @brief Whether the specific remote notification is handled by `FIRAuth` . - @param userInfo A dictionary that contains information related to the - notification in question. - @return Whether or the notification is handled. YES means the notification is for Firebase Auth - so the caller should ignore the notification from further processing, and NO means the - the notification is for the app (or another libaray) so the caller should continue handling - this notification as usual. - @remarks If swizzling is disabled, related remote notifications must be forwarded to this method - for phone number auth to work. - */ -- (BOOL)canHandleNotification:(NSDictionary *)userInfo; - -#endif // TARGET_OS_IOS - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthAPNSTokenType.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthAPNSTokenType.h deleted file mode 100755 index 4f3c9f6a8..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthAPNSTokenType.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * @brief The APNs token type for the app. - */ -typedef NS_ENUM(NSInteger, FIRAuthAPNSTokenType) { - - /** Unknown token type. - The actual token type will be detected from the provisioning profile in the app's bundle. - */ - FIRAuthAPNSTokenTypeUnknown, - - /** Sandbox token type. - */ - FIRAuthAPNSTokenTypeSandbox, - - /** Production token type. - */ - FIRAuthAPNSTokenTypeProd, -} NS_SWIFT_NAME(AuthAPNSTokenType); - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthCredential.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthCredential.h deleted file mode 100755 index 106d844f7..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthCredential.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** @class FIRAuthCredential - @brief Represents a credential. - */ -NS_SWIFT_NAME(AuthCredential) -@interface FIRAuthCredential : NSObject - -/** @property provider - @brief Gets the name of the identity provider for the credential. - */ -@property(nonatomic, copy, readonly) NSString *provider; - -/** @fn init - @brief This is an abstract base class. Concrete instances should be created via factory - methods available in the various authentication provider libraries (like the Facebook - provider or the Google provider libraries.) - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthDataResult.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthDataResult.h deleted file mode 100755 index bc4fa4a2a..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthDataResult.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -@class FIRAdditionalUserInfo; -@class FIRUser; - -NS_ASSUME_NONNULL_BEGIN - -/** @class FIRAuthDataResult - @brief Helper object that contains the result of a successful sign-in, link and reauthenticate - action. It contains references to a FIRUser instance and a FIRAdditionalUserInfo instance. - */ -NS_SWIFT_NAME(AuthDataResult) -@interface FIRAuthDataResult : NSObject - -/** @fn init - @brief This class should not be initialized manually. `FIRAuthDataResult` instance is - returned as part of `FIRAuthDataResultCallback`. - */ -- (instancetype)init NS_UNAVAILABLE; - -/** @property user - @brief The signed in user. - */ -@property(nonatomic, readonly) FIRUser *user; - -/** @property additionalUserInfo - @brief If available contains the additional IdP specific information about signed in user. - */ -@property(nonatomic, readonly, nullable) FIRAdditionalUserInfo *additionalUserInfo; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthErrors.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthErrors.h deleted file mode 100755 index b8e5fb6fd..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthErrors.h +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -/** @class FIRAuthErrors - @remarks Error Codes common to all API Methods: - - + `FIRAuthErrorCodeNetworkError` - + `FIRAuthErrorCodeUserNotFound` - + `FIRAuthErrorCodeUserTokenExpired` - + `FIRAuthErrorCodeTooManyRequests` - + `FIRAuthErrorCodeInvalidAPIKey` - + `FIRAuthErrorCodeAppNotAuthorized` - + `FIRAuthErrorCodeKeychainError` - + `FIRAuthErrorCodeInternalError` - - @remarks Common error codes for `FIRUser` operations: - - + `FIRAuthErrorCodeInvalidUserToken` - + `FIRAuthErrorCodeUserDisabled` - - */ -NS_SWIFT_NAME(AuthErrors) -@interface FIRAuthErrors - -/** - @brief The Firebase Auth error domain. - */ -extern NSString *const FIRAuthErrorDomain NS_SWIFT_NAME(AuthErrorDomain); - -/** - @brief The key used to read the updated credential from the userinfo dictionary of the NSError - object returned in the case that the credential being linked in already in use. - */ -extern NSString *const FIRAuthUpdatedCredentialKey NS_SWIFT_NAME(AuthUpdatedCredentialKey); - -/** - @brief The name of the key for the "error_name" string in the NSError userinfo dictionary. - */ -extern NSString *const FIRAuthErrorNameKey NS_SWIFT_NAME(AuthErrorNameKey); - -/** - @brief Errors with the code `FIRAuthErrorCodeAccountExistsWithDifferentCredential` may contain - an `NSError.userInfo` dictinary object which contains this key. The value associated with - this key is an NSString of the email address of the account that already exists. - */ -extern NSString *const FIRAuthErrorUserInfoEmailKey NS_SWIFT_NAME(AuthErrorUserInfoEmailKey); - -/** - @brief Error codes used by Firebase Auth. - */ -typedef NS_ENUM(NSInteger, FIRAuthErrorCode) { - /** Indicates a validation error with the custom token. - */ - FIRAuthErrorCodeInvalidCustomToken = 17000, - - /** Indicates the service account and the API key belong to different projects. - */ - FIRAuthErrorCodeCustomTokenMismatch = 17002, - - /** Indicates the IDP token or requestUri is invalid. - */ - FIRAuthErrorCodeInvalidCredential = 17004, - - /** Indicates the user's account is disabled on the server. - */ - FIRAuthErrorCodeUserDisabled = 17005, - - /** Indicates the administrator disabled sign in with the specified identity provider. - */ - FIRAuthErrorCodeOperationNotAllowed = 17006, - - /** Indicates the email used to attempt a sign up is already in use. - */ - FIRAuthErrorCodeEmailAlreadyInUse = 17007, - - /** Indicates the email is invalid. - */ - FIRAuthErrorCodeInvalidEmail = 17008, - - /** Indicates the user attempted sign in with a wrong password. - */ - FIRAuthErrorCodeWrongPassword = 17009, - - /** Indicates that too many requests were made to a server method. - */ - FIRAuthErrorCodeTooManyRequests = 17010, - - /** Indicates the user account was not found. - */ - FIRAuthErrorCodeUserNotFound = 17011, - - /** Indicates account linking is required. - */ - FIRAuthErrorCodeAccountExistsWithDifferentCredential = 17012, - - /** Indicates the user has attemped to change email or password more than 5 minutes after - signing in. - */ - FIRAuthErrorCodeRequiresRecentLogin = 17014, - - /** Indicates an attempt to link a provider to which the account is already linked. - */ - FIRAuthErrorCodeProviderAlreadyLinked = 17015, - - /** Indicates an attempt to unlink a provider that is not linked. - */ - FIRAuthErrorCodeNoSuchProvider = 17016, - - /** Indicates user's saved auth credential is invalid, the user needs to sign in again. - */ - FIRAuthErrorCodeInvalidUserToken = 17017, - - /** Indicates a network error occurred (such as a timeout, interrupted connection, or - unreachable host). These types of errors are often recoverable with a retry. The - `NSUnderlyingError` field in the `NSError.userInfo` dictionary will contain the error - encountered. - */ - FIRAuthErrorCodeNetworkError = 17020, - - /** Indicates the saved token has expired, for example, the user may have changed account - password on another device. The user needs to sign in again on the device that made this - request. - */ - FIRAuthErrorCodeUserTokenExpired = 17021, - - /** Indicates an invalid API key was supplied in the request. - */ - FIRAuthErrorCodeInvalidAPIKey = 17023, - - /** Indicates that an attempt was made to reauthenticate with a user which is not the current - user. - */ - FIRAuthErrorCodeUserMismatch = 17024, - - /** Indicates an attempt to link with a credential that has already been linked with a - different Firebase account - */ - FIRAuthErrorCodeCredentialAlreadyInUse = 17025, - - /** Indicates an attempt to set a password that is considered too weak. - */ - FIRAuthErrorCodeWeakPassword = 17026, - - /** Indicates the App is not authorized to use Firebase Authentication with the - provided API Key. - */ - FIRAuthErrorCodeAppNotAuthorized = 17028, - - /** Indicates the OOB code is expired. - */ - FIRAuthErrorCodeExpiredActionCode = 17029, - - /** Indicates the OOB code is invalid. - */ - FIRAuthErrorCodeInvalidActionCode = 17030, - - /** Indicates that there are invalid parameters in the payload during a "send password reset - * email" attempt. - */ - FIRAuthErrorCodeInvalidMessagePayload = 17031, - - /** Indicates that the sender email is invalid during a "send password reset email" attempt. - */ - FIRAuthErrorCodeInvalidSender = 17032, - - /** Indicates that the recipient email is invalid. - */ - FIRAuthErrorCodeInvalidRecipientEmail = 17033, - - /** Indicates that an email address was expected but one was not provided. - */ - FIRAuthErrorCodeMissingEmail = 17034, - - // The enum values 17035 is reserved and should NOT be used for new error codes. - - /** Indicates that the iOS bundle ID is missing when a iOS App Store ID is provided. - */ - FIRAuthErrorCodeMissingIosBundleID = 17036, - - /** Indicates that the android package name is missing when the `androidInstallApp` flag is set - to true. - */ - FIRAuthErrorCodeMissingAndroidPackageName = 17037, - - /** Indicates that the domain specified in the continue URL is not whitelisted in the Firebase - console. - */ - FIRAuthErrorCodeUnauthorizedDomain = 17038, - - /** Indicates that the domain specified in the continue URI is not valid. - */ - FIRAuthErrorCodeInvalidContinueURI = 17039, - - /** Indicates that a continue URI was not provided in a request to the backend which requires - one. - */ - FIRAuthErrorCodeMissingContinueURI = 17040, - - /** Indicates that a phone number was not provided in a call to - `verifyPhoneNumber:completion:`. - */ - FIRAuthErrorCodeMissingPhoneNumber = 17041, - - /** Indicates that an invalid phone number was provided in a call to - `verifyPhoneNumber:completion:`. - */ - FIRAuthErrorCodeInvalidPhoneNumber = 17042, - - /** Indicates that the phone auth credential was created with an empty verification code. - */ - FIRAuthErrorCodeMissingVerificationCode = 17043, - - /** Indicates that an invalid verification code was used in the verifyPhoneNumber request. - */ - FIRAuthErrorCodeInvalidVerificationCode = 17044, - - /** Indicates that the phone auth credential was created with an empty verification ID. - */ - FIRAuthErrorCodeMissingVerificationID = 17045, - - /** Indicates that an invalid verification ID was used in the verifyPhoneNumber request. - */ - FIRAuthErrorCodeInvalidVerificationID = 17046, - - /** Indicates that the APNS device token is missing in the verifyClient request. - */ - FIRAuthErrorCodeMissingAppCredential = 17047, - - /** Indicates that an invalid APNS device token was used in the verifyClient request. - */ - FIRAuthErrorCodeInvalidAppCredential = 17048, - - // The enum values between 17048 and 17051 are reserved and should NOT be used for new error - // codes. - - /** Indicates that the SMS code has expired. - */ - FIRAuthErrorCodeSessionExpired = 17051, - - /** Indicates that the quota of SMS messages for a given project has been exceeded. - */ - FIRAuthErrorCodeQuotaExceeded = 17052, - - /** Indicates that the APNs device token could not be obtained. The app may not have set up - remote notification correctly, or may fail to forward the APNs device token to FIRAuth - if app delegate swizzling is disabled. - */ - FIRAuthErrorCodeMissingAppToken = 17053, - - /** Indicates that the app fails to forward remote notification to FIRAuth. - */ - FIRAuthErrorCodeNotificationNotForwarded = 17054, - - /** Indicates that the app could not be verified by Firebase during phone number authentication. - */ - FIRAuthErrorCodeAppNotVerified = 17055, - - /** Indicates that the reCAPTCHA token is not valid. - */ - FIRAuthErrorCodeCaptchaCheckFailed = 17056, - - /** Indicates that an attempt was made to present a new web context while one was already being - presented. - */ - FIRAuthErrorCodeWebContextAlreadyPresented = 17057, - - /** Indicates that the URL presentation was cancelled prematurely by the user. - */ - FIRAuthErrorCodeWebContextCancelled = 17058, - - /** Indicates a general failure during the app verification flow. - */ - FIRAuthErrorCodeAppVerificationUserInteractionFailure = 17059, - - /** Indicates that the clientID used to invoke a web flow is invalid. - */ - FIRAuthErrorCodeInvalidClientID = 17060, - - /** Indicates that a network request within a SFSafariViewController or UIWebview failed. - */ - FIRAuthErrorCodeWebNetworkRequestFailed = 17061, - - /** Indicates that an internal error occurred within a SFSafariViewController or UIWebview. - */ - FIRAuthErrorCodeWebInternalError = 17062, - - /** Indicates an error occurred while attempting to access the keychain. - */ - FIRAuthErrorCodeKeychainError = 17995, - - /** Indicates an internal error occurred. - */ - FIRAuthErrorCodeInternalError = 17999, -} NS_SWIFT_NAME(AuthErrorCode); - -@end diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthUIDelegate.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthUIDelegate.h deleted file mode 100755 index 9b3296826..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthUIDelegate.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -/** @protocol FIRAuthUIDelegate - @brief A protocol to handle user interface interactions for Firebase Auth. - */ -NS_SWIFT_NAME(AuthUIDelegate) -@protocol FIRAuthUIDelegate - -/** @fn presentViewController:animated:completion: - @brief If implemented, this method will be invoked when Firebase Auth needs to display a view - controller. - @param viewControllerToPresent The view controller to be presented. - @param flag Decides whether the view controller presentation should be animated or not. - @param completion The block to execute after the presentation finishes. This block has no return - value and takes no parameters. -*/ -- (void)presentViewController:(UIViewController *)viewControllerToPresent - animated:(BOOL)flag - completion:(void (^ _Nullable)(void))completion; - -/** @fn dismissViewControllerAnimated:completion: - @brief If implemented, this method will be invoked when Firebase Auth needs to display a view - controller. - @param flag Decides whether removing the view controller should be animated or not. - @param completion The block to execute after the presentation finishes. This block has no return - value and takes no parameters. -*/ -- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^ _Nullable)(void))completion - NS_SWIFT_NAME(dismiss(animated:completion:)); - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIREmailAuthProvider.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIREmailAuthProvider.h deleted file mode 100755 index 0108d4060..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIREmailAuthProvider.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** - @brief A string constant identifying the email & password identity provider. - */ -extern NSString *const FIREmailAuthProviderID NS_SWIFT_NAME(EmailAuthProviderID); - -/** - @brief please use `FIREmailAuthProviderID` instead. - */ -extern NSString *const FIREmailPasswordAuthProviderID __attribute__((deprecated)); - -/** @class FIREmailAuthProvider - @brief A concrete implementation of `FIRAuthProvider` for Email & Password Sign In. - */ -NS_SWIFT_NAME(EmailAuthProvider) -@interface FIREmailAuthProvider : NSObject - -/** @typedef FIREmailPasswordAuthProvider - @brief Please use `FIREmailAuthProvider` instead. - */ -typedef FIREmailAuthProvider FIREmailPasswordAuthProvider __attribute__((deprecated)); - - -/** @fn credentialWithEmail:password: - @brief Creates an `FIRAuthCredential` for an email & password sign in. - - @param email The user's email address. - @param password The user's password. - @return A FIRAuthCredential containing the email & password credential. - */ -+ (FIRAuthCredential *)credentialWithEmail:(NSString *)email password:(NSString *)password; - -/** @fn init - @brief This class is not meant to be initialized. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRFacebookAuthProvider.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRFacebookAuthProvider.h deleted file mode 100755 index f08740f60..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRFacebookAuthProvider.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** - @brief A string constant identifying the Facebook identity provider. - */ -extern NSString *const FIRFacebookAuthProviderID NS_SWIFT_NAME(FacebookAuthProviderID); - -/** @class FIRFacebookAuthProvider - @brief Utility class for constructing Facebook credentials. - */ -NS_SWIFT_NAME(FacebookAuthProvider) -@interface FIRFacebookAuthProvider : NSObject - -/** @fn credentialWithAccessToken: - @brief Creates an `FIRAuthCredential` for a Facebook sign in. - - @param accessToken The Access Token from Facebook. - @return A FIRAuthCredential containing the Facebook credentials. - */ -+ (FIRAuthCredential *)credentialWithAccessToken:(NSString *)accessToken; - -/** @fn init - @brief This class should not be initialized. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRGitHubAuthProvider.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRGitHubAuthProvider.h deleted file mode 100755 index f0b5dbecd..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRGitHubAuthProvider.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** - @brief A string constant identifying the GitHub identity provider. - */ -extern NSString *const FIRGitHubAuthProviderID NS_SWIFT_NAME(GitHubAuthProviderID); - -/** @class FIRGitHubAuthProvider - @brief Utility class for constructing GitHub credentials. - */ -NS_SWIFT_NAME(GitHubAuthProvider) -@interface FIRGitHubAuthProvider : NSObject - -/** @fn credentialWithToken: - @brief Creates an `FIRAuthCredential` for a GitHub sign in. - - @param token The GitHub OAuth access token. - @return A FIRAuthCredential containing the GitHub credential. - */ -+ (FIRAuthCredential *)credentialWithToken:(NSString *)token; - -/** @fn init - @brief This class is not meant to be initialized. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRGoogleAuthProvider.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRGoogleAuthProvider.h deleted file mode 100755 index e80d87e3b..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRGoogleAuthProvider.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** - @brief A string constant identifying the Google identity provider. - */ -extern NSString *const FIRGoogleAuthProviderID NS_SWIFT_NAME(GoogleAuthProviderID); - -/** @class FIRGoogleAuthProvider - @brief Utility class for constructing Google Sign In credentials. - */ -NS_SWIFT_NAME(GoogleAuthProvider) -@interface FIRGoogleAuthProvider : NSObject - -/** @fn credentialWithIDToken:accessToken: - @brief Creates an `FIRAuthCredential` for a Google sign in. - - @param IDToken The ID Token from Google. - @param accessToken The Access Token from Google. - @return A FIRAuthCredential containing the Google credentials. - */ -+ (FIRAuthCredential *)credentialWithIDToken:(NSString *)IDToken - accessToken:(NSString *)accessToken; - -/** @fn init - @brief This class should not be initialized. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIROAuthProvider.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIROAuthProvider.h deleted file mode 100755 index cc628f8c6..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIROAuthProvider.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @class FIROAuthProvider - @brief A concrete implementation of `FIRAuthProvider` for generic OAuth Providers. - */ -NS_SWIFT_NAME(OAuthProvider) -@interface FIROAuthProvider : NSObject - -/** @fn credentialWithProviderID:IDToken:accessToken: - @brief Creates an `FIRAuthCredential` for that OAuth 2 provider identified by providerID, ID - token and access token. - - @param providerID The provider ID associated with the Auth credential being created. - @param IDToken The IDToken associated with the Auth credential being created. - @param accessToken The accessstoken associated with the Auth credential be created, if - available. - @return A FIRAuthCredential for the specified provider ID, ID token and access token. - */ -+ (FIRAuthCredential *)credentialWithProviderID:(NSString *)providerID - IDToken:(NSString *)IDToken - accessToken:(nullable NSString *)accessToken; - - -/** @fn credentialWithProviderID:accessToken: - @brief Creates an `FIRAuthCredential` for that OAuth 2 provider identified by providerID using - an ID token. - - @param providerID The provider ID associated with the Auth credential being created. - @param accessToken The accessstoken associated with the Auth credential be created - @return A FIRAuthCredential. - */ -+ (FIRAuthCredential *)credentialWithProviderID:(NSString *)providerID - accessToken:(NSString *)accessToken; - -/** @fn init - @brief This class is not meant to be initialized. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRPhoneAuthCredential.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRPhoneAuthCredential.h deleted file mode 100755 index 26dfca85a..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRPhoneAuthCredential.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#import "FIRAuthCredential.h" - -NS_ASSUME_NONNULL_BEGIN - -/** @class FIRPhoneAuthCredential - @brief Implementation of FIRAuthCredential for Phone Auth credentials. - */ -NS_SWIFT_NAME(PhoneAuthCredential) -@interface FIRPhoneAuthCredential : FIRAuthCredential - -/** @fn init - @brief This class is not supposed to be instantiated directly. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRPhoneAuthProvider.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRPhoneAuthProvider.h deleted file mode 100755 index 34db683e4..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRPhoneAuthProvider.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -@class FIRAuth; -@class FIRPhoneAuthCredential; -@protocol FIRAuthUIDelegate; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIRPhoneAuthProviderID - @brief A string constant identifying the phone identity provider. - */ -extern NSString *const FIRPhoneAuthProviderID NS_SWIFT_NAME(PhoneAuthProviderID); - -/** @typedef FIRVerificationResultCallback - @brief The type of block invoked when a request to send a verification code has finished. - - @param verificationID On success, the verification ID provided, nil otherwise. - @param error On error, the error that occured, nil otherwise. - */ -typedef void (^FIRVerificationResultCallback)(NSString *_Nullable verificationID, - NSError *_Nullable error) - NS_SWIFT_NAME(VerificationResultCallback); - -/** @class FIRPhoneAuthProvider - @brief A concrete implementation of `FIRAuthProvider` for phone auth providers. - */ -NS_SWIFT_NAME(PhoneAuthProvider) -@interface FIRPhoneAuthProvider : NSObject - -/** @fn provider - @brief Returns an instance of `FIRPhoneAuthProvider` for the default `FIRAuth` object. - */ -+ (instancetype)provider NS_SWIFT_NAME(provider()); - -/** @fn providerWithAuth: - @brief Returns an instance of `FIRPhoneAuthProvider` for the provided `FIRAuth` object. - - @param auth The auth object to associate with the phone auth provider instance. - */ -+ (instancetype)providerWithAuth:(FIRAuth *)auth NS_SWIFT_NAME(provider(auth:)); - -/** @fn verifyPhoneNumber:completion: - @brief Please use `verifyPhoneNumber:UIDelegate:completion:` instead. - - @param phoneNumber The phone number to be verified. - @param completion The callback to be invoked when the verification flow is finished. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeAppNotVerified` - Indicates that Firebase could not retrieve the - silent push notification and therefore could not verify your app. - + `FIRAuthErrorCodeInvalidAppCredential` - Indicates that The APNs device token provided - is either incorrect or does not match the private certificate uploaded to the Firebase - Console. - + `FIRAuthErrorCodeQuotaExceeded` - Indicates that the phone verification quota for this - project has been exceeded. - + `FIRAuthErrorCodeInvalidPhoneNumber` - Indicates that the phone number provided is - invalid. - + `FIRAuthErrorCodeMissingPhoneNumber` - Indicates that a phone number was not provided. - + `FIRAuthErrorCodeMissingAppToken` - Indicates that the APNs device token could not be - obtained. The app may not have set up remote notification correctly, or may fail to - forward the APNs device token to FIRAuth if app delegate swizzling is disabled. - */ -- (void)verifyPhoneNumber:(NSString *)phoneNumber - completion:(nullable FIRVerificationResultCallback)completion - __attribute__((deprecated)); - -/** @fn verifyPhoneNumber:UIDelegate:completion: - @brief Starts the phone number authentication flow by sending a verifcation code to the - specified phone number. - @param phoneNumber The phone number to be verified. - @param UIDelegate An object used to present the SFSafariViewController. The object is retained - by this method until the completion block is executed. - @param completion The callback to be invoked when the verification flow is finished. - @remarks Possible error codes: - - + `FIRAuthErrorCodeCaptchaCheckFailed` - Indicates that the reCAPTCHA token obtained by - the Firebase Auth is invalid or has expired. - + `FIRAuthErrorCodeQuotaExceeded` - Indicates that the phone verification quota for this - project has been exceeded. - + `FIRAuthErrorCodeInvalidPhoneNumber` - Indicates that the phone number provided is - invalid. - + `FIRAuthErrorCodeMissingPhoneNumber` - Indicates that a phone number was not provided. - */ -- (void)verifyPhoneNumber:(NSString *)phoneNumber - UIDelegate:(nullable id)UIDelegate - completion:(nullable FIRVerificationResultCallback)completion; - -/** @fn credentialWithVerificationID:verificationCode: - @brief Creates an `FIRAuthCredential` for the phone number provider identified by the - verification ID and verification code. - - @param verificationID The verification ID obtained from invoking - verifyPhoneNumber:completion: - @param verificationCode The verification code obtained from the user. - @return The corresponding phone auth credential for the verification ID and verification code - provided. - */ -- (FIRPhoneAuthCredential *)credentialWithVerificationID:(NSString *)verificationID - verificationCode:(NSString *)verificationCode; - -/** @fn init - @brief Please use the `provider` or `providerWithAuth:` methods to obtain an instance of - `FIRPhoneAuthProvider`. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRTwitterAuthProvider.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRTwitterAuthProvider.h deleted file mode 100755 index 2ef32f702..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRTwitterAuthProvider.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** - @brief A string constant identifying the Twitter identity provider. - */ -extern NSString *const FIRTwitterAuthProviderID NS_SWIFT_NAME(TwitterAuthProviderID); - -/** @class FIRTwitterAuthProvider - @brief Utility class for constructing Twitter credentials. - */ -NS_SWIFT_NAME(TwitterAuthProvider) -@interface FIRTwitterAuthProvider : NSObject - -/** @fn credentialWithToken:secret: - @brief Creates an `FIRAuthCredential` for a Twitter sign in. - - @param token The Twitter OAuth token. - @param secret The Twitter OAuth secret. - @return A FIRAuthCredential containing the Twitter credential. - */ -+ (FIRAuthCredential *)credentialWithToken:(NSString *)token secret:(NSString *)secret; - -/** @fn init - @brief This class is not meant to be initialized. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUser.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUser.h deleted file mode 100755 index 1bba71057..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUser.h +++ /dev/null @@ -1,466 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#import "FIRAuth.h" -#import "FIRAuthDataResult.h" -#import "FIRUserInfo.h" - -@class FIRPhoneAuthCredential; -@class FIRUserProfileChangeRequest; -@class FIRUserMetadata; - -NS_ASSUME_NONNULL_BEGIN - -/** @typedef FIRAuthTokenCallback - @brief The type of block called when a token is ready for use. - @see FIRUser.getIDTokenWithCompletion: - @see FIRUser.getIDTokenForcingRefresh:withCompletion: - - @param token Optionally; an access token if the request was successful. - @param error Optionally; the error which occurred - or nil if the request was successful. - - @remarks One of: `token` or `error` will always be non-nil. - */ -typedef void (^FIRAuthTokenCallback)(NSString *_Nullable token, NSError *_Nullable error) - NS_SWIFT_NAME(AuthTokenCallback); - -/** @typedef FIRUserProfileChangeCallback - @brief The type of block called when a user profile change has finished. - - @param error Optionally; the error which occurred - or nil if the request was successful. - */ -typedef void (^FIRUserProfileChangeCallback)(NSError *_Nullable error) - NS_SWIFT_NAME(UserProfileChangeCallback); - -/** @typedef FIRSendEmailVerificationCallback - @brief The type of block called when a request to send an email verification has finished. - - @param error Optionally; the error which occurred - or nil if the request was successful. - */ -typedef void (^FIRSendEmailVerificationCallback)(NSError *_Nullable error) - NS_SWIFT_NAME(SendEmailVerificationCallback); - -/** @class FIRUser - @brief Represents a user. - @remarks This class is thread-safe. - */ -NS_SWIFT_NAME(User) -@interface FIRUser : NSObject - -/** @property anonymous - @brief Indicates the user represents an anonymous user. - */ -@property(nonatomic, readonly, getter=isAnonymous) BOOL anonymous; - -/** @property emailVerified - @brief Indicates the email address associated with this user has been verified. - */ -@property(nonatomic, readonly, getter=isEmailVerified) BOOL emailVerified; - -/** @property refreshToken - @brief A refresh token; useful for obtaining new access tokens independently. - @remarks This property should only be used for advanced scenarios, and is not typically needed. - */ -@property(nonatomic, readonly, nullable) NSString *refreshToken; - -/** @property providerData - @brief Profile data for each identity provider, if any. - @remarks This data is cached on sign-in and updated when linking or unlinking. - */ -@property(nonatomic, readonly, nonnull) NSArray> *providerData; - -/** @property metadata - @brief Metadata associated with the Firebase user in question. - */ -@property(nonatomic, readonly, nonnull) FIRUserMetadata *metadata; - -/** @fn init - @brief This class should not be instantiated. - @remarks To retrieve the current user, use `FIRAuth.currentUser`. To sign a user - in or out, use the methods on `FIRAuth`. - */ -- (instancetype)init NS_UNAVAILABLE; - -/** @fn updateEmail:completion: - @brief Updates the email address for the user. On success, the cached user profile data is - updated. - @remarks May fail if there is already an account with this email address that was created using - email and password authentication. - - @param email The email address for the user. - @param completion Optionally; the block invoked when the user profile change has finished. - Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidRecipientEmail` - Indicates an invalid recipient email was - sent in the request. - + `FIRAuthErrorCodeInvalidSender` - Indicates an invalid sender email is set in - the console for this action. - + `FIRAuthErrorCodeInvalidMessagePayload` - Indicates an invalid email template for - sending update email. - + `FIRAuthErrorCodeEmailAlreadyInUse` - Indicates the email is already in use by another - account. - + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. - + `FIRAuthErrorCodeRequiresRecentLogin` - Updating a user’s email is a security - sensitive operation that requires a recent login from the user. This error indicates - the user has not signed in recently enough. To resolve, reauthenticate the user by - invoking reauthenticateWithCredential:completion: on FIRUser. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. - */ -- (void)updateEmail:(NSString *)email completion:(nullable FIRUserProfileChangeCallback)completion - NS_SWIFT_NAME(updateEmail(to:completion:)); - -/** @fn updatePassword:completion: - @brief Updates the password for the user. On success, the cached user profile data is updated. - - @param password The new password for the user. - @param completion Optionally; the block invoked when the user profile change has finished. - Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates the administrator disabled - sign in with the specified identity provider. - + `FIRAuthErrorCodeRequiresRecentLogin` - Updating a user’s password is a security - sensitive operation that requires a recent login from the user. This error indicates - the user has not signed in recently enough. To resolve, reauthenticate the user by - invoking reauthenticateWithCredential:completion: on FIRUser. - + `FIRAuthErrorCodeWeakPassword` - Indicates an attempt to set a password that is - considered too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo - dictionary object will contain more detailed explanation that can be shown to the user. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. - */ -- (void)updatePassword:(NSString *)password - completion:(nullable FIRUserProfileChangeCallback)completion - NS_SWIFT_NAME(updatePassword(to:completion:)); - -#if TARGET_OS_IOS -/** @fn updatePhoneNumberCredential:completion: - @brief Updates the phone number for the user. On success, the cached user profile data is - updated. - - @param phoneNumberCredential The new phone number credential corresponding to the phone number - to be added to the firebaes account, if a phone number is already linked to the account this - new phone number will replace it. - @param completion Optionally; the block invoked when the user profile change has finished. - Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeRequiresRecentLogin` - Updating a user’s phone number is a security - sensitive operation that requires a recent login from the user. This error indicates - the user has not signed in recently enough. To resolve, reauthenticate the user by - invoking reauthenticateWithCredential:completion: on FIRUser. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. - */ -- (void)updatePhoneNumberCredential:(FIRPhoneAuthCredential *)phoneNumberCredential - completion:(nullable FIRUserProfileChangeCallback)completion; -#endif - -/** @fn profileChangeRequest - @brief Creates an object which may be used to change the user's profile data. - - @remarks Set the properties of the returned object, then call - `FIRUserProfileChangeRequest.commitChangesWithCallback:` to perform the updates atomically. - - @return An object which may be used to change the user's profile data atomically. - */ -- (FIRUserProfileChangeRequest *)profileChangeRequest NS_SWIFT_NAME(createProfileChangeRequest()); - -/** @fn reloadWithCompletion: - @brief Reloads the user's profile data from the server. - - @param completion Optionally; the block invoked when the reload has finished. Invoked - asynchronously on the main thread in the future. - - @remarks May fail with a `FIRAuthErrorCodeRequiresRecentLogin` error code. In this case - you should call `FIRUser.reauthenticateWithCredential:completion:` before re-invoking - `FIRUser.updateEmail:completion:`. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)reloadWithCompletion:(nullable FIRUserProfileChangeCallback)completion; - -/** @fn reauthenticateWithCredential:completion: - @brief Convenience method for `reauthenticateAndRetrieveDataWithCredential:completion:` This - method doesn't return additional identity provider data. - */ -- (void)reauthenticateWithCredential:(FIRAuthCredential *)credential - completion:(nullable FIRUserProfileChangeCallback)completion; - -/** @fn reauthenticateWithCredential:completion: - @brief Renews the user's authentication tokens by validating a fresh set of credentials supplied - by the user and returns additional identity provider data. - - @param credential A user-supplied credential, which will be validated by the server. This can be - a successful third-party identity provider sign-in, or an email address and password. - @param completion Optionally; the block invoked when the re-authentication operation has - finished. Invoked asynchronously on the main thread in the future. - - @remarks If the user associated with the supplied credential is different from the current user, - or if the validation of the supplied credentials fails; an error is returned and the current - user remains signed in. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidCredential` - Indicates the supplied credential is invalid. - This could happen if it has expired or it is malformed. - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that accounts with the - identity provider represented by the credential are not enabled. Enable them in the - Auth section of the Firebase console. - + `FIRAuthErrorCodeEmailAlreadyInUse` - Indicates the email asserted by the credential - (e.g. the email in a Facebook access token) is already in use by an existing account, - that cannot be authenticated with this method. Call fetchProvidersForEmail for - this user’s email and then prompt them to sign in with any of the sign-in providers - returned. This error will only be thrown if the "One account per email address" - setting is enabled in the Firebase console, under Auth settings. Please note that the - error code raised in this specific situation may not be the same on Web and Android. - + `FIRAuthErrorCodeUserDisabled` - Indicates the user's account is disabled. - + `FIRAuthErrorCodeWrongPassword` - Indicates the user attempted reauthentication with - an incorrect password, if credential is of the type EmailPasswordAuthCredential. - + `FIRAuthErrorCodeUserMismatch` - Indicates that an attempt was made to - reauthenticate with a user which is not the current user. - + `FIRAuthErrorCodeInvalidEmail` - Indicates the email address is malformed. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)reauthenticateAndRetrieveDataWithCredential:(FIRAuthCredential *) credential - completion:(nullable FIRAuthDataResultCallback) completion; - -/** @fn getIDTokenWithCompletion: - @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. - - @param completion Optionally; the block invoked when the token is available. Invoked - asynchronously on the main thread in the future. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)getIDTokenWithCompletion:(nullable FIRAuthTokenCallback)completion - NS_SWIFT_NAME(getIDToken(completion:)); - -/** @fn getTokenWithCompletion: - @brief Please use `getIDTokenWithCompletion:` instead. - - @param completion Optionally; the block invoked when the token is available. Invoked - asynchronously on the main thread in the future. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)getTokenWithCompletion:(nullable FIRAuthTokenCallback)completion - NS_SWIFT_NAME(getToken(completion:)) __attribute__((deprecated)); - -/** @fn getIDTokenForcingRefresh:completion: - @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. - - @param forceRefresh Forces a token refresh. Useful if the token becomes invalid for some reason - other than an expiration. - @param completion Optionally; the block invoked when the token is available. Invoked - asynchronously on the main thread in the future. - - @remarks The authentication token will be refreshed (by making a network request) if it has - expired, or if `forceRefresh` is YES. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)getIDTokenForcingRefresh:(BOOL)forceRefresh - completion:(nullable FIRAuthTokenCallback)completion; - -/** @fn getTokenForcingRefresh:completion: - @brief Please use getIDTokenForcingRefresh:completion instead. - - @param forceRefresh Forces a token refresh. Useful if the token becomes invalid for some reason - other than an expiration. - @param completion Optionally; the block invoked when the token is available. Invoked - asynchronously on the main thread in the future. - - @remarks The authentication token will be refreshed (by making a network request) if it has - expired, or if `forceRefresh` is YES. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all API methods. - */ -- (void)getTokenForcingRefresh:(BOOL)forceRefresh - completion:(nullable FIRAuthTokenCallback)completion - __attribute__((deprecated)); - -/** @fn linkWithCredential:completion: - @brief Convenience method for `linkAndRetrieveDataWithCredential:completion:` This method - doesn't return additional identity provider data. - */ -- (void)linkWithCredential:(FIRAuthCredential *)credential - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn linkAndRetrieveDataWithCredential:completion: - @brief Associates a user account from a third-party identity provider with this user and - returns additional identity provider data. - - @param credential The credential for the identity provider. - @param completion Optionally; the block invoked when the unlinking is complete, or fails. - Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeProviderAlreadyLinked` - Indicates an attempt to link a provider of a - type already linked to this account. - + `FIRAuthErrorCodeCredentialAlreadyInUse` - Indicates an attempt to link with a - credential - that has already been linked with a different Firebase account. - + `FIRAuthErrorCodeOperationNotAllowed` - Indicates that accounts with the identity - provider represented by the credential are not enabled. Enable them in the Auth section - of the Firebase console. - - @remarks This method may also return error codes associated with updateEmail:completion: and - updatePassword:completion: on FIRUser. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. - */ -- (void)linkAndRetrieveDataWithCredential:(FIRAuthCredential *) credential - completion:(nullable FIRAuthDataResultCallback) completion; - -/** @fn unlinkFromProvider:completion: - @brief Disassociates a user account from a third-party identity provider with this user. - - @param provider The provider ID of the provider to unlink. - @param completion Optionally; the block invoked when the unlinking is complete, or fails. - Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeNoSuchProvider` - Indicates an attempt to unlink a provider - that is not linked to the account. - + `FIRAuthErrorCodeRequiresRecentLogin` - Updating email is a security sensitive - operation that requires a recent login from the user. This error indicates the user - has not signed in recently enough. To resolve, reauthenticate the user by invoking - reauthenticateWithCredential:completion: on FIRUser. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. - */ -- (void)unlinkFromProvider:(NSString *)provider - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn sendEmailVerificationWithCompletion: - @brief Initiates email verification for the user. - - @param completion Optionally; the block invoked when the request to send an email verification - is complete, or fails. Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidRecipientEmail` - Indicates an invalid recipient email was - sent in the request. - + `FIRAuthErrorCodeInvalidSender` - Indicates an invalid sender email is set in - the console for this action. - + `FIRAuthErrorCodeInvalidMessagePayload` - Indicates an invalid email template for - sending update email. - + `FIRAuthErrorCodeUserNotFound` - Indicates the user account was not found. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. - */ -- (void)sendEmailVerificationWithCompletion:(nullable FIRSendEmailVerificationCallback)completion; - -/** @fn sendEmailVerificationWithActionCodeSettings:completion: - @brief Initiates email verification for the user. - - @param actionCodeSettings An `FIRActionCodeSettings` object containing settings related to - handling action codes. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeInvalidRecipientEmail` - Indicates an invalid recipient email was - sent in the request. - + `FIRAuthErrorCodeInvalidSender` - Indicates an invalid sender email is set in - the console for this action. - + `FIRAuthErrorCodeInvalidMessagePayload` - Indicates an invalid email template for - sending update email. - + `FIRAuthErrorCodeUserNotFound` - Indicates the user account was not found. - + `FIRAuthErrorCodeMissingIosBundleID` - Indicates that the iOS bundle ID is missing when - a iOS App Store ID is provided. - + `FIRAuthErrorCodeMissingAndroidPackageName` - Indicates that the android package name - is missing when the `androidInstallApp` flag is set to true. - + `FIRAuthErrorCodeUnauthorizedDomain` - Indicates that the domain specified in the - continue URL is not whitelisted in the Firebase console. - + `FIRAuthErrorCodeInvalidContinueURI` - Indicates that the domain specified in the - continue URI is not valid. - */ -- (void)sendEmailVerificationWithActionCodeSettings:(FIRActionCodeSettings *)actionCodeSettings - completion:(nullable FIRSendEmailVerificationCallback) - completion; - -/** @fn deleteWithCompletion: - @brief Deletes the user account (also signs out the user, if this was the current user). - - @param completion Optionally; the block invoked when the request to delete the account is - complete, or fails. Invoked asynchronously on the main thread in the future. - - @remarks Possible error codes: - - + `FIRAuthErrorCodeRequiresRecentLogin` - Updating email is a security sensitive - operation that requires a recent login from the user. This error indicates the user - has not signed in recently enough. To resolve, reauthenticate the user by invoking - reauthenticateWithCredential:completion: on FIRUser. - - @remarks See `FIRAuthErrors` for a list of error codes that are common to all FIRUser methods. - - */ -- (void)deleteWithCompletion:(nullable FIRUserProfileChangeCallback)completion; - -@end - -/** @class FIRUserProfileChangeRequest - @brief Represents an object capable of updating a user's profile data. - @remarks Properties are marked as being part of a profile update when they are set. Setting a - property value to nil is not the same as leaving the property unassigned. - */ -NS_SWIFT_NAME(UserProfileChangeRequest) -@interface FIRUserProfileChangeRequest : NSObject - -/** @fn init - @brief Please use `FIRUser.profileChangeRequest` - */ -- (instancetype)init NS_UNAVAILABLE; - -/** @property displayName - @brief The user's display name. - @remarks It is an error to set this property after calling - `FIRUserProfileChangeRequest.commitChangesWithCallback:` - */ -@property(nonatomic, copy, nullable) NSString *displayName; - -/** @property photoURL - @brief The user's photo URL. - @remarks It is an error to set this property after calling - `FIRUserProfileChangeRequest.commitChangesWithCallback:` - */ -@property(nonatomic, copy, nullable) NSURL *photoURL; - -/** @fn commitChangesWithCompletion: - @brief Commits any pending changes. - @remarks This method should only be called once. Once called, property values should not be - changed. - - @param completion Optionally; the block invoked when the user profile change has been applied. - Invoked asynchronously on the main thread in the future. - */ -- (void)commitChangesWithCompletion:(nullable FIRUserProfileChangeCallback)completion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUserInfo.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUserInfo.h deleted file mode 100755 index 04eca495d..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUserInfo.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - @brief Represents user data returned from an identity provider. - */ -NS_SWIFT_NAME(UserInfo) -@protocol FIRUserInfo - -/** @property providerID - @brief The provider identifier. - */ -@property(nonatomic, copy, readonly) NSString *providerID; - -/** @property uid - @brief The provider's user ID for the user. - */ -@property(nonatomic, copy, readonly) NSString *uid; - -/** @property displayName - @brief The name of the user. - */ -@property(nonatomic, copy, readonly, nullable) NSString *displayName; - -/** @property photoURL - @brief The URL of the user's profile photo. - */ -@property(nonatomic, copy, readonly, nullable) NSURL *photoURL; - -/** @property email - @brief The user's email address. - */ -@property(nonatomic, copy, readonly, nullable) NSString *email; - -/** @property phoneNumber - @brief A phone number associated with the user. - @remarks This property is only available for users authenticated via phone number auth. - */ -@property(nonatomic, readonly, nullable) NSString *phoneNumber; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUserMetadata.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUserMetadata.h deleted file mode 100755 index 25331718d..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUserMetadata.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** @class FIRUserMetdata - @brief A data class representing the metadata corresponding to a Firebase user. - */ -NS_SWIFT_NAME(UserMetadata) -@interface FIRUserMetadata : NSObject - -/** @property lastSignInDate - @brief Stores the last sign in date for the corresponding Firebase user. - */ -@property (copy, nonatomic, readonly, nullable) NSDate *lastSignInDate; - -/** @property creationDate - @brief Stores the creation date for the corresponding Firebase user. - */ -@property (copy, nonatomic, readonly, nullable) NSDate *creationDate; - -/** @fn init - @brief This class should not be initialized manually, an instance of this class can be obtained - from a Firebase user object. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FirebaseAuth.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FirebaseAuth.h deleted file mode 100755 index 4433f04ab..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FirebaseAuth.h +++ /dev/null @@ -1,20 +0,0 @@ -#import "FirebaseAuthVersion.h" -#import "FIRActionCodeSettings.h" -#import "FIRAdditionalUserInfo.h" -#import "FIRAuth.h" -#import "FIRAuthAPNSTokenType.h" -#import "FIRAuthCredential.h" -#import "FIRAuthDataResult.h" -#import "FIRAuthErrors.h" -#import "FIRAuthUIDelegate.h" -#import "FIREmailAuthProvider.h" -#import "FIRFacebookAuthProvider.h" -#import "FIRGitHubAuthProvider.h" -#import "FIRGoogleAuthProvider.h" -#import "FIROAuthProvider.h" -#import "FIRPhoneAuthCredential.h" -#import "FIRPhoneAuthProvider.h" -#import "FIRTwitterAuthProvider.h" -#import "FIRUser.h" -#import "FIRUserInfo.h" -#import "FIRUserMetadata.h" diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FirebaseAuthVersion.h b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FirebaseAuthVersion.h deleted file mode 100755 index 3f29d7b86..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FirebaseAuthVersion.h +++ /dev/null @@ -1,18 +0,0 @@ -/*! @file FirebaseAuthVersion.h - @brief Firebase SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -/** - Version number for FirebaseAuth. - */ -extern const double FirebaseAuthVersionNumber; - -/** - Version string for FirebaseAuth. - */ -extern const unsigned char *const FirebaseAuthVersionString; diff --git a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Modules/module.modulemap b/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Modules/module.modulemap deleted file mode 100755 index e6d36ada2..000000000 --- a/Pods/FirebaseAuth/Frameworks/FirebaseAuth.framework/Modules/module.modulemap +++ /dev/null @@ -1,9 +0,0 @@ -framework module FirebaseAuth { - umbrella header "FirebaseAuth.h" - export * - module * { export *} - link "z" - link framework "CoreGraphics" - link framework "SafariServices" - link framework "Security" - link framework "SystemConfiguration"} diff --git a/Pods/FirebaseAuth/README.md b/Pods/FirebaseAuth/README.md deleted file mode 100755 index f6e123e36..000000000 --- a/Pods/FirebaseAuth/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Firebase Auth for iOS - -Firebase Auth enables apps to easily support multiple authentication options -for their end users. - -Please visit [our developer site](https://firebase.google.com/docs/auth/) for -integration instructions, documentation, support information, and terms of -service. - -# Firebase Auth Development - -Example/Auth contains a set of samples and tests that integrate with -FirebaseAuth. - -The unit tests run without any additional configuration along with the rest of -Firebase. See [Example/Auth/README.md](../../Example/Auth/README.md) for -information about setting up, running, and testing the samples. diff --git a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/FirebaseCore b/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/FirebaseCore deleted file mode 100755 index c4274e43b..000000000 Binary files a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/FirebaseCore and /dev/null differ diff --git a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRAnalyticsConfiguration.h b/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRAnalyticsConfiguration.h deleted file mode 100755 index ca1d32c6e..000000000 --- a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRAnalyticsConfiguration.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * This class provides configuration fields for Firebase Analytics. - */ -NS_SWIFT_NAME(AnalyticsConfiguration) -@interface FIRAnalyticsConfiguration : NSObject - -/** - * Returns the shared instance of FIRAnalyticsConfiguration. - */ -+ (FIRAnalyticsConfiguration *)sharedInstance NS_SWIFT_NAME(shared()); - -/** - * Sets the minimum engagement time in seconds required to start a new session. The default value - * is 10 seconds. - */ -- (void)setMinimumSessionInterval:(NSTimeInterval)minimumSessionInterval; - -/** - * Sets the interval of inactivity in seconds that terminates the current session. The default - * value is 1800 seconds (30 minutes). - */ -- (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; - -/** - * Sets whether analytics collection is enabled for this app on this device. This setting is - * persisted across app sessions. By default it is enabled. - */ -- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRApp.h b/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRApp.h deleted file mode 100755 index e0d852bf0..000000000 --- a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRApp.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#if TARGET_OS_IOS -// TODO: Remove UIKit import on next breaking change release -#import -#endif - -@class FIROptions; - -NS_ASSUME_NONNULL_BEGIN - -/** A block that takes a BOOL and has no return value. */ -typedef void (^FIRAppVoidBoolCallback)(BOOL success) NS_SWIFT_NAME(FirebaseAppVoidBoolCallback); - -/** - * The entry point of Firebase SDKs. - * - * Initialize and configure FIRApp using +[FIRApp configure] - * or other customized ways as shown below. - * - * The logging system has two modes: default mode and debug mode. In default mode, only logs with - * log level Notice, Warning and Error will be sent to device. In debug mode, all logs will be sent - * to device. The log levels that Firebase uses are consistent with the ASL log levels. - * - * Enable debug mode by passing the -FIRDebugEnabled argument to the application. You can add this - * argument in the application's Xcode scheme. When debug mode is enabled via -FIRDebugEnabled, - * further executions of the application will also be in debug mode. In order to return to default - * mode, you must explicitly disable the debug mode with the application argument -FIRDebugDisabled. - * - * It is also possible to change the default logging level in code by calling setLoggerLevel: on - * the FIRConfiguration interface. - */ -NS_SWIFT_NAME(FirebaseApp) -@interface FIRApp : NSObject - -/** - * Configures a default Firebase app. Raises an exception if any configuration step fails. The - * default app is named "__FIRAPP_DEFAULT". This method should be called after the app is launched - * and before using Firebase services. This method is thread safe. - */ -+ (void)configure; - -/** - * Configures the default Firebase app with the provided options. The default app is named - * "__FIRAPP_DEFAULT". Raises an exception if any configuration step fails. This method is thread - * safe. - * - * @param options The Firebase application options used to configure the service. - */ -+ (void)configureWithOptions:(FIROptions *)options NS_SWIFT_NAME(configure(options:)); - -/** - * Configures a Firebase app with the given name and options. Raises an exception if any - * configuration step fails. This method is thread safe. - * - * @param name The application's name given by the developer. The name should should only contain - Letters, Numbers and Underscore. - * @param options The Firebase application options used to configure the services. - */ -// clang-format off -+ (void)configureWithName:(NSString *)name - options:(FIROptions *)options NS_SWIFT_NAME(configure(name:options:)); -// clang-format on - -/** - * Returns the default app, or nil if the default app does not exist. - */ -+ (nullable FIRApp *)defaultApp NS_SWIFT_NAME(app()); - -/** - * Returns a previously created FIRApp instance with the given name, or nil if no such app exists. - * This method is thread safe. - */ -+ (nullable FIRApp *)appNamed:(NSString *)name NS_SWIFT_NAME(app(name:)); - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -/** - * Returns the set of all extant FIRApp instances, or nil if there are no FIRApp instances. This - * method is thread safe. - */ -@property(class, readonly, nullable) NSDictionary *allApps; -#else -/** - * Returns the set of all extant FIRApp instances, or nil if there are no FIRApp instances. This - * method is thread safe. - */ -+ (nullable NSDictionary *)allApps NS_SWIFT_NAME(allApps()); -#endif // defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - -/** - * Cleans up the current FIRApp, freeing associated data and returning its name to the pool for - * future use. This method is thread safe. - */ -- (void)deleteApp:(FIRAppVoidBoolCallback)completion; - -/** - * FIRApp instances should not be initialized directly. Call +[FIRApp configure], - * +[FIRApp configureWithOptions:], or +[FIRApp configureWithNames:options:] directly. - */ -- (instancetype)init NS_UNAVAILABLE; - -/** - * Gets the name of this app. - */ -@property(nonatomic, copy, readonly) NSString *name; - -/** - * Gets a copy of the options for this app. These are non-modifiable. - */ -@property(nonatomic, copy, readonly) FIROptions *options; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRConfiguration.h b/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRConfiguration.h deleted file mode 100755 index 05bd2619d..000000000 --- a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRConfiguration.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -#import "FIRAnalyticsConfiguration.h" -#import "FIRLoggerLevel.h" - -/** - * The log levels used by FIRConfiguration. - */ -typedef NS_ENUM(NSInteger, FIRLogLevel) { - /** Error */ - kFIRLogLevelError __deprecated = 0, - /** Warning */ - kFIRLogLevelWarning __deprecated, - /** Info */ - kFIRLogLevelInfo __deprecated, - /** Debug */ - kFIRLogLevelDebug __deprecated, - /** Assert */ - kFIRLogLevelAssert __deprecated, - /** Max */ - kFIRLogLevelMax __deprecated = kFIRLogLevelAssert -} DEPRECATED_MSG_ATTRIBUTE( - "Use -FIRDebugEnabled and -FIRDebugDisabled or setLoggerLevel. See FIRApp.h for more details."); - -NS_ASSUME_NONNULL_BEGIN - -/** - * This interface provides global level properties that the developer can tweak, and the singleton - * of the Firebase Analytics configuration class. - */ -NS_SWIFT_NAME(FirebaseConfiguration) -@interface FIRConfiguration : NSObject - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -/** Returns the shared configuration object. */ -@property(class, nonatomic, readonly) FIRConfiguration *sharedInstance NS_SWIFT_NAME(shared); -#else -/** Returns the shared configuration object. */ -+ (FIRConfiguration *)sharedInstance NS_SWIFT_NAME(shared()); -#endif // defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - -/** The configuration class for Firebase Analytics. */ -@property(nonatomic, readwrite) FIRAnalyticsConfiguration *analyticsConfiguration; - -/** Global log level. Defaults to kFIRLogLevelError. */ -@property(nonatomic, readwrite, assign) FIRLogLevel logLevel DEPRECATED_MSG_ATTRIBUTE( - "Use -FIRDebugEnabled and -FIRDebugDisabled or setLoggerLevel. See FIRApp.h for more details."); - -/** - * Sets the logging level for internal Firebase logging. Firebase will only log messages - * that are logged at or below loggerLevel. The messages are logged both to the Xcode - * console and to the device's log. Note that if an app is running from AppStore, it will - * never log above FIRLoggerLevelNotice even if loggerLevel is set to a higher (more verbose) - * setting. - * - * @param loggerLevel The maximum logging level. The default level is set to FIRLoggerLevelNotice. - */ -- (void)setLoggerLevel:(FIRLoggerLevel)loggerLevel; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRLoggerLevel.h b/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRLoggerLevel.h deleted file mode 100755 index 8b6579fc5..000000000 --- a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRLoggerLevel.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * The log levels used by internal logging. - */ -typedef NS_ENUM(NSInteger, FIRLoggerLevel) { - /** Error level, matches ASL_LEVEL_ERR. */ - FIRLoggerLevelError = 3, - /** Warning level, matches ASL_LEVEL_WARNING. */ - FIRLoggerLevelWarning = 4, - /** Notice level, matches ASL_LEVEL_NOTICE. */ - FIRLoggerLevelNotice = 5, - /** Info level, matches ASL_LEVEL_NOTICE. */ - FIRLoggerLevelInfo = 6, - /** Debug level, matches ASL_LEVEL_DEBUG. */ - FIRLoggerLevelDebug = 7, - /** Minimum log level. */ - FIRLoggerLevelMin = FIRLoggerLevelError, - /** Maximum log level. */ - FIRLoggerLevelMax = FIRLoggerLevelDebug -} NS_SWIFT_NAME(FirebaseLoggerLevel); diff --git a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIROptions.h b/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIROptions.h deleted file mode 100755 index eba0657af..000000000 --- a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIROptions.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * This class provides constant fields of Google APIs. - */ -NS_SWIFT_NAME(FirebaseOptions) -@interface FIROptions : NSObject - -/** - * Returns the default options. - */ -+ (nullable FIROptions *)defaultOptions NS_SWIFT_NAME(defaultOptions()); - -/** - * An iOS API key used for authenticating requests from your app, e.g. - * @"AIzaSyDdVgKwhZl0sTTTLZ7iTmt1r3N2cJLnaDk", used to identify your app to Google servers. - */ -@property(nonatomic, copy, nullable) NSString *APIKey NS_SWIFT_NAME(apiKey); - -/** - * The bundle ID for the application. Defaults to `[[NSBundle mainBundle] bundleID]` when not set - * manually or in a plist. - */ -@property(nonatomic, copy) NSString *bundleID; - -/** - * The OAuth2 client ID for iOS application used to authenticate Google users, for example - * @"12345.apps.googleusercontent.com", used for signing in with Google. - */ -@property(nonatomic, copy, nullable) NSString *clientID; - -/** - * The tracking ID for Google Analytics, e.g. @"UA-12345678-1", used to configure Google Analytics. - */ -@property(nonatomic, copy, nullable) NSString *trackingID; - -/** - * The Project Number from the Google Developer's console, for example @"012345678901", used to - * configure Google Cloud Messaging. - */ -@property(nonatomic, copy) NSString *GCMSenderID NS_SWIFT_NAME(gcmSenderID); - -/** - * The Project ID from the Firebase console, for example @"abc-xyz-123". - */ -@property(nonatomic, copy, nullable) NSString *projectID; - -/** - * The Android client ID used in Google AppInvite when an iOS app has its Android version, for - * example @"12345.apps.googleusercontent.com". - */ -@property(nonatomic, copy, nullable) NSString *androidClientID; - -/** - * The Google App ID that is used to uniquely identify an instance of an app. - */ -@property(nonatomic, copy) NSString *googleAppID; - -/** - * The database root URL, e.g. @"http://abc-xyz-123.firebaseio.com". - */ -@property(nonatomic, copy, nullable) NSString *databaseURL; - -/** - * The URL scheme used to set up Durable Deep Link service. - */ -@property(nonatomic, copy, nullable) NSString *deepLinkURLScheme; - -/** - * The Google Cloud Storage bucket name, e.g. @"abc-xyz-123.storage.firebase.com". - */ -@property(nonatomic, copy, nullable) NSString *storageBucket; - -/** - * Initializes a customized instance of FIROptions with keys. googleAppID, bundleID and GCMSenderID - * are required. Other keys may required for configuring specific services. - */ -- (instancetype)initWithGoogleAppID:(NSString *)googleAppID - bundleID:(NSString *)bundleID - GCMSenderID:(NSString *)GCMSenderID - APIKey:(NSString *)APIKey - clientID:(NSString *)clientID - trackingID:(NSString *)trackingID - androidClientID:(NSString *)androidClientID - databaseURL:(NSString *)databaseURL - storageBucket:(NSString *)storageBucket - deepLinkURLScheme:(NSString *)deepLinkURLScheme - DEPRECATED_MSG_ATTRIBUTE( - "Use `-[[FIROptions alloc] initWithGoogleAppID:GCMSenderID:]` " - "(`FirebaseOptions(googleAppID:gcmSenderID:)` in Swift)` and property " - "setters instead."); - -/** - * Initializes a customized instance of FIROptions from the file at the given plist file path. - * For example, - * NSString *filePath = - * [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"]; - * FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath]; - * Returns nil if the plist file does not exist or is invalid. - */ -- (nullable instancetype)initWithContentsOfFile:(NSString *)plistPath; - -/** - * Initializes a customized instance of FIROptions with required fields. Use the mutable properties - * to modify fields for configuring specific services. - */ -// clang-format off -- (instancetype)initWithGoogleAppID:(NSString *)googleAppID - GCMSenderID:(NSString *)GCMSenderID - NS_SWIFT_NAME(init(googleAppID:gcmSenderID:)); -// clang-format on - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FirebaseCore.h b/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FirebaseCore.h deleted file mode 100755 index 52a222f59..000000000 --- a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FirebaseCore.h +++ /dev/null @@ -1,5 +0,0 @@ -#import "FIRAnalyticsConfiguration.h" -#import "FIRApp.h" -#import "FIRConfiguration.h" -#import "FIRLoggerLevel.h" -#import "FIROptions.h" diff --git a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Modules/module.modulemap b/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Modules/module.modulemap deleted file mode 100755 index 4865717d0..000000000 --- a/Pods/FirebaseCore/Frameworks/FirebaseCore.framework/Modules/module.modulemap +++ /dev/null @@ -1,7 +0,0 @@ -framework module FirebaseCore { - umbrella header "FirebaseCore.h" - export * - module * { export *} - link "z" - link framework "Security" - link framework "SystemConfiguration"} diff --git a/Pods/FirebaseInstanceID/CHANGELOG.md b/Pods/FirebaseInstanceID/CHANGELOG.md deleted file mode 100755 index a612e8892..000000000 --- a/Pods/FirebaseInstanceID/CHANGELOG.md +++ /dev/null @@ -1,94 +0,0 @@ -# 2017-12-11 -- v2.0.8 -- Fixed a crash caused by a reflection call during logging. -- Updating server with the latest parameters and deprecating old ones. - -# 2017-11-27 -- v2.0.7 -- Improve identity reset process, ensuring all information is reset during Identity deletion. - -# 2017-11-06 -- v2.0.6 -- Make token refresh weekly. -- Fixed a crash when performing token operation. - -# 2017-10-11 -- v2.0.5 -- Improved support for working in shared Keychain environments. - -# 2017-09-26 -- v2.0.4 -- Fixed an issue where the FCM token was not associating correctly with an APNs - device token, depending on when the APNs device token was made available. -- Fixed an issue where FCM tokens for different Sender IDs were not associating - correctly with an APNs device token. -- Fixed an issue that was preventing the FCM direct channel from being - established on the first start after 24 hours of being opened. - -# 2017-09-13 -- v2.0.3 -- Fixed a race condition where a token was not being generated on first start, - if Firebase Messaging was included and the app did not register for remote - notifications. - -# 2017-08-25 -- v2.0.2 -- Fixed a startup performance regression, removing a call which was blocking the - main thread. - -# 2017-08-07 -- v2.0.1 -- Fixed issues with token and app identifier being inaccessible when the device - is locked. -- Fixed a crash if bundle identifier is nil, which is possible in some testing - environments. -- Fixed a small memory leak fetching a new token. -- Moved to a new and simplified token storage system. -- Moved to a new queuing system for token fetches and deletes. -- Simplified logic and code around configuration and logging. -- Added clarification about the 'apns_sandbox' parameter, in header comments. - -# 2017-05-08 -- v2.0.0 -- Introduced an improved interface for Swift 3 developers -- Deprecated some methods and properties after moving their logic to the - Firebase Cloud Messaging SDK -- Fixed an intermittent stability issue when a debug build of an app was - replaced with a release build of the same version -- Removed swizzling logic that was sometimes resulting in developers receiving - a validation notice about enabling push notification capabilities, even though - they weren't using push notifications -- Fixed a notification that would sometimes fire twice in quick succession - during the first run of an app - -# 2017-03-31 -- v1.0.10 - -- Improvements to token-fetching logic -- Fixed some warnings in Instance ID -- Improved error messages if Instance ID couldn't be initialized properly -- Improvements to console logging - -# 2017-01-31 -- v1.0.9 - -- Removed an error being mistakenly logged to the console. - -# 2016-07-06 -- v1.0.8 - -- Don't store InstanceID plists in Documents folder. - -# 2016-06-19 -- v1.0.7 - -- Fix remote-notifications warning on app submission. - -# 2016-05-16 -- v1.0.6 - -- Fix CocoaPod linter issues for InstanceID pod. - -# 2016-05-13 -- v1.0.5 - -- Fix Authorization errors for InstanceID tokens. - -# 2016-05-11 -- v1.0.4 - -- Reduce wait for InstanceID token during parallel requests. - -# 2016-04-18 -- v1.0.3 - -- Change flag to disable swizzling to *FirebaseAppDelegateProxyEnabled*. -- Fix incessant Keychain errors while accessing InstanceID. -- Fix max retries for fetching IID token. - -# 2016-04-18 -- v1.0.2 - -- Register for remote notifications on iOS8+ in the SDK itself. diff --git a/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/FirebaseInstanceID b/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/FirebaseInstanceID deleted file mode 100755 index 9388163f8..000000000 Binary files a/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/FirebaseInstanceID and /dev/null differ diff --git a/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FIRInstanceID.h b/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FIRInstanceID.h deleted file mode 100755 index 3816c3e25..000000000 --- a/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FIRInstanceID.h +++ /dev/null @@ -1,286 +0,0 @@ -#import - -// NS_SWIFT_NAME can only translate factory methods before the iOS 9.3 SDK. -// Wrap it in our own macro if it's a non-compatible SDK. -#ifndef FIR_SWIFT_NAME -#ifdef __IPHONE_9_3 -#define FIR_SWIFT_NAME(X) NS_SWIFT_NAME(X) -#else -#define FIR_SWIFT_NAME(X) // Intentionally blank. -#endif // #ifdef __IPHONE_9_3 -#endif // #ifndef FIR_SWIFT_NAME - -/** - * @memberof FIRInstanceID - * - * The scope to be used when fetching/deleting a token for Firebase Messaging. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDScopeFirebaseMessaging - FIR_SWIFT_NAME(InstanceIDScopeFirebaseMessaging); - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -/** - * Called when the system determines that tokens need to be refreshed. - * This method is also called if Instance ID has been reset in which - * case, tokens and FCM topic subscriptions also need to be refreshed. - * - * Instance ID service will throttle the refresh event across all devices - * to control the rate of token updates on application servers. - */ -FOUNDATION_EXPORT const NSNotificationName __nonnull kFIRInstanceIDTokenRefreshNotification - FIR_SWIFT_NAME(InstanceIDTokenRefresh); -#else -/** - * Called when the system determines that tokens need to be refreshed. - * This method is also called if Instance ID has been reset in which - * case, tokens and FCM topic subscriptions also need to be refreshed. - * - * Instance ID service will throttle the refresh event across all devices - * to control the rate of token updates on application servers. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDTokenRefreshNotification - FIR_SWIFT_NAME(InstanceIDTokenRefreshNotification); -#endif // defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID token returns. If - * the call fails we return the appropriate `error code` as described below. - * - * @param token The valid token as returned by InstanceID backend. - * - * @param error The error describing why generating a new token - * failed. See the error codes below for a more detailed - * description. - */ -typedef void(^FIRInstanceIDTokenHandler)( NSString * __nullable token, NSError * __nullable error) - FIR_SWIFT_NAME(InstanceIDTokenHandler); - - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID `deleteToken` returns. If - * the call fails we return the appropriate `error code` as described below - * - * @param error The error describing why deleting the token failed. - * See the error codes below for a more detailed description. - */ -typedef void(^FIRInstanceIDDeleteTokenHandler)(NSError * __nullable error) - FIR_SWIFT_NAME(InstanceIDDeleteTokenHandler); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity is created. If the - * identity wasn't created for some reason we return the appropriate error code. - * - * @param identity A valid identity for the app instance, nil if there was an error - * while creating an identity. - * @param error The error if fetching the identity fails else nil. - */ -typedef void(^FIRInstanceIDHandler)(NSString * __nullable identity, NSError * __nullable error) - FIR_SWIFT_NAME(InstanceIDHandler); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity and all the tokens associated - * with it are deleted. Returns a valid error object in case of failure else nil. - * - * @param error The error if deleting the identity and all the tokens associated with - * it fails else nil. - */ -typedef void(^FIRInstanceIDDeleteHandler)(NSError * __nullable error) - FIR_SWIFT_NAME(InstanceIDDeleteHandler); - -/** - * Public errors produced by InstanceID. - */ -typedef NS_ENUM(NSUInteger, FIRInstanceIDError) { - // Http related errors. - - /// Unknown error. - FIRInstanceIDErrorUnknown = 0, - - /// Auth Error -- GCM couldn't validate request from this client. - FIRInstanceIDErrorAuthentication = 1, - - /// NoAccess -- InstanceID service cannot be accessed. - FIRInstanceIDErrorNoAccess = 2, - - /// Timeout -- Request to InstanceID backend timed out. - FIRInstanceIDErrorTimeout = 3, - - /// Network -- No network available to reach the servers. - FIRInstanceIDErrorNetwork = 4, - - /// OperationInProgress -- Another similar operation in progress, - /// bailing this one. - FIRInstanceIDErrorOperationInProgress = 5, - - /// InvalidRequest -- Some parameters of the request were invalid. - FIRInstanceIDErrorInvalidRequest = 7, -} FIR_SWIFT_NAME(InstanceIDError); - -/** - * The APNS token type for the app. If the token type is set to `UNKNOWN` - * InstanceID will implicitly try to figure out what the actual token type - * is from the provisioning profile. - */ -typedef NS_ENUM(NSInteger, FIRInstanceIDAPNSTokenType) { - /// Unknown token type. - FIRInstanceIDAPNSTokenTypeUnknown, - /// Sandbox token type. - FIRInstanceIDAPNSTokenTypeSandbox, - /// Production token type. - FIRInstanceIDAPNSTokenTypeProd, -} FIR_SWIFT_NAME(InstanceIDAPNSTokenType) - __deprecated_enum_msg("Use FIRMessaging's APNSToken property instead."); - -/** - * Instance ID provides a unique identifier for each app instance and a mechanism - * to authenticate and authorize actions (for example, sending an FCM message). - * - * Instance ID is long lived but, may be reset if the device is not used for - * a long time or the Instance ID service detects a problem. - * If Instance ID is reset, the app will be notified via - * `kFIRInstanceIDTokenRefreshNotification`. - * - * If the Instance ID has become invalid, the app can request a new one and - * send it to the app server. - * To prove ownership of Instance ID and to allow servers to access data or - * services associated with the app, call - * `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - */ -FIR_SWIFT_NAME(InstanceID) -@interface FIRInstanceID : NSObject - -/** - * FIRInstanceID. - * - * @return A shared instance of FIRInstanceID. - */ -+ (nonnull instancetype)instanceID FIR_SWIFT_NAME(instanceID()); - -/** - * Unavailable. Use +instanceID instead. - */ -- (nonnull instancetype)init __attribute__((unavailable("Use +instanceID instead."))); - -/** - * Set APNS token for the application. This APNS token will be used to register - * with Firebase Messaging using `token` or - * `tokenWithAuthorizedEntity:scope:options:handler`. If the token type is set to - * `FIRInstanceIDAPNSTokenTypeUnknown` InstanceID will read the provisioning profile - * to find out the token type. - * - * @param token The APNS token for the application. - * @param type The APNS token type for the above token. - */ -- (void)setAPNSToken:(nonnull NSData *)token - type:(FIRInstanceIDAPNSTokenType)type - __deprecated_msg("Use FIRMessaging's APNSToken property instead."); - -#pragma mark - Tokens - -/** - * Returns a Firebase Messaging scoped token for the firebase app. - * - * @return Null Returns null if the device has not yet been registerd with - * Firebase Message else returns a valid token. - */ -- (nullable NSString *)token; - -/** - * Returns a token that authorizes an Entity (example: cloud service) to perform - * an action on behalf of the application identified by Instance ID. - * - * This is similar to an OAuth2 token except, it applies to the - * application instance instead of a user. - * - * This is an asynchronous call. If the token fetching fails for some reason - * we invoke the completion callback with nil `token` and the appropriate - * error. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at any point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an - * error with code `OperationInProgress`. - * - * @see FIRInstanceID deleteTokenWithAuthorizedEntity:scope:handler: - * - * @param authorizedEntity Entity authorized by the token. - * @param scope Action authorized for authorizedEntity. - * @param options The extra options to be sent with your token request. The - * value for the `apns_token` should be the NSData object - * passed to the UIApplicationDelegate's - * `didRegisterForRemoteNotificationsWithDeviceToken` method. - * The value for `apns_sandbox` should be a boolean (or an - * NSNumber representing a BOOL in Objective C) set to true if - * your app is a debug build, which means that the APNs - * device token is for the sandbox environment. It should be - * set to false otherwise. If the `apns_sandbox` key is not - * provided, an automatically-detected value shall be used. - * @param handler The callback handler which is invoked when the token is - * successfully fetched. In case of success a valid `token` and - * `nil` error are returned. In case of any error the `token` - * is nil and a valid `error` is returned. The valid error - * codes have been documented above. - */ -- (void)tokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - options:(nullable NSDictionary *)options - handler:(nonnull FIRInstanceIDTokenHandler)handler; - -/** - * Revokes access to a scope (action) for an entity previously - * authorized by `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - * - * This is an asynchronous call. Call this on the main thread since InstanceID lib - * is not thread safe. In case token deletion fails for some reason we invoke the - * `handler` callback passed in with the appropriate error code. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at a point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an error - * with code `OperationInProgress`. - * - * @param authorizedEntity Entity that must no longer have access. - * @param scope Action that entity is no longer authorized to perform. - * @param handler The handler that is invoked once the unsubscribe call ends. - * In case of error an appropriate error object is returned - * else error is nil. - */ -- (void)deleteTokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - handler:(nonnull FIRInstanceIDDeleteTokenHandler)handler; - -#pragma mark - Identity - -/** - * Asynchronously fetch a stable identifier that uniquely identifies the app - * instance. If the identifier has been revoked or has expired, this method will - * return a new identifier. - * - * - * @param handler The handler to invoke once the identifier has been fetched. - * In case of error an appropriate error object is returned else - * a valid identifier is returned and a valid identifier for the - * application instance. - */ -- (void)getIDWithHandler:(nonnull FIRInstanceIDHandler)handler - FIR_SWIFT_NAME(getID(handler:)); - -/** - * Resets Instance ID and revokes all tokens. - * - * This method also triggers a request to fetch a new Instance ID and Firebase Messaging scope - * token. Please listen to kFIRInstanceIDTokenRefreshNotification when the new ID and token are - * ready. - */ -- (void)deleteIDWithHandler:(nonnull FIRInstanceIDDeleteHandler)handler - FIR_SWIFT_NAME(deleteID(handler:)); - -@end diff --git a/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h b/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h deleted file mode 100755 index 053ec2b1c..000000000 --- a/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h +++ /dev/null @@ -1 +0,0 @@ -#import "FIRInstanceID.h" diff --git a/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Modules/module.modulemap b/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Modules/module.modulemap deleted file mode 100755 index 6ab7f1be5..000000000 --- a/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Modules/module.modulemap +++ /dev/null @@ -1,7 +0,0 @@ -framework module FirebaseInstanceID { - umbrella header "FirebaseInstanceID.h" - export * - module * { export *} - link "z" - link framework "Security" - link framework "SystemConfiguration"} diff --git a/Pods/FirebaseInstanceID/README.md b/Pods/FirebaseInstanceID/README.md deleted file mode 100755 index 25fe2196f..000000000 --- a/Pods/FirebaseInstanceID/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# InstanceID SDK for iOS - -Instance ID provides a unique ID per instance of your apps and also provides a -mechanism to authenticate and authorize actions, like sending messages via -Firebase Cloud Messaging (FCM). - - -Please visit [our developer -site](https://developers.google.com/instance-id/) for integration instructions, -documentation, support information, and terms of service. diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAccountSettingsViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAccountSettingsViewController.nib deleted file mode 100644 index b7bda1c56..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAccountSettingsViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAuthPickerViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAuthPickerViewController.nib deleted file mode 100644 index 459a676cd..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAuthPickerViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAuthTableViewCell.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAuthTableViewCell.nib deleted file mode 100644 index 9371bd75c..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAuthTableViewCell.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIEmailEntryViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIEmailEntryViewController.nib deleted file mode 100644 index 0804701bf..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIEmailEntryViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIInputTableViewCell.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIInputTableViewCell.nib deleted file mode 100644 index 133cff953..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIInputTableViewCell.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordRecoveryViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordRecoveryViewController.nib deleted file mode 100644 index df33bdad4..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordRecoveryViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordSignInViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordSignInViewController.nib deleted file mode 100644 index 5c99ae2d3..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordSignInViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordSignUpViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordSignUpViewController.nib deleted file mode 100644 index 1b9f4da3b..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordSignUpViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordTableViewCell.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordTableViewCell.nib deleted file mode 100644 index 7e28dd85f..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordTableViewCell.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordVerificationViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordVerificationViewController.nib deleted file mode 100644 index 27dc88627..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordVerificationViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIStaticContentTableViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIStaticContentTableViewController.nib deleted file mode 100644 index a3556dc02..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIStaticContentTableViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FirebaseAuthUI b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FirebaseAuthUI deleted file mode 100644 index 33281213c..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FirebaseAuthUI and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuth.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuth.h deleted file mode 100644 index 8fa95b3ff..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuth.h +++ /dev/null @@ -1,234 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "FUIAuthProvider.h" - -@class FIRAuth; -@class FUIAuthPickerViewController; -@class FUIAuth; -@class FIRUser; -@class FUIEmailEntryViewController; -@class FUIPasswordSignInViewController; -@class FUIPasswordSignUpViewController; -@class FUIPasswordRecoveryViewController; -@class FUIPasswordVerificationViewController; - -NS_ASSUME_NONNULL_BEGIN - -/** @typedef FUIAuthResultCallback - @brief The type of block invoked when sign-in related events complete. - @param user The user signed in, if any. - @param error The error which occurred, if any. - */ -typedef void (^FUIAuthResultCallback)(FIRUser *_Nullable user, NSError *_Nullable error); - -/** @protocol FUIAuthDelegate - @brief A delegate that receives callbacks or provides custom UI for @c FUIAuth. - */ -@protocol FUIAuthDelegate - -@optional - -/** @fn authUI:didSignInWithAuthDataResult:error: - @brief Message sent after the sign in process has completed to report the signed in user or - error encountered. - @param authUI The @c FUIAuth instance sending the message. - @param authDataResult The data result if the sign in attempt was successful. - @param error The error that occurred during sign in, if any. - */ -- (void)authUI:(FUIAuth *)authUI - didSignInWithAuthDataResult:(nullable FIRAuthDataResult *)authDataResult - error:(nullable NSError *)error; - -/** @fn authUI:didSignInWithUser:error: - @brief This is deprecated API and will be removed in a future release. - Use @c authUI:didSignInWithAuthDataResult:error: - Both sign in call backs are called (@c authUI:didSignInWithAuthDataResult:error: - and @c authUI:didSignInWithUser:error:). - This message is sent after the sign in process has completed to report the signed in user or - error encountered. - @param authUI The @c FUIAuth instance sending the message. - @param user The signed in user if the sign in attempt was successful. - @param error The error that occurred during sign in, if any. - */ -- (void)authUI:(FUIAuth *)authUI - didSignInWithUser:(nullable FIRUser *)user - error:(nullable NSError *)error -__attribute__((deprecated("Instead use authUI:didSignInWithAuthDataResult:error:"))); - - -/** @fn authUI:didFinishOperation:error: - @brief Message sent after finishing Account Management operation. - @param authUI The @c FUIAuth instance sending the message. - @param operation The operation type that was just completed. - @param error The error that occurred during operation, if any. - // TODO: Assitant Settings will be released later. - - (void)authUI:(FUIAuth *)authUI - didFinishOperation:(FUIAccountSettingsOperationType)operation - error:(nullable NSError *)error; - */ - -/** @fn authPickerViewControllerForAuthUI: - @brief Sent to the receiver to ask for an instance of @c FUIAuthPickerViewController subclass - to allow UI customizations. - @param authUI The @c FUIAuth instance sending the message. - @return an instance of @c FUIAuthPickerViewController subclass. - */ -- (FUIAuthPickerViewController *)authPickerViewControllerForAuthUI:(FUIAuth *)authUI; - -/** @fn emailEntryViewControllerForAuthUI: - @brief Sent to the receiver to ask for an instance of @c FUIEmailEntryViewController subclass - to allow UI customizations. - @param authUI The @c FUIAuth instance sending the message. - @return an instance of @c FUIEmailEntryViewController subclass. - */ -- (FUIEmailEntryViewController *)emailEntryViewControllerForAuthUI:(FUIAuth *)authUI; - -/** @fn passwordSignInViewControllerForAuthUI:email: - @brief Sent to the receiver to ask for an instance of @c FUIPasswordSignInViewController subclass - to allow sign-in UI customizations. - @param authUI The @c FUIAuth instance sending the message. - @param email The email user is using for sin-in. - @return an instance of @c FUIPasswordSignInViewController subclass. - */ -- (FUIPasswordSignInViewController *)passwordSignInViewControllerForAuthUI:(FUIAuth *)authUI - email:(NSString *)email; - -/** @fn passwordSignInViewControllerForAuthUI:email: - @brief Sent to the receiver to ask for an instance of @c FUIPasswordSignUpViewController subclass - to allow sign-up UI customizations. - @param authUI The @c FUIAuth instance sending the message. - @param email The email user is using for sin-in. - @return an instance of @c FUIPasswordSignUpViewController subclass. - */ -- (FUIPasswordSignUpViewController *)passwordSignUpViewControllerForAuthUI:(FUIAuth *)authUI - email:(NSString *)email; - -/** @fn passwordRecoveryViewControllerForAuthUI:email: - @brief Sent to the receiver to ask for an instance of @c FUIPasswordRecoveryViewController subclass - to allow sign-up UI customizations. - @param authUI The @c FUIAuth instance sending the message. - @param email The email user is using for password recovery. - @return an instance of @c FUIPasswordRecoveryViewController subclass. - */ -- (FUIPasswordRecoveryViewController *)passwordRecoveryViewControllerForAuthUI:(FUIAuth *)authUI - email:(NSString *)email; - -/** @fn passwordVerificationViewControllerForAuthUI:email:newCredential: - @brief Sent to the receiver to ask for an instance of @c FUIPasswordVerificationViewController subclass - to allow password verification UI customizations. - @param authUI The @c FUIAuth instance sending the message. - @param email The email user is using for sin-in. - @param newCredential This @c FIRAuthCredential obtained from linked account. - @return an instance of @c FUIPasswordVerificationViewController subclass. - */ -- (FUIPasswordVerificationViewController *)passwordVerificationViewControllerForAuthUI:(FUIAuth *)authUI - email:(NSString *)email - newCredential:(FIRAuthCredential *)newCredential; -@end - -/** @class FUIAuth - @brief Provides various iOS UIs for Firebase Auth. - */ -@interface FUIAuth : NSObject - -/** @fn defaultAuthUI - @brief Gets the @c FUIAuth object for the default FirebaseApp. - @remarks Thread safe. - */ -+ (nullable FUIAuth *)defaultAuthUI; - -/** @fn authUIWithAuth: - @brief Gets the @c FUIAuth instance for a @c FIRAuth. - @param auth The @c FIRAuth for which to retrieve the associated @c FUIAuth instance. - @return The @c FUIAuth instance associated with the given @c FIRAuth. - @remarks Thread safe. - */ -+ (nullable FUIAuth *)authUIWithAuth:(FIRAuth *)auth; - -/** @property app - @brief Gets the @c FIRAuth this auth UI object is connected to. - */ -@property(nonatomic, weak, readonly, nullable) FIRAuth *auth; - -/** @property providers - @brief The @c FUIAuthProvider implementations to use for sign-in. - */ -@property(nonatomic, copy) NSArray> *providers; - -/** @property signInWithEmailHidden - @brief Whether to hide the "Sign in with email" option, defaults to NO. - */ -@property(nonatomic, assign, getter=isSignInWithEmailHidden) BOOL signInWithEmailHidden; - -/** @property customStringsBundle - @brief Custom strings bundle supplied by the developer. Nil when there is no custom strings - bundle set. In which case the default bundle will be used. - @remarks Set this property to nil in order to remove the custom strings bundle and revert to - using the default bundle. - */ -@property(nonatomic, strong, nullable) NSBundle *customStringsBundle; - -/** @property TOSURL - @brief The URL of your app's Terms of Service. If not nil, a Terms of Service notice is - displayed on the email/password account creation screen. - */ -@property(nonatomic, copy, nullable) NSURL *TOSURL; - -/** @property delegate - @brief A delegate that receives callbacks or provides custom UI for @c FUIAuth. - */ -@property(nonatomic, weak) id delegate; - -/** @fn init - @brief Please use @c FUIAuth.authUIWithAuth to get a @c FUIAuth instance. - */ -- (instancetype)init NS_UNAVAILABLE; - -/** @fn handleOpenURL: - @brief Should be called from your @c UIApplicationDelegate in - @c UIApplicationDelegate.application:openURL:options: to finish sign-in flows. - @param URL The URL which may be handled by Firebase Auth UI if an URL is expected. - @param sourceApplication The application which tried opening the URL. - @return YES if Firebase Auth UI handled the URL. NO otherwise. - */ -- (BOOL)handleOpenURL:(NSURL *)URL - sourceApplication:(nullable NSString *)sourceApplication; - -/** @fn authViewController - @brief Returns an instance of the initial navigation view controller of AuthUI. - @return An instance of the the initial navigation view controller of AuthUI. - */ -- (UINavigationController *)authViewController; - -/** @fn signOutWithError: - @brief Signs out the current user from Firebase and all providers. - @param error Optionally; if an error occurs during Firebase sign out, upon return contains an - NSError object that describes the problem; is nil otherwise. If Firebase error occurs all - providers are not logged-out and sign-out should be retried. - @return @YES when the sign out request was successful. @NO otherwise. - @remarks Possible error codes: - - @c FIRAuthErrorCodeKeychainError Indicates an error occurred when accessing the keychain. - The @c NSLocalizedFailureReasonErrorKey field in the @c NSError.userInfo dictionary - will contain more information about the error encountered. - */ -- (BOOL)signOutWithError:(NSError *_Nullable *_Nullable)error; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthBaseViewController.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthBaseViewController.h deleted file mode 100644 index af96faf93..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthBaseViewController.h +++ /dev/null @@ -1,85 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -@class FIRAuth; -@class FUIAuth; -@protocol FUIAuthProvider; - -NS_ASSUME_NONNULL_BEGIN - -/** @class FUIAuthBaseViewController - @brief The base view controller that provides common methods for all subclasses. - */ -@interface FUIAuthBaseViewController : UIViewController - -/** @property auth - @brief The @c FIRAuth instance of the application. - */ -@property(nonatomic, strong, readonly) FIRAuth *auth; - -/** @property authUI - @brief The @c FUIAuth instance of the application. - */ -@property(nonatomic, strong, readonly) FUIAuth *authUI; - -/** @fn init - @brief Please use @c initWithNibName:bundle:authUI:. - */ -- (instancetype)init NS_UNAVAILABLE; - -/** @fn initWithStyle: - @brief Please use @c initWithNibName:bundle:authUI:. - */ -- (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE; - -/** @fn initWithNibName:bundle: - @brief Please use @c initWithNibName:bundle:authUI:. - */ -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil - bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE; - -/** @fn initWithNibName:bundle:authUI: - @brief Designated initializer. - @param nibNameOrNil The name of the nib file to associate with the view controller. - @param nibBundleOrNil The bundle in which to search for the nib file. - @param authUI The @c FUIAuth instance that manages this view controller. - */ -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil - bundle:(nullable NSBundle *)nibBundleOrNil - authUI:(FUIAuth *)authUI NS_DESIGNATED_INITIALIZER; - -/** @fn initWithAuthUI: - @brief Convenience initializer. - @param authUI The @c FUIAuth instance that manages this view controller. - */ -- (instancetype)initWithAuthUI:(FUIAuth *)authUI; - -/** @fn onBack - @brief Pops the view controller from navigation stack. If current controller is root - works as @c cancelAuthorization - */ -- (void)onBack; - -/** @fn cancelAuthorization - @brief Cancels Authorization flow, calls UI delegate callbacks and hides UI - */ -- (void)cancelAuthorization; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthErrorUtils.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthErrorUtils.h deleted file mode 100644 index 43395d810..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthErrorUtils.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "FUIAuthErrors.h" - -NS_ASSUME_NONNULL_BEGIN - -/** @class FUIAuthErrorUtils - @brief Utility class used to construct @c NSError instances. - */ -@interface FUIAuthErrorUtils : NSObject - -/** @fn errorWithCode: - @brief Creates an error with the specified code. - @param code The error code. - @param userInfo The dictionary containing the error description if available. - @return An @c NSError with the correct code and corresponding description if available. - */ -+ (NSError *)errorWithCode:(FUIAuthErrorCode)code userInfo:(nullable NSDictionary *)userInfo; - -/** @fn userCancelledSignIn - @brief Constructs an @c NSError with the @c FUIAuthErrorCodeUserCancelledSignIn code. - */ -+ (NSError *)userCancelledSignInError; - -/** @fn providerErrorWithUnderlyingError:providerID: - @brief Constructs an @c NSError with the @c FUIAuthErrorCodeProviderError code and a populated - @c NSUnderlyingErrorKey and @c FUIAuthErrorUserInfoProviderIDKey in the - @c NSError.userInfo dictionary. - @param underlyingError The value of the @c NSUnderlyingErrorKey. - @param providerID The value of the @c FUIAuthErrorUserInfoProviderIDKey. - @remarks This error is used when an error from the identity provider cannot be immediately - handled, and should be forwarded to the client. - */ -+ (NSError *)providerErrorWithUnderlyingError:(NSError *)underlyingError - providerID:(NSString *)providerID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthErrors.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthErrors.h deleted file mode 100644 index bee0bb225..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthErrors.h +++ /dev/null @@ -1,55 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -@import Foundation; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FUIAuthErrorDomain - @brief The standard Firebase error domain. - */ -extern NSString *const FUIAuthErrorDomain; - -/** @bar FUIAuthErrorUserInfoProviderIDKey - @brief The ID of the identity provider. - */ -extern NSString *const FUIAuthErrorUserInfoProviderIDKey; - -/** @var FUIAuthErrorCode - @brief Error codes used by FUIAuth. - */ -typedef NS_ENUM(NSUInteger, FUIAuthErrorCode) { - - /** @var FUIAuthErrorCodeUserCancelledSignIn - @brief Indicates the user cancelled a sign-in flow. - */ - FUIAuthErrorCodeUserCancelledSignIn = 1, - - /** @var FUIAuthErrorCodeProviderError - @brief Indicates there's an error from the identity provider. The - @c FUIAuthErrorUserInfoProviderIDKey field in the @c NError.userInfo dictionary will - contain the ID of the identity provider. - */ - FUIAuthErrorCodeProviderError = 2, - - /** @var FUIAuthErrorCodeCantFindProvider - @brief Indicates that @FUIAuth.providers doen't contain current provider (see NSError.userInfo - key @c FUIAuthErrorUserInfoProviderIDKey). - */ - FUIAuthErrorCodeCantFindProvider = 3, -}; - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthPickerViewController.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthPickerViewController.h deleted file mode 100644 index d81a2b2ec..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthPickerViewController.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "FUIAuthBaseViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -/** @class FUIAuthPickerViewController - @brief The view controller that displays sign in options to the user. - */ -@interface FUIAuthPickerViewController : FUIAuthBaseViewController - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthProvider.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthProvider.h deleted file mode 100644 index f992730b7..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthProvider.h +++ /dev/null @@ -1,141 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import -#import - -@class FIRAuth; -@class FIRAuthCredential; -@class FIRUserInfo; - -NS_ASSUME_NONNULL_BEGIN - -/** @typedef FIRAuthProviderSignInCompletionBlock - @brief The type of block used to notify the auth system of the result of a sign-in flow. - @see FUIAuthProvider.signInWithDefaultValue:presentingViewController:completion: - @param credential The @c FIRAuthCredential object created after user interaction with third - party provider. - @param error The error which may happen during creation of The @c FIRAuthCredential object. - @param result The result of sign-in operation using provided @c FIRAuthCredential object. - @see @c FIRAuth.signInWithCredential:completion: - */ -typedef void (^FIRAuthProviderSignInCompletionBlock) ( - FIRAuthCredential *_Nullable credential, - NSError *_Nullable error, - _Nullable FIRAuthResultCallback result); - -/** @protocol FUIAuthProvider - @brief Represents an authentication provider (such as Google Sign In or Facebook Login) which - can be used with the AuthUI classes (like @c FUIAuthPickerViewController). - @remarks @c FUIAuth.signInProviders is populated with a list of @c FUIAuthProvider instances - to provide users with sign-in options. - */ -@protocol FUIAuthProvider - -/** @property providerID - @brief A unique identifier for the provider. - */ -@property(nonatomic, copy, readonly) NSString *providerID; - -/** @property shortName - @brief A short display name for the provider. - */ -@property(nonatomic, copy, readonly) NSString *shortName; - -/** @property signInLabel - @brief A localized label for the provider's sign-in button. - */ -@property(nonatomic, copy, readonly) NSString *signInLabel; - -/** @property icon - @brief The icon image of the provider. - */ -@property(nonatomic, strong, readonly) UIImage *icon; - -/** @property buttonBackgroundColor - @brief The background color that should be used for the sign in button of the provider. - */ -@property(nonatomic, strong, readonly) UIColor *buttonBackgroundColor; - -/** @property buttonTextColor - @brief The text color that should be used for the sign in button of the provider. - */ -@property(nonatomic, strong, readonly) UIColor *buttonTextColor; - -/** @fn signInWithEmail:presentingViewController:completion: - @brief Called when the user wants to sign in using this auth provider. - @remarks Implementors should invoke the completion block when the sign-in process has terminated - or is canceled. There are two valid combinations of parameters; either @c credentials and - @c userInfo are both non-nil, or @c error is non-nil. Errors must specify an error code - which is one of the @c FIRAuthErrorCode codes. It is very important that all possible code - paths eventually call this method to inform the auth system of the result of the sign-in - flow. - @param email The email address of the user if it's known. - @param presentingViewController The view controller used to present the UI. - @param completion See remarks. A block which should be invoked when the sign-in process - (using @c FIRAuthCredential) completes. - */ -- (void)signInWithEmail:(nullable NSString *)email - presentingViewController:(nullable UIViewController *)presentingViewController - completion:(nullable FIRAuthProviderSignInCompletionBlock)completion -__attribute__((deprecated("This is deprecated API and will be removed in a future release." - "Use signInWithDefaultValue:presentingViewController:completion:"))); - -/** @fn signInWithDefaultValue:presentingViewController:completion: - @brief Called when the user wants to sign in using this auth provider. - @remarks Implementors should invoke the completion block when the sign-in process has terminated - or is canceled. There are two valid combinations of parameters; either @c credentials and - @c userInfo are both non-nil, or @c error is non-nil. Errors must specify an error code - which is one of the @c FIRAuthErrorCode codes. It is very important that all possible code - paths eventually call this method to inform the auth system of the result of the sign-in - flow. - @param defaultValue The default initialization value of the provider (email, phone number etc.). - @param presentingViewController The view controller used to present the UI. - @param completion See remarks. A block which should be invoked when the sign-in process - (using @c FIRAuthCredential) completes. - */ -- (void)signInWithDefaultValue:(nullable NSString *)defaultValue - presentingViewController:(nullable UIViewController *)presentingViewController - completion:(nullable FIRAuthProviderSignInCompletionBlock)completion; - -/** @fn signOut - @brief Called when the user wants to sign out. - */ -- (void)signOut; - -/** @property accessToken - @brief User Access Token obtained during sign in. - */ -@property(nonatomic, copy, readonly) NSString *accessToken; - -@optional; - -/** @property idToken - @brief User Id Token obtained during sign in. Not all providers can return, thus it's optional - */ -@property(nonatomic, copy, readonly) NSString *idToken; - -/** @fn handleOpenURL: - @brief May be used to help complete a sign-in flow which requires a callback from Safari. - @param URL The URL which may be handled by the auth provider if an URL is expected. - @param sourceApplication The application which tried opening the URL. - @return YES if your auth provider handled the URL. NO otherwise. - */ -- (BOOL)handleOpenURL:(NSURL *)URL sourceApplication:(nullable NSString *)sourceApplication; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIEmailEntryViewController.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIEmailEntryViewController.h deleted file mode 100644 index f66ccf229..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIEmailEntryViewController.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "FUIAuthBaseViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -/** @class FUIEmailEntryViewController - @brief The view controller that asks for user's email address. - */ -@interface FUIEmailEntryViewController : FUIAuthBaseViewController - -/** @fn onNext: - @brief Should be called when user entered email. Triggers email verification before - pushing new controller - @param emailText Email value entered by user. - */ -- (void)onNext:(NSString *)emailText; - -/** @fn didChangeEmail: - @brief Should be called after any change of email value. Updates UI controls state - (e g state of next button) - @param emailText Email value entered by user. - */ -- (void)didChangeEmail:(NSString *)emailText; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordRecoveryViewController.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordRecoveryViewController.h deleted file mode 100644 index dc34b81a7..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordRecoveryViewController.h +++ /dev/null @@ -1,75 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "FUIAuthBaseViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -/** @class FUIPasswordRecoveryViewController - @brief The view controller that asks for user's password. - */ -@interface FUIPasswordRecoveryViewController : FUIAuthBaseViewController - -/** @fn initWithNibName:bundle:authUI: - @brief Please use @c initWithAuthUI:email:. - */ -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil - bundle:(nullable NSBundle *)nibBundleOrNil - authUI:(FUIAuth *)authUI NS_UNAVAILABLE; - -/** @fn initWithAuthUI: - @brief Please use @c initWithAuthUI:email:. - */ -- (instancetype)initWithAuthUI:(FUIAuth *)authUI NS_UNAVAILABLE; - -/** @fn initWithNibName:bundle:authUI:email: - @brief Designated initializer. - @param nibNameOrNil The name of the nib file to associate with the view controller. - @param nibBundleOrNil The bundle in which to search for the nib file. - @param authUI The @c FUIAuth instance that manages this view controller. - @param email The email address of the user. - */ -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil - bundle:(nullable NSBundle *)nibBundleOrNil - authUI:(FUIAuth *)authUI - email:(NSString *_Nullable)email NS_DESIGNATED_INITIALIZER; - -/** @fn initWithAuthUI:email: - @brief Convenience initializer. - @param authUI The @c FUIAuth instance that manages this view controller. - @param email The email address of the user. - */ -- (instancetype)initWithAuthUI:(FUIAuth *)authUI - email:(NSString *_Nullable)email; - -/** @fn didChangeEmail: - @brief Should be called after any change of email value. Updates UI controls state - (e g state of send button) - @param email The email address of the user. - */ -- (void)didChangeEmail:(NSString *)email; - -/** @fn recoverEmail: - @brief Should be called when user want to recover password for specified email. - Sends email recover request. - @param email The email address of the user. - */ -- (void)recoverEmail:(NSString *)email; -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordSignInViewController.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordSignInViewController.h deleted file mode 100644 index ecba0309f..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordSignInViewController.h +++ /dev/null @@ -1,83 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "FUIAuthBaseViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -/** @class FUIPasswordSignInViewController - @brief The view controller that asks for user's password. - */ -@interface FUIPasswordSignInViewController : FUIAuthBaseViewController - -/** @fn initWithNibName:bundle:authUI: - @brief Please use @c initWithNibName:bundle:authUI:email:. - */ -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil - bundle:(nullable NSBundle *)nibBundleOrNil - authUI:(FUIAuth *)authUI NS_UNAVAILABLE; - -/** @fn initWithAuthUI: - @brief Please use @c initWithNibName:bundle:authUI:email:. - */ -- (instancetype)initWithAuthUI:(FUIAuth *)authUI NS_UNAVAILABLE; - -/** @fn initWithNibName:bundle:authUI:email: - @brief Designated initializer. - @param nibNameOrNil The name of the nib file to associate with the view controller. - @param nibBundleOrNil The bundle in which to search for the nib file. - @param authUI The @c FUIAuth instance that manages this view controller. - @param email The email address of the user. - */ -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil - bundle:(nullable NSBundle *)nibBundleOrNil - authUI:(FUIAuth *)authUI - email:(NSString *_Nullable)email NS_DESIGNATED_INITIALIZER; - -/** @fn initWithAuthUI:email: - @brief Convenience initializer. - @param authUI The @c FUIAuth instance that manages this view controller. - @param email The email address of the user. - */ -- (instancetype)initWithAuthUI:(FUIAuth *)authUI - email:(NSString *_Nullable)email; - -/** @fn forgotPasswordForEmail: - @brief Method is called when user forgot password. - @param email The email address of the user. - */ -- (void)forgotPasswordForEmail:(NSString *)email; - -/** @fn didChangeEmail:andPassword: - @brief Should be called after any change of email/password value. Updates UI controls state - (e g state of next button) - @param email The email address of the user. - @param password The password which user uses. - */ -- (void)didChangeEmail:(NSString *)email andPassword:(NSString *)password; - -/** @fn signInWithDefaultValue:andPassword: - @brief Should be called when user entered credentials. Sends authorization request - @param email The email address of the user. - @param password The password which user uses. - */ -- (void)signInWithDefaultValue:(NSString *)email andPassword:(NSString *)password; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordSignUpViewController.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordSignUpViewController.h deleted file mode 100644 index c8f31c0ba..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordSignUpViewController.h +++ /dev/null @@ -1,89 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "FUIAuthBaseViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -/** @class FUIPasswordSignUpViewController - @brief The view controller where user signs up as a password account. - */ -@interface FUIPasswordSignUpViewController : FUIAuthBaseViewController - -/** @property footerTextView - @brief The text view in the footer of the table. - */ -@property(nonatomic, strong) IBOutlet UITextView *footerTextView; - -/** @fn initWithNibName:bundle:authUI: - @brief Please use @c initWithAuthUI:email:. - */ -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil - bundle:(nullable NSBundle *)nibBundleOrNil - authUI:(FUIAuth *)authUI NS_UNAVAILABLE; - -/** @fn initWithAuthUI: - @brief Please use @c initWithAuthUI:email:. - */ -- (instancetype)initWithAuthUI:(FUIAuth *)authUI NS_UNAVAILABLE; - -/** @fn initWithNibName:bundle:authUI:email: - @brief Designated initializer. - @param nibNameOrNil The name of the nib file to associate with the view controller. - @param nibBundleOrNil The bundle in which to search for the nib file. - @param authUI The @c FUIAuth instance that manages this view controller. - @param email The email address of the user. - */ -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil - bundle:(nullable NSBundle *)nibBundleOrNil - authUI:(FUIAuth *)authUI - email:(NSString *_Nullable)email NS_DESIGNATED_INITIALIZER; - -/** @fn initWithAuthUI:email: - @brief Convenience initializer. - @param authUI The @c FUIAuth instance that manages this view controller. - @param email The email address of the user. - */ -- (instancetype)initWithAuthUI:(FUIAuth *)authUI - email:(NSString *_Nullable)email; - -/** @fn didChangeEmail:orPassword:orUserName: - @brief Should be called after any change of email, password or user name value. - Updates UI controls state (e g state of next button) - @param email The email address of the user. - @param password The password which user uses. - @param username The username which user uses. - */ -- (void)didChangeEmail:(NSString *)email - orPassword:(NSString *)password - orUserName:(NSString *)username; - -/** @fn signUpWithEmail:andPassword:andUsername: - @brief Should be called when user entered credentials and name. Sends request to create - new user and second request to update it's name - @param email The email address of the user. - @param password The password which user uses. - @param username The username which user uses. - */ -- (void)signUpWithEmail:(NSString *)email - andPassword:(NSString *)password - andUsername:(NSString *)username; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordVerificationViewController.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordVerificationViewController.h deleted file mode 100644 index 1d54ebcbf..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordVerificationViewController.h +++ /dev/null @@ -1,86 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "FUIAuthBaseViewController.h" - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @class FUIPasswordVerificationViewController - @brief The view controller that verifies user's password. - */ -@interface FUIPasswordVerificationViewController : FUIAuthBaseViewController - -/** @fn initWithNibName:bundle:authUI: - @brief Please use @c initWithAuthUI:email:. - */ -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil - bundle:(nullable NSBundle *)nibBundleOrNil - authUI:(FUIAuth *)authUI NS_UNAVAILABLE; - -/** @fn initWithAuthUI: - @brief Please use @c initWithAuthUI:email:. - */ -- (instancetype)initWithAuthUI:(FUIAuth *)authUI NS_UNAVAILABLE; - -/** @fn initWithNibName:bundle:authUI:email:newCredential: - @brief Designated initializer. - @param nibNameOrNil The name of the nib file to associate with the view controller. - @param nibBundleOrNil The bundle in which to search for the nib file. - @param authUI The @c FUIAuth instance that manages this view controller. - @param email The email address of the user. - @param newCredential The new @c FIRAuthCredential that the user had never used before. - */ -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil - bundle:(nullable NSBundle *)nibBundleOrNil - authUI:(FUIAuth *)authUI - email:(NSString *_Nullable)email - newCredential:(FIRAuthCredential *)newCredential NS_DESIGNATED_INITIALIZER; - -/** @fn initWithAuthUI:email:newCredential: - @brief Convenience initializer. - @param authUI The @c FUIAuth instance that manages this view controller. - @param email The email address of the user. - @param newCredential The new @c FIRAuthCredential that the user had never used before. - */ -- (instancetype)initWithAuthUI:(FUIAuth *)authUI - email:(NSString *_Nullable)email - newCredential:(FIRAuthCredential *)newCredential; - -/** @fn forgotPassword - @brief Method is called when user forgot password. - */ -- (void)forgotPassword; - -/** @fn didChangePassword: - @brief Should be called after any change of password value. Updates UI controls state - (e g state of next button) - @param password The password which user uses. - */ -- (void)didChangePassword:(NSString *)password; - -/** @fn verifyPassword: - @brief Should be called when user entered password. Sends authorization request - @param password The password which user uses. - */ -- (void)verifyPassword:(NSString *)password; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FirebaseAuthUI.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FirebaseAuthUI.h deleted file mode 100644 index f43340b03..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FirebaseAuthUI.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -@import UIKit; - -//! Project version number for FirebaseAuthUI. -FOUNDATION_EXPORT double FirebaseAuthUIVersionNumber; - -//! Project version string for FirebaseAuthUI. -FOUNDATION_EXPORT const unsigned char FirebaseAuthUIVersionString[]; - -/* - // Account settings will be released later. -#import -#import - */ -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Info.plist b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Info.plist deleted file mode 100644 index e3f889087..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Info.plist and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Modules/module.modulemap b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Modules/module.modulemap deleted file mode 100644 index f2ca1ecb5..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module FirebaseAuthUI { - umbrella header "FirebaseAuthUI.h" - - export * - module * { export * } -} diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ar.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ar.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 6ec83ffac..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ar.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/bg.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/bg.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 0a29f92aa..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/bg.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/bn.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/bn.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 287b2f07b..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/bn.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ca.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ca.lproj/FirebaseAuthUI.strings deleted file mode 100644 index fe24dde72..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ca.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/cs.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/cs.lproj/FirebaseAuthUI.strings deleted file mode 100644 index dbd2d77ca..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/cs.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/da.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/da.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 971d84a08..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/da.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de-AT.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de-AT.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 94c740440..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de-AT.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de-CH.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de-CH.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 0f4824018..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de-CH.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 94c740440..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/el.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/el.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 486c0bb2a..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/el.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-AU.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-AU.lproj/FirebaseAuthUI.strings deleted file mode 100644 index effc29125..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-AU.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-CA.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-CA.lproj/FirebaseAuthUI.strings deleted file mode 100644 index effc29125..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-CA.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-GB.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-GB.lproj/FirebaseAuthUI.strings deleted file mode 100644 index effc29125..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-GB.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-IE.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-IE.lproj/FirebaseAuthUI.strings deleted file mode 100644 index effc29125..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-IE.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-IN.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-IN.lproj/FirebaseAuthUI.strings deleted file mode 100644 index effc29125..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-IN.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-SG.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-SG.lproj/FirebaseAuthUI.strings deleted file mode 100644 index effc29125..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-SG.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-ZA.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-ZA.lproj/FirebaseAuthUI.strings deleted file mode 100644 index effc29125..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-ZA.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 89295dc73..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-419.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-419.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-419.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-AR.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-AR.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-AR.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-BO.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-BO.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-BO.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CL.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CL.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CL.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CO.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CO.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CO.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CR.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CR.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CR.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-DO.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-DO.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-DO.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-EC.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-EC.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-EC.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-GT.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-GT.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-GT.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-HN.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-HN.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-HN.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-MX.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-MX.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-MX.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-NI.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-NI.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-NI.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PA.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PA.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PA.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PE.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PE.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PE.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PR.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PR.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PR.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PY.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PY.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PY.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-SV.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-SV.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-SV.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-US.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-US.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-US.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-UY.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-UY.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-UY.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-VE.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-VE.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ec0afcf05..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-VE.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es.lproj/FirebaseAuthUI.strings deleted file mode 100644 index df5e32ae1..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fa.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fa.lproj/FirebaseAuthUI.strings deleted file mode 100644 index e45b889e0..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fa.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fi.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fi.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 3550ce623..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fi.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fil.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fil.lproj/FirebaseAuthUI.strings deleted file mode 100644 index d28fd3473..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fil.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fr-CH.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fr-CH.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 2a6243fb5..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fr-CH.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fr.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fr.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 2a6243fb5..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fr.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/gsw.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/gsw.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 94c740440..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/gsw.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/gu.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/gu.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 7a5d46684..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/gu.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/he.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/he.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 76d4a53cc..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/he.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hi.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hi.lproj/FirebaseAuthUI.strings deleted file mode 100644 index df6e0632e..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hi.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hr.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hr.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 2e06a3f2d..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hr.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hu.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hu.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 08eae39a1..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hu.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email.png deleted file mode 100644 index 3fbecd8e7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email@2x.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email@2x.png deleted file mode 100644 index 85e1b49c0..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email@2x.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email@3x.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email@3x.png deleted file mode 100644 index 3464ceafe..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email@3x.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility.png deleted file mode 100644 index f595f5aec..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility@2x.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility@2x.png deleted file mode 100644 index 866ef2fd0..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility@2x.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility@3x.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility@3x.png deleted file mode 100644 index f8e2fba56..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility@3x.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off.png deleted file mode 100644 index 493a50bc1..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off@2x.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off@2x.png deleted file mode 100644 index 2862ed67a..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off@2x.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off@3x.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off@3x.png deleted file mode 100644 index eb65ced4d..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off@3x.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/id.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/id.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 88740a83d..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/id.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/it.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/it.lproj/FirebaseAuthUI.strings deleted file mode 100644 index e552a8109..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/it.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ja.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ja.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 648718ec8..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ja.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/kn.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/kn.lproj/FirebaseAuthUI.strings deleted file mode 100644 index bedd829e0..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/kn.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ko.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ko.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 5cef6e30e..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ko.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ln.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ln.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 2a6243fb5..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ln.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/lt.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/lt.lproj/FirebaseAuthUI.strings deleted file mode 100644 index fcef0726d..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/lt.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/lv.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/lv.lproj/FirebaseAuthUI.strings deleted file mode 100644 index fdfdd88e1..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/lv.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/mr.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/mr.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 9697d1d02..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/mr.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ms.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ms.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 2386b377f..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ms.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nb.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nb.lproj/FirebaseAuthUI.strings deleted file mode 100644 index f26442794..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nb.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nl.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nl.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 0009b0073..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nl.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nn-NO.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nn-NO.lproj/FirebaseAuthUI.strings deleted file mode 100644 index f26442794..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nn-NO.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pl.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pl.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 5616ed993..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pl.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt-BR.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt-BR.lproj/FirebaseAuthUI.strings deleted file mode 100644 index fe99ec7d4..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt-BR.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt-PT.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt-PT.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 1699dd786..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt-PT.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt.lproj/FirebaseAuthUI.strings deleted file mode 100644 index fe99ec7d4..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ro.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ro.lproj/FirebaseAuthUI.strings deleted file mode 100644 index e338e729b..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ro.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ru.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ru.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 21e280548..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ru.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sk.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sk.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 21bf20aef..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sk.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sl.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sl.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ddad2541a..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sl.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sr-Latn.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sr-Latn.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 3c6a76674..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sr-Latn.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sr.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sr.lproj/FirebaseAuthUI.strings deleted file mode 100644 index ce7587de3..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sr.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sv.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sv.lproj/FirebaseAuthUI.strings deleted file mode 100644 index e31e5043c..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sv.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ta.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ta.lproj/FirebaseAuthUI.strings deleted file mode 100644 index e829549c9..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ta.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/th.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/th.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 5b636cb0d..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/th.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/tr.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/tr.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 38f763cea..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/tr.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/uk.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/uk.lproj/FirebaseAuthUI.strings deleted file mode 100644 index f145315d4..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/uk.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ur.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ur.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 1cd61b204..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ur.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/vi.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/vi.lproj/FirebaseAuthUI.strings deleted file mode 100644 index fb07ed52d..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/vi.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hans.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hans.lproj/FirebaseAuthUI.strings deleted file mode 100644 index e0763df29..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hans.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hant-TW.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hant-TW.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 216ea72f4..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hant-TW.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hant.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hant.lproj/FirebaseAuthUI.strings deleted file mode 100644 index 216ea72f4..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hant.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh.lproj/FirebaseAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh.lproj/FirebaseAuthUI.strings deleted file mode 100644 index e0763df29..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh.lproj/FirebaseAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUICodeField.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUICodeField.nib deleted file mode 100644 index bdf182acb..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUICodeField.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUICountryTableViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUICountryTableViewController.nib deleted file mode 100644 index e41972495..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUICountryTableViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUIPhoneEntryViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUIPhoneEntryViewController.nib deleted file mode 100644 index 8e78f4781..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUIPhoneEntryViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUIPhoneVerificationViewController.nib b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUIPhoneVerificationViewController.nib deleted file mode 100644 index 0b390bb99..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUIPhoneVerificationViewController.nib and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FirebasePhoneAuthUI b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FirebasePhoneAuthUI deleted file mode 100644 index 2d7f9e365..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FirebasePhoneAuthUI and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Headers/FUIPhoneAuth.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Headers/FUIPhoneAuth.h deleted file mode 100644 index f277b675e..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Headers/FUIPhoneAuth.h +++ /dev/null @@ -1,57 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** @class FUIPhoneAuth - @brief AuthUI components for Phone Sign In. - */ -@interface FUIPhoneAuth : NSObject - -/** @fn init - @brief Please use @c initWithAuthUI: . - */ -- (instancetype)init NS_UNAVAILABLE; - -/** @fn initWithAuthUI: - @param authUI The @c FUIAuth instance that manages controllers of this provider. - */ -- (instancetype)initWithAuthUI:(FUIAuth *)authUI NS_DESIGNATED_INITIALIZER; - -/** @fn signInWithPresentingViewController: - @brief Signs in with phone auth provider. - @see FUIAuthDelegate.authUI:didSignInWithAuthDataResult:error: for method callback. - @param presentingViewController The view controller used to present the UI. - */ -- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController -__attribute__((deprecated("This is deprecated API and will be removed in a future release." - "Please use signInWithPresentingViewController:phoneNumber:"))); - -/** @fn signInWithPresentingViewController:phoneNumber: - @brief Signs in with phone auth provider. - @see FUIAuthDelegate.authUI:didSignInWithAuthDataResult:error: for method callback. - @param presentingViewController The view controller used to present the UI. - @param phoneNumber The default phone number specified in the international format - e.g. +14151112233 - */ -- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController - phoneNumber:(nullable NSString *)phoneNumber; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Headers/FirebasePhoneAuthUI.h b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Headers/FirebasePhoneAuthUI.h deleted file mode 100644 index 4a9dc9f13..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Headers/FirebasePhoneAuthUI.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -@import UIKit; - -//! Project version number for FirebasePhoneAuthUI. -FOUNDATION_EXPORT double FirebasePhoneAuthUIVersionNumber; - -//! Project version string for FirebasePhoneAuthUI. -FOUNDATION_EXPORT const unsigned char FirebasePhoneAuthUIVersionString[]; - -#import diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Info.plist b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Info.plist deleted file mode 100644 index 7ff5ca2c0..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Info.plist and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Modules/module.modulemap b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Modules/module.modulemap deleted file mode 100644 index 96743ae9d..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module FirebasePhoneAuthUI { - umbrella header "FirebasePhoneAuthUI.h" - - export * - module * { export * } -} diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ar.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ar.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index df9d761a0..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ar.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/bg.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/bg.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 79a226c3d..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/bg.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/bn.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/bn.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 751809031..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/bn.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ca.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ca.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 8b6d157e2..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ca.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/country-codes.json b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/country-codes.json deleted file mode 100644 index 5910d919e..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/country-codes.json +++ /dev/null @@ -1,3226 +0,0 @@ -[ - { - "e164_cc": "93", - "iso2_cc": "AF", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Afghanistan", - "example": "701234567", - "display_name": "Afghanistan (AF) [+93]", - "full_example_with_plus_sign": "+93701234567", - "display_name_no_e164_cc": "Afghanistan (AF)", - "e164_key": "93-AF-0" - }, - { - "e164_cc": "358", - "iso2_cc": "AX", - "e164_sc": 0, - "geographic": true, - "level": 3, - "name": "Åland Islands", - "example": "412345678", - "display_name": "Åland Islands (AX) [+358]", - "full_example_with_plus_sign": "+358412345678", - "display_name_no_e164_cc": "Åland Islands (AX)", - "e164_key": "358-AX-0" - }, - { - "e164_cc": "355", - "iso2_cc": "AL", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Albania", - "example": "661234567", - "display_name": "Albania (AL) [+355]", - "full_example_with_plus_sign": "+355661234567", - "display_name_no_e164_cc": "Albania (AL)", - "e164_key": "355-AL-0" - }, - { - "e164_cc": "213", - "iso2_cc": "DZ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Algeria", - "example": "551234567", - "display_name": "Algeria (DZ) [+213]", - "full_example_with_plus_sign": "+213551234567", - "display_name_no_e164_cc": "Algeria (DZ)", - "e164_key": "213-DZ-0" - }, - { - "e164_cc": "1", - "iso2_cc": "AS", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "American Samoa", - "example": "6847331234", - "display_name": "American Samoa (AS) [+1]", - "full_example_with_plus_sign": "+16847331234", - "display_name_no_e164_cc": "American Samoa (AS)", - "e164_key": "1-AS-0" - }, - { - "e164_cc": "376", - "iso2_cc": "AD", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Andorra", - "example": "312345", - "display_name": "Andorra (AD) [+376]", - "full_example_with_plus_sign": "+376312345", - "display_name_no_e164_cc": "Andorra (AD)", - "e164_key": "376-AD-0" - }, - { - "e164_cc": "244", - "iso2_cc": "AO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Angola", - "example": "923123456", - "display_name": "Angola (AO) [+244]", - "full_example_with_plus_sign": "+244923123456", - "display_name_no_e164_cc": "Angola (AO)", - "e164_key": "244-AO-0" - }, - { - "e164_cc": "1", - "iso2_cc": "AI", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Anguilla", - "example": "2642351234", - "display_name": "Anguilla (AI) [+1]", - "full_example_with_plus_sign": "+12642351234", - "display_name_no_e164_cc": "Anguilla (AI)", - "e164_key": "1-AI-0" - }, - { - "e164_cc": "1", - "iso2_cc": "AG", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Antigua and Barbuda", - "example": "2684641234", - "display_name": "Antigua and Barbuda (AG) [+1]", - "full_example_with_plus_sign": "+12684641234", - "display_name_no_e164_cc": "Antigua and Barbuda (AG)", - "e164_key": "1-AG-0" - }, - { - "e164_cc": "54", - "iso2_cc": "AR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Argentina", - "example": "91123456789", - "display_name": "Argentina (AR) [+54]", - "full_example_with_plus_sign": "+5491123456789", - "display_name_no_e164_cc": "Argentina (AR)", - "e164_key": "54-AR-0" - }, - { - "e164_cc": "374", - "iso2_cc": "AM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Armenia", - "example": "77123456", - "display_name": "Armenia (AM) [+374]", - "full_example_with_plus_sign": "+37477123456", - "display_name_no_e164_cc": "Armenia (AM)", - "e164_key": "374-AM-0" - }, - { - "e164_cc": "297", - "iso2_cc": "AW", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Aruba", - "example": "5601234", - "display_name": "Aruba (AW) [+297]", - "full_example_with_plus_sign": "+2975601234", - "display_name_no_e164_cc": "Aruba (AW)", - "e164_key": "297-AW-0" - }, - { - "e164_cc": "247", - "iso2_cc": "AC", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Ascension Island", - "example": "", - "display_name": "Ascension Island (AC) [+247]", - "full_example_with_plus_sign": null, - "display_name_no_e164_cc": "Ascension Island (AC)", - "e164_key": "247-AC-0" - }, - { - "e164_cc": "61", - "iso2_cc": "AU", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Australia", - "example": "412345678", - "display_name": "Australia (AU) [+61]", - "full_example_with_plus_sign": "+61412345678", - "display_name_no_e164_cc": "Australia (AU)", - "e164_key": "61-AU-0" - }, - { - "e164_cc": "43", - "iso2_cc": "AT", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Austria", - "example": "644123456", - "display_name": "Austria (AT) [+43]", - "full_example_with_plus_sign": "+43644123456", - "display_name_no_e164_cc": "Austria (AT)", - "e164_key": "43-AT-0" - }, - { - "e164_cc": "994", - "iso2_cc": "AZ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Azerbaijan", - "example": "401234567", - "display_name": "Azerbaijan (AZ) [+994]", - "full_example_with_plus_sign": "+994401234567", - "display_name_no_e164_cc": "Azerbaijan (AZ)", - "e164_key": "994-AZ-0" - }, - { - "e164_cc": "1", - "iso2_cc": "BS", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Bahamas", - "example": "2423591234", - "display_name": "Bahamas (BS) [+1]", - "full_example_with_plus_sign": "+12423591234", - "display_name_no_e164_cc": "Bahamas (BS)", - "e164_key": "1-BS-0" - }, - { - "e164_cc": "973", - "iso2_cc": "BH", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Bahrain", - "example": "36001234", - "display_name": "Bahrain (BH) [+973]", - "full_example_with_plus_sign": "+97336001234", - "display_name_no_e164_cc": "Bahrain (BH)", - "e164_key": "973-BH-0" - }, - { - "e164_cc": "880", - "iso2_cc": "BD", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Bangladesh", - "example": "1812345678", - "display_name": "Bangladesh (BD) [+880]", - "full_example_with_plus_sign": "+8801812345678", - "display_name_no_e164_cc": "Bangladesh (BD)", - "e164_key": "880-BD-0" - }, - { - "e164_cc": "1", - "iso2_cc": "BB", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Barbados", - "example": "2462501234", - "display_name": "Barbados (BB) [+1]", - "full_example_with_plus_sign": "+12462501234", - "display_name_no_e164_cc": "Barbados (BB)", - "e164_key": "1-BB-0" - }, - { - "e164_cc": "375", - "iso2_cc": "BY", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Belarus", - "example": "294911911", - "display_name": "Belarus (BY) [+375]", - "full_example_with_plus_sign": "+375294911911", - "display_name_no_e164_cc": "Belarus (BY)", - "e164_key": "375-BY-0" - }, - { - "e164_cc": "32", - "iso2_cc": "BE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Belgium", - "example": "470123456", - "display_name": "Belgium (BE) [+32]", - "full_example_with_plus_sign": "+32470123456", - "display_name_no_e164_cc": "Belgium (BE)", - "e164_key": "32-BE-0" - }, - { - "e164_cc": "501", - "iso2_cc": "BZ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Belize", - "example": "6221234", - "display_name": "Belize (BZ) [+501]", - "full_example_with_plus_sign": "+5016221234", - "display_name_no_e164_cc": "Belize (BZ)", - "e164_key": "501-BZ-0" - }, - { - "e164_cc": "229", - "iso2_cc": "BJ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Benin", - "example": "90011234", - "display_name": "Benin (BJ) [+229]", - "full_example_with_plus_sign": "+22990011234", - "display_name_no_e164_cc": "Benin (BJ)", - "e164_key": "229-BJ-0" - }, - { - "e164_cc": "1", - "iso2_cc": "BM", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Bermuda", - "example": "4413701234", - "display_name": "Bermuda (BM) [+1]", - "full_example_with_plus_sign": "+14413701234", - "display_name_no_e164_cc": "Bermuda (BM)", - "e164_key": "1-BM-0" - }, - { - "e164_cc": "975", - "iso2_cc": "BT", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Bhutan", - "example": "17123456", - "display_name": "Bhutan (BT) [+975]", - "full_example_with_plus_sign": "+97517123456", - "display_name_no_e164_cc": "Bhutan (BT)", - "e164_key": "975-BT-0" - }, - { - "e164_cc": "591", - "iso2_cc": "BO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Bolivia", - "example": "71234567", - "display_name": "Bolivia (BO) [+591]", - "full_example_with_plus_sign": "+59171234567", - "display_name_no_e164_cc": "Bolivia (BO)", - "e164_key": "591-BO-0" - }, - { - "e164_cc": "387", - "iso2_cc": "BA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Bosnia and Herzegovina", - "example": "61123456", - "display_name": "Bosnia and Herzegovina (BA) [+387]", - "full_example_with_plus_sign": "+38761123456", - "display_name_no_e164_cc": "Bosnia and Herzegovina (BA)", - "e164_key": "387-BA-0" - }, - { - "e164_cc": "267", - "iso2_cc": "BW", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Botswana", - "example": "71123456", - "display_name": "Botswana (BW) [+267]", - "full_example_with_plus_sign": "+26771123456", - "display_name_no_e164_cc": "Botswana (BW)", - "e164_key": "267-BW-0" - }, - { - "e164_cc": "55", - "iso2_cc": "BR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Brazil", - "example": "1161234567", - "display_name": "Brazil (BR) [+55]", - "full_example_with_plus_sign": "+551161234567", - "display_name_no_e164_cc": "Brazil (BR)", - "e164_key": "55-BR-0" - }, - { - "e164_cc": "246", - "iso2_cc": "IO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "British Indian Ocean Territory", - "example": "3801234", - "display_name": "British Indian Ocean Territory (IO) [+246]", - "full_example_with_plus_sign": "+2463801234", - "display_name_no_e164_cc": "British Indian Ocean Territory (IO)", - "e164_key": "246-IO-0" - }, - { - "e164_cc": "1", - "iso2_cc": "VG", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "British Virgin Islands", - "example": "2843001234", - "display_name": "British Virgin Islands (VG) [+1]", - "full_example_with_plus_sign": "+12843001234", - "display_name_no_e164_cc": "British Virgin Islands (VG)", - "e164_key": "1-VG-0" - }, - { - "e164_cc": "673", - "iso2_cc": "BN", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Brunei", - "example": "7123456", - "display_name": "Brunei (BN) [+673]", - "full_example_with_plus_sign": "+6737123456", - "display_name_no_e164_cc": "Brunei (BN)", - "e164_key": "673-BN-0" - }, - { - "e164_cc": "359", - "iso2_cc": "BG", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Bulgaria", - "example": "48123456", - "display_name": "Bulgaria (BG) [+359]", - "full_example_with_plus_sign": "+35948123456", - "display_name_no_e164_cc": "Bulgaria (BG)", - "e164_key": "359-BG-0" - }, - { - "e164_cc": "226", - "iso2_cc": "BF", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Burkina Faso", - "example": "70123456", - "display_name": "Burkina Faso (BF) [+226]", - "full_example_with_plus_sign": "+22670123456", - "display_name_no_e164_cc": "Burkina Faso (BF)", - "e164_key": "226-BF-0" - }, - { - "e164_cc": "257", - "iso2_cc": "BI", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Burundi", - "example": "79561234", - "display_name": "Burundi (BI) [+257]", - "full_example_with_plus_sign": "+25779561234", - "display_name_no_e164_cc": "Burundi (BI)", - "e164_key": "257-BI-0" - }, - { - "e164_cc": "855", - "iso2_cc": "KH", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Cambodia", - "example": "91234567", - "display_name": "Cambodia (KH) [+855]", - "full_example_with_plus_sign": "+85591234567", - "display_name_no_e164_cc": "Cambodia (KH)", - "e164_key": "855-KH-0" - }, - { - "e164_cc": "237", - "iso2_cc": "CM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Cameroon", - "example": "71234567", - "display_name": "Cameroon (CM) [+237]", - "full_example_with_plus_sign": "+23771234567", - "display_name_no_e164_cc": "Cameroon (CM)", - "e164_key": "237-CM-0" - }, - { - "e164_cc": "1", - "iso2_cc": "CA", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Canada", - "example": "2042345678", - "display_name": "Canada (CA) [+1]", - "full_example_with_plus_sign": "+12042345678", - "display_name_no_e164_cc": "Canada (CA)", - "e164_key": "1-CA-0" - }, - { - "e164_cc": "238", - "iso2_cc": "CV", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Cape Verde", - "example": "9911234", - "display_name": "Cape Verde (CV) [+238]", - "full_example_with_plus_sign": "+2389911234", - "display_name_no_e164_cc": "Cape Verde (CV)", - "e164_key": "238-CV-0" - }, - { - "e164_cc": "599", - "iso2_cc": "BQ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Caribbean Netherlands", - "example": "3181234", - "display_name": "Caribbean Netherlands (BQ) [+599]", - "full_example_with_plus_sign": "+5993181234", - "display_name_no_e164_cc": "Caribbean Netherlands (BQ)", - "e164_key": "599-BQ-0" - }, - { - "e164_cc": "1", - "iso2_cc": "KY", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Cayman Islands", - "example": "3453231234", - "display_name": "Cayman Islands (KY) [+1]", - "full_example_with_plus_sign": "+13453231234", - "display_name_no_e164_cc": "Cayman Islands (KY)", - "e164_key": "1-KY-0" - }, - { - "e164_cc": "236", - "iso2_cc": "CF", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Central African Republic", - "example": "70012345", - "display_name": "Central African Republic (CF) [+236]", - "full_example_with_plus_sign": "+23670012345", - "display_name_no_e164_cc": "Central African Republic (CF)", - "e164_key": "236-CF-0" - }, - { - "e164_cc": "235", - "iso2_cc": "TD", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Chad", - "example": "63012345", - "display_name": "Chad (TD) [+235]", - "full_example_with_plus_sign": "+23563012345", - "display_name_no_e164_cc": "Chad (TD)", - "e164_key": "235-TD-0" - }, - { - "e164_cc": "56", - "iso2_cc": "CL", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Chile", - "example": "961234567", - "display_name": "Chile (CL) [+56]", - "full_example_with_plus_sign": "+56961234567", - "display_name_no_e164_cc": "Chile (CL)", - "e164_key": "56-CL-0" - }, - { - "e164_cc": "86", - "iso2_cc": "CN", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "China", - "example": "13123456789", - "display_name": "China (CN) [+86]", - "full_example_with_plus_sign": "+8613123456789", - "display_name_no_e164_cc": "China (CN)", - "e164_key": "86-CN-0" - }, - { - "e164_cc": "61", - "iso2_cc": "CX", - "e164_sc": 0, - "geographic": true, - "level": 3, - "name": "Christmas Island", - "example": "412345678", - "display_name": "Christmas Island (CX) [+61]", - "full_example_with_plus_sign": "+61412345678", - "display_name_no_e164_cc": "Christmas Island (CX)", - "e164_key": "61-CX-0" - }, - { - "e164_cc": "61", - "iso2_cc": "CC", - "e164_sc": 0, - "geographic": true, - "level": 3, - "name": "Cocos [Keeling] Islands", - "example": "412345678", - "display_name": "Cocos [Keeling] Islands (CC) [+61]", - "full_example_with_plus_sign": "+61412345678", - "display_name_no_e164_cc": "Cocos [Keeling] Islands (CC)", - "e164_key": "61-CC-0" - }, - { - "e164_cc": "57", - "iso2_cc": "CO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Colombia", - "example": "3211234567", - "display_name": "Colombia (CO) [+57]", - "full_example_with_plus_sign": "+573211234567", - "display_name_no_e164_cc": "Colombia (CO)", - "e164_key": "57-CO-0" - }, - { - "e164_cc": "269", - "iso2_cc": "KM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Comoros", - "example": "3212345", - "display_name": "Comoros (KM) [+269]", - "full_example_with_plus_sign": "+2693212345", - "display_name_no_e164_cc": "Comoros (KM)", - "e164_key": "269-KM-0" - }, - { - "e164_cc": "243", - "iso2_cc": "CD", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Democratic Republic Congo", - "example": "991234567", - "display_name": "Democratic Republic Congo (CD) [+243]", - "full_example_with_plus_sign": "+243991234567", - "display_name_no_e164_cc": "Democratic Republic Congo (CD)", - "e164_key": "243-CD-0" - }, - { - "e164_cc": "242", - "iso2_cc": "CG", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Republic of Congo", - "example": "061234567", - "display_name": "Republic of Congo (CG) [+242]", - "full_example_with_plus_sign": "+242061234567", - "display_name_no_e164_cc": "Republic of Congo (CG)", - "e164_key": "242-CG-0" - }, - { - "e164_cc": "682", - "iso2_cc": "CK", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Cook Islands", - "example": "71234", - "display_name": "Cook Islands (CK) [+682]", - "full_example_with_plus_sign": "+68271234", - "display_name_no_e164_cc": "Cook Islands (CK)", - "e164_key": "682-CK-0" - }, - { - "e164_cc": "506", - "iso2_cc": "CR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Costa Rica", - "example": "83123456", - "display_name": "Costa Rica (CR) [+506]", - "full_example_with_plus_sign": "+50683123456", - "display_name_no_e164_cc": "Costa Rica (CR)", - "e164_key": "506-CR-0" - }, - { - "e164_cc": "225", - "iso2_cc": "CI", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Côte d'Ivoire", - "example": "01234567", - "display_name": "Côte d'Ivoire (CI) [+225]", - "full_example_with_plus_sign": "+22501234567", - "display_name_no_e164_cc": "Côte d'Ivoire (CI)", - "e164_key": "225-CI-0" - }, - { - "e164_cc": "385", - "iso2_cc": "HR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Croatia", - "example": "912345678", - "display_name": "Croatia (HR) [+385]", - "full_example_with_plus_sign": "+385912345678", - "display_name_no_e164_cc": "Croatia (HR)", - "e164_key": "385-HR-0" - }, - { - "e164_cc": "53", - "iso2_cc": "CU", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Cuba", - "example": "51234567", - "display_name": "Cuba (CU) [+53]", - "full_example_with_plus_sign": "+5351234567", - "display_name_no_e164_cc": "Cuba (CU)", - "e164_key": "53-CU-0" - }, - { - "e164_cc": "599", - "iso2_cc": "CW", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Curaçao", - "example": "95181234", - "display_name": "Curaçao (CW) [+599]", - "full_example_with_plus_sign": "+59995181234", - "display_name_no_e164_cc": "Curaçao (CW)", - "e164_key": "599-CW-0" - }, - { - "e164_cc": "357", - "iso2_cc": "CY", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Cyprus", - "example": "96123456", - "display_name": "Cyprus (CY) [+357]", - "full_example_with_plus_sign": "+35796123456", - "display_name_no_e164_cc": "Cyprus (CY)", - "e164_key": "357-CY-0" - }, - { - "e164_cc": "420", - "iso2_cc": "CZ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Czech Republic", - "example": "601123456", - "display_name": "Czech Republic (CZ) [+420]", - "full_example_with_plus_sign": "+420601123456", - "display_name_no_e164_cc": "Czech Republic (CZ)", - "e164_key": "420-CZ-0" - }, - { - "e164_cc": "45", - "iso2_cc": "DK", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Denmark", - "example": "20123456", - "display_name": "Denmark (DK) [+45]", - "full_example_with_plus_sign": "+4520123456", - "display_name_no_e164_cc": "Denmark (DK)", - "e164_key": "45-DK-0" - }, - { - "e164_cc": "253", - "iso2_cc": "DJ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Djibouti", - "example": "77831001", - "display_name": "Djibouti (DJ) [+253]", - "full_example_with_plus_sign": "+25377831001", - "display_name_no_e164_cc": "Djibouti (DJ)", - "e164_key": "253-DJ-0" - }, - { - "e164_cc": "1", - "iso2_cc": "DM", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Dominica", - "example": "7672251234", - "display_name": "Dominica (DM) [+1]", - "full_example_with_plus_sign": "+17672251234", - "display_name_no_e164_cc": "Dominica (DM)", - "e164_key": "1-DM-0" - }, - { - "e164_cc": "1", - "iso2_cc": "DO", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Dominican Republic", - "example": "8092345678", - "display_name": "Dominican Republic (DO) [+1]", - "full_example_with_plus_sign": "+18092345678", - "display_name_no_e164_cc": "Dominican Republic (DO)", - "e164_key": "1-DO-0" - }, - { - "e164_cc": "670", - "iso2_cc": "TL", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "East Timor", - "example": "77212345", - "display_name": "East Timor (TL) [+670]", - "full_example_with_plus_sign": "+67077212345", - "display_name_no_e164_cc": "East Timor (TL)", - "e164_key": "670-TL-0" - }, - { - "e164_cc": "593", - "iso2_cc": "EC", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Ecuador", - "example": "99123456", - "display_name": "Ecuador (EC) [+593]", - "full_example_with_plus_sign": "+59399123456", - "display_name_no_e164_cc": "Ecuador (EC)", - "e164_key": "593-EC-0" - }, - { - "e164_cc": "20", - "iso2_cc": "EG", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Egypt", - "example": "1001234567", - "display_name": "Egypt (EG) [+20]", - "full_example_with_plus_sign": "+201001234567", - "display_name_no_e164_cc": "Egypt (EG)", - "e164_key": "20-EG-0" - }, - { - "e164_cc": "503", - "iso2_cc": "SV", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "El Salvador", - "example": "70123456", - "display_name": "El Salvador (SV) [+503]", - "full_example_with_plus_sign": "+50370123456", - "display_name_no_e164_cc": "El Salvador (SV)", - "e164_key": "503-SV-0" - }, - { - "e164_cc": "240", - "iso2_cc": "GQ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Equatorial Guinea", - "example": "222123456", - "display_name": "Equatorial Guinea (GQ) [+240]", - "full_example_with_plus_sign": "+240222123456", - "display_name_no_e164_cc": "Equatorial Guinea (GQ)", - "e164_key": "240-GQ-0" - }, - { - "e164_cc": "291", - "iso2_cc": "ER", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Eritrea", - "example": "7123456", - "display_name": "Eritrea (ER) [+291]", - "full_example_with_plus_sign": "+2917123456", - "display_name_no_e164_cc": "Eritrea (ER)", - "e164_key": "291-ER-0" - }, - { - "e164_cc": "372", - "iso2_cc": "EE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Estonia", - "example": "51234567", - "display_name": "Estonia (EE) [+372]", - "full_example_with_plus_sign": "+37251234567", - "display_name_no_e164_cc": "Estonia (EE)", - "e164_key": "372-EE-0" - }, - { - "e164_cc": "251", - "iso2_cc": "ET", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Ethiopia", - "example": "911234567", - "display_name": "Ethiopia (ET) [+251]", - "full_example_with_plus_sign": "+251911234567", - "display_name_no_e164_cc": "Ethiopia (ET)", - "e164_key": "251-ET-0" - }, - { - "e164_cc": "500", - "iso2_cc": "FK", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Falkland Islands [Islas Malvinas]", - "example": "51234", - "display_name": "Falkland Islands [Islas Malvinas] (FK) [+500]", - "full_example_with_plus_sign": "+50051234", - "display_name_no_e164_cc": "Falkland Islands [Islas Malvinas] (FK)", - "e164_key": "500-FK-0" - }, - { - "e164_cc": "298", - "iso2_cc": "FO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Faroe Islands", - "example": "211234", - "display_name": "Faroe Islands (FO) [+298]", - "full_example_with_plus_sign": "+298211234", - "display_name_no_e164_cc": "Faroe Islands (FO)", - "e164_key": "298-FO-0" - }, - { - "e164_cc": "679", - "iso2_cc": "FJ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Fiji", - "example": "7012345", - "display_name": "Fiji (FJ) [+679]", - "full_example_with_plus_sign": "+6797012345", - "display_name_no_e164_cc": "Fiji (FJ)", - "e164_key": "679-FJ-0" - }, - { - "e164_cc": "358", - "iso2_cc": "FI", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Finland", - "example": "412345678", - "display_name": "Finland (FI) [+358]", - "full_example_with_plus_sign": "+358412345678", - "display_name_no_e164_cc": "Finland (FI)", - "e164_key": "358-FI-0" - }, - { - "e164_cc": "33", - "iso2_cc": "FR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "France", - "example": "612345678", - "display_name": "France (FR) [+33]", - "full_example_with_plus_sign": "+33612345678", - "display_name_no_e164_cc": "France (FR)", - "e164_key": "33-FR-0" - }, - { - "e164_cc": "594", - "iso2_cc": "GF", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "French Guiana", - "example": "694201234", - "display_name": "French Guiana (GF) [+594]", - "full_example_with_plus_sign": "+594694201234", - "display_name_no_e164_cc": "French Guiana (GF)", - "e164_key": "594-GF-0" - }, - { - "e164_cc": "689", - "iso2_cc": "PF", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "French Polynesia", - "example": "212345", - "display_name": "French Polynesia (PF) [+689]", - "full_example_with_plus_sign": "+689212345", - "display_name_no_e164_cc": "French Polynesia (PF)", - "e164_key": "689-PF-0" - }, - { - "e164_cc": "241", - "iso2_cc": "GA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Gabon", - "example": "06031234", - "display_name": "Gabon (GA) [+241]", - "full_example_with_plus_sign": "+24106031234", - "display_name_no_e164_cc": "Gabon (GA)", - "e164_key": "241-GA-0" - }, - { - "e164_cc": "220", - "iso2_cc": "GM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Gambia", - "example": "3012345", - "display_name": "Gambia (GM) [+220]", - "full_example_with_plus_sign": "+2203012345", - "display_name_no_e164_cc": "Gambia (GM)", - "e164_key": "220-GM-0" - }, - { - "e164_cc": "995", - "iso2_cc": "GE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Georgia", - "example": "555123456", - "display_name": "Georgia (GE) [+995]", - "full_example_with_plus_sign": "+995555123456", - "display_name_no_e164_cc": "Georgia (GE)", - "e164_key": "995-GE-0" - }, - { - "e164_cc": "49", - "iso2_cc": "DE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Germany", - "example": "15123456789", - "display_name": "Germany (DE) [+49]", - "full_example_with_plus_sign": "+4915123456789", - "display_name_no_e164_cc": "Germany (DE)", - "e164_key": "49-DE-0" - }, - { - "e164_cc": "233", - "iso2_cc": "GH", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Ghana", - "example": "231234567", - "display_name": "Ghana (GH) [+233]", - "full_example_with_plus_sign": "+233231234567", - "display_name_no_e164_cc": "Ghana (GH)", - "e164_key": "233-GH-0" - }, - { - "e164_cc": "350", - "iso2_cc": "GI", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Gibraltar", - "example": "57123456", - "display_name": "Gibraltar (GI) [+350]", - "full_example_with_plus_sign": "+35057123456", - "display_name_no_e164_cc": "Gibraltar (GI)", - "e164_key": "350-GI-0" - }, - { - "e164_cc": "30", - "iso2_cc": "GR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Greece", - "example": "6912345678", - "display_name": "Greece (GR) [+30]", - "full_example_with_plus_sign": "+306912345678", - "display_name_no_e164_cc": "Greece (GR)", - "e164_key": "30-GR-0" - }, - { - "e164_cc": "299", - "iso2_cc": "GL", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Greenland", - "example": "221234", - "display_name": "Greenland (GL) [+299]", - "full_example_with_plus_sign": "+299221234", - "display_name_no_e164_cc": "Greenland (GL)", - "e164_key": "299-GL-0" - }, - { - "e164_cc": "1", - "iso2_cc": "GD", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Grenada", - "example": "4734031234", - "display_name": "Grenada (GD) [+1]", - "full_example_with_plus_sign": "+14734031234", - "display_name_no_e164_cc": "Grenada (GD)", - "e164_key": "1-GD-0" - }, - { - "e164_cc": "590", - "iso2_cc": "GP", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Guadeloupe", - "example": "690301234", - "display_name": "Guadeloupe (GP) [+590]", - "full_example_with_plus_sign": "+590690301234", - "display_name_no_e164_cc": "Guadeloupe (GP)", - "e164_key": "590-GP-0" - }, - { - "e164_cc": "1", - "iso2_cc": "GU", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Guam", - "example": "6713001234", - "display_name": "Guam (GU) [+1]", - "full_example_with_plus_sign": "+16713001234", - "display_name_no_e164_cc": "Guam (GU)", - "e164_key": "1-GU-0" - }, - { - "e164_cc": "502", - "iso2_cc": "GT", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Guatemala", - "example": "51234567", - "display_name": "Guatemala (GT) [+502]", - "full_example_with_plus_sign": "+50251234567", - "display_name_no_e164_cc": "Guatemala (GT)", - "e164_key": "502-GT-0" - }, - { - "e164_cc": "44", - "iso2_cc": "GG", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Guernsey", - "example": "7781123456", - "display_name": "Guernsey (GG) [+44]", - "full_example_with_plus_sign": "+447781123456", - "display_name_no_e164_cc": "Guernsey (GG)", - "e164_key": "44-GG-0" - }, - { - "e164_cc": "224", - "iso2_cc": "GN", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Guinea Conakry", - "example": "60201234", - "display_name": "Guinea Conakry (GN) [+224]", - "full_example_with_plus_sign": "+22460201234", - "display_name_no_e164_cc": "Guinea Conakry (GN)", - "e164_key": "224-GN-0" - }, - { - "e164_cc": "245", - "iso2_cc": "GW", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Guinea-Bissau", - "example": "5012345", - "display_name": "Guinea-Bissau (GW) [+245]", - "full_example_with_plus_sign": "+2455012345", - "display_name_no_e164_cc": "Guinea-Bissau (GW)", - "e164_key": "245-GW-0" - }, - { - "e164_cc": "592", - "iso2_cc": "GY", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Guyana", - "example": "6091234", - "display_name": "Guyana (GY) [+592]", - "full_example_with_plus_sign": "+5926091234", - "display_name_no_e164_cc": "Guyana (GY)", - "e164_key": "592-GY-0" - }, - { - "e164_cc": "509", - "iso2_cc": "HT", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Haiti", - "example": "34101234", - "display_name": "Haiti (HT) [+509]", - "full_example_with_plus_sign": "+50934101234", - "display_name_no_e164_cc": "Haiti (HT)", - "e164_key": "509-HT-0" - }, - { - "e164_cc": "672", - "iso2_cc": "HM", - "e164_sc": 0, - "geographic": true, - "level": 3, - "name": "Heard Island and McDonald Islands", - "example": "", - "display_name": "Heard Island and McDonald Islands (HM) [+672]", - "full_example_with_plus_sign": null, - "display_name_no_e164_cc": "Heard Island and McDonald Islands (HM)", - "e164_key": "672-HM-0" - }, - { - "e164_cc": "504", - "iso2_cc": "HN", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Honduras", - "example": "91234567", - "display_name": "Honduras (HN) [+504]", - "full_example_with_plus_sign": "+50491234567", - "display_name_no_e164_cc": "Honduras (HN)", - "e164_key": "504-HN-0" - }, - { - "e164_cc": "852", - "iso2_cc": "HK", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Hong Kong", - "example": "51234567", - "display_name": "Hong Kong (HK) [+852]", - "full_example_with_plus_sign": "+85251234567", - "display_name_no_e164_cc": "Hong Kong (HK)", - "e164_key": "852-HK-0" - }, - { - "e164_cc": "36", - "iso2_cc": "HU", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Hungary", - "example": "201234567", - "display_name": "Hungary (HU) [+36]", - "full_example_with_plus_sign": "+36201234567", - "display_name_no_e164_cc": "Hungary (HU)", - "e164_key": "36-HU-0" - }, - { - "e164_cc": "354", - "iso2_cc": "IS", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Iceland", - "example": "6101234", - "display_name": "Iceland (IS) [+354]", - "full_example_with_plus_sign": "+3546101234", - "display_name_no_e164_cc": "Iceland (IS)", - "e164_key": "354-IS-0" - }, - { - "e164_cc": "91", - "iso2_cc": "IN", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "India", - "example": "9123456789", - "display_name": "India (IN) [+91]", - "full_example_with_plus_sign": "+919123456789", - "display_name_no_e164_cc": "India (IN)", - "e164_key": "91-IN-0" - }, - { - "e164_cc": "62", - "iso2_cc": "ID", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Indonesia", - "example": "812345678", - "display_name": "Indonesia (ID) [+62]", - "full_example_with_plus_sign": "+62812345678", - "display_name_no_e164_cc": "Indonesia (ID)", - "e164_key": "62-ID-0" - }, - { - "e164_cc": "98", - "iso2_cc": "IR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Iran", - "example": "9123456789", - "display_name": "Iran (IR) [+98]", - "full_example_with_plus_sign": "+989123456789", - "display_name_no_e164_cc": "Iran (IR)", - "e164_key": "98-IR-0" - }, - { - "e164_cc": "964", - "iso2_cc": "IQ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Iraq", - "example": "7912345678", - "display_name": "Iraq (IQ) [+964]", - "full_example_with_plus_sign": "+9647912345678", - "display_name_no_e164_cc": "Iraq (IQ)", - "e164_key": "964-IQ-0" - }, - { - "e164_cc": "353", - "iso2_cc": "IE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Ireland", - "example": "850123456", - "display_name": "Ireland (IE) [+353]", - "full_example_with_plus_sign": "+353850123456", - "display_name_no_e164_cc": "Ireland (IE)", - "e164_key": "353-IE-0" - }, - { - "e164_cc": "44", - "iso2_cc": "IM", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Isle of Man", - "example": "7924123456", - "display_name": "Isle of Man (IM) [+44]", - "full_example_with_plus_sign": "+447924123456", - "display_name_no_e164_cc": "Isle of Man (IM)", - "e164_key": "44-IM-0" - }, - { - "e164_cc": "972", - "iso2_cc": "IL", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Israel", - "example": "501234567", - "display_name": "Israel (IL) [+972]", - "full_example_with_plus_sign": "+972501234567", - "display_name_no_e164_cc": "Israel (IL)", - "e164_key": "972-IL-0" - }, - { - "e164_cc": "39", - "iso2_cc": "IT", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Italy", - "example": "3123456789", - "display_name": "Italy (IT) [+39]", - "full_example_with_plus_sign": "+393123456789", - "display_name_no_e164_cc": "Italy (IT)", - "e164_key": "39-IT-0" - }, - { - "e164_cc": "1", - "iso2_cc": "JM", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Jamaica", - "example": "8762101234", - "display_name": "Jamaica (JM) [+1]", - "full_example_with_plus_sign": "+18762101234", - "display_name_no_e164_cc": "Jamaica (JM)", - "e164_key": "1-JM-0" - }, - { - "e164_cc": "81", - "iso2_cc": "JP", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Japan", - "example": "7012345678", - "display_name": "Japan (JP) [+81]", - "full_example_with_plus_sign": "+817012345678", - "display_name_no_e164_cc": "Japan (JP)", - "e164_key": "81-JP-0" - }, - { - "e164_cc": "44", - "iso2_cc": "JE", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Jersey", - "example": "7797123456", - "display_name": "Jersey (JE) [+44]", - "full_example_with_plus_sign": "+447797123456", - "display_name_no_e164_cc": "Jersey (JE)", - "e164_key": "44-JE-0" - }, - { - "e164_cc": "962", - "iso2_cc": "JO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Jordan", - "example": "790123456", - "display_name": "Jordan (JO) [+962]", - "full_example_with_plus_sign": "+962790123456", - "display_name_no_e164_cc": "Jordan (JO)", - "e164_key": "962-JO-0" - }, - { - "e164_cc": "7", - "iso2_cc": "KZ", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Kazakhstan", - "example": "7710009998", - "display_name": "Kazakhstan (KZ) [+7]", - "full_example_with_plus_sign": "+77710009998", - "display_name_no_e164_cc": "Kazakhstan (KZ)", - "e164_key": "7-KZ-0" - }, - { - "e164_cc": "254", - "iso2_cc": "KE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Kenya", - "example": "712123456", - "display_name": "Kenya (KE) [+254]", - "full_example_with_plus_sign": "+254712123456", - "display_name_no_e164_cc": "Kenya (KE)", - "e164_key": "254-KE-0" - }, - { - "e164_cc": "686", - "iso2_cc": "KI", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Kiribati", - "example": "61234", - "display_name": "Kiribati (KI) [+686]", - "full_example_with_plus_sign": "+68661234", - "display_name_no_e164_cc": "Kiribati (KI)", - "e164_key": "686-KI-0" - }, - { - "e164_cc": "377", - "iso2_cc": "XK", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Kosovo", - "example": "", - "display_name": "Kosovo (XK) [+377]", - "full_example_with_plus_sign": null, - "display_name_no_e164_cc": "Kosovo (XK)", - "e164_key": "377-XK-0" - }, - { - "e164_cc": "381", - "iso2_cc": "XK", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Kosovo", - "example": "", - "display_name": "Kosovo (XK) [+381]", - "full_example_with_plus_sign": null, - "display_name_no_e164_cc": "Kosovo (XK)", - "e164_key": "381-XK-0" - }, - { - "e164_cc": "386", - "iso2_cc": "XK", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Kosovo", - "example": "", - "display_name": "Kosovo (XK) [+386]", - "full_example_with_plus_sign": null, - "display_name_no_e164_cc": "Kosovo (XK)", - "e164_key": "386-XK-0" - }, - { - "e164_cc": "965", - "iso2_cc": "KW", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Kuwait", - "example": "50012345", - "display_name": "Kuwait (KW) [+965]", - "full_example_with_plus_sign": "+96550012345", - "display_name_no_e164_cc": "Kuwait (KW)", - "e164_key": "965-KW-0" - }, - { - "e164_cc": "996", - "iso2_cc": "KG", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Kyrgyzstan", - "example": "700123456", - "display_name": "Kyrgyzstan (KG) [+996]", - "full_example_with_plus_sign": "+996700123456", - "display_name_no_e164_cc": "Kyrgyzstan (KG)", - "e164_key": "996-KG-0" - }, - { - "e164_cc": "856", - "iso2_cc": "LA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Laos", - "example": "2023123456", - "display_name": "Laos (LA) [+856]", - "full_example_with_plus_sign": "+8562023123456", - "display_name_no_e164_cc": "Laos (LA)", - "e164_key": "856-LA-0" - }, - { - "e164_cc": "371", - "iso2_cc": "LV", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Latvia", - "example": "21234567", - "display_name": "Latvia (LV) [+371]", - "full_example_with_plus_sign": "+37121234567", - "display_name_no_e164_cc": "Latvia (LV)", - "e164_key": "371-LV-0" - }, - { - "e164_cc": "961", - "iso2_cc": "LB", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Lebanon", - "example": "71123456", - "display_name": "Lebanon (LB) [+961]", - "full_example_with_plus_sign": "+96171123456", - "display_name_no_e164_cc": "Lebanon (LB)", - "e164_key": "961-LB-0" - }, - { - "e164_cc": "266", - "iso2_cc": "LS", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Lesotho", - "example": "50123456", - "display_name": "Lesotho (LS) [+266]", - "full_example_with_plus_sign": "+26650123456", - "display_name_no_e164_cc": "Lesotho (LS)", - "e164_key": "266-LS-0" - }, - { - "e164_cc": "231", - "iso2_cc": "LR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Liberia", - "example": "4612345", - "display_name": "Liberia (LR) [+231]", - "full_example_with_plus_sign": "+2314612345", - "display_name_no_e164_cc": "Liberia (LR)", - "e164_key": "231-LR-0" - }, - { - "e164_cc": "218", - "iso2_cc": "LY", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Libya", - "example": "912345678", - "display_name": "Libya (LY) [+218]", - "full_example_with_plus_sign": "+218912345678", - "display_name_no_e164_cc": "Libya (LY)", - "e164_key": "218-LY-0" - }, - { - "e164_cc": "423", - "iso2_cc": "LI", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Liechtenstein", - "example": "661234567", - "display_name": "Liechtenstein (LI) [+423]", - "full_example_with_plus_sign": "+423661234567", - "display_name_no_e164_cc": "Liechtenstein (LI)", - "e164_key": "423-LI-0" - }, - { - "e164_cc": "370", - "iso2_cc": "LT", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Lithuania", - "example": "61234567", - "display_name": "Lithuania (LT) [+370]", - "full_example_with_plus_sign": "+37061234567", - "display_name_no_e164_cc": "Lithuania (LT)", - "e164_key": "370-LT-0" - }, - { - "e164_cc": "352", - "iso2_cc": "LU", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Luxembourg", - "example": "628123456", - "display_name": "Luxembourg (LU) [+352]", - "full_example_with_plus_sign": "+352628123456", - "display_name_no_e164_cc": "Luxembourg (LU)", - "e164_key": "352-LU-0" - }, - { - "e164_cc": "853", - "iso2_cc": "MO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Macau", - "example": "66123456", - "display_name": "Macau (MO) [+853]", - "full_example_with_plus_sign": "+85366123456", - "display_name_no_e164_cc": "Macau (MO)", - "e164_key": "853-MO-0" - }, - { - "e164_cc": "389", - "iso2_cc": "MK", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Macedonia", - "example": "72345678", - "display_name": "Macedonia (MK) [+389]", - "full_example_with_plus_sign": "+38972345678", - "display_name_no_e164_cc": "Macedonia (MK)", - "e164_key": "389-MK-0" - }, - { - "e164_cc": "261", - "iso2_cc": "MG", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Madagascar", - "example": "301234567", - "display_name": "Madagascar (MG) [+261]", - "full_example_with_plus_sign": "+261301234567", - "display_name_no_e164_cc": "Madagascar (MG)", - "e164_key": "261-MG-0" - }, - { - "e164_cc": "265", - "iso2_cc": "MW", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Malawi", - "example": "991234567", - "display_name": "Malawi (MW) [+265]", - "full_example_with_plus_sign": "+265991234567", - "display_name_no_e164_cc": "Malawi (MW)", - "e164_key": "265-MW-0" - }, - { - "e164_cc": "60", - "iso2_cc": "MY", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Malaysia", - "example": "123456789", - "display_name": "Malaysia (MY) [+60]", - "full_example_with_plus_sign": "+60123456789", - "display_name_no_e164_cc": "Malaysia (MY)", - "e164_key": "60-MY-0" - }, - { - "e164_cc": "960", - "iso2_cc": "MV", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Maldives", - "example": "7712345", - "display_name": "Maldives (MV) [+960]", - "full_example_with_plus_sign": "+9607712345", - "display_name_no_e164_cc": "Maldives (MV)", - "e164_key": "960-MV-0" - }, - { - "e164_cc": "223", - "iso2_cc": "ML", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Mali", - "example": "65012345", - "display_name": "Mali (ML) [+223]", - "full_example_with_plus_sign": "+22365012345", - "display_name_no_e164_cc": "Mali (ML)", - "e164_key": "223-ML-0" - }, - { - "e164_cc": "356", - "iso2_cc": "MT", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Malta", - "example": "96961234", - "display_name": "Malta (MT) [+356]", - "full_example_with_plus_sign": "+35696961234", - "display_name_no_e164_cc": "Malta (MT)", - "e164_key": "356-MT-0" - }, - { - "e164_cc": "692", - "iso2_cc": "MH", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Marshall Islands", - "example": "2351234", - "display_name": "Marshall Islands (MH) [+692]", - "full_example_with_plus_sign": "+6922351234", - "display_name_no_e164_cc": "Marshall Islands (MH)", - "e164_key": "692-MH-0" - }, - { - "e164_cc": "596", - "iso2_cc": "MQ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Martinique", - "example": "696201234", - "display_name": "Martinique (MQ) [+596]", - "full_example_with_plus_sign": "+596696201234", - "display_name_no_e164_cc": "Martinique (MQ)", - "e164_key": "596-MQ-0" - }, - { - "e164_cc": "222", - "iso2_cc": "MR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Mauritania", - "example": "22123456", - "display_name": "Mauritania (MR) [+222]", - "full_example_with_plus_sign": "+22222123456", - "display_name_no_e164_cc": "Mauritania (MR)", - "e164_key": "222-MR-0" - }, - { - "e164_cc": "230", - "iso2_cc": "MU", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Mauritius", - "example": "2512345", - "display_name": "Mauritius (MU) [+230]", - "full_example_with_plus_sign": "+2302512345", - "display_name_no_e164_cc": "Mauritius (MU)", - "e164_key": "230-MU-0" - }, - { - "e164_cc": "262", - "iso2_cc": "YT", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Mayotte", - "example": "639123456", - "display_name": "Mayotte (YT) [+262]", - "full_example_with_plus_sign": "+262639123456", - "display_name_no_e164_cc": "Mayotte (YT)", - "e164_key": "262-YT-0" - }, - { - "e164_cc": "52", - "iso2_cc": "MX", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Mexico", - "example": "12221234567", - "display_name": "Mexico (MX) [+52]", - "full_example_with_plus_sign": "+5212221234567", - "display_name_no_e164_cc": "Mexico (MX)", - "e164_key": "52-MX-0" - }, - { - "e164_cc": "691", - "iso2_cc": "FM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Micronesia", - "example": "3501234", - "display_name": "Micronesia (FM) [+691]", - "full_example_with_plus_sign": "+6913501234", - "display_name_no_e164_cc": "Micronesia (FM)", - "e164_key": "691-FM-0" - }, - { - "e164_cc": "373", - "iso2_cc": "MD", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Moldova", - "example": "65012345", - "display_name": "Moldova (MD) [+373]", - "full_example_with_plus_sign": "+37365012345", - "display_name_no_e164_cc": "Moldova (MD)", - "e164_key": "373-MD-0" - }, - { - "e164_cc": "377", - "iso2_cc": "MC", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Monaco", - "example": "612345678", - "display_name": "Monaco (MC) [+377]", - "full_example_with_plus_sign": "+377612345678", - "display_name_no_e164_cc": "Monaco (MC)", - "e164_key": "377-MC-0" - }, - { - "e164_cc": "976", - "iso2_cc": "MN", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Mongolia", - "example": "88123456", - "display_name": "Mongolia (MN) [+976]", - "full_example_with_plus_sign": "+97688123456", - "display_name_no_e164_cc": "Mongolia (MN)", - "e164_key": "976-MN-0" - }, - { - "e164_cc": "382", - "iso2_cc": "ME", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Montenegro", - "example": "67622901", - "display_name": "Montenegro (ME) [+382]", - "full_example_with_plus_sign": "+38267622901", - "display_name_no_e164_cc": "Montenegro (ME)", - "e164_key": "382-ME-0" - }, - { - "e164_cc": "1", - "iso2_cc": "MS", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Montserrat", - "example": "6644923456", - "display_name": "Montserrat (MS) [+1]", - "full_example_with_plus_sign": "+16644923456", - "display_name_no_e164_cc": "Montserrat (MS)", - "e164_key": "1-MS-0" - }, - { - "e164_cc": "212", - "iso2_cc": "MA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Morocco", - "example": "650123456", - "display_name": "Morocco (MA) [+212]", - "full_example_with_plus_sign": "+212650123456", - "display_name_no_e164_cc": "Morocco (MA)", - "e164_key": "212-MA-0" - }, - { - "e164_cc": "258", - "iso2_cc": "MZ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Mozambique", - "example": "821234567", - "display_name": "Mozambique (MZ) [+258]", - "full_example_with_plus_sign": "+258821234567", - "display_name_no_e164_cc": "Mozambique (MZ)", - "e164_key": "258-MZ-0" - }, - { - "e164_cc": "95", - "iso2_cc": "MM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Myanmar [Burma]", - "example": "92123456", - "display_name": "Myanmar [Burma] (MM) [+95]", - "full_example_with_plus_sign": "+9592123456", - "display_name_no_e164_cc": "Myanmar [Burma] (MM)", - "e164_key": "95-MM-0" - }, - { - "e164_cc": "264", - "iso2_cc": "NA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Namibia", - "example": "811234567", - "display_name": "Namibia (NA) [+264]", - "full_example_with_plus_sign": "+264811234567", - "display_name_no_e164_cc": "Namibia (NA)", - "e164_key": "264-NA-0" - }, - { - "e164_cc": "674", - "iso2_cc": "NR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Nauru", - "example": "5551234", - "display_name": "Nauru (NR) [+674]", - "full_example_with_plus_sign": "+6745551234", - "display_name_no_e164_cc": "Nauru (NR)", - "e164_key": "674-NR-0" - }, - { - "e164_cc": "977", - "iso2_cc": "NP", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Nepal", - "example": "9841234567", - "display_name": "Nepal (NP) [+977]", - "full_example_with_plus_sign": "+9779841234567", - "display_name_no_e164_cc": "Nepal (NP)", - "e164_key": "977-NP-0" - }, - { - "e164_cc": "31", - "iso2_cc": "NL", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Netherlands", - "example": "612345678", - "display_name": "Netherlands (NL) [+31]", - "full_example_with_plus_sign": "+31612345678", - "display_name_no_e164_cc": "Netherlands (NL)", - "e164_key": "31-NL-0" - }, - { - "e164_cc": "687", - "iso2_cc": "NC", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "New Caledonia", - "example": "751234", - "display_name": "New Caledonia (NC) [+687]", - "full_example_with_plus_sign": "+687751234", - "display_name_no_e164_cc": "New Caledonia (NC)", - "e164_key": "687-NC-0" - }, - { - "e164_cc": "64", - "iso2_cc": "NZ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "New Zealand", - "example": "211234567", - "display_name": "New Zealand (NZ) [+64]", - "full_example_with_plus_sign": "+64211234567", - "display_name_no_e164_cc": "New Zealand (NZ)", - "e164_key": "64-NZ-0" - }, - { - "e164_cc": "505", - "iso2_cc": "NI", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Nicaragua", - "example": "81234567", - "display_name": "Nicaragua (NI) [+505]", - "full_example_with_plus_sign": "+50581234567", - "display_name_no_e164_cc": "Nicaragua (NI)", - "e164_key": "505-NI-0" - }, - { - "e164_cc": "227", - "iso2_cc": "NE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Niger", - "example": "93123456", - "display_name": "Niger (NE) [+227]", - "full_example_with_plus_sign": "+22793123456", - "display_name_no_e164_cc": "Niger (NE)", - "e164_key": "227-NE-0" - }, - { - "e164_cc": "234", - "iso2_cc": "NG", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Nigeria", - "example": "8021234567", - "display_name": "Nigeria (NG) [+234]", - "full_example_with_plus_sign": "+2348021234567", - "display_name_no_e164_cc": "Nigeria (NG)", - "e164_key": "234-NG-0" - }, - { - "e164_cc": "683", - "iso2_cc": "NU", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Niue", - "example": "1234", - "display_name": "Niue (NU) [+683]", - "full_example_with_plus_sign": "+6831234", - "display_name_no_e164_cc": "Niue (NU)", - "e164_key": "683-NU-0" - }, - { - "e164_cc": "672", - "iso2_cc": "NF", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Norfolk Island", - "example": "381234", - "display_name": "Norfolk Island (NF) [+672]", - "full_example_with_plus_sign": "+672381234", - "display_name_no_e164_cc": "Norfolk Island (NF)", - "e164_key": "672-NF-0" - }, - { - "e164_cc": "850", - "iso2_cc": "KP", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "North Korea", - "example": "1921234567", - "display_name": "North Korea (KP) [+850]", - "full_example_with_plus_sign": "+8501921234567", - "display_name_no_e164_cc": "North Korea (KP)", - "e164_key": "850-KP-0" - }, - { - "e164_cc": "1", - "iso2_cc": "MP", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Northern Mariana Islands", - "example": "6702345678", - "display_name": "Northern Mariana Islands (MP) [+1]", - "full_example_with_plus_sign": "+16702345678", - "display_name_no_e164_cc": "Northern Mariana Islands (MP)", - "e164_key": "1-MP-0" - }, - { - "e164_cc": "47", - "iso2_cc": "NO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Norway", - "example": "41234567", - "display_name": "Norway (NO) [+47]", - "full_example_with_plus_sign": "+4741234567", - "display_name_no_e164_cc": "Norway (NO)", - "e164_key": "47-NO-0" - }, - { - "e164_cc": "968", - "iso2_cc": "OM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Oman", - "example": "92123456", - "display_name": "Oman (OM) [+968]", - "full_example_with_plus_sign": "+96892123456", - "display_name_no_e164_cc": "Oman (OM)", - "e164_key": "968-OM-0" - }, - { - "e164_cc": "92", - "iso2_cc": "PK", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Pakistan", - "example": "3012345678", - "display_name": "Pakistan (PK) [+92]", - "full_example_with_plus_sign": "+923012345678", - "display_name_no_e164_cc": "Pakistan (PK)", - "e164_key": "92-PK-0" - }, - { - "e164_cc": "680", - "iso2_cc": "PW", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Palau", - "example": "6201234", - "display_name": "Palau (PW) [+680]", - "full_example_with_plus_sign": "+6806201234", - "display_name_no_e164_cc": "Palau (PW)", - "e164_key": "680-PW-0" - }, - { - "e164_cc": "970", - "iso2_cc": "PS", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Palestinian Territories", - "example": "599123456", - "display_name": "Palestinian Territories (PS) [+970]", - "full_example_with_plus_sign": "+970599123456", - "display_name_no_e164_cc": "Palestinian Territories (PS)", - "e164_key": "970-PS-0" - }, - { - "e164_cc": "507", - "iso2_cc": "PA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Panama", - "example": "60012345", - "display_name": "Panama (PA) [+507]", - "full_example_with_plus_sign": "+50760012345", - "display_name_no_e164_cc": "Panama (PA)", - "e164_key": "507-PA-0" - }, - { - "e164_cc": "675", - "iso2_cc": "PG", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Papua New Guinea", - "example": "6812345", - "display_name": "Papua New Guinea (PG) [+675]", - "full_example_with_plus_sign": "+6756812345", - "display_name_no_e164_cc": "Papua New Guinea (PG)", - "e164_key": "675-PG-0" - }, - { - "e164_cc": "595", - "iso2_cc": "PY", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Paraguay", - "example": "961456789", - "display_name": "Paraguay (PY) [+595]", - "full_example_with_plus_sign": "+595961456789", - "display_name_no_e164_cc": "Paraguay (PY)", - "e164_key": "595-PY-0" - }, - { - "e164_cc": "51", - "iso2_cc": "PE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Peru", - "example": "912345678", - "display_name": "Peru (PE) [+51]", - "full_example_with_plus_sign": "+51912345678", - "display_name_no_e164_cc": "Peru (PE)", - "e164_key": "51-PE-0" - }, - { - "e164_cc": "63", - "iso2_cc": "PH", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Philippines", - "example": "9051234567", - "display_name": "Philippines (PH) [+63]", - "full_example_with_plus_sign": "+639051234567", - "display_name_no_e164_cc": "Philippines (PH)", - "e164_key": "63-PH-0" - }, - { - "e164_cc": "48", - "iso2_cc": "PL", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Poland", - "example": "512345678", - "display_name": "Poland (PL) [+48]", - "full_example_with_plus_sign": "+48512345678", - "display_name_no_e164_cc": "Poland (PL)", - "e164_key": "48-PL-0" - }, - { - "e164_cc": "351", - "iso2_cc": "PT", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Portugal", - "example": "912345678", - "display_name": "Portugal (PT) [+351]", - "full_example_with_plus_sign": "+351912345678", - "display_name_no_e164_cc": "Portugal (PT)", - "e164_key": "351-PT-0" - }, - { - "e164_cc": "1", - "iso2_cc": "PR", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Puerto Rico", - "example": "7872345678", - "display_name": "Puerto Rico (PR) [+1]", - "full_example_with_plus_sign": "+17872345678", - "display_name_no_e164_cc": "Puerto Rico (PR)", - "e164_key": "1-PR-0" - }, - { - "e164_cc": "974", - "iso2_cc": "QA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Qatar", - "example": "33123456", - "display_name": "Qatar (QA) [+974]", - "full_example_with_plus_sign": "+97433123456", - "display_name_no_e164_cc": "Qatar (QA)", - "e164_key": "974-QA-0" - }, - { - "e164_cc": "262", - "iso2_cc": "RE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Réunion", - "example": "692123456", - "display_name": "Réunion (RE) [+262]", - "full_example_with_plus_sign": "+262692123456", - "display_name_no_e164_cc": "Réunion (RE)", - "e164_key": "262-RE-0" - }, - { - "e164_cc": "40", - "iso2_cc": "RO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Romania", - "example": "712345678", - "display_name": "Romania (RO) [+40]", - "full_example_with_plus_sign": "+40712345678", - "display_name_no_e164_cc": "Romania (RO)", - "e164_key": "40-RO-0" - }, - { - "e164_cc": "7", - "iso2_cc": "RU", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Russia", - "example": "9123456789", - "display_name": "Russia (RU) [+7]", - "full_example_with_plus_sign": "+79123456789", - "display_name_no_e164_cc": "Russia (RU)", - "e164_key": "7-RU-0" - }, - { - "e164_cc": "250", - "iso2_cc": "RW", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Rwanda", - "example": "720123456", - "display_name": "Rwanda (RW) [+250]", - "full_example_with_plus_sign": "+250720123456", - "display_name_no_e164_cc": "Rwanda (RW)", - "e164_key": "250-RW-0" - }, - { - "e164_cc": "590", - "iso2_cc": "BL", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Saint Barthélemy", - "example": "690221234", - "display_name": "Saint Barthélemy (BL) [+590]", - "full_example_with_plus_sign": "+590690221234", - "display_name_no_e164_cc": "Saint Barthélemy (BL)", - "e164_key": "590-BL-0" - }, - { - "e164_cc": "290", - "iso2_cc": "SH", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Saint Helena", - "example": "", - "display_name": "Saint Helena (SH) [+290]", - "full_example_with_plus_sign": null, - "display_name_no_e164_cc": "Saint Helena (SH)", - "e164_key": "290-SH-0" - }, - { - "e164_cc": "1", - "iso2_cc": "KN", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "St. Kitts", - "example": "8695561234", - "display_name": "St. Kitts (KN) [+1]", - "full_example_with_plus_sign": "+18695561234", - "display_name_no_e164_cc": "St. Kitts (KN)", - "e164_key": "1-KN-0" - }, - { - "e164_cc": "1", - "iso2_cc": "LC", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "St. Lucia", - "example": "7582845678", - "display_name": "St. Lucia (LC) [+1]", - "full_example_with_plus_sign": "+17582845678", - "display_name_no_e164_cc": "St. Lucia (LC)", - "e164_key": "1-LC-0" - }, - { - "e164_cc": "590", - "iso2_cc": "MF", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Saint Martin", - "example": "690221234", - "display_name": "Saint Martin (MF) [+590]", - "full_example_with_plus_sign": "+590690221234", - "display_name_no_e164_cc": "Saint Martin (MF)", - "e164_key": "590-MF-0" - }, - { - "e164_cc": "508", - "iso2_cc": "PM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Saint Pierre and Miquelon", - "example": "551234", - "display_name": "Saint Pierre and Miquelon (PM) [+508]", - "full_example_with_plus_sign": "+508551234", - "display_name_no_e164_cc": "Saint Pierre and Miquelon (PM)", - "e164_key": "508-PM-0" - }, - { - "e164_cc": "1", - "iso2_cc": "VC", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "St. Vincent", - "example": "7844301234", - "display_name": "St. Vincent (VC) [+1]", - "full_example_with_plus_sign": "+17844301234", - "display_name_no_e164_cc": "St. Vincent (VC)", - "e164_key": "1-VC-0" - }, - { - "e164_cc": "685", - "iso2_cc": "WS", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Samoa", - "example": "601234", - "display_name": "Samoa (WS) [+685]", - "full_example_with_plus_sign": "+685601234", - "display_name_no_e164_cc": "Samoa (WS)", - "e164_key": "685-WS-0" - }, - { - "e164_cc": "378", - "iso2_cc": "SM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "San Marino", - "example": "66661212", - "display_name": "San Marino (SM) [+378]", - "full_example_with_plus_sign": "+37866661212", - "display_name_no_e164_cc": "San Marino (SM)", - "e164_key": "378-SM-0" - }, - { - "e164_cc": "239", - "iso2_cc": "ST", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "São Tomé and Príncipe", - "example": "9812345", - "display_name": "São Tomé and Príncipe (ST) [+239]", - "full_example_with_plus_sign": "+2399812345", - "display_name_no_e164_cc": "São Tomé and Príncipe (ST)", - "e164_key": "239-ST-0" - }, - { - "e164_cc": "966", - "iso2_cc": "SA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Saudi Arabia", - "example": "512345678", - "display_name": "Saudi Arabia (SA) [+966]", - "full_example_with_plus_sign": "+966512345678", - "display_name_no_e164_cc": "Saudi Arabia (SA)", - "e164_key": "966-SA-0" - }, - { - "e164_cc": "221", - "iso2_cc": "SN", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Senegal", - "example": "701012345", - "display_name": "Senegal (SN) [+221]", - "full_example_with_plus_sign": "+221701012345", - "display_name_no_e164_cc": "Senegal (SN)", - "e164_key": "221-SN-0" - }, - { - "e164_cc": "381", - "iso2_cc": "RS", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Serbia", - "example": "601234567", - "display_name": "Serbia (RS) [+381]", - "full_example_with_plus_sign": "+381601234567", - "display_name_no_e164_cc": "Serbia (RS)", - "e164_key": "381-RS-0" - }, - { - "e164_cc": "248", - "iso2_cc": "SC", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Seychelles", - "example": "2510123", - "display_name": "Seychelles (SC) [+248]", - "full_example_with_plus_sign": "+2482510123", - "display_name_no_e164_cc": "Seychelles (SC)", - "e164_key": "248-SC-0" - }, - { - "e164_cc": "232", - "iso2_cc": "SL", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Sierra Leone", - "example": "25123456", - "display_name": "Sierra Leone (SL) [+232]", - "full_example_with_plus_sign": "+23225123456", - "display_name_no_e164_cc": "Sierra Leone (SL)", - "e164_key": "232-SL-0" - }, - { - "e164_cc": "65", - "iso2_cc": "SG", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Singapore", - "example": "81234567", - "display_name": "Singapore (SG) [+65]", - "full_example_with_plus_sign": "+6581234567", - "display_name_no_e164_cc": "Singapore (SG)", - "e164_key": "65-SG-0" - }, - { - "e164_cc": "1", - "iso2_cc": "SX", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Sint Maarten", - "example": "7215205678", - "display_name": "Sint Maarten (SX) [+1]", - "full_example_with_plus_sign": "+17215205678", - "display_name_no_e164_cc": "Sint Maarten (SX)", - "e164_key": "1-SX-0" - }, - { - "e164_cc": "421", - "iso2_cc": "SK", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Slovakia", - "example": "912123456", - "display_name": "Slovakia (SK) [+421]", - "full_example_with_plus_sign": "+421912123456", - "display_name_no_e164_cc": "Slovakia (SK)", - "e164_key": "421-SK-0" - }, - { - "e164_cc": "386", - "iso2_cc": "SI", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Slovenia", - "example": "31234567", - "display_name": "Slovenia (SI) [+386]", - "full_example_with_plus_sign": "+38631234567", - "display_name_no_e164_cc": "Slovenia (SI)", - "e164_key": "386-SI-0" - }, - { - "e164_cc": "677", - "iso2_cc": "SB", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Solomon Islands", - "example": "7421234", - "display_name": "Solomon Islands (SB) [+677]", - "full_example_with_plus_sign": "+6777421234", - "display_name_no_e164_cc": "Solomon Islands (SB)", - "e164_key": "677-SB-0" - }, - { - "e164_cc": "252", - "iso2_cc": "SO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Somalia", - "example": "90792024", - "display_name": "Somalia (SO) [+252]", - "full_example_with_plus_sign": "+25290792024", - "display_name_no_e164_cc": "Somalia (SO)", - "e164_key": "252-SO-0" - }, - { - "e164_cc": "27", - "iso2_cc": "ZA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "South Africa", - "example": "711234567", - "display_name": "South Africa (ZA) [+27]", - "full_example_with_plus_sign": "+27711234567", - "display_name_no_e164_cc": "South Africa (ZA)", - "e164_key": "27-ZA-0" - }, - { - "e164_cc": "500", - "iso2_cc": "GS", - "e164_sc": 0, - "geographic": true, - "level": 3, - "name": "South Georgia and the South Sandwich Islands", - "example": "", - "display_name": "South Georgia and the South Sandwich Islands (GS) [+500]", - "full_example_with_plus_sign": null, - "display_name_no_e164_cc": "South Georgia and the South Sandwich Islands (GS)", - "e164_key": "500-GS-0" - }, - { - "e164_cc": "82", - "iso2_cc": "KR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "South Korea", - "example": "1023456789", - "display_name": "South Korea (KR) [+82]", - "full_example_with_plus_sign": "+821023456789", - "display_name_no_e164_cc": "South Korea (KR)", - "e164_key": "82-KR-0" - }, - { - "e164_cc": "211", - "iso2_cc": "SS", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "South Sudan", - "example": "977123456", - "display_name": "South Sudan (SS) [+211]", - "full_example_with_plus_sign": "+211977123456", - "display_name_no_e164_cc": "South Sudan (SS)", - "e164_key": "211-SS-0" - }, - { - "e164_cc": "34", - "iso2_cc": "ES", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Spain", - "example": "612345678", - "display_name": "Spain (ES) [+34]", - "full_example_with_plus_sign": "+34612345678", - "display_name_no_e164_cc": "Spain (ES)", - "e164_key": "34-ES-0" - }, - { - "e164_cc": "94", - "iso2_cc": "LK", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Sri Lanka", - "example": "712345678", - "display_name": "Sri Lanka (LK) [+94]", - "full_example_with_plus_sign": "+94712345678", - "display_name_no_e164_cc": "Sri Lanka (LK)", - "e164_key": "94-LK-0" - }, - { - "e164_cc": "249", - "iso2_cc": "SD", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Sudan", - "example": "911231234", - "display_name": "Sudan (SD) [+249]", - "full_example_with_plus_sign": "+249911231234", - "display_name_no_e164_cc": "Sudan (SD)", - "e164_key": "249-SD-0" - }, - { - "e164_cc": "597", - "iso2_cc": "SR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Suriname", - "example": "7412345", - "display_name": "Suriname (SR) [+597]", - "full_example_with_plus_sign": "+5977412345", - "display_name_no_e164_cc": "Suriname (SR)", - "e164_key": "597-SR-0" - }, - { - "e164_cc": "47", - "iso2_cc": "SJ", - "e164_sc": 0, - "geographic": true, - "level": 3, - "name": "Svalbard and Jan Mayen", - "example": "41234567", - "display_name": "Svalbard and Jan Mayen (SJ) [+47]", - "full_example_with_plus_sign": "+4741234567", - "display_name_no_e164_cc": "Svalbard and Jan Mayen (SJ)", - "e164_key": "47-SJ-0" - }, - { - "e164_cc": "268", - "iso2_cc": "SZ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Swaziland", - "example": "76123456", - "display_name": "Swaziland (SZ) [+268]", - "full_example_with_plus_sign": "+26876123456", - "display_name_no_e164_cc": "Swaziland (SZ)", - "e164_key": "268-SZ-0" - }, - { - "e164_cc": "46", - "iso2_cc": "SE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Sweden", - "example": "701234567", - "display_name": "Sweden (SE) [+46]", - "full_example_with_plus_sign": "+46701234567", - "display_name_no_e164_cc": "Sweden (SE)", - "e164_key": "46-SE-0" - }, - { - "e164_cc": "41", - "iso2_cc": "CH", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Switzerland", - "example": "741234567", - "display_name": "Switzerland (CH) [+41]", - "full_example_with_plus_sign": "+41741234567", - "display_name_no_e164_cc": "Switzerland (CH)", - "e164_key": "41-CH-0" - }, - { - "e164_cc": "963", - "iso2_cc": "SY", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Syria", - "example": "944567890", - "display_name": "Syria (SY) [+963]", - "full_example_with_plus_sign": "+963944567890", - "display_name_no_e164_cc": "Syria (SY)", - "e164_key": "963-SY-0" - }, - { - "e164_cc": "886", - "iso2_cc": "TW", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Taiwan", - "example": "912345678", - "display_name": "Taiwan (TW) [+886]", - "full_example_with_plus_sign": "+886912345678", - "display_name_no_e164_cc": "Taiwan (TW)", - "e164_key": "886-TW-0" - }, - { - "e164_cc": "992", - "iso2_cc": "TJ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Tajikistan", - "example": "917123456", - "display_name": "Tajikistan (TJ) [+992]", - "full_example_with_plus_sign": "+992917123456", - "display_name_no_e164_cc": "Tajikistan (TJ)", - "e164_key": "992-TJ-0" - }, - { - "e164_cc": "255", - "iso2_cc": "TZ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Tanzania", - "example": "612345678", - "display_name": "Tanzania (TZ) [+255]", - "full_example_with_plus_sign": "+255612345678", - "display_name_no_e164_cc": "Tanzania (TZ)", - "e164_key": "255-TZ-0" - }, - { - "e164_cc": "66", - "iso2_cc": "TH", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Thailand", - "example": "812345678", - "display_name": "Thailand (TH) [+66]", - "full_example_with_plus_sign": "+66812345678", - "display_name_no_e164_cc": "Thailand (TH)", - "e164_key": "66-TH-0" - }, - { - "e164_cc": "228", - "iso2_cc": "TG", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Togo", - "example": "90112345", - "display_name": "Togo (TG) [+228]", - "full_example_with_plus_sign": "+22890112345", - "display_name_no_e164_cc": "Togo (TG)", - "e164_key": "228-TG-0" - }, - { - "e164_cc": "690", - "iso2_cc": "TK", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Tokelau", - "example": "5190", - "display_name": "Tokelau (TK) [+690]", - "full_example_with_plus_sign": "+6905190", - "display_name_no_e164_cc": "Tokelau (TK)", - "e164_key": "690-TK-0" - }, - { - "e164_cc": "676", - "iso2_cc": "TO", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Tonga", - "example": "7715123", - "display_name": "Tonga (TO) [+676]", - "full_example_with_plus_sign": "+6767715123", - "display_name_no_e164_cc": "Tonga (TO)", - "e164_key": "676-TO-0" - }, - { - "e164_cc": "1", - "iso2_cc": "TT", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Trinidad/Tobago", - "example": "8682911234", - "display_name": "Trinidad/Tobago (TT) [+1]", - "full_example_with_plus_sign": "+18682911234", - "display_name_no_e164_cc": "Trinidad/Tobago (TT)", - "e164_key": "1-TT-0" - }, - { - "e164_cc": "216", - "iso2_cc": "TN", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Tunisia", - "example": "20123456", - "display_name": "Tunisia (TN) [+216]", - "full_example_with_plus_sign": "+21620123456", - "display_name_no_e164_cc": "Tunisia (TN)", - "e164_key": "216-TN-0" - }, - { - "e164_cc": "90", - "iso2_cc": "TR", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Turkey", - "example": "5012345678", - "display_name": "Turkey (TR) [+90]", - "full_example_with_plus_sign": "+905012345678", - "display_name_no_e164_cc": "Turkey (TR)", - "e164_key": "90-TR-0" - }, - { - "e164_cc": "993", - "iso2_cc": "TM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Turkmenistan", - "example": "66123456", - "display_name": "Turkmenistan (TM) [+993]", - "full_example_with_plus_sign": "+99366123456", - "display_name_no_e164_cc": "Turkmenistan (TM)", - "e164_key": "993-TM-0" - }, - { - "e164_cc": "1", - "iso2_cc": "TC", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "Turks and Caicos Islands", - "example": "6492311234", - "display_name": "Turks and Caicos Islands (TC) [+1]", - "full_example_with_plus_sign": "+16492311234", - "display_name_no_e164_cc": "Turks and Caicos Islands (TC)", - "e164_key": "1-TC-0" - }, - { - "e164_cc": "688", - "iso2_cc": "TV", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Tuvalu", - "example": "901234", - "display_name": "Tuvalu (TV) [+688]", - "full_example_with_plus_sign": "+688901234", - "display_name_no_e164_cc": "Tuvalu (TV)", - "e164_key": "688-TV-0" - }, - { - "e164_cc": "1", - "iso2_cc": "VI", - "e164_sc": 0, - "geographic": true, - "level": 2, - "name": "U.S. Virgin Islands", - "example": "3406421234", - "display_name": "U.S. Virgin Islands (VI) [+1]", - "full_example_with_plus_sign": "+13406421234", - "display_name_no_e164_cc": "U.S. Virgin Islands (VI)", - "e164_key": "1-VI-0" - }, - { - "e164_cc": "256", - "iso2_cc": "UG", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Uganda", - "example": "712345678", - "display_name": "Uganda (UG) [+256]", - "full_example_with_plus_sign": "+256712345678", - "display_name_no_e164_cc": "Uganda (UG)", - "e164_key": "256-UG-0" - }, - { - "e164_cc": "380", - "iso2_cc": "UA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Ukraine", - "example": "391234567", - "display_name": "Ukraine (UA) [+380]", - "full_example_with_plus_sign": "+380391234567", - "display_name_no_e164_cc": "Ukraine (UA)", - "e164_key": "380-UA-0" - }, - { - "e164_cc": "971", - "iso2_cc": "AE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "United Arab Emirates", - "example": "501234567", - "display_name": "United Arab Emirates (AE) [+971]", - "full_example_with_plus_sign": "+971501234567", - "display_name_no_e164_cc": "United Arab Emirates (AE)", - "e164_key": "971-AE-0" - }, - { - "e164_cc": "44", - "iso2_cc": "GB", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "United Kingdom", - "example": "7400123456", - "display_name": "United Kingdom (GB) [+44]", - "full_example_with_plus_sign": "+447400123456", - "display_name_no_e164_cc": "United Kingdom (GB)", - "e164_key": "44-GB-0" - }, - { - "e164_cc": "1", - "iso2_cc": "US", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "United States", - "example": "2012345678", - "display_name": "United States (US) [+1]", - "full_example_with_plus_sign": "+12012345678", - "display_name_no_e164_cc": "United States (US)", - "e164_key": "1-US-0" - }, - { - "e164_cc": "598", - "iso2_cc": "UY", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Uruguay", - "example": "94231234", - "display_name": "Uruguay (UY) [+598]", - "full_example_with_plus_sign": "+59894231234", - "display_name_no_e164_cc": "Uruguay (UY)", - "e164_key": "598-UY-0" - }, - { - "e164_cc": "998", - "iso2_cc": "UZ", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Uzbekistan", - "example": "912345678", - "display_name": "Uzbekistan (UZ) [+998]", - "full_example_with_plus_sign": "+998912345678", - "display_name_no_e164_cc": "Uzbekistan (UZ)", - "e164_key": "998-UZ-0" - }, - { - "e164_cc": "678", - "iso2_cc": "VU", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Vanuatu", - "example": "5912345", - "display_name": "Vanuatu (VU) [+678]", - "full_example_with_plus_sign": "+6785912345", - "display_name_no_e164_cc": "Vanuatu (VU)", - "e164_key": "678-VU-0" - }, - { - "e164_cc": "379", - "iso2_cc": "VA", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Vatican City", - "example": "", - "display_name": "Vatican City (VA) [+379]", - "full_example_with_plus_sign": null, - "display_name_no_e164_cc": "Vatican City (VA)", - "e164_key": "379-VA-0" - }, - { - "e164_cc": "58", - "iso2_cc": "VE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Venezuela", - "example": "4121234567", - "display_name": "Venezuela (VE) [+58]", - "full_example_with_plus_sign": "+584121234567", - "display_name_no_e164_cc": "Venezuela (VE)", - "e164_key": "58-VE-0" - }, - { - "e164_cc": "84", - "iso2_cc": "VN", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Vietnam", - "example": "912345678", - "display_name": "Vietnam (VN) [+84]", - "full_example_with_plus_sign": "+84912345678", - "display_name_no_e164_cc": "Vietnam (VN)", - "e164_key": "84-VN-0" - }, - { - "e164_cc": "681", - "iso2_cc": "WF", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Wallis and Futuna", - "example": "501234", - "display_name": "Wallis and Futuna (WF) [+681]", - "full_example_with_plus_sign": "+681501234", - "display_name_no_e164_cc": "Wallis and Futuna (WF)", - "e164_key": "681-WF-0" - }, - { - "e164_cc": "212", - "iso2_cc": "EH", - "e164_sc": 0, - "geographic": true, - "level": 3, - "name": "Western Sahara", - "example": "", - "display_name": "Western Sahara (EH) [+212]", - "full_example_with_plus_sign": null, - "display_name_no_e164_cc": "Western Sahara (EH)", - "e164_key": "212-EH-0" - }, - { - "e164_cc": "967", - "iso2_cc": "YE", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Yemen", - "example": "712345678", - "display_name": "Yemen (YE) [+967]", - "full_example_with_plus_sign": "+967712345678", - "display_name_no_e164_cc": "Yemen (YE)", - "e164_key": "967-YE-0" - }, - { - "e164_cc": "260", - "iso2_cc": "ZM", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Zambia", - "example": "955123456", - "display_name": "Zambia (ZM) [+260]", - "full_example_with_plus_sign": "+260955123456", - "display_name_no_e164_cc": "Zambia (ZM)", - "e164_key": "260-ZM-0" - }, - { - "e164_cc": "263", - "iso2_cc": "ZW", - "e164_sc": 0, - "geographic": true, - "level": 1, - "name": "Zimbabwe", - "example": "711234567", - "display_name": "Zimbabwe (ZW) [+263]", - "full_example_with_plus_sign": "+263711234567", - "display_name_no_e164_cc": "Zimbabwe (ZW)", - "e164_key": "263-ZW-0" - } -] diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/cs.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/cs.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 774ce90d4..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/cs.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/da.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/da.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index aa7a5c786..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/da.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de-AT.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de-AT.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 2f8cdc4be..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de-AT.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de-CH.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de-CH.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 2f8cdc4be..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de-CH.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 2f8cdc4be..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/el.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/el.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index b323f5112..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/el.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-AU.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-AU.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 6855829fa..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-AU.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-CA.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-CA.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 6855829fa..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-CA.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-GB.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-GB.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 6855829fa..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-GB.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-IE.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-IE.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 6855829fa..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-IE.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-IN.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-IN.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 6855829fa..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-IN.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-SG.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-SG.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 6855829fa..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-SG.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-ZA.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-ZA.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 6855829fa..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-ZA.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 1f4ed0dd7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-419.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-419.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-419.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-AR.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-AR.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-AR.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-BO.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-BO.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-BO.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CL.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CL.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CL.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CO.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CO.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CO.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CR.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CR.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CR.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-DO.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-DO.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-DO.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-EC.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-EC.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-EC.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-GT.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-GT.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-GT.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-HN.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-HN.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-HN.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-MX.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-MX.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-MX.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-NI.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-NI.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-NI.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PA.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PA.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PA.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PE.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PE.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PE.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PR.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PR.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PR.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PY.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PY.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PY.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-SV.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-SV.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-SV.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-US.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-US.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-US.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-UY.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-UY.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-UY.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-VE.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-VE.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 90a25f9f7..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-VE.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 7568e28d6..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fa.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fa.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 6582ac70d..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fa.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fi.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fi.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index d346cbe43..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fi.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fil.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fil.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 0c9ea835c..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fil.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fr-CH.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fr-CH.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 7774f0d2a..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fr-CH.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fr.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fr.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 7774f0d2a..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fr.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/gsw.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/gsw.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 2f8cdc4be..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/gsw.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/gu.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/gu.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 5665b71e1..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/gu.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/he.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/he.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 786aa076e..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/he.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hi.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hi.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 6d615d8f5..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hi.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hr.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hr.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 7ad9f7b6f..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hr.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hu.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hu.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 0f43578c6..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hu.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone.png deleted file mode 100644 index 506123937..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone@2x.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone@2x.png deleted file mode 100644 index f60cc27f8..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone@2x.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone@3x.png b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone@3x.png deleted file mode 100644 index a131ec1c8..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone@3x.png and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/id.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/id.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 19409dfb0..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/id.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/it.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/it.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index f993f539b..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/it.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ja.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ja.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index b6e3ad877..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ja.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/kn.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/kn.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 1b611e896..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/kn.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ko.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ko.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index ea15cbd27..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ko.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ln.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ln.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 7774f0d2a..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ln.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/lt.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/lt.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 02819609c..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/lt.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/lv.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/lv.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 66ce9629f..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/lv.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/mr.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/mr.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 9a96373b3..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/mr.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ms.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ms.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 928efe4ad..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ms.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nb.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nb.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index c7e1670f8..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nb.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nl.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nl.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 9a1277528..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nl.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nn-NO.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nn-NO.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index c7e1670f8..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nn-NO.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pl.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pl.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 9b8a61a1d..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pl.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt-BR.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt-BR.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 13e4743ae..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt-BR.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt-PT.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt-PT.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 419686a18..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt-PT.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 13e4743ae..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ro.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ro.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 651b41ea6..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ro.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ru.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ru.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 847702ea9..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ru.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sk.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sk.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 237df059a..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sk.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sl.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sl.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 6fe48eaf1..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sl.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sr-Latn.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sr-Latn.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 31b053dc2..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sr-Latn.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sr.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sr.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index d459e1c21..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sr.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sv.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sv.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 7966d5871..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sv.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ta.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ta.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 738001c41..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ta.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/th.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/th.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 3f9925f82..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/th.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/tr.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/tr.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 9b16a200b..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/tr.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/uk.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/uk.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index d8e2b9c7e..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/uk.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ur.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ur.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 1f4ad3a4a..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ur.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/vi.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/vi.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 8a41bb010..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/vi.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hans.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hans.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 67425ef66..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hans.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hant-TW.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hant-TW.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index c187b2989..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hant-TW.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hant.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hant.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index c187b2989..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hant.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh.lproj/FirebasePhoneAuthUI.strings b/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh.lproj/FirebasePhoneAuthUI.strings deleted file mode 100644 index 67425ef66..000000000 Binary files a/Pods/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh.lproj/FirebasePhoneAuthUI.strings and /dev/null differ diff --git a/Pods/FirebaseUI/FirebaseUIFrameworks/LICENSE b/Pods/FirebaseUI/FirebaseUIFrameworks/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/Pods/FirebaseUI/FirebaseUIFrameworks/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Pods/Flurry-iOS-SDK/Flurry/Flurry.h b/Pods/Flurry-iOS-SDK/Flurry/Flurry.h deleted file mode 100644 index f81e4b02f..000000000 --- a/Pods/Flurry-iOS-SDK/Flurry/Flurry.h +++ /dev/null @@ -1,1222 +0,0 @@ -// -// Flurry.h -// Flurry iOS Analytics Agent -// -// Copyright 2016 Flurry, Inc. All rights reserved. -// -// Methods in this header file are for use with Flurry Analytics - -#import -#if !TARGET_OS_WATCH -#import -#endif -#if TARGET_OS_TV -@class JSContext; -#endif - -#import "FlurrySessionBuilder.h" - -typedef enum { - FlurryEventFailed = 0, - FlurryEventRecorded, - FlurryEventUniqueCountExceeded, - FlurryEventParamsCountExceeded, - FlurryEventLogCountExceeded, - FlurryEventLoggingDelayed, - FlurryEventAnalyticsDisabled -} FlurryEventRecordStatus; - - -/*! - * @brief Enum for logging events that occur within a syndicated app - * @since 6.7.0 - * - */ - -typedef enum { - FlurrySyndicationReblog = 0, - FlurrySyndicationFastReblog = 1, - FlurrySyndicationSourceClick = 2, - FlurrySyndicationLike = 3, - FlurrySyndicationShareClick = 4, - FlurrySyndicationPostSend = 5 - -}FlurrySyndicationEvent; - -extern NSString* const kSyndicationiOSDeepLink; -extern NSString* const kSyndicationAndroidDeepLink; -extern NSString* const kSyndicationWebDeepLink; - - -typedef enum { - FlurryTransactionRecordFailed = 0, - FlurryTransactionRecorded, - FlurryTransactionRecordExceeded, - FlurryTransactionRecodingDisabled -} FlurryTransactionRecordStatus; - - -/*! - * @brief Provides all available delegates for receiving callbacks related to Flurry analytics. - * - * Set of methods that allow developers to manage and take actions within - * different phases of App. - * - * @note This class serves as a delegate for Flurry. \n - * For additional information on how to use Flurry's Ads SDK to - * attract high-quality users and monetize your user base see Support Center - Publisher. - * @author 2010 - 2014 Flurry, Inc. All Rights Reserved. - * @version 6.3.0 - * - */ -@protocol FlurryDelegate - -/*! - * @brief Invoked when analytics session is created - * @since 6.3.0 - * - * This method informs the app that an analytics session is created. - * - * @see Flurry#startSession for details on session. - * - * @param info A dictionary of session information: sessionID, apiKey - */ -- (void)flurrySessionDidCreateWithInfo:(NSDictionary*)info; - -@end - -/*! - * @brief Provides all available methods for defining and reporting Analytics from use - * of your app. - * - * Set of methods that allow developers to capture detailed, aggregate information - * regarding the use of their app by end users. - * - * @note This class provides methods necessary for correct function of Flurry.h. - * For information on how to use Flurry's Ads SDK to - * attract high-quality users and monetize your user base see Support Center - Publishers. - * - * @version 4.3.0 - * - */ - -@interface Flurry : NSObject { -} - -/** @name Pre-Session Calls - * Optional sdk settings that should be called before start session. - */ -//@{ - -/*! - * @brief Explicitly specifies the App Version that Flurry will use to group Analytics data. - * @since 2.7 - * - * @deprecated since 7.7.0, please use FlurrySessionBuilder in place of calling this API. - * This method will be removed in a future version of the SDK. - * - * This is an optional method that overrides the App Version Flurry uses for reporting. Flurry will - * use the CFBundleVersion in your info.plist file when this method is not invoked. - * - * @note There is a maximum of 605 versions allowed for a single app. \n - * This method must be called prior to invoking #startSession:. - * - * @param version The custom version name. - */ -+ (void)setAppVersion:(NSString*) version __attribute__ ((deprecated)); - - -#if TARGET_OS_TV -/*! - * @brief Sets the minimum number of events before a partial session report is sent to Flurry. - * @since 1.0.0 - * - * @deprecated since 7.7.0, please use FlurrySessionBuilder in place of calling this API. - * This method will be removed in a future version of the SDK. - * - * This is an optional method that sets the minimum number of events before a partial session report is sent to Flurry. - * The acceptable values are between 5 and 50. - * - * @note This method must be called prior to invoking #startSession:. - * - * @param count The number of events after which partial session report is sent to Flurry. - */ -+ (void)setTVEventFlushCount:(short)count __attribute__ ((deprecated)); - -/*! - * @brief Sets the minimum duration (in minutes) before a partial session report is sent to Flurry. - * @since 1.0.0 - * - * @deprecated since 7.7.0, please use FlurrySessionBuilder in place of calling this API. - * This method will be removed in a future version of the SDK. - * - * This is an optional method that sets the minimum duration (in minutes) before a partial session report is sent to Flurry. - * The acceptable values are between 5 and 60 minutes. - * - * @note This method must be called prior to invoking #startSession:. - * - * @param duration The period after which a partial session report is sent to Flurry. - */ -+ (void)setTVSessionReportingInterval:(short)duration __attribute__ ((deprecated)); -#endif - -/*! - * @brief Retrieves the Flurry Agent Build Version. - * @since 2.7 - * - * This is an optional method that retrieves the Flurry Agent Version the app is running under. - * It is most often used if reporting an unexpected behavior of the SDK to - * Flurry Support - * - * @see #setLogLevel: for information on how to view debugging information on your console. - * - * @return The agent version of the Flurry SDK. - * - */ -+ (NSString *)getFlurryAgentVersion; - -/*! - * @brief Displays an exception in the debug log if thrown during a Session. - * @since 2.7 - * - * This is an optional method that augments the debug logs with exceptions that occur during the session. - * You must both capture exceptions to Flurry and set debug logging to enabled for this method to - * display information to the console. The default setting for this method is @c NO. - * - * @note This method can be called at any point in the execution of your application and - * the setting will take effect for SDK activity after this call. - * - * @see #setLogLevel: for information on how to view debugging information on your console. \n - * #logError:message:exception: for details on logging exceptions. \n - * #logError:message:error: for details on logging errors. - * - * @param value @c YES to show errors in debug logs, @c NO to omit errors in debug logs. - */ -+ (void)setShowErrorInLogEnabled:(BOOL)value; - -/*! - * @brief Generates debug logs to console. - * @since 2.7 - * - * @deprecated since 7.7.0, please use setLogLevel or FlurrySessionBuilder in place of calling this API. - * This method will be removed in a future version of the SDK. - * - * This is an optional method that displays debug information related to the Flurry SDK. - * display information to the console. The default setting for this method is @c NO - * which sets the log level to @c FlurryLogLevelCriticalOnly. - * When set to @c YES the debug log level is set to @c FlurryLogLevelDebug - * - * @param value @c YES to show debug logs, @c NO to omit debug logs. - * - */ -+ (void)setDebugLogEnabled:(BOOL)value __attribute__ ((deprecated)); - -/*! - * @brief Generates debug logs to console. - * @since 4.2.2 - * - * This is an optional method that displays debug information related to the Flurry SDK. - * display information to the console. The default setting for this method is @c FlurryLogLevelCriticalOnly. - * - * @note The log level can be changed at any point in the execution of your application and - * the level that is set will take effect for SDK activity after this call. - * - * @param value Log level - * - */ -+ (void)setLogLevel:(FlurryLogLevel)value; - -/*! - * @brief Set the timeout for expiring a Flurry session. - * @since 2.7 - * - * @deprecated since 7.7.0, please use FlurrySessionBuilder in place of calling this API. - * This method will be removed in a future version of the SDK. - * - * This is an optional method that sets the time the app may be in the background before - * starting a new session upon resume. The default value for the session timeout is 10 - * seconds in the background. - * - * @note This method must be called prior to invoking #startSession:. - * - * @param seconds The time in seconds to set the session timeout to. - */ -+ (void)setSessionContinueSeconds:(int)seconds __attribute__ ((deprecated)); - - -#if !TARGET_OS_TV -/*! - * @brief Enable automatic collection of crash reports. - * @since 4.1 - * @deprecated since 7.7.0, please use FlurrySessionBuilder in place of calling this API. - * - * This is an optional method that collects crash reports when enabled. The - * default value is @c NO. - * - * @note This method must be called prior to invoking #startSession:. - * - * @param value @c YES to enable collection of crash reports. - */ -+ (void)setCrashReportingEnabled:(BOOL)value __attribute__ ((deprecated)); -#endif - -//@} - -/*! - * @brief Start a Flurry session for the project denoted by @c apiKey. - * @since 2.6 - * - * This method serves as the entry point to Flurry Analytics collection. It must be - * called in the scope of @c applicationDidFinishLaunching. The session will continue - * for the period the app is in the foreground until your app is backgrounded for the - * time specified in #setSessionContinueSeconds:. If the app is resumed in that period - * the session will continue, otherwise a new session will begin. - * - * Crash reporting will not be enabled. See #setCrashReportingEnabled: for - * more information. - * - * @note If testing on a simulator, please be sure to send App to background via home - * button. Flurry depends on the iOS lifecycle to be complete for full reporting. - * - * @see #setSessionContinueSeconds: for details on setting a custom session timeout. - * - * @code - * - (void)applicationDidFinishLaunching:(UIApplication *)application - { - // Optional Flurry startup methods - [Flurry startSession:@"YOUR_API_KEY"]; - // .... - } - * @endcode - * - * @param apiKey The API key for this project. - */ - -+ (void)startSession:(NSString *)apiKey; - - -/*! - * @brief Start a Flurry session for the project denoted by @c apiKey. - * @since 4.0.8 - * - * This method serves as the entry point to Flurry Analytics collection. It must be - * called in the scope of @c applicationDidFinishLaunching passing in the launchOptions param. - * The session will continue - * for the period the app is in the foreground until your app is backgrounded for the - * time specified in #setSessionContinueSeconds:. If the app is resumed in that period - * the session will continue, otherwise a new session will begin. - * - * @note If testing on a simulator, please be sure to send App to background via home - * button. Flurry depends on the iOS lifecycle to be complete for full reporting. - * - * @see #setSessionContinueSeconds: for details on setting a custom session timeout. - * - * @code - * - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions - { - // Optional Flurry startup methods - [Flurry startSession:@"YOUR_API_KEY" withOptions:launchOptions]; - // .... - } - * @endcode - * - * @param apiKey The API key for this project. - * @param options passed launchOptions from the applicatin's didFinishLaunchingWithOptions:(NSDictionary *)launchOptions - - */ -+ (void) startSession:(NSString *)apiKey withOptions:(id)options; - - -/*! - * @brief Start a Flurry session for the project denoted by @c apiKey. - * @since 7.7.0 - * - * This method serves as the entry point to Flurry Analytics collection. It must be - * called in the scope of @c applicationDidFinishLaunching passing in the launchOptions param. - * The session will continue - * for the period the app is in the foreground until your app is backgrounded for the - * time specified in #setSessionContinueSeconds:. If the app is resumed in that period - * the session will continue, otherwise a new session will begin. - * - * @note If testing on a simulator, please be sure to send App to background via home - * button. Flurry depends on the iOS lifecycle to be complete for full reporting. - * - * @see #setSessionContinueSeconds: for details on setting a custom session timeout. - * - * @code - * - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions - { - // Optional Flurry startup methods - FlurrySessionBuilder* builder = [[[[[FlurrySessionBuilder new] withLogLevel:FlurryLogLevelDebug] - withCrashReporting:NO] - withSessionContinueSeconds:10] - withAppVersion:@"0.1.2"]; - - [Flurry startSession:@"YOUR_API_KEY" withOptions:launchOptions withSessionBuilder:sessionBuilder]; - // .... - } - * @endcode - * - * @param apiKey The API key for this project. - * @param options passed launchOptions from the applicatin's didFinishLaunchingWithOptions:(NSDictionary *)launchOptions - * @param sessionBuilder pass in the session builder object to specify that session construction options - - */ -+ (void) startSession:(NSString *)apiKey withOptions:(id)options withSessionBuilder:(FlurrySessionBuilder*) sessionBuilder; - - -/*! - * @brief Start a Flurry session for the project denoted by @c apiKey. - * @since 7.7.0 - * - * This method serves as the entry point to Flurry Analytics collection. It must be - * called in the scope of @c applicationDidFinishLaunching passing in the launchOptions param. - * The session will continue - * for the period the app is in the foreground until your app is backgrounded for the - * time specified in #setSessionContinueSeconds:. If the app is resumed in that period - * the session will continue, otherwise a new session will begin. - * - * @note If testing on a simulator, please be sure to send App to background via home - * button. Flurry depends on the iOS lifecycle to be complete for full reporting. - * - * @see #setSessionContinueSeconds: for details on setting a custom session timeout. - * - * @code - * - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions - { - // Optional Flurry startup methods - FlurrySessionBuilder* builder = [[[[[FlurrySessionBuilder new] withLogLevel:FlurryLogLevelDebug] - withCrashReporting:NO] - withSessionContinueSeconds:10] - withAppVersion:@"0.1.2"]; - - [Flurry startSession:@"YOUR_API_KEY" withSessionBuilder:sessionBuilder]; - // .... - } - * @endcode - * - * @param apiKey The API key for this project. - * @param sessionBuilder pass in the session builder object to specify that session construction options - */ -+ (void) startSession:(NSString *)apiKey withSessionBuilder:(FlurrySessionBuilder *)sessionBuilder; - -/*! - * @brief Returns true if a session currently exists and is active. - * @since 6.0.0 - * - * @code - * - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions - { - // Optional Flurry startup methods - [Flurry activeSessionExists]; - // .... - } - * @endcode - * - */ -+ (BOOL)activeSessionExists; - -/*! - * @brief Returns the session ID of the current active session. - * @since 6.3.0 - * - * @code - * - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions - { - // Optional Flurry startup methods - [Flurry getSessionID]; - // .... - } - * @endcode - * - - */ -+ (NSString*)getSessionID; - - -/*! - * @brief Set Flurry delegate for callback on session creation. - * @since 6.3.0 - * - * @code - * - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions - { - // Optional Flurry startup methods - // If self implements protocol, FlurryDelegate - [Flurry setDelegate:self]; - // .... - } - * @endcode - * - - */ -+ (void)setDelegate:(id)delegate; - - -#if !TARGET_OS_TV -/*! - * @brief Pauses a Flurry session left running in background. - * @since 4.2.2 - * - * This method should be used in case of #setBackgroundSessionEnabled: set to YES. It can be - * called when application finished all background tasks (such as playing music) to pause session. - * - * @see #setBackgroundSessionEnabled: for details on setting a custom behaviour on resigning activity. - * - * @code - * - (void)allBackgroundTasksFinished - { - // .... - [Flurry pauseBackgroundSession]; - // .... - } - * @endcode - * - */ -+ (void)pauseBackgroundSession; -#endif - -/*! - * @brief Adds an session origin and deep link attached to each session specified by @c sessionOriginName and @c deepLink. - * @since 6.5.0 - * - * This method allows you to specify session origin and deep link for each session. This is different than addOrigin which is used for third party - * wrappers after every session start. - * - * - * @code - * - (void)interestingMethod - { - // ... after calling startSession - [Flurry addSessionOrigin:@"facebuk"]; - // more code ... - } - * @endcode - * - * @param sessionOriginName Name of the origin. - * @param deepLink Url of the deep Link. - */ -+ (void)addSessionOrigin:(NSString *)sessionOriginName withDeepLink:(NSString*)deepLink; - -/*! - * @brief Adds an session origin attached to each session specified by @c sessionOriginName. - * @since 6.5.0 - * - * This method allows you to specify session origin for each session. This is different than addOrigin which is used for third party - * wrappers after every session start. - * - * - * @code - * - (void)interestingMethod - { - // ... after calling startSession - [Flurry addSessionOrigin:@"facebuk"]; - // more code ... - } - * @endcode - * - * @param sessionOriginName Name of the origin. - */ -+ (void)addSessionOrigin:(NSString *)sessionOriginName; - -/*! - * @brief Adds a custom parameterized session parameters @c parameters. - * @since 6.5.0 - * - * This method allows you to associate parameters with an session. Parameters - * are valuable as they allow you to store characteristics of an session. - * - * @note You should not pass private or confidential information about your origin info in a - * custom origin. \n - * A maximum of 20 parameter names may be associated with any origin. Sending - * over 20 parameter names with a single origin will result in no parameters being logged - * for that origin. - * - * - * @code - - * @endcode - * - * @param parameters An immutable copy of map containing Name-Value pairs of parameters. - */ -+ (void)sessionProperties:(NSDictionary *)parameters; - -/*! - * @brief Adds an SDK origin specified by @c originName and @c originVersion. - * @since 5.0.0 - * - * This method allows you to specify origin within your Flurry SDK wrapper. As a general rule - * you should capture all the origin info related to your wrapper for Flurry SDK after every session start. - * - * @see #addOrigin:withVersion:withParameters: for details on reporting origin info with parameters. \n - * - * @code - * - (void)interestingSDKWrapperLibraryfunction - { - // ... after calling startSession - [Flurry addOrigin:@"Interesting_Wrapper" withVersion:@"1.0.0"]; - // more code ... - } - * @endcode - * - * @param originName Name of the origin. - * @param originVersion Version string of the origin wrapper - */ -+ (void)addOrigin:(NSString *)originName withVersion:(NSString*)originVersion; - -/*! - * @brief Adds a custom parameterized origin specified by @c originName with @c originVersion and @c parameters. - * @since 5.0.0 - * - * This method overloads #addOrigin to allow you to associate parameters with an origin attribute. Parameters - * are valuable as they allow you to store characteristics of an origin. - * - * @note You should not pass private or confidential information about your origin info in a - * custom origin. \n - * A maximum of 9 parameter names may be associated with any origin. Sending - * over 10 parameter names with a single origin will result in no parameters being logged - * for that origin. - * - * - * @code - * - (void)userPurchasedSomethingCool - { - NSDictionary *params = - [NSDictionary dictionaryWithObjectsAndKeys:@"Origin Info Item", // Parameter Value - @"Origin Info Item Key", // Parameter Name - nil]; - // ... after calling startSession - [Flurry addOrigin:@"Interesting_Wrapper" withVersion:@"1.0.0"]; - // more code ... - } - * @endcode - * - * @param originName Name of the origin. - * @param originVersion Version string of the origin wrapper - * @param parameters An immutable copy of map containing Name-Value pairs of parameters. - */ -+ (void)addOrigin:(NSString *)originName withVersion:(NSString*)originVersion withParameters:(NSDictionary *)parameters; - -/** @name Event and Error Logging - * Methods for reporting custom events and errors during the session. - */ -//@{ - -/*! - * @brief Records a custom event specified by @c eventName. - * @since 2.8.4 - * - * This method allows you to specify custom events within your app. As a general rule - * you should capture events related to user navigation within your app, any action - * around monetization, and other events as they are applicable to tracking progress - * towards your business goals. - * - * @note You should not pass private or confidential information about your users in a - * custom event. \n - * Where applicable, you should make a concerted effort to use timed events with - * parameters (#logEvent:withParameters:timed:) or events with parameters - * (#logEvent:withParameters:). This provides valuable information around the time the user - * spends within an action (e.g. - time spent on a level or viewing a page) or characteristics - * of an action (e.g. - Buy Event that has a Parameter of Widget with Value Golden Sword). - * - * @see #logEvent:withParameters: for details on storing events with parameters. \n - * #logEvent:timed: for details on storing timed events. \n - * #logEvent:withParameters:timed: for details on storing timed events with parameters. \n - * #endTimedEvent:withParameters: for details on stopping a timed event and (optionally) updating - * parameters. - * - * @code - * - (void)interestingAppAction - { - [Flurry logEvent:@"Interesting_Action"]; - // Perform interesting action - } - * @endcode - * - * @param eventName Name of the event. For maximum effectiveness, we recommend using a naming scheme - * that can be easily understood by non-technical people in your business domain. - * - * @return enum FlurryEventRecordStatus for the recording status of the logged event. - */ -+ (FlurryEventRecordStatus)logEvent:(NSString *)eventName; - -/*! - * @brief Records a custom parameterized event specified by @c eventName with @c parameters. - * @since 2.8.4 - * - * This method overloads #logEvent to allow you to associate parameters with an event. Parameters - * are extremely valuable as they allow you to store characteristics of an action. For example, - * if a user purchased an item it may be helpful to know what level that user was on. - * By setting this parameter you will be able to view a distribution of levels for the purcahsed - * event on the Flurrly Dev Portal. - * - * @note You should not pass private or confidential information about your users in a - * custom event. \n - * A maximum of 10 parameter names may be associated with any event. Sending - * over 10 parameter names with a single event will result in no parameters being logged - * for that event. You may specify an infinite number of Parameter values. For example, - * a Search Box would have 1 parameter name (e.g. - Search Box) and many values, which would - * allow you to see what values users look for the most in your app. \n - * Where applicable, you should make a concerted effort to use timed events with - * parameters (#logEvent:withParameters:timed:). This provides valuable information - * around the time the user spends within an action (e.g. - time spent on a level or - * viewing a page). - * - * @see #logEvent:withParameters:timed: for details on storing timed events with parameters. \n - * #endTimedEvent:withParameters: for details on stopping a timed event and (optionally) updating - * parameters. - * - * @code - * - (void)userPurchasedSomethingCool - { - NSDictionary *params = - [NSDictionary dictionaryWithObjectsAndKeys:@"Cool Item", // Parameter Value - @"Item Purchased", // Parameter Name - nil]; - [Flurry logEvent:@"Something Cool Purchased" withParameters:params]; - // Give user cool item - } - * @endcode - * - * @param eventName Name of the event. For maximum effectiveness, we recommend using a naming scheme - * that can be easily understood by non-technical people in your business domain. - * @param parameters An immutable copy of map containing Name-Value pairs of parameters. - * - * @return enum FlurryEventRecordStatus for the recording status of the logged event. - */ -+ (FlurryEventRecordStatus)logEvent:(NSString *)eventName withParameters:(NSDictionary *)parameters; - -/*! - * @brief Records an app exception. Commonly used to catch unhandled exceptions. - * @since 2.7 - * - * This method captures an exception for reporting to Flurry. We recommend adding an uncaught - * exception listener to capture any exceptions that occur during usage that is not - * anticipated by your app. - * - * @see #logError:message:error: for details on capturing errors. - * - * @code - * - (void) uncaughtExceptionHandler(NSException *exception) - { - [Flurry logError:@"Uncaught" message:@"Crash!" exception:exception]; - } - - - (void)applicationDidFinishLaunching:(UIApplication *)application - { - NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); - [Flurry startSession:@"YOUR_API_KEY"]; - // .... - } - * @endcode - * - * @param errorID Name of the error. - * @param message The message to associate with the error. - * @param exception The exception object to report. - */ -+ (void)logError:(NSString *)errorID message:(NSString *)message exception:(NSException *)exception; - -/*! - * @brief Records an app error. - * @since 2.7 - * - * This method captures an error for reporting to Flurry. - * - * @see #logError:message:exception: for details on capturing exceptions. - * - * @code - * - (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error - { - [Flurry logError:@"WebView No Load" message:[error localizedDescription] error:error]; - } - * @endcode - * - * @param errorID Name of the error. - * @param message The message to associate with the error. - * @param error The error object to report. - */ -+ (void)logError:(NSString *)errorID message:(NSString *)message error:(NSError *)error; - -/*! - * @brief Records a timed event specified by @c eventName. - * @since 2.8.4 - * - * This method overloads #logEvent to allow you to capture the length of an event. This can - * be extremely valuable to understand the level of engagement with a particular action. For - * example, you can capture how long a user spends on a level or reading an article. - * - * @note You should not pass private or confidential information about your users in a - * custom event. \n - * Where applicable, you should make a concerted effort to use parameters with your timed - * events (#logEvent:withParameters:timed:). This provides valuable information - * around the characteristics of an action (e.g. - Buy Event that has a Parameter of Widget with - * Value Golden Sword). - * - * @see #logEvent:withParameters:timed: for details on storing timed events with parameters. \n - * #endTimedEvent:withParameters: for details on stopping a timed event and (optionally) updating - * parameters. - * - * @code - * - (void)startLevel - { - [Flurry logEvent:@"Level Played" timed:YES]; - // Start user on level - } - - - (void)endLevel - { - [Flurry endTimedEvent:@"Level Played" withParameters:nil]; - // User done with level - } - * @endcode - * - * @param eventName Name of the event. For maximum effectiveness, we recommend using a naming scheme - * that can be easily understood by non-technical people in your business domain. - * @param timed Specifies the event will be timed.. - * - * @return enum FlurryEventRecordStatus for the recording status of the logged event. - */ -+ (FlurryEventRecordStatus)logEvent:(NSString *)eventName timed:(BOOL)timed; - -/*! - * @brief Records a custom parameterized timed event specified by @c eventName with @c parameters. - * @since 2.8.4 - * - * This method overloads #logEvent to allow you to capture the length of an event with parameters. - * This can be extremely valuable to understand the level of engagement with a particular action - * and the characteristics associated with that action. For example, you can capture how long a user - * spends on a level or reading an article. Parameters can be used to capture, for example, the - * author of an article or if something was purchased while on the level. - * - * @note You should not pass private or confidential information about your users in a - * custom event. - * - * @see #endTimedEvent:withParameters: for details on stopping a timed event and (optionally) updating - * parameters. - * - * @code - * - (void)startLevel - { - NSDictionary *params = - [NSDictionary dictionaryWithObjectsAndKeys:@"100", // Parameter Value - @"Current Points", // Parameter Name - nil]; - - [Flurry logEvent:@"Level Played" withParameters:params timed:YES]; - // Start user on level - } - - - (void)endLevel - { - // User gained additional 100 points in Level - NSDictionary *params = - [NSDictionary dictionaryWithObjectsAndKeys:@"200", // Parameter Value - @"Current Points", // Parameter Name - nil]; - [Flurry endTimedEvent:@"Level Played" withParameters:params]; - // User done with level - } - * @endcode - * - * @param eventName Name of the event. For maximum effectiveness, we recommend using a naming scheme - * that can be easily understood by non-technical people in your business domain. - * @param parameters An immutable copy of map containing Name-Value pairs of parameters. - * @param timed Specifies the event will be timed.. - * - * @return enum FlurryEventRecordStatus for the recording status of the logged event. - */ -+ (FlurryEventRecordStatus)logEvent:(NSString *)eventName withParameters:(NSDictionary *)parameters timed:(BOOL)timed; - -/*! - * @brief Ends a timed event specified by @c eventName and optionally updates parameters with @c parameters. - * @since 2.8.4 - * - * This method ends an existing timed event. If parameters are provided, this will overwrite existing - * parameters with the same name or create new parameters if the name does not exist in the parameter - * map set by #logEvent:withParameters:timed:. - * - * @note You should not pass private or confidential information about your users in a - * custom event. \n - * If the app is backgrounded prior to ending a timed event, the Flurry SDK will automatically - * end the timer on the event. \n - * #endTimedEvent:withParameters: is ignored if called on a previously - * terminated event. - * - * @see #logEvent:withParameters:timed: for details on starting a timed event with parameters. - * - * @code - * - (void)startLevel - { - NSDictionary *params = - [NSDictionary dictionaryWithObjectsAndKeys:@"100", // Parameter Value - @"Current Points", // Parameter Name - nil]; - - [Flurry logEvent:@"Level Played" withParameters:params timed:YES]; - // Start user on level - } - - - (void)endLevel - { - // User gained additional 100 points in Level - NSDictionary *params = - [NSDictionary dictionaryWithObjectsAndKeys:@"200", // Parameter Value - @"Current Points", // Parameter Name - nil]; - [Flurry endTimedEvent:@"Level Played" withParameters:params]; - // User done with level - } - * @endcode - * - * @param eventName Name of the event. For maximum effectiveness, we recommend using a naming scheme - * that can be easily understood by non-technical people in your business domain. - * @param parameters An immutable copy of map containing Name-Value pairs of parameters. - */ -+ (void)endTimedEvent:(NSString *)eventName withParameters:(NSDictionary *)parameters; // non-nil parameters will update the parameters - -//@} - - -#if !TARGET_OS_TV -/** @name Page View Methods - * Count page views. - */ -//@{ - -/*! - * @deprecated - * @brief see +(void)logAllPageViewsForTarget:(id)target; for details - * @since 2.7 - * This method does the same as +(void)logAllPageViewsForTarget:(id)target method and is left for backward compatibility - */ -+ (void)logAllPageViews:(id)target __attribute__ ((deprecated)); -/*! - * @brief Automatically track page views on a @c UINavigationController or @c UITabBarController. - * @since 4.3 - * - * This method increments the page view count for a session based on traversing a UINavigationController - * or UITabBarController. The page view count is only a counter for the number of transitions in your - * app. It does not associate a name with the page count. To associate a name with a count of occurences - * see #logEvent:. - * - * @note If you need to release passed target, you should call counterpart method + (void)stopLogPageViewsForTarget:(id)target before; - * - * @see #logPageView for details on explictly incrementing page view count. - * - * @code - * -(void) trackViewsFromTabBar:(UITabBarController*) tabBar - { - [Flurry logAllPageViewsForTarget:tabBar]; - } - * @endcode - * - * @param target The navigation or tab bar controller. - */ -+ (void)logAllPageViewsForTarget:(id)target; - -/*! - * @brief Stops logging page views on previously observed with logAllPageViewsForTarget: @c UINavigationController or @c UITabBarController. - * @since 4.3 - * - * Call this method before instance of @c UINavigationController or @c UITabBarController observed with logAllPageViewsForTarget: is released. - * - * @code - * -(void) dealloc - { - [Flurry stopLogPageViewsForTarget:_tabBarController]; - [_tabBarController release]; - [super dealloc]; - } - * @endcode - * - * @param target The navigation or tab bar controller. - */ -+ (void)stopLogPageViewsForTarget:(id)target; - -/*! - * @brief Explicitly track a page view during a session. - * @since 2.7 - * - * This method increments the page view count for a session when invoked. It does not associate a name - * with the page count. To associate a name with a count of occurences see #logEvent:. - * - * @see #logAllPageViews for details on automatically incrementing page view count based on user - * traversing navigation or tab bar controller. - * - * @code - * -(void) trackView - { - [Flurry logPageView]; - } - * @endcode - * - */ -+ (void)logPageView; - -//@} -#endif - - - -/** @name User Info - * Methods to set user information. - */ -//@{ - -/*! - * @brief Assign a unique id for a user in your app. - * @since 2.7 - * - * @note Please be sure not to use this method to pass any private or confidential information - * about the user. - * - * @param userID The app id for a user. - */ -+ (void)setUserID:(NSString *)userID; - -/*! - * @brief Set your user's age in years. - * @since 2.7 - * - * Use this method to capture the age of your user. Only use this method if you collect this - * information explictly from your user (i.e. - there is no need to set a default value). - * - * @note The age is aggregated across all users of your app and not available on a per user - * basis. - * - * @param age Reported age of user. - * - */ -+ (void)setAge:(int)age; - -/*! - * @brief Set your user's gender. - * @since 2.7 - * - * Use this method to capture the gender of your user. Only use this method if you collect this - * information explictly from your user (i.e. - there is no need to set a default value). Allowable - * values are @c @"m" or @c @"f" - * - * @note The gender is aggregated across all users of your app and not available on a per user - * basis. - * - * @param gender Reported gender of user. - * - */ -+ (void)setGender:(NSString *)gender; // user's gender m or f - -//@} - -/** @name Location Reporting - * Methods for setting location information. - */ -//@{ -/*! - * @brief Set the location of the session. - * @since 2.7 - * - * Use information from the CLLocationManager to specify the location of the session. Flurry does not - * automatically track this information or include the CLLocation framework. - * - * @note Only the last location entered is captured per session. \n - * Regardless of accuracy specified, the Flurry SDK will only report location at city level or higher. \n - * Location is aggregated across all users of your app and not available on a per user basis. \n - * This information should only be captured if it is germaine to the use of your app. - * - * @code - CLLocationManager *locationManager = [[CLLocationManager alloc] init]; - [locationManager startUpdatingLocation]; - * @endcode - * - * After starting the location manager, you can set the location with Flurry. You can implement - * CLLocationManagerDelegate to be aware of when the location is updated. Below is an example - * of how to use this method, after you have recieved a location update from the locationManager. - * - * @code - CLLocation *location = locationManager.location; - [Flurry setLatitude:location.coordinate.latitude - longitude:location.coordinate.longitude - horizontalAccuracy:location.horizontalAccuracy - verticalAccuracy:location.verticalAccuracy]; - * @endcode - * @param latitude The latitude. - * @param longitude The longitude. - * @param horizontalAccuracy The radius of uncertainty for the location in meters. - * @param verticalAccuracy The accuracy of the altitude value in meters. - * - */ -+ (void)setLatitude:(double)latitude longitude:(double)longitude horizontalAccuracy:(float)horizontalAccuracy verticalAccuracy:(float)verticalAccuracy; - -//@} - -/** @name Session Reporting Calls - * Optional methods that can be called at any point to control session reporting. - */ -//@{ - -/*! - * @brief Set session to report when app closes. - * @since 2.7 - * - * Use this method report session data when the app is closed. The default value is @c YES. - * - * @note This method is rarely invoked in iOS >= 3.2 due to the updated iOS lifecycle. - * - * @see #setSessionReportsOnPauseEnabled: - * - * @param sendSessionReportsOnClose YES to send on close, NO to omit reporting on close. - * - */ -+ (void)setSessionReportsOnCloseEnabled:(BOOL)sendSessionReportsOnClose; - -/*! - * @brief Set session to report when app is sent to the background. - * @since 2.7 - * - * Use this method report session data when the app is paused. The default value is @c YES. - * - * @param setSessionReportsOnPauseEnabled YES to send on pause, NO to omit reporting on pause. - * - */ -+ (void)setSessionReportsOnPauseEnabled:(BOOL)setSessionReportsOnPauseEnabled; - -/*! - * @brief Set session to support background execution. - * @since 4.2.2 - * - * Use this method to enable reporting of errors and events when application is - * running in backgorund (such applications have UIBackgroundModes in Info.plist). - * You should call #pauseBackgroundSession when appropriate in background mode to - * pause the session (for example when played song completed in background) - * - * Default value is @c NO - * - * @see #pauseBackgroundSession for details - * - * @param setBackgroundSessionEnabled YES to enbale background support and - * continue log events and errors for running session. - */ -+ (void)setBackgroundSessionEnabled:(BOOL)setBackgroundSessionEnabled; - -/*! - * @brief Enable custom event logging. - * @since 2.7 - * - * @deprecated since 7.9.0. - * This method will be removed in a future version of the SDK. - * - * Use this method to allow the capture of custom events. The default value is @c YES. - * - * @param value YES to enable event logging, NO to stop custom logging. - * - */ -+ (void)setEventLoggingEnabled:(BOOL)value __attribute__ ((deprecated)); - -#if !TARGET_OS_TV -/*! - * @brief Enables Flurry Pulse - * @since 6.3.0 - * - * @note: Please see https://developer.yahoo.com/flurry-pulse/ for more details - * - * @param value YES to enable event logging, NO to stop custom logging. - * - */ -+ (void)setPulseEnabled:(BOOL)value; -#endif - - -/*! - * @brief Records a syndicated event specified by @c syndicationEvent. - * @since 6.7.0 - * - * This method is excusively for use by the Tumblr App, calls from others app will be ignored. - * - * @code - - (void) reblogButtonHandler - { - [Flurry logEvent:Reblog syndicationID:@"123", parameters:nil]; - // Perform - } - * @endcode - * - * @param syndicationEvent syndication event. - * @param syndicationID syndication ID that is associated with the event - * @param parameters use this to pass in syndication parameters such as - * kSyndicationiOSDeepLink, kSyndicationAndroidDeepLink, kSyndicationWebLinkDeepLink - * - * @return enum FlurryEventRecordStatus for the recording status of the logged event. - */ -+ (FlurryEventRecordStatus) logEvent:(FlurrySyndicationEvent) syndicationEvent syndicationID:(NSString*) syndicationID parameters:(NSDictionary*) parameters; - -#if !TARGET_OS_WATCH -/*! - * @brief Records an Apple Store transaction. - * @since 7.8.0 - * - * This method needs to be called before a transaction is finished and finalized. - * @note: Needs a 'required' dependency on StoreKit for this API to function correctly. - * - * @param transaction an SKPaymentTransaction. - * @param statusCallback a callback gettign called when the status of ID that is associated with the event - * - */ -+ (void) logPaymentTransaction:(SKPaymentTransaction*)transaction statusCallback:(void(^)(FlurryTransactionRecordStatus))statusCallback; -#endif - -#if !TARGET_OS_WATCH -/*! - * @brief Enables implicit recording of Apple Store transactions. - * @since 7.9.0 - * - * This method needs to be called before any transaction is finialized. - * @note: Needs a 'required' dependency on StoreKit for this API to function correctly. - * - * @param value YES to enable transaction logging, NO to stop transaction logging. - * - */ -+ (void) setIAPReportingEnabled:(BOOL)value; -#endif - - -#if TARGET_OS_TV -/*! - * @brief Registers the TVML's JSContext with the Flurry SDK. - * @since 1.0.0 - * - * - * @param appController The TVApplicationController object - * @param jsContext The JavaScript context object passed in - * - * This method is exclusively for use by the Client-Server TV apps. This method will internally register - * JavaScript APIs exposed on the TVJS domain with the Flurry SDK. The JavaScript methods available are: - * flurryLogEvent({String} eventName) - * flurryLogEvent({String} eventName, {object} params) - * flurryLogTimedEvent({String} eventName) - * flurryLogTimedEvent({String} eventName, {object} params) - * flurryEndTimedEvent({String} eventName, {object} params) - * flurryLogError({String} eventName, {String} message, {object} error) - * -> error : { - * errorDomain: {String}, - errorID: {Number}, - userInfo: {object} - * } - * flurrySetUserID({String} userID) - * flurrySetGender({String} gender) - * flurrySetAge({Number} age) - * flurrySetLocation({Number} latitude, {Number} longitude, {Number} horizontalAccuracy, {Number} verticalAccuracy) - * - * @code - - (void)appController:(TVApplicationController *)appController evaluateAppJavaScriptInContext:(JSContext *)jsContext { - [Flurry registerJSContextWithContext:jsContext]; - } - * @endcode - * - * @param jscontext JavaScript context passed in by the -appController:evaluateAppJavaScriptInContext method - */ - -+ (void)registerJSContextWithContext:(JSContext*)jscontext; -#endif - - -@end diff --git a/Pods/Flurry-iOS-SDK/Flurry/FlurryEmpty.m b/Pods/Flurry-iOS-SDK/Flurry/FlurryEmpty.m deleted file mode 100644 index f38647f4e..000000000 --- a/Pods/Flurry-iOS-SDK/Flurry/FlurryEmpty.m +++ /dev/null @@ -1,6 +0,0 @@ - -#import "Flurry.h" - -@implementation Flurry (ForceLoad) - -@end \ No newline at end of file diff --git a/Pods/Flurry-iOS-SDK/Flurry/FlurrySessionBuilder.h b/Pods/Flurry-iOS-SDK/Flurry/FlurrySessionBuilder.h deleted file mode 100644 index c01f5b0e5..000000000 --- a/Pods/Flurry-iOS-SDK/Flurry/FlurrySessionBuilder.h +++ /dev/null @@ -1,153 +0,0 @@ -// -// FlurrySessionBuilder.h -// Flurry -// -// Created by Akshay Bhandary on 7/14/16. -// Copyright © 2016 Flurry Inc. All rights reserved. -// - -/*! - * @brief Enum for setting up log output level. - * @since 4.2.0 - * - */ -typedef enum { - FlurryLogLevelNone = 0, //No output - FlurryLogLevelCriticalOnly, //Default, outputs only critical log events - FlurryLogLevelDebug, //Debug level, outputs critical and main log events - FlurryLogLevelAll //Highest level, outputs all log events -} FlurryLogLevel; - - -@interface FlurrySessionBuilder : NSObject - -/*! - * @brief Explicitly specifies the App Version that Flurry will use to group Analytics data. - * @since 7.7.0 - * - * This is an optional method that overrides the App Version Flurry uses for reporting. Flurry will - * use the CFBundleVersion in your info.plist file when this method is not invoked. - * - * @note There is a maximum of 605 versions allowed for a single app. - * - * @param value The custom version name. - */ -- (FlurrySessionBuilder*) withAppVersion:(NSString *)value; - - -/*! - * @brief Set the timeout for expiring a Flurry session. - * @since 7.7.0 - * - * This is an optional method that sets the time the app may be in the background before - * starting a new session upon resume. The default value for the session timeout is 10 - * seconds in the background. - * - * @param value The time in seconds to set the session timeout to. - */ -- (FlurrySessionBuilder*) withSessionContinueSeconds:(NSInteger)value; - - -/*! - * @brief Enable automatic collection of crash reports. - * @since 7.7.0 - * - * This is an optional method that collects crash reports when enabled. The - * default value is @c NO. - * - * @param value @c YES to enable collection of crash reports. - */ -- (FlurrySessionBuilder*) withCrashReporting:(BOOL)value; - -/*! - * @brief Generates debug logs to console. - * @since 7.7.0 - * - * This is an optional method that displays debug information related to the Flurry SDK. - * display information to the console. The default setting for this method is @c FlurryLogLevelCriticalOnly. - * - * @note The log level can be changed at any point in the execution of your application using the setLogLevel API defined in - * Flurry.h, see #setLogLevel for more info. - * - * @param value Log level - * - */ -- (FlurrySessionBuilder*) withLogLevel:(FlurryLogLevel) value; - - - -/*! - * @brief Displays an exception in the debug log if thrown during a Session. - * @since 7.7.0 - * - * This is an optional method that augments the debug logs with exceptions that occur during the session. - * You must both capture exceptions to Flurry and set the log level to Debug or All for this method to - * display information to the console. The default setting for this method is @c NO. - * - * @note This method can be called at any point in the execution of your application and - * the setting will take effect for SDK activity after this call. - * - * @see #setLogLevel: for information on how to view debugging information on your console. \n - * #logError:message:exception: for details on logging exceptions. \n - * #logError:message:error: for details on logging errors. - * - * @param value @c YES to show errors in debug logs, @c NO to omit errors in debug logs. - */ -- (FlurrySessionBuilder*) withShowErrorInLog:(BOOL) value; - -#if !TARGET_OS_WATCH -/*! - * @brief Enables implicit recording of Apple Store transactions. - * @since 7.9.0 - * - * @note This method needs to be called before any transaction is finialized. - * - * @param value @c YES to enable transaction logging with the default being @c NO. - * - */ - -- (FlurrySessionBuilder*) withIAPReportingEnabled:(BOOL) value; - -/*! - * @brief Enables opting out of background sessions being counted towards total sessions. - * @since 8.1.0-rc.1 - * - * @note This method must be called prior to invoking #startSession:. - * - * @param value @c NO to opt out of counting background sessions towards total sessions. - * The default value for the session is @c YES - * - */ - -- (FlurrySessionBuilder*) withIncludeBackgroundSessionsInMetrics:(BOOL) value; -#endif - -#if TARGET_OS_TV -/*! - * @brief Sets the minimum duration (in minutes) before a partial session report is sent to Flurry. - * @since 7.7.0 - * - * This is an optional method that sets the minimum duration (in minutes) before a partial session report is sent to Flurry. - * The acceptable values are between 5 and 60 minutes. - * - * @note This method must be called prior to invoking #startSession:. - * - * @param duration The period after which a partial session report is sent to Flurry. - */ -- (FlurrySessionBuilder*) withTVSessionReportingInterval:(NSInteger) value; - -/*! - * @brief Sets the minimum number of events before a partial session report is sent to Flurry. - * @since 7.7.0 - * - * This is an optional method that sets the minimum number of events before a partial session report is sent to Flurry. - * The acceptable values are between 5 and 50. - * - * @note This method must be called prior to invoking #startSession:. - * - * @param count The number of events after which partial session report is sent to Flurry. - */ -- (FlurrySessionBuilder*) withTVEventCountThreshold:(NSInteger) value; -#endif - -@end diff --git a/Pods/Flurry-iOS-SDK/Flurry/libFlurry_8.3.1.a b/Pods/Flurry-iOS-SDK/Flurry/libFlurry_8.3.1.a deleted file mode 100644 index efebc0ee9..000000000 Binary files a/Pods/Flurry-iOS-SDK/Flurry/libFlurry_8.3.1.a and /dev/null differ diff --git a/Pods/Flurry-iOS-SDK/Licenses/Flurry-LICENSE.txt b/Pods/Flurry-iOS-SDK/Licenses/Flurry-LICENSE.txt deleted file mode 100755 index 1a47761b7..000000000 --- a/Pods/Flurry-iOS-SDK/Licenses/Flurry-LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -Developer's use of the SDK is governed by the license in the applicable Flurry Terms of Service. Some components of the SDK are governed by open source software licenses. In the event of any conflict between the license in the applicable Flurry Terms of Service and the applicable open source license, the terms of the open source license shall prevail with respect to those components. diff --git a/Pods/Flurry-iOS-SDK/README.md b/Pods/Flurry-iOS-SDK/README.md deleted file mode 100644 index 4f0d305a9..000000000 --- a/Pods/Flurry-iOS-SDK/README.md +++ /dev/null @@ -1,50 +0,0 @@ -Flurry SDK -========== - - -To use FlurrySDK from cocoapods, for Analytics, Ad serving, Apple Watch Extension, and for Tumblr in-app sharing follow the instructions: - - -To enable Flurry Analytics: - -``` - pod 'Flurry-iOS-SDK/FlurrySDK' -``` - - -To enable Flurry Ad serving : - -``` - pod 'Flurry-iOS-SDK/FlurrySDK' - pod 'Flurry-iOS-SDK/FlurryAds' -``` - - -To use FlurrySDK for Apple Watch 1.x Extension: -``` -target :"Your Apple Watch 1.x Extension Target" do - pod 'Flurry-iOS-SDK/FlurryWatchSDK' -end -``` - - -To use FlurrySDK for Apple Watch 2.x Extension: -``` -target :"Your Apple Watch 2.x Extension Target" do -pod 'Flurry-iOS-SDK/FlurryWatchOSSDK' -platform :watchos, '2.0' -end -``` - - -To use FlurrySDK for tvOS apps: - -``` -target :"Your TVOS Application" do -pod 'Flurry-iOS-SDK/FlurryTVOS' #tVOS Analytics Pod' -platform :tvos, '9.0' -end -``` - -Don't forget to read how to track events correctly in Apple Watch Extensions in FlurryiOSAnalyticsREADMExx.pdf - diff --git a/Pods/GTMSessionFetcher/LICENSE b/Pods/GTMSessionFetcher/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/Pods/GTMSessionFetcher/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Pods/GTMSessionFetcher/README.md b/Pods/GTMSessionFetcher/README.md deleted file mode 100644 index 478efde95..000000000 --- a/Pods/GTMSessionFetcher/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Google Toolbox for Mac - Session Fetcher # - -**Project site**
-**Discussion group** - -[![Build Status](https://travis-ci.org/google/gtm-session-fetcher.svg?branch=master)](https://travis-ci.org/google/gtm-session-fetcher) - -`GTMSessionFetcher` makes it easy for Cocoa applications to perform http -operations. The fetcher is implemented as a wrapper on `NSURLSession`, so its -behavior is asynchronous and uses operating-system settings on iOS and Mac OS X. - -Features include: -- Simple to build; only one source/header file pair is required -- Simple to use: takes just two lines of code to fetch a request -- Supports upload and download sessions -- Flexible cookie storage -- Automatic retry on errors, with exponential backoff -- Support for generating multipart MIME upload streams -- Easy, convenient logging of http requests and responses -- Supports plug-in authentication such as with GTMAppAuth -- Easily testable; self-mocking -- Automatic rate limiting when created by the `GTMSessionFetcherService` factory class -- Fully independent of other projects diff --git a/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h b/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h deleted file mode 100644 index 569475a2e..000000000 --- a/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h +++ /dev/null @@ -1,1308 +0,0 @@ -/* Copyright 2014 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// GTMSessionFetcher is a wrapper around NSURLSession for http operations. -// -// What does this offer on top of of NSURLSession? -// -// - Block-style callbacks for useful functionality like progress rather -// than delegate methods. -// - Out-of-process uploads and downloads using NSURLSession, including -// management of fetches after relaunch. -// - Integration with GTMAppAuth for invisible management and refresh of -// authorization tokens. -// - Pretty-printed http logging. -// - Cookies handling that does not interfere with or get interfered with -// by WebKit cookies or on Mac by Safari and other apps. -// - Credentials handling for the http operation. -// - Rate-limiting and cookie grouping when fetchers are created with -// GTMSessionFetcherService. -// -// If the bodyData or bodyFileURL property is set, then a POST request is assumed. -// -// Each fetcher is assumed to be for a one-shot fetch request; don't reuse the object -// for a second fetch. -// -// The fetcher will be self-retained as long as a connection is pending. -// -// To keep user activity private, URLs must have an https scheme (unless the property -// allowedInsecureSchemes is set to permit the scheme.) -// -// Callbacks will be released when the fetch completes or is stopped, so there is no need -// to use weak self references in the callback blocks. -// -// Sample usage: -// -// _fetcherService = [[GTMSessionFetcherService alloc] init]; -// -// GTMSessionFetcher *myFetcher = [_fetcherService fetcherWithURLString:myURLString]; -// myFetcher.retryEnabled = YES; -// myFetcher.comment = @"First profile image"; -// -// // Optionally specify a file URL or NSData for the request body to upload. -// myFetcher.bodyData = [postString dataUsingEncoding:NSUTF8StringEncoding]; -// -// [myFetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { -// if (error != nil) { -// // Server status code or network error. -// // -// // If the domain is kGTMSessionFetcherStatusDomain then the error code -// // is a failure status from the server. -// } else { -// // Fetch succeeded. -// } -// }]; -// -// There is also a beginFetch call that takes a pointer and selector for the completion handler; -// a pointer and selector is a better style when the callback is a substantial, separate method. -// -// NOTE: Fetches may retrieve data from the server even though the server -// returned an error, so the criteria for success is a non-nil error. -// The completion handler is called when the server status is >= 300 with an NSError -// having domain kGTMSessionFetcherStatusDomain and code set to the server status. -// -// Status codes are at -// -// -// Background session support: -// -// Out-of-process uploads and downloads may be created by setting the fetcher's -// useBackgroundSession property. Data to be uploaded should be provided via -// the uploadFileURL property; the download destination should be specified with -// the destinationFileURL. NOTE: Background upload files should be in a location -// that will be valid even after the device is restarted, so the file should not -// be uploaded from a system temporary or cache directory. -// -// Background session transfers are slower, and should typically be used only -// for very large downloads or uploads (hundreds of megabytes). -// -// When background sessions are used in iOS apps, the application delegate must -// pass through the parameters from UIApplicationDelegate's -// application:handleEventsForBackgroundURLSession:completionHandler: to the -// fetcher class. -// -// When the application has been relaunched, it may also create a new fetcher -// instance to handle completion of the transfers. -// -// - (void)application:(UIApplication *)application -// handleEventsForBackgroundURLSession:(NSString *)identifier -// completionHandler:(void (^)())completionHandler { -// // Application was re-launched on completing an out-of-process download. -// -// // Pass the URLSession info related to this re-launch to the fetcher class. -// [GTMSessionFetcher application:application -// handleEventsForBackgroundURLSession:identifier -// completionHandler:completionHandler]; -// -// // Get a fetcher related to this re-launch and re-hook up a completionHandler to it. -// GTMSessionFetcher *fetcher = [GTMSessionFetcher fetcherWithSessionIdentifier:identifier]; -// NSURL *destinationFileURL = fetcher.destinationFileURL; -// fetcher.completionHandler = ^(NSData *data, NSError *error) { -// [self downloadCompletedToFile:destinationFileURL error:error]; -// }; -// } -// -// -// Threading and queue support: -// -// Networking always happens on a background thread; there is no advantage to -// changing thread or queue to create or start a fetcher. -// -// Callbacks are run on the main thread; alternatively, the app may set the -// fetcher's callbackQueue to a dispatch queue. -// -// Once the fetcher's beginFetch method has been called, the fetcher's methods and -// properties may be accessed from any thread. -// -// Downloading to disk: -// -// To have downloaded data saved directly to disk, specify a file URL for the -// destinationFileURL property. -// -// HTTP methods and headers: -// -// Alternative HTTP methods, like PUT, and custom headers can be specified by -// creating the fetcher with an appropriate NSMutableURLRequest. -// -// -// Caching: -// -// The fetcher avoids caching. That is best for API requests, but may hurt -// repeat fetches of static data. Apps may enable a persistent disk cache by -// customizing the config: -// -// fetcher.configurationBlock = ^(GTMSessionFetcher *configFetcher, -// NSURLSessionConfiguration *config) { -// config.URLCache = [NSURLCache sharedURLCache]; -// }; -// -// Or use the standard system config to share cookie storage with web views -// and to enable disk caching: -// -// fetcher.configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; -// -// -// Cookies: -// -// There are three supported mechanisms for remembering cookies between fetches. -// -// By default, a standalone GTMSessionFetcher uses a mutable array held -// statically to track cookies for all instantiated fetchers. This avoids -// cookies being set by servers for the application from interfering with -// Safari and WebKit cookie settings, and vice versa. -// The fetcher cookies are lost when the application quits. -// -// To rely instead on WebKit's global NSHTTPCookieStorage, set the fetcher's -// cookieStorage property: -// myFetcher.cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; -// -// To share cookies with other apps, use the method introduced in iOS 9/OS X 10.11: -// myFetcher.cookieStorage = -// [NSHTTPCookieStorage sharedCookieStorageForGroupContainerIdentifier:kMyCompanyContainedID]; -// -// To ignore existing cookies and only have cookies related to the single fetch -// be applied, make a temporary cookie storage object: -// myFetcher.cookieStorage = [[GTMSessionCookieStorage alloc] init]; -// -// Note: cookies set while following redirects will be sent to the server, as -// the redirects are followed by the fetcher. -// -// To completely disable cookies, similar to setting cookieStorageMethod to -// kGTMHTTPFetcherCookieStorageMethodNone, adjust the session configuration -// appropriately in the fetcher or fetcher service: -// fetcher.configurationBlock = ^(GTMSessionFetcher *configFetcher, -// NSURLSessionConfiguration *config) { -// config.HTTPCookieAcceptPolicy = NSHTTPCookieAcceptPolicyNever; -// config.HTTPShouldSetCookies = NO; -// }; -// -// If the fetcher is created from a GTMSessionFetcherService object -// then the cookie storage mechanism is set to use the cookie storage in the -// service object rather than the static storage. Disabling cookies in the -// session configuration set on a service object will disable cookies for all -// fetchers created from that GTMSessionFetcherService object, since the session -// configuration is propagated to the fetcher. -// -// -// Monitoring data transfers. -// -// The fetcher supports a variety of properties for progress monitoring -// progress with callback blocks. -// GTMSessionFetcherSendProgressBlock sendProgressBlock -// GTMSessionFetcherReceivedProgressBlock receivedProgressBlock -// GTMSessionFetcherDownloadProgressBlock downloadProgressBlock -// -// If supplied by the server, the anticipated total download size is available -// as [[myFetcher response] expectedContentLength] (and may be -1 for unknown -// download sizes.) -// -// -// Automatic retrying of fetches -// -// The fetcher can optionally create a timer and reattempt certain kinds of -// fetch failures (status codes 408, request timeout; 502, gateway failure; -// 503, service unavailable; 504, gateway timeout; networking errors -// NSURLErrorTimedOut and NSURLErrorNetworkConnectionLost.) The user may -// set a retry selector to customize the type of errors which will be retried. -// -// Retries are done in an exponential-backoff fashion (that is, after 1 second, -// 2, 4, 8, and so on.) -// -// Enabling automatic retries looks like this: -// myFetcher.retryEnabled = YES; -// -// With retries enabled, the completion callbacks are called only -// when no more retries will be attempted. Calling the fetcher's stopFetching -// method will terminate the retry timer, without the finished or failure -// selectors being invoked. -// -// Optionally, the client may set the maximum retry interval: -// myFetcher.maxRetryInterval = 60.0; // in seconds; default is 60 seconds -// // for downloads, 600 for uploads -// -// Servers should never send a 400 or 500 status for errors that are retryable -// by clients, as those values indicate permanent failures. In nearly all -// cases, the default standard retry behavior is correct for clients, and no -// custom client retry behavior is needed or appropriate. Servers that send -// non-retryable status codes and expect the client to retry the request are -// faulty. -// -// Still, the client may provide a block to determine if a status code or other -// error should be retried. The block returns YES to set the retry timer or NO -// to fail without additional fetch attempts. -// -// The retry method may return the |suggestedWillRetry| argument to get the -// default retry behavior. Server status codes are present in the -// error argument, and have the domain kGTMSessionFetcherStatusDomain. The -// user's method may look something like this: -// -// myFetcher.retryBlock = ^(BOOL suggestedWillRetry, NSError *error, -// GTMSessionFetcherRetryResponse response) { -// // Perhaps examine error.domain and error.code, or fetcher.retryCount -// // -// // Respond with YES to start the retry timer, NO to proceed to the failure -// // callback, or suggestedWillRetry to get default behavior for the -// // current error domain and code values. -// response(suggestedWillRetry); -// }; - - -#import - -#if TARGET_OS_IPHONE -#import -#endif -#if TARGET_OS_WATCH -#import -#endif - -// By default it is stripped from non DEBUG builds. Developers can override -// this in their project settings. -#ifndef STRIP_GTM_FETCH_LOGGING - #if !DEBUG - #define STRIP_GTM_FETCH_LOGGING 1 - #else - #define STRIP_GTM_FETCH_LOGGING 0 - #endif -#endif - -// Logs in debug builds. -#ifndef GTMSESSION_LOG_DEBUG - #if DEBUG - #define GTMSESSION_LOG_DEBUG(...) NSLog(__VA_ARGS__) - #else - #define GTMSESSION_LOG_DEBUG(...) do { } while (0) - #endif -#endif - -// Asserts in debug builds (or logs in debug builds if GTMSESSION_ASSERT_AS_LOG -// or NS_BLOCK_ASSERTIONS are defined.) -#ifndef GTMSESSION_ASSERT_DEBUG - #if DEBUG && !defined(NS_BLOCK_ASSERTIONS) && !GTMSESSION_ASSERT_AS_LOG - #undef GTMSESSION_ASSERT_AS_LOG - #define GTMSESSION_ASSERT_AS_LOG 1 - #endif - - #if DEBUG && !GTMSESSION_ASSERT_AS_LOG - #define GTMSESSION_ASSERT_DEBUG(...) NSAssert(__VA_ARGS__) - #elif DEBUG - #define GTMSESSION_ASSERT_DEBUG(pred, ...) if (!(pred)) { NSLog(__VA_ARGS__); } - #else - #define GTMSESSION_ASSERT_DEBUG(pred, ...) do { } while (0) - #endif -#endif - -// Asserts in debug builds, logs in release builds (or logs in debug builds if -// GTMSESSION_ASSERT_AS_LOG is defined.) -#ifndef GTMSESSION_ASSERT_DEBUG_OR_LOG - #if DEBUG && !GTMSESSION_ASSERT_AS_LOG - #define GTMSESSION_ASSERT_DEBUG_OR_LOG(...) NSAssert(__VA_ARGS__) - #else - #define GTMSESSION_ASSERT_DEBUG_OR_LOG(pred, ...) if (!(pred)) { NSLog(__VA_ARGS__); } - #endif -#endif - -// Macro useful for examining messages from NSURLSession during debugging. -#if 0 -#define GTM_LOG_SESSION_DELEGATE(...) GTMSESSION_LOG_DEBUG(__VA_ARGS__) -#else -#define GTM_LOG_SESSION_DELEGATE(...) -#endif - -#ifndef GTM_NULLABLE - #if __has_feature(nullability) // Available starting in Xcode 6.3 - #define GTM_NULLABLE_TYPE __nullable - #define GTM_NONNULL_TYPE __nonnull - #define GTM_NULLABLE nullable - #define GTM_NONNULL_DECL nonnull // GTM_NONNULL is used by GTMDefines.h - #define GTM_NULL_RESETTABLE null_resettable - - #define GTM_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN - #define GTM_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END - #else - #define GTM_NULLABLE_TYPE - #define GTM_NONNULL_TYPE - #define GTM_NULLABLE - #define GTM_NONNULL_DECL - #define GTM_NULL_RESETTABLE - #define GTM_ASSUME_NONNULL_BEGIN - #define GTM_ASSUME_NONNULL_END - #endif // __has_feature(nullability) -#endif // GTM_NULLABLE - -#if (TARGET_OS_TV \ - || TARGET_OS_WATCH \ - || (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12) \ - || (TARGET_OS_IPHONE && defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0)) -#define GTMSESSION_DEPRECATE_ON_2016_SDKS(_MSG) __attribute__((deprecated("" _MSG))) -#else -#define GTMSESSION_DEPRECATE_ON_2016_SDKS(_MSG) -#endif - -#ifndef GTM_DECLARE_GENERICS - #if __has_feature(objc_generics) - #define GTM_DECLARE_GENERICS 1 - #else - #define GTM_DECLARE_GENERICS 0 - #endif -#endif - -#ifndef GTM_NSArrayOf - #if GTM_DECLARE_GENERICS - #define GTM_NSArrayOf(value) NSArray - #define GTM_NSDictionaryOf(key, value) NSDictionary - #else - #define GTM_NSArrayOf(value) NSArray - #define GTM_NSDictionaryOf(key, value) NSDictionary - #endif // __has_feature(objc_generics) -#endif // GTM_NSArrayOf - -// For iOS, the fetcher can declare itself a background task to allow fetches -// to finish when the app leaves the foreground. -// -// (This is unrelated to providing a background configuration, which allows -// out-of-process uploads and downloads.) -// -// To disallow use of background tasks during fetches, the target should define -// GTM_BACKGROUND_TASK_FETCHING to 0, or alternatively may set the -// skipBackgroundTask property to YES. -#if TARGET_OS_IPHONE && !TARGET_OS_WATCH && !defined(GTM_BACKGROUND_TASK_FETCHING) - #define GTM_BACKGROUND_TASK_FETCHING 1 -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#if (TARGET_OS_TV \ - || TARGET_OS_WATCH \ - || (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_11) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) \ - || (TARGET_OS_IPHONE && defined(__IPHONE_9_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0)) - #ifndef GTM_USE_SESSION_FETCHER - #define GTM_USE_SESSION_FETCHER 1 - #endif -#endif - -#if !defined(GTMBridgeFetcher) - // These bridge macros should be identical in GTMHTTPFetcher.h and GTMSessionFetcher.h - #if GTM_USE_SESSION_FETCHER - // Macros to new fetcher class. - #define GTMBridgeFetcher GTMSessionFetcher - #define GTMBridgeFetcherService GTMSessionFetcherService - #define GTMBridgeFetcherServiceProtocol GTMSessionFetcherServiceProtocol - #define GTMBridgeAssertValidSelector GTMSessionFetcherAssertValidSelector - #define GTMBridgeCookieStorage GTMSessionCookieStorage - #define GTMBridgeCleanedUserAgentString GTMFetcherCleanedUserAgentString - #define GTMBridgeSystemVersionString GTMFetcherSystemVersionString - #define GTMBridgeApplicationIdentifier GTMFetcherApplicationIdentifier - #define kGTMBridgeFetcherStatusDomain kGTMSessionFetcherStatusDomain - #define kGTMBridgeFetcherStatusBadRequest GTMSessionFetcherStatusBadRequest - #else - // Macros to old fetcher class. - #define GTMBridgeFetcher GTMHTTPFetcher - #define GTMBridgeFetcherService GTMHTTPFetcherService - #define GTMBridgeFetcherServiceProtocol GTMHTTPFetcherServiceProtocol - #define GTMBridgeAssertValidSelector GTMAssertSelectorNilOrImplementedWithArgs - #define GTMBridgeCookieStorage GTMCookieStorage - #define GTMBridgeCleanedUserAgentString GTMCleanedUserAgentString - #define GTMBridgeSystemVersionString GTMSystemVersionString - #define GTMBridgeApplicationIdentifier GTMApplicationIdentifier - #define kGTMBridgeFetcherStatusDomain kGTMHTTPFetcherStatusDomain - #define kGTMBridgeFetcherStatusBadRequest kGTMHTTPFetcherStatusBadRequest - #endif // GTM_USE_SESSION_FETCHER -#endif - -GTM_ASSUME_NONNULL_BEGIN - -// Notifications -// -// Fetch started and stopped, and fetch retry delay started and stopped. -extern NSString *const kGTMSessionFetcherStartedNotification; -extern NSString *const kGTMSessionFetcherStoppedNotification; -extern NSString *const kGTMSessionFetcherRetryDelayStartedNotification; -extern NSString *const kGTMSessionFetcherRetryDelayStoppedNotification; - -// Completion handler notification. This is intended for use by code capturing -// and replaying fetch requests and results for testing. For fetches where -// destinationFileURL or accumulateDataBlock is set for the fetcher, the data -// will be nil for successful fetches. -// -// This notification is posted on the main thread. -extern NSString *const kGTMSessionFetcherCompletionInvokedNotification; -extern NSString *const kGTMSessionFetcherCompletionDataKey; -extern NSString *const kGTMSessionFetcherCompletionErrorKey; - -// Constants for NSErrors created by the fetcher (excluding server status errors, -// and error objects originating in the OS.) -extern NSString *const kGTMSessionFetcherErrorDomain; - -// The fetcher turns server error status values (3XX, 4XX, 5XX) into NSErrors -// with domain kGTMSessionFetcherStatusDomain. -// -// Any server response body data accompanying the status error is added to the -// userInfo dictionary with key kGTMSessionFetcherStatusDataKey. -extern NSString *const kGTMSessionFetcherStatusDomain; -extern NSString *const kGTMSessionFetcherStatusDataKey; - -// When a fetch fails with an error, these keys are included in the error userInfo -// dictionary if retries were attempted. -extern NSString *const kGTMSessionFetcherNumberOfRetriesDoneKey; -extern NSString *const kGTMSessionFetcherElapsedIntervalWithRetriesKey; - -// Background session support requires access to NSUserDefaults. -// If [NSUserDefaults standardUserDefaults] doesn't yield the correct NSUserDefaults for your usage, -// ie for an App Extension, then implement this class/method to return the correct NSUserDefaults. -// https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW6 -@interface GTMSessionFetcherUserDefaultsFactory : NSObject - -+ (NSUserDefaults *)fetcherUserDefaults; - -@end - -#ifdef __cplusplus -} -#endif - -typedef NS_ENUM(NSInteger, GTMSessionFetcherError) { - GTMSessionFetcherErrorDownloadFailed = -1, - GTMSessionFetcherErrorUploadChunkUnavailable = -2, - GTMSessionFetcherErrorBackgroundExpiration = -3, - GTMSessionFetcherErrorBackgroundFetchFailed = -4, - GTMSessionFetcherErrorInsecureRequest = -5, - GTMSessionFetcherErrorTaskCreationFailed = -6, -}; - -typedef NS_ENUM(NSInteger, GTMSessionFetcherStatus) { - // Standard http status codes. - GTMSessionFetcherStatusNotModified = 304, - GTMSessionFetcherStatusBadRequest = 400, - GTMSessionFetcherStatusUnauthorized = 401, - GTMSessionFetcherStatusForbidden = 403, - GTMSessionFetcherStatusPreconditionFailed = 412 -}; - -#ifdef __cplusplus -extern "C" { -#endif - -@class GTMSessionCookieStorage; -@class GTMSessionFetcher; - -// The configuration block is for modifying the NSURLSessionConfiguration only. -// DO NOT change any fetcher properties in the configuration block. -typedef void (^GTMSessionFetcherConfigurationBlock)(GTMSessionFetcher *fetcher, - NSURLSessionConfiguration *configuration); -typedef void (^GTMSessionFetcherSystemCompletionHandler)(void); -typedef void (^GTMSessionFetcherCompletionHandler)(NSData * GTM_NULLABLE_TYPE data, - NSError * GTM_NULLABLE_TYPE error); -typedef void (^GTMSessionFetcherBodyStreamProviderResponse)(NSInputStream *bodyStream); -typedef void (^GTMSessionFetcherBodyStreamProvider)(GTMSessionFetcherBodyStreamProviderResponse response); -typedef void (^GTMSessionFetcherDidReceiveResponseDispositionBlock)(NSURLSessionResponseDisposition disposition); -typedef void (^GTMSessionFetcherDidReceiveResponseBlock)(NSURLResponse *response, - GTMSessionFetcherDidReceiveResponseDispositionBlock dispositionBlock); -typedef void (^GTMSessionFetcherChallengeDispositionBlock)(NSURLSessionAuthChallengeDisposition disposition, - NSURLCredential * GTM_NULLABLE_TYPE credential); -typedef void (^GTMSessionFetcherChallengeBlock)(GTMSessionFetcher *fetcher, - NSURLAuthenticationChallenge *challenge, - GTMSessionFetcherChallengeDispositionBlock dispositionBlock); -typedef void (^GTMSessionFetcherWillRedirectResponse)(NSURLRequest * GTM_NULLABLE_TYPE redirectedRequest); -typedef void (^GTMSessionFetcherWillRedirectBlock)(NSHTTPURLResponse *redirectResponse, - NSURLRequest *redirectRequest, - GTMSessionFetcherWillRedirectResponse response); -typedef void (^GTMSessionFetcherAccumulateDataBlock)(NSData * GTM_NULLABLE_TYPE buffer); -typedef void (^GTMSessionFetcherSimulateByteTransferBlock)(NSData * GTM_NULLABLE_TYPE buffer, - int64_t bytesWritten, - int64_t totalBytesWritten, - int64_t totalBytesExpectedToWrite); -typedef void (^GTMSessionFetcherReceivedProgressBlock)(int64_t bytesWritten, - int64_t totalBytesWritten); -typedef void (^GTMSessionFetcherDownloadProgressBlock)(int64_t bytesWritten, - int64_t totalBytesWritten, - int64_t totalBytesExpectedToWrite); -typedef void (^GTMSessionFetcherSendProgressBlock)(int64_t bytesSent, - int64_t totalBytesSent, - int64_t totalBytesExpectedToSend); -typedef void (^GTMSessionFetcherWillCacheURLResponseResponse)(NSCachedURLResponse * GTM_NULLABLE_TYPE cachedResponse); -typedef void (^GTMSessionFetcherWillCacheURLResponseBlock)(NSCachedURLResponse *proposedResponse, - GTMSessionFetcherWillCacheURLResponseResponse responseBlock); -typedef void (^GTMSessionFetcherRetryResponse)(BOOL shouldRetry); -typedef void (^GTMSessionFetcherRetryBlock)(BOOL suggestedWillRetry, - NSError * GTM_NULLABLE_TYPE error, - GTMSessionFetcherRetryResponse response); - -typedef void (^GTMSessionFetcherTestResponse)(NSHTTPURLResponse * GTM_NULLABLE_TYPE response, - NSData * GTM_NULLABLE_TYPE data, - NSError * GTM_NULLABLE_TYPE error); -typedef void (^GTMSessionFetcherTestBlock)(GTMSessionFetcher *fetcherToTest, - GTMSessionFetcherTestResponse testResponse); - -void GTMSessionFetcherAssertValidSelector(id GTM_NULLABLE_TYPE obj, SEL GTM_NULLABLE_TYPE sel, ...); - -// Utility functions for applications self-identifying to servers via a -// user-agent header - -// The "standard" user agent includes the application identifier, taken from the bundle, -// followed by a space and the system version string. Pass nil to use +mainBundle as the source -// of the bundle identifier. -// -// Applications may use this as a starting point for their own user agent strings, perhaps -// with additional sections appended. Use GTMFetcherCleanedUserAgentString() below to -// clean up any string being added to the user agent. -NSString *GTMFetcherStandardUserAgentString(NSBundle * GTM_NULLABLE_TYPE bundle); - -// Make a generic name and version for the current application, like -// com.example.MyApp/1.2.3 relying on the bundle identifier and the -// CFBundleShortVersionString or CFBundleVersion. -// -// The bundle ID may be overridden as the base identifier string by -// adding to the bundle's Info.plist a "GTMUserAgentID" key. -// -// If no bundle ID or override is available, the process name preceded -// by "proc_" is used. -NSString *GTMFetcherApplicationIdentifier(NSBundle * GTM_NULLABLE_TYPE bundle); - -// Make an identifier like "MacOSX/10.7.1" or "iPod_Touch/4.1 hw/iPod1_1" -NSString *GTMFetcherSystemVersionString(void); - -// Make a parseable user-agent identifier from the given string, replacing whitespace -// and commas with underscores, and removing other characters that may interfere -// with parsing of the full user-agent string. -// -// For example, @"[My App]" would become @"My_App" -NSString *GTMFetcherCleanedUserAgentString(NSString *str); - -// Grab the data from an input stream. Since streams cannot be assumed to be rewindable, -// this may be destructive; the caller can try to rewind the stream (by setting the -// NSStreamFileCurrentOffsetKey property) or can just use the NSData to make a new -// NSInputStream. This function is intended to facilitate testing rather than be used in -// production. -// -// This function operates synchronously on the current thread. Depending on how the -// input stream is implemented, it may be appropriate to dispatch to a different -// queue before calling this function. -// -// Failure is indicated by a returned data value of nil. -NSData * GTM_NULLABLE_TYPE GTMDataFromInputStream(NSInputStream *inputStream, NSError **outError); - -#ifdef __cplusplus -} // extern "C" -#endif - - -#if !GTM_USE_SESSION_FETCHER -@protocol GTMHTTPFetcherServiceProtocol; -#endif - -// This protocol allows abstract references to the fetcher service, primarily for -// fetchers (which may be compiled without the fetcher service class present.) -// -// Apps should not need to use this protocol. -@protocol GTMSessionFetcherServiceProtocol -// This protocol allows us to call into the service without requiring -// GTMSessionFetcherService sources in this project - -@property(atomic, strong) dispatch_queue_t callbackQueue; - -- (BOOL)fetcherShouldBeginFetching:(GTMSessionFetcher *)fetcher; -- (void)fetcherDidCreateSession:(GTMSessionFetcher *)fetcher; -- (void)fetcherDidBeginFetching:(GTMSessionFetcher *)fetcher; -- (void)fetcherDidStop:(GTMSessionFetcher *)fetcher; - -- (GTMSessionFetcher *)fetcherWithRequest:(NSURLRequest *)request; -- (BOOL)isDelayingFetcher:(GTMSessionFetcher *)fetcher; - -@property(atomic, assign) BOOL reuseSession; -- (GTM_NULLABLE NSURLSession *)session; -- (GTM_NULLABLE NSURLSession *)sessionForFetcherCreation; -- (GTM_NULLABLE id)sessionDelegate; -- (GTM_NULLABLE NSDate *)stoppedAllFetchersDate; - -// Methods for compatibility with the old GTMHTTPFetcher. -@property(readonly, strong, GTM_NULLABLE) NSOperationQueue *delegateQueue; - -@end // @protocol GTMSessionFetcherServiceProtocol - -#ifndef GTM_FETCHER_AUTHORIZATION_PROTOCOL -#define GTM_FETCHER_AUTHORIZATION_PROTOCOL 1 -@protocol GTMFetcherAuthorizationProtocol -@required -// This protocol allows us to call the authorizer without requiring its sources -// in this project. -- (void)authorizeRequest:(GTM_NULLABLE NSMutableURLRequest *)request - delegate:(id)delegate - didFinishSelector:(SEL)sel; - -- (void)stopAuthorization; - -- (void)stopAuthorizationForRequest:(NSURLRequest *)request; - -- (BOOL)isAuthorizingRequest:(NSURLRequest *)request; - -- (BOOL)isAuthorizedRequest:(NSURLRequest *)request; - -@property(strong, readonly, GTM_NULLABLE) NSString *userEmail; - -@optional - -// Indicate if authorization may be attempted. Even if this succeeds, -// authorization may fail if the user's permissions have been revoked. -@property(readonly) BOOL canAuthorize; - -// For development only, allow authorization of non-SSL requests, allowing -// transmission of the bearer token unencrypted. -@property(assign) BOOL shouldAuthorizeAllRequests; - -- (void)authorizeRequest:(GTM_NULLABLE NSMutableURLRequest *)request - completionHandler:(void (^)(NSError * GTM_NULLABLE_TYPE error))handler; - -#if GTM_USE_SESSION_FETCHER -@property (weak, GTM_NULLABLE) id fetcherService; -#else -@property (weak, GTM_NULLABLE) id fetcherService; -#endif - -- (BOOL)primeForRefresh; - -@end -#endif // GTM_FETCHER_AUTHORIZATION_PROTOCOL - -#if GTM_BACKGROUND_TASK_FETCHING -// A protocol for an alternative target for messages from GTMSessionFetcher to UIApplication. -// Set the target using +[GTMSessionFetcher setSubstituteUIApplication:] -@protocol GTMUIApplicationProtocol -- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(nullable NSString *)taskName - expirationHandler:(void(^ __nullable)(void))handler; -- (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier; -@end -#endif - -#pragma mark - - -// GTMSessionFetcher objects are used for async retrieval of an http get or post -// -// See additional comments at the beginning of this file -@interface GTMSessionFetcher : NSObject - -// Create a fetcher -// -// fetcherWithRequest will return an autoreleased fetcher, but if -// the connection is successfully created, the connection should retain the -// fetcher for the life of the connection as well. So the caller doesn't have -// to retain the fetcher explicitly unless they want to be able to cancel it. -+ (instancetype)fetcherWithRequest:(GTM_NULLABLE NSURLRequest *)request; - -// Convenience methods that make a request, like +fetcherWithRequest -+ (instancetype)fetcherWithURL:(NSURL *)requestURL; -+ (instancetype)fetcherWithURLString:(NSString *)requestURLString; - -// Methods for creating fetchers to continue previous fetches. -+ (instancetype)fetcherWithDownloadResumeData:(NSData *)resumeData; -+ (GTM_NULLABLE instancetype)fetcherWithSessionIdentifier:(NSString *)sessionIdentifier; - -// Returns an array of currently active fetchers for background sessions, -// both restarted and newly created ones. -+ (GTM_NSArrayOf(GTMSessionFetcher *) *)fetchersForBackgroundSessions; - -// Designated initializer. -// -// Applications should create fetchers with a "fetcherWith..." method on a fetcher -// service or a class method, not with this initializer. -// -// The configuration should typically be nil. Applications needing to customize -// the configuration may do so by setting the configurationBlock property. -- (instancetype)initWithRequest:(GTM_NULLABLE NSURLRequest *)request - configuration:(GTM_NULLABLE NSURLSessionConfiguration *)configuration; - -// The fetcher's request. This may not be set after beginFetch has been invoked. The request -// may change due to redirects. -@property(strong, GTM_NULLABLE) NSURLRequest *request; - -// Set a header field value on the request. Header field value changes will not -// affect a fetch after the fetch has begun. -- (void)setRequestValue:(GTM_NULLABLE NSString *)value forHTTPHeaderField:(NSString *)field; - -// The fetcher's request (deprecated.) -// -// Exposing a mutable object in the interface was convenient but a bad design decision due -// to thread-safety requirements. Clients should use the request property and -// setRequestValue:forHTTPHeaderField: instead. -@property(atomic, readonly, GTM_NULLABLE) NSMutableURLRequest *mutableRequest - GTMSESSION_DEPRECATE_ON_2016_SDKS("use 'request' or '-setRequestValue:forHTTPHeaderField:'"); - -// Data used for resuming a download task. -@property(atomic, readonly, GTM_NULLABLE) NSData *downloadResumeData; - -// The configuration; this must be set before the fetch begins. If no configuration is -// set or inherited from the fetcher service, then the fetcher uses an ephemeral config. -// -// NOTE: This property should typically be nil. Applications needing to customize -// the configuration should do so by setting the configurationBlock property. -// That allows the fetcher to pick an appropriate base configuration, with the -// application setting only the configuration properties it needs to customize. -@property(atomic, strong, GTM_NULLABLE) NSURLSessionConfiguration *configuration; - -// A block the client may use to customize the configuration used to create the session. -// -// This is called synchronously, either on the thread that begins the fetch or, during a retry, -// on the main thread. The configuration block may be called repeatedly if multiple fetchers are -// created. -// -// The configuration block is for modifying the NSURLSessionConfiguration only. -// DO NOT change any fetcher properties in the configuration block. Fetcher properties -// may be set in the fetcher service prior to fetcher creation, or on the fetcher prior -// to invoking beginFetch. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherConfigurationBlock configurationBlock; - -// A session is created as needed by the fetcher. A fetcher service object -// may maintain sessions for multiple fetches to the same host. -@property(atomic, strong, GTM_NULLABLE) NSURLSession *session; - -// The task in flight. -@property(atomic, readonly, GTM_NULLABLE) NSURLSessionTask *sessionTask; - -// The background session identifier. -@property(atomic, readonly, GTM_NULLABLE) NSString *sessionIdentifier; - -// Indicates a fetcher created to finish a background session task. -@property(atomic, readonly) BOOL wasCreatedFromBackgroundSession; - -// Additional user-supplied data to encode into the session identifier. Since session identifier -// length limits are unspecified, this should be kept small. Key names beginning with an underscore -// are reserved for use by the fetcher. -@property(atomic, strong, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSString *) *sessionUserInfo; - -// The human-readable description to be assigned to the task. -@property(atomic, copy, GTM_NULLABLE) NSString *taskDescription; - -// The priority assigned to the task, if any. Use NSURLSessionTaskPriorityLow, -// NSURLSessionTaskPriorityDefault, or NSURLSessionTaskPriorityHigh. -@property(atomic, assign) float taskPriority; - -// The fetcher encodes information used to resume a session in the session identifier. -// This method, intended for internal use returns the encoded information. The sessionUserInfo -// dictionary is stored as identifier metadata. -- (GTM_NULLABLE GTM_NSDictionaryOf(NSString *, NSString *) *)sessionIdentifierMetadata; - -#if TARGET_OS_IPHONE && !TARGET_OS_WATCH -// The app should pass to this method the completion handler passed in the app delegate method -// application:handleEventsForBackgroundURLSession:completionHandler: -+ (void)application:(UIApplication *)application - handleEventsForBackgroundURLSession:(NSString *)identifier - completionHandler:(GTMSessionFetcherSystemCompletionHandler)completionHandler; -#endif - -// Indicate that a newly created session should be a background session. -// A new session identifier will be created by the fetcher. -// -// Warning: The only thing background sessions are for is rare download -// of huge, batched files of data. And even just for those, there's a lot -// of pain and hackery needed to get transfers to actually happen reliably -// with background sessions. -// -// Don't try to upload or download in many background sessions, since the system -// will impose an exponentially increasing time penalty to prevent the app from -// getting too much background execution time. -// -// References: -// -// "Moving to Fewer, Larger Transfers" -// https://forums.developer.apple.com/thread/14853 -// -// "NSURLSession’s Resume Rate Limiter" -// https://forums.developer.apple.com/thread/14854 -// -// "Background Session Task state persistence" -// https://forums.developer.apple.com/thread/11554 -// -@property(assign) BOOL useBackgroundSession; - -// Indicates if the fetcher was started using a background session. -@property(atomic, readonly, getter=isUsingBackgroundSession) BOOL usingBackgroundSession; - -// Indicates if uploads should use an upload task. This is always set for file or stream-provider -// bodies, but may be set explicitly for NSData bodies. -@property(atomic, assign) BOOL useUploadTask; - -// Indicates that the fetcher is using a session that may be shared with other fetchers. -@property(atomic, readonly) BOOL canShareSession; - -// By default, the fetcher allows only secure (https) schemes unless this -// property is set, or the GTM_ALLOW_INSECURE_REQUESTS build flag is set. -// -// For example, during debugging when fetching from a development server that lacks SSL support, -// this may be set to @[ @"http" ], or when the fetcher is used to retrieve local files, -// this may be set to @[ @"file" ]. -// -// This should be left as nil for release builds to avoid creating the opportunity for -// leaking private user behavior and data. If a server is providing insecure URLs -// for fetching by the client app, report the problem as server security & privacy bug. -// -// For builds with the iOS 9/OS X 10.11 and later SDKs, this property is required only when -// the app specifies NSAppTransportSecurity/NSAllowsArbitraryLoads in the main bundle's Info.plist. -@property(atomic, copy, GTM_NULLABLE) GTM_NSArrayOf(NSString *) *allowedInsecureSchemes; - -// By default, the fetcher prohibits localhost requests unless this property is set, -// or the GTM_ALLOW_INSECURE_REQUESTS build flag is set. -// -// For localhost requests, the URL scheme is not checked when this property is set. -// -// For builds with the iOS 9/OS X 10.11 and later SDKs, this property is required only when -// the app specifies NSAppTransportSecurity/NSAllowsArbitraryLoads in the main bundle's Info.plist. -@property(atomic, assign) BOOL allowLocalhostRequest; - -// By default, the fetcher requires valid server certs. This may be bypassed -// temporarily for development against a test server with an invalid cert. -@property(atomic, assign) BOOL allowInvalidServerCertificates; - -// Cookie storage object for this fetcher. If nil, the fetcher will use a static cookie -// storage instance shared among fetchers. If this fetcher was created by a fetcher service -// object, it will be set to use the service object's cookie storage. See Cookies section above for -// the full discussion. -// -// Because as of Jan 2014 standalone instances of NSHTTPCookieStorage do not actually -// store any cookies (Radar 15735276) we use our own subclass, GTMSessionCookieStorage, -// to hold cookies in memory. -@property(atomic, strong, GTM_NULLABLE) NSHTTPCookieStorage *cookieStorage; - -// Setting the credential is optional; it is used if the connection receives -// an authentication challenge. -@property(atomic, strong, GTM_NULLABLE) NSURLCredential *credential; - -// Setting the proxy credential is optional; it is used if the connection -// receives an authentication challenge from a proxy. -@property(atomic, strong, GTM_NULLABLE) NSURLCredential *proxyCredential; - -// If body data, body file URL, or body stream provider is not set, then a GET request -// method is assumed. -@property(atomic, strong, GTM_NULLABLE) NSData *bodyData; - -// File to use as the request body. This forces use of an upload task. -@property(atomic, strong, GTM_NULLABLE) NSURL *bodyFileURL; - -// Length of body to send, expected or actual. -@property(atomic, readonly) int64_t bodyLength; - -// The body stream provider may be called repeatedly to provide a body. -// Setting a body stream provider forces use of an upload task. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherBodyStreamProvider bodyStreamProvider; - -// Object to add authorization to the request, if needed. -// -// This may not be changed once beginFetch has been invoked. -@property(atomic, strong, GTM_NULLABLE) id authorizer; - -// The service object that created and monitors this fetcher, if any. -@property(atomic, strong) id service; - -// The host, if any, used to classify this fetcher in the fetcher service. -@property(atomic, copy, GTM_NULLABLE) NSString *serviceHost; - -// The priority, if any, used for starting fetchers in the fetcher service. -// -// Lower values are higher priority; the default is 0, and values may -// be negative or positive. This priority affects only the start order of -// fetchers that are being delayed by a fetcher service when the running fetchers -// exceeds the service's maxRunningFetchersPerHost. A priority of NSIntegerMin will -// exempt this fetcher from delay. -@property(atomic, assign) NSInteger servicePriority; - -// The delegate's optional didReceiveResponse block may be used to inspect or alter -// the session task response. -// -// This is called on the callback queue. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherDidReceiveResponseBlock didReceiveResponseBlock; - -// The delegate's optional challenge block may be used to inspect or alter -// the session task challenge. -// -// If this block is not set, the fetcher's default behavior for the NSURLSessionTask -// didReceiveChallenge: delegate method is to use the fetcher's respondToChallenge: method -// which relies on the fetcher's credential and proxyCredential properties. -// -// Warning: This may be called repeatedly if the challenge fails. Check -// challenge.previousFailureCount to identify repeated invocations. -// -// This is called on the callback queue. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherChallengeBlock challengeBlock; - -// The delegate's optional willRedirect block may be used to inspect or alter -// the redirection. -// -// This is called on the callback queue. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherWillRedirectBlock willRedirectBlock; - -// The optional send progress block reports body bytes uploaded. -// -// This is called on the callback queue. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherSendProgressBlock sendProgressBlock; - -// The optional accumulate block may be set by clients wishing to accumulate data -// themselves rather than let the fetcher append each buffer to an NSData. -// -// When this is called with nil data (such as on redirect) the client -// should empty its accumulation buffer. -// -// This is called on the callback queue. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherAccumulateDataBlock accumulateDataBlock; - -// The optional received progress block may be used to monitor data -// received from a data task. -// -// This is called on the callback queue. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherReceivedProgressBlock receivedProgressBlock; - -// The delegate's optional downloadProgress block may be used to monitor download -// progress in writing to disk. -// -// This is called on the callback queue. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherDownloadProgressBlock downloadProgressBlock; - -// The delegate's optional willCacheURLResponse block may be used to alter the cached -// NSURLResponse. The user may prevent caching by passing nil to the block's response. -// -// This is called on the callback queue. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherWillCacheURLResponseBlock willCacheURLResponseBlock; - -// Enable retrying; see comments at the top of this file. Setting -// retryEnabled=YES resets the min and max retry intervals. -@property(atomic, assign, getter=isRetryEnabled) BOOL retryEnabled; - -// Retry block is optional for retries. -// -// If present, this block should call the response block with YES to cause a retry or NO to end the -// fetch. -// See comments at the top of this file. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherRetryBlock retryBlock; - -// Retry intervals must be strictly less than maxRetryInterval, else -// they will be limited to maxRetryInterval and no further retries will -// be attempted. Setting maxRetryInterval to 0.0 will reset it to the -// default value, 60 seconds for downloads and 600 seconds for uploads. -@property(atomic, assign) NSTimeInterval maxRetryInterval; - -// Starting retry interval. Setting minRetryInterval to 0.0 will reset it -// to a random value between 1.0 and 2.0 seconds. Clients should normally not -// set this except for unit testing. -@property(atomic, assign) NSTimeInterval minRetryInterval; - -// Multiplier used to increase the interval between retries, typically 2.0. -// Clients should not need to set this. -@property(atomic, assign) double retryFactor; - -// Number of retries attempted. -@property(atomic, readonly) NSUInteger retryCount; - -// Interval delay to precede next retry. -@property(atomic, readonly) NSTimeInterval nextRetryInterval; - -#if GTM_BACKGROUND_TASK_FETCHING -// Skip use of a UIBackgroundTask, thus requiring fetches to complete when the app is in the -// foreground. -// -// Targets should define GTM_BACKGROUND_TASK_FETCHING to 0 to avoid use of a UIBackgroundTask -// on iOS to allow fetches to complete in the background. This property is available when -// it's not practical to set the preprocessor define. -@property(atomic, assign) BOOL skipBackgroundTask; -#endif // GTM_BACKGROUND_TASK_FETCHING - -// Begin fetching the request -// -// The delegate may optionally implement the callback or pass nil for the selector or handler. -// -// The delegate and all callback blocks are retained between the beginFetch call until after the -// finish callback, or until the fetch is stopped. -// -// An error is passed to the callback for server statuses 300 or -// higher, with the status stored as the error object's code. -// -// finishedSEL has a signature like: -// - (void)fetcher:(GTMSessionFetcher *)fetcher -// finishedWithData:(NSData *)data -// error:(NSError *)error; -// -// If the application has specified a destinationFileURL or an accumulateDataBlock -// for the fetcher, the data parameter passed to the callback will be nil. - -- (void)beginFetchWithDelegate:(GTM_NULLABLE id)delegate - didFinishSelector:(GTM_NULLABLE SEL)finishedSEL; - -- (void)beginFetchWithCompletionHandler:(GTM_NULLABLE GTMSessionFetcherCompletionHandler)handler; - -// Returns YES if this fetcher is in the process of fetching a URL. -@property(atomic, readonly, getter=isFetching) BOOL fetching; - -// Cancel the fetch of the request that's currently in progress. The completion handler -// will not be called. -- (void)stopFetching; - -// A block to be called when the fetch completes. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherCompletionHandler completionHandler; - -// A block to be called if download resume data becomes available. -@property(atomic, strong, GTM_NULLABLE) void (^resumeDataBlock)(NSData *); - -// Return the status code from the server response. -@property(atomic, readonly) NSInteger statusCode; - -// Return the http headers from the response. -@property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSString *) *responseHeaders; - -// The response, once it's been received. -@property(atomic, strong, readonly, GTM_NULLABLE) NSURLResponse *response; - -// Bytes downloaded so far. -@property(atomic, readonly) int64_t downloadedLength; - -// Buffer of currently-downloaded data, if available. -@property(atomic, readonly, strong, GTM_NULLABLE) NSData *downloadedData; - -// Local path to which the downloaded file will be moved. -// -// If a file already exists at the path, it will be overwritten. -// Will create the enclosing folders if they are not present. -@property(atomic, strong, GTM_NULLABLE) NSURL *destinationFileURL; - -// The time this fetcher originally began fetching. This is useful as a time -// barrier for ignoring irrelevant fetch notifications or callbacks. -@property(atomic, strong, readonly, GTM_NULLABLE) NSDate *initialBeginFetchDate; - -// userData is retained solely for the convenience of the client. -@property(atomic, strong, GTM_NULLABLE) id userData; - -// Stored property values are retained solely for the convenience of the client. -@property(atomic, copy, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, id) *properties; - -- (void)setProperty:(GTM_NULLABLE id)obj forKey:(NSString *)key; // Pass nil for obj to remove the property. -- (GTM_NULLABLE id)propertyForKey:(NSString *)key; - -- (void)addPropertiesFromDictionary:(GTM_NSDictionaryOf(NSString *, id) *)dict; - -// Comments are useful for logging, so are strongly recommended for each fetcher. -@property(atomic, copy, GTM_NULLABLE) NSString *comment; - -- (void)setCommentWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); - -// Log of request and response, if logging is enabled -@property(atomic, copy, GTM_NULLABLE) NSString *log; - -// Callbacks are run on this queue. If none is supplied, the main queue is used. -@property(atomic, strong, GTM_NULL_RESETTABLE) dispatch_queue_t callbackQueue; - -// The queue used internally by the session to invoke its delegate methods in the fetcher. -// -// Application callbacks are always called by the fetcher on the callbackQueue above, -// not on this queue. Apps should generally not change this queue. -// -// The default delegate queue is the main queue. -// -// This value is ignored after the session has been created, so this -// property should be set in the fetcher service rather in the fetcher as it applies -// to a shared session. -@property(atomic, strong, GTM_NULL_RESETTABLE) NSOperationQueue *sessionDelegateQueue; - -// Spin the run loop or sleep the thread, discarding events, until the fetch has completed. -// -// This is only for use in testing or in tools without a user interface. -// -// Note: Synchronous fetches should never be used by shipping apps; they are -// sufficient reason for rejection from the app store. -// -// Returns NO if timed out. -- (BOOL)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds; - -// Test block is optional for testing. -// -// If present, this block will cause the fetcher to skip starting the session, and instead -// use the test block response values when calling the completion handler and delegate code. -// -// Test code can set this on the fetcher or on the fetcher service. For testing libraries -// that use a fetcher without exposing either the fetcher or the fetcher service, the global -// method setGlobalTestBlock: will set the block for all fetchers that do not have a test -// block set. -// -// The test code can pass nil for all response parameters to indicate that the fetch -// should proceed. -// -// Applications can exclude test block support by setting GTM_DISABLE_FETCHER_TEST_BLOCK. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherTestBlock testBlock; - -+ (void)setGlobalTestBlock:(GTM_NULLABLE GTMSessionFetcherTestBlock)block; - -// When using the testBlock, |testBlockAccumulateDataChunkCount| is the desired number of chunks to -// divide the response data into if the client has streaming enabled. The data will be divided up to -// |testBlockAccumulateDataChunkCount| chunks; however, the exact amount may vary depending on the -// size of the response data (e.g. a 1-byte response can only be divided into one chunk). -@property(atomic, readwrite) NSUInteger testBlockAccumulateDataChunkCount; - -#if GTM_BACKGROUND_TASK_FETCHING -// For testing or to override UIApplication invocations, apps may specify an alternative -// target for messages to UIApplication. -+ (void)setSubstituteUIApplication:(nullable id)substituteUIApplication; -+ (nullable id)substituteUIApplication; -#endif // GTM_BACKGROUND_TASK_FETCHING - -// Exposed for testing. -+ (GTMSessionCookieStorage *)staticCookieStorage; -+ (BOOL)appAllowsInsecureRequests; - -#if STRIP_GTM_FETCH_LOGGING -// If logging is stripped, provide a stub for the main method -// for controlling logging. -+ (void)setLoggingEnabled:(BOOL)flag; -+ (BOOL)isLoggingEnabled; - -#else - -// These methods let an application log specific body text, such as the text description of a binary -// request or response. The application should set the fetcher to defer response body logging until -// the response has been received and the log response body has been set by the app. For example: -// -// fetcher.logRequestBody = [binaryObject stringDescription]; -// fetcher.deferResponseBodyLogging = YES; -// [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { -// if (error == nil) { -// fetcher.logResponseBody = [[[MyThing alloc] initWithData:data] stringDescription]; -// } -// fetcher.deferResponseBodyLogging = NO; -// }]; - -@property(atomic, copy, GTM_NULLABLE) NSString *logRequestBody; -@property(atomic, assign) BOOL deferResponseBodyLogging; -@property(atomic, copy, GTM_NULLABLE) NSString *logResponseBody; - -// Internal logging support. -@property(atomic, readonly) NSData *loggedStreamData; -@property(atomic, assign) BOOL hasLoggedError; -@property(atomic, strong, GTM_NULLABLE) NSURL *redirectedFromURL; -- (void)appendLoggedStreamData:(NSData *)dataToAdd; -- (void)clearLoggedStreamData; - -#endif // STRIP_GTM_FETCH_LOGGING - -@end - -@interface GTMSessionFetcher (BackwardsCompatibilityOnly) -// Clients using GTMSessionFetcher should set the cookie storage explicitly themselves. -// This method is just for compatibility with the old GTMHTTPFetcher class. -- (void)setCookieStorageMethod:(NSInteger)method; -@end - -// Until we can just instantiate NSHTTPCookieStorage for local use, we'll -// implement all the public methods ourselves. This stores cookies only in -// memory. Additional methods are provided for testing. -// -// iOS 9/OS X 10.11 added +[NSHTTPCookieStorage sharedCookieStorageForGroupContainerIdentifier:] -// which may also be used to create cookie storage. -@interface GTMSessionCookieStorage : NSHTTPCookieStorage - -// Add the array off cookies to the storage, replacing duplicates. -// Also removes expired cookies from the storage. -- (void)setCookies:(GTM_NULLABLE GTM_NSArrayOf(NSHTTPCookie *) *)cookies; - -- (void)removeAllCookies; - -@end - -// Macros to monitor synchronization blocks in debug builds. -// These report problems using GTMSessionCheckDebug. -// -// GTMSessionMonitorSynchronized Start monitoring a top-level-only -// @sync scope. -// GTMSessionMonitorRecursiveSynchronized Start monitoring a top-level or -// recursive @sync scope. -// GTMSessionCheckSynchronized Verify that the current execution -// is inside a @sync scope. -// GTMSessionCheckNotSynchronized Verify that the current execution -// is not inside a @sync scope. -// -// Example usage: -// -// - (void)myExternalMethod { -// @synchronized(self) { -// GTMSessionMonitorSynchronized(self) -// -// - (void)myInternalMethod { -// GTMSessionCheckSynchronized(self); -// -// - (void)callMyCallbacks { -// GTMSessionCheckNotSynchronized(self); -// -// GTMSessionCheckNotSynchronized is available for verifying the code isn't -// in a deadlockable @sync state when posting notifications and invoking -// callbacks. Don't use GTMSessionCheckNotSynchronized immediately before a -// @sync scope; the normal recursiveness check of GTMSessionMonitorSynchronized -// can catch those. - -#ifdef __OBJC__ -#if DEBUG - #define __GTMSessionMonitorSynchronizedVariableInner(varname, counter) \ - varname ## counter - #define __GTMSessionMonitorSynchronizedVariable(varname, counter) \ - __GTMSessionMonitorSynchronizedVariableInner(varname, counter) - - #define GTMSessionMonitorSynchronized(obj) \ - NS_VALID_UNTIL_END_OF_SCOPE id \ - __GTMSessionMonitorSynchronizedVariable(__monitor, __COUNTER__) = \ - [[GTMSessionSyncMonitorInternal alloc] initWithSynchronizationObject:obj \ - allowRecursive:NO \ - functionName:__func__] - - #define GTMSessionMonitorRecursiveSynchronized(obj) \ - NS_VALID_UNTIL_END_OF_SCOPE id \ - __GTMSessionMonitorSynchronizedVariable(__monitor, __COUNTER__) = \ - [[GTMSessionSyncMonitorInternal alloc] initWithSynchronizationObject:obj \ - allowRecursive:YES \ - functionName:__func__] - - #define GTMSessionCheckSynchronized(obj) { \ - GTMSESSION_ASSERT_DEBUG( \ - [GTMSessionSyncMonitorInternal functionsHoldingSynchronizationOnObject:obj], \ - @"GTMSessionCheckSynchronized(" #obj ") failed: not sync'd" \ - @" on " #obj " in %s. Call stack:\n%@", \ - __func__, [NSThread callStackSymbols]); \ - } - - #define GTMSessionCheckNotSynchronized(obj) { \ - GTMSESSION_ASSERT_DEBUG( \ - ![GTMSessionSyncMonitorInternal functionsHoldingSynchronizationOnObject:obj], \ - @"GTMSessionCheckNotSynchronized(" #obj ") failed: was sync'd" \ - @" on " #obj " in %s by %@. Call stack:\n%@", __func__, \ - [GTMSessionSyncMonitorInternal functionsHoldingSynchronizationOnObject:obj], \ - [NSThread callStackSymbols]); \ - } - -// GTMSessionSyncMonitorInternal is a private class that keeps track of the -// beginning and end of synchronized scopes. -// -// This class should not be used directly, but only via the -// GTMSessionMonitorSynchronized macro. -@interface GTMSessionSyncMonitorInternal : NSObject -- (instancetype)initWithSynchronizationObject:(id)object - allowRecursive:(BOOL)allowRecursive - functionName:(const char *)functionName; -// Return the names of the functions that hold sync on the object, or nil if none. -+ (NSArray *)functionsHoldingSynchronizationOnObject:(id)object; -@end - -#else - #define GTMSessionMonitorSynchronized(obj) do { } while (0) - #define GTMSessionMonitorRecursiveSynchronized(obj) do { } while (0) - #define GTMSessionCheckSynchronized(obj) do { } while (0) - #define GTMSessionCheckNotSynchronized(obj) do { } while (0) -#endif // !DEBUG -#endif // __OBJC__ - - -GTM_ASSUME_NONNULL_END diff --git a/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m b/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m deleted file mode 100644 index c88ddd518..000000000 --- a/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m +++ /dev/null @@ -1,4570 +0,0 @@ -/* Copyright 2014 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -#import "GTMSessionFetcher.h" - -#import - -#ifndef STRIP_GTM_FETCH_LOGGING - #error GTMSessionFetcher headers should have defaulted this if it wasn't already defined. -#endif - -GTM_ASSUME_NONNULL_BEGIN - -NSString *const kGTMSessionFetcherStartedNotification = @"kGTMSessionFetcherStartedNotification"; -NSString *const kGTMSessionFetcherStoppedNotification = @"kGTMSessionFetcherStoppedNotification"; -NSString *const kGTMSessionFetcherRetryDelayStartedNotification = @"kGTMSessionFetcherRetryDelayStartedNotification"; -NSString *const kGTMSessionFetcherRetryDelayStoppedNotification = @"kGTMSessionFetcherRetryDelayStoppedNotification"; - -NSString *const kGTMSessionFetcherCompletionInvokedNotification = @"kGTMSessionFetcherCompletionInvokedNotification"; -NSString *const kGTMSessionFetcherCompletionDataKey = @"data"; -NSString *const kGTMSessionFetcherCompletionErrorKey = @"error"; - -NSString *const kGTMSessionFetcherErrorDomain = @"com.google.GTMSessionFetcher"; -NSString *const kGTMSessionFetcherStatusDomain = @"com.google.HTTPStatus"; -NSString *const kGTMSessionFetcherStatusDataKey = @"data"; // data returned with a kGTMSessionFetcherStatusDomain error - -NSString *const kGTMSessionFetcherNumberOfRetriesDoneKey = @"kGTMSessionFetcherNumberOfRetriesDoneKey"; -NSString *const kGTMSessionFetcherElapsedIntervalWithRetriesKey = @"kGTMSessionFetcherElapsedIntervalWithRetriesKey"; - -static NSString *const kGTMSessionIdentifierPrefix = @"com.google.GTMSessionFetcher"; -static NSString *const kGTMSessionIdentifierDestinationFileURLMetadataKey = @"_destURL"; -static NSString *const kGTMSessionIdentifierBodyFileURLMetadataKey = @"_bodyURL"; - -// The default max retry interview is 10 minutes for uploads (POST/PUT/PATCH), -// 1 minute for downloads. -static const NSTimeInterval kUnsetMaxRetryInterval = -1.0; -static const NSTimeInterval kDefaultMaxDownloadRetryInterval = 60.0; -static const NSTimeInterval kDefaultMaxUploadRetryInterval = 60.0 * 10.; - -#ifdef GTMSESSION_PERSISTED_DESTINATION_KEY -// Projects using unique class names should also define a unique persisted destination key. -static NSString * const kGTMSessionFetcherPersistedDestinationKey = - GTMSESSION_PERSISTED_DESTINATION_KEY; -#else -static NSString * const kGTMSessionFetcherPersistedDestinationKey = - @"com.google.GTMSessionFetcher.downloads"; -#endif - -GTM_ASSUME_NONNULL_END - -// -// GTMSessionFetcher -// - -#if 0 -#define GTM_LOG_BACKGROUND_SESSION(...) GTMSESSION_LOG_DEBUG(__VA_ARGS__) -#else -#define GTM_LOG_BACKGROUND_SESSION(...) -#endif - -#ifndef GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY - #if (TARGET_OS_TV \ - || TARGET_OS_WATCH \ - || (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_11) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) \ - || (TARGET_OS_IPHONE && defined(__IPHONE_9_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0)) - #define GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY 1 - #endif -#endif - -@interface GTMSessionFetcher () - -@property(atomic, strong, readwrite, GTM_NULLABLE) NSData *downloadedData; -@property(atomic, strong, readwrite, GTM_NULLABLE) NSData *downloadResumeData; - -#if GTM_BACKGROUND_TASK_FETCHING -// Should always be accessed within an @synchronized(self). -@property(assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskIdentifier; -#endif - -@property(atomic, readwrite, getter=isUsingBackgroundSession) BOOL usingBackgroundSession; - -@end - -#if !GTMSESSION_BUILD_COMBINED_SOURCES -@interface GTMSessionFetcher (GTMSessionFetcherLoggingInternal) -- (void)logFetchWithError:(NSError *)error; -- (void)logNowWithError:(GTM_NULLABLE NSError *)error; -- (NSInputStream *)loggedInputStreamForInputStream:(NSInputStream *)inputStream; -- (GTMSessionFetcherBodyStreamProvider)loggedStreamProviderForStreamProvider: - (GTMSessionFetcherBodyStreamProvider)streamProvider; -@end -#endif // !GTMSESSION_BUILD_COMBINED_SOURCES - -GTM_ASSUME_NONNULL_BEGIN - -static NSTimeInterval InitialMinRetryInterval(void) { - return 1.0 + ((double)(arc4random_uniform(0x0FFFF)) / (double) 0x0FFFF); -} - -static BOOL IsLocalhost(NSString * GTM_NULLABLE_TYPE host) { - // We check if there's host, and then make the comparisons. - if (host == nil) return NO; - return ([host caseInsensitiveCompare:@"localhost"] == NSOrderedSame - || [host isEqual:@"::1"] - || [host isEqual:@"127.0.0.1"]); -} - -static GTMSessionFetcherTestBlock GTM_NULLABLE_TYPE gGlobalTestBlock; - -@implementation GTMSessionFetcher { - NSMutableURLRequest *_request; // after beginFetch, changed only in delegate callbacks - BOOL _useUploadTask; // immutable after beginFetch - NSURL *_bodyFileURL; // immutable after beginFetch - GTMSessionFetcherBodyStreamProvider _bodyStreamProvider; // immutable after beginFetch - NSURLSession *_session; - BOOL _shouldInvalidateSession; // immutable after beginFetch - NSURLSession *_sessionNeedingInvalidation; - NSURLSessionConfiguration *_configuration; - NSURLSessionTask *_sessionTask; - NSString *_taskDescription; - float _taskPriority; - NSURLResponse *_response; - NSString *_sessionIdentifier; - BOOL _wasCreatedFromBackgroundSession; - BOOL _didCreateSessionIdentifier; - NSString *_sessionIdentifierUUID; - BOOL _userRequestedBackgroundSession; - BOOL _usingBackgroundSession; - NSMutableData * GTM_NULLABLE_TYPE _downloadedData; - NSError *_downloadFinishedError; - NSData *_downloadResumeData; // immutable after construction - NSURL *_destinationFileURL; - int64_t _downloadedLength; - NSURLCredential *_credential; // username & password - NSURLCredential *_proxyCredential; // credential supplied to proxy servers - BOOL _isStopNotificationNeeded; // set when start notification has been sent - BOOL _isUsingTestBlock; // set when a test block was provided (remains set when the block is released) - id _userData; // retained, if set by caller - NSMutableDictionary *_properties; // more data retained for caller - dispatch_queue_t _callbackQueue; - dispatch_group_t _callbackGroup; // read-only after creation - NSOperationQueue *_delegateQueue; // immutable after beginFetch - - id _authorizer; // immutable after beginFetch - - // The service object that created and monitors this fetcher, if any. - id _service; // immutable; set by the fetcher service upon creation - NSString *_serviceHost; - NSInteger _servicePriority; // immutable after beginFetch - BOOL _hasStoppedFetching; // counterpart to _initialBeginFetchDate - BOOL _userStoppedFetching; - - BOOL _isRetryEnabled; // user wants auto-retry - NSTimer *_retryTimer; - NSUInteger _retryCount; - NSTimeInterval _maxRetryInterval; // default 60 (download) or 600 (upload) seconds - NSTimeInterval _minRetryInterval; // random between 1 and 2 seconds - NSTimeInterval _retryFactor; // default interval multiplier is 2 - NSTimeInterval _lastRetryInterval; - NSDate *_initialBeginFetchDate; // date that beginFetch was first invoked; immutable after initial beginFetch - NSDate *_initialRequestDate; // date of first request to the target server (ignoring auth) - BOOL _hasAttemptedAuthRefresh; // accessed only in shouldRetryNowForStatus: - - NSString *_comment; // comment for log - NSString *_log; -#if !STRIP_GTM_FETCH_LOGGING - NSMutableData *_loggedStreamData; - NSURL *_redirectedFromURL; - NSString *_logRequestBody; - NSString *_logResponseBody; - BOOL _hasLoggedError; - BOOL _deferResponseBodyLogging; -#endif -} - -#if !GTMSESSION_UNIT_TESTING -+ (void)load { - [self fetchersForBackgroundSessions]; -} -#endif - -+ (instancetype)fetcherWithRequest:(GTM_NULLABLE NSURLRequest *)request { - return [[self alloc] initWithRequest:request configuration:nil]; -} - -+ (instancetype)fetcherWithURL:(NSURL *)requestURL { - return [self fetcherWithRequest:[NSURLRequest requestWithURL:requestURL]]; -} - -+ (instancetype)fetcherWithURLString:(NSString *)requestURLString { - return [self fetcherWithURL:(NSURL *)[NSURL URLWithString:requestURLString]]; -} - -+ (instancetype)fetcherWithDownloadResumeData:(NSData *)resumeData { - GTMSessionFetcher *fetcher = [self fetcherWithRequest:nil]; - fetcher.comment = @"Resuming download"; - fetcher.downloadResumeData = resumeData; - return fetcher; -} - -+ (GTM_NULLABLE instancetype)fetcherWithSessionIdentifier:(NSString *)sessionIdentifier { - GTMSESSION_ASSERT_DEBUG(sessionIdentifier != nil, @"Invalid session identifier"); - NSMapTable *sessionIdentifierToFetcherMap = [self sessionIdentifierToFetcherMap]; - GTMSessionFetcher *fetcher = [sessionIdentifierToFetcherMap objectForKey:sessionIdentifier]; - if (!fetcher && [sessionIdentifier hasPrefix:kGTMSessionIdentifierPrefix]) { - fetcher = [self fetcherWithRequest:nil]; - [fetcher setSessionIdentifier:sessionIdentifier]; - [sessionIdentifierToFetcherMap setObject:fetcher forKey:sessionIdentifier]; - fetcher->_wasCreatedFromBackgroundSession = YES; - [fetcher setCommentWithFormat:@"Resuming %@", - fetcher && fetcher->_sessionIdentifierUUID ? fetcher->_sessionIdentifierUUID : @"?"]; - } - return fetcher; -} - -+ (NSMapTable *)sessionIdentifierToFetcherMap { - // TODO: What if a service is involved in creating the fetcher? Currently, when re-creating - // fetchers, if a service was involved, it is not re-created. Should the service maintain a map? - static NSMapTable *gSessionIdentifierToFetcherMap = nil; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - gSessionIdentifierToFetcherMap = [NSMapTable strongToWeakObjectsMapTable]; - }); - return gSessionIdentifierToFetcherMap; -} - -#if !GTM_ALLOW_INSECURE_REQUESTS -+ (BOOL)appAllowsInsecureRequests { - // If the main bundle Info.plist key NSAppTransportSecurity is present, and it specifies - // NSAllowsArbitraryLoads, then we need to explicitly enforce secure schemes. -#if GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY - static BOOL allowsInsecureRequests; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSBundle *mainBundle = [NSBundle mainBundle]; - NSDictionary *appTransportSecurity = - [mainBundle objectForInfoDictionaryKey:@"NSAppTransportSecurity"]; - allowsInsecureRequests = - [[appTransportSecurity objectForKey:@"NSAllowsArbitraryLoads"] boolValue]; - }); - return allowsInsecureRequests; -#else - // For builds targeting iOS 8 or 10.10 and earlier, we want to require fetcher - // security checks. - return YES; -#endif // GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY -} -#else // GTM_ALLOW_INSECURE_REQUESTS -+ (BOOL)appAllowsInsecureRequests { - return YES; -} -#endif // !GTM_ALLOW_INSECURE_REQUESTS - - -- (instancetype)init { - return [self initWithRequest:nil configuration:nil]; -} - -- (instancetype)initWithRequest:(NSURLRequest *)request { - return [self initWithRequest:request configuration:nil]; -} - -- (instancetype)initWithRequest:(GTM_NULLABLE NSURLRequest *)request - configuration:(GTM_NULLABLE NSURLSessionConfiguration *)configuration { - self = [super init]; - if (self) { - if (![NSURLSession class]) { - Class oldFetcherClass = NSClassFromString(@"GTMHTTPFetcher"); - if (oldFetcherClass && request) { - self = [[oldFetcherClass alloc] initWithRequest:(NSURLRequest *)request]; - } else { - self = nil; - } - return self; - } -#if GTM_BACKGROUND_TASK_FETCHING - _backgroundTaskIdentifier = UIBackgroundTaskInvalid; -#endif - _request = [request mutableCopy]; - _configuration = configuration; - - NSData *bodyData = request.HTTPBody; - if (bodyData) { - _bodyLength = (int64_t)bodyData.length; - } else { - _bodyLength = NSURLSessionTransferSizeUnknown; - } - - _callbackQueue = dispatch_get_main_queue(); - _callbackGroup = dispatch_group_create(); - _delegateQueue = [NSOperationQueue mainQueue]; - - _minRetryInterval = InitialMinRetryInterval(); - _maxRetryInterval = kUnsetMaxRetryInterval; - - _taskPriority = -1.0f; // Valid values if set are 0.0...1.0. - - _testBlockAccumulateDataChunkCount = 1; - -#if !STRIP_GTM_FETCH_LOGGING - // Encourage developers to set the comment property or use - // setCommentWithFormat: by providing a default string. - _comment = @"(No fetcher comment set)"; -#endif - } - return self; -} - -- (id)copyWithZone:(NSZone *)zone { - // disallow use of fetchers in a copy property - [self doesNotRecognizeSelector:_cmd]; - return nil; -} - -- (NSString *)description { - NSString *requestStr = self.request.URL.description; - if (requestStr.length == 0) { - if (self.downloadResumeData.length > 0) { - requestStr = @""; - } else if (_wasCreatedFromBackgroundSession) { - requestStr = @""; - } else { - requestStr = @""; - } - } - return [NSString stringWithFormat:@"%@ %p (%@)", [self class], self, requestStr]; -} - -- (void)dealloc { - GTMSESSION_ASSERT_DEBUG(!_isStopNotificationNeeded, - @"unbalanced fetcher notification for %@", _request.URL); - [self forgetSessionIdentifierForFetcherWithoutSyncCheck]; - - // Note: if a session task or a retry timer was pending, then this instance - // would be retained by those so it wouldn't be getting dealloc'd, - // hence we don't need to stopFetch here -} - -#pragma mark - - -// Begin fetching the URL (or begin a retry fetch). The delegate is retained -// for the duration of the fetch connection. - -- (void)beginFetchWithCompletionHandler:(GTM_NULLABLE GTMSessionFetcherCompletionHandler)handler { - GTMSessionCheckNotSynchronized(self); - - _completionHandler = [handler copy]; - - // The user may have called setDelegate: earlier if they want to use other - // delegate-style callbacks during the fetch; otherwise, the delegate is nil, - // which is fine. - [self beginFetchMayDelay:YES mayAuthorize:YES]; -} - -// Begin fetching the URL for a retry fetch. The delegate and completion handler -// are already provided, and do not need to be copied. -- (void)beginFetchForRetry { - GTMSessionCheckNotSynchronized(self); - - [self beginFetchMayDelay:YES mayAuthorize:YES]; -} - -- (GTMSessionFetcherCompletionHandler)completionHandlerWithTarget:(GTM_NULLABLE_TYPE id)target - didFinishSelector:(GTM_NULLABLE_TYPE SEL)finishedSelector { - GTMSessionFetcherAssertValidSelector(target, finishedSelector, @encode(GTMSessionFetcher *), - @encode(NSData *), @encode(NSError *), 0); - GTMSessionFetcherCompletionHandler completionHandler = ^(NSData *data, NSError *error) { - if (target && finishedSelector) { - id selfArg = self; // Placate ARC. - NSMethodSignature *sig = [target methodSignatureForSelector:finishedSelector]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; - [invocation setSelector:(SEL)finishedSelector]; - [invocation setTarget:target]; - [invocation setArgument:&selfArg atIndex:2]; - [invocation setArgument:&data atIndex:3]; - [invocation setArgument:&error atIndex:4]; - [invocation invoke]; - } - }; - return completionHandler; -} - -- (void)beginFetchWithDelegate:(GTM_NULLABLE_TYPE id)target - didFinishSelector:(GTM_NULLABLE_TYPE SEL)finishedSelector { - GTMSessionCheckNotSynchronized(self); - - GTMSessionFetcherCompletionHandler handler = [self completionHandlerWithTarget:target - didFinishSelector:finishedSelector]; - [self beginFetchWithCompletionHandler:handler]; -} - -- (void)beginFetchMayDelay:(BOOL)mayDelay - mayAuthorize:(BOOL)mayAuthorize { - // This is the internal entry point for re-starting fetches. - GTMSessionCheckNotSynchronized(self); - - NSMutableURLRequest *fetchRequest = _request; // The request property is now externally immutable. - NSURL *fetchRequestURL = fetchRequest.URL; - NSString *priorSessionIdentifier = self.sessionIdentifier; - - // A utility block for creating error objects when we fail to start the fetch. - NSError *(^beginFailureError)(NSInteger) = ^(NSInteger code){ - NSString *urlString = fetchRequestURL.absoluteString; - NSDictionary *userInfo = @{ - NSURLErrorFailingURLStringErrorKey : (urlString ? urlString : @"(missing URL)") - }; - return [NSError errorWithDomain:kGTMSessionFetcherErrorDomain - code:code - userInfo:userInfo]; - }; - - // Catch delegate queue maxConcurrentOperationCount values other than 1, particularly - // NSOperationQueueDefaultMaxConcurrentOperationCount (-1), to avoid the additional complexity - // of simultaneous or out-of-order delegate callbacks. - GTMSESSION_ASSERT_DEBUG(_delegateQueue.maxConcurrentOperationCount == 1, - @"delegate queue %@ should support one concurrent operation, not %zd", - _delegateQueue.name, _delegateQueue.maxConcurrentOperationCount); - - if (!_initialBeginFetchDate) { - // This ivar is set only here on the initial beginFetch so need not be synchronized. - _initialBeginFetchDate = [[NSDate alloc] init]; - } - - if (self.sessionTask != nil) { - // If cached fetcher returned through fetcherWithSessionIdentifier:, then it's - // already begun, but don't consider this a failure, since the user need not know this. - if (self.sessionIdentifier != nil) { - return; - } - GTMSESSION_ASSERT_DEBUG(NO, @"Fetch object %@ being reused; this should never happen", self); - [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorDownloadFailed)]; - return; - } - - if (fetchRequestURL == nil && !_downloadResumeData && !priorSessionIdentifier) { - GTMSESSION_ASSERT_DEBUG(NO, @"Beginning a fetch requires a request with a URL"); - [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorDownloadFailed)]; - return; - } - - // We'll respect the user's request for a background session (unless this is - // an upload fetcher, which does its initial request foreground.) - self.usingBackgroundSession = self.useBackgroundSession && [self canFetchWithBackgroundSession]; - - NSURL *bodyFileURL = self.bodyFileURL; - if (bodyFileURL) { - NSError *fileCheckError; - if (![bodyFileURL checkResourceIsReachableAndReturnError:&fileCheckError]) { - // This assert fires when the file being uploaded no longer exists once - // the fetcher is ready to start the upload. - GTMSESSION_ASSERT_DEBUG_OR_LOG(0, @"Body file is unreachable: %@\n %@", - bodyFileURL.path, fileCheckError); - [self failToBeginFetchWithError:fileCheckError]; - return; - } - } - - NSString *requestScheme = fetchRequestURL.scheme; - BOOL isDataRequest = [requestScheme isEqual:@"data"]; - if (isDataRequest) { - // NSURLSession does not support data URLs in background sessions. -#if DEBUG - if (priorSessionIdentifier || self.sessionIdentifier) { - GTMSESSION_LOG_DEBUG(@"Converting background to foreground session for %@", - fetchRequest); - } -#endif - [self setSessionIdentifierInternal:nil]; - self.useBackgroundSession = NO; - } - -#if GTM_ALLOW_INSECURE_REQUESTS - BOOL shouldCheckSecurity = NO; -#else - BOOL shouldCheckSecurity = (fetchRequestURL != nil - && !isDataRequest - && [[self class] appAllowsInsecureRequests]); -#endif - - if (shouldCheckSecurity) { - // Allow https only for requests, unless overridden by the client. - // - // Non-https requests may too easily be snooped, so we disallow them by default. - // - // file: and data: schemes are usually safe if they are hardcoded in the client or provided - // by a trusted source, but since it's fairly rare to need them, it's safest to make clients - // explicitly whitelist them. - BOOL isSecure = - requestScheme != nil && [requestScheme caseInsensitiveCompare:@"https"] == NSOrderedSame; - if (!isSecure) { - BOOL allowRequest = NO; - NSString *host = fetchRequestURL.host; - - // Check schemes first. A file scheme request may be allowed here, or as a localhost request. - for (NSString *allowedScheme in _allowedInsecureSchemes) { - if (requestScheme != nil && - [requestScheme caseInsensitiveCompare:allowedScheme] == NSOrderedSame) { - allowRequest = YES; - break; - } - } - if (!allowRequest) { - // Check for localhost requests. Security checks only occur for non-https requests, so - // this check won't happen for an https request to localhost. - BOOL isLocalhostRequest = (host.length == 0 && [fetchRequestURL isFileURL]) || IsLocalhost(host); - if (isLocalhostRequest) { - if (self.allowLocalhostRequest) { - allowRequest = YES; - } else { - GTMSESSION_ASSERT_DEBUG(NO, @"Fetch request for localhost but fetcher" - @" allowLocalhostRequest is not set: %@", fetchRequestURL); - } - } else { - GTMSESSION_ASSERT_DEBUG(NO, @"Insecure fetch request has a scheme (%@)" - @" not found in fetcher allowedInsecureSchemes (%@): %@", - requestScheme, _allowedInsecureSchemes ?: @" @[] ", fetchRequestURL); - } - } - - if (!allowRequest) { -#if !DEBUG - NSLog(@"Insecure fetch disallowed for %@", fetchRequestURL.description ?: @"nil request URL"); -#endif - [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorInsecureRequest)]; - return; - } - } // !isSecure - } // (requestURL != nil) && !isDataRequest - - if (self.cookieStorage == nil) { - self.cookieStorage = [[self class] staticCookieStorage]; - } - - BOOL isRecreatingSession = (self.sessionIdentifier != nil) && (fetchRequest == nil); - - self.canShareSession = !isRecreatingSession && !self.usingBackgroundSession; - - if (!self.session && self.canShareSession) { - self.session = [_service sessionForFetcherCreation]; - // If _session is nil, then the service's session creation semaphore will block - // until this fetcher invokes fetcherDidCreateSession: below, so this *must* invoke - // that method, even if the session fails to be created. - } - - if (!self.session) { - // Create a session. - if (!_configuration) { - if (priorSessionIdentifier || self.usingBackgroundSession) { - NSString *sessionIdentifier = priorSessionIdentifier; - if (!sessionIdentifier) { - sessionIdentifier = [self createSessionIdentifierWithMetadata:nil]; - } - NSMapTable *sessionIdentifierToFetcherMap = [[self class] sessionIdentifierToFetcherMap]; - [sessionIdentifierToFetcherMap setObject:self forKey:self.sessionIdentifier]; - -#if (TARGET_OS_TV \ - || TARGET_OS_WATCH \ - || (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_10) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10) \ - || (TARGET_OS_IPHONE && defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0)) - // iOS 8/10.10 builds require the new backgroundSessionConfiguration method name. - _configuration = - [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionIdentifier]; -#elif (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_10) && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10) \ - || (TARGET_OS_IPHONE && defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0) - // Do a runtime check to avoid a deprecation warning about using - // +backgroundSessionConfiguration: on iOS 8. - if ([NSURLSessionConfiguration respondsToSelector:@selector(backgroundSessionConfigurationWithIdentifier:)]) { - // Running on iOS 8+/OS X 10.10+. -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunguarded-availability" -// Disable unguarded availability warning as we can't use the @availability macro until we require -// all clients to build with Xcode 9 or above. - _configuration = - [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionIdentifier]; -#pragma clang diagnostic pop - } else { - // Running on iOS 7/OS X 10.9. - _configuration = - [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier]; - } -#else - // Building with an SDK earlier than iOS 8/OS X 10.10. - _configuration = - [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier]; -#endif - self.usingBackgroundSession = YES; - self.canShareSession = NO; - } else { - _configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; - } -#if !GTM_ALLOW_INSECURE_REQUESTS - _configuration.TLSMinimumSupportedProtocol = kTLSProtocol12; -#endif - } // !_configuration - _configuration.HTTPCookieStorage = self.cookieStorage; - - if (_configurationBlock) { - _configurationBlock(self, _configuration); - } - - id delegate = [_service sessionDelegate]; - if (!delegate || !self.canShareSession) { - delegate = self; - } - self.session = [NSURLSession sessionWithConfiguration:_configuration - delegate:delegate - delegateQueue:self.sessionDelegateQueue]; - GTMSESSION_ASSERT_DEBUG(self.session, @"Couldn't create session"); - - // Tell the service about the session created by this fetcher. This also signals the - // service's semaphore to allow other fetchers to request this session. - [_service fetcherDidCreateSession:self]; - - // If this assertion fires, the client probably tried to use a session identifier that was - // already used. The solution is to make the client use a unique identifier (or better yet let - // the session fetcher assign the identifier). - GTMSESSION_ASSERT_DEBUG(self.session.delegate == delegate, @"Couldn't assign delegate."); - - if (self.session) { - BOOL isUsingSharedDelegate = (delegate != self); - if (!isUsingSharedDelegate) { - _shouldInvalidateSession = YES; - } - } - } - - if (isRecreatingSession) { - _shouldInvalidateSession = YES; - - // Let's make sure there are tasks still running or if not that we get a callback from a - // completed one; otherwise, we assume the tasks failed. - // This is the observed behavior perhaps 25% of the time within the Simulator running 7.0.3 on - // exiting the app after starting an upload and relaunching the app if we manage to relaunch - // after the task has completed, but before the system relaunches us in the background. - [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, - NSArray *downloadTasks) { - if (dataTasks.count == 0 && uploadTasks.count == 0 && downloadTasks.count == 0) { - double const kDelayInSeconds = 1.0; // We should get progress indication or completion soon - dispatch_time_t checkForFeedbackDelay = - dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kDelayInSeconds * NSEC_PER_SEC)); - dispatch_after(checkForFeedbackDelay, dispatch_get_main_queue(), ^{ - if (!self.sessionTask && !fetchRequest) { - // If our task and/or request haven't been restored, then we assume task feedback lost. - [self removePersistedBackgroundSessionFromDefaults]; - NSError *sessionError = - [NSError errorWithDomain:kGTMSessionFetcherErrorDomain - code:GTMSessionFetcherErrorBackgroundFetchFailed - userInfo:nil]; - [self failToBeginFetchWithError:sessionError]; - } - }); - } - }]; - return; - } - - self.downloadedData = nil; - self.downloadedLength = 0; - - if (_servicePriority == NSIntegerMin) { - mayDelay = NO; - } - if (mayDelay && _service) { - BOOL shouldFetchNow = [_service fetcherShouldBeginFetching:self]; - if (!shouldFetchNow) { - // The fetch is deferred, but will happen later. - // - // If this session is held by the fetcher service, clear the session now so that we don't - // assume it's still valid after the fetcher is restarted. - if (self.canShareSession) { - self.session = nil; - } - return; - } - } - - NSString *effectiveHTTPMethod = [fetchRequest valueForHTTPHeaderField:@"X-HTTP-Method-Override"]; - if (effectiveHTTPMethod == nil) { - effectiveHTTPMethod = fetchRequest.HTTPMethod; - } - BOOL isEffectiveHTTPGet = (effectiveHTTPMethod == nil - || [effectiveHTTPMethod isEqual:@"GET"]); - - BOOL needsUploadTask = (self.useUploadTask || self.bodyFileURL || self.bodyStreamProvider); - if (_bodyData || self.bodyStreamProvider || fetchRequest.HTTPBodyStream) { - if (isEffectiveHTTPGet) { - fetchRequest.HTTPMethod = @"POST"; - isEffectiveHTTPGet = NO; - } - - if (_bodyData) { - if (!needsUploadTask) { - fetchRequest.HTTPBody = _bodyData; - } -#if !STRIP_GTM_FETCH_LOGGING - } else if (fetchRequest.HTTPBodyStream) { - if ([self respondsToSelector:@selector(loggedInputStreamForInputStream:)]) { - fetchRequest.HTTPBodyStream = - [self performSelector:@selector(loggedInputStreamForInputStream:) - withObject:fetchRequest.HTTPBodyStream]; - } -#endif - } - } - - // We authorize after setting up the http method and body in the request - // because OAuth 1 may need to sign the request body - if (mayAuthorize && _authorizer && !isDataRequest) { - BOOL isAuthorized = [_authorizer isAuthorizedRequest:fetchRequest]; - if (!isAuthorized) { - // Authorization needed. - // - // If this session is held by the fetcher service, clear the session now so that we don't - // assume it's still valid after authorization completes. - if (self.canShareSession) { - self.session = nil; - } - - // Authorizing the request will recursively call this beginFetch:mayDelay: - // or failToBeginFetchWithError:. - [self authorizeRequest]; - return; - } - } - - // set the default upload or download retry interval, if necessary - if ([self isRetryEnabled] && self.maxRetryInterval <= 0) { - if (isEffectiveHTTPGet || [effectiveHTTPMethod isEqual:@"HEAD"]) { - [self setMaxRetryInterval:kDefaultMaxDownloadRetryInterval]; - } else { - [self setMaxRetryInterval:kDefaultMaxUploadRetryInterval]; - } - } - - // finally, start the connection - NSURLSessionTask *newSessionTask; - BOOL needsDataAccumulator = NO; - if (_downloadResumeData) { - newSessionTask = [_session downloadTaskWithResumeData:_downloadResumeData]; - GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, - @"Failed downloadTaskWithResumeData for %@, resume data %tu bytes", - _session, _downloadResumeData.length); - } else if (_destinationFileURL && !isDataRequest) { - newSessionTask = [_session downloadTaskWithRequest:fetchRequest]; - GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, @"Failed downloadTaskWithRequest for %@, %@", - _session, fetchRequest); - } else if (needsUploadTask) { - if (bodyFileURL) { - newSessionTask = [_session uploadTaskWithRequest:fetchRequest - fromFile:bodyFileURL]; - GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, - @"Failed uploadTaskWithRequest for %@, %@, file %@", - _session, fetchRequest, bodyFileURL.path); - } else if (self.bodyStreamProvider) { - newSessionTask = [_session uploadTaskWithStreamedRequest:fetchRequest]; - GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, - @"Failed uploadTaskWithStreamedRequest for %@, %@", - _session, fetchRequest); - } else { - GTMSESSION_ASSERT_DEBUG_OR_LOG(_bodyData != nil, - @"Upload task needs body data, %@", fetchRequest); - newSessionTask = [_session uploadTaskWithRequest:fetchRequest - fromData:(NSData * GTM_NONNULL_TYPE)_bodyData]; - GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, - @"Failed uploadTaskWithRequest for %@, %@, body data %tu bytes", - _session, fetchRequest, _bodyData.length); - } - needsDataAccumulator = YES; - } else { - newSessionTask = [_session dataTaskWithRequest:fetchRequest]; - needsDataAccumulator = YES; - GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, @"Failed dataTaskWithRequest for %@, %@", - _session, fetchRequest); - } - self.sessionTask = newSessionTask; - - if (!newSessionTask) { - // We shouldn't get here; if we're here, an earlier assertion should have fired to explain - // which session task creation failed. - [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorTaskCreationFailed)]; - return; - } - - if (needsDataAccumulator && _accumulateDataBlock == nil) { - self.downloadedData = [NSMutableData data]; - } - if (_taskDescription) { - newSessionTask.taskDescription = _taskDescription; - } - if (_taskPriority >= 0) { -#if TARGET_OS_TV || TARGET_OS_WATCH - BOOL hasTaskPriority = YES; -#elif (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_10) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10) \ - || (TARGET_OS_IPHONE && defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0) - BOOL hasTaskPriority = YES; -#else - BOOL hasTaskPriority = [newSessionTask respondsToSelector:@selector(setPriority:)]; -#endif - if (hasTaskPriority) { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunguarded-availability" -// Disable unguarded availability warning as we can't use the @availability macro until we require -// all clients to build with Xcode 9 or above. - newSessionTask.priority = _taskPriority; -#pragma clang diagnostic pop - } - } - -#if GTM_DISABLE_FETCHER_TEST_BLOCK - GTMSESSION_ASSERT_DEBUG(_testBlock == nil && gGlobalTestBlock == nil, @"test blocks disabled"); - _testBlock = nil; -#else - if (!_testBlock) { - if (gGlobalTestBlock) { - // Note that the test block may pass nil for all of its response parameters, - // indicating that the fetch should actually proceed. This is useful when the - // global test block has been set, and the app is only testing a specific - // fetcher. The block simulation code will then resume the task. - _testBlock = gGlobalTestBlock; - } - } - _isUsingTestBlock = (_testBlock != nil); -#endif // GTM_DISABLE_FETCHER_TEST_BLOCK - -#if GTM_BACKGROUND_TASK_FETCHING - id app = [[self class] fetcherUIApplication]; - // Background tasks seem to interfere with out-of-process uploads and downloads. - if (app && !self.skipBackgroundTask && !self.useBackgroundSession) { - // Tell UIApplication that we want to continue even when the app is in the - // background. -#if DEBUG - NSString *bgTaskName = [NSString stringWithFormat:@"%@-%@", - [self class], fetchRequest.URL.host]; -#else - NSString *bgTaskName = @"GTMSessionFetcher"; -#endif - __block UIBackgroundTaskIdentifier bgTaskID = [app beginBackgroundTaskWithName:bgTaskName - expirationHandler:^{ - // Background task expiration callback - this block is always invoked by - // UIApplication on the main thread. - if (bgTaskID != UIBackgroundTaskInvalid) { - @synchronized(self) { - if (bgTaskID == self.backgroundTaskIdentifier) { - self.backgroundTaskIdentifier = UIBackgroundTaskInvalid; - } - } - [app endBackgroundTask:bgTaskID]; - } - }]; - @synchronized(self) { - self.backgroundTaskIdentifier = bgTaskID; - } - } -#endif - - if (!_initialRequestDate) { - _initialRequestDate = [[NSDate alloc] init]; - } - - // We don't expect to reach here even on retry or auth until a stop notification has been sent - // for the previous task, but we should ensure that we don't unbalance that. - GTMSESSION_ASSERT_DEBUG(!_isStopNotificationNeeded, @"Start notification without a prior stop"); - [self sendStopNotificationIfNeeded]; - - [self addPersistedBackgroundSessionToDefaults]; - - [self setStopNotificationNeeded:YES]; - - [self postNotificationOnMainThreadWithName:kGTMSessionFetcherStartedNotification - userInfo:nil - requireAsync:NO]; - - // The service needs to know our task if it is serving as NSURLSession delegate. - [_service fetcherDidBeginFetching:self]; - - if (_testBlock) { -#if !GTM_DISABLE_FETCHER_TEST_BLOCK - [self simulateFetchForTestBlock]; -#endif - } else { - // We resume the session task after posting the notification since the - // delegate callbacks may happen immediately if the fetch is started off - // the main thread or the session delegate queue is on a background thread, - // and we don't want to post a start notification after a premature finish - // of the session task. - [newSessionTask resume]; - } -} - -NSData * GTM_NULLABLE_TYPE GTMDataFromInputStream(NSInputStream *inputStream, NSError **outError) { - NSMutableData *data = [NSMutableData data]; - - [inputStream open]; - NSInteger numberOfBytesRead = 0; - while ([inputStream hasBytesAvailable]) { - uint8_t buffer[512]; - numberOfBytesRead = [inputStream read:buffer maxLength:sizeof(buffer)]; - if (numberOfBytesRead > 0) { - [data appendBytes:buffer length:(NSUInteger)numberOfBytesRead]; - } else { - break; - } - } - [inputStream close]; - NSError *streamError = inputStream.streamError; - - if (streamError) { - data = nil; - } - if (outError) { - *outError = streamError; - } - return data; -} - -#if !GTM_DISABLE_FETCHER_TEST_BLOCK - -- (void)simulateFetchForTestBlock { - // This is invoked on the same thread as the beginFetch method was. - // - // Callbacks will all occur on the callback queue. - _testBlock(self, ^(NSURLResponse *response, NSData *responseData, NSError *error) { - // Callback from test block. - if (response == nil && responseData == nil && error == nil) { - // Assume the fetcher should execute rather than be tested. - _testBlock = nil; - _isUsingTestBlock = NO; - [_sessionTask resume]; - return; - } - - GTMSessionFetcherBodyStreamProvider bodyStreamProvider = self.bodyStreamProvider; - if (bodyStreamProvider) { - bodyStreamProvider(^(NSInputStream *bodyStream){ - // Read from the input stream into an NSData buffer. We'll drain the stream - // explicitly on a background queue. - [self invokeOnCallbackQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) - afterUserStopped:NO - block:^{ - NSError *streamError; - NSData *streamedData = GTMDataFromInputStream(bodyStream, &streamError); - - dispatch_async(dispatch_get_main_queue(), ^{ - // Continue callbacks on the main thread, since serial behavior - // is more reliable for tests. - [self simulateDataCallbacksForTestBlockWithBodyData:streamedData - response:response - responseData:responseData - error:(error ?: streamError)]; - }); - }]; - }); - } else { - // No input stream; use the supplied data or file URL. - NSURL *bodyFileURL = self.bodyFileURL; - if (bodyFileURL) { - NSError *readError; - _bodyData = [NSData dataWithContentsOfURL:bodyFileURL - options:NSDataReadingMappedIfSafe - error:&readError]; - error = readError; - } - - // No stream provider. - - // In real fetches, nothing happens until the run loop spins, so apps have leeway to - // set callbacks after they call beginFetch. We'll mirror that fetcher behavior by - // delaying callbacks here at least to the next spin of the run loop. That keeps - // immediate, synchronous setting of callback blocks after beginFetch working in tests. - dispatch_async(dispatch_get_main_queue(), ^{ - [self simulateDataCallbacksForTestBlockWithBodyData:_bodyData - response:response - responseData:responseData - error:error]; - }); - } - }); -} - -- (void)simulateByteTransferReportWithDataLength:(int64_t)totalDataLength - block:(GTMSessionFetcherSendProgressBlock)block { - // This utility method simulates transfer progress with up to three callbacks. - // It is used to call back to any of the progress blocks. - int64_t sendReportSize = totalDataLength / 3 + 1; - int64_t totalSent = 0; - while (totalSent < totalDataLength) { - int64_t bytesRemaining = totalDataLength - totalSent; - sendReportSize = MIN(sendReportSize, bytesRemaining); - totalSent += sendReportSize; - [self invokeOnCallbackQueueUnlessStopped:^{ - block(sendReportSize, totalSent, totalDataLength); - }]; - } -} - -- (void)simulateDataCallbacksForTestBlockWithBodyData:(NSData * GTM_NULLABLE_TYPE)bodyData - response:(NSURLResponse *)response - responseData:(NSData *)suppliedData - error:(NSError *)suppliedError { - __block NSData *responseData = suppliedData; - __block NSError *responseError = suppliedError; - - // This method does the test simulation of callbacks once the upload - // and download data are known. - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - // Get copies of ivars we'll access in async invocations. This simulation assumes - // they won't change during fetcher execution. - NSURL *destinationFileURL = _destinationFileURL; - GTMSessionFetcherWillRedirectBlock willRedirectBlock = _willRedirectBlock; - GTMSessionFetcherDidReceiveResponseBlock didReceiveResponseBlock = _didReceiveResponseBlock; - GTMSessionFetcherSendProgressBlock sendProgressBlock = _sendProgressBlock; - GTMSessionFetcherDownloadProgressBlock downloadProgressBlock = _downloadProgressBlock; - GTMSessionFetcherAccumulateDataBlock accumulateDataBlock = _accumulateDataBlock; - GTMSessionFetcherReceivedProgressBlock receivedProgressBlock = _receivedProgressBlock; - GTMSessionFetcherWillCacheURLResponseBlock willCacheURLResponseBlock = - _willCacheURLResponseBlock; - - // Simulate receipt of redirection. - if (willRedirectBlock) { - [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES - block:^{ - willRedirectBlock((NSHTTPURLResponse *)response, _request, - ^(NSURLRequest *redirectRequest) { - // For simulation, we'll assume the app will just continue. - }); - }]; - } - - // If the fetcher has a challenge block, simulate a challenge. - // - // It might be nice to eventually let the user determine which testBlock - // fetches get challenged rather than always executing the supplied - // challenge block. - if (_challengeBlock) { - [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES - block:^{ - if (_challengeBlock) { - NSURL *requestURL = _request.URL; - NSString *host = requestURL.host; - NSURLProtectionSpace *pspace = - [[NSURLProtectionSpace alloc] initWithHost:host - port:requestURL.port.integerValue - protocol:requestURL.scheme - realm:nil - authenticationMethod:NSURLAuthenticationMethodHTTPBasic]; - id unusedSender = - (id)[NSNull null]; - NSURLAuthenticationChallenge *challenge = - [[NSURLAuthenticationChallenge alloc] initWithProtectionSpace:pspace - proposedCredential:nil - previousFailureCount:0 - failureResponse:nil - error:nil - sender:unusedSender]; - _challengeBlock(self, challenge, ^(NSURLSessionAuthChallengeDisposition disposition, - NSURLCredential * GTM_NULLABLE_TYPE credential){ - // We could change the responseData and responseError based on the disposition, - // but it's easier for apps to just supply the expected data and error - // directly to the test block. So this simulation ignores the disposition. - }); - } - }]; - } - - // Simulate receipt of an initial response. - if (response && didReceiveResponseBlock) { - [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES - block:^{ - didReceiveResponseBlock(response, ^(NSURLSessionResponseDisposition desiredDisposition) { - // For simulation, we'll assume the disposition is to continue. - }); - }]; - } - - // Simulate reporting send progress. - if (sendProgressBlock) { - [self simulateByteTransferReportWithDataLength:(int64_t)bodyData.length - block:^(int64_t bytesSent, - int64_t totalBytesSent, - int64_t totalBytesExpectedToSend) { - // This is invoked on the callback queue unless stopped. - sendProgressBlock(bytesSent, totalBytesSent, totalBytesExpectedToSend); - }]; - } - - if (destinationFileURL) { - // Simulate download to file progress. - if (downloadProgressBlock) { - [self simulateByteTransferReportWithDataLength:(int64_t)responseData.length - block:^(int64_t bytesDownloaded, - int64_t totalBytesDownloaded, - int64_t totalBytesExpectedToDownload) { - // This is invoked on the callback queue unless stopped. - downloadProgressBlock(bytesDownloaded, totalBytesDownloaded, - totalBytesExpectedToDownload); - }]; - } - - NSError *writeError; - [responseData writeToURL:destinationFileURL - options:NSDataWritingAtomic - error:&writeError]; - if (writeError) { - // Tell the test code that writing failed. - responseError = writeError; - } - } else { - // Simulate download to NSData progress. - if ((accumulateDataBlock || receivedProgressBlock) && responseData) { - [self simulateByteTransferWithData:responseData - block:^(NSData *data, - int64_t bytesReceived, - int64_t totalBytesReceived, - int64_t totalBytesExpectedToReceive) { - // This is invoked on the callback queue unless stopped. - if (accumulateDataBlock) { - accumulateDataBlock(data); - } - - if (receivedProgressBlock) { - receivedProgressBlock(bytesReceived, totalBytesReceived); - } - }]; - } - - if (!accumulateDataBlock) { - _downloadedData = [responseData mutableCopy]; - } - - if (willCacheURLResponseBlock) { - // Simulate letting the client inspect and alter the cached response. - NSData *cachedData = responseData ?: [[NSData alloc] init]; // Always have non-nil data. - NSCachedURLResponse *cachedResponse = - [[NSCachedURLResponse alloc] initWithResponse:response - data:cachedData]; - [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES - block:^{ - willCacheURLResponseBlock(cachedResponse, ^(NSCachedURLResponse *responseToCache){ - // The app may provide an alternative response, or nil to defeat caching. - }); - }]; - } - } - _response = response; - } // @synchronized(self) - - NSOperationQueue *queue = self.sessionDelegateQueue; - [queue addOperationWithBlock:^{ - // Rather than invoke failToBeginFetchWithError: we want to simulate completion of - // a connection that started and ended, so we'll call down to finishWithError: - NSInteger status = responseError ? responseError.code : 200; - if (status >= 200 && status <= 399) { - [self finishWithError:nil shouldRetry:NO]; - } else { - [self shouldRetryNowForStatus:status - error:responseError - forceAssumeRetry:NO - response:^(BOOL shouldRetry) { - [self finishWithError:responseError shouldRetry:shouldRetry]; - }]; - } - }]; -} - -- (void)simulateByteTransferWithData:(NSData *)responseData - block:(GTMSessionFetcherSimulateByteTransferBlock)transferBlock { - // This utility method simulates transfering data to the client. It divides the data into at most - // "chunkCount" chunks and then passes each chunk along with a progress update to transferBlock. - // This function can be used with accumulateDataBlock or receivedProgressBlock. - - NSUInteger chunkCount = MAX(self.testBlockAccumulateDataChunkCount, (NSUInteger) 1); - NSUInteger totalDataLength = responseData.length; - NSUInteger sendDataSize = totalDataLength / chunkCount + 1; - NSUInteger totalSent = 0; - while (totalSent < totalDataLength) { - NSUInteger bytesRemaining = totalDataLength - totalSent; - sendDataSize = MIN(sendDataSize, bytesRemaining); - NSData *chunkData = [responseData subdataWithRange:NSMakeRange(totalSent, sendDataSize)]; - totalSent += sendDataSize; - [self invokeOnCallbackQueueUnlessStopped:^{ - transferBlock(chunkData, - (int64_t)sendDataSize, - (int64_t)totalSent, - (int64_t)totalDataLength); - }]; - } -} - -#endif // !GTM_DISABLE_FETCHER_TEST_BLOCK - -- (void)setSessionTask:(NSURLSessionTask *)sessionTask { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_sessionTask != sessionTask) { - _sessionTask = sessionTask; - if (_sessionTask) { - // Request could be nil on restoring this fetcher from a background session. - if (!_request) { - _request = [_sessionTask.originalRequest mutableCopy]; - } - } - } - } // @synchronized(self) -} - -- (NSURLSessionTask * GTM_NULLABLE_TYPE)sessionTask { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _sessionTask; - } // @synchronized(self) -} - -+ (NSUserDefaults *)fetcherUserDefaults { - static NSUserDefaults *gFetcherUserDefaults = nil; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - Class fetcherUserDefaultsClass = NSClassFromString(@"GTMSessionFetcherUserDefaultsFactory"); - if (fetcherUserDefaultsClass) { - gFetcherUserDefaults = [fetcherUserDefaultsClass fetcherUserDefaults]; - } else { - gFetcherUserDefaults = [NSUserDefaults standardUserDefaults]; - } - }); - return gFetcherUserDefaults; -} - -- (void)addPersistedBackgroundSessionToDefaults { - NSString *sessionIdentifier = self.sessionIdentifier; - if (!sessionIdentifier) { - return; - } - NSArray *oldBackgroundSessions = [[self class] activePersistedBackgroundSessions]; - if ([oldBackgroundSessions containsObject:_sessionIdentifier]) { - return; - } - NSMutableArray *newBackgroundSessions = - [NSMutableArray arrayWithArray:oldBackgroundSessions]; - [newBackgroundSessions addObject:sessionIdentifier]; - GTM_LOG_BACKGROUND_SESSION(@"Add to background sessions: %@", newBackgroundSessions); - - NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; - [userDefaults setObject:newBackgroundSessions - forKey:kGTMSessionFetcherPersistedDestinationKey]; - [userDefaults synchronize]; -} - -- (void)removePersistedBackgroundSessionFromDefaults { - NSString *sessionIdentifier = self.sessionIdentifier; - if (!sessionIdentifier) return; - - NSArray *oldBackgroundSessions = [[self class] activePersistedBackgroundSessions]; - if (!oldBackgroundSessions) { - return; - } - NSMutableArray *newBackgroundSessions = - [NSMutableArray arrayWithArray:oldBackgroundSessions]; - NSUInteger sessionIndex = [newBackgroundSessions indexOfObject:sessionIdentifier]; - if (sessionIndex == NSNotFound) { - return; - } - [newBackgroundSessions removeObjectAtIndex:sessionIndex]; - GTM_LOG_BACKGROUND_SESSION(@"Remove from background sessions: %@", newBackgroundSessions); - - NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; - if (newBackgroundSessions.count == 0) { - [userDefaults removeObjectForKey:kGTMSessionFetcherPersistedDestinationKey]; - } else { - [userDefaults setObject:newBackgroundSessions - forKey:kGTMSessionFetcherPersistedDestinationKey]; - } - [userDefaults synchronize]; -} - -+ (GTM_NULLABLE NSArray *)activePersistedBackgroundSessions { - NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; - NSArray *oldBackgroundSessions = - [userDefaults arrayForKey:kGTMSessionFetcherPersistedDestinationKey]; - if (oldBackgroundSessions.count == 0) { - return nil; - } - NSMutableArray *activeBackgroundSessions = nil; - NSMapTable *sessionIdentifierToFetcherMap = [self sessionIdentifierToFetcherMap]; - for (NSString *sessionIdentifier in oldBackgroundSessions) { - GTMSessionFetcher *fetcher = [sessionIdentifierToFetcherMap objectForKey:sessionIdentifier]; - if (fetcher) { - if (!activeBackgroundSessions) { - activeBackgroundSessions = [[NSMutableArray alloc] init]; - } - [activeBackgroundSessions addObject:sessionIdentifier]; - } - } - return activeBackgroundSessions; -} - -+ (NSArray *)fetchersForBackgroundSessions { - NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; - NSArray *backgroundSessions = - [userDefaults arrayForKey:kGTMSessionFetcherPersistedDestinationKey]; - NSMapTable *sessionIdentifierToFetcherMap = [self sessionIdentifierToFetcherMap]; - NSMutableArray *fetchers = [NSMutableArray array]; - for (NSString *sessionIdentifier in backgroundSessions) { - GTMSessionFetcher *fetcher = [sessionIdentifierToFetcherMap objectForKey:sessionIdentifier]; - if (!fetcher) { - fetcher = [self fetcherWithSessionIdentifier:sessionIdentifier]; - GTMSESSION_ASSERT_DEBUG(fetcher != nil, - @"Unexpected invalid session identifier: %@", sessionIdentifier); - [fetcher beginFetchWithCompletionHandler:nil]; - } - GTM_LOG_BACKGROUND_SESSION(@"%@ restoring session %@ by creating fetcher %@ %p", - [self class], sessionIdentifier, fetcher, fetcher); - if (fetcher != nil) { - [fetchers addObject:fetcher]; - } - } - return fetchers; -} - -#if TARGET_OS_IPHONE && !TARGET_OS_WATCH -+ (void)application:(UIApplication *)application - handleEventsForBackgroundURLSession:(NSString *)identifier - completionHandler:(GTMSessionFetcherSystemCompletionHandler)completionHandler { - GTMSessionFetcher *fetcher = [self fetcherWithSessionIdentifier:identifier]; - if (fetcher != nil) { - fetcher.systemCompletionHandler = completionHandler; - } else { - GTM_LOG_BACKGROUND_SESSION(@"%@ did not create background session identifier: %@", - [self class], identifier); - } -} -#endif - -- (NSString * GTM_NULLABLE_TYPE)sessionIdentifier { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _sessionIdentifier; - } // @synchronized(self) -} - -- (void)setSessionIdentifier:(NSString *)sessionIdentifier { - GTMSESSION_ASSERT_DEBUG(sessionIdentifier != nil, @"Invalid session identifier"); - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - GTMSESSION_ASSERT_DEBUG(!_session, @"Unable to set session identifier after session created"); - _sessionIdentifier = [sessionIdentifier copy]; - _usingBackgroundSession = YES; - _canShareSession = NO; - [self restoreDefaultStateForSessionIdentifierMetadata]; - } // @synchronized(self) -} - -- (void)setSessionIdentifierInternal:(GTM_NULLABLE NSString *)sessionIdentifier { - // This internal method only does a synchronized set of the session identifier. - // It does not have side effects on the background session, shared session, or - // session identifier metadata. - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _sessionIdentifier = [sessionIdentifier copy]; - } // @synchronized(self) -} - -- (NSDictionary * GTM_NULLABLE_TYPE)sessionUserInfo { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_sessionUserInfo == nil) { - // We'll return the metadata dictionary with internal keys removed. This avoids the user - // re-using the userInfo dictionary later and accidentally including the internal keys. - NSMutableDictionary *metadata = [[self sessionIdentifierMetadataUnsynchronized] mutableCopy]; - NSSet *keysToRemove = [metadata keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) { - return [key hasPrefix:@"_"]; - }]; - [metadata removeObjectsForKeys:[keysToRemove allObjects]]; - if (metadata.count > 0) { - _sessionUserInfo = metadata; - } - } - return _sessionUserInfo; - } // @synchronized(self) -} - -- (void)setSessionUserInfo:(NSDictionary * GTM_NULLABLE_TYPE)dictionary { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - GTMSESSION_ASSERT_DEBUG(_sessionIdentifier == nil, @"Too late to assign userInfo"); - _sessionUserInfo = dictionary; - } // @synchronized(self) -} - -- (GTM_NULLABLE NSDictionary *)sessionIdentifierDefaultMetadata { - GTMSessionCheckSynchronized(self); - - NSMutableDictionary *defaultUserInfo = [[NSMutableDictionary alloc] init]; - if (_destinationFileURL) { - defaultUserInfo[kGTMSessionIdentifierDestinationFileURLMetadataKey] = - [_destinationFileURL absoluteString]; - } - if (_bodyFileURL) { - defaultUserInfo[kGTMSessionIdentifierBodyFileURLMetadataKey] = [_bodyFileURL absoluteString]; - } - return (defaultUserInfo.count > 0) ? defaultUserInfo : nil; -} - -- (void)restoreDefaultStateForSessionIdentifierMetadata { - GTMSessionCheckSynchronized(self); - - NSDictionary *metadata = [self sessionIdentifierMetadataUnsynchronized]; - NSString *destinationFileURLString = metadata[kGTMSessionIdentifierDestinationFileURLMetadataKey]; - if (destinationFileURLString) { - _destinationFileURL = [NSURL URLWithString:destinationFileURLString]; - GTM_LOG_BACKGROUND_SESSION(@"Restoring destination file URL: %@", _destinationFileURL); - } - NSString *bodyFileURLString = metadata[kGTMSessionIdentifierBodyFileURLMetadataKey]; - if (bodyFileURLString) { - _bodyFileURL = [NSURL URLWithString:bodyFileURLString]; - GTM_LOG_BACKGROUND_SESSION(@"Restoring body file URL: %@", _bodyFileURL); - } -} - -- (NSDictionary * GTM_NULLABLE_TYPE)sessionIdentifierMetadata { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return [self sessionIdentifierMetadataUnsynchronized]; - } -} - -- (NSDictionary * GTM_NULLABLE_TYPE)sessionIdentifierMetadataUnsynchronized { - GTMSessionCheckSynchronized(self); - - // Session Identifier format: "com.google.__ - if (!_sessionIdentifier) { - return nil; - } - NSScanner *metadataScanner = [NSScanner scannerWithString:_sessionIdentifier]; - [metadataScanner setCharactersToBeSkipped:nil]; - NSString *metadataString; - NSString *uuid; - if ([metadataScanner scanUpToString:@"_" intoString:NULL] && - [metadataScanner scanString:@"_" intoString:NULL] && - [metadataScanner scanUpToString:@"_" intoString:&uuid] && - [metadataScanner scanString:@"_" intoString:NULL] && - [metadataScanner scanUpToString:@"\n" intoString:&metadataString]) { - _sessionIdentifierUUID = uuid; - NSData *metadataData = [metadataString dataUsingEncoding:NSUTF8StringEncoding]; - NSError *error; - NSDictionary *metadataDict = - [NSJSONSerialization JSONObjectWithData:metadataData - options:0 - error:&error]; - GTM_LOG_BACKGROUND_SESSION(@"User Info from session identifier: %@ %@", - metadataDict, error ? error : @""); - return metadataDict; - } - return nil; -} - -- (NSString *)createSessionIdentifierWithMetadata:(NSDictionary * GTM_NULLABLE_TYPE)metadataToInclude { - NSString *result; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - // Session Identifier format: "com.google.__ - GTMSESSION_ASSERT_DEBUG(!_sessionIdentifier, @"Session identifier already created"); - _sessionIdentifierUUID = [[NSUUID UUID] UUIDString]; - _sessionIdentifier = - [NSString stringWithFormat:@"%@_%@", kGTMSessionIdentifierPrefix, _sessionIdentifierUUID]; - // Start with user-supplied keys so they cannot accidentally override the fetcher's keys. - NSMutableDictionary *metadataDict = - [NSMutableDictionary dictionaryWithDictionary:(NSDictionary * GTM_NONNULL_TYPE)_sessionUserInfo]; - - if (metadataToInclude) { - [metadataDict addEntriesFromDictionary:(NSDictionary *)metadataToInclude]; - } - NSDictionary *defaultMetadataDict = [self sessionIdentifierDefaultMetadata]; - if (defaultMetadataDict) { - [metadataDict addEntriesFromDictionary:defaultMetadataDict]; - } - if (metadataDict.count > 0) { - NSData *metadataData = [NSJSONSerialization dataWithJSONObject:metadataDict - options:0 - error:NULL]; - GTMSESSION_ASSERT_DEBUG(metadataData != nil, - @"Session identifier user info failed to convert to JSON"); - if (metadataData.length > 0) { - NSString *metadataString = [[NSString alloc] initWithData:metadataData - encoding:NSUTF8StringEncoding]; - _sessionIdentifier = - [_sessionIdentifier stringByAppendingFormat:@"_%@", metadataString]; - } - } - _didCreateSessionIdentifier = YES; - result = _sessionIdentifier; - } // @synchronized(self) - return result; -} - -- (void)failToBeginFetchWithError:(NSError *)error { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _hasStoppedFetching = YES; - } - - if (error == nil) { - error = [NSError errorWithDomain:kGTMSessionFetcherErrorDomain - code:GTMSessionFetcherErrorDownloadFailed - userInfo:nil]; - } - - [self invokeFetchCallbacksOnCallbackQueueWithData:nil - error:error]; - [self releaseCallbacks]; - - [_service fetcherDidStop:self]; - - self.authorizer = nil; -} - -+ (GTMSessionCookieStorage *)staticCookieStorage { - static GTMSessionCookieStorage *gCookieStorage = nil; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - gCookieStorage = [[GTMSessionCookieStorage alloc] init]; - }); - return gCookieStorage; -} - -#if GTM_BACKGROUND_TASK_FETCHING - -- (void)endBackgroundTask { - // Whenever the connection stops or background execution expires, - // we need to tell UIApplication we're done. - UIBackgroundTaskIdentifier bgTaskID; - @synchronized(self) { - bgTaskID = self.backgroundTaskIdentifier; - if (bgTaskID != UIBackgroundTaskInvalid) { - self.backgroundTaskIdentifier = UIBackgroundTaskInvalid; - } - } - - if (bgTaskID != UIBackgroundTaskInvalid) { - id app = [[self class] fetcherUIApplication]; - [app endBackgroundTask:bgTaskID]; - } -} - -#endif // GTM_BACKGROUND_TASK_FETCHING - -- (void)authorizeRequest { - GTMSessionCheckNotSynchronized(self); - - id authorizer = self.authorizer; - SEL asyncAuthSel = @selector(authorizeRequest:delegate:didFinishSelector:); - if ([authorizer respondsToSelector:asyncAuthSel]) { - SEL callbackSel = @selector(authorizer:request:finishedWithError:); - NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; - [authorizer authorizeRequest:mutableRequest - delegate:self - didFinishSelector:callbackSel]; - } else { - GTMSESSION_ASSERT_DEBUG(authorizer == nil, @"invalid authorizer for fetch"); - - // No authorizing possible, and authorizing happens only after any delay; - // just begin fetching - [self beginFetchMayDelay:NO - mayAuthorize:NO]; - } -} - -- (void)authorizer:(id)auth - request:(NSMutableURLRequest *)authorizedRequest - finishedWithError:(NSError *)error { - GTMSessionCheckNotSynchronized(self); - - if (error != nil) { - // We can't fetch without authorization - [self failToBeginFetchWithError:error]; - } else { - @synchronized(self) { - _request = authorizedRequest; - } - [self beginFetchMayDelay:NO - mayAuthorize:NO]; - } -} - - -- (BOOL)canFetchWithBackgroundSession { - // Subclasses may override. - return YES; -} - -// Returns YES if the fetcher has been started and has not yet stopped. -// -// Fetching includes waiting for authorization or for retry, waiting to be allowed by the -// service object to start the request, and actually fetching the request. -- (BOOL)isFetching { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return [self isFetchingUnsynchronized]; - } -} - -- (BOOL)isFetchingUnsynchronized { - GTMSessionCheckSynchronized(self); - - BOOL hasBegun = (_initialBeginFetchDate != nil); - return hasBegun && !_hasStoppedFetching; -} - -- (NSURLResponse * GTM_NULLABLE_TYPE)response { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSURLResponse *response = [self responseUnsynchronized]; - return response; - } // @synchronized(self) -} - -- (NSURLResponse * GTM_NULLABLE_TYPE)responseUnsynchronized { - GTMSessionCheckSynchronized(self); - - NSURLResponse *response = _sessionTask.response; - if (!response) response = _response; - return response; -} - -- (NSInteger)statusCode { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSInteger statusCode = [self statusCodeUnsynchronized]; - return statusCode; - } // @synchronized(self) -} - -- (NSInteger)statusCodeUnsynchronized { - GTMSessionCheckSynchronized(self); - - NSURLResponse *response = [self responseUnsynchronized]; - NSInteger statusCode; - - if ([response respondsToSelector:@selector(statusCode)]) { - statusCode = [(NSHTTPURLResponse *)response statusCode]; - } else { - // Default to zero, in hopes of hinting "Unknown" (we can't be - // sure that things are OK enough to use 200). - statusCode = 0; - } - return statusCode; -} - -- (NSDictionary * GTM_NULLABLE_TYPE)responseHeaders { - GTMSessionCheckNotSynchronized(self); - - NSURLResponse *response = self.response; - if ([response respondsToSelector:@selector(allHeaderFields)]) { - NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; - return headers; - } - return nil; -} - -- (NSDictionary * GTM_NULLABLE_TYPE)responseHeadersUnsynchronized { - GTMSessionCheckSynchronized(self); - - NSURLResponse *response = [self responseUnsynchronized]; - if ([response respondsToSelector:@selector(allHeaderFields)]) { - NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; - return headers; - } - return nil; -} - -- (void)releaseCallbacks { - // Avoid releasing blocks in the sync section since objects dealloc'd by - // the blocks being released may call back into the fetcher or fetcher - // service. - dispatch_queue_t NS_VALID_UNTIL_END_OF_SCOPE holdCallbackQueue; - GTMSessionFetcherCompletionHandler NS_VALID_UNTIL_END_OF_SCOPE holdCompletionHandler; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - holdCallbackQueue = _callbackQueue; - holdCompletionHandler = _completionHandler; - - _callbackQueue = nil; - _completionHandler = nil; // Setter overridden in upload. Setter assumed to be used externally. - } - - // Set local callback pointers to nil here rather than let them release at the end of the scope - // to make any problems due to the blocks being released be a bit more obvious in a stack trace. - holdCallbackQueue = nil; - holdCompletionHandler = nil; - - self.configurationBlock = nil; - self.didReceiveResponseBlock = nil; - self.challengeBlock = nil; - self.willRedirectBlock = nil; - self.sendProgressBlock = nil; - self.receivedProgressBlock = nil; - self.downloadProgressBlock = nil; - self.accumulateDataBlock = nil; - self.willCacheURLResponseBlock = nil; - self.retryBlock = nil; - self.testBlock = nil; - self.resumeDataBlock = nil; -} - -- (void)forgetSessionIdentifierForFetcher { - GTMSessionCheckSynchronized(self); - [self forgetSessionIdentifierForFetcherWithoutSyncCheck]; -} - -- (void)forgetSessionIdentifierForFetcherWithoutSyncCheck { - // This should be called inside a @synchronized block (except during dealloc.) - if (_sessionIdentifier) { - NSMapTable *sessionIdentifierToFetcherMap = [[self class] sessionIdentifierToFetcherMap]; - [sessionIdentifierToFetcherMap removeObjectForKey:_sessionIdentifier]; - _sessionIdentifier = nil; - _didCreateSessionIdentifier = NO; - } -} - -// External stop method -- (void)stopFetching { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - // Prevent enqueued callbacks from executing. - _userStoppedFetching = YES; - } // @synchronized(self) - [self stopFetchReleasingCallbacks:YES]; -} - -// Cancel the fetch of the URL that's currently in progress. -// -// If shouldReleaseCallbacks is NO then the fetch will be retried so the callbacks -// need to still be retained. -- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks { - [self removePersistedBackgroundSessionFromDefaults]; - - id service; - NSMutableURLRequest *request; - - // If the task or the retry timer is all that's retaining the fetcher, - // we want to be sure this instance survives stopping at least long enough for - // the stack to unwind. - __autoreleasing GTMSessionFetcher *holdSelf = self; - - BOOL hasCanceledTask = NO; - - [holdSelf destroyRetryTimer]; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _hasStoppedFetching = YES; - - service = _service; - request = _request; - - if (_sessionTask) { - // In case cancelling the task or session calls this recursively, we want - // to ensure that we'll only release the task and delegate once, - // so first set _sessionTask to nil - // - // This may be called in a callback from the task, so use autorelease to avoid - // releasing the task in its own callback. - __autoreleasing NSURLSessionTask *oldTask = _sessionTask; - if (!_isUsingTestBlock) { - _response = _sessionTask.response; - } - _sessionTask = nil; - - if ([oldTask state] != NSURLSessionTaskStateCompleted) { - // For download tasks, when the fetch is stopped, we may provide resume data that can - // be used to create a new session. - BOOL mayResume = (_resumeDataBlock - && [oldTask respondsToSelector:@selector(cancelByProducingResumeData:)]); - if (!mayResume) { - [oldTask cancel]; - // A side effect of stopping the task is that URLSession:task:didCompleteWithError: - // will be invoked asynchronously on the delegate queue. - } else { - void (^resumeBlock)(NSData *) = _resumeDataBlock; - _resumeDataBlock = nil; - - // Save callbackQueue since releaseCallbacks clears it. - dispatch_queue_t callbackQueue = _callbackQueue; - dispatch_group_enter(_callbackGroup); - [(NSURLSessionDownloadTask *)oldTask cancelByProducingResumeData:^(NSData *resumeData) { - [self invokeOnCallbackQueue:callbackQueue - afterUserStopped:YES - block:^{ - resumeBlock(resumeData); - dispatch_group_leave(_callbackGroup); - }]; - }]; - } - hasCanceledTask = YES; - } - } - - // If the task was canceled, wait until the URLSession:task:didCompleteWithError: to call - // finishTasksAndInvalidate, since calling it immediately tends to crash, see radar 18471901. - if (_session) { - BOOL shouldInvalidate = _shouldInvalidateSession; -#if TARGET_OS_IPHONE - // Don't invalidate if we've got a systemCompletionHandler, since - // URLSessionDidFinishEventsForBackgroundURLSession: won't be called if invalidated. - shouldInvalidate = shouldInvalidate && !self.systemCompletionHandler; -#endif - if (shouldInvalidate) { - __autoreleasing NSURLSession *oldSession = _session; - _session = nil; - - if (!hasCanceledTask) { - [oldSession finishTasksAndInvalidate]; - } else { - _sessionNeedingInvalidation = oldSession; - } - } - } - } // @synchronized(self) - - // send the stopped notification - [self sendStopNotificationIfNeeded]; - - [_authorizer stopAuthorizationForRequest:request]; - - if (shouldReleaseCallbacks) { - [self releaseCallbacks]; - - self.authorizer = nil; - } - - [service fetcherDidStop:self]; - -#if GTM_BACKGROUND_TASK_FETCHING - [self endBackgroundTask]; -#endif -} - -- (void)setStopNotificationNeeded:(BOOL)flag { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _isStopNotificationNeeded = flag; - } // @synchronized(self) -} - -- (void)sendStopNotificationIfNeeded { - BOOL sendNow = NO; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_isStopNotificationNeeded) { - _isStopNotificationNeeded = NO; - sendNow = YES; - } - } // @synchronized(self) - - if (sendNow) { - [self postNotificationOnMainThreadWithName:kGTMSessionFetcherStoppedNotification - userInfo:nil - requireAsync:NO]; - } -} - -- (void)retryFetch { - [self stopFetchReleasingCallbacks:NO]; - - // A retry will need a configuration with a fresh session identifier. - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_sessionIdentifier && _didCreateSessionIdentifier) { - [self forgetSessionIdentifierForFetcher]; - _configuration = nil; - } - - if (_canShareSession) { - // Force a grab of the current session from the fetcher service in case - // the service's old one has become invalid. - _session = nil; - } - } // @synchronized(self) - - [self beginFetchForRetry]; -} - -- (BOOL)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds { - // Uncovered in upload fetcher testing, because the chunk fetcher is being waited on, and gets - // released by the upload code. The uploader just holds onto it with an ivar, and that gets - // nilled in the chunk fetcher callback. - // Used once in while loop just to avoid unused variable compiler warning. - __autoreleasing GTMSessionFetcher *holdSelf = self; - - NSDate *giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; - - BOOL shouldSpinRunLoop = ([NSThread isMainThread] && - (!self.callbackQueue - || self.callbackQueue == dispatch_get_main_queue())); - BOOL expired = NO; - - // Loop until the callbacks have been called and released, and until - // the connection is no longer pending, until there are no callback dispatches - // in flight, or until the timeout has expired. - int64_t delta = (int64_t)(100 * NSEC_PER_MSEC); // 100 ms - while (1) { - BOOL isTaskInProgress = (holdSelf->_sessionTask - && [_sessionTask state] != NSURLSessionTaskStateCompleted); - BOOL needsToCallCompletion = (_completionHandler != nil); - BOOL isCallbackInProgress = (_callbackGroup - && dispatch_group_wait(_callbackGroup, dispatch_time(DISPATCH_TIME_NOW, delta))); - - if (!isTaskInProgress && !needsToCallCompletion && !isCallbackInProgress) break; - - expired = ([giveUpDate timeIntervalSinceNow] < 0); - if (expired) { - GTMSESSION_LOG_DEBUG(@"GTMSessionFetcher waitForCompletionWithTimeout:%0.1f expired -- " - @"%@%@%@", timeoutInSeconds, - isTaskInProgress ? @"taskInProgress " : @"", - needsToCallCompletion ? @"needsToCallCompletion " : @"", - isCallbackInProgress ? @"isCallbackInProgress" : @""); - break; - } - - // Run the current run loop 1/1000 of a second to give the networking - // code a chance to work - const NSTimeInterval kSpinInterval = 0.001; - if (shouldSpinRunLoop) { - NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:kSpinInterval]; - [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; - } else { - [NSThread sleepForTimeInterval:kSpinInterval]; - } - } - return !expired; -} - -+ (void)setGlobalTestBlock:(GTMSessionFetcherTestBlock GTM_NULLABLE_TYPE)block { -#if GTM_DISABLE_FETCHER_TEST_BLOCK - GTMSESSION_ASSERT_DEBUG(block == nil, @"test blocks disabled"); -#endif - gGlobalTestBlock = [block copy]; -} - -#if GTM_BACKGROUND_TASK_FETCHING - -static GTM_NULLABLE_TYPE id gSubstituteUIApp; - -+ (void)setSubstituteUIApplication:(nullable id)app { - gSubstituteUIApp = app; -} - -+ (nullable id)substituteUIApplication { - return gSubstituteUIApp; -} - -+ (nullable id)fetcherUIApplication { - id app = gSubstituteUIApp; - if (app) return app; - - // iOS App extensions should not call [UIApplication sharedApplication], even - // if UIApplication responds to it. - - static Class applicationClass = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - BOOL isAppExtension = [[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]; - if (!isAppExtension) { - Class cls = NSClassFromString(@"UIApplication"); - if (cls && [cls respondsToSelector:NSSelectorFromString(@"sharedApplication")]) { - applicationClass = cls; - } - } - }); - - if (applicationClass) { - app = (id)[applicationClass sharedApplication]; - } - return app; -} -#endif // GTM_BACKGROUND_TASK_FETCHING - -#pragma mark NSURLSession Delegate Methods - -// NSURLSession documentation indicates that redirectRequest can be passed to the handler -// but empirically redirectRequest lacks the HTTP body, so passing it will break POSTs. -// Instead, we construct a new request, a copy of the original, with overrides from the -// redirect. - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task -willPerformHTTPRedirection:(NSHTTPURLResponse *)redirectResponse - newRequest:(NSURLRequest *)redirectRequest - completionHandler:(void (^)(NSURLRequest * GTM_NULLABLE_TYPE))handler { - [self setSessionTask:task]; - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ willPerformHTTPRedirection:%@ newRequest:%@", - [self class], self, session, task, redirectResponse, redirectRequest); - - if ([self userStoppedFetching]) { - handler(nil); - return; - } - if (redirectRequest && redirectResponse) { - // Copy the original request, including the body. - NSURLRequest *originalRequest = self.request; - NSMutableURLRequest *newRequest = [originalRequest mutableCopy]; - - // Disallow scheme changes (say, from https to http). - NSURL *originalRequestURL = originalRequest.URL; - NSURL *redirectRequestURL = redirectRequest.URL; - - NSString *originalScheme = originalRequestURL.scheme; - NSString *redirectScheme = redirectRequestURL.scheme; - - if (originalScheme != nil - && [originalScheme caseInsensitiveCompare:@"http"] == NSOrderedSame - && redirectScheme != nil - && [redirectScheme caseInsensitiveCompare:@"https"] == NSOrderedSame) { - // Allow the change from http to https. - } else { - // Disallow any other scheme changes. - redirectScheme = originalScheme; - } - // The new requests's URL overrides the original's URL. - NSURLComponents *components = [NSURLComponents componentsWithURL:redirectRequestURL - resolvingAgainstBaseURL:NO]; - components.scheme = redirectScheme; - NSURL *newURL = components.URL; - [newRequest setURL:newURL]; - - // Any headers in the redirect override headers in the original. - NSDictionary *redirectHeaders = redirectRequest.allHTTPHeaderFields; - for (NSString *key in redirectHeaders) { - NSString *value = [redirectHeaders objectForKey:key]; - [newRequest setValue:value forHTTPHeaderField:key]; - } - - redirectRequest = newRequest; - - // Log the response we just received - [self setResponse:redirectResponse]; - [self logNowWithError:nil]; - - GTMSessionFetcherWillRedirectBlock willRedirectBlock = self.willRedirectBlock; - if (willRedirectBlock) { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - [self invokeOnCallbackQueueAfterUserStopped:YES - block:^{ - willRedirectBlock(redirectResponse, redirectRequest, ^(NSURLRequest *clientRequest) { - - // Update the request for future logging. - [self updateMutableRequest:[clientRequest mutableCopy]]; - - handler(clientRequest); - }); - }]; - } // @synchronized(self) - return; - } - // Continues here if the client did not provide a redirect block. - - // Update the request for future logging. - [self updateMutableRequest:[redirectRequest mutableCopy]]; - } - handler(redirectRequest); -} - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask -didReceiveResponse:(NSURLResponse *)response - completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))handler { - [self setSessionTask:dataTask]; - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ didReceiveResponse:%@", - [self class], self, session, dataTask, response); - void (^accumulateAndFinish)(NSURLSessionResponseDisposition) = - ^(NSURLSessionResponseDisposition dispositionValue) { - // This method is called when the server has determined that it - // has enough information to create the NSURLResponse - // it can be called multiple times, for example in the case of a - // redirect, so each time we reset the data. - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - BOOL hadPreviousData = _downloadedLength > 0; - - [_downloadedData setLength:0]; - _downloadedLength = 0; - - if (hadPreviousData && (dispositionValue != NSURLSessionResponseCancel)) { - // Tell the accumulate block to discard prior data. - GTMSessionFetcherAccumulateDataBlock accumulateBlock = _accumulateDataBlock; - if (accumulateBlock) { - [self invokeOnCallbackQueueUnlessStopped:^{ - accumulateBlock(nil); - }]; - } - } - } // @synchronized(self) - handler(dispositionValue); - }; - - GTMSessionFetcherDidReceiveResponseBlock receivedResponseBlock; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - receivedResponseBlock = _didReceiveResponseBlock; - if (receivedResponseBlock) { - // We will ultimately need to call back to NSURLSession's handler with the disposition value - // for this delegate method even if the user has stopped the fetcher. - [self invokeOnCallbackQueueAfterUserStopped:YES - block:^{ - receivedResponseBlock(response, ^(NSURLSessionResponseDisposition desiredDisposition) { - accumulateAndFinish(desiredDisposition); - }); - }]; - } - } // @synchronized(self) - - if (receivedResponseBlock == nil) { - accumulateAndFinish(NSURLSessionResponseAllow); - } -} - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask -didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask { - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ didBecomeDownloadTask:%@", - [self class], self, session, dataTask, downloadTask); - [self setSessionTask:downloadTask]; -} - - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task -didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge - completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, - NSURLCredential * GTM_NULLABLE_TYPE credential))handler { - [self setSessionTask:task]; - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ didReceiveChallenge:%@", - [self class], self, session, task, challenge); - - GTMSessionFetcherChallengeBlock challengeBlock = self.challengeBlock; - if (challengeBlock) { - // The fetcher user has provided custom challenge handling. - // - // We will ultimately need to call back to NSURLSession's handler with the disposition value - // for this delegate method even if the user has stopped the fetcher. - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - [self invokeOnCallbackQueueAfterUserStopped:YES - block:^{ - challengeBlock(self, challenge, handler); - }]; - } - } else { - // No challenge block was provided by the client. - [self respondToChallenge:challenge - completionHandler:handler]; - } -} - -- (void)respondToChallenge:(NSURLAuthenticationChallenge *)challenge - completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, - NSURLCredential * GTM_NULLABLE_TYPE credential))handler { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSInteger previousFailureCount = [challenge previousFailureCount]; - if (previousFailureCount <= 2) { - NSURLProtectionSpace *protectionSpace = [challenge protectionSpace]; - NSString *authenticationMethod = [protectionSpace authenticationMethod]; - if ([authenticationMethod isEqual:NSURLAuthenticationMethodServerTrust]) { - // SSL. - // - // Background sessions seem to require an explicit check of the server trust object - // rather than default handling. - SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; - if (serverTrust == NULL) { - // No server trust information is available. - handler(NSURLSessionAuthChallengePerformDefaultHandling, nil); - } else { - // Server trust information is available. - void (^callback)(SecTrustRef, BOOL) = ^(SecTrustRef trustRef, BOOL allow){ - if (allow) { - NSURLCredential *trustCredential = [NSURLCredential credentialForTrust:trustRef]; - handler(NSURLSessionAuthChallengeUseCredential, trustCredential); - } else { - GTMSESSION_LOG_DEBUG(@"Cancelling authentication challenge for %@", _request.URL); - handler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); - } - }; - if (_allowInvalidServerCertificates) { - callback(serverTrust, YES); - } else { - [[self class] evaluateServerTrust:serverTrust - forRequest:_request - completionHandler:callback]; - } - } - return; - } - - NSURLCredential *credential = _credential; - - if ([[challenge protectionSpace] isProxy] && _proxyCredential != nil) { - credential = _proxyCredential; - } - - if (credential) { - handler(NSURLSessionAuthChallengeUseCredential, credential); - } else { - // The credential is still nil; tell the OS to use the default handling. This is needed - // for things that can come out of the keychain (proxies, client certificates, etc.). - // - // Note: Looking up a credential with NSURLCredentialStorage's - // defaultCredentialForProtectionSpace: is *not* the same invoking the handler with - // NSURLSessionAuthChallengePerformDefaultHandling. In the case of - // NSURLAuthenticationMethodClientCertificate, you can get nil back from - // NSURLCredentialStorage, while using this code path instead works. - handler(NSURLSessionAuthChallengePerformDefaultHandling, nil); - } - - } else { - // We've failed auth 3 times. The completion handler will be called with code - // NSURLErrorCancelled. - handler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); - } - } // @synchronized(self) -} - -// Validate the certificate chain. -// -// This may become a public method if it appears to be useful to users. -+ (void)evaluateServerTrust:(SecTrustRef)serverTrust - forRequest:(NSURLRequest *)request - completionHandler:(void (^)(SecTrustRef trustRef, BOOL allow))handler { - // Retain the trust object to avoid a SecTrustEvaluate() crash on iOS 7. - CFRetain(serverTrust); - - // Evaluate the certificate chain. - // - // The delegate queue may be the main thread. Trust evaluation could cause some - // blocking network activity, so we must evaluate async, as documented at - // https://developer.apple.com/library/ios/technotes/tn2232/ - // - // We must also avoid multiple uses of the trust object, per docs: - // "It is not safe to call this function concurrently with any other function that uses - // the same trust management object, or to re-enter this function for the same trust - // management object." - // - // SecTrustEvaluateAsync both does sync execution of Evaluate and calls back on the - // queue passed to it, according to at sources in - // http://www.opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55050.9/lib/SecTrust.cpp - // It would require a global serial queue to ensure the evaluate happens only on a - // single thread at a time, so we'll stick with using SecTrustEvaluate on a background - // thread. - dispatch_queue_t evaluateBackgroundQueue = - dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - dispatch_async(evaluateBackgroundQueue, ^{ - // It looks like the implementation of SecTrustEvaluate() on Mac grabs a global lock, - // so it may be redundant for us to also lock, but it's easy to synchronize here - // anyway. - SecTrustResultType trustEval = kSecTrustResultInvalid; - BOOL shouldAllow; - OSStatus trustError; - @synchronized([GTMSessionFetcher class]) { - GTMSessionMonitorSynchronized([GTMSessionFetcher class]); - - trustError = SecTrustEvaluate(serverTrust, &trustEval); - } - if (trustError != errSecSuccess) { - GTMSESSION_LOG_DEBUG(@"Error %d evaluating trust for %@", - (int)trustError, request); - shouldAllow = NO; - } else { - // Having a trust level "unspecified" by the user is the usual result, described at - // https://developer.apple.com/library/mac/qa/qa1360 - if (trustEval == kSecTrustResultUnspecified - || trustEval == kSecTrustResultProceed) { - shouldAllow = YES; - } else { - shouldAllow = NO; - GTMSESSION_LOG_DEBUG(@"Challenge SecTrustResultType %u for %@, properties: %@", - trustEval, request.URL.host, - CFBridgingRelease(SecTrustCopyProperties(serverTrust))); - } - } - handler(serverTrust, shouldAllow); - - CFRelease(serverTrust); - }); -} - -- (void)invokeOnCallbackQueueUnlessStopped:(void (^)(void))block { - [self invokeOnCallbackQueueAfterUserStopped:NO - block:block]; -} - -- (void)invokeOnCallbackQueueAfterUserStopped:(BOOL)afterStopped - block:(void (^)(void))block { - GTMSessionCheckSynchronized(self); - - [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:afterStopped - block:block]; -} - -- (void)invokeOnCallbackUnsynchronizedQueueAfterUserStopped:(BOOL)afterStopped - block:(void (^)(void))block { - // testBlock simulation code may not be synchronizing when this is invoked. - [self invokeOnCallbackQueue:_callbackQueue - afterUserStopped:afterStopped - block:block]; -} - -- (void)invokeOnCallbackQueue:(dispatch_queue_t)callbackQueue - afterUserStopped:(BOOL)afterStopped - block:(void (^)(void))block { - if (callbackQueue) { - dispatch_group_async(_callbackGroup, callbackQueue, ^{ - if (!afterStopped) { - NSDate *serviceStoppedAllDate = [_service stoppedAllFetchersDate]; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - // Avoid a race between stopFetching and the callback. - if (_userStoppedFetching) { - return; - } - - // Also avoid calling back if the service has stopped all fetchers - // since this one was created. The fetcher may have stopped before - // stopAllFetchers was invoked, so _userStoppedFetching wasn't set, - // but the app still won't expect the callback to fire after - // the service's stopAllFetchers was invoked. - if (serviceStoppedAllDate - && [_initialBeginFetchDate compare:serviceStoppedAllDate] != NSOrderedDescending) { - // stopAllFetchers was called after this fetcher began. - return; - } - } // @synchronized(self) - } - block(); - }); - } -} - -- (void)invokeFetchCallbacksOnCallbackQueueWithData:(GTM_NULLABLE NSData *)data - error:(GTM_NULLABLE NSError *)error { - // Callbacks will be released in the method stopFetchReleasingCallbacks: - GTMSessionFetcherCompletionHandler handler; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - handler = _completionHandler; - - if (handler) { - [self invokeOnCallbackQueueUnlessStopped:^{ - handler(data, error); - - // Post a notification, primarily to allow code to collect responses for - // testing. - // - // The observing code is not likely on the fetcher's callback - // queue, so this posts explicitly to the main queue. - NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; - if (data) { - userInfo[kGTMSessionFetcherCompletionDataKey] = data; - } - if (error) { - userInfo[kGTMSessionFetcherCompletionErrorKey] = error; - } - [self postNotificationOnMainThreadWithName:kGTMSessionFetcherCompletionInvokedNotification - userInfo:userInfo - requireAsync:NO]; - }]; - } - } // @synchronized(self) -} - -- (void)postNotificationOnMainThreadWithName:(NSString *)noteName - userInfo:(GTM_NULLABLE NSDictionary *)userInfo - requireAsync:(BOOL)requireAsync { - dispatch_block_t postBlock = ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:noteName - object:self - userInfo:userInfo]; - }; - - if ([NSThread isMainThread] && !requireAsync) { - // Post synchronously for compatibility with older code using the fetcher. - - // Avoid calling out to other code from inside a sync block to avoid risk - // of a deadlock or of recursive sync. - GTMSessionCheckNotSynchronized(self); - - postBlock(); - } else { - dispatch_async(dispatch_get_main_queue(), postBlock); - } -} - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)uploadTask - needNewBodyStream:(void (^)(NSInputStream * GTM_NULLABLE_TYPE bodyStream))completionHandler { - [self setSessionTask:uploadTask]; - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ needNewBodyStream:", - [self class], self, session, uploadTask); - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - GTMSessionFetcherBodyStreamProvider provider = _bodyStreamProvider; -#if !STRIP_GTM_FETCH_LOGGING - if ([self respondsToSelector:@selector(loggedStreamProviderForStreamProvider:)]) { - provider = [self performSelector:@selector(loggedStreamProviderForStreamProvider:) - withObject:provider]; - } -#endif - if (provider) { - [self invokeOnCallbackQueueUnlessStopped:^{ - provider(completionHandler); - }]; - } else { - GTMSESSION_ASSERT_DEBUG(NO, @"NSURLSession expects a stream provider"); - - completionHandler(nil); - } - } // @synchronized(self) -} - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task - didSendBodyData:(int64_t)bytesSent - totalBytesSent:(int64_t)totalBytesSent -totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { - [self setSessionTask:task]; - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ didSendBodyData:%lld" - @" totalBytesSent:%lld totalBytesExpectedToSend:%lld", - [self class], self, session, task, bytesSent, totalBytesSent, - totalBytesExpectedToSend); - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (!_sendProgressBlock) { - return; - } - // We won't hold on to send progress block; it's ok to not send it if the upload finishes. - [self invokeOnCallbackQueueUnlessStopped:^{ - GTMSessionFetcherSendProgressBlock progressBlock; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - progressBlock = _sendProgressBlock; - } - if (progressBlock) { - progressBlock(bytesSent, totalBytesSent, totalBytesExpectedToSend); - } - }]; - } // @synchronized(self) -} - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask - didReceiveData:(NSData *)data { - [self setSessionTask:dataTask]; - NSUInteger bufferLength = data.length; - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ didReceiveData:%p (%llu bytes)", - [self class], self, session, dataTask, data, - (unsigned long long)bufferLength); - if (bufferLength == 0) { - // Observed on completing an out-of-process upload. - return; - } - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - GTMSessionFetcherAccumulateDataBlock accumulateBlock = _accumulateDataBlock; - if (accumulateBlock) { - // Let the client accumulate the data. - _downloadedLength += bufferLength; - [self invokeOnCallbackQueueUnlessStopped:^{ - accumulateBlock(data); - }]; - } else if (!_userStoppedFetching) { - // Append to the mutable data buffer unless the fetch has been cancelled. - - // Resumed upload tasks may not yet have a data buffer. - if (_downloadedData == nil) { - // Using NSClassFromString for iOS 6 compatibility. - GTMSESSION_ASSERT_DEBUG( - ![dataTask isKindOfClass:NSClassFromString(@"NSURLSessionDownloadTask")], - @"Resumed download tasks should not receive data bytes"); - _downloadedData = [[NSMutableData alloc] init]; - } - - [_downloadedData appendData:data]; - _downloadedLength = (int64_t)_downloadedData.length; - - // We won't hold on to receivedProgressBlock here; it's ok to not send - // it if the transfer finishes. - if (_receivedProgressBlock) { - [self invokeOnCallbackQueueUnlessStopped:^{ - GTMSessionFetcherReceivedProgressBlock progressBlock; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - progressBlock = _receivedProgressBlock; - } - if (progressBlock) { - progressBlock((int64_t)bufferLength, _downloadedLength); - } - }]; - } - } - } // @synchronized(self) -} - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask - willCacheResponse:(NSCachedURLResponse *)proposedResponse - completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ willCacheResponse:%@ %@", - [self class], self, session, dataTask, - proposedResponse, proposedResponse.response); - GTMSessionFetcherWillCacheURLResponseBlock callback; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - callback = _willCacheURLResponseBlock; - - if (callback) { - [self invokeOnCallbackQueueAfterUserStopped:YES - block:^{ - callback(proposedResponse, completionHandler); - }]; - } - } // @synchronized(self) - if (!callback) { - completionHandler(proposedResponse); - } -} - - -- (void)URLSession:(NSURLSession *)session - downloadTask:(NSURLSessionDownloadTask *)downloadTask - didWriteData:(int64_t)bytesWritten - totalBytesWritten:(int64_t)totalBytesWritten -totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ downloadTask:%@ didWriteData:%lld" - @" bytesWritten:%lld totalBytesExpectedToWrite:%lld", - [self class], self, session, downloadTask, bytesWritten, - totalBytesWritten, totalBytesExpectedToWrite); - [self setSessionTask:downloadTask]; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if ((totalBytesExpectedToWrite != NSURLSessionTransferSizeUnknown) && - (totalBytesExpectedToWrite < totalBytesWritten)) { - // Have observed cases were bytesWritten == totalBytesExpectedToWrite, - // but totalBytesWritten > totalBytesExpectedToWrite, so setting to unkown in these cases. - totalBytesExpectedToWrite = NSURLSessionTransferSizeUnknown; - } - // We won't hold on to download progress block during the enqueue; - // it's ok to not send it if the upload finishes. - - [self invokeOnCallbackQueueUnlessStopped:^{ - GTMSessionFetcherDownloadProgressBlock progressBlock; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - progressBlock = _downloadProgressBlock; - } - if (progressBlock) { - progressBlock(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); - } - }]; - } // @synchronized(self) -} - -- (void)URLSession:(NSURLSession *)session - downloadTask:(NSURLSessionDownloadTask *)downloadTask - didResumeAtOffset:(int64_t)fileOffset -expectedTotalBytes:(int64_t)expectedTotalBytes { - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ downloadTask:%@ didResumeAtOffset:%lld" - @" expectedTotalBytes:%lld", - [self class], self, session, downloadTask, fileOffset, - expectedTotalBytes); - [self setSessionTask:downloadTask]; -} - -- (void)URLSession:(NSURLSession *)session - downloadTask:(NSURLSessionDownloadTask *)downloadTask -didFinishDownloadingToURL:(NSURL *)downloadLocationURL { - // Download may have relaunched app, so update _sessionTask. - [self setSessionTask:downloadTask]; - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ downloadTask:%@ didFinishDownloadingToURL:%@", - [self class], self, session, downloadTask, downloadLocationURL); - NSNumber *fileSizeNum; - [downloadLocationURL getResourceValue:&fileSizeNum - forKey:NSURLFileSizeKey - error:NULL]; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSURL *destinationURL = _destinationFileURL; - - _downloadedLength = fileSizeNum.longLongValue; - - // Overwrite any previous file at the destination URL. - NSFileManager *fileMgr = [NSFileManager defaultManager]; - NSError *removeError; - if (![fileMgr removeItemAtURL:destinationURL error:&removeError] - && removeError.code != NSFileNoSuchFileError) { - GTMSESSION_LOG_DEBUG(@"Could not remove previous file at %@ due to %@", - downloadLocationURL.path, removeError); - } - - NSInteger statusCode = [self statusCodeUnsynchronized]; - if (statusCode < 200 || statusCode > 399) { - // In OS X 10.11, the response body is written to a file even on a server - // status error. For convenience of the fetcher client, we'll skip saving the - // downloaded body to the destination URL so that clients do not need to know - // to delete the file following fetch errors. A downside of this is that - // the server may have included error details in the response body, and - // abandoning the downloaded file here means that the details from the - // body are not available to the fetcher client. - GTMSESSION_LOG_DEBUG(@"Abandoning download due to status %zd, file %@", - statusCode, downloadLocationURL.path); - } else { - NSError *moveError; - NSURL *destinationFolderURL = [destinationURL URLByDeletingLastPathComponent]; - BOOL didMoveDownload = NO; - if ([fileMgr createDirectoryAtURL:destinationFolderURL - withIntermediateDirectories:YES - attributes:nil - error:&moveError]) { - didMoveDownload = [fileMgr moveItemAtURL:downloadLocationURL - toURL:destinationURL - error:&moveError]; - } - if (!didMoveDownload) { - _downloadFinishedError = moveError; - } - GTM_LOG_BACKGROUND_SESSION(@"%@ %p Moved download from \"%@\" to \"%@\" %@", - [self class], self, - downloadLocationURL.path, destinationURL.path, - error ? error : @""); - } - } // @synchronized(self) -} - -/* Sent as the last message related to a specific task. Error may be - * nil, which implies that no error occurred and this task is complete. - */ -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task -didCompleteWithError:(NSError *)error { - [self setSessionTask:task]; - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ didCompleteWithError:%@", - [self class], self, session, task, error); - - NSInteger status = self.statusCode; - BOOL forceAssumeRetry = NO; - BOOL succeeded = NO; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - -#if !GTM_DISABLE_FETCHER_TEST_BLOCK - // The task is never resumed when a testBlock is used. When the session is destroyed, - // we should ignore the callback, since the testBlock support code itself invokes - // shouldRetryNowForStatus: and finishWithError:shouldRetry: - if (_isUsingTestBlock) return; -#endif - - if (error == nil) { - error = _downloadFinishedError; - } - succeeded = (error == nil && status >= 0 && status < 300); - if (succeeded) { - // Succeeded. - _bodyLength = task.countOfBytesSent; - } - } // @synchronized(self) - - if (succeeded) { - [self finishWithError:nil shouldRetry:NO]; - return; - } - // For background redirects, no delegate method is called, so we cannot restore a stripped - // Authorization header, so if a 403 ("Forbidden") was generated due to a missing OAuth 2 header, - // set the current request's URL to the redirected URL, so we in effect restore the Authorization - // header. - if ((status == 403) && self.usingBackgroundSession) { - NSURL *redirectURL = self.response.URL; - NSURLRequest *request = self.request; - if (![request.URL isEqual:redirectURL]) { - NSString *authorizationHeader = [request.allHTTPHeaderFields objectForKey:@"Authorization"]; - if (authorizationHeader != nil) { - NSMutableURLRequest *mutableRequest = [request mutableCopy]; - mutableRequest.URL = redirectURL; - [self updateMutableRequest:mutableRequest]; - // Avoid assuming the session is still valid. - self.session = nil; - forceAssumeRetry = YES; - } - } - } - - // If invalidating the session was deferred in stopFetchReleasingCallbacks: then do it now. - NSURLSession *oldSession = self.sessionNeedingInvalidation; - if (oldSession) { - [self setSessionNeedingInvalidation:NULL]; - [oldSession finishTasksAndInvalidate]; - } - - // Failed. - [self shouldRetryNowForStatus:status - error:error - forceAssumeRetry:forceAssumeRetry - response:^(BOOL shouldRetry) { - [self finishWithError:error shouldRetry:shouldRetry]; - }]; -} - -#if TARGET_OS_IPHONE -- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSessionDidFinishEventsForBackgroundURLSession:%@", - [self class], self, session); - [self removePersistedBackgroundSessionFromDefaults]; - - GTMSessionFetcherSystemCompletionHandler handler; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - handler = self.systemCompletionHandler; - self.systemCompletionHandler = nil; - } // @synchronized(self) - if (handler) { - GTM_LOG_BACKGROUND_SESSION(@"%@ %p Calling system completionHandler", [self class], self); - handler(); - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSURLSession *oldSession = _session; - _session = nil; - if (_shouldInvalidateSession) { - [oldSession finishTasksAndInvalidate]; - } - } // @synchronized(self) - } -} -#endif - -- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(GTM_NULLABLE NSError *)error { - // This may happen repeatedly for retries. On authentication callbacks, the retry - // may begin before the prior session sends the didBecomeInvalid delegate message. - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ didBecomeInvalidWithError:%@", - [self class], self, session, error); - if (session == (NSURLSession *)self.session) { - GTM_LOG_SESSION_DELEGATE(@" Unexpected retained invalid session: %@", session); - self.session = nil; - } -} - -- (void)finishWithError:(GTM_NULLABLE NSError *)error shouldRetry:(BOOL)shouldRetry { - [self removePersistedBackgroundSessionFromDefaults]; - - BOOL shouldStopFetching = YES; - NSData *downloadedData = nil; -#if !STRIP_GTM_FETCH_LOGGING - BOOL shouldDeferLogging = NO; -#endif - BOOL shouldBeginRetryTimer = NO; - NSInteger status = [self statusCode]; - NSURL *destinationURL = self.destinationFileURL; - - BOOL fetchSucceeded = (error == nil && status >= 0 && status < 300); - -#if !STRIP_GTM_FETCH_LOGGING - if (!fetchSucceeded) { - if (!shouldDeferLogging && !self.hasLoggedError) { - [self logNowWithError:error]; - self.hasLoggedError = YES; - } - } -#endif // !STRIP_GTM_FETCH_LOGGING - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - -#if !STRIP_GTM_FETCH_LOGGING - shouldDeferLogging = _deferResponseBodyLogging; -#endif - if (fetchSucceeded) { - // Success - if ((_downloadedData.length > 0) && (destinationURL != nil)) { - // Overwrite any previous file at the destination URL. - NSFileManager *fileMgr = [NSFileManager defaultManager]; - [fileMgr removeItemAtURL:destinationURL - error:NULL]; - NSURL *destinationFolderURL = [destinationURL URLByDeletingLastPathComponent]; - BOOL didMoveDownload = NO; - if ([fileMgr createDirectoryAtURL:destinationFolderURL - withIntermediateDirectories:YES - attributes:nil - error:&error]) { - didMoveDownload = [_downloadedData writeToURL:destinationURL - options:NSDataWritingAtomic - error:&error]; - } - if (didMoveDownload) { - _downloadedData = nil; - } else { - _downloadFinishedError = error; - } - } - downloadedData = _downloadedData; - } else { - // Unsuccessful with error or status over 300. Retry or notify the delegate of failure - if (shouldRetry) { - // Retrying. - shouldBeginRetryTimer = YES; - shouldStopFetching = NO; - } else { - if (error == nil) { - // Create an error. - NSDictionary *userInfo = nil; - if (_downloadedData.length > 0) { - NSMutableData *data = _downloadedData; - userInfo = @{ kGTMSessionFetcherStatusDataKey : data }; - } - error = [NSError errorWithDomain:kGTMSessionFetcherStatusDomain - code:status - userInfo:userInfo]; - } else { - // If the error had resume data, and the client supplied a resume block, pass the - // data to the client. - void (^resumeBlock)(NSData *) = _resumeDataBlock; - _resumeDataBlock = nil; - if (resumeBlock) { - NSData *resumeData = [error.userInfo objectForKey:NSURLSessionDownloadTaskResumeData]; - if (resumeData) { - [self invokeOnCallbackQueueAfterUserStopped:YES block:^{ - resumeBlock(resumeData); - }]; - } - } - } - if (_downloadedData.length > 0) { - downloadedData = _downloadedData; - } - // If the error occurred after retries, report the number and duration of the - // retries. This provides a clue to a developer looking at the error description - // that the fetcher did retry before failing with this error. - if (_retryCount > 0) { - NSMutableDictionary *userInfoWithRetries = - [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)error.userInfo]; - NSTimeInterval timeSinceInitialRequest = -[_initialRequestDate timeIntervalSinceNow]; - [userInfoWithRetries setObject:@(timeSinceInitialRequest) - forKey:kGTMSessionFetcherElapsedIntervalWithRetriesKey]; - [userInfoWithRetries setObject:@(_retryCount) - forKey:kGTMSessionFetcherNumberOfRetriesDoneKey]; - error = [NSError errorWithDomain:(NSString *)error.domain - code:error.code - userInfo:userInfoWithRetries]; - } - } - } - } // @synchronized(self) - - if (shouldBeginRetryTimer) { - [self beginRetryTimer]; - } - - // We want to send the stop notification before calling the delegate's - // callback selector, since the callback selector may release all of - // the fetcher properties that the client is using to track the fetches. - // - // We'll also stop now so that, to any observers watching the notifications, - // it doesn't look like our wait for a retry (which may be long, - // 30 seconds or more) is part of the network activity. - [self sendStopNotificationIfNeeded]; - - if (shouldStopFetching) { - [self invokeFetchCallbacksOnCallbackQueueWithData:downloadedData - error:error]; - // The upload subclass doesn't want to release callbacks until upload chunks have completed. - BOOL shouldRelease = [self shouldReleaseCallbacksUponCompletion]; - [self stopFetchReleasingCallbacks:shouldRelease]; - } - -#if !STRIP_GTM_FETCH_LOGGING - // _hasLoggedError is only set by this method - if (!shouldDeferLogging && !_hasLoggedError) { - [self logNowWithError:error]; - } -#endif -} - -- (BOOL)shouldReleaseCallbacksUponCompletion { - // A subclass can override this to keep callbacks around after the - // connection has finished successfully - return YES; -} - -- (void)logNowWithError:(GTM_NULLABLE NSError *)error { - GTMSessionCheckNotSynchronized(self); - - // If the logging category is available, then log the current request, - // response, data, and error - if ([self respondsToSelector:@selector(logFetchWithError:)]) { - [self performSelector:@selector(logFetchWithError:) withObject:error]; - } -} - -#pragma mark Retries - -- (BOOL)isRetryError:(NSError *)error { - struct RetryRecord { - __unsafe_unretained NSString *const domain; - NSInteger code; - }; - - struct RetryRecord retries[] = { - { kGTMSessionFetcherStatusDomain, 408 }, // request timeout - { kGTMSessionFetcherStatusDomain, 502 }, // failure gatewaying to another server - { kGTMSessionFetcherStatusDomain, 503 }, // service unavailable - { kGTMSessionFetcherStatusDomain, 504 }, // request timeout - { NSURLErrorDomain, NSURLErrorTimedOut }, - { NSURLErrorDomain, NSURLErrorNetworkConnectionLost }, - { nil, 0 } - }; - - // NSError's isEqual always returns false for equal but distinct instances - // of NSError, so we have to compare the domain and code values explicitly - NSString *domain = error.domain; - NSInteger code = error.code; - for (int idx = 0; retries[idx].domain != nil; idx++) { - if (code == retries[idx].code && [domain isEqual:retries[idx].domain]) { - return YES; - } - } - return NO; -} - -// shouldRetryNowForStatus:error: responds with YES if the user has enabled retries -// and the status or error is one that is suitable for retrying. "Suitable" -// means either the isRetryError:'s list contains the status or error, or the -// user's retry block is present and returns YES when called, or the -// authorizer may be able to fix. -- (void)shouldRetryNowForStatus:(NSInteger)status - error:(NSError *)error - forceAssumeRetry:(BOOL)forceAssumeRetry - response:(GTMSessionFetcherRetryResponse)response { - // Determine if a refreshed authorizer may avoid an authorization error - BOOL willRetry = NO; - - // We assume _authorizer is immutable after beginFetch, and _hasAttemptedAuthRefresh is modified - // only in this method, and this method is invoked on the serial delegate queue. - // - // We want to avoid calling the authorizer from inside a sync block. - BOOL isFirstAuthError = (_authorizer != nil - && !_hasAttemptedAuthRefresh - && status == GTMSessionFetcherStatusUnauthorized); // 401 - - BOOL hasPrimed = NO; - if (isFirstAuthError) { - if ([_authorizer respondsToSelector:@selector(primeForRefresh)]) { - hasPrimed = [_authorizer primeForRefresh]; - } - } - - BOOL shouldRetryForAuthRefresh = NO; - if (hasPrimed) { - shouldRetryForAuthRefresh = YES; - _hasAttemptedAuthRefresh = YES; - [self updateRequestValue:nil forHTTPHeaderField:@"Authorization"]; - } - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - BOOL shouldDoRetry = [self isRetryEnabledUnsynchronized]; - if (shouldDoRetry && ![self hasRetryAfterInterval]) { - - // Determine if we're doing exponential backoff retries - shouldDoRetry = [self nextRetryIntervalUnsynchronized] < _maxRetryInterval; - - if (shouldDoRetry) { - // If an explicit max retry interval was set, we expect repeated backoffs to take - // up to roughly twice that for repeated fast failures. If the initial attempt is - // already more than 3 times the max retry interval, then failures have taken a long time - // (such as from network timeouts) so don't retry again to avoid the app becoming - // unexpectedly unresponsive. - if (_maxRetryInterval > 0) { - NSTimeInterval maxAllowedIntervalBeforeRetry = _maxRetryInterval * 3; - NSTimeInterval timeSinceInitialRequest = -[_initialRequestDate timeIntervalSinceNow]; - if (timeSinceInitialRequest > maxAllowedIntervalBeforeRetry) { - shouldDoRetry = NO; - } - } - } - } - BOOL canRetry = shouldRetryForAuthRefresh || forceAssumeRetry || shouldDoRetry; - if (canRetry) { - NSDictionary *userInfo = nil; - if (_downloadedData.length > 0) { - NSMutableData *data = _downloadedData; - userInfo = @{ kGTMSessionFetcherStatusDataKey : data }; - } - NSError *statusError = [NSError errorWithDomain:kGTMSessionFetcherStatusDomain - code:status - userInfo:userInfo]; - if (error == nil) { - error = statusError; - } - willRetry = shouldRetryForAuthRefresh || - forceAssumeRetry || - [self isRetryError:error] || - ((error != statusError) && [self isRetryError:statusError]); - - // If the user has installed a retry callback, consult that. - GTMSessionFetcherRetryBlock retryBlock = _retryBlock; - if (retryBlock) { - [self invokeOnCallbackQueueUnlessStopped:^{ - retryBlock(willRetry, error, response); - }]; - return; - } - } - } // @synchronized(self) - response(willRetry); -} - -- (BOOL)hasRetryAfterInterval { - GTMSessionCheckSynchronized(self); - - NSDictionary *responseHeaders = [self responseHeadersUnsynchronized]; - NSString *retryAfterValue = [responseHeaders valueForKey:@"Retry-After"]; - return (retryAfterValue != nil); -} - -- (NSTimeInterval)retryAfterInterval { - GTMSessionCheckSynchronized(self); - - NSDictionary *responseHeaders = [self responseHeadersUnsynchronized]; - NSString *retryAfterValue = [responseHeaders valueForKey:@"Retry-After"]; - if (retryAfterValue == nil) { - return 0; - } - // Retry-After formatted as HTTP-date | delta-seconds - // Reference: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html - NSDateFormatter *rfc1123DateFormatter = [[NSDateFormatter alloc] init]; - rfc1123DateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; - rfc1123DateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; - rfc1123DateFormatter.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss z"; - NSDate *retryAfterDate = [rfc1123DateFormatter dateFromString:retryAfterValue]; - NSTimeInterval retryAfterInterval = (retryAfterDate != nil) ? - retryAfterDate.timeIntervalSinceNow : retryAfterValue.intValue; - retryAfterInterval = MAX(0, retryAfterInterval); - return retryAfterInterval; -} - -- (void)beginRetryTimer { - if (![NSThread isMainThread]) { - // Defer creating and starting the timer until we're on the main thread to ensure it has - // a run loop. - dispatch_group_async(_callbackGroup, dispatch_get_main_queue(), ^{ - [self beginRetryTimer]; - }); - return; - } - - [self destroyRetryTimer]; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSTimeInterval nextInterval = [self nextRetryIntervalUnsynchronized]; - NSTimeInterval maxInterval = _maxRetryInterval; - NSTimeInterval newInterval = MIN(nextInterval, (maxInterval > 0 ? maxInterval : DBL_MAX)); - NSTimeInterval newIntervalTolerance = (newInterval / 10) > 1.0 ?: 1.0; - - _lastRetryInterval = newInterval; - - _retryTimer = [NSTimer timerWithTimeInterval:newInterval - target:self - selector:@selector(retryTimerFired:) - userInfo:nil - repeats:NO]; - _retryTimer.tolerance = newIntervalTolerance; - [[NSRunLoop mainRunLoop] addTimer:_retryTimer - forMode:NSDefaultRunLoopMode]; - } // @synchronized(self) - - [self postNotificationOnMainThreadWithName:kGTMSessionFetcherRetryDelayStartedNotification - userInfo:nil - requireAsync:NO]; -} - -- (void)retryTimerFired:(NSTimer *)timer { - [self destroyRetryTimer]; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _retryCount++; - } // @synchronized(self) - - NSOperationQueue *queue = self.sessionDelegateQueue; - [queue addOperationWithBlock:^{ - [self retryFetch]; - }]; -} - -- (void)destroyRetryTimer { - BOOL shouldNotify = NO; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_retryTimer) { - [_retryTimer invalidate]; - _retryTimer = nil; - shouldNotify = YES; - } - } - - if (shouldNotify) { - [self postNotificationOnMainThreadWithName:kGTMSessionFetcherRetryDelayStoppedNotification - userInfo:nil - requireAsync:NO]; - } -} - -- (NSUInteger)retryCount { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _retryCount; - } // @synchronized(self) -} - -- (NSTimeInterval)nextRetryInterval { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSTimeInterval interval = [self nextRetryIntervalUnsynchronized]; - return interval; - } // @synchronized(self) -} - -- (NSTimeInterval)nextRetryIntervalUnsynchronized { - GTMSessionCheckSynchronized(self); - - NSInteger statusCode = [self statusCodeUnsynchronized]; - if ((statusCode == 503) && [self hasRetryAfterInterval]) { - NSTimeInterval secs = [self retryAfterInterval]; - return secs; - } - // The next wait interval is the factor (2.0) times the last interval, - // but never less than the minimum interval. - NSTimeInterval secs = _lastRetryInterval * _retryFactor; - if (_maxRetryInterval > 0) { - secs = MIN(secs, _maxRetryInterval); - } - secs = MAX(secs, _minRetryInterval); - - return secs; -} - -- (NSTimer *)retryTimer { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _retryTimer; - } // @synchronized(self) -} - -- (BOOL)isRetryEnabled { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _isRetryEnabled; - } // @synchronized(self) -} - -- (BOOL)isRetryEnabledUnsynchronized { - GTMSessionCheckSynchronized(self); - - return _isRetryEnabled; -} - -- (void)setRetryEnabled:(BOOL)flag { - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (flag && !_isRetryEnabled) { - // We defer initializing these until the user calls setRetryEnabled - // to avoid using the random number generator if it's not needed. - // However, this means min and max intervals for this fetcher are reset - // as a side effect of calling setRetryEnabled. - // - // Make an initial retry interval random between 1.0 and 2.0 seconds - _minRetryInterval = InitialMinRetryInterval(); - _maxRetryInterval = kUnsetMaxRetryInterval; - _retryFactor = 2.0; - _lastRetryInterval = 0.0; - } - _isRetryEnabled = flag; - } // @synchronized(self) -}; - -- (NSTimeInterval)maxRetryInterval { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _maxRetryInterval; - } // @synchronized(self) -} - -- (void)setMaxRetryInterval:(NSTimeInterval)secs { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (secs > 0) { - _maxRetryInterval = secs; - } else { - _maxRetryInterval = kUnsetMaxRetryInterval; - } - } // @synchronized(self) -} - -- (double)minRetryInterval { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _minRetryInterval; - } // @synchronized(self) -} - -- (void)setMinRetryInterval:(NSTimeInterval)secs { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (secs > 0) { - _minRetryInterval = secs; - } else { - // Set min interval to a random value between 1.0 and 2.0 seconds - // so that if multiple clients start retrying at the same time, they'll - // repeat at different times and avoid overloading the server - _minRetryInterval = InitialMinRetryInterval(); - } - } // @synchronized(self) - -} - -#pragma mark iOS System Completion Handlers - -#if TARGET_OS_IPHONE -static NSMutableDictionary *gSystemCompletionHandlers = nil; - -- (GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandler { - return [[self class] systemCompletionHandlerForSessionIdentifier:_sessionIdentifier]; -} - -- (void)setSystemCompletionHandler:(GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandler { - [[self class] setSystemCompletionHandler:systemCompletionHandler - forSessionIdentifier:_sessionIdentifier]; -} - -+ (void)setSystemCompletionHandler:(GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandler - forSessionIdentifier:(NSString *)sessionIdentifier { - if (!sessionIdentifier) { - NSLog(@"%s with nil identifier", __PRETTY_FUNCTION__); - return; - } - - @synchronized([GTMSessionFetcher class]) { - if (gSystemCompletionHandlers == nil && systemCompletionHandler != nil) { - gSystemCompletionHandlers = [[NSMutableDictionary alloc] init]; - } - // Use setValue: to remove the object if completionHandler is nil. - [gSystemCompletionHandlers setValue:systemCompletionHandler - forKey:sessionIdentifier]; - } -} - -+ (GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandlerForSessionIdentifier:(NSString *)sessionIdentifier { - if (!sessionIdentifier) { - return nil; - } - @synchronized([GTMSessionFetcher class]) { - return [gSystemCompletionHandlers objectForKey:sessionIdentifier]; - } -} -#endif // TARGET_OS_IPHONE - -#pragma mark Getters and Setters - -@synthesize downloadResumeData = _downloadResumeData, - configuration = _configuration, - configurationBlock = _configurationBlock, - sessionTask = _sessionTask, - wasCreatedFromBackgroundSession = _wasCreatedFromBackgroundSession, - sessionUserInfo = _sessionUserInfo, - taskDescription = _taskDescription, - taskPriority = _taskPriority, - usingBackgroundSession = _usingBackgroundSession, - canShareSession = _canShareSession, - completionHandler = _completionHandler, - credential = _credential, - proxyCredential = _proxyCredential, - bodyData = _bodyData, - bodyLength = _bodyLength, - service = _service, - serviceHost = _serviceHost, - accumulateDataBlock = _accumulateDataBlock, - receivedProgressBlock = _receivedProgressBlock, - downloadProgressBlock = _downloadProgressBlock, - resumeDataBlock = _resumeDataBlock, - didReceiveResponseBlock = _didReceiveResponseBlock, - challengeBlock = _challengeBlock, - willRedirectBlock = _willRedirectBlock, - sendProgressBlock = _sendProgressBlock, - willCacheURLResponseBlock = _willCacheURLResponseBlock, - retryBlock = _retryBlock, - retryFactor = _retryFactor, - allowedInsecureSchemes = _allowedInsecureSchemes, - allowLocalhostRequest = _allowLocalhostRequest, - allowInvalidServerCertificates = _allowInvalidServerCertificates, - cookieStorage = _cookieStorage, - callbackQueue = _callbackQueue, - initialBeginFetchDate = _initialBeginFetchDate, - testBlock = _testBlock, - testBlockAccumulateDataChunkCount = _testBlockAccumulateDataChunkCount, - comment = _comment, - log = _log; - -#if !STRIP_GTM_FETCH_LOGGING -@synthesize redirectedFromURL = _redirectedFromURL, - logRequestBody = _logRequestBody, - logResponseBody = _logResponseBody, - hasLoggedError = _hasLoggedError; -#endif - -#if GTM_BACKGROUND_TASK_FETCHING -@synthesize backgroundTaskIdentifier = _backgroundTaskIdentifier, - skipBackgroundTask = _skipBackgroundTask; -#endif - -- (GTM_NULLABLE NSURLRequest *)request { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return [_request copy]; - } // @synchronized(self) -} - -- (void)setRequest:(GTM_NULLABLE NSURLRequest *)request { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (![self isFetchingUnsynchronized]) { - _request = [request mutableCopy]; - } else { - GTMSESSION_ASSERT_DEBUG(0, @"request may not be set after beginFetch has been invoked"); - } - } // @synchronized(self) -} - -- (GTM_NULLABLE NSMutableURLRequest *)mutableRequestForTesting { - // Allow tests only to modify the request, useful during retries. - return _request; -} - -- (GTM_NULLABLE NSMutableURLRequest *)mutableRequest { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - GTMSESSION_LOG_DEBUG(@"[GTMSessionFetcher mutableRequest] is deprecated; use -request or" - @" -setRequestValue:forHTTPHeaderField:"); - - return _request; - } // @synchronized(self) -} - -- (void)setMutableRequest:(GTM_NULLABLE NSMutableURLRequest *)request { - GTMSESSION_LOG_DEBUG(@"[GTMSessionFetcher setMutableRequest:] is deprecated; use -request or" - @" -setRequestValue:forHTTPHeaderField:"); - - GTMSESSION_ASSERT_DEBUG(![self isFetching], - @"mutableRequest should not change after beginFetch has been invoked"); - [self updateMutableRequest:request]; -} - -// Internal method for updating the request property such as on redirects. -- (void)updateMutableRequest:(GTM_NULLABLE NSMutableURLRequest *)request { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _request = request; - } // @synchronized(self) -} - -// Set a header field value on the request. Header field value changes will not -// affect a fetch after the fetch has begun. -- (void)setRequestValue:(GTM_NULLABLE NSString *)value forHTTPHeaderField:(NSString *)field { - if (![self isFetching]) { - [self updateRequestValue:value forHTTPHeaderField:field]; - } else { - GTMSESSION_ASSERT_DEBUG(0, @"request may not be set after beginFetch has been invoked"); - } -} - -// Internal method for updating request headers. -- (void)updateRequestValue:(GTM_NULLABLE NSString *)value forHTTPHeaderField:(NSString *)field { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - [_request setValue:value forHTTPHeaderField:field]; - } // @synchronized(self) -} - -- (void)setResponse:(GTM_NULLABLE NSURLResponse *)response { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _response = response; - } // @synchronized(self) -} - -- (int64_t)bodyLength { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_bodyLength == NSURLSessionTransferSizeUnknown) { - if (_bodyData) { - _bodyLength = (int64_t)_bodyData.length; - } else if (_bodyFileURL) { - NSNumber *fileSizeNum = nil; - NSError *fileSizeError = nil; - if ([_bodyFileURL getResourceValue:&fileSizeNum - forKey:NSURLFileSizeKey - error:&fileSizeError]) { - _bodyLength = [fileSizeNum longLongValue]; - } - } - } - return _bodyLength; - } // @synchronized(self) -} - -- (BOOL)useUploadTask { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _useUploadTask; - } // @synchronized(self) -} - -- (void)setUseUploadTask:(BOOL)flag { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (flag != _useUploadTask) { - GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], - @"useUploadTask should not change after beginFetch has been invoked"); - _useUploadTask = flag; - } - } // @synchronized(self) -} - -- (GTM_NULLABLE NSURL *)bodyFileURL { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _bodyFileURL; - } // @synchronized(self) -} - -- (void)setBodyFileURL:(GTM_NULLABLE NSURL *)fileURL { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - // The comparison here is a trivial optimization and forgiveness for any client that - // repeatedly sets the property, so it just uses pointer comparison rather than isEqual:. - if (fileURL != _bodyFileURL) { - GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], - @"fileURL should not change after beginFetch has been invoked"); - - _bodyFileURL = fileURL; - } - } // @synchronized(self) -} - -- (GTM_NULLABLE GTMSessionFetcherBodyStreamProvider)bodyStreamProvider { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _bodyStreamProvider; - } // @synchronized(self) -} - -- (void)setBodyStreamProvider:(GTM_NULLABLE GTMSessionFetcherBodyStreamProvider)block { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], - @"stream provider should not change after beginFetch has been invoked"); - - _bodyStreamProvider = [block copy]; - } // @synchronized(self) -} - -- (GTM_NULLABLE id)authorizer { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _authorizer; - } // @synchronized(self) -} - -- (void)setAuthorizer:(GTM_NULLABLE id)authorizer { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (authorizer != _authorizer) { - if ([self isFetchingUnsynchronized]) { - GTMSESSION_ASSERT_DEBUG(0, @"authorizer should not change after beginFetch has been invoked"); - } else { - _authorizer = authorizer; - } - } - } // @synchronized(self) -} - -- (GTM_NULLABLE NSData *)downloadedData { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _downloadedData; - } // @synchronized(self) -} - -- (void)setDownloadedData:(GTM_NULLABLE NSData *)data { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _downloadedData = [data mutableCopy]; - } // @synchronized(self) -} - -- (int64_t)downloadedLength { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _downloadedLength; - } // @synchronized(self) -} - -- (void)setDownloadedLength:(int64_t)length { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _downloadedLength = length; - } // @synchronized(self) -} - -- (dispatch_queue_t GTM_NONNULL_TYPE)callbackQueue { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _callbackQueue; - } // @synchronized(self) -} - -- (void)setCallbackQueue:(dispatch_queue_t GTM_NULLABLE_TYPE)queue { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _callbackQueue = queue ?: dispatch_get_main_queue(); - } // @synchronized(self) -} - -- (GTM_NULLABLE NSURLSession *)session { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _session; - } // @synchronized(self) -} - -- (NSInteger)servicePriority { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _servicePriority; - } // @synchronized(self) -} - -- (void)setServicePriority:(NSInteger)value { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (value != _servicePriority) { - GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], - @"servicePriority should not change after beginFetch has been invoked"); - - _servicePriority = value; - } - } // @synchronized(self) -} - - -- (void)setSession:(GTM_NULLABLE NSURLSession *)session { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _session = session; - } // @synchronized(self) -} - -- (BOOL)canShareSession { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _canShareSession; - } // @synchronized(self) -} - -- (void)setCanShareSession:(BOOL)flag { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _canShareSession = flag; - } // @synchronized(self) -} - -- (BOOL)useBackgroundSession { - // This reflects if the user requested a background session, not necessarily - // if one was created. That is tracked with _usingBackgroundSession. - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _userRequestedBackgroundSession; - } // @synchronized(self) -} - -- (void)setUseBackgroundSession:(BOOL)flag { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (flag != _userRequestedBackgroundSession) { - GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], - @"useBackgroundSession should not change after beginFetch has been invoked"); - - _userRequestedBackgroundSession = flag; - } - } // @synchronized(self) -} - -- (BOOL)isUsingBackgroundSession { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _usingBackgroundSession; - } // @synchronized(self) -} - -- (void)setUsingBackgroundSession:(BOOL)flag { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _usingBackgroundSession = flag; - } // @synchronized(self) -} - -- (GTM_NULLABLE NSURLSession *)sessionNeedingInvalidation { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _sessionNeedingInvalidation; - } // @synchronized(self) -} - -- (void)setSessionNeedingInvalidation:(GTM_NULLABLE NSURLSession *)session { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _sessionNeedingInvalidation = session; - } // @synchronized(self) -} - -- (NSOperationQueue * GTM_NONNULL_TYPE)sessionDelegateQueue { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _delegateQueue; - } // @synchronized(self) -} - -- (void)setSessionDelegateQueue:(NSOperationQueue * GTM_NULLABLE_TYPE)queue { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (queue != _delegateQueue) { - if ([self isFetchingUnsynchronized]) { - GTMSESSION_ASSERT_DEBUG(0, @"sessionDelegateQueue should not change after fetch begins"); - } else { - _delegateQueue = queue ?: [NSOperationQueue mainQueue]; - } - } - } // @synchronized(self) -} - -- (BOOL)userStoppedFetching { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _userStoppedFetching; - } // @synchronized(self) -} - -- (GTM_NULLABLE id)userData { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _userData; - } // @synchronized(self) -} - -- (void)setUserData:(GTM_NULLABLE id)theObj { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _userData = theObj; - } // @synchronized(self) -} - -- (GTM_NULLABLE NSURL *)destinationFileURL { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _destinationFileURL; - } // @synchronized(self) -} - -- (void)setDestinationFileURL:(GTM_NULLABLE NSURL *)destinationFileURL { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (((_destinationFileURL == nil) && (destinationFileURL == nil)) || - [_destinationFileURL isEqual:destinationFileURL]) { - return; - } - if (_sessionIdentifier) { - // This is something we don't expect to happen in production. - // However if it ever happen, leave a system log. - NSLog(@"%@: Destination File URL changed from (%@) to (%@) after session identifier has " - @"been created.", - [self class], _destinationFileURL, destinationFileURL); -#if DEBUG - // On both the simulator and devices, the path can change to the download file, but the name - // shouldn't change. Technically, this isn't supported in the fetcher, but the change of - // URL is expected to happen only across development runs through Xcode. - NSString *oldFilename = [_destinationFileURL lastPathComponent]; - NSString *newFilename = [destinationFileURL lastPathComponent]; - #pragma unused(oldFilename) - #pragma unused(newFilename) - GTMSESSION_ASSERT_DEBUG([oldFilename isEqualToString:newFilename], - @"Destination File URL cannot be changed after session identifier has been created"); -#endif - } - _destinationFileURL = destinationFileURL; - } // @synchronized(self) -} - -- (void)setProperties:(GTM_NULLABLE NSDictionary *)dict { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _properties = [dict mutableCopy]; - } // @synchronized(self) -} - -- (GTM_NULLABLE NSDictionary *)properties { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _properties; - } // @synchronized(self) -} - -- (void)setProperty:(GTM_NULLABLE id)obj forKey:(NSString *)key { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_properties == nil && obj != nil) { - _properties = [[NSMutableDictionary alloc] init]; - } - [_properties setValue:obj forKey:key]; - } // @synchronized(self) -} - -- (GTM_NULLABLE id)propertyForKey:(NSString *)key { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return [_properties objectForKey:key]; - } // @synchronized(self) -} - -- (void)addPropertiesFromDictionary:(NSDictionary *)dict { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_properties == nil && dict != nil) { - [self setProperties:[dict mutableCopy]]; - } else { - [_properties addEntriesFromDictionary:dict]; - } - } // @synchronized(self) -} - -- (void)setCommentWithFormat:(id)format, ... { -#if !STRIP_GTM_FETCH_LOGGING - NSString *result = format; - if (format) { - va_list argList; - va_start(argList, format); - - result = [[NSString alloc] initWithFormat:format - arguments:argList]; - va_end(argList); - } - [self setComment:result]; -#endif -} - -#if !STRIP_GTM_FETCH_LOGGING -- (NSData *)loggedStreamData { - return _loggedStreamData; -} - -- (void)appendLoggedStreamData:dataToAdd { - if (!_loggedStreamData) { - _loggedStreamData = [NSMutableData data]; - } - [_loggedStreamData appendData:dataToAdd]; -} - -- (void)clearLoggedStreamData { - _loggedStreamData = nil; -} - -- (void)setDeferResponseBodyLogging:(BOOL)deferResponseBodyLogging { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (deferResponseBodyLogging != _deferResponseBodyLogging) { - _deferResponseBodyLogging = deferResponseBodyLogging; - if (!deferResponseBodyLogging && !self.hasLoggedError) { - [_delegateQueue addOperationWithBlock:^{ - [self logNowWithError:nil]; - }]; - } - } - } // @synchronized(self) -} - -- (BOOL)deferResponseBodyLogging { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _deferResponseBodyLogging; - } // @synchronized(self) -} - -#else -+ (void)setLoggingEnabled:(BOOL)flag { -} - -+ (BOOL)isLoggingEnabled { - return NO; -} -#endif // STRIP_GTM_FETCH_LOGGING - -@end - -@implementation GTMSessionFetcher (BackwardsCompatibilityOnly) - -- (void)setCookieStorageMethod:(NSInteger)method { - // For backwards compatibility with the old fetcher, we'll support the old constants. - // - // Clients using the GTMSessionFetcher class should set the cookie storage explicitly - // themselves. - NSHTTPCookieStorage *storage = nil; - switch(method) { - case 0: // kGTMHTTPFetcherCookieStorageMethodStatic - // nil storage will use [[self class] staticCookieStorage] when the fetch begins. - break; - case 1: // kGTMHTTPFetcherCookieStorageMethodFetchHistory - // Do nothing; use whatever was set by the fetcher service. - return; - case 2: // kGTMHTTPFetcherCookieStorageMethodSystemDefault - storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; - break; - case 3: // kGTMHTTPFetcherCookieStorageMethodNone - // Create temporary storage for this fetcher only. - storage = [[GTMSessionCookieStorage alloc] init]; - break; - default: - GTMSESSION_ASSERT_DEBUG(0, @"Invalid cookie storage method: %d", (int)method); - } - self.cookieStorage = storage; -} - -@end - -@implementation GTMSessionCookieStorage { - NSMutableArray *_cookies; - NSHTTPCookieAcceptPolicy _policy; -} - -- (id)init { - self = [super init]; - if (self != nil) { - _cookies = [[NSMutableArray alloc] init]; - } - return self; -} - -- (GTM_NULLABLE NSArray *)cookies { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return [_cookies copy]; - } // @synchronized(self) -} - -- (void)setCookie:(NSHTTPCookie *)cookie { - if (!cookie) return; - if (_policy == NSHTTPCookieAcceptPolicyNever) return; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - [self internalSetCookie:cookie]; - } // @synchronized(self) -} - -// Note: this should only be called from inside a @synchronized(self) block. -- (void)internalSetCookie:(NSHTTPCookie *)newCookie { - GTMSessionCheckSynchronized(self); - - if (_policy == NSHTTPCookieAcceptPolicyNever) return; - - BOOL isValidCookie = (newCookie.name.length > 0 - && newCookie.domain.length > 0 - && newCookie.path.length > 0); - GTMSESSION_ASSERT_DEBUG(isValidCookie, @"invalid cookie: %@", newCookie); - - if (isValidCookie) { - // Remove the cookie if it's currently in the array. - NSHTTPCookie *oldCookie = [self cookieMatchingCookie:newCookie]; - if (oldCookie) { - [_cookies removeObjectIdenticalTo:oldCookie]; - } - - if (![[self class] hasCookieExpired:newCookie]) { - [_cookies addObject:newCookie]; - } - } -} - -// Add all cookies in the new cookie array to the storage, -// replacing stored cookies as appropriate. -// -// Side effect: removes expired cookies from the storage array. -- (void)setCookies:(GTM_NULLABLE NSArray *)newCookies { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - [self removeExpiredCookies]; - - for (NSHTTPCookie *newCookie in newCookies) { - [self internalSetCookie:newCookie]; - } - } // @synchronized(self) -} - -- (void)setCookies:(NSArray *)cookies forURL:(GTM_NULLABLE NSURL *)URL mainDocumentURL:(GTM_NULLABLE NSURL *)mainDocumentURL { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_policy == NSHTTPCookieAcceptPolicyNever) { - return; - } - - if (_policy == NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain) { - NSString *mainHost = mainDocumentURL.host; - NSString *associatedHost = URL.host; - if (!mainHost || ![associatedHost hasSuffix:mainHost]) { - return; - } - } - } // @synchronized(self) - [self setCookies:cookies]; -} - -- (void)deleteCookie:(NSHTTPCookie *)cookie { - if (!cookie) return; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSHTTPCookie *foundCookie = [self cookieMatchingCookie:cookie]; - if (foundCookie) { - [_cookies removeObjectIdenticalTo:foundCookie]; - } - } // @synchronized(self) -} - -// Retrieve all cookies appropriate for the given URL, considering -// domain, path, cookie name, expiration, security setting. -// Side effect: removed expired cookies from the storage array. -- (GTM_NULLABLE NSArray *)cookiesForURL:(NSURL *)theURL { - NSMutableArray *foundCookies = nil; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - [self removeExpiredCookies]; - - // We'll prepend "." to the desired domain, since we want the - // actual domain "nytimes.com" to still match the cookie domain - // ".nytimes.com" when we check it below with hasSuffix. - NSString *host = theURL.host.lowercaseString; - NSString *path = theURL.path; - NSString *scheme = [theURL scheme]; - - NSString *requestingDomain = nil; - BOOL isLocalhostRetrieval = NO; - - if (IsLocalhost(host)) { - isLocalhostRetrieval = YES; - } else { - if (host.length > 0) { - requestingDomain = [@"." stringByAppendingString:host]; - } - } - - for (NSHTTPCookie *storedCookie in _cookies) { - NSString *cookieDomain = storedCookie.domain.lowercaseString; - NSString *cookiePath = storedCookie.path; - BOOL cookieIsSecure = [storedCookie isSecure]; - - BOOL isDomainOK; - - if (isLocalhostRetrieval) { - // Prior to 10.5.6, the domain stored into NSHTTPCookies for localhost - // is "localhost.local" - isDomainOK = (IsLocalhost(cookieDomain) - || [cookieDomain isEqual:@"localhost.local"]); - } else { - // Ensure we're matching exact domain names. We prepended a dot to the - // requesting domain, so we can also prepend one here if needed before - // checking if the request contains the cookie domain. - if (![cookieDomain hasPrefix:@"."]) { - cookieDomain = [@"." stringByAppendingString:cookieDomain]; - } - isDomainOK = [requestingDomain hasSuffix:cookieDomain]; - } - - BOOL isPathOK = [cookiePath isEqual:@"/"] || [path hasPrefix:cookiePath]; - BOOL isSecureOK = (!cookieIsSecure - || [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame); - - if (isDomainOK && isPathOK && isSecureOK) { - if (foundCookies == nil) { - foundCookies = [NSMutableArray array]; - } - [foundCookies addObject:storedCookie]; - } - } - } // @synchronized(self) - return foundCookies; -} - -// Override methods from the NSHTTPCookieStorage (NSURLSessionTaskAdditions) category. -- (void)storeCookies:(NSArray *)cookies forTask:(NSURLSessionTask *)task { - NSURLRequest *currentRequest = task.currentRequest; - [self setCookies:cookies forURL:currentRequest.URL mainDocumentURL:nil]; -} - -- (void)getCookiesForTask:(NSURLSessionTask *)task - completionHandler:(void (^)(GTM_NSArrayOf(NSHTTPCookie *) *))completionHandler { - if (completionHandler) { - NSURLRequest *currentRequest = task.currentRequest; - NSURL *currentRequestURL = currentRequest.URL; - NSArray *cookies = [self cookiesForURL:currentRequestURL]; - completionHandler(cookies); - } -} - -// Return a cookie from the array with the same name, domain, and path as the -// given cookie, or else return nil if none found. -// -// Both the cookie being tested and all cookies in the storage array should -// be valid (non-nil name, domains, paths). -// -// Note: this should only be called from inside a @synchronized(self) block -- (GTM_NULLABLE NSHTTPCookie *)cookieMatchingCookie:(NSHTTPCookie *)cookie { - GTMSessionCheckSynchronized(self); - - NSString *name = cookie.name; - NSString *domain = cookie.domain; - NSString *path = cookie.path; - - GTMSESSION_ASSERT_DEBUG(name && domain && path, - @"Invalid stored cookie (name:%@ domain:%@ path:%@)", name, domain, path); - - for (NSHTTPCookie *storedCookie in _cookies) { - if ([storedCookie.name isEqual:name] - && [storedCookie.domain isEqual:domain] - && [storedCookie.path isEqual:path]) { - return storedCookie; - } - } - return nil; -} - -// Internal routine to remove any expired cookies from the array, excluding -// cookies with nil expirations. -// -// Note: this should only be called from inside a @synchronized(self) block -- (void)removeExpiredCookies { - GTMSessionCheckSynchronized(self); - - // Count backwards since we're deleting items from the array - for (NSInteger idx = (NSInteger)_cookies.count - 1; idx >= 0; idx--) { - NSHTTPCookie *storedCookie = [_cookies objectAtIndex:(NSUInteger)idx]; - if ([[self class] hasCookieExpired:storedCookie]) { - [_cookies removeObjectAtIndex:(NSUInteger)idx]; - } - } -} - -+ (BOOL)hasCookieExpired:(NSHTTPCookie *)cookie { - NSDate *expiresDate = [cookie expiresDate]; - if (expiresDate == nil) { - // Cookies seem to have a Expires property even when the expiresDate method returns nil. - id expiresVal = [[cookie properties] objectForKey:NSHTTPCookieExpires]; - if ([expiresVal isKindOfClass:[NSDate class]]) { - expiresDate = expiresVal; - } - } - BOOL hasExpired = (expiresDate != nil && [expiresDate timeIntervalSinceNow] < 0); - return hasExpired; -} - -- (void)removeAllCookies { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - [_cookies removeAllObjects]; - } // @synchronized(self) -} - -- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _policy; - } // @synchronized(self) -} - -- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)cookieAcceptPolicy { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _policy = cookieAcceptPolicy; - } // @synchronized(self) -} - -@end - -void GTMSessionFetcherAssertValidSelector(id GTM_NULLABLE_TYPE obj, SEL GTM_NULLABLE_TYPE sel, ...) { - // Verify that the object's selector is implemented with the proper - // number and type of arguments -#if DEBUG - va_list argList; - va_start(argList, sel); - - if (obj && sel) { - // Check that the selector is implemented - if (![obj respondsToSelector:sel]) { - NSLog(@"\"%@\" selector \"%@\" is unimplemented or misnamed", - NSStringFromClass([(id)obj class]), - NSStringFromSelector((SEL)sel)); - NSCAssert(0, @"callback selector unimplemented or misnamed"); - } else { - const char *expectedArgType; - unsigned int argCount = 2; // skip self and _cmd - NSMethodSignature *sig = [obj methodSignatureForSelector:sel]; - - // Check that each expected argument is present and of the correct type - while ((expectedArgType = va_arg(argList, const char*)) != 0) { - - if ([sig numberOfArguments] > argCount) { - const char *foundArgType = [sig getArgumentTypeAtIndex:argCount]; - - if (0 != strncmp(foundArgType, expectedArgType, strlen(expectedArgType))) { - NSLog(@"\"%@\" selector \"%@\" argument %d should be type %s", - NSStringFromClass([(id)obj class]), - NSStringFromSelector((SEL)sel), (argCount - 2), expectedArgType); - NSCAssert(0, @"callback selector argument type mistake"); - } - } - argCount++; - } - - // Check that the proper number of arguments are present in the selector - if (argCount != [sig numberOfArguments]) { - NSLog(@"\"%@\" selector \"%@\" should have %d arguments", - NSStringFromClass([(id)obj class]), - NSStringFromSelector((SEL)sel), (argCount - 2)); - NSCAssert(0, @"callback selector arguments incorrect"); - } - } - } - - va_end(argList); -#endif -} - -NSString *GTMFetcherCleanedUserAgentString(NSString *str) { - // Reference http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html - // and http://www-archive.mozilla.org/build/user-agent-strings.html - - if (str == nil) return @""; - - NSMutableString *result = [NSMutableString stringWithString:str]; - - // Replace spaces and commas with underscores - [result replaceOccurrencesOfString:@" " - withString:@"_" - options:0 - range:NSMakeRange(0, result.length)]; - [result replaceOccurrencesOfString:@"," - withString:@"_" - options:0 - range:NSMakeRange(0, result.length)]; - - // Delete http token separators and remaining whitespace - static NSCharacterSet *charsToDelete = nil; - if (charsToDelete == nil) { - // Make a set of unwanted characters - NSString *const kSeparators = @"()<>@;:\\\"/[]?={}"; - - NSMutableCharacterSet *mutableChars = - [[NSCharacterSet whitespaceAndNewlineCharacterSet] mutableCopy]; - [mutableChars addCharactersInString:kSeparators]; - charsToDelete = [mutableChars copy]; // hang on to an immutable copy - } - - while (1) { - NSRange separatorRange = [result rangeOfCharacterFromSet:charsToDelete]; - if (separatorRange.location == NSNotFound) break; - - [result deleteCharactersInRange:separatorRange]; - }; - - return result; -} - -NSString *GTMFetcherSystemVersionString(void) { - static NSString *sSavedSystemString; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - // The Xcode 8 SDKs finally cleaned up this mess by providing TARGET_OS_OSX - // and TARGET_OS_IOS, but to build with older SDKs, those don't exist and - // instead one has to rely on TARGET_OS_MAC (which is true for iOS, watchOS, - // and tvOS) and TARGET_OS_IPHONE (which is true for iOS, watchOS, tvOS). So - // one has to order these carefully so you pick off the specific things - // first. - // If the code can ever assume Xcode 8 or higher (even when building for - // older OSes), then - // TARGET_OS_MAC -> TARGET_OS_OSX - // TARGET_OS_IPHONE -> TARGET_OS_IOS - // TARGET_IPHONE_SIMULATOR -> TARGET_OS_SIMULATOR -#if TARGET_OS_WATCH - // watchOS - WKInterfaceDevice - - WKInterfaceDevice *currentDevice = [WKInterfaceDevice currentDevice]; - - NSString *rawModel = [currentDevice model]; - NSString *model = GTMFetcherCleanedUserAgentString(rawModel); - - NSString *systemVersion = [currentDevice systemVersion]; - -#if TARGET_OS_SIMULATOR - NSString *hardwareModel = @"sim"; -#else - NSString *hardwareModel; - struct utsname unameRecord; - if (uname(&unameRecord) == 0) { - NSString *machineName = @(unameRecord.machine); - hardwareModel = GTMFetcherCleanedUserAgentString(machineName); - } - if (hardwareModel.length == 0) { - hardwareModel = @"unk"; - } -#endif - - sSavedSystemString = [[NSString alloc] initWithFormat:@"%@/%@ hw/%@", - model, systemVersion, hardwareModel]; - // Example: Apple_Watch/3.0 hw/Watch1_2 -#elif TARGET_OS_TV || TARGET_OS_IPHONE - // iOS and tvOS have UIDevice, use that. - UIDevice *currentDevice = [UIDevice currentDevice]; - - NSString *rawModel = [currentDevice model]; - NSString *model = GTMFetcherCleanedUserAgentString(rawModel); - - NSString *systemVersion = [currentDevice systemVersion]; - -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_SIMULATOR - NSString *hardwareModel = @"sim"; -#else - NSString *hardwareModel; - struct utsname unameRecord; - if (uname(&unameRecord) == 0) { - NSString *machineName = @(unameRecord.machine); - hardwareModel = GTMFetcherCleanedUserAgentString(machineName); - } - if (hardwareModel.length == 0) { - hardwareModel = @"unk"; - } -#endif - - sSavedSystemString = [[NSString alloc] initWithFormat:@"%@/%@ hw/%@", - model, systemVersion, hardwareModel]; - // Example: iPod_Touch/2.2 hw/iPod1_1 - // Example: Apple_TV/9.2 hw/AppleTV5,3 -#elif TARGET_OS_MAC - // Mac build - NSProcessInfo *procInfo = [NSProcessInfo processInfo]; -#if !defined(MAC_OS_X_VERSION_10_10) - BOOL hasOperatingSystemVersion = NO; -#elif MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10 - BOOL hasOperatingSystemVersion = - [procInfo respondsToSelector:@selector(operatingSystemVersion)]; -#else - BOOL hasOperatingSystemVersion = YES; -#endif - NSString *versString; - if (hasOperatingSystemVersion) { -#if defined(MAC_OS_X_VERSION_10_10) - // A reference to NSOperatingSystemVersion requires the 10.10 SDK. -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunguarded-availability" -// Disable unguarded availability warning as we can't use the @availability macro until we require -// all clients to build with Xcode 9 or above. - NSOperatingSystemVersion version = procInfo.operatingSystemVersion; -#pragma clang diagnostic pop - versString = [NSString stringWithFormat:@"%zd.%zd.%zd", - version.majorVersion, version.minorVersion, version.patchVersion]; -#else -#pragma unused(procInfo) -#endif - } else { - // With Gestalt inexplicably deprecated in 10.8, we're reduced to reading - // the system plist file. - NSString *const kPath = @"/System/Library/CoreServices/SystemVersion.plist"; - NSDictionary *plist = [NSDictionary dictionaryWithContentsOfFile:kPath]; - versString = [plist objectForKey:@"ProductVersion"]; - if (versString.length == 0) { - versString = @"10.?.?"; - } - } - - sSavedSystemString = [[NSString alloc] initWithFormat:@"MacOSX/%@", versString]; -#elif defined(_SYS_UTSNAME_H) - // Foundation-only build - struct utsname unameRecord; - uname(&unameRecord); - - sSavedSystemString = [NSString stringWithFormat:@"%s/%s", - unameRecord.sysname, unameRecord.release]; // "Darwin/8.11.1" -#else -#error No branch taken for a default user agent -#endif - }); - return sSavedSystemString; -} - -NSString *GTMFetcherStandardUserAgentString(NSBundle * GTM_NULLABLE_TYPE bundle) { - NSString *result = [NSString stringWithFormat:@"%@ %@", - GTMFetcherApplicationIdentifier(bundle), - GTMFetcherSystemVersionString()]; - return result; -} - -NSString *GTMFetcherApplicationIdentifier(NSBundle * GTM_NULLABLE_TYPE bundle) { - @synchronized([GTMSessionFetcher class]) { - static NSMutableDictionary *sAppIDMap = nil; - - // If there's a bundle ID, use that; otherwise, use the process name - if (bundle == nil) { - bundle = [NSBundle mainBundle]; - } - NSString *bundleID = [bundle bundleIdentifier]; - if (bundleID == nil) { - bundleID = @""; - } - - NSString *identifier = [sAppIDMap objectForKey:bundleID]; - if (identifier) return identifier; - - // Apps may add a string to the info.plist to uniquely identify different builds. - identifier = [bundle objectForInfoDictionaryKey:@"GTMUserAgentID"]; - if (identifier.length == 0) { - if (bundleID.length > 0) { - identifier = bundleID; - } else { - // Fall back on the procname, prefixed by "proc" to flag that it's - // autogenerated and perhaps unreliable - NSString *procName = [[NSProcessInfo processInfo] processName]; - identifier = [NSString stringWithFormat:@"proc_%@", procName]; - } - } - - // Clean up whitespace and special characters - identifier = GTMFetcherCleanedUserAgentString(identifier); - - // If there's a version number, append that - NSString *version = [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; - if (version.length == 0) { - version = [bundle objectForInfoDictionaryKey:@"CFBundleVersion"]; - } - - // Clean up whitespace and special characters - version = GTMFetcherCleanedUserAgentString(version); - - // Glue the two together (cleanup done above or else cleanup would strip the - // slash) - if (version.length > 0) { - identifier = [identifier stringByAppendingFormat:@"/%@", version]; - } - - if (sAppIDMap == nil) { - sAppIDMap = [[NSMutableDictionary alloc] init]; - } - [sAppIDMap setObject:identifier forKey:bundleID]; - return identifier; - } -} - -#if DEBUG -@implementation GTMSessionSyncMonitorInternal { - NSValue *_objectKey; // The synchronize target object. - const char *_functionName; // The function containing the monitored sync block. -} - -- (instancetype)initWithSynchronizationObject:(id)object - allowRecursive:(BOOL)allowRecursive - functionName:(const char *)functionName { - self = [super init]; - if (self) { - Class threadKey = [GTMSessionSyncMonitorInternal class]; - _objectKey = [NSValue valueWithNonretainedObject:object]; - _functionName = functionName; - - NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; - NSMutableDictionary *counters = threadDict[threadKey]; - if (counters == nil) { - counters = [NSMutableDictionary dictionary]; - threadDict[(id)threadKey] = counters; - } - NSCountedSet *functionNamesCounter = counters[_objectKey]; - NSUInteger numberOfSyncingFunctions = functionNamesCounter.count; - - if (!allowRecursive) { - BOOL isTopLevelSyncScope = (numberOfSyncingFunctions == 0); - NSArray *stack = [NSThread callStackSymbols]; - GTMSESSION_ASSERT_DEBUG(isTopLevelSyncScope, - @"*** Recursive sync on %@ at %s; previous sync at %@\n%@", - [object class], functionName, functionNamesCounter.allObjects, - [stack subarrayWithRange:NSMakeRange(1, stack.count - 1)]); - } - - if (!functionNamesCounter) { - functionNamesCounter = [NSCountedSet set]; - counters[_objectKey] = functionNamesCounter; - } - [functionNamesCounter addObject:@(functionName)]; - } - return self; -} - -- (void)dealloc { - Class threadKey = [GTMSessionSyncMonitorInternal class]; - - NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; - NSMutableDictionary *counters = threadDict[threadKey]; - NSCountedSet *functionNamesCounter = counters[_objectKey]; - NSString *functionNameStr = @(_functionName); - NSUInteger numberOfSyncsByThisFunction = [functionNamesCounter countForObject:functionNameStr]; - NSArray *stack = [NSThread callStackSymbols]; - GTMSESSION_ASSERT_DEBUG(numberOfSyncsByThisFunction > 0, @"Sync not found on %@ at %s\n%@", - [_objectKey.nonretainedObjectValue class], _functionName, - [stack subarrayWithRange:NSMakeRange(1, stack.count - 1)]); - [functionNamesCounter removeObject:functionNameStr]; - if (functionNamesCounter.count == 0) { - [counters removeObjectForKey:_objectKey]; - } -} - -+ (NSArray *)functionsHoldingSynchronizationOnObject:(id)object { - Class threadKey = [GTMSessionSyncMonitorInternal class]; - NSValue *localObjectKey = [NSValue valueWithNonretainedObject:object]; - - NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; - NSMutableDictionary *counters = threadDict[threadKey]; - NSCountedSet *functionNamesCounter = counters[localObjectKey]; - return functionNamesCounter.count > 0 ? functionNamesCounter.allObjects : nil; -} -@end -#endif // DEBUG -GTM_ASSUME_NONNULL_END diff --git a/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h b/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h deleted file mode 100644 index bc0a65c0a..000000000 --- a/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright 2014 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "GTMSessionFetcher.h" - -// GTM HTTP Logging -// -// All traffic using GTMSessionFetcher can be easily logged. Call -// -// [GTMSessionFetcher setLoggingEnabled:YES]; -// -// to begin generating log files. -// -// Log files are put into a folder on the desktop called "GTMHTTPDebugLogs" -// unless another directory is specified with +setLoggingDirectory. -// -// In the iPhone simulator, the default logs location is the user's home -// directory in ~/Library/Application Support. On the iPhone device, the -// default logs location is the application's documents directory on the device. -// -// Tip: use the Finder's "Sort By Date" to find the most recent logs. -// -// Each run of an application gets a separate set of log files. An html -// file is generated to simplify browsing the run's http transactions. -// The html file includes javascript links for inline viewing of uploaded -// and downloaded data. -// -// A symlink is created in the logs folder to simplify finding the html file -// for the latest run of the application; the symlink is called -// -// AppName_http_log_newest.html -// -// For better viewing of XML logs, use Camino or Firefox rather than Safari. -// -// Each fetcher may be given a comment to be inserted as a label in the logs, -// such as -// [fetcher setCommentWithFormat:@"retrieve item %@", itemName]; -// -// Projects may define STRIP_GTM_FETCH_LOGGING to remove logging code. - -#if !STRIP_GTM_FETCH_LOGGING - -@interface GTMSessionFetcher (GTMSessionFetcherLogging) - -// Note: the default logs directory is ~/Desktop/GTMHTTPDebugLogs; it will be -// created as needed. If a custom directory is set, the directory should -// already exist. -+ (void)setLoggingDirectory:(NSString *)path; -+ (NSString *)loggingDirectory; - -// client apps can turn logging on and off -+ (void)setLoggingEnabled:(BOOL)isLoggingEnabled; -+ (BOOL)isLoggingEnabled; - -// client apps can turn off logging to a file if they want to only check -// the fetcher's log property -+ (void)setLoggingToFileEnabled:(BOOL)isLoggingToFileEnabled; -+ (BOOL)isLoggingToFileEnabled; - -// client apps can optionally specify process name and date string used in -// log file names -+ (void)setLoggingProcessName:(NSString *)processName; -+ (NSString *)loggingProcessName; - -+ (void)setLoggingDateStamp:(NSString *)dateStamp; -+ (NSString *)loggingDateStamp; - -// client apps can specify the directory for the log for this specific run, -// typically to match the directory used by another fetcher class, like: -// -// [GTMSessionFetcher setLogDirectoryForCurrentRun:[GTMHTTPFetcher logDirectoryForCurrentRun]]; -// -// Setting this overrides the logging directory, process name, and date stamp when writing -// the log file. -+ (void)setLogDirectoryForCurrentRun:(NSString *)logDirectoryForCurrentRun; -+ (NSString *)logDirectoryForCurrentRun; - -// Prunes old log directories that have not been modified since the provided date. -// This will not delete the current run's log directory. -+ (void)deleteLogDirectoriesOlderThanDate:(NSDate *)date; - -// internal; called by fetcher -- (void)logFetchWithError:(NSError *)error; -- (NSInputStream *)loggedInputStreamForInputStream:(NSInputStream *)inputStream; -- (GTMSessionFetcherBodyStreamProvider)loggedStreamProviderForStreamProvider: - (GTMSessionFetcherBodyStreamProvider)streamProvider; - -// internal; accessors useful for viewing logs -+ (NSString *)processNameLogPrefix; -+ (NSString *)symlinkNameSuffix; -+ (NSString *)htmlFileName; - -@end - -#endif // !STRIP_GTM_FETCH_LOGGING diff --git a/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m b/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m deleted file mode 100644 index 02b46b608..000000000 --- a/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m +++ /dev/null @@ -1,976 +0,0 @@ -/* Copyright 2014 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -#include -#include - -#import "GTMSessionFetcherLogging.h" - -#ifndef STRIP_GTM_FETCH_LOGGING - #error GTMSessionFetcher headers should have defaulted this if it wasn't already defined. -#endif - -#if !STRIP_GTM_FETCH_LOGGING - -// Sensitive credential strings are replaced in logs with _snip_ -// -// Apps that must see the contents of sensitive tokens can set this to 1 -#ifndef SKIP_GTM_FETCH_LOGGING_SNIPPING -#define SKIP_GTM_FETCH_LOGGING_SNIPPING 0 -#endif - -// If GTMReadMonitorInputStream is available, it can be used for -// capturing uploaded streams of data -// -// We locally declare methods of GTMReadMonitorInputStream so we -// do not need to import the header, as some projects may not have it available -#if !GTMSESSION_BUILD_COMBINED_SOURCES -@interface GTMReadMonitorInputStream : NSInputStream - -+ (instancetype)inputStreamWithStream:(NSInputStream *)input; - -@property (assign) id readDelegate; -@property (assign) SEL readSelector; - -@end -#else -@class GTMReadMonitorInputStream; -#endif // !GTMSESSION_BUILD_COMBINED_SOURCES - -@interface GTMSessionFetcher (GTMHTTPFetcherLoggingUtilities) - -+ (NSString *)headersStringForDictionary:(NSDictionary *)dict; -+ (NSString *)snipSubstringOfString:(NSString *)originalStr - betweenStartString:(NSString *)startStr - endString:(NSString *)endStr; -- (void)inputStream:(GTMReadMonitorInputStream *)stream - readIntoBuffer:(void *)buffer - length:(int64_t)length; - -@end - -@implementation GTMSessionFetcher (GTMSessionFetcherLogging) - -// fetchers come and fetchers go, but statics are forever -static BOOL gIsLoggingEnabled = NO; -static BOOL gIsLoggingToFile = YES; -static NSString *gLoggingDirectoryPath = nil; -static NSString *gLogDirectoryForCurrentRun = nil; -static NSString *gLoggingDateStamp = nil; -static NSString *gLoggingProcessName = nil; - -+ (void)setLoggingDirectory:(NSString *)path { - gLoggingDirectoryPath = [path copy]; -} - -+ (NSString *)loggingDirectory { - if (!gLoggingDirectoryPath) { - NSArray *paths = nil; -#if TARGET_IPHONE_SIMULATOR - // default to a directory called GTMHTTPDebugLogs into a sandbox-safe - // directory that a developer can find easily, the application home - paths = @[ NSHomeDirectory() ]; -#elif TARGET_OS_IPHONE - // Neither ~/Desktop nor ~/Home is writable on an actual iOS, watchOS, or tvOS device. - // Put it in ~/Documents. - paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -#else - // default to a directory called GTMHTTPDebugLogs in the desktop folder - paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES); -#endif - - NSString *desktopPath = paths.firstObject; - if (desktopPath) { - NSString *const kGTMLogFolderName = @"GTMHTTPDebugLogs"; - NSString *logsFolderPath = [desktopPath stringByAppendingPathComponent:kGTMLogFolderName]; - - NSFileManager *fileMgr = [NSFileManager defaultManager]; - BOOL isDir; - BOOL doesFolderExist = [fileMgr fileExistsAtPath:logsFolderPath isDirectory:&isDir]; - if (!doesFolderExist) { - // make the directory - doesFolderExist = [fileMgr createDirectoryAtPath:logsFolderPath - withIntermediateDirectories:YES - attributes:nil - error:NULL]; - } - if (doesFolderExist) { - // it's there; store it in the global - gLoggingDirectoryPath = [logsFolderPath copy]; - } - } - } - return gLoggingDirectoryPath; -} - -+ (void)setLogDirectoryForCurrentRun:(NSString *)logDirectoryForCurrentRun { - // Set the path for this run's logs. - gLogDirectoryForCurrentRun = [logDirectoryForCurrentRun copy]; -} - -+ (NSString *)logDirectoryForCurrentRun { - // make a directory for this run's logs, like SyncProto_logs_10-16_01-56-58PM - if (gLogDirectoryForCurrentRun) return gLogDirectoryForCurrentRun; - - NSString *parentDir = [self loggingDirectory]; - NSString *logNamePrefix = [self processNameLogPrefix]; - NSString *dateStamp = [self loggingDateStamp]; - NSString *dirName = [NSString stringWithFormat:@"%@%@", logNamePrefix, dateStamp]; - NSString *logDirectory = [parentDir stringByAppendingPathComponent:dirName]; - - if (gIsLoggingToFile) { - NSFileManager *fileMgr = [NSFileManager defaultManager]; - // Be sure that the first time this app runs, it's not writing to a preexisting folder - static BOOL gShouldReuseFolder = NO; - if (!gShouldReuseFolder) { - gShouldReuseFolder = YES; - NSString *origLogDir = logDirectory; - for (int ctr = 2; ctr < 20; ++ctr) { - if (![fileMgr fileExistsAtPath:logDirectory]) break; - - // append a digit - logDirectory = [origLogDir stringByAppendingFormat:@"_%d", ctr]; - } - } - if (![fileMgr createDirectoryAtPath:logDirectory - withIntermediateDirectories:YES - attributes:nil - error:NULL]) return nil; - } - gLogDirectoryForCurrentRun = logDirectory; - - return gLogDirectoryForCurrentRun; -} - -+ (void)setLoggingEnabled:(BOOL)isLoggingEnabled { - gIsLoggingEnabled = isLoggingEnabled; -} - -+ (BOOL)isLoggingEnabled { - return gIsLoggingEnabled; -} - -+ (void)setLoggingToFileEnabled:(BOOL)isLoggingToFileEnabled { - gIsLoggingToFile = isLoggingToFileEnabled; -} - -+ (BOOL)isLoggingToFileEnabled { - return gIsLoggingToFile; -} - -+ (void)setLoggingProcessName:(NSString *)processName { - gLoggingProcessName = [processName copy]; -} - -+ (NSString *)loggingProcessName { - // get the process name (once per run) replacing spaces with underscores - if (!gLoggingProcessName) { - NSString *procName = [[NSProcessInfo processInfo] processName]; - gLoggingProcessName = [procName stringByReplacingOccurrencesOfString:@" " withString:@"_"]; - } - return gLoggingProcessName; -} - -+ (void)setLoggingDateStamp:(NSString *)dateStamp { - gLoggingDateStamp = [dateStamp copy]; -} - -+ (NSString *)loggingDateStamp { - // We'll pick one date stamp per run, so a run that starts at a later second - // will get a unique results html file - if (!gLoggingDateStamp) { - // produce a string like 08-21_01-41-23PM - - NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; - [formatter setFormatterBehavior:NSDateFormatterBehavior10_4]; - [formatter setDateFormat:@"M-dd_hh-mm-ssa"]; - - gLoggingDateStamp = [formatter stringFromDate:[NSDate date]]; - } - return gLoggingDateStamp; -} - -+ (NSString *)processNameLogPrefix { - static NSString *gPrefix = nil; - if (!gPrefix) { - NSString *processName = [self loggingProcessName]; - gPrefix = [[NSString alloc] initWithFormat:@"%@_log_", processName]; - } - return gPrefix; -} - -+ (NSString *)symlinkNameSuffix { - return @"_log_newest.html"; -} - -+ (NSString *)htmlFileName { - return @"aperçu_http_log.html"; -} - -+ (void)deleteLogDirectoriesOlderThanDate:(NSDate *)cutoffDate { - NSFileManager *fileMgr = [NSFileManager defaultManager]; - NSURL *parentDir = [NSURL fileURLWithPath:[[self class] loggingDirectory]]; - NSURL *logDirectoryForCurrentRun = - [NSURL fileURLWithPath:[[self class] logDirectoryForCurrentRun]]; - NSError *error; - NSArray *contents = [fileMgr contentsOfDirectoryAtURL:parentDir - includingPropertiesForKeys:@[ NSURLContentModificationDateKey ] - options:0 - error:&error]; - for (NSURL *itemURL in contents) { - if ([itemURL isEqual:logDirectoryForCurrentRun]) continue; - - NSDate *modDate; - if ([itemURL getResourceValue:&modDate - forKey:NSURLContentModificationDateKey - error:&error]) { - if ([modDate compare:cutoffDate] == NSOrderedAscending) { - if (![fileMgr removeItemAtURL:itemURL error:&error]) { - NSLog(@"deleteLogDirectoriesOlderThanDate failed to delete %@: %@", - itemURL.path, error); - } - } - } else { - NSLog(@"deleteLogDirectoriesOlderThanDate failed to get mod date of %@: %@", - itemURL.path, error); - } - } -} - -// formattedStringFromData returns a prettyprinted string for XML or JSON input, -// and a plain string for other input data -- (NSString *)formattedStringFromData:(NSData *)inputData - contentType:(NSString *)contentType - JSON:(NSDictionary **)outJSON { - if (!inputData) return nil; - - // if the content type is JSON and we have the parsing class available, use that - if ([contentType hasPrefix:@"application/json"] && inputData.length > 5) { - // convert from JSON string to NSObjects and back to a formatted string - NSMutableDictionary *obj = [NSJSONSerialization JSONObjectWithData:inputData - options:NSJSONReadingMutableContainers - error:NULL]; - if (obj) { - if (outJSON) *outJSON = obj; - if ([obj isKindOfClass:[NSMutableDictionary class]]) { - // for security and privacy, omit OAuth 2 response access and refresh tokens - if ([obj valueForKey:@"refresh_token"] != nil) { - [obj setObject:@"_snip_" forKey:@"refresh_token"]; - } - if ([obj valueForKey:@"access_token"] != nil) { - [obj setObject:@"_snip_" forKey:@"access_token"]; - } - } - NSData *data = [NSJSONSerialization dataWithJSONObject:obj - options:NSJSONWritingPrettyPrinted - error:NULL]; - if (data) { - NSString *jsonStr = [[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding]; - return jsonStr; - } - } - } - -#if !TARGET_OS_IPHONE && !GTM_SKIP_LOG_XMLFORMAT - // verify that this data starts with the bytes indicating XML - - NSString *const kXMLLintPath = @"/usr/bin/xmllint"; - static BOOL gHasCheckedAvailability = NO; - static BOOL gIsXMLLintAvailable = NO; - - if (!gHasCheckedAvailability) { - gIsXMLLintAvailable = [[NSFileManager defaultManager] fileExistsAtPath:kXMLLintPath]; - gHasCheckedAvailability = YES; - } - if (gIsXMLLintAvailable - && inputData.length > 5 - && strncmp(inputData.bytes, " 0) { - // success - inputData = formattedData; - } - } -#else - // we can't call external tasks on the iPhone; leave the XML unformatted -#endif - - NSString *dataStr = [[NSString alloc] initWithData:inputData - encoding:NSUTF8StringEncoding]; - return dataStr; -} - -// stringFromStreamData creates a string given the supplied data -// -// If NSString can create a UTF-8 string from the data, then that is returned. -// -// Otherwise, this routine tries to find a MIME boundary at the beginning of the data block, and -// uses that to break up the data into parts. Each part will be used to try to make a UTF-8 string. -// For parts that fail, a replacement string showing the part header and <> is supplied -// in place of the binary data. - -- (NSString *)stringFromStreamData:(NSData *)data - contentType:(NSString *)contentType { - - if (!data) return nil; - - // optimistically, see if the whole data block is UTF-8 - NSString *streamDataStr = [self formattedStringFromData:data - contentType:contentType - JSON:NULL]; - if (streamDataStr) return streamDataStr; - - // Munge a buffer by replacing non-ASCII bytes with underscores, and turn that munged buffer an - // NSString. That gives us a string we can use with NSScanner. - NSMutableData *mutableData = [NSMutableData dataWithData:data]; - unsigned char *bytes = (unsigned char *)mutableData.mutableBytes; - - for (unsigned int idx = 0; idx < mutableData.length; ++idx) { - if (bytes[idx] > 0x7F || bytes[idx] == 0) { - bytes[idx] = '_'; - } - } - - NSString *mungedStr = [[NSString alloc] initWithData:mutableData - encoding:NSUTF8StringEncoding]; - if (mungedStr) { - - // scan for the boundary string - NSString *boundary = nil; - NSScanner *scanner = [NSScanner scannerWithString:mungedStr]; - - if ([scanner scanUpToString:@"\r\n" intoString:&boundary] - && [boundary hasPrefix:@"--"]) { - - // we found a boundary string; use it to divide the string into parts - NSArray *mungedParts = [mungedStr componentsSeparatedByString:boundary]; - - // look at each munged part in the original string, and try to convert those into UTF-8 - NSMutableArray *origParts = [NSMutableArray array]; - NSUInteger offset = 0; - for (NSString *mungedPart in mungedParts) { - NSUInteger partSize = mungedPart.length; - NSData *origPartData = [data subdataWithRange:NSMakeRange(offset, partSize)]; - NSString *origPartStr = [[NSString alloc] initWithData:origPartData - encoding:NSUTF8StringEncoding]; - if (origPartStr) { - // we could make this original part into UTF-8; use the string - [origParts addObject:origPartStr]; - } else { - // this part can't be made into UTF-8; scan the header, if we can - NSString *header = nil; - NSScanner *headerScanner = [NSScanner scannerWithString:mungedPart]; - if (![headerScanner scanUpToString:@"\r\n\r\n" intoString:&header]) { - // we couldn't find a header - header = @""; - } - // make a part string with the header and <> - NSString *binStr = [NSString stringWithFormat:@"\r%@\r<<%lu bytes>>\r", - header, (long)(partSize - header.length)]; - [origParts addObject:binStr]; - } - offset += partSize + boundary.length; - } - // rejoin the original parts - streamDataStr = [origParts componentsJoinedByString:boundary]; - } - } - if (!streamDataStr) { - // give up; just make a string showing the uploaded bytes - streamDataStr = [NSString stringWithFormat:@"<<%u bytes>>", (unsigned int)data.length]; - } - return streamDataStr; -} - -// logFetchWithError is called following a successful or failed fetch attempt -// -// This method does all the work for appending to and creating log files - -- (void)logFetchWithError:(NSError *)error { - if (![[self class] isLoggingEnabled]) return; - NSString *logDirectory = [[self class] logDirectoryForCurrentRun]; - if (!logDirectory) return; - NSString *processName = [[self class] loggingProcessName]; - - // TODO: add Javascript to display response data formatted in hex - - // each response's NSData goes into its own xml or txt file, though all responses for this run of - // the app share a main html file. This counter tracks all fetch responses for this app run. - // - // we'll use a local variable since this routine may be reentered while waiting for XML formatting - // to be completed by an external task - static int gResponseCounter = 0; - int responseCounter = ++gResponseCounter; - - NSURLResponse *response = [self response]; - NSDictionary *responseHeaders = [self responseHeaders]; - NSString *responseDataStr = nil; - NSDictionary *responseJSON = nil; - - // if there's response data, decide what kind of file to put it in based on the first bytes of the - // file or on the mime type supplied by the server - NSString *responseMIMEType = [response MIMEType]; - BOOL isResponseImage = NO; - - // file name for an image data file - NSString *responseDataFileName = nil; - - int64_t responseDataLength = self.downloadedLength; - if (responseDataLength > 0) { - NSData *downloadedData = self.downloadedData; - if (downloadedData == nil - && responseDataLength > 0 - && responseDataLength < 20000 - && self.destinationFileURL) { - // There's a download file that's not too big, so get the data to display from the downloaded - // file. - NSURL *destinationURL = self.destinationFileURL; - downloadedData = [NSData dataWithContentsOfURL:destinationURL]; - } - NSString *responseType = [responseHeaders valueForKey:@"Content-Type"]; - responseDataStr = [self formattedStringFromData:downloadedData - contentType:responseType - JSON:&responseJSON]; - NSString *responseDataExtn = nil; - NSData *dataToWrite = nil; - if (responseDataStr) { - // we were able to make a UTF-8 string from the response data - if ([responseMIMEType isEqual:@"application/atom+xml"] - || [responseMIMEType hasSuffix:@"/xml"]) { - responseDataExtn = @"xml"; - dataToWrite = [responseDataStr dataUsingEncoding:NSUTF8StringEncoding]; - } - } else if ([responseMIMEType isEqual:@"image/jpeg"]) { - responseDataExtn = @"jpg"; - dataToWrite = downloadedData; - isResponseImage = YES; - } else if ([responseMIMEType isEqual:@"image/gif"]) { - responseDataExtn = @"gif"; - dataToWrite = downloadedData; - isResponseImage = YES; - } else if ([responseMIMEType isEqual:@"image/png"]) { - responseDataExtn = @"png"; - dataToWrite = downloadedData; - isResponseImage = YES; - } else { - // add more non-text types here - } - // if we have an extension, save the raw data in a file with that extension - if (responseDataExtn && dataToWrite) { - // generate a response file base name like - NSString *responseBaseName = [NSString stringWithFormat:@"fetch_%d_response", responseCounter]; - responseDataFileName = [responseBaseName stringByAppendingPathExtension:responseDataExtn]; - NSString *responseDataFilePath = [logDirectory stringByAppendingPathComponent:responseDataFileName]; - - NSError *downloadedError = nil; - if (gIsLoggingToFile && ![dataToWrite writeToFile:responseDataFilePath - options:0 - error:&downloadedError]) { - NSLog(@"%@ logging write error:%@ (%@)", [self class], downloadedError, responseDataFileName); - } - } - } - // we'll have one main html file per run of the app - NSString *htmlName = [[self class] htmlFileName]; - NSString *htmlPath =[logDirectory stringByAppendingPathComponent:htmlName]; - - // if the html file exists (from logging previous fetches) we don't need - // to re-write the header or the scripts - NSFileManager *fileMgr = [NSFileManager defaultManager]; - BOOL didFileExist = [fileMgr fileExistsAtPath:htmlPath]; - - NSMutableString* outputHTML = [NSMutableString string]; - - // we need a header to say we'll have UTF-8 text - if (!didFileExist) { - [outputHTML appendFormat:@"%@ HTTP fetch log %@", - processName, [[self class] loggingDateStamp]]; - } - // now write the visible html elements - NSString *copyableFileName = [NSString stringWithFormat:@"fetch_%d.txt", responseCounter]; - - NSDate *now = [NSDate date]; - // write the date & time, the comment, and the link to the plain-text (copyable) log - [outputHTML appendFormat:@"%@      ", now]; - - NSString *comment = [self comment]; - if (comment.length > 0) { - [outputHTML appendFormat:@"%@      ", comment]; - } - [outputHTML appendFormat:@"request/response log
", copyableFileName]; - NSTimeInterval elapsed = -self.initialBeginFetchDate.timeIntervalSinceNow; - [outputHTML appendFormat:@"elapsed: %5.3fsec
", elapsed]; - - // write the request URL - NSURLRequest *request = self.request; - NSString *requestMethod = request.HTTPMethod; - NSURL *requestURL = request.URL; - - // Save the request URL for next time in case this redirects. - NSString *redirectedFromURLString = [self.redirectedFromURL absoluteString]; - self.redirectedFromURL = [requestURL copy]; - if (redirectedFromURLString) { - [outputHTML appendFormat:@"redirected from %@
", - redirectedFromURLString]; - } - [outputHTML appendFormat:@"request: %@ %@
\n", requestMethod, requestURL]; - - // write the request headers - NSDictionary *requestHeaders = request.allHTTPHeaderFields; - NSUInteger numberOfRequestHeaders = requestHeaders.count; - if (numberOfRequestHeaders > 0) { - // Indicate if the request is authorized; warn if the request is authorized but non-SSL - NSString *auth = [requestHeaders objectForKey:@"Authorization"]; - NSString *headerDetails = @""; - if (auth) { - BOOL isInsecure = [[requestURL scheme] isEqual:@"http"]; - if (isInsecure) { - // 26A0 = ⚠ - headerDetails = - @"   authorized, non-SSL "; - } else { - headerDetails = @"   authorized"; - } - } - NSString *cookiesHdr = [requestHeaders objectForKey:@"Cookie"]; - if (cookiesHdr) { - headerDetails = [headerDetails stringByAppendingString:@"   cookies"]; - } - NSString *matchHdr = [requestHeaders objectForKey:@"If-Match"]; - if (matchHdr) { - headerDetails = [headerDetails stringByAppendingString:@"   if-match"]; - } - matchHdr = [requestHeaders objectForKey:@"If-None-Match"]; - if (matchHdr) { - headerDetails = [headerDetails stringByAppendingString:@"   if-none-match"]; - } - [outputHTML appendFormat:@"   headers: %d %@
", - (int)numberOfRequestHeaders, headerDetails]; - } else { - [outputHTML appendFormat:@"   headers: none
"]; - } - // write the request post data - NSData *bodyData = nil; - NSData *loggedStreamData = self.loggedStreamData; - if (loggedStreamData) { - bodyData = loggedStreamData; - } else { - bodyData = self.bodyData; - if (bodyData == nil) { - bodyData = self.request.HTTPBody; - } - } - uint64_t bodyDataLength = bodyData.length; - - if (bodyData.length == 0) { - // If the data is in a body upload file URL, read that in if it's not huge. - NSURL *bodyFileURL = self.bodyFileURL; - if (bodyFileURL) { - NSNumber *fileSizeNum = nil; - NSError *fileSizeError = nil; - if ([bodyFileURL getResourceValue:&fileSizeNum - forKey:NSURLFileSizeKey - error:&fileSizeError]) { - bodyDataLength = [fileSizeNum unsignedLongLongValue]; - if (bodyDataLength > 0 && bodyDataLength < 50000) { - bodyData = [NSData dataWithContentsOfURL:bodyFileURL - options:NSDataReadingUncached - error:&fileSizeError]; - } - } - } - } - NSString *bodyDataStr = nil; - NSString *postType = [requestHeaders valueForKey:@"Content-Type"]; - - if (bodyDataLength > 0) { - [outputHTML appendFormat:@"   data: %llu bytes, %@
\n", - bodyDataLength, postType ? postType : @"(no type)"]; - NSString *logRequestBody = self.logRequestBody; - if (logRequestBody) { - bodyDataStr = [logRequestBody copy]; - self.logRequestBody = nil; - } else { - bodyDataStr = [self stringFromStreamData:bodyData - contentType:postType]; - if (bodyDataStr) { - // remove OAuth 2 client secret and refresh token - bodyDataStr = [[self class] snipSubstringOfString:bodyDataStr - betweenStartString:@"client_secret=" - endString:@"&"]; - bodyDataStr = [[self class] snipSubstringOfString:bodyDataStr - betweenStartString:@"refresh_token=" - endString:@"&"]; - // remove ClientLogin password - bodyDataStr = [[self class] snipSubstringOfString:bodyDataStr - betweenStartString:@"&Passwd=" - endString:@"&"]; - } - } - } else { - // no post data - } - // write the response status, MIME type, URL - NSInteger status = [self statusCode]; - if (response) { - NSString *statusString = @""; - if (status != 0) { - if (status == 200 || status == 201) { - statusString = [NSString stringWithFormat:@"%ld", (long)status]; - - // report any JSON-RPC error - if ([responseJSON isKindOfClass:[NSDictionary class]]) { - NSDictionary *jsonError = [responseJSON objectForKey:@"error"]; - if ([jsonError isKindOfClass:[NSDictionary class]]) { - NSString *jsonCode = [[jsonError valueForKey:@"code"] description]; - NSString *jsonMessage = [jsonError valueForKey:@"message"]; - if (jsonCode || jsonMessage) { - // 2691 = ⚑ - NSString *const jsonErrFmt = - @"   JSON error: %@ %@  ⚑"; - statusString = [statusString stringByAppendingFormat:jsonErrFmt, - jsonCode ? jsonCode : @"", - jsonMessage ? jsonMessage : @""]; - } - } - } - } else { - // purple for anything other than 200 or 201 - NSString *flag = status >= 400 ? @" ⚑" : @""; // 2691 = ⚑ - NSString *explanation = [NSHTTPURLResponse localizedStringForStatusCode:status]; - NSString *const statusFormat = @"%ld %@ %@"; - statusString = [NSString stringWithFormat:statusFormat, (long)status, explanation, flag]; - } - } - // show the response URL only if it's different from the request URL - NSString *responseURLStr = @""; - NSURL *responseURL = response.URL; - - if (responseURL && ![responseURL isEqual:request.URL]) { - NSString *const responseURLFormat = - @"response URL: %@
\n"; - responseURLStr = [NSString stringWithFormat:responseURLFormat, [responseURL absoluteString]]; - } - [outputHTML appendFormat:@"response:  status %@
\n%@", - statusString, responseURLStr]; - // Write the response headers - NSUInteger numberOfResponseHeaders = responseHeaders.count; - if (numberOfResponseHeaders > 0) { - // Indicate if the server is setting cookies - NSString *cookiesSet = [responseHeaders valueForKey:@"Set-Cookie"]; - NSString *cookiesStr = - cookiesSet ? @"  sets cookies" : @""; - // Indicate if the server is redirecting - NSString *location = [responseHeaders valueForKey:@"Location"]; - BOOL isRedirect = status >= 300 && status <= 399 && location != nil; - NSString *redirectsStr = - isRedirect ? @"  redirects" : @""; - [outputHTML appendFormat:@"   headers: %d %@ %@
\n", - (int)numberOfResponseHeaders, cookiesStr, redirectsStr]; - } else { - [outputHTML appendString:@"   headers: none
\n"]; - } - } - // error - if (error) { - [outputHTML appendFormat:@"Error: %@
\n", error.description]; - } - // Write the response data - if (responseDataFileName) { - if (isResponseImage) { - // Make a small inline image that links to the full image file - [outputHTML appendFormat:@"   data: %lld bytes, %@
", - responseDataLength, responseMIMEType]; - NSString *const fmt = - @"image\n"; - [outputHTML appendFormat:fmt, responseDataFileName, responseDataFileName]; - } else { - // The response data was XML; link to the xml file - NSString *const fmt = - @"   data: %lld bytes, %@   %@\n"; - [outputHTML appendFormat:fmt, responseDataLength, responseMIMEType, - responseDataFileName, [responseDataFileName pathExtension]]; - } - } else { - // The response data was not an image; just show the length and MIME type - [outputHTML appendFormat:@"   data: %lld bytes, %@\n", - responseDataLength, responseMIMEType ? responseMIMEType : @"(no response type)"]; - } - // Make a single string of the request and response, suitable for copying - // to the clipboard and pasting into a bug report - NSMutableString *copyable = [NSMutableString string]; - if (comment) { - [copyable appendFormat:@"%@\n\n", comment]; - } - [copyable appendFormat:@"%@ elapsed: %5.3fsec\n", now, elapsed]; - if (redirectedFromURLString) { - [copyable appendFormat:@"Redirected from %@\n", redirectedFromURLString]; - } - [copyable appendFormat:@"Request: %@ %@\n", requestMethod, requestURL]; - if (requestHeaders.count > 0) { - [copyable appendFormat:@"Request headers:\n%@\n", - [[self class] headersStringForDictionary:requestHeaders]]; - } - if (bodyDataLength > 0) { - [copyable appendFormat:@"Request body: (%llu bytes)\n", bodyDataLength]; - if (bodyDataStr) { - [copyable appendFormat:@"%@\n", bodyDataStr]; - } - [copyable appendString:@"\n"]; - } - if (response) { - [copyable appendFormat:@"Response: status %d\n", (int) status]; - [copyable appendFormat:@"Response headers:\n%@\n", - [[self class] headersStringForDictionary:responseHeaders]]; - [copyable appendFormat:@"Response body: (%lld bytes)\n", responseDataLength]; - if (responseDataLength > 0) { - NSString *logResponseBody = self.logResponseBody; - if (logResponseBody) { - // The user has provided the response body text. - responseDataStr = [logResponseBody copy]; - self.logResponseBody = nil; - } - if (responseDataStr != nil) { - [copyable appendFormat:@"%@\n", responseDataStr]; - } else { - // Even though it's redundant, we'll put in text to indicate that all the bytes are binary. - if (self.destinationFileURL) { - [copyable appendFormat:@"<<%lld bytes>> to file %@\n", - responseDataLength, self.destinationFileURL.path]; - } else { - [copyable appendFormat:@"<<%lld bytes>>\n", responseDataLength]; - } - } - } - } - if (error) { - [copyable appendFormat:@"Error: %@\n", error]; - } - // Save to log property before adding the separator - self.log = copyable; - - [copyable appendString:@"-----------------------------------------------------------\n"]; - - // Write the copyable version to another file (linked to at the top of the html file, above) - // - // Ideally, something to just copy this to the clipboard like - // Copy here." - // would work everywhere, but it only works in Safari as of 8/2010 - if (gIsLoggingToFile) { - NSString *parentDir = [[self class] loggingDirectory]; - NSString *copyablePath = [logDirectory stringByAppendingPathComponent:copyableFileName]; - NSError *copyableError = nil; - if (![copyable writeToFile:copyablePath - atomically:NO - encoding:NSUTF8StringEncoding - error:©ableError]) { - // Error writing to file - NSLog(@"%@ logging write error:%@ (%@)", [self class], copyableError, copyablePath); - } - [outputHTML appendString:@"

"]; - - // Append the HTML to the main output file - const char* htmlBytes = outputHTML.UTF8String; - NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:htmlPath - append:YES]; - [stream open]; - [stream write:(const uint8_t *) htmlBytes maxLength:strlen(htmlBytes)]; - [stream close]; - - // Make a symlink to the latest html - NSString *const symlinkNameSuffix = [[self class] symlinkNameSuffix]; - NSString *symlinkName = [processName stringByAppendingString:symlinkNameSuffix]; - NSString *symlinkPath = [parentDir stringByAppendingPathComponent:symlinkName]; - - [fileMgr removeItemAtPath:symlinkPath error:NULL]; - [fileMgr createSymbolicLinkAtPath:symlinkPath - withDestinationPath:htmlPath - error:NULL]; -#if TARGET_OS_IPHONE - static BOOL gReportedLoggingPath = NO; - if (!gReportedLoggingPath) { - gReportedLoggingPath = YES; - NSLog(@"GTMSessionFetcher logging to \"%@\"", parentDir); - } -#endif - } -} - -- (NSInputStream *)loggedInputStreamForInputStream:(NSInputStream *)inputStream { - if (!inputStream) return nil; - if (![GTMSessionFetcher isLoggingEnabled]) return inputStream; - - [self clearLoggedStreamData]; // Clear any previous data. - Class monitorClass = NSClassFromString(@"GTMReadMonitorInputStream"); - if (!monitorClass) { - NSString const *str = @"<>"; - NSData *stringData = [str dataUsingEncoding:NSUTF8StringEncoding]; - [self appendLoggedStreamData:stringData]; - return inputStream; - } - inputStream = [monitorClass inputStreamWithStream:inputStream]; - - GTMReadMonitorInputStream *readMonitorInputStream = (GTMReadMonitorInputStream *)inputStream; - [readMonitorInputStream setReadDelegate:self]; - SEL readSel = @selector(inputStream:readIntoBuffer:length:); - [readMonitorInputStream setReadSelector:readSel]; - - return inputStream; -} - -- (GTMSessionFetcherBodyStreamProvider)loggedStreamProviderForStreamProvider: - (GTMSessionFetcherBodyStreamProvider)streamProvider { - if (!streamProvider) return nil; - if (![GTMSessionFetcher isLoggingEnabled]) return streamProvider; - - [self clearLoggedStreamData]; // Clear any previous data. - Class monitorClass = NSClassFromString(@"GTMReadMonitorInputStream"); - if (!monitorClass) { - NSString const *str = @"<>"; - NSData *stringData = [str dataUsingEncoding:NSUTF8StringEncoding]; - [self appendLoggedStreamData:stringData]; - return streamProvider; - } - GTMSessionFetcherBodyStreamProvider loggedStreamProvider = - ^(GTMSessionFetcherBodyStreamProviderResponse response) { - streamProvider(^(NSInputStream *bodyStream) { - bodyStream = [self loggedInputStreamForInputStream:bodyStream]; - response(bodyStream); - }); - }; - return loggedStreamProvider; -} - -@end - -@implementation GTMSessionFetcher (GTMSessionFetcherLoggingUtilities) - -- (void)inputStream:(GTMReadMonitorInputStream *)stream - readIntoBuffer:(void *)buffer - length:(int64_t)length { - // append the captured data - NSData *data = [NSData dataWithBytesNoCopy:buffer - length:(NSUInteger)length - freeWhenDone:NO]; - [self appendLoggedStreamData:data]; -} - -#pragma mark Fomatting Utilities - -+ (NSString *)snipSubstringOfString:(NSString *)originalStr - betweenStartString:(NSString *)startStr - endString:(NSString *)endStr { -#if SKIP_GTM_FETCH_LOGGING_SNIPPING - return originalStr; -#else - if (!originalStr) return nil; - - // Find the start string, and replace everything between it - // and the end string (or the end of the original string) with "_snip_" - NSRange startRange = [originalStr rangeOfString:startStr]; - if (startRange.location == NSNotFound) return originalStr; - - // We found the start string - NSUInteger originalLength = originalStr.length; - NSUInteger startOfTarget = NSMaxRange(startRange); - NSRange targetAndRest = NSMakeRange(startOfTarget, originalLength - startOfTarget); - NSRange endRange = [originalStr rangeOfString:endStr - options:0 - range:targetAndRest]; - NSRange replaceRange; - if (endRange.location == NSNotFound) { - // Found no end marker so replace to end of string - replaceRange = targetAndRest; - } else { - // Replace up to the endStr - replaceRange = NSMakeRange(startOfTarget, endRange.location - startOfTarget); - } - NSString *result = [originalStr stringByReplacingCharactersInRange:replaceRange - withString:@"_snip_"]; - return result; -#endif // SKIP_GTM_FETCH_LOGGING_SNIPPING -} - -+ (NSString *)headersStringForDictionary:(NSDictionary *)dict { - // Format the dictionary in http header style, like - // Accept: application/json - // Cache-Control: no-cache - // Content-Type: application/json; charset=utf-8 - // - // Pad the key names, but not beyond 16 chars, since long custom header - // keys just create too much whitespace - NSArray *keys = [dict.allKeys sortedArrayUsingSelector:@selector(compare:)]; - - NSMutableString *str = [NSMutableString string]; - for (NSString *key in keys) { - NSString *value = [dict valueForKey:key]; - if ([key isEqual:@"Authorization"]) { - // Remove OAuth 1 token - value = [[self class] snipSubstringOfString:value - betweenStartString:@"oauth_token=\"" - endString:@"\""]; - - // Remove OAuth 2 bearer token (draft 16, and older form) - value = [[self class] snipSubstringOfString:value - betweenStartString:@"Bearer " - endString:@"\n"]; - value = [[self class] snipSubstringOfString:value - betweenStartString:@"OAuth " - endString:@"\n"]; - - // Remove Google ClientLogin - value = [[self class] snipSubstringOfString:value - betweenStartString:@"GoogleLogin auth=" - endString:@"\n"]; - } - [str appendFormat:@" %@: %@\n", key, value]; - } - return str; -} - -@end - -#endif // !STRIP_GTM_FETCH_LOGGING diff --git a/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h b/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h deleted file mode 100644 index a696ac7e4..000000000 --- a/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h +++ /dev/null @@ -1,190 +0,0 @@ -/* Copyright 2014 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// For best performance and convenient usage, fetchers should be generated by a common -// GTMSessionFetcherService instance, like -// -// _fetcherService = [[GTMSessionFetcherService alloc] init]; -// GTMSessionFetcher* myFirstFetcher = [_fetcherService fetcherWithRequest:request1]; -// GTMSessionFetcher* mySecondFetcher = [_fetcherService fetcherWithRequest:request2]; - -#import "GTMSessionFetcher.h" - -GTM_ASSUME_NONNULL_BEGIN - -// Notifications. - -// This notification indicates a reusable session has become invalid. It is intended mainly for the -// service's unit tests. -// -// The notification object is the fetcher service. -// The invalid session is provided via the userInfo kGTMSessionFetcherServiceSessionKey key. -extern NSString *const kGTMSessionFetcherServiceSessionBecameInvalidNotification; -extern NSString *const kGTMSessionFetcherServiceSessionKey; - -@interface GTMSessionFetcherService : NSObject - -// Queues of delayed and running fetchers. Each dictionary contains arrays -// of GTMSessionFetcher *fetchers, keyed by NSString *host -@property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSArray *) *delayedFetchersByHost; -@property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSArray *) *runningFetchersByHost; - -// A max value of 0 means no fetchers should be delayed. -// The default limit is 10 simultaneous fetchers targeting each host. -// This does not apply to fetchers whose useBackgroundSession property is YES. Since services are -// not resurrected on an app relaunch, delayed fetchers would effectively be abandoned. -@property(atomic, assign) NSUInteger maxRunningFetchersPerHost; - -// Properties to be applied to each fetcher; see GTMSessionFetcher.h for descriptions -@property(atomic, strong, GTM_NULLABLE) NSURLSessionConfiguration *configuration; -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherConfigurationBlock configurationBlock; -@property(atomic, strong, GTM_NULLABLE) NSHTTPCookieStorage *cookieStorage; -@property(atomic, strong, GTM_NULL_RESETTABLE) dispatch_queue_t callbackQueue; -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherChallengeBlock challengeBlock; -@property(atomic, strong, GTM_NULLABLE) NSURLCredential *credential; -@property(atomic, strong) NSURLCredential *proxyCredential; -@property(atomic, copy, GTM_NULLABLE) GTM_NSArrayOf(NSString *) *allowedInsecureSchemes; -@property(atomic, assign) BOOL allowLocalhostRequest; -@property(atomic, assign) BOOL allowInvalidServerCertificates; -@property(atomic, assign, getter=isRetryEnabled) BOOL retryEnabled; -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherRetryBlock retryBlock; -@property(atomic, assign) NSTimeInterval maxRetryInterval; -@property(atomic, assign) NSTimeInterval minRetryInterval; -@property(atomic, copy, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, id) *properties; - -#if GTM_BACKGROUND_TASK_FETCHING -@property(atomic, assign) BOOL skipBackgroundTask; -#endif - -// A default useragent of GTMFetcherStandardUserAgentString(nil) will be given to each fetcher -// created by this service unless the request already has a user-agent header set. -// This default will be added starting with builds with the SDKs for OS X 10.11 and iOS 9. -// -// To use the configuration's default user agent, set this property to nil. -@property(atomic, copy, GTM_NULLABLE) NSString *userAgent; - -// The authorizer to attach to the created fetchers. If a specific fetcher should -// not authorize its requests, the fetcher's authorizer property may be set to nil -// before the fetch begins. -@property(atomic, strong, GTM_NULLABLE) id authorizer; - -// Delegate queue used by the session when calling back to the fetcher. The default -// is the main queue. Changing this does not affect the queue used to call back to the -// application; that is specified by the callbackQueue property above. -@property(atomic, strong, GTM_NULL_RESETTABLE) NSOperationQueue *sessionDelegateQueue; - -// When enabled, indicates the same session should be used by subsequent fetchers. -// -// This is enabled by default. -@property(atomic, assign) BOOL reuseSession; - -// Sets the delay until an unused session is invalidated. -// The default interval is 60 seconds. -// -// If the interval is set to 0, then any reused session is not invalidated except by -// explicitly invoking -resetSession. Be aware that setting the interval to 0 thus -// causes the session's delegate to be retained until the session is explicitly reset. -@property(atomic, assign) NSTimeInterval unusedSessionTimeout; - -// If shouldReuseSession is enabled, this will force creation of a new session when future -// fetchers begin. -- (void)resetSession; - -// Create a fetcher -// -// These methods will return a fetcher. If successfully created, the connection -// will hold a strong reference to it for the life of the connection as well. -// So the caller doesn't have to hold onto the fetcher explicitly unless they -// want to be able to monitor or cancel it. -- (GTMSessionFetcher *)fetcherWithRequest:(NSURLRequest *)request; -- (GTMSessionFetcher *)fetcherWithURL:(NSURL *)requestURL; -- (GTMSessionFetcher *)fetcherWithURLString:(NSString *)requestURLString; - -// Common method for fetcher creation. -// -// -fetcherWithRequest:fetcherClass: may be overridden to customize creation of -// fetchers. This is the ONLY method in the GTMSessionFetcher library intended to -// be overridden. -- (id)fetcherWithRequest:(NSURLRequest *)request - fetcherClass:(Class)fetcherClass; - -- (BOOL)isDelayingFetcher:(GTMSessionFetcher *)fetcher; - -- (NSUInteger)numberOfFetchers; // running + delayed fetchers -- (NSUInteger)numberOfRunningFetchers; -- (NSUInteger)numberOfDelayedFetchers; - -// Return a list of all running or delayed fetchers. This includes fetchers created -// by the service which have been started and have not yet stopped. -// -// Returns an array of fetcher objects, or nil if none. -- (GTM_NULLABLE GTM_NSArrayOf(GTMSessionFetcher *) *)issuedFetchers; - -// Search for running or delayed fetchers with the specified URL. -// -// Returns an array of fetcher objects found, or nil if none found. -- (GTM_NULLABLE GTM_NSArrayOf(GTMSessionFetcher *) *)issuedFetchersWithRequestURL:(NSURL *)requestURL; - -- (void)stopAllFetchers; - -// Methods for use by the fetcher class only. -- (GTM_NULLABLE NSURLSession *)session; -- (GTM_NULLABLE NSURLSession *)sessionForFetcherCreation; -- (GTM_NULLABLE id)sessionDelegate; -- (GTM_NULLABLE NSDate *)stoppedAllFetchersDate; - -// The testBlock can inspect its fetcher parameter's request property to -// determine which fetcher is being faked. -@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherTestBlock testBlock; - -@end - -@interface GTMSessionFetcherService (TestingSupport) - -// Convenience method to create a fetcher service for testing. -// -// Fetchers generated by this mock fetcher service will not perform any -// network operation, but will invoke callbacks and provide the supplied data -// or error to the completion handler. -// -// You can make more customized mocks by setting the test block property of the service -// or fetcher; the test block can inspect the fetcher's request or other properties. -// -// See the description of the testBlock property below. -+ (instancetype)mockFetcherServiceWithFakedData:(GTM_NULLABLE NSData *)fakedDataOrNil - fakedError:(GTM_NULLABLE NSError *)fakedErrorOrNil; - -// Spin the run loop and discard events (or, if not on the main thread, just sleep the thread) -// until all running and delayed fetchers have completed. -// -// This is only for use in testing or in tools without a user interface. -// -// Synchronous fetches should never be done by shipping apps; they are -// sufficient reason for rejection from the app store. -// -// Returns NO if timed out. -- (BOOL)waitForCompletionOfAllFetchersWithTimeout:(NSTimeInterval)timeoutInSeconds; - -@end - -@interface GTMSessionFetcherService (BackwardsCompatibilityOnly) - -// Clients using GTMSessionFetcher should set the cookie storage explicitly themselves. -// This method is just for compatibility with the old fetcher. -@property(atomic, assign) NSInteger cookieStorageMethod; - -@end - -GTM_ASSUME_NONNULL_END diff --git a/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m b/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m deleted file mode 100644 index fc6e6d964..000000000 --- a/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m +++ /dev/null @@ -1,1352 +0,0 @@ -/* Copyright 2014 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -#import "GTMSessionFetcherService.h" - -NSString *const kGTMSessionFetcherServiceSessionBecameInvalidNotification - = @"kGTMSessionFetcherServiceSessionBecameInvalidNotification"; -NSString *const kGTMSessionFetcherServiceSessionKey - = @"kGTMSessionFetcherServiceSessionKey"; - -#if !GTMSESSION_BUILD_COMBINED_SOURCES -@interface GTMSessionFetcher (ServiceMethods) -- (BOOL)beginFetchMayDelay:(BOOL)mayDelay - mayAuthorize:(BOOL)mayAuthorize; -@end -#endif // !GTMSESSION_BUILD_COMBINED_SOURCES - -@interface GTMSessionFetcherService () - -@property(atomic, strong, readwrite) NSDictionary *delayedFetchersByHost; -@property(atomic, strong, readwrite) NSDictionary *runningFetchersByHost; - -@end - -// Since NSURLSession doesn't support a separate delegate per task (!), instances of this -// class serve as a session delegate trampoline. -// -// This class maps a session's tasks to fetchers, and resends delegate messages to the task's -// fetcher. -@interface GTMSessionFetcherSessionDelegateDispatcher : NSObject - -// The session for the tasks in this dispatcher's task-to-fetcher map. -@property(atomic) NSURLSession *session; - -// The timer interval for invalidating a session that has no active tasks. -@property(atomic) NSTimeInterval discardInterval; - -// The current discard timer. -@property(atomic, readonly) NSTimer *discardTimer; - - -- (instancetype)initWithParentService:(GTMSessionFetcherService *)parentService - sessionDiscardInterval:(NSTimeInterval)discardInterval; - -- (void)setFetcher:(GTMSessionFetcher *)fetcher - forTask:(NSURLSessionTask *)task; -- (void)removeFetcher:(GTMSessionFetcher *)fetcher; - -// Before using a session, tells the delegate dispatcher to stop the discard timer. -- (void)startSessionUsage; - -// When abandoning a delegate dispatcher, we want to avoid the session retaining -// the delegate after tasks complete. -- (void)abandon; - -@end - - -@implementation GTMSessionFetcherService { - NSMutableDictionary *_delayedFetchersByHost; - NSMutableDictionary *_runningFetchersByHost; - NSUInteger _maxRunningFetchersPerHost; - - // When this ivar is nil, the service will not reuse sessions. - GTMSessionFetcherSessionDelegateDispatcher *_delegateDispatcher; - - // Fetchers will wait on this if another fetcher is creating the shared NSURLSession. - dispatch_semaphore_t _sessionCreationSemaphore; - - dispatch_queue_t _callbackQueue; - NSOperationQueue *_delegateQueue; - NSHTTPCookieStorage *_cookieStorage; - NSString *_userAgent; - NSTimeInterval _timeout; - - NSURLCredential *_credential; // Username & password. - NSURLCredential *_proxyCredential; // Credential supplied to proxy servers. - - NSInteger _cookieStorageMethod; - - id _authorizer; - - // For waitForCompletionOfAllFetchersWithTimeout: we need to wait on stopped fetchers since - // they've not yet finished invoking their queued callbacks. This array is nil except when - // waiting on fetchers. - NSMutableArray *_stoppedFetchersToWaitFor; - - // For fetchers that enqueued their callbacks before stopAllFetchers was called on the service, - // set a barrier so the callbacks know to bail out. - NSDate *_stoppedAllFetchersDate; -} - -@synthesize maxRunningFetchersPerHost = _maxRunningFetchersPerHost, - configuration = _configuration, - configurationBlock = _configurationBlock, - cookieStorage = _cookieStorage, - userAgent = _userAgent, - challengeBlock = _challengeBlock, - credential = _credential, - proxyCredential = _proxyCredential, - allowedInsecureSchemes = _allowedInsecureSchemes, - allowLocalhostRequest = _allowLocalhostRequest, - allowInvalidServerCertificates = _allowInvalidServerCertificates, - retryEnabled = _retryEnabled, - retryBlock = _retryBlock, - maxRetryInterval = _maxRetryInterval, - minRetryInterval = _minRetryInterval, - properties = _properties, - unusedSessionTimeout = _unusedSessionTimeout, - testBlock = _testBlock; - -#if GTM_BACKGROUND_TASK_FETCHING -@synthesize skipBackgroundTask = _skipBackgroundTask; -#endif - -- (instancetype)init { - self = [super init]; - if (self) { - _delayedFetchersByHost = [[NSMutableDictionary alloc] init]; - _runningFetchersByHost = [[NSMutableDictionary alloc] init]; - _maxRunningFetchersPerHost = 10; - _cookieStorageMethod = -1; - _unusedSessionTimeout = 60.0; - _delegateDispatcher = - [[GTMSessionFetcherSessionDelegateDispatcher alloc] initWithParentService:self - sessionDiscardInterval:_unusedSessionTimeout]; - _callbackQueue = dispatch_get_main_queue(); - - _delegateQueue = [[NSOperationQueue alloc] init]; - _delegateQueue.maxConcurrentOperationCount = 1; - _delegateQueue.name = @"com.google.GTMSessionFetcher.NSURLSessionDelegateQueue"; - - _sessionCreationSemaphore = dispatch_semaphore_create(1); - - // Starting with the SDKs for OS X 10.11/iOS 9, the service has a default useragent. - // Apps can remove this and get the default system "CFNetwork" useragent by setting the - // fetcher service's userAgent property to nil. -#if (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_11) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) \ - || (TARGET_OS_IPHONE && defined(__IPHONE_9_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0) - _userAgent = GTMFetcherStandardUserAgentString(nil); -#endif - } - return self; -} - -- (void)dealloc { - [self detachAuthorizer]; - [_delegateDispatcher abandon]; -} - -#pragma mark Generate a new fetcher - -// Clients may override this method. Clients should not override any other library methods. -- (id)fetcherWithRequest:(NSURLRequest *)request - fetcherClass:(Class)fetcherClass { - GTMSessionFetcher *fetcher = [[fetcherClass alloc] initWithRequest:request - configuration:self.configuration]; - fetcher.callbackQueue = self.callbackQueue; - fetcher.sessionDelegateQueue = self.sessionDelegateQueue; - fetcher.challengeBlock = self.challengeBlock; - fetcher.credential = self.credential; - fetcher.proxyCredential = self.proxyCredential; - fetcher.authorizer = self.authorizer; - fetcher.cookieStorage = self.cookieStorage; - fetcher.allowedInsecureSchemes = self.allowedInsecureSchemes; - fetcher.allowLocalhostRequest = self.allowLocalhostRequest; - fetcher.allowInvalidServerCertificates = self.allowInvalidServerCertificates; - fetcher.configurationBlock = self.configurationBlock; - fetcher.retryEnabled = self.retryEnabled; - fetcher.retryBlock = self.retryBlock; - fetcher.maxRetryInterval = self.maxRetryInterval; - fetcher.minRetryInterval = self.minRetryInterval; - fetcher.properties = self.properties; - fetcher.service = self; - if (self.cookieStorageMethod >= 0) { - [fetcher setCookieStorageMethod:self.cookieStorageMethod]; - } - -#if GTM_BACKGROUND_TASK_FETCHING - fetcher.skipBackgroundTask = self.skipBackgroundTask; -#endif - - NSString *userAgent = self.userAgent; - if (userAgent.length > 0 - && [request valueForHTTPHeaderField:@"User-Agent"] == nil) { - [fetcher setRequestValue:userAgent - forHTTPHeaderField:@"User-Agent"]; - } - fetcher.testBlock = self.testBlock; - - return fetcher; -} - -- (GTMSessionFetcher *)fetcherWithRequest:(NSURLRequest *)request { - return [self fetcherWithRequest:request - fetcherClass:[GTMSessionFetcher class]]; -} - -- (GTMSessionFetcher *)fetcherWithURL:(NSURL *)requestURL { - return [self fetcherWithRequest:[NSURLRequest requestWithURL:requestURL]]; -} - -- (GTMSessionFetcher *)fetcherWithURLString:(NSString *)requestURLString { - NSURL *url = [NSURL URLWithString:requestURLString]; - return [self fetcherWithURL:url]; -} - -// Returns a session for the fetcher's host, or nil. -- (NSURLSession *)session { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSURLSession *session = _delegateDispatcher.session; - return session; - } -} - -// Returns a session for the fetcher's host, or nil. For shared sessions, this -// waits on a semaphore, blocking other fetchers while the caller creates the -// session if needed. -- (NSURLSession *)sessionForFetcherCreation { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - if (!_delegateDispatcher) { - // This fetcher is creating a non-shared session, so skip the semaphore usage. - return nil; - } - } - - // Wait if another fetcher is currently creating a session; avoid waiting - // inside the @synchronized block, as that can deadlock. - dispatch_semaphore_wait(_sessionCreationSemaphore, DISPATCH_TIME_FOREVER); - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - // Before getting the NSURLSession for task creation, it is - // important to invalidate and nil out the session discard timer; otherwise - // the session can be invalidated between when it is returned to the - // fetcher, and when the fetcher attempts to create its NSURLSessionTask. - [_delegateDispatcher startSessionUsage]; - - NSURLSession *session = _delegateDispatcher.session; - if (session) { - // The calling fetcher will receive a preexisting session, so - // we can allow other fetchers to create a session. - dispatch_semaphore_signal(_sessionCreationSemaphore); - } else { - // No existing session was obtained, so the calling fetcher will create the session; - // it *must* invoke fetcherDidCreateSession: to signal the dispatcher's semaphore after - // the session has been created (or fails to be created) to avoid a hang. - } - return session; - } -} - -- (id)sessionDelegate { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _delegateDispatcher; - } -} - -#pragma mark Queue Management - -- (void)addRunningFetcher:(GTMSessionFetcher *)fetcher - forHost:(NSString *)host { - // Add to the array of running fetchers for this host, creating the array if needed. - NSMutableArray *runningForHost = [_runningFetchersByHost objectForKey:host]; - if (runningForHost == nil) { - runningForHost = [NSMutableArray arrayWithObject:fetcher]; - [_runningFetchersByHost setObject:runningForHost forKey:host]; - } else { - [runningForHost addObject:fetcher]; - } -} - -- (void)addDelayedFetcher:(GTMSessionFetcher *)fetcher - forHost:(NSString *)host { - // Add to the array of delayed fetchers for this host, creating the array if needed. - NSMutableArray *delayedForHost = [_delayedFetchersByHost objectForKey:host]; - if (delayedForHost == nil) { - delayedForHost = [NSMutableArray arrayWithObject:fetcher]; - [_delayedFetchersByHost setObject:delayedForHost forKey:host]; - } else { - [delayedForHost addObject:fetcher]; - } -} - -- (BOOL)isDelayingFetcher:(GTMSessionFetcher *)fetcher { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSString *host = fetcher.request.URL.host; - if (host == nil) { - return NO; - } - NSArray *delayedForHost = [_delayedFetchersByHost objectForKey:host]; - NSUInteger idx = [delayedForHost indexOfObjectIdenticalTo:fetcher]; - BOOL isDelayed = (delayedForHost != nil) && (idx != NSNotFound); - return isDelayed; - } -} - -- (BOOL)fetcherShouldBeginFetching:(GTMSessionFetcher *)fetcher { - // Entry point from the fetcher - NSURL *requestURL = fetcher.request.URL; - NSString *host = requestURL.host; - - // Addresses "file:///path" case where localhost is the implicit host. - if (host.length == 0 && [requestURL isFileURL]) { - host = @"localhost"; - } - - if (host.length == 0) { - // Data URIs legitimately have no host, reject other hostless URLs. - GTMSESSION_ASSERT_DEBUG([[requestURL scheme] isEqual:@"data"], @"%@ lacks host", fetcher); - return YES; - } - - BOOL shouldBeginResult; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSMutableArray *runningForHost = [_runningFetchersByHost objectForKey:host]; - if (runningForHost != nil - && [runningForHost indexOfObjectIdenticalTo:fetcher] != NSNotFound) { - GTMSESSION_ASSERT_DEBUG(NO, @"%@ was already running", fetcher); - return YES; - } - - BOOL shouldRunNow = (fetcher.usingBackgroundSession - || _maxRunningFetchersPerHost == 0 - || _maxRunningFetchersPerHost > - [[self class] numberOfNonBackgroundSessionFetchers:runningForHost]); - if (shouldRunNow) { - [self addRunningFetcher:fetcher forHost:host]; - shouldBeginResult = YES; - } else { - [self addDelayedFetcher:fetcher forHost:host]; - shouldBeginResult = NO; - } - } // @synchronized(self) - - // We'll save the host that serves as the key for this fetcher's array - // to avoid any chance of the underlying request changing, stranding - // the fetcher in the wrong array - fetcher.serviceHost = host; - - return shouldBeginResult; -} - -- (void)startFetcher:(GTMSessionFetcher *)fetcher { - [fetcher beginFetchMayDelay:NO - mayAuthorize:YES]; -} - -// Internal utility. Returns a fetcher's delegate if it's a dispatcher, or nil if the fetcher -// is its own delegate and has no dispatcher. -- (GTMSessionFetcherSessionDelegateDispatcher *)delegateDispatcherForFetcher:(GTMSessionFetcher *)fetcher { - GTMSessionCheckNotSynchronized(self); - - NSURLSession *fetcherSession = fetcher.session; - if (fetcherSession) { - id fetcherDelegate = fetcherSession.delegate; - BOOL hasDispatcher = (fetcherDelegate != nil && fetcherDelegate != fetcher); - if (hasDispatcher) { - GTMSESSION_ASSERT_DEBUG([fetcherDelegate isKindOfClass:[GTMSessionFetcherSessionDelegateDispatcher class]], - @"Fetcher delegate class: %@", [fetcherDelegate class]); - return (GTMSessionFetcherSessionDelegateDispatcher *)fetcherDelegate; - } - } - return nil; -} - -- (void)fetcherDidCreateSession:(GTMSessionFetcher *)fetcher { - if (fetcher.canShareSession) { - NSURLSession *fetcherSession = fetcher.session; - GTMSESSION_ASSERT_DEBUG(fetcherSession != nil, @"Fetcher missing its session: %@", fetcher); - - GTMSessionFetcherSessionDelegateDispatcher *delegateDispatcher = - [self delegateDispatcherForFetcher:fetcher]; - if (delegateDispatcher) { - GTMSESSION_ASSERT_DEBUG(delegateDispatcher.session == nil, - @"Fetcher made an extra session: %@", fetcher); - - // Save this fetcher's session. - delegateDispatcher.session = fetcherSession; - - // Allow other fetchers to request this session now. - dispatch_semaphore_signal(_sessionCreationSemaphore); - } - } -} - -- (void)fetcherDidBeginFetching:(GTMSessionFetcher *)fetcher { - // If this fetcher has a separate delegate with a shared session, then - // this fetcher should be added to the delegate's map of tasks to fetchers. - GTMSessionFetcherSessionDelegateDispatcher *delegateDispatcher = - [self delegateDispatcherForFetcher:fetcher]; - if (delegateDispatcher) { - GTMSESSION_ASSERT_DEBUG(fetcher.canShareSession, - @"Inappropriate shared session: %@", fetcher); - - // There should already be a session, from this or a previous fetcher. - // - // Sanity check that the fetcher's session is the delegate's shared session. - NSURLSession *sharedSession = delegateDispatcher.session; - NSURLSession *fetcherSession = fetcher.session; - GTMSESSION_ASSERT_DEBUG(sharedSession != nil, @"Missing delegate session: %@", fetcher); - GTMSESSION_ASSERT_DEBUG(fetcherSession == sharedSession, - @"Inconsistent session: %@ %@ (shared: %@)", - fetcher, fetcherSession, sharedSession); - - if (sharedSession != nil && fetcherSession == sharedSession) { - NSURLSessionTask *task = fetcher.sessionTask; - GTMSESSION_ASSERT_DEBUG(task != nil, @"Missing session task: %@", fetcher); - - if (task) { - [delegateDispatcher setFetcher:fetcher - forTask:task]; - } - } - } -} - -- (void)stopFetcher:(GTMSessionFetcher *)fetcher { - [fetcher stopFetching]; -} - -- (void)fetcherDidStop:(GTMSessionFetcher *)fetcher { - // Entry point from the fetcher - NSString *host = fetcher.serviceHost; - if (!host) { - // fetcher has been stopped previously - return; - } - - // This removeFetcher: invocation is a fallback; typically, fetchers are removed from the task - // map when the task completes. - GTMSessionFetcherSessionDelegateDispatcher *delegateDispatcher = - [self delegateDispatcherForFetcher:fetcher]; - [delegateDispatcher removeFetcher:fetcher]; - - NSMutableArray *fetchersToStart; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - // If a test is waiting for all fetchers to stop, it needs to wait for this one - // to invoke its callbacks on the callback queue. - [_stoppedFetchersToWaitFor addObject:fetcher]; - - NSMutableArray *runningForHost = [_runningFetchersByHost objectForKey:host]; - [runningForHost removeObject:fetcher]; - - NSMutableArray *delayedForHost = [_delayedFetchersByHost objectForKey:host]; - [delayedForHost removeObject:fetcher]; - - while (delayedForHost.count > 0 - && [[self class] numberOfNonBackgroundSessionFetchers:runningForHost] - < _maxRunningFetchersPerHost) { - // Start another delayed fetcher running, scanning for the minimum - // priority value, defaulting to FIFO for equal priorities - GTMSessionFetcher *nextFetcher = nil; - for (GTMSessionFetcher *delayedFetcher in delayedForHost) { - if (nextFetcher == nil - || delayedFetcher.servicePriority < nextFetcher.servicePriority) { - nextFetcher = delayedFetcher; - } - } - - if (nextFetcher) { - [self addRunningFetcher:nextFetcher forHost:host]; - runningForHost = [_runningFetchersByHost objectForKey:host]; - - [delayedForHost removeObjectIdenticalTo:nextFetcher]; - - if (!fetchersToStart) { - fetchersToStart = [NSMutableArray array]; - } - [fetchersToStart addObject:nextFetcher]; - } - } - - if (runningForHost.count == 0) { - // None left; remove the empty array - [_runningFetchersByHost removeObjectForKey:host]; - } - - if (delayedForHost.count == 0) { - [_delayedFetchersByHost removeObjectForKey:host]; - } - } // @synchronized(self) - - // Start fetchers outside of the synchronized block to avoid a deadlock. - for (GTMSessionFetcher *nextFetcher in fetchersToStart) { - [self startFetcher:nextFetcher]; - } - - // The fetcher is no longer in the running or the delayed array, - // so remove its host and thread properties - fetcher.serviceHost = nil; -} - -- (NSUInteger)numberOfFetchers { - NSUInteger running = [self numberOfRunningFetchers]; - NSUInteger delayed = [self numberOfDelayedFetchers]; - return running + delayed; -} - -- (NSUInteger)numberOfRunningFetchers { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSUInteger sum = 0; - for (NSString *host in _runningFetchersByHost) { - NSArray *fetchers = [_runningFetchersByHost objectForKey:host]; - sum += fetchers.count; - } - return sum; - } -} - -- (NSUInteger)numberOfDelayedFetchers { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSUInteger sum = 0; - for (NSString *host in _delayedFetchersByHost) { - NSArray *fetchers = [_delayedFetchersByHost objectForKey:host]; - sum += fetchers.count; - } - return sum; - } -} - -- (NSArray *)issuedFetchers { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSMutableArray *allFetchers = [NSMutableArray array]; - void (^accumulateFetchers)(id, id, BOOL *) = ^(NSString *host, - NSArray *fetchersForHost, - BOOL *stop) { - [allFetchers addObjectsFromArray:fetchersForHost]; - }; - [_runningFetchersByHost enumerateKeysAndObjectsUsingBlock:accumulateFetchers]; - [_delayedFetchersByHost enumerateKeysAndObjectsUsingBlock:accumulateFetchers]; - - GTMSESSION_ASSERT_DEBUG(allFetchers.count == [NSSet setWithArray:allFetchers].count, - @"Fetcher appears multiple times\n running: %@\n delayed: %@", - _runningFetchersByHost, _delayedFetchersByHost); - - return allFetchers.count > 0 ? allFetchers : nil; - } -} - -- (NSArray *)issuedFetchersWithRequestURL:(NSURL *)requestURL { - NSString *host = requestURL.host; - if (host.length == 0) return nil; - - NSURL *targetURL = [requestURL absoluteURL]; - - NSArray *allFetchers = [self issuedFetchers]; - NSIndexSet *indexes = [allFetchers indexesOfObjectsPassingTest:^BOOL(GTMSessionFetcher *fetcher, - NSUInteger idx, - BOOL *stop) { - NSURL *fetcherURL = [fetcher.request.URL absoluteURL]; - return [fetcherURL isEqual:targetURL]; - }]; - - NSArray *result = nil; - if (indexes.count > 0) { - result = [allFetchers objectsAtIndexes:indexes]; - } - return result; -} - -- (void)stopAllFetchers { - NSArray *delayedFetchersByHost; - NSArray *runningFetchersByHost; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - // Set the time barrier so fetchers know not to call back even if - // the stop calls below occur after the fetchers naturally - // stopped and so were removed from _runningFetchersByHost, - // but while the callbacks were already enqueued before stopAllFetchers - // was invoked. - _stoppedAllFetchersDate = [[NSDate alloc] init]; - - // Remove fetchers from the delayed list to avoid fetcherDidStop: from - // starting more fetchers running as a side effect of stopping one - delayedFetchersByHost = _delayedFetchersByHost.allValues; - [_delayedFetchersByHost removeAllObjects]; - - runningFetchersByHost = _runningFetchersByHost.allValues; - [_runningFetchersByHost removeAllObjects]; - } - - for (NSArray *delayedForHost in delayedFetchersByHost) { - for (GTMSessionFetcher *fetcher in delayedForHost) { - [self stopFetcher:fetcher]; - } - } - - for (NSArray *runningForHost in runningFetchersByHost) { - for (GTMSessionFetcher *fetcher in runningForHost) { - [self stopFetcher:fetcher]; - } - } -} - -- (NSDate *)stoppedAllFetchersDate { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _stoppedAllFetchersDate; - } -} - -#pragma mark Accessors - -- (BOOL)reuseSession { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _delegateDispatcher != nil; - } -} - -- (void)setReuseSession:(BOOL)shouldReuse { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - BOOL wasReusing = (_delegateDispatcher != nil); - if (shouldReuse != wasReusing) { - [self abandonDispatcher]; - if (shouldReuse) { - _delegateDispatcher = - [[GTMSessionFetcherSessionDelegateDispatcher alloc] initWithParentService:self - sessionDiscardInterval:_unusedSessionTimeout]; - } else { - _delegateDispatcher = nil; - } - } - } -} - -- (void)resetSession { - GTMSessionCheckNotSynchronized(self); - dispatch_semaphore_wait(_sessionCreationSemaphore, DISPATCH_TIME_FOREVER); - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - [self resetSessionInternal]; - } - - dispatch_semaphore_signal(_sessionCreationSemaphore); -} - -- (void)resetSessionInternal { - GTMSessionCheckSynchronized(self); - - // The old dispatchers may be retained as delegates of any ongoing sessions by those sessions. - if (_delegateDispatcher) { - [self abandonDispatcher]; - _delegateDispatcher = - [[GTMSessionFetcherSessionDelegateDispatcher alloc] initWithParentService:self - sessionDiscardInterval:_unusedSessionTimeout]; - } -} - -- (void)resetSessionForDispatcherDiscardTimer:(NSTimer *)timer { - GTMSessionCheckNotSynchronized(self); - - dispatch_semaphore_wait(_sessionCreationSemaphore, DISPATCH_TIME_FOREVER); - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_delegateDispatcher.discardTimer == timer) { - // If the delegate dispatcher's current discardTimer is the same object as the timer - // that fired, no fetcher has recently attempted to start using the session by calling - // startSessionUsage, which invalidates and nils out the timer. - [self resetSessionInternal]; - } else { - // A fetcher has invalidated the timer between its triggering and now, potentially - // meaning a fetcher has requested access to the NSURLSession, and may be in the process - // of starting a new task. The dispatcher should not be abandoned, as this can lead - // to a race condition between calling -finishTasksAndInvalidate on the NSURLSession - // and the fetcher attempting to create a new task. - } - } - - dispatch_semaphore_signal(_sessionCreationSemaphore); -} - -- (NSTimeInterval)unusedSessionTimeout { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _unusedSessionTimeout; - } -} - -- (void)setUnusedSessionTimeout:(NSTimeInterval)timeout { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _unusedSessionTimeout = timeout; - _delegateDispatcher.discardInterval = timeout; - } -} - -// This method should be called inside of @synchronized(self) -- (void)abandonDispatcher { - GTMSessionCheckSynchronized(self); - [_delegateDispatcher abandon]; -} - -- (NSDictionary *)runningFetchersByHost { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return [_runningFetchersByHost copy]; - } -} - -- (void)setRunningFetchersByHost:(NSDictionary *)dict { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _runningFetchersByHost = [dict mutableCopy]; - } -} - -- (NSDictionary *)delayedFetchersByHost { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return [_delayedFetchersByHost copy]; - } -} - -- (void)setDelayedFetchersByHost:(NSDictionary *)dict { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _delayedFetchersByHost = [dict mutableCopy]; - } -} - -- (id)authorizer { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _authorizer; - } -} - -- (void)setAuthorizer:(id)obj { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (obj != _authorizer) { - [self detachAuthorizer]; - } - - _authorizer = obj; - } - - // Use the fetcher service for the authorization fetches if the auth - // object supports fetcher services - if ([obj respondsToSelector:@selector(setFetcherService:)]) { -#if GTM_USE_SESSION_FETCHER - [obj setFetcherService:self]; -#else - [obj setFetcherService:(id)self]; -#endif - } -} - -// This should be called inside a @synchronized(self) block except during dealloc. -- (void)detachAuthorizer { - // This method is called by the fetcher service's dealloc and setAuthorizer: - // methods; do not override. - // - // The fetcher service retains the authorizer, and the authorizer has a - // weak pointer to the fetcher service (a non-zeroing pointer for - // compatibility with iOS 4 and Mac OS X 10.5/10.6.) - // - // When this fetcher service no longer uses the authorizer, we want to remove - // the authorizer's dependence on the fetcher service. Authorizers can still - // function without a fetcher service. - if ([_authorizer respondsToSelector:@selector(fetcherService)]) { - id authFetcherService = [_authorizer fetcherService]; - if (authFetcherService == self) { - [_authorizer setFetcherService:nil]; - } - } -} - -- (dispatch_queue_t GTM_NONNULL_TYPE)callbackQueue { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _callbackQueue; - } // @synchronized(self) -} - -- (void)setCallbackQueue:(dispatch_queue_t GTM_NULLABLE_TYPE)queue { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _callbackQueue = queue ?: dispatch_get_main_queue(); - } // @synchronized(self) -} - -- (NSOperationQueue * GTM_NONNULL_TYPE)sessionDelegateQueue { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _delegateQueue; - } // @synchronized(self) -} - -- (void)setSessionDelegateQueue:(NSOperationQueue * GTM_NULLABLE_TYPE)queue { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _delegateQueue = queue ?: [NSOperationQueue mainQueue]; - } // @synchronized(self) -} - -- (NSOperationQueue *)delegateQueue { - // Provided for compatibility with the old fetcher service. The gtm-oauth2 code respects - // any custom delegate queue for calling the app. - return nil; -} - -+ (NSUInteger)numberOfNonBackgroundSessionFetchers:(NSArray *)fetchers { - NSUInteger sum = 0; - for (GTMSessionFetcher *fetcher in fetchers) { - if (!fetcher.usingBackgroundSession) { - ++sum; - } - } - return sum; -} - -@end - -@implementation GTMSessionFetcherService (TestingSupport) - -+ (instancetype)mockFetcherServiceWithFakedData:(NSData *)fakedDataOrNil - fakedError:(NSError *)fakedErrorOrNil { -#if !GTM_DISABLE_FETCHER_TEST_BLOCK - NSURL *url = [NSURL URLWithString:@"http://example.invalid"]; - NSHTTPURLResponse *fakedResponse = - [[NSHTTPURLResponse alloc] initWithURL:url - statusCode:(fakedErrorOrNil ? 500 : 200) - HTTPVersion:@"HTTP/1.1" - headerFields:nil]; - GTMSessionFetcherService *service = [[self alloc] init]; - service.allowedInsecureSchemes = @[ @"http" ]; - service.testBlock = ^(GTMSessionFetcher *fetcherToTest, - GTMSessionFetcherTestResponse testResponse) { - testResponse(fakedResponse, fakedDataOrNil, fakedErrorOrNil); - }; - return service; -#else - GTMSESSION_ASSERT_DEBUG(0, @"Test blocks disabled"); - return nil; -#endif // GTM_DISABLE_FETCHER_TEST_BLOCK -} - -#pragma mark Synchronous Wait for Unit Testing - -- (BOOL)waitForCompletionOfAllFetchersWithTimeout:(NSTimeInterval)timeoutInSeconds { - NSDate *giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; - _stoppedFetchersToWaitFor = [NSMutableArray array]; - - BOOL shouldSpinRunLoop = [NSThread isMainThread]; - const NSTimeInterval kSpinInterval = 0.001; - BOOL didTimeOut = NO; - while (([self numberOfFetchers] > 0 || _stoppedFetchersToWaitFor.count > 0)) { - didTimeOut = [giveUpDate timeIntervalSinceNow] < 0; - if (didTimeOut) break; - - GTMSessionFetcher *stoppedFetcher = _stoppedFetchersToWaitFor.firstObject; - if (stoppedFetcher) { - [_stoppedFetchersToWaitFor removeObject:stoppedFetcher]; - [stoppedFetcher waitForCompletionWithTimeout:10.0 * kSpinInterval]; - } - - if (shouldSpinRunLoop) { - NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:kSpinInterval]; - [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; - } else { - [NSThread sleepForTimeInterval:kSpinInterval]; - } - } - _stoppedFetchersToWaitFor = nil; - - return !didTimeOut; -} - -@end - -@implementation GTMSessionFetcherService (BackwardsCompatibilityOnly) - -- (NSInteger)cookieStorageMethod { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _cookieStorageMethod; - } -} - -- (void)setCookieStorageMethod:(NSInteger)cookieStorageMethod { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _cookieStorageMethod = cookieStorageMethod; - } -} - -@end - -@implementation GTMSessionFetcherSessionDelegateDispatcher { - __weak GTMSessionFetcherService *_parentService; - NSURLSession *_session; - - // The task map maps NSURLSessionTasks to GTMSessionFetchers - NSMutableDictionary *_taskToFetcherMap; - // The discard timer will invalidate sessions after the session's last task completes. - NSTimer *_discardTimer; - NSTimeInterval _discardInterval; -} - -@synthesize discardInterval = _discardInterval, - session = _session; - -- (instancetype)init { - [self doesNotRecognizeSelector:_cmd]; - return nil; -} - -- (instancetype)initWithParentService:(GTMSessionFetcherService *)parentService - sessionDiscardInterval:(NSTimeInterval)discardInterval { - self = [super init]; - if (self) { - _discardInterval = discardInterval; - _parentService = parentService; - } - return self; -} - -- (NSString *)description { - return [NSString stringWithFormat:@"%@ %p %@ %@", - [self class], self, - _session ?: @"", - _taskToFetcherMap.count > 0 ? _taskToFetcherMap : @""]; -} - -- (NSTimer *)discardTimer { - GTMSessionCheckNotSynchronized(self); - @synchronized(self) { - return _discardTimer; - } -} - -// This method should be called inside of a @synchronized(self) block. -- (void)startDiscardTimer { - GTMSessionCheckSynchronized(self); - [_discardTimer invalidate]; - _discardTimer = nil; - if (_discardInterval > 0) { - _discardTimer = [NSTimer timerWithTimeInterval:_discardInterval - target:self - selector:@selector(discardTimerFired:) - userInfo:nil - repeats:NO]; - [_discardTimer setTolerance:(_discardInterval / 10)]; - [[NSRunLoop mainRunLoop] addTimer:_discardTimer forMode:NSRunLoopCommonModes]; - } -} - -// This method should be called inside of a @synchronized(self) block. -- (void)destroyDiscardTimer { - GTMSessionCheckSynchronized(self); - [_discardTimer invalidate]; - _discardTimer = nil; -} - -- (void)discardTimerFired:(NSTimer *)timer { - GTMSessionFetcherService *service; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - NSUInteger numberOfTasks = _taskToFetcherMap.count; - if (numberOfTasks == 0) { - service = _parentService; - } - } - - // Inform the service that the discard timer has fired, and should check whether the - // service can abandon us. -resetSession cannot be called directly, as there is a - // race condition that must be guarded against with the NSURLSession being returned - // from sessionForFetcherCreation outside other locks. The service can take steps - // to prevent resetting the session if that has occurred. - // - // The service must be called from outside the @synchronized block. - [service resetSessionForDispatcherDiscardTimer:timer]; -} - -- (void)abandon { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - [self destroySessionAndTimer]; - } -} - -- (void)startSessionUsage { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - [self destroyDiscardTimer]; - } -} - -// This method should be called inside of a @synchronized(self) block. -- (void)destroySessionAndTimer { - GTMSessionCheckSynchronized(self); - [self destroyDiscardTimer]; - - // Break any retain cycle from the session holding the delegate. - [_session finishTasksAndInvalidate]; - - // Immediately clear the session so no new task may be issued with it. - // - // The _taskToFetcherMap needs to stay valid until the outstanding tasks finish. - _session = nil; -} - -- (void)setFetcher:(GTMSessionFetcher *)fetcher forTask:(NSURLSessionTask *)task { - GTMSESSION_ASSERT_DEBUG(fetcher != nil, @"missing fetcher"); - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_taskToFetcherMap == nil) { - _taskToFetcherMap = [[NSMutableDictionary alloc] init]; - } - - if (fetcher) { - [_taskToFetcherMap setObject:fetcher forKey:task]; - [self destroyDiscardTimer]; - } - } -} - -- (void)removeFetcher:(GTMSessionFetcher *)fetcher { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - // Typically, a fetcher should be removed when its task invokes - // URLSession:task:didCompleteWithError:. - // - // When fetching with a testBlock, though, the task completed delegate - // method may not be invoked, requiring cleanup here. - NSArray *tasks = [_taskToFetcherMap allKeysForObject:fetcher]; - GTMSESSION_ASSERT_DEBUG(tasks.count <= 1, @"fetcher task not unmapped: %@", tasks); - [_taskToFetcherMap removeObjectsForKeys:tasks]; - - if (_taskToFetcherMap.count == 0) { - [self startDiscardTimer]; - } - } -} - -// This helper method provides synchronized access to the task map for the delegate -// methods below. -- (id)fetcherForTask:(NSURLSessionTask *)task { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return [_taskToFetcherMap objectForKey:task]; - } -} - -- (void)removeTaskFromMap:(NSURLSessionTask *)task { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - [_taskToFetcherMap removeObjectForKey:task]; - } -} - -- (void)setSession:(NSURLSession *)session { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _session = session; - } -} - -- (NSURLSession *)session { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _session; - } -} - -- (NSTimeInterval)discardInterval { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _discardInterval; - } -} - -- (void)setDiscardInterval:(NSTimeInterval)interval { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _discardInterval = interval; - } -} - -// NSURLSessionDelegate protocol methods. - -// - (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session; -// -// TODO(seh): How do we route this to an appropriate fetcher? - - -- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(NSError *)error { - GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ didBecomeInvalidWithError:%@", - [self class], self, session, error); - NSDictionary *localTaskToFetcherMap; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _session = nil; - - localTaskToFetcherMap = [_taskToFetcherMap copy]; - } - - // Any "suspended" tasks may not have received callbacks from NSURLSession when the session - // completes; we'll call them now. - [localTaskToFetcherMap enumerateKeysAndObjectsUsingBlock:^(NSURLSessionTask *task, - GTMSessionFetcher *fetcher, - BOOL *stop) { - if (fetcher.session == session) { - // Our delegate method URLSession:task:didCompleteWithError: will rely on - // _taskToFetcherMap so that should still contain this fetcher. - NSError *canceledError = [NSError errorWithDomain:NSURLErrorDomain - code:NSURLErrorCancelled - userInfo:nil]; - [self URLSession:session task:task didCompleteWithError:canceledError]; - } else { - GTMSESSION_ASSERT_DEBUG(0, @"Unexpected session in fetcher: %@ has %@ (expected %@)", - fetcher, fetcher.session, session); - } - }]; - - // Our tests rely on this notification to know the session discard timer fired. - NSDictionary *userInfo = @{ kGTMSessionFetcherServiceSessionKey : session }; - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName:kGTMSessionFetcherServiceSessionBecameInvalidNotification - object:_parentService - userInfo:userInfo]; -} - - -#pragma mark - NSURLSessionTaskDelegate - -// NSURLSessionTaskDelegate protocol methods. -// -// We won't test here if the fetcher responds to these since we only want this -// class to implement the same delegate methods the fetcher does (so NSURLSession's -// tests for respondsToSelector: will have the same result whether the session -// delegate is the fetcher or this dispatcher.) - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task -willPerformHTTPRedirection:(NSHTTPURLResponse *)response - newRequest:(NSURLRequest *)request - completionHandler:(void (^)(NSURLRequest *))completionHandler { - id fetcher = [self fetcherForTask:task]; - [fetcher URLSession:session - task:task -willPerformHTTPRedirection:response - newRequest:request - completionHandler:completionHandler]; -} - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task -didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge - completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))handler { - id fetcher = [self fetcherForTask:task]; - [fetcher URLSession:session - task:task - didReceiveChallenge:challenge - completionHandler:handler]; -} - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task - needNewBodyStream:(void (^)(NSInputStream *bodyStream))handler { - id fetcher = [self fetcherForTask:task]; - [fetcher URLSession:session - task:task - needNewBodyStream:handler]; -} - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task - didSendBodyData:(int64_t)bytesSent - totalBytesSent:(int64_t)totalBytesSent -totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { - id fetcher = [self fetcherForTask:task]; - [fetcher URLSession:session - task:task - didSendBodyData:bytesSent - totalBytesSent:totalBytesSent -totalBytesExpectedToSend:totalBytesExpectedToSend]; -} - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task -didCompleteWithError:(NSError *)error { - id fetcher = [self fetcherForTask:task]; - - // This is the usual way tasks are removed from the task map. - [self removeTaskFromMap:task]; - - [fetcher URLSession:session - task:task - didCompleteWithError:error]; -} - -// NSURLSessionDataDelegate protocol methods. - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask -didReceiveResponse:(NSURLResponse *)response - completionHandler:(void (^)(NSURLSessionResponseDisposition))handler { - id fetcher = [self fetcherForTask:dataTask]; - [fetcher URLSession:session - dataTask:dataTask - didReceiveResponse:response - completionHandler:handler]; -} - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask -didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask { - id fetcher = [self fetcherForTask:dataTask]; - GTMSESSION_ASSERT_DEBUG(fetcher != nil, @"Missing fetcher for %@", dataTask); - [self removeTaskFromMap:dataTask]; - if (fetcher) { - GTMSESSION_ASSERT_DEBUG([fetcher isKindOfClass:[GTMSessionFetcher class]], - @"Expecting GTMSessionFetcher"); - [self setFetcher:(GTMSessionFetcher *)fetcher forTask:downloadTask]; - } - - [fetcher URLSession:session - dataTask:dataTask -didBecomeDownloadTask:downloadTask]; -} - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask - didReceiveData:(NSData *)data { - id fetcher = [self fetcherForTask:dataTask]; - [fetcher URLSession:session - dataTask:dataTask - didReceiveData:data]; -} - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask - willCacheResponse:(NSCachedURLResponse *)proposedResponse - completionHandler:(void (^)(NSCachedURLResponse *))handler { - id fetcher = [self fetcherForTask:dataTask]; - [fetcher URLSession:session - dataTask:dataTask - willCacheResponse:proposedResponse - completionHandler:handler]; -} - -// NSURLSessionDownloadDelegate protocol methods. - -- (void)URLSession:(NSURLSession *)session - downloadTask:(NSURLSessionDownloadTask *)downloadTask -didFinishDownloadingToURL:(NSURL *)location { - id fetcher = [self fetcherForTask:downloadTask]; - [fetcher URLSession:session - downloadTask:downloadTask -didFinishDownloadingToURL:location]; -} - -- (void)URLSession:(NSURLSession *)session - downloadTask:(NSURLSessionDownloadTask *)downloadTask - didWriteData:(int64_t)bytesWritten - totalBytesWritten:(int64_t)totalWritten -totalBytesExpectedToWrite:(int64_t)totalExpected { - id fetcher = [self fetcherForTask:downloadTask]; - [fetcher URLSession:session - downloadTask:downloadTask - didWriteData:bytesWritten - totalBytesWritten:totalWritten -totalBytesExpectedToWrite:totalExpected]; -} - -- (void)URLSession:(NSURLSession *)session - downloadTask:(NSURLSessionDownloadTask *)downloadTask - didResumeAtOffset:(int64_t)fileOffset -expectedTotalBytes:(int64_t)expectedTotalBytes { - id fetcher = [self fetcherForTask:downloadTask]; - [fetcher URLSession:session - downloadTask:downloadTask - didResumeAtOffset:fileOffset - expectedTotalBytes:expectedTotalBytes]; -} - -@end diff --git a/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h b/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h deleted file mode 100644 index b5ef14d3b..000000000 --- a/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h +++ /dev/null @@ -1,166 +0,0 @@ -/* Copyright 2014 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// GTMSessionUploadFetcher implements Google's resumable upload protocol. - -// -// This subclass of GTMSessionFetcher simulates the series of fetches -// needed for chunked upload as a single fetch operation. -// -// Protocol document: TBD -// -// To the client, the only fetcher that exists is this class; the subsidiary -// fetchers needed for uploading chunks are not visible (though the most recent -// chunk fetcher may be accessed via the -activeFetcher or -chunkFetcher methods, and -// -responseHeaders and -statusCode reflect results from the most recent chunk -// fetcher.) -// -// Chunk fetchers are discarded as soon as they have completed. -// -// The protocol also allows for a cancellation notification request to be sent to the -// server to allow discarding of the currently uploaded data and this will be sent -// automatically upon calling stopFetching if the upload has already started. -// -// Note: Unlike the fetcher superclass, the methods of GTMSessionUploadFetcher should -// only be used from the main thread until further work is done to make this subclass -// thread-safe. - -#import "GTMSessionFetcher.h" -#import "GTMSessionFetcherService.h" - -GTM_ASSUME_NONNULL_BEGIN - -// The value to use for file size parameters when the file size is not yet known. -extern int64_t const kGTMSessionUploadFetcherUnknownFileSize; - -// Unless an application knows it needs a smaller chunk size, it should use the standard -// chunk size, which sends the entire file as a single chunk to minimize upload overhead. -// Setting an explicit chunk size that comfortably fits in memory is advisable for large -// uploads. -extern int64_t const kGTMSessionUploadFetcherStandardChunkSize; - -// When uploading requires data buffer allocations (such as uploading from an NSData or -// an NSFileHandle) this is the maximum buffer size that will be created by the fetcher. -extern int64_t const kGTMSessionUploadFetcherMaximumDemandBufferSize; - -// Notification that the upload location URL was provided by the server. -extern NSString *const kGTMSessionFetcherUploadLocationObtainedNotification; - -// Block to provide data during uploads. -// -// Response data may be allocated with dataWithBytesNoCopy:length:freeWhenDone: for efficiency, -// and released after the response block returns. -// -// If the length of the file being uploaded is unknown or already set, send -// kGTMSessionUploadFetcherUnknownFileSize for |fullUploadLength|. Otherwise, set |fullUploadLength| -// to its proper value. -// -// Pass nil as the data (and optionally an NSError) for a failure. -typedef void (^GTMSessionUploadFetcherDataProviderResponse)(NSData * GTM_NULLABLE_TYPE data, - int64_t fullUploadLength, - NSError * GTM_NULLABLE_TYPE error); -// Do not call the repsonse with an NSData object with less data than the requested length unless -// you are passing the fullUploadLength to the fetcher for the first time and it is the last chunk -// of data in the file being uploaded. -typedef void (^GTMSessionUploadFetcherDataProvider)(int64_t offset, int64_t length, - GTMSessionUploadFetcherDataProviderResponse response); - -// Block to be notified about the final status of the cancellation request started in stopFetching. -// -// |fetcher| will be the cancel request that was sent to the server, or nil if stopFetching is not -// going to send a cancel request. If |fetcher| is provided, the other parameters correspond to the -// completion handler of the cancellation request fetcher. -typedef void (^GTMSessionUploadFetcherCancellationHandler)( - GTMSessionFetcher * GTM_NULLABLE_TYPE fetcher, - NSData * GTM_NULLABLE_TYPE data, - NSError * GTM_NULLABLE_TYPE error); - -@interface GTMSessionUploadFetcher : GTMSessionFetcher - -// Create an upload fetcher specifying either the request or the resume location URL, -// then set an upload data source using one of these: -// -// setUploadFileURL: -// setUploadDataLength:provider: -// setUploadFileHandle: -// setUploadData: - -+ (instancetype)uploadFetcherWithRequest:(NSURLRequest *)request - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(int64_t)chunkSize - fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil; - -+ (instancetype)uploadFetcherWithLocation:(NSURL * GTM_NULLABLE_TYPE)uploadLocationURL - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(int64_t)chunkSize - fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil; - -// Allows dataProviders for files of unknown length. Pass kGTMSessionUploadFetcherUnknownFileSize as -// |fullLength| if the length is unknown. -- (void)setUploadDataLength:(int64_t)fullLength - provider:(GTM_NULLABLE GTMSessionUploadFetcherDataProvider)block; - -+ (NSArray *)uploadFetchersForBackgroundSessions; -+ (GTM_NULLABLE instancetype)uploadFetcherForSessionIdentifier:(NSString *)sessionIdentifier; - -- (void)pauseFetching; -- (void)resumeFetching; -- (BOOL)isPaused; - -@property(atomic, strong, GTM_NULLABLE) NSURL *uploadLocationURL; -@property(atomic, strong, GTM_NULLABLE) NSData *uploadData; -@property(atomic, strong, GTM_NULLABLE) NSURL *uploadFileURL; -@property(atomic, strong, GTM_NULLABLE) NSFileHandle *uploadFileHandle; -@property(atomic, copy, readonly, GTM_NULLABLE) GTMSessionUploadFetcherDataProvider uploadDataProvider; -@property(atomic, copy) NSString *uploadMIMEType; -@property(atomic, assign) int64_t chunkSize; -@property(atomic, readonly, assign) int64_t currentOffset; - -// The fetcher for the current data chunk, if any -@property(atomic, strong, GTM_NULLABLE) GTMSessionFetcher *chunkFetcher; - -// The active fetcher is the current chunk fetcher, or the upload fetcher itself -// if no chunk fetcher has yet been created. -@property(atomic, readonly) GTMSessionFetcher *activeFetcher; - -// The last request made by an active fetcher. Useful for testing. -@property(atomic, readonly, GTM_NULLABLE) NSURLRequest *lastChunkRequest; - -// The status code from the most recently-completed fetch. -@property(atomic, assign) NSInteger statusCode; - -// Invoked as part of the stop fetching process. Invoked immediately if there is no upload in -// progress, otherwise invoked with the results of the attempt to notify the server that the -// upload will not continue. -// -// Unlike other callbacks, since this is related specifically to the stopFetching flow it is not -// cleared by stopFetching. It will instead clear itself after it is invoked or if the completion -// has occured before stopFetching is called. -@property(atomic, copy, GTM_NULLABLE) GTMSessionUploadFetcherCancellationHandler - cancellationHandler; - -// Exposed for testing only. -@property(atomic, readonly, GTM_NULLABLE) dispatch_queue_t delegateCallbackQueue; -@property(atomic, readonly, GTM_NULLABLE) GTMSessionFetcherCompletionHandler delegateCompletionHandler; - -@end - -@interface GTMSessionFetcher (GTMSessionUploadFetcherMethods) - -@property(readonly, GTM_NULLABLE) GTMSessionUploadFetcher *parentUploadFetcher; - -@end - -GTM_ASSUME_NONNULL_END diff --git a/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m b/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m deleted file mode 100644 index b95f984cb..000000000 --- a/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m +++ /dev/null @@ -1,1947 +0,0 @@ -/* Copyright 2014 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -#import "GTMSessionUploadFetcher.h" - -static NSString *const kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey = @"_upChunk"; -static NSString *const kGTMSessionIdentifierUploadFileURLMetadataKey = @"_upFileURL"; -static NSString *const kGTMSessionIdentifierUploadFileLengthMetadataKey = @"_upFileLen"; -static NSString *const kGTMSessionIdentifierUploadLocationURLMetadataKey = @"_upLocURL"; -static NSString *const kGTMSessionIdentifierUploadMIMETypeMetadataKey = @"_uploadMIME"; -static NSString *const kGTMSessionIdentifierUploadChunkSizeMetadataKey = @"_upChSize"; -static NSString *const kGTMSessionIdentifierUploadCurrentOffsetMetadataKey = @"_upOffset"; - -static NSString *const kGTMSessionHeaderXGoogUploadChunkGranularity = @"X-Goog-Upload-Chunk-Granularity"; -static NSString *const kGTMSessionHeaderXGoogUploadCommand = @"X-Goog-Upload-Command"; -static NSString *const kGTMSessionHeaderXGoogUploadContentLength = @"X-Goog-Upload-Content-Length"; -static NSString *const kGTMSessionHeaderXGoogUploadContentType = @"X-Goog-Upload-Content-Type"; -static NSString *const kGTMSessionHeaderXGoogUploadOffset = @"X-Goog-Upload-Offset"; -static NSString *const kGTMSessionHeaderXGoogUploadProtocol = @"X-Goog-Upload-Protocol"; -static NSString *const kGTMSessionHeaderXGoogUploadSizeReceived = @"X-Goog-Upload-Size-Received"; -static NSString *const kGTMSessionHeaderXGoogUploadStatus = @"X-Goog-Upload-Status"; -static NSString *const kGTMSessionHeaderXGoogUploadURL = @"X-Goog-Upload-URL"; - -// Property of chunk fetchers identifying the parent upload fetcher. Non-retained NSValue. -static NSString *const kGTMSessionUploadFetcherChunkParentKey = @"_uploadFetcherChunkParent"; - -int64_t const kGTMSessionUploadFetcherUnknownFileSize = -1; - -int64_t const kGTMSessionUploadFetcherStandardChunkSize = (int64_t)LLONG_MAX; - -#if TARGET_OS_IPHONE -int64_t const kGTMSessionUploadFetcherMaximumDemandBufferSize = 10 * 1024 * 1024; // 10 MB for iOS, watchOS, tvOS -#else -int64_t const kGTMSessionUploadFetcherMaximumDemandBufferSize = 100 * 1024 * 1024; // 100 MB for macOS -#endif - -typedef NS_ENUM(NSUInteger, GTMSessionUploadFetcherStatus) { - kStatusUnknown, - kStatusActive, - kStatusFinal, - kStatusCancelled, -}; - -NSString *const kGTMSessionFetcherUploadLocationObtainedNotification = - @"kGTMSessionFetcherUploadLocationObtainedNotification"; - -#if !GTMSESSION_BUILD_COMBINED_SOURCES -@interface GTMSessionFetcher (ProtectedMethods) - -// Access to non-public method on the parent fetcher class. -- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks; -- (void)createSessionIdentifierWithMetadata:(NSDictionary *)metadata; -- (GTMSessionFetcherCompletionHandler)completionHandlerWithTarget:(id)target - didFinishSelector:(SEL)finishedSelector; -- (void)invokeOnCallbackQueue:(dispatch_queue_t)callbackQueue - afterUserStopped:(BOOL)afterStopped - block:(void (^)(void))block; -- (NSTimer *)retryTimer; -- (void)beginFetchForRetry; - -@property(readwrite, strong) NSData *downloadedData; -- (void)releaseCallbacks; - -- (NSInteger)statusCodeUnsynchronized; - -- (BOOL)userStoppedFetching; - -@end -#endif // !GTMSESSION_BUILD_COMBINED_SOURCES - -@interface GTMSessionUploadFetcher () - -// Changing readonly to readwrite. -@property(atomic, strong, readwrite) NSURLRequest *lastChunkRequest; -@property(atomic, readwrite, assign) int64_t currentOffset; - -// Internal properties. -@property(strong, atomic, GTM_NULLABLE) GTMSessionFetcher *fetcherInFlight; // Synchronized on self. - -@property(assign, atomic, getter=isSubdataGenerating) BOOL subdataGenerating; -@property(assign, atomic) BOOL shouldInitiateOffsetQuery; -@property(assign, atomic) int64_t uploadGranularity; - -@end - -@implementation GTMSessionUploadFetcher { - GTMSessionFetcher *_chunkFetcher; - - // We'll call through to the delegate's completion handler. - GTMSessionFetcherCompletionHandler _delegateCompletionHandler; - dispatch_queue_t _delegateCallbackQueue; - - // The initial fetch's body length and bytes actually sent are - // needed for calculating progress during subsequent chunk uploads - int64_t _initialBodyLength; - int64_t _initialBodySent; - - // The upload server address for the chunks of this upload session. - NSURL *_uploadLocationURL; - - // _uploadData, _uploadDataProvider, or _uploadFileHandle may be set, but only one. - NSData *_uploadData; - NSFileHandle *_uploadFileHandle; - GTMSessionUploadFetcherDataProvider _uploadDataProvider; - NSURL *_uploadFileURL; - int64_t _uploadFileLength; - NSString *_uploadMIMEType; - int64_t _chunkSize; - int64_t _uploadGranularity; - BOOL _isPaused; - BOOL _isRestartedUpload; - BOOL _shouldInitiateOffsetQuery; - - // Tied to useBackgroundSession property, since this property is applicable to chunk fetchers. - BOOL _useBackgroundSessionOnChunkFetchers; - - // We keep the latest offset into the upload data just for progress reporting. - int64_t _currentOffset; - - NSDictionary *_recentChunkReponseHeaders; - NSInteger _recentChunkStatusCode; - - // For waiting, we need to know the fetcher in flight, if any, and if subdata generation - // is in progress. - GTMSessionFetcher *_fetcherInFlight; - BOOL _isSubdataGenerating; - BOOL _isCancelInFlight; - - GTMSessionUploadFetcherCancellationHandler _cancellationHandler; -} - -+ (void)load { - [self uploadFetchersForBackgroundSessions]; -} - -+ (instancetype)uploadFetcherWithRequest:(NSURLRequest *)request - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(int64_t)chunkSize - fetcherService:(GTMSessionFetcherService *)fetcherService { - GTMSessionUploadFetcher *fetcher = [self uploadFetcherWithRequest:request - fetcherService:fetcherService]; - [fetcher setLocationURL:nil - uploadMIMEType:uploadMIMEType - chunkSize:chunkSize]; - return fetcher; -} - -+ (instancetype)uploadFetcherWithLocation:(NSURL * GTM_NULLABLE_TYPE)uploadLocationURL - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(int64_t)chunkSize - fetcherService:(GTMSessionFetcherService *)fetcherService { - GTMSessionUploadFetcher *fetcher = [self uploadFetcherWithRequest:nil - fetcherService:fetcherService]; - [fetcher setLocationURL:uploadLocationURL - uploadMIMEType:uploadMIMEType - chunkSize:chunkSize]; - return fetcher; -} - -+ (instancetype)uploadFetcherForSessionIdentifierMetadata:(NSDictionary *)metadata { - GTMSESSION_ASSERT_DEBUG( - [metadata[kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey] boolValue], - @"Session identifier metadata is not for an upload fetcher: %@", metadata); - - NSNumber *uploadFileLengthNum = metadata[kGTMSessionIdentifierUploadFileLengthMetadataKey]; - GTMSESSION_ASSERT_DEBUG(uploadFileLengthNum != nil, - @"Session metadata missing an UploadFileSize"); - if (uploadFileLengthNum == nil) return nil; - - int64_t uploadFileLength = [uploadFileLengthNum longLongValue]; - GTMSESSION_ASSERT_DEBUG(uploadFileLength >= 0, @"Session metadata UploadFileSize is unknown"); - - NSString *uploadFileURLString = metadata[kGTMSessionIdentifierUploadFileURLMetadataKey]; - GTMSESSION_ASSERT_DEBUG(uploadFileURLString, @"Session metadata missing an UploadFileURL"); - if (uploadFileURLString == nil) return nil; - - NSURL *uploadFileURL = [NSURL URLWithString:uploadFileURLString]; - // There used to be a call here to NSURL checkResourceIsReachableAndReturnError: to check for the - // existence of the file (also tried NSFileManager fileExistsAtPath:). We've determined - // empirically that the check can fail at startup even when the upload file does in fact exist. - // For now, we'll go ahead and restore the background upload fetcher. If the file doesn't exist, - // it will fail later. - - NSString *uploadLocationURLString = metadata[kGTMSessionIdentifierUploadLocationURLMetadataKey]; - NSURL *uploadLocationURL = - uploadLocationURLString ? [NSURL URLWithString:uploadLocationURLString] : nil; - - NSString *uploadMIMEType = - metadata[kGTMSessionIdentifierUploadMIMETypeMetadataKey]; - int64_t uploadChunkSize = - [metadata[kGTMSessionIdentifierUploadChunkSizeMetadataKey] longLongValue]; - if (uploadChunkSize <= 0) { - uploadChunkSize = kGTMSessionUploadFetcherStandardChunkSize; - } - int64_t currentOffset = - [metadata[kGTMSessionIdentifierUploadCurrentOffsetMetadataKey] longLongValue]; - GTMSESSION_ASSERT_DEBUG(currentOffset <= uploadFileLength, - @"CurrentOffset (%lld) exceeds UploadFileSize (%lld)", - currentOffset, uploadFileLength); - if (currentOffset > uploadFileLength) return nil; - - GTMSessionUploadFetcher *uploadFetcher = [self uploadFetcherWithLocation:uploadLocationURL - uploadMIMEType:uploadMIMEType - chunkSize:uploadChunkSize - fetcherService:nil]; - // Set the upload file length before setting the upload file URL tries to determine the length. - [uploadFetcher setUploadFileLength:uploadFileLength]; - - uploadFetcher.uploadFileURL = uploadFileURL; - uploadFetcher.sessionUserInfo = metadata; - uploadFetcher.useBackgroundSession = YES; - uploadFetcher.currentOffset = currentOffset; - uploadFetcher.delegateCallbackQueue = uploadFetcher.callbackQueue; - uploadFetcher.allowedInsecureSchemes = @[ @"http" ]; // Allowed on restored upload fetcher. - return uploadFetcher; -} - -+ (instancetype)uploadFetcherWithRequest:(NSURLRequest *)request - fetcherService:(GTMSessionFetcherService *)fetcherService { - // Internal utility method for instantiating fetchers - GTMSessionUploadFetcher *fetcher; - if ([fetcherService isKindOfClass:[GTMSessionFetcherService class]]) { - fetcher = [fetcherService fetcherWithRequest:request - fetcherClass:self]; - } else { - fetcher = [self fetcherWithRequest:request]; - } - fetcher.useBackgroundSession = YES; - return fetcher; -} - -+ (NSPointerArray *)uploadFetcherPointerArrayForBackgroundSessions { - static NSPointerArray *gUploadFetcherPointerArrayForBackgroundSessions = nil; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - gUploadFetcherPointerArrayForBackgroundSessions = [NSPointerArray weakObjectsPointerArray]; - }); - return gUploadFetcherPointerArrayForBackgroundSessions; -} - -+ (instancetype)uploadFetcherForSessionIdentifier:(NSString *)sessionIdentifier { - GTMSESSION_ASSERT_DEBUG(sessionIdentifier != nil, @"Invalid session identifier"); - NSArray *uploadFetchersForBackgroundSessions = [self uploadFetchersForBackgroundSessions]; - for (GTMSessionUploadFetcher *uploadFetcher in uploadFetchersForBackgroundSessions) { - if ([uploadFetcher.chunkFetcher.sessionIdentifier isEqual:sessionIdentifier]) { - return uploadFetcher; - } - } - return nil; -} - -+ (NSArray *)uploadFetchersForBackgroundSessions { - // Collect the background session upload fetchers that are still in memory. - NSPointerArray *uploadFetcherPointerArray = [self uploadFetcherPointerArrayForBackgroundSessions]; - [uploadFetcherPointerArray compact]; - NSMutableSet *restoredSessionIdentifiers = [[NSMutableSet alloc] init]; - NSMutableArray *uploadFetchers = [[NSMutableArray alloc] init]; - for (GTMSessionUploadFetcher *uploadFetcher in uploadFetcherPointerArray) { - NSString *sessionIdentifier = uploadFetcher.chunkFetcher.sessionIdentifier; - if (sessionIdentifier) { - [restoredSessionIdentifiers addObject:sessionIdentifier]; - [uploadFetchers addObject:uploadFetcher]; - } - } - - // The system may have other ongoing background upload sessions. Restore upload fetchers for those - // too. - NSArray *fetchers = [GTMSessionFetcher fetchersForBackgroundSessions]; - for (GTMSessionFetcher *fetcher in fetchers) { - NSString *sessionIdentifier = fetcher.sessionIdentifier; - if (!sessionIdentifier || [restoredSessionIdentifiers containsObject:sessionIdentifier]) { - continue; - } - NSDictionary *sessionIdentifierMetadata = [fetcher sessionIdentifierMetadata]; - if (sessionIdentifierMetadata == nil) { - continue; - } - if (![sessionIdentifierMetadata[kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey] boolValue]) { - continue; - } - GTMSessionUploadFetcher *uploadFetcher = - [self uploadFetcherForSessionIdentifierMetadata:sessionIdentifierMetadata]; - if (uploadFetcher == nil) { - // Something went wrong with this upload fetcher, so kill the restored chunk fetcher. - [fetcher stopFetching]; - continue; - } - [uploadFetchers addObject:uploadFetcher]; - uploadFetcher->_chunkFetcher = fetcher; - uploadFetcher->_fetcherInFlight = fetcher; - [uploadFetcher attachSendProgressBlockToChunkFetcher:fetcher]; - fetcher.completionHandler = - [fetcher completionHandlerWithTarget:uploadFetcher - didFinishSelector:@selector(chunkFetcher:finishedWithData:error:)]; - - GTMSESSION_LOG_DEBUG(@"%@ restoring upload fetcher %@ for chunk fetcher %@", - [self class], uploadFetcher, fetcher); - } - return uploadFetchers; -} - -- (void)setUploadData:(NSData *)data { - BOOL changed = NO; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_uploadData != data) { - _uploadData = data; - changed = YES; - } - } - if (changed) { - [self setupRequestHeaders]; - } -} - -- (NSData *)uploadData { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _uploadData; - } -} - -- (void)setUploadFileHandle:(NSFileHandle *)fh { - BOOL changed = NO; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_uploadFileHandle != fh) { - _uploadFileHandle = fh; - changed = YES; - } - } - if (changed) { - [self setupRequestHeaders]; - } -} - -- (NSFileHandle *)uploadFileHandle { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _uploadFileHandle; - } -} - -- (void)setUploadFileURL:(NSURL *)uploadURL { - BOOL changed = NO; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_uploadFileURL != uploadURL) { - _uploadFileURL = uploadURL; - changed = YES; - } - } - if (changed) { - [self setupRequestHeaders]; - } -} - -- (NSURL *)uploadFileURL { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _uploadFileURL; - } -} - -- (void)setUploadFileLength:(int64_t)fullLength { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_uploadFileLength == kGTMSessionUploadFetcherUnknownFileSize && - fullLength != kGTMSessionUploadFetcherUnknownFileSize) { - _uploadFileLength = fullLength; - } - } -} - -- (void)setUploadDataLength:(int64_t)fullLength - provider:(GTMSessionUploadFetcherDataProvider)block { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _uploadDataProvider = [block copy]; - _uploadFileLength = fullLength; - } - [self setupRequestHeaders]; -} - -- (GTMSessionUploadFetcherDataProvider)uploadDataProvider { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _uploadDataProvider; - } -} - - -- (void)setUploadMIMEType:(NSString *)uploadMIMEType { - GTMSESSION_ASSERT_DEBUG(0, @"TODO: disallow setUploadMIMEType by making declaration readonly"); - // (and uploadMIMEType, chunksize, currentOffset) - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _uploadMIMEType = uploadMIMEType; - } -} - -- (NSString *)uploadMIMEType { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _uploadMIMEType; - } -} - -- (void)setChunkSize:(int64_t)chunkSize { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _chunkSize = chunkSize; - } -} - -- (int64_t)chunkSize { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _chunkSize; - } -} - -- (void)setupRequestHeaders { - GTMSessionCheckNotSynchronized(self); - -#if DEBUG - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - int hasData = (_uploadData != nil) ? 1 : 0; - int hasFileHandle = (_uploadFileHandle != nil) ? 1 : 0; - int hasFileURL = (_uploadFileURL != nil) ? 1 : 0; - int hasUploadDataProvider = (_uploadDataProvider != nil) ? 1 : 0; - int numberOfSources = hasData + hasFileHandle + hasFileURL + hasUploadDataProvider; - #pragma unused(numberOfSources) - GTMSESSION_ASSERT_DEBUG(numberOfSources == 1, - @"Need just one upload source (%d)", numberOfSources); - } // @synchronized(self) -#endif - - // Add our custom headers to the initial request indicating the data - // type and total size to be delivered later in the chunk requests. - NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; - - GTMSESSION_ASSERT_DEBUG((mutableRequest == nil) != (_uploadLocationURL == nil), - @"Request and location are mutually exclusive"); - if (!mutableRequest) return; - - [mutableRequest setValue:@"resumable" - forHTTPHeaderField:kGTMSessionHeaderXGoogUploadProtocol]; - [mutableRequest setValue:@"start" - forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; - [mutableRequest setValue:_uploadMIMEType - forHTTPHeaderField:kGTMSessionHeaderXGoogUploadContentType]; - [mutableRequest setValue:@([self fullUploadLength]).stringValue - forHTTPHeaderField:kGTMSessionHeaderXGoogUploadContentLength]; - - NSString *method = mutableRequest.HTTPMethod; - if (method == nil || [method caseInsensitiveCompare:@"GET"] == NSOrderedSame) { - [mutableRequest setHTTPMethod:@"POST"]; - } - - // Ensure the user agent header identifies this to the upload server as a - // GTMSessionUploadFetcher client. The /1 can be incremented in the unlikely circumstance - // we need to make a bug fix in the client that the server can recognize. - NSString *const kUserAgentStub = @"(GTMSUF/1)"; - NSString *userAgent = [mutableRequest valueForHTTPHeaderField:@"User-Agent"]; - if (userAgent == nil - || [userAgent rangeOfString:kUserAgentStub].location == NSNotFound) { - if (userAgent.length == 0) { - userAgent = GTMFetcherStandardUserAgentString(nil); - } - userAgent = [userAgent stringByAppendingFormat:@" %@", kUserAgentStub]; - [mutableRequest setValue:userAgent forHTTPHeaderField:@"User-Agent"]; - } - [self setRequest:mutableRequest]; -} - -- (void)setLocationURL:(NSURL * GTM_NULLABLE_TYPE)location - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(int64_t)chunkSize { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - GTMSESSION_ASSERT_DEBUG(chunkSize > 0, @"chunk size is zero"); - - // When resuming an upload, set the known upload target URL. - _uploadLocationURL = location; - - _uploadMIMEType = uploadMIMEType; - _chunkSize = chunkSize; - - // Indicate that we've not yet determined the file handle's length - _uploadFileLength = kGTMSessionUploadFetcherUnknownFileSize; - - // Indicate that we've not yet determined the upload fetcher status - _recentChunkStatusCode = -1; - - // If this is restarting an upload begun by another fetcher, - // the location is specified but the request is nil - _isRestartedUpload = (location != nil); - } // @synchronized(self) -} - -- (int64_t)fullUploadLength { - int64_t result; - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_uploadData) { - result = (int64_t)_uploadData.length; - } else { - if (_uploadFileLength == kGTMSessionUploadFetcherUnknownFileSize) { - if (_uploadFileHandle) { - // First time through, seek to end to determine file length - _uploadFileLength = (int64_t)[_uploadFileHandle seekToEndOfFile]; - } else if (_uploadDataProvider) { - // _uploadFileLength is set when the _uploadDataProvider is set. - GTMSESSION_ASSERT_DEBUG(_uploadFileLength >= 0, @"No uploadDataProvider length set"); - } else { - NSNumber *filesizeNum; - NSError *valueError; - if ([_uploadFileURL getResourceValue:&filesizeNum - forKey:NSURLFileSizeKey - error:&valueError]) { - _uploadFileLength = filesizeNum.longLongValue; - } else { - GTMSESSION_ASSERT_DEBUG(NO, @"Cannot get file size: %@\n %@", - valueError, _uploadFileURL.path); - _uploadFileLength = 0; - } - } - } - result = _uploadFileLength; - } - } // @synchronized(self) - return result; -} - -// Make a subdata of the upload data. -- (void)generateChunkSubdataWithOffset:(int64_t)offset - length:(int64_t)length - response:(GTMSessionUploadFetcherDataProviderResponse)response { - GTMSessionUploadFetcherDataProvider uploadDataProvider = self.uploadDataProvider; - if (uploadDataProvider) { - uploadDataProvider(offset, length, response); - return; - } - - NSData *uploadData = self.uploadData; - if (uploadData) { - // NSData provided. - NSData *resultData; - if (offset == 0 && length == (int64_t)uploadData.length) { - resultData = uploadData; - } else { - int64_t dataLength = (int64_t)uploadData.length; - // Ensure our range is valid. b/18007814 - if (offset + length > dataLength) { - NSString *errorMessage = [NSString stringWithFormat: - @"Range invalid for upload data. offset: %lld\tlength: %lld\tdataLength: %lld", - offset, length, dataLength]; - GTMSESSION_ASSERT_DEBUG(NO, @"%@", errorMessage); - response(nil, - kGTMSessionUploadFetcherUnknownFileSize, - [self uploadChunkUnavailableErrorWithDescription:errorMessage]); - return; - } - NSRange range = NSMakeRange((NSUInteger)offset, (NSUInteger)length); - - @try { - resultData = [uploadData subdataWithRange:range]; - } - @catch (NSException *exception) { - NSString *errorMessage = exception.description; - GTMSESSION_ASSERT_DEBUG(NO, @"%@", errorMessage); - response(nil, - kGTMSessionUploadFetcherUnknownFileSize, - [self uploadChunkUnavailableErrorWithDescription:errorMessage]); - return; - } - } - response(resultData, kGTMSessionUploadFetcherUnknownFileSize, nil); - return; - } - NSURL *uploadFileURL = self.uploadFileURL; - if (uploadFileURL) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [self generateChunkSubdataFromFileURL:uploadFileURL - offset:offset - length:length - response:response]; - }); - return; - } - GTMSESSION_ASSERT_DEBUG(_uploadFileHandle, @"Unexpectedly missing upload data package"); - NSFileHandle *uploadFileHandle = self.uploadFileHandle; - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [self generateChunkSubdataFromFileHandle:uploadFileHandle - offset:offset - length:length - response:response]; - }); -} - -- (void)generateChunkSubdataFromFileHandle:(NSFileHandle *)fileHandle - offset:(int64_t)offset - length:(int64_t)length - response:(GTMSessionUploadFetcherDataProviderResponse)response { - NSData *resultData; - NSError *error; - @try { - [fileHandle seekToFileOffset:(unsigned long long)offset]; - resultData = [fileHandle readDataOfLength:(NSUInteger)length]; - } - @catch (NSException *exception) { - GTMSESSION_ASSERT_DEBUG(NO, @"uploadFileHandle failed to read, %@", exception); - error = [self uploadChunkUnavailableErrorWithDescription:exception.description]; - } - // The response always re-dispatches to the main thread, so we skip doing that here. - response(resultData, kGTMSessionUploadFetcherUnknownFileSize, error); -} - -- (void)generateChunkSubdataFromFileURL:(NSURL *)fileURL - offset:(int64_t)offset - length:(int64_t)length - response:(GTMSessionUploadFetcherDataProviderResponse)response { - GTMSessionCheckNotSynchronized(self); - - NSData *resultData; - NSError *error; - int64_t fullUploadLength = [self fullUploadLength]; - NSData *mappedData = - [NSData dataWithContentsOfURL:fileURL - options:NSDataReadingMappedAlways + NSDataReadingUncached - error:&error]; - if (!mappedData) { - // We could not create an NSData by memory-mapping the file. -#if TARGET_IPHONE_SIMULATOR - // NSTemporaryDirectory() can differ in the simulator between app restarts, - // yet the contents for the new path remains unchanged, so try the latest temp path. - if ([error.domain isEqual:NSCocoaErrorDomain] && (error.code == NSFileReadNoSuchFileError)) { - NSString *filename = [fileURL lastPathComponent]; - NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:filename]; - NSURL *newFileURL = [NSURL fileURLWithPath:filePath]; - if (![newFileURL isEqual:fileURL]) { - [self generateChunkSubdataFromFileURL:newFileURL - offset:offset - length:length - response:response]; - return; - } - } -#endif - - // If the file is just too large to create an NSData for, or if for some other reason we can't - // map it, create an NSFileHandle instead to read a subset into an NSData. -#if DEBUG - NSNumber *fileSizeNum; - BOOL hasFileSize = [fileURL getResourceValue:&fileSizeNum forKey:NSURLFileSizeKey error:NULL]; - GTMSESSION_LOG_DEBUG(@"Note: uploadFileURL is falling back to creating upload chunks by reading" - @" an NSFileHandle since uploadFileURL failed to map the upload file," - @" file size %@, %@", - hasFileSize ? fileSizeNum : @"unknown", error); -#endif - - NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingFromURL:fileURL - error:&error]; - if (fileHandle != nil) { - [self generateChunkSubdataFromFileHandle:fileHandle - offset:offset - length:length - response:response]; - return; - } - GTMSESSION_ASSERT_DEBUG(NO, @"uploadFileURL failed to read, %@", error); - // Fall through with the error. - } else { - // Successfully created an NSData by memory-mapping the file. - if ((NSUInteger)(offset + length) > mappedData.length) { - NSString *errorMessage = [NSString stringWithFormat: - @"Range invalid for upload data. offset: %lld\tlength: %lld\tdataLength: %lld\texpected UploadLength: %lld", - offset, length, (long long)mappedData.length, fullUploadLength]; - GTMSESSION_ASSERT_DEBUG(NO, @"%@", errorMessage); - response(nil, - kGTMSessionUploadFetcherUnknownFileSize, - [self uploadChunkUnavailableErrorWithDescription:errorMessage]); - return; - } - if (offset > 0 || length < fullUploadLength) { - NSRange range = NSMakeRange((NSUInteger)offset, (NSUInteger)length); - resultData = [mappedData subdataWithRange:range]; - } else { - resultData = mappedData; - } - } - // The response always re-dispatches to the main thread, so we skip re-dispatching here. - response(resultData, kGTMSessionUploadFetcherUnknownFileSize, error); -} - -- (NSError *)uploadChunkUnavailableErrorWithDescription:(NSString *)description { - // The description in the userInfo is intended as a clue to programmers, not - // for client code to examine or rely on. - NSDictionary *userInfo = @{ @"description" : description }; - return [NSError errorWithDomain:kGTMSessionFetcherErrorDomain - code:GTMSessionFetcherErrorUploadChunkUnavailable - userInfo:userInfo]; -} - -- (NSError *)prematureFailureErrorWithUserInfo:(NSDictionary *)userInfo { - // An error for if we get an unexpected status from the upload server or - // otherwise cannot continue. This is an issue beyond the upload protocol; - // there's no way the client can do anything useful except give up. - NSError *error = [NSError errorWithDomain:kGTMSessionFetcherStatusDomain - code:501 // Not implemented - userInfo:userInfo]; - return error; -} - -+ (GTMSessionUploadFetcherStatus)uploadStatusFromResponseHeaders:(NSDictionary *)responseHeaders { - NSString *statusString = [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadStatus]; - if ([statusString isEqual:@"active"]) { - return kStatusActive; - } - if ([statusString isEqual:@"final"]) { - return kStatusFinal; - } - if ([statusString isEqual:@"cancelled"]) { - return kStatusCancelled; - } - return kStatusUnknown; -} - -#pragma mark Method overrides affecting the initial fetch only - -- (void)setCompletionHandler:(GTMSessionFetcherCompletionHandler)handler { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _delegateCompletionHandler = handler; - } -} - -- (void)setDelegateCallbackQueue:(dispatch_queue_t GTM_NULLABLE_TYPE)queue { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _delegateCallbackQueue = queue; - } -} - -- (dispatch_queue_t GTM_NULLABLE_TYPE)delegateCallbackQueue { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _delegateCallbackQueue; - } -} - -- (BOOL)isRestartedUpload { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _isRestartedUpload; - } -} - -- (GTMSessionFetcher * GTM_NULLABLE_TYPE)chunkFetcher { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _chunkFetcher; - } -} - -- (void)setChunkFetcher:(GTMSessionFetcher * GTM_NULLABLE_TYPE)fetcher { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _chunkFetcher = fetcher; - } -} - -- (void)setFetcherInFlight:(GTMSessionFetcher * GTM_NULLABLE_TYPE)fetcher { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _fetcherInFlight = fetcher; - } -} - -- (GTMSessionFetcher * GTM_NULLABLE_TYPE)fetcherInFlight { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _fetcherInFlight; - } -} - -- (void)setCancellationHandler:(GTMSessionUploadFetcherCancellationHandler GTM_NULLABLE_TYPE) - cancellationHandler { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _cancellationHandler = cancellationHandler; - } -} - -- (GTMSessionUploadFetcherCancellationHandler GTM_NULLABLE_TYPE)cancellationHandler { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _cancellationHandler; - } -} - -- (void)beginFetchForRetry { - GTMSessionCheckNotSynchronized(self); - - // Override the superclass to reset the initial body length and fetcher-in-flight, - // then call the superclass implementation. - [self setInitialBodyLength:[self bodyLength]]; - - GTMSESSION_ASSERT_DEBUG(self.fetcherInFlight == nil, @"unexpected fetcher in flight: %@", - self.fetcherInFlight); - self.fetcherInFlight = self; - [super beginFetchForRetry]; -} - -- (void)beginFetchWithCompletionHandler:(GTMSessionFetcherCompletionHandler)handler { - GTMSessionCheckNotSynchronized(self); - - [self setInitialBodyLength:[self bodyLength]]; - - // We'll hold onto the superclass's callback queue so we can invoke the handler - // even after the superclass has released the queue and its callback handler, as - // happens during auth failure. - [self setDelegateCallbackQueue:self.callbackQueue]; - self.completionHandler = handler; - - if ([self isRestartedUpload]) { - // When restarting an upload, we know the destination location for chunk fetches, - // but we need to query to find the initial offset. - if (![self isPaused]) { - [self sendQueryForUploadOffsetWithFetcherProperties:self.properties]; - } - return; - } - // We don't want to call into the client's completion block immediately - // after the finish of the initial connection (the delegate is called only - // when uploading finishes), so we substitute our own completion block to be - // called when the initial connection finishes - GTMSESSION_ASSERT_DEBUG(self.fetcherInFlight == nil, @"unexpected fetcher in flight: %@", - self.fetcherInFlight); - - self.fetcherInFlight = self; - [super beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { - self.fetcherInFlight = nil; - // callback - - BOOL hasTestBlock = (self.testBlock != nil); - if (![self isRestartedUpload] && !hasTestBlock) { - if (error == nil) { - [self beginChunkFetches]; - } else { - if ([self retryTimer] == nil) { - [self invokeFinalCallbackWithData:nil - error:error - shouldInvalidateLocation:YES]; - } - } - } else { - // If there was no initial request, then this fetch is resuming some - // other uploadFetcher's initial request, and the superclass's connection - // is never used, so at this point we call the user's actual completion - // block. - if (!hasTestBlock) { - [self invokeFinalCallbackWithData:data - error:error - shouldInvalidateLocation:YES]; - } else { - // There was a test block, so we won't do chunk fetches, but we simulate obtaining - // the data to be uploaded from the upload data provider block or the file handle, - // and then call back. - [self generateChunkSubdataWithOffset:0 - length:[self fullUploadLength] - response:^(NSData *generateData, int64_t fullUploadLength, NSError *generateError) { - [self invokeFinalCallbackWithData:data - error:error - shouldInvalidateLocation:YES]; - }]; - } - } - }]; -} - -- (void)beginChunkFetches { - GTMSessionCheckNotSynchronized(self); - -#if DEBUG - // The initial response of the resumable upload protocol should have an - // empty body - // - // This assert typically happens because the upload create/edit link URL was - // not supplied with the request, and the server is thus expecting a non- - // resumable request/response. - if (self.downloadedData.length > 0) { - NSData *downloadedData = self.downloadedData; - NSString *str = [[NSString alloc] initWithData:downloadedData - encoding:NSUTF8StringEncoding]; - #pragma unused(str) - GTMSESSION_ASSERT_DEBUG(NO, @"unexpected response data (uploading to the wrong URL?)\n%@", str); - } -#endif - - // We need to get the upload URL from the location header to continue. - NSDictionary *responseHeaders = [self responseHeaders]; - - [self retrieveUploadChunkGranularityFromResponseHeaders:responseHeaders]; - - GTMSessionUploadFetcherStatus uploadStatus = - [[self class] uploadStatusFromResponseHeaders:responseHeaders]; - GTMSESSION_ASSERT_DEBUG(uploadStatus != kStatusUnknown, - @"beginChunkFetches has unexpected upload status for headers %@", responseHeaders); - - BOOL isPrematureStop = (uploadStatus == kStatusFinal) || (uploadStatus == kStatusCancelled); - - NSString *uploadLocationURLStr = [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadURL]; - BOOL hasUploadLocation = (uploadLocationURLStr.length > 0); - - if (isPrematureStop || !hasUploadLocation) { - GTMSESSION_ASSERT_DEBUG(NO, @"Premature failure: upload-status:\"%@\" location:%@", - [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadStatus], uploadLocationURLStr); - // We cannot continue since we do not know the location to use - // as our upload destination. - NSDictionary *userInfo = nil; - NSData *downloadedData = self.downloadedData; - if (downloadedData.length > 0) { - userInfo = @{ kGTMSessionFetcherStatusDataKey : downloadedData }; - } - NSError *failureError = [self prematureFailureErrorWithUserInfo:userInfo]; - [self invokeFinalCallbackWithData:nil - error:failureError - shouldInvalidateLocation:YES]; - return; - } - - self.uploadLocationURL = [NSURL URLWithString:uploadLocationURLStr]; - - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName:kGTMSessionFetcherUploadLocationObtainedNotification - object:self]; - - // we've now sent all of the initial post body data, so we need to include - // its size in future progress indicator callbacks - [self setInitialBodySent:[self initialBodyLength]]; - - // just in case the user paused us during the initial fetch... - if (![self isPaused]) { - [self uploadNextChunkWithOffset:0]; - } -} - -- (void)URLSession:(NSURLSession *)session - task:(NSURLSessionTask *)task - didSendBodyData:(int64_t)bytesSent - totalBytesSent:(int64_t)totalBytesSent - totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { - // Overrides the superclass. - [self invokeDelegateWithDidSendBytes:bytesSent - totalBytesSent:totalBytesSent - totalBytesExpectedToSend:totalBytesExpectedToSend + [self fullUploadLength]]; -} - -- (BOOL)shouldReleaseCallbacksUponCompletion { - // Overrides the superclass. - - // We don't want the superclass to release the delegate and callback - // blocks once the initial fetch has finished - // - // This is invoked for only successful completion of the connection; - // an error always will invoke and release the callbacks - return NO; -} - -- (void)invokeFinalCallbackWithData:(NSData *)data - error:(NSError *)error - shouldInvalidateLocation:(BOOL)shouldInvalidateLocation { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (shouldInvalidateLocation) { - _uploadLocationURL = nil; - } - - dispatch_queue_t queue = _delegateCallbackQueue; - GTMSessionFetcherCompletionHandler handler = _delegateCompletionHandler; - if (queue && handler) { - [self invokeOnCallbackQueue:queue - afterUserStopped:NO - block:^{ - handler(data, error); - }]; - } - } // @synchronized(self) - - [self releaseUploadAndBaseCallbacks:!self.userStoppedFetching]; -} - -- (void)releaseUploadAndBaseCallbacks:(BOOL)shouldReleaseCancellation { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _delegateCallbackQueue = nil; - _delegateCompletionHandler = nil; - _uploadDataProvider = nil; - if (shouldReleaseCancellation) { - _cancellationHandler = nil; - } - } - - // Release the base class's callbacks, too, if needed. - [self releaseCallbacks]; -} - -- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks { - GTMSessionCheckNotSynchronized(self); - - // Clear _fetcherInFlight when stopped. Moved from stopFetching, since that's a public method, - // where this method does the work. Fixes issue clearing value when retryBlock included. - GTMSessionFetcher *fetcherInFlight = self.fetcherInFlight; - if (fetcherInFlight == self) { - self.fetcherInFlight = nil; - } - - [super stopFetchReleasingCallbacks:shouldReleaseCallbacks]; - - if (shouldReleaseCallbacks) { - [self releaseUploadAndBaseCallbacks:NO]; - } -} - -#pragma mark Chunk fetching methods - -- (void)uploadNextChunkWithOffset:(int64_t)offset { - // use the properties in each chunk fetcher - NSDictionary *props = [self properties]; - - [self uploadNextChunkWithOffset:offset - fetcherProperties:props]; -} - -- (void)sendQueryForUploadOffsetWithFetcherProperties:(NSDictionary *)props { - GTMSessionFetcher *queryFetcher = [self uploadFetcherWithProperties:props - isQueryFetch:YES]; - queryFetcher.bodyData = [NSData data]; - - NSString *originalComment = self.comment; - [queryFetcher setCommentWithFormat:@"%@ (query offset)", - originalComment ? originalComment : @"upload"]; - - [queryFetcher setRequestValue:@"query" forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; - - self.fetcherInFlight = queryFetcher; - [queryFetcher beginFetchWithDelegate:self - didFinishSelector:@selector(queryFetcher:finishedWithData:error:)]; -} - -- (void)queryFetcher:(GTMSessionFetcher *)queryFetcher - finishedWithData:(NSData *)data - error:(NSError *)error { - self.fetcherInFlight = nil; - - NSDictionary *responseHeaders = [queryFetcher responseHeaders]; - NSString *sizeReceivedHeader; - - GTMSessionUploadFetcherStatus uploadStatus = - [[self class] uploadStatusFromResponseHeaders:responseHeaders]; - GTMSESSION_ASSERT_DEBUG(uploadStatus != kStatusUnknown || error != nil, - @"query fetcher completion has unexpected upload status for headers %@", responseHeaders); - - if (error == nil) { - sizeReceivedHeader = [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadSizeReceived]; - - if (uploadStatus == kStatusCancelled || - (uploadStatus == kStatusActive && sizeReceivedHeader == nil)) { - NSDictionary *userInfo = nil; - if (data.length > 0) { - userInfo = @{ kGTMSessionFetcherStatusDataKey : data }; - } - error = [self prematureFailureErrorWithUserInfo:userInfo]; - } - } - - if (error == nil) { - int64_t offset = [sizeReceivedHeader longLongValue]; - int64_t fullUploadLength = [self fullUploadLength]; - if (uploadStatus == kStatusFinal || - (offset >= fullUploadLength && - fullUploadLength != kGTMSessionUploadFetcherUnknownFileSize)) { - // Handle we're done - [self chunkFetcher:queryFetcher finishedWithData:data error:nil]; - } else { - [self retrieveUploadChunkGranularityFromResponseHeaders:responseHeaders]; - [self uploadNextChunkWithOffset:offset]; - } - } else { - // Handle query error - [self chunkFetcher:queryFetcher finishedWithData:data error:error]; - } -} - -- (void)sendCancelUploadWithFetcherProperties:(NSDictionary *)props { - @synchronized(self) { - _isCancelInFlight = YES; - } - GTMSessionFetcher *cancelFetcher = [self uploadFetcherWithProperties:props - isQueryFetch:YES]; - cancelFetcher.bodyData = [NSData data]; - - NSString *originalComment = self.comment; - [cancelFetcher setCommentWithFormat:@"%@ (cancel)", - originalComment ? originalComment : @"upload"]; - - [cancelFetcher setRequestValue:@"cancel" forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; - - self.fetcherInFlight = cancelFetcher; - [cancelFetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { - self.fetcherInFlight = nil; - if (![self triggerCancellationHandlerForFetch:cancelFetcher data:data error:error]) { - if (error) { - GTMSESSION_LOG_DEBUG(@"cancelFetcher %@", error); - } - } - @synchronized(self) { - _isCancelInFlight = NO; - } - }]; -} - -- (void)uploadNextChunkWithOffset:(int64_t)offset - fetcherProperties:(NSDictionary *)props { - GTMSessionCheckNotSynchronized(self); - - // Example chunk headers: - // X-Goog-Upload-Command: upload, finalize - // X-Goog-Upload-Offset: 0 - // Content-Length: 2000000 - // Content-Type: image/jpeg - // - // {bytes 0-1999999} - - // The chunk upload URL requires no authentication header. - GTMSessionFetcher *chunkFetcher = [self uploadFetcherWithProperties:props - isQueryFetch:NO]; - [self attachSendProgressBlockToChunkFetcher:chunkFetcher]; - int64_t chunkSize = [self updateChunkFetcher:chunkFetcher - forChunkAtOffset:offset]; - BOOL isUploadingFileURL = (self.uploadFileURL != nil); - int64_t fullUploadLength = [self fullUploadLength]; - - // The chunk size may have changed, so determine again if we're uploading the full file. - BOOL isUploadingFullFile = (offset == 0 && - fullUploadLength != kGTMSessionUploadFetcherUnknownFileSize && - chunkSize >= fullUploadLength); - if (isUploadingFullFile && isUploadingFileURL) { - // The data is the full upload file URL. - chunkFetcher.bodyFileURL = self.uploadFileURL; - [self beginChunkFetcher:chunkFetcher - offset:offset]; - } else { - // Make an NSData for the subset for this upload chunk. - self.subdataGenerating = YES; - [self generateChunkSubdataWithOffset:offset - length:chunkSize - response:^(NSData *chunkData, int64_t uploadFileLength, NSError *chunkError) { - // The subdata methods may leave us on a background thread. - dispatch_async(dispatch_get_main_queue(), ^{ - self.subdataGenerating = NO; - - // dont allow the updating of fileLength for uploads not using a data provider as they - // should know the file length before the upload starts. - if (_uploadDataProvider != nil && uploadFileLength > 0) { - [self setUploadFileLength:uploadFileLength]; - // Update the command and content-length headers if this is the last chunk to be sent. - if (offset + chunkSize >= uploadFileLength) { - int64_t updatedChunkSize = [self updateChunkFetcher:chunkFetcher - forChunkAtOffset:offset]; - if (updatedChunkSize == 0) { - // Calling beginChunkFetcher early when there is no more data to send allows us to - // properly handle nil chunkData below without having to account for the case where - // we are just finalizing the file. - chunkFetcher.bodyData = [[NSData alloc] init]; - [self beginChunkFetcher:chunkFetcher - offset:offset]; - return; - } - } - } - - if (chunkData == nil) { - NSError *responseError = chunkError; - if (!responseError) { - responseError = [self uploadChunkUnavailableErrorWithDescription:@"chunkData is nil"]; - } - [self invokeFinalCallbackWithData:nil - error:responseError - shouldInvalidateLocation:YES]; - return; - } - - BOOL didWriteFile = NO; - if (isUploadingFileURL) { - // Make a temporary file with the data subset. - NSString *tempName = - [NSString stringWithFormat:@"GTMUpload_temp_%@", [[NSUUID UUID] UUIDString]]; - NSString *tempPath = [NSTemporaryDirectory() stringByAppendingPathComponent:tempName]; - NSError *writeError; - didWriteFile = [chunkData writeToFile:tempPath - options:NSDataWritingAtomic - error:&writeError]; - if (didWriteFile) { - chunkFetcher.bodyFileURL = [NSURL fileURLWithPath:tempPath]; - } else { - GTMSESSION_LOG_DEBUG(@"writeToFile failed: %@\n%@", writeError, tempPath); - } - } - if (!didWriteFile) { - chunkFetcher.bodyData = [chunkData copy]; - } - [self beginChunkFetcher:chunkFetcher - offset:offset]; - }); - }]; - } -} - -- (void)beginChunkFetcher:(GTMSessionFetcher *)chunkFetcher - offset:(int64_t)offset { - - // Track the current offset for progress reporting - self.currentOffset = offset; - - // Hang on to the fetcher in case we need to cancel it. We set these before beginning the - // chunk fetch so the observers notified of chunk fetches can inspect the upload fetcher to - // match to the chunk. - self.chunkFetcher = chunkFetcher; - self.fetcherInFlight = chunkFetcher; - - // Update the last chunk request, including any request headers. - self.lastChunkRequest = chunkFetcher.request; - - [chunkFetcher beginFetchWithDelegate:self - didFinishSelector:@selector(chunkFetcher:finishedWithData:error:)]; -} - -- (void)attachSendProgressBlockToChunkFetcher:(GTMSessionFetcher *)chunkFetcher { - chunkFetcher.sendProgressBlock = ^(int64_t bytesSent, int64_t totalBytesSent, - int64_t totalBytesExpectedToSend) { - // The total bytes expected include the initial body and the full chunked - // data, independent of how big this fetcher's chunk is. - int64_t initialBodySent = [self bodyLength]; // TODO(grobbins) use [self initialBodySent] - int64_t totalSent = initialBodySent + self.currentOffset + totalBytesSent; - int64_t totalExpected = initialBodySent + [self fullUploadLength]; - - [self invokeDelegateWithDidSendBytes:bytesSent - totalBytesSent:totalSent - totalBytesExpectedToSend:totalExpected]; - }; -} - -- (NSDictionary *)uploadSessionIdentifierMetadata { - NSMutableDictionary *metadata = [NSMutableDictionary dictionary]; - metadata[kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey] = @YES; - GTMSESSION_ASSERT_DEBUG(self.uploadFileURL, - @"Invalid upload fetcher to create session identifier for metadata"); - metadata[kGTMSessionIdentifierUploadFileURLMetadataKey] = [self.uploadFileURL absoluteString]; - metadata[kGTMSessionIdentifierUploadFileLengthMetadataKey] = @([self fullUploadLength]); - - if (self.uploadLocationURL) { - metadata[kGTMSessionIdentifierUploadLocationURLMetadataKey] = - [self.uploadLocationURL absoluteString]; - } - if (self.uploadMIMEType) { - metadata[kGTMSessionIdentifierUploadMIMETypeMetadataKey] = self.uploadMIMEType; - } - metadata[kGTMSessionIdentifierUploadChunkSizeMetadataKey] = @(self.chunkSize); - metadata[kGTMSessionIdentifierUploadCurrentOffsetMetadataKey] = @(self.currentOffset); - return metadata; -} - -- (GTMSessionFetcher *)uploadFetcherWithProperties:(NSDictionary *)properties - isQueryFetch:(BOOL)isQueryFetch { - GTMSessionCheckNotSynchronized(self); - - // Common code to make a request for a query command or for a chunk upload. - NSURL *uploadLocationURL = self.uploadLocationURL; - NSMutableURLRequest *chunkRequest = [NSMutableURLRequest requestWithURL:uploadLocationURL]; - [chunkRequest setHTTPMethod:@"PUT"]; - - // copy the user-agent from the original connection - NSURLRequest *origRequest = self.request; - NSString *userAgent = [origRequest valueForHTTPHeaderField:@"User-Agent"]; - if (userAgent.length > 0) { - [chunkRequest setValue:userAgent forHTTPHeaderField:@"User-Agent"]; - } - // To avoid timeouts when debugging, copy the timeout of the initial fetcher. - NSTimeInterval origTimeout = [origRequest timeoutInterval]; - [chunkRequest setTimeoutInterval:origTimeout]; - - // - // Make a new chunk fetcher. - // - GTMSessionFetcher *chunkFetcher = [GTMSessionFetcher fetcherWithRequest:chunkRequest]; - chunkFetcher.callbackQueue = self.callbackQueue; - chunkFetcher.sessionUserInfo = self.sessionUserInfo; - chunkFetcher.configurationBlock = self.configurationBlock; - chunkFetcher.allowedInsecureSchemes = self.allowedInsecureSchemes; - chunkFetcher.allowLocalhostRequest = self.allowLocalhostRequest; - chunkFetcher.allowInvalidServerCertificates = self.allowInvalidServerCertificates; - chunkFetcher.useUploadTask = !isQueryFetch; - - if (self.uploadFileURL && !isQueryFetch && self.useBackgroundSession) { - [chunkFetcher createSessionIdentifierWithMetadata:[self uploadSessionIdentifierMetadata]]; - } - - // Give the chunk fetcher the same properties as the previous chunk fetcher - chunkFetcher.properties = [properties mutableCopy]; - [chunkFetcher setProperty:[NSValue valueWithNonretainedObject:self] - forKey:kGTMSessionUploadFetcherChunkParentKey]; - - // copy other fetcher settings to the new fetcher - chunkFetcher.retryEnabled = self.retryEnabled; - chunkFetcher.maxRetryInterval = self.maxRetryInterval; - - if ([self isRetryEnabled]) { - // We interpose our own retry method both so we can change the request to ask the server to - // tell us where to resume the chunk. - chunkFetcher.retryBlock = ^(BOOL suggestedWillRetry, NSError *chunkError, - GTMSessionFetcherRetryResponse response) { - void (^finish)(BOOL) = ^(BOOL shouldRetry){ - // We'll retry by sending an offset query. - if (shouldRetry) { - self.shouldInitiateOffsetQuery = !isQueryFetch; - - // We don't know what our actual offset is anymore, but the server will tell us. - self.currentOffset = 0; - } - // We don't actually want to retry this specific fetcher. - response(NO); - }; - - GTMSessionFetcherRetryBlock retryBlock = self.retryBlock; - if (retryBlock) { - // Ask the client, then call the finish block above. - retryBlock(suggestedWillRetry, chunkError, finish); - } else { - finish(suggestedWillRetry); - } - }; - } - - return chunkFetcher; -} - -- (void)chunkFetcher:(GTMSessionFetcher *)chunkFetcher - finishedWithData:(NSData *)data - error:(NSError *)error { - BOOL hasDestroyedOldChunkFetcher = NO; - self.fetcherInFlight = nil; - - NSDictionary *responseHeaders = [chunkFetcher responseHeaders]; - GTMSessionUploadFetcherStatus uploadStatus = - [[self class] uploadStatusFromResponseHeaders:responseHeaders]; - GTMSESSION_ASSERT_DEBUG(uploadStatus != kStatusUnknown - || error != nil - || self.wasCreatedFromBackgroundSession, - @"chunk fetcher completion has kStatusUnknown upload status for headers %@ fetcher %@", - responseHeaders, self); - BOOL isUploadStatusStopped = (uploadStatus == kStatusFinal || uploadStatus == kStatusCancelled); - - // Check if the fetcher was actually querying. If it failed, do not retry, - // as it would enter an infinite retry loop. - NSString *uploadCommand = - chunkFetcher.request.allHTTPHeaderFields[kGTMSessionHeaderXGoogUploadCommand]; - BOOL isQueryFetch = [uploadCommand isEqual:@"query"]; - - // TODO - // Maybe here we can check to see if the request had x goog content length set. (the file length one). - int64_t previousContentLength = - [[chunkFetcher.request valueForHTTPHeaderField:@"Content-Length"] longLongValue]; - // The Content-Length header may not be present if the chunk fetcher was recreated from - // a background session. - BOOL hasKnownChunkSize = (previousContentLength > 0); - BOOL needsQuery = (!hasKnownChunkSize && !isUploadStatusStopped); - - if (error || (needsQuery && !isQueryFetch)) { - NSInteger status = error.code; - - // Status 4xx indicates a bad offset in the Google upload protocol. However, do not retry status - // 404 per spec, nor if the upload size appears to have been zero (since the server will just - // keep asking us to retry.) - if (self.shouldInitiateOffsetQuery || - (needsQuery && !isQueryFetch) || - ([error.domain isEqual:kGTMSessionFetcherStatusDomain] && - status >= 400 && status <= 499 && - status != 404 && - uploadStatus == kStatusActive && - previousContentLength > 0)) { - self.shouldInitiateOffsetQuery = NO; - [self destroyChunkFetcher]; - hasDestroyedOldChunkFetcher = YES; - [self sendQueryForUploadOffsetWithFetcherProperties:chunkFetcher.properties]; - } else { - // Some unexpected status has occurred; handle it as we would a regular - // object fetcher failure. - [self invokeFinalCallbackWithData:data - error:error - shouldInvalidateLocation:NO]; - } - } else { - // The chunk has uploaded successfully. - int64_t newOffset = self.currentOffset + previousContentLength; -#if DEBUG - // Verify that if we think all of the uploading data has been sent, the server responded with - // the "final" upload status. - BOOL hasUploadAllData = (newOffset == [self fullUploadLength]); - BOOL isFinalStatus = (uploadStatus == kStatusFinal); - #pragma unused(hasUploadAllData,isFinalStatus) - GTMSESSION_ASSERT_DEBUG(hasUploadAllData == isFinalStatus || !hasKnownChunkSize, - @"uploadStatus:%@ newOffset:%lld (%lld + %lld) fullUploadLength:%lld" - @" chunkFetcher:%@ requestHeaders:%@ responseHeaders:%@", - [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadStatus], - newOffset, self.currentOffset, previousContentLength, - [self fullUploadLength], - chunkFetcher, chunkFetcher.request.allHTTPHeaderFields, - responseHeaders); -#endif - if (isUploadStatusStopped || (_currentOffset > _uploadFileLength && _uploadFileLength > 0)) { - // This was the last chunk. - if (error == nil && uploadStatus == kStatusCancelled) { - // Report cancelled status as an error. - NSDictionary *userInfo = nil; - if (data.length > 0) { - userInfo = @{ kGTMSessionFetcherStatusDataKey : data }; - } - data = nil; - error = [self prematureFailureErrorWithUserInfo:userInfo]; - } else { - // The upload is in final status. - // - // Take the chunk fetcher's data as the superclass data. - self.downloadedData = data; - self.statusCode = chunkFetcher.statusCode; - } - - // we're done - [self invokeFinalCallbackWithData:data - error:error - shouldInvalidateLocation:YES]; - } else { - // Start the next chunk. - self.currentOffset = newOffset; - - // We want to destroy this chunk fetcher before creating the next one, but - // we want to pass on its properties - NSDictionary *props = [chunkFetcher properties]; - - // We no longer need to be able to cancel this chunkFetcher. Destroy it - // before we create a new chunk fetcher. - [self destroyChunkFetcher]; - hasDestroyedOldChunkFetcher = YES; - - [self uploadNextChunkWithOffset:newOffset - fetcherProperties:props]; - } - } - if (!hasDestroyedOldChunkFetcher) { - [self destroyChunkFetcher]; - } -} - -- (void)destroyChunkFetcher { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_fetcherInFlight == _chunkFetcher) { - _fetcherInFlight = nil; - } - - [_chunkFetcher stopFetching]; - - NSURL *chunkFileURL = _chunkFetcher.bodyFileURL; - BOOL wasTemporaryUploadFile = ![chunkFileURL isEqual:_uploadFileURL]; - if (wasTemporaryUploadFile) { - NSError *error; - [[NSFileManager defaultManager] removeItemAtURL:chunkFileURL - error:&error]; - if (error) { - GTMSESSION_LOG_DEBUG(@"removingItemAtURL failed: %@\n%@", error, chunkFileURL); - } - } - - _recentChunkReponseHeaders = _chunkFetcher.responseHeaders; - - // To avoid retain cycles, remove all properties except the parent identifier. - _chunkFetcher.properties = - @{ kGTMSessionUploadFetcherChunkParentKey : [NSValue valueWithNonretainedObject:self] }; - - _chunkFetcher.retryBlock = nil; - _chunkFetcher.sendProgressBlock = nil; - _chunkFetcher = nil; - } // @synchronized(self) -} - -// This method calculates the proper values to pass to the client's send progress block. -// -// The actual total bytes sent include the initial body sent, plus the -// offset into the batched data prior to the current chunk fetcher - -- (void)invokeDelegateWithDidSendBytes:(int64_t)bytesSent - totalBytesSent:(int64_t)totalBytesSent - totalBytesExpectedToSend:(int64_t)totalBytesExpected { - GTMSessionCheckNotSynchronized(self); - - // Ensure the chunk fetcher survives the callback in case the user pauses the upload process. - __block GTMSessionFetcher *holdFetcher = self.chunkFetcher; - - [self invokeOnCallbackQueue:self.delegateCallbackQueue - afterUserStopped:NO - block:^{ - GTMSessionFetcherSendProgressBlock sendProgressBlock = self.sendProgressBlock; - if (sendProgressBlock) { - sendProgressBlock(bytesSent, totalBytesSent, totalBytesExpected); - } - holdFetcher = nil; - }]; -} - -- (void)retrieveUploadChunkGranularityFromResponseHeaders:(NSDictionary *)responseHeaders { - GTMSessionCheckNotSynchronized(self); - - // Standard granularity for Google uploads is 256K. - NSString *chunkGranularityHeader = - [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadChunkGranularity]; - self.uploadGranularity = chunkGranularityHeader.longLongValue; -} - -#pragma mark - - -- (BOOL)isPaused { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _isPaused; - } // @synchronized(self) -} - -- (void)pauseFetching { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _isPaused = YES; - } // @synchronized(self) - - // Pausing just means stopping the current chunk from uploading; - // when we resume, we will send a query request to the server to - // figure out what bytes to resume sending. - // - // We won't try to cancel the initial data upload, but rather will check - // for being paused in beginChunkFetches. - [self destroyChunkFetcher]; -} - -- (void)resumeFetching { - BOOL wasPaused; - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - wasPaused = _isPaused; - _isPaused = NO; - } // @synchronized(self) - - if (wasPaused) { - [self sendQueryForUploadOffsetWithFetcherProperties:self.properties]; - } -} - -- (void)stopFetching { - // Overrides the superclass - [self destroyChunkFetcher]; - - // If we think the server is waiting for more data, then tell it there won't be more. - if (self.uploadLocationURL) { - [self sendCancelUploadWithFetcherProperties:[self properties]]; - self.uploadLocationURL = nil; - } else { - [self invokeOnCallbackQueue:self.callbackQueue - afterUserStopped:YES - block:^{ - // Repeated calls to stopFetching may cause this path to be reached despite having sent a real - // cancel request, check here to ensure that the cancellation handler invocation which fires - // will definitely be for the real request sent previously. - @synchronized(self) { - if (_isCancelInFlight) { - return; - } - } - [self triggerCancellationHandlerForFetch:nil data:nil error:nil]; - }]; - } - - [super stopFetching]; -} - -// Fires the cancellation handler, returning whether there was a handler to be fired. -- (BOOL)triggerCancellationHandlerForFetch:(GTMSessionFetcher *)fetcher - data:(NSData *)data - error:(NSError *)error { - GTMSessionUploadFetcherCancellationHandler handler = self.cancellationHandler; - if (handler) { - handler(fetcher, data, error); - self.cancellationHandler = nil; - return YES; - } - return NO; -} - -#pragma mark - - -- (int64_t)updateChunkFetcher:(GTMSessionFetcher *)chunkFetcher - forChunkAtOffset:(int64_t)offset { - BOOL isUploadingFileURL = (self.uploadFileURL != nil); - - // Upload another chunk, meeting server-required granularity. - int64_t chunkSize = self.chunkSize; - - int64_t fullUploadLength = [self fullUploadLength]; - BOOL isFileLengthKnown = fullUploadLength >= 0; - - BOOL isUploadingFullFile = (offset == 0 && isFileLengthKnown && chunkSize >= fullUploadLength); - if (!isUploadingFileURL || !isUploadingFullFile) { - // We're not uploading the entire file and given the file URL. Since we'll be - // allocating a subdata block for a chunk, we need to bound it to something that - // won't blow the process's memory. - if (chunkSize > kGTMSessionUploadFetcherMaximumDemandBufferSize) { - chunkSize = kGTMSessionUploadFetcherMaximumDemandBufferSize; - } - } - - int64_t granularity = self.uploadGranularity; - if (granularity > 0) { - if (chunkSize < granularity) { - chunkSize = granularity; - } else { - chunkSize = chunkSize - (chunkSize % granularity); - } - } - - GTMSESSION_ASSERT_DEBUG(offset < fullUploadLength || fullUploadLength == 0, - @"offset %lld exceeds data length %lld", offset, fullUploadLength); - - if (granularity > 0) { - offset = offset - (offset % granularity); - } - - // If the chunk size is bigger than the remaining data, or else - // it's close enough in size to the remaining data that we'd rather - // avoid having a whole extra http fetch for the leftover bit, then make - // this chunk size exactly match the remaining data size - NSString *command; - int64_t thisChunkSize = chunkSize; - - BOOL isChunkTooBig = (thisChunkSize >= (fullUploadLength - offset)); - BOOL isChunkAlmostBigEnough = (fullUploadLength - offset - 2500 < thisChunkSize); - BOOL isFinalChunk = (isChunkTooBig || isChunkAlmostBigEnough) && isFileLengthKnown; - if (isFinalChunk) { - thisChunkSize = fullUploadLength - offset; - if (thisChunkSize > 0) { - command = @"upload, finalize"; - } else { - command = @"finalize"; - } - } else { - command = @"upload"; - } - NSString *lengthStr = @(thisChunkSize).stringValue; - NSString *offsetStr = @(offset).stringValue; - - [chunkFetcher setRequestValue:command forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; - [chunkFetcher setRequestValue:lengthStr forHTTPHeaderField:@"Content-Length"]; - [chunkFetcher setRequestValue:offsetStr forHTTPHeaderField:kGTMSessionHeaderXGoogUploadOffset]; - if (_uploadFileLength != kGTMSessionUploadFetcherUnknownFileSize) { - [chunkFetcher setRequestValue:@([self fullUploadLength]).stringValue - forHTTPHeaderField:kGTMSessionHeaderXGoogUploadContentLength]; - } - - // Append the range of bytes in this chunk to the fetcher comment. - NSString *baseComment = self.comment; - [chunkFetcher setCommentWithFormat:@"%@ (%lld-%lld)", - baseComment ? baseComment : @"upload", offset, MAX(0, offset + thisChunkSize - 1)]; - - return thisChunkSize; -} - -// Public properties. -@synthesize currentOffset = _currentOffset, - delegateCompletionHandler = _delegateCompletionHandler, - chunkFetcher = _chunkFetcher, - lastChunkRequest = _lastChunkRequest, - subdataGenerating = _subdataGenerating, - shouldInitiateOffsetQuery = _shouldInitiateOffsetQuery, - uploadGranularity = _uploadGranularity; - -// Internal properties. -@dynamic fetcherInFlight; -@dynamic activeFetcher; -@dynamic statusCode; -@dynamic delegateCallbackQueue; - -+ (void)removePointer:(void *)pointer fromPointerArray:(NSPointerArray *)pointerArray { - for (NSUInteger index = 0, count = pointerArray.count; index < count; ++index) { - void *pointerAtIndex = [pointerArray pointerAtIndex:index]; - if (pointerAtIndex == pointer) { - [pointerArray removePointerAtIndex:index]; - return; - } - } -} - -- (BOOL)useBackgroundSession { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _useBackgroundSessionOnChunkFetchers; - } // @synchronized(self -} - -- (void)setUseBackgroundSession:(BOOL)useBackgroundSession { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_useBackgroundSessionOnChunkFetchers != useBackgroundSession) { - _useBackgroundSessionOnChunkFetchers = useBackgroundSession; - NSPointerArray *uploadFetcherPointerArrayForBackgroundSessions = - [[self class] uploadFetcherPointerArrayForBackgroundSessions]; - if (_useBackgroundSessionOnChunkFetchers) { - [uploadFetcherPointerArrayForBackgroundSessions addPointer:(__bridge void *)self]; - } else { - [[self class] removePointer:(__bridge void *)self - fromPointerArray:uploadFetcherPointerArrayForBackgroundSessions]; - } - } - } // @synchronized(self -} - -- (BOOL)canFetchWithBackgroundSession { - // The initial upload fetcher is always a foreground session; the - // useBackgroundSession property will apply only to chunk fetchers, - // not to queries. - return NO; -} - -- (NSDictionary *)responseHeaders { - GTMSessionCheckNotSynchronized(self); - // Overrides the superclass - - // If asked for the fetcher's response, use the most recent chunk fetcher's response, - // since the original request's response lacks useful information like the actual - // Content-Type. - NSDictionary *dict = self.chunkFetcher.responseHeaders; - if (dict) { - return dict; - } - - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - if (_recentChunkReponseHeaders) { - return _recentChunkReponseHeaders; - } - } // @synchronized(self - - // No chunk fetcher yet completed, so return whatever we have from the initial fetch. - return [super responseHeaders]; -} - -- (NSInteger)statusCodeUnsynchronized { - GTMSessionCheckSynchronized(self); - - if (_recentChunkStatusCode != -1) { - // Overrides the superclass to indicate status appropriate to the initial - // or latest chunk fetch - return _recentChunkStatusCode; - } else { - return [super statusCodeUnsynchronized]; - } -} - - -- (void)setStatusCode:(NSInteger)val { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _recentChunkStatusCode = val; - } -} - -- (int64_t)initialBodyLength { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _initialBodyLength; - } -} - -- (void)setInitialBodyLength:(int64_t)length { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _initialBodyLength = length; - } -} - -- (int64_t)initialBodySent { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _initialBodySent; - } -} - -- (void)setInitialBodySent:(int64_t)length { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _initialBodySent = length; - } -} - -- (NSURL *)uploadLocationURL { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - return _uploadLocationURL; - } -} - -- (void)setUploadLocationURL:(NSURL *)locationURL { - @synchronized(self) { - GTMSessionMonitorSynchronized(self); - - _uploadLocationURL = locationURL; - } -} - -- (GTMSessionFetcher *)activeFetcher { - GTMSessionFetcher *result = self.fetcherInFlight; - if (result) return result; - - return self; -} - -- (BOOL)isFetching { - // If there is an active chunk fetcher, then the upload fetcher is considered - // to still be fetching. - if (self.fetcherInFlight != nil) return YES; - - return [super isFetching]; -} - -- (BOOL)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds { - NSDate *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; - - while (self.fetcherInFlight || self.subdataGenerating) { - if ([timeoutDate timeIntervalSinceNow] < 0) return NO; - - if (self.subdataGenerating) { - // Allow time for subdata generation. - NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:0.001]; - [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; - } else { - // Wait for any chunk or query fetchers that still have pending callbacks or - // notifications. - BOOL timedOut; - - if (self.fetcherInFlight == self) { - timedOut = ![super waitForCompletionWithTimeout:timeoutInSeconds]; - } else { - timedOut = ![self.fetcherInFlight waitForCompletionWithTimeout:timeoutInSeconds]; - } - if (timedOut) return NO; - } - } - return YES; -} - -@end - -@implementation GTMSessionFetcher (GTMSessionUploadFetcherMethods) - -- (GTMSessionUploadFetcher *)parentUploadFetcher { - NSValue *property = [self propertyForKey:kGTMSessionUploadFetcherChunkParentKey]; - if (!property) return nil; - - GTMSessionUploadFetcher *uploadFetcher = property.nonretainedObjectValue; - - GTMSESSION_ASSERT_DEBUG([uploadFetcher isKindOfClass:[GTMSessionUploadFetcher class]], - @"Unexpected parent upload fetcher class: %@", [uploadFetcher class]); - return uploadFetcher; -} - -@end diff --git a/Pods/GoogleToolboxForMac/DebugUtils/GTMDebugSelectorValidation.h b/Pods/GoogleToolboxForMac/DebugUtils/GTMDebugSelectorValidation.h deleted file mode 100644 index c90caeb1f..000000000 --- a/Pods/GoogleToolboxForMac/DebugUtils/GTMDebugSelectorValidation.h +++ /dev/null @@ -1,100 +0,0 @@ -// -// GTMDebugSelectorValidation.h -// -// This file should only be included within an implimation file. In any -// function that takes an object and selector to invoke, you should call: -// -// GTMAssertSelectorNilOrImplementedWithArguments(obj, sel, @encode(arg1type), ..., NULL) -// or -// GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(obj, sel, @encode(returnType), @encode(arg1type), ..., NULL) -// -// This will then validate that the selector is defined and using the right -// type(s), this can help catch errors much earlier then waiting for the -// selector to actually fire (and in the case of error selectors, might never -// really be tested until in the field). -// -// Copyright 2007-2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. -// - -#if DEBUG - -#import -#import "GTMDefines.h" - -static void GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(id obj, SEL sel, const char *retType, ...) { - - // verify that the object's selector is implemented with the proper - // number and type of arguments - va_list argList; - va_start(argList, retType); - - if (obj && sel) { - // check that the selector is implemented - _GTMDevAssert([obj respondsToSelector:sel], - @"\"%@\" selector \"%@\" is unimplemented or misnamed", - NSStringFromClass([obj class]), - NSStringFromSelector(sel)); - - const char *expectedArgType; - NSUInteger argCount = 2; // skip self and _cmd - NSMethodSignature *sig = [obj methodSignatureForSelector:sel]; - - // check that each expected argument is present and of the correct type - while ((expectedArgType = va_arg(argList, const char*)) != 0) { - - if ([sig numberOfArguments] > argCount) { - const char *foundArgType = [sig getArgumentTypeAtIndex:argCount]; - - _GTMDevAssert(0 == strncmp(foundArgType, expectedArgType, strlen(expectedArgType)), - @"\"%@\" selector \"%@\" argument %u should be type %s", - NSStringFromClass([obj class]), - NSStringFromSelector(sel), - (uint32_t)(argCount - 2), - expectedArgType); - } - argCount++; - } - - // check that the proper number of arguments are present in the selector - _GTMDevAssert(argCount == [sig numberOfArguments], - @"\"%@\" selector \"%@\" should have %u arguments", - NSStringFromClass([obj class]), - NSStringFromSelector(sel), - (uint32_t)(argCount - 2)); - - // if asked, validate the return type - if (retType && (strcmp("gtm_skip_return_test", retType) != 0)) { - const char *foundRetType = [sig methodReturnType]; - _GTMDevAssert(0 == strncmp(foundRetType, retType, strlen(retType)), - @"\"%@\" selector \"%@\" return type should be type %s", - NSStringFromClass([obj class]), - NSStringFromSelector(sel), - retType); - } - } - - va_end(argList); -} - -#define GTMAssertSelectorNilOrImplementedWithArguments(obj, sel, ...) \ - GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments((obj), (sel), "gtm_skip_return_test", __VA_ARGS__) - -#else // DEBUG - -// make it go away if not debug -#define GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(obj, sel, retType, ...) do { } while (0) -#define GTMAssertSelectorNilOrImplementedWithArguments(obj, sel, ...) do { } while (0) - -#endif // DEBUG diff --git a/Pods/GoogleToolboxForMac/DebugUtils/GTMDebugThreadValidation.h b/Pods/GoogleToolboxForMac/DebugUtils/GTMDebugThreadValidation.h deleted file mode 100644 index 8d116d940..000000000 --- a/Pods/GoogleToolboxForMac/DebugUtils/GTMDebugThreadValidation.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// GTMDebugThreadValidation.h -// -// Copyright 2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. -// - -#import "GTMDefines.h" -#import - -// GTMCheckCurrentQueue, GTMIsCurrentQueue -// -// GTMCheckCurrentQueue takes a target queue and uses _GTMDevAssert to -// report if that is not the currently executing queue. -// -// GTMIsCurrentQueue takes a target queue and returns true if the target queue -// is the currently executing dispatch queue. This can be passed to another -// assertion call in debug builds; it should never be used in release code. -// -// The dispatch queue must have a label. -#define GTMCheckCurrentQueue(targetQueue) \ - _GTMDevAssert(GTMIsCurrentQueue(targetQueue), \ - @"Current queue is %s (expected %s)", \ - _GTMQueueName(DISPATCH_CURRENT_QUEUE_LABEL), \ - _GTMQueueName(targetQueue)) - -#define GTMIsCurrentQueue(targetQueue) \ - (strcmp(_GTMQueueName(DISPATCH_CURRENT_QUEUE_LABEL), \ - _GTMQueueName(targetQueue)) == 0) - -#define _GTMQueueName(queue) \ - (strlen(dispatch_queue_get_label(queue)) > 0 ? \ - dispatch_queue_get_label(queue) : "unnamed") diff --git a/Pods/GoogleToolboxForMac/DebugUtils/GTMMethodCheck.h b/Pods/GoogleToolboxForMac/DebugUtils/GTMMethodCheck.h deleted file mode 100644 index 9fad81d8c..000000000 --- a/Pods/GoogleToolboxForMac/DebugUtils/GTMMethodCheck.h +++ /dev/null @@ -1,69 +0,0 @@ -// -// GTMMethodCheck.h -// -// Copyright 2006-2016 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. -// - -#import -#import -#import - -/// A macro for enforcing debug time checks to make sure all required methods are linked in -// -// When using categories, it can be very easy to forget to include the -// implementation of a category. -// Let's say you had a class foo that depended on method bar of class baz, and -// method bar was implemented as a member of a category. -// You could add the following code: -// -// GTM_METHOD_CHECK(baz, bar) -// -// and the code would check to make sure baz was implemented just before main -// was called. This works for both dynamic libraries, and executables. -// -// -// This is not compiled into release builds. - -#ifdef DEBUG - -// This is the "magic". -// A) we need a multi layer define here so that the preprocessor expands -// __LINE__ the way we want it. We need __LINE__ so that each of our -// GTM_METHOD_CHECKs generates a unique function name. -#define GTM_METHOD_CHECK(class, method) GTM_METHOD_CHECK_INNER(class, method, __LINE__) -#define GTM_METHOD_CHECK_INNER(class, method, line) \ - GTM_METHOD_CHECK_INNER_INNER(class, method, line) - -// B) define a function that is called at startup to check that |class| has an -// implementation for |method| (either a class method or an instance method). -#define GTM_METHOD_CHECK_INNER_INNER(class, method, line) \ -__attribute__ ((constructor, visibility("hidden"))) \ - static void xxGTMMethodCheckMethod ## class ## line () { \ - @autoreleasepool { \ - if (![class instancesRespondToSelector:@selector(method)] \ - && ![class respondsToSelector:@selector(method)]) { \ - fprintf(stderr, "%s:%d: error: We need method '%s' to be linked in for class '%s'\n", \ - __FILE__, line, #method, #class); \ - exit(EX_SOFTWARE); \ - } \ - } \ -} - -#else // DEBUG - -// Do nothing in release. -#define GTM_METHOD_CHECK(class, method) - -#endif // DEBUG diff --git a/Pods/GoogleToolboxForMac/Foundation/GTMNSData+zlib.h b/Pods/GoogleToolboxForMac/Foundation/GTMNSData+zlib.h deleted file mode 100644 index dceadc444..000000000 --- a/Pods/GoogleToolboxForMac/Foundation/GTMNSData+zlib.h +++ /dev/null @@ -1,199 +0,0 @@ -// -// GTMNSData+zlib.h -// -// Copyright 2007-2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. -// - -#import -#import "GTMDefines.h" - -/// Helpers for dealing w/ zlib inflate/deflate calls. -@interface NSData (GTMZLibAdditions) - -// NOTE: For 64bit, none of these apis handle input sizes >32bits, they will -// return nil when given such data. To handle data of that size you really -// should be streaming it rather then doing it all in memory. - -#pragma mark Gzip Compression - -/// Return an autoreleased NSData w/ the result of gzipping the bytes. -// -// Uses the default compression level. -+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes - length:(NSUInteger)length; -+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes - length:(NSUInteger)length - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of gzipping the payload of |data|. -// -// Uses the default compression level. -+ (NSData *)gtm_dataByGzippingData:(NSData *)data __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByGzippingData:(NSData *)data - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of gzipping the bytes using |level| compression level. -// -// |level| can be 1-9, any other values will be clipped to that range. -+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of gzipping the payload of |data| using |level| compression level. -+ (NSData *)gtm_dataByGzippingData:(NSData *)data - compressionLevel:(int)level __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByGzippingData:(NSData *)data - compressionLevel:(int)level - error:(NSError **)error; - -#pragma mark Zlib "Stream" Compression - -// NOTE: deflate is *NOT* gzip. deflate is a "zlib" stream. pick which one -// you really want to create. (the inflate api will handle either) - -/// Return an autoreleased NSData w/ the result of deflating the bytes. -// -// Uses the default compression level. -+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes - length:(NSUInteger)length __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of deflating the payload of |data|. -// -// Uses the default compression level. -+ (NSData *)gtm_dataByDeflatingData:(NSData *)data __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByDeflatingData:(NSData *)data - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of deflating the bytes using |level| compression level. -// -// |level| can be 1-9, any other values will be clipped to that range. -+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of deflating the payload of |data| using |level| compression level. -+ (NSData *)gtm_dataByDeflatingData:(NSData *)data - compressionLevel:(int)level __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByDeflatingData:(NSData *)data - compressionLevel:(int)level - error:(NSError **)error; - -#pragma mark Uncompress of Gzip or Zlib - -/// Return an autoreleased NSData w/ the result of decompressing the bytes. -// -// The bytes to decompress can be zlib or gzip payloads. -+ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes - length:(NSUInteger)length __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes - length:(NSUInteger)length - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of decompressing the payload of |data|. -// -// The data to decompress can be zlib or gzip payloads. -+ (NSData *)gtm_dataByInflatingData:(NSData *)data __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByInflatingData:(NSData *)data - error:(NSError **)error; - -#pragma mark "Raw" Compression Support - -// NOTE: raw deflate is *NOT* gzip or deflate. it does not include a header -// of any form and should only be used within streams here an external crc/etc. -// is done to validate the data. The RawInflate apis can be used on data -// processed like this. - -/// Return an autoreleased NSData w/ the result of *raw* deflating the bytes. -// -// Uses the default compression level. -// *No* header is added to the resulting data. -+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes - length:(NSUInteger)length __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of *raw* deflating the payload of |data|. -// -// Uses the default compression level. -// *No* header is added to the resulting data. -+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of *raw* deflating the bytes using |level| compression level. -// -// |level| can be 1-9, any other values will be clipped to that range. -// *No* header is added to the resulting data. -+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of *raw* deflating the payload of |data| using |level| compression level. -// *No* header is added to the resulting data. -+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data - compressionLevel:(int)level __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data - compressionLevel:(int)level - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of *raw* decompressing the bytes. -// -// The data to decompress, it should *not* have any header (zlib nor gzip). -+ (NSData *)gtm_dataByRawInflatingBytes:(const void *)bytes - length:(NSUInteger)length __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByRawInflatingBytes:(const void *)bytes - length:(NSUInteger)length - error:(NSError **)error; - -/// Return an autoreleased NSData w/ the result of *raw* decompressing the payload of |data|. -// -// The data to decompress, it should *not* have any header (zlib nor gzip). -+ (NSData *)gtm_dataByRawInflatingData:(NSData *)data __attribute__((deprecated("Use error variant"))); -+ (NSData *)gtm_dataByRawInflatingData:(NSData *)data - error:(NSError **)error; - -@end - -FOUNDATION_EXPORT NSString *const GTMNSDataZlibErrorDomain; -FOUNDATION_EXPORT NSString *const GTMNSDataZlibErrorKey; // NSNumber -FOUNDATION_EXPORT NSString *const GTMNSDataZlibRemainingBytesKey; // NSNumber - -typedef NS_ENUM(NSInteger, GTMNSDataZlibError) { - GTMNSDataZlibErrorGreaterThan32BitsToCompress = 1024, - // An internal zlib error. - // GTMNSDataZlibErrorKey will contain the error value. - // NSLocalizedDescriptionKey may contain an error string from zlib. - // Look in zlib.h for list of errors. - GTMNSDataZlibErrorInternal, - // There was left over data in the buffer that was not used. - // GTMNSDataZlibRemainingBytesKey will contain number of remaining bytes. - GTMNSDataZlibErrorDataRemaining -}; diff --git a/Pods/GoogleToolboxForMac/Foundation/GTMNSData+zlib.m b/Pods/GoogleToolboxForMac/Foundation/GTMNSData+zlib.m deleted file mode 100644 index bf74b2d20..000000000 --- a/Pods/GoogleToolboxForMac/Foundation/GTMNSData+zlib.m +++ /dev/null @@ -1,531 +0,0 @@ -// -// GTMNSData+zlib.m -// -// Copyright 2007-2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. -// - -#import "GTMNSData+zlib.h" -#import -#import "GTMDefines.h" - -#define kChunkSize 1024 - -NSString *const GTMNSDataZlibErrorDomain = @"com.google.GTMNSDataZlibErrorDomain"; -NSString *const GTMNSDataZlibErrorKey = @"GTMNSDataZlibErrorKey"; -NSString *const GTMNSDataZlibRemainingBytesKey = @"GTMNSDataZlibRemainingBytesKey"; - -typedef enum { - CompressionModeZlib, - CompressionModeGzip, - CompressionModeRaw, -} CompressionMode; - -@interface NSData (GTMZlibAdditionsPrivate) -+ (NSData *)gtm_dataByCompressingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level - mode:(CompressionMode)mode - error:(NSError **)error; -+ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes - length:(NSUInteger)length - isRawData:(BOOL)isRawData - error:(NSError **)error; -@end - -@implementation NSData (GTMZlibAdditionsPrivate) - -+ (NSData *)gtm_dataByCompressingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level - mode:(CompressionMode)mode - error:(NSError **)error { - if (!bytes || !length) { - return nil; - } - -#if defined(__LP64__) && __LP64__ - // Don't support > 32bit length for 64 bit, see note in header. - if (length > UINT_MAX) { - if (error) { - *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain - code:GTMNSDataZlibErrorGreaterThan32BitsToCompress - userInfo:nil]; - } - return nil; - } -#endif - - if (level == Z_DEFAULT_COMPRESSION) { - // the default value is actually outside the range, so we have to let it - // through specifically. - } else if (level < Z_BEST_SPEED) { - level = Z_BEST_SPEED; - } else if (level > Z_BEST_COMPRESSION) { - level = Z_BEST_COMPRESSION; - } - - z_stream strm; - bzero(&strm, sizeof(z_stream)); - - int memLevel = 8; // the default - int windowBits = 15; // the default - switch (mode) { - case CompressionModeZlib: - // nothing to do - break; - - case CompressionModeGzip: - windowBits += 16; // enable gzip header instead of zlib header - break; - - case CompressionModeRaw: - windowBits *= -1; // Negative to mean no header. - break; - } - int retCode; - if ((retCode = deflateInit2(&strm, level, Z_DEFLATED, windowBits, - memLevel, Z_DEFAULT_STRATEGY)) != Z_OK) { - // COV_NF_START - no real way to force this in a unittest (we guard all args) - if (error) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode] - forKey:GTMNSDataZlibErrorKey]; - *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain - code:GTMNSDataZlibErrorInternal - userInfo:userInfo]; - } - return nil; - // COV_NF_END - } - - // hint the size at 1/4 the input size - NSMutableData *result = [NSMutableData dataWithCapacity:(length/4)]; - unsigned char output[kChunkSize]; - - // setup the input - strm.avail_in = (unsigned int)length; - strm.next_in = (unsigned char*)bytes; - - // loop to collect the data - do { - // update what we're passing in - strm.avail_out = kChunkSize; - strm.next_out = output; - retCode = deflate(&strm, Z_FINISH); - if ((retCode != Z_OK) && (retCode != Z_STREAM_END)) { - // COV_NF_START - no real way to force this in a unittest - // (in inflate, we can feed bogus/truncated data to test, but an error - // here would be some internal issue w/in zlib, and there isn't any real - // way to test it) - if (error) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode] - forKey:GTMNSDataZlibErrorKey]; - *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain - code:GTMNSDataZlibErrorInternal - userInfo:userInfo]; - } - deflateEnd(&strm); - return nil; - // COV_NF_END - } - // collect what we got - unsigned gotBack = kChunkSize - strm.avail_out; - if (gotBack > 0) { - [result appendBytes:output length:gotBack]; - } - - } while (retCode == Z_OK); - - // if the loop exits, we used all input and the stream ended - _GTMDevAssert(strm.avail_in == 0, - @"thought we finished deflate w/o using all input, %u bytes left", - strm.avail_in); - _GTMDevAssert(retCode == Z_STREAM_END, - @"thought we finished deflate w/o getting a result of stream end, code %d", - retCode); - - // clean up - deflateEnd(&strm); - - return result; -} // gtm_dataByCompressingBytes:length:compressionLevel:useGzip: - -+ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes - length:(NSUInteger)length - isRawData:(BOOL)isRawData - error:(NSError **)error { - if (!bytes || !length) { - return nil; - } - -#if defined(__LP64__) && __LP64__ - // Don't support > 32bit length for 64 bit, see note in header. - if (length > UINT_MAX) { - return nil; - } -#endif - - z_stream strm; - bzero(&strm, sizeof(z_stream)); - - // setup the input - strm.avail_in = (unsigned int)length; - strm.next_in = (unsigned char*)bytes; - - int windowBits = 15; // 15 to enable any window size - if (isRawData) { - windowBits *= -1; // make it negative to signal no header. - } else { - windowBits += 32; // and +32 to enable zlib or gzip header detection. - } - - int retCode; - if ((retCode = inflateInit2(&strm, windowBits)) != Z_OK) { - // COV_NF_START - no real way to force this in a unittest (we guard all args) - if (error) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode] - forKey:GTMNSDataZlibErrorKey]; - *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain - code:GTMNSDataZlibErrorInternal - userInfo:userInfo]; - } - return nil; - // COV_NF_END - } - - // hint the size at 4x the input size - NSMutableData *result = [NSMutableData dataWithCapacity:(length*4)]; - unsigned char output[kChunkSize]; - - // loop to collect the data - do { - // update what we're passing in - strm.avail_out = kChunkSize; - strm.next_out = output; - retCode = inflate(&strm, Z_NO_FLUSH); - if ((retCode != Z_OK) && (retCode != Z_STREAM_END)) { - if (error) { - NSMutableDictionary *userInfo = - [NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode] - forKey:GTMNSDataZlibErrorKey]; - if (strm.msg) { - NSString *message = [NSString stringWithUTF8String:strm.msg]; - if (message) { - [userInfo setObject:message forKey:NSLocalizedDescriptionKey]; - } - } - *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain - code:GTMNSDataZlibErrorInternal - userInfo:userInfo]; - } - inflateEnd(&strm); - return nil; - } - // collect what we got - unsigned gotBack = kChunkSize - strm.avail_out; - if (gotBack > 0) { - [result appendBytes:output length:gotBack]; - } - - } while (retCode == Z_OK); - - // make sure there wasn't more data tacked onto the end of a valid compressed - // stream. - if (strm.avail_in != 0) { - if (error) { - NSDictionary *userInfo = - [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedInt:strm.avail_in] - forKey:GTMNSDataZlibRemainingBytesKey]; - *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain - code:GTMNSDataZlibErrorDataRemaining - userInfo:userInfo]; - } - result = nil; - } - // the only way out of the loop was by hitting the end of the stream - _GTMDevAssert(retCode == Z_STREAM_END, - @"thought we finished inflate w/o getting a result of stream end, code %d", - retCode); - - // clean up - inflateEnd(&strm); - - return result; -} // gtm_dataByInflatingBytes:length:windowBits: - -@end - - -@implementation NSData (GTMZLibAdditions) - -+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes - length:(NSUInteger)length { - return [self gtm_dataByGzippingBytes:bytes length:length error:NULL]; -} // gtm_dataByGzippingBytes:length: - -+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes - length:(NSUInteger)length - error:(NSError **)error { - return [self gtm_dataByCompressingBytes:bytes - length:length - compressionLevel:Z_DEFAULT_COMPRESSION - mode:CompressionModeGzip - error:error]; -} // gtm_dataByGzippingBytes:length:error: - -+ (NSData *)gtm_dataByGzippingData:(NSData *)data { - return [self gtm_dataByGzippingData:data error:NULL]; -} // gtm_dataByGzippingData: - -+ (NSData *)gtm_dataByGzippingData:(NSData *)data error:(NSError **)error { - return [self gtm_dataByCompressingBytes:[data bytes] - length:[data length] - compressionLevel:Z_DEFAULT_COMPRESSION - mode:CompressionModeGzip - error:error]; -} // gtm_dataByGzippingData:error: - -+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level { - return [self gtm_dataByGzippingBytes:bytes - length:length - compressionLevel:level - error:NULL]; -} // gtm_dataByGzippingBytes:length:level: - -+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level - error:(NSError **)error{ - return [self gtm_dataByCompressingBytes:bytes - length:length - compressionLevel:level - mode:CompressionModeGzip - error:error]; -} // gtm_dataByGzippingBytes:length:level:error - -+ (NSData *)gtm_dataByGzippingData:(NSData *)data - compressionLevel:(int)level { - return [self gtm_dataByGzippingData:data - compressionLevel:level - error:NULL]; -} // gtm_dataByGzippingData:level: - -+ (NSData *)gtm_dataByGzippingData:(NSData *)data - compressionLevel:(int)level - error:(NSError **)error{ - return [self gtm_dataByCompressingBytes:[data bytes] - length:[data length] - compressionLevel:level - mode:CompressionModeGzip - error:error]; -} // gtm_dataByGzippingData:level:error - -#pragma mark - - -+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes - length:(NSUInteger)length { - return [self gtm_dataByDeflatingBytes:bytes - length:length - error:NULL]; -} // gtm_dataByDeflatingBytes:length: - -+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - error:(NSError **)error{ - return [self gtm_dataByCompressingBytes:bytes - length:length - compressionLevel:Z_DEFAULT_COMPRESSION - mode:CompressionModeZlib - error:error]; -} // gtm_dataByDeflatingBytes:length:error - -+ (NSData *)gtm_dataByDeflatingData:(NSData *)data { - return [self gtm_dataByDeflatingData:data error:NULL]; -} // gtm_dataByDeflatingData: - -+ (NSData *)gtm_dataByDeflatingData:(NSData *)data error:(NSError **)error { - return [self gtm_dataByCompressingBytes:[data bytes] - length:[data length] - compressionLevel:Z_DEFAULT_COMPRESSION - mode:CompressionModeZlib - error:error]; -} // gtm_dataByDeflatingData: - -+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level { - return [self gtm_dataByDeflatingBytes:bytes - length:length - compressionLevel:level - error:NULL]; -} // gtm_dataByDeflatingBytes:length:level: - -+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level - error:(NSError **)error { - return [self gtm_dataByCompressingBytes:bytes - length:length - compressionLevel:level - mode:CompressionModeZlib - error:error]; -} // gtm_dataByDeflatingBytes:length:level:error: - -+ (NSData *)gtm_dataByDeflatingData:(NSData *)data - compressionLevel:(int)level { - return [self gtm_dataByDeflatingData:data - compressionLevel:level - error:NULL]; -} // gtm_dataByDeflatingData:level: - -+ (NSData *)gtm_dataByDeflatingData:(NSData *)data - compressionLevel:(int)level - error:(NSError **)error { - return [self gtm_dataByCompressingBytes:[data bytes] - length:[data length] - compressionLevel:level - mode:CompressionModeZlib - error:error]; -} // gtm_dataByDeflatingData:level:error: - -#pragma mark - - -+ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes - length:(NSUInteger)length { - return [self gtm_dataByInflatingBytes:bytes - length:length - error:NULL]; -} // gtm_dataByInflatingBytes:length: - -+ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes - length:(NSUInteger)length - error:(NSError **)error { - return [self gtm_dataByInflatingBytes:bytes - length:length - isRawData:NO - error:error]; -} // gtm_dataByInflatingBytes:length:error: - -+ (NSData *)gtm_dataByInflatingData:(NSData *)data { - return [self gtm_dataByInflatingData:data error:NULL]; -} // gtm_dataByInflatingData: - -+ (NSData *)gtm_dataByInflatingData:(NSData *)data - error:(NSError **)error { - return [self gtm_dataByInflatingBytes:[data bytes] - length:[data length] - isRawData:NO - error:error]; -} // gtm_dataByInflatingData: - -#pragma mark - - -+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes - length:(NSUInteger)length { - return [self gtm_dataByRawDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - error:NULL]; -} // gtm_dataByRawDeflatingBytes:length: - -+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - error:(NSError **)error { - return [self gtm_dataByCompressingBytes:bytes - length:length - compressionLevel:Z_DEFAULT_COMPRESSION - mode:CompressionModeRaw - error:error]; -} // gtm_dataByRawDeflatingBytes:length:error: - -+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data { - return [self gtm_dataByRawDeflatingData:data error:NULL]; -} // gtm_dataByRawDeflatingData: - -+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data error:(NSError **)error { - return [self gtm_dataByCompressingBytes:[data bytes] - length:[data length] - compressionLevel:Z_DEFAULT_COMPRESSION - mode:CompressionModeRaw - error:error]; -} // gtm_dataByRawDeflatingData:error: - -+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level { - return [self gtm_dataByRawDeflatingBytes:bytes - length:length - compressionLevel:level - error:NULL]; -} // gtm_dataByRawDeflatingBytes:length:compressionLevel: - -+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes - length:(NSUInteger)length - compressionLevel:(int)level - error:(NSError **)error{ - return [self gtm_dataByCompressingBytes:bytes - length:length - compressionLevel:level - mode:CompressionModeRaw - error:error]; -} // gtm_dataByRawDeflatingBytes:length:compressionLevel:error: - -+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data - compressionLevel:(int)level { - return [self gtm_dataByRawDeflatingData:data - compressionLevel:level - error:NULL]; -} // gtm_dataByRawDeflatingData:compressionLevel: - -+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data - compressionLevel:(int)level - error:(NSError **)error { - return [self gtm_dataByCompressingBytes:[data bytes] - length:[data length] - compressionLevel:level - mode:CompressionModeRaw - error:error]; -} // gtm_dataByRawDeflatingData:compressionLevel:error: - -+ (NSData *)gtm_dataByRawInflatingBytes:(const void *)bytes - length:(NSUInteger)length { - return [self gtm_dataByInflatingBytes:bytes - length:length - error:NULL]; -} // gtm_dataByRawInflatingBytes:length: - -+ (NSData *)gtm_dataByRawInflatingBytes:(const void *)bytes - length:(NSUInteger)length - error:(NSError **)error{ - return [self gtm_dataByInflatingBytes:bytes - length:length - isRawData:YES - error:error]; -} // gtm_dataByRawInflatingBytes:length:error: - -+ (NSData *)gtm_dataByRawInflatingData:(NSData *)data { - return [self gtm_dataByRawInflatingData:data - error:NULL]; -} // gtm_dataByRawInflatingData: - -+ (NSData *)gtm_dataByRawInflatingData:(NSData *)data - error:(NSError **)error { - return [self gtm_dataByInflatingBytes:[data bytes] - length:[data length] - isRawData:YES - error:error]; -} // gtm_dataByRawInflatingData:error: - -@end diff --git a/Pods/GoogleToolboxForMac/Foundation/GTMNSDictionary+URLArguments.h b/Pods/GoogleToolboxForMac/Foundation/GTMNSDictionary+URLArguments.h deleted file mode 100644 index 734edeadb..000000000 --- a/Pods/GoogleToolboxForMac/Foundation/GTMNSDictionary+URLArguments.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// GTMNSDictionary+URLArguments.h -// -// Copyright 2006-2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. -// - -#import - -/// Utility for building a URL or POST argument string. -@interface NSDictionary (GTMNSDictionaryURLArgumentsAdditions) - -/// Returns a dictionary of the decoded key-value pairs in a http arguments -/// string of the form key1=value1&key2=value2&...&keyN=valueN. -/// Keys and values will be unescaped automatically. -/// Only the first value for a repeated key is returned. -/// -/// NOTE: Apps targeting iOS 8 or OS X 10.10 and later should use -/// NSURLComponents and NSURLQueryItem to create URLs with -/// query arguments instead of using these category methods. -+ (NSDictionary *)gtm_dictionaryWithHttpArgumentsString:(NSString *)argString; - -/// Gets a string representation of the dictionary in the form -/// key1=value1&key2=value2&...&keyN=valueN, suitable for use as either -/// URL arguments (after a '?') or POST body. Keys and values will be escaped -/// automatically, so should be unescaped in the dictionary. -- (NSString *)gtm_httpArgumentsString; - -@end diff --git a/Pods/GoogleToolboxForMac/Foundation/GTMNSDictionary+URLArguments.m b/Pods/GoogleToolboxForMac/Foundation/GTMNSDictionary+URLArguments.m deleted file mode 100644 index e9fa76671..000000000 --- a/Pods/GoogleToolboxForMac/Foundation/GTMNSDictionary+URLArguments.m +++ /dev/null @@ -1,77 +0,0 @@ -// -// GTMNSDictionary+URLArguments.m -// -// Copyright 2006-2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. -// - -#import "GTMNSDictionary+URLArguments.h" -#import "GTMNSString+URLArguments.h" -#import "GTMMethodCheck.h" -#import "GTMDefines.h" - - -// Export a nonsense symbol to suppress a libtool warning when this is linked alone in a static lib. -__attribute__((visibility("default"))) - char GTMNSDictionaryURLArgumentsExportToSuppressLibToolWarning = 0; - - -@implementation NSDictionary (GTMNSDictionaryURLArgumentsAdditions) - -GTM_METHOD_CHECK(NSString, gtm_stringByEscapingForURLArgument); -GTM_METHOD_CHECK(NSString, gtm_stringByUnescapingFromURLArgument); - -+ (NSDictionary *)gtm_dictionaryWithHttpArgumentsString:(NSString *)argString { - NSMutableDictionary* ret = [NSMutableDictionary dictionary]; - NSArray* components = [argString componentsSeparatedByString:@"&"]; - NSString* component; - // Use reverse order so that the first occurrence of a key replaces - // those subsequent. - for (component in [components reverseObjectEnumerator]) { - if ([component length] == 0) - continue; - NSRange pos = [component rangeOfString:@"="]; - NSString *key; - NSString *val; - if (pos.location == NSNotFound) { - key = [component gtm_stringByUnescapingFromURLArgument]; - val = @""; - } else { - key = [[component substringToIndex:pos.location] - gtm_stringByUnescapingFromURLArgument]; - val = [[component substringFromIndex:pos.location + pos.length] - gtm_stringByUnescapingFromURLArgument]; - } - // gtm_stringByUnescapingFromURLArgument returns nil on invalid UTF8 - // and NSMutableDictionary raises an exception when passed nil values. - if (!key) key = @""; - if (!val) val = @""; - [ret setObject:val forKey:key]; - } - return ret; -} - -- (NSString *)gtm_httpArgumentsString { - NSMutableArray* arguments = [NSMutableArray arrayWithCapacity:[self count]]; - NSString* key; - for (key in self) { - [arguments addObject:[NSString stringWithFormat:@"%@=%@", - [key gtm_stringByEscapingForURLArgument], - [[[self objectForKey:key] description] gtm_stringByEscapingForURLArgument]]]; - } - - return [arguments componentsJoinedByString:@"&"]; -} - -@end diff --git a/Pods/GoogleToolboxForMac/Foundation/GTMNSString+URLArguments.h b/Pods/GoogleToolboxForMac/Foundation/GTMNSString+URLArguments.h deleted file mode 100644 index 0cb7f3027..000000000 --- a/Pods/GoogleToolboxForMac/Foundation/GTMNSString+URLArguments.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// GTMNSString+URLArguments.h -// -// Copyright 2006-2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. -// - -#import - -/// Utilities for encoding and decoding URL arguments. -@interface NSString (GTMNSStringURLArgumentsAdditions) - -/// Returns a string that is escaped properly to be a URL argument. -/// -/// This differs from stringByAddingPercentEscapesUsingEncoding: in that it -/// will escape all the reserved characters (per RFC 3986 -/// ) which -/// stringByAddingPercentEscapesUsingEncoding would leave. -/// -/// This will also escape '%', so this should not be used on a string that has -/// already been escaped unless double-escaping is the desired result. -/// -/// NOTE: Apps targeting iOS 8 or OS X 10.10 and later should use -/// NSURLComponents and NSURLQueryItem to create properly-escaped -/// URLs instead of using these category methods. -- (NSString*)gtm_stringByEscapingForURLArgument; - -/// Returns the unescaped version of a URL argument -/// -/// This has the same behavior as stringByReplacingPercentEscapesUsingEncoding:, -/// except that it will also convert '+' to space. -- (NSString*)gtm_stringByUnescapingFromURLArgument; - -@end diff --git a/Pods/GoogleToolboxForMac/Foundation/GTMNSString+URLArguments.m b/Pods/GoogleToolboxForMac/Foundation/GTMNSString+URLArguments.m deleted file mode 100644 index e785c5e8f..000000000 --- a/Pods/GoogleToolboxForMac/Foundation/GTMNSString+URLArguments.m +++ /dev/null @@ -1,48 +0,0 @@ -// -// GTMNSString+URLArguments.m -// -// Copyright 2006-2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. -// - -#import "GTMNSString+URLArguments.h" - -@implementation NSString (GTMNSStringURLArgumentsAdditions) - -- (NSString *)gtm_stringByEscapingForURLArgument { - // Encode all the reserved characters, per RFC 3986 - // () - CFStringRef escaped = - CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, - (CFStringRef)self, - NULL, - (CFStringRef)@"!*'();:@&=+$,/?%#[]", - kCFStringEncodingUTF8); -#if defined(__has_feature) && __has_feature(objc_arc) - return CFBridgingRelease(escaped); -#else - return [(NSString *)escaped autorelease]; -#endif -} - -- (NSString *)gtm_stringByUnescapingFromURLArgument { - NSMutableString *resultString = [NSMutableString stringWithString:self]; - [resultString replaceOccurrencesOfString:@"+" - withString:@" " - options:NSLiteralSearch - range:NSMakeRange(0, [resultString length])]; - return [resultString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; -} - -@end diff --git a/Pods/GoogleToolboxForMac/GTMDefines.h b/Pods/GoogleToolboxForMac/GTMDefines.h deleted file mode 100644 index 7feb1cbd8..000000000 --- a/Pods/GoogleToolboxForMac/GTMDefines.h +++ /dev/null @@ -1,398 +0,0 @@ -// -// GTMDefines.h -// -// Copyright 2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. -// - -// ============================================================================ - -#include -#include - -#ifdef __OBJC__ -#include -#endif // __OBJC__ - -#if TARGET_OS_IPHONE -#include -#endif // TARGET_OS_IPHONE - -// ---------------------------------------------------------------------------- -// CPP symbols that can be overridden in a prefix to control how the toolbox -// is compiled. -// ---------------------------------------------------------------------------- - - -// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and -// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens -// when a validation fails. If you implement your own validators, you may want -// to control their internals using the same macros for consistency. -#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT - #define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0 -#endif - -// Ensure __has_feature and __has_extension are safe to use. -// See http://clang-analyzer.llvm.org/annotations.html -#ifndef __has_feature // Optional. - #define __has_feature(x) 0 // Compatibility with non-clang compilers. -#endif - -#ifndef __has_extension - #define __has_extension __has_feature // Compatibility with pre-3.0 compilers. -#endif - -// Give ourselves a consistent way to do inlines. Apple's macros even use -// a few different actual definitions, so we're based off of the foundation -// one. -#if !defined(GTM_INLINE) - #if (defined (__GNUC__) && (__GNUC__ == 4)) || defined (__clang__) - #define GTM_INLINE static __inline__ __attribute__((always_inline)) - #else - #define GTM_INLINE static __inline__ - #endif -#endif - -// Give ourselves a consistent way of doing externs that links up nicely -// when mixing objc and objc++ -#if !defined (GTM_EXTERN) - #if defined __cplusplus - #define GTM_EXTERN extern "C" - #define GTM_EXTERN_C_BEGIN extern "C" { - #define GTM_EXTERN_C_END } - #else - #define GTM_EXTERN extern - #define GTM_EXTERN_C_BEGIN - #define GTM_EXTERN_C_END - #endif -#endif - -// Give ourselves a consistent way of exporting things if we have visibility -// set to hidden. -#if !defined (GTM_EXPORT) - #define GTM_EXPORT __attribute__((visibility("default"))) -#endif - -// Give ourselves a consistent way of declaring something as unused. This -// doesn't use __unused because that is only supported in gcc 4.2 and greater. -#if !defined (GTM_UNUSED) -#define GTM_UNUSED(x) ((void)(x)) -#endif - -// _GTMDevLog & _GTMDevAssert -// -// _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for -// developer level errors. This implementation simply macros to NSLog/NSAssert. -// It is not intended to be a general logging/reporting system. -// -// Please see http://code.google.com/p/google-toolbox-for-mac/wiki/DevLogNAssert -// for a little more background on the usage of these macros. -// -// _GTMDevLog log some error/problem in debug builds -// _GTMDevAssert assert if condition isn't met w/in a method/function -// in all builds. -// -// To replace this system, just provide different macro definitions in your -// prefix header. Remember, any implementation you provide *must* be thread -// safe since this could be called by anything in what ever situtation it has -// been placed in. -// - -// Ignore the "Macro name is a reserved identifier" warning in this section -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-id-macro" - -// We only define the simple macros if nothing else has defined this. -#ifndef _GTMDevLog - -#ifdef DEBUG - #define _GTMDevLog(...) NSLog(__VA_ARGS__) -#else - #define _GTMDevLog(...) do { } while (0) -#endif - -#endif // _GTMDevLog - -#ifndef _GTMDevAssert -// we directly invoke the NSAssert handler so we can pass on the varargs -// (NSAssert doesn't have a macro we can use that takes varargs) -#if !defined(NS_BLOCK_ASSERTIONS) - #define _GTMDevAssert(condition, ...) \ - do { \ - if (!(condition)) { \ - [[NSAssertionHandler currentHandler] \ - handleFailureInFunction:(NSString *) \ - [NSString stringWithUTF8String:__PRETTY_FUNCTION__] \ - file:(NSString *)[NSString stringWithUTF8String:__FILE__] \ - lineNumber:__LINE__ \ - description:__VA_ARGS__]; \ - } \ - } while(0) -#else // !defined(NS_BLOCK_ASSERTIONS) - #define _GTMDevAssert(condition, ...) do { } while (0) -#endif // !defined(NS_BLOCK_ASSERTIONS) - -#endif // _GTMDevAssert - -// _GTMCompileAssert -// -// Note: Software for current compilers should just use _Static_assert directly -// instead of this macro. -// -// _GTMCompileAssert is an assert that is meant to fire at compile time if you -// want to check things at compile instead of runtime. For example if you -// want to check that a wchar is 4 bytes instead of 2 you would use -// _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X) -// Note that the second "arg" is not in quotes, and must be a valid processor -// symbol in it's own right (no spaces, punctuation etc). - -// Wrapping this in an #ifndef allows external groups to define their own -// compile time assert scheme. -#ifndef _GTMCompileAssert - #if __has_feature(c_static_assert) || __has_extension(c_static_assert) - #define _GTMCompileAssert(test, msg) _Static_assert((test), #msg) - #else - // Pre-Xcode 7 support. - // - // We got this technique from here: - // http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html - #define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg - #define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg) - #define _GTMCompileAssert(test, msg) \ - typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ] - #endif // __has_feature(c_static_assert) || __has_extension(c_static_assert) -#endif // _GTMCompileAssert - -#pragma clang diagnostic pop - -// ---------------------------------------------------------------------------- -// CPP symbols defined based on the project settings so the GTM code has -// simple things to test against w/o scattering the knowledge of project -// setting through all the code. -// ---------------------------------------------------------------------------- - -// Provide a single constant CPP symbol that all of GTM uses for ifdefing -// iPhone code. -#if TARGET_OS_IPHONE // iPhone SDK - // For iPhone specific stuff - #define GTM_IPHONE_SDK 1 - #if TARGET_IPHONE_SIMULATOR - #define GTM_IPHONE_DEVICE 0 - #define GTM_IPHONE_SIMULATOR 1 - #else - #define GTM_IPHONE_DEVICE 1 - #define GTM_IPHONE_SIMULATOR 0 - #endif // TARGET_IPHONE_SIMULATOR - // By default, GTM has provided it's own unittesting support, define this - // to use the support provided by Xcode, especially for the Xcode4 support - // for unittesting. - #ifndef GTM_USING_XCTEST - #define GTM_USING_XCTEST 0 - #endif - #define GTM_MACOS_SDK 0 -#else - // For MacOS specific stuff - #define GTM_MACOS_SDK 1 - #define GTM_IPHONE_SDK 0 - #define GTM_IPHONE_SIMULATOR 0 - #define GTM_IPHONE_DEVICE 0 - #ifndef GTM_USING_XCTEST - #define GTM_USING_XCTEST 0 - #endif -#endif - -// Some of our own availability macros -#if GTM_MACOS_SDK -#define GTM_AVAILABLE_ONLY_ON_IPHONE UNAVAILABLE_ATTRIBUTE -#define GTM_AVAILABLE_ONLY_ON_MACOS -#else -#define GTM_AVAILABLE_ONLY_ON_IPHONE -#define GTM_AVAILABLE_ONLY_ON_MACOS UNAVAILABLE_ATTRIBUTE -#endif - -// GC was dropped by Apple, define the old constant incase anyone still keys -// off of it. -#ifndef GTM_SUPPORT_GC - #define GTM_SUPPORT_GC 0 -#endif - -// Some support for advanced clang static analysis functionality -#ifndef NS_RETURNS_RETAINED - #if __has_feature(attribute_ns_returns_retained) - #define NS_RETURNS_RETAINED __attribute__((ns_returns_retained)) - #else - #define NS_RETURNS_RETAINED - #endif -#endif - -#ifndef NS_RETURNS_NOT_RETAINED - #if __has_feature(attribute_ns_returns_not_retained) - #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) - #else - #define NS_RETURNS_NOT_RETAINED - #endif -#endif - -#ifndef CF_RETURNS_RETAINED - #if __has_feature(attribute_cf_returns_retained) - #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) - #else - #define CF_RETURNS_RETAINED - #endif -#endif - -#ifndef CF_RETURNS_NOT_RETAINED - #if __has_feature(attribute_cf_returns_not_retained) - #define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained)) - #else - #define CF_RETURNS_NOT_RETAINED - #endif -#endif - -#ifndef NS_CONSUMED - #if __has_feature(attribute_ns_consumed) - #define NS_CONSUMED __attribute__((ns_consumed)) - #else - #define NS_CONSUMED - #endif -#endif - -#ifndef CF_CONSUMED - #if __has_feature(attribute_cf_consumed) - #define CF_CONSUMED __attribute__((cf_consumed)) - #else - #define CF_CONSUMED - #endif -#endif - -#ifndef NS_CONSUMES_SELF - #if __has_feature(attribute_ns_consumes_self) - #define NS_CONSUMES_SELF __attribute__((ns_consumes_self)) - #else - #define NS_CONSUMES_SELF - #endif -#endif - -#ifndef GTM_NONNULL - #if defined(__has_attribute) - #if __has_attribute(nonnull) - #define GTM_NONNULL(x) __attribute__((nonnull x)) - #else - #define GTM_NONNULL(x) - #endif - #else - #define GTM_NONNULL(x) - #endif -#endif - -// Invalidates the initializer from which it's called. -#ifndef GTMInvalidateInitializer - #if __has_feature(objc_arc) - #define GTMInvalidateInitializer() \ - do { \ - [self class]; /* Avoid warning of dead store to |self|. */ \ - _GTMDevAssert(NO, @"Invalid initializer."); \ - return nil; \ - } while (0) - #else - #define GTMInvalidateInitializer() \ - do { \ - [self release]; \ - _GTMDevAssert(NO, @"Invalid initializer."); \ - return nil; \ - } while (0) - #endif -#endif - -#ifndef GTMCFAutorelease - // GTMCFAutorelease returns an id. In contrast, Apple's CFAutorelease returns - // a CFTypeRef. - #if __has_feature(objc_arc) - #define GTMCFAutorelease(x) CFBridgingRelease(x) - #else - #define GTMCFAutorelease(x) ([(id)x autorelease]) - #endif -#endif - -#ifdef __OBJC__ - - -// Macro to allow you to create NSStrings out of other macros. -// #define FOO foo -// NSString *fooString = GTM_NSSTRINGIFY(FOO); -#if !defined (GTM_NSSTRINGIFY) - #define GTM_NSSTRINGIFY_INNER(x) @#x - #define GTM_NSSTRINGIFY(x) GTM_NSSTRINGIFY_INNER(x) -#endif - -// Macro to allow fast enumeration when building for 10.5 or later, and -// reliance on NSEnumerator for 10.4. Remember, NSDictionary w/ FastEnumeration -// does keys, so pick the right thing, nothing is done on the FastEnumeration -// side to be sure you're getting what you wanted. -#ifndef GTM_FOREACH_OBJECT - #if TARGET_OS_IPHONE || !(MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) - #define GTM_FOREACH_ENUMEREE(element, enumeration) \ - for (element in enumeration) - #define GTM_FOREACH_OBJECT(element, collection) \ - for (element in collection) - #define GTM_FOREACH_KEY(element, collection) \ - for (element in collection) - #else - #define GTM_FOREACH_ENUMEREE(element, enumeration) \ - for (NSEnumerator *_ ## element ## _enum = enumeration; \ - (element = [_ ## element ## _enum nextObject]) != nil; ) - #define GTM_FOREACH_OBJECT(element, collection) \ - GTM_FOREACH_ENUMEREE(element, [collection objectEnumerator]) - #define GTM_FOREACH_KEY(element, collection) \ - GTM_FOREACH_ENUMEREE(element, [collection keyEnumerator]) - #endif -#endif - -// ============================================================================ - -// GTM_SEL_STRING is for specifying selector (usually property) names to KVC -// or KVO methods. -// In debug it will generate warnings for undeclared selectors if -// -Wunknown-selector is turned on. -// In release it will have no runtime overhead. -#ifndef GTM_SEL_STRING - #ifdef DEBUG - #define GTM_SEL_STRING(selName) NSStringFromSelector(@selector(selName)) - #else - #define GTM_SEL_STRING(selName) @#selName - #endif // DEBUG -#endif // GTM_SEL_STRING - -#ifndef GTM_WEAK -#if __has_feature(objc_arc_weak) - // With ARC enabled, __weak means a reference that isn't implicitly - // retained. __weak objects are accessed through runtime functions, so - // they are zeroed out, but this requires OS X 10.7+. - // At clang r251041+, ARC-style zeroing weak references even work in - // non-ARC mode. - #define GTM_WEAK __weak - #elif __has_feature(objc_arc) - // ARC, but targeting 10.6 or older, where zeroing weak references don't - // exist. - #define GTM_WEAK __unsafe_unretained - #else - // With manual reference counting, __weak used to be silently ignored. - // clang r251041 gives it the ARC semantics instead. This means they - // now require a deployment target of 10.7, while some clients of GTM - // still target 10.6. In these cases, expand to __unsafe_unretained instead - #define GTM_WEAK - #endif -#endif - -#endif // __OBJC__ diff --git a/Pods/GoogleToolboxForMac/LICENSE b/Pods/GoogleToolboxForMac/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/Pods/GoogleToolboxForMac/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/Pods/GoogleToolboxForMac/README.md b/Pods/GoogleToolboxForMac/README.md deleted file mode 100644 index 710560a3f..000000000 --- a/Pods/GoogleToolboxForMac/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# GTM: Google Toolbox for Mac # - -**Project site**
-**Discussion group** - -# Google Toolbox for Mac # - -A collection of source from different Google projects that may be of use to -developers working other iOS or OS X projects. - -If you find a problem/bug or want a new feature to be included in the Google -Toolbox for Mac, please join the -[discussion group](http://groups.google.com/group/google-toolbox-for-mac) -or submit an -[issue](https://github.com/google/google-toolbox-for-mac/issues). diff --git a/Pods/Headers/Private/Bolts/BFAppLink.h b/Pods/Headers/Private/Bolts/BFAppLink.h deleted file mode 120000 index 3f79beeb0..000000000 --- a/Pods/Headers/Private/Bolts/BFAppLink.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLink.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkNavigation.h b/Pods/Headers/Private/Bolts/BFAppLinkNavigation.h deleted file mode 120000 index 6962356ef..000000000 --- a/Pods/Headers/Private/Bolts/BFAppLinkNavigation.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLinkNavigation.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkResolving.h b/Pods/Headers/Private/Bolts/BFAppLinkResolving.h deleted file mode 120000 index 94cc66f8c..000000000 --- a/Pods/Headers/Private/Bolts/BFAppLinkResolving.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLinkResolving.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererController.h b/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererController.h deleted file mode 120000 index 95067f073..000000000 --- a/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererController.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView.h b/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView.h deleted file mode 120000 index cc0089785..000000000 --- a/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView_Internal.h b/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView_Internal.h deleted file mode 120000 index 3df8117f8..000000000 --- a/Pods/Headers/Private/Bolts/BFAppLinkReturnToRefererView_Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/Internal/BFAppLinkReturnToRefererView_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLinkTarget.h b/Pods/Headers/Private/Bolts/BFAppLinkTarget.h deleted file mode 120000 index 90a41f648..000000000 --- a/Pods/Headers/Private/Bolts/BFAppLinkTarget.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLinkTarget.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFAppLink_Internal.h b/Pods/Headers/Private/Bolts/BFAppLink_Internal.h deleted file mode 120000 index 12d930478..000000000 --- a/Pods/Headers/Private/Bolts/BFAppLink_Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/Internal/BFAppLink_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFCancellationToken.h b/Pods/Headers/Private/Bolts/BFCancellationToken.h deleted file mode 120000 index 0b6948624..000000000 --- a/Pods/Headers/Private/Bolts/BFCancellationToken.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFCancellationToken.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFCancellationTokenRegistration.h b/Pods/Headers/Private/Bolts/BFCancellationTokenRegistration.h deleted file mode 120000 index c587ca7ec..000000000 --- a/Pods/Headers/Private/Bolts/BFCancellationTokenRegistration.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFCancellationTokenRegistration.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFCancellationTokenSource.h b/Pods/Headers/Private/Bolts/BFCancellationTokenSource.h deleted file mode 120000 index d3d598599..000000000 --- a/Pods/Headers/Private/Bolts/BFCancellationTokenSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFCancellationTokenSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFExecutor.h b/Pods/Headers/Private/Bolts/BFExecutor.h deleted file mode 120000 index c071e8c86..000000000 --- a/Pods/Headers/Private/Bolts/BFExecutor.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFExecutor.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFGeneric.h b/Pods/Headers/Private/Bolts/BFGeneric.h deleted file mode 120000 index bd63cccc6..000000000 --- a/Pods/Headers/Private/Bolts/BFGeneric.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFGeneric.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFMeasurementEvent.h b/Pods/Headers/Private/Bolts/BFMeasurementEvent.h deleted file mode 120000 index 2eb6c1171..000000000 --- a/Pods/Headers/Private/Bolts/BFMeasurementEvent.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFMeasurementEvent.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFMeasurementEvent_Internal.h b/Pods/Headers/Private/Bolts/BFMeasurementEvent_Internal.h deleted file mode 120000 index 633f673c0..000000000 --- a/Pods/Headers/Private/Bolts/BFMeasurementEvent_Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/Internal/BFMeasurementEvent_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFTask.h b/Pods/Headers/Private/Bolts/BFTask.h deleted file mode 120000 index 5468334d4..000000000 --- a/Pods/Headers/Private/Bolts/BFTask.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFTask.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFTaskCompletionSource.h b/Pods/Headers/Private/Bolts/BFTaskCompletionSource.h deleted file mode 120000 index c74760fae..000000000 --- a/Pods/Headers/Private/Bolts/BFTaskCompletionSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFTaskCompletionSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFURL.h b/Pods/Headers/Private/Bolts/BFURL.h deleted file mode 120000 index df21bd94a..000000000 --- a/Pods/Headers/Private/Bolts/BFURL.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFURL.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFURL_Internal.h b/Pods/Headers/Private/Bolts/BFURL_Internal.h deleted file mode 120000 index bf9b0fc19..000000000 --- a/Pods/Headers/Private/Bolts/BFURL_Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/Internal/BFURL_Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/BFWebViewAppLinkResolver.h b/Pods/Headers/Private/Bolts/BFWebViewAppLinkResolver.h deleted file mode 120000 index bf250dbd2..000000000 --- a/Pods/Headers/Private/Bolts/BFWebViewAppLinkResolver.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h \ No newline at end of file diff --git a/Pods/Headers/Private/Bolts/Bolts.h b/Pods/Headers/Private/Bolts/Bolts.h deleted file mode 120000 index 146ac6ecb..000000000 --- a/Pods/Headers/Private/Bolts/Bolts.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/Bolts.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessToken.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessToken.h deleted file mode 120000 index a5b3f9758..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessToken.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCache.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCache.h deleted file mode 120000 index cd1ae91e7..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV3.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV3.h deleted file mode 120000 index 46569e0f0..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV3.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV3_17.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV3_17.h deleted file mode 120000 index f621d583f..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV3_17.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV3_21.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV3_21.h deleted file mode 120000 index 07599a9ad..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV3_21.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV4.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV4.h deleted file mode 120000 index f994f6411..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCacheV4.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCaching.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCaching.h deleted file mode 120000 index 6ddcbdc15..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAccessTokenCaching.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEvents+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEvents+Internal.h deleted file mode 120000 index 2d7080057..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEvents+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEvents.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEvents.h deleted file mode 120000 index 95c1d00cf..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEvents.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsDeviceInfo.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsDeviceInfo.h deleted file mode 120000 index e15efbe35..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsDeviceInfo.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsState.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsState.h deleted file mode 120000 index 91e6faa96..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsState.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsStateManager.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsStateManager.h deleted file mode 120000 index e9ca586c8..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsStateManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsUtility.h deleted file mode 120000 index 795a99037..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppEventsUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkResolver.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkResolver.h deleted file mode 120000 index 69c20f5bb..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkResolver.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkUtility.h deleted file mode 120000 index fef519cd2..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAppLinkUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKApplicationDelegate+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKApplicationDelegate+Internal.h deleted file mode 120000 index 20b62ce87..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKApplicationDelegate+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKApplicationDelegate.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKApplicationDelegate.h deleted file mode 120000 index e163dc893..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKApplicationDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAudioResourceLoader.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKAudioResourceLoader.h deleted file mode 120000 index 0e31857c2..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKAudioResourceLoader.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBase64.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBase64.h deleted file mode 120000 index 21781759a..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBase64.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBoltsMeasurementEventListener.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBoltsMeasurementEventListener.h deleted file mode 120000 index f39004f51..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBoltsMeasurementEventListener.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPICrypto.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPICrypto.h deleted file mode 120000 index bbdc21fac..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPICrypto.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocol.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocol.h deleted file mode 120000 index 865167de4..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocol.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolNativeV1.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolNativeV1.h deleted file mode 120000 index 2c144eb6e..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolNativeV1.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolType.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolType.h deleted file mode 120000 index 5d5e61ab4..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolType.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolWebV1.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolWebV1.h deleted file mode 120000 index 50c7de103..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolWebV1.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolWebV2.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolWebV2.h deleted file mode 120000 index 19dcd4b96..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIProtocolWebV2.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIRequest+Private.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIRequest+Private.h deleted file mode 120000 index 2fec09dc6..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIRequest+Private.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIRequest.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIRequest.h deleted file mode 120000 index cde86f823..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIRequest.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIResponse.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIResponse.h deleted file mode 120000 index e35f60365..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKBridgeAPIResponse.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKButton+Subclass.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKButton+Subclass.h deleted file mode 120000 index 268ca082e..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKButton+Subclass.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKButton.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKButton.h deleted file mode 120000 index 806ec62d0..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCloseIcon.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCloseIcon.h deleted file mode 120000 index f1aa5047e..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCloseIcon.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKColor.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKColor.h deleted file mode 120000 index 849f131ae..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKColor.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKConstants.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKConstants.h deleted file mode 120000 index 4c08cc813..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKConstants.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKContainerViewController.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKContainerViewController.h deleted file mode 120000 index 1103d0be5..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKContainerViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCopying.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCopying.h deleted file mode 120000 index aa5dc1f7f..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCopying.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit+Internal.h deleted file mode 120000 index 91f7f948d..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit.h deleted file mode 120000 index bfffe4f8a..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCoreKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCrypto.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKCrypto.h deleted file mode 120000 index 644954351..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKCrypto.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKDeviceRequestsHelper.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKDeviceRequestsHelper.h deleted file mode 120000 index 257bcd7e0..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKDeviceRequestsHelper.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDeviceRequestsHelper.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKDialogConfiguration.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKDialogConfiguration.h deleted file mode 120000 index eb405492f..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKDialogConfiguration.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKDynamicFrameworkLoader.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKDynamicFrameworkLoader.h deleted file mode 120000 index ea0c19e84..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKDynamicFrameworkLoader.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKError.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKError.h deleted file mode 120000 index c27abd36c..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKError.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKErrorConfiguration.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKErrorConfiguration.h deleted file mode 120000 index 5f353b4b9..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKErrorConfiguration.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKErrorRecoveryAttempter.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKErrorRecoveryAttempter.h deleted file mode 120000 index 499f94ac9..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKErrorRecoveryAttempter.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKErrorRecoveryConfiguration.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKErrorRecoveryConfiguration.h deleted file mode 120000 index 4ebe2d88c..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKErrorRecoveryConfiguration.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h deleted file mode 120000 index 6f019f677..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequest+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequest+Internal.h deleted file mode 120000 index da915bfb9..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequest+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequest.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequest.h deleted file mode 120000 index 524cb7791..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequest.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestBody.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestBody.h deleted file mode 120000 index c3f8d45d0..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestBody.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestConnection+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestConnection+Internal.h deleted file mode 120000 index 6f3e14ae0..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestConnection+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestConnection.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestConnection.h deleted file mode 120000 index c6cbbfc3e..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestConnection.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h deleted file mode 120000 index 9960de282..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestMetadata.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestMetadata.h deleted file mode 120000 index d5584add2..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestMetadata.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestPiggybackManager.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestPiggybackManager.h deleted file mode 120000 index 028f07367..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKGraphRequestPiggybackManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKIcon.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKIcon.h deleted file mode 120000 index 5358ea5c0..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKIcon.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKImageDownloader.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKImageDownloader.h deleted file mode 120000 index 4e51dbed9..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKImageDownloader.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKImageDownloader.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKInternalUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKInternalUtility.h deleted file mode 120000 index 9549a8876..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKInternalUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKKeychainStore.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKKeychainStore.h deleted file mode 120000 index 9f0044994..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKKeychainStore.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKKeychainStoreViaBundleID.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKKeychainStoreViaBundleID.h deleted file mode 120000 index 3cb2bcea3..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKKeychainStoreViaBundleID.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKLogger.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKLogger.h deleted file mode 120000 index aceb08f98..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKLogger.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKLogo.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKLogo.h deleted file mode 120000 index 7f60a67aa..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKLogo.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMacros.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKMacros.h deleted file mode 120000 index f9059c172..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMacros.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMaleSilhouetteIcon.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKMaleSilhouetteIcon.h deleted file mode 120000 index 07e735934..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMaleSilhouetteIcon.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMath.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKMath.h deleted file mode 120000 index 4e9429176..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMath.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMonotonicTime.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKMonotonicTime.h deleted file mode 120000 index ab34b86b4..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMonotonicTime.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMutableCopying.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKMutableCopying.h deleted file mode 120000 index 40cf5f182..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKMutableCopying.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKPaymentObserver.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKPaymentObserver.h deleted file mode 120000 index 7a79f6378..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKPaymentObserver.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfile+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfile+Internal.h deleted file mode 120000 index e1c1faccc..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfile+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfile.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfile.h deleted file mode 120000 index a9866b1d5..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfile.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfilePictureView.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfilePictureView.h deleted file mode 120000 index 6f38799e4..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKProfilePictureView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfiguration+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfiguration+Internal.h deleted file mode 120000 index 67c87c353..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfiguration+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfiguration.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfiguration.h deleted file mode 120000 index 339a33560..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfiguration.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfigurationManager+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfigurationManager+Internal.h deleted file mode 120000 index 4156e2784..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfigurationManager+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfigurationManager.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfigurationManager.h deleted file mode 120000 index 91e055984..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKServerConfigurationManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKSettings+Internal.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKSettings+Internal.h deleted file mode 120000 index f25c4a223..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKSettings+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKSettings.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKSettings.h deleted file mode 120000 index 7edc38f39..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKSettings.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKSystemAccountStoreAdapter.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKSystemAccountStoreAdapter.h deleted file mode 120000 index 1c8b5069d..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKSystemAccountStoreAdapter.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKTestUsersManager.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKTestUsersManager.h deleted file mode 120000 index 5813f898f..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKTestUsersManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKTimeSpentData.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKTimeSpentData.h deleted file mode 120000 index e7b486a07..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKTimeSpentData.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKTriStateBOOL.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKTriStateBOOL.h deleted file mode 120000 index b16e0636b..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKTriStateBOOL.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKTypeUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKTypeUtility.h deleted file mode 120000 index ece247e1d..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKTypeUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKUIUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKUIUtility.h deleted file mode 120000 index 89e8fb48c..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKUIUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKURLConnection.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKURLConnection.h deleted file mode 120000 index 7d42325ef..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKURLConnection.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKURLOpening.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKURLOpening.h deleted file mode 120000 index a70f6e71f..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKURLOpening.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKURLSessionTask.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKURLSessionTask.h deleted file mode 120000 index 1210465b9..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKURLSessionTask.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLSessionTask.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKUtility.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKUtility.h deleted file mode 120000 index efbfaf13b..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKViewImpressionTracker.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKViewImpressionTracker.h deleted file mode 120000 index e4bc4fef9..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKViewImpressionTracker.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKWebDialog.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKWebDialog.h deleted file mode 120000 index 138ca331d..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKWebDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/FBSDKWebDialogView.h b/Pods/Headers/Private/FBSDKCoreKit/FBSDKWebDialogView.h deleted file mode 120000 index 59a0160da..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/FBSDKWebDialogView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKCoreKit/_FBSDKTemporaryErrorRecoveryAttempter.h b/Pods/Headers/Private/FBSDKCoreKit/_FBSDKTemporaryErrorRecoveryAttempter.h deleted file mode 120000 index bd4e149bb..000000000 --- a/Pods/Headers/Private/FBSDKCoreKit/_FBSDKTemporaryErrorRecoveryAttempter.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginButton.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginButton.h deleted file mode 120000 index a997deef4..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginCompletion+Internal.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginCompletion+Internal.h deleted file mode 120000 index 45fdfa984..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginCompletion+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginCompletion.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginCompletion.h deleted file mode 120000 index 1c5d1f1ad..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginCompletion.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginConstants.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginConstants.h deleted file mode 120000 index 93a52b76a..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginConstants.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginConstants.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginError.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginError.h deleted file mode 120000 index f257464da..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginError.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginError.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginKit+Internal.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginKit+Internal.h deleted file mode 120000 index 1eda541ee..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginKit+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginKit+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginKit.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginKit.h deleted file mode 120000 index cf4e004c4..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManager+Internal.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManager+Internal.h deleted file mode 120000 index cab55aea7..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManager+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManager+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManager.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManager.h deleted file mode 120000 index a791506bf..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManagerLogger.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManagerLogger.h deleted file mode 120000 index dfaa5404d..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManagerLogger.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLogger.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManagerLoginResult+Internal.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManagerLoginResult+Internal.h deleted file mode 120000 index a0af26e27..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManagerLoginResult+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLoginResult+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h deleted file mode 120000 index b8cf2c7cf..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginTooltipView.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginTooltipView.h deleted file mode 120000 index 0f25173ee..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginTooltipView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginTooltipView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginUtility.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginUtility.h deleted file mode 120000 index 48ff8f984..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKLoginUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/FBSDKTooltipView.h b/Pods/Headers/Private/FBSDKLoginKit/FBSDKTooltipView.h deleted file mode 120000 index c46a3c3c3..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/FBSDKTooltipView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKTooltipView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKLoginKit/_FBSDKLoginRecoveryAttempter.h b/Pods/Headers/Private/FBSDKLoginKit/_FBSDKLoginRecoveryAttempter.h deleted file mode 120000 index 91c76028e..000000000 --- a/Pods/Headers/Private/FBSDKLoginKit/_FBSDKLoginRecoveryAttempter.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/Internal/_FBSDKLoginRecoveryAttempter.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h deleted file mode 120000 index 67d708097..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h deleted file mode 120000 index 0e81d048e..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h deleted file mode 120000 index 32e79a708..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h deleted file mode 120000 index 61c47da81..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h deleted file mode 120000 index 16f9d5278..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments+Internal.h deleted file mode 120000 index f2f471a77..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCameraEffectArguments+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h deleted file mode 120000 index b3b50d015..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures+Internal.h deleted file mode 120000 index ccbf020f6..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCameraEffectTextures+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h deleted file mode 120000 index 98fc52fd0..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCheckmarkIcon.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCheckmarkIcon.h deleted file mode 120000 index 429d4fbf8..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKCheckmarkIcon.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h deleted file mode 120000 index 0a8ba2962..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h deleted file mode 120000 index 3f7906b19..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestFrictionlessRecipientCache.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestFrictionlessRecipientCache.h deleted file mode 120000 index 8d2b1fcb4..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestFrictionlessRecipientCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h deleted file mode 120000 index addd63f30..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionController.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionController.h deleted file mode 120000 index b17a17a8e..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionController.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionControllerCache.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionControllerCache.h deleted file mode 120000 index f54c62bfc..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeActionControllerCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxBorderView.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxBorderView.h deleted file mode 120000 index eac03ca1a..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxBorderView.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxView.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxView.h deleted file mode 120000 index 2fe6da37e..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeBoxView.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton+Internal.h deleted file mode 120000 index 894b54be6..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h deleted file mode 120000 index 1e9ecee69..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButtonPopWAV.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButtonPopWAV.h deleted file mode 120000 index 369359287..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButtonPopWAV.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl+Internal.h deleted file mode 120000 index 89509cdac..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h deleted file mode 120000 index 984a2ffc8..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeDialog.h deleted file mode 120000 index 5f2ac3be1..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h deleted file mode 120000 index efe324ea4..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h deleted file mode 120000 index c29f9eef9..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h deleted file mode 120000 index 7451999e9..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessengerIcon.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessengerIcon.h deleted file mode 120000 index 6363326df..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKMessengerIcon.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h deleted file mode 120000 index b827828c0..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h deleted file mode 120000 index 2d4e64644..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h deleted file mode 120000 index c981a564c..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h deleted file mode 120000 index 4394f0f80..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h deleted file mode 120000 index e7e13b59d..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDefines.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDefines.h deleted file mode 120000 index 4314dbc5a..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDefines.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h deleted file mode 120000 index 56b9ff941..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h deleted file mode 120000 index 8e28a2119..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareError.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareError.h deleted file mode 120000 index c4a055e8e..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareError.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit+Internal.h deleted file mode 120000 index b6d1c4fa4..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h deleted file mode 120000 index 4c432118e..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent+Internal.h deleted file mode 120000 index 15eb00f52..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h deleted file mode 120000 index 5d14f07bc..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h deleted file mode 120000 index 9a4eb9bcc..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h deleted file mode 120000 index 0db4f0280..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerContentUtility.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerContentUtility.h deleted file mode 120000 index ec3450fc0..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerContentUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareMessengerContentUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h deleted file mode 120000 index 14959c433..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h deleted file mode 120000 index d5dc27324..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h deleted file mode 120000 index ab62fb658..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h deleted file mode 120000 index 1c00ce2e6..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h deleted file mode 120000 index adadbe5de..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h deleted file mode 120000 index 8e50e056f..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h deleted file mode 120000 index c44ae9271..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h deleted file mode 120000 index f8b11790c..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer+Internal.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer+Internal.h deleted file mode 120000 index 7882df58a..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer+Internal.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h deleted file mode 120000 index 30a0dd3da..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h deleted file mode 120000 index b025b9840..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h deleted file mode 120000 index 54fbebaa4..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareUtility.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareUtility.h deleted file mode 120000 index 1654e8cdf..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h deleted file mode 120000 index 5fe5d6361..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h deleted file mode 120000 index 18a9aad66..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h deleted file mode 120000 index e64963771..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h deleted file mode 120000 index 348548547..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h deleted file mode 120000 index c11b78121..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKVideoUploader.h b/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKVideoUploader.h deleted file mode 120000 index d29626829..000000000 --- a/Pods/Headers/Private/FBSDKShareKit/FBSDKShareKit/FBSDKVideoUploader.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/Internal/FBSDKVideoUploader.h \ No newline at end of file diff --git a/Pods/Headers/Private/FFCircularProgressView/FFCircularProgressView.h b/Pods/Headers/Private/FFCircularProgressView/FFCircularProgressView.h deleted file mode 120000 index 655d2d34c..000000000 --- a/Pods/Headers/Private/FFCircularProgressView/FFCircularProgressView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FFCircularProgressView/UIColor+iOS7.h b/Pods/Headers/Private/FFCircularProgressView/UIColor+iOS7.h deleted file mode 120000 index a9beda171..000000000 --- a/Pods/Headers/Private/FFCircularProgressView/UIColor+iOS7.h +++ /dev/null @@ -1 +0,0 @@ -../../../FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/UIColor+iOS7.h \ No newline at end of file diff --git a/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImage.h b/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImage.h deleted file mode 120000 index 6b3118afd..000000000 --- a/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h \ No newline at end of file diff --git a/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImageView.h b/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImageView.h deleted file mode 120000 index 8d98a7bcd..000000000 --- a/Pods/Headers/Private/FLAnimatedImage/FLAnimatedImageView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/Firebase.h b/Pods/Headers/Private/Firebase/Firebase.h deleted file mode 120000 index 6d62033ce..000000000 --- a/Pods/Headers/Private/Firebase/Firebase.h +++ /dev/null @@ -1 +0,0 @@ -../../../Firebase/Core/Sources/Firebase.h \ No newline at end of file diff --git a/Pods/Headers/Private/Flurry-iOS-SDK/Flurry.h b/Pods/Headers/Private/Flurry-iOS-SDK/Flurry.h deleted file mode 120000 index 2bd771f46..000000000 --- a/Pods/Headers/Private/Flurry-iOS-SDK/Flurry.h +++ /dev/null @@ -1 +0,0 @@ -../../../Flurry-iOS-SDK/Flurry/Flurry.h \ No newline at end of file diff --git a/Pods/Headers/Private/Flurry-iOS-SDK/FlurrySessionBuilder.h b/Pods/Headers/Private/Flurry-iOS-SDK/FlurrySessionBuilder.h deleted file mode 120000 index a72adef0f..000000000 --- a/Pods/Headers/Private/Flurry-iOS-SDK/FlurrySessionBuilder.h +++ /dev/null @@ -1 +0,0 @@ -../../../Flurry-iOS-SDK/Flurry/FlurrySessionBuilder.h \ No newline at end of file diff --git a/Pods/Headers/Private/GTMSessionFetcher/GTMSessionFetcher.h b/Pods/Headers/Private/GTMSessionFetcher/GTMSessionFetcher.h deleted file mode 120000 index 7ed730f6d..000000000 --- a/Pods/Headers/Private/GTMSessionFetcher/GTMSessionFetcher.h +++ /dev/null @@ -1 +0,0 @@ -../../../GTMSessionFetcher/Source/GTMSessionFetcher.h \ No newline at end of file diff --git a/Pods/Headers/Private/GTMSessionFetcher/GTMSessionFetcherLogging.h b/Pods/Headers/Private/GTMSessionFetcher/GTMSessionFetcherLogging.h deleted file mode 120000 index ada41e3a5..000000000 --- a/Pods/Headers/Private/GTMSessionFetcher/GTMSessionFetcherLogging.h +++ /dev/null @@ -1 +0,0 @@ -../../../GTMSessionFetcher/Source/GTMSessionFetcherLogging.h \ No newline at end of file diff --git a/Pods/Headers/Private/GTMSessionFetcher/GTMSessionFetcherService.h b/Pods/Headers/Private/GTMSessionFetcher/GTMSessionFetcherService.h deleted file mode 120000 index 1ef9cbb7e..000000000 --- a/Pods/Headers/Private/GTMSessionFetcher/GTMSessionFetcherService.h +++ /dev/null @@ -1 +0,0 @@ -../../../GTMSessionFetcher/Source/GTMSessionFetcherService.h \ No newline at end of file diff --git a/Pods/Headers/Private/GTMSessionFetcher/GTMSessionUploadFetcher.h b/Pods/Headers/Private/GTMSessionFetcher/GTMSessionUploadFetcher.h deleted file mode 120000 index cef7a0d4b..000000000 --- a/Pods/Headers/Private/GTMSessionFetcher/GTMSessionUploadFetcher.h +++ /dev/null @@ -1 +0,0 @@ -../../../GTMSessionFetcher/Source/GTMSessionUploadFetcher.h \ No newline at end of file diff --git a/Pods/Headers/Private/GoogleToolboxForMac/GTMDebugSelectorValidation.h b/Pods/Headers/Private/GoogleToolboxForMac/GTMDebugSelectorValidation.h deleted file mode 120000 index 521da72d3..000000000 --- a/Pods/Headers/Private/GoogleToolboxForMac/GTMDebugSelectorValidation.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/DebugUtils/GTMDebugSelectorValidation.h \ No newline at end of file diff --git a/Pods/Headers/Private/GoogleToolboxForMac/GTMDebugThreadValidation.h b/Pods/Headers/Private/GoogleToolboxForMac/GTMDebugThreadValidation.h deleted file mode 120000 index de29ea171..000000000 --- a/Pods/Headers/Private/GoogleToolboxForMac/GTMDebugThreadValidation.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/DebugUtils/GTMDebugThreadValidation.h \ No newline at end of file diff --git a/Pods/Headers/Private/GoogleToolboxForMac/GTMDefines.h b/Pods/Headers/Private/GoogleToolboxForMac/GTMDefines.h deleted file mode 120000 index 550311089..000000000 --- a/Pods/Headers/Private/GoogleToolboxForMac/GTMDefines.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/GTMDefines.h \ No newline at end of file diff --git a/Pods/Headers/Private/GoogleToolboxForMac/GTMMethodCheck.h b/Pods/Headers/Private/GoogleToolboxForMac/GTMMethodCheck.h deleted file mode 120000 index 56dfa7e77..000000000 --- a/Pods/Headers/Private/GoogleToolboxForMac/GTMMethodCheck.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/DebugUtils/GTMMethodCheck.h \ No newline at end of file diff --git a/Pods/Headers/Private/GoogleToolboxForMac/GTMNSData+zlib.h b/Pods/Headers/Private/GoogleToolboxForMac/GTMNSData+zlib.h deleted file mode 120000 index 9e7241936..000000000 --- a/Pods/Headers/Private/GoogleToolboxForMac/GTMNSData+zlib.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/Foundation/GTMNSData+zlib.h \ No newline at end of file diff --git a/Pods/Headers/Private/GoogleToolboxForMac/GTMNSDictionary+URLArguments.h b/Pods/Headers/Private/GoogleToolboxForMac/GTMNSDictionary+URLArguments.h deleted file mode 120000 index b2ff829eb..000000000 --- a/Pods/Headers/Private/GoogleToolboxForMac/GTMNSDictionary+URLArguments.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/Foundation/GTMNSDictionary+URLArguments.h \ No newline at end of file diff --git a/Pods/Headers/Private/GoogleToolboxForMac/GTMNSString+URLArguments.h b/Pods/Headers/Private/GoogleToolboxForMac/GTMNSString+URLArguments.h deleted file mode 120000 index 3b9b1a279..000000000 --- a/Pods/Headers/Private/GoogleToolboxForMac/GTMNSString+URLArguments.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/Foundation/GTMNSString+URLArguments.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NSBundle+NYTPhotoViewer.h b/Pods/Headers/Private/NYTPhotoViewer/NSBundle+NYTPhotoViewer.h deleted file mode 120000 index c56c44b5f..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NSBundle+NYTPhotoViewer.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/Resource Loading/NSBundle+NYTPhotoViewer.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhoto.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhoto.h deleted file mode 120000 index 3158bff16..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhoto.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhoto.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoCaptionView.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoCaptionView.h deleted file mode 120000 index b89575520..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoCaptionView.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoCaptionView.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h deleted file mode 120000 index abf057625..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoContainer.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoContainer.h deleted file mode 120000 index 06bab2cf7..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoContainer.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoContainer.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h deleted file mode 120000 index 66db73e7c..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoTransitionAnimator.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoTransitionAnimator.h deleted file mode 120000 index eed59d6e7..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoTransitionAnimator.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionAnimator.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoTransitionController.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoTransitionController.h deleted file mode 120000 index 0c2316b75..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoTransitionController.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionController.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewController.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewController.h deleted file mode 120000 index d7215a9f6..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewController.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewer.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewer.h deleted file mode 120000 index d92079387..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewer.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h deleted file mode 120000 index b1242da23..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerCore.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerCore.h deleted file mode 120000 index 717c95bbb..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerCore.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerCore.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerDataSource.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerDataSource.h deleted file mode 120000 index 7457e025a..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoViewerDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h deleted file mode 120000 index 6f46fe236..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotosOverlayView.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotosOverlayView.h deleted file mode 120000 index e5b86d1d4..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotosOverlayView.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotosOverlayView.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotosViewController.h b/Pods/Headers/Private/NYTPhotoViewer/NYTPhotosViewController.h deleted file mode 120000 index 61a00b1ef..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTPhotosViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotosViewController.h \ No newline at end of file diff --git a/Pods/Headers/Private/NYTPhotoViewer/NYTScalingImageView.h b/Pods/Headers/Private/NYTPhotoViewer/NYTScalingImageView.h deleted file mode 120000 index fd85a759e..000000000 --- a/Pods/Headers/Private/NYTPhotoViewer/NYTScalingImageView.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTScalingImageView.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/NSDate+ChatDataSource.h b/Pods/Headers/Private/QMCVDevelopment/NSDate+ChatDataSource.h deleted file mode 120000 index 65d54b8cb..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/NSDate+ChatDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/NSString+QM.h b/Pods/Headers/Private/QMCVDevelopment/NSString+QM.h deleted file mode 120000 index 778cc6703..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/NSString+QM.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Categories/NSString+QM.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QBChatMessage+QBDateDivider.h b/Pods/Headers/Private/QMCVDevelopment/QBChatMessage+QBDateDivider.h deleted file mode 120000 index 6a9e7614a..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QBChatMessage+QBDateDivider.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMAudioIncomingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMAudioIncomingCell.h deleted file mode 120000 index d8d8025e6..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMAudioIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioIncomingCell/QMAudioIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMAudioOutgoingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMAudioOutgoingCell.h deleted file mode 120000 index a78a261c3..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMAudioOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioOutgoingCell/QMAudioOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMAudioRecordButton.h b/Pods/Headers/Private/QMCVDevelopment/QMAudioRecordButton.h deleted file mode 120000 index 16883db90..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMAudioRecordButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordButton/QMAudioRecordButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMAudioRecordView.h b/Pods/Headers/Private/QMCVDevelopment/QMAudioRecordView.h deleted file mode 120000 index 8f002b424..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMAudioRecordView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordView/QMAudioRecordView.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMBaseChatLocationCell.h b/Pods/Headers/Private/QMCVDevelopment/QMBaseChatLocationCell.h deleted file mode 120000 index 54a06ebbf..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMBaseChatLocationCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationCell/QMBaseChatLocationCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMBaseMediaCell.h b/Pods/Headers/Private/QMCVDevelopment/QMBaseMediaCell.h deleted file mode 120000 index cbcb9b75a..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMBaseMediaCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMBaseChatMediaAttachmentCell/QMBaseMediaCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatActionsHandler.h b/Pods/Headers/Private/QMCVDevelopment/QMChatActionsHandler.h deleted file mode 120000 index a3f7cc678..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatActionsHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/QMChatActionsHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatAttachmentCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatAttachmentCell.h deleted file mode 120000 index d0faf19ca..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatAttachmentCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentCell/QMChatAttachmentCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatAttachmentIncomingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatAttachmentIncomingCell.h deleted file mode 120000 index 40ee1b73b..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatAttachmentIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatAttachmentOutgoingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatAttachmentOutgoingCell.h deleted file mode 120000 index d3840c1e7..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatAttachmentOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatBaseLinkPreviewCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatBaseLinkPreviewCell.h deleted file mode 120000 index 9b0632aca..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatBaseLinkPreviewCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatBaseLinkPreviewCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatCell.h deleted file mode 120000 index f500c978b..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatCellLayoutAttributes.h b/Pods/Headers/Private/QMCVDevelopment/QMChatCellLayoutAttributes.h deleted file mode 120000 index 60215a6c8..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatCellLayoutAttributes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMChatCellLayoutAttributes.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionView.h b/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionView.h deleted file mode 120000 index 0b9ff3c82..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CollectionView/QMChatCollectionView.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionViewDataSource.h b/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionViewDataSource.h deleted file mode 120000 index a8f36ea49..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionViewDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Protocols/QMChatCollectionViewDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionViewDelegateFlowLayout.h b/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionViewDelegateFlowLayout.h deleted file mode 120000 index 7f9fa570f..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionViewDelegateFlowLayout.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Protocols/QMChatCollectionViewDelegateFlowLayout.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionViewFlowLayout.h b/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionViewFlowLayout.h deleted file mode 120000 index 8092bb6e7..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatCollectionViewFlowLayout.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMChatCollectionViewFlowLayout.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatContactRequestCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatContactRequestCell.h deleted file mode 120000 index 2eea5f7e7..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatContactRequestCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatContainerView.h b/Pods/Headers/Private/QMCVDevelopment/QMChatContainerView.h deleted file mode 120000 index 9fffeb1df..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatContainerView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/QMChatContainerView.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatDataSource.h b/Pods/Headers/Private/QMCVDevelopment/QMChatDataSource.h deleted file mode 120000 index 8ac574504..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatDataSource/QMChatDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatIncomingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatIncomingCell.h deleted file mode 120000 index 91d37b177..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatIncomingCell/QMChatIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatIncomingLinkPreviewCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatIncomingLinkPreviewCell.h deleted file mode 120000 index c7a965bb7..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatIncomingLinkPreviewCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatIncomingLinkPreviewCell/QMChatIncomingLinkPreviewCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatLocationCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatLocationCell.h deleted file mode 120000 index 4224cdf37..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatLocationCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationCell/QMChatLocationCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatLocationIncomingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatLocationIncomingCell.h deleted file mode 120000 index 4ae92cb66..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatLocationIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationIncomingCell/QMChatLocationIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatLocationOutgoingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatLocationOutgoingCell.h deleted file mode 120000 index 5a1d7a04d..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatLocationOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationOutgoingCell/QMChatLocationOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatLocationSnapshotter.h b/Pods/Headers/Private/QMCVDevelopment/QMChatLocationSnapshotter.h deleted file mode 120000 index 836ad60f3..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatLocationSnapshotter.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatNotificationCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatNotificationCell.h deleted file mode 120000 index 41d045b5d..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatNotificationCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatNotificationCell/QMChatNotificationCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatOutgoingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatOutgoingCell.h deleted file mode 120000 index 8b8bd75c3..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatOutgoingCell/QMChatOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatOutgoingLinkPreviewCell.h b/Pods/Headers/Private/QMCVDevelopment/QMChatOutgoingLinkPreviewCell.h deleted file mode 120000 index 5f70b03ee..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatOutgoingLinkPreviewCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatOutgoingLinkPreviewCell/QMChatOutgoingLinkPreviewCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatResources.h b/Pods/Headers/Private/QMCVDevelopment/QMChatResources.h deleted file mode 120000 index cc2c61c88..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatResources.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Utils/QMChatResources/QMChatResources.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMChatViewController.h b/Pods/Headers/Private/QMCVDevelopment/QMChatViewController.h deleted file mode 120000 index 1b46b664f..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMChatViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatViewController.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMCollectionViewFlowLayoutInvalidationContext.h b/Pods/Headers/Private/QMCVDevelopment/QMCollectionViewFlowLayoutInvalidationContext.h deleted file mode 120000 index fb52352a7..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMCollectionViewFlowLayoutInvalidationContext.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMCollectionViewFlowLayoutInvalidationContext.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMDateUtils.h b/Pods/Headers/Private/QMCVDevelopment/QMDateUtils.h deleted file mode 120000 index 7a7be0a03..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMDateUtils.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Utils/QMDateUtils/QMDateUtils.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMHeaderCollectionReusableView.h b/Pods/Headers/Private/QMCVDevelopment/QMHeaderCollectionReusableView.h deleted file mode 120000 index 46da071d8..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMHeaderCollectionReusableView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/QMHeaderCollectionReusableView/QMHeaderCollectionReusableView.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMImageIncomingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMImageIncomingCell.h deleted file mode 120000 index 3af02bd4a..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMImageIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMImageLoader.h b/Pods/Headers/Private/QMCVDevelopment/QMImageLoader.h deleted file mode 120000 index 4cb569b86..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMImageLoader.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Utils/QMImageLoader/QMImageLoader.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMImageOutgoingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMImageOutgoingCell.h deleted file mode 120000 index 1fb04ee4d..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMImageOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMImageView.h b/Pods/Headers/Private/QMCVDevelopment/QMImageView.h deleted file mode 120000 index 8ad391c61..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMImageView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/QMImageView/QMImageView.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMInputToolbar.h b/Pods/Headers/Private/QMCVDevelopment/QMInputToolbar.h deleted file mode 120000 index 12afdc6c1..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMInputToolbar.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMInputToolbar.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMKVOView.h b/Pods/Headers/Private/QMCVDevelopment/QMKVOView.h deleted file mode 120000 index ec43ab8b2..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMKVOView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/QMKVOView.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMLinkPreviewDelegate.h b/Pods/Headers/Private/QMCVDevelopment/QMLinkPreviewDelegate.h deleted file mode 120000 index bd35c5627..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMLinkPreviewDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMLinkPreviewDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMMediaIncomingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMMediaIncomingCell.h deleted file mode 120000 index fef7a2163..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMMediaIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaIncomingCell/QMMediaIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMMediaOutgoingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMMediaOutgoingCell.h deleted file mode 120000 index d95b3c10c..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMMediaOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaOutgoingCell/QMMediaOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMMediaViewDelegate.h b/Pods/Headers/Private/QMCVDevelopment/QMMediaViewDelegate.h deleted file mode 120000 index b7b79ffda..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMMediaViewDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaViewDelegate/QMMediaViewDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMPlaceHolderTextView.h b/Pods/Headers/Private/QMCVDevelopment/QMPlaceHolderTextView.h deleted file mode 120000 index 4c96b9d27..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMPlaceHolderTextView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/PlaceHolderTextView/QMPlaceHolderTextView.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMProgressView.h b/Pods/Headers/Private/QMCVDevelopment/QMProgressView.h deleted file mode 120000 index c881689b1..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMProgressView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/QMProgressView/QMProgressView.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMToolbarContainer.h b/Pods/Headers/Private/QMCVDevelopment/QMToolbarContainer.h deleted file mode 120000 index 5a635d0c1..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMToolbarContainer.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContainer.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMToolbarContentView.h b/Pods/Headers/Private/QMCVDevelopment/QMToolbarContentView.h deleted file mode 120000 index 0d6ed5c02..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMToolbarContentView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContentView.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMVideoIncomingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMVideoIncomingCell.h deleted file mode 120000 index 908986b56..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMVideoIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoIncomingCell/QMVideoIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/QMVideoOutgoingCell.h b/Pods/Headers/Private/QMCVDevelopment/QMVideoOutgoingCell.h deleted file mode 120000 index 804f7044e..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/QMVideoOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoOutgoingCell/QMVideoOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/UIColor+QM.h b/Pods/Headers/Private/QMCVDevelopment/UIColor+QM.h deleted file mode 120000 index 48692670d..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/UIColor+QM.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Categories/UIColor+QM.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/UIImage+Cropper.h b/Pods/Headers/Private/QMCVDevelopment/UIImage+Cropper.h deleted file mode 120000 index 1e2a7ea04..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/UIImage+Cropper.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Categories/UIImage+Cropper.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/UIImage+QM.h b/Pods/Headers/Private/QMCVDevelopment/UIImage+QM.h deleted file mode 120000 index 176b0ecf8..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/UIImage+QM.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Categories/UIImage+QM.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/UIImageView+QMLocationSnapshot.h b/Pods/Headers/Private/QMCVDevelopment/UIImageView+QMLocationSnapshot.h deleted file mode 120000 index 11153cc18..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/UIImageView+QMLocationSnapshot.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMCVDevelopment/UIView+QM.h b/Pods/Headers/Private/QMCVDevelopment/UIView+QM.h deleted file mode 120000 index 76fddc0f2..000000000 --- a/Pods/Headers/Private/QMCVDevelopment/UIView+QM.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Categories/UIView+QM.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/CDAttachment.h b/Pods/Headers/Private/QMServicesDevelopment/CDAttachment.h deleted file mode 120000 index 62d26ae5c..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/CDAttachment.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDAttachment.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/CDContactListItem.h b/Pods/Headers/Private/QMServicesDevelopment/CDContactListItem.h deleted file mode 120000 index 1a0482c35..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/CDContactListItem.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListCache/QMContactListCache/CoreData/Entries/CDContactListItem.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/CDDialog.h b/Pods/Headers/Private/QMServicesDevelopment/CDDialog.h deleted file mode 120000 index 6392ec9ac..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/CDDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/CDMessage.h b/Pods/Headers/Private/QMServicesDevelopment/CDMessage.h deleted file mode 120000 index c4fca59b1..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/CDMessage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDMessage.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/CDOpenGraphModel.h b/Pods/Headers/Private/QMServicesDevelopment/CDOpenGraphModel.h deleted file mode 120000 index 669e1bb63..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/CDOpenGraphModel.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/CoreData/Entries/CDOpenGraphModel.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/CDUser.h b/Pods/Headers/Private/QMServicesDevelopment/CDUser.h deleted file mode 120000 index 204b9f95a..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/CDUser.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersCache/QMUsersCache/CoreData/Entries/CDUser.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSArray+QMCDRecord.h b/Pods/Headers/Private/QMServicesDevelopment/NSArray+QMCDRecord.h deleted file mode 120000 index eb5037b20..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSArray+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSArray+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSDictionary+QMCDRecordAdditions.h b/Pods/Headers/Private/QMServicesDevelopment/NSDictionary+QMCDRecordAdditions.h deleted file mode 120000 index 12db14d4d..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSDictionary+QMCDRecordAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSDictionary+QMCDRecordAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSError+QMCDRecordErrorHandling.h b/Pods/Headers/Private/QMServicesDevelopment/NSError+QMCDRecordErrorHandling.h deleted file mode 120000 index f715d0f48..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSError+QMCDRecordErrorHandling.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSError+QMCDRecordErrorHandling.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDAggregation.h b/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDAggregation.h deleted file mode 120000 index 24567ab76..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDAggregation.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDAggregation.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDFinders.h b/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDFinders.h deleted file mode 120000 index a739bf51a..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDFinders.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDFinders.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDRecord.h b/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDRecord.h deleted file mode 120000 index 48ff149e9..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDRequests.h b/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDRequests.h deleted file mode 120000 index 007e0b6cb..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObject+QMCDRequests.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRequests.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectContext+QMCDObserving.h b/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectContext+QMCDObserving.h deleted file mode 120000 index e79100af8..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectContext+QMCDObserving.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDObserving.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectContext+QMCDRecord.h b/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectContext+QMCDRecord.h deleted file mode 120000 index 6d4765d6e..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectContext+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectContext+QMCDSaves.h b/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectContext+QMCDSaves.h deleted file mode 120000 index a3303712e..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectContext+QMCDSaves.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDSaves.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectModel+QMCDRecord.h b/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectModel+QMCDRecord.h deleted file mode 120000 index 2d521c240..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSManagedObjectModel+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectModel+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSPersistentStore+QMCDRecord.h b/Pods/Headers/Private/QMServicesDevelopment/NSPersistentStore+QMCDRecord.h deleted file mode 120000 index dbf05fa1b..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSPersistentStore+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSPersistentStore+QMCDRecordPrivate.h b/Pods/Headers/Private/QMServicesDevelopment/NSPersistentStore+QMCDRecordPrivate.h deleted file mode 120000 index 61ba2b98b..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSPersistentStore+QMCDRecordPrivate.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecordPrivate.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/NSPersistentStoreCoordinator+QMCDRecord.h b/Pods/Headers/Private/QMServicesDevelopment/NSPersistentStoreCoordinator+QMCDRecord.h deleted file mode 120000 index e043a2631..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/NSPersistentStoreCoordinator+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStoreCoordinator/NSPersistentStoreCoordinator+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QBChatAttachment+QMCustomData.h b/Pods/Headers/Private/QMServicesDevelopment/QBChatAttachment+QMCustomData.h deleted file mode 120000 index 70ccb85e0..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QBChatAttachment+QMCustomData.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomData.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QBChatAttachment+QMCustomParameters.h b/Pods/Headers/Private/QMServicesDevelopment/QBChatAttachment+QMCustomParameters.h deleted file mode 120000 index 1bbc14f43..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QBChatAttachment+QMCustomParameters.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomParameters.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QBChatAttachment+QMFactory.h b/Pods/Headers/Private/QMServicesDevelopment/QBChatAttachment+QMFactory.h deleted file mode 120000 index 0a732a70a..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QBChatAttachment+QMFactory.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMFactory.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QBChatMessage+QMCustomParameters.h b/Pods/Headers/Private/QMServicesDevelopment/QBChatMessage+QMCustomParameters.h deleted file mode 120000 index a87221b16..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QBChatMessage+QMCustomParameters.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatMessage+QMCustomParameters.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QBUUser+CustomData.h b/Pods/Headers/Private/QMServicesDevelopment/QBUUser+CustomData.h deleted file mode 120000 index f2094bd47..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QBUUser+CustomData.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersService/QMUsersService/Categories/QBUUser+CustomData.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMAssetLoader.h b/Pods/Headers/Private/QMServicesDevelopment/QMAssetLoader.h deleted file mode 120000 index 03c07a12c..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMAssetLoader.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAssetLoader.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMAsynchronousOperation.h b/Pods/Headers/Private/QMServicesDevelopment/QMAsynchronousOperation.h deleted file mode 120000 index 01513bdd4..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMAsynchronousOperation.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMBaseService/QMBaseService/QMAsynchronousOperation/QMAsynchronousOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentAssetService.h b/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentAssetService.h deleted file mode 120000 index 61f83bc18..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentAssetService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAttachmentAssetService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentContentService.h b/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentContentService.h deleted file mode 120000 index 66dc4f85d..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentContentService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMAttachmentContentService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentStoreService.h b/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentStoreService.h deleted file mode 120000 index 97b09e1d5..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentStoreService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentStoreServiceDelegate.h b/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentStoreServiceDelegate.h deleted file mode 120000 index a507103f1..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentStoreServiceDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreServiceDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentsMemoryStorage.h b/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentsMemoryStorage.h deleted file mode 120000 index 78b269f16..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMAttachmentsMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentsMemoryStorage/QMAttachmentsMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMAuthService.h b/Pods/Headers/Private/QMServicesDevelopment/QMAuthService.h deleted file mode 120000 index ce0a20156..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMAuthService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMAuthService/QMAuthService/QMAuthService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMBaseService.h b/Pods/Headers/Private/QMServicesDevelopment/QMBaseService.h deleted file mode 120000 index 38622ed78..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMBaseService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMBaseService/QMBaseService/QMBaseService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMCDMigrationManager.h b/Pods/Headers/Private/QMServicesDevelopment/QMCDMigrationManager.h deleted file mode 120000 index c394420d8..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMCDMigrationManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDMigrationManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecord+Options.h b/Pods/Headers/Private/QMServicesDevelopment/QMCDRecord+Options.h deleted file mode 120000 index aa981357e..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecord+Options.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+Options.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecord+VersionInformation.h b/Pods/Headers/Private/QMServicesDevelopment/QMCDRecord+VersionInformation.h deleted file mode 120000 index d4671c26d..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecord+VersionInformation.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+VersionInformation.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecord.h b/Pods/Headers/Private/QMServicesDevelopment/QMCDRecord.h deleted file mode 120000 index 1680e183e..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecordInternal.h b/Pods/Headers/Private/QMServicesDevelopment/QMCDRecordInternal.h deleted file mode 120000 index d8d3bff0a..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecordInternal.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordInternal.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecordLogging.h b/Pods/Headers/Private/QMServicesDevelopment/QMCDRecordLogging.h deleted file mode 120000 index 9e1bb79de..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecordLogging.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordLogging.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecordStack.h b/Pods/Headers/Private/QMServicesDevelopment/QMCDRecordStack.h deleted file mode 120000 index f4a3505a6..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMCDRecordStack.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecordStack/QMCDRecordStack.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMCancellableService.h b/Pods/Headers/Private/QMServicesDevelopment/QMCancellableService.h deleted file mode 120000 index 7fbb669f6..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMCancellableService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMBaseService/QMBaseService/QMCancellableService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMChatAttachmentService.h b/Pods/Headers/Private/QMServicesDevelopment/QMChatAttachmentService.h deleted file mode 120000 index 267a45927..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMChatAttachmentService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMChatAttachmentService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMChatCache.h b/Pods/Headers/Private/QMServicesDevelopment/QMChatCache.h deleted file mode 120000 index 1a66b1ab9..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMChatCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/QMChatCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMChatConstants.h b/Pods/Headers/Private/QMServicesDevelopment/QMChatConstants.h deleted file mode 120000 index 4ededdba0..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMChatConstants.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMChatConstants.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMChatService.h b/Pods/Headers/Private/QMServicesDevelopment/QMChatService.h deleted file mode 120000 index 9a181efce..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMChatService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMChatService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMChatServiceModelIncludes.h b/Pods/Headers/Private/QMServicesDevelopment/QMChatServiceModelIncludes.h deleted file mode 120000 index 724a01327..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMChatServiceModelIncludes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/QMChatServiceModelIncludes.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMChatTypes.h b/Pods/Headers/Private/QMServicesDevelopment/QMChatTypes.h deleted file mode 120000 index 71125a7a0..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMChatTypes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMChatTypes.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMContactListCache.h b/Pods/Headers/Private/QMServicesDevelopment/QMContactListCache.h deleted file mode 120000 index 3fae19336..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMContactListCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListCache/QMContactListCache/QMContactListCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMContactListMemoryStorage.h b/Pods/Headers/Private/QMServicesDevelopment/QMContactListMemoryStorage.h deleted file mode 120000 index b12ea33c2..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMContactListMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListMemoryStorage/QMContactListMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMContactListModelIncludes.h b/Pods/Headers/Private/QMServicesDevelopment/QMContactListModelIncludes.h deleted file mode 120000 index fddf95094..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMContactListModelIncludes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListCache/QMContactListCache/CoreData/QMContactListModelIncludes.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMContactListService.h b/Pods/Headers/Private/QMServicesDevelopment/QMContactListService.h deleted file mode 120000 index b859b8f65..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMContactListService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMDBStorage.h b/Pods/Headers/Private/QMServicesDevelopment/QMDBStorage.h deleted file mode 120000 index ea9165afb..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMDBStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMDBStorage.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMDeferredQueueManager.h b/Pods/Headers/Private/QMServicesDevelopment/QMDeferredQueueManager.h deleted file mode 120000 index 6c6f033fb..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMDeferredQueueManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMManagers/QMDeferredQueueManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMDeferredQueueMemoryStorage.h b/Pods/Headers/Private/QMServicesDevelopment/QMDeferredQueueMemoryStorage.h deleted file mode 120000 index 2136763a6..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMDeferredQueueMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMManagers/QMDeferredQueueMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMDialogsMemoryStorage.h b/Pods/Headers/Private/QMServicesDevelopment/QMDialogsMemoryStorage.h deleted file mode 120000 index 9ab52454e..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMDialogsMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMDialogsMemoryStorage/QMDialogsMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMMediaBlocks.h b/Pods/Headers/Private/QMServicesDevelopment/QMMediaBlocks.h deleted file mode 120000 index 9147a84a3..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMMediaBlocks.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMMediaBlocks.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMMediaDownloadService.h b/Pods/Headers/Private/QMServicesDevelopment/QMMediaDownloadService.h deleted file mode 120000 index 66a09c0d1..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMMediaDownloadService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMMediaDownloadServiceDelegate.h b/Pods/Headers/Private/QMServicesDevelopment/QMMediaDownloadServiceDelegate.h deleted file mode 120000 index 779c2c4e6..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMMediaDownloadServiceDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadServiceDelegates/QMMediaDownloadServiceDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMMediaUploadService.h b/Pods/Headers/Private/QMServicesDevelopment/QMMediaUploadService.h deleted file mode 120000 index 9a081fe7d..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMMediaUploadService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaUploadService/QMMediaUploadService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMMemoryStorageProtocol.h b/Pods/Headers/Private/QMServicesDevelopment/QMMemoryStorageProtocol.h deleted file mode 120000 index 27d053553..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMMemoryStorageProtocol.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMBaseService/QMBaseService/QMMemoryStorageProtocol.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMMessagesMemoryStorage.h b/Pods/Headers/Private/QMServicesDevelopment/QMMessagesMemoryStorage.h deleted file mode 120000 index 01c9cf335..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMMessagesMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMMessagesMemoryStorage/QMMessagesMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphCache.h b/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphCache.h deleted file mode 120000 index 693e9deb1..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/QMOpenGraphCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphItem.h b/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphItem.h deleted file mode 120000 index e3b5bd079..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphItem.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphItem.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphMemoryStorage.h b/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphMemoryStorage.h deleted file mode 120000 index ca3ef82d3..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphModelIncludes.h b/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphModelIncludes.h deleted file mode 120000 index 70e752e85..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphModelIncludes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/CoreData/QMOpenGraphModelIncludes.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphService.h b/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphService.h deleted file mode 120000 index 2b139a237..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMOpenGraphService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMSLog.h b/Pods/Headers/Private/QMServicesDevelopment/QMSLog.h deleted file mode 120000 index 38c866da5..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMSLog.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMServices/QMSLog.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMServiceManagerProtocol.h b/Pods/Headers/Private/QMServicesDevelopment/QMServiceManagerProtocol.h deleted file mode 120000 index e1683b7dc..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMServiceManagerProtocol.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMBaseService/QMBaseService/QMServiceManagerProtocol.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMServices.h b/Pods/Headers/Private/QMServicesDevelopment/QMServices.h deleted file mode 120000 index 653bfa6dd..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMServices.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMServices/QMServices.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMServicesManager.h b/Pods/Headers/Private/QMServicesDevelopment/QMServicesManager.h deleted file mode 120000 index 217165ee0..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMServicesManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMManagers/QMServicesManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMTimeOut.h b/Pods/Headers/Private/QMServicesDevelopment/QMTimeOut.h deleted file mode 120000 index 85a0115a8..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMTimeOut.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMTimeOut/QMTimeOut.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMUsersCache.h b/Pods/Headers/Private/QMServicesDevelopment/QMUsersCache.h deleted file mode 120000 index 385cf13f6..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMUsersCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersCache/QMUsersCache/QMUsersCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMUsersMemoryStorage.h b/Pods/Headers/Private/QMServicesDevelopment/QMUsersMemoryStorage.h deleted file mode 120000 index b1546b475..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMUsersMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersService/QMUsersService/QMUsersMemoryStorage/QMUsersMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMUsersModelIncludes.h b/Pods/Headers/Private/QMServicesDevelopment/QMUsersModelIncludes.h deleted file mode 120000 index 6b3b6a250..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMUsersModelIncludes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersCache/QMUsersCache/CoreData/QMUsersModelIncludes.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/QMUsersService.h b/Pods/Headers/Private/QMServicesDevelopment/QMUsersService.h deleted file mode 120000 index 42933d438..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/QMUsersService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersService/QMUsersService/QMUsersService.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/_CDAttachment.h b/Pods/Headers/Private/QMServicesDevelopment/_CDAttachment.h deleted file mode 120000 index 687e041e6..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/_CDAttachment.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDAttachment.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/_CDContactListItem.h b/Pods/Headers/Private/QMServicesDevelopment/_CDContactListItem.h deleted file mode 120000 index cb19b527d..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/_CDContactListItem.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListCache/QMContactListCache/CoreData/EntriesMachine/_CDContactListItem.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/_CDDialog.h b/Pods/Headers/Private/QMServicesDevelopment/_CDDialog.h deleted file mode 120000 index bb10819c1..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/_CDDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDDialog.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/_CDMessage.h b/Pods/Headers/Private/QMServicesDevelopment/_CDMessage.h deleted file mode 120000 index 44baba2b3..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/_CDMessage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDMessage.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/_CDOpenGraphModel.h b/Pods/Headers/Private/QMServicesDevelopment/_CDOpenGraphModel.h deleted file mode 120000 index bb2083142..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/_CDOpenGraphModel.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/CoreData/EntriesMachine/_CDOpenGraphModel.h \ No newline at end of file diff --git a/Pods/Headers/Private/QMServicesDevelopment/_CDUser.h b/Pods/Headers/Private/QMServicesDevelopment/_CDUser.h deleted file mode 120000 index ff7545253..000000000 --- a/Pods/Headers/Private/QMServicesDevelopment/_CDUser.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersCache/QMUsersCache/CoreData/EntriesMachine/_CDUser.h \ No newline at end of file diff --git a/Pods/Headers/Private/Reachability/Reachability.h b/Pods/Headers/Private/Reachability/Reachability.h deleted file mode 120000 index a30e80c62..000000000 --- a/Pods/Headers/Private/Reachability/Reachability.h +++ /dev/null @@ -1 +0,0 @@ -../../../Reachability/Reachability.h \ No newline at end of file diff --git a/Pods/Headers/Private/SAMKeychain/SAMKeychain.h b/Pods/Headers/Private/SAMKeychain/SAMKeychain.h deleted file mode 120000 index 4a4fb486e..000000000 --- a/Pods/Headers/Private/SAMKeychain/SAMKeychain.h +++ /dev/null @@ -1 +0,0 @@ -../../../SAMKeychain/Sources/SAMKeychain.h \ No newline at end of file diff --git a/Pods/Headers/Private/SAMKeychain/SAMKeychainQuery.h b/Pods/Headers/Private/SAMKeychain/SAMKeychainQuery.h deleted file mode 120000 index f2860b6fc..000000000 --- a/Pods/Headers/Private/SAMKeychain/SAMKeychainQuery.h +++ /dev/null @@ -1 +0,0 @@ -../../../SAMKeychain/Sources/SAMKeychainQuery.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/NSButton+WebCache.h b/Pods/Headers/Private/SDWebImage/NSButton+WebCache.h deleted file mode 120000 index 487f0e352..000000000 --- a/Pods/Headers/Private/SDWebImage/NSButton+WebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/NSButton+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/NSData+ImageContentType.h b/Pods/Headers/Private/SDWebImage/NSData+ImageContentType.h deleted file mode 120000 index 84574987a..000000000 --- a/Pods/Headers/Private/SDWebImage/NSData+ImageContentType.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/NSData+ImageContentType.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/NSImage+WebCache.h b/Pods/Headers/Private/SDWebImage/NSImage+WebCache.h deleted file mode 120000 index b7a00e1f3..000000000 --- a/Pods/Headers/Private/SDWebImage/NSImage+WebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/NSImage+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDImageCache.h b/Pods/Headers/Private/SDWebImage/SDImageCache.h deleted file mode 120000 index 0040b06a1..000000000 --- a/Pods/Headers/Private/SDWebImage/SDImageCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDImageCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDImageCacheConfig.h b/Pods/Headers/Private/SDWebImage/SDImageCacheConfig.h deleted file mode 120000 index f0f1f8f38..000000000 --- a/Pods/Headers/Private/SDWebImage/SDImageCacheConfig.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDImageCacheConfig.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageCoder.h b/Pods/Headers/Private/SDWebImage/SDWebImageCoder.h deleted file mode 120000 index 05b0fe75f..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageCoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageCoder.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageCoderHelper.h b/Pods/Headers/Private/SDWebImage/SDWebImageCoderHelper.h deleted file mode 120000 index dccfb45e1..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageCoderHelper.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageCoderHelper.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageCodersManager.h b/Pods/Headers/Private/SDWebImage/SDWebImageCodersManager.h deleted file mode 120000 index a76c09a3d..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageCodersManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageCodersManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageCompat.h b/Pods/Headers/Private/SDWebImage/SDWebImageCompat.h deleted file mode 120000 index 6ca247842..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageCompat.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageCompat.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageDownloader.h b/Pods/Headers/Private/SDWebImage/SDWebImageDownloader.h deleted file mode 120000 index 303b03b1e..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageDownloader.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageDownloader.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageDownloaderOperation.h b/Pods/Headers/Private/SDWebImage/SDWebImageDownloaderOperation.h deleted file mode 120000 index 99441c485..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageDownloaderOperation.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageFrame.h b/Pods/Headers/Private/SDWebImage/SDWebImageFrame.h deleted file mode 120000 index 5dba5eea6..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageFrame.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageFrame.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageGIFCoder.h b/Pods/Headers/Private/SDWebImage/SDWebImageGIFCoder.h deleted file mode 120000 index b81a0f113..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageGIFCoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageGIFCoder.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageImageIOCoder.h b/Pods/Headers/Private/SDWebImage/SDWebImageImageIOCoder.h deleted file mode 120000 index 1b36e7a28..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageImageIOCoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageImageIOCoder.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageManager.h b/Pods/Headers/Private/SDWebImage/SDWebImageManager.h deleted file mode 120000 index 1b8184856..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageOperation.h b/Pods/Headers/Private/SDWebImage/SDWebImageOperation.h deleted file mode 120000 index 20e5b89ef..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageOperation.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImagePrefetcher.h b/Pods/Headers/Private/SDWebImage/SDWebImagePrefetcher.h deleted file mode 120000 index 50585c6d0..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImagePrefetcher.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImagePrefetcher.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDWebImageTransition.h b/Pods/Headers/Private/SDWebImage/SDWebImageTransition.h deleted file mode 120000 index 98ad40f6a..000000000 --- a/Pods/Headers/Private/SDWebImage/SDWebImageTransition.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageTransition.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIButton+WebCache.h b/Pods/Headers/Private/SDWebImage/UIButton+WebCache.h deleted file mode 120000 index 19d2d8e8c..000000000 --- a/Pods/Headers/Private/SDWebImage/UIButton+WebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIButton+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIImage+ForceDecode.h b/Pods/Headers/Private/SDWebImage/UIImage+ForceDecode.h deleted file mode 120000 index 1ec2523f5..000000000 --- a/Pods/Headers/Private/SDWebImage/UIImage+ForceDecode.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIImage+ForceDecode.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIImage+GIF.h b/Pods/Headers/Private/SDWebImage/UIImage+GIF.h deleted file mode 120000 index 14d5aadd9..000000000 --- a/Pods/Headers/Private/SDWebImage/UIImage+GIF.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIImage+GIF.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIImage+MultiFormat.h b/Pods/Headers/Private/SDWebImage/UIImage+MultiFormat.h deleted file mode 120000 index 1fb965010..000000000 --- a/Pods/Headers/Private/SDWebImage/UIImage+MultiFormat.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIImage+MultiFormat.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIImageView+HighlightedWebCache.h b/Pods/Headers/Private/SDWebImage/UIImageView+HighlightedWebCache.h deleted file mode 120000 index fd4dea41e..000000000 --- a/Pods/Headers/Private/SDWebImage/UIImageView+HighlightedWebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIImageView+WebCache.h b/Pods/Headers/Private/SDWebImage/UIImageView+WebCache.h deleted file mode 120000 index 0c53a47b8..000000000 --- a/Pods/Headers/Private/SDWebImage/UIImageView+WebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIImageView+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIView+WebCache.h b/Pods/Headers/Private/SDWebImage/UIView+WebCache.h deleted file mode 120000 index 641671a56..000000000 --- a/Pods/Headers/Private/SDWebImage/UIView+WebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIView+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIView+WebCacheOperation.h b/Pods/Headers/Private/SDWebImage/UIView+WebCacheOperation.h deleted file mode 120000 index f9890c406..000000000 --- a/Pods/Headers/Private/SDWebImage/UIView+WebCacheOperation.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIView+WebCacheOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/SVProgressHUD/SVIndefiniteAnimatedView.h b/Pods/Headers/Private/SVProgressHUD/SVIndefiniteAnimatedView.h deleted file mode 120000 index 55a38a2a6..000000000 --- a/Pods/Headers/Private/SVProgressHUD/SVIndefiniteAnimatedView.h +++ /dev/null @@ -1 +0,0 @@ -../../../SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h \ No newline at end of file diff --git a/Pods/Headers/Private/SVProgressHUD/SVProgressAnimatedView.h b/Pods/Headers/Private/SVProgressHUD/SVProgressAnimatedView.h deleted file mode 120000 index 581cdc20a..000000000 --- a/Pods/Headers/Private/SVProgressHUD/SVProgressAnimatedView.h +++ /dev/null @@ -1 +0,0 @@ -../../../SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.h \ No newline at end of file diff --git a/Pods/Headers/Private/SVProgressHUD/SVProgressHUD.h b/Pods/Headers/Private/SVProgressHUD/SVProgressHUD.h deleted file mode 120000 index 608a8aa95..000000000 --- a/Pods/Headers/Private/SVProgressHUD/SVProgressHUD.h +++ /dev/null @@ -1 +0,0 @@ -../../../SVProgressHUD/SVProgressHUD/SVProgressHUD.h \ No newline at end of file diff --git a/Pods/Headers/Private/SVProgressHUD/SVRadialGradientLayer.h b/Pods/Headers/Private/SVProgressHUD/SVRadialGradientLayer.h deleted file mode 120000 index d78beb58a..000000000 --- a/Pods/Headers/Private/SVProgressHUD/SVRadialGradientLayer.h +++ /dev/null @@ -1 +0,0 @@ -../../../SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h \ No newline at end of file diff --git a/Pods/Headers/Private/TTTAttributedLabel/TTTAttributedLabel.h b/Pods/Headers/Private/TTTAttributedLabel/TTTAttributedLabel.h deleted file mode 120000 index 28a8d21d1..000000000 --- a/Pods/Headers/Private/TTTAttributedLabel/TTTAttributedLabel.h +++ /dev/null @@ -1 +0,0 @@ -../../../TTTAttributedLabel/TTTAttributedLabel/TTTAttributedLabel.h \ No newline at end of file diff --git a/Pods/Headers/Private/UIDevice-Hardware/UIDevice-Hardware.h b/Pods/Headers/Private/UIDevice-Hardware/UIDevice-Hardware.h deleted file mode 120000 index d7842e4ed..000000000 --- a/Pods/Headers/Private/UIDevice-Hardware/UIDevice-Hardware.h +++ /dev/null @@ -1 +0,0 @@ -../../../UIDevice-Hardware/UIDevice-Hardware.h \ No newline at end of file diff --git a/Pods/Headers/Private/libextobjc/EXTRuntimeExtensions.h b/Pods/Headers/Private/libextobjc/EXTRuntimeExtensions.h deleted file mode 120000 index 26f4cafe8..000000000 --- a/Pods/Headers/Private/libextobjc/EXTRuntimeExtensions.h +++ /dev/null @@ -1 +0,0 @@ -../../../libextobjc/extobjc/EXTRuntimeExtensions.h \ No newline at end of file diff --git a/Pods/Headers/Private/libextobjc/EXTScope.h b/Pods/Headers/Private/libextobjc/EXTScope.h deleted file mode 120000 index b2ea0547d..000000000 --- a/Pods/Headers/Private/libextobjc/EXTScope.h +++ /dev/null @@ -1 +0,0 @@ -../../../libextobjc/extobjc/EXTScope.h \ No newline at end of file diff --git a/Pods/Headers/Private/libextobjc/metamacros.h b/Pods/Headers/Private/libextobjc/metamacros.h deleted file mode 120000 index 0f8890153..000000000 --- a/Pods/Headers/Private/libextobjc/metamacros.h +++ /dev/null @@ -1 +0,0 @@ -../../../libextobjc/extobjc/metamacros.h \ No newline at end of file diff --git a/Pods/Headers/Private/nanopb/pb.h b/Pods/Headers/Private/nanopb/pb.h deleted file mode 120000 index 549ba434c..000000000 --- a/Pods/Headers/Private/nanopb/pb.h +++ /dev/null @@ -1 +0,0 @@ -../../../nanopb/pb.h \ No newline at end of file diff --git a/Pods/Headers/Private/nanopb/pb_common.h b/Pods/Headers/Private/nanopb/pb_common.h deleted file mode 120000 index 002c466e4..000000000 --- a/Pods/Headers/Private/nanopb/pb_common.h +++ /dev/null @@ -1 +0,0 @@ -../../../nanopb/pb_common.h \ No newline at end of file diff --git a/Pods/Headers/Private/nanopb/pb_decode.h b/Pods/Headers/Private/nanopb/pb_decode.h deleted file mode 120000 index 62ed2f10c..000000000 --- a/Pods/Headers/Private/nanopb/pb_decode.h +++ /dev/null @@ -1 +0,0 @@ -../../../nanopb/pb_decode.h \ No newline at end of file diff --git a/Pods/Headers/Private/nanopb/pb_encode.h b/Pods/Headers/Private/nanopb/pb_encode.h deleted file mode 120000 index 057760ea0..000000000 --- a/Pods/Headers/Private/nanopb/pb_encode.h +++ /dev/null @@ -1 +0,0 @@ -../../../nanopb/pb_encode.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLink.h b/Pods/Headers/Public/Bolts/BFAppLink.h deleted file mode 120000 index 3f79beeb0..000000000 --- a/Pods/Headers/Public/Bolts/BFAppLink.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLink.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkNavigation.h b/Pods/Headers/Public/Bolts/BFAppLinkNavigation.h deleted file mode 120000 index 6962356ef..000000000 --- a/Pods/Headers/Public/Bolts/BFAppLinkNavigation.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLinkNavigation.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkResolving.h b/Pods/Headers/Public/Bolts/BFAppLinkResolving.h deleted file mode 120000 index 94cc66f8c..000000000 --- a/Pods/Headers/Public/Bolts/BFAppLinkResolving.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLinkResolving.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererController.h b/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererController.h deleted file mode 120000 index 95067f073..000000000 --- a/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererController.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLinkReturnToRefererController.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView.h b/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView.h deleted file mode 120000 index cc0089785..000000000 --- a/Pods/Headers/Public/Bolts/BFAppLinkReturnToRefererView.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLinkReturnToRefererView.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFAppLinkTarget.h b/Pods/Headers/Public/Bolts/BFAppLinkTarget.h deleted file mode 120000 index 90a41f648..000000000 --- a/Pods/Headers/Public/Bolts/BFAppLinkTarget.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFAppLinkTarget.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFCancellationToken.h b/Pods/Headers/Public/Bolts/BFCancellationToken.h deleted file mode 120000 index 0b6948624..000000000 --- a/Pods/Headers/Public/Bolts/BFCancellationToken.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFCancellationToken.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFCancellationTokenRegistration.h b/Pods/Headers/Public/Bolts/BFCancellationTokenRegistration.h deleted file mode 120000 index c587ca7ec..000000000 --- a/Pods/Headers/Public/Bolts/BFCancellationTokenRegistration.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFCancellationTokenRegistration.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFCancellationTokenSource.h b/Pods/Headers/Public/Bolts/BFCancellationTokenSource.h deleted file mode 120000 index d3d598599..000000000 --- a/Pods/Headers/Public/Bolts/BFCancellationTokenSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFCancellationTokenSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFExecutor.h b/Pods/Headers/Public/Bolts/BFExecutor.h deleted file mode 120000 index c071e8c86..000000000 --- a/Pods/Headers/Public/Bolts/BFExecutor.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFExecutor.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFGeneric.h b/Pods/Headers/Public/Bolts/BFGeneric.h deleted file mode 120000 index bd63cccc6..000000000 --- a/Pods/Headers/Public/Bolts/BFGeneric.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFGeneric.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFMeasurementEvent.h b/Pods/Headers/Public/Bolts/BFMeasurementEvent.h deleted file mode 120000 index 2eb6c1171..000000000 --- a/Pods/Headers/Public/Bolts/BFMeasurementEvent.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFMeasurementEvent.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFTask.h b/Pods/Headers/Public/Bolts/BFTask.h deleted file mode 120000 index 5468334d4..000000000 --- a/Pods/Headers/Public/Bolts/BFTask.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFTask.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFTaskCompletionSource.h b/Pods/Headers/Public/Bolts/BFTaskCompletionSource.h deleted file mode 120000 index c74760fae..000000000 --- a/Pods/Headers/Public/Bolts/BFTaskCompletionSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/BFTaskCompletionSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFURL.h b/Pods/Headers/Public/Bolts/BFURL.h deleted file mode 120000 index df21bd94a..000000000 --- a/Pods/Headers/Public/Bolts/BFURL.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFURL.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/BFWebViewAppLinkResolver.h b/Pods/Headers/Public/Bolts/BFWebViewAppLinkResolver.h deleted file mode 120000 index bf250dbd2..000000000 --- a/Pods/Headers/Public/Bolts/BFWebViewAppLinkResolver.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/iOS/BFWebViewAppLinkResolver.h \ No newline at end of file diff --git a/Pods/Headers/Public/Bolts/Bolts.h b/Pods/Headers/Public/Bolts/Bolts.h deleted file mode 120000 index 146ac6ecb..000000000 --- a/Pods/Headers/Public/Bolts/Bolts.h +++ /dev/null @@ -1 +0,0 @@ -../../../Bolts/Bolts/Common/Bolts.h \ No newline at end of file diff --git a/Pods/Headers/Public/Crashlytics/Crashlytics/ANSCompatibility.h b/Pods/Headers/Public/Crashlytics/Crashlytics/ANSCompatibility.h deleted file mode 120000 index 1acf6dff1..000000000 --- a/Pods/Headers/Public/Crashlytics/Crashlytics/ANSCompatibility.h +++ /dev/null @@ -1 +0,0 @@ -../../../../Crashlytics/iOS/Crashlytics.framework/Headers/ANSCompatibility.h \ No newline at end of file diff --git a/Pods/Headers/Public/Crashlytics/Crashlytics/Answers.h b/Pods/Headers/Public/Crashlytics/Crashlytics/Answers.h deleted file mode 120000 index c1a493be9..000000000 --- a/Pods/Headers/Public/Crashlytics/Crashlytics/Answers.h +++ /dev/null @@ -1 +0,0 @@ -../../../../Crashlytics/iOS/Crashlytics.framework/Headers/Answers.h \ No newline at end of file diff --git a/Pods/Headers/Public/Crashlytics/Crashlytics/CLSAttributes.h b/Pods/Headers/Public/Crashlytics/Crashlytics/CLSAttributes.h deleted file mode 120000 index 04f0d32e4..000000000 --- a/Pods/Headers/Public/Crashlytics/Crashlytics/CLSAttributes.h +++ /dev/null @@ -1 +0,0 @@ -../../../../Crashlytics/iOS/Crashlytics.framework/Headers/CLSAttributes.h \ No newline at end of file diff --git a/Pods/Headers/Public/Crashlytics/Crashlytics/CLSLogging.h b/Pods/Headers/Public/Crashlytics/Crashlytics/CLSLogging.h deleted file mode 120000 index 97a37ef51..000000000 --- a/Pods/Headers/Public/Crashlytics/Crashlytics/CLSLogging.h +++ /dev/null @@ -1 +0,0 @@ -../../../../Crashlytics/iOS/Crashlytics.framework/Headers/CLSLogging.h \ No newline at end of file diff --git a/Pods/Headers/Public/Crashlytics/Crashlytics/CLSReport.h b/Pods/Headers/Public/Crashlytics/Crashlytics/CLSReport.h deleted file mode 120000 index 77fdb841c..000000000 --- a/Pods/Headers/Public/Crashlytics/Crashlytics/CLSReport.h +++ /dev/null @@ -1 +0,0 @@ -../../../../Crashlytics/iOS/Crashlytics.framework/Headers/CLSReport.h \ No newline at end of file diff --git a/Pods/Headers/Public/Crashlytics/Crashlytics/CLSStackFrame.h b/Pods/Headers/Public/Crashlytics/Crashlytics/CLSStackFrame.h deleted file mode 120000 index 28f3e18dc..000000000 --- a/Pods/Headers/Public/Crashlytics/Crashlytics/CLSStackFrame.h +++ /dev/null @@ -1 +0,0 @@ -../../../../Crashlytics/iOS/Crashlytics.framework/Headers/CLSStackFrame.h \ No newline at end of file diff --git a/Pods/Headers/Public/Crashlytics/Crashlytics/Crashlytics.h b/Pods/Headers/Public/Crashlytics/Crashlytics/Crashlytics.h deleted file mode 120000 index fae630e49..000000000 --- a/Pods/Headers/Public/Crashlytics/Crashlytics/Crashlytics.h +++ /dev/null @@ -1 +0,0 @@ -../../../../Crashlytics/iOS/Crashlytics.framework/Headers/Crashlytics.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAccessToken.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAccessToken.h deleted file mode 120000 index a5b3f9758..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAccessToken.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppEvents.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppEvents.h deleted file mode 120000 index 95c1d00cf..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppEvents.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkResolver.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkResolver.h deleted file mode 120000 index 69c20f5bb..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkResolver.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkUtility.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkUtility.h deleted file mode 120000 index fef519cd2..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKAppLinkUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKApplicationDelegate.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKApplicationDelegate.h deleted file mode 120000 index e163dc893..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKApplicationDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKButton.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKButton.h deleted file mode 120000 index 806ec62d0..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKConstants.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKConstants.h deleted file mode 120000 index 4c08cc813..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKConstants.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKCopying.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKCopying.h deleted file mode 120000 index aa5dc1f7f..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKCopying.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKCoreKit.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKCoreKit.h deleted file mode 120000 index bfffe4f8a..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKCoreKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h deleted file mode 120000 index 6f019f677..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequest.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequest.h deleted file mode 120000 index 524cb7791..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequest.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestConnection.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestConnection.h deleted file mode 120000 index c6cbbfc3e..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestConnection.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h deleted file mode 120000 index 9960de282..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKMacros.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKMacros.h deleted file mode 120000 index f9059c172..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKMacros.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKMutableCopying.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKMutableCopying.h deleted file mode 120000 index 40cf5f182..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKMutableCopying.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfile.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfile.h deleted file mode 120000 index a9866b1d5..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfile.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfilePictureView.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfilePictureView.h deleted file mode 120000 index 6f38799e4..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKProfilePictureView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKSettings.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKSettings.h deleted file mode 120000 index 7edc38f39..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKSettings.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKTestUsersManager.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKTestUsersManager.h deleted file mode 120000 index 5813f898f..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKTestUsersManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKCoreKit/FBSDKUtility.h b/Pods/Headers/Public/FBSDKCoreKit/FBSDKUtility.h deleted file mode 120000 index efbfaf13b..000000000 --- a/Pods/Headers/Public/FBSDKCoreKit/FBSDKUtility.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginButton.h b/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginButton.h deleted file mode 120000 index a997deef4..000000000 --- a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginConstants.h b/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginConstants.h deleted file mode 120000 index 93a52b76a..000000000 --- a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginConstants.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginConstants.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginKit.h b/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginKit.h deleted file mode 120000 index cf4e004c4..000000000 --- a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginManager.h b/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginManager.h deleted file mode 120000 index a791506bf..000000000 --- a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h b/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h deleted file mode 120000 index b8cf2c7cf..000000000 --- a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginTooltipView.h b/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginTooltipView.h deleted file mode 120000 index 0f25173ee..000000000 --- a/Pods/Headers/Public/FBSDKLoginKit/FBSDKLoginTooltipView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginTooltipView.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKLoginKit/FBSDKTooltipView.h b/Pods/Headers/Public/FBSDKLoginKit/FBSDKTooltipView.h deleted file mode 120000 index c46a3c3c3..000000000 --- a/Pods/Headers/Public/FBSDKLoginKit/FBSDKTooltipView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit/FBSDKTooltipView.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h deleted file mode 120000 index 67d708097..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h deleted file mode 120000 index 0e81d048e..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h deleted file mode 120000 index 32e79a708..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h deleted file mode 120000 index 61c47da81..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h deleted file mode 120000 index 16f9d5278..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h deleted file mode 120000 index b3b50d015..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h deleted file mode 120000 index 98fc52fd0..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h deleted file mode 120000 index 0a8ba2962..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h deleted file mode 120000 index 3f7906b19..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h deleted file mode 120000 index addd63f30..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h deleted file mode 120000 index 1e9ecee69..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h deleted file mode 120000 index 984a2ffc8..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h deleted file mode 120000 index efe324ea4..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h deleted file mode 120000 index c29f9eef9..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h deleted file mode 120000 index 7451999e9..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h deleted file mode 120000 index b827828c0..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h deleted file mode 120000 index 2d4e64644..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h deleted file mode 120000 index c981a564c..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h deleted file mode 120000 index 4394f0f80..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h deleted file mode 120000 index e7e13b59d..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h deleted file mode 120000 index 56b9ff941..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h deleted file mode 120000 index 8e28a2119..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h deleted file mode 120000 index 4c432118e..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h deleted file mode 120000 index 5d14f07bc..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h deleted file mode 120000 index 9a4eb9bcc..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h deleted file mode 120000 index 0db4f0280..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h deleted file mode 120000 index 14959c433..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h deleted file mode 120000 index d5dc27324..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h deleted file mode 120000 index ab62fb658..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h deleted file mode 120000 index 1c00ce2e6..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h deleted file mode 120000 index adadbe5de..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h deleted file mode 120000 index 8e50e056f..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h deleted file mode 120000 index c44ae9271..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h deleted file mode 120000 index f8b11790c..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h deleted file mode 120000 index 30a0dd3da..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h deleted file mode 120000 index b025b9840..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h deleted file mode 120000 index 54fbebaa4..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h deleted file mode 120000 index 5fe5d6361..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h deleted file mode 120000 index 18a9aad66..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h deleted file mode 120000 index e64963771..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h deleted file mode 120000 index 348548547..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h b/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h deleted file mode 120000 index c11b78121..000000000 --- a/Pods/Headers/Public/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FBSDKShareKit/FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h \ No newline at end of file diff --git a/Pods/Headers/Public/FFCircularProgressView/FFCircularProgressView.h b/Pods/Headers/Public/FFCircularProgressView/FFCircularProgressView.h deleted file mode 120000 index 655d2d34c..000000000 --- a/Pods/Headers/Public/FFCircularProgressView/FFCircularProgressView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/FFCircularProgressView.h \ No newline at end of file diff --git a/Pods/Headers/Public/FFCircularProgressView/UIColor+iOS7.h b/Pods/Headers/Public/FFCircularProgressView/UIColor+iOS7.h deleted file mode 120000 index a9beda171..000000000 --- a/Pods/Headers/Public/FFCircularProgressView/UIColor+iOS7.h +++ /dev/null @@ -1 +0,0 @@ -../../../FFCircularProgressView/FFCircularProgressView/FFCircularProgressView/UIColor+iOS7.h \ No newline at end of file diff --git a/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImage.h b/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImage.h deleted file mode 120000 index 6b3118afd..000000000 --- a/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../FLAnimatedImage/FLAnimatedImage/FLAnimatedImage.h \ No newline at end of file diff --git a/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImageView.h b/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImageView.h deleted file mode 120000 index 8d98a7bcd..000000000 --- a/Pods/Headers/Public/FLAnimatedImage/FLAnimatedImageView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FLAnimatedImage/FLAnimatedImage/FLAnimatedImageView.h \ No newline at end of file diff --git a/Pods/Headers/Public/Fabric/Fabric/FABAttributes.h b/Pods/Headers/Public/Fabric/Fabric/FABAttributes.h deleted file mode 120000 index a01e80302..000000000 --- a/Pods/Headers/Public/Fabric/Fabric/FABAttributes.h +++ /dev/null @@ -1 +0,0 @@ -../../../../Fabric/iOS/Fabric.framework/Headers/FABAttributes.h \ No newline at end of file diff --git a/Pods/Headers/Public/Fabric/Fabric/Fabric.h b/Pods/Headers/Public/Fabric/Fabric/Fabric.h deleted file mode 120000 index d4ddd5eb6..000000000 --- a/Pods/Headers/Public/Fabric/Fabric/Fabric.h +++ /dev/null @@ -1 +0,0 @@ -../../../../Fabric/iOS/Fabric.framework/Headers/Fabric.h \ No newline at end of file diff --git a/Pods/Headers/Public/Firebase/Firebase.h b/Pods/Headers/Public/Firebase/Firebase.h deleted file mode 120000 index 6d62033ce..000000000 --- a/Pods/Headers/Public/Firebase/Firebase.h +++ /dev/null @@ -1 +0,0 @@ -../../../Firebase/Core/Sources/Firebase.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics+AppDelegate.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics+AppDelegate.h deleted file mode 120000 index 1d9bd7edd..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics+AppDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics.h deleted file mode 120000 index f8fc4fb19..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalyticsConfiguration.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalyticsConfiguration.h deleted file mode 120000 index 677327195..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalyticsConfiguration.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalyticsSwiftNameSupport.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalyticsSwiftNameSupport.h deleted file mode 120000 index d6071113f..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalyticsSwiftNameSupport.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsSwiftNameSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRApp.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRApp.h deleted file mode 120000 index 97c9b35a9..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRApp.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRApp.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRConfiguration.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRConfiguration.h deleted file mode 120000 index c34ddb858..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRConfiguration.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIREventNames.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIREventNames.h deleted file mode 120000 index 8924cc08c..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIREventNames.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIROptions.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIROptions.h deleted file mode 120000 index a40119b4e..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIROptions.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIROptions.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRParameterNames.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRParameterNames.h deleted file mode 120000 index 6e37a6e0a..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRParameterNames.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRUserPropertyNames.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRUserPropertyNames.h deleted file mode 120000 index 4459d6bc6..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRUserPropertyNames.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FirebaseAnalytics.h b/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FirebaseAnalytics.h deleted file mode 120000 index 2d48a7dbe..000000000 --- a/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FirebaseAnalytics.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRActionCodeSettings.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRActionCodeSettings.h deleted file mode 120000 index 6b3dd6b1a..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRActionCodeSettings.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRActionCodeSettings.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAdditionalUserInfo.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAdditionalUserInfo.h deleted file mode 120000 index b497bf979..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAdditionalUserInfo.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAdditionalUserInfo.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuth.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuth.h deleted file mode 120000 index 35e20c575..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuth.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuth.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthAPNSTokenType.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthAPNSTokenType.h deleted file mode 120000 index 9e6040bad..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthAPNSTokenType.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthAPNSTokenType.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthCredential.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthCredential.h deleted file mode 120000 index ed32f36e7..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthCredential.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthCredential.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthDataResult.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthDataResult.h deleted file mode 120000 index fa62057e5..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthDataResult.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthDataResult.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthErrors.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthErrors.h deleted file mode 120000 index e21f64e5b..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthErrors.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthErrors.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthUIDelegate.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthUIDelegate.h deleted file mode 120000 index d72da9b26..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthUIDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRAuthUIDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIREmailAuthProvider.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIREmailAuthProvider.h deleted file mode 120000 index 3dbda4e2b..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIREmailAuthProvider.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIREmailAuthProvider.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRFacebookAuthProvider.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRFacebookAuthProvider.h deleted file mode 120000 index 8fbecbe92..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRFacebookAuthProvider.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRFacebookAuthProvider.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGitHubAuthProvider.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGitHubAuthProvider.h deleted file mode 120000 index dbb098ab4..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGitHubAuthProvider.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRGitHubAuthProvider.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGoogleAuthProvider.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGoogleAuthProvider.h deleted file mode 120000 index ad7189e89..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGoogleAuthProvider.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRGoogleAuthProvider.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIROAuthProvider.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIROAuthProvider.h deleted file mode 120000 index b4901e0a8..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIROAuthProvider.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIROAuthProvider.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRPhoneAuthCredential.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRPhoneAuthCredential.h deleted file mode 120000 index b46f118cf..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRPhoneAuthCredential.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRPhoneAuthCredential.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRPhoneAuthProvider.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRPhoneAuthProvider.h deleted file mode 120000 index c54b3b5f0..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRPhoneAuthProvider.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRPhoneAuthProvider.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRTwitterAuthProvider.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRTwitterAuthProvider.h deleted file mode 120000 index 30a19f20c..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRTwitterAuthProvider.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRTwitterAuthProvider.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUser.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUser.h deleted file mode 120000 index ecac89218..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUser.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUser.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUserInfo.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUserInfo.h deleted file mode 120000 index ef1617c01..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUserInfo.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUserInfo.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUserMetadata.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUserMetadata.h deleted file mode 120000 index 02b930a36..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUserMetadata.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FIRUserMetadata.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FirebaseAuth.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FirebaseAuth.h deleted file mode 120000 index e3b2676cd..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FirebaseAuth.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FirebaseAuth.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FirebaseAuthVersion.h b/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FirebaseAuthVersion.h deleted file mode 120000 index ee9f380de..000000000 --- a/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FirebaseAuthVersion.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseAuth/Frameworks/FirebaseAuth.framework/Headers/FirebaseAuthVersion.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRAnalyticsConfiguration.h b/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRAnalyticsConfiguration.h deleted file mode 120000 index 31d68c311..000000000 --- a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRAnalyticsConfiguration.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRAnalyticsConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRApp.h b/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRApp.h deleted file mode 120000 index 90c263ac3..000000000 --- a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRApp.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRApp.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRConfiguration.h b/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRConfiguration.h deleted file mode 120000 index 6a732c031..000000000 --- a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRConfiguration.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRConfiguration.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRLoggerLevel.h b/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRLoggerLevel.h deleted file mode 120000 index a21670661..000000000 --- a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIRLoggerLevel.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIRLoggerLevel.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIROptions.h b/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIROptions.h deleted file mode 120000 index 5bd77eb8f..000000000 --- a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FIROptions.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FIROptions.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FirebaseCore.h b/Pods/Headers/Public/FirebaseCore/FirebaseCore/FirebaseCore.h deleted file mode 120000 index 96e9330e9..000000000 --- a/Pods/Headers/Public/FirebaseCore/FirebaseCore/FirebaseCore.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseCore/Frameworks/FirebaseCore.framework/Headers/FirebaseCore.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FIRInstanceID.h b/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FIRInstanceID.h deleted file mode 120000 index 62c92b0c2..000000000 --- a/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FIRInstanceID.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FIRInstanceID.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FirebaseInstanceID.h b/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FirebaseInstanceID.h deleted file mode 120000 index 8925bdb83..000000000 --- a/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FirebaseInstanceID.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuth.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuth.h deleted file mode 120000 index f7cf0e052..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuth.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuth.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthBaseViewController.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthBaseViewController.h deleted file mode 120000 index 691c392bd..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthBaseViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthBaseViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthErrorUtils.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthErrorUtils.h deleted file mode 120000 index 4aa19639e..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthErrorUtils.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthErrorUtils.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthErrors.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthErrors.h deleted file mode 120000 index dcb6579e3..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthErrors.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthErrors.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthPickerViewController.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthPickerViewController.h deleted file mode 120000 index 9956ca02f..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthPickerViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthPickerViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthProvider.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthProvider.h deleted file mode 120000 index 77284d4bc..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIAuthProvider.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIAuthProvider.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIEmailEntryViewController.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIEmailEntryViewController.h deleted file mode 120000 index 25006b9ad..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIEmailEntryViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIEmailEntryViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordRecoveryViewController.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordRecoveryViewController.h deleted file mode 120000 index 719026945..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordRecoveryViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordRecoveryViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordSignInViewController.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordSignInViewController.h deleted file mode 120000 index 197051795..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordSignInViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordSignInViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordSignUpViewController.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordSignUpViewController.h deleted file mode 120000 index 8a30cdc6e..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordSignUpViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordSignUpViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordVerificationViewController.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordVerificationViewController.h deleted file mode 120000 index 5a4c15d06..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FUIPasswordVerificationViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FUIPasswordVerificationViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FirebaseAuthUI.h b/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FirebaseAuthUI.h deleted file mode 120000 index d9af93ab9..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebaseAuthUI/FirebaseAuthUI.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/Headers/FirebaseAuthUI.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebasePhoneAuthUI/FUIPhoneAuth.h b/Pods/Headers/Public/FirebaseUI/FirebasePhoneAuthUI/FUIPhoneAuth.h deleted file mode 120000 index 4ce7636a8..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebasePhoneAuthUI/FUIPhoneAuth.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Headers/FUIPhoneAuth.h \ No newline at end of file diff --git a/Pods/Headers/Public/FirebaseUI/FirebasePhoneAuthUI/FirebasePhoneAuthUI.h b/Pods/Headers/Public/FirebaseUI/FirebasePhoneAuthUI/FirebasePhoneAuthUI.h deleted file mode 120000 index 530d63d57..000000000 --- a/Pods/Headers/Public/FirebaseUI/FirebasePhoneAuthUI/FirebasePhoneAuthUI.h +++ /dev/null @@ -1 +0,0 @@ -../../../../FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/Headers/FirebasePhoneAuthUI.h \ No newline at end of file diff --git a/Pods/Headers/Public/Flurry-iOS-SDK/Flurry.h b/Pods/Headers/Public/Flurry-iOS-SDK/Flurry.h deleted file mode 120000 index 2bd771f46..000000000 --- a/Pods/Headers/Public/Flurry-iOS-SDK/Flurry.h +++ /dev/null @@ -1 +0,0 @@ -../../../Flurry-iOS-SDK/Flurry/Flurry.h \ No newline at end of file diff --git a/Pods/Headers/Public/Flurry-iOS-SDK/FlurrySessionBuilder.h b/Pods/Headers/Public/Flurry-iOS-SDK/FlurrySessionBuilder.h deleted file mode 120000 index a72adef0f..000000000 --- a/Pods/Headers/Public/Flurry-iOS-SDK/FlurrySessionBuilder.h +++ /dev/null @@ -1 +0,0 @@ -../../../Flurry-iOS-SDK/Flurry/FlurrySessionBuilder.h \ No newline at end of file diff --git a/Pods/Headers/Public/GTMSessionFetcher/GTMSessionFetcher.h b/Pods/Headers/Public/GTMSessionFetcher/GTMSessionFetcher.h deleted file mode 120000 index 7ed730f6d..000000000 --- a/Pods/Headers/Public/GTMSessionFetcher/GTMSessionFetcher.h +++ /dev/null @@ -1 +0,0 @@ -../../../GTMSessionFetcher/Source/GTMSessionFetcher.h \ No newline at end of file diff --git a/Pods/Headers/Public/GTMSessionFetcher/GTMSessionFetcherLogging.h b/Pods/Headers/Public/GTMSessionFetcher/GTMSessionFetcherLogging.h deleted file mode 120000 index ada41e3a5..000000000 --- a/Pods/Headers/Public/GTMSessionFetcher/GTMSessionFetcherLogging.h +++ /dev/null @@ -1 +0,0 @@ -../../../GTMSessionFetcher/Source/GTMSessionFetcherLogging.h \ No newline at end of file diff --git a/Pods/Headers/Public/GTMSessionFetcher/GTMSessionFetcherService.h b/Pods/Headers/Public/GTMSessionFetcher/GTMSessionFetcherService.h deleted file mode 120000 index 1ef9cbb7e..000000000 --- a/Pods/Headers/Public/GTMSessionFetcher/GTMSessionFetcherService.h +++ /dev/null @@ -1 +0,0 @@ -../../../GTMSessionFetcher/Source/GTMSessionFetcherService.h \ No newline at end of file diff --git a/Pods/Headers/Public/GTMSessionFetcher/GTMSessionUploadFetcher.h b/Pods/Headers/Public/GTMSessionFetcher/GTMSessionUploadFetcher.h deleted file mode 120000 index cef7a0d4b..000000000 --- a/Pods/Headers/Public/GTMSessionFetcher/GTMSessionUploadFetcher.h +++ /dev/null @@ -1 +0,0 @@ -../../../GTMSessionFetcher/Source/GTMSessionUploadFetcher.h \ No newline at end of file diff --git a/Pods/Headers/Public/GoogleToolboxForMac/GTMDebugSelectorValidation.h b/Pods/Headers/Public/GoogleToolboxForMac/GTMDebugSelectorValidation.h deleted file mode 120000 index 521da72d3..000000000 --- a/Pods/Headers/Public/GoogleToolboxForMac/GTMDebugSelectorValidation.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/DebugUtils/GTMDebugSelectorValidation.h \ No newline at end of file diff --git a/Pods/Headers/Public/GoogleToolboxForMac/GTMDebugThreadValidation.h b/Pods/Headers/Public/GoogleToolboxForMac/GTMDebugThreadValidation.h deleted file mode 120000 index de29ea171..000000000 --- a/Pods/Headers/Public/GoogleToolboxForMac/GTMDebugThreadValidation.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/DebugUtils/GTMDebugThreadValidation.h \ No newline at end of file diff --git a/Pods/Headers/Public/GoogleToolboxForMac/GTMDefines.h b/Pods/Headers/Public/GoogleToolboxForMac/GTMDefines.h deleted file mode 120000 index 550311089..000000000 --- a/Pods/Headers/Public/GoogleToolboxForMac/GTMDefines.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/GTMDefines.h \ No newline at end of file diff --git a/Pods/Headers/Public/GoogleToolboxForMac/GTMMethodCheck.h b/Pods/Headers/Public/GoogleToolboxForMac/GTMMethodCheck.h deleted file mode 120000 index 56dfa7e77..000000000 --- a/Pods/Headers/Public/GoogleToolboxForMac/GTMMethodCheck.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/DebugUtils/GTMMethodCheck.h \ No newline at end of file diff --git a/Pods/Headers/Public/GoogleToolboxForMac/GTMNSData+zlib.h b/Pods/Headers/Public/GoogleToolboxForMac/GTMNSData+zlib.h deleted file mode 120000 index 9e7241936..000000000 --- a/Pods/Headers/Public/GoogleToolboxForMac/GTMNSData+zlib.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/Foundation/GTMNSData+zlib.h \ No newline at end of file diff --git a/Pods/Headers/Public/GoogleToolboxForMac/GTMNSDictionary+URLArguments.h b/Pods/Headers/Public/GoogleToolboxForMac/GTMNSDictionary+URLArguments.h deleted file mode 120000 index b2ff829eb..000000000 --- a/Pods/Headers/Public/GoogleToolboxForMac/GTMNSDictionary+URLArguments.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/Foundation/GTMNSDictionary+URLArguments.h \ No newline at end of file diff --git a/Pods/Headers/Public/GoogleToolboxForMac/GTMNSString+URLArguments.h b/Pods/Headers/Public/GoogleToolboxForMac/GTMNSString+URLArguments.h deleted file mode 120000 index 3b9b1a279..000000000 --- a/Pods/Headers/Public/GoogleToolboxForMac/GTMNSString+URLArguments.h +++ /dev/null @@ -1 +0,0 @@ -../../../GoogleToolboxForMac/Foundation/GTMNSString+URLArguments.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NSBundle+NYTPhotoViewer.h b/Pods/Headers/Public/NYTPhotoViewer/NSBundle+NYTPhotoViewer.h deleted file mode 120000 index c56c44b5f..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NSBundle+NYTPhotoViewer.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/Resource Loading/NSBundle+NYTPhotoViewer.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhoto.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhoto.h deleted file mode 120000 index 3158bff16..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhoto.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhoto.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoCaptionView.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoCaptionView.h deleted file mode 120000 index b89575520..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoCaptionView.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoCaptionView.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h deleted file mode 120000 index abf057625..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoCaptionViewLayoutWidthHinting.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoContainer.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoContainer.h deleted file mode 120000 index 06bab2cf7..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoContainer.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoContainer.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h deleted file mode 120000 index 66db73e7c..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoTransitionAnimator.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoTransitionAnimator.h deleted file mode 120000 index eed59d6e7..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoTransitionAnimator.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionAnimator.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoTransitionController.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoTransitionController.h deleted file mode 120000 index 0c2316b75..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoTransitionController.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionController.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewController.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewController.h deleted file mode 120000 index d7215a9f6..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewer.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewer.h deleted file mode 120000 index d92079387..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewer.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h deleted file mode 120000 index b1242da23..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerCore.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerCore.h deleted file mode 120000 index 717c95bbb..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerCore.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerCore.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerDataSource.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerDataSource.h deleted file mode 120000 index 7457e025a..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoViewerDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h deleted file mode 120000 index 6f46fe236..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotosOverlayView.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotosOverlayView.h deleted file mode 120000 index e5b86d1d4..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotosOverlayView.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotosOverlayView.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotosViewController.h b/Pods/Headers/Public/NYTPhotoViewer/NYTPhotosViewController.h deleted file mode 120000 index 61a00b1ef..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTPhotosViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTPhotosViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/NYTPhotoViewer/NYTScalingImageView.h b/Pods/Headers/Public/NYTPhotoViewer/NYTScalingImageView.h deleted file mode 120000 index fd85a759e..000000000 --- a/Pods/Headers/Public/NYTPhotoViewer/NYTScalingImageView.h +++ /dev/null @@ -1 +0,0 @@ -../../../NYTPhotoViewer/NYTPhotoViewer/NYTScalingImageView.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/NSDate+ChatDataSource.h b/Pods/Headers/Public/QMCVDevelopment/NSDate+ChatDataSource.h deleted file mode 120000 index 65d54b8cb..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/NSDate+ChatDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/NSString+QM.h b/Pods/Headers/Public/QMCVDevelopment/NSString+QM.h deleted file mode 120000 index 778cc6703..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/NSString+QM.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Categories/NSString+QM.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QBChatMessage+QBDateDivider.h b/Pods/Headers/Public/QMCVDevelopment/QBChatMessage+QBDateDivider.h deleted file mode 120000 index 6a9e7614a..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QBChatMessage+QBDateDivider.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMAudioIncomingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMAudioIncomingCell.h deleted file mode 120000 index d8d8025e6..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMAudioIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioIncomingCell/QMAudioIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMAudioOutgoingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMAudioOutgoingCell.h deleted file mode 120000 index a78a261c3..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMAudioOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioOutgoingCell/QMAudioOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMAudioRecordButton.h b/Pods/Headers/Public/QMCVDevelopment/QMAudioRecordButton.h deleted file mode 120000 index 16883db90..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMAudioRecordButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordButton/QMAudioRecordButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMAudioRecordView.h b/Pods/Headers/Public/QMCVDevelopment/QMAudioRecordView.h deleted file mode 120000 index 8f002b424..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMAudioRecordView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordView/QMAudioRecordView.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMBaseChatLocationCell.h b/Pods/Headers/Public/QMCVDevelopment/QMBaseChatLocationCell.h deleted file mode 120000 index 54a06ebbf..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMBaseChatLocationCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationCell/QMBaseChatLocationCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMBaseMediaCell.h b/Pods/Headers/Public/QMCVDevelopment/QMBaseMediaCell.h deleted file mode 120000 index cbcb9b75a..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMBaseMediaCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMBaseChatMediaAttachmentCell/QMBaseMediaCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatActionsHandler.h b/Pods/Headers/Public/QMCVDevelopment/QMChatActionsHandler.h deleted file mode 120000 index a3f7cc678..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatActionsHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/QMChatActionsHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatAttachmentCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatAttachmentCell.h deleted file mode 120000 index d0faf19ca..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatAttachmentCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentCell/QMChatAttachmentCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatAttachmentIncomingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatAttachmentIncomingCell.h deleted file mode 120000 index 40ee1b73b..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatAttachmentIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatAttachmentOutgoingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatAttachmentOutgoingCell.h deleted file mode 120000 index d3840c1e7..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatAttachmentOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatBaseLinkPreviewCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatBaseLinkPreviewCell.h deleted file mode 120000 index 9b0632aca..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatBaseLinkPreviewCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatBaseLinkPreviewCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatCell.h deleted file mode 120000 index f500c978b..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatCellLayoutAttributes.h b/Pods/Headers/Public/QMCVDevelopment/QMChatCellLayoutAttributes.h deleted file mode 120000 index 60215a6c8..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatCellLayoutAttributes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMChatCellLayoutAttributes.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionView.h b/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionView.h deleted file mode 120000 index 0b9ff3c82..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CollectionView/QMChatCollectionView.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionViewDataSource.h b/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionViewDataSource.h deleted file mode 120000 index a8f36ea49..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionViewDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Protocols/QMChatCollectionViewDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionViewDelegateFlowLayout.h b/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionViewDelegateFlowLayout.h deleted file mode 120000 index 7f9fa570f..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionViewDelegateFlowLayout.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Protocols/QMChatCollectionViewDelegateFlowLayout.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionViewFlowLayout.h b/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionViewFlowLayout.h deleted file mode 120000 index 8092bb6e7..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatCollectionViewFlowLayout.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMChatCollectionViewFlowLayout.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatContactRequestCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatContactRequestCell.h deleted file mode 120000 index 2eea5f7e7..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatContactRequestCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatContainerView.h b/Pods/Headers/Public/QMCVDevelopment/QMChatContainerView.h deleted file mode 120000 index 9fffeb1df..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatContainerView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/QMChatContainerView.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatDataSource.h b/Pods/Headers/Public/QMCVDevelopment/QMChatDataSource.h deleted file mode 120000 index 8ac574504..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatDataSource/QMChatDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatIncomingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatIncomingCell.h deleted file mode 120000 index 91d37b177..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatIncomingCell/QMChatIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatIncomingLinkPreviewCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatIncomingLinkPreviewCell.h deleted file mode 120000 index c7a965bb7..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatIncomingLinkPreviewCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatIncomingLinkPreviewCell/QMChatIncomingLinkPreviewCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatLocationCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatLocationCell.h deleted file mode 120000 index 4224cdf37..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatLocationCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationCell/QMChatLocationCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatLocationIncomingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatLocationIncomingCell.h deleted file mode 120000 index 4ae92cb66..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatLocationIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationIncomingCell/QMChatLocationIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatLocationOutgoingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatLocationOutgoingCell.h deleted file mode 120000 index 5a1d7a04d..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatLocationOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationOutgoingCell/QMChatLocationOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatLocationSnapshotter.h b/Pods/Headers/Public/QMCVDevelopment/QMChatLocationSnapshotter.h deleted file mode 120000 index 836ad60f3..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatLocationSnapshotter.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatNotificationCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatNotificationCell.h deleted file mode 120000 index 41d045b5d..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatNotificationCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatNotificationCell/QMChatNotificationCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatOutgoingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatOutgoingCell.h deleted file mode 120000 index 8b8bd75c3..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatOutgoingCell/QMChatOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatOutgoingLinkPreviewCell.h b/Pods/Headers/Public/QMCVDevelopment/QMChatOutgoingLinkPreviewCell.h deleted file mode 120000 index 5f70b03ee..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatOutgoingLinkPreviewCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatOutgoingLinkPreviewCell/QMChatOutgoingLinkPreviewCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatResources.h b/Pods/Headers/Public/QMCVDevelopment/QMChatResources.h deleted file mode 120000 index cc2c61c88..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatResources.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Utils/QMChatResources/QMChatResources.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMChatViewController.h b/Pods/Headers/Public/QMCVDevelopment/QMChatViewController.h deleted file mode 120000 index 1b46b664f..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMChatViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMCollectionViewFlowLayoutInvalidationContext.h b/Pods/Headers/Public/QMCVDevelopment/QMCollectionViewFlowLayoutInvalidationContext.h deleted file mode 120000 index fb52352a7..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMCollectionViewFlowLayoutInvalidationContext.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMCollectionViewFlowLayoutInvalidationContext.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMDateUtils.h b/Pods/Headers/Public/QMCVDevelopment/QMDateUtils.h deleted file mode 120000 index 7a7be0a03..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMDateUtils.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Utils/QMDateUtils/QMDateUtils.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMHeaderCollectionReusableView.h b/Pods/Headers/Public/QMCVDevelopment/QMHeaderCollectionReusableView.h deleted file mode 120000 index 46da071d8..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMHeaderCollectionReusableView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/QMHeaderCollectionReusableView/QMHeaderCollectionReusableView.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMImageIncomingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMImageIncomingCell.h deleted file mode 120000 index 3af02bd4a..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMImageIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMImageLoader.h b/Pods/Headers/Public/QMCVDevelopment/QMImageLoader.h deleted file mode 120000 index 4cb569b86..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMImageLoader.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Utils/QMImageLoader/QMImageLoader.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMImageOutgoingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMImageOutgoingCell.h deleted file mode 120000 index 1fb04ee4d..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMImageOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMImageView.h b/Pods/Headers/Public/QMCVDevelopment/QMImageView.h deleted file mode 120000 index 8ad391c61..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMImageView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/QMImageView/QMImageView.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMInputToolbar.h b/Pods/Headers/Public/QMCVDevelopment/QMInputToolbar.h deleted file mode 120000 index 12afdc6c1..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMInputToolbar.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMInputToolbar.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMKVOView.h b/Pods/Headers/Public/QMCVDevelopment/QMKVOView.h deleted file mode 120000 index ec43ab8b2..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMKVOView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/QMKVOView.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMLinkPreviewDelegate.h b/Pods/Headers/Public/QMCVDevelopment/QMLinkPreviewDelegate.h deleted file mode 120000 index bd35c5627..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMLinkPreviewDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMLinkPreviewDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMMediaIncomingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMMediaIncomingCell.h deleted file mode 120000 index fef7a2163..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMMediaIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaIncomingCell/QMMediaIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMMediaOutgoingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMMediaOutgoingCell.h deleted file mode 120000 index d95b3c10c..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMMediaOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaOutgoingCell/QMMediaOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMMediaViewDelegate.h b/Pods/Headers/Public/QMCVDevelopment/QMMediaViewDelegate.h deleted file mode 120000 index b7b79ffda..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMMediaViewDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaViewDelegate/QMMediaViewDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMPlaceHolderTextView.h b/Pods/Headers/Public/QMCVDevelopment/QMPlaceHolderTextView.h deleted file mode 120000 index 4c96b9d27..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMPlaceHolderTextView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/PlaceHolderTextView/QMPlaceHolderTextView.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMProgressView.h b/Pods/Headers/Public/QMCVDevelopment/QMProgressView.h deleted file mode 120000 index c881689b1..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMProgressView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/QMProgressView/QMProgressView.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMToolbarContainer.h b/Pods/Headers/Public/QMCVDevelopment/QMToolbarContainer.h deleted file mode 120000 index 5a635d0c1..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMToolbarContainer.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContainer.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMToolbarContentView.h b/Pods/Headers/Public/QMCVDevelopment/QMToolbarContentView.h deleted file mode 120000 index 0d6ed5c02..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMToolbarContentView.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContentView.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMVideoIncomingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMVideoIncomingCell.h deleted file mode 120000 index 908986b56..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMVideoIncomingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoIncomingCell/QMVideoIncomingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/QMVideoOutgoingCell.h b/Pods/Headers/Public/QMCVDevelopment/QMVideoOutgoingCell.h deleted file mode 120000 index 804f7044e..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/QMVideoOutgoingCell.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoOutgoingCell/QMVideoOutgoingCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/UIColor+QM.h b/Pods/Headers/Public/QMCVDevelopment/UIColor+QM.h deleted file mode 120000 index 48692670d..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/UIColor+QM.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Categories/UIColor+QM.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/UIImage+Cropper.h b/Pods/Headers/Public/QMCVDevelopment/UIImage+Cropper.h deleted file mode 120000 index 1e2a7ea04..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/UIImage+Cropper.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Categories/UIImage+Cropper.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/UIImage+QM.h b/Pods/Headers/Public/QMCVDevelopment/UIImage+QM.h deleted file mode 120000 index 176b0ecf8..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/UIImage+QM.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Categories/UIImage+QM.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/UIImageView+QMLocationSnapshot.h b/Pods/Headers/Public/QMCVDevelopment/UIImageView+QMLocationSnapshot.h deleted file mode 120000 index 11153cc18..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/UIImageView+QMLocationSnapshot.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMCVDevelopment/UIView+QM.h b/Pods/Headers/Public/QMCVDevelopment/UIView+QM.h deleted file mode 120000 index 76fddc0f2..000000000 --- a/Pods/Headers/Public/QMCVDevelopment/UIView+QM.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMCVDevelopment/QMChatViewController/Categories/UIView+QM.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/CDAttachment.h b/Pods/Headers/Public/QMServicesDevelopment/CDAttachment.h deleted file mode 120000 index 62d26ae5c..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/CDAttachment.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDAttachment.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/CDContactListItem.h b/Pods/Headers/Public/QMServicesDevelopment/CDContactListItem.h deleted file mode 120000 index 1a0482c35..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/CDContactListItem.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListCache/QMContactListCache/CoreData/Entries/CDContactListItem.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/CDDialog.h b/Pods/Headers/Public/QMServicesDevelopment/CDDialog.h deleted file mode 120000 index 6392ec9ac..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/CDDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/CDMessage.h b/Pods/Headers/Public/QMServicesDevelopment/CDMessage.h deleted file mode 120000 index c4fca59b1..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/CDMessage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDMessage.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/CDOpenGraphModel.h b/Pods/Headers/Public/QMServicesDevelopment/CDOpenGraphModel.h deleted file mode 120000 index 669e1bb63..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/CDOpenGraphModel.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/CoreData/Entries/CDOpenGraphModel.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/CDUser.h b/Pods/Headers/Public/QMServicesDevelopment/CDUser.h deleted file mode 120000 index 204b9f95a..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/CDUser.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersCache/QMUsersCache/CoreData/Entries/CDUser.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSArray+QMCDRecord.h b/Pods/Headers/Public/QMServicesDevelopment/NSArray+QMCDRecord.h deleted file mode 120000 index eb5037b20..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSArray+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSArray+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSDictionary+QMCDRecordAdditions.h b/Pods/Headers/Public/QMServicesDevelopment/NSDictionary+QMCDRecordAdditions.h deleted file mode 120000 index 12db14d4d..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSDictionary+QMCDRecordAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSDictionary+QMCDRecordAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSError+QMCDRecordErrorHandling.h b/Pods/Headers/Public/QMServicesDevelopment/NSError+QMCDRecordErrorHandling.h deleted file mode 120000 index f715d0f48..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSError+QMCDRecordErrorHandling.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSError+QMCDRecordErrorHandling.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDAggregation.h b/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDAggregation.h deleted file mode 120000 index 24567ab76..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDAggregation.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDAggregation.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDFinders.h b/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDFinders.h deleted file mode 120000 index a739bf51a..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDFinders.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDFinders.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDRecord.h b/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDRecord.h deleted file mode 120000 index 48ff149e9..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDRequests.h b/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDRequests.h deleted file mode 120000 index 007e0b6cb..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObject+QMCDRequests.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRequests.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectContext+QMCDObserving.h b/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectContext+QMCDObserving.h deleted file mode 120000 index e79100af8..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectContext+QMCDObserving.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDObserving.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectContext+QMCDRecord.h b/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectContext+QMCDRecord.h deleted file mode 120000 index 6d4765d6e..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectContext+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectContext+QMCDSaves.h b/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectContext+QMCDSaves.h deleted file mode 120000 index a3303712e..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectContext+QMCDSaves.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDSaves.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectModel+QMCDRecord.h b/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectModel+QMCDRecord.h deleted file mode 120000 index 2d521c240..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSManagedObjectModel+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectModel+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSPersistentStore+QMCDRecord.h b/Pods/Headers/Public/QMServicesDevelopment/NSPersistentStore+QMCDRecord.h deleted file mode 120000 index dbf05fa1b..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSPersistentStore+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSPersistentStore+QMCDRecordPrivate.h b/Pods/Headers/Public/QMServicesDevelopment/NSPersistentStore+QMCDRecordPrivate.h deleted file mode 120000 index 61ba2b98b..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSPersistentStore+QMCDRecordPrivate.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecordPrivate.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/NSPersistentStoreCoordinator+QMCDRecord.h b/Pods/Headers/Public/QMServicesDevelopment/NSPersistentStoreCoordinator+QMCDRecord.h deleted file mode 120000 index e043a2631..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/NSPersistentStoreCoordinator+QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStoreCoordinator/NSPersistentStoreCoordinator+QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QBChatAttachment+QMCustomData.h b/Pods/Headers/Public/QMServicesDevelopment/QBChatAttachment+QMCustomData.h deleted file mode 120000 index 70ccb85e0..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QBChatAttachment+QMCustomData.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomData.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QBChatAttachment+QMCustomParameters.h b/Pods/Headers/Public/QMServicesDevelopment/QBChatAttachment+QMCustomParameters.h deleted file mode 120000 index 1bbc14f43..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QBChatAttachment+QMCustomParameters.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomParameters.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QBChatAttachment+QMFactory.h b/Pods/Headers/Public/QMServicesDevelopment/QBChatAttachment+QMFactory.h deleted file mode 120000 index 0a732a70a..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QBChatAttachment+QMFactory.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMFactory.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QBChatMessage+QMCustomParameters.h b/Pods/Headers/Public/QMServicesDevelopment/QBChatMessage+QMCustomParameters.h deleted file mode 120000 index a87221b16..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QBChatMessage+QMCustomParameters.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatMessage+QMCustomParameters.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QBUUser+CustomData.h b/Pods/Headers/Public/QMServicesDevelopment/QBUUser+CustomData.h deleted file mode 120000 index f2094bd47..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QBUUser+CustomData.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersService/QMUsersService/Categories/QBUUser+CustomData.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMAssetLoader.h b/Pods/Headers/Public/QMServicesDevelopment/QMAssetLoader.h deleted file mode 120000 index 03c07a12c..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMAssetLoader.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAssetLoader.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMAsynchronousOperation.h b/Pods/Headers/Public/QMServicesDevelopment/QMAsynchronousOperation.h deleted file mode 120000 index 01513bdd4..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMAsynchronousOperation.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMBaseService/QMBaseService/QMAsynchronousOperation/QMAsynchronousOperation.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentAssetService.h b/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentAssetService.h deleted file mode 120000 index 61f83bc18..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentAssetService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAttachmentAssetService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentContentService.h b/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentContentService.h deleted file mode 120000 index 66dc4f85d..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentContentService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMAttachmentContentService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentStoreService.h b/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentStoreService.h deleted file mode 120000 index 97b09e1d5..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentStoreService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentStoreServiceDelegate.h b/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentStoreServiceDelegate.h deleted file mode 120000 index a507103f1..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentStoreServiceDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreServiceDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentsMemoryStorage.h b/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentsMemoryStorage.h deleted file mode 120000 index 78b269f16..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMAttachmentsMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentsMemoryStorage/QMAttachmentsMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMAuthService.h b/Pods/Headers/Public/QMServicesDevelopment/QMAuthService.h deleted file mode 120000 index ce0a20156..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMAuthService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMAuthService/QMAuthService/QMAuthService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMBaseService.h b/Pods/Headers/Public/QMServicesDevelopment/QMBaseService.h deleted file mode 120000 index 38622ed78..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMBaseService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMBaseService/QMBaseService/QMBaseService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMCDMigrationManager.h b/Pods/Headers/Public/QMServicesDevelopment/QMCDMigrationManager.h deleted file mode 120000 index c394420d8..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMCDMigrationManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDMigrationManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecord+Options.h b/Pods/Headers/Public/QMServicesDevelopment/QMCDRecord+Options.h deleted file mode 120000 index aa981357e..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecord+Options.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+Options.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecord+VersionInformation.h b/Pods/Headers/Public/QMServicesDevelopment/QMCDRecord+VersionInformation.h deleted file mode 120000 index d4671c26d..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecord+VersionInformation.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+VersionInformation.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecord.h b/Pods/Headers/Public/QMServicesDevelopment/QMCDRecord.h deleted file mode 120000 index 1680e183e..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecord.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecordInternal.h b/Pods/Headers/Public/QMServicesDevelopment/QMCDRecordInternal.h deleted file mode 120000 index d8d3bff0a..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecordInternal.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordInternal.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecordLogging.h b/Pods/Headers/Public/QMServicesDevelopment/QMCDRecordLogging.h deleted file mode 120000 index 9e1bb79de..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecordLogging.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordLogging.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecordStack.h b/Pods/Headers/Public/QMServicesDevelopment/QMCDRecordStack.h deleted file mode 120000 index f4a3505a6..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMCDRecordStack.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecordStack/QMCDRecordStack.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMCancellableService.h b/Pods/Headers/Public/QMServicesDevelopment/QMCancellableService.h deleted file mode 120000 index 7fbb669f6..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMCancellableService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMBaseService/QMBaseService/QMCancellableService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMChatAttachmentService.h b/Pods/Headers/Public/QMServicesDevelopment/QMChatAttachmentService.h deleted file mode 120000 index 267a45927..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMChatAttachmentService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMChatAttachmentService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMChatCache.h b/Pods/Headers/Public/QMServicesDevelopment/QMChatCache.h deleted file mode 120000 index 1a66b1ab9..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMChatCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/QMChatCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMChatConstants.h b/Pods/Headers/Public/QMServicesDevelopment/QMChatConstants.h deleted file mode 120000 index 4ededdba0..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMChatConstants.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMChatConstants.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMChatService.h b/Pods/Headers/Public/QMServicesDevelopment/QMChatService.h deleted file mode 120000 index 9a181efce..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMChatService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMChatService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMChatServiceModelIncludes.h b/Pods/Headers/Public/QMServicesDevelopment/QMChatServiceModelIncludes.h deleted file mode 120000 index 724a01327..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMChatServiceModelIncludes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/QMChatServiceModelIncludes.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMChatTypes.h b/Pods/Headers/Public/QMServicesDevelopment/QMChatTypes.h deleted file mode 120000 index 71125a7a0..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMChatTypes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMChatTypes.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMContactListCache.h b/Pods/Headers/Public/QMServicesDevelopment/QMContactListCache.h deleted file mode 120000 index 3fae19336..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMContactListCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListCache/QMContactListCache/QMContactListCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMContactListMemoryStorage.h b/Pods/Headers/Public/QMServicesDevelopment/QMContactListMemoryStorage.h deleted file mode 120000 index b12ea33c2..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMContactListMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListMemoryStorage/QMContactListMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMContactListModelIncludes.h b/Pods/Headers/Public/QMServicesDevelopment/QMContactListModelIncludes.h deleted file mode 120000 index fddf95094..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMContactListModelIncludes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListCache/QMContactListCache/CoreData/QMContactListModelIncludes.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMContactListService.h b/Pods/Headers/Public/QMServicesDevelopment/QMContactListService.h deleted file mode 120000 index b859b8f65..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMContactListService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMDBStorage.h b/Pods/Headers/Public/QMServicesDevelopment/QMDBStorage.h deleted file mode 120000 index ea9165afb..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMDBStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMDBStorage/QMDBStorage/QMDBStorage.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMDeferredQueueManager.h b/Pods/Headers/Public/QMServicesDevelopment/QMDeferredQueueManager.h deleted file mode 120000 index 6c6f033fb..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMDeferredQueueManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMManagers/QMDeferredQueueManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMDeferredQueueMemoryStorage.h b/Pods/Headers/Public/QMServicesDevelopment/QMDeferredQueueMemoryStorage.h deleted file mode 120000 index 2136763a6..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMDeferredQueueMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMManagers/QMDeferredQueueMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMDialogsMemoryStorage.h b/Pods/Headers/Public/QMServicesDevelopment/QMDialogsMemoryStorage.h deleted file mode 120000 index 9ab52454e..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMDialogsMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMDialogsMemoryStorage/QMDialogsMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMMediaBlocks.h b/Pods/Headers/Public/QMServicesDevelopment/QMMediaBlocks.h deleted file mode 120000 index 9147a84a3..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMMediaBlocks.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMMediaBlocks.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMMediaDownloadService.h b/Pods/Headers/Public/QMServicesDevelopment/QMMediaDownloadService.h deleted file mode 120000 index 66a09c0d1..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMMediaDownloadService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMMediaDownloadServiceDelegate.h b/Pods/Headers/Public/QMServicesDevelopment/QMMediaDownloadServiceDelegate.h deleted file mode 120000 index 779c2c4e6..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMMediaDownloadServiceDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadServiceDelegates/QMMediaDownloadServiceDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMMediaUploadService.h b/Pods/Headers/Public/QMServicesDevelopment/QMMediaUploadService.h deleted file mode 120000 index 9a081fe7d..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMMediaUploadService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaUploadService/QMMediaUploadService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMMemoryStorageProtocol.h b/Pods/Headers/Public/QMServicesDevelopment/QMMemoryStorageProtocol.h deleted file mode 120000 index 27d053553..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMMemoryStorageProtocol.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMBaseService/QMBaseService/QMMemoryStorageProtocol.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMMessagesMemoryStorage.h b/Pods/Headers/Public/QMServicesDevelopment/QMMessagesMemoryStorage.h deleted file mode 120000 index 01c9cf335..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMMessagesMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMMessagesMemoryStorage/QMMessagesMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphCache.h b/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphCache.h deleted file mode 120000 index 693e9deb1..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/QMOpenGraphCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphItem.h b/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphItem.h deleted file mode 120000 index e3b5bd079..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphItem.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphItem.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphMemoryStorage.h b/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphMemoryStorage.h deleted file mode 120000 index ca3ef82d3..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphModelIncludes.h b/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphModelIncludes.h deleted file mode 120000 index 70e752e85..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphModelIncludes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/CoreData/QMOpenGraphModelIncludes.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphService.h b/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphService.h deleted file mode 120000 index 2b139a237..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMOpenGraphService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMSLog.h b/Pods/Headers/Public/QMServicesDevelopment/QMSLog.h deleted file mode 120000 index 38c866da5..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMSLog.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMServices/QMSLog.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMServiceManagerProtocol.h b/Pods/Headers/Public/QMServicesDevelopment/QMServiceManagerProtocol.h deleted file mode 120000 index e1683b7dc..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMServiceManagerProtocol.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMBaseService/QMBaseService/QMServiceManagerProtocol.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMServices.h b/Pods/Headers/Public/QMServicesDevelopment/QMServices.h deleted file mode 120000 index 653bfa6dd..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMServices.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMServices/QMServices.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMServicesManager.h b/Pods/Headers/Public/QMServicesDevelopment/QMServicesManager.h deleted file mode 120000 index 217165ee0..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMServicesManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMManagers/QMServicesManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMTimeOut.h b/Pods/Headers/Public/QMServicesDevelopment/QMTimeOut.h deleted file mode 120000 index 85a0115a8..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMTimeOut.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMTimeOut/QMTimeOut.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMUsersCache.h b/Pods/Headers/Public/QMServicesDevelopment/QMUsersCache.h deleted file mode 120000 index 385cf13f6..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMUsersCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersCache/QMUsersCache/QMUsersCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMUsersMemoryStorage.h b/Pods/Headers/Public/QMServicesDevelopment/QMUsersMemoryStorage.h deleted file mode 120000 index b1546b475..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMUsersMemoryStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersService/QMUsersService/QMUsersMemoryStorage/QMUsersMemoryStorage.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMUsersModelIncludes.h b/Pods/Headers/Public/QMServicesDevelopment/QMUsersModelIncludes.h deleted file mode 120000 index 6b3b6a250..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMUsersModelIncludes.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersCache/QMUsersCache/CoreData/QMUsersModelIncludes.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/QMUsersService.h b/Pods/Headers/Public/QMServicesDevelopment/QMUsersService.h deleted file mode 120000 index 42933d438..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/QMUsersService.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersService/QMUsersService/QMUsersService.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/_CDAttachment.h b/Pods/Headers/Public/QMServicesDevelopment/_CDAttachment.h deleted file mode 120000 index 687e041e6..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/_CDAttachment.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDAttachment.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/_CDContactListItem.h b/Pods/Headers/Public/QMServicesDevelopment/_CDContactListItem.h deleted file mode 120000 index cb19b527d..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/_CDContactListItem.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMContactListCache/QMContactListCache/CoreData/EntriesMachine/_CDContactListItem.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/_CDDialog.h b/Pods/Headers/Public/QMServicesDevelopment/_CDDialog.h deleted file mode 120000 index bb10819c1..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/_CDDialog.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDDialog.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/_CDMessage.h b/Pods/Headers/Public/QMServicesDevelopment/_CDMessage.h deleted file mode 120000 index 44baba2b3..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/_CDMessage.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDMessage.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/_CDOpenGraphModel.h b/Pods/Headers/Public/QMServicesDevelopment/_CDOpenGraphModel.h deleted file mode 120000 index bb2083142..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/_CDOpenGraphModel.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/CoreData/EntriesMachine/_CDOpenGraphModel.h \ No newline at end of file diff --git a/Pods/Headers/Public/QMServicesDevelopment/_CDUser.h b/Pods/Headers/Public/QMServicesDevelopment/_CDUser.h deleted file mode 120000 index ff7545253..000000000 --- a/Pods/Headers/Public/QMServicesDevelopment/_CDUser.h +++ /dev/null @@ -1 +0,0 @@ -../../../QMServicesDevelopment/QMUsersCache/QMUsersCache/CoreData/EntriesMachine/_CDUser.h \ No newline at end of file diff --git a/Pods/Headers/Public/Reachability/Reachability.h b/Pods/Headers/Public/Reachability/Reachability.h deleted file mode 120000 index a30e80c62..000000000 --- a/Pods/Headers/Public/Reachability/Reachability.h +++ /dev/null @@ -1 +0,0 @@ -../../../Reachability/Reachability.h \ No newline at end of file diff --git a/Pods/Headers/Public/SAMKeychain/SAMKeychain.h b/Pods/Headers/Public/SAMKeychain/SAMKeychain.h deleted file mode 120000 index 4a4fb486e..000000000 --- a/Pods/Headers/Public/SAMKeychain/SAMKeychain.h +++ /dev/null @@ -1 +0,0 @@ -../../../SAMKeychain/Sources/SAMKeychain.h \ No newline at end of file diff --git a/Pods/Headers/Public/SAMKeychain/SAMKeychainQuery.h b/Pods/Headers/Public/SAMKeychain/SAMKeychainQuery.h deleted file mode 120000 index f2860b6fc..000000000 --- a/Pods/Headers/Public/SAMKeychain/SAMKeychainQuery.h +++ /dev/null @@ -1 +0,0 @@ -../../../SAMKeychain/Sources/SAMKeychainQuery.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/NSButton+WebCache.h b/Pods/Headers/Public/SDWebImage/NSButton+WebCache.h deleted file mode 120000 index 487f0e352..000000000 --- a/Pods/Headers/Public/SDWebImage/NSButton+WebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/NSButton+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/NSData+ImageContentType.h b/Pods/Headers/Public/SDWebImage/NSData+ImageContentType.h deleted file mode 120000 index 84574987a..000000000 --- a/Pods/Headers/Public/SDWebImage/NSData+ImageContentType.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/NSData+ImageContentType.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/NSImage+WebCache.h b/Pods/Headers/Public/SDWebImage/NSImage+WebCache.h deleted file mode 120000 index b7a00e1f3..000000000 --- a/Pods/Headers/Public/SDWebImage/NSImage+WebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/NSImage+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDImageCache.h b/Pods/Headers/Public/SDWebImage/SDImageCache.h deleted file mode 120000 index 0040b06a1..000000000 --- a/Pods/Headers/Public/SDWebImage/SDImageCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDImageCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDImageCacheConfig.h b/Pods/Headers/Public/SDWebImage/SDImageCacheConfig.h deleted file mode 120000 index f0f1f8f38..000000000 --- a/Pods/Headers/Public/SDWebImage/SDImageCacheConfig.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDImageCacheConfig.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageCoder.h b/Pods/Headers/Public/SDWebImage/SDWebImageCoder.h deleted file mode 120000 index 05b0fe75f..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageCoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageCoder.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageCoderHelper.h b/Pods/Headers/Public/SDWebImage/SDWebImageCoderHelper.h deleted file mode 120000 index dccfb45e1..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageCoderHelper.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageCoderHelper.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageCodersManager.h b/Pods/Headers/Public/SDWebImage/SDWebImageCodersManager.h deleted file mode 120000 index a76c09a3d..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageCodersManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageCodersManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageCompat.h b/Pods/Headers/Public/SDWebImage/SDWebImageCompat.h deleted file mode 120000 index 6ca247842..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageCompat.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageCompat.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageDownloader.h b/Pods/Headers/Public/SDWebImage/SDWebImageDownloader.h deleted file mode 120000 index 303b03b1e..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageDownloader.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageDownloader.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageDownloaderOperation.h b/Pods/Headers/Public/SDWebImage/SDWebImageDownloaderOperation.h deleted file mode 120000 index 99441c485..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageDownloaderOperation.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageFrame.h b/Pods/Headers/Public/SDWebImage/SDWebImageFrame.h deleted file mode 120000 index 5dba5eea6..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageFrame.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageFrame.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageGIFCoder.h b/Pods/Headers/Public/SDWebImage/SDWebImageGIFCoder.h deleted file mode 120000 index b81a0f113..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageGIFCoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageGIFCoder.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageImageIOCoder.h b/Pods/Headers/Public/SDWebImage/SDWebImageImageIOCoder.h deleted file mode 120000 index 1b36e7a28..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageImageIOCoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageImageIOCoder.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageManager.h b/Pods/Headers/Public/SDWebImage/SDWebImageManager.h deleted file mode 120000 index 1b8184856..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageOperation.h b/Pods/Headers/Public/SDWebImage/SDWebImageOperation.h deleted file mode 120000 index 20e5b89ef..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageOperation.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageOperation.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImagePrefetcher.h b/Pods/Headers/Public/SDWebImage/SDWebImagePrefetcher.h deleted file mode 120000 index 50585c6d0..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImagePrefetcher.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImagePrefetcher.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDWebImageTransition.h b/Pods/Headers/Public/SDWebImage/SDWebImageTransition.h deleted file mode 120000 index 98ad40f6a..000000000 --- a/Pods/Headers/Public/SDWebImage/SDWebImageTransition.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/SDWebImageTransition.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/UIButton+WebCache.h b/Pods/Headers/Public/SDWebImage/UIButton+WebCache.h deleted file mode 120000 index 19d2d8e8c..000000000 --- a/Pods/Headers/Public/SDWebImage/UIButton+WebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIButton+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/UIImage+ForceDecode.h b/Pods/Headers/Public/SDWebImage/UIImage+ForceDecode.h deleted file mode 120000 index 1ec2523f5..000000000 --- a/Pods/Headers/Public/SDWebImage/UIImage+ForceDecode.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIImage+ForceDecode.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/UIImage+GIF.h b/Pods/Headers/Public/SDWebImage/UIImage+GIF.h deleted file mode 120000 index 14d5aadd9..000000000 --- a/Pods/Headers/Public/SDWebImage/UIImage+GIF.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIImage+GIF.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/UIImage+MultiFormat.h b/Pods/Headers/Public/SDWebImage/UIImage+MultiFormat.h deleted file mode 120000 index 1fb965010..000000000 --- a/Pods/Headers/Public/SDWebImage/UIImage+MultiFormat.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIImage+MultiFormat.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/UIImageView+HighlightedWebCache.h b/Pods/Headers/Public/SDWebImage/UIImageView+HighlightedWebCache.h deleted file mode 120000 index fd4dea41e..000000000 --- a/Pods/Headers/Public/SDWebImage/UIImageView+HighlightedWebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/UIImageView+WebCache.h b/Pods/Headers/Public/SDWebImage/UIImageView+WebCache.h deleted file mode 120000 index 0c53a47b8..000000000 --- a/Pods/Headers/Public/SDWebImage/UIImageView+WebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIImageView+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/UIView+WebCache.h b/Pods/Headers/Public/SDWebImage/UIView+WebCache.h deleted file mode 120000 index 641671a56..000000000 --- a/Pods/Headers/Public/SDWebImage/UIView+WebCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIView+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/UIView+WebCacheOperation.h b/Pods/Headers/Public/SDWebImage/UIView+WebCacheOperation.h deleted file mode 120000 index f9890c406..000000000 --- a/Pods/Headers/Public/SDWebImage/UIView+WebCacheOperation.h +++ /dev/null @@ -1 +0,0 @@ -../../../SDWebImage/SDWebImage/UIView+WebCacheOperation.h \ No newline at end of file diff --git a/Pods/Headers/Public/SVProgressHUD/SVIndefiniteAnimatedView.h b/Pods/Headers/Public/SVProgressHUD/SVIndefiniteAnimatedView.h deleted file mode 120000 index 55a38a2a6..000000000 --- a/Pods/Headers/Public/SVProgressHUD/SVIndefiniteAnimatedView.h +++ /dev/null @@ -1 +0,0 @@ -../../../SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h \ No newline at end of file diff --git a/Pods/Headers/Public/SVProgressHUD/SVProgressAnimatedView.h b/Pods/Headers/Public/SVProgressHUD/SVProgressAnimatedView.h deleted file mode 120000 index 581cdc20a..000000000 --- a/Pods/Headers/Public/SVProgressHUD/SVProgressAnimatedView.h +++ /dev/null @@ -1 +0,0 @@ -../../../SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.h \ No newline at end of file diff --git a/Pods/Headers/Public/SVProgressHUD/SVProgressHUD.h b/Pods/Headers/Public/SVProgressHUD/SVProgressHUD.h deleted file mode 120000 index 608a8aa95..000000000 --- a/Pods/Headers/Public/SVProgressHUD/SVProgressHUD.h +++ /dev/null @@ -1 +0,0 @@ -../../../SVProgressHUD/SVProgressHUD/SVProgressHUD.h \ No newline at end of file diff --git a/Pods/Headers/Public/SVProgressHUD/SVRadialGradientLayer.h b/Pods/Headers/Public/SVProgressHUD/SVRadialGradientLayer.h deleted file mode 120000 index d78beb58a..000000000 --- a/Pods/Headers/Public/SVProgressHUD/SVRadialGradientLayer.h +++ /dev/null @@ -1 +0,0 @@ -../../../SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h \ No newline at end of file diff --git a/Pods/Headers/Public/TTTAttributedLabel/TTTAttributedLabel.h b/Pods/Headers/Public/TTTAttributedLabel/TTTAttributedLabel.h deleted file mode 120000 index 28a8d21d1..000000000 --- a/Pods/Headers/Public/TTTAttributedLabel/TTTAttributedLabel.h +++ /dev/null @@ -1 +0,0 @@ -../../../TTTAttributedLabel/TTTAttributedLabel/TTTAttributedLabel.h \ No newline at end of file diff --git a/Pods/Headers/Public/UIDevice-Hardware/UIDevice-Hardware.h b/Pods/Headers/Public/UIDevice-Hardware/UIDevice-Hardware.h deleted file mode 120000 index d7842e4ed..000000000 --- a/Pods/Headers/Public/UIDevice-Hardware/UIDevice-Hardware.h +++ /dev/null @@ -1 +0,0 @@ -../../../UIDevice-Hardware/UIDevice-Hardware.h \ No newline at end of file diff --git a/Pods/Headers/Public/libextobjc/EXTRuntimeExtensions.h b/Pods/Headers/Public/libextobjc/EXTRuntimeExtensions.h deleted file mode 120000 index 26f4cafe8..000000000 --- a/Pods/Headers/Public/libextobjc/EXTRuntimeExtensions.h +++ /dev/null @@ -1 +0,0 @@ -../../../libextobjc/extobjc/EXTRuntimeExtensions.h \ No newline at end of file diff --git a/Pods/Headers/Public/libextobjc/EXTScope.h b/Pods/Headers/Public/libextobjc/EXTScope.h deleted file mode 120000 index b2ea0547d..000000000 --- a/Pods/Headers/Public/libextobjc/EXTScope.h +++ /dev/null @@ -1 +0,0 @@ -../../../libextobjc/extobjc/EXTScope.h \ No newline at end of file diff --git a/Pods/Headers/Public/libextobjc/metamacros.h b/Pods/Headers/Public/libextobjc/metamacros.h deleted file mode 120000 index 0f8890153..000000000 --- a/Pods/Headers/Public/libextobjc/metamacros.h +++ /dev/null @@ -1 +0,0 @@ -../../../libextobjc/extobjc/metamacros.h \ No newline at end of file diff --git a/Pods/Headers/Public/nanopb/pb.h b/Pods/Headers/Public/nanopb/pb.h deleted file mode 120000 index 549ba434c..000000000 --- a/Pods/Headers/Public/nanopb/pb.h +++ /dev/null @@ -1 +0,0 @@ -../../../nanopb/pb.h \ No newline at end of file diff --git a/Pods/Headers/Public/nanopb/pb_common.h b/Pods/Headers/Public/nanopb/pb_common.h deleted file mode 120000 index 002c466e4..000000000 --- a/Pods/Headers/Public/nanopb/pb_common.h +++ /dev/null @@ -1 +0,0 @@ -../../../nanopb/pb_common.h \ No newline at end of file diff --git a/Pods/Headers/Public/nanopb/pb_decode.h b/Pods/Headers/Public/nanopb/pb_decode.h deleted file mode 120000 index 62ed2f10c..000000000 --- a/Pods/Headers/Public/nanopb/pb_decode.h +++ /dev/null @@ -1 +0,0 @@ -../../../nanopb/pb_decode.h \ No newline at end of file diff --git a/Pods/Headers/Public/nanopb/pb_encode.h b/Pods/Headers/Public/nanopb/pb_encode.h deleted file mode 120000 index 057760ea0..000000000 --- a/Pods/Headers/Public/nanopb/pb_encode.h +++ /dev/null @@ -1 +0,0 @@ -../../../nanopb/pb_encode.h \ No newline at end of file diff --git a/Pods/Local Podspecs/NYTPhotoViewer.podspec.json b/Pods/Local Podspecs/NYTPhotoViewer.podspec.json deleted file mode 100644 index aa11009b1..000000000 --- a/Pods/Local Podspecs/NYTPhotoViewer.podspec.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "NYTPhotoViewer", - "version": "2.0.0", - "description": "NYTPhotoViewer is a slideshow and image viewer that includes double tap to zoom, captions, support for multiple images, interactive flick to dismiss, animated zooming presentation, and more.", - "summary": "NYTPhotoViewer is a slideshow and image viewer that includes double tap to zoom, flick to dismiss, animated presentation, and more.", - "homepage": "https://github.com/NYTimes/NYTPhotoViewer", - "authors": "The New York Times", - "license": { - "type": "Apache 2.0" - }, - "source": { - "git": "https://github.com/NYTimes/NYTPhotoViewer.git", - "tag": "2.0.0" - }, - "platforms": { - "ios": "8.0" - }, - "requires_arc": true, - "subspecs": [ - { - "name": "Core", - "ios": { - "resource_bundles": { - "NYTPhotoViewer": [ - "NYTPhotoViewer/NYTPhotoViewer.bundle/*" - ] - } - }, - "source_files": "NYTPhotoViewer/**/*.{h,m,swift}", - "frameworks": [ - "UIKit", - "Foundation" - ] - }, - { - "name": "AnimatedGifSupport", - "xcconfig": { - "GCC_PREPROCESSOR_DEFINITIONS": "ANIMATED_GIF_SUPPORT=1" - }, - "dependencies": { - "NYTPhotoViewer/Core": [ - - ], - "FLAnimatedImage": [ - "~> 1.0.12" - ] - } - } - ] -} diff --git a/Pods/Local Podspecs/QMCVDevelopment.podspec.json b/Pods/Local Podspecs/QMCVDevelopment.podspec.json deleted file mode 100644 index a347326d1..000000000 --- a/Pods/Local Podspecs/QMCVDevelopment.podspec.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "name": "QMCVDevelopment", - "version": "0.6", - "summary": "An elegant ready-to-go chat view controller for iOS chat applications that use Quickblox communication backend.", - "description": "* Ready-to-go chat view controller with a set of cells.\n* Automatic cell size calculation.\n* UI customisation for chat cells.\n* Flexibility in improving and extending functionality.\n* Easy to connect with Quickblox.\n* Optimised and performant.\n* Supports portrait and landscape orientations.\n* Auto Layout inside.", - "homepage": "https://github.com/QuickBlox/QMChatViewController-ios", - "license": { - "type": "BSD", - "file": "LICENSE" - }, - "authors": { - "Andrey Ivanov": "andrey.ivanov@quickblox.com", - "Vitaliy Gorbachov": "vitaliy.gorbachov@quickblox.com", - "Vitaliy Gurkovsky": "vitaliy.gurkovsky@injoit.com" - }, - "platforms": { - "ios": "9.0" - }, - "source": { - "git": "https://github.com/QuickBlox/QMChatViewController-ios.git", - "tag": "0.6" - }, - "source_files": "QMChatViewController/QMChatViewController.{h,m}", - "resource_bundles": { - "QMChatViewController": [ - "QMChatViewController/**/*.xib", - "QMChatViewController/**/*.png" - ] - }, - "resources": "QMChatViewController/Icons/Media.xcassets", - "requires_arc": true, - "dependencies": { - "TTTAttributedLabel": [ - - ], - "SDWebImage": [ - - ], - "FFCircularProgressView": [ - - ] - }, - "xcconfig": { - "FRAMEWORK_SEARCH_PATHS": "$(PODS_ROOT)/../../Framework $(PODS_ROOT)/../External" - }, - "subspecs": [ - { - "name": "QMChatLocationSnapshotter", - "source_files": "QMChatViewController/QMChatLocationSnapshotter/*.{h,m}" - }, - { - "name": "Categories", - "dependencies": { - "QMCVDevelopment/QMChatLocationSnapshotter": [ - - ] - }, - "source_files": "QMChatViewController/Categories/*.{h,m}" - }, - { - "name": "Utils", - "dependencies": { - "QMCVDevelopment/Categories": [ - - ] - }, - "source_files": "QMChatViewController/Utils/**/*.{h,m}" - }, - { - "name": "ViewModels", - "dependencies": { - "QMCVDevelopment/Categories": [ - - ] - }, - "source_files": "QMChatViewController/ViewModels/**/*.{h,m}" - }, - { - "name": "Sections", - "dependencies": { - "QMCVDevelopment/QMChatDataSource": [ - - ] - }, - "source_files": "QMChatViewController/QMChatSection/*.{h,m}" - }, - { - "name": "QMChatDataSource", - "source_files": "QMChatViewController/QMChatDataSource/*.{h,m}" - }, - { - "name": "Protocols", - "source_files": "QMChatViewController/Protocols/*.{h}" - }, - { - "name": "Views", - "dependencies": { - "QMCVDevelopment/Categories": [ - - ], - "QMCVDevelopment/Protocols": [ - - ], - "QMCVDevelopment/Utils": [ - - ] - }, - "source_files": "QMChatViewController/Views/**/*.{h,m}" - } - ] -} diff --git a/Pods/Local Podspecs/QMServicesDevelopment.podspec.json b/Pods/Local Podspecs/QMServicesDevelopment.podspec.json deleted file mode 100644 index 02c4ec866..000000000 --- a/Pods/Local Podspecs/QMServicesDevelopment.podspec.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "QMServicesDevelopment", - "version": "0.6.1", - "summary": "Easy-to-use services for Quickblox SDK, for speeding up development of iOS chat applications.", - "homepage": "https://github.com/QuickBlox/q-municate-services-ios", - "license": { - "type": "BSD", - "file": "LICENSE.txt" - }, - "authors": { - "Andrey Ivanov": "andrey.ivanov@quickblox.com", - "Vitaliy Gorbachov": "vitaliy.gorbachov@quickblox.com", - "Vitaliy Gurkovsky": "vitaliy.gurkovsky@injoit.com" - }, - "platforms": { - "ios": "9.0" - }, - "source": { - "git": "https://github.com/QuickBlox/q-municate-services-ios.git", - "tag": "0.6.1" - }, - "source_files": "**/*.{h,m}", - "exclude_files": [ - "Pods", - "Frameworks" - ], - "requires_arc": true, - "ios": { - "frameworks": [ - "MobileCoreServices", - "SystemConfiguration", - "AVFoundation", - "CoreVideo", - "Accelerate", - "CoreMedia", - "AudioToolbox", - "CoreLocation", - "CoreData", - "CoreGraphics", - "CFNetwork", - "UIKit" - ] - }, - "libraries": [ - "resolv", - "xml2", - "stdc++", - "z" - ], - "xcconfig": { - "HEADER_SEARCH_PATHS": "/usr/include/libxml2", - "FRAMEWORK_SEARCH_PATHS": "$(PODS_ROOT)/../../Framework $(PODS_ROOT)/../External" - }, - "prefix_header_contents": "#import \n#import \n#import \n#import ", - "resource_bundles": { - "QMChatCacheModel": "QMChatCache/QMChatCache/CoreData/QMChatServiceModel.xcdatamodeld", - "QMContactListCacheModel": "QMContactListCache/QMContactListCache/CoreData/QMContactListModel.xcdatamodeld", - "QMUsersCacheModel": "QMUsersCache/QMUsersCache/CoreData/QMUsersModel.xcdatamodeld", - "QMOpenGraphCacheModel": "QMOpenGraphCache/QMOpenGraphCache/CoreData/QMOpenGraphModel.xcdatamodeld" - }, - "dependencies": { - "Bolts": [ - ">= 1.9.0" - ] - } -} diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock deleted file mode 100644 index c8fc502e7..000000000 --- a/Pods/Manifest.lock +++ /dev/null @@ -1,203 +0,0 @@ -PODS: - - Bolts (1.9.0): - - Bolts/AppLinks (= 1.9.0) - - Bolts/Tasks (= 1.9.0) - - Bolts/AppLinks (1.9.0): - - Bolts/Tasks - - Bolts/Tasks (1.9.0) - - Crashlytics (3.9.3): - - Fabric (~> 1.7.2) - - Fabric (1.7.2) - - FBSDKCoreKit (4.30.0): - - Bolts (~> 1.7) - - FBSDKLoginKit (4.30.0): - - FBSDKCoreKit - - FBSDKShareKit (4.30.0): - - FBSDKCoreKit (~> 4.30.0) - - FFCircularProgressView (0.5) - - Firebase/Auth (4.8.2): - - Firebase/Core - - FirebaseAuth (= 4.4.2) - - Firebase/Core (4.8.2): - - FirebaseAnalytics (= 4.0.9) - - FirebaseCore (= 4.0.14) - - FirebaseAnalytics (4.0.9): - - FirebaseCore (~> 4.0) - - FirebaseInstanceID (~> 2.0) - - GoogleToolboxForMac/NSData+zlib (~> 2.1) - - nanopb (~> 0.3) - - FirebaseAuth (4.4.2): - - FirebaseAnalytics (~> 4.0) - - GoogleToolboxForMac/NSDictionary+URLArguments (~> 2.1) - - GTMSessionFetcher/Core (~> 1.1) - - FirebaseCore (4.0.14): - - GoogleToolboxForMac/NSData+zlib (~> 2.1) - - FirebaseInstanceID (2.0.8): - - FirebaseCore (~> 4.0) - - FirebaseUI/Auth (4.5.1): - - Firebase/Auth (~> 4.2) - - FirebaseUI/Phone (4.5.1): - - FirebaseUI/Auth - - FLAnimatedImage (1.0.12) - - Flurry-iOS-SDK/FlurrySDK (8.3.1) - - GoogleToolboxForMac/DebugUtils (2.1.3): - - GoogleToolboxForMac/Defines (= 2.1.3) - - GoogleToolboxForMac/Defines (2.1.3) - - GoogleToolboxForMac/NSData+zlib (2.1.3): - - GoogleToolboxForMac/Defines (= 2.1.3) - - GoogleToolboxForMac/NSDictionary+URLArguments (2.1.3): - - GoogleToolboxForMac/DebugUtils (= 2.1.3) - - GoogleToolboxForMac/Defines (= 2.1.3) - - GoogleToolboxForMac/NSString+URLArguments (= 2.1.3) - - GoogleToolboxForMac/NSString+URLArguments (2.1.3) - - GTMSessionFetcher/Core (1.1.13) - - libextobjc/EXTScope (0.4.1): - - libextobjc/RuntimeExtensions - - libextobjc/RuntimeExtensions (0.4.1) - - nanopb (0.3.8): - - nanopb/decode (= 0.3.8) - - nanopb/encode (= 0.3.8) - - nanopb/decode (0.3.8) - - nanopb/encode (0.3.8) - - NYTPhotoViewer (2.0.0): - - NYTPhotoViewer/AnimatedGifSupport (= 2.0.0) - - NYTPhotoViewer/Core (= 2.0.0) - - NYTPhotoViewer/AnimatedGifSupport (2.0.0): - - FLAnimatedImage (~> 1.0.12) - - NYTPhotoViewer/Core - - NYTPhotoViewer/Core (2.0.0) - - QMCVDevelopment (0.6): - - FFCircularProgressView - - QMCVDevelopment/Categories (= 0.6) - - QMCVDevelopment/Protocols (= 0.6) - - QMCVDevelopment/QMChatDataSource (= 0.6) - - QMCVDevelopment/QMChatLocationSnapshotter (= 0.6) - - QMCVDevelopment/Sections (= 0.6) - - QMCVDevelopment/Utils (= 0.6) - - QMCVDevelopment/ViewModels (= 0.6) - - QMCVDevelopment/Views (= 0.6) - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/Categories (0.6): - - FFCircularProgressView - - QMCVDevelopment/QMChatLocationSnapshotter - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/Protocols (0.6): - - FFCircularProgressView - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/QMChatDataSource (0.6): - - FFCircularProgressView - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/QMChatLocationSnapshotter (0.6): - - FFCircularProgressView - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/Sections (0.6): - - FFCircularProgressView - - QMCVDevelopment/QMChatDataSource - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/Utils (0.6): - - FFCircularProgressView - - QMCVDevelopment/Categories - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/ViewModels (0.6): - - FFCircularProgressView - - QMCVDevelopment/Categories - - SDWebImage - - TTTAttributedLabel - - QMCVDevelopment/Views (0.6): - - FFCircularProgressView - - QMCVDevelopment/Categories - - QMCVDevelopment/Protocols - - QMCVDevelopment/Utils - - SDWebImage - - TTTAttributedLabel - - QMServicesDevelopment (0.6.1): - - Bolts (>= 1.9.0) - - Reachability (3.2) - - SAMKeychain (1.5.3) - - SDWebImage (4.3.0): - - SDWebImage/Core (= 4.3.0) - - SDWebImage/Core (4.3.0) - - SVProgressHUD (2.2.2) - - TTTAttributedLabel (2.0.0) - - UIDevice-Hardware (0.1.11) - -DEPENDENCIES: - - Crashlytics - - Fabric - - FBSDKCoreKit - - FBSDKLoginKit - - FBSDKShareKit - - FirebaseUI/Phone (~> 4.0) - - Flurry-iOS-SDK/FlurrySDK (<= 8.3.1) - - libextobjc/EXTScope (~> 0.4.1) - - NYTPhotoViewer (from `https://github.com/NYTimes/NYTPhotoViewer.git`, tag `v2.0.0`) - - QMCVDevelopment (from `git@github.com:QuickBlox/QMChatViewController-ios.git`, branch `development`) - - QMServicesDevelopment (from `git@github.com:QuickBlox/q-municate-services-ios.git`, branch `development`) - - Reachability (~> 3.2) - - SAMKeychain - - SVProgressHUD - - TTTAttributedLabel (~> 2.0) - - UIDevice-Hardware (~> 0.1.11) - -EXTERNAL SOURCES: - NYTPhotoViewer: - :git: https://github.com/NYTimes/NYTPhotoViewer.git - :tag: v2.0.0 - QMCVDevelopment: - :branch: development - :git: git@github.com:QuickBlox/QMChatViewController-ios.git - QMServicesDevelopment: - :branch: development - :git: git@github.com:QuickBlox/q-municate-services-ios.git - -CHECKOUT OPTIONS: - NYTPhotoViewer: - :git: https://github.com/NYTimes/NYTPhotoViewer.git - :tag: v2.0.0 - QMCVDevelopment: - :commit: 4c999c036becead3049c6aa8aecf83b40f103327 - :git: git@github.com:QuickBlox/QMChatViewController-ios.git - QMServicesDevelopment: - :commit: 47874a5b3ea477f39d8917cd0046aca6cb333dc8 - :git: git@github.com:QuickBlox/q-municate-services-ios.git - -SPEC CHECKSUMS: - Bolts: ac6567323eac61e203f6a9763667d0f711be34c8 - Crashlytics: dbb07d01876c171c5ccbdf7826410380189e452c - Fabric: 9cd6a848efcf1b8b07497e0b6a2e7d336353ba15 - FBSDKCoreKit: 7c4bba2877781a131ab5d54c0a78c405d4307b62 - FBSDKLoginKit: fe7a7e82373dc5daad92e1623219e86224ab1fb1 - FBSDKShareKit: a9427574b51bde4f437262c3f118c4ccfddeef6c - FFCircularProgressView: 683a4ab1e1bd613246a3dffa61503ffdebcde8d8 - Firebase: 7d3b8cd837ad9fcd391657734c0d56dab8e9a5a3 - FirebaseAnalytics: 388b630c15713f5dbf364071f5f3d6077fb52f4e - FirebaseAuth: bd2738c5c1e92b108ba5f7f7335908097a4e50bb - FirebaseCore: 2e0b98fb2d64ca8140136beff15772bdd14d2dd7 - FirebaseInstanceID: 81df5805a08001e69138664bdd02c6719a9ac80f - FirebaseUI: 1dc9c8a87a776b488a28a28541f029e60c824cfd - FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 - Flurry-iOS-SDK: 912b3eb78bee559883feb3b13263437b185e8fe9 - GoogleToolboxForMac: 2501e2ad72a52eb3dfe7bd9aee7dad11b858bd20 - GTMSessionFetcher: 5bb1eae636127de695590f50e7d248483eb891e6 - libextobjc: a650fc1bf489a3d3a9bc2e621efa3e1006fc5471 - nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3 - NYTPhotoViewer: 34b8bd6bcc297466adec1668f9a01249d73c90e6 - QMCVDevelopment: 8b724410db764d2d612968cad41048dbe48f3357 - QMServicesDevelopment: bea9291900e039a2af592652696c6156ac852b3e - Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 - SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c - SDWebImage: 6da6c8bca115addc4de8613362e1b15f66333825 - SVProgressHUD: 59b2d3dabacbd051576d21d32293ca7228dc18b0 - TTTAttributedLabel: 8cffe8e127e4e82ff3af1e5386d4cd0ad000b656 - UIDevice-Hardware: 72b0ea097ed0b239fe88073e2b9ac0b18f75bc05 - -PODFILE CHECKSUM: 23c6321c5974bd0e414a602c4d817e7f08d09f37 - -COCOAPODS: 1.4.0 diff --git a/Pods/NYTPhotoViewer/LICENSE.md b/Pods/NYTPhotoViewer/LICENSE.md deleted file mode 100644 index 85159eb59..000000000 --- a/Pods/NYTPhotoViewer/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2015-2017 The New York Times Company - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this library except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoCaptionView.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoCaptionView.h deleted file mode 100644 index 7604b733a..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoCaptionView.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// NYTPhotoCaptionView.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/18/15. -// -// - -@import UIKit; -#import "NYTPhotoCaptionViewLayoutWidthHinting.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * A view used to display the caption for a photo. - * - * This is used by default when no custom caption view is provided. - */ -@interface NYTPhotoCaptionView : UIView - -/** - * Designated initializer that takes all the caption attributed strings as arguments. - * - * @param attributedTitle The attributed string used as the title. The top string in the caption view. - * @param attributedSummary The attributed string used as the summary. The second from the top string in the caption view. - * @param attributedCredit The attributed string used as the credit. The third from the top string in the caption view. - * - * @return A fully initialized object. - */ -- (instancetype)initWithAttributedTitle:(nullable NSAttributedString *)attributedTitle attributedSummary:(nullable NSAttributedString *)attributedSummary attributedCredit:(nullable NSAttributedString *)attributedCredit NS_DESIGNATED_INITIALIZER; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoCaptionView.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoCaptionView.m deleted file mode 100644 index 7f6c83b4b..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoCaptionView.m +++ /dev/null @@ -1,164 +0,0 @@ -// -// NYTPhotoCaptionView.m -// NYTPhotoViewer -// -// Created by Brian Capps on 2/18/15. -// -// - -#import "NYTPhotoCaptionView.h" - -static const CGFloat NYTPhotoCaptionViewHorizontalMargin = 8.0; -static const CGFloat NYTPhotoCaptionViewVerticalMargin = 7.0; - -@interface NYTPhotoCaptionView () - -- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; - -@property (nonatomic, readonly) NSAttributedString *attributedTitle; -@property (nonatomic, readonly) NSAttributedString *attributedSummary; -@property (nonatomic, readonly) NSAttributedString *attributedCredit; - -@property (nonatomic) UITextView *textView; -@property (nonatomic) CAGradientLayer *gradientLayer; - -@end - -@implementation NYTPhotoCaptionView - -@synthesize preferredMaxLayoutWidth = _preferredMaxLayoutWidth; - -#pragma mark - UIView - -- (instancetype)initWithFrame:(CGRect)frame { - return [self initWithAttributedTitle:nil attributedSummary:nil attributedCredit:nil]; -} - -- (instancetype)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - - if (self) { - [self commonInit]; - } - - return self; -} - -+ (BOOL)requiresConstraintBasedLayout { - return YES; -} - -- (void)didMoveToSuperview { - [super didMoveToSuperview]; - - NSLayoutConstraint *maxHeightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.superview attribute:NSLayoutAttributeHeight multiplier:0.3f constant:0.0f]; - [self.superview addConstraint:maxHeightConstraint]; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - void (^updateGradientFrame)() = ^{ - self.gradientLayer.frame = self.layer.bounds; - }; - - updateGradientFrame(); - - // On iOS 8.x, when this view is height-constrained, neither `self.bounds` nor `self.layer.bounds` reflects the new layout height immediately after `[super layoutSubviews]`. Both of those properties appear correct in the next runloop. - // This problem doesn't affect iOS 9 and there may be a better solution; PRs welcome. - dispatch_async(dispatch_get_main_queue(), updateGradientFrame); -} - -- (CGSize)intrinsicContentSize { - CGSize contentSize = [self.textView sizeThatFits:CGSizeMake(self.preferredMaxLayoutWidth, CGFLOAT_MAX)]; - CGFloat width = (CGFloat)self.preferredMaxLayoutWidth; - CGFloat height = (CGFloat)ceil(contentSize.height); - - return CGSizeMake(width, height); -} - -- (void)setPreferredMaxLayoutWidth:(CGFloat)preferredMaxLayoutWidth { - preferredMaxLayoutWidth = (CGFloat)ceil(preferredMaxLayoutWidth); - - if (ABS(_preferredMaxLayoutWidth - preferredMaxLayoutWidth) > 0.1) { - _preferredMaxLayoutWidth = preferredMaxLayoutWidth; - [self invalidateIntrinsicContentSize]; - } -} - -#pragma mark - NYTPhotoCaptionView - -- (instancetype)initWithAttributedTitle:(NSAttributedString *)attributedTitle attributedSummary:(NSAttributedString *)attributedSummary attributedCredit:(NSAttributedString *)attributedCredit { - self = [super initWithFrame:CGRectZero]; - - if (self) { - _attributedTitle = [attributedTitle copy]; - _attributedSummary = [attributedSummary copy]; - _attributedCredit = [attributedCredit copy]; - - [self commonInit]; - } - - return self; -} - -- (void)commonInit { - self.translatesAutoresizingMaskIntoConstraints = NO; - - [self setupTextView]; - [self updateTextViewAttributedText]; - [self setupGradient]; -} - -- (void)setupTextView { - self.textView = [[UITextView alloc] initWithFrame:CGRectZero textContainer:nil]; - self.textView.translatesAutoresizingMaskIntoConstraints = NO; - self.textView.editable = NO; - self.textView.dataDetectorTypes = UIDataDetectorTypeNone; - self.textView.backgroundColor = [UIColor clearColor]; - self.textView.textContainerInset = UIEdgeInsetsMake(NYTPhotoCaptionViewVerticalMargin, NYTPhotoCaptionViewHorizontalMargin, NYTPhotoCaptionViewVerticalMargin, NYTPhotoCaptionViewHorizontalMargin); - - [self addSubview:self.textView]; - - NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.textView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]; - NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.textView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]; - NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.textView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]; - NSLayoutConstraint *horizontalPositionConstraint = [NSLayoutConstraint constraintWithItem:self.textView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; - - [self addConstraints:@[topConstraint, bottomConstraint, widthConstraint, horizontalPositionConstraint]]; -} - -- (void)setupGradient { - self.gradientLayer = [CAGradientLayer layer]; - self.gradientLayer.frame = self.layer.bounds; - self.gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColor clearColor].CGColor, (id)[[UIColor blackColor] colorWithAlphaComponent:0.85].CGColor, nil]; - [self.layer insertSublayer:self.gradientLayer atIndex:0]; -} - -- (void)updateTextViewAttributedText { - NSMutableAttributedString *attributedLabelText = [[NSMutableAttributedString alloc] init]; - - if (self.attributedTitle) { - [attributedLabelText appendAttributedString:self.attributedTitle]; - } - - if (self.attributedSummary) { - if (self.attributedTitle) { - [attributedLabelText appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n" attributes:nil]]; - } - - [attributedLabelText appendAttributedString:self.attributedSummary]; - } - - if (self.attributedCredit) { - if (self.attributedTitle || self.attributedSummary) { - [attributedLabelText appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n" attributes:nil]]; - } - - [attributedLabelText appendAttributedString:self.attributedCredit]; - } - - self.textView.attributedText = attributedLabelText; -} - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h deleted file mode 100644 index 0029f9872..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoDismissalInteractionController.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// NYTPhotoDismissalInteractionController.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/17/15. -// -// - -@import UIKit; - -NS_ASSUME_NONNULL_BEGIN - -/** - * An object that controls an interactive photo dismissal transition. - */ -@interface NYTPhotoDismissalInteractionController : NSObject - -/** - * The animator object associated with the interactive transition. - */ -@property (nonatomic) id animator; - -/** - * If set, this view will be hidden as soon as the interactive transition starts, and shown after it ends. - */ -@property (nonatomic, nullable) UIView *viewToHideWhenBeginningTransition; - -/** - * A `BOOL` determining whether, after reaching a certain panning threshold that constitutes a dismissal, the animator object should be used to finish the transition. - */ -@property (nonatomic) BOOL shouldAnimateUsingAnimator; - -/** - * Call when new events are received from a `UIPanGestureRecognizer`. Pans the appropriate view, and makes decisions when to finish or cancel the interactive transition back to the anchor point. Intended to be called after a dismissal has started with `dismissViewControllerAnimated:completion:`. - * - * @param panGestureRecognizer The `UIPanGestureRecognizer` that caused the pan event. - * @param viewToPan The view to pan using the location from the pan gesture recognizer. - * @param anchorPoint The point at which the pan began and should end if cancelled. Should be in the coordinates of the "from" view controller's view on dismissal. - */ -- (void)didPanWithPanGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer viewToPan:(UIView *)viewToPan anchorPoint:(CGPoint)anchorPoint; - -@end - -NS_ASSUME_NONNULL_END \ No newline at end of file diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoDismissalInteractionController.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoDismissalInteractionController.m deleted file mode 100644 index 433f51c90..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoDismissalInteractionController.m +++ /dev/null @@ -1,166 +0,0 @@ -// -// NYTPhotoDismissalInteractionController.m -// NYTPhotoViewer -// -// Created by Brian Capps on 2/17/15. -// -// - -#import "NYTPhotoDismissalInteractionController.h" - -static const CGFloat NYTPhotoDismissalInteractionControllerPanDismissDistanceRatio = 50.0 / 667.0; // distance over iPhone 6 height. -static const CGFloat NYTPhotoDismissalInteractionControllerPanDismissMaximumDuration = 0.45; -static const CGFloat NYTPhotoDismissalInteractionControllerReturnToCenterVelocityAnimationRatio = 0.00007; // Arbitrary value that looked decent. - -@interface NYTPhotoDismissalInteractionController () - -@property (nonatomic) id transitionContext; - -@end - -@implementation NYTPhotoDismissalInteractionController - -#pragma mark - NYTPhotoDismissalInteractionController - -- (void)didPanWithPanGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer viewToPan:(UIView *)viewToPan anchorPoint:(CGPoint)anchorPoint { - UIView *fromView = [self.transitionContext viewForKey:UITransitionContextFromViewKey]; - CGPoint translatedPanGesturePoint = [panGestureRecognizer translationInView:fromView]; - CGPoint newCenterPoint = CGPointMake(anchorPoint.x, anchorPoint.y + translatedPanGesturePoint.y); - - // Pan the view on pace with the pan gesture. - viewToPan.center = newCenterPoint; - - CGFloat verticalDelta = newCenterPoint.y - anchorPoint.y; - - CGFloat backgroundAlpha = [self backgroundAlphaForPanningWithVerticalDelta:verticalDelta]; - fromView.backgroundColor = [fromView.backgroundColor colorWithAlphaComponent:backgroundAlpha]; - - if (panGestureRecognizer.state == UIGestureRecognizerStateEnded) { - [self finishPanWithPanGestureRecognizer:panGestureRecognizer verticalDelta:verticalDelta viewToPan:viewToPan anchorPoint:anchorPoint]; - } -} - -- (void)finishPanWithPanGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer verticalDelta:(CGFloat)verticalDelta viewToPan:(UIView *)viewToPan anchorPoint:(CGPoint)anchorPoint { - UIView *fromView = [self.transitionContext viewForKey:UITransitionContextFromViewKey]; - - // Return to center case. - CGFloat velocityY = [panGestureRecognizer velocityInView:panGestureRecognizer.view].y; - - CGFloat animationDuration = (ABS(velocityY) * NYTPhotoDismissalInteractionControllerReturnToCenterVelocityAnimationRatio) + 0.2; - CGFloat animationCurve = UIViewAnimationOptionCurveEaseOut; - CGPoint finalPageViewCenterPoint = anchorPoint; - CGFloat finalBackgroundAlpha = 1.0; - - CGFloat dismissDistance = NYTPhotoDismissalInteractionControllerPanDismissDistanceRatio * CGRectGetHeight(fromView.bounds); - BOOL isDismissing = ABS(verticalDelta) > dismissDistance; - - BOOL didAnimateUsingAnimator = NO; - - if (isDismissing) { - if (self.shouldAnimateUsingAnimator) { - [self.animator animateTransition:self.transitionContext]; - didAnimateUsingAnimator = YES; - } - else { - BOOL isPositiveDelta = verticalDelta >= 0; - - CGFloat modifier = isPositiveDelta ? 1 : -1; - CGFloat finalCenterY = CGRectGetMidY(fromView.bounds) + modifier * CGRectGetHeight(fromView.bounds); - finalPageViewCenterPoint = CGPointMake(fromView.center.x, finalCenterY); - - // Maintain the velocity of the pan, while easing out. - animationDuration = ABS(finalPageViewCenterPoint.y - viewToPan.center.y) / ABS(velocityY); - animationDuration = MIN(animationDuration, NYTPhotoDismissalInteractionControllerPanDismissMaximumDuration); - - animationCurve = UIViewAnimationOptionCurveEaseOut; - finalBackgroundAlpha = 0.0; - } - } - - if (!didAnimateUsingAnimator) { - [UIView animateWithDuration:animationDuration delay:0 options:animationCurve animations:^{ - viewToPan.center = finalPageViewCenterPoint; - - fromView.backgroundColor = [fromView.backgroundColor colorWithAlphaComponent:finalBackgroundAlpha]; - } completion:^(BOOL finished) { - if (isDismissing) { - [self.transitionContext finishInteractiveTransition]; - } - else { - [self.transitionContext cancelInteractiveTransition]; - - if (![[self class] isRadar20070670Fixed]) { - [self fixCancellationStatusBarAppearanceBug]; - } - } - - self.viewToHideWhenBeginningTransition.alpha = 1.0; - - [self.transitionContext completeTransition:isDismissing && !self.transitionContext.transitionWasCancelled]; - - self.transitionContext = nil; - }]; - } - else { - self.transitionContext = nil; - } -} - -- (CGFloat)backgroundAlphaForPanningWithVerticalDelta:(CGFloat)verticalDelta { - CGFloat startingAlpha = 1.0; - CGFloat finalAlpha = 0.1; - CGFloat totalAvailableAlpha = startingAlpha - finalAlpha; - - CGFloat maximumDelta = CGRectGetHeight([self.transitionContext viewForKey:UITransitionContextFromViewKey].bounds) / 2.0; // Arbitrary value. - CGFloat deltaAsPercentageOfMaximum = MIN(ABS(verticalDelta) / maximumDelta, 1.0); - - return startingAlpha - (deltaAsPercentageOfMaximum * totalAvailableAlpha); -} - -#pragma mark - Bug Fix - -- (void)fixCancellationStatusBarAppearanceBug { - UIViewController *toViewController = [self.transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; - UIViewController *fromViewController = [self.transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; - - NSString *statusBarViewControllerSelectorPart1 = @"_setPresentedSta"; - NSString *statusBarViewControllerSelectorPart2 = @"tusBarViewController:"; - SEL setStatusBarViewControllerSelector = NSSelectorFromString([statusBarViewControllerSelectorPart1 stringByAppendingString:statusBarViewControllerSelectorPart2]); - - if ([toViewController respondsToSelector:setStatusBarViewControllerSelector] && fromViewController.modalPresentationCapturesStatusBarAppearance) { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [toViewController performSelector:setStatusBarViewControllerSelector withObject:fromViewController]; -#pragma clang diagnostic pop - } -} - -+ (BOOL)isRadar20070670Fixed { - // per @bcapps, this was fixed in iOS 8.3 but not marked as such on bugreport.apple.com - // https://github.com/NYTimes/NYTPhotoViewer/issues/131#issue-126923817 - - static BOOL isRadar20070670Fixed; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSOperatingSystemVersion const iOSVersion8Point3 = (NSOperatingSystemVersion) { - .majorVersion = 8, - .minorVersion = 3, - .patchVersion = 0 - }; - - isRadar20070670Fixed = [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:iOSVersion8Point3]; - }); - - return isRadar20070670Fixed; -} - -#pragma mark - UIViewControllerInteractiveTransitioning - -- (void)startInteractiveTransition:(id )transitionContext { - self.viewToHideWhenBeginningTransition.alpha = 0.0; - - self.transitionContext = transitionContext; -} - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionAnimator.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionAnimator.h deleted file mode 100644 index dc946554f..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionAnimator.h +++ /dev/null @@ -1,84 +0,0 @@ -// -// NYTPhotoTransitionAnimator.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/17/15. -// -// - -@import UIKit; - -NS_ASSUME_NONNULL_BEGIN - -/** - * An object that controls the animated transition of photo presentation and dismissal. - */ -@interface NYTPhotoTransitionAnimator : NSObject - -/** - * The view from which to start an image zooming transition. This view may be hidden or shown in the transition, but will never be removed or changed in its view hierarchy. - */ -@property (nonatomic) UIView *startingView; - -/** - * The view from which to end an image zooming transition. This view may be hidden or shown in the transition, but will never be removed or changed in its view hierarchy. - */ -@property (nonatomic) UIView *endingView; - -/** - * The view that is used for animating the starting view. If no view is set, the starting view is screenshotted and the relevant properties are copied to the new view. - */ -@property (nonatomic, nullable) UIView *startingViewForAnimation; - -/** - * The view that is used for animating the ending view. If no view is set, the ending view is screenshotted and relevant properties copied to the new view. - */ -@property (nonatomic, nullable) UIView *endingViewForAnimation; - -/** - * Whether this transition is a dismissal. If `NO`, presentation is assumed. - */ -@property (nonatomic, getter=isDismissing) BOOL dismissing; - -/** - * The duration of the animation when zooming is performed. - */ -@property (nonatomic) CGFloat animationDurationWithZooming; - -/** - * The duration of the animation when only fading and not zooming is performed. - */ -@property (nonatomic) CGFloat animationDurationWithoutZooming; - -/** - * The ratio (from 0.0 to 1.0) of the total animation duration that the background fade duration takes. - */ -@property (nonatomic) CGFloat animationDurationFadeRatio; - -/** - * The ratio (from 0.0 to 1.0) of the total animation duration that the ending view fade in duration takes. - */ -@property (nonatomic) CGFloat animationDurationEndingViewFadeInRatio; - -/** - * The ratio (from 0.0 to 1.0) of the total animation duration that the starting view fade out duration takes after the ending view fade in completes. - */ -@property (nonatomic) CGFloat animationDurationStartingViewFadeOutRatio; - -/** - * The value passed as the spring damping argument to `animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:` for the zooming animation. - */ -@property (nonatomic) CGFloat zoomingAnimationSpringDamping; - -/** - * Convenience method for creating a view for animation from another arbitrary view. Attempts to create an identical view in the most efficient way possible. Returns `nil` if the passed-in view is `nil`. - * - * @param view The view from which to create the animation. - * - * @return A new view identical in appearance to the passed-in view, with relevant properties transferred. Not a member of any view hierarchy. Return `nil` if the passed-in view is `nil`. - */ -+ (nullable UIView *)newAnimationViewFromView:(nullable UIView *)view; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionAnimator.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionAnimator.m deleted file mode 100644 index aa80441dc..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionAnimator.m +++ /dev/null @@ -1,275 +0,0 @@ -// -// NYTPhotoTransitionAnimator.m -// NYTPhotoViewer -// -// Created by Brian Capps on 2/17/15. -// -// - -#import "NYTPhotoTransitionAnimator.h" - -static const CGFloat NYTPhotoTransitionAnimatorDurationWithZooming = 0.5; -static const CGFloat NYTPhotoTransitionAnimatorDurationWithoutZooming = 0.3; -static const CGFloat NYTPhotoTransitionAnimatorBackgroundFadeDurationRatio = 4.0 / 9.0; -static const CGFloat NYTPhotoTransitionAnimatorEndingViewFadeInDurationRatio = 0.1; -static const CGFloat NYTPhotoTransitionAnimatorStartingViewFadeOutDurationRatio = 0.05; -static const CGFloat NYTPhotoTransitionAnimatorSpringDamping = 0.9; - -@interface NYTPhotoTransitionAnimator () - -@property (nonatomic, readonly) BOOL shouldPerformZoomingAnimation; - -@end - -@implementation NYTPhotoTransitionAnimator - -#pragma mark - NSObject - -- (instancetype)init { - self = [super init]; - - if (self) { - _animationDurationWithZooming = NYTPhotoTransitionAnimatorDurationWithZooming; - _animationDurationWithoutZooming = NYTPhotoTransitionAnimatorDurationWithoutZooming; - _animationDurationFadeRatio = NYTPhotoTransitionAnimatorBackgroundFadeDurationRatio; - _animationDurationEndingViewFadeInRatio = NYTPhotoTransitionAnimatorEndingViewFadeInDurationRatio; - _animationDurationStartingViewFadeOutRatio = NYTPhotoTransitionAnimatorStartingViewFadeOutDurationRatio; - _zoomingAnimationSpringDamping = NYTPhotoTransitionAnimatorSpringDamping; - } - - return self; -} - -#pragma mark - NYTPhotoTransitionAnimator - -- (void)setupTransitionContainerHierarchyWithTransitionContext:(id )transitionContext { - UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey]; - UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey]; - - UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; - toView.frame = [transitionContext finalFrameForViewController:toViewController]; - - if (![toView isDescendantOfView:transitionContext.containerView]) { - [transitionContext.containerView addSubview:toView]; - } - - if (self.isDismissing) { - [transitionContext.containerView bringSubviewToFront:fromView]; - } -} - -- (void)setAnimationDurationFadeRatio:(CGFloat)animationDurationFadeRatio { - _animationDurationFadeRatio = MIN(animationDurationFadeRatio, 1.0); -} - -- (void)setAnimationDurationEndingViewFadeInRatio:(CGFloat)animationDurationEndingViewFadeInRatio { - _animationDurationEndingViewFadeInRatio = MIN(animationDurationEndingViewFadeInRatio, 1.0); -} - -- (void)setAnimationDurationStartingViewFadeOutRatio:(CGFloat)animationDurationStartingViewFadeOutRatio { - _animationDurationStartingViewFadeOutRatio = MIN(animationDurationStartingViewFadeOutRatio, 1.0); -} - -#pragma mark - Fading - -- (void)performFadeAnimationWithTransitionContext:(id )transitionContext { - UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey]; - UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey]; - - UIView *viewToFade = toView; - CGFloat beginningAlpha = 0.0; - CGFloat endingAlpha = 1.0; - - if (self.isDismissing) { - viewToFade = fromView; - beginningAlpha = 1.0; - endingAlpha = 0.0; - } - - viewToFade.alpha = beginningAlpha; - - [UIView animateWithDuration:[self fadeDurationForTransitionContext:transitionContext] animations:^{ - viewToFade.alpha = endingAlpha; - } completion:^(BOOL finished) { - if (!self.shouldPerformZoomingAnimation) { - [self completeTransitionWithTransitionContext:transitionContext]; - } - }]; -} - -- (CGFloat)fadeDurationForTransitionContext:(id )transitionContext { - if (self.shouldPerformZoomingAnimation) { - return [self transitionDuration:transitionContext] * self.animationDurationFadeRatio; - } - - return [self transitionDuration:transitionContext]; -} - -#pragma mark - Zooming - -- (void)performZoomingAnimationWithTransitionContext:(id )transitionContext { - UIView *containerView = transitionContext.containerView; - - // Create a brand new view with the same contents for the purposes of animating this new view and leaving the old one alone. - UIView *startingViewForAnimation = self.startingViewForAnimation; - if (!startingViewForAnimation) { - startingViewForAnimation = [[self class] newAnimationViewFromView:self.startingView]; - } - - UIView *endingViewForAnimation = self.endingViewForAnimation; - if (!endingViewForAnimation) { - endingViewForAnimation = [[self class] newAnimationViewFromView:self.endingView]; - } - - CGAffineTransform finalEndingViewTransform = self.endingView.transform; - - CGFloat endingViewInitialTransform = CGRectGetHeight(startingViewForAnimation.frame) / CGRectGetHeight(endingViewForAnimation.frame); - CGPoint translatedStartingViewCenter = [[self class] centerPointForView:self.startingView - translatedToContainerView:containerView]; - - startingViewForAnimation.center = translatedStartingViewCenter; - - endingViewForAnimation.transform = CGAffineTransformScale(endingViewForAnimation.transform, endingViewInitialTransform, endingViewInitialTransform); - endingViewForAnimation.center = translatedStartingViewCenter; - endingViewForAnimation.alpha = 0.0; - - [transitionContext.containerView addSubview:startingViewForAnimation]; - [transitionContext.containerView addSubview:endingViewForAnimation]; - - // Hide the original ending view and starting view until the completion of the animation. - self.endingView.alpha = 0.0; - self.startingView.alpha = 0.0; - - CGFloat fadeInDuration = [self transitionDuration:transitionContext] * self.animationDurationEndingViewFadeInRatio; - CGFloat fadeOutDuration = [self transitionDuration:transitionContext] * self.animationDurationStartingViewFadeOutRatio; - - // Ending view / starting view replacement animation - [UIView animateWithDuration:fadeInDuration - delay:0 - options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionBeginFromCurrentState - animations:^{ - endingViewForAnimation.alpha = 1.0; - } completion:^(BOOL finished) { - [UIView animateWithDuration:fadeOutDuration - delay:0 - options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionBeginFromCurrentState - animations:^{ - startingViewForAnimation.alpha = 0.0; - } completion:^(BOOL finished) { - [startingViewForAnimation removeFromSuperview]; - }]; - }]; - - CGFloat startingViewFinalTransform = 1.0 / endingViewInitialTransform; - CGPoint translatedEndingViewFinalCenter = [[self class] centerPointForView:self.endingView - translatedToContainerView:containerView]; - - // Zoom animation - [UIView animateWithDuration:[self transitionDuration:transitionContext] - delay:0 - usingSpringWithDamping:self.zoomingAnimationSpringDamping - initialSpringVelocity:0.0 - options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionBeginFromCurrentState - animations:^{ - endingViewForAnimation.transform = finalEndingViewTransform; - endingViewForAnimation.center = translatedEndingViewFinalCenter; - startingViewForAnimation.transform = CGAffineTransformScale(startingViewForAnimation.transform, startingViewFinalTransform, startingViewFinalTransform); - startingViewForAnimation.center = translatedEndingViewFinalCenter; - } - completion:^(BOOL finished) { - [endingViewForAnimation removeFromSuperview]; - self.endingView.alpha = 1.0; - self.startingView.alpha = 1.0; - - [self completeTransitionWithTransitionContext:transitionContext]; - }]; -} - -#pragma mark - Convenience - -- (BOOL)shouldPerformZoomingAnimation { - return self.startingView && self.endingView; -} - -- (void)completeTransitionWithTransitionContext:(id )transitionContext { - if (transitionContext.isInteractive) { - if (transitionContext.transitionWasCancelled) { - [transitionContext cancelInteractiveTransition]; - } - else { - [transitionContext finishInteractiveTransition]; - } - } - - [transitionContext completeTransition:!transitionContext.transitionWasCancelled]; -} - -+ (CGPoint)centerPointForView:(UIView *)view translatedToContainerView:(UIView *)containerView { - CGPoint centerPoint = view.center; - - // Special case for zoomed scroll views. - if ([view.superview isKindOfClass:[UIScrollView class]]) { - UIScrollView *scrollView = (UIScrollView *)view.superview; - - if (scrollView.zoomScale != 1.0) { - centerPoint.x += (CGRectGetWidth(scrollView.bounds) - scrollView.contentSize.width) / 2.0 + scrollView.contentOffset.x; - centerPoint.y += (CGRectGetHeight(scrollView.bounds) - scrollView.contentSize.height) / 2.0 + scrollView.contentOffset.y; - } - } - - return [view.superview convertPoint:centerPoint toView:containerView]; -} - -+ (UIView *)newAnimationViewFromView:(UIView *)view { - if (!view) { - return nil; - } - - UIView *animationView; - if (view.layer.contents) { - if ([view isKindOfClass:[UIImageView class]]) { - // The case of UIImageView is handled separately since the mere layer's contents (i.e. CGImage in this case) doesn't - // seem to contain proper informations about the image orientation for portrait images taken directly on the device. - // See https://github.com/NYTimes/NYTPhotoViewer/issues/115 - animationView = [(UIImageView *)[[view class] alloc] initWithImage:((UIImageView *)view).image]; - animationView.bounds = view.bounds; - } - else { - animationView = [[UIView alloc] initWithFrame:view.frame]; - animationView.layer.contents = view.layer.contents; - animationView.layer.bounds = view.layer.bounds; - } - - animationView.layer.cornerRadius = view.layer.cornerRadius; - animationView.layer.masksToBounds = view.layer.masksToBounds; - animationView.contentMode = view.contentMode; - animationView.transform = view.transform; - } - else { - animationView = [view snapshotViewAfterScreenUpdates:YES]; - } - - return animationView; -} - -#pragma mark - UIViewControllerAnimatedTransitioning - -- (NSTimeInterval)transitionDuration:(id )transitionContext { - if (self.shouldPerformZoomingAnimation) { - return self.animationDurationWithZooming; - } - - return self.animationDurationWithoutZooming; -} - -- (void)animateTransition:(id )transitionContext { - [self setupTransitionContainerHierarchyWithTransitionContext:transitionContext]; - - [self performFadeAnimationWithTransitionContext:transitionContext]; - - if (self.shouldPerformZoomingAnimation) { - [self performZoomingAnimationWithTransitionContext:transitionContext]; - } -} - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionController.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionController.h deleted file mode 100644 index 68b5d2c80..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionController.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// NYTPhotoTransitionController.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/13/15. -// -// - -@import UIKit; - -NS_ASSUME_NONNULL_BEGIN - -/** - * An object that manages both animated transitions and interactive transitions, acting as the transitioning delegate and internally coordinating multiple objects that do the animating and interactivity work. - */ -@interface NYTPhotoTransitionController : NSObject - -/** - * The view from which to start an image zooming transition. This view may be hidden or shown in the transition, but will never be removed or changed in its view hierarchy. - */ -@property (nonatomic) UIView *startingView; - -/** - * The view from which to end an image zooming transition. This view may be hidden or shown in the transition, but will never be removed or changed in its view hierarchy. - */ -@property (nonatomic) UIView *endingView; - -/** - * Forces the dismiss to animate, instead of the default behavior of being interactive. - */ -@property (nonatomic) BOOL forcesNonInteractiveDismissal; - -/** - * Call when new events are received from a `UIPanGestureRecognizer`. Internally passes off to interaction controller, which pans the appropriate view, and makes decisions when to finish or cancel the interactive transition back to the anchor point. Intended to be called after a dismissal has started with `dismissViewControllerAnimated:completion:`. - * - * @param panGestureRecognizer The `UIPanGestureRecognizer` that caused the pan event. - * @param viewToPan The view to pan using the location from the pan gesture recognizer. - * @param anchorPoint The point at which the pan began and should end if cancelled. Should be in the coordinates of the "from" view controller's view on dismissal. - */ -- (void)didPanWithPanGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer viewToPan:(UIView *)viewToPan anchorPoint:(CGPoint)anchorPoint; - -@end - -NS_ASSUME_NONNULL_END \ No newline at end of file diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionController.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionController.m deleted file mode 100644 index 564386d2f..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoTransitionController.m +++ /dev/null @@ -1,87 +0,0 @@ -// -// NYTPhotoTransitionController.m -// NYTPhotoViewer -// -// Created by Brian Capps on 2/13/15. -// -// - -#import "NYTPhotoTransitionController.h" -#import "NYTPhotoTransitionAnimator.h" -#import "NYTPhotoDismissalInteractionController.h" - -@interface NYTPhotoTransitionController () - -@property (nonatomic) NYTPhotoTransitionAnimator *animator; -@property (nonatomic) NYTPhotoDismissalInteractionController *interactionController; - -@end - -@implementation NYTPhotoTransitionController - -#pragma mark - NSObject - -- (instancetype)init { - self = [super init]; - - if (self) { - _animator = [[NYTPhotoTransitionAnimator alloc] init]; - _interactionController = [[NYTPhotoDismissalInteractionController alloc] init]; - _forcesNonInteractiveDismissal = YES; - } - - return self; -} - -#pragma mark - NYTPhotoTransitionController - -- (void)didPanWithPanGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer viewToPan:(UIView *)viewToPan anchorPoint:(CGPoint)anchorPoint { - [self.interactionController didPanWithPanGestureRecognizer:panGestureRecognizer viewToPan:viewToPan anchorPoint:anchorPoint]; -} - -- (UIView *)startingView { - return self.animator.startingView; -} - -- (void)setStartingView:(UIView *)startingView { - self.animator.startingView = startingView; -} - -- (UIView *)endingView { - return self.animator.endingView; -} - -- (void)setEndingView:(UIView *)endingView { - self.animator.endingView = endingView; -} - -#pragma mark - UIViewControllerTransitioningDelegate - -- (id )animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source { - self.animator.dismissing = NO; - - return self.animator; -} - -- (id )animationControllerForDismissedController:(UIViewController *)dismissed { - self.animator.dismissing = YES; - - return self.animator; -} - -- (id )interactionControllerForDismissal:(id )animator { - if (self.forcesNonInteractiveDismissal) { - return nil; - } - - // The interaction controller will be hiding the ending view, so we should get and set a visible version now. - self.animator.endingViewForAnimation = [[self.animator class] newAnimationViewFromView:self.endingView]; - - self.interactionController.animator = animator; - self.interactionController.shouldAnimateUsingAnimator = self.endingView != nil; - self.interactionController.viewToHideWhenBeginningTransition = self.startingView ? self.endingView : nil; - - return self.interactionController; -} - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewController.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewController.h deleted file mode 100644 index 73906f20c..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewController.h +++ /dev/null @@ -1,76 +0,0 @@ -// -// NYTPhotoViewController.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/11/15. -// -// - -@import UIKit; -#import "NYTPhotoContainer.h" - -@class NYTScalingImageView; - -@protocol NYTPhoto; -@protocol NYTPhotoViewControllerDelegate; - -NS_ASSUME_NONNULL_BEGIN - -/** - * `NYTPhotoViewController` observes this notification. It expects an `id ` object as the object of the notification. - */ -extern NSString * const NYTPhotoViewControllerPhotoImageUpdatedNotification; - -/** - * The view controller controlling the display of a single photo object. - */ -@interface NYTPhotoViewController : UIViewController - -/** - * The internal scaling image view used to display the photo. - */ -@property (nonatomic, readonly) NYTScalingImageView *scalingImageView; - -/** - * The internal activity view shown while the image is loading. Set from the initializer. - */ -@property (nonatomic, readonly, nullable) UIView *loadingView; - -/** - * The gesture recognizer used to detect the double tap gesture used for zooming on photos. - */ -@property (nonatomic, readonly) UITapGestureRecognizer *doubleTapGestureRecognizer; - -/** - * The object that acts as the photo view controller's delegate. - */ -@property (nonatomic, weak, nullable) id delegate; - -/** - * The designated initializer that takes the photo and activity view. - * - * @param photo The photo object that this view controller manages. - * @param loadingView The view to display while the photo's image loads. This view will be hidden when the image loads. - * @param notificationCenter The notification center on which to observe the `NYTPhotoViewControllerPhotoImageUpdatedNotification`. - * - * @return A fully initialized object. - */ -- (instancetype)initWithPhoto:(nullable id )photo loadingView:(nullable UIView *)loadingView notificationCenter:(nullable NSNotificationCenter *)notificationCenter NS_DESIGNATED_INITIALIZER; - -@end - -@protocol NYTPhotoViewControllerDelegate - -@optional - -/** - * Called when a long press is recognized. - * - * @param photoViewController The `NYTPhotoViewController` instance that sent the delegate message. - * @param longPressGestureRecognizer The long press gesture recognizer that recognized the long press. - */ -- (void)photoViewController:(NYTPhotoViewController *)photoViewController didLongPressWithGestureRecognizer:(UILongPressGestureRecognizer *)longPressGestureRecognizer; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewController.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewController.m deleted file mode 100644 index 301854c98..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewController.m +++ /dev/null @@ -1,209 +0,0 @@ -// -// NYTPhotoViewController.m -// NYTPhotoViewer -// -// Created by Brian Capps on 2/11/15. -// -// - -#import "NYTPhotoViewController.h" -#import "NYTPhoto.h" -#import "NYTScalingImageView.h" - -#ifdef ANIMATED_GIF_SUPPORT -#import -#endif - -NSString * const NYTPhotoViewControllerPhotoImageUpdatedNotification = @"NYTPhotoViewControllerPhotoImageUpdatedNotification"; - -@interface NYTPhotoViewController () - -@property (nonatomic) id photo; - -- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; - -@property (nonatomic) NYTScalingImageView *scalingImageView; -@property (nonatomic) UIView *loadingView; -@property (nonatomic) NSNotificationCenter *notificationCenter; -@property (nonatomic) UITapGestureRecognizer *doubleTapGestureRecognizer; -@property (nonatomic) UILongPressGestureRecognizer *longPressGestureRecognizer; - -@end - -@implementation NYTPhotoViewController - -#pragma mark - NSObject - -- (void)dealloc { - _scalingImageView.delegate = nil; - - [_notificationCenter removeObserver:self]; -} - -#pragma mark - UIViewController - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - return [self initWithPhoto:nil loadingView:nil notificationCenter:nil]; -} - -- (instancetype)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - - if (self) { - [self commonInitWithPhoto:nil loadingView:nil notificationCenter:nil]; - } - - return self; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self.notificationCenter addObserver:self selector:@selector(photoImageUpdatedWithNotification:) name:NYTPhotoViewControllerPhotoImageUpdatedNotification object:nil]; - - self.scalingImageView.frame = self.view.bounds; - [self.view addSubview:self.scalingImageView]; - - [self.view addSubview:self.loadingView]; - [self.loadingView sizeToFit]; - - [self.view addGestureRecognizer:self.doubleTapGestureRecognizer]; - [self.view addGestureRecognizer:self.longPressGestureRecognizer]; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - self.scalingImageView.frame = self.view.bounds; - - [self.loadingView sizeToFit]; - self.loadingView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)); -} - -- (BOOL)prefersHomeIndicatorAutoHidden { - return YES; -} - -#pragma mark - NYTPhotoViewController - -- (instancetype)initWithPhoto:(id )photo loadingView:(UIView *)loadingView notificationCenter:(NSNotificationCenter *)notificationCenter { - self = [super initWithNibName:nil bundle:nil]; - - if (self) { - [self commonInitWithPhoto:photo loadingView:loadingView notificationCenter:notificationCenter]; - } - - return self; -} - -- (void)commonInitWithPhoto:(id )photo loadingView:(UIView *)loadingView notificationCenter:(NSNotificationCenter *)notificationCenter { - _photo = photo; - - if (photo.imageData) { - _scalingImageView = [[NYTScalingImageView alloc] initWithImageData:photo.imageData frame:CGRectZero]; - } - else { - UIImage *photoImage = photo.image ?: photo.placeholderImage; - _scalingImageView = [[NYTScalingImageView alloc] initWithImage:photoImage frame:CGRectZero]; - - if (!photoImage) { - [self setupLoadingView:loadingView]; - } - } - - _scalingImageView.delegate = self; - - _notificationCenter = notificationCenter; - - [self setupGestureRecognizers]; -} - -- (void)setupLoadingView:(UIView *)loadingView { - self.loadingView = loadingView; - if (!loadingView) { - UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; - [activityIndicator startAnimating]; - self.loadingView = activityIndicator; - } -} - -- (void)photoImageUpdatedWithNotification:(NSNotification *)notification { - id photo = notification.object; - if ([photo conformsToProtocol:@protocol(NYTPhoto)] && [photo isEqual:self.photo]) { - [self updateImage:photo.image imageData:photo.imageData]; - } -} - -- (void)updateImage:(UIImage *)image imageData:(NSData *)imageData { - if (imageData) { - [self.scalingImageView updateImageData:imageData]; - } - else { - [self.scalingImageView updateImage:image]; - } - - if (imageData || image) { - [self.loadingView removeFromSuperview]; - } else { - [self.view addSubview:self.loadingView]; - } -} - -#pragma mark - Gesture Recognizers - -- (void)setupGestureRecognizers { - self.doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didDoubleTapWithGestureRecognizer:)]; - self.doubleTapGestureRecognizer.numberOfTapsRequired = 2; - - self.longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(didLongPressWithGestureRecognizer:)]; -} - -- (void)didDoubleTapWithGestureRecognizer:(UITapGestureRecognizer *)recognizer { - CGPoint pointInView = [recognizer locationInView:self.scalingImageView.imageView]; - - CGFloat newZoomScale = self.scalingImageView.maximumZoomScale; - - if (self.scalingImageView.zoomScale >= self.scalingImageView.maximumZoomScale - || ABS(self.scalingImageView.zoomScale - self.scalingImageView.maximumZoomScale) <= 0.01) { - newZoomScale = self.scalingImageView.minimumZoomScale; - } - - CGSize scrollViewSize = self.scalingImageView.bounds.size; - - CGFloat width = scrollViewSize.width / newZoomScale; - CGFloat height = scrollViewSize.height / newZoomScale; - CGFloat originX = pointInView.x - (width / 2.0); - CGFloat originY = pointInView.y - (height / 2.0); - - CGRect rectToZoomTo = CGRectMake(originX, originY, width, height); - - [self.scalingImageView zoomToRect:rectToZoomTo animated:YES]; -} - -- (void)didLongPressWithGestureRecognizer:(UILongPressGestureRecognizer *)recognizer { - if ([self.delegate respondsToSelector:@selector(photoViewController:didLongPressWithGestureRecognizer:)]) { - if (recognizer.state == UIGestureRecognizerStateBegan) { - [self.delegate photoViewController:self didLongPressWithGestureRecognizer:recognizer]; - } - } -} - -#pragma mark - UIScrollViewDelegate - -- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { - return self.scalingImageView.imageView; -} - -- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view { - scrollView.panGestureRecognizer.enabled = YES; -} - -- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale { - // There is a bug, especially prevalent on iPhone 6 Plus, that causes zooming to render all other gesture recognizers ineffective. - // This bug is fixed by disabling the pan gesture recognizer of the scroll view when it is not needed. - if (scrollView.zoomScale == scrollView.minimumZoomScale) { - scrollView.panGestureRecognizer.enabled = NO; - } -} - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX.png b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX.png deleted file mode 100644 index 462d46344..000000000 Binary files a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX.png and /dev/null differ diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX@2x.png b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX@2x.png deleted file mode 100644 index 73c43cbfa..000000000 Binary files a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX@2x.png and /dev/null differ diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX@3x.png b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX@3x.png deleted file mode 100644 index 5d0af1c93..000000000 Binary files a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX@3x.png and /dev/null differ diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape.png b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape.png deleted file mode 100644 index b51390bfa..000000000 Binary files a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape.png and /dev/null differ diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape@2x.png b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape@2x.png deleted file mode 100644 index 9a9842e04..000000000 Binary files a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape@2x.png and /dev/null differ diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape@3x.png b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape@3x.png deleted file mode 100644 index 42c4e009b..000000000 Binary files a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape@3x.png and /dev/null differ diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.h deleted file mode 100644 index c28f4983c..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewer.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// NYTPhotoViewer.h -// NYTPhotoViewer -// -// Created by David Beck on 3/2/16. -// Copyright © 2016 NYTimes. All rights reserved. -// - -#import - -//! Project version number for NYTPhotoViewer. -FOUNDATION_EXPORT double NYTPhotoViewerVersionNumber; - -//! Project version string for NYTPhotoViewer. -FOUNDATION_EXPORT const unsigned char NYTPhotoViewerVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -// Protocols -#import -#import -#import -#import - -// Support -#import diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h deleted file mode 100644 index f1a6baf29..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// NYTPhotoViewerArrayDataSource.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/11/15. -// Copyright (c) 2017 The New York Times Company. All rights reserved. -// - -@import Foundation; - -#import "NYTPhotoViewerDataSource.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * A simple concrete implementation of `NYTPhotoViewerDataSource`, for use with an array of images. - */ -@interface NYTPhotoViewerArrayDataSource : NSObject - -@property (nonatomic, readonly) NSArray> *photos; - -/** - * The designated initializer that takes and stores an array of photos. - * - * @param photos An array of objects conforming to the `NYTPhoto` protocol. - * - * @return A fully initialized data source. - */ -- (instancetype)initWithPhotos:(nullable NSArray> *)photos NS_DESIGNATED_INITIALIZER; - -+ (instancetype)dataSourceWithPhotos:(nullable NSArray> *)photos; - -- (id)objectAtIndexedSubscript:(NSUInteger)idx; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m deleted file mode 100644 index 37d8ea53f..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m +++ /dev/null @@ -1,69 +0,0 @@ -// -// NYTPhotoViewerArrayDataSource.m -// NYTPhotoViewer -// -// Created by Brian Capps on 2/11/15. -// Copyright (c) 2017 The New York Times Company. All rights reserved. -// - -#import "NYTPhotoViewerArrayDataSource.h" - -@implementation NYTPhotoViewerArrayDataSource - -#pragma mark - NSObject - -- (instancetype)init { - return [self initWithPhotos:nil]; -} - -#pragma mark - NYTPhotosDataSource - -- (instancetype)initWithPhotos:(nullable NSArray> *)photos { - self = [super init]; - - if (self) { - if (photos == nil) { - _photos = @[]; - } else { - _photos = [photos copy]; - } - } - - return self; -} - -+ (instancetype)dataSourceWithPhotos:(nullable NSArray> *)photos { - return [[self alloc] initWithPhotos:photos]; -} - -#pragma mark - NSFastEnumeration - -- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id [])buffer count:(NSUInteger)length { - return [self.photos countByEnumeratingWithState:state objects:buffer count:length]; -} - -#pragma mark - NYTPhotosViewControllerDataSource - -- (NSNumber *)numberOfPhotos { - return @(self.photos.count); -} - -- (nullable id )photoAtIndex:(NSInteger)photoIndex { - if (photoIndex < self.photos.count) { - return self.photos[photoIndex]; - } - - return nil; -} - -- (NSInteger)indexOfPhoto:(id )photo { - return [self.photos indexOfObject:photo]; -} - -#pragma mark - Subscripting - -- (id)objectAtIndexedSubscript:(NSUInteger)idx { - return self.photos[idx]; -} - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerCore.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerCore.h deleted file mode 100644 index 55dc8a387..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerCore.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// NYTPhotoViewerCore.h -// NYTPhotoViewer -// -// Created by David Beck on 3/2/16. -// Copyright © 2016 NYTimes. All rights reserved. -// - -#import - -//! Project version number for NYTPhotoViewer. -FOUNDATION_EXPORT double NYTPhotoViewerCoreVersionNumber; - -//! Project version string for NYTPhotoViewer. -FOUNDATION_EXPORT const unsigned char NYTPhotoViewerCoreVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -// Protocols -#import -#import -#import -#import - -// Support -#import diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h deleted file mode 100644 index 65edcc568..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// NYTPhotoViewerSinglePhotoDataSource.h -// NYTPhotoViewer -// -// Created by Chris Dzombak on 1/27/17. -// Copyright © 2017 The New York Times Company. All rights reserved. -// - -@import Foundation; - -#import "NYTPhotoViewerDataSource.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * A simple concrete implementation of `NYTPhotoViewerDataSource`, for use with a single image. - */ -@interface NYTPhotoViewerSinglePhotoDataSource : NSObject - -@property (nonatomic, readonly) id photo; - -/** - * The designated initializer that takes and stores a single photo. - * - * @param photos An object conforming to the `NYTPhoto` protocol. - * - * @return A fully initialized data source. - */ -- (instancetype)initWithPhoto:(id)photo NS_DESIGNATED_INITIALIZER; - -+ (instancetype)dataSourceWithPhoto:(id)photo; - -/** - * Initializing without a photo is invalid. - */ -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.m deleted file mode 100644 index 3ec9104ea..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.m +++ /dev/null @@ -1,38 +0,0 @@ -// -// NYTPhotoViewerSinglePhotoDataSource.m -// NYTPhotoViewer -// -// Created by Chris Dzombak on 1/27/17. -// Copyright © 2017 The New York Times Company. All rights reserved. -// - -#import "NYTPhotoViewerSinglePhotoDataSource.h" - -@implementation NYTPhotoViewerSinglePhotoDataSource - -- (instancetype)initWithPhoto:(id)photo { - if ((self = [super init])) { - _photo = photo; - } - return self; -} - -+ (instancetype)dataSourceWithPhoto:(id)photo { - return [[self alloc] initWithPhoto:photo]; -} - -#pragma mark NYTPhotoViewerDataSource - -- (NSNumber *)numberOfPhotos { - return @(1); -} - -- (id)photoAtIndex:(NSInteger)photoIndex { - return self.photo; -} - -- (NSInteger)indexOfPhoto:(id)photo { - return 0; -} - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosOverlayView.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosOverlayView.h deleted file mode 100644 index f62c52dde..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosOverlayView.h +++ /dev/null @@ -1,65 +0,0 @@ -// -// NYTPhotosOverlayView.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/17/15. -// -// - -@import UIKit; - -NS_ASSUME_NONNULL_BEGIN - -/** - * A view that overlays an `NYTPhotosViewController`, and houses the left and right bar button items, a title, and a caption view. - */ -@interface NYTPhotosOverlayView : UIView - -/** - * The internal navigation bar used to set the bar button items and title of the overlay. - */ -@property (nonatomic, readonly) UINavigationBar *navigationBar; - -/** - * The title of the overlay. Centered between the left and right bar button items. - */ -@property (nonatomic, copy, nullable) NSString *title; - -/** - * The attributes of the overlay's title. - */ -@property(nonatomic, copy, nullable) NSDictionary *titleTextAttributes; - -/** - * The bar button item appearing at the top left of the overlay. - */ -@property (nonatomic, nullable) UIBarButtonItem *leftBarButtonItem; - -/** - * The bar button items appearing at the top left of the overlay. - */ -@property (nonatomic, copy, nullable) NSArray *leftBarButtonItems; - -/** - * The bar button item appearing at the top right of the overlay. - */ -@property (nonatomic, nullable) UIBarButtonItem *rightBarButtonItem; - -/** - * The bar button items appearing at the top right of the overlay. - */ -@property (nonatomic, copy, nullable) NSArray *rightBarButtonItems; - -/** - * A view representing the caption for the photo, which will be set to full width and locked to the bottom. Can be any `UIView` object, but is expected to respond to `intrinsicContentSize` appropriately to calculate height. - */ -@property (nonatomic, nullable) UIView *captionView; - -/** - * Whether the `captionView` should respect the safe area or not - */ -@property (nonatomic) BOOL captionViewRespectsSafeArea; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosOverlayView.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosOverlayView.m deleted file mode 100644 index 8ee2fb57c..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosOverlayView.m +++ /dev/null @@ -1,169 +0,0 @@ -// -// NYTPhotosOverlayView.m -// NYTPhotoViewer -// -// Created by Brian Capps on 2/17/15. -// -// - -#import "NYTPhotosOverlayView.h" -#import "NYTPhotoCaptionViewLayoutWidthHinting.h" - -@interface UIView (NYTSafeArea) - -@property (nonatomic, readonly, strong) UILayoutGuide *safeAreaLayoutGuide; - -@end - -@interface NYTPhotosOverlayView () - -@property (nonatomic) UINavigationItem *navigationItem; -@property (nonatomic) UINavigationBar *navigationBar; - -@end - -@implementation NYTPhotosOverlayView - -#pragma mark - UIView - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - - if (self) { - [self setupNavigationBar]; - } - - return self; -} - -// Pass the touches down to other views: http://stackoverflow.com/a/8104378 -- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { - UIView *hitView = [super hitTest:point withEvent:event]; - - if (hitView == self) { - return nil; - } - - return hitView; -} - -- (void)layoutSubviews { - // The navigation bar has a different intrinsic content size upon rotation, so we must update to that new size. - // Do it without animation to more closely match the behavior in `UINavigationController` - [UIView performWithoutAnimation:^{ - [self.navigationBar invalidateIntrinsicContentSize]; - [self.navigationBar layoutIfNeeded]; - }]; - - [super layoutSubviews]; - - if ([self.captionView conformsToProtocol:@protocol(NYTPhotoCaptionViewLayoutWidthHinting)]) { - [(id) self.captionView setPreferredMaxLayoutWidth:self.bounds.size.width]; - } -} - -#pragma mark - NYTPhotosOverlayView - -- (void)setupNavigationBar { - self.navigationBar = [[UINavigationBar alloc] init]; - self.navigationBar.translatesAutoresizingMaskIntoConstraints = NO; - - // Make navigation bar background fully transparent. - self.navigationBar.backgroundColor = [UIColor clearColor]; - self.navigationBar.barTintColor = nil; - self.navigationBar.translucent = YES; - self.navigationBar.shadowImage = [[UIImage alloc] init]; - [self.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; - - self.navigationItem = [[UINavigationItem alloc] initWithTitle:@""]; - self.navigationBar.items = @[self.navigationItem]; - - [self addSubview:self.navigationBar]; - - if ([self respondsToSelector:@selector(safeAreaLayoutGuide)]) { - NSLayoutConstraint *topConstraint = [self.navigationBar.topAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.topAnchor]; - NSLayoutConstraint *leftConstraint = [self.navigationBar.leftAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.leftAnchor]; - NSLayoutConstraint *rightConstraint = [self.navigationBar.rightAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.rightAnchor]; - [self addConstraints:@[topConstraint, leftConstraint, rightConstraint]]; - } else { - NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.navigationBar attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]; - NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.navigationBar attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]; - NSLayoutConstraint *horizontalPositionConstraint = [NSLayoutConstraint constraintWithItem:self.navigationBar attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; - [self addConstraints:@[topConstraint, widthConstraint, horizontalPositionConstraint]]; - } -} - -- (void)setCaptionView:(UIView *)captionView { - if (self.captionView == captionView) { - return; - } - - [self.captionView removeFromSuperview]; - - _captionView = captionView; - - self.captionView.translatesAutoresizingMaskIntoConstraints = NO; - [self addSubview:self.captionView]; - - if ([self respondsToSelector:@selector(safeAreaLayoutGuide)] && self.captionViewRespectsSafeArea) { - NSLayoutConstraint *bottomConstraint = [self.captionView.bottomAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.bottomAnchor]; - NSLayoutConstraint *leftConstraint = [self.captionView.leftAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.leftAnchor]; - NSLayoutConstraint *rightConstraint = [self.captionView.rightAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.rightAnchor]; - [self addConstraints:@[bottomConstraint, leftConstraint, rightConstraint]]; - } else { - NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.captionView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]; - NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.captionView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]; - NSLayoutConstraint *horizontalPositionConstraint = [NSLayoutConstraint constraintWithItem:self.captionView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; - [self addConstraints:@[bottomConstraint, widthConstraint, horizontalPositionConstraint]]; - } -} - -- (UIBarButtonItem *)leftBarButtonItem { - return self.navigationItem.leftBarButtonItem; -} - -- (void)setLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem { - [self.navigationItem setLeftBarButtonItem:leftBarButtonItem animated:NO]; -} - -- (NSArray *)leftBarButtonItems { - return self.navigationItem.leftBarButtonItems; -} - -- (void)setLeftBarButtonItems:(NSArray *)leftBarButtonItems { - [self.navigationItem setLeftBarButtonItems:leftBarButtonItems animated:NO]; -} - -- (UIBarButtonItem *)rightBarButtonItem { - return self.navigationItem.rightBarButtonItem; -} - -- (void)setRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem { - [self.navigationItem setRightBarButtonItem:rightBarButtonItem animated:NO]; -} - -- (NSArray *)rightBarButtonItems { - return self.navigationItem.rightBarButtonItems; -} - -- (void)setRightBarButtonItems:(NSArray *)rightBarButtonItems { - [self.navigationItem setRightBarButtonItems:rightBarButtonItems animated:NO]; -} - -- (NSString *)title { - return self.navigationItem.title; -} - -- (void)setTitle:(NSString *)title { - self.navigationItem.title = title; -} - -- (NSDictionary *)titleTextAttributes { - return self.navigationBar.titleTextAttributes; -} - -- (void)setTitleTextAttributes:(NSDictionary *)titleTextAttributes { - self.navigationBar.titleTextAttributes = titleTextAttributes; -} - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosViewController.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosViewController.h deleted file mode 100644 index be8a9845b..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosViewController.h +++ /dev/null @@ -1,303 +0,0 @@ -// -// NYTPhotosViewController.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/10/15. -// Copyright (c) 2015 NYTimes. All rights reserved. -// - -@import UIKit; - -@class NYTPhotosOverlayView; - -@protocol NYTPhoto; -@protocol NYTPhotosViewControllerDelegate; -@protocol NYTPhotoViewerDataSource; - -NS_ASSUME_NONNULL_BEGIN - -/** - * Notification name issued when this `NYTPhotosViewController` navigates to a different photo. - * - * Includes the `NYTPhotosViewController` instance, as the notification's object. - */ -extern NSString * const NYTPhotosViewControllerDidNavigateToPhotoNotification; - -/** - * Notification name issued when this `NYTPhotosViewController` is about to be dismissed. - * - * Includes the `NYTPhotosViewController` instance, as the notification's object. - */ -extern NSString * const NYTPhotosViewControllerWillDismissNotification; - -/** - * Notification name issued when this `NYTPhotosViewController` has been dismissed. - * - * Includes the `NYTPhotosViewController` instance, as the notification's object. - */ -extern NSString * const NYTPhotosViewControllerDidDismissNotification; - -@interface NYTPhotosViewController : UIViewController - -/** - * The pan gesture recognizer used for panning to dismiss the photo. Disable to stop the pan-to-dismiss behavior. - */ -@property (nonatomic, readonly) UIPanGestureRecognizer *panGestureRecognizer; - -/** - * The tap gesture recognizer used to hide the overlay, including the caption, left and right bar button items, and title, all at once. Disable to always show the overlay. - */ -@property (nonatomic, readonly) UITapGestureRecognizer *singleTapGestureRecognizer; - -/** - * The internal page view controller used for swiping horizontally, photo to photo. Created during `viewDidLoad`. - */ -@property (nonatomic, readonly, nullable) UIPageViewController *pageViewController; - -/** - * The data source underlying this PhotosViewController. - * - * After setting a new data source, you must call `-reloadPhotosAnimated:`. - */ -@property (nonatomic, weak, nullable) id dataSource; - -/** - * The object conforming to `NYTPhoto` that is currently being displayed by the `pageViewController`. - * - * This photo will be one of the photos from the data source. - */ -@property (nonatomic, readonly, nullable) id currentlyDisplayedPhoto; - -/** - * The overlay view displayed over photos. Created during `viewDidLoad`. - */ -@property (nonatomic, readonly, nullable) NYTPhotosOverlayView *overlayView; - -/** - * The left bar button item overlaying the photo. - */ -@property (nonatomic, nullable) UIBarButtonItem *leftBarButtonItem; - -/** - * The left bar button items overlaying the photo. - */ -@property (nonatomic, copy, nullable) NSArray *leftBarButtonItems; - -/** - * The right bar button item overlaying the photo. - */ -@property (nonatomic, nullable) UIBarButtonItem *rightBarButtonItem; - -/** - * The right bar button items overlaying the photo. - */ -@property (nonatomic, copy, nullable) NSArray *rightBarButtonItems; - -/** - * The object that acts as the delegate of the `NYTPhotosViewController`. - */ -@property (nonatomic, weak, nullable) id delegate; - -/** - * Initializes a `PhotosViewController` with the given data source, initially displaying the first photo in the data source. - * - * @param dataSource The data source underlying this photo viewer. - * - * @return A fully initialized `PhotosViewController` instance. - */ -- (instancetype)initWithDataSource:(id )dataSource; - -/** - * Initializes a `PhotosViewController` with the given data source and delegate, initially displaying the photo at the given index in the data source. - * - * @param dataSource The data source underlying this photo viewer. - * @param initialPhotoIndex The photo to display initially. If outside the bounds of the data source, the first photo from the data source will be displayed. - * @param delegate The delegate for this `NYTPhotosViewController`. - * - * @return A fully initialized `PhotosViewController` instance. - */ -- (instancetype)initWithDataSource:(id )dataSource initialPhotoIndex:(NSInteger)initialPhotoIndex delegate:(nullable id )delegate; - -/** - * Initializes a `PhotosViewController` with the given data source and delegate, initially displaying the given photo. - * - * @param dataSource The data source underlying this photo viewer. - * @param initialPhoto The photo to display initially. Must be a member of the data source. If `nil` or not a member of the data source, the first photo from the data source will be displayed. - * @param delegate The delegate for this `NYTPhotosViewController`. - * - * @return A fully initialized `PhotosViewController` instance. - */ -- (instancetype)initWithDataSource:(id )dataSource initialPhoto:(nullable id )initialPhoto delegate:(nullable id )delegate NS_DESIGNATED_INITIALIZER; - -/** - * Displays the specified photo. Can be called before the view controller is displayed. Calling with a photo not contained within the data source has no effect. - * - * @param photo The photo to make the currently displayed photo. - * @param animated Whether to animate the transition to the new photo. - */ -- (void)displayPhoto:(nullable id )photo animated:(BOOL)animated; - -/** - * Informs the photo viewer that the photo in the data source at this index has changed. - * - * In response, the photo viewer will retrieve and update the overlay information and the photo itself. - * - * This method has no effect if the given index is out of bounds in the data source. - * - * @param photo The index of the photo which changed in the data source. - */ -- (void)updatePhotoAtIndex:(NSInteger)photoIndex; - -/** - * Informs the photo viewer that the given photo in the data source has changed. - * - * In response, the photo viewer will retrieve and update the overlay information and the photo itself. - * - * This method has no effect if the photo doesn't exist in the data source. - * - * @param photo The photo which changed in the data source. - */ -- (void)updatePhoto:(id)photo; - -/** - * Tells the photo viewer to reload all data from its data source. - * - * @param animated Whether any resulting transitions should be animated. - */ -- (void)reloadPhotosAnimated:(BOOL)animated; - -@end - -/** - * A protocol of entirely optional methods called for view-related configuration and lifecycle events by an `NYTPhotosViewController` instance. - */ -@protocol NYTPhotosViewControllerDelegate - -@optional - -/** - * Called when a new photo is displayed through a swipe gesture. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - * @param photo The photo object that was just displayed. - * @param photoIndex The index of the photo that was just displayed. - */ -- (void)photosViewController:(NYTPhotosViewController *)photosViewController didNavigateToPhoto:(id )photo atIndex:(NSUInteger)photoIndex; - -/** - * Called immediately before the `NYTPhotosViewController` is about to start a user-initiated dismissal. - * This will be the beginning of the interactive panning to dismiss, if it is enabled and performed. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - */ -- (void)photosViewControllerWillDismiss:(NYTPhotosViewController *)photosViewController; - -/** - * Called immediately after the photos view controller has been dismissed by the user. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - */ -- (void)photosViewControllerDidDismiss:(NYTPhotosViewController *)photosViewController; - -/** - * Returns a view to display over a photo, full width, locked to the bottom, representing the caption for the photo. - * - * Can be any `UIView` object, but the view returned is expected to respond to `intrinsicContentSize` appropriately to calculate height. - * - * @note Your implementation can get caption information from the appropriate properties on the given `NYTPhoto`. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - * @param photo The photo object over which to display the caption view. - * - * @return A view to display as the caption for the photo. Return `nil` to show a default view generated from the caption properties on the photo object. - */ -- (UIView * _Nullable)photosViewController:(NYTPhotosViewController *)photosViewController captionViewForPhoto:(id )photo; - -/** - * Returns whether the caption view should respect the safe area. - * - * @note If this method is not implemented it will default to `YES`. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - * @param photo The photo object over which to display the caption view. - * - * @return A `BOOL` indicating whether the caption view should respect the safe area for the given photo or not. - */ -- (BOOL)photosViewController:(NYTPhotosViewController *)photosViewController captionViewRespectsSafeAreaForPhoto:(id )photo; - -/** - * Returns a string to display as the title in the navigation-bar area for a photo. - * - * This small area of the screen is not intended to display a caption or similar information about the photo itself. (NYTPhotoViewer is designed to provide this information in the caption view, and as such the `NYTPhoto` protocol provides properties for a title, summary, and credit for each photo.) Instead, consider using this delegate method to customize how your app displays the user's progress through a set of photos. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - * @param photo The photo object for which to display the title. - * @param photoIndex The index of the photo. - * @param totalPhotoCount The number of photos being displayed by the photo viewer, or `nil` if the total number of photos is not known. The given number packages an `NSInteger`. - * - * @return The text to display as the navigation-item title for the given photo. Return `nil` to show a default title like "1 of 4" indicating progress in a slideshow, or an empty string to hide this text entirely. - */ -- (NSString * _Nullable)photosViewController:(NYTPhotosViewController *)photosViewController titleForPhoto:(id )photo atIndex:(NSInteger)photoIndex totalPhotoCount:(nullable NSNumber *)totalPhotoCount; - -/** - * Returns a view to display while a photo is loading. Can be any `UIView` object, but is expected to respond to `sizeToFit` appropriately. This view will be sized and centered in the blank area, and hidden when the photo image or its placeholder is loaded. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - * @param photo The photo object over which to display the activity view. - * - * @return A view to display while the photo is loading. Return `nil` to show a default white `UIActivityIndicatorView`. - */ -- (UIView * _Nullable)photosViewController:(NYTPhotosViewController *)photosViewController loadingViewForPhoto:(id )photo; - -/** - * Returns the view from which to animate for a given object conforming to the `NYTPhoto` protocol. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - * @param photo The photo for which the animation will occur. - * - * @return The view to animate out of or into for the given photo. - */ -- (UIView * _Nullable)photosViewController:(NYTPhotosViewController *)photosViewController referenceViewForPhoto:(id )photo; - -/** -* Returns the maximum zoom scale for a given object conforming to the `NYTPhoto` protocol. -* -* @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. -* @param photo The photo for which the maximum zoom scale is requested. -* -* @return The maximum zoom scale for the given photo. -*/ -- (CGFloat)photosViewController:(NYTPhotosViewController *)photosViewController maximumZoomScaleForPhoto:(id )photo; - -/** - * Called when a photo is long pressed. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - * @param photo The photo being displayed that was long pressed. - * @param longPressGestureRecognizer The gesture recognizer that detected the long press. - * - * @return `YES` if the long press was handled by the client, `NO` if the default `UIMenuController` with a Copy action is desired. - */ -- (BOOL)photosViewController:(NYTPhotosViewController *)photosViewController handleLongPressForPhoto:(id )photo withGestureRecognizer:(UILongPressGestureRecognizer *)longPressGestureRecognizer; - -/** - * Called when the action button is tapped. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - * @param photo The photo being displayed when the action button was tapped. - * - * @return `YES` if the action button tap was handled by the client, `NO` if the default `UIActivityViewController` is desired. - */ -- (BOOL)photosViewController:(NYTPhotosViewController *)photosViewController handleActionButtonTappedForPhoto:(id )photo; - -/** - * Called after the default `UIActivityViewController` is presented and successfully completes an action with a specified activity type. - * - * @param photosViewController The `NYTPhotosViewController` instance that sent the delegate message. - * @param activityType The activity type that was successfully shared. - */ -- (void)photosViewController:(NYTPhotosViewController *)photosViewController actionCompletedWithActivityType:(NSString * _Nullable)activityType; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosViewController.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosViewController.m deleted file mode 100644 index 79e3281b0..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTPhotosViewController.m +++ /dev/null @@ -1,601 +0,0 @@ -// -// NYTPhotosViewController.m -// NYTPhotoViewer -// -// Created by Brian Capps on 2/10/15. -// Copyright (c) 2015 NYTimes. All rights reserved. -// - -#import "NYTPhotosViewController.h" -#import "NYTPhotoViewerDataSource.h" -#import "NYTPhotoViewerArrayDataSource.h" -#import "NYTPhotoViewController.h" -#import "NYTPhotoTransitionController.h" -#import "NYTScalingImageView.h" -#import "NYTPhoto.h" -#import "NYTPhotosOverlayView.h" -#import "NYTPhotoCaptionView.h" -#import "NSBundle+NYTPhotoViewer.h" - -#ifdef ANIMATED_GIF_SUPPORT -#import -#endif - -NSString * const NYTPhotosViewControllerDidNavigateToPhotoNotification = @"NYTPhotosViewControllerDidNavigateToPhotoNotification"; -NSString * const NYTPhotosViewControllerWillDismissNotification = @"NYTPhotosViewControllerWillDismissNotification"; -NSString * const NYTPhotosViewControllerDidDismissNotification = @"NYTPhotosViewControllerDidDismissNotification"; - -static const CGFloat NYTPhotosViewControllerOverlayAnimationDuration = 0.2; -static const CGFloat NYTPhotosViewControllerInterPhotoSpacing = 16.0; -static const UIEdgeInsets NYTPhotosViewControllerCloseButtonImageInsets = {3, 0, -3, 0}; - -@interface NYTPhotosViewController () - -- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; - -@property (nonatomic) UIPageViewController *pageViewController; -@property (nonatomic) NYTPhotoTransitionController *transitionController; -@property (nonatomic) UIPopoverController *activityPopoverController; - -@property (nonatomic) UIPanGestureRecognizer *panGestureRecognizer; -@property (nonatomic) UITapGestureRecognizer *singleTapGestureRecognizer; - -@property (nonatomic) NYTPhotosOverlayView *overlayView; - -/// A custom notification center to scope internal notifications to this `NYTPhotosViewController` instance. -@property (nonatomic) NSNotificationCenter *notificationCenter; - -@property (nonatomic) BOOL shouldHandleLongPress; -@property (nonatomic) BOOL overlayWasHiddenBeforeTransition; - -@property (nonatomic, readonly) NYTPhotoViewController *currentPhotoViewController; -@property (nonatomic, readonly) UIView *referenceViewForCurrentPhoto; -@property (nonatomic, readonly) CGPoint boundsCenterPoint; - -@property (nonatomic, nullable) id initialPhoto; - -@end - -@implementation NYTPhotosViewController - -#pragma mark - NSObject - -- (void)dealloc { - _pageViewController.dataSource = nil; - _pageViewController.delegate = nil; -} - -#pragma mark - NSObject(UIResponderStandardEditActions) - -- (void)copy:(id)sender { - [[UIPasteboard generalPasteboard] setImage:self.currentlyDisplayedPhoto.image]; -} - -#pragma mark - UIResponder - -- (BOOL)canBecomeFirstResponder { - return YES; -} - -- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { - if (self.shouldHandleLongPress && action == @selector(copy:) && self.currentlyDisplayedPhoto.image) { - return YES; - } - - return NO; -} - -#pragma mark - UIViewController - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - return [self initWithDataSource:[NYTPhotoViewerArrayDataSource dataSourceWithPhotos:@[]] initialPhoto:nil delegate:nil]; -} - -- (instancetype)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - - if (self) { - [self commonInitWithDataSource:[NYTPhotoViewerArrayDataSource dataSourceWithPhotos:@[]] initialPhoto:nil delegate:nil]; - } - - return self; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self configurePageViewControllerWithInitialPhoto]; - - self.view.tintColor = [UIColor whiteColor]; - self.view.backgroundColor = [UIColor blackColor]; - self.pageViewController.view.backgroundColor = [UIColor clearColor]; - - [self.pageViewController.view addGestureRecognizer:self.panGestureRecognizer]; - [self.pageViewController.view addGestureRecognizer:self.singleTapGestureRecognizer]; - - [self addChildViewController:self.pageViewController]; - [self.view addSubview:self.pageViewController.view]; - [self.pageViewController didMoveToParentViewController:self]; - - [self addOverlayView]; - - self.transitionController.startingView = self.referenceViewForCurrentPhoto; - - UIView *endingView; - if (self.currentlyDisplayedPhoto.image || self.currentlyDisplayedPhoto.placeholderImage) { - endingView = self.currentPhotoViewController.scalingImageView.imageView; - } - - self.transitionController.endingView = endingView; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - if (!self.overlayWasHiddenBeforeTransition) { - [self setOverlayViewHidden:NO animated:YES]; - } -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - self.pageViewController.view.frame = self.view.bounds; - self.overlayView.frame = self.view.bounds; -} - -- (BOOL)prefersStatusBarHidden { - return YES; -} - -- (BOOL)prefersHomeIndicatorAutoHidden { - return YES; -} - -- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation { - return UIStatusBarAnimationFade; -} - -- (void)dismissViewControllerAnimated:(BOOL)animated completion:(void (^)(void))completion { - [self dismissViewControllerAnimated:animated userInitiated:NO completion:completion]; -} - -#pragma mark - NYTPhotosViewController - -- (instancetype)initWithDataSource:(id )dataSource { - return [self initWithDataSource:dataSource initialPhoto:nil delegate:nil]; -} - -- (instancetype)initWithDataSource:(id )dataSource initialPhotoIndex:(NSInteger)initialPhotoIndex delegate:(nullable id )delegate { - id initialPhoto = [dataSource photoAtIndex:initialPhotoIndex]; - - return [self initWithDataSource:dataSource initialPhoto:initialPhoto delegate:delegate]; -} - -- (instancetype)initWithDataSource:(id )dataSource initialPhoto:(id _Nullable)initialPhoto delegate:(nullable id )delegate { - self = [super initWithNibName:nil bundle:nil]; - - if (self) { - [self commonInitWithDataSource:dataSource initialPhoto:initialPhoto delegate:delegate]; - } - - return self; -} - -- (void)commonInitWithDataSource:(id )dataSource initialPhoto:(id _Nullable)initialPhoto delegate:(nullable id )delegate { - _dataSource = dataSource; - _delegate = delegate; - _initialPhoto = initialPhoto; - - _panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didPanWithGestureRecognizer:)]; - _singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didSingleTapWithGestureRecognizer:)]; - - _transitionController = [[NYTPhotoTransitionController alloc] init]; - self.modalPresentationStyle = UIModalPresentationCustom; - self.transitioningDelegate = _transitionController; - self.modalPresentationCapturesStatusBarAppearance = YES; - - _overlayView = ({ - NYTPhotosOverlayView *v = [[NYTPhotosOverlayView alloc] initWithFrame:CGRectZero]; - v.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"NYTPhotoViewerCloseButtonX" inBundle:[NSBundle nyt_photoViewerResourceBundle] compatibleWithTraitCollection:nil] landscapeImagePhone:[UIImage imageNamed:@"NYTPhotoViewerCloseButtonXLandscape" inBundle:[NSBundle nyt_photoViewerResourceBundle] compatibleWithTraitCollection:nil] style:UIBarButtonItemStylePlain target:self action:@selector(doneButtonTapped:)]; - v.leftBarButtonItem.imageInsets = NYTPhotosViewControllerCloseButtonImageInsets; - v.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(actionButtonTapped:)]; - v; - }); - - _notificationCenter = [NSNotificationCenter new]; - - self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:@{UIPageViewControllerOptionInterPageSpacingKey: @(NYTPhotosViewControllerInterPhotoSpacing)}]; - - self.pageViewController.delegate = self; - self.pageViewController.dataSource = self; -} - -- (void)configurePageViewControllerWithInitialPhoto { - NYTPhotoViewController *initialPhotoViewController; - - if (self.initialPhoto != nil && [self.dataSource indexOfPhoto:self.initialPhoto] != NSNotFound) { - initialPhotoViewController = [self newPhotoViewControllerForPhoto:self.initialPhoto]; - } - else { - initialPhotoViewController = [self newPhotoViewControllerForPhoto:[self.dataSource photoAtIndex:0]]; - } - - [self setCurrentlyDisplayedViewController:initialPhotoViewController animated:NO]; -} - -- (void)addOverlayView { - NSAssert(self.overlayView != nil, @"_overlayView must be set during initialization, to provide bar button items for this %@", NSStringFromClass([self class])); - - UIColor *textColor = self.view.tintColor ?: [UIColor whiteColor]; - self.overlayView.titleTextAttributes = @{NSForegroundColorAttributeName: textColor}; - - [self updateOverlayInformation]; - [self.view addSubview:self.overlayView]; - - [self setOverlayViewHidden:YES animated:NO]; -} - - -- (void)updateOverlayInformation { - NSString *overlayTitle; - NSUInteger photoIndex = [self.dataSource indexOfPhoto:self.currentlyDisplayedPhoto]; - NSInteger displayIndex = photoIndex + 1; - - if ([self.delegate respondsToSelector:@selector(photosViewController:titleForPhoto:atIndex:totalPhotoCount:)]) { - overlayTitle = [self.delegate photosViewController:self titleForPhoto:self.currentlyDisplayedPhoto atIndex:photoIndex totalPhotoCount:self.dataSource.numberOfPhotos]; - } - - if (!overlayTitle && self.dataSource.numberOfPhotos == nil) { - overlayTitle = [NSString localizedStringWithFormat:@"%lu", (unsigned long)displayIndex]; - } - - if (!overlayTitle && self.dataSource.numberOfPhotos.integerValue > 1) { - overlayTitle = [NSString localizedStringWithFormat:NSLocalizedString(@"%lu of %lu", nil), (unsigned long)displayIndex, (unsigned long)self.dataSource.numberOfPhotos.integerValue]; - } - - self.overlayView.title = overlayTitle; - - UIView *captionView; - if ([self.delegate respondsToSelector:@selector(photosViewController:captionViewForPhoto:)]) { - captionView = [self.delegate photosViewController:self captionViewForPhoto:self.currentlyDisplayedPhoto]; - } - - if (!captionView) { - captionView = [[NYTPhotoCaptionView alloc] initWithAttributedTitle:self.currentlyDisplayedPhoto.attributedCaptionTitle attributedSummary:self.currentlyDisplayedPhoto.attributedCaptionSummary attributedCredit:self.currentlyDisplayedPhoto.attributedCaptionCredit]; - } - - BOOL captionViewRespectsSafeArea = YES; - if ([self.delegate respondsToSelector:@selector(photosViewController:captionViewRespectsSafeAreaForPhoto:)]) { - captionViewRespectsSafeArea = [self.delegate photosViewController:self captionViewRespectsSafeAreaForPhoto:self.currentlyDisplayedPhoto]; - } - - self.overlayView.captionViewRespectsSafeArea = captionViewRespectsSafeArea; - self.overlayView.captionView = captionView; -} - -- (void)doneButtonTapped:(id)sender { - [self dismissViewControllerAnimated:YES userInitiated:YES completion:nil]; -} - -- (void)actionButtonTapped:(id)sender { - BOOL clientDidHandle = NO; - - if ([self.delegate respondsToSelector:@selector(photosViewController:handleActionButtonTappedForPhoto:)]) { - clientDidHandle = [self.delegate photosViewController:self handleActionButtonTappedForPhoto:self.currentlyDisplayedPhoto]; - } - - if (!clientDidHandle && (self.currentlyDisplayedPhoto.image || self.currentlyDisplayedPhoto.imageData)) { - UIImage *image = self.currentlyDisplayedPhoto.image ? self.currentlyDisplayedPhoto.image : [UIImage imageWithData:self.currentlyDisplayedPhoto.imageData]; - UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[image] applicationActivities:nil]; - activityViewController.popoverPresentationController.barButtonItem = sender; - activityViewController.completionWithItemsHandler = ^(NSString * __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError) { - if (completed && [self.delegate respondsToSelector:@selector(photosViewController:actionCompletedWithActivityType:)]) { - [self.delegate photosViewController:self actionCompletedWithActivityType:activityType]; - } - }; - - [self displayActivityViewController:activityViewController animated:YES]; - } -} - -- (void)displayActivityViewController:(UIActivityViewController *)controller animated:(BOOL)animated { - - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { - [self presentViewController:controller animated:animated completion:nil]; - } - else { - controller.popoverPresentationController.barButtonItem = self.rightBarButtonItem; - [self presentViewController:controller animated:animated completion:nil]; - } -} - -- (UIBarButtonItem *)leftBarButtonItem { - return self.overlayView.leftBarButtonItem; -} - -- (void)setLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem { - self.overlayView.leftBarButtonItem = leftBarButtonItem; -} - -- (NSArray *)leftBarButtonItems { - return self.overlayView.leftBarButtonItems; -} - -- (void)setLeftBarButtonItems:(NSArray *)leftBarButtonItems { - self.overlayView.leftBarButtonItems = leftBarButtonItems; -} - -- (UIBarButtonItem *)rightBarButtonItem { - return self.overlayView.rightBarButtonItem; -} - -- (void)setRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem { - self.overlayView.rightBarButtonItem = rightBarButtonItem; -} - -- (NSArray *)rightBarButtonItems { - return self.overlayView.rightBarButtonItems; -} - -- (void)setRightBarButtonItems:(NSArray *)rightBarButtonItems { - self.overlayView.rightBarButtonItems = rightBarButtonItems; -} - -- (void)displayPhoto:(id )photo animated:(BOOL)animated { - if ([self.dataSource indexOfPhoto:photo] == NSNotFound) { - return; - } - - NYTPhotoViewController *photoViewController = [self newPhotoViewControllerForPhoto:photo]; - [self setCurrentlyDisplayedViewController:photoViewController animated:animated]; - [self updateOverlayInformation]; -} - -- (void)updatePhotoAtIndex:(NSInteger)photoIndex { - id photo = [self.dataSource photoAtIndex:photoIndex]; - if (!photo) { - return; - } - - [self updatePhoto:photo]; -} - -- (void)updatePhoto:(id)photo { - if ([self.dataSource indexOfPhoto:photo] == NSNotFound) { - return; - } - - [self.notificationCenter postNotificationName:NYTPhotoViewControllerPhotoImageUpdatedNotification object:photo]; - - if ([self.currentlyDisplayedPhoto isEqual:photo]) { - [self updateOverlayInformation]; - } -} - -- (void)reloadPhotosAnimated:(BOOL)animated { - id newCurrentPhoto; - - if ([self.dataSource indexOfPhoto:self.currentlyDisplayedPhoto] != NSNotFound) { - newCurrentPhoto = self.currentlyDisplayedPhoto; - } else { - newCurrentPhoto = [self.dataSource photoAtIndex:0]; - } - - [self displayPhoto:newCurrentPhoto animated:animated]; - - if (self.overlayView.hidden) { - [self setOverlayViewHidden:NO animated:animated]; - } -} - -#pragma mark - Gesture Recognizers - -- (void)didSingleTapWithGestureRecognizer:(UITapGestureRecognizer *)tapGestureRecognizer { - [self setOverlayViewHidden:!self.overlayView.hidden animated:YES]; -} - -- (void)didPanWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer { - if (panGestureRecognizer.state == UIGestureRecognizerStateBegan) { - self.transitionController.forcesNonInteractiveDismissal = NO; - [self dismissViewControllerAnimated:YES userInitiated:YES completion:nil]; - } - else { - self.transitionController.forcesNonInteractiveDismissal = YES; - [self.transitionController didPanWithPanGestureRecognizer:panGestureRecognizer viewToPan:self.pageViewController.view anchorPoint:self.boundsCenterPoint]; - } -} - -#pragma mark - View Controller Dismissal - -- (void)dismissViewControllerAnimated:(BOOL)animated userInitiated:(BOOL)isUserInitiated completion:(void (^)(void))completion { - if (self.presentedViewController) { - [super dismissViewControllerAnimated:animated completion:completion]; - return; - } - - UIView *startingView; - if (self.currentlyDisplayedPhoto.image || self.currentlyDisplayedPhoto.placeholderImage || self.currentlyDisplayedPhoto.imageData) { - startingView = self.currentPhotoViewController.scalingImageView.imageView; - } - - self.transitionController.startingView = startingView; - self.transitionController.endingView = self.referenceViewForCurrentPhoto; - - self.overlayWasHiddenBeforeTransition = self.overlayView.hidden; - [self setOverlayViewHidden:YES animated:animated]; - - // Cocoa convention is not to call delegate methods when you do something directly in code, - // so we'll not call delegate methods if this is a programmatic dismissal: - BOOL const shouldSendDelegateMessages = isUserInitiated; - - if (shouldSendDelegateMessages && [self.delegate respondsToSelector:@selector(photosViewControllerWillDismiss:)]) { - [self.delegate photosViewControllerWillDismiss:self]; - } - - [[NSNotificationCenter defaultCenter] postNotificationName:NYTPhotosViewControllerWillDismissNotification object:self]; - - [super dismissViewControllerAnimated:animated completion:^{ - BOOL isStillOnscreen = self.view.window != nil; // Happens when the dismissal is canceled. - - if (isStillOnscreen && !self.overlayWasHiddenBeforeTransition) { - [self setOverlayViewHidden:NO animated:YES]; - } - - if (!isStillOnscreen) { - if (shouldSendDelegateMessages && [self.delegate respondsToSelector:@selector(photosViewControllerDidDismiss:)]) { - [self.delegate photosViewControllerDidDismiss:self]; - } - - [[NSNotificationCenter defaultCenter] postNotificationName:NYTPhotosViewControllerDidDismissNotification object:self]; - } - - if (completion) { - completion(); - } - }]; -} - -#pragma mark - Convenience - -- (void)setCurrentlyDisplayedViewController:(UIViewController *)viewController animated:(BOOL)animated { - if (!viewController) { - return; - } - - if ([viewController.photo isEqual:self.currentlyDisplayedPhoto]) { - animated = NO; - } - - NSInteger currentIdx = [self.dataSource indexOfPhoto:self.currentlyDisplayedPhoto]; - NSInteger newIdx = [self.dataSource indexOfPhoto:viewController.photo]; - UIPageViewControllerNavigationDirection direction = (newIdx < currentIdx) ? UIPageViewControllerNavigationDirectionReverse : UIPageViewControllerNavigationDirectionForward; - - [self.pageViewController setViewControllers:@[viewController] direction:direction animated:animated completion:nil]; -} - -- (void)setOverlayViewHidden:(BOOL)hidden animated:(BOOL)animated { - if (hidden == self.overlayView.hidden) { - return; - } - - if (animated) { - self.overlayView.hidden = NO; - - self.overlayView.alpha = hidden ? 1.0 : 0.0; - - [UIView animateWithDuration:NYTPhotosViewControllerOverlayAnimationDuration delay:0.0 options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionAllowUserInteraction animations:^{ - self.overlayView.alpha = hidden ? 0.0 : 1.0; - } completion:^(BOOL finished) { - self.overlayView.alpha = 1.0; - self.overlayView.hidden = hidden; - }]; - } - else { - self.overlayView.hidden = hidden; - } -} - -- (NYTPhotoViewController *)newPhotoViewControllerForPhoto:(id )photo { - if (photo) { - UIView *loadingView; - if ([self.delegate respondsToSelector:@selector(photosViewController:loadingViewForPhoto:)]) { - loadingView = [self.delegate photosViewController:self loadingViewForPhoto:photo]; - } - - NYTPhotoViewController *photoViewController = [[NYTPhotoViewController alloc] initWithPhoto:photo loadingView:loadingView notificationCenter:self.notificationCenter]; - photoViewController.delegate = self; - [self.singleTapGestureRecognizer requireGestureRecognizerToFail:photoViewController.doubleTapGestureRecognizer]; - - if([self.delegate respondsToSelector:@selector(photosViewController:maximumZoomScaleForPhoto:)]) { - CGFloat maximumZoomScale = [self.delegate photosViewController:self maximumZoomScaleForPhoto:photo]; - photoViewController.scalingImageView.maximumZoomScale = maximumZoomScale; - } - - return photoViewController; - } - - return nil; -} - -- (void)didNavigateToPhoto:(id )photo { - if ([self.delegate respondsToSelector:@selector(photosViewController:didNavigateToPhoto:atIndex:)]) { - [self.delegate photosViewController:self didNavigateToPhoto:photo atIndex:[self.dataSource indexOfPhoto:photo]]; - } - - [[NSNotificationCenter defaultCenter] postNotificationName:NYTPhotosViewControllerDidNavigateToPhotoNotification object:self]; -} - -- (id )currentlyDisplayedPhoto { - return self.currentPhotoViewController.photo; -} - -- (NYTPhotoViewController *)currentPhotoViewController { - return self.pageViewController.viewControllers.firstObject; -} - -- (UIView *)referenceViewForCurrentPhoto { - if ([self.delegate respondsToSelector:@selector(photosViewController:referenceViewForPhoto:)]) { - return [self.delegate photosViewController:self referenceViewForPhoto:self.currentlyDisplayedPhoto]; - } - - return nil; -} - -- (CGPoint)boundsCenterPoint { - return CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)); -} - -#pragma mark - NYTPhotoViewControllerDelegate - -- (void)photoViewController:(NYTPhotoViewController *)photoViewController didLongPressWithGestureRecognizer:(UILongPressGestureRecognizer *)longPressGestureRecognizer { - self.shouldHandleLongPress = NO; - - BOOL clientDidHandle = NO; - if ([self.delegate respondsToSelector:@selector(photosViewController:handleLongPressForPhoto:withGestureRecognizer:)]) { - clientDidHandle = [self.delegate photosViewController:self handleLongPressForPhoto:photoViewController.photo withGestureRecognizer:longPressGestureRecognizer]; - } - - self.shouldHandleLongPress = !clientDidHandle; - - if (self.shouldHandleLongPress) { - UIMenuController *menuController = [UIMenuController sharedMenuController]; - CGRect targetRect = CGRectZero; - targetRect.origin = [longPressGestureRecognizer locationInView:longPressGestureRecognizer.view]; - [menuController setTargetRect:targetRect inView:longPressGestureRecognizer.view]; - [menuController setMenuVisible:YES animated:YES]; - } -} - -#pragma mark - UIPageViewControllerDataSource - -- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { - NSUInteger photoIndex = [self.dataSource indexOfPhoto:viewController.photo]; - if (photoIndex == 0 || photoIndex == NSNotFound) { - return nil; - } - - return [self newPhotoViewControllerForPhoto:[self.dataSource photoAtIndex:(photoIndex - 1)]]; -} - -- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { - NSUInteger photoIndex = [self.dataSource indexOfPhoto:viewController.photo]; - if (photoIndex == NSNotFound) { - return nil; - } - - return [self newPhotoViewControllerForPhoto:[self.dataSource photoAtIndex:(photoIndex + 1)]]; -} - -#pragma mark - UIPageViewControllerDelegate - -- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed { - if (completed) { - [self updateOverlayInformation]; - - UIViewController *photoViewController = pageViewController.viewControllers.firstObject; - [self didNavigateToPhoto:photoViewController.photo]; - } -} - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTScalingImageView.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTScalingImageView.h deleted file mode 100644 index daf4ffba4..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTScalingImageView.h +++ /dev/null @@ -1,69 +0,0 @@ -// -// NYTScalingImageView.h -// NYTPhotoViewer -// -// Created by Harrison, Andrew on 7/23/13. -// Copyright (c) 2015 The New York Times Company. All rights reserved. -// - -@import UIKit; - -#ifdef ANIMATED_GIF_SUPPORT -@class FLAnimatedImageView; -#endif - -NS_ASSUME_NONNULL_BEGIN - -@interface NYTScalingImageView : UIScrollView - -/** - * The image view used internally as the contents of the scroll view. - */ -#ifdef ANIMATED_GIF_SUPPORT -@property (nonatomic, readonly) FLAnimatedImageView *imageView; -#else -@property (nonatomic, readonly) UIImageView *imageView; -#endif - -/** - * Initializes a scaling image view with a `UIImage`. This object is a `UIScrollView` that contains a `UIImageView`. This allows for zooming and panning around the image. - * - * @param image A `UIImage` for zooming and panning. - * @param frame The frame of the view. - * - * @return A fully initialized object. - */ -- (instancetype)initWithImage:(UIImage *)image frame:(CGRect)frame NS_DESIGNATED_INITIALIZER; - -/** - * Initializes a scaling image view with `NSData` representing an animated image. This object is a `UIScrollView` that contains a `UIImageView`. This allows for zooming and panning around the image. - * - * @param imageData An `NSData` representing of an animated image for zooming and panning. - * @param frame The frame of the view. - * - * @return A fully initialized object. - */ -- (instancetype)initWithImageData:(NSData *)imageData frame:(CGRect)frame NS_DESIGNATED_INITIALIZER; - -/** - * Updates the image in the image view and centers and zooms the new image. - * - * @param image The new image to display in the image view. - */ -- (void)updateImage:(UIImage *)image; - -/** - * Updates the image in the image view and centers and zooms the new image. - * - * @param imageData The data representing an animated image to display in the image view. - */ -- (void)updateImageData:(NSData *)imageData; - -/** - * Centers the image inside of the scroll view. Typically used after rotation, or when zooming has finished. - */ -- (void)centerScrollViewContents; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTScalingImageView.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTScalingImageView.m deleted file mode 100644 index 596d089c8..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/NYTScalingImageView.m +++ /dev/null @@ -1,194 +0,0 @@ -// -// NYTScalingImageView.m -// NYTPhotoViewer -// -// Created by Harrison, Andrew on 7/23/13. -// Copyright (c) 2015 The New York Times Company. All rights reserved. -// - -#import "NYTScalingImageView.h" - -#import "tgmath.h" - -#ifdef ANIMATED_GIF_SUPPORT -#import -#endif - -@interface NYTScalingImageView () - -- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; - -#ifdef ANIMATED_GIF_SUPPORT -@property (nonatomic) FLAnimatedImageView *imageView; -#else -@property (nonatomic) UIImageView *imageView; -#endif -@end - -@implementation NYTScalingImageView - -#pragma mark - UIView - -- (instancetype)initWithFrame:(CGRect)frame { - return [self initWithImage:[UIImage new] frame:frame]; -} - -- (instancetype)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - - if (self) { - [self commonInitWithImage:nil imageData:nil]; - } - - return self; -} - -- (void)didAddSubview:(UIView *)subview { - [super didAddSubview:subview]; - [self centerScrollViewContents]; -} - -- (void)setFrame:(CGRect)frame { - [super setFrame:frame]; - [self updateZoomScale]; - [self centerScrollViewContents]; -} - -#pragma mark - NYTScalingImageView - -- (instancetype)initWithImage:(UIImage *)image frame:(CGRect)frame { - self = [super initWithFrame:frame]; - - if (self) { - [self commonInitWithImage:image imageData:nil]; - } - - return self; -} - -- (instancetype)initWithImageData:(NSData *)imageData frame:(CGRect)frame { - self = [super initWithFrame:frame]; - - if (self) { - [self commonInitWithImage:nil imageData:imageData]; - } - - return self; -} - -- (void)commonInitWithImage:(UIImage *)image imageData:(NSData *)imageData { - [self setupInternalImageViewWithImage:image imageData:imageData]; - [self setupImageScrollView]; - [self updateZoomScale]; -} - -#pragma mark - Setup - -- (void)setupInternalImageViewWithImage:(UIImage *)image imageData:(NSData *)imageData { - UIImage *imageToUse = image ?: [UIImage imageWithData:imageData]; - -#ifdef ANIMATED_GIF_SUPPORT - self.imageView = [[FLAnimatedImageView alloc] initWithImage:imageToUse]; -#else - self.imageView = [[UIImageView alloc] initWithImage:imageToUse]; -#endif - [self updateImage:imageToUse imageData:imageData]; - - [self addSubview:self.imageView]; -} - -- (void)updateImage:(UIImage *)image { - [self updateImage:image imageData:nil]; -} - -- (void)updateImageData:(NSData *)imageData { - [self updateImage:nil imageData:imageData]; -} - -- (void)updateImage:(UIImage *)image imageData:(NSData *)imageData { -#ifdef DEBUG -#ifndef ANIMATED_GIF_SUPPORT - if (imageData != nil) { - NSLog(@"[NYTPhotoViewer] Warning! You're providing imageData for a photo, but NYTPhotoViewer was compiled without animated GIF support. You should use native UIImages for non-animated photos. See the NYTPhoto protocol documentation for discussion."); - } -#endif // ANIMATED_GIF_SUPPORT -#endif // DEBUG - - UIImage *imageToUse = image ?: [UIImage imageWithData:imageData]; - - // Remove any transform currently applied by the scroll view zooming. - self.imageView.transform = CGAffineTransformIdentity; - self.imageView.image = imageToUse; - -#ifdef ANIMATED_GIF_SUPPORT - // It's necessarry to first assign the UIImage so calulations for layout go right (see above) - self.imageView.animatedImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:imageData]; -#endif - - self.imageView.frame = CGRectMake(0, 0, imageToUse.size.width, imageToUse.size.height); - - self.contentSize = imageToUse.size; - - [self updateZoomScale]; - [self centerScrollViewContents]; -} - -- (void)setupImageScrollView { - self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - self.showsVerticalScrollIndicator = NO; - self.showsHorizontalScrollIndicator = NO; - self.bouncesZoom = YES; - self.decelerationRate = UIScrollViewDecelerationRateFast; -} - -- (void)updateZoomScale { -#ifdef ANIMATED_GIF_SUPPORT - if (self.imageView.animatedImage || self.imageView.image) { -#else - if (self.imageView.image) { -#endif - CGRect scrollViewFrame = self.bounds; - - CGFloat scaleWidth = scrollViewFrame.size.width / self.imageView.image.size.width; - CGFloat scaleHeight = scrollViewFrame.size.height / self.imageView.image.size.height; - CGFloat minScale = MIN(scaleWidth, scaleHeight); - - self.minimumZoomScale = minScale; - self.maximumZoomScale = MAX(minScale, self.maximumZoomScale); - - self.zoomScale = self.minimumZoomScale; - - // scrollView.panGestureRecognizer.enabled is on by default and enabled by - // viewWillLayoutSubviews in the container controller so disable it here - // to prevent an interference with the container controller's pan gesture. - // - // This is enabled in scrollViewWillBeginZooming so panning while zoomed-in - // is unaffected. - self.panGestureRecognizer.enabled = NO; - } -} - -#pragma mark - Centering - -- (void)centerScrollViewContents { - CGFloat horizontalInset = 0; - CGFloat verticalInset = 0; - - if (self.contentSize.width < CGRectGetWidth(self.bounds)) { - horizontalInset = (CGRectGetWidth(self.bounds) - self.contentSize.width) * 0.5; - } - - if (self.contentSize.height < CGRectGetHeight(self.bounds)) { - verticalInset = (CGRectGetHeight(self.bounds) - self.contentSize.height) * 0.5; - } - - if (self.window.screen.scale < 2.0) { - horizontalInset = __tg_floor(horizontalInset); - verticalInset = __tg_floor(verticalInset); - } - - // Use `contentInset` to center the contents in the scroll view. Reasoning explained here: http://petersteinberger.com/blog/2013/how-to-center-uiscrollview/ - self.contentInset = UIEdgeInsetsMake(verticalInset, horizontalInset, verticalInset, horizontalInset); -} - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhoto.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhoto.h deleted file mode 100644 index 83395f35a..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhoto.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// NYTPhoto.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/10/15. -// Copyright (c) 2015 NYTimes. All rights reserved. -// - -@import UIKit; - -NS_ASSUME_NONNULL_BEGIN - -/** - * The model for photos displayed in an `NYTPhotosViewController`. - * - * Your models (or boxes, if working with Swift value types) should override `isEqual:` to provide a concept of identity for the PhotoViewer to work with. - */ -@protocol NYTPhoto - -/** - * The image to display. - * - * This property is used if and only if `-imageData` returns `nil`. Note, however, that returning `UIImage`s from this property whenever possible will result in better performance. See `-imageData`'s documentation for discussion. - */ -@property (nonatomic, readonly, nullable) UIImage *image; - -/** - * The image data to display. - * - * This property's value, if non-`nil`, is preferred over `-image`. This allows clients to provide image data for FLAnimatedImage when the library is compiled with `ANIMATED_GIF_SUPPORT` defined. - * - * Note that if you're working with a non-animated image, using a native `UIImage` will provide better performance. Therefore, it is recommended to return `nil` from this property unless this photo is an animated GIF. - */ -@property (nonatomic, readonly, nullable) NSData *imageData; - -/** - * A placeholder image for display while the image is loading. - * - * This property is used if and only if `-imageData` and `-image` return `nil`. - */ -@property (nonatomic, readonly, nullable) UIImage *placeholderImage; - -#pragma mark Caption - -/** - * An attributed string for display as the title of the caption. - */ -@property (nonatomic, readonly, nullable) NSAttributedString *attributedCaptionTitle; - -/** - * An attributed string for display as the summary of the caption. - */ -@property (nonatomic, readonly, nullable) NSAttributedString *attributedCaptionSummary; - -/** - * An attributed string for display as the credit of the caption. - */ -@property (nonatomic, readonly, nullable) NSAttributedString *attributedCaptionCredit; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h deleted file mode 100644 index 73739ca83..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// NYTPhotoCaptionViewLayoutWidthHinting.h -// NYTPhotoViewer -// -// Created by Chris Dzombak on 10/30/15. -// -// - -@import Foundation; -@import UIKit; - -/** - * Allows a view to opt-in to receiving a hint of its layout width. This aids in calculating an appropriate intrinsic content size. - */ -@protocol NYTPhotoCaptionViewLayoutWidthHinting - -/** - * The preferred maximum width, in points, of this caption view. - * - * This property works exactly as it does on `UILabel`. - * - * This property affects the size of the view when layout constraints are applied to it. During layout, if the text extends beyond the width specified by this property, the additional text is flowed to one or more new lines, thereby increasing the height of the view. - */ -@property (nonatomic) CGFloat preferredMaxLayoutWidth; - -@end - -@interface UILabel (NYTPhotoCaptionViewLayoutWidthHinting) -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoContainer.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoContainer.h deleted file mode 100644 index ca9bd1f7c..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoContainer.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// NYTPhotoContainer.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/11/15. -// -// - -@protocol NYTPhoto; - -/** - * A protocol that defines that an object contains a photo property. - */ -@protocol NYTPhotoContainer - -/** - * An object conforming to the `NYTPhoto` protocol. - */ -@property (nonatomic, readonly) id photo; - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoViewerDataSource.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoViewerDataSource.h deleted file mode 100644 index 6f6ad5b52..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/Protocols/NYTPhotoViewerDataSource.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// NYTPhotosViewControllerDataSource.h -// NYTPhotoViewer -// -// Created by Brian Capps on 2/10/15. -// Copyright (c) 2015 NYTimes. All rights reserved. -// - -@import UIKit; - -@protocol NYTPhoto; - -NS_ASSUME_NONNULL_BEGIN - -/** - * The data source for an `NYTPhotosViewController` instance. - * - * A view controller, view model, or model in your application could conform to this protocol, depending on what makes sense in your architecture. - * - * Alternatively, `NYTPhotoViewerArrayDataSource` and `NYTPhotoViewerSinglePhotoDataSource` are concrete classes which conveniently handle the most common use cases for NYTPhotoViewer. - */ -@protocol NYTPhotoViewerDataSource - -/** - * The total number of photos in the data source, or `nil` if the number is not known. - * - * The number returned should package an `NSInteger` value. - */ -@property (nonatomic, readonly, nullable) NSNumber *numberOfPhotos; - -/** - * Returns the index of a given photo, or `NSNotFound` if the photo is not in the data source. - * - * @param photo The photo against which to look for the index. - * - * @return The index of a given photo, or `NSNotFound` if the photo is not in the data source. - */ -- (NSInteger)indexOfPhoto:(id )photo; - -/** - * Returns the photo object at a specified index, or `nil` if one does not exist at that index. - * - * @param photoIndex The index of the desired photo. - * - * @return The photo object at a specified index, or `nil` if one does not exist at that index. - */ -- (nullable id )photoAtIndex:(NSInteger)photoIndex; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/Resource Loading/NSBundle+NYTPhotoViewer.h b/Pods/NYTPhotoViewer/NYTPhotoViewer/Resource Loading/NSBundle+NYTPhotoViewer.h deleted file mode 100644 index 92e296cd2..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/Resource Loading/NSBundle+NYTPhotoViewer.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// NSBundle+NYTPhotoViewer.h -// NYTPhotoViewer -// -// Created by Chris Dzombak on 10/16/15. -// -// - -@import Foundation; - -@interface NSBundle (NYTPhotoViewer) - -+ (instancetype)nyt_photoViewerResourceBundle; - -@end diff --git a/Pods/NYTPhotoViewer/NYTPhotoViewer/Resource Loading/NSBundle+NYTPhotoViewer.m b/Pods/NYTPhotoViewer/NYTPhotoViewer/Resource Loading/NSBundle+NYTPhotoViewer.m deleted file mode 100644 index 19d0c12ce..000000000 --- a/Pods/NYTPhotoViewer/NYTPhotoViewer/Resource Loading/NSBundle+NYTPhotoViewer.m +++ /dev/null @@ -1,24 +0,0 @@ -// -// NSBundle+NYTPhotoViewer.m -// NYTPhotoViewer -// -// Created by Chris Dzombak on 10/16/15. -// -// - -#import "NSBundle+NYTPhotoViewer.h" -#import "NYTPhotosViewController.h" - -@implementation NSBundle (NYTPhotoViewer) - -+ (instancetype)nyt_photoViewerResourceBundle { - static NSBundle *resourceBundle = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSString *resourceBundlePath = [[NSBundle bundleForClass:[NYTPhotosViewController class]] pathForResource:@"NYTPhotoViewer" ofType:@"bundle"]; - resourceBundle = [self bundleWithPath:resourceBundlePath]; - }); - return resourceBundle; -} - -@end diff --git a/Pods/NYTPhotoViewer/README.md b/Pods/NYTPhotoViewer/README.md deleted file mode 100644 index 3e8a4116d..000000000 --- a/Pods/NYTPhotoViewer/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# NYTPhotoViewer - -[![Platform](http://cocoapod-badges.herokuapp.com/p/NYTPhotoViewer/badge.png)](http://cocoadocs.org/docsets/NYTPhotoViewer) -[![Version](http://cocoapod-badges.herokuapp.com/v/NYTPhotoViewer/badge.png)](http://cocoadocs.org/docsets/NYTPhotoViewer) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) - -NYTPhotoViewer is a slideshow and image viewer that includes double-tap to zoom, captions, support for multiple images, interactive flick to dismiss, animated zooming presentation, and more. - -![Demo GIF](Images/photo_viewer.gif) - -## Usage - -Usage is simple, with the option for more complicated customization when needed through a delegate relationship. In the most basic implementation, just initialize the view controller with an array of photo objects and present it as normal: - -```objc -NYTPhotosViewController *photosViewController = [[NYTPhotosViewController alloc] initWithPhotos:photos]; -[self presentViewController:photosViewController animated:YES completion:nil]; -``` - -## Running the Example - -The Example project uses [Carthage](https://github.com/Carthage/Carthage) to integrate its dependencies. If you don’t have Carthge installed, you can install it via [Homebrew](http://brew.sh) with `brew install carthage`. - -Then, in your checkout of the `NYTPhotoViewer` repo, run `carthage checkout --use-submodules`. - -## Installation - -### Carthage - -NYTPhotoViewer may be installed via [Carthage](https://github.com/Carthage/Carthage). To install it, simply add the following line to your `Cartfile`: - -``` -github "NYTimes/NYTPhotoViewer" -``` - -Then, following the instructions for [integrating Carthage frameworks into your app](https://github.com/Carthage/Carthage#if-youre-building-for-ios-tvos-or-watchos), link the `NYTPhotoViewer` and `FLAnimatedImage` frameworks into your project. - -If you don't want support for animated GIFs, you may instead link against only the `NYTPhotoViewerCore` framework. - -### Cocoapods - -NYTPhotoViewer is available through [CocoaPods](http://cocoapods.org). To install it, simply add the following line to your `Podfile`: - -``` -pod 'NYTPhotoViewer' -``` - -## Requirements - -This library requires a deployment target of iOS 8.0 or greater. - -## Changelog - -See [`CHANGELOG.md`](https://github.com/NYTimes/NYTPhotoViewer/blob/develop/CHANGELOG.md). - -## Contributing - -Please **open pull requests against the `develop` branch**, and add a relevant note to the [`develop` section of the CHANGELOG](https://github.com/NYTimes/NYTPhotoViewer/blob/develop/CHANGELOG.md#develop) as part of your pull request. - -## Swift - -NYTPhotoViewer is written in Objective-C but is fully interoperable with Swift. If you experience any interoperability difficulties, please open an issue or pull request and we will work to resolve it. - -## Inspiration - -NYTPhotoViewer draws feature inspiration from Facebook and Tweetbot’s image viewers. If this implementation isn’t to your liking, you may consider [JTSImageViewController](https://github.com/jaredsinclair/JTSImageViewController) or [IDMPhotoBrowser](https://github.com/ideaismobile/IDMPhotoBrowser). - -## Implementation - -NYTPhotoViewer has a straightforward implementation using standard UIKit components. The viewer is a `UIViewController` and uses `UIViewController` transitioning APIs for the animated and interactive transitions, a `UIPageViewController` for horizontal swiping between images, and `UIScrollView` for image zooming. - -It is intended to be used without the need for subclassing, and as such it accepts model objects conforming to a `NYTPhoto` protocol and provides ample opportunity for customization via the `NYTPhotosViewControllerDelegate`. Since standard APIs are used, the client has full control over the transitions and customization of the `NYTPhotosViewController`. - -## License - -NYTPhotoViewer is available under the Apache 2.0 license. See [`LICENSE.md`](https://github.com/NYTimes/NYTPhotoViewer/blob/develop/LICENSE.md) for more information. - -## Contributors - -[A list of contributors is available through GitHub.](https://github.com/NYTimes/NYTPhotoViewer/graphs/contributors) diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj deleted file mode 100644 index b7798ede9..000000000 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ /dev/null @@ -1,8870 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 005C1DB15257F688C28EA00E50624CAD /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0820F6290823344A52B450D4DFE85FBB /* CoreMedia.framework */; }; - 0066B65B4FEDB469D39608875E121A81 /* QMMediaDownloadServiceDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2ED8983BEC599B272948296CF3F09871 /* QMMediaDownloadServiceDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0144702589AE797AD1E6D43E942C80DA /* NSManagedObject+QMCDFinders.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F0DE4B68A4D9FB54004782A3F30E3E5 /* NSManagedObject+QMCDFinders.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 01B04E841F56566F4572AFFB4B62242C /* FBSDKLoginButton.m in Sources */ = {isa = PBXBuildFile; fileRef = BEAEAA5389124BB18CB12F603B97454C /* FBSDKLoginButton.m */; }; - 01BE84F79C4AAA3A6C44981998C6D0EC /* FBSDKBridgeAPIRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 00555FB9F2991B1CA49F0ABC1367E525 /* FBSDKBridgeAPIRequest.m */; }; - 0202994D4B9354DEAA073D61538125C3 /* FBSDKCheckmarkIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 88EB65360379717F21C5A6891BAAF76D /* FBSDKCheckmarkIcon.m */; }; - 0212D7241A0E4E37276F410FDF0DE78E /* FBSDKGameRequestFrictionlessRecipientCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A35113DF0B7F8FBBC9FD814876957040 /* FBSDKGameRequestFrictionlessRecipientCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0242D60D266205CB21346CCED836171E /* QMChatIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0AB953659B5C6D57BA912EBAFD9A16D7 /* QMChatIncomingCell.xib */; }; - 02442CF3F3073F092EAF733BD58F5596 /* es-DO.lproj in Resources */ = {isa = PBXBuildFile; fileRef = DFCB99637ED9CC1BEC5BF43532A310C8 /* es-DO.lproj */; }; - 024A758C66579653B3EBDE8B78BBB7E9 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 460B86BFD7B4332C9CF3C1EFF9F3967C /* SystemConfiguration.framework */; }; - 03432237FE6E69F5CAAE946F100A6CF4 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E329F55E5CA7A4EC055263A8D1DC45C /* UIImageView+WebCache.m */; }; - 0394A3A1143CC60A45E8BC40B1223AD3 /* QMChatCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C69368E6DDABBBCE646696B736CFCCC /* QMChatCache.m */; }; - 03DF325FF3DCA5E3B7CD22E1CB3D00AA /* QMContactListService.m in Sources */ = {isa = PBXBuildFile; fileRef = 7117C9CCF997FBC6E86056416114A485 /* QMContactListService.m */; }; - 04466987A2419FD6B6F029C464D7603B /* SDWebImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = D2E177A4CAE136F54EA4E0BDEAA5890E /* SDWebImageGIFCoder.m */; }; - 049D83C6315D0AD892F4B84BB77FDB7C /* NSManagedObject+QMCDAggregation.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E08DDAE806BB08CF3084D5B480481EE /* NSManagedObject+QMCDAggregation.m */; }; - 04B5612DD2C36E90510CEBDDF6E3DB2E /* QMMediaUploadService.m in Sources */ = {isa = PBXBuildFile; fileRef = 90FC32DB834F5E367709999298DC79CC /* QMMediaUploadService.m */; }; - 04CE54BBE6008BE750742616CA28E795 /* FBSDKLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 5033590F85F17C9039766ADD204012CB /* FBSDKLogger.m */; }; - 05D496FE261A45B4F7C9512AFCC42608 /* FUIPasswordSignInViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = F96B611386943ED6606AD8C686D0B164 /* FUIPasswordSignInViewController.nib */; }; - 05F06B12AAC5CD0C807ECE5B3B3D2BAC /* FLAnimatedImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D1560A5FA3831D2BBA697C170241FC4E /* FLAnimatedImage-dummy.m */; }; - 064E1AC02E9716101E27121CE8100111 /* nb.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 0741C9B21D644A6F06DB53C1D324353E /* nb.lproj */; }; - 064E9A3A6D936861F835A39CCE47B1F3 /* NYTPhotoViewerCloseButtonXLandscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B30BA46DD430478258E3261E1374BEB2 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */; }; - 06FC1A6E72217D4728A69F4E20D03998 /* QMBaseMediaCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DC02B083354FB172E5CC47F62E07DAA /* QMBaseMediaCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 073BC25CC222A91E898BD0B9DDA5643D /* NSPersistentStoreCoordinator+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = 75C0FCF0CFDF0D9CC523085845D46361 /* NSPersistentStoreCoordinator+QMCDRecord.m */; }; - 0752A90B45007975E615EB9DD6BE2287 /* QMChatActionsHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FD5094E45E40ECC81E677195C5E568C /* QMChatActionsHandler.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 07FF3EF5D7E82C1E737FC6D46102A1CA /* QMOpenGraphModelIncludes.h in Headers */ = {isa = PBXBuildFile; fileRef = E829F7BD64C8F76BEDF98A6CEAE0D55F /* QMOpenGraphModelIncludes.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 080A83465C35A363E59F4A8C835B1E5E /* sr-Latn.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8817F70E89D1422A78DEA7E053AE7EF8 /* sr-Latn.lproj */; }; - 088A4C298322BF18F28176C711F060F9 /* FBSDKAudioResourceLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = FBE263DE9E3F8046DEF606852F1917E2 /* FBSDKAudioResourceLoader.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 08F002DEEF8FC1CFA198558562839443 /* QMChatOutgoingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 63ED0B5BFFCB5A197FEC47732E76F68B /* QMChatOutgoingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0950A4CFA0BA90C7C7C1D65BAB9A8E6A /* FBSDKDialogConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = CA12F332446D556D1328C459BEC15AC0 /* FBSDKDialogConfiguration.m */; }; - 09B89844E4BE1314D1AB1717BCEA2DD3 /* ic_visibility_off@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9557712848C9A39338545DD860DAFAFA /* ic_visibility_off@2x.png */; }; - 09BF4BC22F23CD9986D5D24AAF38B838 /* NYTPhotoViewer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A1305A69331A1C824781E95183DEB81D /* NYTPhotoViewer-dummy.m */; }; - 09EE9F46EC234A4E83D5EBB0F6C36743 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 460B86BFD7B4332C9CF3C1EFF9F3967C /* SystemConfiguration.framework */; }; - 0A2C61A51BC48B22283A3074F6FD8523 /* FUIInputTableViewCell.nib in Resources */ = {isa = PBXBuildFile; fileRef = F2E3B463BC31BBE37967DB6C74E7DFE2 /* FUIInputTableViewCell.nib */; }; - 0A91AB2004A982DA48F13DEBCDF18A65 /* NYTPhotoViewer.h in Headers */ = {isa = PBXBuildFile; fileRef = B1163F2786CBB14E99FDFAD5CE5FA5A8 /* NYTPhotoViewer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0AB1EA101A3C7EF13B01686DE675757E /* nn-NO.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 098B357167D7583E9554FAD391143911 /* nn-NO.lproj */; }; - 0AD0522EDA6C7027CB8F231EB7CC8B28 /* FBSDKGraphErrorRecoveryProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 08E989357139E9D222F79B70A96C5F9E /* FBSDKGraphErrorRecoveryProcessor.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0B26D8A806541ACDD91BC4870CC316C8 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA7377A46BDFAFBC79986AA12BFBBA37 /* CoreVideo.framework */; }; - 0C143D66C3688C57E8E740A35FADB8FE /* FBSDKAppEventsDeviceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 458DA8C602BC4E7C9F208A2213969CD6 /* FBSDKAppEventsDeviceInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0C1CB40A82EB80B82AEAA4C76F8134CC /* he.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 55D6CC02D39C11984B33FC0A271E4396 /* he.lproj */; }; - 0C8B87202EF8C826FA5EC5E5BDFF7676 /* BFAppLink.h in Headers */ = {isa = PBXBuildFile; fileRef = C165906809A74E5EACEDE86AAEEF073E /* BFAppLink.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0CA6A548721B022615DAA9CFC3FD9EED /* FBSDKShareCameraEffectContent.h in Headers */ = {isa = PBXBuildFile; fileRef = F1B626C30609C9AC9476DF60FD012671 /* FBSDKShareCameraEffectContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0D08F2BDA0D339244FA421F898303056 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9313D39AC48A99B0BD9A0515100101D6 /* ImageIO.framework */; }; - 0D0E30260E1F6F77E517024C0986DD84 /* QMUsersService.h in Headers */ = {isa = PBXBuildFile; fileRef = D69EB536BF026F24113CE14068F6EB99 /* QMUsersService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0D18B3173A0C2E31D95CA71282503A9B /* ic_visibility.png in Resources */ = {isa = PBXBuildFile; fileRef = E8E41E614A25A7A3DFF7446AD335FC96 /* ic_visibility.png */; }; - 0D341AC86F8C286D8F31A94C99FDF489 /* QMAudioIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FE78791BB72F021DD020995A93EDFA1D /* QMAudioIncomingCell.m */; }; - 0D4EFC1F6A281D8BFBC6D04B372AF694 /* _CDOpenGraphModel.h in Headers */ = {isa = PBXBuildFile; fileRef = FCEB2C3A2F8A73213C4BBD8C8C337EB8 /* _CDOpenGraphModel.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0D5294B246050B6CB3409F2F67345B6F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78871113E2E8880927AC6E26B088A625 /* QuartzCore.framework */; }; - 0D7DE4E202070A2856CC1FEF21060589 /* ar.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 3F326C96C32EA81CD39BB507BF6F0957 /* ar.lproj */; }; - 0D8077B589BF5EF59BBC872F3CF31C4D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DABC517BFE092CEEF189650039707D6C /* UIKit.framework */; }; - 0DA191B919AA787542DD15D61D136E22 /* QMChatResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B9F19DF82BA4D976EC7921538044BFB /* QMChatResources.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0DCB0EA8925B92CF60C6758DE2FFE2FF /* lv.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 07A74B68C426E8FFD2D85A3C54564DB9 /* lv.lproj */; }; - 0DEFE39030C10131E1C07393B41D2E14 /* es-EC.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5DF6C380C24A814CB9480B73D823776D /* es-EC.lproj */; }; - 0E05E8B0F5D014A4F2575F615569220B /* QMChatResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 079F341D8ABD715D814F0C56673A3ECD /* QMChatResources.m */; }; - 0E6CD5FC03C93CEF05889ADB91554312 /* NSPersistentStore+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BC0FD6503BAA29B5B4C41DCABE0B77C /* NSPersistentStore+QMCDRecord.m */; }; - 0E7D8614B5A054D430D17C469DBA7651 /* QMVideoIncomingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F0DB2D8545DD175B4E192B9A65C9D09 /* QMVideoIncomingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0EC9F09B9D4C1A7CFED42E20626E523F /* FBSDKLoginError.m in Sources */ = {isa = PBXBuildFile; fileRef = 215E6C5268861B122C42AF7CE5CAA431 /* FBSDKLoginError.m */; }; - 0ED8382FF94D45E9D6F97ECB65DB178C /* QMChatIncomingLinkPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3CCFFC2DF52A5A241B218E24A722BF72 /* QMChatIncomingLinkPreviewCell.xib */; }; - 0F26808FCE265E98C8DE22057D0B4AEF /* QMImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 95F4F88F14F153C1CBB3570027656666 /* QMImageView.m */; }; - 0F4A0480747F2663DA5A2EADCA09D3BF /* QMSLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EACD8EC24C72480207A5C3C774DB41C /* QMSLog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0F5C566DDDFB79D7A6BCC25D7C67931A /* BFCancellationToken.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1139B19603A28570F8B4EE887445D8 /* BFCancellationToken.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 108D1A7E0CF19BEBA753645B6516EE75 /* FBSDKAppInviteContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 5256F332463B998F064C17F3C2D4AB56 /* FBSDKAppInviteContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 10A27E49747653F1620A11593EB2258F /* FBSDKServerConfiguration+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 82BAC18BFB5932D6FA9FF52EBF744D56 /* FBSDKServerConfiguration+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 10D875C58C58C6FC29C5A71617A449EC /* QMChatCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4941AFA41B29D6FCD1E1738AB5DC8750 /* QMChatCell.m */; }; - 11057046F67F489338FFE436CDA92771 /* FBSDKSharePhotoContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DC21BB63CE6C9D7B9CFEBFFB0A4B126 /* FBSDKSharePhotoContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1144BCBD06CF4DC32001C3AF8B54DC06 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D069F3495F04DE6723639DEA494A9D40 /* AudioToolbox.framework */; }; - 117E991DF09DE5C636178E812B76185C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 11AF308177F4D73ED26A6B8A0C4C9A86 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B28EB0ED22BFE9FED06B2AE5C6829617 /* NSButton+WebCache.m */; }; - 12561E82E99CFD796F2F2A5D12B064D7 /* QMAudioRecordView.m in Sources */ = {isa = PBXBuildFile; fileRef = B477A027D421D9DD5A53445C01B6FC11 /* QMAudioRecordView.m */; }; - 129820E7238EA09AFEAAAD259158A3D3 /* NSManagedObject+QMCDAggregation.h in Headers */ = {isa = PBXBuildFile; fileRef = A02D0BFAA3A47C620571E5D896AF5908 /* NSManagedObject+QMCDAggregation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 129986403CDA960892B9E7158CEBD293 /* pb.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E850C4FB3456425684E5FCC37D62364 /* pb.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 129B9CF1B1EC74828B7238A8A3115D9A /* QMChatServiceModel.xcdatamodeld in Resources */ = {isa = PBXBuildFile; fileRef = 237B97F795343F5E9108A58C8BFCA228 /* QMChatServiceModel.xcdatamodeld */; }; - 12CF65327A9D1413498E1534D372B37A /* QMChatCollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FE7590BB049681C40A5FD1529364E82 /* QMChatCollectionView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 135E9C83EE213B20D8D3DE525E8AAAEC /* FBSDKLoginManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 933A45C395BF3005EC1111DC805DAA82 /* FBSDKLoginManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 136311C98F5A6B0EB141F06B9FD17CEF /* FBSDKWebDialogView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DEBCD546E253E608A242FAFF96EED65 /* FBSDKWebDialogView.m */; }; - 13A20BEB134B5E233E5BF9A0955DA99E /* FBSDKGameRequestFrictionlessRecipientCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 391BF86B41DDD8AAD69BCB51AED73DD0 /* FBSDKGameRequestFrictionlessRecipientCache.m */; }; - 149D4E5D8374FB825F746A6DB501E5F2 /* QMCDRecordLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 54043F3B782D15B04973AB58A4D087B1 /* QMCDRecordLogging.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 151DA431A38650EA4CBD382E22C99761 /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0239AF1E527E4B141E2AA27ED088F54A /* UIView+WebCache.m */; }; - 1520D27C0B7A7063681106187EA41C05 /* FBSDKLoginManagerLoginResult+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = F80E2FED6A6B9996DE5E8D745804DBE1 /* FBSDKLoginManagerLoginResult+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 153039FA738BADA84A2C73921921B708 /* QMChatAttachmentOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E1EDA698E88CA8B89E64582BA4819A9 /* QMChatAttachmentOutgoingCell.m */; }; - 153910DF6D1CFDF675A86B85DCAE3402 /* QMServices.h in Headers */ = {isa = PBXBuildFile; fileRef = C3A0B20DD01288E49CCBF7F2565C892D /* QMServices.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 159FAB6CD5082235D0E679171A344443 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 15D9F1D56F3BF3F749BE25A20BF16AA3 /* QMMediaUploadService.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E7C211CD593C0142BA92EFF27B6F34 /* QMMediaUploadService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1632478F369494BB32B4FAD96ED5A50E /* FBSDKAppGroupJoinDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E55A205443FE63AFCACDFD1BFB015CA /* FBSDKAppGroupJoinDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 16F22E615E2C344E95D4101E13334DEA /* FBSDKErrorConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C713B40D37C0E105DEA3026C3BC75817 /* FBSDKErrorConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 16F450457562426AED40306799D504E7 /* FBSDKDynamicFrameworkLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = CC98EDEA80261D9C6B40902413C60DB0 /* FBSDKDynamicFrameworkLoader.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 1725FD5D6361BE2B8536E8779A781035 /* QMAttachmentContentService.h in Headers */ = {isa = PBXBuildFile; fileRef = E0876E249BC4D8A205D4DC6479858EC2 /* QMAttachmentContentService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 17483D6E703F7BFADBF8572B4E710B06 /* Flurry.h in Headers */ = {isa = PBXBuildFile; fileRef = B66B0F8377035F8B660617B331D5EAF8 /* Flurry.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 177CC383588858209E669E248DA8A2A1 /* FBSDKShareError.m in Sources */ = {isa = PBXBuildFile; fileRef = A9DC18DF05E4A40BAF1EE7D702263D5A /* FBSDKShareError.m */; }; - 177EA7481528AFB4F458FC44038BA9D3 /* NYTPhotoTransitionController.m in Sources */ = {isa = PBXBuildFile; fileRef = B9D12EB23F321D04316F99238EE3B448 /* NYTPhotoTransitionController.m */; }; - 1784CE993795B5204B2E8E29A312776C /* en-ZA.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 98775D35A30239BB2243827E123A1B03 /* en-ZA.lproj */; }; - 179467DCDA58788475FC2347823A8A2E /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0AFE3229DC0A66C3AABBC7D0816C8897 /* NSImage+WebCache.m */; }; - 182919E12AEDD408F7E10077860A1633 /* NSManagedObjectContext+QMCDSaves.h in Headers */ = {isa = PBXBuildFile; fileRef = 00D1C7BDD1B5E5377C24C65AE4401A8A /* NSManagedObjectContext+QMCDSaves.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 18E2AD3148A4789FE9F010CE9A9C6423 /* FBSDKAccessTokenCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BA42F7AC1E97F893B3AE7336D017E82F /* FBSDKAccessTokenCache.m */; }; - 197923EF97E4BE1C801C1851664FF9DF /* ic_email.png in Resources */ = {isa = PBXBuildFile; fileRef = 103C74AC4458EAA9B27B324424385A13 /* ic_email.png */; }; - 19895290593D2763A909999F59D6E561 /* FBSDKAudioResourceLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = D78D96582009F9715BF5C42671D85AA7 /* FBSDKAudioResourceLoader.m */; }; - 198D8D110BD20B7CA809132378E98540 /* NSManagedObjectContext+QMCDObserving.m in Sources */ = {isa = PBXBuildFile; fileRef = CF55DAD512ACEDB4664A6549374E4FE7 /* NSManagedObjectContext+QMCDObserving.m */; }; - 19E759C73BE10CD549C91140B1E88C64 /* QMChatLocationOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EAA448B342DC8D2DB274C60B2426B47C /* QMChatLocationOutgoingCell.m */; }; - 19ED98E248D79CD3CEEF80B754BB002C /* FBSDKAppEventsStateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 04BCB41E54AE39043E53CAD958B9D331 /* FBSDKAppEventsStateManager.m */; }; - 19F361C4DD931E887D8A3976A1F2F2DE /* FBSDKViewImpressionTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C2438AF30E432641E3449DF7C0B9125 /* FBSDKViewImpressionTracker.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 19FFFD8E5BE5DC4470D247C683219298 /* FBSDKShareDialogMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 263F7EB1436D02E172B5ACA4EBFB1413 /* FBSDKShareDialogMode.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1A1B34044186C24CF50E14734113C09C /* QMAudioRecordView.h in Headers */ = {isa = PBXBuildFile; fileRef = 827CD56A0057309230976D3F2988CCCA /* QMAudioRecordView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1A33C45DEC9DF24A0F1441C7B7D3B3B9 /* FBSDKShareMessengerURLActionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 4360BC0AA750D7B598C1D21B7EB2265F /* FBSDKShareMessengerURLActionButton.m */; }; - 1A39E9060D0FC571BA366080CCFDD2F9 /* NSManagedObjectModel+QMCDRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = D651FF519443B555C09905CBF2B18D35 /* NSManagedObjectModel+QMCDRecord.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1A7543BD7222812EA85CA33A5210299A /* FBSDKTestUsersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = AC3604D88068BD37EB37085F94FC2954 /* FBSDKTestUsersManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1B1295077C3F53128EE0ADCB556AB53B /* FBSDKGraphRequestDataAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = C4A8B6E60636D3002973A6F34E834B98 /* FBSDKGraphRequestDataAttachment.m */; }; - 1B214521BB4D24536936647B119383DD /* SAMKeychainQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = AF6A1CAEF2655013788C416DD61F2ED7 /* SAMKeychainQuery.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 1B33D90F4174DDDE11C0A5E21B3B4406 /* NSPersistentStore+QMCDRecordPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = F112C7B819B60B2A5A2B23BC8C8062FD /* NSPersistentStore+QMCDRecordPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1B47C04D880BC06908BB6A563ADD1A3A /* es-PE.lproj in Resources */ = {isa = PBXBuildFile; fileRef = EEC04FC7E73495A1032A1A56636E98B1 /* es-PE.lproj */; }; - 1B4FCB722AEEE8DCF77613DC2D901F13 /* QMCDMigrationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B7D78051EED427038591D82ED57EA9B /* QMCDMigrationManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1B6B1117E9ECBBE3939DA968F070BD3E /* CDAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = C1504D35BA74702F155EBC90D76EEF3E /* CDAttachment.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1B8714DF33ABD898CF49FAA1314DCF34 /* GTMSessionFetcherService.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFA23B1D5513E07BE82C4B71B7AF973 /* GTMSessionFetcherService.m */; }; - 1BB8DAE2DE1A3C48ED59C7F15A659D1A /* FBSDKLikeBoxBorderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 18A781478CCFADE8CCAE30503C1764EA /* FBSDKLikeBoxBorderView.m */; }; - 1BCC3E6A604AFF6D4069F816F195F503 /* FBSDKShareAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = EB686956C568FA72907F1AFA4AC7CDE5 /* FBSDKShareAPI.m */; }; - 1BE445CC79BF3E812C44ACA324D310D1 /* FBSDKURLOpening.h in Headers */ = {isa = PBXBuildFile; fileRef = 138BAFFAE3BF192059CD6AEBF90185F6 /* FBSDKURLOpening.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1C0156DC0554C02BE0FDD39AE4895C88 /* QMUsersService.m in Sources */ = {isa = PBXBuildFile; fileRef = A037233884896ABCC4C858BD622C31E3 /* QMUsersService.m */; }; - 1C70CE3FCC5E4D6FDC02E70357B89B63 /* UIImage+QM.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C189AC392E278C3D9C3916A88FF5F6D /* UIImage+QM.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1D0AC99DD0F06DBC4A97E3CA52361197 /* fi.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 07BD5566E47E4A8CB72022C901A34740 /* fi.lproj */; }; - 1DE838EA276D4912FFF016D71C2D54A2 /* FBSDKCameraEffectTextures+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 377475C994438724A03F01B8F5C4D64C /* FBSDKCameraEffectTextures+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1E890935461208AB7CAFF617DC290958 /* NYTPhotoViewerCloseButtonX@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 180733DF9E16018CF8BB7572F224B87C /* NYTPhotoViewerCloseButtonX@3x.png */; }; - 1EB23C3B6B1C763592CE041B2C845A65 /* NYTPhotoCaptionView.m in Sources */ = {isa = PBXBuildFile; fileRef = E32B52F39C7F274638F02698FA9E4526 /* NYTPhotoCaptionView.m */; }; - 1F523591D668302FB565E286E59C9F20 /* FBSDKHashtag.h in Headers */ = {isa = PBXBuildFile; fileRef = 05353E79445CE9E3D4F4A025397B34D2 /* FBSDKHashtag.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1F70AA183512CC2FF182C4681D11B067 /* FBSDKLoginKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A79FDAF9B10355980CE844D204C296 /* FBSDKLoginKit-dummy.m */; }; - 1FA92F302764DA8CAA7891B0A7A2847C /* cs.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B797B7AE022674473553900239EA5B2E /* cs.lproj */; }; - 1FB2718F24F2A209BBCFA22EB54CBD64 /* FBSDKCameraEffectTextures.h in Headers */ = {isa = PBXBuildFile; fileRef = F7FC9A7CD509F754C16E705278B985C3 /* FBSDKCameraEffectTextures.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1FD89BCE18878274FE3E05CA3B19A1EC /* pb_decode.h in Headers */ = {isa = PBXBuildFile; fileRef = 6540CD0631DFB4DA767C9175A1B536A1 /* pb_decode.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1FEE4A3A4886B52E3F3936ACFBC5689D /* FBSDKLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = B686CBF2119B8C835C7EF65885047EDA /* FBSDKLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 20612285D60CBCFA3B6F2EE4A4166A0B /* QMMediaOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = ED706A8880ABB0AA5A42FDD55862C669 /* QMMediaOutgoingCell.m */; }; - 2089C7C2B78C35F067C3C93170D7F7B4 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB64F9A7C3075D2CD905607868BCA222 /* Security.framework */; }; - 20F3B101806797802E4EE1670E45D6E9 /* QMChatOutgoingLinkPreviewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 751C846B11B571F772309578745700E4 /* QMChatOutgoingLinkPreviewCell.m */; }; - 213385CE61BD3D9C1B2BEB786F39E099 /* QMMediaOutgoingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = F235BBA262A4F92D12589E74A4DB4854 /* QMMediaOutgoingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 21B23FC9554750E0F7F154FC11FF0A45 /* FBSDKAccessTokenCacheV3_17.h in Headers */ = {isa = PBXBuildFile; fileRef = CC34E7D012444087332A61118EDD62D6 /* FBSDKAccessTokenCacheV3_17.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 22B2EBF7FE258C9386207F635800DD3D /* play_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 89119A7831BE8F6D0F158B90EC16845C /* play_icon.png */; }; - 22BF715C75EA24283898C5AAD6888F79 /* FBSDKBridgeAPIResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = CFF68CC76E6B31BFD707C78EE48D810D /* FBSDKBridgeAPIResponse.m */; }; - 231E5F2485F4EA86A1138B7142115AD4 /* QMOpenGraphItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C15CBE1387D86E5CA16C549F572D1ED /* QMOpenGraphItem.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2341A9F292B7A0C8A102E5D28954F97F /* de-CH.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C297F40654448F01A05FA65B6241C43D /* de-CH.lproj */; }; - 23A2E45323AB9CB2B488B57F2F4D4F09 /* FBSDKLikeActionControllerCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D7CB2B14A1847A9702F1E9A4B24F2BD8 /* FBSDKLikeActionControllerCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 23C08D0E48816FAA0952D2BE4D33B132 /* QMChatContactRequestCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6D7E678F9570AA814298F9A28F2E55 /* QMChatContactRequestCell.m */; }; - 243A9027C67641F6F7E2D319264B3AB8 /* es-PE.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C9F42D01E81A2973F68DB39B2F1600A5 /* es-PE.lproj */; }; - 244079DC57138B7B2000061F01F1DB89 /* FBSDKShareUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 235C1AC47AE6A5012AA789E76846B143 /* FBSDKShareUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2441DF3E270DE02FE803BF3D74BADF97 /* Bolts-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D879FD07C9A8D90452D95C6A1FACE0D5 /* Bolts-dummy.m */; }; - 246AE85F0EAA447F7E248856212B3596 /* FBSDKUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = A834C4B89C9666AFD697CBAB197B2DA2 /* FBSDKUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 24ADF4304DAA874D728AAE7FD801F461 /* QMTimeOut.h in Headers */ = {isa = PBXBuildFile; fileRef = D5E359A89CB6F2C5F5911C014E897ADF /* QMTimeOut.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 24C37351EF49FC19CF798C44EF9293E6 /* FBSDKURLConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = E282485F093FA06646FEC35A9194C986 /* FBSDKURLConnection.m */; }; - 24E710DF4C225021ECF5F372A9008380 /* NSManagedObject+QMCDRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = 86D67B4842FB59069113286A90C39AF7 /* NSManagedObject+QMCDRequests.m */; }; - 24F853A159BD3AE44D0C5889CDE68579 /* QMImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = D85F56002D110E77304C14A0B3D10DD8 /* QMImageLoader.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 257FC2F1A0280C9FFC6918D72F9C315B /* FBSDKShareKit.h in Headers */ = {isa = PBXBuildFile; fileRef = B4C95BDA2E423F449EE9229706F55654 /* FBSDKShareKit.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 25D9F63B368F205B5396818175E1AA19 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 460B86BFD7B4332C9CF3C1EFF9F3967C /* SystemConfiguration.framework */; }; - 266B45B24A4E0312ED7CB0823D07163D /* FBSDKLoginUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = FC95AA45FCA474BF3293070A8B03D4BA /* FBSDKLoginUtility.m */; }; - 26B19EAA60FEF2859938B7370286C6E3 /* FBSDKShareOpenGraphContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 74A51E390286623D16120657C376278B /* FBSDKShareOpenGraphContent.m */; }; - 27834E95D691A32A62A7A7A2789E66FE /* FBSDKLoginButton.h in Headers */ = {isa = PBXBuildFile; fileRef = ABE526C6FEBB48F5EE6ABA8D40ABD3B7 /* FBSDKLoginButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2793C7FE6DF0D7001E0656206EBB5A7D /* FBSDKInternalUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = BC48EDD13BA4E6D3AE30258BD8F845A9 /* FBSDKInternalUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 27BE024B71C6D86A4A1EDABCE64E566B /* CDOpenGraphModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A2D2CAF8C2E67F7646BF9A4C372C46B /* CDOpenGraphModel.m */; }; - 280E3CAF6F6DE64E92EA61EC96A53D6B /* FBSDKBoltsMeasurementEventListener.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A595E2095D2502A17114536F18577C5 /* FBSDKBoltsMeasurementEventListener.m */; }; - 2815E4F0F36DF230EA4D9D1B6C1A6456 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 2851471FC42E6EF129CAE41B7E980856 /* NSString+QM.h in Headers */ = {isa = PBXBuildFile; fileRef = 37E50D67E198C2551C3D9C764E6C22C3 /* NSString+QM.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2894CDD0C5BB854D6553D7F70ACC853A /* FBSDKAppLinkResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 595983B5E926BE155674908C70B2E386 /* FBSDKAppLinkResolver.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 28B7761E1D77D96D267539A7B67188EA /* nanopb-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DBD693DE1754131E30423F8FD72FFC30 /* nanopb-dummy.m */; }; - 2920CB45DB4A37A485869FA1DD068983 /* FBSDKAppEventsState.m in Sources */ = {isa = PBXBuildFile; fileRef = E5C0E8A8D78590FA3C9CA2E5E6145426 /* FBSDKAppEventsState.m */; }; - 293E39F79014F138C3A2AF6417C8F667 /* sr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 1502EF10D25F5B353178F18E52F1D64E /* sr.lproj */; }; - 2A33B0324BE5253286C0AA9289B3DFDE /* es-HN.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 549CEFB3FE461C0FC623EDCD566DA183 /* es-HN.lproj */; }; - 2B27E0EB493032B2B681BD4AECAB618D /* QMChatIncomingLinkPreviewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 916957FB16CF9E3894972722C9BA8F85 /* QMChatIncomingLinkPreviewCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2B40797BA3516238E9D52125B9726411 /* GTMSessionFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DECE7A79E4C866BF281BE75C1FB87A9 /* GTMSessionFetcher.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2B46DBFC8F2C442086674C74D3609B9A /* QMChatOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C76BE333439B97D2829C26CC294234E2 /* QMChatOutgoingCell.xib */; }; - 2B5FEA8377B267CE91653EF5FBB856FF /* FLAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C971B1513487337794CB0F0D87780D30 /* FLAnimatedImage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2B62381FEB8C61B4EDDC66581782DAE9 /* FBSDKLoginManager+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C68408B5AC64BA3132545DB93EB4F31 /* FBSDKLoginManager+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2B6E64C0E8A6E38A0ADB2175091E95CD /* FBSDKProfilePictureView.h in Headers */ = {isa = PBXBuildFile; fileRef = 1660325F17F1639349A4459A7CCA7BE5 /* FBSDKProfilePictureView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2BA8D27675B2FAA97D5FAAAE1B17C53E /* ic_email@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AC27249710CBE7558BE336C314F08FBB /* ic_email@2x.png */; }; - 2BB16B8EB53D7BB69F221999106BAC51 /* FBSDKShareOpenGraphContent.h in Headers */ = {isa = PBXBuildFile; fileRef = CA9040C299AB0C8FE901BAFB27589A26 /* FBSDKShareOpenGraphContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2BBA08C229055888D65307DE91D79676 /* QMChatAttachmentService.m in Sources */ = {isa = PBXBuildFile; fileRef = 447CD65667F0A95BC16ED06CADFF9644 /* QMChatAttachmentService.m */; }; - 2BF9D4DCFFA081B4ED64CE3B0DB3500A /* FBSDKAppEvents.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E7B0E6E540E04E62433CA83A4C48EAE /* FBSDKAppEvents.m */; }; - 2C389C03A22CD4EC0C77A9E6FA6756E3 /* ta.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 138F5A3F8406034FA35D8FAD6344E6F3 /* ta.lproj */; }; - 2C59F45A8302BB97F5678A332C14AF24 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 2C93D0ECDF231AC369DA9BB4CC43481D /* FBSDKSettings+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E4E9058104640353A63350CCBFB4E7A /* FBSDKSettings+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2CE67D6F57FFBCD493F4CF92C7FE6678 /* NSBundle+NYTPhotoViewer.m in Sources */ = {isa = PBXBuildFile; fileRef = CDF242ED4E5F4F2F93062061E4673788 /* NSBundle+NYTPhotoViewer.m */; }; - 2DC89BBEB82A8E4DAF10D2090A516F9B /* QMBaseService.h in Headers */ = {isa = PBXBuildFile; fileRef = 4244309CD584B0A5B1CA4E650C4DFAD3 /* QMBaseService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2DF8F8DF44C249F1595C4DA3C51DCBEE /* UIImageView+QMLocationSnapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 5477BE6F4695F1285770C98168E76CBD /* UIImageView+QMLocationSnapshot.m */; }; - 2E2802F592F55EFC209EB08EC25603EE /* FUIAuthTableViewCell.nib in Resources */ = {isa = PBXBuildFile; fileRef = FD17A19BCF3E5289C153971FD8F4E0DA /* FUIAuthTableViewCell.nib */; }; - 2E56FB20FB8B009CE4CE6810BA15FC0D /* QMOpenGraphModel.xcdatamodeld in Resources */ = {isa = PBXBuildFile; fileRef = FE34057A7E892095ECCFAEAC196798FC /* QMOpenGraphModel.xcdatamodeld */; }; - 2E5793F3CCE2F046D7C2BB0720502727 /* FBSDKAccessTokenCacheV3_21.m in Sources */ = {isa = PBXBuildFile; fileRef = 48E87C3DF7E589889A2DAE28EA910FA3 /* FBSDKAccessTokenCacheV3_21.m */; }; - 2E67DE05B19B19609C5EF9B3663591DC /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 230FC3E3206B292AC9BA5A7CE1B0EC7A /* SDWebImage-dummy.m */; }; - 2F1073E9FDC7CF6ED1A34A50B98A2C83 /* FBSDKTestUsersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C80B950F6085784A2295911130078C2 /* FBSDKTestUsersManager.m */; }; - 2F3891F162F9AE34771B438BEA0FB246 /* QMContactListService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = 98E1CF89D57002D0CC25E1C54E561E96 /* QMContactListService+Bolts.m */; }; - 2F6986B31DB687949F241AAE57CA1E01 /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 3EC5D6644213F16A5BD5EEE5B68685D6 /* it.lproj */; }; - 2F9F8595B81532F59CFC0D65AE0559FE /* FBSDKSystemAccountStoreAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 527740274CC6BD2FD49D950BA71702B1 /* FBSDKSystemAccountStoreAdapter.m */; }; - 2FA986F07B6B0BC7A5B603965446F28B /* NYTScalingImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D211ED0D38163DFCE49900040CC1EA2 /* NYTScalingImageView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2FEBCDE902CA94289BAC0FFF5E19F59B /* FBSDKAccessTokenCacheV4.h in Headers */ = {isa = PBXBuildFile; fileRef = 914CC03C89B4D2679E2D998C137617B3 /* FBSDKAccessTokenCacheV4.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 300AF6606D613107DE8B725967DEB9C3 /* FBSDKImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E5E419F3DA5C09513D2C39735D54D31 /* FBSDKImageDownloader.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 30ADF38389F07129BFAF30DD1C7105ED /* QMCollectionViewFlowLayoutInvalidationContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 0250DEF252E1B257DF79C7F355652851 /* QMCollectionViewFlowLayoutInvalidationContext.m */; }; - 30D5B940EFABC3062DDB917F443F73A7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 31182A7DDE0188775D8275001EDE7F94 /* BFMeasurementEvent_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A7105280B17D416DB95565FD313B201 /* BFMeasurementEvent_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 312B21BE45C7BF1D89405B3136FA4D8B /* NSArray+QMCDRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E544708C8F232DFFF0E949758760F52 /* NSArray+QMCDRecord.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 316ACF5AC94273151EBDE1C88913F073 /* UIImage+Cropper.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B5674C5E755CA9EC6689E806AA5783E /* UIImage+Cropper.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 31865B9117E579EADFEEAABC7FAEB5B7 /* BFCancellationToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 90F45A704DB63BD8CCDC74E33099A589 /* BFCancellationToken.m */; }; - 3195FA0C89BA09C6766FC70305355BF4 /* hi.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5521A7D353717A08494139A410C8A3CD /* hi.lproj */; }; - 31CEBF5444BD4C45B15A611760C25111 /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 18A0871F4897345FFDCDC49145BC4135 /* ru.lproj */; }; - 31CF84406303E5C15F513E34FFAAF194 /* FBSDKAppInviteDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = F1B430EE341351F2C244EF979AE8303A /* FBSDKAppInviteDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 31E83DB0CC749D09F21A179DACE95E50 /* UIDevice-Hardware.h in Headers */ = {isa = PBXBuildFile; fileRef = AA65AAE9580D0C2DDE5448EE074AA614 /* UIDevice-Hardware.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3200889D9198D473744AA2C657F335E8 /* FBSDKSendButton.h in Headers */ = {isa = PBXBuildFile; fileRef = F7038E58755AFE47874167D604176AF1 /* FBSDKSendButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 32057671B8E4B8C7A8A80D83678E4067 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F8FD790FFB37E5799BCFEC2C0857AC3 /* SDImageCacheConfig.m */; }; - 323F9B903A541D281976AB79049BC0D8 /* QMAttachmentStoreServiceDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = B90C6876CA6A860BB25BC6BB5E6AF142 /* QMAttachmentStoreServiceDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 32433F821DAD5C1A33962AC5A60619DC /* FBSDKShareMessengerURLActionButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 21EDC3688D7A9C8592C96A198C63679D /* FBSDKShareMessengerURLActionButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3246A8C4D595A5D279BAD90F7A00D145 /* pt-BR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B0ED464B8D35EA89510DFC2DB288C436 /* pt-BR.lproj */; }; - 326E5AA3F3EA9392B45ED044B3660988 /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E979782FC939D39B9E5227FA67FD5F0D /* de.lproj */; }; - 329021B1317884817AF4C9B0C8C85FE5 /* FBSDKDeviceRequestsHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B40B0A9549C87CF162A1873D85CE90 /* FBSDKDeviceRequestsHelper.m */; }; - 3296B7925B310E2F0474EB4448A98980 /* QMBaseMediaCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 161651A46E8AC09992F6465908DAF43C /* QMBaseMediaCell.m */; }; - 32AE1D982841FB1594A8623DFB682D78 /* QMChatDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 2363369A9239016B9C47375D5088A1CE /* QMChatDataSource.m */; }; - 32B434BB3A9093C1D60D337A8A1DCAD7 /* NSError+QMCDRecordErrorHandling.h in Headers */ = {isa = PBXBuildFile; fileRef = AB214464202C01989CCEB6D4A941A846 /* NSError+QMCDRecordErrorHandling.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 32BA99E5CB9D3DA949BBB38CB9A677D0 /* FBSDKButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EC3DC1241BCE69DE894F27B310943D0 /* FBSDKButton.m */; }; - 3328D6AA0A6DD5371B63ECAD18718F3F /* GoogleToolboxForMac-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 70F0964A96995B861633F22C8A8FFACC /* GoogleToolboxForMac-dummy.m */; }; - 3357E04069C55774690727CB7BCA3A36 /* FBSDKSharePhoto.m in Sources */ = {isa = PBXBuildFile; fileRef = A92B1096662738367F0A80D8E156C504 /* FBSDKSharePhoto.m */; }; - 338633E0E83A557431310E94C59768FC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 340DDB4E9B1DB6B21352E5F5110D33B0 /* FBSDKLikeBoxBorderView.h in Headers */ = {isa = PBXBuildFile; fileRef = 51CEFCC977A37A4282025DA873B94FE8 /* FBSDKLikeBoxBorderView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 342C587635179DC1E7BDCA5076A5D9E1 /* id.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 316AAF13E4F599B97D43FE21D25C6992 /* id.lproj */; }; - 344231E0C3CEC21A2A15294F0DAF8D44 /* UIView+QM.h in Headers */ = {isa = PBXBuildFile; fileRef = 4900159BDBDAF9D9C71F06922E2A1258 /* UIView+QM.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 347E7BAFDFD7DAFFFD6D5A3A140393E3 /* NSDate+ChatDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 865FE3C61FA656289A6CDBF3B3FF0536 /* NSDate+ChatDataSource.m */; }; - 34AFE1C590D6F30F774871E0FF6209A3 /* da.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 1709AA1693D52413CFB0F473AFE91E07 /* da.lproj */; }; - 34CBE21A3E173480273D61D0F88DA5A3 /* QMChatLocationIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B684B94FC1D586B4D4515CF97459F6A /* QMChatLocationIncomingCell.m */; }; - 352EC9EAAAAE39EC5B1B36680FB1A027 /* FBSDKURLConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 09BF859A435E37A7EE916E0DDAE77FDA /* FBSDKURLConnection.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 352F9D53EACB2C9437F1B05CAAD6CFC3 /* QMChatContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = AAF28B24CB1A52A17EC3A0606F879968 /* QMChatContainerView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3586CB8CA3352CD2652E683CDBCC127E /* FBSDKShareKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2809430D1371A3A8BB0C09EA72D28AE4 /* FBSDKShareKit-dummy.m */; }; - 35AEF4DF86F9C7E30C18EA9E37722D81 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB64F9A7C3075D2CD905607868BCA222 /* Security.framework */; }; - 35E82B4C36681994548AF47E74F9F3C4 /* SDWebImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = CD6FCFE5E8D5EB3CE81A9EAC86CA794E /* SDWebImageCodersManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 363C76FE5CED9EF403AA3C5526B2E0BC /* GTMNSDictionary+URLArguments.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F1AD2D0AE6D1FFBC18F2AF42AD672B0 /* GTMNSDictionary+URLArguments.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 368EBA3575A0E7D8F4177D54663D3A72 /* BFAppLink_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D3AB0D2FBB6356F8635DE75459DEC0E /* BFAppLink_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 370D13F918948E2EE1F151A2BC45744F /* QMBaseChatLocationCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 77A74A23D87D0BFAE4FEE061A3861F71 /* QMBaseChatLocationCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 37115174864BB38735B8941958164049 /* FBSDKShareMessengerGenericTemplateContent.h in Headers */ = {isa = PBXBuildFile; fileRef = E75A2835AF620D82367451B4333E100F /* FBSDKShareMessengerGenericTemplateContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 371FB38774107C160D7E4A16E9511A2D /* video-thumbnail.png in Resources */ = {isa = PBXBuildFile; fileRef = 29EE3959C96FAA7036DF10FCCA7585EE /* video-thumbnail.png */; }; - 37CFFF4074CFC228BDA956EDC226B2DC /* nn-NO.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 61DE9BE563D6CC709C9AFF97EFB4FC15 /* nn-NO.lproj */; }; - 3837ED6D5E835C0A38209023657C93F2 /* es-UY.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C0E8E1CF4C545D6FDC56A4F3902EFCFB /* es-UY.lproj */; }; - 383B53B942B411BF3FBACF0AF955C773 /* QMAttachmentStoreService.h in Headers */ = {isa = PBXBuildFile; fileRef = 78710B1C08656D27D63FB0E068C11AB3 /* QMAttachmentStoreService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3855CACDA01DCD6DCC3B9D77E19CEFCA /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */ = {isa = PBXBuildFile; fileRef = 0EB0754EA1F52A0C50467DA1ED9E7E19 /* NYTPhotoCaptionViewLayoutWidthHinting.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 38F5C3BB16A85DCFE121585D3566DCF4 /* FBSDKShareOpenGraphAction.h in Headers */ = {isa = PBXBuildFile; fileRef = 421603975CFE9613D73C5E6577237800 /* FBSDKShareOpenGraphAction.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 39057E210A09B62C58DE7E7F70972E6F /* BFURL.m in Sources */ = {isa = PBXBuildFile; fileRef = EC80323AA90D7D04E0FFD709CC44537D /* BFURL.m */; }; - 3951FE64DF961AFC27A19B4EB5C573FA /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 253368EAC67E1C4CF625B0C4F8B9ED23 /* SVIndefiniteAnimatedView.m */; }; - 3952D92F59CDC058F4EDB106AE6A8ACD /* FBSDKServerConfigurationManager+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 72F585DCAF3B7FD0727488358253F64C /* FBSDKServerConfigurationManager+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3975A3E4F419171CB7A8AF047035E3C3 /* hi.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C1119395340BC7D42B0AEB4C40F6D17E /* hi.lproj */; }; - 398A447B8418F2E1A777144B20D0F856 /* CDUser.h in Headers */ = {isa = PBXBuildFile; fileRef = 68E04F78D45DBA02C365BFBA84A441A1 /* CDUser.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 39C05EA6AFDFD9C3D22E235B495098EF /* FBSDKShareOpenGraphValueContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = D2D55D7D48F8784AA5618975FD617586 /* FBSDKShareOpenGraphValueContainer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3A21387CB3A12849F308A05C2B1D9B52 /* QMAudioOutgoingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 05ED1A3EBC924840992A6A6C7C4A10B5 /* QMAudioOutgoingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3A3888132C490D378310ABA71129927E /* es-CR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E8CFD3B7A2770EC269703A017FD24750 /* es-CR.lproj */; }; - 3AAA52DDEA6018AC383576B83C39695B /* NYTPhotoTransitionAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = C344810E5519B30BE90D8587E206C42F /* NYTPhotoTransitionAnimator.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3AE0BB5EF45F95C48CA1771654BB6748 /* FBSDKLikeObjectType.h in Headers */ = {isa = PBXBuildFile; fileRef = AF7FDD47B2A19B0F41A8454E7209E0BD /* FBSDKLikeObjectType.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3B69B2F2E49BDFA970A73BD158B6B7F6 /* NYTPhotosOverlayView.h in Headers */ = {isa = PBXBuildFile; fileRef = F34E641E5E00766FB7D4FD188A44A7DF /* NYTPhotosOverlayView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3BFDEC8F9EA170B2804F4FB6ACEF5839 /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = EC5EC269AC7116CD63805F89F8B85EF9 /* pl.lproj */; }; - 3C2E9621A3F17BC8628F77E5985E0C5E /* FBSDKGameRequestContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AE3120E26D9E7C9966D99F76FE7093C /* FBSDKGameRequestContent.m */; }; - 3C658955C80579F482CD86D38C8C5E45 /* uk.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E87582B826BB6B2B06E8BDDEAEA1AF57 /* uk.lproj */; }; - 3CE6301D27131086AB47EB48588CD0B4 /* QMChatAttachmentIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = DEB9736DFDF6E9649DE412138998B91F /* QMChatAttachmentIncomingCell.xib */; }; - 3D86BDA6619CA78219BADBE0F0622E70 /* FBSDKLikeControl.h in Headers */ = {isa = PBXBuildFile; fileRef = C8794E8722D151ABB99B4E705411FE3E /* FBSDKLikeControl.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3D92B26D024D54AE0287F184B712ECDF /* pt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 277DF405E98569E20375EBC7E0CE001D /* pt.lproj */; }; - 3D9A8E6B7A21FEA045AF10EBB065A282 /* UIDevice-Hardware-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DA99AEADC8E6F55D1F9275E98B16B128 /* UIDevice-Hardware-dummy.m */; }; - 3DE4C9518FA00162512CFB383BFD10A1 /* ic_visibility_off@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0C29A87E1F2D73A377A35017269D6F53 /* ic_visibility_off@3x.png */; }; - 3E45969A1E5CC0C60115BD00A3D7A2B5 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 12A2C51300046BAF7F8E9C9DD82A78C7 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3E5E38E786F6517C0D8F74BB572D8985 /* BFURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AA6A0CB78DEE3CE405F36F1D47C6A50 /* BFURL.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3ECCC2BDEC8D7EE01A5A5199D5997A49 /* bg.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 6235B487E63130C09EF071499EE0E1B2 /* bg.lproj */; }; - 3F667BFDCCDCD68BC4EBCFB79527CBB2 /* pt-PT.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A59B3E096E75CDA695BB3968D8D9DA69 /* pt-PT.lproj */; }; - 3FC13066DCDBD7950EB3028894885FD5 /* hr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A64143A91002E5943DF91263BF27E353 /* hr.lproj */; }; - 40321611C42DE6FADC6E6AFAD3BFDEB9 /* FBSDKShareError.h in Headers */ = {isa = PBXBuildFile; fileRef = CC1BF1A897EE88B1F81D3890E6E5A96F /* FBSDKShareError.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4045A655A28C4D6B2D59748FCCC6492D /* FBSDKColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A84B30D64B5821356787503B90B625B /* FBSDKColor.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 40A54B61376180D67E2AE4F86CB19057 /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 24DC05249088DBE6D4265D04365EA6CB /* ru.lproj */; }; - 40AEB270E294581531F58AB7E557120F /* QMChatLocationCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 6497E5E7908795010C44D8E62F1BB5AA /* QMChatLocationCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 41C5FD290B3789158E4F10CD957324D1 /* FBSDKShareOpenGraphAction.m in Sources */ = {isa = PBXBuildFile; fileRef = EC8EBF79BFC52516212602FC209A853C /* FBSDKShareOpenGraphAction.m */; }; - 41D340F8A337A928C1496E6E41998917 /* es-PR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F97567429CB2B3BD4A60170AAD7BFA9E /* es-PR.lproj */; }; - 42FB715BB50A9A78277CAF9577037C01 /* es-DO.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B7C1D9B2B15F69A441BF07C807C0B4C2 /* es-DO.lproj */; }; - 433698527056A7E2ED434333F1270480 /* QMImageOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A3FA50B686F8889267F1503B1BB2AA1 /* QMImageOutgoingCell.m */; }; - 4346920DE9CA4C7AA1BD9D08507DA82C /* NYTPhotoViewerCloseButtonXLandscape@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7224C90577E453117DAA1EFAB3D3AD42 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */; }; - 43D159C462988D47E5E4C613DB0794BE /* es-US.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9885097860AD717DF1B15D7C782B5A08 /* es-US.lproj */; }; - 43FEEA2EDFA087E94EC12EAD64031B1F /* FBSDKLikeButton+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = D01B7B8345D9DBE58CDA9D2D2DCDCFB4 /* FBSDKLikeButton+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 444F85B23D98689C2A5AFB23FAFD1CAF /* FBSDKAppEventsStateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1156FA220D18F49B41DE4BF56D1682C3 /* FBSDKAppEventsStateManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4462203E2C3FA51FFB1F2FF23E3ADDA2 /* BFMeasurementEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BAD650DFF338F79F40A02FB8818283C /* BFMeasurementEvent.m */; }; - 44680763E82E72D1F4A68D24A88AB232 /* SDWebImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 2745382AEAC1F9779BA878A29018A44F /* SDWebImageCoder.m */; }; - 4501151083DEC5D5F719CF5C7FFDA83C /* pt-BR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F38949F603A2EACF3E6FBFD557D69FA0 /* pt-BR.lproj */; }; - 45021091672D7F05534F20A50213665B /* QMImageIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1720A2FD7BFD50B5BCD2043986CCCC13 /* QMImageIncomingCell.xib */; }; - 45048ABF6700481C31BA546B2C0D95C1 /* QMChatBaseLinkPreviewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2006F6A514BE0C672C7C641C4D20CBE8 /* QMChatBaseLinkPreviewCell.m */; }; - 45B08FB152036153F3B0A9EDEFF1B9CD /* Pods-QMShareExtension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C6DF183F7699C11C22BC07BDA3E4365 /* Pods-QMShareExtension-dummy.m */; }; - 45E9899901496DB8E1BB77BCCB35942A /* FBSDKDeviceRequestsHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AA3D9CF7D6F9085942DDAEC5D237353 /* FBSDKDeviceRequestsHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 463C698A7352F3596968F56DAC2C7D0F /* QMUsersModelIncludes.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FDE18481FC28FC0EA250992439B5635 /* QMUsersModelIncludes.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 464EC926D168410BF0013123CF73123F /* FBSDKServerConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = B19B4CE3B5F527317F9000F8BACE68A3 /* FBSDKServerConfiguration.m */; }; - 4653ACFB1F6A68D879C7931711370E3A /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 576C65EDEB58BF1C443B14458B568998 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 46C82DB02569EA6B94BDE35D70B6FD35 /* QMImageIncomingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7489314E76093AE358D8A73DBC6A0C81 /* QMImageIncomingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 476336F61045DABCA1D537B30431AA72 /* es-PA.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BD1B6D714E8B9A95D7DC1597C1B95425 /* es-PA.lproj */; }; - 47718E216CD53112A35CEC6B4E928E66 /* metamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BEA917C9E06C082F654D936CB176D0C /* metamacros.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4783B227D49175FAF3DF30011F8DCAA3 /* FBSDKShareUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = C120840F754FD30907143B9C16AE9914 /* FBSDKShareUtility.m */; }; - 47A0E45B07A70EAF83C9C04A934F0A79 /* BFCancellationTokenRegistration.h in Headers */ = {isa = PBXBuildFile; fileRef = 57A1CC514ACB4A0A4F36B9F7F663DD5B /* BFCancellationTokenRegistration.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 47DE147630512D696442B0B2D8BE8452 /* FBSDKKeychainStoreViaBundleID.h in Headers */ = {isa = PBXBuildFile; fileRef = 8234D16036DC62F84BCD8765BE304B1F /* FBSDKKeychainStoreViaBundleID.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 481ED9FFD5A391B7420CFB66A7A5E2B9 /* NYTPhotoViewerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 63D73A83122C9917857B0BDE35A3420C /* NYTPhotoViewerDataSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4854B7CD99442CDD924EF53BE7A37693 /* QMMediaIncomingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = CA7B7C9CB0D4F98C3A14A4AC3AB97B44 /* QMMediaIncomingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4858B33C75B4EF6107B74C94537498AE /* QMImageIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE0DE1AF13C417D1AE8F69C3AFADC7A3 /* QMImageIncomingCell.m */; }; - 489710CBDE13A878AE09B3AAA1BDACD9 /* FBSDKKeychainStoreViaBundleID.m in Sources */ = {isa = PBXBuildFile; fileRef = D773F44D8CEABFB3FE06EDC01987DEF3 /* FBSDKKeychainStoreViaBundleID.m */; }; - 491CFFEE14E27F7CA9896481ADEC0CB9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 49524DD7C80C2A517F6A1352B67A44E8 /* GTMNSString+URLArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = 25640E034BB739D6AB4FD6CD7AB678A0 /* GTMNSString+URLArguments.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4960F5A74BCA61AD5ED600C323FCEEF7 /* NYTPhotoViewerCloseButtonX.png in Resources */ = {isa = PBXBuildFile; fileRef = 0FB9DC0FAC4C0873A404469890BDC533 /* NYTPhotoViewerCloseButtonX.png */; }; - 496CEBD91E685BDEE54BE6D11ED59711 /* BFCancellationTokenSource.h in Headers */ = {isa = PBXBuildFile; fileRef = A28269932111CE8DEFF54ADAC7B6CE59 /* BFCancellationTokenSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 49F7563B9792D3469C613D7FE3DCEF71 /* BFURL_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1401CC3365CC77C23A9189C456CC75DE /* BFURL_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4A25A3694889332273F230D4E4BEA5A7 /* QMChatLocationOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93840F9C95DD41243A41375787D683C5 /* QMChatLocationOutgoingCell.xib */; }; - 4ACFC2F7DA9631F78F5AD871C3C472FC /* UIDevice-Hardware.m in Sources */ = {isa = PBXBuildFile; fileRef = 47727F5161C70E2045257796A86386D2 /* UIDevice-Hardware.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 4AE621994F307DE19F0753F0BAA77709 /* FBSDKLikeButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 930FDD9F80CB0D6AB45FA86FD1A62AEE /* FBSDKLikeButton.m */; }; - 4B3D26FDE499B85581293EEB9FD4794C /* FBSDKGameRequestContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 90D0CE6379C5F06566AF9A5BFCEBEBE9 /* FBSDKGameRequestContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4C02086998A0A51EF387ED85081A1249 /* FBSDKLoginKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 41A3FAA68CCBF4BD8C1882E9F34DD3CA /* FBSDKLoginKit.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4C28661FB347EEA0B2BC5617736E56AA /* QMOpenGraphCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 9845A6BD9C372FEEB661BD93FA0B382D /* QMOpenGraphCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4C4AB36C0AEDB4E18E881FB7A5160F7B /* FLAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = FF44703B7F1B1E794B9EF6E9103AB7AD /* FLAnimatedImageView.m */; }; - 4D14F2994598C6738DB6E9636FB72D80 /* FBSDKCameraEffectTextures.m in Sources */ = {isa = PBXBuildFile; fileRef = ABCC8D3EEF42CEEB9C802066ED38AC11 /* FBSDKCameraEffectTextures.m */; }; - 4D2F4C67EFEA5A4DF14A60186D189A78 /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5613DAB5B5491F0AC952BC80F01AAD70 /* es.lproj */; }; - 4D33D3E3A477E7B25749BF391F949FB2 /* QMDBStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 16245B908265A1CAA5F8E59D203810AE /* QMDBStorage.m */; }; - 4D75D6C2A324904A26751FD369511D35 /* ic_retry-grey@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 539DB240B055D3C939E4399D843C2C61 /* ic_retry-grey@2x.png */; }; - 4DD3465293CADA5D1F454BCE5FE620C8 /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = AB9258404ACB7E29344925DF54CE71B8 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4DE155F37856B0C9E19436C5107694E7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 4DEC8F85AA18D74E5253F9428EE8CEA3 /* QMAudioIncomingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 612D6CC3C66792A48C0FAC4F1DA87568 /* QMAudioIncomingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4DFE1F1453F629A46A58841D03BAEB38 /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 12CDF285B0FE8E89D54AD2CE58FFCBD9 /* zh-Hant.lproj */; }; - 4E115F0709A1E190AC2D16B07675D1E4 /* QMPlaceHolderTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ADCEED9FDDCF63F724A95207C8AD242 /* QMPlaceHolderTextView.m */; }; - 4E2A691EA2244CD6AB4F5529E44C92AB /* FBSDKLoginTooltipView.h in Headers */ = {isa = PBXBuildFile; fileRef = 90026104B4F4B48464A9A039CB80A5CD /* FBSDKLoginTooltipView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4F4A8945C3CC04052A09C4216474ED11 /* NSPersistentStoreCoordinator+QMCDRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = CDA70F5557B015B703D106BEEC15949A /* NSPersistentStoreCoordinator+QMCDRecord.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4FCC9847FEFABF5DE936C7F3D4AE2CEE /* en-GB.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BCA3CEA30100CBAB55354EAB8FF55B35 /* en-GB.lproj */; }; - 5044F7783007CDED45140D6A3EFF28AF /* QMDeferredQueueManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E45AC1AC2A7F9B103BE98C62610E8E87 /* QMDeferredQueueManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 50AD70CA72E66A594FE811299E84D633 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 96DE4BD6A1DB6E683B825AB6ECEFC254 /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 510362610151B31E7521504B607CB291 /* fa.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BA0853D49E08E2FBB1A4A770FD46D659 /* fa.lproj */; }; - 5110F6F313DF13873F653173881955A5 /* SDWebImageImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 42FF83673066372C7EEF4020803F4777 /* SDWebImageImageIOCoder.m */; }; - 514EF7A065CC21FE9259CEBF51A2166E /* FBSDKSharingContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 53372BB1BBC02D42FB833DF9A49CB4B8 /* FBSDKSharingContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 51824C89E613E032214B602EAA06F176 /* QMCDRecord+VersionInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FA9DFEE928D4124A78F56F66F13CEE0 /* QMCDRecord+VersionInformation.m */; }; - 518D95B2B8CF2E44E1251406A6D1264E /* FBSDKLoginCompletion+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = EA4272F8265796E736AAD288790D1CA1 /* FBSDKLoginCompletion+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 51FCAE450A61A2F906184742015B97BE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DABC517BFE092CEEF189650039707D6C /* UIKit.framework */; }; - 52765B5990AAC6F7CB584AFC679161F1 /* QMBaseChatLocationCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EA1AAB9388272A9601FA37610FD4169F /* QMBaseChatLocationCell.m */; }; - 52CC1D443CC1FE11DB37BD41748A5B38 /* GTMMethodCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B33FA49AA87A2B03A63A649F780EA2B /* GTMMethodCheck.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 534C751949C6C5876A8BB635DF39F890 /* FBSDKBridgeAPIProtocolType.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B7D102953CA75CD0EF4B49546CFEEBD /* FBSDKBridgeAPIProtocolType.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 534FBD8D0E92F8D5A4A7FED6F0033F27 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 53820D15FD14F5D236E0F8E4BAF14B7A /* ms.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 6EED1F28E209FB385E025E6A79264B31 /* ms.lproj */; }; - 547453B3EC71236F2CE487BA841D1A90 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B5E20CA76356FE57EDE8348CE3BACA4 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 549DF790F06617A9D270895115A1B545 /* FBSDKVideoUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = B7617C3525C04A2422CD47870C26990B /* FBSDKVideoUploader.m */; }; - 54F0A238489A8D6DF7B44EA9ACA4C219 /* FLAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = D01803EE5338ED3E8A9482B695FEC5B2 /* FLAnimatedImageView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 556B330775D0A029F38BB12B9D85FA6B /* QMContactListCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DC935A0E27502DBF653263E0C695A54 /* QMContactListCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 558E627E3F0B1E8E8D5DF56A6E971F9B /* QMChatCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 8734F968131E17317FEDEED25EFBF557 /* QMChatCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 55B5074E8CE31F8D4952303F1FDEA7A8 /* zh.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 116B379949D169F327835606D8F8AC61 /* zh.lproj */; }; - 55DFDEFC379B07D56E31331CF0DDC42C /* QMAsynchronousOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D3EDD868EEA7475D084B3CDF7C67B8D /* QMAsynchronousOperation.m */; }; - 55F892E2510E33010B9E90B9F9938EC1 /* ic_retry-grey.png in Resources */ = {isa = PBXBuildFile; fileRef = A333E9F80C9D5C2E5FE1D0E8BCBE0CCC /* ic_retry-grey.png */; }; - 55FEDC9AF0D9B4DCBD221ECA35C27839 /* FBSDKProfile+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = D36D6EE8B7FA973FFC8F720387556BD6 /* FBSDKProfile+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5628248208CF63FB059FC05609BAA91D /* QMCDRecordInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A9A8F0DCDB8B43A0D4EDB728FF80D357 /* QMCDRecordInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 56395CA30484F9EF6C990E756FA3F5C3 /* QMAudioRecordButton.m in Sources */ = {isa = PBXBuildFile; fileRef = B190506A9CA468EE1C644C6721E0ED30 /* QMAudioRecordButton.m */; }; - 56562E830AFD78173C801D0FECAD4F7A /* QMContactListService.h in Headers */ = {isa = PBXBuildFile; fileRef = B15E08FFCFC6B8B5C8FF18F94E9FE372 /* QMContactListService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 56755F6CF8A77A72106337D75618EE42 /* QMInputToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 8400869684351A04285A9D40CE749FAF /* QMInputToolbar.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 572BB56685EF5F37F92286B1E7AC3FCA /* UIImage+Cropper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D793B6DE58E7C33B1EB8EC02EB96A09 /* UIImage+Cropper.m */; }; - 57571A55066490E431600B39B4AEAFFB /* QMChatLocationOutgoingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 426F483192C83D8CC3DF95E027314B9B /* QMChatLocationOutgoingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 575A9E4D2FDB5A6DDC1E42FDE5B5B85F /* QMChatViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 89B3356F04FE0C784B666B947594EEB5 /* QMChatViewController.m */; }; - 575B183E984A119FB4881C661BA1049F /* FBSDKTimeSpentData.h in Headers */ = {isa = PBXBuildFile; fileRef = 737AAD7D5E41B4BABFABE11DC787B33A /* FBSDKTimeSpentData.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 57BFB8AFD8E057B14D575F905A2E3530 /* es-CR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2B60CBFECEC9320662C2315BEC2E4C6F /* es-CR.lproj */; }; - 57C76225973196FD9E5F8CABCF6ABDC5 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E67FDDDBD8079680CD1EF44AB7C8082 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 57D2D2F8A8C998768E3F3283E868D98A /* hu.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 80D71308EF16B67EDA2E31A6CB82510E /* hu.lproj */; }; - 58102131F407972A258A5B735E6F06C7 /* BFAppLink.m in Sources */ = {isa = PBXBuildFile; fileRef = CC41888A8BE9DA14B959E7D4CC0FE546 /* BFAppLink.m */; }; - 58719736B851016B4F635859B478942E /* es-NI.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5A2E221AEC9C73EE67B77C9B046B6F9E /* es-NI.lproj */; }; - 587E5DC23045BBB52724E397CC8A3046 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E93EEE326E1D4E21CE612BEC878ECF1 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 58BFB38BEA44FA7E9C1C74E45AA721C8 /* FBSDKLoginManagerLoginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BB823AC01DD59F67F3C280EF863921D /* FBSDKLoginManagerLoginResult.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5911BB3C032BDF24D6727F388A525F0C /* FBSDKSharePhotoContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D912AC7B6466290F0D6374BB13373E /* FBSDKSharePhotoContent.m */; }; - 5940718F515C3A5B9BFE14C96CA2EF6B /* _CDDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 941EEE8DDE4D72C0CA6721E2A0E6073B /* _CDDialog.m */; }; - 59570F2F69AA8AE4AE337C9C87F7C150 /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = CD547AA79598002F54A2C59FD241D265 /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 59642B8EE4ADA94E2F2478208DF16D1C /* GTMNSData+zlib.h in Headers */ = {isa = PBXBuildFile; fileRef = E5B9AA543D4E180ED719F42D9C1DF0B7 /* GTMNSData+zlib.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5969C041C69FD22E0A93BB1FDA34C86B /* FBSDKGraphRequestBody.m in Sources */ = {isa = PBXBuildFile; fileRef = ACC3810C5097B7BE906992E6F67B005A /* FBSDKGraphRequestBody.m */; }; - 59C75ABBDE429357998275D40D0A2EAF /* QMChatServiceModelIncludes.h in Headers */ = {isa = PBXBuildFile; fileRef = 65B7963220C618FE7743F7D628EC3C59 /* QMChatServiceModelIncludes.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 59C902D3423F00E0E9AD382A4C528F26 /* QMDeferredQueueManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 310FAA9488055C21F5156FFFB1177ECC /* QMDeferredQueueManager.m */; }; - 5A16DF0162FED39CFE34CF225B1A5791 /* vi.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 85862B94D36F663DC302B77EA502371B /* vi.lproj */; }; - 5A3E9BD16583514FF6CF79EDD0AF143B /* sr-Latn.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F4714286DBB461215B8B37EF0BB87609 /* sr-Latn.lproj */; }; - 5A4D31D25FDFD871C4FD41A679ECC9A3 /* FBSDKAppEvents.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F843ABB86CECAB10F855F8DB4EABC0 /* FBSDKAppEvents.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5A9B6794DBA1399F7A666E8C0040FC91 /* QMServiceManagerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D7ADC322AF20F3AF63DEA494D8F45020 /* QMServiceManagerProtocol.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5AD157CE98AC7212BED20FA0DC282AE2 /* QBChatAttachment+QMFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = EB085FBF6157883D7405D01AD6B8511C /* QBChatAttachment+QMFactory.m */; }; - 5AE2C31083C9EDA0B590CA79164E60CC /* tr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 03F94CA912CB33126822B9B042C68364 /* tr.lproj */; }; - 5AEA886DD3DC314FEDFFC3F368195425 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = E209B8E253D16A436E4B9D4B48020F20 /* SDWebImageCompat.m */; }; - 5B0C45E35FE6C61AEB230DAB0D727CFF /* BFExecutor.h in Headers */ = {isa = PBXBuildFile; fileRef = A826CA3511B0341F9FA14C7517B3A33A /* BFExecutor.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5B352C0C8EA1DC075514C6A2B6C0C946 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FEDCD23F79E94BFEEB392B6B2BCEB1B /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5B506B30AABFE202CFCB4FD013F4865F /* TTTAttributedLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = F323CC8811568FC2C14872DAA3A90061 /* TTTAttributedLabel.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5B5804535A35C2E90DF7525E8491A1F7 /* FBSDKTooltipView.h in Headers */ = {isa = PBXBuildFile; fileRef = EB15A38110FF7DF1F99A4CBCA4DAC9AC /* FBSDKTooltipView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5B87625B81738770F9C3D76B3C658AC0 /* QMChatLocationIncomingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 673D039C5C3D2A441539FAEB0B0FC7C1 /* QMChatLocationIncomingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5BBA29DB5A7C64C65260A923FEFBE518 /* FBSDKErrorRecoveryConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 27E3E0D200A7DCEDF9B0B44B4B722B6E /* FBSDKErrorRecoveryConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5BBB9C327909B0A6BB532FEF5EC757FC /* FBSDKProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 50ECCB5A7B1F4B42B47C60A608ECE87F /* FBSDKProfile.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5BC7D357B1AC02C5FF1414CD347E9E7D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 5BEB5F46E69691313057FE7C9691DCE0 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7261D89E5B106DA272913C2308582E9D /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5C1DA4F703180E060549784D03EE2C4E /* QMAuthService.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B8444730DD33FA811D4A5FEE560CBF3 /* QMAuthService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5C483C83A347C162B5669117D9059B20 /* de-AT.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9560E25BE46E3BC3746BDFAD210AFB32 /* de-AT.lproj */; }; - 5C4E5A23631F8E615502D2B03972D596 /* el.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A8C5AF8EE385D9E3D372E10B83566ADA /* el.lproj */; }; - 5C850D609C66C435AC4B97B1E0D0F193 /* NYTPhotosViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C0ECC8CED6FE0F637960DABA90C3D03 /* NYTPhotosViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5D0050CC3ED70B04830E6BDCFC3A9022 /* FBSDKURLSessionTask.h in Headers */ = {isa = PBXBuildFile; fileRef = EADE13C59CE6B770AD11C434965C1A9A /* FBSDKURLSessionTask.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5DB0B4DE75B029FAEB05AD979BB1716A /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78871113E2E8880927AC6E26B088A625 /* QuartzCore.framework */; }; - 5DEBA7865ADCD002E13361E8BD106D1A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 5DF642A1886939A7CE29475442034CC2 /* BFAppLinkNavigation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AEB403D711889326E9D406BD6A2D4CB /* BFAppLinkNavigation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5E5A248D4EF19B2E3C58623B1B8271F1 /* QBChatMessage+QBDateDivider.h in Headers */ = {isa = PBXBuildFile; fileRef = 51D3EF00B19BE4EF775A4629DE731FC3 /* QBChatMessage+QBDateDivider.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5EA4069B46E2A7BFFF3C093DE35ABDF7 /* _CDContactListItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 725DBC47B9F75420475608D9A1B961AD /* _CDContactListItem.m */; }; - 5F06A2D2650BE734C54377B3B3BD607B /* hr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B1CF3AE8B27E3367F7A7841011311EBE /* hr.lproj */; }; - 5F1243E2E028D8DBBC86585C4D728781 /* FBSDKErrorRecoveryConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = AB160DC8D83E4D56E49A48F536465CC9 /* FBSDKErrorRecoveryConfiguration.m */; }; - 5F50FB08A885D5703873E6C3E71AC95F /* ro.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 0523E2CFBCFC4CBA74579265EBFACD8D /* ro.lproj */; }; - 5FBFC47CD3C4F961062DC0B8C9A2C120 /* QMMessagesMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DBE88702518FF6D03E42FCCC690221B /* QMMessagesMemoryStorage.m */; }; - 5FC7A3E6ED71AE9796BFD12171FAA858 /* FBSDKShareLinkContent+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = D4A5D4608F913AD1C6570A4870302FC4 /* FBSDKShareLinkContent+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5FE53FE00EE2DEBC4A2D2CC7BB767976 /* FUIPasswordTableViewCell.nib in Resources */ = {isa = PBXBuildFile; fileRef = 8F5B7AEEE571D96E8A6E61BFC51FD629 /* FUIPasswordTableViewCell.nib */; }; - 5FF987D846FACE55F28AB68BBD8747A5 /* FBSDKLikeControl.m in Sources */ = {isa = PBXBuildFile; fileRef = A0B8B54A2F11E9EEAFB92DBAA44FACF1 /* FBSDKLikeControl.m */; }; - 6013D3EC8382F59BF0D696DD55CFD98A /* FBSDKMath.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D3E8AA01C5AD7E1C4CC200D06D48788 /* FBSDKMath.m */; }; - 6097EDAC09C555EDCADB501799DBE7EC /* NSBundle+NYTPhotoViewer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DFEE6A246053295B257A54568E4E5B7 /* NSBundle+NYTPhotoViewer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 60B055AB726A480240A938EB323D0E9B /* ic_visibility@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9F176D3F4A34104116408EA12C4811F2 /* ic_visibility@2x.png */; }; - 60C715C8866D19E197737647A56A2901 /* QMChatCollectionViewDelegateFlowLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = FEF9C001A98CEB6AE0122452FCF79D4F /* QMChatCollectionViewDelegateFlowLayout.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 60DD4FBB7610787B6DDBAF4C55830816 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DABC517BFE092CEEF189650039707D6C /* UIKit.framework */; }; - 60E17DFC11A2C4F9BE01021684CB63B3 /* NYTPhotoViewerCloseButtonXLandscape.png in Resources */ = {isa = PBXBuildFile; fileRef = B5BE7170665952346CE708A2EF4DB454 /* NYTPhotoViewerCloseButtonXLandscape.png */; }; - 60F6005184FE10014A9FE3AB319D1990 /* MicOverlay@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = E9DDA624B4D4CBA73468014BD55527E3 /* MicOverlay@3x.png */; }; - 610C08AFF51C38912701D05A881E5E37 /* QMPlaceHolderTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = F90EDF8C1E567D939A02D1A2C4D2B893 /* QMPlaceHolderTextView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 612774B44605700550F8835DCB33326D /* FBSDKShareMessengerMediaTemplateContent.m in Sources */ = {isa = PBXBuildFile; fileRef = B27FEABD7DE7E55DD2D5630CC433AD7F /* FBSDKShareMessengerMediaTemplateContent.m */; }; - 6158C43468F42D4174812663A33B71C0 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 9329F9B4D71892A47DE7FE8D0BC53E87 /* NSData+ImageContentType.m */; }; - 623C286EA331EC090659B998E0F6F590 /* CDAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = FF0327E52EB9F0A2F3865944AFD540DF /* CDAttachment.m */; }; - 629B8D6583BB534C0C6C362C245CD521 /* ca.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 290BBF52497402C1E1F2ECF33A15EB05 /* ca.lproj */; }; - 62B7AB8B647BF8C5AD2A34DC270DF3F7 /* CDContactListItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E1124D0714F341FAA37E5F1EF98BC4AB /* CDContactListItem.m */; }; - 630B2581CB0B78AE4FD930F44E1F8C8A /* BFCancellationTokenSource.m in Sources */ = {isa = PBXBuildFile; fileRef = C259B374368E1FC66A892888422DA16A /* BFCancellationTokenSource.m */; }; - 6328151D5F829448289AE3D02C43E2AC /* FBSDKCoreKit+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = AB1BEBD2DA54928762E98B3C7CA6F98F /* FBSDKCoreKit+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 632A723B5BD7522B1CD6D0BAAC1917E0 /* FBSDKPaymentObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 684A104665BC36625E5E7349AC3AE27A /* FBSDKPaymentObserver.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6360FFD130FE897F1C68979385A5B7A2 /* FBSDKAccessTokenCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7580353044549A295F1B6FCF1312A90F /* FBSDKAccessTokenCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 636540A648A388738369E7C7E25AD82B /* BFAppLinkReturnToRefererController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4132F69849FE0836A5D2FE601B2873A /* BFAppLinkReturnToRefererController.m */; }; - 63874E7E358219BC21C52C93FE330456 /* QMUsersMemoryStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 36BCDF4E9DA8B7727F9924F3BD1D01F8 /* QMUsersMemoryStorage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 638C9E7635B674656C5F91FBE5D689AF /* id.lproj in Resources */ = {isa = PBXBuildFile; fileRef = DD96811E177616B529D37BB71CE9C392 /* id.lproj */; }; - 63DC3C9D97EBF7DF8FAA53A35226DB45 /* QMContactListModelIncludes.h in Headers */ = {isa = PBXBuildFile; fileRef = D42902B724543F2E4DAE54383181A71E /* QMContactListModelIncludes.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6401097C291EBA60A1838A911A6A750D /* FBSDKShareMessengerGenericTemplateContent.m in Sources */ = {isa = PBXBuildFile; fileRef = C782365BE089A591160CF53CB0F3421E /* FBSDKShareMessengerGenericTemplateContent.m */; }; - 6446E8BCBCA8B2CFF18B96858294A4A7 /* es-PA.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9121DB125CE355DCA65B91D11F21923E /* es-PA.lproj */; }; - 64A55BDEE30B9B4C887D50E0FF616A4E /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B36A12CDD2A61682846E88544F6927F9 /* CoreLocation.framework */; }; - 64DC584197326B0C686C2FD63F0BD3CD /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BF2A7A1EB60C520E67DCC44F60B47D0E /* SDImageCache.m */; }; - 6510E55BDD98350380FDF7C371BF92BE /* FBSDKContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 304E11684E388892253BE43A1FE88762 /* FBSDKContainerViewController.m */; }; - 6516553BAF988AE78487EF9C0FC9DDEF /* NSPersistentStore+QMCDRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = 00D301185B1872E80D384A376C2E97F3 /* NSPersistentStore+QMCDRecord.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 659265D9B0B0B897C72223E950FA97B3 /* NYTPhotoCaptionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 45A14E6E271B2A23CFC065BC2B4192E1 /* NYTPhotoCaptionView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 65DABFCE6D959CE35547948EA84BCE92 /* es-MX.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8CA05A33982B4C12B2F1F49B3129DC64 /* es-MX.lproj */; }; - 667EB9C80D7BD584207A763BFA4B7960 /* QMChatLocationSnapshotter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A3AA872B91A2CC97401057B53EAC291 /* QMChatLocationSnapshotter.m */; }; - 66B4B24E9AFA475E14DCE5974AF2BA2D /* FBSDKCoreKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 00CE0B1ABBC0A41916AB4ECEDF004CD5 /* FBSDKCoreKit.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 66F9C6603CE76B21006372A90644B9E1 /* FBSDKAppLinkUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = D8DDD2E2A5DB17074720BDAE0AAA7B2C /* FBSDKAppLinkUtility.m */; }; - 67A134A8E94DAD919F69449EC07A29D9 /* GTMSessionFetcherLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = CE2DB781A51E7357878475580BE1ADF1 /* GTMSessionFetcherLogging.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 67B00D1DAF27165DC3184061E5B9AC32 /* BFAppLinkResolving.h in Headers */ = {isa = PBXBuildFile; fileRef = 4017B8003DD493405C9F1E934B7CEBAB /* BFAppLinkResolving.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 67BF090BD5423F8BB944980C827F2813 /* UIColor+iOS7.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F5426E0596D31EF4A4CD72FA6408EFB /* UIColor+iOS7.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 68091E0D6315CE37B589B9C5BD12EF52 /* FBSDKShareOpenGraphObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 55F0C079A0FB9471888D47EDACE322CB /* FBSDKShareOpenGraphObject.m */; }; - 68ACCC221987134A602989CF31462CB6 /* en-SG.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8F101F2C22B028A548542E524E2CE28F /* en-SG.lproj */; }; - 698A0D6089EB19BC6C4852BCDA64DE52 /* QMProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = E2281148E32732F05A250CA1D041B1AB /* QMProgressView.m */; }; - 69B023BF0441AC711FACD1C31A36D52D /* FBSDKError.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F587D27457E1B4ED4F84F28B04F5FC2 /* FBSDKError.m */; }; - 69BDB272BCE121313FFCBAEBDE427B40 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DABC517BFE092CEEF189650039707D6C /* UIKit.framework */; }; - 6A7C95356BF906A2F584A9536F5C7E34 /* FBSDKGraphRequestConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 66652D1C943DF95E9B8C052B11382F97 /* FBSDKGraphRequestConnection.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6AB6EC57A65E589869287F0BDF345138 /* QMAudioOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EAEF28FAA8E49DBC59C45F508E1332D9 /* QMAudioOutgoingCell.m */; }; - 6ACCD5F6928D618D75115B33000226A9 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8AAE4BC3BD6B31FDA1BFF684B33958C1 /* zh-Hans.lproj */; }; - 6B229865ED5EB4434D35EFB853CB5A4A /* CDContactListItem.h in Headers */ = {isa = PBXBuildFile; fileRef = C9D0E7B1C95FF0E4CB51FFE85F8AFDCB /* CDContactListItem.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6B2C9EE132D0725E2DDFB6052E2D2B37 /* QMChatAttachmentOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D44A4B8373DFF377FF67D6EAFA64AF40 /* QMChatAttachmentOutgoingCell.xib */; }; - 6B859744391C5D657BAF6F196ACE43E2 /* FBSDKAccessTokenCacheV3.m in Sources */ = {isa = PBXBuildFile; fileRef = B8B9A84DA4BB671C5E92592F223298A7 /* FBSDKAccessTokenCacheV3.m */; }; - 6BB488318F9F4927C35C2E3B9F2A50F6 /* de-CH.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 677A812CF6F8FB1C7C9B8EC169E321EE /* de-CH.lproj */; }; - 6C3EAEE7944DCA30C133675CBCFBD8CC /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CEC4854342C3AD8A79A73B36AD81409 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6C58E80CA4D359881C747200CB074ED0 /* QMProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1468C9B73C33A190A0B7CAFC3CF469 /* QMProgressView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6C72F3CF7CE4916238663F791BF7C57F /* FFCircularProgressView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 439D15E6A57AD45C05140DFFB257AF4B /* FFCircularProgressView-dummy.m */; }; - 6CA956771DED554091C3AE32DAABB6C5 /* kn.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 3D8AF6BAB43FE87605724FD13C24B926 /* kn.lproj */; }; - 6D4458A67DA7BD76489B393208F2213E /* NSString+QM.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A4C8E5B60222704205C0EB815C2DD68 /* NSString+QM.m */; }; - 6D9EFBB53CF1920891EE8E1C146777B6 /* FBSDKAppGroupAddDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = B274818CA26AC2C189F1A10888BA1A65 /* FBSDKAppGroupAddDialog.m */; }; - 6DD7B579F3FA3E995985EDB675131C85 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = D91544FF70B6A4903BD91AD1F3E9A26E /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6F3F5A598202557A5B8A8747C7621DC4 /* QMUsersCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B7E9C635CDC54617BD3E27D80383C1B /* QMUsersCache.m */; }; - 6F65D8F95B40DCD766C9DEDB92F80496 /* FBSDKAccessTokenCacheV3_21.h in Headers */ = {isa = PBXBuildFile; fileRef = E25B0FDA8817591CA826DE8B70D367F0 /* FBSDKAccessTokenCacheV3_21.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6FAB6115C610243E091B73521FA60700 /* QMCDRecord+Options.m in Sources */ = {isa = PBXBuildFile; fileRef = BA48DA40D3D6E1A4DC7990BE33C8132A /* QMCDRecord+Options.m */; }; - 6FDDF781065B121C22FF3B89D36F71FE /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 468DA1A0E511A4659BC03C827B2C1CBE /* en.lproj */; }; - 70142C988CF9534083BEC108EDC46A1C /* FBSDKAppGroupContent.h in Headers */ = {isa = PBXBuildFile; fileRef = B58379B06E15719329B0659DB330DA0A /* FBSDKAppGroupContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 708122532A4F1562FEB6C8B9D65644B2 /* FlurrySessionBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = BC851FE9665A131E38587F26DDA01AB8 /* FlurrySessionBuilder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 709B84D8CB8045EFFC1276CAC04D7055 /* QMChatAttachmentIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 020161628B89E14C3C3F68F0CD675623 /* QMChatAttachmentIncomingCell.m */; }; - 712031D47052565D64E8C58CFE5994F6 /* NYTPhotosOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7275BF00124E50EF3AD0D355DFD1FB9D /* NYTPhotosOverlayView.m */; }; - 71537243BF2F107441851F32A0816175 /* FBSDKCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 39B3631DF36D9826A8FED568C5FFDFC4 /* FBSDKCrypto.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 71792DAF91CB73447802C414EBF74F3E /* FBSDKBridgeAPICrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EA6A30D23F80DBC394CAA1A1EAB6709 /* FBSDKBridgeAPICrypto.m */; }; - 7188DF3730B2487DF61B39542DC33DC4 /* es-HN.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 20DD78246E0CFCE5D9AA0F1DEF29A968 /* es-HN.lproj */; }; - 71BC14A1479569903827A6CF32B62913 /* es-MX.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 4FD7ABE30D46AAF51A7975510061E506 /* es-MX.lproj */; }; - 71FBBBFC5E6433E531DB69A348327411 /* FBSDKAccessTokenCacheV3.h in Headers */ = {isa = PBXBuildFile; fileRef = 6611303AB4691567B73B2C4FB51A5EFB /* FBSDKAccessTokenCacheV3.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 723DC40F13A52533176C295A1DA2D3B2 /* es-PY.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B45E8EFA013B3C2AC1B110A375146ED1 /* es-PY.lproj */; }; - 7254E455525B9F45483D95AE3CBAA3BF /* NYTScalingImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 136F8B0D611414D2A36711B420E90B9C /* NYTScalingImageView.m */; }; - 725C88E2412018B049C6229EB24BDCA0 /* QMChatContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 99E9BFF5BB30723423D7283F580BCACA /* QMChatContainerView.m */; }; - 72B17EA055E206AE553FEBA584B44D55 /* mr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BF2790CED9D0486C1ECE9B657ABC893C /* mr.lproj */; }; - 72EB9AC53E9DB6DD3C0FC2354075A4A3 /* FBSDKServerConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E4160030C35442B19C69FF664B892BD /* FBSDKServerConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 738E3A9D0A66A5006CD25716C03255B3 /* QMAudioIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = DBB3F2CA5EDBAC34D1AB024D88FE89A9 /* QMAudioIncomingCell.xib */; }; - 739D657397B607C6C31C72ED64904A95 /* FBSDKShareMessengerActionButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AF171297875DFFC8CBAABBE2FA1FA7A /* FBSDKShareMessengerActionButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 748D5D899BDDF005F3AE3749CA3EF282 /* QMToolbarContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 54CF07DD8779CF1813A573B16BD7555E /* QMToolbarContainer.m */; }; - 74D19669A384604DCD75493D237E3A0C /* FBSDKLikeActionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 95B8F3DAD4B5925CAD8B9DB63B8283D8 /* FBSDKLikeActionController.m */; }; - 752F75F22C584CFA75561A4DB841602A /* QMChatCollectionViewDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = E0E7991DB50CAA2A1607953A62C51099 /* QMChatCollectionViewDataSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 75A8F85C5015E09A9B983210D084F7E8 /* mr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7F23B97F1E7A0309EB85CB864F1EA151 /* mr.lproj */; }; - 75CA0AE4E19FA1F82CF63F14D4A57EF0 /* gsw.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9A5067A83C65BDAAF4E0694FFE1A27F2 /* gsw.lproj */; }; - 76540BF97898CF8A2FF83B6EA6FC3B44 /* FBSDKBridgeAPIProtocolNativeV1.m in Sources */ = {isa = PBXBuildFile; fileRef = E912FB8C12DDC129C07AED6A346DC3A5 /* FBSDKBridgeAPIProtocolNativeV1.m */; }; - 769D18D4B4C37109C65AD156A0575E73 /* es-CO.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 6C7A0E88383A821E2A7013143BB9D590 /* es-CO.lproj */; }; - 76A04489E85BE2D2AB36A926A5175988 /* FBSDKShareMediaContent.m in Sources */ = {isa = PBXBuildFile; fileRef = D96720D6317B3A4095A8BC3B7093E97E /* FBSDKShareMediaContent.m */; }; - 76B8650952EDE4B2FDEABCA6E18DD9E1 /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C3FC244C5A5F171845825CC15794216E /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 76D43DBCEB92582FF3CC76B876B03ED4 /* QMVideoOutgoingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = C0E0DD88A0D6413B1E90135A3BB0236A /* QMVideoOutgoingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 76FC774884990D1D3AE1725BC8C26B20 /* NYTPhotoViewerArrayDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 77980B63A51A4587B0F20A7D6D67BD71 /* NYTPhotoViewerArrayDataSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 774547CA17465CE53016022C05C271E8 /* FBSDKApplicationDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F34BE90DA47B8362FB48F52F13FA00CB /* FBSDKApplicationDelegate.m */; }; - 7748A4C275AC4A2F04983A636F05D8FE /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 96AE3735391F049B3F9A15A9E25D415B /* UIImage+ForceDecode.m */; }; - 7791C446F3FF2B9E725A70F26ADEB943 /* CDMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = F8EBE0FDA117DA7FC38FC530F535B132 /* CDMessage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 77AC176D88B0888A14BE613CD68F6EB7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30722CDBA4D0A56C8E0C4A8AEB0F7DD6 /* CoreGraphics.framework */; }; - 77B76C209CBEEB52B5FBB13ED0D9EFC9 /* FBSDKLikeActionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 47081DBCE7B0B7F8F70162BC17979CF9 /* FBSDKLikeActionController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 77C7D9BEE6939BE8350AA2F77717CB34 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9362AAB7CC312287A4811C37235F233A /* MobileCoreServices.framework */; }; - 780BB9FBD9B819B01B486746EA2205D8 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = EF47236BC47DEB7D714A46FD340BE204 /* UIImage+GIF.m */; }; - 7893A234C42B3AF4D93E015F83DDFE86 /* FBSDKMaleSilhouetteIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BBD16B6A2FA030672B5EA90C507F94D /* FBSDKMaleSilhouetteIcon.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 78A3456D606445439ACB8B4DD1958F0B /* FUIPasswordRecoveryViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = A26842186BD1CB2BCE1B00438496C232 /* FUIPasswordRecoveryViewController.nib */; }; - 78AB667BEBE3A1AFFBBCE14F4722E35B /* FBSDKLikeDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 42E2F6CEE0AD7051F957283D989F48C9 /* FBSDKLikeDialog.m */; }; - 78D0EABDE58F2D1806D0F3FD340FD33F /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D2FDD67FB5585AF665E74CE5DBE363D /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 791FA10E1D45B26E251371316B64E97D /* FBSDKGraphRequestMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A33EC680A2D1B15175B7387844ED892 /* FBSDKGraphRequestMetadata.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 792EC4DBDCEB70F39918B96745FA561F /* QMServicesDevelopment-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 346662EB2A7A157DBC79D8F534EFE06A /* QMServicesDevelopment-dummy.m */; }; - 7972C64FE4905C1BD9277817F8F4FF85 /* es-UY.lproj in Resources */ = {isa = PBXBuildFile; fileRef = CD85000A4762E3BF7BCA4D04C68680EF /* es-UY.lproj */; }; - 79C7BED2255039049E35A80E03FD678D /* FBSDKButton+Subclass.h in Headers */ = {isa = PBXBuildFile; fileRef = FE69ECFC90BBD846632095A9ED754462 /* FBSDKButton+Subclass.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 79FE279B6732E4EBAEAF9254818FB599 /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = BCBC80C944FD728441D47B472D2B9423 /* SVRadialGradientLayer.m */; }; - 7B0F795A571BEDCE35944CC22920604E /* QBChatAttachment+QMCustomData.h in Headers */ = {isa = PBXBuildFile; fileRef = BACD7BDC86D762C18408E43D9CCCD90C /* QBChatAttachment+QMCustomData.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7B61A2612E4CB1721E5D2E069FA5CEC6 /* QMAttachmentsMemoryStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = CCE9BDF35B7BC9F96EDC8AE020630374 /* QMAttachmentsMemoryStorage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7BAF4C13BA42D722CEA52471CABBF058 /* BFTaskCompletionSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 18F58F777A474BB227B55A448B074D94 /* BFTaskCompletionSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7C225D90CCCF964082A155686747A4F4 /* FBSDKLikeBoxView.m in Sources */ = {isa = PBXBuildFile; fileRef = 11785C80BBB15A24FC6F6FEF006677D3 /* FBSDKLikeBoxView.m */; }; - 7C24C040EE2016695820B719D6E25DFE /* FBSDKMutableCopying.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D3E67792CFD928032A2EB83FC342B91 /* FBSDKMutableCopying.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7CD479D46C6B09F2D4A0F837E46B8113 /* bg.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 59F707A4D45FECD47911F6221209771F /* bg.lproj */; }; - 7CFD71E7CBC52D52F1C6575EF8B2A905 /* NYTPhotoDismissalInteractionController.h in Headers */ = {isa = PBXBuildFile; fileRef = E9F947F5AF24470A6F64885B134F2D83 /* NYTPhotoDismissalInteractionController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7D471EDF636121F92FD1DFE8F555290F /* FBSDKShareDialogMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 80EC509EB72394DC196A2115B55556C1 /* FBSDKShareDialogMode.m */; }; - 7D6D66599E58B5C64607BE59223BCC01 /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = BFB75EC2FD5EE824A110AB3CCB76313B /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7DE67EECCADD9D9C411718AD17DA9742 /* GTMSessionUploadFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 236F42CC0F327F45A723EA75F321EC1D /* GTMSessionUploadFetcher.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7DFE81077D4C4CCB2F7F11E42A085893 /* es-AR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2C6877E7ED66484A34358D2C66511A79 /* es-AR.lproj */; }; - 7E189CE58B25B5F613F4615161CA7E6A /* FBSDKTypeUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 3573DCA69E1B8D952FE70D21F3CCD4C7 /* FBSDKTypeUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7E1C7198F6888EBED5C8378D0ADAAE09 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB64F9A7C3075D2CD905607868BCA222 /* Security.framework */; }; - 7E1DC0A0E6E467ED0C3099BA33ED8C5F /* NYTPhotoDismissalInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = F75F6ABC6C9FD4B2CE46FBE049EED8B2 /* NYTPhotoDismissalInteractionController.m */; }; - 7E43DC7B62F1DBE513EAD2D15E6A59CB /* NYTPhotoTransitionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A925F310B20680D87C8BA5241B132EB /* NYTPhotoTransitionController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7E5CECD2332E804BD517F2A387237051 /* QMAttachmentsMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = E7C501DF46E37169339F5FF6593AFFB4 /* QMAttachmentsMemoryStorage.m */; }; - 7E7E10DC8039FF5CD0D7BDC21A405765 /* FBSDKShareMessengerMediaTemplateContent.h in Headers */ = {isa = PBXBuildFile; fileRef = B3F4ABD9B9F0AC534E01D48F7E854569 /* FBSDKShareMessengerMediaTemplateContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7ECFA5740B637D0EE7B3C0B20C384FE9 /* UIImageView+QMLocationSnapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = DCE60203ECFAD7051D11A0987E884007 /* UIImageView+QMLocationSnapshot.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7EE9D7BE4AE2D89B8DCD3289F3C76B91 /* FBSDKBridgeAPIRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 8277160AD8AB8D66A5F9FA04182DF049 /* FBSDKBridgeAPIRequest.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7F00A17A0FABFBDD0B34ADEB6453EB76 /* FBSDKShareVideo.m in Sources */ = {isa = PBXBuildFile; fileRef = 20C86635B92C916B2C7F03A80AD20B7A /* FBSDKShareVideo.m */; }; - 7F24CCF6222C7F0553295897493A4945 /* BFCancellationTokenRegistration.m in Sources */ = {isa = PBXBuildFile; fileRef = C25E8F882DD681F894034D1F2C53AFCB /* BFCancellationTokenRegistration.m */; }; - 7FA4ECE9588FEA1E7621014866D55D0B /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AC39CF4BA6589985FAADCFDF1BA3E12 /* AVFoundation.framework */; }; - 7FC26CF1318C4908FCF103E788C1E0B4 /* TTTAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = E3149B0ECD4A782BE43812322E0BDC12 /* TTTAttributedLabel.m */; }; - 7FD253034441920C22B04A8035D40B55 /* FBSDKKeychainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CEE30EB9713F3BD8EE32897B4687C3F /* FBSDKKeychainStore.m */; }; - 80604CAB3BC10E8411FC20189B671DD5 /* es-GT.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 3DEE0A1098AE88EC9F19D6AEAA0E41EF /* es-GT.lproj */; }; - 80CA131A3F0E94CD939976FC0E91D096 /* QMDateUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F69150B1DF4C1D9A6C739047C86B4F9 /* QMDateUtils.m */; }; - 8145428C978F68DBF649626A8DED8337 /* en-IN.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2379C8883B195F4E03743473D6FBC12E /* en-IN.lproj */; }; - 81689C56A439A56BBBD97C8FDF55799E /* en-IN.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2EAB930F0A5A304D5C04FA3A623A55D1 /* en-IN.lproj */; }; - 81F1D2F5A43BF873340F619062DFD88C /* fa.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5779731C87750D108D00BC71EB784963 /* fa.lproj */; }; - 82052CB69B788A39875D052B6F50924B /* NYTPhoto.h in Headers */ = {isa = PBXBuildFile; fileRef = C81218AD37A38068AA0C578DD52DF5BD /* NYTPhoto.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 825BE7C8773296CEF444107F2D5C44B6 /* FBSDKGraphRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DD8E1C76F3FDD9FC87B38C23AD2E2A1 /* FBSDKGraphRequest.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 826276AD21052B7BD70849782D99C70B /* FBSDKIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C7B1DAD03233EF3304B1CCDEB81243 /* FBSDKIcon.m */; }; - 82A0D807276FDBF072CBA377C8C566F3 /* FBSDKLoginTooltipView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BE4F51B8CF03709B6F99E35A7849E56 /* FBSDKLoginTooltipView.m */; }; - 82E93746DF0D796E73A568A62578F7C8 /* sl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 51E83AB4AEBF101CC7B71018A64AD427 /* sl.lproj */; }; - 835963CD9A19E3A9A1194823AA7453EA /* FBSDKBridgeAPIProtocolWebV1.h in Headers */ = {isa = PBXBuildFile; fileRef = 530987E9AFF3ECB3018C85C934E5C1FF /* FBSDKBridgeAPIProtocolWebV1.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 836F143FA117F634DB6563C33E3D809A /* FBSDKColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D1060F6CE86F9203A33FCAA1D4B7778 /* FBSDKColor.m */; }; - 83BF20C36BDA14B51FD071A7E4DDEBF3 /* QMContactListModel.xcdatamodeld in Resources */ = {isa = PBXBuildFile; fileRef = F9113C63400BB93F9C37E2BEA20D2DD3 /* QMContactListModel.xcdatamodeld */; }; - 840F7ACE461CB36F7707B76063783D57 /* FBSDKSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = 224D173691747421A18CE820EAB0E7CD /* FBSDKSettings.m */; }; - 843D06C93EA1D01129F7C457E0516483 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 847BF045F34DFF955C750A56A0628D62 /* UIImage+QM.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EE719DF66153E1A888A029ABDB3C648 /* UIImage+QM.m */; }; - 848C82C9B1C1FE1C1283C1D9645C08FB /* FBSDKShareButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 8984E3C783F423873397C30EF5EEE2BD /* FBSDKShareButton.m */; }; - 84E122B73E2DC359298387B93C3336C9 /* sv.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 92E0CBDBF91400DB48669528F6E91251 /* sv.lproj */; }; - 85BDE8CC2714C8C18BD035332FD49C65 /* NYTPhotoViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9CACB99A50BE84D5646879AD16B90C /* NYTPhotoViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 85CC4DC5B002202AD01C58FE304F02E0 /* QMMediaDownloadService.h in Headers */ = {isa = PBXBuildFile; fileRef = 931A28D49A72DD4F0897B0C223BE3E7D /* QMMediaDownloadService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 85DF76D1E67DAC35A09407D5770ED7FD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 8649E761D05E1EC784EED8E64D0BE3EE /* FUIStaticContentTableViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = 25454ED04A6FAA7646044C6AA6E9F295 /* FUIStaticContentTableViewController.nib */; }; - 8674FFB961D3CEFA8435C60DE791B8C4 /* QMVideoOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F6D00915FB1BE081D4248A92A14C046 /* QMVideoOutgoingCell.m */; }; - 86C4051CA97EAC380D2115C4DE832D8E /* FBSDKGraphErrorRecoveryProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DC24D183EDFC1A12AA3C39BF0F1680C /* FBSDKGraphErrorRecoveryProcessor.m */; }; - 875CF0420CED173A49D7CABACC328671 /* FBSDKShareConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E95A348AE6C9FE58C521DC686557EBA /* FBSDKShareConstants.m */; }; - 87F58C0B508F8C664E211C5676830BFC /* FBSDKMonotonicTime.m in Sources */ = {isa = PBXBuildFile; fileRef = D0344C9CACE3BAD71627ED84C722AB26 /* FBSDKMonotonicTime.m */; }; - 8855489E0A6A51640668AF7846D48BF2 /* QMLinkPreviewDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 784A32ADB3618C2A1AC336B335CE5FD6 /* QMLinkPreviewDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 888504203FE1EED1860E40396780AD4F /* FBSDKVideoUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CED475A16F4DE439ACF794B37041710 /* FBSDKVideoUploader.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 88972D979E4770498CEDA0ADE5A45BDF /* FFCircularProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = AF2B9C8E3B8DB48A631838EE36950B33 /* FFCircularProgressView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 88B2BD001379756E21EF26422BE0CA24 /* QMDBStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D88F415F620DD532D545D531B9FA94E /* QMDBStorage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 88BC81D768B9932854437C0E839FEC8C /* SDWebImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A499C6C09B6BE90562AC44979B08C891 /* SDWebImageCodersManager.m */; }; - 88C8E5752E034D7960806CD0E7BA90C4 /* BFAppLinkReturnToRefererView.m in Sources */ = {isa = PBXBuildFile; fileRef = 865E5FA44C5C9D8EC6BB2DADE3BEDCFC /* BFAppLinkReturnToRefererView.m */; }; - 88EC8303D5179979FBFF397C01FD52F8 /* FBSDKAccessTokenCaching.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F5EF6510309AB85D223836242E1C7A2 /* FBSDKAccessTokenCaching.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 892E7FA47FAD48EF6732F09C694B619A /* es-VE.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 4C7257E4C29305181DE54BAAB7FE33B7 /* es-VE.lproj */; }; - 89370CB57F3844C3AC71AB641D2B9CA4 /* FBSDKAppEventsDeviceInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 99649297159B6E699F535BC837099254 /* FBSDKAppEventsDeviceInfo.m */; }; - 893FB309FC3423FE4FAE158C6EB5FF60 /* FBSDKSharing.h in Headers */ = {isa = PBXBuildFile; fileRef = E61F026F7C0E548275FF388A259E6012 /* FBSDKSharing.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 895A7035AF63DA1585BACBD3E8EB0548 /* gsw.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 4096706BE8413AC67CCC9AFD720AB964 /* gsw.lproj */; }; - 89617E1EB8ABD505E51023744BA48CC2 /* _FBSDKLoginRecoveryAttempter.m in Sources */ = {isa = PBXBuildFile; fileRef = B6075C0B4FDB662B359478AB679EEA3C /* _FBSDKLoginRecoveryAttempter.m */; }; - 8A4C5C58FB27DB89BDEDF38949B5A675 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EE4C18E6BD9975A20DE23FB5BBC0A8B /* UIView+WebCacheOperation.m */; }; - 8AD166274D3E60F3CA0CDE3159EF1B5C /* ic_email@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 23246FB30379B93B31B241B71A037690 /* ic_email@3x.png */; }; - 8B03C49A3CE3E5CB23C3882B5E251283 /* FBSDKGraphRequestPiggybackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFE438430990FEAE8590241A34BBC259 /* FBSDKGraphRequestPiggybackManager.m */; }; - 8B1C1FE19FAD0B7E9275A8DBC5310AB3 /* SDWebImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 57DF8A2F4AFF8700944BF54747456003 /* SDWebImageCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8B7BD14CFC617B92259AC1A3EC9CC517 /* FUIPhoneVerificationViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = 20FAB20F7BD0FBADD8B3C8D33E9484C9 /* FUIPhoneVerificationViewController.nib */; }; - 8BC51CF733CFE09BF35D3D3485C83431 /* es-EC.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B7B312B0FBDDCAB7F974689328D53CE7 /* es-EC.lproj */; }; - 8BC8B58C6FFB994BD3AA6BEFF7FAF528 /* QMServicesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = BFCC09138971E3778F69E3B6F7948BA9 /* QMServicesManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8BE2FE5B36D4BB15D3CF728014BDA679 /* NSManagedObjectModel+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CBF688CEC2CBF1FF7C9126833B0F107 /* NSManagedObjectModel+QMCDRecord.m */; }; - 8C21CB73126926339DF7868C30597666 /* _FBSDKTemporaryErrorRecoveryAttempter.h in Headers */ = {isa = PBXBuildFile; fileRef = 25CB0B9950F05337E357A2FFCF0C57E5 /* _FBSDKTemporaryErrorRecoveryAttempter.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8CA0ADBB82280DA1C12FDC7C6ABBC6C2 /* en-GB.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5054C3A56F28980B6B2CF317B7E1D48F /* en-GB.lproj */; }; - 8CD0E790A1AD5AA4908ADFF8BD1ABBF2 /* BFMeasurementEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFCEC73586253D59E882180008A44AB /* BFMeasurementEvent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8CEB0F53C304B2591E79E7FB7D77EB19 /* sv.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 724A3BA1F2360D65C0485CF56153184D /* sv.lproj */; }; - 8CF6CC4B1DB6893C2FD7777C06FA6DA2 /* QMAudioOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 770C4F79199C10A909FDD508F7E2ADBE /* QMAudioOutgoingCell.xib */; }; - 8D0358876A8871F5118E991B97426F0B /* FBSDKMessengerIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = 72C53FF6D4E7AFC1B5FBD911B16A9723 /* FBSDKMessengerIcon.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8D3FDE2A13A4B3D45C8C2A81EA5CEB70 /* QMAuthService.m in Sources */ = {isa = PBXBuildFile; fileRef = 717CB45F4A36E01172E1AC1D8F46A5FE /* QMAuthService.m */; }; - 8D43A9ADAFAE11BCC7C89E73F0D4B00E /* QMOpenGraphMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A3828F6A78E85D3370113C6DAA7C106 /* QMOpenGraphMemoryStorage.m */; }; - 8D78989E47F42E655BEB3431234ADC14 /* UIView+QM.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B538BFDD228E858FDB6E9B9165BF754 /* UIView+QM.m */; }; - 8E6A944C7A7A29E67741A962E2CBF25A /* FUIPhoneEntryViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = 465AB90C5EF9D68EECE4B3BD86541317 /* FUIPhoneEntryViewController.nib */; }; - 8E75908D74604A7BFC1D3094B8F5000D /* QMChatConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = FC78856E6354DC18E9EC9F790D5CCC6A /* QMChatConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8E9F98EB1722C713AFC1D4677A07F6DD /* BFAppLinkNavigation.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A39D6F05FAAD1BFAAB9A5EE233F01E /* BFAppLinkNavigation.m */; }; - 8EA0CB5542D7F9329D9F663606B7ADB0 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 96B1572728A190E05E5FFD03600F3041 /* zh-Hans.lproj */; }; - 8EC9CA21733FBDA23037FA0EBB029B3E /* FBSDKLoginKit+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = DA134C2686012652233FBCEF289AFA1B /* FBSDKLoginKit+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8EEA892BBA9A60E1AC22E0531EF77696 /* QMChatAttachmentService.h in Headers */ = {isa = PBXBuildFile; fileRef = C42D7345B75C0B52AB0CC22B956E6C1E /* QMChatAttachmentService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8EF00CD9F498773F68D59345EE2EE627 /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5A48E1F8870FE522B8B03B8D6383BE94 /* de.lproj */; }; - 8F175FE55848DE44797AEB6CEF1F902F /* GTMDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = DF8A6C68974A1DE0DDE95FD2AA38A06D /* GTMDefines.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8F1E651FD4AB069E929E4861585C1FE2 /* FBSDKLogo.h in Headers */ = {isa = PBXBuildFile; fileRef = 021811014C6811F999E09CCEEA749660 /* FBSDKLogo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8F2248745F080DD9AC444FDA0C41D1E9 /* QMChatTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = C9FD577CF6752046393D39C9F10AE63F /* QMChatTypes.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8F2870CD90868F3F083A0404BB97FB74 /* QMChatCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 480DEFEC07FEFB327E654482C758FE26 /* QMChatCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8F2F45803E009A79050AD6EC126504AB /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A06EDCC386DEA3CBD459D81F769D207 /* SDImageCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8F3CC722BCFD80169D97EC2EDEF14586 /* FBSDKLikeDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 763328B5B00FB93B9A27AEF090890729 /* FBSDKLikeDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8F7104EE1368B87F3842C509983FA79E /* FBSDKWebDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EDA899DC97EFD23CDF25D0CFC25100A /* FBSDKWebDialog.m */; }; - 8F8B776F8C5565B56049DE92A3621A32 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BFB578BDC5C00F9C43BB69736513D505 /* en.lproj */; }; - 8FB9749DAE50E11E26119AFAE4C61365 /* QMOpenGraphCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 316215B7013BE1DFFA26A3D91BE648D1 /* QMOpenGraphCache.m */; }; - 8FC14AB272B3D184094DEEBEC7ED9F41 /* FBSDKBridgeAPIProtocolWebV2.m in Sources */ = {isa = PBXBuildFile; fileRef = 83E12C4275C4962131A88468C39E4E7E /* FBSDKBridgeAPIProtocolWebV2.m */; }; - 8FC4B5D425DB6638482168602F8350EB /* libextobjc-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D0A99BC54878E91083A53C42B9B56CF /* libextobjc-dummy.m */; }; - 905F7F6FC4CCFEE60D3819F2F628FB44 /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B99F44A43827F9B7E8137EE56131739 /* SVProgressAnimatedView.m */; }; - 909298A64665870F2B9D568C8F3ADDA4 /* QMImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BC8D415AA7995B656FD3B807AA3FBF2 /* QMImageView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 90C9ACB59906897964D59B30410C9532 /* gu.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 19CA64CFFB1373DB2F36C75F44779B87 /* gu.lproj */; }; - 90EF40B92708B87689D5F26C684FAC60 /* fil.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F34A22F8F20B07F395EBF077EE65CD20 /* fil.lproj */; }; - 90F4004185DF6032B7D28D8E3454ADFE /* MicButton.png in Resources */ = {isa = PBXBuildFile; fileRef = 395C05110DAA0DDF5EF8485AF515D418 /* MicButton.png */; }; - 91C9C419C2E304B3A68293C22053034E /* pb_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 0BB44EF4CF585C9E7976DA68DE0246E0 /* pb_encode.c */; settings = {COMPILER_FLAGS = "-fno-objc-arc -fno-objc-arc"; }; }; - 9247CC94FF81A45C7B3235104EE18543 /* FBSDKGraphRequestConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 392E162EB13ED06DFFC2CE09453A94FC /* FBSDKGraphRequestConnection.m */; }; - 9257CA625D3F36E5F1E2A4C2AC4E940A /* QMHeaderCollectionReusableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A7AC09977AA6C9C8D865A841514714F0 /* QMHeaderCollectionReusableView.xib */; }; - 929955F0C3ED2B4C211B1F67A5F75C0B /* FBSDKBridgeAPIProtocolWebV2.h in Headers */ = {isa = PBXBuildFile; fileRef = 25C8961FDA126C1338204200D54CFEBB /* FBSDKBridgeAPIProtocolWebV2.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 92DD86DC0DBE1C361B264EA0180EF534 /* EXTScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E2B2EE2F10166FAACC37EC6DF0FA833 /* EXTScope.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 93025B5DC77C5AAD1962B346EDA4A7C5 /* FBSDKCloseIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = FFBAB761922F0FA88279C1DB10C306D2 /* FBSDKCloseIcon.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 93B52E4E902C0FEDA6A9F41A6AE87F5C /* ic_phone.png in Resources */ = {isa = PBXBuildFile; fileRef = 627D21F92819D80D382095A239FBC0C6 /* ic_phone.png */; }; - 93F1FAFED2A47CF4E88AAA8B6993F9A7 /* zh.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 894D921C5A6F02266140D6D0C128A541 /* zh.lproj */; }; - 9417B872ADCACCC4CFED22B51F5E05E0 /* GTMSessionFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D5D5D44D9B7C9B28997C3E6B5B14431 /* GTMSessionFetcher.m */; }; - 948BB1962A4400DFA3F394E2D7642B04 /* FBSDKBridgeAPIProtocolNativeV1.h in Headers */ = {isa = PBXBuildFile; fileRef = D5F9264AB1B23720D7F6D7D9C995C29D /* FBSDKBridgeAPIProtocolNativeV1.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 955AEF50EBD83FC97FDCE4DB4B48AED2 /* QMToolbarContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EB5BC030C32489EF7488B6B73815315 /* QMToolbarContentView.m */; }; - 956D4FC77575AB1A2686A23AD98000E0 /* FBSDKHashtag.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E5E5C7A90DB6A540B902BBF4B66AD00 /* FBSDKHashtag.m */; }; - 959397073421A21C7B99BE51FF9D911F /* FBSDKAppInviteContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A1BC23D69D5960430E47118B78326E9 /* FBSDKAppInviteContent.m */; }; - 95AAF1D32EA73AC75E1A43BA86383C27 /* el.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 29BAE8239E5C8D944E74307AB3280252 /* el.lproj */; }; - 95D7A50FABA13553D701F7D15E9B824C /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB64DF2528E2706B75659262C43E0C50 /* CoreData.framework */; }; - 9608CFE5E0B47013C3E0FBAC7D983012 /* es-BO.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 83930B2194799CB1C53F6374A93C79C0 /* es-BO.lproj */; }; - 969E0C75A4B296F9C4A3B518A41F48AD /* FBSDKMonotonicTime.h in Headers */ = {isa = PBXBuildFile; fileRef = D888F2263C29B53454E55D3F0A4E0FF0 /* FBSDKMonotonicTime.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 96AF35109CA37B8FA415A8825EF80C84 /* QMChatNotificationCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 40BD5DE2ADC9681A4E430030D61FCF0B /* QMChatNotificationCell.m */; }; - 96C9E4FB5E1919B204AB94D6F48E18E9 /* QBChatAttachment+QMFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = FB83CBA2DA4297F458F58A253DB31E9C /* QBChatAttachment+QMFactory.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 96DE9AE1E5646EFE59CACAAE40493A41 /* QMKVOView.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E1D3E664EB736EF8C14385A82A5E16 /* QMKVOView.m */; }; - 97149867039A04C47092D3EE0A2B1B73 /* QMTimeOut.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A187756081222D9F49ED73C82FAB015 /* QMTimeOut.m */; }; - 971517DBD70EEE72C23CDAB230E1C293 /* QMChatOutgoingLinkPreviewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 86210DA87FD9910AC3D94704AD548939 /* QMChatOutgoingLinkPreviewCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 974068EB1A1EA87D5CD88C5DA0588489 /* nb.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 37D419D18F4D5C2F5ED1669AB95C24B6 /* nb.lproj */; }; - 9798DFA6ABE2B6A529A4BAF2ADF0D026 /* SDWebImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E96A0B44FEE8657931A3D71C00946BB4 /* SDWebImageCoderHelper.m */; }; - 979F7DCF4E2EDCD2E87A227BA0546BBA /* QMImageOutgoingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C9F839D82D3D3F04EA0854BCE883E86 /* QMImageOutgoingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 97D897FD476082E59409ACE42B4ADB63 /* QMChatLocationIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8A49A0A90F9EDA7C7BB2A9EF1B449B04 /* QMChatLocationIncomingCell.xib */; }; - 981A0C6E3FC678A023E2B8A7946421EC /* sr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 866869B21EDA6B01BAB28CC857696A43 /* sr.lproj */; }; - 98794F8D71B412F5E4E109E0BB79E5B2 /* FBSDKBridgeAPIProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 603B44DED255763C9D848B7D493BD81C /* FBSDKBridgeAPIProtocol.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 987A1FB8F1D98E659B7A08013656E55F /* NSDictionary+QMCDRecordAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 72E21B1F28740345CFF424FD0C28EBBD /* NSDictionary+QMCDRecordAdditions.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 98895932F30B624CF8D4DB6BCF41BE00 /* NSManagedObjectContext+QMCDObserving.h in Headers */ = {isa = PBXBuildFile; fileRef = 47709B2EFA44202CCA3100EFEBCC284B /* NSManagedObjectContext+QMCDObserving.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 98C34BBBAD6FD6C2A2A18B4DD623D785 /* FBSDKWebDialogView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B52FA13590512AC7706E8ECC90928E1 /* FBSDKWebDialogView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9931FBF0D5CD16A87511F3EBD2302A5B /* GTMSessionFetcher-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A802B2151F72AA3440CE60923E772AB5 /* GTMSessionFetcher-dummy.m */; }; - 99A3C27049B2ECE115AA912F82BA9FEE /* attachment_ic@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E731447D25D669D9C5BEDCE00B22B92 /* attachment_ic@2x.png */; }; - 99AE240D78D8275E777DE87771EC6A02 /* FBSDKLikeButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 236F7EE69406E766463A15AE27501D4C /* FBSDKLikeButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 99B2CCAF95EE7CCC8F48E4C2DE7F98D1 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = F6C8CA525D54506E30EEA03CF05369AE /* UIImage+MultiFormat.m */; }; - 9A2462496B22868432732811E56A3F64 /* FBSDKMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = DFA44B46A5E918D4047B4FB7CC9920ED /* FBSDKMacros.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9A9572399CD2BEDF739385FD9915DDEB /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 09A33ECBCFC7DE86C491FE3219D6CDFD /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9AD191D784A3073C49F0F37DD1338128 /* FBSDKApplicationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = D232A18EFB50EC2EB46C7B7EF4EA7EB2 /* FBSDKApplicationDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9B51DED9F2800F5715AC998686A4DEBE /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78871113E2E8880927AC6E26B088A625 /* QuartzCore.framework */; }; - 9BF304E90A137F218E3244A6DB7C613E /* QMChatService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = BB260B2455E35BF9A5AE7E60DCA13244 /* QMChatService+Bolts.m */; }; - 9C32897FC138D876076D5A5E870AE4E5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - 9C4A3D8F1F26FBE9C1216A01CC0B6925 /* QMUsersModel.xcdatamodeld in Resources */ = {isa = PBXBuildFile; fileRef = 95B147ACCE54F9BCFFAB07C281E4A9F3 /* QMUsersModel.xcdatamodeld */; }; - 9C51C025962CBC4A3D3DEAD0D10881EB /* FBSDKShareKit+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 62F7C636AD145412676EDBF36CDE5EA7 /* FBSDKShareKit+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9C9AE4B8D8D5C58B18EC91EB019D6D5F /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 569C69CCB6B0743EE78FDACCCE0935DD /* Reachability.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9CB5FFDE120D29F4E409FF9B5A19280D /* NYTPhotoViewerSinglePhotoDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = C22BA56B86E4AB037BC1C1FDD795247D /* NYTPhotoViewerSinglePhotoDataSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9CBD14C17446EC9384CFAADBADF12387 /* pb_common.c in Sources */ = {isa = PBXBuildFile; fileRef = A506ADE5745BB7E498028D3A793B30C9 /* pb_common.c */; settings = {COMPILER_FLAGS = "-fno-objc-arc -fno-objc-arc -fno-objc-arc"; }; }; - 9CCA0235DCA9AEB012EA03D46FBB5E7C /* _CDOpenGraphModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 29E39FE721A809173BCC632EAB433590 /* _CDOpenGraphModel.m */; }; - 9D02E93DA1AA5A9DB56A246349D88D1D /* SAMKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 225841327C5D34C36AFB6C9B13F3FA64 /* SAMKeychain.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 9D0660B4254C1971C80FE1D8392DE9E1 /* FBSDKAppGroupContent.m in Sources */ = {isa = PBXBuildFile; fileRef = B95EF363778B5A9FAAA84402325043DD /* FBSDKAppGroupContent.m */; }; - 9D68D02885C8F617194DF367DC1DF214 /* GTMNSString+URLArguments.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FCF7E22B79515D693B4E70526A080B5 /* GTMNSString+URLArguments.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9DB259B25187A93B53A20E0317A5052D /* QMMediaViewDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = AAF6C7B25F987BBB9139F12376DE1F52 /* QMMediaViewDelegate.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9DCB00163E75FC57C0F59E588C844ED5 /* FBSDKBridgeAPIProtocolWebV1.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D86674267B7B08C583569AF68A69834 /* FBSDKBridgeAPIProtocolWebV1.m */; }; - 9DCC579D0487C7B1D2FD67C2A1ED59ED /* ic_visibility@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5FA4EA378010B9DAE2E14CA69401C11D /* ic_visibility@3x.png */; }; - 9DCDA64200FB07D66A70F209A0E372B6 /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2F23B83E27D0243D8A548F2BE5722CFB /* es.lproj */; }; - 9E11988ED245EDC6D18E42942396984B /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 007200A07E5D479BC917BC05A2B92AA2 /* nl.lproj */; }; - 9E481788D32865BFC4CAF3998B8CE864 /* FBSDKDialogConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C8C62D7F21D95C1B8E3BC3A73AA496CF /* FBSDKDialogConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9E54EB08C6ECDD0222FEEAC09DA8A2D5 /* FBSDKShareAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 84C253419EBA4489EEB22C4694722DDF /* FBSDKShareAPI.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9E65B36510D16F4FF23AAC36C8DA6F6D /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = BE652D68108EAF0B7956D0B0F0FD2760 /* Reachability.m */; }; - 9EC1595AAB3530F95CC31979B0746AA1 /* QMCDRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = EB66C45475D340FDA543C23E755D122D /* QMCDRecord.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9EC3208101C0A4CE8E374B61F787355B /* GTMNSDictionary+URLArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A69948B9C828AB814621BA408FD5712 /* GTMNSDictionary+URLArguments.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 9F038E11537A6E44575323E575BB08E6 /* _CDAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = FFAAE33F424124FEB34EAE6C8B66E2AB /* _CDAttachment.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9F08BF920AC877A874FBE054745EFE2D /* QMUsersMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = E15DCBDF02CE68C932855EA4427E1D60 /* QMUsersMemoryStorage.m */; }; - 9F0F5F5359083475FE84E76B7D59DA49 /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DBD5EB6C78AA59029695E99C381B64A /* SDWebImageTransition.m */; }; - 9F60F98946D6FAC445F71FE04BA052D3 /* ic_visibility_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 4700A53FCF0195D1A40AF92066B87157 /* ic_visibility_off.png */; }; - A0105E7A99EB7343C532DFC23AA1FCB7 /* QMToolbarContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = B9E66D13AD608455F286C178A63C02F8 /* QMToolbarContentView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A03B556760EC1A4BDB3B0924FB66AA40 /* QMCDRecordInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = A3F665FB265D7273AF4CDBE921B2D36B /* QMCDRecordInternal.m */; }; - A040167AB31ED77676E949EBDA3F8E04 /* CDMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = B9CBC7A5169299DB0E492DE3E45894A1 /* CDMessage.m */; }; - A04709B7267367F356C4224182C987DF /* GTMSessionFetcherService.h in Headers */ = {isa = PBXBuildFile; fileRef = 370AC8E5B0DDA438E65F35D1FD7C8453 /* GTMSessionFetcherService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A0DD473B7D4BE0CA52AE6B966EFEB51F /* QMChatIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 418F3BD9101328EABAF10C115779876C /* QMChatIncomingCell.m */; }; - A1492BDA71F2D5684EE21A3CA6F244E9 /* SDWebImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 39939F54BB0434A8DFD3CF9BB9C1ABCD /* SDWebImageGIFCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A1619A0DDC8E52654368C0A6CFCCA325 /* FBSDKApplicationDelegate+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = D6567809D1DD1A1D2DDBA77385BDE409 /* FBSDKApplicationDelegate+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A1EF997321F60B5C631028894876A44C /* FBSDKSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = CA08E01719AAC774A01538CAB7A1B449 /* FBSDKSettings.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A1F1C254BF1D1CB388A7DFBEA39B9AB5 /* SDWebImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C0FF43DFF86E88494D979E7C3943BB7 /* SDWebImageFrame.m */; }; - A2344CF54FD6B88057F6B9988CF22353 /* en-SG.lproj in Resources */ = {isa = PBXBuildFile; fileRef = AB1C121E54FC1C5DEA7D35196A8F0860 /* en-SG.lproj */; }; - A255F4976F9A4A74593AAD78BF5921FE /* FBSDKSendButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 18FE119817F8DB209E84B934A8097C3B /* FBSDKSendButton.m */; }; - A27DFBE585B798C9A3A10EB034BE487D /* FBSDKShareMessengerGenericTemplateElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 756073924DDF758CD4ED5E59DE19C9E4 /* FBSDKShareMessengerGenericTemplateElement.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A2B5EFC9FC23B8A776F8E368DF96412C /* CDDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 72823C4407249160C43459B83BA59BC6 /* CDDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A2BB29196011A7F3C269A5E1B15045F7 /* EXTRuntimeExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AD758050B2837363C6C93BB75D15180 /* EXTRuntimeExtensions.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - A2D580AA461813283CC53ABABDA2562C /* FBSDKCoreKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 49996D4BBF0258D8903436544DDF6E4F /* FBSDKCoreKit-dummy.m */; }; - A3103587467D740F38FF889A28F8E074 /* es-PY.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F4F1B0C78A656DD31987696B013E0D11 /* es-PY.lproj */; }; - A314186A8A82AFA5A44E1043DECB38DD /* QMChatNotificationCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2B6053755C3BA275926465C3CFA90711 /* QMChatNotificationCell.xib */; }; - A3150BFB6CF6DD906C762EF6FDCFB9EB /* QMCDRecordStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 02B89BF2E737913E5927A071ED7FC692 /* QMCDRecordStack.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A3C97E779F4E2FEBBBA588B9319F3C86 /* QMServices.m in Sources */ = {isa = PBXBuildFile; fileRef = D884F7BD122E75D4BA1E605E9B276B8A /* QMServices.m */; }; - A409D1030CB93AD669AF88A04770DE28 /* da.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F457873408B2A48DDFE348FD8EC3A2E7 /* da.lproj */; }; - A47E18704227CF35067AE8D3FE94ADB3 /* FBSDKLikeBoxView.h in Headers */ = {isa = PBXBuildFile; fileRef = F27F17F54FB8227C0EC228C194650517 /* FBSDKLikeBoxView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A4BBFB487758EB38F4B20416FCDDDE61 /* QMMessagesMemoryStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 6139C8BABDEA9427263EECA00BD4DA8B /* QMMessagesMemoryStorage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A4C9CFDD0DB371F6A269BF184397FA7E /* he.lproj in Resources */ = {isa = PBXBuildFile; fileRef = DE83A557BE5BFA0AF691D389A9BD4601 /* he.lproj */; }; - A585CDA25BD21A124297C0EA2CEBB32C /* FBSDKContainerViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB5CCA81DCC9ACF1D455F9BDE8B5569 /* FBSDKContainerViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A5F51AFF96FE5BD47C96E787B32BDC9A /* vi.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 65B46159037F7B6B4D886211BB02463E /* vi.lproj */; }; - A5FC83A2904040D53EE5F630C21551C2 /* FBSDKGameRequestDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D5E33B2967AE3629B0155B2CC237DBC /* FBSDKGameRequestDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A5FD38BF5704D49E27EB77E23611DF98 /* QMCDRecordStack.m in Sources */ = {isa = PBXBuildFile; fileRef = BD05CE6A2BE987267DD6107D4E19BBC0 /* QMCDRecordStack.m */; }; - A6370A63B95E254EC6310AA28DB3CC5A /* QMBaseService.m in Sources */ = {isa = PBXBuildFile; fileRef = E6EB9F0793269C0E68C65433BEBB4E2C /* QMBaseService.m */; }; - A678685E67740FD2D7D86E00C0BF501B /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 70DEAF8E882315FDBDFD5AAE27126125 /* ko.lproj */; }; - A68D4A6869C10ED61C9CE33D928CC383 /* BFTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CB9BEE92E9958D35690DFD3FF22428B /* BFTask.m */; }; - A6B810C4F0D32A3D6636E9F5CD266638 /* QMChatService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE4F66907207C82AE778198805F3685 /* QMChatService.m */; }; - A6B877BBC290C994A4645F8D6D979ADC /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D0E6981F1A3F410359835A8055C50BFF /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A75B749521F1B0C1BC28D0A35ECFEC41 /* fr-CH.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8D96CB36C5F60EBD1D39B22B92035F8B /* fr-CH.lproj */; }; - A78841C5FE7A0D955654EA36916ABB37 /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 856D8347E4E9A337FB8006CF5554C5F1 /* nl.lproj */; }; - A82CF4355CC83C465251FCB0F207B799 /* hu.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E80467654216AB5F099025873D349FE3 /* hu.lproj */; }; - A8475D2BAACD992796D7CAB13E555643 /* FBSDKLoginManagerLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A63DC3B6B1513D0B832062AC69F899 /* FBSDKLoginManagerLogger.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A86351C7D9DD78736406E3FD84DC20BC /* FBSDKCheckmarkIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = F2BDF73C530D25C909970DEBF87FFBB6 /* FBSDKCheckmarkIcon.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A866AF8BAAE067AA925C70F98227870C /* FBSDKButton.h in Headers */ = {isa = PBXBuildFile; fileRef = C581322B4B20F1A8347F609CBA88E20A /* FBSDKButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A882E7B7317201972B6A3DDCF3BD6568 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C9E61951DEB42D69DA1678E26E45E03 /* CFNetwork.framework */; }; - A8BBCF8AD6522C8B098277C0DF807772 /* QMInputToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = A1A4CD58239847C9248F2F6A01053743 /* QMInputToolbar.m */; }; - A8E0A6DADA9E018D811CF4231ABE4A18 /* fr-CH.lproj in Resources */ = {isa = PBXBuildFile; fileRef = D795F3842D180446232C170E22BE1DD7 /* fr-CH.lproj */; }; - A8EB580A6B6AA4BA700DCB9D2710BC39 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - A94593CDEAE5BE97441A602246F1BB59 /* ln.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 817DB1B67E498B3E020542E3EA6BBF3D /* ln.lproj */; }; - A96225BAF4521C5297791C0DBB3DC79C /* _CDUser.h in Headers */ = {isa = PBXBuildFile; fileRef = 13A2344DF9FC94D550CBE5026CBF389D /* _CDUser.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A98DB463E152E02ED22EB04F22AA9EF9 /* FBSDKErrorRecoveryAttempter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CCB1D75624DA20FAA20E9B6732B1707 /* FBSDKErrorRecoveryAttempter.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A993AE765E7DE0C265684D5EEAD01AB2 /* FBSDKShareCameraEffectContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 468A576FC083F386CA03F0C308F16926 /* FBSDKShareCameraEffectContent.m */; }; - A9993DE23FC92D8E7DAC89DBBFB0897B /* es-CL.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BED67B7CA2B86B794BE5CBAD076B5F05 /* es-CL.lproj */; }; - A99A45D4FEC858CE5850D036D6C0997E /* QMImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE3A74404D39FFEDFE81C58C2A63D06 /* QMImageLoader.m */; }; - A9CBC3E1025849138F1CC14EF9BC2836 /* FBSDKCameraEffectArguments.h in Headers */ = {isa = PBXBuildFile; fileRef = 593197B56D415C8A2B225D4E7A4C67A5 /* FBSDKCameraEffectArguments.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A9D45DD1F6754CA9D18CAB20D7676A29 /* SAMKeychain-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 877CDAF6A89F584914804D5D99113D74 /* SAMKeychain-dummy.m */; }; - AA76CC8EFB1B97845636B019E73F1007 /* QBUUser+CustomData.h in Headers */ = {isa = PBXBuildFile; fileRef = 7144CFE1DE97085F58C9174FD6104C7A /* QBUUser+CustomData.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AA7EFF4D97101807D640785561B051B4 /* FBSDKKeychainStore.h in Headers */ = {isa = PBXBuildFile; fileRef = F50DA7EE00E763882E960D19EA3BAAEF /* FBSDKKeychainStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AA9197C37849C197C002472E4BC0E7A4 /* QMAttachmentAssetService.h in Headers */ = {isa = PBXBuildFile; fileRef = F47A44CA73B85A4B019981B254C2BE79 /* QMAttachmentAssetService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AAE5BA7EB2D6E9DC09F0FB3D16EB9752 /* pb_encode.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EDF4D8A10FABE1564ABFCC8AEB9B05E /* pb_encode.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AAE96C19BBD081A54BC63012DA273478 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - AB466A265795182D28A0AFA5BE5515DA /* gu.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7543498F482088D7BADAA89F4DFA7FC2 /* gu.lproj */; }; - AB4CD61CAEE5FEB1A8BE5BED72CA9EE4 /* QMChatOutgoingLinkPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = B0F2D18CD49C24A03FD7184F672A53C5 /* QMChatOutgoingLinkPreviewCell.xib */; }; - AB80F2322ADD08E8941326E1BADFB7EE /* FBSDKBridgeAPICrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 8893B0934E11007A196DA0507D9DFF71 /* FBSDKBridgeAPICrypto.h */; settings = {ATTRIBUTES = (Project, ); }; }; - ABAA6F4CC21CEB04DD279402E6F8E7C0 /* QMChatContactRequestCell.h in Headers */ = {isa = PBXBuildFile; fileRef = F8F6E02D0619876B4AB339AC339CF24C /* QMChatContactRequestCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - ABEA36EB24919172BF5514E6F7B3DF57 /* FBSDKLoginManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 71320870D0D676F25C36DACAC7BE54A6 /* FBSDKLoginManager.m */; }; - AC0CE7D50C3AFC18966CB85D5A7BF747 /* QMMediaBlocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 329EEEF11D1A40B86ECEB344711A8A06 /* QMMediaBlocks.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AC28D2EA0916EAA47543494A8A6206DB /* SAMKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 285E96267C99E0E0D44C15387BAE29B2 /* SAMKeychain.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AC9D5161E898434718E42E55BA3DBECE /* FlurryEmpty.m in Sources */ = {isa = PBXBuildFile; fileRef = CAA3970509B00EF4178CFC00D5C4BB91 /* FlurryEmpty.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - AD0E1790919F4E9E263D82EE98C11473 /* FLAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E257F2CBCC63464FD3C183C76440F54 /* FLAnimatedImage.m */; }; - AD92C7AE00438FA80780BBDCA1F21E07 /* FBSDKAppLinkUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 86EC999F1C150066E9E86041F19FBE4F /* FBSDKAppLinkUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; - ADE7E8A03288C9BE3B1C0BF987B163D5 /* QMImageOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 623EAF1FE03981545FC115E3F124772C /* QMImageOutgoingCell.xib */; }; - ADFCCB07B208DC84E715D2ADB600F765 /* NSManagedObject+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = 031E860E44DF8F80D270D579FD7B54BE /* NSManagedObject+QMCDRecord.m */; }; - AE4A8BC94A838B5FC3F3E416CF0DDC19 /* ic_phone@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7C8643110A3FB0AE62045394FB501BB3 /* ic_phone@3x.png */; }; - AE4E595A1AD817EBB4451C7762E71574 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66C381DCDE7BBA6F1A02E2A9AC94B09B /* Accelerate.framework */; }; - AE81AB4509182C4C26AC8C0E39B235E4 /* CDUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 381E3A721061A79A1F41962F89FE5498 /* CDUser.m */; }; - AF166201D1EC9CF5742A94D21EB649C1 /* BFExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E37EB12C8DBE309FCD869E8355BDD5 /* BFExecutor.m */; }; - AF18661FF893F771C601146859293FCF /* bn.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 22A7933F517EDF3500F770E6485D5245 /* bn.lproj */; }; - AF71B7ACE23E5312C2F8014572614845 /* NYTPhotoViewerCore.h in Headers */ = {isa = PBXBuildFile; fileRef = FCF54EE6B7C96FB7BF474900F4638282 /* NYTPhotoViewerCore.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AFBC9D7B722DF5A46C59064AD40ECF86 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - AFC8CD6F3F9220E9264B8FCA65C19C99 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30722CDBA4D0A56C8E0C4A8AEB0F7DD6 /* CoreGraphics.framework */; }; - AFCD14E80665E34A3E744B4DBF58FE1E /* UIColor+iOS7.m in Sources */ = {isa = PBXBuildFile; fileRef = E1FD3DFF85D828F1B8BB6C20C807574A /* UIColor+iOS7.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - AFD0E1A73FC19F3ADEAFD0CD93E0C4AD /* es-GT.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 874978817498CA1C77062EDB246C661D /* es-GT.lproj */; }; - B0CCE739C5121F05E3C6D9DB892C5063 /* FBSDKLikeButtonPopWAV.m in Sources */ = {isa = PBXBuildFile; fileRef = F7AC37FA924377ABF92A992729BDBDE6 /* FBSDKLikeButtonPopWAV.m */; }; - B11B75F2EACBFBC4C16C61D1FC86C577 /* QMAudioRecordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E18CE1384D97512C2309AA2F7285DD07 /* QMAudioRecordView.xib */; }; - B12E5654FE40B233E5929E64793383F8 /* ur.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 77C767FF79A87283D4BE61061C22BC41 /* ur.lproj */; }; - B13E16087DE32BA01E1C995782742D6A /* QMKVOView.h in Headers */ = {isa = PBXBuildFile; fileRef = A510C2D8F68E767107BCA7E9FE5698A8 /* QMKVOView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B162263615D291926A957F89A146A951 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C6ED5A69193FE124F885CEC2BF9AD09 /* UIImageView+HighlightedWebCache.m */; }; - B1751652128CDA7A2BF220931CD6DC95 /* QMCancellableService.h in Headers */ = {isa = PBXBuildFile; fileRef = 6260371331165B42182219B5B9E20EE2 /* QMCancellableService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B196BAC5AF4F49F60C6CE71117053E8E /* MicOverlay.png in Resources */ = {isa = PBXBuildFile; fileRef = F82B7EDA911EF436202044C9610396B0 /* MicOverlay.png */; }; - B25038271B0C97D3F53A79D886B97A7C /* NSManagedObject+QMCDFinders.m in Sources */ = {isa = PBXBuildFile; fileRef = 828ED7F0ACBA838A3CB141B1A54AAC9F /* NSManagedObject+QMCDFinders.m */; }; - B2A8B56DE665BA53648CC6FF84F3074C /* FBSDKShareOpenGraphValueContainer+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = E80AAFDF8374B02B046EDB6F347E8137 /* FBSDKShareOpenGraphValueContainer+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B2CD7231F7D1961FE90ADCA4B9FDBD0F /* attachment_ic@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 993AA6B3C61BB4E47034C8076A324465 /* attachment_ic@3x.png */; }; - B2FD2C48AD32292E412FCC19D497C884 /* QMCDRecord+Options.h in Headers */ = {isa = PBXBuildFile; fileRef = B4C8EE20D4F7A19EFDA779AED1FDDEBF /* QMCDRecord+Options.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B354094B27825EC691496ABDFC8F21A7 /* ln.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 899764694C352C19AF098F512D55A0BA /* ln.lproj */; }; - B363234376273DC4098A355934A5D03F /* _FBSDKTemporaryErrorRecoveryAttempter.m in Sources */ = {isa = PBXBuildFile; fileRef = A7BC24BB314E0DAE5B5C4DF61513526C /* _FBSDKTemporaryErrorRecoveryAttempter.m */; }; - B368878174AF369829CCEF85BBA2D84C /* FBSDKShareMessengerGenericTemplateElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D146B956116E8DBF570F97FC654B355 /* FBSDKShareMessengerGenericTemplateElement.m */; }; - B3FC852383A59FF56CF503D76E3FE4EF /* pause_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = FFC1208A96EE7B4B5E846ADB1D1C5E2A /* pause_icon.png */; }; - B430198CB854B072AE86186220679893 /* th.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 035A81E52D02C9A8F12FA0DFAA70781C /* th.lproj */; }; - B49602FD4F0BDC6CCE46C7E33B30218E /* FBSDKGraphRequestBody.h in Headers */ = {isa = PBXBuildFile; fileRef = C2C8143F1A6A58F85FB0CEC781C9BB18 /* FBSDKGraphRequestBody.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B4D46976CA008734A724AE0E317AF035 /* FBSDKLoginConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A66BD5CF7266B610CDBE8441B35F2B6 /* FBSDKLoginConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B4FD7DF0F890DA3BF96606A6BB34BFD5 /* BFTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 840DB5B8D98241F0CBD308B4B0E18C26 /* BFTask.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B5742194CA6FDFD85BF455BC7430DA4B /* FBSDKGraphRequestPiggybackManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A06E1612D0D44D16590E8684440EC14E /* FBSDKGraphRequestPiggybackManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B5C396D3227779F8B1920420301F8DAB /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = EBA2CCCB1903C4680917EB15D07B52C9 /* SDWebImageDownloaderOperation.m */; }; - B61040E3754180BFEE3CBD1FCE4C81C4 /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 46245878CD9179098B299207B026E05C /* fr.lproj */; }; - B6BA75293C66DAAD1E246965A4AF8B75 /* FBSDKError.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D29E6523C42866BA4C5B56224175847 /* FBSDKError.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B6D184454277F8C0EA6FCB2A15967891 /* FUIPasswordVerificationViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = 0DF3E89D435B36615F086EF1E5051458 /* FUIPasswordVerificationViewController.nib */; }; - B6F8E4CC9341A361D038CE35B19076F1 /* FBSDKURLSessionTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 99F1907A8D3314BD206F8C119E61F407 /* FBSDKURLSessionTask.m */; }; - B716BDB104EB4011F083173505809879 /* NYTPhotoViewerCloseButtonX@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 751B10433451719B64A384C9CC20958C /* NYTPhotoViewerCloseButtonX@2x.png */; }; - B73BCF62B9D78BF74E254E4276A7353D /* zh-Hant-TW.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 3E59D4C1647EE977F82BDCAF38773B63 /* zh-Hant-TW.lproj */; }; - B75C119EB7AAF550FD999661AFAA37BA /* QMChatNotificationCell.h in Headers */ = {isa = PBXBuildFile; fileRef = D18F493BB48DC4716C42613D736BBC1E /* QMChatNotificationCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B76C5597FABAAE785AC8F67374172A73 /* NSDate+ChatDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = CED73B5526A96CB440DDD90EFBF75D89 /* NSDate+ChatDataSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B7A7154D0246B30BB9CA164305701103 /* NSManagedObjectContext+QMCDRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BAEA8AF57949742DBD54B6C219568E5 /* NSManagedObjectContext+QMCDRecord.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B80C43AB4DBF298ECFF0FDED74EB431F /* BFAppLinkTarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 233D296DB63CE217070A683070460A5E /* BFAppLinkTarget.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B84557C6039374BCBC47AD9C9FB8C99A /* QMAttachmentStoreService.m in Sources */ = {isa = PBXBuildFile; fileRef = 77A44C467BD3BD2B1524AA6293F6D9F0 /* QMAttachmentStoreService.m */; }; - B8CE323E9C3D1DB5C0324973A18236D4 /* QMAssetLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D44C002F0DDB17BBE2162A99C63939A /* QMAssetLoader.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B90542914989B784BFFBBEDD5CDDAAA0 /* QMHeaderCollectionReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4281ACFF61A53F2D27608351C781174 /* QMHeaderCollectionReusableView.m */; }; - B906B3125A567DE8F053C46E56467F4D /* NSManagedObjectContext+QMCDSaves.m in Sources */ = {isa = PBXBuildFile; fileRef = 149BAAE68F455D019A5DE566F60D60F8 /* NSManagedObjectContext+QMCDSaves.m */; }; - B97037A599DD98C66521FB2A1D850BCC /* NYTPhotoContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 26D86161E3B4CDBBCB3B76B5B67D2392 /* NYTPhotoContainer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B97BAC8ECBB959BFBE645FC00BD91D92 /* NYTPhotosViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CFCD9DEF7C1EADD9711E85CD19E2DF5 /* NYTPhotosViewController.m */; }; - B9A4ED4C5373748BD4D0CC61923D20E5 /* FBSDKLikeActionControllerCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B5DDBA9BC7AC149CF8A12739CCD0A6A3 /* FBSDKLikeActionControllerCache.m */; }; - B9B5678982298DE1DF8DCD99867AF2D4 /* SAMKeychainQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = 479294CF21410371DDC4536DE324A865 /* SAMKeychainQuery.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BAB87ECFAB0229C3A2F28EFDEB7A45E5 /* QMCVDevelopment-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A9C93E8567094F579F4A942F9F698A74 /* QMCVDevelopment-dummy.m */; }; - BAC77565260301406EFDE6E9FA5FA73F /* FBSDKLoginConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CDDA48D5E51C7DE282D5E23B80587F5 /* FBSDKLoginConstants.m */; }; - BAE63364DF4A3685FE486D676E4B1C97 /* QMContactListCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3852762B3DD542AC58F5695BA2916363 /* QMContactListCache.m */; }; - BB724A9EAE3B7B265CEEFCBFE7327F8A /* country-codes.json in Resources */ = {isa = PBXBuildFile; fileRef = EB78720C26526E4DD6046D25624213F5 /* country-codes.json */; }; - BB74BFFB8BCA6B3B341D2A21C27A36E2 /* SDWebImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 3609642BB02D23DF636641B152BBDD77 /* SDWebImageFrame.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BBCA33CE70A328167C68442E5B0872F2 /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF24F1536DC90171DF6D3B0D35DC350 /* SVProgressHUD-dummy.m */; }; - BC245EE9AE2E079996DD318C6036DA69 /* _CDUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B7082A22C96398717C289D224AD4669 /* _CDUser.m */; }; - BC4F830BB991984C9457B615EBCB6885 /* de-AT.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 30516D2C978BA5F677BB3396A959D868 /* de-AT.lproj */; }; - BC831A801164330FF6D941564E638834 /* FBSDKLikeControl+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D0F096787C0D1257A4E0EF4217EECC /* FBSDKLikeControl+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BCCA7557E2642BAB925F8D81D7AE001E /* FBSDKBoltsMeasurementEventListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 19743F9556614C8C51A077A94AED75FA /* FBSDKBoltsMeasurementEventListener.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BCD1E99F035A72D3C7412A5E90C3D188 /* FBSDKTooltipView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F951E200167D808F5A2AC46B398E0EE /* FBSDKTooltipView.m */; }; - BD2248660687777E6DB58A811D2B721F /* QMDateUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 002FED19B3E79635C82263BFBDBEC602 /* QMDateUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BD60D3B37458FF977374C92F0379A878 /* ic_phone@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 93A3190C66560D03E526DB02F2246B9B /* ic_phone@2x.png */; }; - BD6E97B2C7F885C4DA730791ACB8CFF0 /* FBSDKAppLinkResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = 787C95889BEE3C3F31ABE0ED94D56761 /* FBSDKAppLinkResolver.m */; }; - BD814A51BEF8AF2D490B557F04237217 /* uk.lproj in Resources */ = {isa = PBXBuildFile; fileRef = DA1041AF93130899465E3B873FDAB271 /* uk.lproj */; }; - BDB1FFC2D5492E26BFB1F6B0211A805E /* EXTRuntimeExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EFB2F94B5D6E19DBE188A286ADAD3F8 /* EXTRuntimeExtensions.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BE0AA00AA0813EB9207CCF55803CCB3B /* FBSDKDynamicFrameworkLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AA50F517F4CCD5A51A5632070E694B8 /* FBSDKDynamicFrameworkLoader.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BE0BDB4691BB3F773FB9A8261FD6BA48 /* NYTPhotoViewerSinglePhotoDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 662EAA29C96B5E03BFCF690182E6FF98 /* NYTPhotoViewerSinglePhotoDataSource.m */; }; - BFA9A8B566A50DAC095C1D1AE26F0AEB /* FBSDKLoginManagerLoginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = F40D71B23D852147A5FFE0DCD5F3B261 /* FBSDKLoginManagerLoginResult.m */; }; - BFE150ABF4C13B8BEC7DC19E7960776D /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6223DD42F4FC983C8438990C0BB45FBB /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C0635913EB0B98916AC3F320BB53A38B /* FUICountryTableViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = C7FB087EE134DCD74D89969C8B862019 /* FUICountryTableViewController.nib */; }; - C07EF9F965BD97CDF166FF95BFE07D9A /* FBSDKAppEventsUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 451ED94FC6ED41D4BA412E5D29A28D85 /* FBSDKAppEventsUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C080B7BBDD7B54101E2C03B7569F713B /* QMDialogsMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = D734D0AA9EA8F93B08BC80CF33263D5F /* QMDialogsMemoryStorage.m */; }; - C08510FC304BA16D89A3F8591043045C /* FBSDKViewImpressionTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = C734141F2019BFF2CBCE3DB9EBE3480E /* FBSDKViewImpressionTracker.m */; }; - C0B49D4A1DFA3DC13F086E6F2EEF7769 /* QMChatAttachmentIncomingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BE38C6DE220C4AB47670174D4113CB65 /* QMChatAttachmentIncomingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C136CB219348058A53118FF4BCF12C67 /* FBSDKMessageDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 9029E5B1E7E24D53543B68C38F118048 /* FBSDKMessageDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C14671E040C93193345EC2E9D7C61F40 /* QMServicesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CF22269C23D26C052CE8FF0743C7A549 /* QMServicesManager.m */; }; - C15EC2293BFE0779C79A44B0E19EBB34 /* QMChatAttachmentCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A294357ED86543CEF57618D542B126A /* QMChatAttachmentCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C289F222BB659B44825DB44F21BF6D07 /* BFAppLinkReturnToRefererController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AFF89719764120E460C2E2C2E460C1B /* BFAppLinkReturnToRefererController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C2B87E77BABEE3523221F1BC8362E592 /* Pods-QMSiriExtension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CAA03ECF9FE11C0F230CEEB1CEB71591 /* Pods-QMSiriExtension-dummy.m */; }; - C355CE4AC50EE96B28D6D286E845C90B /* FBSDKShareOpenGraphValueContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D235F837BCDF0CE31B1CFF27A3B8F33 /* FBSDKShareOpenGraphValueContainer.m */; }; - C387A2A89A115C08624A5D4D68BD2053 /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BD3F72E24305FC863C4B1B89D174651A /* zh-Hant.lproj */; }; - C3D9A39E398AD862D168957868B1AB86 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C9C8E65083DB4FD6BDB56A6133D12C8F /* SDWebImageManager.m */; }; - C407F024DE683EDBC59292D8A69A3C6D /* FBSDKCameraEffectArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EE18934F1DF5E3033F558167EB6DB47 /* FBSDKCameraEffectArguments.m */; }; - C40E243F276CCE8C4BE922243572D49F /* BFGeneric.h in Headers */ = {isa = PBXBuildFile; fileRef = 764A61832A3A9BA2193C5373D32F2C73 /* BFGeneric.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C43FB67154CCF31E4C4B7BACB300C1FD /* FBSDKInternalUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 6041C120FF58F620228433352077B97B /* FBSDKInternalUtility.m */; }; - C45C1A240298C148D687C66985B94E3D /* QMMediaIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 519BE38E9982936C90511C1269EDBD19 /* QMMediaIncomingCell.m */; }; - C4A738A5525CF16CFF3B116D4CE2C42C /* QMChatContactRequestCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50F123ACCF40C15C1BB65CF5DF2A2F2B /* QMChatContactRequestCell.xib */; }; - C4B707712EBF21FFD3F1973647153789 /* QBChatAttachment+QMCustomParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BFA9757E45232124F11DA3CFA60A452 /* QBChatAttachment+QMCustomParameters.m */; }; - C4C14557E2AE4B2E9491608E0DFE0492 /* CDDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = C93AB266838A3512A0329AD99EF85830 /* CDDialog.m */; }; - C4CA2AF7AA919DE0AC6614A82EA33FAF /* QMCDRecord+VersionInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = ADC058FB141AF92F2F57775E5611E7EC /* QMCDRecord+VersionInformation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C516167E0A5D7B27BF1809DC1A74F49F /* en-IE.lproj in Resources */ = {isa = PBXBuildFile; fileRef = ED57CF8FD546F4CDFCA742286FBB589F /* en-IE.lproj */; }; - C529D54C6D8573A044A166FF32D433F2 /* FBSDKBridgeAPIResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 56F6B364E01EC92143E38347E24FDF78 /* FBSDKBridgeAPIResponse.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C5331A0955E67254451B9D7DE9315219 /* QMChatDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EFC1FC59B51FC8DDA6EF0D93FE13F62 /* QMChatDataSource.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C5AA9272F6745F92D3AC415019E8FDE0 /* FBSDKMessengerIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 330AE8E741FE53EB40210B12CAF437F8 /* FBSDKMessengerIcon.m */; }; - C615D29B2900E7E2A1AF170B26758E20 /* QMVideoIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2AA1E853F7496685C2CB018EA8621EB7 /* QMVideoIncomingCell.xib */; }; - C64FCB6CB0FD34AF39EF224FC020E147 /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 62E62A3509DE0C639B290298E04CFC4A /* it.lproj */; }; - C671098B29180043EA7E73E879DED6A7 /* FBSDKProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 331A73EBC1391A735CC7E3943275BEA0 /* FBSDKProfile.m */; }; - C6AA2524C09B8F1C9DFA813857C56E7F /* GTMDebugThreadValidation.h in Headers */ = {isa = PBXBuildFile; fileRef = EC1FC5BF904216D72FFDA1F7B2764955 /* GTMDebugThreadValidation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C747B151674B5FEB326D2D474EE3625C /* FBSDKBridgeAPIRequest+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 5157D7249AE49BA7365BC44EAE2C366C /* FBSDKBridgeAPIRequest+Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C7F81639D46D8CA384CEFFBEA9EA192B /* FBSDKGraphRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = C40565BC3BD2FEF6826E812AEC99060D /* FBSDKGraphRequest.m */; }; - C884D08B7CEEAFEA2EE259D7E7234E91 /* en-AU.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 34289AA835738E7B826380662CB457E0 /* en-AU.lproj */; }; - C8B4CA357C127C1C794AEE8DBC7CEFB4 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9362AAB7CC312287A4811C37235F233A /* MobileCoreServices.framework */; }; - C8DC6473F8B7A4EFB310286309BAC223 /* es-US.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A2F0D03A8DE442075C62C7B91F3AF302 /* es-US.lproj */; }; - C8DD139DB23F978B617E9509A3FFF344 /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2619E4B5D0103DDD987223387BDB9C8A /* ja.lproj */; }; - C9932DC024FF124C40D3DC5D04730CA9 /* QMChatBaseLinkPreviewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A1569FB2C781E2B3994440649F7DB70 /* QMChatBaseLinkPreviewCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C9B8D7724FA504CC438709E69E1096CA /* FBSDKAppEventsUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 599B7B1438EF4C287D13D3DFB77ABA1A /* FBSDKAppEventsUtility.m */; }; - C9D19941349CD43F8E7B1E625DE80105 /* en-IE.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 4E7D624C138CAFDAE340DF0D4FEC5FA4 /* en-IE.lproj */; }; - C9F3C20808CA9AD5C931B60A1D0FA461 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - CA7B8C46BFE8A7185E1A640FA3A661BE /* ca.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E1418F0D5F0246BF9AC00EA7E13A602D /* ca.lproj */; }; - CAA4E77966B06A9973E9466CC7E3FB06 /* QBChatMessage+QMCustomParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EF2356062505A253204470F0BB17B80 /* QBChatMessage+QMCustomParameters.m */; }; - CAE191381B83104733E93360F0399E1A /* FBSDKGraphRequestDataAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D8F2CF24507A1C3E23326A71A1E16A70 /* FBSDKGraphRequestDataAttachment.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CB6ECEC14C59845B83B0D0B345D0FF14 /* QMMemoryStorageProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 62DADB15702793C01F13FE624CB8CA2C /* QMMemoryStorageProtocol.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CBE74FAD35B0E8E4E0EEE301635EB5D4 /* ms.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B029C06B3681E06DE3CE97A8B9C309F2 /* ms.lproj */; }; - CC142339B92F6CDD28A09819F236532F /* FBSDKShareMessengerContentUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 900A95B4617CB79265039BED16D6EF2B /* FBSDKShareMessengerContentUtility.m */; }; - CC28647117A0BDD9695779AE67387DDF /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = E6291182DE3FFB3C0BF1A25B5CA5FBCA /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CC4756F8216B07EB20E7E84C9D936C1A /* pt-PT.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E2F89E5A94CF097E03DFBA2E579BE14D /* pt-PT.lproj */; }; - CC48F7BB9C0737AC6A1BC3EC7EA006A5 /* FBSDKTriStateBOOL.m in Sources */ = {isa = PBXBuildFile; fileRef = 302CBE6D07342C57220E6EB9A0E38697 /* FBSDKTriStateBOOL.m */; }; - CCD6DFBDC2C48307C8F478D690D4BD6A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - CD007D6CAE2A8D80CD8A94EA24993BC3 /* FUIAuthPickerViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = D819641F04355BD72CC75858942F4E0E /* FUIAuthPickerViewController.nib */; }; - CD0DE5ABB674FF5B830E491A848B62B2 /* QMChatLocationSnapshotter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CDF5B38750A6054440F908FC96A1775 /* QMChatLocationSnapshotter.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CD283E607D92857B89D30A7AB52F1459 /* FBSDKAppGroupAddDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = BBA56BE1D6A2C0F17806B2B2DB820634 /* FBSDKAppGroupAddDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CD5AE32395D44AFD6EE62B8DCDBAB92D /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = FDF36D9AEC0C6D9E14ED48823CE2AFF3 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CD99A2179538B0AADB6829708D6A606A /* es-AR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 6B7299271DA2005C78B60DE681866047 /* es-AR.lproj */; }; - CDA522FD20B477E35A8F6F8FB0A16979 /* FBSDKCopying.h in Headers */ = {isa = PBXBuildFile; fileRef = 66D5E80EBD416F2722AF78D15E9B186B /* FBSDKCopying.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CDF56D05379EAEDCCF20FB8A6EA5345A /* FBSDKTypeUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CD4FC52BCC1814174299975233CF7E6 /* FBSDKTypeUtility.m */; }; - CE64CC50F46796D31D7EC945185C86CC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30722CDBA4D0A56C8E0C4A8AEB0F7DD6 /* CoreGraphics.framework */; }; - CEDB57A668EE81BA31CE03081718B481 /* FBSDKShareDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CD5FC8078E1482E38C071494027C20C /* FBSDKShareDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CF3B2C059B698135ED59C39F3B943898 /* FBSDKConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 994181A11C64A83A5009EBB786D239FC /* FBSDKConstants.m */; }; - CF539FEA532B415144614C6D382746BA /* pb_common.h in Headers */ = {isa = PBXBuildFile; fileRef = 586B6D9D6F13B844923BF7E70A52FBC0 /* pb_common.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CF5A71B8C0791AD0475C5F6DEAEEE81B /* FBSDKLogo.m in Sources */ = {isa = PBXBuildFile; fileRef = 43595079ED0668E5805F5AAAC34CF27C /* FBSDKLogo.m */; }; - CF670B170C49C1C5DD33285A4FFBB2F8 /* FBSDKTriStateBOOL.h in Headers */ = {isa = PBXBuildFile; fileRef = B3C4909712E24448AB13E9E7E8910FA9 /* FBSDKTriStateBOOL.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CF7E7B439D17C5FF57B2DBC7C03E10EF /* GTMSessionFetcherLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = C69B08D399562AABC1C1585CD51832D8 /* GTMSessionFetcherLogging.m */; }; - CFE479860BFB3C4673AB9B1B7F5B9796 /* FBSDKSharePhoto.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D5B5C788B7D0FB14029E5160ABA4D37 /* FBSDKSharePhoto.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CFF70058E8EF3D4ABBB67426D0C65194 /* es-PR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 112434F352261EC65974D4BFDB00B9A4 /* es-PR.lproj */; }; - D01556105518C17BF03473EAD6EA4521 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 58E8FE45602DE9E08A6D7BE8C56DD69D /* SDWebImagePrefetcher.m */; }; - D049F12E9B9C24C5725606C0FB5D4E3C /* attachment_ic.png in Resources */ = {isa = PBXBuildFile; fileRef = 05EBC9DA1A60161009543C4221BCBD37 /* attachment_ic.png */; }; - D08B7F876B8BBE9BD11209B74016B9B2 /* QMAsynchronousOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = A2594D687D0EA27A5F60EF4E6E8BF1E0 /* QMAsynchronousOperation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D091B7812925C1EA294585D8C9B71348 /* QMAssetLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 63C88993F3F28FB44FF6FBA6A03F64BE /* QMAssetLoader.m */; }; - D0C7C616B4B1C5CE71146FE18BBC324D /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C826EDB1D05D26CD19B44D310BF58A81 /* pl.lproj */; }; - D0E6A116488C70736BE92C6A4765B112 /* FUICodeField.nib in Resources */ = {isa = PBXBuildFile; fileRef = D77CFA7286BF1660772457D3B56968CF /* FUICodeField.nib */; }; - D0E8CB94FDC99FBF92DDAA23A797879D /* lt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 6F3F397406EFA10F8EE84A4725793C1E /* lt.lproj */; }; - D0F12FF39E4884533EF8099AA95967C1 /* QMOpenGraphItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C0C13EAFD5605EC62EE7056AF516C8E /* QMOpenGraphItem.m */; }; - D13D2ABAC952FFE1557B31E74A5300C1 /* FBSDKUIUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = CEBB70A8DC105E7DF82C58AE9BBCC039 /* FBSDKUIUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D1A9B8F8CBCC25BCEB9563E96BE78D2E /* en-ZA.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8784D5C3F028DFEE49FB813BD9B1EAC9 /* en-ZA.lproj */; }; - D1CD3D7636A15607B18F48100FCBE25C /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = EB271C553105289698C47C9CF5C224BD /* UIButton+WebCache.m */; }; - D202B9DEF3CCCA4F97B36C9C114F92CE /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FA52E1D03B632C35E48776DCDB24032 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D20591364652894BFBA85F8D8999DB06 /* FBSDKGraphRequest+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 223F74CCD3252F9530E65ACEC3757025 /* FBSDKGraphRequest+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D211E181E6DD24C4C3B7F10CF105285A /* sl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8E9D268E1782FA4C15A7B4F908D3D96C /* sl.lproj */; }; - D2B31882760E0D95FE6808076D6D4F7E /* th.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F51CF3093D1AA5F0E9C597113B55982C /* th.lproj */; }; - D331E38A85A742D10EA84B928EEE4F41 /* QMOpenGraphService.h in Headers */ = {isa = PBXBuildFile; fileRef = 84509F748A19E448072572C4A0CD4F14 /* QMOpenGraphService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D33D02B5F3D9B5734859306156CAB90C /* FBSDKErrorConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E2A308E7BF7986FC0B0027063911EBB /* FBSDKErrorConfiguration.m */; }; - D3D75F29C35C494F360349D33D3BA9FE /* en-CA.lproj in Resources */ = {isa = PBXBuildFile; fileRef = D0EF27553477298E58A581AAB6E1D540 /* en-CA.lproj */; }; - D438F83AE3282A0B6115DA3992F871E6 /* ta.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 01659747D7409A470569199D8F587F19 /* ta.lproj */; }; - D4394246D05343B3906C1BB78B65DA10 /* tr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 69A02CD85F075A4F55B6B78725D555D3 /* tr.lproj */; }; - D4590F5C8526E32367C22B4EFB160314 /* FBSDKIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = E8936CD86933DAAE5899F36E42919461 /* FBSDKIcon.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D46220D483210D56BD569FFA9BE72ACC /* es-NI.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7EA1C6F1DD89FFB372318A0ADFFE3FE8 /* es-NI.lproj */; }; - D4F075FF2755D8E998CCD1D1A541164D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30722CDBA4D0A56C8E0C4A8AEB0F7DD6 /* CoreGraphics.framework */; }; - D5255EC632AAE2E451498F81310B6737 /* FBSDKWebDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 240431A27726D6D30F72213BE3D3901D /* FBSDKWebDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D5CF05772E083A861058B6F2E6662ADB /* es-BO.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9C351DEA4FC079992C403E85D98FC5FE /* es-BO.lproj */; }; - D5D2FF4053B18D3B879EBD1BD83A96FF /* ar.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 88DC7CE9C7AF3F6D77EA058439F3A3A5 /* ar.lproj */; }; - D67FCACAB2080898E3FB8A15EC03196B /* BFAppLinkReturnToRefererView.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B8C623A87FBF3D1D8C9ED2314626863 /* BFAppLinkReturnToRefererView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D6C747A90EC3E85E9E8D3D28E96EEB13 /* en-AU.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 4D654CB9257783068FFAE5D0D401538E /* en-AU.lproj */; }; - D6D605627B2700B7F3B0D7116E76F0B1 /* QMChatOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = B600C30126BD216711388A10934B56F0 /* QMChatOutgoingCell.m */; }; - D716F6D75CC4ECE3F44F4D13967BADEA /* FBSDKAppInviteDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CCE21F12D99AB0FD1ED6C15819452E1C /* FBSDKAppInviteDialog.m */; }; - D71E413C7E34381E3FA497CB81ADDDA0 /* FBSDKShareMessengerOpenGraphMusicTemplateContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BF70F698A2E22E7E7DAF52C44FA3B50 /* FBSDKShareMessengerOpenGraphMusicTemplateContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D812B4281AF77DB346084C784A05B0A3 /* FBSDKGraphRequestMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = F9A2D4A8885396AEE6B02DA325AC4093 /* FBSDKGraphRequestMetadata.m */; }; - D83F96A6C2994845C5E28D0CB0171D16 /* FBSDKMaleSilhouetteIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = DE4384F0EE9CB1DBC4103BBE82FE0C9A /* FBSDKMaleSilhouetteIcon.m */; }; - D868E36B46D09F2ECBAF9464F3DB26E1 /* FBSDKCloseIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 0ED81B1FCD4C06041AC65587F5295749 /* FBSDKCloseIcon.m */; }; - D881F4690E52DBBE48E336B55BC8D308 /* QBUUser+CustomData.m in Sources */ = {isa = PBXBuildFile; fileRef = AF637C15CD6DACD2375C06103C2B63DF /* QBUUser+CustomData.m */; }; - D8E6A025AED323C28714807AFAA07C51 /* fil.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 89309B50B54AF8635BF85559C14A1B4E /* fil.lproj */; }; - D9119A84C57C48F9E52988BD6C469732 /* NSArray+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = E75595A921364B3816AD050BAD1E53E5 /* NSArray+QMCDRecord.m */; }; - D92574DFF3A33B07238FBB3225BB3120 /* _CDDialog.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E961AF4229FC72A146FEB3A86170726 /* _CDDialog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D96DF46D9FBC17339823B8E1061BC03C /* QMDeferredQueueMemoryStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 080865E76B8325E72BF6DBB62CFC63B6 /* QMDeferredQueueMemoryStorage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D9713D4B83FDD1ECD42FF75BAE8AB040 /* QMDeferredQueueMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = C5C84DA30E89C9810D552FBEA4475A03 /* QMDeferredQueueMemoryStorage.m */; }; - D9846D8A5EBA2C803B4312F81040B9BE /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A3EE5FCF3B09FEF062305A90E8C798DB /* ja.lproj */; }; - D9C0BA6D562AAD3709938AFFD5E74EC7 /* en-CA.lproj in Resources */ = {isa = PBXBuildFile; fileRef = D83CD87545847FCFE8B599C110D2CA61 /* en-CA.lproj */; }; - D9F8C15E59E4D9ABBCF3F969C7C6DB50 /* FBSDKBase64.m in Sources */ = {isa = PBXBuildFile; fileRef = 90CAE0856C5DAE3E2BC26B54DF6F8B35 /* FBSDKBase64.m */; }; - DA2C099642C92745F42A1D8729071374 /* ic_retry-grey@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = F10F50F86F9427FE2A53227F2CDDEB4A /* ic_retry-grey@3x.png */; }; - DA3D01BC3785EE1A9BD30746D989EA9A /* QMOpenGraphService.m in Sources */ = {isa = PBXBuildFile; fileRef = 640A1F0FABFBCC83AD533773E58B1893 /* QMOpenGraphService.m */; }; - DA4E448F662D626DC3C15F456938C00D /* QMHeaderCollectionReusableView.h in Headers */ = {isa = PBXBuildFile; fileRef = F7D88C76BE828D9F286AADDF01247335 /* QMHeaderCollectionReusableView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DAB656C013D918BA647BDCDF45383384 /* GTMDebugSelectorValidation.h in Headers */ = {isa = PBXBuildFile; fileRef = 74427046125A8087BAEF77DF91C9B404 /* GTMDebugSelectorValidation.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DB0B0539707400487903CFA996D540EF /* FBSDKShareOpenGraphObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EB4F66FA729C6D4D28E724E013935FA /* FBSDKShareOpenGraphObject.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DB0CBA0D1557AC113F4108E0CA07829E /* QMMediaDownloadService.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D26F711F68FA5A63F2CD865642AE67D /* QMMediaDownloadService.m */; }; - DB15B2CA4B77B2CA07A10A5052A0CFC1 /* QMDialogsMemoryStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = C4AD55D8165DB77B8E8CB1115E603499 /* QMDialogsMemoryStorage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DB510BB0F9776E21B7F8CE172EECD389 /* FBSDKShareButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 031008A6CEA97F2B331FAC30CE005348 /* FBSDKShareButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DB5990B51830007DE8001E6A57F0B4CA /* FBSDKSystemAccountStoreAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = CD6348B159A9A73E6424FC8316E86F3C /* FBSDKSystemAccountStoreAdapter.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DB7C5FAFE3DDFF825B3D2401D295B476 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - DB90D539B2D2CBF891AE08A9BB2ED037 /* BFAppLinkTarget.m in Sources */ = {isa = PBXBuildFile; fileRef = 112BC18BC10E6D3CB254C1A156DBBC8B /* BFAppLinkTarget.m */; }; - DBCA0C9ACD84720B7F2EAB7DADCC1901 /* EXTScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E4B599C45B65DE819071B44FEEBDD7 /* EXTScope.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DD619BFAB418A5DB47517C5C7ED306E5 /* download_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8A3AC07C0E34190634852B22F3ECF10E /* download_icon.png */; }; - DD66234B4708AE1240CB482EC582DD9E /* FBSDKConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 676AEA24265E71BD00FBD6A6F63F33EC /* FBSDKConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DDA640DE83B83C43285ABA7CF32FD69E /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9313D39AC48A99B0BD9A0515100101D6 /* ImageIO.framework */; }; - DDB61EBD07A98E063BC4C8C13975BCAC /* FBSDKLoginUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 299E08F144050D85C1998FD721F4F27B /* FBSDKLoginUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DDB80F6F7DD3B78118490A45D6166360 /* QMChatViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6FC744D1C856216ACFBD8175C970D9C6 /* QMChatViewController.xib */; }; - DDE9B95EDF4BACF713252651A7D6820D /* FUIPasswordSignUpViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = A7EA7F797EEB916C676FBA9982CB5A41 /* FUIPasswordSignUpViewController.nib */; }; - DE7C742A7DA5448223CBD9B216A94AC5 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = DC078FAD2A8120DF47525C4860A3222B /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DECEB6A411CDFA72BFF7764E9AC68C26 /* QMOpenGraphMemoryStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D68398100340AFAB42AE7B0EEBC8DA0 /* QMOpenGraphMemoryStorage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DED03A83F5A60E899DA246C3A83EBACA /* BFWebViewAppLinkResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = FAA4B5DE44728414A8037AB5DC56767C /* BFWebViewAppLinkResolver.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DEFECFB091BF9614B1074B06AED9555B /* FBSDKLoginManagerLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 155F1E92FD7733BDA0831F156C78B123 /* FBSDKLoginManagerLogger.m */; }; - DF094CC988C5BD5CF74688A2F33AC8E7 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = C55D7318BA5BE50B86CD8603FBEEB3D3 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Project, ); }; }; - DF5126E9FC1445CB9A3F5305FAD18B63 /* NSError+QMCDRecordErrorHandling.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A7CF85B14C2EA0CC0F833CD08BDC456 /* NSError+QMCDRecordErrorHandling.m */; }; - DF9EFA9E58D4FAF47929B3995A47AB23 /* FBSDKErrorRecoveryAttempter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B52C500E1218B55E62EF3F3B7D6C880 /* FBSDKErrorRecoveryAttempter.m */; }; - DFCFF954B234EC91BFBEA0464D2E22A7 /* Flurry-iOS-SDK-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 16A207E314BEA46784A2B78DC689CB14 /* Flurry-iOS-SDK-dummy.m */; }; - DFEE78EEE50C0628E8984DAD2BA3DC44 /* QMChatAttachmentOutgoingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = FCCA8815F9A7C072F4BAF5998D567BA8 /* QMChatAttachmentOutgoingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E07B170DF13D9813730A6F621AAF3159 /* bn.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E7F36E5755C513B17E379CE28C92D265 /* bn.lproj */; }; - E0972AD5FACEC99F93A9253F7D852E56 /* es-SV.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C2CFA879BBD41C564B39D8B46D3924E0 /* es-SV.lproj */; }; - E09AA03E8F4B4E01CF52872C35D379A6 /* FBSDKShareVideoContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 043841364B0EB3C71C6C4B47DC4CC399 /* FBSDKShareVideoContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E1149D84D31C62A5CC3F8E0FD24A134D /* QMCDMigrationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 89B520CB39A8CB161906CA0762F5D58B /* QMCDMigrationManager.m */; }; - E14D18B5EA579D3E6A49F5918E2A16FA /* QBChatAttachment+QMCustomData.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DF0EFEC448C8E232755C250EE0125F5 /* QBChatAttachment+QMCustomData.m */; }; - E18265EA0F8A0D18A2CC9D6DF646F562 /* FBSDKShareMediaContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E84DD0FB95C01B073F683BCC27B0B4 /* FBSDKShareMediaContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E1CB5887F34F79B3C9030320F222F05C /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B2BB1D77E80BC8007FB13B129679A061 /* fr.lproj */; }; - E2345259CD6848F867A0DEE56E4684FA /* QMChatViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 165782D1A69F0C15E98C100A317C07EB /* QMChatViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E2A7CD83BF78316EFCF4A578B363CD9E /* es-CO.lproj in Resources */ = {isa = PBXBuildFile; fileRef = DAEED0C612898D8D53CD1ACBB12BF642 /* es-CO.lproj */; }; - E2CA211CC25715BC3D884336126DF71E /* QMChatCollectionViewFlowLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = F58EAD8468D4F883B826C1A1F6B97120 /* QMChatCollectionViewFlowLayout.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E2FB3863FFABE664D5A8FB5558EFA758 /* BFAppLinkReturnToRefererView_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = A18D52AE481F843989AF494A0004E0AC /* BFAppLinkReturnToRefererView_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E3034A7DF4AF7A88A814E90089F9D5B9 /* _CDMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = F1E2F39975D1D65A2E2EFB2E17890339 /* _CDMessage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E35810BC20AB1659125676AC17FB456E /* FBSDKShareConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = EC197E55D9592E31472CF14B4B386F3C /* FBSDKShareConstants.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E397C7172E8D640B76BE29D6C6DC4FBF /* pt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = EFB82C3A88A418A1024B365206C05AF7 /* pt.lproj */; }; - E3A04BE014878C82E7E83D8F9EAC894A /* FBSDKAppEvents+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D38AB2DF580B645033E2A81C7B87B8 /* FBSDKAppEvents+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E3AD7A332BC444A6DEBF238AF9724C20 /* FUIAccountSettingsViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = DD60D06BB6D2460F97E88C5ED083D6EC /* FUIAccountSettingsViewController.nib */; }; - E427B34FD3B06E68F3037662CB8D3CD4 /* FBSDKServerConfigurationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 92AFA49E5FC9462F49C66FCC4CF6A0A1 /* FBSDKServerConfigurationManager.m */; }; - E43766C39792FE24EFAF9291C5579176 /* GTMSessionUploadFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 3038EFEFFBDC6E8E2BD879A1B50C4DC5 /* GTMSessionUploadFetcher.m */; }; - E44192C848B25FD80E4AA9373F5E8C9A /* _FBSDKLoginRecoveryAttempter.h in Headers */ = {isa = PBXBuildFile; fileRef = 20FC0FFB8D3FB73C790CA45B217BFB9E /* _FBSDKLoginRecoveryAttempter.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E44C8B100F485935E6100D23E3665253 /* QMAttachmentContentService.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F860E42F86E8B65F5B5CFAFE8352F6B /* QMAttachmentContentService.m */; }; - E4562537D15928114C2E377BB5AB430B /* QMChatIncomingLinkPreviewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 45465AFA11DB1AE2C899280B37028EE0 /* QMChatIncomingLinkPreviewCell.m */; }; - E480768AF9D004F73B25CA90C3923DC4 /* ro.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 1A934B762B72F16F3172CF6D4B72D602 /* ro.lproj */; }; - E485FBCFA871CB9F257C38C6104B3FD5 /* FBSDKAppGroupJoinDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D44313DA082F6A088E8D57A28C7ED79 /* FBSDKAppGroupJoinDialog.m */; }; - E4C486459A5F6055051BED9076844C03 /* Bolts.h in Headers */ = {isa = PBXBuildFile; fileRef = EC194804088AA8081C03E24131F54E2E /* Bolts.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E4ED9290FD0C96EC330AB845313C9B6D /* FBSDKAccessTokenCacheV3_17.m in Sources */ = {isa = PBXBuildFile; fileRef = E14D309AE9DB8E370583DF39EEF2DC2E /* FBSDKAccessTokenCacheV3_17.m */; }; - E51CF4CEF47A4A05B121000393308E05 /* FFCircularProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C04F21651292269975A9AD4894121B9 /* FFCircularProgressView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E56DADB4D15676E505F839F263D72D15 /* QBChatMessage+QMCustomParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = A511FA8CB99AF0C4858C4FC52BA89231 /* QBChatMessage+QMCustomParameters.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E59C57E2CFA182C9496D8785B929306F /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 19BA3BBBC9475A29ED258B79AD1A1B01 /* SVProgressHUD.m */; }; - E5A3542AD87657E08DDB693CD7C48CD8 /* BFWebViewAppLinkResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = B3E349F9CAD08BC29D38EA663928EA40 /* BFWebViewAppLinkResolver.m */; }; - E5DCA4F5BE67C0989D717195F7F038CC /* FBSDKAccessToken.h in Headers */ = {isa = PBXBuildFile; fileRef = EE17D443990AD447F5A6464E4B7F5E5E /* FBSDKAccessToken.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E6256A52A498831065BDDE169D4A3CCF /* NYTPhotoViewerArrayDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 13EB4DBD5DA1EA9A95F9DD93D1DDFC10 /* NYTPhotoViewerArrayDataSource.m */; }; - E65344E0757DDA3138C54237EE156D3D /* NYTPhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E63E98949FB0CEE541C5E6F893C975EC /* NYTPhotoViewController.m */; }; - E696B44C55983CEB99AB4B065B728DDD /* QMCollectionViewFlowLayoutInvalidationContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FF80C52BF226B31FCF90F4ECCDFFD6E /* QMCollectionViewFlowLayoutInvalidationContext.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E800588CFA581D53C49A44134384B430 /* FBSDKSharingButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D660EFF78CD8002D8D864C4CA1566CF /* FBSDKSharingButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E80844C19053A30D6BD7A0C3B73EEEAA /* FBSDKLiking.h in Headers */ = {isa = PBXBuildFile; fileRef = A1F54B4046E93628DCC0ACC824E213CE /* FBSDKLiking.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E844839BC566461809B2A3D9C58240AB /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAB7FE2F7E13A765849C397366F11867 /* CoreText.framework */; }; - E878FFDE9DC915A10CB6E8BBD703A079 /* sk.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9E6C9DFB4878BE546BDDA5B892E3619D /* sk.lproj */; }; - E8850950EDFDF74A79F544EBCACBA806 /* SDWebImageImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B2B269A85EB96A9FFCDC384073043086 /* SDWebImageImageIOCoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E8D9E7D0D013D8A5C4122DC8AC31030A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - E8EFA6AFC53C3C1846970650AB065C25 /* QMChatIncomingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 33AE37F4DD3F12176330307D7A624B68 /* QMChatIncomingCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E90522E17955FE05776A91AAC420F985 /* FBSDKLoginError.h in Headers */ = {isa = PBXBuildFile; fileRef = 24D71417F6A0929EBA47DE84803474EA /* FBSDKLoginError.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E91DFFA6975862F723B7DC3DA7987ABD /* FBSDKCrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = D203D3D75D0B9C7736ED22748587F6A3 /* FBSDKCrypto.m */; }; - E98953DBAE73AD6F6A2DEC5F10A9B55A /* QMContactListMemoryStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 39F55BA8BF69E1292FA41F0A52720C9E /* QMContactListMemoryStorage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E9C47E213A48E0D87949F230B49FF691 /* sk.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 0DB39183C72FAEB199933C4E624E1596 /* sk.lproj */; }; - EA140C36DB2D6A9AFAE40BA0A1ED7E7E /* FBSDKShareDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = FD270B49C5DD78CEA5B08D21A373436D /* FBSDKShareDefines.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EA683A944F87DBB587E3AAE2211D90CB /* UIColor+QM.h in Headers */ = {isa = PBXBuildFile; fileRef = ECD8A3D627396A4AF16FC0386EF61A1E /* UIColor+QM.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EA7F3D8CB1C66E2C5B8E9085F862BC55 /* es-419.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2E3E8B53125AFB9B6B7FD4659BFD1569 /* es-419.lproj */; }; - EAB499C4FFBC324D228A2656ED474ADE /* QMContactListMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = EE95A86900ACA3388510FB51E4EAA45E /* QMContactListMemoryStorage.m */; }; - EB653973193351FB238FF5D8D7CFAA6F /* lt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 08449946680B800B2EFCEE599703ABF8 /* lt.lproj */; }; - EBBA44F1CEF276447F3FB88B416107AF /* FUIEmailEntryViewController.nib in Resources */ = {isa = PBXBuildFile; fileRef = 5A5254A20495C5EBEF32700CFD95EC27 /* FUIEmailEntryViewController.nib */; }; - EC4B11EC46195677AB8664725A48CDF5 /* fi.lproj in Resources */ = {isa = PBXBuildFile; fileRef = EEDA04AD32615BCF2612686375FC6D19 /* fi.lproj */; }; - ED549D778B6A5BEE8035C8CDE47C5144 /* es-SV.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 1212A4F9E53171A83DD426A604D1EA74 /* es-SV.lproj */; }; - ED54F88CA4935E54A3F8225974A4BC1A /* FBSDKUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B28568E19F3BFADD8ABA9EC38F62875 /* FBSDKUtility.m */; }; - ED7C9125BF4BB41581F0CD9FC02A0981 /* FBSDKLoginCompletion.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F7164B104C8C9D51BA2BC400F5C7C4F /* FBSDKLoginCompletion.h */; settings = {ATTRIBUTES = (Project, ); }; }; - ED869FBFD01737B58849D2C14854202E /* QMAttachmentAssetService.m in Sources */ = {isa = PBXBuildFile; fileRef = A6F63999B8BBF641665626A58D09BC11 /* QMAttachmentAssetService.m */; }; - EDB69A2612D50516C1859B6443C2E28E /* QMVideoOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 59A81D8A9AAA366E951E8266E524242E /* QMVideoOutgoingCell.xib */; }; - EDD69AC4C7A3B2B5398F8B33ADFBC12D /* ur.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A063571860C246C1AC8235D782944E05 /* ur.lproj */; }; - EDEB3A3A470381F802B91B4CE28BD71D /* NSManagedObject+QMCDRequests.h in Headers */ = {isa = PBXBuildFile; fileRef = BA5486542ED09C8F898C206589294DE5 /* NSManagedObject+QMCDRequests.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EE2DA058BD9FFFE38CD1736EC27C20C2 /* es-419.lproj in Resources */ = {isa = PBXBuildFile; fileRef = AD8031FF366A3E027D069DF4A421CDD8 /* es-419.lproj */; }; - EE3CF11BC7442EDD6A83CB06051DF0B3 /* QMUsersCache.h in Headers */ = {isa = PBXBuildFile; fileRef = BEAD17E07DAF7BA8E463468B19887933 /* QMUsersCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EEDA145EBF069A3EA7B73F08DBFF6BA6 /* kn.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 090E274C0DA5DED3257582D728CD8883 /* kn.lproj */; }; - EF24C24137863C733D4F041F034E0F44 /* FBSDKAppEventsState.h in Headers */ = {isa = PBXBuildFile; fileRef = 265A7C018D79CF16A5689490133E139E /* FBSDKAppEventsState.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EF63A5227115590E4BD3EC9315315EC4 /* _CDAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 308E46C1BD1008C4A336E1610B43438A /* _CDAttachment.m */; }; - EF7722D72FCA3A27E05EC9D4A716D5FD /* GTMNSData+zlib.m in Sources */ = {isa = PBXBuildFile; fileRef = B3842177259006214FC66D8F39C65E41 /* GTMNSData+zlib.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - EFAA75C69CB94F08A4A81F3C9D14A799 /* QMChatCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CFDECB4495BA493620B18AB8350C46 /* QMChatCollectionView.m */; }; - F006CC8B3278EB6D03FD835CA28C33C6 /* FBSDKGameRequestDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 765BF07B1A244B280EE689D9CAD0C4CE /* FBSDKGameRequestDialog.m */; }; - F056F400B438FC93283FA24FB72EF8E1 /* Reachability-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AB31C02CB7AD7A4143E84D7CBDEBA90 /* Reachability-dummy.m */; }; - F0C50AB449C97E65E247A609EDD151E2 /* FBSDKShareMessengerOpenGraphMusicTemplateContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 72006B0930241D522F61D3F8C5FFED74 /* FBSDKShareMessengerOpenGraphMusicTemplateContent.m */; }; - F0D87A8CAFFADB0B1140238DB5B72E98 /* FBSDKBase64.h in Headers */ = {isa = PBXBuildFile; fileRef = E6C89F11B8338CACCC27234705480843 /* FBSDKBase64.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F13615ED9A9C5DD6C795EB72142E164F /* QMChatCollectionViewFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 75E4853480F90A6F938C764123A335C2 /* QMChatCollectionViewFlowLayout.m */; }; - F14342B6B371DFF46C906DD0AD4F49B7 /* FBSDKShareLinkContent.h in Headers */ = {isa = PBXBuildFile; fileRef = 73A5A6A06E9724DDDA1544678DB6F73E /* FBSDKShareLinkContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F146DE72403DD552524ED91E49E3487F /* FBSDKAccessTokenCacheV4.m in Sources */ = {isa = PBXBuildFile; fileRef = 3232649E9044548C5C6E39B1389A9D8B /* FBSDKAccessTokenCacheV4.m */; }; - F152CF959AB3A12330D060FAB76ACE9D /* QMAuthService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = 91AF384C2CA00703F94D0642F00AC2D4 /* QMAuthService+Bolts.m */; }; - F1D79E2D4CDCF8EF0A9FD17414395836 /* FBSDKShareMessengerContentUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = D0D89469DC6519B455A40EF78F86973D /* FBSDKShareMessengerContentUtility.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F1DC23CA770CB649C804879471F29BA8 /* cs.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 373EF4164EFDC76E0B31A3FB98B78B71 /* cs.lproj */; }; - F229DAFD5F88AC8E5E95AE24F2E2B2A1 /* QMChatCellLayoutAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7683F605FFEA48D580B929A70C44BC91 /* QMChatCellLayoutAttributes.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F24CFB8CDC8FF502392C8ADB97B5693B /* Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = 29DB827CCBDA8EF05B017A23DC0AD3ED /* Bolts.m */; }; - F2A71EFF37214BF8F060F8710E7358A8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - F2A7C7D18755231B289C10D16DD6F730 /* pb_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 22199C2E0BBA88A70488861396395BF5 /* pb_decode.c */; settings = {COMPILER_FLAGS = "-fno-objc-arc -fno-objc-arc"; }; }; - F2EA609FDFAA0530E1B0E33AEB9DA8CC /* FBSDKTimeSpentData.m in Sources */ = {isa = PBXBuildFile; fileRef = E007CC53E6319489F35272DF3081A77C /* FBSDKTimeSpentData.m */; }; - F31072E99551555BDA26ACF5565E1821 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78871113E2E8880927AC6E26B088A625 /* QuartzCore.framework */; }; - F3285509296F5E4731A74D98808B1D98 /* NYTPhotoTransitionAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = C0C438F63254C0AD2151AEDAB0AC80FD /* NYTPhotoTransitionAnimator.m */; }; - F396C4B2619751937488E42A8B1F909E /* QMToolbarContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = ACCBADBE2842037A58CE8AA98EE3EDE2 /* QMToolbarContainer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F3A8F47BC69BE761EC30A5F02D8A2176 /* FBSDKLikeButtonPopWAV.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DBFF290B302089F4214D4B875793DB6 /* FBSDKLikeButtonPopWAV.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F3F8C74FD51BE3734FF45B207B37E6FF /* QBChatAttachment+QMCustomParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D99EEA366BCA69F025A4DD7D93DFF75 /* QBChatAttachment+QMCustomParameters.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F4125D15F946BB3EF0FAE6BADBB8D8AF /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = F73601E95B31E7D60B2DAA2BF41C7556 /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F4217632C7B77E48EBBC39AF20A94E29 /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 62F8CB8CF96190F9944CA3368F5E516C /* ko.lproj */; }; - F4EA1A3F15F0B9DD051F0976130215F0 /* FBSDKMath.h in Headers */ = {isa = PBXBuildFile; fileRef = BD856D945F8BCD6714937270EEA47FEB /* FBSDKMath.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F50F96C6EDBD53866721FEB613ECB5C9 /* Pods-Q-municate-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8513C813B77D7EDDBF9D99C7BC757661 /* Pods-Q-municate-dummy.m */; }; - F613AE743A2DFA98D4A071CC2A9541D4 /* zh-Hant-TW.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 50A575F21F5DE06A0E52C3AD72812C83 /* zh-Hant-TW.lproj */; }; - F668D333F6F5872A44E2DFCC28533D19 /* QBChatMessage+QBDateDivider.m in Sources */ = {isa = PBXBuildFile; fileRef = 879462D1292026C3C9BCA4BF3B9125DB /* QBChatMessage+QBDateDivider.m */; }; - F66D3FFD1965EB35F6FE239BC2B03B15 /* FBSDKLikeObjectType.m in Sources */ = {isa = PBXBuildFile; fileRef = 1089BA1FF6078008C86B24202F3548ED /* FBSDKLikeObjectType.m */; }; - F66FB60AEB7BA1C837060CFE365D6A0A /* QMAudioRecordButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 682BB9E15B8F95A59E8246D26B5A952A /* QMAudioRecordButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F6AE24630AC6A6047436701060E7BF98 /* _CDMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = CA4758ACD1C36A267D8402AEC966A9F3 /* _CDMessage.m */; }; - F6C92B20934D4364422C626FE055E22D /* CDOpenGraphModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E5BF8E765C8E25721994C3B74BB0345 /* CDOpenGraphModel.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F6DC97DC7DA1BE52BC31B0EDEDEA6832 /* QMVideoIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = AB1D90BFFF374680ED56281733B5E58F /* QMVideoIncomingCell.m */; }; - F702D3BC1FA6695674145FF41C2AE639 /* BFTaskCompletionSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 32A3E87042FCD1EE728C14EA128C6F76 /* BFTaskCompletionSource.m */; }; - F71AE72C95D56248AE7332011A8CF8E8 /* FBSDKServerConfigurationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F5B015F91145C2616B08F3661A9C364 /* FBSDKServerConfigurationManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F72AEB4002F9AE28BE58E8092EEE80C0 /* FBSDKShareDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 608B627E7BB108D4CAE7DEB08CFE5211 /* FBSDKShareDialog.m */; }; - F760EE445CF8A732EF0D9C9AC71112F5 /* FBSDKLoginCompletion.m in Sources */ = {isa = PBXBuildFile; fileRef = 5AFBE6249A36D904599A4EC90B89BE30 /* FBSDKLoginCompletion.m */; }; - F775F3A65D24DFEBAC956508C1CFB158 /* FBSDKPaymentObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 12132BB3A3553DD7A1AE419AD5471D35 /* FBSDKPaymentObserver.m */; }; - F82EB57DE8272C532606AEC7B13809C5 /* FBSDKGraphRequestConnection+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3557F6CD1973A9BF96E0DCEC179F94 /* FBSDKGraphRequestConnection+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F8CFE1A929D930F52BFFA8BF893306BF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */; }; - F90AB41015899701F8C4B66F6E6D6E0D /* FBSDKShareVideo.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D407FC7369497DC059AC41B496CE64A /* FBSDKShareVideo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F936C08FAAB3A29296ABE8DB9B9A9AD0 /* FBSDKShareLinkContent.m in Sources */ = {isa = PBXBuildFile; fileRef = DD2956E91B8A4356BBB8321384E684F8 /* FBSDKShareLinkContent.m */; }; - F98CD6C35638FBFA6C4583F0DF58594D /* _CDContactListItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 070E972CF1E8E32CEF471AE8DF4D322A /* _CDContactListItem.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F9C09636DCFEC71F2DE240FA42E69C85 /* cancel_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 1876384A946CB6B0E0EB8729A71B8E2B /* cancel_icon.png */; }; - F9E01E79A640D271E1725EC05BA546F8 /* lv.lproj in Resources */ = {isa = PBXBuildFile; fileRef = DF0D6A0BC96D580C5E94F26047E6259D /* lv.lproj */; }; - FA233DC8E8A9CF5E67F1F456059A7F2A /* FBSDKCameraEffectArguments+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D9B57C9B26DD8B4208E51ED2A417F1 /* FBSDKCameraEffectArguments+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - FA720ECFF1607AC234D0F4CFD8F35A3F /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 01A7CC34EB4681D8ED395D2394255C2F /* SDWebImageDownloader.m */; }; - FA87E8A20F65ED5A3F443D50CCCCB51F /* FBSDKAccessToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 225B414B92120D2EECFBE71C12E0002D /* FBSDKAccessToken.m */; }; - FA93B7D2A89A2E7E3D894D8F8AFFD61E /* NSManagedObject+QMCDRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = BC46F903C6AAB1F0659EE44EBBA18AE7 /* NSManagedObject+QMCDRecord.h */; settings = {ATTRIBUTES = (Project, ); }; }; - FACE3FC28DA8CCD8FDA0F729A4394F76 /* NSManagedObjectContext+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A8922B942F48C7FD27D242DCE20FEF9 /* NSManagedObjectContext+QMCDRecord.m */; }; - FAD53C4FBA2A005C96352DB1F3E3CF18 /* FBSDKImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E831389AAFFD53B1FDDB57DD725410C /* FBSDKImageDownloader.m */; }; - FB001E58F2BD98D47FC4BADA7841FEDB /* TTTAttributedLabel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9ABF4E3F601C527114264D27919AC2 /* TTTAttributedLabel-dummy.m */; }; - FB0288B263496C5EFAFC2C2E962D18A8 /* FBSDKShareVideoContent.m in Sources */ = {isa = PBXBuildFile; fileRef = 42D9686C057957B2E8A487CC0BE954D6 /* FBSDKShareVideoContent.m */; }; - FB264372543BBDD1A8993BB59FA4E3C4 /* FBSDKProfilePictureView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F021049C7CD7194F2AF638DD3D2B634 /* FBSDKProfilePictureView.m */; }; - FB3BEAAE40E661E43E67A2EE1B7CFE48 /* NSDictionary+QMCDRecordAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = F9B1377FE6AD9DE7FA6727AF18E80E1E /* NSDictionary+QMCDRecordAdditions.m */; }; - FB86E96C0821AB646C11F8B087456D7E /* es-CL.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9A73474AE2373DD589009FAEAD587C7B /* es-CL.lproj */; }; - FB9F36C66EADD18C7E7591FF1672D21F /* FBSDKMessageDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = AF91B474790172A61D5CA15606433BDE /* FBSDKMessageDialog.m */; }; - FBD63049F37FDB5D0F62A60EC1938F68 /* QMChatCellLayoutAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = CF027E2FF44990914055185E25ECEC58 /* QMChatCellLayoutAttributes.m */; }; - FC6D948092882D69EBCC288D9CDE797A /* QMSLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 82881E1250669D4FFACAD4952B62D550 /* QMSLog.m */; }; - FDEB8693B8FB1197992FE3B15F185461 /* QMChatService.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E711F35DA0A4EC11CE47595DA0749F1 /* QMChatService.h */; settings = {ATTRIBUTES = (Project, ); }; }; - FDF0276C21F063C30439A5A4AC9B4F8D /* QMToolbarContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D347A4810417C5DC40E80E20374495DA /* QMToolbarContentView.xib */; }; - FE77C4C0DA430BBEC07AFDB0A1B0558A /* es-VE.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 48BF79C573BE65694F8C9F318960056A /* es-VE.lproj */; }; - FEB4F5A07A5C86FEF4BD3BB28037A702 /* UIColor+QM.m in Sources */ = {isa = PBXBuildFile; fileRef = BA2786FCB45F06114D09057957C5E821 /* UIColor+QM.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 0B7F8E1543F0D7BA4278796566996C1B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1A06F5C7E9649A20BBB3BDB19FF15CD8; - remoteInfo = FFCircularProgressView; - }; - 0C102706A8F9350ABA99E849962F9796 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = DE868725B18AE240E550C5515AE66BC4; - remoteInfo = GTMSessionFetcher; - }; - 0D05C4DBD11D76BE62B88670587DD552 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1A06F5C7E9649A20BBB3BDB19FF15CD8; - remoteInfo = FFCircularProgressView; - }; - 12BD50F904C5C78EE7852D987D078882 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 58E7450DB13C5ECCE92D3C0DF7CF0903; - remoteInfo = GoogleToolboxForMac; - }; - 135C5182914BCB3FA26CBF3BBA6259AA /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3C7B23B3FE0CE1A6131C7E09B3F47DA3; - remoteInfo = FBSDKCoreKit; - }; - 17D702CBB4DC6B6FD39130BB1669ABC1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0E9F6724C731DB563F6A7FC5A489C702; - remoteInfo = Bolts; - }; - 1D6498AA387DD9EE95F5A1211047825B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0690B3703CDEFCA9E550593425EBA16D; - remoteInfo = "UIDevice-Hardware"; - }; - 2604B4885A8B9772704A44C4B340EDF1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 53E70B95EC311E7F79EEA81B041F3B9D; - remoteInfo = "QMCVDevelopment-QMChatViewController"; - }; - 2DD334BB0816528EAB5BAF801D0DFB5E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = D24D2A88B10BCFB43CA46716E6A68C14; - remoteInfo = "FirebaseUI-FirebaseAuthUI"; - }; - 367FA66A25701C6EA69CF29D7FCAD50F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0E9F6724C731DB563F6A7FC5A489C702; - remoteInfo = Bolts; - }; - 378108ADE0E77C76C7C91966653D928B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5DC7D7B380A5FEAE815A0DDD986A0174; - remoteInfo = FBSDKLoginKit; - }; - 3F26EA52C5537C980B65566C36D9CB61 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4AC6694FB63559D1F05407D6114112E8; - remoteInfo = QMServicesDevelopment; - }; - 4034748D4A672B46C07FC337C6CD21F4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0E9F6724C731DB563F6A7FC5A489C702; - remoteInfo = Bolts; - }; - 4480C35EB694FE40EE7DBC0BE7C5C411 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = BD669C0D6F0266E29B35F7AE071BE0A7; - remoteInfo = "Flurry-iOS-SDK"; - }; - 47A211AD4FB141BB981B22C91B7A2156 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 950C39FC06439A7624B49DD0B04EF6A4; - remoteInfo = Reachability; - }; - 47DB095DA27E27635A21BCCBC90A1C3A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 83014B2A0ECA41385F1F8E17B56DA168; - remoteInfo = SDWebImage; - }; - 625133541CC8D6C3159038A515D478EE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0E9F6724C731DB563F6A7FC5A489C702; - remoteInfo = Bolts; - }; - 6AB88A966B004CDE3585A8DB8D48184B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0E9F6724C731DB563F6A7FC5A489C702; - remoteInfo = Bolts; - }; - 795E4F1DE8F7AFDBDFDDC2272BFC6F0C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 83014B2A0ECA41385F1F8E17B56DA168; - remoteInfo = SDWebImage; - }; - 79AED5ACD2884AD93AE7B5B2089B98D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 53F8571E2D572C4069860E38654A566A; - remoteInfo = FLAnimatedImage; - }; - 829905940B208F27C1872C17FFE40022 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4AC6694FB63559D1F05407D6114112E8; - remoteInfo = QMServicesDevelopment; - }; - 8897C673AA6B5FAFB722E39FCABF6BA3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 53F8571E2D572C4069860E38654A566A; - remoteInfo = FLAnimatedImage; - }; - 8D8D71E6C46870674A261E30910304C2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1A06F5C7E9649A20BBB3BDB19FF15CD8; - remoteInfo = FFCircularProgressView; - }; - 914E3A99ABF91B041B18075AB63FFC93 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 950C39FC06439A7624B49DD0B04EF6A4; - remoteInfo = Reachability; - }; - 9BFBE6572733456061C9BA287E6FDA38 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 947C320DA7E2498987AA8DBC41B6962B; - remoteInfo = TTTAttributedLabel; - }; - A144A83551E28D257CFAB4371E794DC2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4C6C0DEC127307838A58C68F289A3404; - remoteInfo = FBSDKShareKit; - }; - A32794DC12A1850A50F0314D914DA25D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = D2289897589673E90494782E1C342882; - remoteInfo = QMCVDevelopment; - }; - A77B9366997A88FAE42654CA551AAF67 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4AC6694FB63559D1F05407D6114112E8; - remoteInfo = QMServicesDevelopment; - }; - AA91F2DE5D3488C797E21394E8F003E4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = C887E366CD38658EFB8D7738027F2DFD; - remoteInfo = "FirebaseUI-FirebasePhoneAuthUI"; - }; - AD9FF8DD4C171F63B48324649787A64F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9759E35C43E441BC28525D08A117A254; - remoteInfo = SVProgressHUD; - }; - B399C58D7C7FF82067B2D725D51EE9ED /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 2DF45F79772046883B169490C8F114D5; - remoteInfo = libextobjc; - }; - B3D07EE11E1BA2B58A1F5B483302C2D8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0E9F6724C731DB563F6A7FC5A489C702; - remoteInfo = Bolts; - }; - B6E0E10E84820E59A324F381FDB68722 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3C7B23B3FE0CE1A6131C7E09B3F47DA3; - remoteInfo = FBSDKCoreKit; - }; - BB9FFB04762096840A1704F9803EA433 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = CF4B35B9FC819386EB09219BC91827D7; - remoteInfo = nanopb; - }; - BBA91CA1458F65D7D64AFD38F285C480 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 38A71AE9A9ECB4C06A722B8AEA6349F0; - remoteInfo = "QMServicesDevelopment-QMOpenGraphCacheModel"; - }; - C6AF60302AC683396EF29C7999BEBAFC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = B5565B1B4186F2175F4B214784342804; - remoteInfo = "QMServicesDevelopment-QMUsersCacheModel"; - }; - D12E602FE5085511850C080C297EDA1B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 947C320DA7E2498987AA8DBC41B6962B; - remoteInfo = TTTAttributedLabel; - }; - D1770A9C3D67F530E63D47CD7576CB9E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 947C320DA7E2498987AA8DBC41B6962B; - remoteInfo = TTTAttributedLabel; - }; - D2142A2131404A69C116F691E343907E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = D2289897589673E90494782E1C342882; - remoteInfo = QMCVDevelopment; - }; - D432BCF829AED800DAE4AF954589AC66 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3C7B23B3FE0CE1A6131C7E09B3F47DA3; - remoteInfo = FBSDKCoreKit; - }; - DB16792368A975C187F361791459FC1B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9FEAFD88D24F33B95A476A6CE1C9D7B1; - remoteInfo = "QMServicesDevelopment-QMChatCacheModel"; - }; - E7B063553FD502EAAC947C55C5CCA725 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9E08ABFDE9A9FEBE05E34F8D602B5D05; - remoteInfo = NYTPhotoViewer; - }; - E9AABB33B7D8FAA00328ED4425645414 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = F305603935A816A46FDD1958CB4F3C54; - remoteInfo = "NYTPhotoViewer-NYTPhotoViewer"; - }; - F2CF0FDE26A8651037BD7C88EC075B0E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0E9F6724C731DB563F6A7FC5A489C702; - remoteInfo = Bolts; - }; - F72832A02FE8C65E231C121F9EA91ADC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 83014B2A0ECA41385F1F8E17B56DA168; - remoteInfo = SDWebImage; - }; - F83C7EAADB03E8D3C9E6929FC5B6EB42 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0B75BDD839FAE8A626E9F849FAD07E1D; - remoteInfo = "QMServicesDevelopment-QMContactListCacheModel"; - }; - FDFF9C2BD426D729034057EA404ED934 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = AF8DD809CD36FF2A5C8E36ED6C4D1F07; - remoteInfo = SAMKeychain; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 000E912B319B0A7D9B29CD2D3F9BEB75 /* FBSDKLoginKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSDKLoginKit-prefix.pch"; sourceTree = ""; }; - 002FED19B3E79635C82263BFBDBEC602 /* QMDateUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMDateUtils.h; path = QMChatViewController/Utils/QMDateUtils/QMDateUtils.h; sourceTree = ""; }; - 00555FB9F2991B1CA49F0ABC1367E525 /* FBSDKBridgeAPIRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPIRequest.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.m; sourceTree = ""; }; - 007200A07E5D479BC917BC05A2B92AA2 /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nl.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nl.lproj; sourceTree = ""; }; - 00CE0B1ABBC0A41916AB4ECEDF004CD5 /* FBSDKCoreKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCoreKit.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit.h; sourceTree = ""; }; - 00D1C7BDD1B5E5377C24C65AE4401A8A /* NSManagedObjectContext+QMCDSaves.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSManagedObjectContext+QMCDSaves.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDSaves.h"; sourceTree = ""; }; - 00D301185B1872E80D384A376C2E97F3 /* NSPersistentStore+QMCDRecord.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSPersistentStore+QMCDRecord.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecord.h"; sourceTree = ""; }; - 01659747D7409A470569199D8F587F19 /* ta.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ta.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ta.lproj; sourceTree = ""; }; - 01A7CC34EB4681D8ED395D2394255C2F /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; - 01D02DBEB8B9B8494EDED59F61B0C25E /* libFLAnimatedImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libFLAnimatedImage.a; path = libFLAnimatedImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 020161628B89E14C3C3F68F0CD675623 /* QMChatAttachmentIncomingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatAttachmentIncomingCell.m; path = QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.m; sourceTree = ""; }; - 021811014C6811F999E09CCEEA749660 /* FBSDKLogo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLogo.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.h; sourceTree = ""; }; - 0239AF1E527E4B141E2AA27ED088F54A /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = ""; }; - 0250DEF252E1B257DF79C7F355652851 /* QMCollectionViewFlowLayoutInvalidationContext.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMCollectionViewFlowLayoutInvalidationContext.m; path = QMChatViewController/Views/CollectionView/Layout/QMCollectionViewFlowLayoutInvalidationContext.m; sourceTree = ""; }; - 02B89BF2E737913E5927A071ED7FC692 /* QMCDRecordStack.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMCDRecordStack.h; path = QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecordStack/QMCDRecordStack.h; sourceTree = ""; }; - 031008A6CEA97F2B331FAC30CE005348 /* FBSDKShareButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareButton.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.h; sourceTree = ""; }; - 031E860E44DF8F80D270D579FD7B54BE /* NSManagedObject+QMCDRecord.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObject+QMCDRecord.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRecord.m"; sourceTree = ""; }; - 035A81E52D02C9A8F12FA0DFAA70781C /* th.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = th.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/th.lproj; sourceTree = ""; }; - 03F94CA912CB33126822B9B042C68364 /* tr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = tr.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/tr.lproj; sourceTree = ""; }; - 043841364B0EB3C71C6C4B47DC4CC399 /* FBSDKShareVideoContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareVideoContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.h; sourceTree = ""; }; - 04BCB41E54AE39043E53CAD958B9D331 /* FBSDKAppEventsStateManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppEventsStateManager.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.m; sourceTree = ""; }; - 04CFDECB4495BA493620B18AB8350C46 /* QMChatCollectionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatCollectionView.m; path = QMChatViewController/Views/CollectionView/QMChatCollectionView.m; sourceTree = ""; }; - 0523E2CFBCFC4CBA74579265EBFACD8D /* ro.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ro.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ro.lproj; sourceTree = ""; }; - 05353E79445CE9E3D4F4A025397B34D2 /* FBSDKHashtag.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKHashtag.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.h; sourceTree = ""; }; - 05EBC9DA1A60161009543C4221BCBD37 /* attachment_ic.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = attachment_ic.png; path = QMChatViewController/Icons/attachment_ic.png; sourceTree = ""; }; - 05ED1A3EBC924840992A6A6C7C4A10B5 /* QMAudioOutgoingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAudioOutgoingCell.h; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioOutgoingCell/QMAudioOutgoingCell.h; sourceTree = ""; }; - 070E972CF1E8E32CEF471AE8DF4D322A /* _CDContactListItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _CDContactListItem.h; path = QMContactListCache/QMContactListCache/CoreData/EntriesMachine/_CDContactListItem.h; sourceTree = ""; }; - 0741C9B21D644A6F06DB53C1D324353E /* nb.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nb.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nb.lproj; sourceTree = ""; }; - 079F341D8ABD715D814F0C56673A3ECD /* QMChatResources.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatResources.m; path = QMChatViewController/Utils/QMChatResources/QMChatResources.m; sourceTree = ""; }; - 07A74B68C426E8FFD2D85A3C54564DB9 /* lv.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = lv.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/lv.lproj; sourceTree = ""; }; - 07BD5566E47E4A8CB72022C901A34740 /* fi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fi.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fi.lproj; sourceTree = ""; }; - 07D0F096787C0D1257A4E0EF4217EECC /* FBSDKLikeControl+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKLikeControl+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeControl+Internal.h"; sourceTree = ""; }; - 080865E76B8325E72BF6DBB62CFC63B6 /* QMDeferredQueueMemoryStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMDeferredQueueMemoryStorage.h; path = QMManagers/QMDeferredQueueMemoryStorage.h; sourceTree = ""; }; - 0820F6290823344A52B450D4DFE85FBB /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreMedia.framework; sourceTree = DEVELOPER_DIR; }; - 08449946680B800B2EFCEE599703ABF8 /* lt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = lt.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/lt.lproj; sourceTree = ""; }; - 08E989357139E9D222F79B70A96C5F9E /* FBSDKGraphErrorRecoveryProcessor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphErrorRecoveryProcessor.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.h; sourceTree = ""; }; - 08F1C768FDB22D63941377FF26F89F50 /* Pods-QMShareExtension-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-QMShareExtension-acknowledgements.plist"; sourceTree = ""; }; - 090E274C0DA5DED3257582D728CD8883 /* kn.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = kn.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/kn.lproj; sourceTree = ""; }; - 098B357167D7583E9554FAD391143911 /* nn-NO.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "nn-NO.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nn-NO.lproj"; sourceTree = ""; }; - 09A33ECBCFC7DE86C491FE3219D6CDFD /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; - 09A748C2CAE33B422B035DF0348EF07C /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; - 09BF859A435E37A7EE916E0DDAE77FDA /* FBSDKURLConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKURLConnection.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.h; sourceTree = ""; }; - 0A0A0D79FE0AD290BBD8880DCCBCFA30 /* Pods-QMShareExtension-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-QMShareExtension-acknowledgements.markdown"; sourceTree = ""; }; - 0A3BAAEF184ACBE2A82C6E0D92B5C0B5 /* QMChatCacheModel.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = QMChatCacheModel.bundle; path = "QMServicesDevelopment-QMChatCacheModel.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; - 0A3FA50B686F8889267F1503B1BB2AA1 /* QMImageOutgoingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMImageOutgoingCell.m; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.m; sourceTree = ""; }; - 0A69948B9C828AB814621BA408FD5712 /* GTMNSDictionary+URLArguments.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GTMNSDictionary+URLArguments.m"; path = "Foundation/GTMNSDictionary+URLArguments.m"; sourceTree = ""; }; - 0A84B30D64B5821356787503B90B625B /* FBSDKColor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKColor.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.h; sourceTree = ""; }; - 0AB953659B5C6D57BA912EBAFD9A16D7 /* QMChatIncomingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatIncomingCell.xib; path = QMChatViewController/Views/Cells/QMChatIncomingCell/QMChatIncomingCell.xib; sourceTree = ""; }; - 0ADB7D74A29F61961C071B362FB63601 /* FLAnimatedImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FLAnimatedImage.xcconfig; sourceTree = ""; }; - 0AFE3229DC0A66C3AABBC7D0816C8897 /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = ""; }; - 0B538BFDD228E858FDB6E9B9165BF754 /* UIView+QM.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+QM.m"; path = "QMChatViewController/Categories/UIView+QM.m"; sourceTree = ""; }; - 0B684B94FC1D586B4D4515CF97459F6A /* QMChatLocationIncomingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatLocationIncomingCell.m; path = QMChatViewController/Views/Cells/QMChatLocationIncomingCell/QMChatLocationIncomingCell.m; sourceTree = ""; }; - 0B96197BB36E4BB710D2D51CFF280E4E /* Answers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Answers.h; path = iOS/Crashlytics.framework/Headers/Answers.h; sourceTree = ""; }; - 0BB44EF4CF585C9E7976DA68DE0246E0 /* pb_encode.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_encode.c; sourceTree = ""; }; - 0BF70F698A2E22E7E7DAF52C44FA3B50 /* FBSDKShareMessengerOpenGraphMusicTemplateContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareMessengerOpenGraphMusicTemplateContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.h; sourceTree = ""; }; - 0C15CBE1387D86E5CA16C549F572D1ED /* QMOpenGraphItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMOpenGraphItem.h; path = QMOpenGraphService/QMOpenGraphService/QMOpenGraphItem.h; sourceTree = ""; }; - 0C29A87E1F2D73A377A35017269D6F53 /* ic_visibility_off@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_visibility_off@3x.png"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off@3x.png"; sourceTree = ""; }; - 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = QMServicesDevelopment.xcconfig; sourceTree = ""; }; - 0CD4FC52BCC1814174299975233CF7E6 /* FBSDKTypeUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKTypeUtility.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.m; sourceTree = ""; }; - 0CED475A16F4DE439ACF794B37041710 /* FBSDKVideoUploader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKVideoUploader.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKVideoUploader.h; sourceTree = ""; }; - 0D5D5D44D9B7C9B28997C3E6B5B14431 /* GTMSessionFetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionFetcher.m; path = Source/GTMSessionFetcher.m; sourceTree = ""; }; - 0D7D617AC3C3FE71A4D38168CD48ED22 /* Pods-Q-municate-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Q-municate-frameworks.sh"; sourceTree = ""; }; - 0DB39183C72FAEB199933C4E624E1596 /* sk.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sk.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sk.lproj; sourceTree = ""; }; - 0DECE7A79E4C866BF281BE75C1FB87A9 /* GTMSessionFetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcher.h; path = Source/GTMSessionFetcher.h; sourceTree = ""; }; - 0DF3E89D435B36615F086EF1E5051458 /* FUIPasswordVerificationViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIPasswordVerificationViewController.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordVerificationViewController.nib; sourceTree = ""; }; - 0E329F55E5CA7A4EC055263A8D1DC45C /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; - 0E70284C36635B95BF9BF6FD47815B2F /* libQMCVDevelopment.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libQMCVDevelopment.a; path = libQMCVDevelopment.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 0EB0754EA1F52A0C50467DA1ED9E7E19 /* NYTPhotoCaptionViewLayoutWidthHinting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoCaptionViewLayoutWidthHinting.h; path = NYTPhotoViewer/Protocols/NYTPhotoCaptionViewLayoutWidthHinting.h; sourceTree = ""; }; - 0EB5BC030C32489EF7488B6B73815315 /* QMToolbarContentView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMToolbarContentView.m; path = QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContentView.m; sourceTree = ""; }; - 0ED81B1FCD4C06041AC65587F5295749 /* FBSDKCloseIcon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKCloseIcon.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.m; sourceTree = ""; }; - 0F5426E0596D31EF4A4CD72FA6408EFB /* UIColor+iOS7.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+iOS7.h"; path = "FFCircularProgressView/FFCircularProgressView/UIColor+iOS7.h"; sourceTree = ""; }; - 0FA5EF20A12DA5DFC66B0FF0995D4827 /* Pods-QMSiriExtension-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-QMSiriExtension-acknowledgements.plist"; sourceTree = ""; }; - 0FB7DB789FDC47139D521427450AAEFB /* QMModel6.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = QMModel6.xcdatamodel; sourceTree = ""; }; - 0FB9DC0FAC4C0873A404469890BDC533 /* NYTPhotoViewerCloseButtonX.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = NYTPhotoViewerCloseButtonX.png; path = NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX.png; sourceTree = ""; }; - 103C74AC4458EAA9B27B324424385A13 /* ic_email.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ic_email.png; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email.png; sourceTree = ""; }; - 1089BA1FF6078008C86B24202F3548ED /* FBSDKLikeObjectType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeObjectType.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.m; sourceTree = ""; }; - 112434F352261EC65974D4BFDB00B9A4 /* es-PR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-PR.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PR.lproj"; sourceTree = ""; }; - 112BC18BC10E6D3CB254C1A156DBBC8B /* BFAppLinkTarget.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFAppLinkTarget.m; path = Bolts/iOS/BFAppLinkTarget.m; sourceTree = ""; }; - 1156FA220D18F49B41DE4BF56D1682C3 /* FBSDKAppEventsStateManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppEventsStateManager.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsStateManager.h; sourceTree = ""; }; - 116B379949D169F327835606D8F8AC61 /* zh.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = zh.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh.lproj; sourceTree = ""; }; - 11785C80BBB15A24FC6F6FEF006677D3 /* FBSDKLikeBoxView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeBoxView.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.m; sourceTree = ""; }; - 1212A4F9E53171A83DD426A604D1EA74 /* es-SV.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-SV.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-SV.lproj"; sourceTree = ""; }; - 12132BB3A3553DD7A1AE419AD5471D35 /* FBSDKPaymentObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKPaymentObserver.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.m; sourceTree = ""; }; - 12A2C51300046BAF7F8E9C9DD82A78C7 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; - 12CDF285B0FE8E89D54AD2CE58FFCBD9 /* zh-Hant.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "zh-Hant.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hant.lproj"; sourceTree = ""; }; - 136F8B0D611414D2A36711B420E90B9C /* NYTScalingImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NYTScalingImageView.m; path = NYTPhotoViewer/NYTScalingImageView.m; sourceTree = ""; }; - 138BAFFAE3BF192059CD6AEBF90185F6 /* FBSDKURLOpening.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKURLOpening.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKURLOpening.h; sourceTree = ""; }; - 138F5A3F8406034FA35D8FAD6344E6F3 /* ta.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ta.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ta.lproj; sourceTree = ""; }; - 13A2344DF9FC94D550CBE5026CBF389D /* _CDUser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _CDUser.h; path = QMUsersCache/QMUsersCache/CoreData/EntriesMachine/_CDUser.h; sourceTree = ""; }; - 13EB4DBD5DA1EA9A95F9DD93D1DDFC10 /* NYTPhotoViewerArrayDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NYTPhotoViewerArrayDataSource.m; path = NYTPhotoViewer/NYTPhotoViewerArrayDataSource.m; sourceTree = ""; }; - 1401CC3365CC77C23A9189C456CC75DE /* BFURL_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFURL_Internal.h; path = Bolts/iOS/Internal/BFURL_Internal.h; sourceTree = ""; }; - 149BAAE68F455D019A5DE566F60D60F8 /* NSManagedObjectContext+QMCDSaves.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObjectContext+QMCDSaves.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDSaves.m"; sourceTree = ""; }; - 1502EF10D25F5B353178F18E52F1D64E /* sr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sr.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sr.lproj; sourceTree = ""; }; - 155F1E92FD7733BDA0831F156C78B123 /* FBSDKLoginManagerLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLoginManagerLogger.m; path = FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLogger.m; sourceTree = ""; }; - 15894AF01E40604475003E1AD4A8A741 /* FFCircularProgressView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FFCircularProgressView.xcconfig; sourceTree = ""; }; - 161651A46E8AC09992F6465908DAF43C /* QMBaseMediaCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMBaseMediaCell.m; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMBaseChatMediaAttachmentCell/QMBaseMediaCell.m; sourceTree = ""; }; - 16245B908265A1CAA5F8E59D203810AE /* QMDBStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMDBStorage.m; path = QMDBStorage/QMDBStorage/QMDBStorage.m; sourceTree = ""; }; - 165782D1A69F0C15E98C100A317C07EB /* QMChatViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatViewController.h; path = QMChatViewController/QMChatViewController.h; sourceTree = ""; }; - 1660325F17F1639349A4459A7CCA7BE5 /* FBSDKProfilePictureView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKProfilePictureView.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.h; sourceTree = ""; }; - 16A207E314BEA46784A2B78DC689CB14 /* Flurry-iOS-SDK-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Flurry-iOS-SDK-dummy.m"; sourceTree = ""; }; - 1709AA1693D52413CFB0F473AFE91E07 /* da.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = da.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/da.lproj; sourceTree = ""; }; - 1720A2FD7BFD50B5BCD2043986CCCC13 /* QMImageIncomingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMImageIncomingCell.xib; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.xib; sourceTree = ""; }; - 17D912AC7B6466290F0D6374BB13373E /* FBSDKSharePhotoContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKSharePhotoContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.m; sourceTree = ""; }; - 180733DF9E16018CF8BB7572F224B87C /* NYTPhotoViewerCloseButtonX@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "NYTPhotoViewerCloseButtonX@3x.png"; path = "NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX@3x.png"; sourceTree = ""; }; - 1876384A946CB6B0E0EB8729A71B8E2B /* cancel_icon.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = cancel_icon.png; path = QMChatViewController/Icons/cancel_icon.png; sourceTree = ""; }; - 18A0871F4897345FFDCDC49145BC4135 /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ru.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ru.lproj; sourceTree = ""; }; - 18A781478CCFADE8CCAE30503C1764EA /* FBSDKLikeBoxBorderView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeBoxBorderView.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.m; sourceTree = ""; }; - 18B40B0A9549C87CF162A1873D85CE90 /* FBSDKDeviceRequestsHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKDeviceRequestsHelper.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDeviceRequestsHelper.m; sourceTree = ""; }; - 18F58F777A474BB227B55A448B074D94 /* BFTaskCompletionSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFTaskCompletionSource.h; path = Bolts/Common/BFTaskCompletionSource.h; sourceTree = ""; }; - 18FE119817F8DB209E84B934A8097C3B /* FBSDKSendButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKSendButton.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.m; sourceTree = ""; }; - 19743F9556614C8C51A077A94AED75FA /* FBSDKBoltsMeasurementEventListener.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBoltsMeasurementEventListener.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.h; sourceTree = ""; }; - 19BA3BBBC9475A29ED258B79AD1A1B01 /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = ""; }; - 19CA64CFFB1373DB2F36C75F44779B87 /* gu.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = gu.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/gu.lproj; sourceTree = ""; }; - 1A33EC680A2D1B15175B7387844ED892 /* FBSDKGraphRequestMetadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequestMetadata.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.h; sourceTree = ""; }; - 1A7105280B17D416DB95565FD313B201 /* BFMeasurementEvent_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFMeasurementEvent_Internal.h; path = Bolts/iOS/Internal/BFMeasurementEvent_Internal.h; sourceTree = ""; }; - 1A7341DE3D7FAA6D2747EBEED5EC6845 /* libNYTPhotoViewer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libNYTPhotoViewer.a; path = libNYTPhotoViewer.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 1A8922B942F48C7FD27D242DCE20FEF9 /* NSManagedObjectContext+QMCDRecord.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObjectContext+QMCDRecord.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDRecord.m"; sourceTree = ""; }; - 1A934B762B72F16F3172CF6D4B72D602 /* ro.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ro.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ro.lproj; sourceTree = ""; }; - 1AA3D9CF7D6F9085942DDAEC5D237353 /* FBSDKDeviceRequestsHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKDeviceRequestsHelper.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDeviceRequestsHelper.h; sourceTree = ""; }; - 1AE3120E26D9E7C9966D99F76FE7093C /* FBSDKGameRequestContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGameRequestContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.m; sourceTree = ""; }; - 1AEB403D711889326E9D406BD6A2D4CB /* BFAppLinkNavigation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkNavigation.h; path = Bolts/iOS/BFAppLinkNavigation.h; sourceTree = ""; }; - 1B52C500E1218B55E62EF3F3B7D6C880 /* FBSDKErrorRecoveryAttempter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKErrorRecoveryAttempter.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.m; sourceTree = ""; }; - 1B7D78051EED427038591D82ED57EA9B /* QMCDMigrationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMCDMigrationManager.h; path = QMDBStorage/QMDBStorage/QMCDRecord/QMCDMigrationManager.h; sourceTree = ""; }; - 1CAF10C49DAA3E8BC09B92D62F7338AC /* QMChatViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatViewController.xib; path = en.lproj/QMChatViewController.xib; sourceTree = ""; }; - 1D5E33B2967AE3629B0155B2CC237DBC /* FBSDKGameRequestDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGameRequestDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.h; sourceTree = ""; }; - 1D68398100340AFAB42AE7B0EEBC8DA0 /* QMOpenGraphMemoryStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMOpenGraphMemoryStorage.h; path = QMOpenGraphService/QMOpenGraphService/QMOpenGraphMemoryStorage.h; sourceTree = ""; }; - 1DAD4F9CF7717798BD3915B71932EF1B /* libUIDevice-Hardware.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libUIDevice-Hardware.a"; path = "libUIDevice-Hardware.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 1EACD8EC24C72480207A5C3C774DB41C /* QMSLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMSLog.h; path = QMServices/QMSLog.h; sourceTree = ""; }; - 1EFCCFEDC2F490AB08CA3D3DFC657056 /* Media.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Media.xcassets; path = QMChatViewController/Icons/Media.xcassets; sourceTree = ""; }; - 1F021049C7CD7194F2AF638DD3D2B634 /* FBSDKProfilePictureView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKProfilePictureView.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKProfilePictureView.m; sourceTree = ""; }; - 1F5B015F91145C2616B08F3661A9C364 /* FBSDKServerConfigurationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKServerConfigurationManager.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.h; sourceTree = ""; }; - 2006F6A514BE0C672C7C641C4D20CBE8 /* QMChatBaseLinkPreviewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatBaseLinkPreviewCell.m; path = QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatBaseLinkPreviewCell.m; sourceTree = ""; }; - 20C86635B92C916B2C7F03A80AD20B7A /* FBSDKShareVideo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareVideo.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.m; sourceTree = ""; }; - 20DD78246E0CFCE5D9AA0F1DEF29A968 /* es-HN.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-HN.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-HN.lproj"; sourceTree = ""; }; - 20FAB20F7BD0FBADD8B3C8D33E9484C9 /* FUIPhoneVerificationViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIPhoneVerificationViewController.nib; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUIPhoneVerificationViewController.nib; sourceTree = ""; }; - 20FC0FFB8D3FB73C790CA45B217BFB9E /* _FBSDKLoginRecoveryAttempter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _FBSDKLoginRecoveryAttempter.h; path = FBSDKLoginKit/FBSDKLoginKit/Internal/_FBSDKLoginRecoveryAttempter.h; sourceTree = ""; }; - 215E6C5268861B122C42AF7CE5CAA431 /* FBSDKLoginError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLoginError.m; path = FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginError.m; sourceTree = ""; }; - 21EDC3688D7A9C8592C96A198C63679D /* FBSDKShareMessengerURLActionButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareMessengerURLActionButton.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.h; sourceTree = ""; }; - 22199C2E0BBA88A70488861396395BF5 /* pb_decode.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_decode.c; sourceTree = ""; }; - 223F74CCD3252F9530E65ACEC3757025 /* FBSDKGraphRequest+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKGraphRequest+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequest+Internal.h"; sourceTree = ""; }; - 224D173691747421A18CE820EAB0E7CD /* FBSDKSettings.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKSettings.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.m; sourceTree = ""; }; - 225841327C5D34C36AFB6C9B13F3FA64 /* SAMKeychain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SAMKeychain.m; path = Sources/SAMKeychain.m; sourceTree = ""; }; - 225B414B92120D2EECFBE71C12E0002D /* FBSDKAccessToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessToken.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.m; sourceTree = ""; }; - 2281FD5AE75987CDFA35A7ED2A9EDF42 /* Bolts.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Bolts.xcconfig; sourceTree = ""; }; - 22A7933F517EDF3500F770E6485D5245 /* bn.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = bn.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/bn.lproj; sourceTree = ""; }; - 230FC3E3206B292AC9BA5A7CE1B0EC7A /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; - 23246FB30379B93B31B241B71A037690 /* ic_email@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_email@3x.png"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email@3x.png"; sourceTree = ""; }; - 233D296DB63CE217070A683070460A5E /* BFAppLinkTarget.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkTarget.h; path = Bolts/iOS/BFAppLinkTarget.h; sourceTree = ""; }; - 235C1AC47AE6A5012AA789E76846B143 /* FBSDKShareUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareUtility.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.h; sourceTree = ""; }; - 2363369A9239016B9C47375D5088A1CE /* QMChatDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatDataSource.m; path = QMChatViewController/QMChatDataSource/QMChatDataSource.m; sourceTree = ""; }; - 236F42CC0F327F45A723EA75F321EC1D /* GTMSessionUploadFetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionUploadFetcher.h; path = Source/GTMSessionUploadFetcher.h; sourceTree = ""; }; - 236F7EE69406E766463A15AE27501D4C /* FBSDKLikeButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeButton.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.h; sourceTree = ""; }; - 2379C8883B195F4E03743473D6FBC12E /* en-IN.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-IN.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-IN.lproj"; sourceTree = ""; }; - 23C5F871F3D3B5EBDF8A0069464984E4 /* libBolts.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libBolts.a; path = libBolts.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 240431A27726D6D30F72213BE3D3901D /* FBSDKWebDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKWebDialog.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.h; sourceTree = ""; }; - 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 24D71417F6A0929EBA47DE84803474EA /* FBSDKLoginError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLoginError.h; path = FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginError.h; sourceTree = ""; }; - 24DC05249088DBE6D4265D04365EA6CB /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ru.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ru.lproj; sourceTree = ""; }; - 2514FDAA46839E2FC6DDA5826FA1FC9E /* libextobjc-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "libextobjc-prefix.pch"; sourceTree = ""; }; - 253368EAC67E1C4CF625B0C4F8B9ED23 /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = ""; }; - 25454ED04A6FAA7646044C6AA6E9F295 /* FUIStaticContentTableViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIStaticContentTableViewController.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIStaticContentTableViewController.nib; sourceTree = ""; }; - 25640E034BB739D6AB4FD6CD7AB678A0 /* GTMNSString+URLArguments.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GTMNSString+URLArguments.m"; path = "Foundation/GTMNSString+URLArguments.m"; sourceTree = ""; }; - 25B7E37B807C5A9FCA506974B19FF7A6 /* QMModel2.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = QMModel2.xcdatamodel; sourceTree = ""; }; - 25C8961FDA126C1338204200D54CFEBB /* FBSDKBridgeAPIProtocolWebV2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIProtocolWebV2.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.h; sourceTree = ""; }; - 25CB0B9950F05337E357A2FFCF0C57E5 /* _FBSDKTemporaryErrorRecoveryAttempter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _FBSDKTemporaryErrorRecoveryAttempter.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.h; sourceTree = ""; }; - 25FABDD39C75A1E87B260F99A2F6AC11 /* FFCircularProgressView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FFCircularProgressView-prefix.pch"; sourceTree = ""; }; - 2619E4B5D0103DDD987223387BDB9C8A /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ja.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ja.lproj; sourceTree = ""; }; - 263F7EB1436D02E172B5ACA4EBFB1413 /* FBSDKShareDialogMode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareDialogMode.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.h; sourceTree = ""; }; - 265A7C018D79CF16A5689490133E139E /* FBSDKAppEventsState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppEventsState.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.h; sourceTree = ""; }; - 26907558620455D06E2BD98BAE45C3D8 /* Firebase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Firebase.h; path = Core/Sources/Firebase.h; sourceTree = ""; }; - 26D86161E3B4CDBBCB3B76B5B67D2392 /* NYTPhotoContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoContainer.h; path = NYTPhotoViewer/Protocols/NYTPhotoContainer.h; sourceTree = ""; }; - 2745382AEAC1F9779BA878A29018A44F /* SDWebImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoder.m; path = SDWebImage/SDWebImageCoder.m; sourceTree = ""; }; - 277DF405E98569E20375EBC7E0CE001D /* pt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pt.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt.lproj; sourceTree = ""; }; - 27E3E0D200A7DCEDF9B0B44B4B722B6E /* FBSDKErrorRecoveryConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKErrorRecoveryConfiguration.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.h; sourceTree = ""; }; - 2809430D1371A3A8BB0C09EA72D28AE4 /* FBSDKShareKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSDKShareKit-dummy.m"; sourceTree = ""; }; - 285E96267C99E0E0D44C15387BAE29B2 /* SAMKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SAMKeychain.h; path = Sources/SAMKeychain.h; sourceTree = ""; }; - 290BBF52497402C1E1F2ECF33A15EB05 /* ca.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ca.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ca.lproj; sourceTree = ""; }; - 2910FE98CE198F860EBA7609B1E87C8A /* QMServicesDevelopment-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "QMServicesDevelopment-prefix.pch"; sourceTree = ""; }; - 299E08F144050D85C1998FD721F4F27B /* FBSDKLoginUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLoginUtility.h; path = FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginUtility.h; sourceTree = ""; }; - 29BAE8239E5C8D944E74307AB3280252 /* el.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = el.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/el.lproj; sourceTree = ""; }; - 29DB827CCBDA8EF05B017A23DC0AD3ED /* Bolts.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = Bolts.m; path = Bolts/Common/Bolts.m; sourceTree = ""; }; - 29E39FE721A809173BCC632EAB433590 /* _CDOpenGraphModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _CDOpenGraphModel.m; path = QMOpenGraphCache/QMOpenGraphCache/CoreData/EntriesMachine/_CDOpenGraphModel.m; sourceTree = ""; }; - 29EE3959C96FAA7036DF10FCCA7585EE /* video-thumbnail.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "video-thumbnail.png"; path = "QMChatViewController/Icons/video-thumbnail.png"; sourceTree = ""; }; - 2A66BD5CF7266B610CDBE8441B35F2B6 /* FBSDKLoginConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLoginConstants.h; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginConstants.h; sourceTree = ""; }; - 2AA1E853F7496685C2CB018EA8621EB7 /* QMVideoIncomingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMVideoIncomingCell.xib; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoIncomingCell/QMVideoIncomingCell.xib; sourceTree = ""; }; - 2AFF89719764120E460C2E2C2E460C1B /* BFAppLinkReturnToRefererController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkReturnToRefererController.h; path = Bolts/iOS/BFAppLinkReturnToRefererController.h; sourceTree = ""; }; - 2B28568E19F3BFADD8ABA9EC38F62875 /* FBSDKUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKUtility.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.m; sourceTree = ""; }; - 2B41D7C8CAAD7307D1D45EAE31BC808C /* FirebaseCoreDiagnostics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseCoreDiagnostics.framework; path = Frameworks/FirebaseCoreDiagnostics.framework; sourceTree = ""; }; - 2B5E20CA76356FE57EDE8348CE3BACA4 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/UIImage+ForceDecode.h"; sourceTree = ""; }; - 2B6053755C3BA275926465C3CFA90711 /* QMChatNotificationCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatNotificationCell.xib; path = QMChatViewController/Views/Cells/QMChatNotificationCell/QMChatNotificationCell.xib; sourceTree = ""; }; - 2B60CBFECEC9320662C2315BEC2E4C6F /* es-CR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-CR.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CR.lproj"; sourceTree = ""; }; - 2BE4F51B8CF03709B6F99E35A7849E56 /* FBSDKLoginTooltipView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLoginTooltipView.m; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginTooltipView.m; sourceTree = ""; }; - 2C189AC392E278C3D9C3916A88FF5F6D /* UIImage+QM.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+QM.h"; path = "QMChatViewController/Categories/UIImage+QM.h"; sourceTree = ""; }; - 2C62470A432A475DC8091742D082B3F9 /* Pods-QMShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-QMShareExtension.debug.xcconfig"; sourceTree = ""; }; - 2C6877E7ED66484A34358D2C66511A79 /* es-AR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-AR.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-AR.lproj"; sourceTree = ""; }; - 2CBF688CEC2CBF1FF7C9126833B0F107 /* NSManagedObjectModel+QMCDRecord.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObjectModel+QMCDRecord.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectModel+QMCDRecord.m"; sourceTree = ""; }; - 2CD5FC8078E1482E38C071494027C20C /* FBSDKShareDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.h; sourceTree = ""; }; - 2D211ED0D38163DFCE49900040CC1EA2 /* NYTScalingImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTScalingImageView.h; path = NYTPhotoViewer/NYTScalingImageView.h; sourceTree = ""; }; - 2D26F711F68FA5A63F2CD865642AE67D /* QMMediaDownloadService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMMediaDownloadService.m; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadService.m; sourceTree = ""; }; - 2D99EEA366BCA69F025A4DD7D93DFF75 /* QBChatAttachment+QMCustomParameters.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "QBChatAttachment+QMCustomParameters.h"; path = "QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomParameters.h"; sourceTree = ""; }; - 2DEBCD546E253E608A242FAFF96EED65 /* FBSDKWebDialogView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKWebDialogView.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.m; sourceTree = ""; }; - 2E08DDAE806BB08CF3084D5B480481EE /* NSManagedObject+QMCDAggregation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObject+QMCDAggregation.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDAggregation.m"; sourceTree = ""; }; - 2E32041EC4251D18EB6D8FB2DB4E3991 /* libFBSDKCoreKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libFBSDKCoreKit.a; path = libFBSDKCoreKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 2E3E8B53125AFB9B6B7FD4659BFD1569 /* es-419.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-419.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-419.lproj"; sourceTree = ""; }; - 2E5E419F3DA5C09513D2C39735D54D31 /* FBSDKImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKImageDownloader.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKImageDownloader.h; sourceTree = ""; }; - 2EAB930F0A5A304D5C04FA3A623A55D1 /* en-IN.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-IN.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-IN.lproj"; sourceTree = ""; }; - 2ED8983BEC599B272948296CF3F09871 /* QMMediaDownloadServiceDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMMediaDownloadServiceDelegate.h; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadServiceDelegates/QMMediaDownloadServiceDelegate.h; sourceTree = ""; }; - 2EDA899DC97EFD23CDF25D0CFC25100A /* FBSDKWebDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKWebDialog.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialog.m; sourceTree = ""; }; - 2EE4C18E6BD9975A20DE23FB5BBC0A8B /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; - 2F0DE4B68A4D9FB54004782A3F30E3E5 /* NSManagedObject+QMCDFinders.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSManagedObject+QMCDFinders.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDFinders.h"; sourceTree = ""; }; - 2F23B83E27D0243D8A548F2BE5722CFB /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = es.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es.lproj; sourceTree = ""; }; - 2F8FD790FFB37E5799BCFEC2C0857AC3 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = ""; }; - 2FCF7E22B79515D693B4E70526A080B5 /* GTMNSString+URLArguments.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GTMNSString+URLArguments.h"; path = "Foundation/GTMNSString+URLArguments.h"; sourceTree = ""; }; - 302CBE6D07342C57220E6EB9A0E38697 /* FBSDKTriStateBOOL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKTriStateBOOL.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.m; sourceTree = ""; }; - 3038EFEFFBDC6E8E2BD879A1B50C4DC5 /* GTMSessionUploadFetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionUploadFetcher.m; path = Source/GTMSessionUploadFetcher.m; sourceTree = ""; }; - 304E11684E388892253BE43A1FE88762 /* FBSDKContainerViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKContainerViewController.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.m; sourceTree = ""; }; - 30516D2C978BA5F677BB3396A959D868 /* de-AT.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "de-AT.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de-AT.lproj"; sourceTree = ""; }; - 30722CDBA4D0A56C8E0C4A8AEB0F7DD6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - 308E46C1BD1008C4A336E1610B43438A /* _CDAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _CDAttachment.m; path = QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDAttachment.m; sourceTree = ""; }; - 30A63DC3B6B1513D0B832062AC69F899 /* FBSDKLoginManagerLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLoginManagerLogger.h; path = FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLogger.h; sourceTree = ""; }; - 310FAA9488055C21F5156FFFB1177ECC /* QMDeferredQueueManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMDeferredQueueManager.m; path = QMManagers/QMDeferredQueueManager.m; sourceTree = ""; }; - 316215B7013BE1DFFA26A3D91BE648D1 /* QMOpenGraphCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMOpenGraphCache.m; path = QMOpenGraphCache/QMOpenGraphCache/QMOpenGraphCache.m; sourceTree = ""; }; - 316AAF13E4F599B97D43FE21D25C6992 /* id.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = id.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/id.lproj; sourceTree = ""; }; - 3232649E9044548C5C6E39B1389A9D8B /* FBSDKAccessTokenCacheV4.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessTokenCacheV4.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.m; sourceTree = ""; }; - 329EEEF11D1A40B86ECEB344711A8A06 /* QMMediaBlocks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMMediaBlocks.h; path = QMChatService/QMChatService/QMMediaBlocks.h; sourceTree = ""; }; - 32A3E87042FCD1EE728C14EA128C6F76 /* BFTaskCompletionSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFTaskCompletionSource.m; path = Bolts/Common/BFTaskCompletionSource.m; sourceTree = ""; }; - 330AE8E741FE53EB40210B12CAF437F8 /* FBSDKMessengerIcon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKMessengerIcon.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.m; sourceTree = ""; }; - 331A73EBC1391A735CC7E3943275BEA0 /* FBSDKProfile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKProfile.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.m; sourceTree = ""; }; - 3398544D72AA8140539693E0D80D3084 /* Pods-Q-municate.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Q-municate.release.xcconfig"; sourceTree = ""; }; - 33AE37F4DD3F12176330307D7A624B68 /* QMChatIncomingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatIncomingCell.h; path = QMChatViewController/Views/Cells/QMChatIncomingCell/QMChatIncomingCell.h; sourceTree = ""; }; - 33EB76165CD517E545F6B6CD2CE325DF /* Pods-QMSiriExtension-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-QMSiriExtension-resources.sh"; sourceTree = ""; }; - 34289AA835738E7B826380662CB457E0 /* en-AU.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-AU.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-AU.lproj"; sourceTree = ""; }; - 346662EB2A7A157DBC79D8F534EFE06A /* QMServicesDevelopment-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "QMServicesDevelopment-dummy.m"; sourceTree = ""; }; - 356018E0608D3653E1DCDC00588F41CE /* FirebaseInstanceID.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseInstanceID.framework; path = Frameworks/FirebaseInstanceID.framework; sourceTree = ""; }; - 3573DCA69E1B8D952FE70D21F3CCD4C7 /* FBSDKTypeUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKTypeUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTypeUtility.h; sourceTree = ""; }; - 3609642BB02D23DF636641B152BBDD77 /* SDWebImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageFrame.h; path = SDWebImage/SDWebImageFrame.h; sourceTree = ""; }; - 3634AA846B694FDCB247930C6F1E00DC /* libFlurry-iOS-SDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libFlurry-iOS-SDK.a"; path = "libFlurry-iOS-SDK.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 36574504869F6D25D05FF27C8B9AAF96 /* GoogleToolboxForMac-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GoogleToolboxForMac-prefix.pch"; sourceTree = ""; }; - 36BCDF4E9DA8B7727F9924F3BD1D01F8 /* QMUsersMemoryStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMUsersMemoryStorage.h; path = QMUsersService/QMUsersService/QMUsersMemoryStorage/QMUsersMemoryStorage.h; sourceTree = ""; }; - 370AC8E5B0DDA438E65F35D1FD7C8453 /* GTMSessionFetcherService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcherService.h; path = Source/GTMSessionFetcherService.h; sourceTree = ""; }; - 373EF4164EFDC76E0B31A3FB98B78B71 /* cs.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = cs.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/cs.lproj; sourceTree = ""; }; - 377475C994438724A03F01B8F5C4D64C /* FBSDKCameraEffectTextures+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKCameraEffectTextures+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCameraEffectTextures+Internal.h"; sourceTree = ""; }; - 37D419D18F4D5C2F5ED1669AB95C24B6 /* nb.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nb.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/nb.lproj; sourceTree = ""; }; - 37E50D67E198C2551C3D9C764E6C22C3 /* NSString+QM.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+QM.h"; path = "QMChatViewController/Categories/NSString+QM.h"; sourceTree = ""; }; - 381979B9A086FF8DEF1F367F32120DF7 /* FirebaseCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseCore.framework; path = Frameworks/FirebaseCore.framework; sourceTree = ""; }; - 381E3A721061A79A1F41962F89FE5498 /* CDUser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CDUser.m; path = QMUsersCache/QMUsersCache/CoreData/Entries/CDUser.m; sourceTree = ""; }; - 3852762B3DD542AC58F5695BA2916363 /* QMContactListCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMContactListCache.m; path = QMContactListCache/QMContactListCache/QMContactListCache.m; sourceTree = ""; }; - 391BF86B41DDD8AAD69BCB51AED73DD0 /* FBSDKGameRequestFrictionlessRecipientCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGameRequestFrictionlessRecipientCache.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.m; sourceTree = ""; }; - 392E162EB13ED06DFFC2CE09453A94FC /* FBSDKGraphRequestConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequestConnection.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.m; sourceTree = ""; }; - 395C05110DAA0DDF5EF8485AF515D418 /* MicButton.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = MicButton.png; path = QMChatViewController/Icons/MicButton.png; sourceTree = ""; }; - 39939F54BB0434A8DFD3CF9BB9C1ABCD /* SDWebImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageGIFCoder.h; path = SDWebImage/SDWebImageGIFCoder.h; sourceTree = ""; }; - 39B3631DF36D9826A8FED568C5FFDFC4 /* FBSDKCrypto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCrypto.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.h; sourceTree = ""; }; - 39F55BA8BF69E1292FA41F0A52720C9E /* QMContactListMemoryStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMContactListMemoryStorage.h; path = QMContactListService/QMContactListService/QMContactListMemoryStorage/QMContactListMemoryStorage.h; sourceTree = ""; }; - 3A2D2CAF8C2E67F7646BF9A4C372C46B /* CDOpenGraphModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CDOpenGraphModel.m; path = QMOpenGraphCache/QMOpenGraphCache/CoreData/Entries/CDOpenGraphModel.m; sourceTree = ""; }; - 3A595E2095D2502A17114536F18577C5 /* FBSDKBoltsMeasurementEventListener.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBoltsMeasurementEventListener.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppLink/FBSDKBoltsMeasurementEventListener.m; sourceTree = ""; }; - 3AF12F6DEC81C612880F465829219E17 /* libSVProgressHUD.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSVProgressHUD.a; path = libSVProgressHUD.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B52FA13590512AC7706E8ECC90928E1 /* FBSDKWebDialogView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKWebDialogView.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/WebDialog/FBSDKWebDialogView.h; sourceTree = ""; }; - 3B6D7E678F9570AA814298F9A28F2E55 /* QMChatContactRequestCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatContactRequestCell.m; path = QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.m; sourceTree = ""; }; - 3B7D2703DD4CD24EC5B041954E8FFCF3 /* FirebaseNanoPB.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseNanoPB.framework; path = Frameworks/FirebaseNanoPB.framework; sourceTree = ""; }; - 3B9CA800C5C3E5171E4727E3B824C784 /* nanopb.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = nanopb.xcconfig; sourceTree = ""; }; - 3B9F19DF82BA4D976EC7921538044BFB /* QMChatResources.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatResources.h; path = QMChatViewController/Utils/QMChatResources/QMChatResources.h; sourceTree = ""; }; - 3BFA23B1D5513E07BE82C4B71B7AF973 /* GTMSessionFetcherService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionFetcherService.m; path = Source/GTMSessionFetcherService.m; sourceTree = ""; }; - 3C04F21651292269975A9AD4894121B9 /* FFCircularProgressView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FFCircularProgressView.h; path = FFCircularProgressView/FFCircularProgressView/FFCircularProgressView.h; sourceTree = ""; }; - 3C7E71FEFAC60FAAB128CA9ED2C6073D /* libFBSDKShareKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libFBSDKShareKit.a; path = libFBSDKShareKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 3C932EADC9EAA3FFBB6463A1D690FD54 /* libGTMSessionFetcher.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libGTMSessionFetcher.a; path = libGTMSessionFetcher.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 3CCFFC2DF52A5A241B218E24A722BF72 /* QMChatIncomingLinkPreviewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatIncomingLinkPreviewCell.xib; path = QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatIncomingLinkPreviewCell/QMChatIncomingLinkPreviewCell.xib; sourceTree = ""; }; - 3CDDA48D5E51C7DE282D5E23B80587F5 /* FBSDKLoginConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLoginConstants.m; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginConstants.m; sourceTree = ""; }; - 3CE7568C3CA32393DB5DF13B6B047842 /* QMUsersCacheModel.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = QMUsersCacheModel.bundle; path = "QMServicesDevelopment-QMUsersCacheModel.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3CEE30EB9713F3BD8EE32897B4687C3F /* FBSDKKeychainStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKKeychainStore.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.m; sourceTree = ""; }; - 3D0A99BC54878E91083A53C42B9B56CF /* libextobjc-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "libextobjc-dummy.m"; sourceTree = ""; }; - 3D3E67792CFD928032A2EB83FC342B91 /* FBSDKMutableCopying.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMutableCopying.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKMutableCopying.h; sourceTree = ""; }; - 3D660EFF78CD8002D8D864C4CA1566CF /* FBSDKSharingButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSharingButton.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharingButton.h; sourceTree = ""; }; - 3D793B6DE58E7C33B1EB8EC02EB96A09 /* UIImage+Cropper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Cropper.m"; path = "QMChatViewController/Categories/UIImage+Cropper.m"; sourceTree = ""; }; - 3D8AF6BAB43FE87605724FD13C24B926 /* kn.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = kn.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/kn.lproj; sourceTree = ""; }; - 3DC21BB63CE6C9D7B9CFEBFFB0A4B126 /* FBSDKSharePhotoContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSharePhotoContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharePhotoContent.h; sourceTree = ""; }; - 3DC24D183EDFC1A12AA3C39BF0F1680C /* FBSDKGraphErrorRecoveryProcessor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphErrorRecoveryProcessor.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphErrorRecoveryProcessor.m; sourceTree = ""; }; - 3DEE0A1098AE88EC9F19D6AEAA0E41EF /* es-GT.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-GT.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-GT.lproj"; sourceTree = ""; }; - 3E55A205443FE63AFCACDFD1BFB015CA /* FBSDKAppGroupJoinDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppGroupJoinDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.h; sourceTree = ""; }; - 3E59D4C1647EE977F82BDCAF38773B63 /* zh-Hant-TW.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "zh-Hant-TW.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hant-TW.lproj"; sourceTree = ""; }; - 3E5BF8E765C8E25721994C3B74BB0345 /* CDOpenGraphModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CDOpenGraphModel.h; path = QMOpenGraphCache/QMOpenGraphCache/CoreData/Entries/CDOpenGraphModel.h; sourceTree = ""; }; - 3E95A348AE6C9FE58C521DC686557EBA /* FBSDKShareConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareConstants.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.m; sourceTree = ""; }; - 3E9CACB99A50BE84D5646879AD16B90C /* NYTPhotoViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoViewController.h; path = NYTPhotoViewer/NYTPhotoViewController.h; sourceTree = ""; }; - 3EC5D6644213F16A5BD5EEE5B68685D6 /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = it.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/it.lproj; sourceTree = ""; }; - 3F326C96C32EA81CD39BB507BF6F0957 /* ar.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ar.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ar.lproj; sourceTree = ""; }; - 3FA52E1D03B632C35E48776DCDB24032 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; - 4017B8003DD493405C9F1E934B7CEBAB /* BFAppLinkResolving.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkResolving.h; path = Bolts/iOS/BFAppLinkResolving.h; sourceTree = ""; }; - 4096706BE8413AC67CCC9AFD720AB964 /* gsw.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = gsw.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/gsw.lproj; sourceTree = ""; }; - 40BD5DE2ADC9681A4E430030D61FCF0B /* QMChatNotificationCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatNotificationCell.m; path = QMChatViewController/Views/Cells/QMChatNotificationCell/QMChatNotificationCell.m; sourceTree = ""; }; - 418F3BD9101328EABAF10C115779876C /* QMChatIncomingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatIncomingCell.m; path = QMChatViewController/Views/Cells/QMChatIncomingCell/QMChatIncomingCell.m; sourceTree = ""; }; - 41A3FAA68CCBF4BD8C1882E9F34DD3CA /* FBSDKLoginKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLoginKit.h; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginKit.h; sourceTree = ""; }; - 421603975CFE9613D73C5E6577237800 /* FBSDKShareOpenGraphAction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareOpenGraphAction.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.h; sourceTree = ""; }; - 4244309CD584B0A5B1CA4E650C4DFAD3 /* QMBaseService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMBaseService.h; path = QMBaseService/QMBaseService/QMBaseService.h; sourceTree = ""; }; - 426F483192C83D8CC3DF95E027314B9B /* QMChatLocationOutgoingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatLocationOutgoingCell.h; path = QMChatViewController/Views/Cells/QMChatLocationOutgoingCell/QMChatLocationOutgoingCell.h; sourceTree = ""; }; - 42D9686C057957B2E8A487CC0BE954D6 /* FBSDKShareVideoContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareVideoContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareVideoContent.m; sourceTree = ""; }; - 42DC3535493533C2C380FE0013668C84 /* Pods-Q-municate-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Q-municate-acknowledgements.plist"; sourceTree = ""; }; - 42E2F6CEE0AD7051F957283D989F48C9 /* FBSDKLikeDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeDialog.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.m; sourceTree = ""; }; - 42FF83673066372C7EEF4020803F4777 /* SDWebImageImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageImageIOCoder.m; path = SDWebImage/SDWebImageImageIOCoder.m; sourceTree = ""; }; - 43595079ED0668E5805F5AAAC34CF27C /* FBSDKLogo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLogo.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKLogo.m; sourceTree = ""; }; - 4360BC0AA750D7B598C1D21B7EB2265F /* FBSDKShareMessengerURLActionButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareMessengerURLActionButton.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerURLActionButton.m; sourceTree = ""; }; - 439D15E6A57AD45C05140DFFB257AF4B /* FFCircularProgressView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FFCircularProgressView-dummy.m"; sourceTree = ""; }; - 447CD65667F0A95BC16ED06CADFF9644 /* QMChatAttachmentService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatAttachmentService.m; path = QMChatService/QMChatService/QMAttachmentService/QMChatAttachmentService.m; sourceTree = ""; }; - 451ED94FC6ED41D4BA412E5D29A28D85 /* FBSDKAppEventsUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppEventsUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.h; sourceTree = ""; }; - 45465AFA11DB1AE2C899280B37028EE0 /* QMChatIncomingLinkPreviewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatIncomingLinkPreviewCell.m; path = QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatIncomingLinkPreviewCell/QMChatIncomingLinkPreviewCell.m; sourceTree = ""; }; - 458DA8C602BC4E7C9F208A2213969CD6 /* FBSDKAppEventsDeviceInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppEventsDeviceInfo.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.h; sourceTree = ""; }; - 45A14E6E271B2A23CFC065BC2B4192E1 /* NYTPhotoCaptionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoCaptionView.h; path = NYTPhotoViewer/NYTPhotoCaptionView.h; sourceTree = ""; }; - 460B86BFD7B4332C9CF3C1EFF9F3967C /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; - 46245878CD9179098B299207B026E05C /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fr.lproj; sourceTree = ""; }; - 465AB90C5EF9D68EECE4B3BD86541317 /* FUIPhoneEntryViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIPhoneEntryViewController.nib; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUIPhoneEntryViewController.nib; sourceTree = ""; }; - 466238F9080675145428EB01CF83865A /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = ""; }; - 468A576FC083F386CA03F0C308F16926 /* FBSDKShareCameraEffectContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareCameraEffectContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.m; sourceTree = ""; }; - 468DA1A0E511A4659BC03C827B2C1CBE /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en.lproj; sourceTree = ""; }; - 4700A53FCF0195D1A40AF92066B87157 /* ic_visibility_off.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ic_visibility_off.png; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off.png; sourceTree = ""; }; - 47081DBCE7B0B7F8F70162BC17979CF9 /* FBSDKLikeActionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeActionController.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.h; sourceTree = ""; }; - 47709B2EFA44202CCA3100EFEBCC284B /* NSManagedObjectContext+QMCDObserving.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSManagedObjectContext+QMCDObserving.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDObserving.h"; sourceTree = ""; }; - 47727F5161C70E2045257796A86386D2 /* UIDevice-Hardware.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIDevice-Hardware.m"; sourceTree = ""; }; - 479294CF21410371DDC4536DE324A865 /* SAMKeychainQuery.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SAMKeychainQuery.h; path = Sources/SAMKeychainQuery.h; sourceTree = ""; }; - 47EE6951F7EDFA4FAF1BB86B1058EBC5 /* TTTAttributedLabel-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TTTAttributedLabel-prefix.pch"; sourceTree = ""; }; - 480DEFEC07FEFB327E654482C758FE26 /* QMChatCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatCache.h; path = QMChatCache/QMChatCache/QMChatCache.h; sourceTree = ""; }; - 48AC1C197F1D0464C2A248B18CDED483 /* CLSStackFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CLSStackFrame.h; path = iOS/Crashlytics.framework/Headers/CLSStackFrame.h; sourceTree = ""; }; - 48BF79C573BE65694F8C9F318960056A /* es-VE.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-VE.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-VE.lproj"; sourceTree = ""; }; - 48E87C3DF7E589889A2DAE28EA910FA3 /* FBSDKAccessTokenCacheV3_21.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessTokenCacheV3_21.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.m; sourceTree = ""; }; - 4900159BDBDAF9D9C71F06922E2A1258 /* UIView+QM.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+QM.h"; path = "QMChatViewController/Categories/UIView+QM.h"; sourceTree = ""; }; - 4941AFA41B29D6FCD1E1738AB5DC8750 /* QMChatCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatCell.m; path = QMChatViewController/Views/Cells/QMChatCell/QMChatCell.m; sourceTree = ""; }; - 49693E6A5E2B0565BE9BB578F1486689 /* FacebookSDKStrings.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; path = FacebookSDKStrings.bundle; sourceTree = ""; }; - 49996D4BBF0258D8903436544DDF6E4F /* FBSDKCoreKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSDKCoreKit-dummy.m"; sourceTree = ""; }; - 49E4B599C45B65DE819071B44FEEBDD7 /* EXTScope.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXTScope.h; path = extobjc/EXTScope.h; sourceTree = ""; }; - 4AF171297875DFFC8CBAABBE2FA1FA7A /* FBSDKShareMessengerActionButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareMessengerActionButton.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerActionButton.h; sourceTree = ""; }; - 4B8444730DD33FA811D4A5FEE560CBF3 /* QMAuthService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAuthService.h; path = QMAuthService/QMAuthService/QMAuthService.h; sourceTree = ""; }; - 4BBD16B6A2FA030672B5EA90C507F94D /* FBSDKMaleSilhouetteIcon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMaleSilhouetteIcon.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.h; sourceTree = ""; }; - 4BEA917C9E06C082F654D936CB176D0C /* metamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = metamacros.h; path = extobjc/metamacros.h; sourceTree = ""; }; - 4C68408B5AC64BA3132545DB93EB4F31 /* FBSDKLoginManager+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKLoginManager+Internal.h"; path = "FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManager+Internal.h"; sourceTree = ""; }; - 4C69368E6DDABBBCE646696B736CFCCC /* QMChatCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatCache.m; path = QMChatCache/QMChatCache/QMChatCache.m; sourceTree = ""; }; - 4C7257E4C29305181DE54BAAB7FE33B7 /* es-VE.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-VE.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-VE.lproj"; sourceTree = ""; }; - 4D1468C9B73C33A190A0B7CAFC3CF469 /* QMProgressView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMProgressView.h; path = QMChatViewController/Views/CustomUI/QMProgressView/QMProgressView.h; sourceTree = ""; }; - 4D23F3A1D13F2F9CB68441255915411B /* ANSCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ANSCompatibility.h; path = iOS/Crashlytics.framework/Headers/ANSCompatibility.h; sourceTree = ""; }; - 4D44313DA082F6A088E8D57A28C7ED79 /* FBSDKAppGroupJoinDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppGroupJoinDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupJoinDialog.m; sourceTree = ""; }; - 4D654CB9257783068FFAE5D0D401538E /* en-AU.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-AU.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-AU.lproj"; sourceTree = ""; }; - 4D88F415F620DD532D545D531B9FA94E /* QMDBStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMDBStorage.h; path = QMDBStorage/QMDBStorage/QMDBStorage.h; sourceTree = ""; }; - 4DBD5EB6C78AA59029695E99C381B64A /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/SDWebImageTransition.m; sourceTree = ""; }; - 4DFEE6A246053295B257A54568E4E5B7 /* NSBundle+NYTPhotoViewer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+NYTPhotoViewer.h"; path = "NYTPhotoViewer/Resource Loading/NSBundle+NYTPhotoViewer.h"; sourceTree = ""; }; - 4E731447D25D669D9C5BEDCE00B22B92 /* attachment_ic@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "attachment_ic@2x.png"; path = "QMChatViewController/Icons/attachment_ic@2x.png"; sourceTree = ""; }; - 4E7D624C138CAFDAE340DF0D4FEC5FA4 /* en-IE.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-IE.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-IE.lproj"; sourceTree = ""; }; - 4EE18934F1DF5E3033F558167EB6DB47 /* FBSDKCameraEffectArguments.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKCameraEffectArguments.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.m; sourceTree = ""; }; - 4EE719DF66153E1A888A029ABDB3C648 /* UIImage+QM.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+QM.m"; path = "QMChatViewController/Categories/UIImage+QM.m"; sourceTree = ""; }; - 4F7164B104C8C9D51BA2BC400F5C7C4F /* FBSDKLoginCompletion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLoginCompletion.h; path = FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion.h; sourceTree = ""; }; - 4FD7ABE30D46AAF51A7975510061E506 /* es-MX.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-MX.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-MX.lproj"; sourceTree = ""; }; - 4FDE18481FC28FC0EA250992439B5635 /* QMUsersModelIncludes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMUsersModelIncludes.h; path = QMUsersCache/QMUsersCache/CoreData/QMUsersModelIncludes.h; sourceTree = ""; }; - 5033590F85F17C9039766ADD204012CB /* FBSDKLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLogger.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.m; sourceTree = ""; }; - 5054C3A56F28980B6B2CF317B7E1D48F /* en-GB.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-GB.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-GB.lproj"; sourceTree = ""; }; - 50A575F21F5DE06A0E52C3AD72812C83 /* zh-Hant-TW.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "zh-Hant-TW.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hant-TW.lproj"; sourceTree = ""; }; - 50ECCB5A7B1F4B42B47C60A608ECE87F /* FBSDKProfile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKProfile.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKProfile.h; sourceTree = ""; }; - 50F123ACCF40C15C1BB65CF5DF2A2F2B /* QMChatContactRequestCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatContactRequestCell.xib; path = QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.xib; sourceTree = ""; }; - 5157D7249AE49BA7365BC44EAE2C366C /* FBSDKBridgeAPIRequest+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKBridgeAPIRequest+Private.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest+Private.h"; sourceTree = ""; }; - 519BE38E9982936C90511C1269EDBD19 /* QMMediaIncomingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMMediaIncomingCell.m; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaIncomingCell/QMMediaIncomingCell.m; sourceTree = ""; }; - 51CEFCC977A37A4282025DA873B94FE8 /* FBSDKLikeBoxBorderView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeBoxBorderView.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxBorderView.h; sourceTree = ""; }; - 51D3EF00B19BE4EF775A4629DE731FC3 /* QBChatMessage+QBDateDivider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "QBChatMessage+QBDateDivider.h"; path = "QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.h"; sourceTree = ""; }; - 51E83AB4AEBF101CC7B71018A64AD427 /* sl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sl.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sl.lproj; sourceTree = ""; }; - 5256F332463B998F064C17F3C2D4AB56 /* FBSDKAppInviteContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppInviteContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.h; sourceTree = ""; }; - 527740274CC6BD2FD49D950BA71702B1 /* FBSDKSystemAccountStoreAdapter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKSystemAccountStoreAdapter.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.m; sourceTree = ""; }; - 530987E9AFF3ECB3018C85C934E5C1FF /* FBSDKBridgeAPIProtocolWebV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIProtocolWebV1.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.h; sourceTree = ""; }; - 53372BB1BBC02D42FB833DF9A49CB4B8 /* FBSDKSharingContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSharingContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharingContent.h; sourceTree = ""; }; - 539DB240B055D3C939E4399D843C2C61 /* ic_retry-grey@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_retry-grey@2x.png"; path = "QMChatViewController/Icons/ic_retry-grey@2x.png"; sourceTree = ""; }; - 54043F3B782D15B04973AB58A4D087B1 /* QMCDRecordLogging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMCDRecordLogging.h; path = QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordLogging.h; sourceTree = ""; }; - 5477BE6F4695F1285770C98168E76CBD /* UIImageView+QMLocationSnapshot.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+QMLocationSnapshot.m"; path = "QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.m"; sourceTree = ""; }; - 549CEFB3FE461C0FC623EDCD566DA183 /* es-HN.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-HN.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-HN.lproj"; sourceTree = ""; }; - 54CF07DD8779CF1813A573B16BD7555E /* QMToolbarContainer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMToolbarContainer.m; path = QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContainer.m; sourceTree = ""; }; - 5521A7D353717A08494139A410C8A3CD /* hi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hi.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hi.lproj; sourceTree = ""; }; - 55D6CC02D39C11984B33FC0A271E4396 /* he.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = he.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/he.lproj; sourceTree = ""; }; - 55F0C079A0FB9471888D47EDACE322CB /* FBSDKShareOpenGraphObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareOpenGraphObject.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.m; sourceTree = ""; }; - 5613DAB5B5491F0AC952BC80F01AAD70 /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = es.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es.lproj; sourceTree = ""; }; - 569C69CCB6B0743EE78FDACCCE0935DD /* Reachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = ""; }; - 56F6B364E01EC92143E38347E24FDF78 /* FBSDKBridgeAPIResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIResponse.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.h; sourceTree = ""; }; - 576C65EDEB58BF1C443B14458B568998 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; - 5779731C87750D108D00BC71EB784963 /* fa.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fa.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fa.lproj; sourceTree = ""; }; - 57A1CC514ACB4A0A4F36B9F7F663DD5B /* BFCancellationTokenRegistration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationTokenRegistration.h; path = Bolts/Common/BFCancellationTokenRegistration.h; sourceTree = ""; }; - 57DF8A2F4AFF8700944BF54747456003 /* SDWebImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoder.h; path = SDWebImage/SDWebImageCoder.h; sourceTree = ""; }; - 57F4D6767FDAB2C32CF53AA8E83D0B38 /* Reachability-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Reachability-prefix.pch"; sourceTree = ""; }; - 586B6D9D6F13B844923BF7E70A52FBC0 /* pb_common.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb_common.h; sourceTree = ""; }; - 58E8FE45602DE9E08A6D7BE8C56DD69D /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; - 593197B56D415C8A2B225D4E7A4C67A5 /* FBSDKCameraEffectArguments.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCameraEffectArguments.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectArguments.h; sourceTree = ""; }; - 595983B5E926BE155674908C70B2E386 /* FBSDKAppLinkResolver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppLinkResolver.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.h; sourceTree = ""; }; - 599B7B1438EF4C287D13D3DFB77ABA1A /* FBSDKAppEventsUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppEventsUtility.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsUtility.m; sourceTree = ""; }; - 59A81D8A9AAA366E951E8266E524242E /* QMVideoOutgoingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMVideoOutgoingCell.xib; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoOutgoingCell/QMVideoOutgoingCell.xib; sourceTree = ""; }; - 59F707A4D45FECD47911F6221209771F /* bg.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = bg.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/bg.lproj; sourceTree = ""; }; - 5A2E221AEC9C73EE67B77C9B046B6F9E /* es-NI.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-NI.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-NI.lproj"; sourceTree = ""; }; - 5A3AA872B91A2CC97401057B53EAC291 /* QMChatLocationSnapshotter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatLocationSnapshotter.m; path = QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.m; sourceTree = ""; }; - 5A48E1F8870FE522B8B03B8D6383BE94 /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = de.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de.lproj; sourceTree = ""; }; - 5A5254A20495C5EBEF32700CFD95EC27 /* FUIEmailEntryViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIEmailEntryViewController.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIEmailEntryViewController.nib; sourceTree = ""; }; - 5AFBE6249A36D904599A4EC90B89BE30 /* FBSDKLoginCompletion.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLoginCompletion.m; path = FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion.m; sourceTree = ""; }; - 5B7E9C635CDC54617BD3E27D80383C1B /* QMUsersCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMUsersCache.m; path = QMUsersCache/QMUsersCache/QMUsersCache.m; sourceTree = ""; }; - 5BB823AC01DD59F67F3C280EF863921D /* FBSDKLoginManagerLoginResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLoginManagerLoginResult.h; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManagerLoginResult.h; sourceTree = ""; }; - 5BC0FD6503BAA29B5B4C41DCABE0B77C /* NSPersistentStore+QMCDRecord.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSPersistentStore+QMCDRecord.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecord.m"; sourceTree = ""; }; - 5C2AF01EDB27F2FA6ADD7426313F25F7 /* FirebaseAuthUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseAuthUI.framework; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework; sourceTree = ""; }; - 5C6ED5A69193FE124F885CEC2BF9AD09 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - 5CEC4854342C3AD8A79A73B36AD81409 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; - 5D29E6523C42866BA4C5B56224175847 /* FBSDKError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKError.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.h; sourceTree = ""; }; - 5D44C002F0DDB17BBE2162A99C63939A /* QMAssetLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAssetLoader.h; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAssetLoader.h; sourceTree = ""; }; - 5D5B5C788B7D0FB14029E5160ABA4D37 /* FBSDKSharePhoto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSharePhoto.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.h; sourceTree = ""; }; - 5D86674267B7B08C583569AF68A69834 /* FBSDKBridgeAPIProtocolWebV1.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPIProtocolWebV1.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV1.m; sourceTree = ""; }; - 5DBFF290B302089F4214D4B875793DB6 /* FBSDKLikeButtonPopWAV.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeButtonPopWAV.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.h; sourceTree = ""; }; - 5DF6C380C24A814CB9480B73D823776D /* es-EC.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-EC.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-EC.lproj"; sourceTree = ""; }; - 5E4160030C35442B19C69FF664B892BD /* FBSDKServerConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKServerConfiguration.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.h; sourceTree = ""; }; - 5E544708C8F232DFFF0E949758760F52 /* NSArray+QMCDRecord.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+QMCDRecord.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSArray+QMCDRecord.h"; sourceTree = ""; }; - 5F0DB2D8545DD175B4E192B9A65C9D09 /* QMVideoIncomingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMVideoIncomingCell.h; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoIncomingCell/QMVideoIncomingCell.h; sourceTree = ""; }; - 5FA4EA378010B9DAE2E14CA69401C11D /* ic_visibility@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_visibility@3x.png"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility@3x.png"; sourceTree = ""; }; - 603B44DED255763C9D848B7D493BD81C /* FBSDKBridgeAPIProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIProtocol.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocol.h; sourceTree = ""; }; - 6041C120FF58F620228433352077B97B /* FBSDKInternalUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKInternalUtility.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.m; sourceTree = ""; }; - 608B627E7BB108D4CAE7DEB08CFE5211 /* FBSDKShareDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareDialog.m; sourceTree = ""; }; - 609C3C3571ED002AE687466CD82DEFDB /* libextobjc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = libextobjc.xcconfig; sourceTree = ""; }; - 612D6CC3C66792A48C0FAC4F1DA87568 /* QMAudioIncomingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAudioIncomingCell.h; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioIncomingCell/QMAudioIncomingCell.h; sourceTree = ""; }; - 6139C8BABDEA9427263EECA00BD4DA8B /* QMMessagesMemoryStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMMessagesMemoryStorage.h; path = QMChatService/QMChatService/QMMessagesMemoryStorage/QMMessagesMemoryStorage.h; sourceTree = ""; }; - 614E00A3382ABAC914EF09013C5928D8 /* CLSReport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CLSReport.h; path = iOS/Crashlytics.framework/Headers/CLSReport.h; sourceTree = ""; }; - 61D1455F8389D1ABB155D6EC485D6589 /* Flurry-iOS-SDK.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Flurry-iOS-SDK.xcconfig"; sourceTree = ""; }; - 61DE9BE563D6CC709C9AFF97EFB4FC15 /* nn-NO.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "nn-NO.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nn-NO.lproj"; sourceTree = ""; }; - 6223DD42F4FC983C8438990C0BB45FBB /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = ""; }; - 6235B487E63130C09EF071499EE0E1B2 /* bg.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = bg.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/bg.lproj; sourceTree = ""; }; - 623EAF1FE03981545FC115E3F124772C /* QMImageOutgoingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMImageOutgoingCell.xib; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.xib; sourceTree = ""; }; - 6260371331165B42182219B5B9E20EE2 /* QMCancellableService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMCancellableService.h; path = QMBaseService/QMBaseService/QMCancellableService.h; sourceTree = ""; }; - 627D21F92819D80D382095A239FBC0C6 /* ic_phone.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ic_phone.png; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone.png; sourceTree = ""; }; - 62DADB15702793C01F13FE624CB8CA2C /* QMMemoryStorageProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMMemoryStorageProtocol.h; path = QMBaseService/QMBaseService/QMMemoryStorageProtocol.h; sourceTree = ""; }; - 62E1D3E664EB736EF8C14385A82A5E16 /* QMKVOView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMKVOView.m; path = QMChatViewController/Views/QMKVOView.m; sourceTree = ""; }; - 62E62A3509DE0C639B290298E04CFC4A /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = it.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/it.lproj; sourceTree = ""; }; - 62F7C636AD145412676EDBF36CDE5EA7 /* FBSDKShareKit+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKShareKit+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareKit+Internal.h"; sourceTree = ""; }; - 62F8CB8CF96190F9944CA3368F5E516C /* ko.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ko.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ko.lproj; sourceTree = ""; }; - 634B76629EC6025EAFD01586131CA22A /* Pods-Q-municate-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Q-municate-resources.sh"; sourceTree = ""; }; - 63C88993F3F28FB44FF6FBA6A03F64BE /* QMAssetLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAssetLoader.m; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAssetLoader.m; sourceTree = ""; }; - 63D73A83122C9917857B0BDE35A3420C /* NYTPhotoViewerDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoViewerDataSource.h; path = NYTPhotoViewer/Protocols/NYTPhotoViewerDataSource.h; sourceTree = ""; }; - 63ED0B5BFFCB5A197FEC47732E76F68B /* QMChatOutgoingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatOutgoingCell.h; path = QMChatViewController/Views/Cells/QMChatOutgoingCell/QMChatOutgoingCell.h; sourceTree = ""; }; - 640A1F0FABFBCC83AD533773E58B1893 /* QMOpenGraphService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMOpenGraphService.m; path = QMOpenGraphService/QMOpenGraphService/QMOpenGraphService.m; sourceTree = ""; }; - 6497E5E7908795010C44D8E62F1BB5AA /* QMChatLocationCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatLocationCell.h; path = QMChatViewController/Views/Cells/QMChatLocationCell/QMChatLocationCell.h; sourceTree = ""; }; - 6540CD0631DFB4DA767C9175A1B536A1 /* pb_decode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb_decode.h; sourceTree = ""; }; - 658A266E5094DF1530C2B2E2D8D2F736 /* QMModel.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = QMModel.xcdatamodel; sourceTree = ""; }; - 65B46159037F7B6B4D886211BB02463E /* vi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = vi.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/vi.lproj; sourceTree = ""; }; - 65B7963220C618FE7743F7D628EC3C59 /* QMChatServiceModelIncludes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatServiceModelIncludes.h; path = QMChatCache/QMChatCache/CoreData/QMChatServiceModelIncludes.h; sourceTree = ""; }; - 6611303AB4691567B73B2C4FB51A5EFB /* FBSDKAccessTokenCacheV3.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCacheV3.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.h; sourceTree = ""; }; - 662EAA29C96B5E03BFCF690182E6FF98 /* NYTPhotoViewerSinglePhotoDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NYTPhotoViewerSinglePhotoDataSource.m; path = NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.m; sourceTree = ""; }; - 66652D1C943DF95E9B8C052B11382F97 /* FBSDKGraphRequestConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequestConnection.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestConnection.h; sourceTree = ""; }; - 66C381DCDE7BBA6F1A02E2A9AC94B09B /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; - 66D5E80EBD416F2722AF78D15E9B186B /* FBSDKCopying.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCopying.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKCopying.h; sourceTree = ""; }; - 673D039C5C3D2A441539FAEB0B0FC7C1 /* QMChatLocationIncomingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatLocationIncomingCell.h; path = QMChatViewController/Views/Cells/QMChatLocationIncomingCell/QMChatLocationIncomingCell.h; sourceTree = ""; }; - 676AEA24265E71BD00FBD6A6F63F33EC /* FBSDKConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKConstants.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.h; sourceTree = ""; }; - 677A812CF6F8FB1C7C9B8EC169E321EE /* de-CH.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "de-CH.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de-CH.lproj"; sourceTree = ""; }; - 67EC1CA5C6B4CA229AE4D09D8528703A /* FBSDKCoreKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSDKCoreKit.xcconfig; sourceTree = ""; }; - 682BB9E15B8F95A59E8246D26B5A952A /* QMAudioRecordButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAudioRecordButton.h; path = QMChatViewController/Views/CustomUI/QMAudioRecordButton/QMAudioRecordButton.h; sourceTree = ""; }; - 684A104665BC36625E5E7349AC3AE27A /* FBSDKPaymentObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKPaymentObserver.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKPaymentObserver.h; sourceTree = ""; }; - 686C7E605ACEC8D8C854D0853AA72E11 /* QMModel5.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = QMModel5.xcdatamodel; sourceTree = ""; }; - 687C44B38AFBF12D2BE5176F39722BD5 /* libPods-QMShareExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-QMShareExtension.a"; path = "libPods-QMShareExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 68E04F78D45DBA02C365BFBA84A441A1 /* CDUser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CDUser.h; path = QMUsersCache/QMUsersCache/CoreData/Entries/CDUser.h; sourceTree = ""; }; - 69449FA4E41477D00878048EBD28EA9F /* QMModel4.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = QMModel4.xcdatamodel; sourceTree = ""; }; - 69A02CD85F075A4F55B6B78725D555D3 /* tr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = tr.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/tr.lproj; sourceTree = ""; }; - 6AA6A0CB78DEE3CE405F36F1D47C6A50 /* BFURL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFURL.h; path = Bolts/iOS/BFURL.h; sourceTree = ""; }; - 6AC39CF4BA6589985FAADCFDF1BA3E12 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/AVFoundation.framework; sourceTree = DEVELOPER_DIR; }; - 6B7299271DA2005C78B60DE681866047 /* es-AR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-AR.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-AR.lproj"; sourceTree = ""; }; - 6B99F44A43827F9B7E8137EE56131739 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = ""; }; - 6C0C13EAFD5605EC62EE7056AF516C8E /* QMOpenGraphItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMOpenGraphItem.m; path = QMOpenGraphService/QMOpenGraphService/QMOpenGraphItem.m; sourceTree = ""; }; - 6C7A0E88383A821E2A7013143BB9D590 /* es-CO.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-CO.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CO.lproj"; sourceTree = ""; }; - 6CFCD9DEF7C1EADD9711E85CD19E2DF5 /* NYTPhotosViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NYTPhotosViewController.m; path = NYTPhotoViewer/NYTPhotosViewController.m; sourceTree = ""; }; - 6D3E8AA01C5AD7E1C4CC200D06D48788 /* FBSDKMath.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKMath.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.m; sourceTree = ""; }; - 6DBE88702518FF6D03E42FCCC690221B /* QMMessagesMemoryStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMMessagesMemoryStorage.m; path = QMChatService/QMChatService/QMMessagesMemoryStorage/QMMessagesMemoryStorage.m; sourceTree = ""; }; - 6DC02B083354FB172E5CC47F62E07DAA /* QMBaseMediaCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMBaseMediaCell.h; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMBaseChatMediaAttachmentCell/QMBaseMediaCell.h; sourceTree = ""; }; - 6DD8E1C76F3FDD9FC87B38C23AD2E2A1 /* FBSDKGraphRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequest.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.h; sourceTree = ""; }; - 6DFC544B95A3914F0C3C907AFC5D6EE1 /* GTMSessionFetcher-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMSessionFetcher-prefix.pch"; sourceTree = ""; }; - 6E5E5C7A90DB6A540B902BBF4B66AD00 /* FBSDKHashtag.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKHashtag.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKHashtag.m; sourceTree = ""; }; - 6E67FDDDBD8079680CD1EF44AB7C8082 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; - 6E711F35DA0A4EC11CE47595DA0749F1 /* QMChatService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatService.h; path = QMChatService/QMChatService/QMChatService.h; sourceTree = ""; }; - 6E7BC8D332FEB23EB2D65667B1F0ECB6 /* SAMKeychain-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SAMKeychain-prefix.pch"; sourceTree = ""; }; - 6E93EEE326E1D4E21CE612BEC878ECF1 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; - 6E961AF4229FC72A146FEB3A86170726 /* _CDDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _CDDialog.h; path = QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDDialog.h; sourceTree = ""; }; - 6EDF4D8A10FABE1564ABFCC8AEB9B05E /* pb_encode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb_encode.h; sourceTree = ""; }; - 6EED1F28E209FB385E025E6A79264B31 /* ms.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ms.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ms.lproj; sourceTree = ""; }; - 6EFC1FC59B51FC8DDA6EF0D93FE13F62 /* QMChatDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatDataSource.h; path = QMChatViewController/QMChatDataSource/QMChatDataSource.h; sourceTree = ""; }; - 6F3F397406EFA10F8EE84A4725793C1E /* lt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = lt.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/lt.lproj; sourceTree = ""; }; - 6F5EF6510309AB85D223836242E1C7A2 /* FBSDKAccessTokenCaching.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCaching.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCaching.h; sourceTree = ""; }; - 6F860E42F86E8B65F5B5CFAFE8352F6B /* QMAttachmentContentService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAttachmentContentService.m; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMAttachmentContentService.m; sourceTree = ""; }; - 6FE78665008B7C112B1C2EBB118FCA43 /* QMModel3.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = QMModel3.xcdatamodel; sourceTree = ""; }; - 6FF80C52BF226B31FCF90F4ECCDFFD6E /* QMCollectionViewFlowLayoutInvalidationContext.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMCollectionViewFlowLayoutInvalidationContext.h; path = QMChatViewController/Views/CollectionView/Layout/QMCollectionViewFlowLayoutInvalidationContext.h; sourceTree = ""; }; - 70DEAF8E882315FDBDFD5AAE27126125 /* ko.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ko.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ko.lproj; sourceTree = ""; }; - 70F0964A96995B861633F22C8A8FFACC /* GoogleToolboxForMac-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GoogleToolboxForMac-dummy.m"; sourceTree = ""; }; - 7117C9CCF997FBC6E86056416114A485 /* QMContactListService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMContactListService.m; path = QMContactListService/QMContactListService/QMContactListService.m; sourceTree = ""; }; - 71320870D0D676F25C36DACAC7BE54A6 /* FBSDKLoginManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLoginManager.m; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManager.m; sourceTree = ""; }; - 713D68C47E9EF9D409117C281E65C45B /* ResourceBundle-QMUsersCacheModel-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-QMUsersCacheModel-Info.plist"; sourceTree = ""; }; - 7144CFE1DE97085F58C9174FD6104C7A /* QBUUser+CustomData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "QBUUser+CustomData.h"; path = "QMUsersService/QMUsersService/Categories/QBUUser+CustomData.h"; sourceTree = ""; }; - 717CB45F4A36E01172E1AC1D8F46A5FE /* QMAuthService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAuthService.m; path = QMAuthService/QMAuthService/QMAuthService.m; sourceTree = ""; }; - 71F843ABB86CECAB10F855F8DB4EABC0 /* FBSDKAppEvents.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppEvents.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.h; sourceTree = ""; }; - 72006B0930241D522F61D3F8C5FFED74 /* FBSDKShareMessengerOpenGraphMusicTemplateContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareMessengerOpenGraphMusicTemplateContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerOpenGraphMusicTemplateContent.m; sourceTree = ""; }; - 7224C90577E453117DAA1EFAB3D3AD42 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "NYTPhotoViewerCloseButtonXLandscape@3x.png"; path = "NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape@3x.png"; sourceTree = ""; }; - 724A3BA1F2360D65C0485CF56153184D /* sv.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sv.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sv.lproj; sourceTree = ""; }; - 725DBC47B9F75420475608D9A1B961AD /* _CDContactListItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _CDContactListItem.m; path = QMContactListCache/QMContactListCache/CoreData/EntriesMachine/_CDContactListItem.m; sourceTree = ""; }; - 7261D89E5B106DA272913C2308582E9D /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = ""; }; - 7263E00578C120C5FB81DA4F6723830C /* SAMKeychain.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SAMKeychain.xcconfig; sourceTree = ""; }; - 7275BF00124E50EF3AD0D355DFD1FB9D /* NYTPhotosOverlayView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NYTPhotosOverlayView.m; path = NYTPhotoViewer/NYTPhotosOverlayView.m; sourceTree = ""; }; - 72823C4407249160C43459B83BA59BC6 /* CDDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CDDialog.h; path = QMChatCache/QMChatCache/CoreData/Entries/CDDialog.h; sourceTree = ""; }; - 72C53FF6D4E7AFC1B5FBD911B16A9723 /* FBSDKMessengerIcon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMessengerIcon.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKMessengerIcon.h; sourceTree = ""; }; - 72E21B1F28740345CFF424FD0C28EBBD /* NSDictionary+QMCDRecordAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+QMCDRecordAdditions.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSDictionary+QMCDRecordAdditions.h"; sourceTree = ""; }; - 72F585DCAF3B7FD0727488358253F64C /* FBSDKServerConfigurationManager+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKServerConfigurationManager+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager+Internal.h"; sourceTree = ""; }; - 737AAD7D5E41B4BABFABE11DC787B33A /* FBSDKTimeSpentData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKTimeSpentData.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.h; sourceTree = ""; }; - 73A5A6A06E9724DDDA1544678DB6F73E /* FBSDKShareLinkContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareLinkContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.h; sourceTree = ""; }; - 74427046125A8087BAEF77DF91C9B404 /* GTMDebugSelectorValidation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMDebugSelectorValidation.h; path = DebugUtils/GTMDebugSelectorValidation.h; sourceTree = ""; }; - 74870A09DCEBBB98B4C6C6E8716CD839 /* FABAttributes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FABAttributes.h; path = iOS/Fabric.framework/Headers/FABAttributes.h; sourceTree = ""; }; - 7489314E76093AE358D8A73DBC6A0C81 /* QMImageIncomingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMImageIncomingCell.h; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.h; sourceTree = ""; }; - 74A51E390286623D16120657C376278B /* FBSDKShareOpenGraphContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareOpenGraphContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.m; sourceTree = ""; }; - 751B10433451719B64A384C9CC20958C /* NYTPhotoViewerCloseButtonX@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "NYTPhotoViewerCloseButtonX@2x.png"; path = "NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonX@2x.png"; sourceTree = ""; }; - 751C846B11B571F772309578745700E4 /* QMChatOutgoingLinkPreviewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatOutgoingLinkPreviewCell.m; path = QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatOutgoingLinkPreviewCell/QMChatOutgoingLinkPreviewCell.m; sourceTree = ""; }; - 7543498F482088D7BADAA89F4DFA7FC2 /* gu.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = gu.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/gu.lproj; sourceTree = ""; }; - 756073924DDF758CD4ED5E59DE19C9E4 /* FBSDKShareMessengerGenericTemplateElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareMessengerGenericTemplateElement.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.h; sourceTree = ""; }; - 7580353044549A295F1B6FCF1312A90F /* FBSDKAccessTokenCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCache.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.h; sourceTree = ""; }; - 75C0FCF0CFDF0D9CC523085845D46361 /* NSPersistentStoreCoordinator+QMCDRecord.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSPersistentStoreCoordinator+QMCDRecord.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStoreCoordinator/NSPersistentStoreCoordinator+QMCDRecord.m"; sourceTree = ""; }; - 75E4853480F90A6F938C764123A335C2 /* QMChatCollectionViewFlowLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatCollectionViewFlowLayout.m; path = QMChatViewController/Views/CollectionView/Layout/QMChatCollectionViewFlowLayout.m; sourceTree = ""; }; - 763328B5B00FB93B9A27AEF090890729 /* FBSDKLikeDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeDialog.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeDialog.h; sourceTree = ""; }; - 764A61832A3A9BA2193C5373D32F2C73 /* BFGeneric.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFGeneric.h; path = Bolts/Common/BFGeneric.h; sourceTree = ""; }; - 765BF07B1A244B280EE689D9CAD0C4CE /* FBSDKGameRequestDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGameRequestDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestDialog.m; sourceTree = ""; }; - 7683F605FFEA48D580B929A70C44BC91 /* QMChatCellLayoutAttributes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatCellLayoutAttributes.h; path = QMChatViewController/Views/CollectionView/Layout/QMChatCellLayoutAttributes.h; sourceTree = ""; }; - 770C4F79199C10A909FDD508F7E2ADBE /* QMAudioOutgoingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMAudioOutgoingCell.xib; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioOutgoingCell/QMAudioOutgoingCell.xib; sourceTree = ""; }; - 774184B4D6E8D32FB5514BB46180C75A /* Pods-Q-municate-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Q-municate-acknowledgements.markdown"; sourceTree = ""; }; - 775970BE5A8EDAB93BBC238592070F0D /* NYTPhotoViewer.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NYTPhotoViewer.xcconfig; sourceTree = ""; }; - 779555251CADCFD9FE2C4DF32C27A5D7 /* Bolts-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Bolts-prefix.pch"; sourceTree = ""; }; - 77980B63A51A4587B0F20A7D6D67BD71 /* NYTPhotoViewerArrayDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoViewerArrayDataSource.h; path = NYTPhotoViewer/NYTPhotoViewerArrayDataSource.h; sourceTree = ""; }; - 77A44C467BD3BD2B1524AA6293F6D9F0 /* QMAttachmentStoreService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAttachmentStoreService.m; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreService.m; sourceTree = ""; }; - 77A74A23D87D0BFAE4FEE061A3861F71 /* QMBaseChatLocationCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMBaseChatLocationCell.h; path = QMChatViewController/Views/Cells/QMChatLocationCell/QMBaseChatLocationCell.h; sourceTree = ""; }; - 77C767FF79A87283D4BE61061C22BC41 /* ur.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ur.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ur.lproj; sourceTree = ""; }; - 784A32ADB3618C2A1AC336B335CE5FD6 /* QMLinkPreviewDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMLinkPreviewDelegate.h; path = QMChatViewController/Views/Cells/QMLinkPreviewCell/QMLinkPreviewDelegate.h; sourceTree = ""; }; - 78710B1C08656D27D63FB0E068C11AB3 /* QMAttachmentStoreService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAttachmentStoreService.h; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreService.h; sourceTree = ""; }; - 787C95889BEE3C3F31ABE0ED94D56761 /* FBSDKAppLinkResolver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppLinkResolver.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkResolver.m; sourceTree = ""; }; - 78871113E2E8880927AC6E26B088A625 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - 799EA28142EA168AA6D8F2F5BCBC52F8 /* QMOpenGraphCacheModel.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = QMOpenGraphCacheModel.bundle; path = "QMServicesDevelopment-QMOpenGraphCacheModel.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; - 7A4C8E5B60222704205C0EB815C2DD68 /* NSString+QM.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+QM.m"; path = "QMChatViewController/Categories/NSString+QM.m"; sourceTree = ""; }; - 7AA50F517F4CCD5A51A5632070E694B8 /* FBSDKDynamicFrameworkLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKDynamicFrameworkLoader.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKDynamicFrameworkLoader.h; sourceTree = ""; }; - 7AB31C02CB7AD7A4143E84D7CBDEBA90 /* Reachability-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Reachability-dummy.m"; sourceTree = ""; }; - 7ADCEED9FDDCF63F724A95207C8AD242 /* QMPlaceHolderTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMPlaceHolderTextView.m; path = QMChatViewController/Views/CustomUI/PlaceHolderTextView/QMPlaceHolderTextView.m; sourceTree = ""; }; - 7B7D102953CA75CD0EF4B49546CFEEBD /* FBSDKBridgeAPIProtocolType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIProtocolType.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIProtocolType.h; sourceTree = ""; }; - 7C2438AF30E432641E3449DF7C0B9125 /* FBSDKViewImpressionTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKViewImpressionTracker.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.h; sourceTree = ""; }; - 7C5E7AD4B06BE092318688D367BA2FB2 /* Pods-QMSiriExtension-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-QMSiriExtension-acknowledgements.markdown"; sourceTree = ""; }; - 7C80B950F6085784A2295911130078C2 /* FBSDKTestUsersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKTestUsersManager.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.m; sourceTree = ""; }; - 7C8643110A3FB0AE62045394FB501BB3 /* ic_phone@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_phone@3x.png"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone@3x.png"; sourceTree = ""; }; - 7C9F839D82D3D3F04EA0854BCE883E86 /* QMImageOutgoingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMImageOutgoingCell.h; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.h; sourceTree = ""; }; - 7CB9BEE92E9958D35690DFD3FF22428B /* BFTask.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFTask.m; path = Bolts/Common/BFTask.m; sourceTree = ""; }; - 7CDF5B38750A6054440F908FC96A1775 /* QMChatLocationSnapshotter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatLocationSnapshotter.h; path = QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.h; sourceTree = ""; }; - 7D146B956116E8DBF570F97FC654B355 /* FBSDKShareMessengerGenericTemplateElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareMessengerGenericTemplateElement.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateElement.m; sourceTree = ""; }; - 7D235F837BCDF0CE31B1CFF27A3B8F33 /* FBSDKShareOpenGraphValueContainer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareOpenGraphValueContainer.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.m; sourceTree = ""; }; - 7D3EDD868EEA7475D084B3CDF7C67B8D /* QMAsynchronousOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAsynchronousOperation.m; path = QMBaseService/QMBaseService/QMAsynchronousOperation/QMAsynchronousOperation.m; sourceTree = ""; }; - 7D3EDFD9E265E482736901753FF7D78A /* ResourceBundle-NYTPhotoViewer-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-NYTPhotoViewer-Info.plist"; sourceTree = ""; }; - 7E4E9058104640353A63350CCBFB4E7A /* FBSDKSettings+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKSettings+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSettings+Internal.h"; sourceTree = ""; }; - 7E7B0E6E540E04E62433CA83A4C48EAE /* FBSDKAppEvents.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppEvents.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppEvents.m; sourceTree = ""; }; - 7EA1C6F1DD89FFB372318A0ADFFE3FE8 /* es-NI.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-NI.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-NI.lproj"; sourceTree = ""; }; - 7EFB2F94B5D6E19DBE188A286ADAD3F8 /* EXTRuntimeExtensions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXTRuntimeExtensions.h; path = extobjc/EXTRuntimeExtensions.h; sourceTree = ""; }; - 7F1AD2D0AE6D1FFBC18F2AF42AD672B0 /* GTMNSDictionary+URLArguments.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GTMNSDictionary+URLArguments.h"; path = "Foundation/GTMNSDictionary+URLArguments.h"; sourceTree = ""; }; - 7F23B97F1E7A0309EB85CB864F1EA151 /* mr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = mr.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/mr.lproj; sourceTree = ""; }; - 7F951E200167D808F5A2AC46B398E0EE /* FBSDKTooltipView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKTooltipView.m; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKTooltipView.m; sourceTree = ""; }; - 7FC8F0941550A4C6CA9AB69375224D74 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; - 7FCC5B704A7986CC3667ED9F461B785E /* ResourceBundle-FirebasePhoneAuthUI-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebasePhoneAuthUI-Info.plist"; sourceTree = ""; }; - 80D71308EF16B67EDA2E31A6CB82510E /* hu.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hu.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hu.lproj; sourceTree = ""; }; - 80EC509EB72394DC196A2115B55556C1 /* FBSDKShareDialogMode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareDialogMode.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareDialogMode.m; sourceTree = ""; }; - 817DB1B67E498B3E020542E3EA6BBF3D /* ln.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ln.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ln.lproj; sourceTree = ""; }; - 822679CBBCE88BA77C083697F4AAD5A4 /* libQMServicesDevelopment.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libQMServicesDevelopment.a; path = libQMServicesDevelopment.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 8234D16036DC62F84BCD8765BE304B1F /* FBSDKKeychainStoreViaBundleID.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKKeychainStoreViaBundleID.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.h; sourceTree = ""; }; - 8277160AD8AB8D66A5F9FA04182DF049 /* FBSDKBridgeAPIRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIRequest.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIRequest.h; sourceTree = ""; }; - 827CD56A0057309230976D3F2988CCCA /* QMAudioRecordView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAudioRecordView.h; path = QMChatViewController/Views/CustomUI/QMAudioRecordView/QMAudioRecordView.h; sourceTree = ""; }; - 82881E1250669D4FFACAD4952B62D550 /* QMSLog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMSLog.m; path = QMServices/QMSLog.m; sourceTree = ""; }; - 828ED7F0ACBA838A3CB141B1A54AAC9F /* NSManagedObject+QMCDFinders.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObject+QMCDFinders.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDFinders.m"; sourceTree = ""; }; - 82BAC18BFB5932D6FA9FF52EBF744D56 /* FBSDKServerConfiguration+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKServerConfiguration+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration+Internal.h"; sourceTree = ""; }; - 83930B2194799CB1C53F6374A93C79C0 /* es-BO.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-BO.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-BO.lproj"; sourceTree = ""; }; - 83E12C4275C4962131A88468C39E4E7E /* FBSDKBridgeAPIProtocolWebV2.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPIProtocolWebV2.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolWebV2.m; sourceTree = ""; }; - 8400869684351A04285A9D40CE749FAF /* QMInputToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMInputToolbar.h; path = QMChatViewController/Views/CustomUI/InputToolBar/QMInputToolbar.h; sourceTree = ""; }; - 840DB5B8D98241F0CBD308B4B0E18C26 /* BFTask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFTask.h; path = Bolts/Common/BFTask.h; sourceTree = ""; }; - 84509F748A19E448072572C4A0CD4F14 /* QMOpenGraphService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMOpenGraphService.h; path = QMOpenGraphService/QMOpenGraphService/QMOpenGraphService.h; sourceTree = ""; }; - 84C253419EBA4489EEB22C4694722DDF /* FBSDKShareAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareAPI.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.h; sourceTree = ""; }; - 8513C813B77D7EDDBF9D99C7BC757661 /* Pods-Q-municate-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Q-municate-dummy.m"; sourceTree = ""; }; - 851426EA57416802CF5A73A361010B0D /* FLAnimatedImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FLAnimatedImage-prefix.pch"; sourceTree = ""; }; - 856D8347E4E9A337FB8006CF5554C5F1 /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nl.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/nl.lproj; sourceTree = ""; }; - 85862B94D36F663DC302B77EA502371B /* vi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = vi.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/vi.lproj; sourceTree = ""; }; - 86210DA87FD9910AC3D94704AD548939 /* QMChatOutgoingLinkPreviewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatOutgoingLinkPreviewCell.h; path = QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatOutgoingLinkPreviewCell/QMChatOutgoingLinkPreviewCell.h; sourceTree = ""; }; - 865E5FA44C5C9D8EC6BB2DADE3BEDCFC /* BFAppLinkReturnToRefererView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFAppLinkReturnToRefererView.m; path = Bolts/iOS/BFAppLinkReturnToRefererView.m; sourceTree = ""; }; - 865FE3C61FA656289A6CDBF3B3FF0536 /* NSDate+ChatDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDate+ChatDataSource.m"; path = "QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.m"; sourceTree = ""; }; - 866869B21EDA6B01BAB28CC857696A43 /* sr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sr.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sr.lproj; sourceTree = ""; }; - 86D38AB2DF580B645033E2A81C7B87B8 /* FBSDKAppEvents+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKAppEvents+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEvents+Internal.h"; sourceTree = ""; }; - 86D67B4842FB59069113286A90C39AF7 /* NSManagedObject+QMCDRequests.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObject+QMCDRequests.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRequests.m"; sourceTree = ""; }; - 86EC999F1C150066E9E86041F19FBE4F /* FBSDKAppLinkUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppLinkUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.h; sourceTree = ""; }; - 8702140972D8E5BCB9C2664CCB9A68AD /* libGoogleToolboxForMac.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libGoogleToolboxForMac.a; path = libGoogleToolboxForMac.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 8734F968131E17317FEDEED25EFBF557 /* QMChatCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatCell.h; path = QMChatViewController/Views/Cells/QMChatCell/QMChatCell.h; sourceTree = ""; }; - 873E47A5A7DA3AB9C32C49020C7F7225 /* ResourceBundle-QMChatCacheModel-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-QMChatCacheModel-Info.plist"; sourceTree = ""; }; - 874978817498CA1C77062EDB246C661D /* es-GT.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-GT.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-GT.lproj"; sourceTree = ""; }; - 877CDAF6A89F584914804D5D99113D74 /* SAMKeychain-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SAMKeychain-dummy.m"; sourceTree = ""; }; - 8784D5C3F028DFEE49FB813BD9B1EAC9 /* en-ZA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-ZA.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-ZA.lproj"; sourceTree = ""; }; - 879462D1292026C3C9BCA4BF3B9125DB /* QBChatMessage+QBDateDivider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QBChatMessage+QBDateDivider.m"; path = "QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.m"; sourceTree = ""; }; - 87E958B6C79CDEE6B639224D904513D7 /* CLSAttributes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CLSAttributes.h; path = iOS/Crashlytics.framework/Headers/CLSAttributes.h; sourceTree = ""; }; - 8812F01F099A58454FE64D061FD25D36 /* ResourceBundle-QMContactListCacheModel-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-QMContactListCacheModel-Info.plist"; sourceTree = ""; }; - 8817F70E89D1422A78DEA7E053AE7EF8 /* sr-Latn.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "sr-Latn.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sr-Latn.lproj"; sourceTree = ""; }; - 8827D20336FE055B0C6C5AE0387FCE39 /* liblibextobjc.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = liblibextobjc.a; path = liblibextobjc.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 884D53BFEA7FA095F28C2524C814D7FC /* libReachability.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libReachability.a; path = libReachability.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 88575A598348592AD90C1E635A9AB7B4 /* UIDevice-Hardware.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "UIDevice-Hardware.xcconfig"; sourceTree = ""; }; - 8893B0934E11007A196DA0507D9DFF71 /* FBSDKBridgeAPICrypto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPICrypto.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.h; sourceTree = ""; }; - 88DC7CE9C7AF3F6D77EA058439F3A3A5 /* ar.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ar.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ar.lproj; sourceTree = ""; }; - 88EB65360379717F21C5A6891BAAF76D /* FBSDKCheckmarkIcon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKCheckmarkIcon.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.m; sourceTree = ""; }; - 89119A7831BE8F6D0F158B90EC16845C /* play_icon.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = play_icon.png; path = QMChatViewController/Icons/play_icon.png; sourceTree = ""; }; - 89309B50B54AF8635BF85559C14A1B4E /* fil.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fil.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fil.lproj; sourceTree = ""; }; - 894D921C5A6F02266140D6D0C128A541 /* zh.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = zh.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh.lproj; sourceTree = ""; }; - 8984E3C783F423873397C30EF5EEE2BD /* FBSDKShareButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareButton.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareButton.m; sourceTree = ""; }; - 899764694C352C19AF098F512D55A0BA /* ln.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ln.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ln.lproj; sourceTree = ""; }; - 89B3356F04FE0C784B666B947594EEB5 /* QMChatViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatViewController.m; path = QMChatViewController/QMChatViewController.m; sourceTree = ""; }; - 89B520CB39A8CB161906CA0762F5D58B /* QMCDMigrationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMCDMigrationManager.m; path = QMDBStorage/QMDBStorage/QMCDRecord/QMCDMigrationManager.m; sourceTree = ""; }; - 8A06EDCC386DEA3CBD459D81F769D207 /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; - 8A187756081222D9F49ED73C82FAB015 /* QMTimeOut.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMTimeOut.m; path = QMChatService/QMChatService/QMAttachmentService/QMTimeOut/QMTimeOut.m; sourceTree = ""; }; - 8A294357ED86543CEF57618D542B126A /* QMChatAttachmentCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatAttachmentCell.h; path = QMChatViewController/Views/Cells/QMChatAttachmentCell/QMChatAttachmentCell.h; sourceTree = ""; }; - 8A3828F6A78E85D3370113C6DAA7C106 /* QMOpenGraphMemoryStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMOpenGraphMemoryStorage.m; path = QMOpenGraphService/QMOpenGraphService/QMOpenGraphMemoryStorage.m; sourceTree = ""; }; - 8A3AC07C0E34190634852B22F3ECF10E /* download_icon.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = download_icon.png; path = QMChatViewController/Icons/download_icon.png; sourceTree = ""; }; - 8A49A0A90F9EDA7C7BB2A9EF1B449B04 /* QMChatLocationIncomingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatLocationIncomingCell.xib; path = QMChatViewController/Views/Cells/QMChatLocationIncomingCell/QMChatLocationIncomingCell.xib; sourceTree = ""; }; - 8A7CF85B14C2EA0CC0F833CD08BDC456 /* NSError+QMCDRecordErrorHandling.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSError+QMCDRecordErrorHandling.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSError+QMCDRecordErrorHandling.m"; sourceTree = ""; }; - 8A925F310B20680D87C8BA5241B132EB /* NYTPhotoTransitionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoTransitionController.h; path = NYTPhotoViewer/NYTPhotoTransitionController.h; sourceTree = ""; }; - 8AAE4BC3BD6B31FDA1BFF684B33958C1 /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "zh-Hans.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hans.lproj"; sourceTree = ""; }; - 8AD758050B2837363C6C93BB75D15180 /* EXTRuntimeExtensions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXTRuntimeExtensions.m; path = extobjc/EXTRuntimeExtensions.m; sourceTree = ""; }; - 8B33FA49AA87A2B03A63A649F780EA2B /* GTMMethodCheck.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMMethodCheck.h; path = DebugUtils/GTMMethodCheck.h; sourceTree = ""; }; - 8BB4E96EF5B1A0686FF2D45622498106 /* QMCVDevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = QMCVDevelopment.xcconfig; sourceTree = ""; }; - 8BC8D415AA7995B656FD3B807AA3FBF2 /* QMImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMImageView.h; path = QMChatViewController/Views/CustomUI/QMImageView/QMImageView.h; sourceTree = ""; }; - 8C0ECC8CED6FE0F637960DABA90C3D03 /* NYTPhotosViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotosViewController.h; path = NYTPhotoViewer/NYTPhotosViewController.h; sourceTree = ""; }; - 8C0FF43DFF86E88494D979E7C3943BB7 /* SDWebImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageFrame.m; path = SDWebImage/SDWebImageFrame.m; sourceTree = ""; }; - 8C644E001404213A6D0FDDD8AA2D17B4 /* libFlurry_8.3.1.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libFlurry_8.3.1.a; path = Flurry/libFlurry_8.3.1.a; sourceTree = ""; }; - 8CA05A33982B4C12B2F1F49B3129DC64 /* es-MX.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-MX.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-MX.lproj"; sourceTree = ""; }; - 8CA98F4DE827B68B734521E86678DFCB /* Pods-Q-municate.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Q-municate.debug.xcconfig"; sourceTree = ""; }; - 8CCB1D75624DA20FAA20E9B6732B1707 /* FBSDKErrorRecoveryAttempter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKErrorRecoveryAttempter.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/FBSDKErrorRecoveryAttempter.h; sourceTree = ""; }; - 8D1060F6CE86F9203A33FCAA1D4B7778 /* FBSDKColor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKColor.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKColor.m; sourceTree = ""; }; - 8D25E20EE508FF8594C4D6FDEF9D5B61 /* Reachability.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Reachability.xcconfig; sourceTree = ""; }; - 8D3AB0D2FBB6356F8635DE75459DEC0E /* BFAppLink_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLink_Internal.h; path = Bolts/iOS/Internal/BFAppLink_Internal.h; sourceTree = ""; }; - 8D407FC7369497DC059AC41B496CE64A /* FBSDKShareVideo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareVideo.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareVideo.h; sourceTree = ""; }; - 8D96CB36C5F60EBD1D39B22B92035F8B /* fr-CH.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "fr-CH.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fr-CH.lproj"; sourceTree = ""; }; - 8DC935A0E27502DBF653263E0C695A54 /* QMContactListCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMContactListCache.h; path = QMContactListCache/QMContactListCache/QMContactListCache.h; sourceTree = ""; }; - 8E850C4FB3456425684E5FCC37D62364 /* pb.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = pb.h; sourceTree = ""; }; - 8E9D268E1782FA4C15A7B4F908D3D96C /* sl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sl.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sl.lproj; sourceTree = ""; }; - 8F101F2C22B028A548542E524E2CE28F /* en-SG.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-SG.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-SG.lproj"; sourceTree = ""; }; - 8F587D27457E1B4ED4F84F28B04F5FC2 /* FBSDKError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKError.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKError.m; sourceTree = ""; }; - 8F5B7AEEE571D96E8A6E61BFC51FD629 /* FUIPasswordTableViewCell.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIPasswordTableViewCell.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordTableViewCell.nib; sourceTree = ""; }; - 8FE7590BB049681C40A5FD1529364E82 /* QMChatCollectionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatCollectionView.h; path = QMChatViewController/Views/CollectionView/QMChatCollectionView.h; sourceTree = ""; }; - 90026104B4F4B48464A9A039CB80A5CD /* FBSDKLoginTooltipView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLoginTooltipView.h; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginTooltipView.h; sourceTree = ""; }; - 900A95B4617CB79265039BED16D6EF2B /* FBSDKShareMessengerContentUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareMessengerContentUtility.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareMessengerContentUtility.m; sourceTree = ""; }; - 9029E5B1E7E24D53543B68C38F118048 /* FBSDKMessageDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMessageDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.h; sourceTree = ""; }; - 90381DAB7B4F23031351313143915446 /* UIDevice-Hardware-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIDevice-Hardware-prefix.pch"; sourceTree = ""; }; - 90CAE0856C5DAE3E2BC26B54DF6F8B35 /* FBSDKBase64.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBase64.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.m; sourceTree = ""; }; - 90D0CE6379C5F06566AF9A5BFCEBEBE9 /* FBSDKGameRequestContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGameRequestContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKGameRequestContent.h; sourceTree = ""; }; - 90F45A704DB63BD8CCDC74E33099A589 /* BFCancellationToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationToken.m; path = Bolts/Common/BFCancellationToken.m; sourceTree = ""; }; - 90FC32DB834F5E367709999298DC79CC /* QMMediaUploadService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMMediaUploadService.m; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaUploadService/QMMediaUploadService.m; sourceTree = ""; }; - 9121DB125CE355DCA65B91D11F21923E /* es-PA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-PA.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PA.lproj"; sourceTree = ""; }; - 914CC03C89B4D2679E2D998C137617B3 /* FBSDKAccessTokenCacheV4.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCacheV4.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV4.h; sourceTree = ""; }; - 916957FB16CF9E3894972722C9BA8F85 /* QMChatIncomingLinkPreviewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatIncomingLinkPreviewCell.h; path = QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatIncomingLinkPreviewCell/QMChatIncomingLinkPreviewCell.h; sourceTree = ""; }; - 91AF384C2CA00703F94D0642F00AC2D4 /* QMAuthService+Bolts.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QMAuthService+Bolts.m"; path = "QMAuthService/QMAuthService/Bolts/QMAuthService+Bolts.m"; sourceTree = ""; }; - 92AFA49E5FC9462F49C66FCC4CF6A0A1 /* FBSDKServerConfigurationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKServerConfigurationManager.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfigurationManager.m; sourceTree = ""; }; - 92E0CBDBF91400DB48669528F6E91251 /* sv.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sv.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/sv.lproj; sourceTree = ""; }; - 930FDD9F80CB0D6AB45FA86FD1A62AEE /* FBSDKLikeButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeButton.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeButton.m; sourceTree = ""; }; - 9313D39AC48A99B0BD9A0515100101D6 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; - 931A28D49A72DD4F0897B0C223BE3E7D /* QMMediaDownloadService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMMediaDownloadService.h; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadService.h; sourceTree = ""; }; - 9329F9B4D71892A47DE7FE8D0BC53E87 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; - 933A45C395BF3005EC1111DC805DAA82 /* FBSDKLoginManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLoginManager.h; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManager.h; sourceTree = ""; }; - 9362AAB7CC312287A4811C37235F233A /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; - 93840F9C95DD41243A41375787D683C5 /* QMChatLocationOutgoingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatLocationOutgoingCell.xib; path = QMChatViewController/Views/Cells/QMChatLocationOutgoingCell/QMChatLocationOutgoingCell.xib; sourceTree = ""; }; - 93A3190C66560D03E526DB02F2246B9B /* ic_phone@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_phone@2x.png"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ic_phone@2x.png"; sourceTree = ""; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 93D9B57C9B26DD8B4208E51ED2A417F1 /* FBSDKCameraEffectArguments+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKCameraEffectArguments+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCameraEffectArguments+Internal.h"; sourceTree = ""; }; - 93E84DD0FB95C01B073F683BCC27B0B4 /* FBSDKShareMediaContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareMediaContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.h; sourceTree = ""; }; - 941EEE8DDE4D72C0CA6721E2A0E6073B /* _CDDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _CDDialog.m; path = QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDDialog.m; sourceTree = ""; }; - 9557712848C9A39338545DD860DAFAFA /* ic_visibility_off@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_visibility_off@2x.png"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility_off@2x.png"; sourceTree = ""; }; - 9560E25BE46E3BC3746BDFAD210AFB32 /* de-AT.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "de-AT.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de-AT.lproj"; sourceTree = ""; }; - 95B8F3DAD4B5925CAD8B9DB63B8283D8 /* FBSDKLikeActionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeActionController.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionController.m; sourceTree = ""; }; - 95F4F88F14F153C1CBB3570027656666 /* QMImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMImageView.m; path = QMChatViewController/Views/CustomUI/QMImageView/QMImageView.m; sourceTree = ""; }; - 96AE3735391F049B3F9A15A9E25D415B /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/UIImage+ForceDecode.m"; sourceTree = ""; }; - 96B1572728A190E05E5FFD03600F3041 /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "zh-Hans.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/zh-Hans.lproj"; sourceTree = ""; }; - 96DE4BD6A1DB6E683B825AB6ECEFC254 /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = ""; }; - 97C7B1DAD03233EF3304B1CCDEB81243 /* FBSDKIcon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKIcon.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.m; sourceTree = ""; }; - 9845A6BD9C372FEEB661BD93FA0B382D /* QMOpenGraphCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMOpenGraphCache.h; path = QMOpenGraphCache/QMOpenGraphCache/QMOpenGraphCache.h; sourceTree = ""; }; - 98775D35A30239BB2243827E123A1B03 /* en-ZA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-ZA.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-ZA.lproj"; sourceTree = ""; }; - 9885097860AD717DF1B15D7C782B5A08 /* es-US.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-US.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-US.lproj"; sourceTree = ""; }; - 98E1CF89D57002D0CC25E1C54E561E96 /* QMContactListService+Bolts.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QMContactListService+Bolts.m"; path = "QMContactListService/QMContactListService/Bolts/QMContactListService+Bolts.m"; sourceTree = ""; }; - 993AA6B3C61BB4E47034C8076A324465 /* attachment_ic@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "attachment_ic@3x.png"; path = "QMChatViewController/Icons/attachment_ic@3x.png"; sourceTree = ""; }; - 994181A11C64A83A5009EBB786D239FC /* FBSDKConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKConstants.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKConstants.m; sourceTree = ""; }; - 99649297159B6E699F535BC837099254 /* FBSDKAppEventsDeviceInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppEventsDeviceInfo.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsDeviceInfo.m; sourceTree = ""; }; - 99C74C46C05BE270A98670468206DFF2 /* Pods-QMSiriExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-QMSiriExtension.debug.xcconfig"; sourceTree = ""; }; - 99E9BFF5BB30723423D7283F580BCACA /* QMChatContainerView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatContainerView.m; path = QMChatViewController/Views/QMChatContainerView.m; sourceTree = ""; }; - 99F1907A8D3314BD206F8C119E61F407 /* FBSDKURLSessionTask.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKURLSessionTask.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLSessionTask.m; sourceTree = ""; }; - 9A1569FB2C781E2B3994440649F7DB70 /* QMChatBaseLinkPreviewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatBaseLinkPreviewCell.h; path = QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatBaseLinkPreviewCell.h; sourceTree = ""; }; - 9A1BC23D69D5960430E47118B78326E9 /* FBSDKAppInviteContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppInviteContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteContent.m; sourceTree = ""; }; - 9A5067A83C65BDAAF4E0694FFE1A27F2 /* gsw.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = gsw.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/gsw.lproj; sourceTree = ""; }; - 9A70D8EA232010D20A957A90BC59B2A6 /* FirebaseAuth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseAuth.framework; path = Frameworks/FirebaseAuth.framework; sourceTree = ""; }; - 9A73474AE2373DD589009FAEAD587C7B /* es-CL.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-CL.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-CL.lproj"; sourceTree = ""; }; - 9B5674C5E755CA9EC6689E806AA5783E /* UIImage+Cropper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Cropper.h"; path = "QMChatViewController/Categories/UIImage+Cropper.h"; sourceTree = ""; }; - 9B7082A22C96398717C289D224AD4669 /* _CDUser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _CDUser.m; path = QMUsersCache/QMUsersCache/CoreData/EntriesMachine/_CDUser.m; sourceTree = ""; }; - 9B8C623A87FBF3D1D8C9ED2314626863 /* BFAppLinkReturnToRefererView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkReturnToRefererView.h; path = Bolts/iOS/BFAppLinkReturnToRefererView.h; sourceTree = ""; }; - 9BAD650DFF338F79F40A02FB8818283C /* BFMeasurementEvent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFMeasurementEvent.m; path = Bolts/iOS/BFMeasurementEvent.m; sourceTree = ""; }; - 9BAEA8AF57949742DBD54B6C219568E5 /* NSManagedObjectContext+QMCDRecord.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSManagedObjectContext+QMCDRecord.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDRecord.h"; sourceTree = ""; }; - 9BCDE679D0719D17C0A9C853079A3E88 /* QMUsersModel2.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = QMUsersModel2.xcdatamodel; sourceTree = ""; }; - 9BFA9757E45232124F11DA3CFA60A452 /* QBChatAttachment+QMCustomParameters.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QBChatAttachment+QMCustomParameters.m"; path = "QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomParameters.m"; sourceTree = ""; }; - 9C351DEA4FC079992C403E85D98FC5FE /* es-BO.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-BO.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-BO.lproj"; sourceTree = ""; }; - 9C6DF183F7699C11C22BC07BDA3E4365 /* Pods-QMShareExtension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-QMShareExtension-dummy.m"; sourceTree = ""; }; - 9C9E61951DEB42D69DA1678E26E45E03 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; - 9D2FDD67FB5585AF665E74CE5DBE363D /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; - 9DF0EFEC448C8E232755C250EE0125F5 /* QBChatAttachment+QMCustomData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QBChatAttachment+QMCustomData.m"; path = "QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomData.m"; sourceTree = ""; }; - 9E1EDA698E88CA8B89E64582BA4819A9 /* QMChatAttachmentOutgoingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatAttachmentOutgoingCell.m; path = QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.m; sourceTree = ""; }; - 9E257F2CBCC63464FD3C183C76440F54 /* FLAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImage.m; path = FLAnimatedImage/FLAnimatedImage.m; sourceTree = ""; }; - 9E2A308E7BF7986FC0B0027063911EBB /* FBSDKErrorConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKErrorConfiguration.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.m; sourceTree = ""; }; - 9E2B2EE2F10166FAACC37EC6DF0FA833 /* EXTScope.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXTScope.m; path = extobjc/EXTScope.m; sourceTree = ""; }; - 9E6C9DFB4878BE546BDDA5B892E3619D /* sk.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sk.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sk.lproj; sourceTree = ""; }; - 9E831389AAFFD53B1FDDB57DD725410C /* FBSDKImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKImageDownloader.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKImageDownloader.m; sourceTree = ""; }; - 9EA6A30D23F80DBC394CAA1A1EAB6709 /* FBSDKBridgeAPICrypto.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPICrypto.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPICrypto.m; sourceTree = ""; }; - 9EB4F66FA729C6D4D28E724E013935FA /* FBSDKShareOpenGraphObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareOpenGraphObject.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphObject.h; sourceTree = ""; }; - 9EC3DC1241BCE69DE894F27B310943D0 /* FBSDKButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKButton.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.m; sourceTree = ""; }; - 9EF2356062505A253204470F0BB17B80 /* QBChatMessage+QMCustomParameters.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QBChatMessage+QMCustomParameters.m"; path = "QMChatService/QMChatService/Categories/QBChatMessage+QMCustomParameters.m"; sourceTree = ""; }; - 9F13033568FAB9D46129D0CFA91D3994 /* NYTPhotoViewer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NYTPhotoViewer-prefix.pch"; sourceTree = ""; }; - 9F176D3F4A34104116408EA12C4811F2 /* ic_visibility@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_visibility@2x.png"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility@2x.png"; sourceTree = ""; }; - 9F69150B1DF4C1D9A6C739047C86B4F9 /* QMDateUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMDateUtils.m; path = QMChatViewController/Utils/QMDateUtils/QMDateUtils.m; sourceTree = ""; }; - 9F6D00915FB1BE081D4248A92A14C046 /* QMVideoOutgoingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMVideoOutgoingCell.m; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoOutgoingCell/QMVideoOutgoingCell.m; sourceTree = ""; }; - 9FA9DFEE928D4124A78F56F66F13CEE0 /* QMCDRecord+VersionInformation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QMCDRecord+VersionInformation.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+VersionInformation.m"; sourceTree = ""; }; - 9FD5094E45E40ECC81E677195C5E568C /* QMChatActionsHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatActionsHandler.h; path = QMChatViewController/Views/QMChatActionsHandler.h; sourceTree = ""; }; - 9FEDCD23F79E94BFEEB392B6B2BCEB1B /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = ""; }; - A02D0BFAA3A47C620571E5D896AF5908 /* NSManagedObject+QMCDAggregation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSManagedObject+QMCDAggregation.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDAggregation.h"; sourceTree = ""; }; - A037233884896ABCC4C858BD622C31E3 /* QMUsersService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMUsersService.m; path = QMUsersService/QMUsersService/QMUsersService.m; sourceTree = ""; }; - A063571860C246C1AC8235D782944E05 /* ur.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ur.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ur.lproj; sourceTree = ""; }; - A06E1612D0D44D16590E8684440EC14E /* FBSDKGraphRequestPiggybackManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequestPiggybackManager.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.h; sourceTree = ""; }; - A0B8B54A2F11E9EEAFB92DBAA44FACF1 /* FBSDKLikeControl.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeControl.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.m; sourceTree = ""; }; - A1305A69331A1C824781E95183DEB81D /* NYTPhotoViewer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NYTPhotoViewer-dummy.m"; sourceTree = ""; }; - A18D52AE481F843989AF494A0004E0AC /* BFAppLinkReturnToRefererView_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLinkReturnToRefererView_Internal.h; path = Bolts/iOS/Internal/BFAppLinkReturnToRefererView_Internal.h; sourceTree = ""; }; - A1A4CD58239847C9248F2F6A01053743 /* QMInputToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMInputToolbar.m; path = QMChatViewController/Views/CustomUI/InputToolBar/QMInputToolbar.m; sourceTree = ""; }; - A1F54B4046E93628DCC0ACC824E213CE /* FBSDKLiking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLiking.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKLiking.h; sourceTree = ""; }; - A2594D687D0EA27A5F60EF4E6E8BF1E0 /* QMAsynchronousOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAsynchronousOperation.h; path = QMBaseService/QMBaseService/QMAsynchronousOperation/QMAsynchronousOperation.h; sourceTree = ""; }; - A26842186BD1CB2BCE1B00438496C232 /* FUIPasswordRecoveryViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIPasswordRecoveryViewController.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordRecoveryViewController.nib; sourceTree = ""; }; - A28269932111CE8DEFF54ADAC7B6CE59 /* BFCancellationTokenSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationTokenSource.h; path = Bolts/Common/BFCancellationTokenSource.h; sourceTree = ""; }; - A2F0D03A8DE442075C62C7B91F3AF302 /* es-US.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-US.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-US.lproj"; sourceTree = ""; }; - A333E9F80C9D5C2E5FE1D0E8BCBE0CCC /* ic_retry-grey.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_retry-grey.png"; path = "QMChatViewController/Icons/ic_retry-grey.png"; sourceTree = ""; }; - A35113DF0B7F8FBBC9FD814876957040 /* FBSDKGameRequestFrictionlessRecipientCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGameRequestFrictionlessRecipientCache.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKGameRequestFrictionlessRecipientCache.h; sourceTree = ""; }; - A3EE5FCF3B09FEF062305A90E8C798DB /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ja.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ja.lproj; sourceTree = ""; }; - A3F665FB265D7273AF4CDBE921B2D36B /* QMCDRecordInternal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMCDRecordInternal.m; path = QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordInternal.m; sourceTree = ""; }; - A48048F8F09ADF531BD89B432DF26945 /* QMChatViewController.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = QMChatViewController.bundle; path = "QMCVDevelopment-QMChatViewController.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; - A482A9DAC125B4A98D963A4276D0F584 /* FBSDKShareKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSDKShareKit-prefix.pch"; sourceTree = ""; }; - A499C6C09B6BE90562AC44979B08C891 /* SDWebImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCodersManager.m; path = SDWebImage/SDWebImageCodersManager.m; sourceTree = ""; }; - A506ADE5745BB7E498028D3A793B30C9 /* pb_common.c */ = {isa = PBXFileReference; includeInIndex = 1; path = pb_common.c; sourceTree = ""; }; - A510C2D8F68E767107BCA7E9FE5698A8 /* QMKVOView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMKVOView.h; path = QMChatViewController/Views/QMKVOView.h; sourceTree = ""; }; - A511FA8CB99AF0C4858C4FC52BA89231 /* QBChatMessage+QMCustomParameters.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "QBChatMessage+QMCustomParameters.h"; path = "QMChatService/QMChatService/Categories/QBChatMessage+QMCustomParameters.h"; sourceTree = ""; }; - A53FB2466992DA7C8C52D1D934726165 /* libSAMKeychain.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSAMKeychain.a; path = libSAMKeychain.a; sourceTree = BUILT_PRODUCTS_DIR; }; - A59B3E096E75CDA695BB3968D8D9DA69 /* pt-PT.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "pt-PT.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt-PT.lproj"; sourceTree = ""; }; - A64143A91002E5943DF91263BF27E353 /* hr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hr.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hr.lproj; sourceTree = ""; }; - A6F63999B8BBF641665626A58D09BC11 /* QMAttachmentAssetService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAttachmentAssetService.m; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAttachmentAssetService.m; sourceTree = ""; }; - A77CDDEA831527A19FAA23E1B93E9A9C /* Crashlytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Crashlytics.framework; path = iOS/Crashlytics.framework; sourceTree = ""; }; - A7AC09977AA6C9C8D865A841514714F0 /* QMHeaderCollectionReusableView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMHeaderCollectionReusableView.xib; path = QMChatViewController/Views/CustomUI/QMHeaderCollectionReusableView/QMHeaderCollectionReusableView.xib; sourceTree = ""; }; - A7BC24BB314E0DAE5B5C4DF61513526C /* _FBSDKTemporaryErrorRecoveryAttempter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _FBSDKTemporaryErrorRecoveryAttempter.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ErrorRecovery/_FBSDKTemporaryErrorRecoveryAttempter.m; sourceTree = ""; }; - A7EA7F797EEB916C676FBA9982CB5A41 /* FUIPasswordSignUpViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIPasswordSignUpViewController.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordSignUpViewController.nib; sourceTree = ""; }; - A802B2151F72AA3440CE60923E772AB5 /* GTMSessionFetcher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GTMSessionFetcher-dummy.m"; sourceTree = ""; }; - A826CA3511B0341F9FA14C7517B3A33A /* BFExecutor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFExecutor.h; path = Bolts/Common/BFExecutor.h; sourceTree = ""; }; - A834C4B89C9666AFD697CBAB197B2DA2 /* FBSDKUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKUtility.h; sourceTree = ""; }; - A85BA856C2BB78A4507CB55A2EB2071A /* QMOpenGraphModel.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = QMOpenGraphModel.xcdatamodel; sourceTree = ""; }; - A8A49BEE0222B6632DAD15E581A05687 /* SVProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.xcconfig; sourceTree = ""; }; - A8C5AF8EE385D9E3D372E10B83566ADA /* el.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = el.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/el.lproj; sourceTree = ""; }; - A92B1096662738367F0A80D8E156C504 /* FBSDKSharePhoto.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKSharePhoto.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharePhoto.m; sourceTree = ""; }; - A9A8F0DCDB8B43A0D4EDB728FF80D357 /* QMCDRecordInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMCDRecordInternal.h; path = QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordInternal.h; sourceTree = ""; }; - A9C93E8567094F579F4A942F9F698A74 /* QMCVDevelopment-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "QMCVDevelopment-dummy.m"; sourceTree = ""; }; - A9DC18DF05E4A40BAF1EE7D702263D5A /* FBSDKShareError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareError.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.m; sourceTree = ""; }; - A9E7C211CD593C0142BA92EFF27B6F34 /* QMMediaUploadService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMMediaUploadService.h; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaUploadService/QMMediaUploadService.h; sourceTree = ""; }; - AA4101E7372F643ACACAB9EA7E30ABD7 /* nanopb-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "nanopb-prefix.pch"; sourceTree = ""; }; - AA65AAE9580D0C2DDE5448EE074AA614 /* UIDevice-Hardware.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIDevice-Hardware.h"; sourceTree = ""; }; - AA7377A46BDFAFBC79986AA12BFBBA37 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreVideo.framework; sourceTree = DEVELOPER_DIR; }; - AAB7FE2F7E13A765849C397366F11867 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; - AAF28B24CB1A52A17EC3A0606F879968 /* QMChatContainerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatContainerView.h; path = QMChatViewController/Views/QMChatContainerView.h; sourceTree = ""; }; - AAF6C7B25F987BBB9139F12376DE1F52 /* QMMediaViewDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMMediaViewDelegate.h; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaViewDelegate/QMMediaViewDelegate.h; sourceTree = ""; }; - AB160DC8D83E4D56E49A48F536465CC9 /* FBSDKErrorRecoveryConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKErrorRecoveryConfiguration.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorRecoveryConfiguration.m; sourceTree = ""; }; - AB1BEBD2DA54928762E98B3C7CA6F98F /* FBSDKCoreKit+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKCoreKit+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKCoreKit+Internal.h"; sourceTree = ""; }; - AB1C121E54FC1C5DEA7D35196A8F0860 /* en-SG.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-SG.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-SG.lproj"; sourceTree = ""; }; - AB1D90BFFF374680ED56281733B5E58F /* QMVideoIncomingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMVideoIncomingCell.m; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoIncomingCell/QMVideoIncomingCell.m; sourceTree = ""; }; - AB214464202C01989CCEB6D4A941A846 /* NSError+QMCDRecordErrorHandling.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSError+QMCDRecordErrorHandling.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSError+QMCDRecordErrorHandling.h"; sourceTree = ""; }; - AB64DF2528E2706B75659262C43E0C50 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreData.framework; sourceTree = DEVELOPER_DIR; }; - AB9258404ACB7E29344925DF54CE71B8 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/SDWebImageTransition.h; sourceTree = ""; }; - ABCC8D3EEF42CEEB9C802066ED38AC11 /* FBSDKCameraEffectTextures.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKCameraEffectTextures.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.m; sourceTree = ""; }; - ABE526C6FEBB48F5EE6ABA8D40ABD3B7 /* FBSDKLoginButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLoginButton.h; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginButton.h; sourceTree = ""; }; - ABF24F1536DC90171DF6D3B0D35DC350 /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = ""; }; - AC27249710CBE7558BE336C314F08FBB /* ic_email@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_email@2x.png"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_email@2x.png"; sourceTree = ""; }; - AC3604D88068BD37EB37085F94FC2954 /* FBSDKTestUsersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKTestUsersManager.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKTestUsersManager.h; sourceTree = ""; }; - ACC3810C5097B7BE906992E6F67B005A /* FBSDKGraphRequestBody.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequestBody.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.m; sourceTree = ""; }; - ACCBADBE2842037A58CE8AA98EE3EDE2 /* QMToolbarContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMToolbarContainer.h; path = QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContainer.h; sourceTree = ""; }; - AD4C10E26ABB9CD908850243EA4D7BC3 /* QMModel.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = QMModel.xcdatamodel; sourceTree = ""; }; - AD8031FF366A3E027D069DF4A421CDD8 /* es-419.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-419.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-419.lproj"; sourceTree = ""; }; - ADC058FB141AF92F2F57775E5611E7EC /* QMCDRecord+VersionInformation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "QMCDRecord+VersionInformation.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+VersionInformation.h"; sourceTree = ""; }; - AF2B9C8E3B8DB48A631838EE36950B33 /* FFCircularProgressView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FFCircularProgressView.m; path = FFCircularProgressView/FFCircularProgressView/FFCircularProgressView.m; sourceTree = ""; }; - AF637C15CD6DACD2375C06103C2B63DF /* QBUUser+CustomData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QBUUser+CustomData.m"; path = "QMUsersService/QMUsersService/Categories/QBUUser+CustomData.m"; sourceTree = ""; }; - AF6A1CAEF2655013788C416DD61F2ED7 /* SAMKeychainQuery.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SAMKeychainQuery.m; path = Sources/SAMKeychainQuery.m; sourceTree = ""; }; - AF7FDD47B2A19B0F41A8454E7209E0BD /* FBSDKLikeObjectType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeObjectType.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeObjectType.h; sourceTree = ""; }; - AF91B474790172A61D5CA15606433BDE /* FBSDKMessageDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKMessageDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKMessageDialog.m; sourceTree = ""; }; - B029C06B3681E06DE3CE97A8B9C309F2 /* ms.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ms.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ms.lproj; sourceTree = ""; }; - B0ED464B8D35EA89510DFC2DB288C436 /* pt-BR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "pt-BR.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt-BR.lproj"; sourceTree = ""; }; - B0F2D18CD49C24A03FD7184F672A53C5 /* QMChatOutgoingLinkPreviewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatOutgoingLinkPreviewCell.xib; path = QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatOutgoingLinkPreviewCell/QMChatOutgoingLinkPreviewCell.xib; sourceTree = ""; }; - B1163F2786CBB14E99FDFAD5CE5FA5A8 /* NYTPhotoViewer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoViewer.h; path = NYTPhotoViewer/NYTPhotoViewer.h; sourceTree = ""; }; - B15E08FFCFC6B8B5C8FF18F94E9FE372 /* QMContactListService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMContactListService.h; path = QMContactListService/QMContactListService/QMContactListService.h; sourceTree = ""; }; - B190506A9CA468EE1C644C6721E0ED30 /* QMAudioRecordButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAudioRecordButton.m; path = QMChatViewController/Views/CustomUI/QMAudioRecordButton/QMAudioRecordButton.m; sourceTree = ""; }; - B19245C79F6ED783C0DDBAA9E5C1B452 /* FirebasePhoneAuthUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebasePhoneAuthUI.framework; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework; sourceTree = ""; }; - B19B4CE3B5F527317F9000F8BACE68A3 /* FBSDKServerConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKServerConfiguration.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKServerConfiguration.m; sourceTree = ""; }; - B1CF3AE8B27E3367F7A7841011311EBE /* hr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hr.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/hr.lproj; sourceTree = ""; }; - B274818CA26AC2C189F1A10888BA1A65 /* FBSDKAppGroupAddDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppGroupAddDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.m; sourceTree = ""; }; - B27FEABD7DE7E55DD2D5630CC433AD7F /* FBSDKShareMessengerMediaTemplateContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareMessengerMediaTemplateContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.m; sourceTree = ""; }; - B28EB0ED22BFE9FED06B2AE5C6829617 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/NSButton+WebCache.m"; sourceTree = ""; }; - B2B269A85EB96A9FFCDC384073043086 /* SDWebImageImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageImageIOCoder.h; path = SDWebImage/SDWebImageImageIOCoder.h; sourceTree = ""; }; - B2BB1D77E80BC8007FB13B129679A061 /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fr.lproj; sourceTree = ""; }; - B30BA46DD430478258E3261E1374BEB2 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "NYTPhotoViewerCloseButtonXLandscape@2x.png"; path = "NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape@2x.png"; sourceTree = ""; }; - B33ADC0EE1C5B9396831FCCCF721C613 /* ResourceBundle-QMOpenGraphCacheModel-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-QMOpenGraphCacheModel-Info.plist"; sourceTree = ""; }; - B36A12CDD2A61682846E88544F6927F9 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreLocation.framework; sourceTree = DEVELOPER_DIR; }; - B3842177259006214FC66D8F39C65E41 /* GTMNSData+zlib.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GTMNSData+zlib.m"; path = "Foundation/GTMNSData+zlib.m"; sourceTree = ""; }; - B3C4909712E24448AB13E9E7E8910FA9 /* FBSDKTriStateBOOL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKTriStateBOOL.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKTriStateBOOL.h; sourceTree = ""; }; - B3E349F9CAD08BC29D38EA663928EA40 /* BFWebViewAppLinkResolver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFWebViewAppLinkResolver.m; path = Bolts/iOS/BFWebViewAppLinkResolver.m; sourceTree = ""; }; - B3F4ABD9B9F0AC534E01D48F7E854569 /* FBSDKShareMessengerMediaTemplateContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareMessengerMediaTemplateContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerMediaTemplateContent.h; sourceTree = ""; }; - B45E8EFA013B3C2AC1B110A375146ED1 /* es-PY.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-PY.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PY.lproj"; sourceTree = ""; }; - B477A027D421D9DD5A53445C01B6FC11 /* QMAudioRecordView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAudioRecordView.m; path = QMChatViewController/Views/CustomUI/QMAudioRecordView/QMAudioRecordView.m; sourceTree = ""; }; - B4C8EE20D4F7A19EFDA779AED1FDDEBF /* QMCDRecord+Options.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "QMCDRecord+Options.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+Options.h"; sourceTree = ""; }; - B4C95BDA2E423F449EE9229706F55654 /* FBSDKShareKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareKit.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareKit.h; sourceTree = ""; }; - B58379B06E15719329B0659DB330DA0A /* FBSDKAppGroupContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppGroupContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.h; sourceTree = ""; }; - B5BE7170665952346CE708A2EF4DB454 /* NYTPhotoViewerCloseButtonXLandscape.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = NYTPhotoViewerCloseButtonXLandscape.png; path = NYTPhotoViewer/NYTPhotoViewer.bundle/NYTPhotoViewerCloseButtonXLandscape.png; sourceTree = ""; }; - B5DDBA9BC7AC149CF8A12739CCD0A6A3 /* FBSDKLikeActionControllerCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeActionControllerCache.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.m; sourceTree = ""; }; - B600C30126BD216711388A10934B56F0 /* QMChatOutgoingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatOutgoingCell.m; path = QMChatViewController/Views/Cells/QMChatOutgoingCell/QMChatOutgoingCell.m; sourceTree = ""; }; - B6075C0B4FDB662B359478AB679EEA3C /* _FBSDKLoginRecoveryAttempter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _FBSDKLoginRecoveryAttempter.m; path = FBSDKLoginKit/FBSDKLoginKit/Internal/_FBSDKLoginRecoveryAttempter.m; sourceTree = ""; }; - B66B0F8377035F8B660617B331D5EAF8 /* Flurry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Flurry.h; path = Flurry/Flurry.h; sourceTree = ""; }; - B686CBF2119B8C835C7EF65885047EDA /* FBSDKLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLogger.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKLogger.h; sourceTree = ""; }; - B7617C3525C04A2422CD47870C26990B /* FBSDKVideoUploader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKVideoUploader.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKVideoUploader.m; sourceTree = ""; }; - B797B7AE022674473553900239EA5B2E /* cs.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = cs.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/cs.lproj; sourceTree = ""; }; - B7B312B0FBDDCAB7F974689328D53CE7 /* es-EC.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-EC.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-EC.lproj"; sourceTree = ""; }; - B7C1D9B2B15F69A441BF07C807C0B4C2 /* es-DO.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-DO.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-DO.lproj"; sourceTree = ""; }; - B8B9A84DA4BB671C5E92592F223298A7 /* FBSDKAccessTokenCacheV3.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessTokenCacheV3.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3.m; sourceTree = ""; }; - B90C6876CA6A860BB25BC6BB5E6AF142 /* QMAttachmentStoreServiceDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAttachmentStoreServiceDelegate.h; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreServiceDelegate.h; sourceTree = ""; }; - B95EF363778B5A9FAAA84402325043DD /* FBSDKAppGroupContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppGroupContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupContent.m; sourceTree = ""; }; - B9CBC7A5169299DB0E492DE3E45894A1 /* CDMessage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CDMessage.m; path = QMChatCache/QMChatCache/CoreData/Entries/CDMessage.m; sourceTree = ""; }; - B9D12EB23F321D04316F99238EE3B448 /* NYTPhotoTransitionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NYTPhotoTransitionController.m; path = NYTPhotoViewer/NYTPhotoTransitionController.m; sourceTree = ""; }; - B9E66D13AD608455F286C178A63C02F8 /* QMToolbarContentView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMToolbarContentView.h; path = QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContentView.h; sourceTree = ""; }; - BA0853D49E08E2FBB1A4A770FD46D659 /* fa.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fa.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fa.lproj; sourceTree = ""; }; - BA2786FCB45F06114D09057957C5E821 /* UIColor+QM.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+QM.m"; path = "QMChatViewController/Categories/UIColor+QM.m"; sourceTree = ""; }; - BA42F7AC1E97F893B3AE7336D017E82F /* FBSDKAccessTokenCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessTokenCache.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCache.m; sourceTree = ""; }; - BA48DA40D3D6E1A4DC7990BE33C8132A /* QMCDRecord+Options.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QMCDRecord+Options.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+Options.m"; sourceTree = ""; }; - BA5486542ED09C8F898C206589294DE5 /* NSManagedObject+QMCDRequests.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSManagedObject+QMCDRequests.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRequests.h"; sourceTree = ""; }; - BA8B97A4E0D7D8B3435DB883EB704FD6 /* Pods-QMShareExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-QMShareExtension.release.xcconfig"; sourceTree = ""; }; - BACD7BDC86D762C18408E43D9CCCD90C /* QBChatAttachment+QMCustomData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "QBChatAttachment+QMCustomData.h"; path = "QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomData.h"; sourceTree = ""; }; - BB260B2455E35BF9A5AE7E60DCA13244 /* QMChatService+Bolts.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QMChatService+Bolts.m"; path = "QMChatService/QMChatService/Bolts/QMChatService+Bolts.m"; sourceTree = ""; }; - BBA56BE1D6A2C0F17806B2B2DB820634 /* FBSDKAppGroupAddDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppGroupAddDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppGroupAddDialog.h; sourceTree = ""; }; - BC46F903C6AAB1F0659EE44EBBA18AE7 /* NSManagedObject+QMCDRecord.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSManagedObject+QMCDRecord.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRecord.h"; sourceTree = ""; }; - BC48EDD13BA4E6D3AE30258BD8F845A9 /* FBSDKInternalUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKInternalUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.h; sourceTree = ""; }; - BC851FE9665A131E38587F26DDA01AB8 /* FlurrySessionBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FlurrySessionBuilder.h; path = Flurry/FlurrySessionBuilder.h; sourceTree = ""; }; - BCA3CEA30100CBAB55354EAB8FF55B35 /* en-GB.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-GB.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-GB.lproj"; sourceTree = ""; }; - BCB5CCA81DCC9ACF1D455F9BDE8B5569 /* FBSDKContainerViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKContainerViewController.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKContainerViewController.h; sourceTree = ""; }; - BCBC80C944FD728441D47B472D2B9423 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = ""; }; - BD05CE6A2BE987267DD6107D4E19BBC0 /* QMCDRecordStack.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMCDRecordStack.m; path = QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecordStack/QMCDRecordStack.m; sourceTree = ""; }; - BD1B6D714E8B9A95D7DC1597C1B95425 /* es-PA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-PA.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PA.lproj"; sourceTree = ""; }; - BD3F72E24305FC863C4B1B89D174651A /* zh-Hant.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "zh-Hant.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/zh-Hant.lproj"; sourceTree = ""; }; - BD856D945F8BCD6714937270EEA47FEB /* FBSDKMath.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMath.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMath.h; sourceTree = ""; }; - BE38C6DE220C4AB47670174D4113CB65 /* QMChatAttachmentIncomingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatAttachmentIncomingCell.h; path = QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.h; sourceTree = ""; }; - BE652D68108EAF0B7956D0B0F0FD2760 /* Reachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = ""; }; - BEAD17E07DAF7BA8E463468B19887933 /* QMUsersCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMUsersCache.h; path = QMUsersCache/QMUsersCache/QMUsersCache.h; sourceTree = ""; }; - BEAEAA5389124BB18CB12F603B97454C /* FBSDKLoginButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLoginButton.m; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginButton.m; sourceTree = ""; }; - BED67B7CA2B86B794BE5CBAD076B5F05 /* es-CL.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-CL.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CL.lproj"; sourceTree = ""; }; - BF2790CED9D0486C1ECE9B657ABC893C /* mr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = mr.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/mr.lproj; sourceTree = ""; }; - BF2A7A1EB60C520E67DCC44F60B47D0E /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; - BFB578BDC5C00F9C43BB69736513D505 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en.lproj; sourceTree = ""; }; - BFB75EC2FD5EE824A110AB3CCB76313B /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = ""; }; - BFCC09138971E3778F69E3B6F7948BA9 /* QMServicesManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMServicesManager.h; path = QMManagers/QMServicesManager.h; sourceTree = ""; }; - C0C438F63254C0AD2151AEDAB0AC80FD /* NYTPhotoTransitionAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NYTPhotoTransitionAnimator.m; path = NYTPhotoViewer/NYTPhotoTransitionAnimator.m; sourceTree = ""; }; - C0D8735F327235ADF90979C4902A64D1 /* FBSDKLoginKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSDKLoginKit.xcconfig; sourceTree = ""; }; - C0E0DD88A0D6413B1E90135A3BB0236A /* QMVideoOutgoingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMVideoOutgoingCell.h; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoOutgoingCell/QMVideoOutgoingCell.h; sourceTree = ""; }; - C0E8E1CF4C545D6FDC56A4F3902EFCFB /* es-UY.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-UY.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-UY.lproj"; sourceTree = ""; }; - C1119395340BC7D42B0AEB4C40F6D17E /* hi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hi.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hi.lproj; sourceTree = ""; }; - C120840F754FD30907143B9C16AE9914 /* FBSDKShareUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareUtility.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareUtility.m; sourceTree = ""; }; - C1504D35BA74702F155EBC90D76EEF3E /* CDAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CDAttachment.h; path = QMChatCache/QMChatCache/CoreData/Entries/CDAttachment.h; sourceTree = ""; }; - C165906809A74E5EACEDE86AAEEF073E /* BFAppLink.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFAppLink.h; path = Bolts/iOS/BFAppLink.h; sourceTree = ""; }; - C22BA56B86E4AB037BC1C1FDD795247D /* NYTPhotoViewerSinglePhotoDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoViewerSinglePhotoDataSource.h; path = NYTPhotoViewer/NYTPhotoViewerSinglePhotoDataSource.h; sourceTree = ""; }; - C259B374368E1FC66A892888422DA16A /* BFCancellationTokenSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationTokenSource.m; path = Bolts/Common/BFCancellationTokenSource.m; sourceTree = ""; }; - C25E8F882DD681F894034D1F2C53AFCB /* BFCancellationTokenRegistration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationTokenRegistration.m; path = Bolts/Common/BFCancellationTokenRegistration.m; sourceTree = ""; }; - C297F40654448F01A05FA65B6241C43D /* de-CH.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "de-CH.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/de-CH.lproj"; sourceTree = ""; }; - C2C8143F1A6A58F85FB0CEC781C9BB18 /* FBSDKGraphRequestBody.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequestBody.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestBody.h; sourceTree = ""; }; - C2CFA879BBD41C564B39D8B46D3924E0 /* es-SV.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-SV.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-SV.lproj"; sourceTree = ""; }; - C344810E5519B30BE90D8587E206C42F /* NYTPhotoTransitionAnimator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoTransitionAnimator.h; path = NYTPhotoViewer/NYTPhotoTransitionAnimator.h; sourceTree = ""; }; - C367B9AB92927F506AE895E19CB48111 /* ResourceBundle-QMChatViewController-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-QMChatViewController-Info.plist"; sourceTree = ""; }; - C3A0B20DD01288E49CCBF7F2565C892D /* QMServices.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMServices.h; path = QMServices/QMServices.h; sourceTree = ""; }; - C3FC244C5A5F171845825CC15794216E /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = ""; }; - C40565BC3BD2FEF6826E812AEC99060D /* FBSDKGraphRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequest.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequest.m; sourceTree = ""; }; - C4281ACFF61A53F2D27608351C781174 /* QMHeaderCollectionReusableView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMHeaderCollectionReusableView.m; path = QMChatViewController/Views/CustomUI/QMHeaderCollectionReusableView/QMHeaderCollectionReusableView.m; sourceTree = ""; }; - C42D7345B75C0B52AB0CC22B956E6C1E /* QMChatAttachmentService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatAttachmentService.h; path = QMChatService/QMChatService/QMAttachmentService/QMChatAttachmentService.h; sourceTree = ""; }; - C4492923DE06654D3A8F851F37C513B9 /* QMContactListCacheModel.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = QMContactListCacheModel.bundle; path = "QMServicesDevelopment-QMContactListCacheModel.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; - C4514BF1C9C3B4F03449FAC87DB9AA89 /* FirebaseAnalytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseAnalytics.framework; path = Frameworks/FirebaseAnalytics.framework; sourceTree = ""; }; - C4A8B6E60636D3002973A6F34E834B98 /* FBSDKGraphRequestDataAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequestDataAttachment.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.m; sourceTree = ""; }; - C4AD55D8165DB77B8E8CB1115E603499 /* QMDialogsMemoryStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMDialogsMemoryStorage.h; path = QMChatService/QMChatService/QMDialogsMemoryStorage/QMDialogsMemoryStorage.h; sourceTree = ""; }; - C55D7318BA5BE50B86CD8603FBEEB3D3 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; - C581322B4B20F1A8347F609CBA88E20A /* FBSDKButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKButton.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKButton.h; sourceTree = ""; }; - C5C84DA30E89C9810D552FBEA4475A03 /* QMDeferredQueueMemoryStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMDeferredQueueMemoryStorage.m; path = QMManagers/QMDeferredQueueMemoryStorage.m; sourceTree = ""; }; - C69B08D399562AABC1C1585CD51832D8 /* GTMSessionFetcherLogging.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionFetcherLogging.m; path = Source/GTMSessionFetcherLogging.m; sourceTree = ""; }; - C713B40D37C0E105DEA3026C3BC75817 /* FBSDKErrorConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKErrorConfiguration.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKErrorConfiguration.h; sourceTree = ""; }; - C734141F2019BFF2CBCE3DB9EBE3480E /* FBSDKViewImpressionTracker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKViewImpressionTracker.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKViewImpressionTracker.m; sourceTree = ""; }; - C76BE333439B97D2829C26CC294234E2 /* QMChatOutgoingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatOutgoingCell.xib; path = QMChatViewController/Views/Cells/QMChatOutgoingCell/QMChatOutgoingCell.xib; sourceTree = ""; }; - C782365BE089A591160CF53CB0F3421E /* FBSDKShareMessengerGenericTemplateContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareMessengerGenericTemplateContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.m; sourceTree = ""; }; - C7FB087EE134DCD74D89969C8B862019 /* FUICountryTableViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUICountryTableViewController.nib; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUICountryTableViewController.nib; sourceTree = ""; }; - C81218AD37A38068AA0C578DD52DF5BD /* NYTPhoto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhoto.h; path = NYTPhotoViewer/Protocols/NYTPhoto.h; sourceTree = ""; }; - C826EDB1D05D26CD19B44D310BF58A81 /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pl.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pl.lproj; sourceTree = ""; }; - C8794E8722D151ABB99B4E705411FE3E /* FBSDKLikeControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeControl.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKLikeControl.h; sourceTree = ""; }; - C8C62D7F21D95C1B8E3BC3A73AA496CF /* FBSDKDialogConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKDialogConfiguration.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.h; sourceTree = ""; }; - C93AB266838A3512A0329AD99EF85830 /* CDDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CDDialog.m; path = QMChatCache/QMChatCache/CoreData/Entries/CDDialog.m; sourceTree = ""; }; - C971B1513487337794CB0F0D87780D30 /* FLAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImage.h; path = FLAnimatedImage/FLAnimatedImage.h; sourceTree = ""; }; - C9C8E65083DB4FD6BDB56A6133D12C8F /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; - C9D0E7B1C95FF0E4CB51FFE85F8AFDCB /* CDContactListItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CDContactListItem.h; path = QMContactListCache/QMContactListCache/CoreData/Entries/CDContactListItem.h; sourceTree = ""; }; - C9F42D01E81A2973F68DB39B2F1600A5 /* es-PE.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-PE.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PE.lproj"; sourceTree = ""; }; - C9FD577CF6752046393D39C9F10AE63F /* QMChatTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatTypes.h; path = QMChatService/QMChatService/QMChatTypes.h; sourceTree = ""; }; - CA08E01719AAC774A01538CAB7A1B449 /* FBSDKSettings.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSettings.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKSettings.h; sourceTree = ""; }; - CA12F332446D556D1328C459BEC15AC0 /* FBSDKDialogConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKDialogConfiguration.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/ServerConfiguration/FBSDKDialogConfiguration.m; sourceTree = ""; }; - CA4758ACD1C36A267D8402AEC966A9F3 /* _CDMessage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _CDMessage.m; path = QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDMessage.m; sourceTree = ""; }; - CA58ED5C19E5F3F40061384B75ACD200 /* QMCVDevelopment-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "QMCVDevelopment-prefix.pch"; sourceTree = ""; }; - CA7B7C9CB0D4F98C3A14A4AC3AB97B44 /* QMMediaIncomingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMMediaIncomingCell.h; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaIncomingCell/QMMediaIncomingCell.h; sourceTree = ""; }; - CA9040C299AB0C8FE901BAFB27589A26 /* FBSDKShareOpenGraphContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareOpenGraphContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphContent.h; sourceTree = ""; }; - CAA03ECF9FE11C0F230CEEB1CEB71591 /* Pods-QMSiriExtension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-QMSiriExtension-dummy.m"; sourceTree = ""; }; - CAA3970509B00EF4178CFC00D5C4BB91 /* FlurryEmpty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FlurryEmpty.m; path = Flurry/FlurryEmpty.m; sourceTree = ""; }; - CAFCEC73586253D59E882180008A44AB /* BFMeasurementEvent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFMeasurementEvent.h; path = Bolts/iOS/BFMeasurementEvent.h; sourceTree = ""; }; - CB64F9A7C3075D2CD905607868BCA222 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; - CC1BF1A897EE88B1F81D3890E6E5A96F /* FBSDKShareError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareError.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareError.h; sourceTree = ""; }; - CC34E7D012444087332A61118EDD62D6 /* FBSDKAccessTokenCacheV3_17.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCacheV3_17.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.h; sourceTree = ""; }; - CC41888A8BE9DA14B959E7D4CC0FE546 /* BFAppLink.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFAppLink.m; path = Bolts/iOS/BFAppLink.m; sourceTree = ""; }; - CC98EDEA80261D9C6B40902413C60DB0 /* FBSDKDynamicFrameworkLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKDynamicFrameworkLoader.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal_NoARC/FBSDKDynamicFrameworkLoader.m; sourceTree = ""; }; - CCE21F12D99AB0FD1ED6C15819452E1C /* FBSDKAppInviteDialog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppInviteDialog.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.m; sourceTree = ""; }; - CCE9BDF35B7BC9F96EDC8AE020630374 /* QMAttachmentsMemoryStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAttachmentsMemoryStorage.h; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentsMemoryStorage/QMAttachmentsMemoryStorage.h; sourceTree = ""; }; - CD547AA79598002F54A2C59FD241D265 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = ""; }; - CD6348B159A9A73E6424FC8316E86F3C /* FBSDKSystemAccountStoreAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSystemAccountStoreAdapter.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKSystemAccountStoreAdapter.h; sourceTree = ""; }; - CD6FCFE5E8D5EB3CE81A9EAC86CA794E /* SDWebImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCodersManager.h; path = SDWebImage/SDWebImageCodersManager.h; sourceTree = ""; }; - CD85000A4762E3BF7BCA4D04C68680EF /* es-UY.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-UY.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-UY.lproj"; sourceTree = ""; }; - CDA70F5557B015B703D106BEEC15949A /* NSPersistentStoreCoordinator+QMCDRecord.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSPersistentStoreCoordinator+QMCDRecord.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStoreCoordinator/NSPersistentStoreCoordinator+QMCDRecord.h"; sourceTree = ""; }; - CDB319DABDE7C42F6505B39CA8EB2812 /* FirebasePhoneAuthUI.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = FirebasePhoneAuthUI.bundle; path = "FirebaseUI-FirebasePhoneAuthUI.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; - CDF242ED4E5F4F2F93062061E4673788 /* NSBundle+NYTPhotoViewer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+NYTPhotoViewer.m"; path = "NYTPhotoViewer/Resource Loading/NSBundle+NYTPhotoViewer.m"; sourceTree = ""; }; - CE0DE1AF13C417D1AE8F69C3AFADC7A3 /* QMImageIncomingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMImageIncomingCell.m; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.m; sourceTree = ""; }; - CE2DB781A51E7357878475580BE1ADF1 /* GTMSessionFetcherLogging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcherLogging.h; path = Source/GTMSessionFetcherLogging.h; sourceTree = ""; }; - CEBB70A8DC105E7DF82C58AE9BBCC039 /* FBSDKUIUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKUIUtility.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKUIUtility.h; sourceTree = ""; }; - CED73B5526A96CB440DDD90EFBF75D89 /* NSDate+ChatDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDate+ChatDataSource.h"; path = "QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.h"; sourceTree = ""; }; - CEE3A74404D39FFEDFE81C58C2A63D06 /* QMImageLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMImageLoader.m; path = QMChatViewController/Utils/QMImageLoader/QMImageLoader.m; sourceTree = ""; }; - CEE4F66907207C82AE778198805F3685 /* QMChatService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatService.m; path = QMChatService/QMChatService/QMChatService.m; sourceTree = ""; }; - CF027E2FF44990914055185E25ECEC58 /* QMChatCellLayoutAttributes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatCellLayoutAttributes.m; path = QMChatViewController/Views/CollectionView/Layout/QMChatCellLayoutAttributes.m; sourceTree = ""; }; - CF22269C23D26C052CE8FF0743C7A549 /* QMServicesManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMServicesManager.m; path = QMManagers/QMServicesManager.m; sourceTree = ""; }; - CF55DAD512ACEDB4664A6549374E4FE7 /* NSManagedObjectContext+QMCDObserving.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObjectContext+QMCDObserving.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDObserving.m"; sourceTree = ""; }; - CFF68CC76E6B31BFD707C78EE48D810D /* FBSDKBridgeAPIResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPIResponse.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/FBSDKBridgeAPIResponse.m; sourceTree = ""; }; - D01803EE5338ED3E8A9482B695FEC5B2 /* FLAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLAnimatedImageView.h; path = FLAnimatedImage/FLAnimatedImageView.h; sourceTree = ""; }; - D01B7B8345D9DBE58CDA9D2D2DCDCFB4 /* FBSDKLikeButton+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKLikeButton+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButton+Internal.h"; sourceTree = ""; }; - D0344C9CACE3BAD71627ED84C722AB26 /* FBSDKMonotonicTime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKMonotonicTime.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.m; sourceTree = ""; }; - D069F3495F04DE6723639DEA494A9D40 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; }; - D0A39D6F05FAAD1BFAAB9A5EE233F01E /* BFAppLinkNavigation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFAppLinkNavigation.m; path = Bolts/iOS/BFAppLinkNavigation.m; sourceTree = ""; }; - D0D89469DC6519B455A40EF78F86973D /* FBSDKShareMessengerContentUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareMessengerContentUtility.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareMessengerContentUtility.h; sourceTree = ""; }; - D0E6981F1A3F410359835A8055C50BFF /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; - D0EF27553477298E58A581AAB6E1D540 /* en-CA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-CA.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/en-CA.lproj"; sourceTree = ""; }; - D1560A5FA3831D2BBA697C170241FC4E /* FLAnimatedImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FLAnimatedImage-dummy.m"; sourceTree = ""; }; - D18F493BB48DC4716C42613D736BBC1E /* QMChatNotificationCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatNotificationCell.h; path = QMChatViewController/Views/Cells/QMChatNotificationCell/QMChatNotificationCell.h; sourceTree = ""; }; - D19FE341DC039EF832BC42319F8FD7AE /* libFBSDKLoginKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libFBSDKLoginKit.a; path = libFBSDKLoginKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; - D203D3D75D0B9C7736ED22748587F6A3 /* FBSDKCrypto.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKCrypto.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Cryptography/FBSDKCrypto.m; sourceTree = ""; }; - D232A18EFB50EC2EB46C7B7EF4EA7EB2 /* FBSDKApplicationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKApplicationDelegate.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.h; sourceTree = ""; }; - D2D55D7D48F8784AA5618975FD617586 /* FBSDKShareOpenGraphValueContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareOpenGraphValueContainer.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphValueContainer.h; sourceTree = ""; }; - D2E177A4CAE136F54EA4E0BDEAA5890E /* SDWebImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageGIFCoder.m; path = SDWebImage/SDWebImageGIFCoder.m; sourceTree = ""; }; - D347A4810417C5DC40E80E20374495DA /* QMToolbarContentView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMToolbarContentView.xib; path = QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContentView.xib; sourceTree = ""; }; - D36D6EE8B7FA973FFC8F720387556BD6 /* FBSDKProfile+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKProfile+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKProfile+Internal.h"; sourceTree = ""; }; - D42902B724543F2E4DAE54383181A71E /* QMContactListModelIncludes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMContactListModelIncludes.h; path = QMContactListCache/QMContactListCache/CoreData/QMContactListModelIncludes.h; sourceTree = ""; }; - D44A4B8373DFF377FF67D6EAFA64AF40 /* QMChatAttachmentOutgoingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatAttachmentOutgoingCell.xib; path = QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.xib; sourceTree = ""; }; - D4A5D4608F913AD1C6570A4870302FC4 /* FBSDKShareLinkContent+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKShareLinkContent+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareLinkContent+Internal.h"; sourceTree = ""; }; - D5E359A89CB6F2C5F5911C014E897ADF /* QMTimeOut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMTimeOut.h; path = QMChatService/QMChatService/QMAttachmentService/QMTimeOut/QMTimeOut.h; sourceTree = ""; }; - D5F9264AB1B23720D7F6D7D9C995C29D /* FBSDKBridgeAPIProtocolNativeV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBridgeAPIProtocolNativeV1.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.h; sourceTree = ""; }; - D651FF519443B555C09905CBF2B18D35 /* NSManagedObjectModel+QMCDRecord.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSManagedObjectModel+QMCDRecord.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectModel+QMCDRecord.h"; sourceTree = ""; }; - D6567809D1DD1A1D2DDBA77385BDE409 /* FBSDKApplicationDelegate+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKApplicationDelegate+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKApplicationDelegate+Internal.h"; sourceTree = ""; }; - D69EB536BF026F24113CE14068F6EB99 /* QMUsersService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMUsersService.h; path = QMUsersService/QMUsersService/QMUsersService.h; sourceTree = ""; }; - D734D0AA9EA8F93B08BC80CF33263D5F /* QMDialogsMemoryStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMDialogsMemoryStorage.m; path = QMChatService/QMChatService/QMDialogsMemoryStorage/QMDialogsMemoryStorage.m; sourceTree = ""; }; - D773F44D8CEABFB3FE06EDC01987DEF3 /* FBSDKKeychainStoreViaBundleID.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKKeychainStoreViaBundleID.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStoreViaBundleID.m; sourceTree = ""; }; - D77CFA7286BF1660772457D3B56968CF /* FUICodeField.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUICodeField.nib; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/FUICodeField.nib; sourceTree = ""; }; - D78D96582009F9715BF5C42671D85AA7 /* FBSDKAudioResourceLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAudioResourceLoader.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.m; sourceTree = ""; }; - D795F3842D180446232C170E22BE1DD7 /* fr-CH.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "fr-CH.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fr-CH.lproj"; sourceTree = ""; }; - D7ADC322AF20F3AF63DEA494D8F45020 /* QMServiceManagerProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMServiceManagerProtocol.h; path = QMBaseService/QMBaseService/QMServiceManagerProtocol.h; sourceTree = ""; }; - D7CB2B14A1847A9702F1E9A4B24F2BD8 /* FBSDKLikeActionControllerCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeActionControllerCache.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeActionControllerCache.h; sourceTree = ""; }; - D819641F04355BD72CC75858942F4E0E /* FUIAuthPickerViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIAuthPickerViewController.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAuthPickerViewController.nib; sourceTree = ""; }; - D83CD87545847FCFE8B599C110D2CA61 /* en-CA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-CA.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-CA.lproj"; sourceTree = ""; }; - D85F56002D110E77304C14A0B3D10DD8 /* QMImageLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMImageLoader.h; path = QMChatViewController/Utils/QMImageLoader/QMImageLoader.h; sourceTree = ""; }; - D879FD07C9A8D90452D95C6A1FACE0D5 /* Bolts-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Bolts-dummy.m"; sourceTree = ""; }; - D884F7BD122E75D4BA1E605E9B276B8A /* QMServices.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMServices.m; path = QMServices/QMServices.m; sourceTree = ""; }; - D888F2263C29B53454E55D3F0A4E0FF0 /* FBSDKMonotonicTime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMonotonicTime.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKMonotonicTime.h; sourceTree = ""; }; - D8DDD2E2A5DB17074720BDAE0AAA7B2C /* FBSDKAppLinkUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppLinkUtility.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAppLinkUtility.m; sourceTree = ""; }; - D8F2CF24507A1C3E23326A71A1E16A70 /* FBSDKGraphRequestDataAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKGraphRequestDataAttachment.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKGraphRequestDataAttachment.h; sourceTree = ""; }; - D91544FF70B6A4903BD91AD1F3E9A26E /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; - D96720D6317B3A4095A8BC3B7093E97E /* FBSDKShareMediaContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareMediaContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMediaContent.m; sourceTree = ""; }; - DA1041AF93130899465E3B873FDAB271 /* uk.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = uk.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/uk.lproj; sourceTree = ""; }; - DA134C2686012652233FBCEF289AFA1B /* FBSDKLoginKit+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKLoginKit+Internal.h"; path = "FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginKit+Internal.h"; sourceTree = ""; }; - DA3557F6CD1973A9BF96E0DCEC179F94 /* FBSDKGraphRequestConnection+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKGraphRequestConnection+Internal.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestConnection+Internal.h"; sourceTree = ""; }; - DA99AEADC8E6F55D1F9275E98B16B128 /* UIDevice-Hardware-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIDevice-Hardware-dummy.m"; sourceTree = ""; }; - DABC517BFE092CEEF189650039707D6C /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - DAEED0C612898D8D53CD1ACBB12BF642 /* es-CO.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-CO.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CO.lproj"; sourceTree = ""; }; - DBB3F2CA5EDBAC34D1AB024D88FE89A9 /* QMAudioIncomingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMAudioIncomingCell.xib; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioIncomingCell/QMAudioIncomingCell.xib; sourceTree = ""; }; - DBD693DE1754131E30423F8FD72FFC30 /* nanopb-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "nanopb-dummy.m"; sourceTree = ""; }; - DC078FAD2A8120DF47525C4860A3222B /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - DC1139B19603A28570F8B4EE887445D8 /* BFCancellationToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationToken.h; path = Bolts/Common/BFCancellationToken.h; sourceTree = ""; }; - DCE60203ECFAD7051D11A0987E884007 /* UIImageView+QMLocationSnapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+QMLocationSnapshot.h"; path = "QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.h"; sourceTree = ""; }; - DD0313B5B8EF91279B48B3C83DF59C46 /* FBSDKShareKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSDKShareKit.xcconfig; sourceTree = ""; }; - DD2956E91B8A4356BBB8321384E684F8 /* FBSDKShareLinkContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareLinkContent.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareLinkContent.m; sourceTree = ""; }; - DD60D06BB6D2460F97E88C5ED083D6EC /* FUIAccountSettingsViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIAccountSettingsViewController.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAccountSettingsViewController.nib; sourceTree = ""; }; - DD96811E177616B529D37BB71CE9C392 /* id.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = id.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/id.lproj; sourceTree = ""; }; - DE4384F0EE9CB1DBC4103BBE82FE0C9A /* FBSDKMaleSilhouetteIcon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKMaleSilhouetteIcon.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKMaleSilhouetteIcon.m; sourceTree = ""; }; - DE7E8EF61D7BEBC5017652DC8DFE2227 /* libTTTAttributedLabel.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libTTTAttributedLabel.a; path = libTTTAttributedLabel.a; sourceTree = BUILT_PRODUCTS_DIR; }; - DE83A557BE5BFA0AF691D389A9BD4601 /* he.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = he.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/he.lproj; sourceTree = ""; }; - DEB9736DFDF6E9649DE412138998B91F /* QMChatAttachmentIncomingCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMChatAttachmentIncomingCell.xib; path = QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.xib; sourceTree = ""; }; - DEE5348EDFE400958ADC808C2AF5715C /* Fabric.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Fabric.framework; path = iOS/Fabric.framework; sourceTree = ""; }; - DF0D6A0BC96D580C5E94F26047E6259D /* lv.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = lv.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/lv.lproj; sourceTree = ""; }; - DF8A6C68974A1DE0DDE95FD2AA38A06D /* GTMDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = GTMDefines.h; sourceTree = ""; }; - DFA44B46A5E918D4047B4FB7CC9920ED /* FBSDKMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKMacros.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKMacros.h; sourceTree = ""; }; - DFCB99637ED9CC1BEC5BF43532A310C8 /* es-DO.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-DO.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-DO.lproj"; sourceTree = ""; }; - DFE869254AC13DEF86ED0E1199A1B2BA /* Pods-QMShareExtension-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-QMShareExtension-resources.sh"; sourceTree = ""; }; - E007CC53E6319489F35272DF3081A77C /* FBSDKTimeSpentData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKTimeSpentData.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKTimeSpentData.m; sourceTree = ""; }; - E0876E249BC4D8A205D4DC6479858EC2 /* QMAttachmentContentService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAttachmentContentService.h; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMAttachmentContentService.h; sourceTree = ""; }; - E0E7991DB50CAA2A1607953A62C51099 /* QMChatCollectionViewDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatCollectionViewDataSource.h; path = QMChatViewController/Protocols/QMChatCollectionViewDataSource.h; sourceTree = ""; }; - E1124D0714F341FAA37E5F1EF98BC4AB /* CDContactListItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CDContactListItem.m; path = QMContactListCache/QMContactListCache/CoreData/Entries/CDContactListItem.m; sourceTree = ""; }; - E1418F0D5F0246BF9AC00EA7E13A602D /* ca.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ca.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/ca.lproj; sourceTree = ""; }; - E14D309AE9DB8E370583DF39EEF2DC2E /* FBSDKAccessTokenCacheV3_17.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAccessTokenCacheV3_17.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_17.m; sourceTree = ""; }; - E15DCBDF02CE68C932855EA4427E1D60 /* QMUsersMemoryStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMUsersMemoryStorage.m; path = QMUsersService/QMUsersService/QMUsersMemoryStorage/QMUsersMemoryStorage.m; sourceTree = ""; }; - E16CB789617BA9E146BACC17C4523295 /* GTMSessionFetcher.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GTMSessionFetcher.xcconfig; sourceTree = ""; }; - E18CE1384D97512C2309AA2F7285DD07 /* QMAudioRecordView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = QMAudioRecordView.xib; path = QMChatViewController/Views/CustomUI/QMAudioRecordView/QMAudioRecordView.xib; sourceTree = ""; }; - E1FD3DFF85D828F1B8BB6C20C807574A /* UIColor+iOS7.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+iOS7.m"; path = "FFCircularProgressView/FFCircularProgressView/UIColor+iOS7.m"; sourceTree = ""; }; - E209B8E253D16A436E4B9D4B48020F20 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; - E2281148E32732F05A250CA1D041B1AB /* QMProgressView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMProgressView.m; path = QMChatViewController/Views/CustomUI/QMProgressView/QMProgressView.m; sourceTree = ""; }; - E25B0FDA8817591CA826DE8B70D367F0 /* FBSDKAccessTokenCacheV3_21.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessTokenCacheV3_21.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKAccessTokenCacheV3_21.h; sourceTree = ""; }; - E27B5BE20DBD31E198FFD7F47DC14B2D /* TTTAttributedLabel.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TTTAttributedLabel.xcconfig; sourceTree = ""; }; - E282485F093FA06646FEC35A9194C986 /* FBSDKURLConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKURLConnection.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLConnection.m; sourceTree = ""; }; - E28BDBCA3CD5C555E5A06557DB0E5DF5 /* libPods-Q-municate.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-Q-municate.a"; path = "libPods-Q-municate.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - E2F89E5A94CF097E03DFBA2E579BE14D /* pt-PT.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "pt-PT.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt-PT.lproj"; sourceTree = ""; }; - E3149B0ECD4A782BE43812322E0BDC12 /* TTTAttributedLabel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TTTAttributedLabel.m; path = TTTAttributedLabel/TTTAttributedLabel.m; sourceTree = ""; }; - E32B52F39C7F274638F02698FA9E4526 /* NYTPhotoCaptionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NYTPhotoCaptionView.m; path = NYTPhotoViewer/NYTPhotoCaptionView.m; sourceTree = ""; }; - E40CB1F100CBABD36082CC83C21ED7C3 /* FBSDKCoreKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSDKCoreKit-prefix.pch"; sourceTree = ""; }; - E45AC1AC2A7F9B103BE98C62610E8E87 /* QMDeferredQueueManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMDeferredQueueManager.h; path = QMManagers/QMDeferredQueueManager.h; sourceTree = ""; }; - E472AB0283AF4B8C059B67CADE96FC50 /* SAMKeychain.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SAMKeychain.bundle; path = Support/SAMKeychain.bundle; sourceTree = ""; }; - E5B9AA543D4E180ED719F42D9C1DF0B7 /* GTMNSData+zlib.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GTMNSData+zlib.h"; path = "Foundation/GTMNSData+zlib.h"; sourceTree = ""; }; - E5C0E8A8D78590FA3C9CA2E5E6145426 /* FBSDKAppEventsState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKAppEventsState.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/FBSDKAppEventsState.m; sourceTree = ""; }; - E61F026F7C0E548275FF388A259E6012 /* FBSDKSharing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSharing.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSharing.h; sourceTree = ""; }; - E6291182DE3FFB3C0BF1A25B5CA5FBCA /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; - E63E98949FB0CEE541C5E6F893C975EC /* NYTPhotoViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NYTPhotoViewController.m; path = NYTPhotoViewer/NYTPhotoViewController.m; sourceTree = ""; }; - E6C89F11B8338CACCC27234705480843 /* FBSDKBase64.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKBase64.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Base64/FBSDKBase64.h; sourceTree = ""; }; - E6EB9F0793269C0E68C65433BEBB4E2C /* QMBaseService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMBaseService.m; path = QMBaseService/QMBaseService/QMBaseService.m; sourceTree = ""; }; - E75595A921364B3816AD050BAD1E53E5 /* NSArray+QMCDRecord.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+QMCDRecord.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSArray+QMCDRecord.m"; sourceTree = ""; }; - E75A2835AF620D82367451B4333E100F /* FBSDKShareMessengerGenericTemplateContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareMessengerGenericTemplateContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareMessengerGenericTemplateContent.h; sourceTree = ""; }; - E7C501DF46E37169339F5FF6593AFFB4 /* QMAttachmentsMemoryStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAttachmentsMemoryStorage.m; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentsMemoryStorage/QMAttachmentsMemoryStorage.m; sourceTree = ""; }; - E7F36E5755C513B17E379CE28C92D265 /* bn.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = bn.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/bn.lproj; sourceTree = ""; }; - E80467654216AB5F099025873D349FE3 /* hu.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hu.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/hu.lproj; sourceTree = ""; }; - E80AAFDF8374B02B046EDB6F347E8137 /* FBSDKShareOpenGraphValueContainer+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKShareOpenGraphValueContainer+Internal.h"; path = "FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareOpenGraphValueContainer+Internal.h"; sourceTree = ""; }; - E829F7BD64C8F76BEDF98A6CEAE0D55F /* QMOpenGraphModelIncludes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMOpenGraphModelIncludes.h; path = QMOpenGraphCache/QMOpenGraphCache/CoreData/QMOpenGraphModelIncludes.h; sourceTree = ""; }; - E87582B826BB6B2B06E8BDDEAEA1AF57 /* uk.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = uk.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/uk.lproj; sourceTree = ""; }; - E8936CD86933DAAE5899F36E42919461 /* FBSDKIcon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKIcon.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKIcon.h; sourceTree = ""; }; - E8CFD3B7A2770EC269703A017FD24750 /* es-CR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-CR.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-CR.lproj"; sourceTree = ""; }; - E8E41E614A25A7A3DFF7446AD335FC96 /* ic_visibility.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = ic_visibility.png; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/ic_visibility.png; sourceTree = ""; }; - E912FB8C12DDC129C07AED6A346DC3A5 /* FBSDKBridgeAPIProtocolNativeV1.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKBridgeAPIProtocolNativeV1.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/BridgeAPI/ProtocolVersions/FBSDKBridgeAPIProtocolNativeV1.m; sourceTree = ""; }; - E96A0B44FEE8657931A3D71C00946BB4 /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = ""; }; - E979782FC939D39B9E5227FA67FD5F0D /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = de.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/de.lproj; sourceTree = ""; }; - E9DDA624B4D4CBA73468014BD55527E3 /* MicOverlay@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "MicOverlay@3x.png"; path = "QMChatViewController/Icons/MicOverlay@3x.png"; sourceTree = ""; }; - E9EE0F66606FAAFEA8343084EF925909 /* libPods-QMSiriExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-QMSiriExtension.a"; path = "libPods-QMSiriExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - E9F947F5AF24470A6F64885B134F2D83 /* NYTPhotoDismissalInteractionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoDismissalInteractionController.h; path = NYTPhotoViewer/NYTPhotoDismissalInteractionController.h; sourceTree = ""; }; - EA1AAB9388272A9601FA37610FD4169F /* QMBaseChatLocationCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMBaseChatLocationCell.m; path = QMChatViewController/Views/Cells/QMChatLocationCell/QMBaseChatLocationCell.m; sourceTree = ""; }; - EA4272F8265796E736AAD288790D1CA1 /* FBSDKLoginCompletion+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKLoginCompletion+Internal.h"; path = "FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginCompletion+Internal.h"; sourceTree = ""; }; - EAA448B342DC8D2DB274C60B2426B47C /* QMChatLocationOutgoingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMChatLocationOutgoingCell.m; path = QMChatViewController/Views/Cells/QMChatLocationOutgoingCell/QMChatLocationOutgoingCell.m; sourceTree = ""; }; - EADE13C59CE6B770AD11C434965C1A9A /* FBSDKURLSessionTask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKURLSessionTask.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKURLSessionTask.h; sourceTree = ""; }; - EAEF28FAA8E49DBC59C45F508E1332D9 /* QMAudioOutgoingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAudioOutgoingCell.m; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioOutgoingCell/QMAudioOutgoingCell.m; sourceTree = ""; }; - EB085FBF6157883D7405D01AD6B8511C /* QBChatAttachment+QMFactory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "QBChatAttachment+QMFactory.m"; path = "QMChatService/QMChatService/Categories/QBChatAttachment+QMFactory.m"; sourceTree = ""; }; - EB15A38110FF7DF1F99A4CBCA4DAC9AC /* FBSDKTooltipView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKTooltipView.h; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKTooltipView.h; sourceTree = ""; }; - EB271C553105289698C47C9CF5C224BD /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; - EB66C45475D340FDA543C23E755D122D /* QMCDRecord.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMCDRecord.h; path = QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord.h; sourceTree = ""; }; - EB686956C568FA72907F1AFA4AC7CDE5 /* FBSDKShareAPI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareAPI.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareAPI.m; sourceTree = ""; }; - EB78720C26526E4DD6046D25624213F5 /* country-codes.json */ = {isa = PBXFileReference; includeInIndex = 1; name = "country-codes.json"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/country-codes.json"; sourceTree = ""; }; - EB9ABF4E3F601C527114264D27919AC2 /* TTTAttributedLabel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TTTAttributedLabel-dummy.m"; sourceTree = ""; }; - EBA2CCCB1903C4680917EB15D07B52C9 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; - EC194804088AA8081C03E24131F54E2E /* Bolts.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Bolts.h; path = Bolts/Common/Bolts.h; sourceTree = ""; }; - EC197E55D9592E31472CF14B4B386F3C /* FBSDKShareConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareConstants.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareConstants.h; sourceTree = ""; }; - EC1FC5BF904216D72FFDA1F7B2764955 /* GTMDebugThreadValidation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMDebugThreadValidation.h; path = DebugUtils/GTMDebugThreadValidation.h; sourceTree = ""; }; - EC3998AFB6759B3387B0B44CE174BD03 /* CLSLogging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CLSLogging.h; path = iOS/Crashlytics.framework/Headers/CLSLogging.h; sourceTree = ""; }; - EC5EC269AC7116CD63805F89F8B85EF9 /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pl.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pl.lproj; sourceTree = ""; }; - EC80323AA90D7D04E0FFD709CC44537D /* BFURL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFURL.m; path = Bolts/iOS/BFURL.m; sourceTree = ""; }; - EC8EBF79BFC52516212602FC209A853C /* FBSDKShareOpenGraphAction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKShareOpenGraphAction.m; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareOpenGraphAction.m; sourceTree = ""; }; - ECD8A3D627396A4AF16FC0386EF61A1E /* UIColor+QM.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+QM.h"; path = "QMChatViewController/Categories/UIColor+QM.h"; sourceTree = ""; }; - ED0986CB8FE1902FA9E7F5EC65420342 /* libSDWebImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSDWebImage.a; path = libSDWebImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; - ED2E89FC14F07885B607452ACEB9E664 /* Fabric.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Fabric.h; path = iOS/Fabric.framework/Headers/Fabric.h; sourceTree = ""; }; - ED57CF8FD546F4CDFCA742286FBB589F /* en-IE.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "en-IE.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/en-IE.lproj"; sourceTree = ""; }; - ED706A8880ABB0AA5A42FDD55862C669 /* QMMediaOutgoingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMMediaOutgoingCell.m; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaOutgoingCell/QMMediaOutgoingCell.m; sourceTree = ""; }; - EE17D443990AD447F5A6464E4B7F5E5E /* FBSDKAccessToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAccessToken.h; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKAccessToken.h; sourceTree = ""; }; - EE95A86900ACA3388510FB51E4EAA45E /* QMContactListMemoryStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMContactListMemoryStorage.m; path = QMContactListService/QMContactListService/QMContactListMemoryStorage/QMContactListMemoryStorage.m; sourceTree = ""; }; - EEC04FC7E73495A1032A1A56636E98B1 /* es-PE.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-PE.lproj"; path = "FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/es-PE.lproj"; sourceTree = ""; }; - EEDA04AD32615BCF2612686375FC6D19 /* fi.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fi.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/fi.lproj; sourceTree = ""; }; - EF2EDAB227117B6531948C2633245BBA /* libFFCircularProgressView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libFFCircularProgressView.a; path = libFFCircularProgressView.a; sourceTree = BUILT_PRODUCTS_DIR; }; - EF47236BC47DEB7D714A46FD340BE204 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; - EFB82C3A88A418A1024B365206C05AF7 /* pt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pt.lproj; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/pt.lproj; sourceTree = ""; }; - F057DEB7A5995F3B41BF4665FDA91F1E /* ResourceBundle-FirebaseAuthUI-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-FirebaseAuthUI-Info.plist"; sourceTree = ""; }; - F0A2B2FE0CB96C5C16612C8A8E012F2B /* Flurry-iOS-SDK-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Flurry-iOS-SDK-prefix.pch"; sourceTree = ""; }; - F10F50F86F9427FE2A53227F2CDDEB4A /* ic_retry-grey@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = "ic_retry-grey@3x.png"; path = "QMChatViewController/Icons/ic_retry-grey@3x.png"; sourceTree = ""; }; - F112C7B819B60B2A5A2B23BC8C8062FD /* NSPersistentStore+QMCDRecordPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSPersistentStore+QMCDRecordPrivate.h"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecordPrivate.h"; sourceTree = ""; }; - F1B430EE341351F2C244EF979AE8303A /* FBSDKAppInviteDialog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAppInviteDialog.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKAppInviteDialog.h; sourceTree = ""; }; - F1B626C30609C9AC9476DF60FD012671 /* FBSDKShareCameraEffectContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareCameraEffectContent.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKShareCameraEffectContent.h; sourceTree = ""; }; - F1E2F39975D1D65A2E2EFB2E17890339 /* _CDMessage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _CDMessage.h; path = QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDMessage.h; sourceTree = ""; }; - F235BBA262A4F92D12589E74A4DB4854 /* QMMediaOutgoingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMMediaOutgoingCell.h; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaOutgoingCell/QMMediaOutgoingCell.h; sourceTree = ""; }; - F276038B3CAE2F7D051F98B9FC60530E /* Pods-QMSiriExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-QMSiriExtension.release.xcconfig"; sourceTree = ""; }; - F27F17F54FB8227C0EC228C194650517 /* FBSDKLikeBoxView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKLikeBoxView.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeBoxView.h; sourceTree = ""; }; - F2A79FDAF9B10355980CE844D204C296 /* FBSDKLoginKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSDKLoginKit-dummy.m"; sourceTree = ""; }; - F2BDF73C530D25C909970DEBF87FFBB6 /* FBSDKCheckmarkIcon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCheckmarkIcon.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKCheckmarkIcon.h; sourceTree = ""; }; - F2E3B463BC31BBE37967DB6C74E7DFE2 /* FUIInputTableViewCell.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIInputTableViewCell.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIInputTableViewCell.nib; sourceTree = ""; }; - F323CC8811568FC2C14872DAA3A90061 /* TTTAttributedLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TTTAttributedLabel.h; path = TTTAttributedLabel/TTTAttributedLabel.h; sourceTree = ""; }; - F327B5445E9F55C394B7A00542AA6312 /* GoogleToolboxForMac.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleToolboxForMac.xcconfig; sourceTree = ""; }; - F34A22F8F20B07F395EBF077EE65CD20 /* fil.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fil.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/fil.lproj; sourceTree = ""; }; - F34BE90DA47B8362FB48F52F13FA00CB /* FBSDKApplicationDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKApplicationDelegate.m; path = FBSDKCoreKit/FBSDKCoreKit/FBSDKApplicationDelegate.m; sourceTree = ""; }; - F34E641E5E00766FB7D4FD188A44A7DF /* NYTPhotosOverlayView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotosOverlayView.h; path = NYTPhotoViewer/NYTPhotosOverlayView.h; sourceTree = ""; }; - F38949F603A2EACF3E6FBFD557D69FA0 /* pt-BR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "pt-BR.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/pt-BR.lproj"; sourceTree = ""; }; - F40D71B23D852147A5FFE0DCD5F3B261 /* FBSDKLoginManagerLoginResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLoginManagerLoginResult.m; path = FBSDKLoginKit/FBSDKLoginKit/FBSDKLoginManagerLoginResult.m; sourceTree = ""; }; - F4132F69849FE0836A5D2FE601B2873A /* BFAppLinkReturnToRefererController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFAppLinkReturnToRefererController.m; path = Bolts/iOS/BFAppLinkReturnToRefererController.m; sourceTree = ""; }; - F457873408B2A48DDFE348FD8EC3A2E7 /* da.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = da.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/da.lproj; sourceTree = ""; }; - F4714286DBB461215B8B37EF0BB87609 /* sr-Latn.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "sr-Latn.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/sr-Latn.lproj"; sourceTree = ""; }; - F47A44CA73B85A4B019981B254C2BE79 /* QMAttachmentAssetService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMAttachmentAssetService.h; path = QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAttachmentAssetService.h; sourceTree = ""; }; - F4E37EB12C8DBE309FCD869E8355BDD5 /* BFExecutor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFExecutor.m; path = Bolts/Common/BFExecutor.m; sourceTree = ""; }; - F4F1B0C78A656DD31987696B013E0D11 /* es-PY.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-PY.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PY.lproj"; sourceTree = ""; }; - F50DA7EE00E763882E960D19EA3BAAEF /* FBSDKKeychainStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKKeychainStore.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/TokenCaching/FBSDKKeychainStore.h; sourceTree = ""; }; - F51CF3093D1AA5F0E9C597113B55982C /* th.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = th.lproj; path = FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/th.lproj; sourceTree = ""; }; - F537089FC3B9328785AB597D2D871DA2 /* Crashlytics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Crashlytics.h; path = iOS/Crashlytics.framework/Headers/Crashlytics.h; sourceTree = ""; }; - F58EAD8468D4F883B826C1A1F6B97120 /* QMChatCollectionViewFlowLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatCollectionViewFlowLayout.h; path = QMChatViewController/Views/CollectionView/Layout/QMChatCollectionViewFlowLayout.h; sourceTree = ""; }; - F68FFEE3BB420E9C6ABE93B3D5763B31 /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = ""; }; - F692D755024EE76EF405FECE13EE6522 /* libnanopb.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libnanopb.a; path = libnanopb.a; sourceTree = BUILT_PRODUCTS_DIR; }; - F6C8CA525D54506E30EEA03CF05369AE /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; - F7038E58755AFE47874167D604176AF1 /* FBSDKSendButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKSendButton.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKSendButton.h; sourceTree = ""; }; - F73601E95B31E7D60B2DAA2BF41C7556 /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = ""; }; - F75F6ABC6C9FD4B2CE46FBE049EED8B2 /* NYTPhotoDismissalInteractionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NYTPhotoDismissalInteractionController.m; path = NYTPhotoViewer/NYTPhotoDismissalInteractionController.m; sourceTree = ""; }; - F7AC37FA924377ABF92A992729BDBDE6 /* FBSDKLikeButtonPopWAV.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLikeButtonPopWAV.m; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKLikeButtonPopWAV.m; sourceTree = ""; }; - F7D88C76BE828D9F286AADDF01247335 /* QMHeaderCollectionReusableView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMHeaderCollectionReusableView.h; path = QMChatViewController/Views/CustomUI/QMHeaderCollectionReusableView/QMHeaderCollectionReusableView.h; sourceTree = ""; }; - F7FC9A7CD509F754C16E705278B985C3 /* FBSDKCameraEffectTextures.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCameraEffectTextures.h; path = FBSDKShareKit/FBSDKShareKit/FBSDKCameraEffectTextures.h; sourceTree = ""; }; - F80E2FED6A6B9996DE5E8D745804DBE1 /* FBSDKLoginManagerLoginResult+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKLoginManagerLoginResult+Internal.h"; path = "FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginManagerLoginResult+Internal.h"; sourceTree = ""; }; - F82B7EDA911EF436202044C9610396B0 /* MicOverlay.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = MicOverlay.png; path = QMChatViewController/Icons/MicOverlay.png; sourceTree = ""; }; - F8EBE0FDA117DA7FC38FC530F535B132 /* CDMessage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CDMessage.h; path = QMChatCache/QMChatCache/CoreData/Entries/CDMessage.h; sourceTree = ""; }; - F8F6E02D0619876B4AB339AC339CF24C /* QMChatContactRequestCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatContactRequestCell.h; path = QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.h; sourceTree = ""; }; - F90EDF8C1E567D939A02D1A2C4D2B893 /* QMPlaceHolderTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMPlaceHolderTextView.h; path = QMChatViewController/Views/CustomUI/PlaceHolderTextView/QMPlaceHolderTextView.h; sourceTree = ""; }; - F967ED75F1C74FFDD8482A5C0BAEC3EA /* FirebaseAuthUI.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = FirebaseAuthUI.bundle; path = "FirebaseUI-FirebaseAuthUI.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; - F96B611386943ED6606AD8C686D0B164 /* FUIPasswordSignInViewController.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIPasswordSignInViewController.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIPasswordSignInViewController.nib; sourceTree = ""; }; - F97567429CB2B3BD4A60170AAD7BFA9E /* es-PR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-PR.lproj"; path = "FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks/FirebasePhoneAuthUI.framework/es-PR.lproj"; sourceTree = ""; }; - F9A2D4A8885396AEE6B02DA325AC4093 /* FBSDKGraphRequestMetadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequestMetadata.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestMetadata.m; sourceTree = ""; }; - F9B1377FE6AD9DE7FA6727AF18E80E1E /* NSDictionary+QMCDRecordAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+QMCDRecordAdditions.m"; path = "QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSDictionary+QMCDRecordAdditions.m"; sourceTree = ""; }; - FAA4B5DE44728414A8037AB5DC56767C /* BFWebViewAppLinkResolver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFWebViewAppLinkResolver.h; path = Bolts/iOS/BFWebViewAppLinkResolver.h; sourceTree = ""; }; - FB83CBA2DA4297F458F58A253DB31E9C /* QBChatAttachment+QMFactory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "QBChatAttachment+QMFactory.h"; path = "QMChatService/QMChatService/Categories/QBChatAttachment+QMFactory.h"; sourceTree = ""; }; - FBE263DE9E3F8046DEF606852F1917E2 /* FBSDKAudioResourceLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKAudioResourceLoader.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKAudioResourceLoader.h; sourceTree = ""; }; - FC78856E6354DC18E9EC9F790D5CCC6A /* QMChatConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatConstants.h; path = QMChatService/QMChatService/QMChatConstants.h; sourceTree = ""; }; - FC95AA45FCA474BF3293070A8B03D4BA /* FBSDKLoginUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKLoginUtility.m; path = FBSDKLoginKit/FBSDKLoginKit/Internal/FBSDKLoginUtility.m; sourceTree = ""; }; - FCCA8815F9A7C072F4BAF5998D567BA8 /* QMChatAttachmentOutgoingCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatAttachmentOutgoingCell.h; path = QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.h; sourceTree = ""; }; - FCEB2C3A2F8A73213C4BBD8C8C337EB8 /* _CDOpenGraphModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _CDOpenGraphModel.h; path = QMOpenGraphCache/QMOpenGraphCache/CoreData/EntriesMachine/_CDOpenGraphModel.h; sourceTree = ""; }; - FCF54EE6B7C96FB7BF474900F4638282 /* NYTPhotoViewerCore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NYTPhotoViewerCore.h; path = NYTPhotoViewer/NYTPhotoViewerCore.h; sourceTree = ""; }; - FD17A19BCF3E5289C153971FD8F4E0DA /* FUIAuthTableViewCell.nib */ = {isa = PBXFileReference; includeInIndex = 1; name = FUIAuthTableViewCell.nib; path = FirebaseUIFrameworks/FirebaseAuthUI/Frameworks/FirebaseAuthUI.framework/FUIAuthTableViewCell.nib; sourceTree = ""; }; - FD270B49C5DD78CEA5B08D21A373436D /* FBSDKShareDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKShareDefines.h; path = FBSDKShareKit/FBSDKShareKit/Internal/FBSDKShareDefines.h; sourceTree = ""; }; - FD7035D50E598906E5A45A71DDAD25B0 /* NYTPhotoViewer.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = NYTPhotoViewer.bundle; path = "NYTPhotoViewer-NYTPhotoViewer.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; - FDD7AFA71934975E3A246A6EE75A4677 /* QMUsersModel.xcdatamodel */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcdatamodel; path = QMUsersModel.xcdatamodel; sourceTree = ""; }; - FDF36D9AEC0C6D9E14ED48823CE2AFF3 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = ""; }; - FE69ECFC90BBD846632095A9ED754462 /* FBSDKButton+Subclass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBSDKButton+Subclass.h"; path = "FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKButton+Subclass.h"; sourceTree = ""; }; - FE78791BB72F021DD020995A93EDFA1D /* QMAudioIncomingCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QMAudioIncomingCell.m; path = QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioIncomingCell/QMAudioIncomingCell.m; sourceTree = ""; }; - FEF9C001A98CEB6AE0122452FCF79D4F /* QMChatCollectionViewDelegateFlowLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QMChatCollectionViewDelegateFlowLayout.h; path = QMChatViewController/Protocols/QMChatCollectionViewDelegateFlowLayout.h; sourceTree = ""; }; - FF0327E52EB9F0A2F3865944AFD540DF /* CDAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CDAttachment.m; path = QMChatCache/QMChatCache/CoreData/Entries/CDAttachment.m; sourceTree = ""; }; - FF44703B7F1B1E794B9EF6E9103AB7AD /* FLAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLAnimatedImageView.m; path = FLAnimatedImage/FLAnimatedImageView.m; sourceTree = ""; }; - FFAAE33F424124FEB34EAE6C8B66E2AB /* _CDAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _CDAttachment.h; path = QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDAttachment.h; sourceTree = ""; }; - FFBAB761922F0FA88279C1DB10C306D2 /* FBSDKCloseIcon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSDKCloseIcon.h; path = FBSDKCoreKit/FBSDKCoreKit/Internal/UI/FBSDKCloseIcon.h; sourceTree = ""; }; - FFC1208A96EE7B4B5E846ADB1D1C5E2A /* pause_icon.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = pause_icon.png; path = QMChatViewController/Icons/pause_icon.png; sourceTree = ""; }; - FFE438430990FEAE8590241A34BBC259 /* FBSDKGraphRequestPiggybackManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSDKGraphRequestPiggybackManager.m; path = FBSDKCoreKit/FBSDKCoreKit/Internal/Network/FBSDKGraphRequestPiggybackManager.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 07CCB61741DB19681E54D52635F9781A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 159FAB6CD5082235D0E679171A344443 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 103348B28AC93F378618ADF5F1D9B8F4 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - E8D9E7D0D013D8A5C4122DC8AC31030A /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2185CE47F94FED599666C7B8B0AE80DD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CE64CC50F46796D31D7EC945185C86CC /* CoreGraphics.framework in Frameworks */, - E844839BC566461809B2A3D9C58240AB /* CoreText.framework in Frameworks */, - AAE96C19BBD081A54BC63012DA273478 /* Foundation.framework in Frameworks */, - F31072E99551555BDA26ACF5565E1821 /* QuartzCore.framework in Frameworks */, - 51FCAE450A61A2F906184742015B97BE /* UIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 554BD06B018861111279770D87A21095 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 61F01874C3569670098F9A3069F9F957 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 77A240F4BAA176CE8316B238B6D2F12F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 79B6E9C8BD757085A14B5C23A7F1FD74 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 338633E0E83A557431310E94C59768FC /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 800FD907758FC42E67890E47DA697DA5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4DE155F37856B0C9E19436C5107694E7 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8265C708D4390616CD14DED7A3118F57 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - DB7C5FAFE3DDFF825B3D2401D295B476 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 82898345DB17F1B71717FF167E1EC2A5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AFBC9D7B722DF5A46C59064AD40ECF86 /* Foundation.framework in Frameworks */, - 0D08F2BDA0D339244FA421F898303056 /* ImageIO.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 829EFFF0C4C5B450803347E238EEB768 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 837322C469518863893FE462AAAEFABA /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 2C59F45A8302BB97F5678A332C14AF24 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 88DE4EA19994B377127799BB16ABA952 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 2815E4F0F36DF230EA4D9D1B6C1A6456 /* Foundation.framework in Frameworks */, - 0D8077B589BF5EF59BBC872F3CF31C4D /* UIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 89FA48AC9AA158471A611E8989B3BD6B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 30D5B940EFABC3062DDB917F443F73A7 /* Foundation.framework in Frameworks */, - 7E1C7198F6888EBED5C8378D0ADAAE09 /* Security.framework in Frameworks */, - 024A758C66579653B3EBDE8B78BBB7E9 /* SystemConfiguration.framework in Frameworks */, - 60DD4FBB7610787B6DDBAF4C55830816 /* UIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8D2BE8CE5663DF1EA1CF1CC5269C6067 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - C9F3C20808CA9AD5C931B60A1D0FA461 /* Foundation.framework in Frameworks */, - 2089C7C2B78C35F067C3C93170D7F7B4 /* Security.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8DE927B9765C1F08238FB9F65DE44979 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 85DF76D1E67DAC35A09407D5770ED7FD /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8E86703F96A4090BC5045C37B7C91BBB /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 77AC176D88B0888A14BE613CD68F6EB7 /* CoreGraphics.framework in Frameworks */, - 534FBD8D0E92F8D5A4A7FED6F0033F27 /* Foundation.framework in Frameworks */, - DDA640DE83B83C43285ABA7CF32FD69E /* ImageIO.framework in Frameworks */, - C8B4CA357C127C1C794AEE8DBC7CEFB4 /* MobileCoreServices.framework in Frameworks */, - 9B51DED9F2800F5715AC998686A4DEBE /* QuartzCore.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8FCDD6AF97980CBC17D9F554B52C31D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 94EB8A8937D61E8CED1F3C819230AE4D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - F2A71EFF37214BF8F060F8710E7358A8 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A3DFDCB1F21BEE4DBCC9090731628CD4 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A8EB580A6B6AA4BA700DCB9D2710BC39 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B1913B09085910B203447CBE9122191F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AE4E595A1AD817EBB4451C7762E71574 /* Accelerate.framework in Frameworks */, - 1144BCBD06CF4DC32001C3AF8B54DC06 /* AudioToolbox.framework in Frameworks */, - 7FA4ECE9588FEA1E7621014866D55D0B /* AVFoundation.framework in Frameworks */, - A882E7B7317201972B6A3DDCF3BD6568 /* CFNetwork.framework in Frameworks */, - 95D7A50FABA13553D701F7D15E9B824C /* CoreData.framework in Frameworks */, - AFC8CD6F3F9220E9264B8FCA65C19C99 /* CoreGraphics.framework in Frameworks */, - 64A55BDEE30B9B4C887D50E0FF616A4E /* CoreLocation.framework in Frameworks */, - 005C1DB15257F688C28EA00E50624CAD /* CoreMedia.framework in Frameworks */, - 0B26D8A806541ACDD91BC4870CC316C8 /* CoreVideo.framework in Frameworks */, - 5DEBA7865ADCD002E13361E8BD106D1A /* Foundation.framework in Frameworks */, - 77C7D9BEE6939BE8350AA2F77717CB34 /* MobileCoreServices.framework in Frameworks */, - 09EE9F46EC234A4E83D5EBB0F6C36743 /* SystemConfiguration.framework in Frameworks */, - 69BDB272BCE121313FFCBAEBDE427B40 /* UIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B23530C25EAB20E7EACF8DF332911B87 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B86992B377CDEFE3592DD6A7A9488B7C /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 843D06C93EA1D01129F7C457E0516483 /* Foundation.framework in Frameworks */, - 0D5294B246050B6CB3409F2F67345B6F /* QuartzCore.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D23C4F72EE742D907CA46790589BF9B6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 117E991DF09DE5C636178E812B76185C /* Foundation.framework in Frameworks */, - 35AEF4DF86F9C7E30C18EA9E37722D81 /* Security.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E299CB81756D73E01462FF8EAAD39983 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - D4F075FF2755D8E998CCD1D1A541164D /* CoreGraphics.framework in Frameworks */, - 5BC7D357B1AC02C5FF1414CD347E9E7D /* Foundation.framework in Frameworks */, - 5DB0B4DE75B029FAEB05AD979BB1716A /* QuartzCore.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E468DEE3816A9E9ED082166AC0F3EAAB /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CCD6DFBDC2C48307C8F478D690D4BD6A /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EB4D0DEBD60DAD6CDAA010AAC24DB847 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9C32897FC138D876076D5A5E870AE4E5 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EBAA7A730C2E0706656948E1E1A6EBD2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 491CFFEE14E27F7CA9896481ADEC0CB9 /* Foundation.framework in Frameworks */, - 25D9F63B368F205B5396818175E1AA19 /* SystemConfiguration.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F0FC79B195CFD08111E9128910F2527B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F80371051CAAA7FE396D2B54CF85F550 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - F8CFE1A929D930F52BFFA8BF893306BF /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F86ED00A00DEB9BDB585046A60693E92 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 01FA4638E45ED8CDCBC0FA7E45349009 /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - 4CBD1829498718EE6CA14B83EADBFBC3 /* Pods-Q-municate */, - F40B50432EDBE1F953329D4B05FA7822 /* Pods-QMShareExtension */, - A3B8FFCEF1893AEEBD4ED4FF8AC97941 /* Pods-QMSiriExtension */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - 02FD8FB342C882B2F16D7B68D90144E0 /* Resources */ = { - isa = PBXGroup; - children = ( - 88DC7CE9C7AF3F6D77EA058439F3A3A5 /* ar.lproj */, - 59F707A4D45FECD47911F6221209771F /* bg.lproj */, - E7F36E5755C513B17E379CE28C92D265 /* bn.lproj */, - 290BBF52497402C1E1F2ECF33A15EB05 /* ca.lproj */, - B797B7AE022674473553900239EA5B2E /* cs.lproj */, - 1709AA1693D52413CFB0F473AFE91E07 /* da.lproj */, - 5A48E1F8870FE522B8B03B8D6383BE94 /* de.lproj */, - 9560E25BE46E3BC3746BDFAD210AFB32 /* de-AT.lproj */, - C297F40654448F01A05FA65B6241C43D /* de-CH.lproj */, - A8C5AF8EE385D9E3D372E10B83566ADA /* el.lproj */, - BFB578BDC5C00F9C43BB69736513D505 /* en.lproj */, - 34289AA835738E7B826380662CB457E0 /* en-AU.lproj */, - D0EF27553477298E58A581AAB6E1D540 /* en-CA.lproj */, - 5054C3A56F28980B6B2CF317B7E1D48F /* en-GB.lproj */, - 4E7D624C138CAFDAE340DF0D4FEC5FA4 /* en-IE.lproj */, - 2EAB930F0A5A304D5C04FA3A623A55D1 /* en-IN.lproj */, - 8F101F2C22B028A548542E524E2CE28F /* en-SG.lproj */, - 8784D5C3F028DFEE49FB813BD9B1EAC9 /* en-ZA.lproj */, - 2F23B83E27D0243D8A548F2BE5722CFB /* es.lproj */, - AD8031FF366A3E027D069DF4A421CDD8 /* es-419.lproj */, - 2C6877E7ED66484A34358D2C66511A79 /* es-AR.lproj */, - 9C351DEA4FC079992C403E85D98FC5FE /* es-BO.lproj */, - 9A73474AE2373DD589009FAEAD587C7B /* es-CL.lproj */, - 6C7A0E88383A821E2A7013143BB9D590 /* es-CO.lproj */, - 2B60CBFECEC9320662C2315BEC2E4C6F /* es-CR.lproj */, - B7C1D9B2B15F69A441BF07C807C0B4C2 /* es-DO.lproj */, - 5DF6C380C24A814CB9480B73D823776D /* es-EC.lproj */, - 874978817498CA1C77062EDB246C661D /* es-GT.lproj */, - 549CEFB3FE461C0FC623EDCD566DA183 /* es-HN.lproj */, - 8CA05A33982B4C12B2F1F49B3129DC64 /* es-MX.lproj */, - 5A2E221AEC9C73EE67B77C9B046B6F9E /* es-NI.lproj */, - 9121DB125CE355DCA65B91D11F21923E /* es-PA.lproj */, - EEC04FC7E73495A1032A1A56636E98B1 /* es-PE.lproj */, - 112434F352261EC65974D4BFDB00B9A4 /* es-PR.lproj */, - B45E8EFA013B3C2AC1B110A375146ED1 /* es-PY.lproj */, - C2CFA879BBD41C564B39D8B46D3924E0 /* es-SV.lproj */, - 9885097860AD717DF1B15D7C782B5A08 /* es-US.lproj */, - C0E8E1CF4C545D6FDC56A4F3902EFCFB /* es-UY.lproj */, - 48BF79C573BE65694F8C9F318960056A /* es-VE.lproj */, - 5779731C87750D108D00BC71EB784963 /* fa.lproj */, - EEDA04AD32615BCF2612686375FC6D19 /* fi.lproj */, - 89309B50B54AF8635BF85559C14A1B4E /* fil.lproj */, - B2BB1D77E80BC8007FB13B129679A061 /* fr.lproj */, - D795F3842D180446232C170E22BE1DD7 /* fr-CH.lproj */, - DD60D06BB6D2460F97E88C5ED083D6EC /* FUIAccountSettingsViewController.nib */, - D819641F04355BD72CC75858942F4E0E /* FUIAuthPickerViewController.nib */, - FD17A19BCF3E5289C153971FD8F4E0DA /* FUIAuthTableViewCell.nib */, - 5A5254A20495C5EBEF32700CFD95EC27 /* FUIEmailEntryViewController.nib */, - F2E3B463BC31BBE37967DB6C74E7DFE2 /* FUIInputTableViewCell.nib */, - A26842186BD1CB2BCE1B00438496C232 /* FUIPasswordRecoveryViewController.nib */, - F96B611386943ED6606AD8C686D0B164 /* FUIPasswordSignInViewController.nib */, - A7EA7F797EEB916C676FBA9982CB5A41 /* FUIPasswordSignUpViewController.nib */, - 8F5B7AEEE571D96E8A6E61BFC51FD629 /* FUIPasswordTableViewCell.nib */, - 0DF3E89D435B36615F086EF1E5051458 /* FUIPasswordVerificationViewController.nib */, - 25454ED04A6FAA7646044C6AA6E9F295 /* FUIStaticContentTableViewController.nib */, - 9A5067A83C65BDAAF4E0694FFE1A27F2 /* gsw.lproj */, - 19CA64CFFB1373DB2F36C75F44779B87 /* gu.lproj */, - DE83A557BE5BFA0AF691D389A9BD4601 /* he.lproj */, - 5521A7D353717A08494139A410C8A3CD /* hi.lproj */, - B1CF3AE8B27E3367F7A7841011311EBE /* hr.lproj */, - 80D71308EF16B67EDA2E31A6CB82510E /* hu.lproj */, - 103C74AC4458EAA9B27B324424385A13 /* ic_email.png */, - AC27249710CBE7558BE336C314F08FBB /* ic_email@2x.png */, - 23246FB30379B93B31B241B71A037690 /* ic_email@3x.png */, - E8E41E614A25A7A3DFF7446AD335FC96 /* ic_visibility.png */, - 9F176D3F4A34104116408EA12C4811F2 /* ic_visibility@2x.png */, - 5FA4EA378010B9DAE2E14CA69401C11D /* ic_visibility@3x.png */, - 4700A53FCF0195D1A40AF92066B87157 /* ic_visibility_off.png */, - 9557712848C9A39338545DD860DAFAFA /* ic_visibility_off@2x.png */, - 0C29A87E1F2D73A377A35017269D6F53 /* ic_visibility_off@3x.png */, - 316AAF13E4F599B97D43FE21D25C6992 /* id.lproj */, - 62E62A3509DE0C639B290298E04CFC4A /* it.lproj */, - A3EE5FCF3B09FEF062305A90E8C798DB /* ja.lproj */, - 090E274C0DA5DED3257582D728CD8883 /* kn.lproj */, - 62F8CB8CF96190F9944CA3368F5E516C /* ko.lproj */, - 817DB1B67E498B3E020542E3EA6BBF3D /* ln.lproj */, - 08449946680B800B2EFCEE599703ABF8 /* lt.lproj */, - 07A74B68C426E8FFD2D85A3C54564DB9 /* lv.lproj */, - 7F23B97F1E7A0309EB85CB864F1EA151 /* mr.lproj */, - B029C06B3681E06DE3CE97A8B9C309F2 /* ms.lproj */, - 37D419D18F4D5C2F5ED1669AB95C24B6 /* nb.lproj */, - 007200A07E5D479BC917BC05A2B92AA2 /* nl.lproj */, - 098B357167D7583E9554FAD391143911 /* nn-NO.lproj */, - C826EDB1D05D26CD19B44D310BF58A81 /* pl.lproj */, - EFB82C3A88A418A1024B365206C05AF7 /* pt.lproj */, - B0ED464B8D35EA89510DFC2DB288C436 /* pt-BR.lproj */, - E2F89E5A94CF097E03DFBA2E579BE14D /* pt-PT.lproj */, - 1A934B762B72F16F3172CF6D4B72D602 /* ro.lproj */, - 18A0871F4897345FFDCDC49145BC4135 /* ru.lproj */, - 0DB39183C72FAEB199933C4E624E1596 /* sk.lproj */, - 8E9D268E1782FA4C15A7B4F908D3D96C /* sl.lproj */, - 1502EF10D25F5B353178F18E52F1D64E /* sr.lproj */, - 8817F70E89D1422A78DEA7E053AE7EF8 /* sr-Latn.lproj */, - 92E0CBDBF91400DB48669528F6E91251 /* sv.lproj */, - 138F5A3F8406034FA35D8FAD6344E6F3 /* ta.lproj */, - 035A81E52D02C9A8F12FA0DFAA70781C /* th.lproj */, - 69A02CD85F075A4F55B6B78725D555D3 /* tr.lproj */, - DA1041AF93130899465E3B873FDAB271 /* uk.lproj */, - A063571860C246C1AC8235D782944E05 /* ur.lproj */, - 65B46159037F7B6B4D886211BB02463E /* vi.lproj */, - 894D921C5A6F02266140D6D0C128A541 /* zh.lproj */, - 8AAE4BC3BD6B31FDA1BFF684B33958C1 /* zh-Hans.lproj */, - BD3F72E24305FC863C4B1B89D174651A /* zh-Hant.lproj */, - 50A575F21F5DE06A0E52C3AD72812C83 /* zh-Hant-TW.lproj */, - ); - name = Resources; - sourceTree = ""; - }; - 05B7EBAB70A2648CE7C6B9F868A027F1 /* Resources */ = { - isa = PBXGroup; - children = ( - F68FFEE3BB420E9C6ABE93B3D5763B31 /* SVProgressHUD.bundle */, - ); - name = Resources; - sourceTree = ""; - }; - 09F7FAB85CE1AD574B8744B17A9CDBEB /* SAMKeychain */ = { - isa = PBXGroup; - children = ( - 285E96267C99E0E0D44C15387BAE29B2 /* SAMKeychain.h */, - 225841327C5D34C36AFB6C9B13F3FA64 /* SAMKeychain.m */, - 479294CF21410371DDC4536DE324A865 /* SAMKeychainQuery.h */, - AF6A1CAEF2655013788C416DD61F2ED7 /* SAMKeychainQuery.m */, - 2CC80BD8966D6C84F5610AE941AED092 /* Resources */, - FA383A8C92BBE08102F43A5D577A25F8 /* Support Files */, - ); - name = SAMKeychain; - path = SAMKeychain; - sourceTree = ""; - }; - 13706B8C5B44A985762168CE3E829026 /* FirebaseAnalytics */ = { - isa = PBXGroup; - children = ( - 7E916295CE3F3A6BBA7D97E9AF86B69E /* Frameworks */, - ); - name = FirebaseAnalytics; - path = FirebaseAnalytics; - sourceTree = ""; - }; - 172AEF25FC055C7658404A796EC97DBB /* FFCircularProgressView */ = { - isa = PBXGroup; - children = ( - 3C04F21651292269975A9AD4894121B9 /* FFCircularProgressView.h */, - AF2B9C8E3B8DB48A631838EE36950B33 /* FFCircularProgressView.m */, - 0F5426E0596D31EF4A4CD72FA6408EFB /* UIColor+iOS7.h */, - E1FD3DFF85D828F1B8BB6C20C807574A /* UIColor+iOS7.m */, - CE2FCF27CA826BBE677EB6D8F2285BAC /* Support Files */, - ); - name = FFCircularProgressView; - path = FFCircularProgressView; - sourceTree = ""; - }; - 1894D4DB3BB297316C3924ACF8820552 /* Views */ = { - isa = PBXGroup; - children = ( - 612D6CC3C66792A48C0FAC4F1DA87568 /* QMAudioIncomingCell.h */, - FE78791BB72F021DD020995A93EDFA1D /* QMAudioIncomingCell.m */, - 05ED1A3EBC924840992A6A6C7C4A10B5 /* QMAudioOutgoingCell.h */, - EAEF28FAA8E49DBC59C45F508E1332D9 /* QMAudioOutgoingCell.m */, - 682BB9E15B8F95A59E8246D26B5A952A /* QMAudioRecordButton.h */, - B190506A9CA468EE1C644C6721E0ED30 /* QMAudioRecordButton.m */, - 827CD56A0057309230976D3F2988CCCA /* QMAudioRecordView.h */, - B477A027D421D9DD5A53445C01B6FC11 /* QMAudioRecordView.m */, - 77A74A23D87D0BFAE4FEE061A3861F71 /* QMBaseChatLocationCell.h */, - EA1AAB9388272A9601FA37610FD4169F /* QMBaseChatLocationCell.m */, - 6DC02B083354FB172E5CC47F62E07DAA /* QMBaseMediaCell.h */, - 161651A46E8AC09992F6465908DAF43C /* QMBaseMediaCell.m */, - 9FD5094E45E40ECC81E677195C5E568C /* QMChatActionsHandler.h */, - 8A294357ED86543CEF57618D542B126A /* QMChatAttachmentCell.h */, - BE38C6DE220C4AB47670174D4113CB65 /* QMChatAttachmentIncomingCell.h */, - 020161628B89E14C3C3F68F0CD675623 /* QMChatAttachmentIncomingCell.m */, - FCCA8815F9A7C072F4BAF5998D567BA8 /* QMChatAttachmentOutgoingCell.h */, - 9E1EDA698E88CA8B89E64582BA4819A9 /* QMChatAttachmentOutgoingCell.m */, - 9A1569FB2C781E2B3994440649F7DB70 /* QMChatBaseLinkPreviewCell.h */, - 2006F6A514BE0C672C7C641C4D20CBE8 /* QMChatBaseLinkPreviewCell.m */, - 8734F968131E17317FEDEED25EFBF557 /* QMChatCell.h */, - 4941AFA41B29D6FCD1E1738AB5DC8750 /* QMChatCell.m */, - 7683F605FFEA48D580B929A70C44BC91 /* QMChatCellLayoutAttributes.h */, - CF027E2FF44990914055185E25ECEC58 /* QMChatCellLayoutAttributes.m */, - 8FE7590BB049681C40A5FD1529364E82 /* QMChatCollectionView.h */, - 04CFDECB4495BA493620B18AB8350C46 /* QMChatCollectionView.m */, - F58EAD8468D4F883B826C1A1F6B97120 /* QMChatCollectionViewFlowLayout.h */, - 75E4853480F90A6F938C764123A335C2 /* QMChatCollectionViewFlowLayout.m */, - F8F6E02D0619876B4AB339AC339CF24C /* QMChatContactRequestCell.h */, - 3B6D7E678F9570AA814298F9A28F2E55 /* QMChatContactRequestCell.m */, - AAF28B24CB1A52A17EC3A0606F879968 /* QMChatContainerView.h */, - 99E9BFF5BB30723423D7283F580BCACA /* QMChatContainerView.m */, - 33AE37F4DD3F12176330307D7A624B68 /* QMChatIncomingCell.h */, - 418F3BD9101328EABAF10C115779876C /* QMChatIncomingCell.m */, - 916957FB16CF9E3894972722C9BA8F85 /* QMChatIncomingLinkPreviewCell.h */, - 45465AFA11DB1AE2C899280B37028EE0 /* QMChatIncomingLinkPreviewCell.m */, - 6497E5E7908795010C44D8E62F1BB5AA /* QMChatLocationCell.h */, - 673D039C5C3D2A441539FAEB0B0FC7C1 /* QMChatLocationIncomingCell.h */, - 0B684B94FC1D586B4D4515CF97459F6A /* QMChatLocationIncomingCell.m */, - 426F483192C83D8CC3DF95E027314B9B /* QMChatLocationOutgoingCell.h */, - EAA448B342DC8D2DB274C60B2426B47C /* QMChatLocationOutgoingCell.m */, - D18F493BB48DC4716C42613D736BBC1E /* QMChatNotificationCell.h */, - 40BD5DE2ADC9681A4E430030D61FCF0B /* QMChatNotificationCell.m */, - 63ED0B5BFFCB5A197FEC47732E76F68B /* QMChatOutgoingCell.h */, - B600C30126BD216711388A10934B56F0 /* QMChatOutgoingCell.m */, - 86210DA87FD9910AC3D94704AD548939 /* QMChatOutgoingLinkPreviewCell.h */, - 751C846B11B571F772309578745700E4 /* QMChatOutgoingLinkPreviewCell.m */, - 6FF80C52BF226B31FCF90F4ECCDFFD6E /* QMCollectionViewFlowLayoutInvalidationContext.h */, - 0250DEF252E1B257DF79C7F355652851 /* QMCollectionViewFlowLayoutInvalidationContext.m */, - F7D88C76BE828D9F286AADDF01247335 /* QMHeaderCollectionReusableView.h */, - C4281ACFF61A53F2D27608351C781174 /* QMHeaderCollectionReusableView.m */, - 7489314E76093AE358D8A73DBC6A0C81 /* QMImageIncomingCell.h */, - CE0DE1AF13C417D1AE8F69C3AFADC7A3 /* QMImageIncomingCell.m */, - 7C9F839D82D3D3F04EA0854BCE883E86 /* QMImageOutgoingCell.h */, - 0A3FA50B686F8889267F1503B1BB2AA1 /* QMImageOutgoingCell.m */, - 8BC8D415AA7995B656FD3B807AA3FBF2 /* QMImageView.h */, - 95F4F88F14F153C1CBB3570027656666 /* QMImageView.m */, - 8400869684351A04285A9D40CE749FAF /* QMInputToolbar.h */, - A1A4CD58239847C9248F2F6A01053743 /* QMInputToolbar.m */, - A510C2D8F68E767107BCA7E9FE5698A8 /* QMKVOView.h */, - 62E1D3E664EB736EF8C14385A82A5E16 /* QMKVOView.m */, - 784A32ADB3618C2A1AC336B335CE5FD6 /* QMLinkPreviewDelegate.h */, - CA7B7C9CB0D4F98C3A14A4AC3AB97B44 /* QMMediaIncomingCell.h */, - 519BE38E9982936C90511C1269EDBD19 /* QMMediaIncomingCell.m */, - F235BBA262A4F92D12589E74A4DB4854 /* QMMediaOutgoingCell.h */, - ED706A8880ABB0AA5A42FDD55862C669 /* QMMediaOutgoingCell.m */, - AAF6C7B25F987BBB9139F12376DE1F52 /* QMMediaViewDelegate.h */, - F90EDF8C1E567D939A02D1A2C4D2B893 /* QMPlaceHolderTextView.h */, - 7ADCEED9FDDCF63F724A95207C8AD242 /* QMPlaceHolderTextView.m */, - 4D1468C9B73C33A190A0B7CAFC3CF469 /* QMProgressView.h */, - E2281148E32732F05A250CA1D041B1AB /* QMProgressView.m */, - ACCBADBE2842037A58CE8AA98EE3EDE2 /* QMToolbarContainer.h */, - 54CF07DD8779CF1813A573B16BD7555E /* QMToolbarContainer.m */, - B9E66D13AD608455F286C178A63C02F8 /* QMToolbarContentView.h */, - 0EB5BC030C32489EF7488B6B73815315 /* QMToolbarContentView.m */, - 5F0DB2D8545DD175B4E192B9A65C9D09 /* QMVideoIncomingCell.h */, - AB1D90BFFF374680ED56281733B5E58F /* QMVideoIncomingCell.m */, - C0E0DD88A0D6413B1E90135A3BB0236A /* QMVideoOutgoingCell.h */, - 9F6D00915FB1BE081D4248A92A14C046 /* QMVideoOutgoingCell.m */, - ); - name = Views; - sourceTree = ""; - }; - 2703BDA33CF08D7BF32184C07C7DA4E5 /* Core */ = { - isa = PBXGroup; - children = ( - 4DFEE6A246053295B257A54568E4E5B7 /* NSBundle+NYTPhotoViewer.h */, - CDF242ED4E5F4F2F93062061E4673788 /* NSBundle+NYTPhotoViewer.m */, - C81218AD37A38068AA0C578DD52DF5BD /* NYTPhoto.h */, - 45A14E6E271B2A23CFC065BC2B4192E1 /* NYTPhotoCaptionView.h */, - E32B52F39C7F274638F02698FA9E4526 /* NYTPhotoCaptionView.m */, - 0EB0754EA1F52A0C50467DA1ED9E7E19 /* NYTPhotoCaptionViewLayoutWidthHinting.h */, - 26D86161E3B4CDBBCB3B76B5B67D2392 /* NYTPhotoContainer.h */, - E9F947F5AF24470A6F64885B134F2D83 /* NYTPhotoDismissalInteractionController.h */, - F75F6ABC6C9FD4B2CE46FBE049EED8B2 /* NYTPhotoDismissalInteractionController.m */, - F34E641E5E00766FB7D4FD188A44A7DF /* NYTPhotosOverlayView.h */, - 7275BF00124E50EF3AD0D355DFD1FB9D /* NYTPhotosOverlayView.m */, - 8C0ECC8CED6FE0F637960DABA90C3D03 /* NYTPhotosViewController.h */, - 6CFCD9DEF7C1EADD9711E85CD19E2DF5 /* NYTPhotosViewController.m */, - C344810E5519B30BE90D8587E206C42F /* NYTPhotoTransitionAnimator.h */, - C0C438F63254C0AD2151AEDAB0AC80FD /* NYTPhotoTransitionAnimator.m */, - 8A925F310B20680D87C8BA5241B132EB /* NYTPhotoTransitionController.h */, - B9D12EB23F321D04316F99238EE3B448 /* NYTPhotoTransitionController.m */, - 3E9CACB99A50BE84D5646879AD16B90C /* NYTPhotoViewController.h */, - E63E98949FB0CEE541C5E6F893C975EC /* NYTPhotoViewController.m */, - B1163F2786CBB14E99FDFAD5CE5FA5A8 /* NYTPhotoViewer.h */, - 77980B63A51A4587B0F20A7D6D67BD71 /* NYTPhotoViewerArrayDataSource.h */, - 13EB4DBD5DA1EA9A95F9DD93D1DDFC10 /* NYTPhotoViewerArrayDataSource.m */, - FCF54EE6B7C96FB7BF474900F4638282 /* NYTPhotoViewerCore.h */, - 63D73A83122C9917857B0BDE35A3420C /* NYTPhotoViewerDataSource.h */, - C22BA56B86E4AB037BC1C1FDD795247D /* NYTPhotoViewerSinglePhotoDataSource.h */, - 662EAA29C96B5E03BFCF690182E6FF98 /* NYTPhotoViewerSinglePhotoDataSource.m */, - 2D211ED0D38163DFCE49900040CC1EA2 /* NYTScalingImageView.h */, - 136F8B0D611414D2A36711B420E90B9C /* NYTScalingImageView.m */, - 431DDD59562CB054EA976D55FB015518 /* Resources */, - ); - name = Core; - sourceTree = ""; - }; - 28FC774F45F45362B11E56B6272EE325 /* Support Files */ = { - isa = PBXGroup; - children = ( - 88575A598348592AD90C1E635A9AB7B4 /* UIDevice-Hardware.xcconfig */, - DA99AEADC8E6F55D1F9275E98B16B128 /* UIDevice-Hardware-dummy.m */, - 90381DAB7B4F23031351313143915446 /* UIDevice-Hardware-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/UIDevice-Hardware"; - sourceTree = ""; - }; - 2A565FC3A4011BF03FEDD41CD6C90264 /* Resources */ = { - isa = PBXGroup; - children = ( - 237B97F795343F5E9108A58C8BFCA228 /* QMChatServiceModel.xcdatamodeld */, - F9113C63400BB93F9C37E2BEA20D2DD3 /* QMContactListModel.xcdatamodeld */, - FE34057A7E892095ECCFAEAC196798FC /* QMOpenGraphModel.xcdatamodeld */, - 95B147ACCE54F9BCFFAB07C281E4A9F3 /* QMUsersModel.xcdatamodeld */, - ); - name = Resources; - sourceTree = ""; - }; - 2C592A5007F26CE1D7209B63CEB69066 /* NSData+zlib */ = { - isa = PBXGroup; - children = ( - E5B9AA543D4E180ED719F42D9C1DF0B7 /* GTMNSData+zlib.h */, - B3842177259006214FC66D8F39C65E41 /* GTMNSData+zlib.m */, - ); - name = "NSData+zlib"; - sourceTree = ""; - }; - 2CC80BD8966D6C84F5610AE941AED092 /* Resources */ = { - isa = PBXGroup; - children = ( - E472AB0283AF4B8C059B67CADE96FC50 /* SAMKeychain.bundle */, - ); - name = Resources; - sourceTree = ""; - }; - 2D0AF10955D7378DD03C305BEF094CF3 /* NYTPhotoViewer */ = { - isa = PBXGroup; - children = ( - 2703BDA33CF08D7BF32184C07C7DA4E5 /* Core */, - 3FFC073DE8B4BA4F818E93CD03C1D701 /* Support Files */, - ); - name = NYTPhotoViewer; - path = NYTPhotoViewer; - sourceTree = ""; - }; - 312CAE004F0DE1AE50D70BA5DF22ED50 /* DebugUtils */ = { - isa = PBXGroup; - children = ( - 74427046125A8087BAEF77DF91C9B404 /* GTMDebugSelectorValidation.h */, - EC1FC5BF904216D72FFDA1F7B2764955 /* GTMDebugThreadValidation.h */, - 8B33FA49AA87A2B03A63A649F780EA2B /* GTMMethodCheck.h */, - ); - name = DebugUtils; - sourceTree = ""; - }; - 3A4CE4B6D995886A26FCAA36365DCBBC /* encode */ = { - isa = PBXGroup; - children = ( - ); - name = encode; - sourceTree = ""; - }; - 3FFC073DE8B4BA4F818E93CD03C1D701 /* Support Files */ = { - isa = PBXGroup; - children = ( - 775970BE5A8EDAB93BBC238592070F0D /* NYTPhotoViewer.xcconfig */, - A1305A69331A1C824781E95183DEB81D /* NYTPhotoViewer-dummy.m */, - 9F13033568FAB9D46129D0CFA91D3994 /* NYTPhotoViewer-prefix.pch */, - 7D3EDFD9E265E482736901753FF7D78A /* ResourceBundle-NYTPhotoViewer-Info.plist */, - ); - name = "Support Files"; - path = "../Target Support Files/NYTPhotoViewer"; - sourceTree = ""; - }; - 431DDD59562CB054EA976D55FB015518 /* Resources */ = { - isa = PBXGroup; - children = ( - 0FB9DC0FAC4C0873A404469890BDC533 /* NYTPhotoViewerCloseButtonX.png */, - 751B10433451719B64A384C9CC20958C /* NYTPhotoViewerCloseButtonX@2x.png */, - 180733DF9E16018CF8BB7572F224B87C /* NYTPhotoViewerCloseButtonX@3x.png */, - B5BE7170665952346CE708A2EF4DB454 /* NYTPhotoViewerCloseButtonXLandscape.png */, - B30BA46DD430478258E3261E1374BEB2 /* NYTPhotoViewerCloseButtonXLandscape@2x.png */, - 7224C90577E453117DAA1EFAB3D3AD42 /* NYTPhotoViewerCloseButtonXLandscape@3x.png */, - ); - name = Resources; - sourceTree = ""; - }; - 43C4C34D0481E200C5B65F0AE6A4A2A6 /* libextobjc */ = { - isa = PBXGroup; - children = ( - C8D65540EE978399F4AECC42AD1F16D8 /* EXTScope */, - 54641FD69A8144ACBF4E1DFE58D72C9E /* RuntimeExtensions */, - 875897E4216F586EF36050F0CE24AC7B /* Support Files */, - ); - name = libextobjc; - path = libextobjc; - sourceTree = ""; - }; - 43D865B1C343479E4E43AAFB24BAA47E /* QMServicesDevelopment */ = { - isa = PBXGroup; - children = ( - FFAAE33F424124FEB34EAE6C8B66E2AB /* _CDAttachment.h */, - 308E46C1BD1008C4A336E1610B43438A /* _CDAttachment.m */, - 070E972CF1E8E32CEF471AE8DF4D322A /* _CDContactListItem.h */, - 725DBC47B9F75420475608D9A1B961AD /* _CDContactListItem.m */, - 6E961AF4229FC72A146FEB3A86170726 /* _CDDialog.h */, - 941EEE8DDE4D72C0CA6721E2A0E6073B /* _CDDialog.m */, - F1E2F39975D1D65A2E2EFB2E17890339 /* _CDMessage.h */, - CA4758ACD1C36A267D8402AEC966A9F3 /* _CDMessage.m */, - FCEB2C3A2F8A73213C4BBD8C8C337EB8 /* _CDOpenGraphModel.h */, - 29E39FE721A809173BCC632EAB433590 /* _CDOpenGraphModel.m */, - 13A2344DF9FC94D550CBE5026CBF389D /* _CDUser.h */, - 9B7082A22C96398717C289D224AD4669 /* _CDUser.m */, - C1504D35BA74702F155EBC90D76EEF3E /* CDAttachment.h */, - FF0327E52EB9F0A2F3865944AFD540DF /* CDAttachment.m */, - C9D0E7B1C95FF0E4CB51FFE85F8AFDCB /* CDContactListItem.h */, - E1124D0714F341FAA37E5F1EF98BC4AB /* CDContactListItem.m */, - 72823C4407249160C43459B83BA59BC6 /* CDDialog.h */, - C93AB266838A3512A0329AD99EF85830 /* CDDialog.m */, - F8EBE0FDA117DA7FC38FC530F535B132 /* CDMessage.h */, - B9CBC7A5169299DB0E492DE3E45894A1 /* CDMessage.m */, - 3E5BF8E765C8E25721994C3B74BB0345 /* CDOpenGraphModel.h */, - 3A2D2CAF8C2E67F7646BF9A4C372C46B /* CDOpenGraphModel.m */, - 68E04F78D45DBA02C365BFBA84A441A1 /* CDUser.h */, - 381E3A721061A79A1F41962F89FE5498 /* CDUser.m */, - 5E544708C8F232DFFF0E949758760F52 /* NSArray+QMCDRecord.h */, - E75595A921364B3816AD050BAD1E53E5 /* NSArray+QMCDRecord.m */, - 72E21B1F28740345CFF424FD0C28EBBD /* NSDictionary+QMCDRecordAdditions.h */, - F9B1377FE6AD9DE7FA6727AF18E80E1E /* NSDictionary+QMCDRecordAdditions.m */, - AB214464202C01989CCEB6D4A941A846 /* NSError+QMCDRecordErrorHandling.h */, - 8A7CF85B14C2EA0CC0F833CD08BDC456 /* NSError+QMCDRecordErrorHandling.m */, - A02D0BFAA3A47C620571E5D896AF5908 /* NSManagedObject+QMCDAggregation.h */, - 2E08DDAE806BB08CF3084D5B480481EE /* NSManagedObject+QMCDAggregation.m */, - 2F0DE4B68A4D9FB54004782A3F30E3E5 /* NSManagedObject+QMCDFinders.h */, - 828ED7F0ACBA838A3CB141B1A54AAC9F /* NSManagedObject+QMCDFinders.m */, - BC46F903C6AAB1F0659EE44EBBA18AE7 /* NSManagedObject+QMCDRecord.h */, - 031E860E44DF8F80D270D579FD7B54BE /* NSManagedObject+QMCDRecord.m */, - BA5486542ED09C8F898C206589294DE5 /* NSManagedObject+QMCDRequests.h */, - 86D67B4842FB59069113286A90C39AF7 /* NSManagedObject+QMCDRequests.m */, - 47709B2EFA44202CCA3100EFEBCC284B /* NSManagedObjectContext+QMCDObserving.h */, - CF55DAD512ACEDB4664A6549374E4FE7 /* NSManagedObjectContext+QMCDObserving.m */, - 9BAEA8AF57949742DBD54B6C219568E5 /* NSManagedObjectContext+QMCDRecord.h */, - 1A8922B942F48C7FD27D242DCE20FEF9 /* NSManagedObjectContext+QMCDRecord.m */, - 00D1C7BDD1B5E5377C24C65AE4401A8A /* NSManagedObjectContext+QMCDSaves.h */, - 149BAAE68F455D019A5DE566F60D60F8 /* NSManagedObjectContext+QMCDSaves.m */, - D651FF519443B555C09905CBF2B18D35 /* NSManagedObjectModel+QMCDRecord.h */, - 2CBF688CEC2CBF1FF7C9126833B0F107 /* NSManagedObjectModel+QMCDRecord.m */, - 00D301185B1872E80D384A376C2E97F3 /* NSPersistentStore+QMCDRecord.h */, - 5BC0FD6503BAA29B5B4C41DCABE0B77C /* NSPersistentStore+QMCDRecord.m */, - F112C7B819B60B2A5A2B23BC8C8062FD /* NSPersistentStore+QMCDRecordPrivate.h */, - CDA70F5557B015B703D106BEEC15949A /* NSPersistentStoreCoordinator+QMCDRecord.h */, - 75C0FCF0CFDF0D9CC523085845D46361 /* NSPersistentStoreCoordinator+QMCDRecord.m */, - BACD7BDC86D762C18408E43D9CCCD90C /* QBChatAttachment+QMCustomData.h */, - 9DF0EFEC448C8E232755C250EE0125F5 /* QBChatAttachment+QMCustomData.m */, - 2D99EEA366BCA69F025A4DD7D93DFF75 /* QBChatAttachment+QMCustomParameters.h */, - 9BFA9757E45232124F11DA3CFA60A452 /* QBChatAttachment+QMCustomParameters.m */, - FB83CBA2DA4297F458F58A253DB31E9C /* QBChatAttachment+QMFactory.h */, - EB085FBF6157883D7405D01AD6B8511C /* QBChatAttachment+QMFactory.m */, - A511FA8CB99AF0C4858C4FC52BA89231 /* QBChatMessage+QMCustomParameters.h */, - 9EF2356062505A253204470F0BB17B80 /* QBChatMessage+QMCustomParameters.m */, - 7144CFE1DE97085F58C9174FD6104C7A /* QBUUser+CustomData.h */, - AF637C15CD6DACD2375C06103C2B63DF /* QBUUser+CustomData.m */, - 5D44C002F0DDB17BBE2162A99C63939A /* QMAssetLoader.h */, - 63C88993F3F28FB44FF6FBA6A03F64BE /* QMAssetLoader.m */, - A2594D687D0EA27A5F60EF4E6E8BF1E0 /* QMAsynchronousOperation.h */, - 7D3EDD868EEA7475D084B3CDF7C67B8D /* QMAsynchronousOperation.m */, - F47A44CA73B85A4B019981B254C2BE79 /* QMAttachmentAssetService.h */, - A6F63999B8BBF641665626A58D09BC11 /* QMAttachmentAssetService.m */, - E0876E249BC4D8A205D4DC6479858EC2 /* QMAttachmentContentService.h */, - 6F860E42F86E8B65F5B5CFAFE8352F6B /* QMAttachmentContentService.m */, - CCE9BDF35B7BC9F96EDC8AE020630374 /* QMAttachmentsMemoryStorage.h */, - E7C501DF46E37169339F5FF6593AFFB4 /* QMAttachmentsMemoryStorage.m */, - 78710B1C08656D27D63FB0E068C11AB3 /* QMAttachmentStoreService.h */, - 77A44C467BD3BD2B1524AA6293F6D9F0 /* QMAttachmentStoreService.m */, - B90C6876CA6A860BB25BC6BB5E6AF142 /* QMAttachmentStoreServiceDelegate.h */, - 4B8444730DD33FA811D4A5FEE560CBF3 /* QMAuthService.h */, - 717CB45F4A36E01172E1AC1D8F46A5FE /* QMAuthService.m */, - 91AF384C2CA00703F94D0642F00AC2D4 /* QMAuthService+Bolts.m */, - 4244309CD584B0A5B1CA4E650C4DFAD3 /* QMBaseService.h */, - E6EB9F0793269C0E68C65433BEBB4E2C /* QMBaseService.m */, - 6260371331165B42182219B5B9E20EE2 /* QMCancellableService.h */, - 1B7D78051EED427038591D82ED57EA9B /* QMCDMigrationManager.h */, - 89B520CB39A8CB161906CA0762F5D58B /* QMCDMigrationManager.m */, - EB66C45475D340FDA543C23E755D122D /* QMCDRecord.h */, - B4C8EE20D4F7A19EFDA779AED1FDDEBF /* QMCDRecord+Options.h */, - BA48DA40D3D6E1A4DC7990BE33C8132A /* QMCDRecord+Options.m */, - ADC058FB141AF92F2F57775E5611E7EC /* QMCDRecord+VersionInformation.h */, - 9FA9DFEE928D4124A78F56F66F13CEE0 /* QMCDRecord+VersionInformation.m */, - A9A8F0DCDB8B43A0D4EDB728FF80D357 /* QMCDRecordInternal.h */, - A3F665FB265D7273AF4CDBE921B2D36B /* QMCDRecordInternal.m */, - 54043F3B782D15B04973AB58A4D087B1 /* QMCDRecordLogging.h */, - 02B89BF2E737913E5927A071ED7FC692 /* QMCDRecordStack.h */, - BD05CE6A2BE987267DD6107D4E19BBC0 /* QMCDRecordStack.m */, - C42D7345B75C0B52AB0CC22B956E6C1E /* QMChatAttachmentService.h */, - 447CD65667F0A95BC16ED06CADFF9644 /* QMChatAttachmentService.m */, - 480DEFEC07FEFB327E654482C758FE26 /* QMChatCache.h */, - 4C69368E6DDABBBCE646696B736CFCCC /* QMChatCache.m */, - FC78856E6354DC18E9EC9F790D5CCC6A /* QMChatConstants.h */, - 6E711F35DA0A4EC11CE47595DA0749F1 /* QMChatService.h */, - CEE4F66907207C82AE778198805F3685 /* QMChatService.m */, - BB260B2455E35BF9A5AE7E60DCA13244 /* QMChatService+Bolts.m */, - 65B7963220C618FE7743F7D628EC3C59 /* QMChatServiceModelIncludes.h */, - C9FD577CF6752046393D39C9F10AE63F /* QMChatTypes.h */, - 8DC935A0E27502DBF653263E0C695A54 /* QMContactListCache.h */, - 3852762B3DD542AC58F5695BA2916363 /* QMContactListCache.m */, - 39F55BA8BF69E1292FA41F0A52720C9E /* QMContactListMemoryStorage.h */, - EE95A86900ACA3388510FB51E4EAA45E /* QMContactListMemoryStorage.m */, - D42902B724543F2E4DAE54383181A71E /* QMContactListModelIncludes.h */, - B15E08FFCFC6B8B5C8FF18F94E9FE372 /* QMContactListService.h */, - 7117C9CCF997FBC6E86056416114A485 /* QMContactListService.m */, - 98E1CF89D57002D0CC25E1C54E561E96 /* QMContactListService+Bolts.m */, - 4D88F415F620DD532D545D531B9FA94E /* QMDBStorage.h */, - 16245B908265A1CAA5F8E59D203810AE /* QMDBStorage.m */, - E45AC1AC2A7F9B103BE98C62610E8E87 /* QMDeferredQueueManager.h */, - 310FAA9488055C21F5156FFFB1177ECC /* QMDeferredQueueManager.m */, - 080865E76B8325E72BF6DBB62CFC63B6 /* QMDeferredQueueMemoryStorage.h */, - C5C84DA30E89C9810D552FBEA4475A03 /* QMDeferredQueueMemoryStorage.m */, - C4AD55D8165DB77B8E8CB1115E603499 /* QMDialogsMemoryStorage.h */, - D734D0AA9EA8F93B08BC80CF33263D5F /* QMDialogsMemoryStorage.m */, - 329EEEF11D1A40B86ECEB344711A8A06 /* QMMediaBlocks.h */, - 931A28D49A72DD4F0897B0C223BE3E7D /* QMMediaDownloadService.h */, - 2D26F711F68FA5A63F2CD865642AE67D /* QMMediaDownloadService.m */, - 2ED8983BEC599B272948296CF3F09871 /* QMMediaDownloadServiceDelegate.h */, - A9E7C211CD593C0142BA92EFF27B6F34 /* QMMediaUploadService.h */, - 90FC32DB834F5E367709999298DC79CC /* QMMediaUploadService.m */, - 62DADB15702793C01F13FE624CB8CA2C /* QMMemoryStorageProtocol.h */, - 6139C8BABDEA9427263EECA00BD4DA8B /* QMMessagesMemoryStorage.h */, - 6DBE88702518FF6D03E42FCCC690221B /* QMMessagesMemoryStorage.m */, - 9845A6BD9C372FEEB661BD93FA0B382D /* QMOpenGraphCache.h */, - 316215B7013BE1DFFA26A3D91BE648D1 /* QMOpenGraphCache.m */, - 0C15CBE1387D86E5CA16C549F572D1ED /* QMOpenGraphItem.h */, - 6C0C13EAFD5605EC62EE7056AF516C8E /* QMOpenGraphItem.m */, - 1D68398100340AFAB42AE7B0EEBC8DA0 /* QMOpenGraphMemoryStorage.h */, - 8A3828F6A78E85D3370113C6DAA7C106 /* QMOpenGraphMemoryStorage.m */, - E829F7BD64C8F76BEDF98A6CEAE0D55F /* QMOpenGraphModelIncludes.h */, - 84509F748A19E448072572C4A0CD4F14 /* QMOpenGraphService.h */, - 640A1F0FABFBCC83AD533773E58B1893 /* QMOpenGraphService.m */, - D7ADC322AF20F3AF63DEA494D8F45020 /* QMServiceManagerProtocol.h */, - C3A0B20DD01288E49CCBF7F2565C892D /* QMServices.h */, - D884F7BD122E75D4BA1E605E9B276B8A /* QMServices.m */, - BFCC09138971E3778F69E3B6F7948BA9 /* QMServicesManager.h */, - CF22269C23D26C052CE8FF0743C7A549 /* QMServicesManager.m */, - 1EACD8EC24C72480207A5C3C774DB41C /* QMSLog.h */, - 82881E1250669D4FFACAD4952B62D550 /* QMSLog.m */, - D5E359A89CB6F2C5F5911C014E897ADF /* QMTimeOut.h */, - 8A187756081222D9F49ED73C82FAB015 /* QMTimeOut.m */, - BEAD17E07DAF7BA8E463468B19887933 /* QMUsersCache.h */, - 5B7E9C635CDC54617BD3E27D80383C1B /* QMUsersCache.m */, - 36BCDF4E9DA8B7727F9924F3BD1D01F8 /* QMUsersMemoryStorage.h */, - E15DCBDF02CE68C932855EA4427E1D60 /* QMUsersMemoryStorage.m */, - 4FDE18481FC28FC0EA250992439B5635 /* QMUsersModelIncludes.h */, - D69EB536BF026F24113CE14068F6EB99 /* QMUsersService.h */, - A037233884896ABCC4C858BD622C31E3 /* QMUsersService.m */, - 2A565FC3A4011BF03FEDD41CD6C90264 /* Resources */, - CBE719128286F4017DB68FE9A19550A8 /* Support Files */, - ); - name = QMServicesDevelopment; - path = QMServicesDevelopment; - sourceTree = ""; - }; - 4B51571DE3A7557BC9530B3FF76BD2FD /* Support Files */ = { - isa = PBXGroup; - children = ( - F057DEB7A5995F3B41BF4665FDA91F1E /* ResourceBundle-FirebaseAuthUI-Info.plist */, - 7FCC5B704A7986CC3667ED9F461B785E /* ResourceBundle-FirebasePhoneAuthUI-Info.plist */, - ); - name = "Support Files"; - path = "../Target Support Files/FirebaseUI"; - sourceTree = ""; - }; - 4BDFEDCAA487B9B7B4F6203350074A58 /* QMCVDevelopment */ = { - isa = PBXGroup; - children = ( - 165782D1A69F0C15E98C100A317C07EB /* QMChatViewController.h */, - 89B3356F04FE0C784B666B947594EEB5 /* QMChatViewController.m */, - B59A8212B2D54F016D98DCD67A03CE80 /* Categories */, - A7E2C16ABB227B86C3760D36C315BEAD /* Protocols */, - F09C35DB572722D734850E2825D81A5E /* QMChatDataSource */, - 9D63335BE6E2BEEF2A135E5DA7D9052C /* QMChatLocationSnapshotter */, - 6FA630AF030D0F141A1A9DCB642172C4 /* Resources */, - 58BB1F3B3086FDA532FB0322A071513C /* Support Files */, - 7BCBDE738477C76CDBB110E9A16DA83B /* Utils */, - 1894D4DB3BB297316C3924ACF8820552 /* Views */, - ); - name = QMCVDevelopment; - path = QMCVDevelopment; - sourceTree = ""; - }; - 4CB171D2F85780CA56B9ADC549AFEB76 /* Support Files */ = { - isa = PBXGroup; - children = ( - E27B5BE20DBD31E198FFD7F47DC14B2D /* TTTAttributedLabel.xcconfig */, - EB9ABF4E3F601C527114264D27919AC2 /* TTTAttributedLabel-dummy.m */, - 47EE6951F7EDFA4FAF1BB86B1058EBC5 /* TTTAttributedLabel-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/TTTAttributedLabel"; - sourceTree = ""; - }; - 4CBD1829498718EE6CA14B83EADBFBC3 /* Pods-Q-municate */ = { - isa = PBXGroup; - children = ( - 774184B4D6E8D32FB5514BB46180C75A /* Pods-Q-municate-acknowledgements.markdown */, - 42DC3535493533C2C380FE0013668C84 /* Pods-Q-municate-acknowledgements.plist */, - 8513C813B77D7EDDBF9D99C7BC757661 /* Pods-Q-municate-dummy.m */, - 0D7D617AC3C3FE71A4D38168CD48ED22 /* Pods-Q-municate-frameworks.sh */, - 634B76629EC6025EAFD01586131CA22A /* Pods-Q-municate-resources.sh */, - 8CA98F4DE827B68B734521E86678DFCB /* Pods-Q-municate.debug.xcconfig */, - 3398544D72AA8140539693E0D80D3084 /* Pods-Q-municate.release.xcconfig */, - ); - name = "Pods-Q-municate"; - path = "Target Support Files/Pods-Q-municate"; - sourceTree = ""; - }; - 4D1C40FEEBBC090FAB1384A306661483 /* Auth */ = { - isa = PBXGroup; - children = ( - FEBEAF06602528497E1F0CDCFF00ADA9 /* Frameworks */, - 02FD8FB342C882B2F16D7B68D90144E0 /* Resources */, - ); - name = Auth; - sourceTree = ""; - }; - 4FEC8820A6B317B4B678BCFA2F8D04B0 /* FirebaseInstanceID */ = { - isa = PBXGroup; - children = ( - 70223D91F61AF2DE875C3A8852A0F59B /* Frameworks */, - ); - name = FirebaseInstanceID; - path = FirebaseInstanceID; - sourceTree = ""; - }; - 4FF9D6AB5C543E350C70486E31612EFE /* Support Files */ = { - isa = PBXGroup; - children = ( - 3B9CA800C5C3E5171E4727E3B824C784 /* nanopb.xcconfig */, - DBD693DE1754131E30423F8FD72FFC30 /* nanopb-dummy.m */, - AA4101E7372F643ACACAB9EA7E30ABD7 /* nanopb-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/nanopb"; - sourceTree = ""; - }; - 54641FD69A8144ACBF4E1DFE58D72C9E /* RuntimeExtensions */ = { - isa = PBXGroup; - children = ( - 7EFB2F94B5D6E19DBE188A286ADAD3F8 /* EXTRuntimeExtensions.h */, - 8AD758050B2837363C6C93BB75D15180 /* EXTRuntimeExtensions.m */, - 4BEA917C9E06C082F654D936CB176D0C /* metamacros.h */, - ); - name = RuntimeExtensions; - sourceTree = ""; - }; - 568C0C8CE1605B32339D6236CE4E2370 /* Support Files */ = { - isa = PBXGroup; - children = ( - DD0313B5B8EF91279B48B3C83DF59C46 /* FBSDKShareKit.xcconfig */, - 2809430D1371A3A8BB0C09EA72D28AE4 /* FBSDKShareKit-dummy.m */, - A482A9DAC125B4A98D963A4276D0F584 /* FBSDKShareKit-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/FBSDKShareKit"; - sourceTree = ""; - }; - 58BB1F3B3086FDA532FB0322A071513C /* Support Files */ = { - isa = PBXGroup; - children = ( - 8BB4E96EF5B1A0686FF2D45622498106 /* QMCVDevelopment.xcconfig */, - A9C93E8567094F579F4A942F9F698A74 /* QMCVDevelopment-dummy.m */, - CA58ED5C19E5F3F40061384B75ACD200 /* QMCVDevelopment-prefix.pch */, - C367B9AB92927F506AE895E19CB48111 /* ResourceBundle-QMChatViewController-Info.plist */, - ); - name = "Support Files"; - path = "../Target Support Files/QMCVDevelopment"; - sourceTree = ""; - }; - 5ADE5666C9D64D699927F5F9B6F8BD28 /* Support Files */ = { - isa = PBXGroup; - children = ( - C0D8735F327235ADF90979C4902A64D1 /* FBSDKLoginKit.xcconfig */, - F2A79FDAF9B10355980CE844D204C296 /* FBSDKLoginKit-dummy.m */, - 000E912B319B0A7D9B29CD2D3F9BEB75 /* FBSDKLoginKit-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/FBSDKLoginKit"; - sourceTree = ""; - }; - 613C3DECB186619CC7790C3AAEEB73A7 /* Phone */ = { - isa = PBXGroup; - children = ( - 91C24C083C52364DFE2398EC96FF7803 /* Frameworks */, - D0497BCFDBA41997D7486EBE5FFEBE20 /* Resources */, - ); - name = Phone; - sourceTree = ""; - }; - 61687578151311DB21585FB5CDECDBE1 /* nanopb */ = { - isa = PBXGroup; - children = ( - 8E850C4FB3456425684E5FCC37D62364 /* pb.h */, - A506ADE5745BB7E498028D3A793B30C9 /* pb_common.c */, - 586B6D9D6F13B844923BF7E70A52FBC0 /* pb_common.h */, - 22199C2E0BBA88A70488861396395BF5 /* pb_decode.c */, - 6540CD0631DFB4DA767C9175A1B536A1 /* pb_decode.h */, - 0BB44EF4CF585C9E7976DA68DE0246E0 /* pb_encode.c */, - 6EDF4D8A10FABE1564ABFCC8AEB9B05E /* pb_encode.h */, - B997825AC3B68BED1B818269E020FAB2 /* decode */, - 3A4CE4B6D995886A26FCAA36365DCBBC /* encode */, - 4FF9D6AB5C543E350C70486E31612EFE /* Support Files */, - ); - name = nanopb; - path = nanopb; - sourceTree = ""; - }; - 623689E2669969E2FA75AC114E84A235 /* Support Files */ = { - isa = PBXGroup; - children = ( - 67EC1CA5C6B4CA229AE4D09D8528703A /* FBSDKCoreKit.xcconfig */, - 49996D4BBF0258D8903436544DDF6E4F /* FBSDKCoreKit-dummy.m */, - E40CB1F100CBABD36082CC83C21ED7C3 /* FBSDKCoreKit-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/FBSDKCoreKit"; - sourceTree = ""; - }; - 6A9AE718CBE5729CD3162FED2E56A7B0 /* SVProgressHUD */ = { - isa = PBXGroup; - children = ( - CD547AA79598002F54A2C59FD241D265 /* SVIndefiniteAnimatedView.h */, - 253368EAC67E1C4CF625B0C4F8B9ED23 /* SVIndefiniteAnimatedView.m */, - F73601E95B31E7D60B2DAA2BF41C7556 /* SVProgressAnimatedView.h */, - 6B99F44A43827F9B7E8137EE56131739 /* SVProgressAnimatedView.m */, - BFB75EC2FD5EE824A110AB3CCB76313B /* SVProgressHUD.h */, - 19BA3BBBC9475A29ED258B79AD1A1B01 /* SVProgressHUD.m */, - 96DE4BD6A1DB6E683B825AB6ECEFC254 /* SVRadialGradientLayer.h */, - BCBC80C944FD728441D47B472D2B9423 /* SVRadialGradientLayer.m */, - 05B7EBAB70A2648CE7C6B9F868A027F1 /* Resources */, - 8E4B99C00B7CF89D049A0EF5D240CA06 /* Support Files */, - ); - name = SVProgressHUD; - path = SVProgressHUD; - sourceTree = ""; - }; - 6FA630AF030D0F141A1A9DCB642172C4 /* Resources */ = { - isa = PBXGroup; - children = ( - 05EBC9DA1A60161009543C4221BCBD37 /* attachment_ic.png */, - 4E731447D25D669D9C5BEDCE00B22B92 /* attachment_ic@2x.png */, - 993AA6B3C61BB4E47034C8076A324465 /* attachment_ic@3x.png */, - 1876384A946CB6B0E0EB8729A71B8E2B /* cancel_icon.png */, - 8A3AC07C0E34190634852B22F3ECF10E /* download_icon.png */, - A333E9F80C9D5C2E5FE1D0E8BCBE0CCC /* ic_retry-grey.png */, - 539DB240B055D3C939E4399D843C2C61 /* ic_retry-grey@2x.png */, - F10F50F86F9427FE2A53227F2CDDEB4A /* ic_retry-grey@3x.png */, - 1EFCCFEDC2F490AB08CA3D3DFC657056 /* Media.xcassets */, - 395C05110DAA0DDF5EF8485AF515D418 /* MicButton.png */, - F82B7EDA911EF436202044C9610396B0 /* MicOverlay.png */, - E9DDA624B4D4CBA73468014BD55527E3 /* MicOverlay@3x.png */, - FFC1208A96EE7B4B5E846ADB1D1C5E2A /* pause_icon.png */, - 89119A7831BE8F6D0F158B90EC16845C /* play_icon.png */, - DBB3F2CA5EDBAC34D1AB024D88FE89A9 /* QMAudioIncomingCell.xib */, - 770C4F79199C10A909FDD508F7E2ADBE /* QMAudioOutgoingCell.xib */, - E18CE1384D97512C2309AA2F7285DD07 /* QMAudioRecordView.xib */, - DEB9736DFDF6E9649DE412138998B91F /* QMChatAttachmentIncomingCell.xib */, - D44A4B8373DFF377FF67D6EAFA64AF40 /* QMChatAttachmentOutgoingCell.xib */, - 50F123ACCF40C15C1BB65CF5DF2A2F2B /* QMChatContactRequestCell.xib */, - 0AB953659B5C6D57BA912EBAFD9A16D7 /* QMChatIncomingCell.xib */, - 3CCFFC2DF52A5A241B218E24A722BF72 /* QMChatIncomingLinkPreviewCell.xib */, - 8A49A0A90F9EDA7C7BB2A9EF1B449B04 /* QMChatLocationIncomingCell.xib */, - 93840F9C95DD41243A41375787D683C5 /* QMChatLocationOutgoingCell.xib */, - 2B6053755C3BA275926465C3CFA90711 /* QMChatNotificationCell.xib */, - C76BE333439B97D2829C26CC294234E2 /* QMChatOutgoingCell.xib */, - B0F2D18CD49C24A03FD7184F672A53C5 /* QMChatOutgoingLinkPreviewCell.xib */, - 6FC744D1C856216ACFBD8175C970D9C6 /* QMChatViewController.xib */, - A7AC09977AA6C9C8D865A841514714F0 /* QMHeaderCollectionReusableView.xib */, - 1720A2FD7BFD50B5BCD2043986CCCC13 /* QMImageIncomingCell.xib */, - 623EAF1FE03981545FC115E3F124772C /* QMImageOutgoingCell.xib */, - D347A4810417C5DC40E80E20374495DA /* QMToolbarContentView.xib */, - 2AA1E853F7496685C2CB018EA8621EB7 /* QMVideoIncomingCell.xib */, - 59A81D8A9AAA366E951E8266E524242E /* QMVideoOutgoingCell.xib */, - 29EE3959C96FAA7036DF10FCCA7585EE /* video-thumbnail.png */, - ); - name = Resources; - sourceTree = ""; - }; - 70223D91F61AF2DE875C3A8852A0F59B /* Frameworks */ = { - isa = PBXGroup; - children = ( - 356018E0608D3653E1DCDC00588F41CE /* FirebaseInstanceID.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 720C7E9BC34AC81BB1DDE450B435F5C8 /* Defines */ = { - isa = PBXGroup; - children = ( - DF8A6C68974A1DE0DDE95FD2AA38A06D /* GTMDefines.h */, - ); - name = Defines; - sourceTree = ""; - }; - 779623DAF3CE61167BF23AE25AF4417E /* iOS */ = { - isa = PBXGroup; - children = ( - 66C381DCDE7BBA6F1A02E2A9AC94B09B /* Accelerate.framework */, - D069F3495F04DE6723639DEA494A9D40 /* AudioToolbox.framework */, - 6AC39CF4BA6589985FAADCFDF1BA3E12 /* AVFoundation.framework */, - 9C9E61951DEB42D69DA1678E26E45E03 /* CFNetwork.framework */, - AB64DF2528E2706B75659262C43E0C50 /* CoreData.framework */, - 30722CDBA4D0A56C8E0C4A8AEB0F7DD6 /* CoreGraphics.framework */, - B36A12CDD2A61682846E88544F6927F9 /* CoreLocation.framework */, - 0820F6290823344A52B450D4DFE85FBB /* CoreMedia.framework */, - AAB7FE2F7E13A765849C397366F11867 /* CoreText.framework */, - AA7377A46BDFAFBC79986AA12BFBBA37 /* CoreVideo.framework */, - 24B6C4B6D32BA894A40B550A261FE664 /* Foundation.framework */, - 9313D39AC48A99B0BD9A0515100101D6 /* ImageIO.framework */, - 9362AAB7CC312287A4811C37235F233A /* MobileCoreServices.framework */, - 78871113E2E8880927AC6E26B088A625 /* QuartzCore.framework */, - CB64F9A7C3075D2CD905607868BCA222 /* Security.framework */, - 460B86BFD7B4332C9CF3C1EFF9F3967C /* SystemConfiguration.framework */, - DABC517BFE092CEEF189650039707D6C /* UIKit.framework */, - ); - name = iOS; - sourceTree = ""; - }; - 7BCBDE738477C76CDBB110E9A16DA83B /* Utils */ = { - isa = PBXGroup; - children = ( - 3B9F19DF82BA4D976EC7921538044BFB /* QMChatResources.h */, - 079F341D8ABD715D814F0C56673A3ECD /* QMChatResources.m */, - 002FED19B3E79635C82263BFBDBEC602 /* QMDateUtils.h */, - 9F69150B1DF4C1D9A6C739047C86B4F9 /* QMDateUtils.m */, - D85F56002D110E77304C14A0B3D10DD8 /* QMImageLoader.h */, - CEE3A74404D39FFEDFE81C58C2A63D06 /* QMImageLoader.m */, - ); - name = Utils; - sourceTree = ""; - }; - 7DB346D0F39D3F0E887471402A8071AB = { - isa = PBXGroup; - children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - A23C02BB00D461845CB0F37EB451D88F /* Frameworks */, - 8DEF950AB887F0837466FB9B201319E0 /* Pods */, - E93C834BEB400D531597867EDA38D12C /* Products */, - 01FA4638E45ED8CDCBC0FA7E45349009 /* Targets Support Files */, - ); - sourceTree = ""; - }; - 7E916295CE3F3A6BBA7D97E9AF86B69E /* Frameworks */ = { - isa = PBXGroup; - children = ( - C4514BF1C9C3B4F03449FAC87DB9AA89 /* FirebaseAnalytics.framework */, - 2B41D7C8CAAD7307D1D45EAE31BC808C /* FirebaseCoreDiagnostics.framework */, - 3B7D2703DD4CD24EC5B041954E8FFCF3 /* FirebaseNanoPB.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 7EEF97F3A7A7FB8E1D2BD3A3DD3D87E2 /* Core */ = { - isa = PBXGroup; - children = ( - 0DECE7A79E4C866BF281BE75C1FB87A9 /* GTMSessionFetcher.h */, - 0D5D5D44D9B7C9B28997C3E6B5B14431 /* GTMSessionFetcher.m */, - CE2DB781A51E7357878475580BE1ADF1 /* GTMSessionFetcherLogging.h */, - C69B08D399562AABC1C1585CD51832D8 /* GTMSessionFetcherLogging.m */, - 370AC8E5B0DDA438E65F35D1FD7C8453 /* GTMSessionFetcherService.h */, - 3BFA23B1D5513E07BE82C4B71B7AF973 /* GTMSessionFetcherService.m */, - 236F42CC0F327F45A723EA75F321EC1D /* GTMSessionUploadFetcher.h */, - 3038EFEFFBDC6E8E2BD879A1B50C4DC5 /* GTMSessionUploadFetcher.m */, - ); - name = Core; - sourceTree = ""; - }; - 8054DCEBC4CC1426B20BF1B0BB8D5A64 /* GTMSessionFetcher */ = { - isa = PBXGroup; - children = ( - 7EEF97F3A7A7FB8E1D2BD3A3DD3D87E2 /* Core */, - BCB4E103F21DCA4B431AF4127BC9E800 /* Support Files */, - ); - name = GTMSessionFetcher; - path = GTMSessionFetcher; - sourceTree = ""; - }; - 8112FCDCFD414BA633010D505300623E /* UIDevice-Hardware */ = { - isa = PBXGroup; - children = ( - AA65AAE9580D0C2DDE5448EE074AA614 /* UIDevice-Hardware.h */, - 47727F5161C70E2045257796A86386D2 /* UIDevice-Hardware.m */, - 28FC774F45F45362B11E56B6272EE325 /* Support Files */, - ); - name = "UIDevice-Hardware"; - path = "UIDevice-Hardware"; - sourceTree = ""; - }; - 8342C9358673CA413C1B3FB0CADC4947 /* Tasks */ = { - isa = PBXGroup; - children = ( - DC1139B19603A28570F8B4EE887445D8 /* BFCancellationToken.h */, - 90F45A704DB63BD8CCDC74E33099A589 /* BFCancellationToken.m */, - 57A1CC514ACB4A0A4F36B9F7F663DD5B /* BFCancellationTokenRegistration.h */, - C25E8F882DD681F894034D1F2C53AFCB /* BFCancellationTokenRegistration.m */, - A28269932111CE8DEFF54ADAC7B6CE59 /* BFCancellationTokenSource.h */, - C259B374368E1FC66A892888422DA16A /* BFCancellationTokenSource.m */, - A826CA3511B0341F9FA14C7517B3A33A /* BFExecutor.h */, - F4E37EB12C8DBE309FCD869E8355BDD5 /* BFExecutor.m */, - 764A61832A3A9BA2193C5373D32F2C73 /* BFGeneric.h */, - 840DB5B8D98241F0CBD308B4B0E18C26 /* BFTask.h */, - 7CB9BEE92E9958D35690DFD3FF22428B /* BFTask.m */, - 18F58F777A474BB227B55A448B074D94 /* BFTaskCompletionSource.h */, - 32A3E87042FCD1EE728C14EA128C6F76 /* BFTaskCompletionSource.m */, - EC194804088AA8081C03E24131F54E2E /* Bolts.h */, - 29DB827CCBDA8EF05B017A23DC0AD3ED /* Bolts.m */, - ); - name = Tasks; - sourceTree = ""; - }; - 85FC9F69BD0904C56920EFB8BA949014 /* NSString+URLArguments */ = { - isa = PBXGroup; - children = ( - 2FCF7E22B79515D693B4E70526A080B5 /* GTMNSString+URLArguments.h */, - 25640E034BB739D6AB4FD6CD7AB678A0 /* GTMNSString+URLArguments.m */, - ); - name = "NSString+URLArguments"; - sourceTree = ""; - }; - 875897E4216F586EF36050F0CE24AC7B /* Support Files */ = { - isa = PBXGroup; - children = ( - 609C3C3571ED002AE687466CD82DEFDB /* libextobjc.xcconfig */, - 3D0A99BC54878E91083A53C42B9B56CF /* libextobjc-dummy.m */, - 2514FDAA46839E2FC6DDA5826FA1FC9E /* libextobjc-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/libextobjc"; - sourceTree = ""; - }; - 8B24B380409201ADBFFA4CFAA45D973A /* Support Files */ = { - isa = PBXGroup; - children = ( - 61D1455F8389D1ABB155D6EC485D6589 /* Flurry-iOS-SDK.xcconfig */, - 16A207E314BEA46784A2B78DC689CB14 /* Flurry-iOS-SDK-dummy.m */, - F0A2B2FE0CB96C5C16612C8A8E012F2B /* Flurry-iOS-SDK-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/Flurry-iOS-SDK"; - sourceTree = ""; - }; - 8B27F7A2E5B2734F1ED38EFBEA8B0450 /* FBSDKCoreKit */ = { - isa = PBXGroup; - children = ( - 25CB0B9950F05337E357A2FFCF0C57E5 /* _FBSDKTemporaryErrorRecoveryAttempter.h */, - A7BC24BB314E0DAE5B5C4DF61513526C /* _FBSDKTemporaryErrorRecoveryAttempter.m */, - EE17D443990AD447F5A6464E4B7F5E5E /* FBSDKAccessToken.h */, - 225B414B92120D2EECFBE71C12E0002D /* FBSDKAccessToken.m */, - 7580353044549A295F1B6FCF1312A90F /* FBSDKAccessTokenCache.h */, - BA42F7AC1E97F893B3AE7336D017E82F /* FBSDKAccessTokenCache.m */, - 6611303AB4691567B73B2C4FB51A5EFB /* FBSDKAccessTokenCacheV3.h */, - B8B9A84DA4BB671C5E92592F223298A7 /* FBSDKAccessTokenCacheV3.m */, - CC34E7D012444087332A61118EDD62D6 /* FBSDKAccessTokenCacheV3_17.h */, - E14D309AE9DB8E370583DF39EEF2DC2E /* FBSDKAccessTokenCacheV3_17.m */, - E25B0FDA8817591CA826DE8B70D367F0 /* FBSDKAccessTokenCacheV3_21.h */, - 48E87C3DF7E589889A2DAE28EA910FA3 /* FBSDKAccessTokenCacheV3_21.m */, - 914CC03C89B4D2679E2D998C137617B3 /* FBSDKAccessTokenCacheV4.h */, - 3232649E9044548C5C6E39B1389A9D8B /* FBSDKAccessTokenCacheV4.m */, - 6F5EF6510309AB85D223836242E1C7A2 /* FBSDKAccessTokenCaching.h */, - 71F843ABB86CECAB10F855F8DB4EABC0 /* FBSDKAppEvents.h */, - 7E7B0E6E540E04E62433CA83A4C48EAE /* FBSDKAppEvents.m */, - 86D38AB2DF580B645033E2A81C7B87B8 /* FBSDKAppEvents+Internal.h */, - 458DA8C602BC4E7C9F208A2213969CD6 /* FBSDKAppEventsDeviceInfo.h */, - 99649297159B6E699F535BC837099254 /* FBSDKAppEventsDeviceInfo.m */, - 265A7C018D79CF16A5689490133E139E /* FBSDKAppEventsState.h */, - E5C0E8A8D78590FA3C9CA2E5E6145426 /* FBSDKAppEventsState.m */, - 1156FA220D18F49B41DE4BF56D1682C3 /* FBSDKAppEventsStateManager.h */, - 04BCB41E54AE39043E53CAD958B9D331 /* FBSDKAppEventsStateManager.m */, - 451ED94FC6ED41D4BA412E5D29A28D85 /* FBSDKAppEventsUtility.h */, - 599B7B1438EF4C287D13D3DFB77ABA1A /* FBSDKAppEventsUtility.m */, - D232A18EFB50EC2EB46C7B7EF4EA7EB2 /* FBSDKApplicationDelegate.h */, - F34BE90DA47B8362FB48F52F13FA00CB /* FBSDKApplicationDelegate.m */, - D6567809D1DD1A1D2DDBA77385BDE409 /* FBSDKApplicationDelegate+Internal.h */, - 595983B5E926BE155674908C70B2E386 /* FBSDKAppLinkResolver.h */, - 787C95889BEE3C3F31ABE0ED94D56761 /* FBSDKAppLinkResolver.m */, - 86EC999F1C150066E9E86041F19FBE4F /* FBSDKAppLinkUtility.h */, - D8DDD2E2A5DB17074720BDAE0AAA7B2C /* FBSDKAppLinkUtility.m */, - FBE263DE9E3F8046DEF606852F1917E2 /* FBSDKAudioResourceLoader.h */, - D78D96582009F9715BF5C42671D85AA7 /* FBSDKAudioResourceLoader.m */, - E6C89F11B8338CACCC27234705480843 /* FBSDKBase64.h */, - 90CAE0856C5DAE3E2BC26B54DF6F8B35 /* FBSDKBase64.m */, - 19743F9556614C8C51A077A94AED75FA /* FBSDKBoltsMeasurementEventListener.h */, - 3A595E2095D2502A17114536F18577C5 /* FBSDKBoltsMeasurementEventListener.m */, - 8893B0934E11007A196DA0507D9DFF71 /* FBSDKBridgeAPICrypto.h */, - 9EA6A30D23F80DBC394CAA1A1EAB6709 /* FBSDKBridgeAPICrypto.m */, - 603B44DED255763C9D848B7D493BD81C /* FBSDKBridgeAPIProtocol.h */, - D5F9264AB1B23720D7F6D7D9C995C29D /* FBSDKBridgeAPIProtocolNativeV1.h */, - E912FB8C12DDC129C07AED6A346DC3A5 /* FBSDKBridgeAPIProtocolNativeV1.m */, - 7B7D102953CA75CD0EF4B49546CFEEBD /* FBSDKBridgeAPIProtocolType.h */, - 530987E9AFF3ECB3018C85C934E5C1FF /* FBSDKBridgeAPIProtocolWebV1.h */, - 5D86674267B7B08C583569AF68A69834 /* FBSDKBridgeAPIProtocolWebV1.m */, - 25C8961FDA126C1338204200D54CFEBB /* FBSDKBridgeAPIProtocolWebV2.h */, - 83E12C4275C4962131A88468C39E4E7E /* FBSDKBridgeAPIProtocolWebV2.m */, - 8277160AD8AB8D66A5F9FA04182DF049 /* FBSDKBridgeAPIRequest.h */, - 00555FB9F2991B1CA49F0ABC1367E525 /* FBSDKBridgeAPIRequest.m */, - 5157D7249AE49BA7365BC44EAE2C366C /* FBSDKBridgeAPIRequest+Private.h */, - 56F6B364E01EC92143E38347E24FDF78 /* FBSDKBridgeAPIResponse.h */, - CFF68CC76E6B31BFD707C78EE48D810D /* FBSDKBridgeAPIResponse.m */, - C581322B4B20F1A8347F609CBA88E20A /* FBSDKButton.h */, - 9EC3DC1241BCE69DE894F27B310943D0 /* FBSDKButton.m */, - FE69ECFC90BBD846632095A9ED754462 /* FBSDKButton+Subclass.h */, - FFBAB761922F0FA88279C1DB10C306D2 /* FBSDKCloseIcon.h */, - 0ED81B1FCD4C06041AC65587F5295749 /* FBSDKCloseIcon.m */, - 0A84B30D64B5821356787503B90B625B /* FBSDKColor.h */, - 8D1060F6CE86F9203A33FCAA1D4B7778 /* FBSDKColor.m */, - 676AEA24265E71BD00FBD6A6F63F33EC /* FBSDKConstants.h */, - 994181A11C64A83A5009EBB786D239FC /* FBSDKConstants.m */, - BCB5CCA81DCC9ACF1D455F9BDE8B5569 /* FBSDKContainerViewController.h */, - 304E11684E388892253BE43A1FE88762 /* FBSDKContainerViewController.m */, - 66D5E80EBD416F2722AF78D15E9B186B /* FBSDKCopying.h */, - 00CE0B1ABBC0A41916AB4ECEDF004CD5 /* FBSDKCoreKit.h */, - AB1BEBD2DA54928762E98B3C7CA6F98F /* FBSDKCoreKit+Internal.h */, - 39B3631DF36D9826A8FED568C5FFDFC4 /* FBSDKCrypto.h */, - D203D3D75D0B9C7736ED22748587F6A3 /* FBSDKCrypto.m */, - 1AA3D9CF7D6F9085942DDAEC5D237353 /* FBSDKDeviceRequestsHelper.h */, - 18B40B0A9549C87CF162A1873D85CE90 /* FBSDKDeviceRequestsHelper.m */, - C8C62D7F21D95C1B8E3BC3A73AA496CF /* FBSDKDialogConfiguration.h */, - CA12F332446D556D1328C459BEC15AC0 /* FBSDKDialogConfiguration.m */, - 7AA50F517F4CCD5A51A5632070E694B8 /* FBSDKDynamicFrameworkLoader.h */, - CC98EDEA80261D9C6B40902413C60DB0 /* FBSDKDynamicFrameworkLoader.m */, - 5D29E6523C42866BA4C5B56224175847 /* FBSDKError.h */, - 8F587D27457E1B4ED4F84F28B04F5FC2 /* FBSDKError.m */, - C713B40D37C0E105DEA3026C3BC75817 /* FBSDKErrorConfiguration.h */, - 9E2A308E7BF7986FC0B0027063911EBB /* FBSDKErrorConfiguration.m */, - 8CCB1D75624DA20FAA20E9B6732B1707 /* FBSDKErrorRecoveryAttempter.h */, - 1B52C500E1218B55E62EF3F3B7D6C880 /* FBSDKErrorRecoveryAttempter.m */, - 27E3E0D200A7DCEDF9B0B44B4B722B6E /* FBSDKErrorRecoveryConfiguration.h */, - AB160DC8D83E4D56E49A48F536465CC9 /* FBSDKErrorRecoveryConfiguration.m */, - 08E989357139E9D222F79B70A96C5F9E /* FBSDKGraphErrorRecoveryProcessor.h */, - 3DC24D183EDFC1A12AA3C39BF0F1680C /* FBSDKGraphErrorRecoveryProcessor.m */, - 6DD8E1C76F3FDD9FC87B38C23AD2E2A1 /* FBSDKGraphRequest.h */, - C40565BC3BD2FEF6826E812AEC99060D /* FBSDKGraphRequest.m */, - 223F74CCD3252F9530E65ACEC3757025 /* FBSDKGraphRequest+Internal.h */, - C2C8143F1A6A58F85FB0CEC781C9BB18 /* FBSDKGraphRequestBody.h */, - ACC3810C5097B7BE906992E6F67B005A /* FBSDKGraphRequestBody.m */, - 66652D1C943DF95E9B8C052B11382F97 /* FBSDKGraphRequestConnection.h */, - 392E162EB13ED06DFFC2CE09453A94FC /* FBSDKGraphRequestConnection.m */, - DA3557F6CD1973A9BF96E0DCEC179F94 /* FBSDKGraphRequestConnection+Internal.h */, - D8F2CF24507A1C3E23326A71A1E16A70 /* FBSDKGraphRequestDataAttachment.h */, - C4A8B6E60636D3002973A6F34E834B98 /* FBSDKGraphRequestDataAttachment.m */, - 1A33EC680A2D1B15175B7387844ED892 /* FBSDKGraphRequestMetadata.h */, - F9A2D4A8885396AEE6B02DA325AC4093 /* FBSDKGraphRequestMetadata.m */, - A06E1612D0D44D16590E8684440EC14E /* FBSDKGraphRequestPiggybackManager.h */, - FFE438430990FEAE8590241A34BBC259 /* FBSDKGraphRequestPiggybackManager.m */, - E8936CD86933DAAE5899F36E42919461 /* FBSDKIcon.h */, - 97C7B1DAD03233EF3304B1CCDEB81243 /* FBSDKIcon.m */, - 2E5E419F3DA5C09513D2C39735D54D31 /* FBSDKImageDownloader.h */, - 9E831389AAFFD53B1FDDB57DD725410C /* FBSDKImageDownloader.m */, - BC48EDD13BA4E6D3AE30258BD8F845A9 /* FBSDKInternalUtility.h */, - 6041C120FF58F620228433352077B97B /* FBSDKInternalUtility.m */, - F50DA7EE00E763882E960D19EA3BAAEF /* FBSDKKeychainStore.h */, - 3CEE30EB9713F3BD8EE32897B4687C3F /* FBSDKKeychainStore.m */, - 8234D16036DC62F84BCD8765BE304B1F /* FBSDKKeychainStoreViaBundleID.h */, - D773F44D8CEABFB3FE06EDC01987DEF3 /* FBSDKKeychainStoreViaBundleID.m */, - B686CBF2119B8C835C7EF65885047EDA /* FBSDKLogger.h */, - 5033590F85F17C9039766ADD204012CB /* FBSDKLogger.m */, - 021811014C6811F999E09CCEEA749660 /* FBSDKLogo.h */, - 43595079ED0668E5805F5AAAC34CF27C /* FBSDKLogo.m */, - DFA44B46A5E918D4047B4FB7CC9920ED /* FBSDKMacros.h */, - 4BBD16B6A2FA030672B5EA90C507F94D /* FBSDKMaleSilhouetteIcon.h */, - DE4384F0EE9CB1DBC4103BBE82FE0C9A /* FBSDKMaleSilhouetteIcon.m */, - BD856D945F8BCD6714937270EEA47FEB /* FBSDKMath.h */, - 6D3E8AA01C5AD7E1C4CC200D06D48788 /* FBSDKMath.m */, - D888F2263C29B53454E55D3F0A4E0FF0 /* FBSDKMonotonicTime.h */, - D0344C9CACE3BAD71627ED84C722AB26 /* FBSDKMonotonicTime.m */, - 3D3E67792CFD928032A2EB83FC342B91 /* FBSDKMutableCopying.h */, - 684A104665BC36625E5E7349AC3AE27A /* FBSDKPaymentObserver.h */, - 12132BB3A3553DD7A1AE419AD5471D35 /* FBSDKPaymentObserver.m */, - 50ECCB5A7B1F4B42B47C60A608ECE87F /* FBSDKProfile.h */, - 331A73EBC1391A735CC7E3943275BEA0 /* FBSDKProfile.m */, - D36D6EE8B7FA973FFC8F720387556BD6 /* FBSDKProfile+Internal.h */, - 1660325F17F1639349A4459A7CCA7BE5 /* FBSDKProfilePictureView.h */, - 1F021049C7CD7194F2AF638DD3D2B634 /* FBSDKProfilePictureView.m */, - 5E4160030C35442B19C69FF664B892BD /* FBSDKServerConfiguration.h */, - B19B4CE3B5F527317F9000F8BACE68A3 /* FBSDKServerConfiguration.m */, - 82BAC18BFB5932D6FA9FF52EBF744D56 /* FBSDKServerConfiguration+Internal.h */, - 1F5B015F91145C2616B08F3661A9C364 /* FBSDKServerConfigurationManager.h */, - 92AFA49E5FC9462F49C66FCC4CF6A0A1 /* FBSDKServerConfigurationManager.m */, - 72F585DCAF3B7FD0727488358253F64C /* FBSDKServerConfigurationManager+Internal.h */, - CA08E01719AAC774A01538CAB7A1B449 /* FBSDKSettings.h */, - 224D173691747421A18CE820EAB0E7CD /* FBSDKSettings.m */, - 7E4E9058104640353A63350CCBFB4E7A /* FBSDKSettings+Internal.h */, - CD6348B159A9A73E6424FC8316E86F3C /* FBSDKSystemAccountStoreAdapter.h */, - 527740274CC6BD2FD49D950BA71702B1 /* FBSDKSystemAccountStoreAdapter.m */, - AC3604D88068BD37EB37085F94FC2954 /* FBSDKTestUsersManager.h */, - 7C80B950F6085784A2295911130078C2 /* FBSDKTestUsersManager.m */, - 737AAD7D5E41B4BABFABE11DC787B33A /* FBSDKTimeSpentData.h */, - E007CC53E6319489F35272DF3081A77C /* FBSDKTimeSpentData.m */, - B3C4909712E24448AB13E9E7E8910FA9 /* FBSDKTriStateBOOL.h */, - 302CBE6D07342C57220E6EB9A0E38697 /* FBSDKTriStateBOOL.m */, - 3573DCA69E1B8D952FE70D21F3CCD4C7 /* FBSDKTypeUtility.h */, - 0CD4FC52BCC1814174299975233CF7E6 /* FBSDKTypeUtility.m */, - CEBB70A8DC105E7DF82C58AE9BBCC039 /* FBSDKUIUtility.h */, - 09BF859A435E37A7EE916E0DDAE77FDA /* FBSDKURLConnection.h */, - E282485F093FA06646FEC35A9194C986 /* FBSDKURLConnection.m */, - 138BAFFAE3BF192059CD6AEBF90185F6 /* FBSDKURLOpening.h */, - EADE13C59CE6B770AD11C434965C1A9A /* FBSDKURLSessionTask.h */, - 99F1907A8D3314BD206F8C119E61F407 /* FBSDKURLSessionTask.m */, - A834C4B89C9666AFD697CBAB197B2DA2 /* FBSDKUtility.h */, - 2B28568E19F3BFADD8ABA9EC38F62875 /* FBSDKUtility.m */, - 7C2438AF30E432641E3449DF7C0B9125 /* FBSDKViewImpressionTracker.h */, - C734141F2019BFF2CBCE3DB9EBE3480E /* FBSDKViewImpressionTracker.m */, - 240431A27726D6D30F72213BE3D3901D /* FBSDKWebDialog.h */, - 2EDA899DC97EFD23CDF25D0CFC25100A /* FBSDKWebDialog.m */, - 3B52FA13590512AC7706E8ECC90928E1 /* FBSDKWebDialogView.h */, - 2DEBCD546E253E608A242FAFF96EED65 /* FBSDKWebDialogView.m */, - 8F351B1F82958496A1C71A929C1DDE5D /* Resources */, - 623689E2669969E2FA75AC114E84A235 /* Support Files */, - ); - name = FBSDKCoreKit; - path = FBSDKCoreKit; - sourceTree = ""; - }; - 8BCA3FAFB6CFD232A8E143F289173A1B /* FBSDKLoginKit */ = { - isa = PBXGroup; - children = ( - 20FC0FFB8D3FB73C790CA45B217BFB9E /* _FBSDKLoginRecoveryAttempter.h */, - B6075C0B4FDB662B359478AB679EEA3C /* _FBSDKLoginRecoveryAttempter.m */, - ABE526C6FEBB48F5EE6ABA8D40ABD3B7 /* FBSDKLoginButton.h */, - BEAEAA5389124BB18CB12F603B97454C /* FBSDKLoginButton.m */, - 4F7164B104C8C9D51BA2BC400F5C7C4F /* FBSDKLoginCompletion.h */, - 5AFBE6249A36D904599A4EC90B89BE30 /* FBSDKLoginCompletion.m */, - EA4272F8265796E736AAD288790D1CA1 /* FBSDKLoginCompletion+Internal.h */, - 2A66BD5CF7266B610CDBE8441B35F2B6 /* FBSDKLoginConstants.h */, - 3CDDA48D5E51C7DE282D5E23B80587F5 /* FBSDKLoginConstants.m */, - 24D71417F6A0929EBA47DE84803474EA /* FBSDKLoginError.h */, - 215E6C5268861B122C42AF7CE5CAA431 /* FBSDKLoginError.m */, - 41A3FAA68CCBF4BD8C1882E9F34DD3CA /* FBSDKLoginKit.h */, - DA134C2686012652233FBCEF289AFA1B /* FBSDKLoginKit+Internal.h */, - 933A45C395BF3005EC1111DC805DAA82 /* FBSDKLoginManager.h */, - 71320870D0D676F25C36DACAC7BE54A6 /* FBSDKLoginManager.m */, - 4C68408B5AC64BA3132545DB93EB4F31 /* FBSDKLoginManager+Internal.h */, - 30A63DC3B6B1513D0B832062AC69F899 /* FBSDKLoginManagerLogger.h */, - 155F1E92FD7733BDA0831F156C78B123 /* FBSDKLoginManagerLogger.m */, - 5BB823AC01DD59F67F3C280EF863921D /* FBSDKLoginManagerLoginResult.h */, - F40D71B23D852147A5FFE0DCD5F3B261 /* FBSDKLoginManagerLoginResult.m */, - F80E2FED6A6B9996DE5E8D745804DBE1 /* FBSDKLoginManagerLoginResult+Internal.h */, - 90026104B4F4B48464A9A039CB80A5CD /* FBSDKLoginTooltipView.h */, - 2BE4F51B8CF03709B6F99E35A7849E56 /* FBSDKLoginTooltipView.m */, - 299E08F144050D85C1998FD721F4F27B /* FBSDKLoginUtility.h */, - FC95AA45FCA474BF3293070A8B03D4BA /* FBSDKLoginUtility.m */, - EB15A38110FF7DF1F99A4CBCA4DAC9AC /* FBSDKTooltipView.h */, - 7F951E200167D808F5A2AC46B398E0EE /* FBSDKTooltipView.m */, - 5ADE5666C9D64D699927F5F9B6F8BD28 /* Support Files */, - ); - name = FBSDKLoginKit; - path = FBSDKLoginKit; - sourceTree = ""; - }; - 8DEF950AB887F0837466FB9B201319E0 /* Pods */ = { - isa = PBXGroup; - children = ( - B7CF062EFAEAAB4FCCAF3EA14259DD55 /* Bolts */, - BC3AE406FBE6DF7B087D9A507F2B18AC /* Crashlytics */, - B5F7E111C3506FDCEBA19AA4763FFF55 /* Fabric */, - 8B27F7A2E5B2734F1ED38EFBEA8B0450 /* FBSDKCoreKit */, - 8BCA3FAFB6CFD232A8E143F289173A1B /* FBSDKLoginKit */, - 9B99E98287FA02DB925A56A815CF93AF /* FBSDKShareKit */, - 172AEF25FC055C7658404A796EC97DBB /* FFCircularProgressView */, - ECDF500B51B5FF3432DFE9637601C849 /* Firebase */, - 13706B8C5B44A985762168CE3E829026 /* FirebaseAnalytics */, - D9109AFD7E068EDFBCFE459D7EB802A6 /* FirebaseAuth */, - E309E4B69F467059D8D2E80967E0CD78 /* FirebaseCore */, - 4FEC8820A6B317B4B678BCFA2F8D04B0 /* FirebaseInstanceID */, - E44E8B67BE162111A1A084E824BF6268 /* FirebaseUI */, - AD28239250747D1F4EE0A9ABBB07687E /* FLAnimatedImage */, - DA26729DFACA6B0D6D9332AA5374E13A /* Flurry-iOS-SDK */, - A8EFE4E5973A6DA002897284C80FB1FA /* GoogleToolboxForMac */, - 8054DCEBC4CC1426B20BF1B0BB8D5A64 /* GTMSessionFetcher */, - 43C4C34D0481E200C5B65F0AE6A4A2A6 /* libextobjc */, - 61687578151311DB21585FB5CDECDBE1 /* nanopb */, - 2D0AF10955D7378DD03C305BEF094CF3 /* NYTPhotoViewer */, - 4BDFEDCAA487B9B7B4F6203350074A58 /* QMCVDevelopment */, - 43D865B1C343479E4E43AAFB24BAA47E /* QMServicesDevelopment */, - F036556B255FB59FC23546108A783C03 /* Reachability */, - 09F7FAB85CE1AD574B8744B17A9CDBEB /* SAMKeychain */, - B9B033CC897B42EF422F2B08287C8381 /* SDWebImage */, - 6A9AE718CBE5729CD3162FED2E56A7B0 /* SVProgressHUD */, - F515827506F1359E97C45BDDC1C3442D /* TTTAttributedLabel */, - 8112FCDCFD414BA633010D505300623E /* UIDevice-Hardware */, - ); - name = Pods; - sourceTree = ""; - }; - 8E4B99C00B7CF89D049A0EF5D240CA06 /* Support Files */ = { - isa = PBXGroup; - children = ( - A8A49BEE0222B6632DAD15E581A05687 /* SVProgressHUD.xcconfig */, - ABF24F1536DC90171DF6D3B0D35DC350 /* SVProgressHUD-dummy.m */, - 466238F9080675145428EB01CF83865A /* SVProgressHUD-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/SVProgressHUD"; - sourceTree = ""; - }; - 8F351B1F82958496A1C71A929C1DDE5D /* Resources */ = { - isa = PBXGroup; - children = ( - 49693E6A5E2B0565BE9BB578F1486689 /* FacebookSDKStrings.bundle */, - ); - name = Resources; - sourceTree = ""; - }; - 91C24C083C52364DFE2398EC96FF7803 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B19245C79F6ED783C0DDBAA9E5C1B452 /* FirebasePhoneAuthUI.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 930526A2E4E1682FFE1CDC1E1B0F447A /* AppLinks */ = { - isa = PBXGroup; - children = ( - C165906809A74E5EACEDE86AAEEF073E /* BFAppLink.h */, - CC41888A8BE9DA14B959E7D4CC0FE546 /* BFAppLink.m */, - 8D3AB0D2FBB6356F8635DE75459DEC0E /* BFAppLink_Internal.h */, - 1AEB403D711889326E9D406BD6A2D4CB /* BFAppLinkNavigation.h */, - D0A39D6F05FAAD1BFAAB9A5EE233F01E /* BFAppLinkNavigation.m */, - 4017B8003DD493405C9F1E934B7CEBAB /* BFAppLinkResolving.h */, - 2AFF89719764120E460C2E2C2E460C1B /* BFAppLinkReturnToRefererController.h */, - F4132F69849FE0836A5D2FE601B2873A /* BFAppLinkReturnToRefererController.m */, - 9B8C623A87FBF3D1D8C9ED2314626863 /* BFAppLinkReturnToRefererView.h */, - 865E5FA44C5C9D8EC6BB2DADE3BEDCFC /* BFAppLinkReturnToRefererView.m */, - A18D52AE481F843989AF494A0004E0AC /* BFAppLinkReturnToRefererView_Internal.h */, - 233D296DB63CE217070A683070460A5E /* BFAppLinkTarget.h */, - 112BC18BC10E6D3CB254C1A156DBBC8B /* BFAppLinkTarget.m */, - CAFCEC73586253D59E882180008A44AB /* BFMeasurementEvent.h */, - 9BAD650DFF338F79F40A02FB8818283C /* BFMeasurementEvent.m */, - 1A7105280B17D416DB95565FD313B201 /* BFMeasurementEvent_Internal.h */, - 6AA6A0CB78DEE3CE405F36F1D47C6A50 /* BFURL.h */, - EC80323AA90D7D04E0FFD709CC44537D /* BFURL.m */, - 1401CC3365CC77C23A9189C456CC75DE /* BFURL_Internal.h */, - FAA4B5DE44728414A8037AB5DC56767C /* BFWebViewAppLinkResolver.h */, - B3E349F9CAD08BC29D38EA663928EA40 /* BFWebViewAppLinkResolver.m */, - ); - name = AppLinks; - sourceTree = ""; - }; - 9AD47A309E6E0BEFFEB328D0F7DF5AD9 /* NSDictionary+URLArguments */ = { - isa = PBXGroup; - children = ( - 7F1AD2D0AE6D1FFBC18F2AF42AD672B0 /* GTMNSDictionary+URLArguments.h */, - 0A69948B9C828AB814621BA408FD5712 /* GTMNSDictionary+URLArguments.m */, - ); - name = "NSDictionary+URLArguments"; - sourceTree = ""; - }; - 9B99E98287FA02DB925A56A815CF93AF /* FBSDKShareKit */ = { - isa = PBXGroup; - children = ( - BBA56BE1D6A2C0F17806B2B2DB820634 /* FBSDKAppGroupAddDialog.h */, - B274818CA26AC2C189F1A10888BA1A65 /* FBSDKAppGroupAddDialog.m */, - B58379B06E15719329B0659DB330DA0A /* FBSDKAppGroupContent.h */, - B95EF363778B5A9FAAA84402325043DD /* FBSDKAppGroupContent.m */, - 3E55A205443FE63AFCACDFD1BFB015CA /* FBSDKAppGroupJoinDialog.h */, - 4D44313DA082F6A088E8D57A28C7ED79 /* FBSDKAppGroupJoinDialog.m */, - 5256F332463B998F064C17F3C2D4AB56 /* FBSDKAppInviteContent.h */, - 9A1BC23D69D5960430E47118B78326E9 /* FBSDKAppInviteContent.m */, - F1B430EE341351F2C244EF979AE8303A /* FBSDKAppInviteDialog.h */, - CCE21F12D99AB0FD1ED6C15819452E1C /* FBSDKAppInviteDialog.m */, - 593197B56D415C8A2B225D4E7A4C67A5 /* FBSDKCameraEffectArguments.h */, - 4EE18934F1DF5E3033F558167EB6DB47 /* FBSDKCameraEffectArguments.m */, - 93D9B57C9B26DD8B4208E51ED2A417F1 /* FBSDKCameraEffectArguments+Internal.h */, - F7FC9A7CD509F754C16E705278B985C3 /* FBSDKCameraEffectTextures.h */, - ABCC8D3EEF42CEEB9C802066ED38AC11 /* FBSDKCameraEffectTextures.m */, - 377475C994438724A03F01B8F5C4D64C /* FBSDKCameraEffectTextures+Internal.h */, - F2BDF73C530D25C909970DEBF87FFBB6 /* FBSDKCheckmarkIcon.h */, - 88EB65360379717F21C5A6891BAAF76D /* FBSDKCheckmarkIcon.m */, - 90D0CE6379C5F06566AF9A5BFCEBEBE9 /* FBSDKGameRequestContent.h */, - 1AE3120E26D9E7C9966D99F76FE7093C /* FBSDKGameRequestContent.m */, - 1D5E33B2967AE3629B0155B2CC237DBC /* FBSDKGameRequestDialog.h */, - 765BF07B1A244B280EE689D9CAD0C4CE /* FBSDKGameRequestDialog.m */, - A35113DF0B7F8FBBC9FD814876957040 /* FBSDKGameRequestFrictionlessRecipientCache.h */, - 391BF86B41DDD8AAD69BCB51AED73DD0 /* FBSDKGameRequestFrictionlessRecipientCache.m */, - 05353E79445CE9E3D4F4A025397B34D2 /* FBSDKHashtag.h */, - 6E5E5C7A90DB6A540B902BBF4B66AD00 /* FBSDKHashtag.m */, - 47081DBCE7B0B7F8F70162BC17979CF9 /* FBSDKLikeActionController.h */, - 95B8F3DAD4B5925CAD8B9DB63B8283D8 /* FBSDKLikeActionController.m */, - D7CB2B14A1847A9702F1E9A4B24F2BD8 /* FBSDKLikeActionControllerCache.h */, - B5DDBA9BC7AC149CF8A12739CCD0A6A3 /* FBSDKLikeActionControllerCache.m */, - 51CEFCC977A37A4282025DA873B94FE8 /* FBSDKLikeBoxBorderView.h */, - 18A781478CCFADE8CCAE30503C1764EA /* FBSDKLikeBoxBorderView.m */, - F27F17F54FB8227C0EC228C194650517 /* FBSDKLikeBoxView.h */, - 11785C80BBB15A24FC6F6FEF006677D3 /* FBSDKLikeBoxView.m */, - 236F7EE69406E766463A15AE27501D4C /* FBSDKLikeButton.h */, - 930FDD9F80CB0D6AB45FA86FD1A62AEE /* FBSDKLikeButton.m */, - D01B7B8345D9DBE58CDA9D2D2DCDCFB4 /* FBSDKLikeButton+Internal.h */, - 5DBFF290B302089F4214D4B875793DB6 /* FBSDKLikeButtonPopWAV.h */, - F7AC37FA924377ABF92A992729BDBDE6 /* FBSDKLikeButtonPopWAV.m */, - C8794E8722D151ABB99B4E705411FE3E /* FBSDKLikeControl.h */, - A0B8B54A2F11E9EEAFB92DBAA44FACF1 /* FBSDKLikeControl.m */, - 07D0F096787C0D1257A4E0EF4217EECC /* FBSDKLikeControl+Internal.h */, - 763328B5B00FB93B9A27AEF090890729 /* FBSDKLikeDialog.h */, - 42E2F6CEE0AD7051F957283D989F48C9 /* FBSDKLikeDialog.m */, - AF7FDD47B2A19B0F41A8454E7209E0BD /* FBSDKLikeObjectType.h */, - 1089BA1FF6078008C86B24202F3548ED /* FBSDKLikeObjectType.m */, - A1F54B4046E93628DCC0ACC824E213CE /* FBSDKLiking.h */, - 9029E5B1E7E24D53543B68C38F118048 /* FBSDKMessageDialog.h */, - AF91B474790172A61D5CA15606433BDE /* FBSDKMessageDialog.m */, - 72C53FF6D4E7AFC1B5FBD911B16A9723 /* FBSDKMessengerIcon.h */, - 330AE8E741FE53EB40210B12CAF437F8 /* FBSDKMessengerIcon.m */, - F7038E58755AFE47874167D604176AF1 /* FBSDKSendButton.h */, - 18FE119817F8DB209E84B934A8097C3B /* FBSDKSendButton.m */, - 84C253419EBA4489EEB22C4694722DDF /* FBSDKShareAPI.h */, - EB686956C568FA72907F1AFA4AC7CDE5 /* FBSDKShareAPI.m */, - 031008A6CEA97F2B331FAC30CE005348 /* FBSDKShareButton.h */, - 8984E3C783F423873397C30EF5EEE2BD /* FBSDKShareButton.m */, - F1B626C30609C9AC9476DF60FD012671 /* FBSDKShareCameraEffectContent.h */, - 468A576FC083F386CA03F0C308F16926 /* FBSDKShareCameraEffectContent.m */, - EC197E55D9592E31472CF14B4B386F3C /* FBSDKShareConstants.h */, - 3E95A348AE6C9FE58C521DC686557EBA /* FBSDKShareConstants.m */, - FD270B49C5DD78CEA5B08D21A373436D /* FBSDKShareDefines.h */, - 2CD5FC8078E1482E38C071494027C20C /* FBSDKShareDialog.h */, - 608B627E7BB108D4CAE7DEB08CFE5211 /* FBSDKShareDialog.m */, - 263F7EB1436D02E172B5ACA4EBFB1413 /* FBSDKShareDialogMode.h */, - 80EC509EB72394DC196A2115B55556C1 /* FBSDKShareDialogMode.m */, - CC1BF1A897EE88B1F81D3890E6E5A96F /* FBSDKShareError.h */, - A9DC18DF05E4A40BAF1EE7D702263D5A /* FBSDKShareError.m */, - B4C95BDA2E423F449EE9229706F55654 /* FBSDKShareKit.h */, - 62F7C636AD145412676EDBF36CDE5EA7 /* FBSDKShareKit+Internal.h */, - 73A5A6A06E9724DDDA1544678DB6F73E /* FBSDKShareLinkContent.h */, - DD2956E91B8A4356BBB8321384E684F8 /* FBSDKShareLinkContent.m */, - D4A5D4608F913AD1C6570A4870302FC4 /* FBSDKShareLinkContent+Internal.h */, - 93E84DD0FB95C01B073F683BCC27B0B4 /* FBSDKShareMediaContent.h */, - D96720D6317B3A4095A8BC3B7093E97E /* FBSDKShareMediaContent.m */, - 4AF171297875DFFC8CBAABBE2FA1FA7A /* FBSDKShareMessengerActionButton.h */, - D0D89469DC6519B455A40EF78F86973D /* FBSDKShareMessengerContentUtility.h */, - 900A95B4617CB79265039BED16D6EF2B /* FBSDKShareMessengerContentUtility.m */, - E75A2835AF620D82367451B4333E100F /* FBSDKShareMessengerGenericTemplateContent.h */, - C782365BE089A591160CF53CB0F3421E /* FBSDKShareMessengerGenericTemplateContent.m */, - 756073924DDF758CD4ED5E59DE19C9E4 /* FBSDKShareMessengerGenericTemplateElement.h */, - 7D146B956116E8DBF570F97FC654B355 /* FBSDKShareMessengerGenericTemplateElement.m */, - B3F4ABD9B9F0AC534E01D48F7E854569 /* FBSDKShareMessengerMediaTemplateContent.h */, - B27FEABD7DE7E55DD2D5630CC433AD7F /* FBSDKShareMessengerMediaTemplateContent.m */, - 0BF70F698A2E22E7E7DAF52C44FA3B50 /* FBSDKShareMessengerOpenGraphMusicTemplateContent.h */, - 72006B0930241D522F61D3F8C5FFED74 /* FBSDKShareMessengerOpenGraphMusicTemplateContent.m */, - 21EDC3688D7A9C8592C96A198C63679D /* FBSDKShareMessengerURLActionButton.h */, - 4360BC0AA750D7B598C1D21B7EB2265F /* FBSDKShareMessengerURLActionButton.m */, - 421603975CFE9613D73C5E6577237800 /* FBSDKShareOpenGraphAction.h */, - EC8EBF79BFC52516212602FC209A853C /* FBSDKShareOpenGraphAction.m */, - CA9040C299AB0C8FE901BAFB27589A26 /* FBSDKShareOpenGraphContent.h */, - 74A51E390286623D16120657C376278B /* FBSDKShareOpenGraphContent.m */, - 9EB4F66FA729C6D4D28E724E013935FA /* FBSDKShareOpenGraphObject.h */, - 55F0C079A0FB9471888D47EDACE322CB /* FBSDKShareOpenGraphObject.m */, - D2D55D7D48F8784AA5618975FD617586 /* FBSDKShareOpenGraphValueContainer.h */, - 7D235F837BCDF0CE31B1CFF27A3B8F33 /* FBSDKShareOpenGraphValueContainer.m */, - E80AAFDF8374B02B046EDB6F347E8137 /* FBSDKShareOpenGraphValueContainer+Internal.h */, - 5D5B5C788B7D0FB14029E5160ABA4D37 /* FBSDKSharePhoto.h */, - A92B1096662738367F0A80D8E156C504 /* FBSDKSharePhoto.m */, - 3DC21BB63CE6C9D7B9CFEBFFB0A4B126 /* FBSDKSharePhotoContent.h */, - 17D912AC7B6466290F0D6374BB13373E /* FBSDKSharePhotoContent.m */, - 235C1AC47AE6A5012AA789E76846B143 /* FBSDKShareUtility.h */, - C120840F754FD30907143B9C16AE9914 /* FBSDKShareUtility.m */, - 8D407FC7369497DC059AC41B496CE64A /* FBSDKShareVideo.h */, - 20C86635B92C916B2C7F03A80AD20B7A /* FBSDKShareVideo.m */, - 043841364B0EB3C71C6C4B47DC4CC399 /* FBSDKShareVideoContent.h */, - 42D9686C057957B2E8A487CC0BE954D6 /* FBSDKShareVideoContent.m */, - E61F026F7C0E548275FF388A259E6012 /* FBSDKSharing.h */, - 3D660EFF78CD8002D8D864C4CA1566CF /* FBSDKSharingButton.h */, - 53372BB1BBC02D42FB833DF9A49CB4B8 /* FBSDKSharingContent.h */, - 0CED475A16F4DE439ACF794B37041710 /* FBSDKVideoUploader.h */, - B7617C3525C04A2422CD47870C26990B /* FBSDKVideoUploader.m */, - 568C0C8CE1605B32339D6236CE4E2370 /* Support Files */, - ); - name = FBSDKShareKit; - path = FBSDKShareKit; - sourceTree = ""; - }; - 9D63335BE6E2BEEF2A135E5DA7D9052C /* QMChatLocationSnapshotter */ = { - isa = PBXGroup; - children = ( - 7CDF5B38750A6054440F908FC96A1775 /* QMChatLocationSnapshotter.h */, - 5A3AA872B91A2CC97401057B53EAC291 /* QMChatLocationSnapshotter.m */, - DCE60203ECFAD7051D11A0987E884007 /* UIImageView+QMLocationSnapshot.h */, - 5477BE6F4695F1285770C98168E76CBD /* UIImageView+QMLocationSnapshot.m */, - ); - name = QMChatLocationSnapshotter; - sourceTree = ""; - }; - 9F9A4C7E87D3A2E8DFD891FE996B1EF1 /* Support Files */ = { - isa = PBXGroup; - children = ( - 2281FD5AE75987CDFA35A7ED2A9EDF42 /* Bolts.xcconfig */, - D879FD07C9A8D90452D95C6A1FACE0D5 /* Bolts-dummy.m */, - 779555251CADCFD9FE2C4DF32C27A5D7 /* Bolts-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/Bolts"; - sourceTree = ""; - }; - A23C02BB00D461845CB0F37EB451D88F /* Frameworks */ = { - isa = PBXGroup; - children = ( - 779623DAF3CE61167BF23AE25AF4417E /* iOS */, - ); - name = Frameworks; - sourceTree = ""; - }; - A3B8FFCEF1893AEEBD4ED4FF8AC97941 /* Pods-QMSiriExtension */ = { - isa = PBXGroup; - children = ( - 7C5E7AD4B06BE092318688D367BA2FB2 /* Pods-QMSiriExtension-acknowledgements.markdown */, - 0FA5EF20A12DA5DFC66B0FF0995D4827 /* Pods-QMSiriExtension-acknowledgements.plist */, - CAA03ECF9FE11C0F230CEEB1CEB71591 /* Pods-QMSiriExtension-dummy.m */, - 33EB76165CD517E545F6B6CD2CE325DF /* Pods-QMSiriExtension-resources.sh */, - 99C74C46C05BE270A98670468206DFF2 /* Pods-QMSiriExtension.debug.xcconfig */, - F276038B3CAE2F7D051F98B9FC60530E /* Pods-QMSiriExtension.release.xcconfig */, - ); - name = "Pods-QMSiriExtension"; - path = "Target Support Files/Pods-QMSiriExtension"; - sourceTree = ""; - }; - A7E2C16ABB227B86C3760D36C315BEAD /* Protocols */ = { - isa = PBXGroup; - children = ( - E0E7991DB50CAA2A1607953A62C51099 /* QMChatCollectionViewDataSource.h */, - FEF9C001A98CEB6AE0122452FCF79D4F /* QMChatCollectionViewDelegateFlowLayout.h */, - ); - name = Protocols; - sourceTree = ""; - }; - A8EFE4E5973A6DA002897284C80FB1FA /* GoogleToolboxForMac */ = { - isa = PBXGroup; - children = ( - 312CAE004F0DE1AE50D70BA5DF22ED50 /* DebugUtils */, - 720C7E9BC34AC81BB1DDE450B435F5C8 /* Defines */, - 2C592A5007F26CE1D7209B63CEB69066 /* NSData+zlib */, - 9AD47A309E6E0BEFFEB328D0F7DF5AD9 /* NSDictionary+URLArguments */, - 85FC9F69BD0904C56920EFB8BA949014 /* NSString+URLArguments */, - ED471EE63D0D96683720334D68990334 /* Support Files */, - ); - name = GoogleToolboxForMac; - path = GoogleToolboxForMac; - sourceTree = ""; - }; - AA2CFA78B1D3806B2D66F9EFEC967EF2 /* Core */ = { - isa = PBXGroup; - children = ( - 6223DD42F4FC983C8438990C0BB45FBB /* NSButton+WebCache.h */, - B28EB0ED22BFE9FED06B2AE5C6829617 /* NSButton+WebCache.m */, - 3FA52E1D03B632C35E48776DCDB24032 /* NSData+ImageContentType.h */, - 9329F9B4D71892A47DE7FE8D0BC53E87 /* NSData+ImageContentType.m */, - C3FC244C5A5F171845825CC15794216E /* NSImage+WebCache.h */, - 0AFE3229DC0A66C3AABBC7D0816C8897 /* NSImage+WebCache.m */, - 8A06EDCC386DEA3CBD459D81F769D207 /* SDImageCache.h */, - BF2A7A1EB60C520E67DCC44F60B47D0E /* SDImageCache.m */, - FDF36D9AEC0C6D9E14ED48823CE2AFF3 /* SDImageCacheConfig.h */, - 2F8FD790FFB37E5799BCFEC2C0857AC3 /* SDImageCacheConfig.m */, - 57DF8A2F4AFF8700944BF54747456003 /* SDWebImageCoder.h */, - 2745382AEAC1F9779BA878A29018A44F /* SDWebImageCoder.m */, - 9FEDCD23F79E94BFEEB392B6B2BCEB1B /* SDWebImageCoderHelper.h */, - E96A0B44FEE8657931A3D71C00946BB4 /* SDWebImageCoderHelper.m */, - CD6FCFE5E8D5EB3CE81A9EAC86CA794E /* SDWebImageCodersManager.h */, - A499C6C09B6BE90562AC44979B08C891 /* SDWebImageCodersManager.m */, - C55D7318BA5BE50B86CD8603FBEEB3D3 /* SDWebImageCompat.h */, - E209B8E253D16A436E4B9D4B48020F20 /* SDWebImageCompat.m */, - 12A2C51300046BAF7F8E9C9DD82A78C7 /* SDWebImageDownloader.h */, - 01A7CC34EB4681D8ED395D2394255C2F /* SDWebImageDownloader.m */, - 576C65EDEB58BF1C443B14458B568998 /* SDWebImageDownloaderOperation.h */, - EBA2CCCB1903C4680917EB15D07B52C9 /* SDWebImageDownloaderOperation.m */, - 3609642BB02D23DF636641B152BBDD77 /* SDWebImageFrame.h */, - 8C0FF43DFF86E88494D979E7C3943BB7 /* SDWebImageFrame.m */, - 39939F54BB0434A8DFD3CF9BB9C1ABCD /* SDWebImageGIFCoder.h */, - D2E177A4CAE136F54EA4E0BDEAA5890E /* SDWebImageGIFCoder.m */, - B2B269A85EB96A9FFCDC384073043086 /* SDWebImageImageIOCoder.h */, - 42FF83673066372C7EEF4020803F4777 /* SDWebImageImageIOCoder.m */, - 6E67FDDDBD8079680CD1EF44AB7C8082 /* SDWebImageManager.h */, - C9C8E65083DB4FD6BDB56A6133D12C8F /* SDWebImageManager.m */, - E6291182DE3FFB3C0BF1A25B5CA5FBCA /* SDWebImageOperation.h */, - D91544FF70B6A4903BD91AD1F3E9A26E /* SDWebImagePrefetcher.h */, - 58E8FE45602DE9E08A6D7BE8C56DD69D /* SDWebImagePrefetcher.m */, - AB9258404ACB7E29344925DF54CE71B8 /* SDWebImageTransition.h */, - 4DBD5EB6C78AA59029695E99C381B64A /* SDWebImageTransition.m */, - D0E6981F1A3F410359835A8055C50BFF /* UIButton+WebCache.h */, - EB271C553105289698C47C9CF5C224BD /* UIButton+WebCache.m */, - 2B5E20CA76356FE57EDE8348CE3BACA4 /* UIImage+ForceDecode.h */, - 96AE3735391F049B3F9A15A9E25D415B /* UIImage+ForceDecode.m */, - 6E93EEE326E1D4E21CE612BEC878ECF1 /* UIImage+GIF.h */, - EF47236BC47DEB7D714A46FD340BE204 /* UIImage+GIF.m */, - 5CEC4854342C3AD8A79A73B36AD81409 /* UIImage+MultiFormat.h */, - F6C8CA525D54506E30EEA03CF05369AE /* UIImage+MultiFormat.m */, - DC078FAD2A8120DF47525C4860A3222B /* UIImageView+HighlightedWebCache.h */, - 5C6ED5A69193FE124F885CEC2BF9AD09 /* UIImageView+HighlightedWebCache.m */, - 09A33ECBCFC7DE86C491FE3219D6CDFD /* UIImageView+WebCache.h */, - 0E329F55E5CA7A4EC055263A8D1DC45C /* UIImageView+WebCache.m */, - 7261D89E5B106DA272913C2308582E9D /* UIView+WebCache.h */, - 0239AF1E527E4B141E2AA27ED088F54A /* UIView+WebCache.m */, - 9D2FDD67FB5585AF665E74CE5DBE363D /* UIView+WebCacheOperation.h */, - 2EE4C18E6BD9975A20DE23FB5BBC0A8B /* UIView+WebCacheOperation.m */, - ); - name = Core; - sourceTree = ""; - }; - AD15EAB419FB8659B0AA15FBC74AEE8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - 9A70D8EA232010D20A957A90BC59B2A6 /* FirebaseAuth.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - AD28239250747D1F4EE0A9ABBB07687E /* FLAnimatedImage */ = { - isa = PBXGroup; - children = ( - C971B1513487337794CB0F0D87780D30 /* FLAnimatedImage.h */, - 9E257F2CBCC63464FD3C183C76440F54 /* FLAnimatedImage.m */, - D01803EE5338ED3E8A9482B695FEC5B2 /* FLAnimatedImageView.h */, - FF44703B7F1B1E794B9EF6E9103AB7AD /* FLAnimatedImageView.m */, - F228ACBBDDEC50CDAFB78E8D1B29BAE3 /* Support Files */, - ); - name = FLAnimatedImage; - path = FLAnimatedImage; - sourceTree = ""; - }; - AE675C6BCA1A9ADE79DBB8B6C65E8D9D /* FlurrySDK */ = { - isa = PBXGroup; - children = ( - B66B0F8377035F8B660617B331D5EAF8 /* Flurry.h */, - CAA3970509B00EF4178CFC00D5C4BB91 /* FlurryEmpty.m */, - BC851FE9665A131E38587F26DDA01AB8 /* FlurrySessionBuilder.h */, - E1595A90C5127CEDE5FF0CDB4722EE92 /* Frameworks */, - ); - name = FlurrySDK; - sourceTree = ""; - }; - AEE3D9B4D261C8C08FC8E82FD93DDAAA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 381979B9A086FF8DEF1F367F32120DF7 /* FirebaseCore.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - B05B85288ACC71CF46AA6759524F7976 /* Frameworks */ = { - isa = PBXGroup; - children = ( - A77CDDEA831527A19FAA23E1B93E9A9C /* Crashlytics.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - B59A8212B2D54F016D98DCD67A03CE80 /* Categories */ = { - isa = PBXGroup; - children = ( - 37E50D67E198C2551C3D9C764E6C22C3 /* NSString+QM.h */, - 7A4C8E5B60222704205C0EB815C2DD68 /* NSString+QM.m */, - ECD8A3D627396A4AF16FC0386EF61A1E /* UIColor+QM.h */, - BA2786FCB45F06114D09057957C5E821 /* UIColor+QM.m */, - 9B5674C5E755CA9EC6689E806AA5783E /* UIImage+Cropper.h */, - 3D793B6DE58E7C33B1EB8EC02EB96A09 /* UIImage+Cropper.m */, - 2C189AC392E278C3D9C3916A88FF5F6D /* UIImage+QM.h */, - 4EE719DF66153E1A888A029ABDB3C648 /* UIImage+QM.m */, - 4900159BDBDAF9D9C71F06922E2A1258 /* UIView+QM.h */, - 0B538BFDD228E858FDB6E9B9165BF754 /* UIView+QM.m */, - ); - name = Categories; - sourceTree = ""; - }; - B5F7E111C3506FDCEBA19AA4763FFF55 /* Fabric */ = { - isa = PBXGroup; - children = ( - 74870A09DCEBBB98B4C6C6E8716CD839 /* FABAttributes.h */, - ED2E89FC14F07885B607452ACEB9E664 /* Fabric.h */, - E9C4A6767E200C3F312A4BFA741EAC50 /* Frameworks */, - ); - name = Fabric; - path = Fabric; - sourceTree = ""; - }; - B7CF062EFAEAAB4FCCAF3EA14259DD55 /* Bolts */ = { - isa = PBXGroup; - children = ( - 930526A2E4E1682FFE1CDC1E1B0F447A /* AppLinks */, - 9F9A4C7E87D3A2E8DFD891FE996B1EF1 /* Support Files */, - 8342C9358673CA413C1B3FB0CADC4947 /* Tasks */, - ); - name = Bolts; - path = Bolts; - sourceTree = ""; - }; - B997825AC3B68BED1B818269E020FAB2 /* decode */ = { - isa = PBXGroup; - children = ( - ); - name = decode; - sourceTree = ""; - }; - B9B033CC897B42EF422F2B08287C8381 /* SDWebImage */ = { - isa = PBXGroup; - children = ( - AA2CFA78B1D3806B2D66F9EFEC967EF2 /* Core */, - E93A62B649BE7838188392E2E5BEAE31 /* Support Files */, - ); - name = SDWebImage; - path = SDWebImage; - sourceTree = ""; - }; - BA7CD4A9D12EE54002C3E1B851DC4289 /* Core */ = { - isa = PBXGroup; - children = ( - 26907558620455D06E2BD98BAE45C3D8 /* Firebase.h */, - ); - name = Core; - sourceTree = ""; - }; - BC3AE406FBE6DF7B087D9A507F2B18AC /* Crashlytics */ = { - isa = PBXGroup; - children = ( - 4D23F3A1D13F2F9CB68441255915411B /* ANSCompatibility.h */, - 0B96197BB36E4BB710D2D51CFF280E4E /* Answers.h */, - 87E958B6C79CDEE6B639224D904513D7 /* CLSAttributes.h */, - EC3998AFB6759B3387B0B44CE174BD03 /* CLSLogging.h */, - 614E00A3382ABAC914EF09013C5928D8 /* CLSReport.h */, - 48AC1C197F1D0464C2A248B18CDED483 /* CLSStackFrame.h */, - F537089FC3B9328785AB597D2D871DA2 /* Crashlytics.h */, - B05B85288ACC71CF46AA6759524F7976 /* Frameworks */, - ); - name = Crashlytics; - path = Crashlytics; - sourceTree = ""; - }; - BCB4E103F21DCA4B431AF4127BC9E800 /* Support Files */ = { - isa = PBXGroup; - children = ( - E16CB789617BA9E146BACC17C4523295 /* GTMSessionFetcher.xcconfig */, - A802B2151F72AA3440CE60923E772AB5 /* GTMSessionFetcher-dummy.m */, - 6DFC544B95A3914F0C3C907AFC5D6EE1 /* GTMSessionFetcher-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/GTMSessionFetcher"; - sourceTree = ""; - }; - C40944523187AB6CD5F7C15E52EEED74 /* Support Files */ = { - isa = PBXGroup; - children = ( - 8D25E20EE508FF8594C4D6FDEF9D5B61 /* Reachability.xcconfig */, - 7AB31C02CB7AD7A4143E84D7CBDEBA90 /* Reachability-dummy.m */, - 57F4D6767FDAB2C32CF53AA8E83D0B38 /* Reachability-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/Reachability"; - sourceTree = ""; - }; - C8D65540EE978399F4AECC42AD1F16D8 /* EXTScope */ = { - isa = PBXGroup; - children = ( - 49E4B599C45B65DE819071B44FEEBDD7 /* EXTScope.h */, - 9E2B2EE2F10166FAACC37EC6DF0FA833 /* EXTScope.m */, - ); - name = EXTScope; - sourceTree = ""; - }; - CBE719128286F4017DB68FE9A19550A8 /* Support Files */ = { - isa = PBXGroup; - children = ( - 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */, - 346662EB2A7A157DBC79D8F534EFE06A /* QMServicesDevelopment-dummy.m */, - 2910FE98CE198F860EBA7609B1E87C8A /* QMServicesDevelopment-prefix.pch */, - 873E47A5A7DA3AB9C32C49020C7F7225 /* ResourceBundle-QMChatCacheModel-Info.plist */, - 8812F01F099A58454FE64D061FD25D36 /* ResourceBundle-QMContactListCacheModel-Info.plist */, - B33ADC0EE1C5B9396831FCCCF721C613 /* ResourceBundle-QMOpenGraphCacheModel-Info.plist */, - 713D68C47E9EF9D409117C281E65C45B /* ResourceBundle-QMUsersCacheModel-Info.plist */, - ); - name = "Support Files"; - path = "../Target Support Files/QMServicesDevelopment"; - sourceTree = ""; - }; - CE2FCF27CA826BBE677EB6D8F2285BAC /* Support Files */ = { - isa = PBXGroup; - children = ( - 15894AF01E40604475003E1AD4A8A741 /* FFCircularProgressView.xcconfig */, - 439D15E6A57AD45C05140DFFB257AF4B /* FFCircularProgressView-dummy.m */, - 25FABDD39C75A1E87B260F99A2F6AC11 /* FFCircularProgressView-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/FFCircularProgressView"; - sourceTree = ""; - }; - D0497BCFDBA41997D7486EBE5FFEBE20 /* Resources */ = { - isa = PBXGroup; - children = ( - 3F326C96C32EA81CD39BB507BF6F0957 /* ar.lproj */, - 6235B487E63130C09EF071499EE0E1B2 /* bg.lproj */, - 22A7933F517EDF3500F770E6485D5245 /* bn.lproj */, - E1418F0D5F0246BF9AC00EA7E13A602D /* ca.lproj */, - EB78720C26526E4DD6046D25624213F5 /* country-codes.json */, - 373EF4164EFDC76E0B31A3FB98B78B71 /* cs.lproj */, - F457873408B2A48DDFE348FD8EC3A2E7 /* da.lproj */, - E979782FC939D39B9E5227FA67FD5F0D /* de.lproj */, - 30516D2C978BA5F677BB3396A959D868 /* de-AT.lproj */, - 677A812CF6F8FB1C7C9B8EC169E321EE /* de-CH.lproj */, - 29BAE8239E5C8D944E74307AB3280252 /* el.lproj */, - 468DA1A0E511A4659BC03C827B2C1CBE /* en.lproj */, - 4D654CB9257783068FFAE5D0D401538E /* en-AU.lproj */, - D83CD87545847FCFE8B599C110D2CA61 /* en-CA.lproj */, - BCA3CEA30100CBAB55354EAB8FF55B35 /* en-GB.lproj */, - ED57CF8FD546F4CDFCA742286FBB589F /* en-IE.lproj */, - 2379C8883B195F4E03743473D6FBC12E /* en-IN.lproj */, - AB1C121E54FC1C5DEA7D35196A8F0860 /* en-SG.lproj */, - 98775D35A30239BB2243827E123A1B03 /* en-ZA.lproj */, - 5613DAB5B5491F0AC952BC80F01AAD70 /* es.lproj */, - 2E3E8B53125AFB9B6B7FD4659BFD1569 /* es-419.lproj */, - 6B7299271DA2005C78B60DE681866047 /* es-AR.lproj */, - 83930B2194799CB1C53F6374A93C79C0 /* es-BO.lproj */, - BED67B7CA2B86B794BE5CBAD076B5F05 /* es-CL.lproj */, - DAEED0C612898D8D53CD1ACBB12BF642 /* es-CO.lproj */, - E8CFD3B7A2770EC269703A017FD24750 /* es-CR.lproj */, - DFCB99637ED9CC1BEC5BF43532A310C8 /* es-DO.lproj */, - B7B312B0FBDDCAB7F974689328D53CE7 /* es-EC.lproj */, - 3DEE0A1098AE88EC9F19D6AEAA0E41EF /* es-GT.lproj */, - 20DD78246E0CFCE5D9AA0F1DEF29A968 /* es-HN.lproj */, - 4FD7ABE30D46AAF51A7975510061E506 /* es-MX.lproj */, - 7EA1C6F1DD89FFB372318A0ADFFE3FE8 /* es-NI.lproj */, - BD1B6D714E8B9A95D7DC1597C1B95425 /* es-PA.lproj */, - C9F42D01E81A2973F68DB39B2F1600A5 /* es-PE.lproj */, - F97567429CB2B3BD4A60170AAD7BFA9E /* es-PR.lproj */, - F4F1B0C78A656DD31987696B013E0D11 /* es-PY.lproj */, - 1212A4F9E53171A83DD426A604D1EA74 /* es-SV.lproj */, - A2F0D03A8DE442075C62C7B91F3AF302 /* es-US.lproj */, - CD85000A4762E3BF7BCA4D04C68680EF /* es-UY.lproj */, - 4C7257E4C29305181DE54BAAB7FE33B7 /* es-VE.lproj */, - BA0853D49E08E2FBB1A4A770FD46D659 /* fa.lproj */, - 07BD5566E47E4A8CB72022C901A34740 /* fi.lproj */, - F34A22F8F20B07F395EBF077EE65CD20 /* fil.lproj */, - 46245878CD9179098B299207B026E05C /* fr.lproj */, - 8D96CB36C5F60EBD1D39B22B92035F8B /* fr-CH.lproj */, - D77CFA7286BF1660772457D3B56968CF /* FUICodeField.nib */, - C7FB087EE134DCD74D89969C8B862019 /* FUICountryTableViewController.nib */, - 465AB90C5EF9D68EECE4B3BD86541317 /* FUIPhoneEntryViewController.nib */, - 20FAB20F7BD0FBADD8B3C8D33E9484C9 /* FUIPhoneVerificationViewController.nib */, - 4096706BE8413AC67CCC9AFD720AB964 /* gsw.lproj */, - 7543498F482088D7BADAA89F4DFA7FC2 /* gu.lproj */, - 55D6CC02D39C11984B33FC0A271E4396 /* he.lproj */, - C1119395340BC7D42B0AEB4C40F6D17E /* hi.lproj */, - A64143A91002E5943DF91263BF27E353 /* hr.lproj */, - E80467654216AB5F099025873D349FE3 /* hu.lproj */, - 627D21F92819D80D382095A239FBC0C6 /* ic_phone.png */, - 93A3190C66560D03E526DB02F2246B9B /* ic_phone@2x.png */, - 7C8643110A3FB0AE62045394FB501BB3 /* ic_phone@3x.png */, - DD96811E177616B529D37BB71CE9C392 /* id.lproj */, - 3EC5D6644213F16A5BD5EEE5B68685D6 /* it.lproj */, - 2619E4B5D0103DDD987223387BDB9C8A /* ja.lproj */, - 3D8AF6BAB43FE87605724FD13C24B926 /* kn.lproj */, - 70DEAF8E882315FDBDFD5AAE27126125 /* ko.lproj */, - 899764694C352C19AF098F512D55A0BA /* ln.lproj */, - 6F3F397406EFA10F8EE84A4725793C1E /* lt.lproj */, - DF0D6A0BC96D580C5E94F26047E6259D /* lv.lproj */, - BF2790CED9D0486C1ECE9B657ABC893C /* mr.lproj */, - 6EED1F28E209FB385E025E6A79264B31 /* ms.lproj */, - 0741C9B21D644A6F06DB53C1D324353E /* nb.lproj */, - 856D8347E4E9A337FB8006CF5554C5F1 /* nl.lproj */, - 61DE9BE563D6CC709C9AFF97EFB4FC15 /* nn-NO.lproj */, - EC5EC269AC7116CD63805F89F8B85EF9 /* pl.lproj */, - 277DF405E98569E20375EBC7E0CE001D /* pt.lproj */, - F38949F603A2EACF3E6FBFD557D69FA0 /* pt-BR.lproj */, - A59B3E096E75CDA695BB3968D8D9DA69 /* pt-PT.lproj */, - 0523E2CFBCFC4CBA74579265EBFACD8D /* ro.lproj */, - 24DC05249088DBE6D4265D04365EA6CB /* ru.lproj */, - 9E6C9DFB4878BE546BDDA5B892E3619D /* sk.lproj */, - 51E83AB4AEBF101CC7B71018A64AD427 /* sl.lproj */, - 866869B21EDA6B01BAB28CC857696A43 /* sr.lproj */, - F4714286DBB461215B8B37EF0BB87609 /* sr-Latn.lproj */, - 724A3BA1F2360D65C0485CF56153184D /* sv.lproj */, - 01659747D7409A470569199D8F587F19 /* ta.lproj */, - F51CF3093D1AA5F0E9C597113B55982C /* th.lproj */, - 03F94CA912CB33126822B9B042C68364 /* tr.lproj */, - E87582B826BB6B2B06E8BDDEAEA1AF57 /* uk.lproj */, - 77C767FF79A87283D4BE61061C22BC41 /* ur.lproj */, - 85862B94D36F663DC302B77EA502371B /* vi.lproj */, - 116B379949D169F327835606D8F8AC61 /* zh.lproj */, - 96B1572728A190E05E5FFD03600F3041 /* zh-Hans.lproj */, - 12CDF285B0FE8E89D54AD2CE58FFCBD9 /* zh-Hant.lproj */, - 3E59D4C1647EE977F82BDCAF38773B63 /* zh-Hant-TW.lproj */, - ); - name = Resources; - sourceTree = ""; - }; - D9109AFD7E068EDFBCFE459D7EB802A6 /* FirebaseAuth */ = { - isa = PBXGroup; - children = ( - AD15EAB419FB8659B0AA15FBC74AEE8A /* Frameworks */, - ); - name = FirebaseAuth; - path = FirebaseAuth; - sourceTree = ""; - }; - DA26729DFACA6B0D6D9332AA5374E13A /* Flurry-iOS-SDK */ = { - isa = PBXGroup; - children = ( - AE675C6BCA1A9ADE79DBB8B6C65E8D9D /* FlurrySDK */, - 8B24B380409201ADBFFA4CFAA45D973A /* Support Files */, - ); - name = "Flurry-iOS-SDK"; - path = "Flurry-iOS-SDK"; - sourceTree = ""; - }; - E1595A90C5127CEDE5FF0CDB4722EE92 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 8C644E001404213A6D0FDDD8AA2D17B4 /* libFlurry_8.3.1.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - E309E4B69F467059D8D2E80967E0CD78 /* FirebaseCore */ = { - isa = PBXGroup; - children = ( - AEE3D9B4D261C8C08FC8E82FD93DDAAA /* Frameworks */, - ); - name = FirebaseCore; - path = FirebaseCore; - sourceTree = ""; - }; - E44E8B67BE162111A1A084E824BF6268 /* FirebaseUI */ = { - isa = PBXGroup; - children = ( - 4D1C40FEEBBC090FAB1384A306661483 /* Auth */, - 613C3DECB186619CC7790C3AAEEB73A7 /* Phone */, - 4B51571DE3A7557BC9530B3FF76BD2FD /* Support Files */, - ); - name = FirebaseUI; - path = FirebaseUI; - sourceTree = ""; - }; - E93A62B649BE7838188392E2E5BEAE31 /* Support Files */ = { - isa = PBXGroup; - children = ( - 7FC8F0941550A4C6CA9AB69375224D74 /* SDWebImage.xcconfig */, - 230FC3E3206B292AC9BA5A7CE1B0EC7A /* SDWebImage-dummy.m */, - 09A748C2CAE33B422B035DF0348EF07C /* SDWebImage-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/SDWebImage"; - sourceTree = ""; - }; - E93C834BEB400D531597867EDA38D12C /* Products */ = { - isa = PBXGroup; - children = ( - F967ED75F1C74FFDD8482A5C0BAEC3EA /* FirebaseAuthUI.bundle */, - CDB319DABDE7C42F6505B39CA8EB2812 /* FirebasePhoneAuthUI.bundle */, - 23C5F871F3D3B5EBDF8A0069464984E4 /* libBolts.a */, - 2E32041EC4251D18EB6D8FB2DB4E3991 /* libFBSDKCoreKit.a */, - D19FE341DC039EF832BC42319F8FD7AE /* libFBSDKLoginKit.a */, - 3C7E71FEFAC60FAAB128CA9ED2C6073D /* libFBSDKShareKit.a */, - EF2EDAB227117B6531948C2633245BBA /* libFFCircularProgressView.a */, - 01D02DBEB8B9B8494EDED59F61B0C25E /* libFLAnimatedImage.a */, - 3634AA846B694FDCB247930C6F1E00DC /* libFlurry-iOS-SDK.a */, - 8702140972D8E5BCB9C2664CCB9A68AD /* libGoogleToolboxForMac.a */, - 3C932EADC9EAA3FFBB6463A1D690FD54 /* libGTMSessionFetcher.a */, - 8827D20336FE055B0C6C5AE0387FCE39 /* liblibextobjc.a */, - F692D755024EE76EF405FECE13EE6522 /* libnanopb.a */, - 1A7341DE3D7FAA6D2747EBEED5EC6845 /* libNYTPhotoViewer.a */, - E28BDBCA3CD5C555E5A06557DB0E5DF5 /* libPods-Q-municate.a */, - 687C44B38AFBF12D2BE5176F39722BD5 /* libPods-QMShareExtension.a */, - E9EE0F66606FAAFEA8343084EF925909 /* libPods-QMSiriExtension.a */, - 0E70284C36635B95BF9BF6FD47815B2F /* libQMCVDevelopment.a */, - 822679CBBCE88BA77C083697F4AAD5A4 /* libQMServicesDevelopment.a */, - 884D53BFEA7FA095F28C2524C814D7FC /* libReachability.a */, - A53FB2466992DA7C8C52D1D934726165 /* libSAMKeychain.a */, - ED0986CB8FE1902FA9E7F5EC65420342 /* libSDWebImage.a */, - 3AF12F6DEC81C612880F465829219E17 /* libSVProgressHUD.a */, - DE7E8EF61D7BEBC5017652DC8DFE2227 /* libTTTAttributedLabel.a */, - 1DAD4F9CF7717798BD3915B71932EF1B /* libUIDevice-Hardware.a */, - FD7035D50E598906E5A45A71DDAD25B0 /* NYTPhotoViewer.bundle */, - 0A3BAAEF184ACBE2A82C6E0D92B5C0B5 /* QMChatCacheModel.bundle */, - A48048F8F09ADF531BD89B432DF26945 /* QMChatViewController.bundle */, - C4492923DE06654D3A8F851F37C513B9 /* QMContactListCacheModel.bundle */, - 799EA28142EA168AA6D8F2F5BCBC52F8 /* QMOpenGraphCacheModel.bundle */, - 3CE7568C3CA32393DB5DF13B6B047842 /* QMUsersCacheModel.bundle */, - ); - name = Products; - sourceTree = ""; - }; - E9C4A6767E200C3F312A4BFA741EAC50 /* Frameworks */ = { - isa = PBXGroup; - children = ( - DEE5348EDFE400958ADC808C2AF5715C /* Fabric.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - ECDF500B51B5FF3432DFE9637601C849 /* Firebase */ = { - isa = PBXGroup; - children = ( - BA7CD4A9D12EE54002C3E1B851DC4289 /* Core */, - ); - name = Firebase; - path = Firebase; - sourceTree = ""; - }; - ED471EE63D0D96683720334D68990334 /* Support Files */ = { - isa = PBXGroup; - children = ( - F327B5445E9F55C394B7A00542AA6312 /* GoogleToolboxForMac.xcconfig */, - 70F0964A96995B861633F22C8A8FFACC /* GoogleToolboxForMac-dummy.m */, - 36574504869F6D25D05FF27C8B9AAF96 /* GoogleToolboxForMac-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/GoogleToolboxForMac"; - sourceTree = ""; - }; - F036556B255FB59FC23546108A783C03 /* Reachability */ = { - isa = PBXGroup; - children = ( - 569C69CCB6B0743EE78FDACCCE0935DD /* Reachability.h */, - BE652D68108EAF0B7956D0B0F0FD2760 /* Reachability.m */, - C40944523187AB6CD5F7C15E52EEED74 /* Support Files */, - ); - name = Reachability; - path = Reachability; - sourceTree = ""; - }; - F09C35DB572722D734850E2825D81A5E /* QMChatDataSource */ = { - isa = PBXGroup; - children = ( - CED73B5526A96CB440DDD90EFBF75D89 /* NSDate+ChatDataSource.h */, - 865FE3C61FA656289A6CDBF3B3FF0536 /* NSDate+ChatDataSource.m */, - 51D3EF00B19BE4EF775A4629DE731FC3 /* QBChatMessage+QBDateDivider.h */, - 879462D1292026C3C9BCA4BF3B9125DB /* QBChatMessage+QBDateDivider.m */, - 6EFC1FC59B51FC8DDA6EF0D93FE13F62 /* QMChatDataSource.h */, - 2363369A9239016B9C47375D5088A1CE /* QMChatDataSource.m */, - ); - name = QMChatDataSource; - sourceTree = ""; - }; - F228ACBBDDEC50CDAFB78E8D1B29BAE3 /* Support Files */ = { - isa = PBXGroup; - children = ( - 0ADB7D74A29F61961C071B362FB63601 /* FLAnimatedImage.xcconfig */, - D1560A5FA3831D2BBA697C170241FC4E /* FLAnimatedImage-dummy.m */, - 851426EA57416802CF5A73A361010B0D /* FLAnimatedImage-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/FLAnimatedImage"; - sourceTree = ""; - }; - F40B50432EDBE1F953329D4B05FA7822 /* Pods-QMShareExtension */ = { - isa = PBXGroup; - children = ( - 0A0A0D79FE0AD290BBD8880DCCBCFA30 /* Pods-QMShareExtension-acknowledgements.markdown */, - 08F1C768FDB22D63941377FF26F89F50 /* Pods-QMShareExtension-acknowledgements.plist */, - 9C6DF183F7699C11C22BC07BDA3E4365 /* Pods-QMShareExtension-dummy.m */, - DFE869254AC13DEF86ED0E1199A1B2BA /* Pods-QMShareExtension-resources.sh */, - 2C62470A432A475DC8091742D082B3F9 /* Pods-QMShareExtension.debug.xcconfig */, - BA8B97A4E0D7D8B3435DB883EB704FD6 /* Pods-QMShareExtension.release.xcconfig */, - ); - name = "Pods-QMShareExtension"; - path = "Target Support Files/Pods-QMShareExtension"; - sourceTree = ""; - }; - F515827506F1359E97C45BDDC1C3442D /* TTTAttributedLabel */ = { - isa = PBXGroup; - children = ( - F323CC8811568FC2C14872DAA3A90061 /* TTTAttributedLabel.h */, - E3149B0ECD4A782BE43812322E0BDC12 /* TTTAttributedLabel.m */, - 4CB171D2F85780CA56B9ADC549AFEB76 /* Support Files */, - ); - name = TTTAttributedLabel; - path = TTTAttributedLabel; - sourceTree = ""; - }; - FA383A8C92BBE08102F43A5D577A25F8 /* Support Files */ = { - isa = PBXGroup; - children = ( - 7263E00578C120C5FB81DA4F6723830C /* SAMKeychain.xcconfig */, - 877CDAF6A89F584914804D5D99113D74 /* SAMKeychain-dummy.m */, - 6E7BC8D332FEB23EB2D65667B1F0ECB6 /* SAMKeychain-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/SAMKeychain"; - sourceTree = ""; - }; - FEBEAF06602528497E1F0CDCFF00ADA9 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 5C2AF01EDB27F2FA6ADD7426313F25F7 /* FirebaseAuthUI.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 03CDBB4C3C7BB5DF2F9A65E35669CA86 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - E51CF4CEF47A4A05B121000393308E05 /* FFCircularProgressView.h in Headers */, - 67BF090BD5423F8BB944980C827F2813 /* UIColor+iOS7.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0AB8208C10FCAE9BA921F7ACF69DCB3F /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - B76C5597FABAAE785AC8F67374172A73 /* NSDate+ChatDataSource.h in Headers */, - 2851471FC42E6EF129CAE41B7E980856 /* NSString+QM.h in Headers */, - 5E5A248D4EF19B2E3C58623B1B8271F1 /* QBChatMessage+QBDateDivider.h in Headers */, - 4DEC8F85AA18D74E5253F9428EE8CEA3 /* QMAudioIncomingCell.h in Headers */, - 3A21387CB3A12849F308A05C2B1D9B52 /* QMAudioOutgoingCell.h in Headers */, - F66FB60AEB7BA1C837060CFE365D6A0A /* QMAudioRecordButton.h in Headers */, - 1A1B34044186C24CF50E14734113C09C /* QMAudioRecordView.h in Headers */, - 370D13F918948E2EE1F151A2BC45744F /* QMBaseChatLocationCell.h in Headers */, - 06FC1A6E72217D4728A69F4E20D03998 /* QMBaseMediaCell.h in Headers */, - 0752A90B45007975E615EB9DD6BE2287 /* QMChatActionsHandler.h in Headers */, - C15EC2293BFE0779C79A44B0E19EBB34 /* QMChatAttachmentCell.h in Headers */, - C0B49D4A1DFA3DC13F086E6F2EEF7769 /* QMChatAttachmentIncomingCell.h in Headers */, - DFEE78EEE50C0628E8984DAD2BA3DC44 /* QMChatAttachmentOutgoingCell.h in Headers */, - C9932DC024FF124C40D3DC5D04730CA9 /* QMChatBaseLinkPreviewCell.h in Headers */, - 558E627E3F0B1E8E8D5DF56A6E971F9B /* QMChatCell.h in Headers */, - F229DAFD5F88AC8E5E95AE24F2E2B2A1 /* QMChatCellLayoutAttributes.h in Headers */, - 12CF65327A9D1413498E1534D372B37A /* QMChatCollectionView.h in Headers */, - 752F75F22C584CFA75561A4DB841602A /* QMChatCollectionViewDataSource.h in Headers */, - 60C715C8866D19E197737647A56A2901 /* QMChatCollectionViewDelegateFlowLayout.h in Headers */, - E2CA211CC25715BC3D884336126DF71E /* QMChatCollectionViewFlowLayout.h in Headers */, - ABAA6F4CC21CEB04DD279402E6F8E7C0 /* QMChatContactRequestCell.h in Headers */, - 352F9D53EACB2C9437F1B05CAAD6CFC3 /* QMChatContainerView.h in Headers */, - C5331A0955E67254451B9D7DE9315219 /* QMChatDataSource.h in Headers */, - E8EFA6AFC53C3C1846970650AB065C25 /* QMChatIncomingCell.h in Headers */, - 2B27E0EB493032B2B681BD4AECAB618D /* QMChatIncomingLinkPreviewCell.h in Headers */, - 40AEB270E294581531F58AB7E557120F /* QMChatLocationCell.h in Headers */, - 5B87625B81738770F9C3D76B3C658AC0 /* QMChatLocationIncomingCell.h in Headers */, - 57571A55066490E431600B39B4AEAFFB /* QMChatLocationOutgoingCell.h in Headers */, - CD0DE5ABB674FF5B830E491A848B62B2 /* QMChatLocationSnapshotter.h in Headers */, - B75C119EB7AAF550FD999661AFAA37BA /* QMChatNotificationCell.h in Headers */, - 08F002DEEF8FC1CFA198558562839443 /* QMChatOutgoingCell.h in Headers */, - 971517DBD70EEE72C23CDAB230E1C293 /* QMChatOutgoingLinkPreviewCell.h in Headers */, - 0DA191B919AA787542DD15D61D136E22 /* QMChatResources.h in Headers */, - E2345259CD6848F867A0DEE56E4684FA /* QMChatViewController.h in Headers */, - E696B44C55983CEB99AB4B065B728DDD /* QMCollectionViewFlowLayoutInvalidationContext.h in Headers */, - BD2248660687777E6DB58A811D2B721F /* QMDateUtils.h in Headers */, - DA4E448F662D626DC3C15F456938C00D /* QMHeaderCollectionReusableView.h in Headers */, - 46C82DB02569EA6B94BDE35D70B6FD35 /* QMImageIncomingCell.h in Headers */, - 24F853A159BD3AE44D0C5889CDE68579 /* QMImageLoader.h in Headers */, - 979F7DCF4E2EDCD2E87A227BA0546BBA /* QMImageOutgoingCell.h in Headers */, - 909298A64665870F2B9D568C8F3ADDA4 /* QMImageView.h in Headers */, - 56755F6CF8A77A72106337D75618EE42 /* QMInputToolbar.h in Headers */, - B13E16087DE32BA01E1C995782742D6A /* QMKVOView.h in Headers */, - 8855489E0A6A51640668AF7846D48BF2 /* QMLinkPreviewDelegate.h in Headers */, - 4854B7CD99442CDD924EF53BE7A37693 /* QMMediaIncomingCell.h in Headers */, - 213385CE61BD3D9C1B2BEB786F39E099 /* QMMediaOutgoingCell.h in Headers */, - 9DB259B25187A93B53A20E0317A5052D /* QMMediaViewDelegate.h in Headers */, - 610C08AFF51C38912701D05A881E5E37 /* QMPlaceHolderTextView.h in Headers */, - 6C58E80CA4D359881C747200CB074ED0 /* QMProgressView.h in Headers */, - F396C4B2619751937488E42A8B1F909E /* QMToolbarContainer.h in Headers */, - A0105E7A99EB7343C532DFC23AA1FCB7 /* QMToolbarContentView.h in Headers */, - 0E7D8614B5A054D430D17C469DBA7651 /* QMVideoIncomingCell.h in Headers */, - 76D43DBCEB92582FF3CC76B876B03ED4 /* QMVideoOutgoingCell.h in Headers */, - EA683A944F87DBB587E3AAE2211D90CB /* UIColor+QM.h in Headers */, - 316ACF5AC94273151EBDE1C88913F073 /* UIImage+Cropper.h in Headers */, - 1C70CE3FCC5E4D6FDC02E70357B89B63 /* UIImage+QM.h in Headers */, - 7ECFA5740B637D0EE7B3C0B20C384FE9 /* UIImageView+QMLocationSnapshot.h in Headers */, - 344231E0C3CEC21A2A15294F0DAF8D44 /* UIView+QM.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0CBA5A14986DAE7D6A473749221AA81F /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DAB656C013D918BA647BDCDF45383384 /* GTMDebugSelectorValidation.h in Headers */, - C6AA2524C09B8F1C9DFA813857C56E7F /* GTMDebugThreadValidation.h in Headers */, - 8F175FE55848DE44797AEB6CEF1F902F /* GTMDefines.h in Headers */, - 52CC1D443CC1FE11DB37BD41748A5B38 /* GTMMethodCheck.h in Headers */, - 59642B8EE4ADA94E2F2478208DF16D1C /* GTMNSData+zlib.h in Headers */, - 363C76FE5CED9EF403AA3C5526B2E0BC /* GTMNSDictionary+URLArguments.h in Headers */, - 9D68D02885C8F617194DF367DC1DF214 /* GTMNSString+URLArguments.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 11E2EC6AEE000428C349B1A4FC797B7D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - AC28D2EA0916EAA47543494A8A6206DB /* SAMKeychain.h in Headers */, - B9B5678982298DE1DF8DCD99867AF2D4 /* SAMKeychainQuery.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 22A4D9040C3EF4043783126B1BEF7A32 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 0C8B87202EF8C826FA5EC5E5BDFF7676 /* BFAppLink.h in Headers */, - 368EBA3575A0E7D8F4177D54663D3A72 /* BFAppLink_Internal.h in Headers */, - 5DF642A1886939A7CE29475442034CC2 /* BFAppLinkNavigation.h in Headers */, - 67B00D1DAF27165DC3184061E5B9AC32 /* BFAppLinkResolving.h in Headers */, - C289F222BB659B44825DB44F21BF6D07 /* BFAppLinkReturnToRefererController.h in Headers */, - D67FCACAB2080898E3FB8A15EC03196B /* BFAppLinkReturnToRefererView.h in Headers */, - E2FB3863FFABE664D5A8FB5558EFA758 /* BFAppLinkReturnToRefererView_Internal.h in Headers */, - B80C43AB4DBF298ECFF0FDED74EB431F /* BFAppLinkTarget.h in Headers */, - 0F5C566DDDFB79D7A6BCC25D7C67931A /* BFCancellationToken.h in Headers */, - 47A0E45B07A70EAF83C9C04A934F0A79 /* BFCancellationTokenRegistration.h in Headers */, - 496CEBD91E685BDEE54BE6D11ED59711 /* BFCancellationTokenSource.h in Headers */, - 5B0C45E35FE6C61AEB230DAB0D727CFF /* BFExecutor.h in Headers */, - C40E243F276CCE8C4BE922243572D49F /* BFGeneric.h in Headers */, - 8CD0E790A1AD5AA4908ADFF8BD1ABBF2 /* BFMeasurementEvent.h in Headers */, - 31182A7DDE0188775D8275001EDE7F94 /* BFMeasurementEvent_Internal.h in Headers */, - B4FD7DF0F890DA3BF96606A6BB34BFD5 /* BFTask.h in Headers */, - 7BAF4C13BA42D722CEA52471CABBF058 /* BFTaskCompletionSource.h in Headers */, - 3E5E38E786F6517C0D8F74BB572D8985 /* BFURL.h in Headers */, - 49F7563B9792D3469C613D7FE3DCEF71 /* BFURL_Internal.h in Headers */, - DED03A83F5A60E899DA246C3A83EBACA /* BFWebViewAppLinkResolver.h in Headers */, - E4C486459A5F6055051BED9076844C03 /* Bolts.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 455635E29D1957C96EB66B2012852E40 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - BFE150ABF4C13B8BEC7DC19E7960776D /* NSButton+WebCache.h in Headers */, - D202B9DEF3CCCA4F97B36C9C114F92CE /* NSData+ImageContentType.h in Headers */, - 76B8650952EDE4B2FDEABCA6E18DD9E1 /* NSImage+WebCache.h in Headers */, - 8F2F45803E009A79050AD6EC126504AB /* SDImageCache.h in Headers */, - CD5AE32395D44AFD6EE62B8DCDBAB92D /* SDImageCacheConfig.h in Headers */, - 8B1C1FE19FAD0B7E9275A8DBC5310AB3 /* SDWebImageCoder.h in Headers */, - 5B352C0C8EA1DC075514C6A2B6C0C946 /* SDWebImageCoderHelper.h in Headers */, - 35E82B4C36681994548AF47E74F9F3C4 /* SDWebImageCodersManager.h in Headers */, - DF094CC988C5BD5CF74688A2F33AC8E7 /* SDWebImageCompat.h in Headers */, - 3E45969A1E5CC0C60115BD00A3D7A2B5 /* SDWebImageDownloader.h in Headers */, - 4653ACFB1F6A68D879C7931711370E3A /* SDWebImageDownloaderOperation.h in Headers */, - BB74BFFB8BCA6B3B341D2A21C27A36E2 /* SDWebImageFrame.h in Headers */, - A1492BDA71F2D5684EE21A3CA6F244E9 /* SDWebImageGIFCoder.h in Headers */, - E8850950EDFDF74A79F544EBCACBA806 /* SDWebImageImageIOCoder.h in Headers */, - 57C76225973196FD9E5F8CABCF6ABDC5 /* SDWebImageManager.h in Headers */, - CC28647117A0BDD9695779AE67387DDF /* SDWebImageOperation.h in Headers */, - 6DD7B579F3FA3E995985EDB675131C85 /* SDWebImagePrefetcher.h in Headers */, - 4DD3465293CADA5D1F454BCE5FE620C8 /* SDWebImageTransition.h in Headers */, - A6B877BBC290C994A4645F8D6D979ADC /* UIButton+WebCache.h in Headers */, - 547453B3EC71236F2CE487BA841D1A90 /* UIImage+ForceDecode.h in Headers */, - 587E5DC23045BBB52724E397CC8A3046 /* UIImage+GIF.h in Headers */, - 6C3EAEE7944DCA30C133675CBCFBD8CC /* UIImage+MultiFormat.h in Headers */, - DE7C742A7DA5448223CBD9B216A94AC5 /* UIImageView+HighlightedWebCache.h in Headers */, - 9A9572399CD2BEDF739385FD9915DDEB /* UIImageView+WebCache.h in Headers */, - 5BEB5F46E69691313057FE7C9691DCE0 /* UIView+WebCache.h in Headers */, - 78D0EABDE58F2D1806D0F3FD340FD33F /* UIView+WebCacheOperation.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 49EE04F5125849E644783C89F23AA9F9 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 129986403CDA960892B9E7158CEBD293 /* pb.h in Headers */, - CF539FEA532B415144614C6D382746BA /* pb_common.h in Headers */, - 1FD89BCE18878274FE3E05CA3B19A1EC /* pb_decode.h in Headers */, - AAE5BA7EB2D6E9DC09F0FB3D16EB9752 /* pb_encode.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4D868FEA168DA4EC6CA5D71E71B8E494 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 9F038E11537A6E44575323E575BB08E6 /* _CDAttachment.h in Headers */, - F98CD6C35638FBFA6C4583F0DF58594D /* _CDContactListItem.h in Headers */, - D92574DFF3A33B07238FBB3225BB3120 /* _CDDialog.h in Headers */, - E3034A7DF4AF7A88A814E90089F9D5B9 /* _CDMessage.h in Headers */, - 0D4EFC1F6A281D8BFBC6D04B372AF694 /* _CDOpenGraphModel.h in Headers */, - A96225BAF4521C5297791C0DBB3DC79C /* _CDUser.h in Headers */, - 1B6B1117E9ECBBE3939DA968F070BD3E /* CDAttachment.h in Headers */, - 6B229865ED5EB4434D35EFB853CB5A4A /* CDContactListItem.h in Headers */, - A2B5EFC9FC23B8A776F8E368DF96412C /* CDDialog.h in Headers */, - 7791C446F3FF2B9E725A70F26ADEB943 /* CDMessage.h in Headers */, - F6C92B20934D4364422C626FE055E22D /* CDOpenGraphModel.h in Headers */, - 398A447B8418F2E1A777144B20D0F856 /* CDUser.h in Headers */, - 312B21BE45C7BF1D89405B3136FA4D8B /* NSArray+QMCDRecord.h in Headers */, - 987A1FB8F1D98E659B7A08013656E55F /* NSDictionary+QMCDRecordAdditions.h in Headers */, - 32B434BB3A9093C1D60D337A8A1DCAD7 /* NSError+QMCDRecordErrorHandling.h in Headers */, - 129820E7238EA09AFEAAAD259158A3D3 /* NSManagedObject+QMCDAggregation.h in Headers */, - 0144702589AE797AD1E6D43E942C80DA /* NSManagedObject+QMCDFinders.h in Headers */, - FA93B7D2A89A2E7E3D894D8F8AFFD61E /* NSManagedObject+QMCDRecord.h in Headers */, - EDEB3A3A470381F802B91B4CE28BD71D /* NSManagedObject+QMCDRequests.h in Headers */, - 98895932F30B624CF8D4DB6BCF41BE00 /* NSManagedObjectContext+QMCDObserving.h in Headers */, - B7A7154D0246B30BB9CA164305701103 /* NSManagedObjectContext+QMCDRecord.h in Headers */, - 182919E12AEDD408F7E10077860A1633 /* NSManagedObjectContext+QMCDSaves.h in Headers */, - 1A39E9060D0FC571BA366080CCFDD2F9 /* NSManagedObjectModel+QMCDRecord.h in Headers */, - 6516553BAF988AE78487EF9C0FC9DDEF /* NSPersistentStore+QMCDRecord.h in Headers */, - 1B33D90F4174DDDE11C0A5E21B3B4406 /* NSPersistentStore+QMCDRecordPrivate.h in Headers */, - 4F4A8945C3CC04052A09C4216474ED11 /* NSPersistentStoreCoordinator+QMCDRecord.h in Headers */, - 7B0F795A571BEDCE35944CC22920604E /* QBChatAttachment+QMCustomData.h in Headers */, - F3F8C74FD51BE3734FF45B207B37E6FF /* QBChatAttachment+QMCustomParameters.h in Headers */, - 96C9E4FB5E1919B204AB94D6F48E18E9 /* QBChatAttachment+QMFactory.h in Headers */, - E56DADB4D15676E505F839F263D72D15 /* QBChatMessage+QMCustomParameters.h in Headers */, - AA76CC8EFB1B97845636B019E73F1007 /* QBUUser+CustomData.h in Headers */, - B8CE323E9C3D1DB5C0324973A18236D4 /* QMAssetLoader.h in Headers */, - D08B7F876B8BBE9BD11209B74016B9B2 /* QMAsynchronousOperation.h in Headers */, - AA9197C37849C197C002472E4BC0E7A4 /* QMAttachmentAssetService.h in Headers */, - 1725FD5D6361BE2B8536E8779A781035 /* QMAttachmentContentService.h in Headers */, - 7B61A2612E4CB1721E5D2E069FA5CEC6 /* QMAttachmentsMemoryStorage.h in Headers */, - 383B53B942B411BF3FBACF0AF955C773 /* QMAttachmentStoreService.h in Headers */, - 323F9B903A541D281976AB79049BC0D8 /* QMAttachmentStoreServiceDelegate.h in Headers */, - 5C1DA4F703180E060549784D03EE2C4E /* QMAuthService.h in Headers */, - 2DC89BBEB82A8E4DAF10D2090A516F9B /* QMBaseService.h in Headers */, - B1751652128CDA7A2BF220931CD6DC95 /* QMCancellableService.h in Headers */, - 1B4FCB722AEEE8DCF77613DC2D901F13 /* QMCDMigrationManager.h in Headers */, - B2FD2C48AD32292E412FCC19D497C884 /* QMCDRecord+Options.h in Headers */, - C4CA2AF7AA919DE0AC6614A82EA33FAF /* QMCDRecord+VersionInformation.h in Headers */, - 9EC1595AAB3530F95CC31979B0746AA1 /* QMCDRecord.h in Headers */, - 5628248208CF63FB059FC05609BAA91D /* QMCDRecordInternal.h in Headers */, - 149D4E5D8374FB825F746A6DB501E5F2 /* QMCDRecordLogging.h in Headers */, - A3150BFB6CF6DD906C762EF6FDCFB9EB /* QMCDRecordStack.h in Headers */, - 8EEA892BBA9A60E1AC22E0531EF77696 /* QMChatAttachmentService.h in Headers */, - 8F2870CD90868F3F083A0404BB97FB74 /* QMChatCache.h in Headers */, - 8E75908D74604A7BFC1D3094B8F5000D /* QMChatConstants.h in Headers */, - FDEB8693B8FB1197992FE3B15F185461 /* QMChatService.h in Headers */, - 59C75ABBDE429357998275D40D0A2EAF /* QMChatServiceModelIncludes.h in Headers */, - 8F2248745F080DD9AC444FDA0C41D1E9 /* QMChatTypes.h in Headers */, - 556B330775D0A029F38BB12B9D85FA6B /* QMContactListCache.h in Headers */, - E98953DBAE73AD6F6A2DEC5F10A9B55A /* QMContactListMemoryStorage.h in Headers */, - 63DC3C9D97EBF7DF8FAA53A35226DB45 /* QMContactListModelIncludes.h in Headers */, - 56562E830AFD78173C801D0FECAD4F7A /* QMContactListService.h in Headers */, - 88B2BD001379756E21EF26422BE0CA24 /* QMDBStorage.h in Headers */, - 5044F7783007CDED45140D6A3EFF28AF /* QMDeferredQueueManager.h in Headers */, - D96DF46D9FBC17339823B8E1061BC03C /* QMDeferredQueueMemoryStorage.h in Headers */, - DB15B2CA4B77B2CA07A10A5052A0CFC1 /* QMDialogsMemoryStorage.h in Headers */, - AC0CE7D50C3AFC18966CB85D5A7BF747 /* QMMediaBlocks.h in Headers */, - 85CC4DC5B002202AD01C58FE304F02E0 /* QMMediaDownloadService.h in Headers */, - 0066B65B4FEDB469D39608875E121A81 /* QMMediaDownloadServiceDelegate.h in Headers */, - 15D9F1D56F3BF3F749BE25A20BF16AA3 /* QMMediaUploadService.h in Headers */, - CB6ECEC14C59845B83B0D0B345D0FF14 /* QMMemoryStorageProtocol.h in Headers */, - A4BBFB487758EB38F4B20416FCDDDE61 /* QMMessagesMemoryStorage.h in Headers */, - 4C28661FB347EEA0B2BC5617736E56AA /* QMOpenGraphCache.h in Headers */, - 231E5F2485F4EA86A1138B7142115AD4 /* QMOpenGraphItem.h in Headers */, - DECEB6A411CDFA72BFF7764E9AC68C26 /* QMOpenGraphMemoryStorage.h in Headers */, - 07FF3EF5D7E82C1E737FC6D46102A1CA /* QMOpenGraphModelIncludes.h in Headers */, - D331E38A85A742D10EA84B928EEE4F41 /* QMOpenGraphService.h in Headers */, - 5A9B6794DBA1399F7A666E8C0040FC91 /* QMServiceManagerProtocol.h in Headers */, - 153910DF6D1CFDF675A86B85DCAE3402 /* QMServices.h in Headers */, - 8BC8B58C6FFB994BD3AA6BEFF7FAF528 /* QMServicesManager.h in Headers */, - 0F4A0480747F2663DA5A2EADCA09D3BF /* QMSLog.h in Headers */, - 24ADF4304DAA874D728AAE7FD801F461 /* QMTimeOut.h in Headers */, - EE3CF11BC7442EDD6A83CB06051DF0B3 /* QMUsersCache.h in Headers */, - 63874E7E358219BC21C52C93FE330456 /* QMUsersMemoryStorage.h in Headers */, - 463C698A7352F3596968F56DAC2C7D0F /* QMUsersModelIncludes.h in Headers */, - 0D0E30260E1F6F77E517024C0986DD84 /* QMUsersService.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6B16F4835759D17037E91943D86ED4A1 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 5B506B30AABFE202CFCB4FD013F4865F /* TTTAttributedLabel.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7302CE7D9AE53174060E2127FEC17174 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 2B5FEA8377B267CE91653EF5FBB856FF /* FLAnimatedImage.h in Headers */, - 54F0A238489A8D6DF7B44EA9ACA4C219 /* FLAnimatedImageView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7ADF520587C5DBD483EC963BB6CF705A /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - BDB1FFC2D5492E26BFB1F6B0211A805E /* EXTRuntimeExtensions.h in Headers */, - DBCA0C9ACD84720B7F2EAB7DADCC1901 /* EXTScope.h in Headers */, - 47718E216CD53112A35CEC6B4E928E66 /* metamacros.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 89BD32676632B5797DA79C21DC056AE3 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - CD283E607D92857B89D30A7AB52F1459 /* FBSDKAppGroupAddDialog.h in Headers */, - 70142C988CF9534083BEC108EDC46A1C /* FBSDKAppGroupContent.h in Headers */, - 1632478F369494BB32B4FAD96ED5A50E /* FBSDKAppGroupJoinDialog.h in Headers */, - 108D1A7E0CF19BEBA753645B6516EE75 /* FBSDKAppInviteContent.h in Headers */, - 31CF84406303E5C15F513E34FFAAF194 /* FBSDKAppInviteDialog.h in Headers */, - FA233DC8E8A9CF5E67F1F456059A7F2A /* FBSDKCameraEffectArguments+Internal.h in Headers */, - A9CBC3E1025849138F1CC14EF9BC2836 /* FBSDKCameraEffectArguments.h in Headers */, - 1DE838EA276D4912FFF016D71C2D54A2 /* FBSDKCameraEffectTextures+Internal.h in Headers */, - 1FB2718F24F2A209BBCFA22EB54CBD64 /* FBSDKCameraEffectTextures.h in Headers */, - A86351C7D9DD78736406E3FD84DC20BC /* FBSDKCheckmarkIcon.h in Headers */, - 4B3D26FDE499B85581293EEB9FD4794C /* FBSDKGameRequestContent.h in Headers */, - A5FC83A2904040D53EE5F630C21551C2 /* FBSDKGameRequestDialog.h in Headers */, - 0212D7241A0E4E37276F410FDF0DE78E /* FBSDKGameRequestFrictionlessRecipientCache.h in Headers */, - 1F523591D668302FB565E286E59C9F20 /* FBSDKHashtag.h in Headers */, - 77B76C209CBEEB52B5FBB13ED0D9EFC9 /* FBSDKLikeActionController.h in Headers */, - 23A2E45323AB9CB2B488B57F2F4D4F09 /* FBSDKLikeActionControllerCache.h in Headers */, - 340DDB4E9B1DB6B21352E5F5110D33B0 /* FBSDKLikeBoxBorderView.h in Headers */, - A47E18704227CF35067AE8D3FE94ADB3 /* FBSDKLikeBoxView.h in Headers */, - 43FEEA2EDFA087E94EC12EAD64031B1F /* FBSDKLikeButton+Internal.h in Headers */, - 99AE240D78D8275E777DE87771EC6A02 /* FBSDKLikeButton.h in Headers */, - F3A8F47BC69BE761EC30A5F02D8A2176 /* FBSDKLikeButtonPopWAV.h in Headers */, - BC831A801164330FF6D941564E638834 /* FBSDKLikeControl+Internal.h in Headers */, - 3D86BDA6619CA78219BADBE0F0622E70 /* FBSDKLikeControl.h in Headers */, - 8F3CC722BCFD80169D97EC2EDEF14586 /* FBSDKLikeDialog.h in Headers */, - 3AE0BB5EF45F95C48CA1771654BB6748 /* FBSDKLikeObjectType.h in Headers */, - E80844C19053A30D6BD7A0C3B73EEEAA /* FBSDKLiking.h in Headers */, - C136CB219348058A53118FF4BCF12C67 /* FBSDKMessageDialog.h in Headers */, - 8D0358876A8871F5118E991B97426F0B /* FBSDKMessengerIcon.h in Headers */, - 3200889D9198D473744AA2C657F335E8 /* FBSDKSendButton.h in Headers */, - 9E54EB08C6ECDD0222FEEAC09DA8A2D5 /* FBSDKShareAPI.h in Headers */, - DB510BB0F9776E21B7F8CE172EECD389 /* FBSDKShareButton.h in Headers */, - 0CA6A548721B022615DAA9CFC3FD9EED /* FBSDKShareCameraEffectContent.h in Headers */, - E35810BC20AB1659125676AC17FB456E /* FBSDKShareConstants.h in Headers */, - EA140C36DB2D6A9AFAE40BA0A1ED7E7E /* FBSDKShareDefines.h in Headers */, - CEDB57A668EE81BA31CE03081718B481 /* FBSDKShareDialog.h in Headers */, - 19FFFD8E5BE5DC4470D247C683219298 /* FBSDKShareDialogMode.h in Headers */, - 40321611C42DE6FADC6E6AFAD3BFDEB9 /* FBSDKShareError.h in Headers */, - 9C51C025962CBC4A3D3DEAD0D10881EB /* FBSDKShareKit+Internal.h in Headers */, - 257FC2F1A0280C9FFC6918D72F9C315B /* FBSDKShareKit.h in Headers */, - 5FC7A3E6ED71AE9796BFD12171FAA858 /* FBSDKShareLinkContent+Internal.h in Headers */, - F14342B6B371DFF46C906DD0AD4F49B7 /* FBSDKShareLinkContent.h in Headers */, - E18265EA0F8A0D18A2CC9D6DF646F562 /* FBSDKShareMediaContent.h in Headers */, - 739D657397B607C6C31C72ED64904A95 /* FBSDKShareMessengerActionButton.h in Headers */, - F1D79E2D4CDCF8EF0A9FD17414395836 /* FBSDKShareMessengerContentUtility.h in Headers */, - 37115174864BB38735B8941958164049 /* FBSDKShareMessengerGenericTemplateContent.h in Headers */, - A27DFBE585B798C9A3A10EB034BE487D /* FBSDKShareMessengerGenericTemplateElement.h in Headers */, - 7E7E10DC8039FF5CD0D7BDC21A405765 /* FBSDKShareMessengerMediaTemplateContent.h in Headers */, - D71E413C7E34381E3FA497CB81ADDDA0 /* FBSDKShareMessengerOpenGraphMusicTemplateContent.h in Headers */, - 32433F821DAD5C1A33962AC5A60619DC /* FBSDKShareMessengerURLActionButton.h in Headers */, - 38F5C3BB16A85DCFE121585D3566DCF4 /* FBSDKShareOpenGraphAction.h in Headers */, - 2BB16B8EB53D7BB69F221999106BAC51 /* FBSDKShareOpenGraphContent.h in Headers */, - DB0B0539707400487903CFA996D540EF /* FBSDKShareOpenGraphObject.h in Headers */, - B2A8B56DE665BA53648CC6FF84F3074C /* FBSDKShareOpenGraphValueContainer+Internal.h in Headers */, - 39C05EA6AFDFD9C3D22E235B495098EF /* FBSDKShareOpenGraphValueContainer.h in Headers */, - CFE479860BFB3C4673AB9B1B7F5B9796 /* FBSDKSharePhoto.h in Headers */, - 11057046F67F489338FFE436CDA92771 /* FBSDKSharePhotoContent.h in Headers */, - 244079DC57138B7B2000061F01F1DB89 /* FBSDKShareUtility.h in Headers */, - F90AB41015899701F8C4B66F6E6D6E0D /* FBSDKShareVideo.h in Headers */, - E09AA03E8F4B4E01CF52872C35D379A6 /* FBSDKShareVideoContent.h in Headers */, - 893FB309FC3423FE4FAE158C6EB5FF60 /* FBSDKSharing.h in Headers */, - E800588CFA581D53C49A44134384B430 /* FBSDKSharingButton.h in Headers */, - 514EF7A065CC21FE9259CEBF51A2166E /* FBSDKSharingContent.h in Headers */, - 888504203FE1EED1860E40396780AD4F /* FBSDKVideoUploader.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8A2173C1A0EC568FE6CD0ABE0237FAD1 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - E44192C848B25FD80E4AA9373F5E8C9A /* _FBSDKLoginRecoveryAttempter.h in Headers */, - 27834E95D691A32A62A7A7A2789E66FE /* FBSDKLoginButton.h in Headers */, - 518D95B2B8CF2E44E1251406A6D1264E /* FBSDKLoginCompletion+Internal.h in Headers */, - ED7C9125BF4BB41581F0CD9FC02A0981 /* FBSDKLoginCompletion.h in Headers */, - B4D46976CA008734A724AE0E317AF035 /* FBSDKLoginConstants.h in Headers */, - E90522E17955FE05776A91AAC420F985 /* FBSDKLoginError.h in Headers */, - 8EC9CA21733FBDA23037FA0EBB029B3E /* FBSDKLoginKit+Internal.h in Headers */, - 4C02086998A0A51EF387ED85081A1249 /* FBSDKLoginKit.h in Headers */, - 2B62381FEB8C61B4EDDC66581782DAE9 /* FBSDKLoginManager+Internal.h in Headers */, - 135E9C83EE213B20D8D3DE525E8AAAEC /* FBSDKLoginManager.h in Headers */, - A8475D2BAACD992796D7CAB13E555643 /* FBSDKLoginManagerLogger.h in Headers */, - 1520D27C0B7A7063681106187EA41C05 /* FBSDKLoginManagerLoginResult+Internal.h in Headers */, - 58BFB38BEA44FA7E9C1C74E45AA721C8 /* FBSDKLoginManagerLoginResult.h in Headers */, - 4E2A691EA2244CD6AB4F5529E44C92AB /* FBSDKLoginTooltipView.h in Headers */, - DDB61EBD07A98E063BC4C8C13975BCAC /* FBSDKLoginUtility.h in Headers */, - 5B5804535A35C2E90DF7525E8491A1F7 /* FBSDKTooltipView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A0179930F2396F1588C283183BDBF2D9 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 17483D6E703F7BFADBF8572B4E710B06 /* Flurry.h in Headers */, - 708122532A4F1562FEB6C8B9D65644B2 /* FlurrySessionBuilder.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A922FE66E6DEA4BD3090DCEB4580F34E /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 2B40797BA3516238E9D52125B9726411 /* GTMSessionFetcher.h in Headers */, - 67A134A8E94DAD919F69449EC07A29D9 /* GTMSessionFetcherLogging.h in Headers */, - A04709B7267367F356C4224182C987DF /* GTMSessionFetcherService.h in Headers */, - 7DE67EECCADD9D9C411718AD17DA9742 /* GTMSessionUploadFetcher.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - BF123067D24B6DA0F88CFEB5A64538C0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 59570F2F69AA8AE4AE337C9C87F7C150 /* SVIndefiniteAnimatedView.h in Headers */, - F4125D15F946BB3EF0FAE6BADBB8D8AF /* SVProgressAnimatedView.h in Headers */, - 7D6D66599E58B5C64607BE59223BCC01 /* SVProgressHUD.h in Headers */, - 50AD70CA72E66A594FE811299E84D633 /* SVRadialGradientLayer.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CF7D59A31DB6D8206430E57A5DB79228 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 6097EDAC09C555EDCADB501799DBE7EC /* NSBundle+NYTPhotoViewer.h in Headers */, - 82052CB69B788A39875D052B6F50924B /* NYTPhoto.h in Headers */, - 659265D9B0B0B897C72223E950FA97B3 /* NYTPhotoCaptionView.h in Headers */, - 3855CACDA01DCD6DCC3B9D77E19CEFCA /* NYTPhotoCaptionViewLayoutWidthHinting.h in Headers */, - B97037A599DD98C66521FB2A1D850BCC /* NYTPhotoContainer.h in Headers */, - 7CFD71E7CBC52D52F1C6575EF8B2A905 /* NYTPhotoDismissalInteractionController.h in Headers */, - 3B69B2F2E49BDFA970A73BD158B6B7F6 /* NYTPhotosOverlayView.h in Headers */, - 5C850D609C66C435AC4B97B1E0D0F193 /* NYTPhotosViewController.h in Headers */, - 3AAA52DDEA6018AC383576B83C39695B /* NYTPhotoTransitionAnimator.h in Headers */, - 7E43DC7B62F1DBE513EAD2D15E6A59CB /* NYTPhotoTransitionController.h in Headers */, - 85BDE8CC2714C8C18BD035332FD49C65 /* NYTPhotoViewController.h in Headers */, - 0A91AB2004A982DA48F13DEBCDF18A65 /* NYTPhotoViewer.h in Headers */, - 76FC774884990D1D3AE1725BC8C26B20 /* NYTPhotoViewerArrayDataSource.h in Headers */, - AF71B7ACE23E5312C2F8014572614845 /* NYTPhotoViewerCore.h in Headers */, - 481ED9FFD5A391B7420CFB66A7A5E2B9 /* NYTPhotoViewerDataSource.h in Headers */, - 9CB5FFDE120D29F4E409FF9B5A19280D /* NYTPhotoViewerSinglePhotoDataSource.h in Headers */, - 2FA986F07B6B0BC7A5B603965446F28B /* NYTScalingImageView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D4DB0B7FAFE91ED551CA33B2A3844FD8 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 8C21CB73126926339DF7868C30597666 /* _FBSDKTemporaryErrorRecoveryAttempter.h in Headers */, - E5DCA4F5BE67C0989D717195F7F038CC /* FBSDKAccessToken.h in Headers */, - 6360FFD130FE897F1C68979385A5B7A2 /* FBSDKAccessTokenCache.h in Headers */, - 71FBBBFC5E6433E531DB69A348327411 /* FBSDKAccessTokenCacheV3.h in Headers */, - 21B23FC9554750E0F7F154FC11FF0A45 /* FBSDKAccessTokenCacheV3_17.h in Headers */, - 6F65D8F95B40DCD766C9DEDB92F80496 /* FBSDKAccessTokenCacheV3_21.h in Headers */, - 2FEBCDE902CA94289BAC0FFF5E19F59B /* FBSDKAccessTokenCacheV4.h in Headers */, - 88EC8303D5179979FBFF397C01FD52F8 /* FBSDKAccessTokenCaching.h in Headers */, - E3A04BE014878C82E7E83D8F9EAC894A /* FBSDKAppEvents+Internal.h in Headers */, - 5A4D31D25FDFD871C4FD41A679ECC9A3 /* FBSDKAppEvents.h in Headers */, - 0C143D66C3688C57E8E740A35FADB8FE /* FBSDKAppEventsDeviceInfo.h in Headers */, - EF24C24137863C733D4F041F034E0F44 /* FBSDKAppEventsState.h in Headers */, - 444F85B23D98689C2A5AFB23FAFD1CAF /* FBSDKAppEventsStateManager.h in Headers */, - C07EF9F965BD97CDF166FF95BFE07D9A /* FBSDKAppEventsUtility.h in Headers */, - A1619A0DDC8E52654368C0A6CFCCA325 /* FBSDKApplicationDelegate+Internal.h in Headers */, - 9AD191D784A3073C49F0F37DD1338128 /* FBSDKApplicationDelegate.h in Headers */, - 2894CDD0C5BB854D6553D7F70ACC853A /* FBSDKAppLinkResolver.h in Headers */, - AD92C7AE00438FA80780BBDCA1F21E07 /* FBSDKAppLinkUtility.h in Headers */, - 088A4C298322BF18F28176C711F060F9 /* FBSDKAudioResourceLoader.h in Headers */, - F0D87A8CAFFADB0B1140238DB5B72E98 /* FBSDKBase64.h in Headers */, - BCCA7557E2642BAB925F8D81D7AE001E /* FBSDKBoltsMeasurementEventListener.h in Headers */, - AB80F2322ADD08E8941326E1BADFB7EE /* FBSDKBridgeAPICrypto.h in Headers */, - 98794F8D71B412F5E4E109E0BB79E5B2 /* FBSDKBridgeAPIProtocol.h in Headers */, - 948BB1962A4400DFA3F394E2D7642B04 /* FBSDKBridgeAPIProtocolNativeV1.h in Headers */, - 534C751949C6C5876A8BB635DF39F890 /* FBSDKBridgeAPIProtocolType.h in Headers */, - 835963CD9A19E3A9A1194823AA7453EA /* FBSDKBridgeAPIProtocolWebV1.h in Headers */, - 929955F0C3ED2B4C211B1F67A5F75C0B /* FBSDKBridgeAPIProtocolWebV2.h in Headers */, - C747B151674B5FEB326D2D474EE3625C /* FBSDKBridgeAPIRequest+Private.h in Headers */, - 7EE9D7BE4AE2D89B8DCD3289F3C76B91 /* FBSDKBridgeAPIRequest.h in Headers */, - C529D54C6D8573A044A166FF32D433F2 /* FBSDKBridgeAPIResponse.h in Headers */, - 79C7BED2255039049E35A80E03FD678D /* FBSDKButton+Subclass.h in Headers */, - A866AF8BAAE067AA925C70F98227870C /* FBSDKButton.h in Headers */, - 93025B5DC77C5AAD1962B346EDA4A7C5 /* FBSDKCloseIcon.h in Headers */, - 4045A655A28C4D6B2D59748FCCC6492D /* FBSDKColor.h in Headers */, - DD66234B4708AE1240CB482EC582DD9E /* FBSDKConstants.h in Headers */, - A585CDA25BD21A124297C0EA2CEBB32C /* FBSDKContainerViewController.h in Headers */, - CDA522FD20B477E35A8F6F8FB0A16979 /* FBSDKCopying.h in Headers */, - 6328151D5F829448289AE3D02C43E2AC /* FBSDKCoreKit+Internal.h in Headers */, - 66B4B24E9AFA475E14DCE5974AF2BA2D /* FBSDKCoreKit.h in Headers */, - 71537243BF2F107441851F32A0816175 /* FBSDKCrypto.h in Headers */, - 45E9899901496DB8E1BB77BCCB35942A /* FBSDKDeviceRequestsHelper.h in Headers */, - 9E481788D32865BFC4CAF3998B8CE864 /* FBSDKDialogConfiguration.h in Headers */, - BE0AA00AA0813EB9207CCF55803CCB3B /* FBSDKDynamicFrameworkLoader.h in Headers */, - B6BA75293C66DAAD1E246965A4AF8B75 /* FBSDKError.h in Headers */, - 16F22E615E2C344E95D4101E13334DEA /* FBSDKErrorConfiguration.h in Headers */, - A98DB463E152E02ED22EB04F22AA9EF9 /* FBSDKErrorRecoveryAttempter.h in Headers */, - 5BBA29DB5A7C64C65260A923FEFBE518 /* FBSDKErrorRecoveryConfiguration.h in Headers */, - 0AD0522EDA6C7027CB8F231EB7CC8B28 /* FBSDKGraphErrorRecoveryProcessor.h in Headers */, - D20591364652894BFBA85F8D8999DB06 /* FBSDKGraphRequest+Internal.h in Headers */, - 825BE7C8773296CEF444107F2D5C44B6 /* FBSDKGraphRequest.h in Headers */, - B49602FD4F0BDC6CCE46C7E33B30218E /* FBSDKGraphRequestBody.h in Headers */, - F82EB57DE8272C532606AEC7B13809C5 /* FBSDKGraphRequestConnection+Internal.h in Headers */, - 6A7C95356BF906A2F584A9536F5C7E34 /* FBSDKGraphRequestConnection.h in Headers */, - CAE191381B83104733E93360F0399E1A /* FBSDKGraphRequestDataAttachment.h in Headers */, - 791FA10E1D45B26E251371316B64E97D /* FBSDKGraphRequestMetadata.h in Headers */, - B5742194CA6FDFD85BF455BC7430DA4B /* FBSDKGraphRequestPiggybackManager.h in Headers */, - D4590F5C8526E32367C22B4EFB160314 /* FBSDKIcon.h in Headers */, - 300AF6606D613107DE8B725967DEB9C3 /* FBSDKImageDownloader.h in Headers */, - 2793C7FE6DF0D7001E0656206EBB5A7D /* FBSDKInternalUtility.h in Headers */, - AA7EFF4D97101807D640785561B051B4 /* FBSDKKeychainStore.h in Headers */, - 47DE147630512D696442B0B2D8BE8452 /* FBSDKKeychainStoreViaBundleID.h in Headers */, - 1FEE4A3A4886B52E3F3936ACFBC5689D /* FBSDKLogger.h in Headers */, - 8F1E651FD4AB069E929E4861585C1FE2 /* FBSDKLogo.h in Headers */, - 9A2462496B22868432732811E56A3F64 /* FBSDKMacros.h in Headers */, - 7893A234C42B3AF4D93E015F83DDFE86 /* FBSDKMaleSilhouetteIcon.h in Headers */, - F4EA1A3F15F0B9DD051F0976130215F0 /* FBSDKMath.h in Headers */, - 969E0C75A4B296F9C4A3B518A41F48AD /* FBSDKMonotonicTime.h in Headers */, - 7C24C040EE2016695820B719D6E25DFE /* FBSDKMutableCopying.h in Headers */, - 632A723B5BD7522B1CD6D0BAAC1917E0 /* FBSDKPaymentObserver.h in Headers */, - 55FEDC9AF0D9B4DCBD221ECA35C27839 /* FBSDKProfile+Internal.h in Headers */, - 5BBB9C327909B0A6BB532FEF5EC757FC /* FBSDKProfile.h in Headers */, - 2B6E64C0E8A6E38A0ADB2175091E95CD /* FBSDKProfilePictureView.h in Headers */, - 10A27E49747653F1620A11593EB2258F /* FBSDKServerConfiguration+Internal.h in Headers */, - 72EB9AC53E9DB6DD3C0FC2354075A4A3 /* FBSDKServerConfiguration.h in Headers */, - 3952D92F59CDC058F4EDB106AE6A8ACD /* FBSDKServerConfigurationManager+Internal.h in Headers */, - F71AE72C95D56248AE7332011A8CF8E8 /* FBSDKServerConfigurationManager.h in Headers */, - 2C93D0ECDF231AC369DA9BB4CC43481D /* FBSDKSettings+Internal.h in Headers */, - A1EF997321F60B5C631028894876A44C /* FBSDKSettings.h in Headers */, - DB5990B51830007DE8001E6A57F0B4CA /* FBSDKSystemAccountStoreAdapter.h in Headers */, - 1A7543BD7222812EA85CA33A5210299A /* FBSDKTestUsersManager.h in Headers */, - 575B183E984A119FB4881C661BA1049F /* FBSDKTimeSpentData.h in Headers */, - CF670B170C49C1C5DD33285A4FFBB2F8 /* FBSDKTriStateBOOL.h in Headers */, - 7E189CE58B25B5F613F4615161CA7E6A /* FBSDKTypeUtility.h in Headers */, - D13D2ABAC952FFE1557B31E74A5300C1 /* FBSDKUIUtility.h in Headers */, - 352EC9EAAAAE39EC5B1B36680FB1A027 /* FBSDKURLConnection.h in Headers */, - 1BE445CC79BF3E812C44ACA324D310D1 /* FBSDKURLOpening.h in Headers */, - 5D0050CC3ED70B04830E6BDCFC3A9022 /* FBSDKURLSessionTask.h in Headers */, - 246AE85F0EAA447F7E248856212B3596 /* FBSDKUtility.h in Headers */, - 19F361C4DD931E887D8A3976A1F2F2DE /* FBSDKViewImpressionTracker.h in Headers */, - D5255EC632AAE2E451498F81310B6737 /* FBSDKWebDialog.h in Headers */, - 98C34BBBAD6FD6C2A2A18B4DD623D785 /* FBSDKWebDialogView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E12D26E1905F2F138CD670268110FBA6 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 31E83DB0CC749D09F21A179DACE95E50 /* UIDevice-Hardware.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EAAF6F392F2A66DD3C037F12BC7DA99D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 9C9AE4B8D8D5C58B18EC91EB019D6D5F /* Reachability.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 0690B3703CDEFCA9E550593425EBA16D /* UIDevice-Hardware */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5931207A875964A2905D48D209ECBD94 /* Build configuration list for PBXNativeTarget "UIDevice-Hardware" */; - buildPhases = ( - FF33C264A4DF8E26C8BEF5DD5DDDAA4E /* Sources */, - EB4D0DEBD60DAD6CDAA010AAC24DB847 /* Frameworks */, - E12D26E1905F2F138CD670268110FBA6 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "UIDevice-Hardware"; - productName = "UIDevice-Hardware"; - productReference = 1DAD4F9CF7717798BD3915B71932EF1B /* libUIDevice-Hardware.a */; - productType = "com.apple.product-type.library.static"; - }; - 0B75BDD839FAE8A626E9F849FAD07E1D /* QMServicesDevelopment-QMContactListCacheModel */ = { - isa = PBXNativeTarget; - buildConfigurationList = EE2B7774DA5DBFF8FEEFA97B6E516273 /* Build configuration list for PBXNativeTarget "QMServicesDevelopment-QMContactListCacheModel" */; - buildPhases = ( - 4B0EECC2D2B9EFC749F83B8294C48D7C /* Sources */, - F86ED00A00DEB9BDB585046A60693E92 /* Frameworks */, - 2E5A192B7D7B9DDB25B533FCBBF210EE /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "QMServicesDevelopment-QMContactListCacheModel"; - productName = "QMServicesDevelopment-QMContactListCacheModel"; - productReference = C4492923DE06654D3A8F851F37C513B9 /* QMContactListCacheModel.bundle */; - productType = "com.apple.product-type.bundle"; - }; - 0E9F6724C731DB563F6A7FC5A489C702 /* Bolts */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8AE925A3FECD26D8C770C50697A7F672 /* Build configuration list for PBXNativeTarget "Bolts" */; - buildPhases = ( - 7C7268EAAC6516366BAAD18EE7173DA3 /* Sources */, - 837322C469518863893FE462AAAEFABA /* Frameworks */, - 22A4D9040C3EF4043783126B1BEF7A32 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Bolts; - productName = Bolts; - productReference = 23C5F871F3D3B5EBDF8A0069464984E4 /* libBolts.a */; - productType = "com.apple.product-type.library.static"; - }; - 1A06F5C7E9649A20BBB3BDB19FF15CD8 /* FFCircularProgressView */ = { - isa = PBXNativeTarget; - buildConfigurationList = 56D6E2F9B2A8083446F658D5228A194C /* Build configuration list for PBXNativeTarget "FFCircularProgressView" */; - buildPhases = ( - CCDF9462017F7ADD5A4E72A96BF43B17 /* Sources */, - E299CB81756D73E01462FF8EAAD39983 /* Frameworks */, - 03CDBB4C3C7BB5DF2F9A65E35669CA86 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = FFCircularProgressView; - productName = FFCircularProgressView; - productReference = EF2EDAB227117B6531948C2633245BBA /* libFFCircularProgressView.a */; - productType = "com.apple.product-type.library.static"; - }; - 2DF45F79772046883B169490C8F114D5 /* libextobjc */ = { - isa = PBXNativeTarget; - buildConfigurationList = 10307B4A394B984083F6541BD3D52511 /* Build configuration list for PBXNativeTarget "libextobjc" */; - buildPhases = ( - AA679C725B5CBB38C794664311A812B8 /* Sources */, - 79B6E9C8BD757085A14B5C23A7F1FD74 /* Frameworks */, - 7ADF520587C5DBD483EC963BB6CF705A /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = libextobjc; - productName = libextobjc; - productReference = 8827D20336FE055B0C6C5AE0387FCE39 /* liblibextobjc.a */; - productType = "com.apple.product-type.library.static"; - }; - 38A71AE9A9ECB4C06A722B8AEA6349F0 /* QMServicesDevelopment-QMOpenGraphCacheModel */ = { - isa = PBXNativeTarget; - buildConfigurationList = BE9CBE42CDA7CB2B09E6845D7BC2A90E /* Build configuration list for PBXNativeTarget "QMServicesDevelopment-QMOpenGraphCacheModel" */; - buildPhases = ( - A326A0980F22A4A489AC0F730EAA95CC /* Sources */, - B23530C25EAB20E7EACF8DF332911B87 /* Frameworks */, - F805201DF70DD226E338929FFA7E99BF /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "QMServicesDevelopment-QMOpenGraphCacheModel"; - productName = "QMServicesDevelopment-QMOpenGraphCacheModel"; - productReference = 799EA28142EA168AA6D8F2F5BCBC52F8 /* QMOpenGraphCacheModel.bundle */; - productType = "com.apple.product-type.bundle"; - }; - 3C7B23B3FE0CE1A6131C7E09B3F47DA3 /* FBSDKCoreKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = 54ED1AC30C00A566ABF4273B7106EA84 /* Build configuration list for PBXNativeTarget "FBSDKCoreKit" */; - buildPhases = ( - 4358D85EBADECB5389A2F9B2EB11357F /* Sources */, - 103348B28AC93F378618ADF5F1D9B8F4 /* Frameworks */, - D4DB0B7FAFE91ED551CA33B2A3844FD8 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - 34CB39E0B837C98BEB1C9EE58AF6DB29 /* PBXTargetDependency */, - ); - name = FBSDKCoreKit; - productName = FBSDKCoreKit; - productReference = 2E32041EC4251D18EB6D8FB2DB4E3991 /* libFBSDKCoreKit.a */; - productType = "com.apple.product-type.library.static"; - }; - 4AC6694FB63559D1F05407D6114112E8 /* QMServicesDevelopment */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4837F1A2EEB666992DEA13CB70B74428 /* Build configuration list for PBXNativeTarget "QMServicesDevelopment" */; - buildPhases = ( - 522C93B840A358C3A2E8D03832A46C66 /* Sources */, - B1913B09085910B203447CBE9122191F /* Frameworks */, - 4D868FEA168DA4EC6CA5D71E71B8E494 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - 057BB16DFCC85E7DB25B23957716A000 /* PBXTargetDependency */, - 0B30DCB0B03D78D8313C94F13FCD0577 /* PBXTargetDependency */, - 7C505CAB477235264C1907AF3666D8EB /* PBXTargetDependency */, - 2395C73175B67C88CCFE09B09257E349 /* PBXTargetDependency */, - F8F7A296D39ABE45EADDD6B437F8CFA0 /* PBXTargetDependency */, - ); - name = QMServicesDevelopment; - productName = QMServicesDevelopment; - productReference = 822679CBBCE88BA77C083697F4AAD5A4 /* libQMServicesDevelopment.a */; - productType = "com.apple.product-type.library.static"; - }; - 4C6C0DEC127307838A58C68F289A3404 /* FBSDKShareKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5164612F51FC4B301DF7EE041D46A746 /* Build configuration list for PBXNativeTarget "FBSDKShareKit" */; - buildPhases = ( - DB2F46150A8F829D008E8125043030F9 /* Sources */, - 07CCB61741DB19681E54D52635F9781A /* Frameworks */, - 89BD32676632B5797DA79C21DC056AE3 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - 111A77F94FFAF9AF9D080E9B9CA4BAD5 /* PBXTargetDependency */, - 6B6FD1A00A83EBE4394A66E9B5D56ABF /* PBXTargetDependency */, - ); - name = FBSDKShareKit; - productName = FBSDKShareKit; - productReference = 3C7E71FEFAC60FAAB128CA9ED2C6073D /* libFBSDKShareKit.a */; - productType = "com.apple.product-type.library.static"; - }; - 53E70B95EC311E7F79EEA81B041F3B9D /* QMCVDevelopment-QMChatViewController */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2D3F26C7968B745E49901D577BFBEE61 /* Build configuration list for PBXNativeTarget "QMCVDevelopment-QMChatViewController" */; - buildPhases = ( - 91C0EA9627644351F14DD0367D57CE3B /* Sources */, - 829EFFF0C4C5B450803347E238EEB768 /* Frameworks */, - 63D220CAA07AD15D2E9C304ADB7ECE56 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "QMCVDevelopment-QMChatViewController"; - productName = "QMCVDevelopment-QMChatViewController"; - productReference = A48048F8F09ADF531BD89B432DF26945 /* QMChatViewController.bundle */; - productType = "com.apple.product-type.bundle"; - }; - 53F8571E2D572C4069860E38654A566A /* FLAnimatedImage */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0EA4F995CBBF1300B4D566BFA7DD3B38 /* Build configuration list for PBXNativeTarget "FLAnimatedImage" */; - buildPhases = ( - 9A240679857C41948A668489081D7FB6 /* Sources */, - 8E86703F96A4090BC5045C37B7C91BBB /* Frameworks */, - 7302CE7D9AE53174060E2127FEC17174 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = FLAnimatedImage; - productName = FLAnimatedImage; - productReference = 01D02DBEB8B9B8494EDED59F61B0C25E /* libFLAnimatedImage.a */; - productType = "com.apple.product-type.library.static"; - }; - 58E7450DB13C5ECCE92D3C0DF7CF0903 /* GoogleToolboxForMac */ = { - isa = PBXNativeTarget; - buildConfigurationList = 26AE791F404F3732C3335D0EFE25E20A /* Build configuration list for PBXNativeTarget "GoogleToolboxForMac" */; - buildPhases = ( - F86A0216D6948A1D34655DBC29C561FC /* Sources */, - E468DEE3816A9E9ED082166AC0F3EAAB /* Frameworks */, - 0CBA5A14986DAE7D6A473749221AA81F /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = GoogleToolboxForMac; - productName = GoogleToolboxForMac; - productReference = 8702140972D8E5BCB9C2664CCB9A68AD /* libGoogleToolboxForMac.a */; - productType = "com.apple.product-type.library.static"; - }; - 5DC7D7B380A5FEAE815A0DDD986A0174 /* FBSDKLoginKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = B0CFCFBC523246113D9ECF0992D10999 /* Build configuration list for PBXNativeTarget "FBSDKLoginKit" */; - buildPhases = ( - 04FAFDAEC1A4E8C8F64D2B15F5E88C3E /* Sources */, - 800FD907758FC42E67890E47DA697DA5 /* Frameworks */, - 8A2173C1A0EC568FE6CD0ABE0237FAD1 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - E693A6BEFB63D60F2095256F4580CD03 /* PBXTargetDependency */, - 2951ED6CDDFE728A5A1D065DCB189A2B /* PBXTargetDependency */, - ); - name = FBSDKLoginKit; - productName = FBSDKLoginKit; - productReference = D19FE341DC039EF832BC42319F8FD7AE /* libFBSDKLoginKit.a */; - productType = "com.apple.product-type.library.static"; - }; - 83014B2A0ECA41385F1F8E17B56DA168 /* SDWebImage */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5E24C5272FD257FE60A13BA12B2ED671 /* Build configuration list for PBXNativeTarget "SDWebImage" */; - buildPhases = ( - 0336902738632EBF4558B6BC13E3329F /* Sources */, - 82898345DB17F1B71717FF167E1EC2A5 /* Frameworks */, - 455635E29D1957C96EB66B2012852E40 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SDWebImage; - productName = SDWebImage; - productReference = ED0986CB8FE1902FA9E7F5EC65420342 /* libSDWebImage.a */; - productType = "com.apple.product-type.library.static"; - }; - 920A033878AC85D8D51DCA2DD7082EFA /* Pods-Q-municate */ = { - isa = PBXNativeTarget; - buildConfigurationList = 513767D61709140E2126747707AC5395 /* Build configuration list for PBXNativeTarget "Pods-Q-municate" */; - buildPhases = ( - 2800C2672DBE6120AAE6E2368482ECBD /* Sources */, - 8DE927B9765C1F08238FB9F65DE44979 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 5091B8859CA16BC18C20BB9F4AE56A81 /* PBXTargetDependency */, - BFCDE46E5C3F0DD01CF576208198C7B6 /* PBXTargetDependency */, - 209DFAE2F4A0B9A05833496C3A1E8A08 /* PBXTargetDependency */, - B4226DD7EC90BFC21B1B0DF91C495314 /* PBXTargetDependency */, - 49A18CAD6CAA11B0D6AF066E57999BFE /* PBXTargetDependency */, - 0B1FE6A8282DADB6AADDDEAA748C68A4 /* PBXTargetDependency */, - 184B77FA01D37107E5087141D01AC80E /* PBXTargetDependency */, - 48B88E28437E3F10512DE687BD1DE0F6 /* PBXTargetDependency */, - 3ABB3D7972B7CC5DEA50F12EA9774D1B /* PBXTargetDependency */, - B93C0727FA28BC56F0CBCED4E38D0C68 /* PBXTargetDependency */, - 751966FF7823728EB203937A4F85718C /* PBXTargetDependency */, - F3E8D37648A1FBA5997D4E2DE7C9E172 /* PBXTargetDependency */, - 100C2B99A105683E92DE08C279C72924 /* PBXTargetDependency */, - 3C0486F933F155AB50FBFDCA6C3D1B2F /* PBXTargetDependency */, - AEC79AC6DB18DA65267629B792F295CE /* PBXTargetDependency */, - 43CF591054033EF14127439E52F975BD /* PBXTargetDependency */, - FDDB258DF49B3F615CC307E4EB890D04 /* PBXTargetDependency */, - F4C939F2EA7BCC733F554F7846868A36 /* PBXTargetDependency */, - 2BD42273316840A4CAA671BFF9C24A03 /* PBXTargetDependency */, - 2BD0071A78A9962872397E7E8B54F9CF /* PBXTargetDependency */, - 7EBE7FDBC22144E7D29825EAAD6BC4E2 /* PBXTargetDependency */, - ); - name = "Pods-Q-municate"; - productName = "Pods-Q-municate"; - productReference = E28BDBCA3CD5C555E5A06557DB0E5DF5 /* libPods-Q-municate.a */; - productType = "com.apple.product-type.library.static"; - }; - 947C320DA7E2498987AA8DBC41B6962B /* TTTAttributedLabel */ = { - isa = PBXNativeTarget; - buildConfigurationList = 74BE78D97AB340DF909A641CD241C9B0 /* Build configuration list for PBXNativeTarget "TTTAttributedLabel" */; - buildPhases = ( - BB4E9B4C84407D5DBEEB2CB6EE325DDD /* Sources */, - 2185CE47F94FED599666C7B8B0AE80DD /* Frameworks */, - 6B16F4835759D17037E91943D86ED4A1 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = TTTAttributedLabel; - productName = TTTAttributedLabel; - productReference = DE7E8EF61D7BEBC5017652DC8DFE2227 /* libTTTAttributedLabel.a */; - productType = "com.apple.product-type.library.static"; - }; - 950C39FC06439A7624B49DD0B04EF6A4 /* Reachability */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0E672B1E90B59818D965CC644216AC54 /* Build configuration list for PBXNativeTarget "Reachability" */; - buildPhases = ( - 73816ECBBEBC550F590E89944C3FA23C /* Sources */, - EBAA7A730C2E0706656948E1E1A6EBD2 /* Frameworks */, - EAAF6F392F2A66DD3C037F12BC7DA99D /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Reachability; - productName = Reachability; - productReference = 884D53BFEA7FA095F28C2524C814D7FC /* libReachability.a */; - productType = "com.apple.product-type.library.static"; - }; - 9759E35C43E441BC28525D08A117A254 /* SVProgressHUD */ = { - isa = PBXNativeTarget; - buildConfigurationList = AC6FD4401A8A13633E2FECE0BB773A18 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */; - buildPhases = ( - C3FF0394AE75D52DD12A6D2BD97B7BCB /* Sources */, - B86992B377CDEFE3592DD6A7A9488B7C /* Frameworks */, - BF123067D24B6DA0F88CFEB5A64538C0 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SVProgressHUD; - productName = SVProgressHUD; - productReference = 3AF12F6DEC81C612880F465829219E17 /* libSVProgressHUD.a */; - productType = "com.apple.product-type.library.static"; - }; - 9E08ABFDE9A9FEBE05E34F8D602B5D05 /* NYTPhotoViewer */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7D0FFB16B3CD0C97180CA14055E3E8CA /* Build configuration list for PBXNativeTarget "NYTPhotoViewer" */; - buildPhases = ( - DA4FB5051BB7C7B1C896461161B6B64E /* Sources */, - 88DE4EA19994B377127799BB16ABA952 /* Frameworks */, - CF7D59A31DB6D8206430E57A5DB79228 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - C48C86A0E4F1518D8C0766A11FBF91F1 /* PBXTargetDependency */, - AADCED0C798BE2B8014C1AE5C68E3A09 /* PBXTargetDependency */, - ); - name = NYTPhotoViewer; - productName = NYTPhotoViewer; - productReference = 1A7341DE3D7FAA6D2747EBEED5EC6845 /* libNYTPhotoViewer.a */; - productType = "com.apple.product-type.library.static"; - }; - 9FEAFD88D24F33B95A476A6CE1C9D7B1 /* QMServicesDevelopment-QMChatCacheModel */ = { - isa = PBXNativeTarget; - buildConfigurationList = B8BAFB96CF7B7AD9BB399EC00C74110C /* Build configuration list for PBXNativeTarget "QMServicesDevelopment-QMChatCacheModel" */; - buildPhases = ( - FE69770E51D99EA3B4D51F7AFBD81F7E /* Sources */, - 61F01874C3569670098F9A3069F9F957 /* Frameworks */, - 36A1220086D0FEB2F2CCA968CF0752CF /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "QMServicesDevelopment-QMChatCacheModel"; - productName = "QMServicesDevelopment-QMChatCacheModel"; - productReference = 0A3BAAEF184ACBE2A82C6E0D92B5C0B5 /* QMChatCacheModel.bundle */; - productType = "com.apple.product-type.bundle"; - }; - A73F7BA2724DA49151347776E962A5BD /* Pods-QMSiriExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 859E38FA2F38AE3F07B2E830849D825D /* Build configuration list for PBXNativeTarget "Pods-QMSiriExtension" */; - buildPhases = ( - 29B9054B85E209E9B94DFFC2EF3483D4 /* Sources */, - A3DFDCB1F21BEE4DBCC9090731628CD4 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 1CDAF7ECDDDA4C37835C2A039666C936 /* PBXTargetDependency */, - 9BA358202B8144C9C0B3C3E63CBA7D2E /* PBXTargetDependency */, - ); - name = "Pods-QMSiriExtension"; - productName = "Pods-QMSiriExtension"; - productReference = E9EE0F66606FAAFEA8343084EF925909 /* libPods-QMSiriExtension.a */; - productType = "com.apple.product-type.library.static"; - }; - AF8DD809CD36FF2A5C8E36ED6C4D1F07 /* SAMKeychain */ = { - isa = PBXNativeTarget; - buildConfigurationList = 400B9641D67DA8313CB1F62EDFD136A5 /* Build configuration list for PBXNativeTarget "SAMKeychain" */; - buildPhases = ( - 0E545C396E8A76A1DFC21C02DACF7561 /* Sources */, - D23C4F72EE742D907CA46790589BF9B6 /* Frameworks */, - 11E2EC6AEE000428C349B1A4FC797B7D /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SAMKeychain; - productName = SAMKeychain; - productReference = A53FB2466992DA7C8C52D1D934726165 /* libSAMKeychain.a */; - productType = "com.apple.product-type.library.static"; - }; - B5565B1B4186F2175F4B214784342804 /* QMServicesDevelopment-QMUsersCacheModel */ = { - isa = PBXNativeTarget; - buildConfigurationList = E99074401543983F0F8396986ED2140A /* Build configuration list for PBXNativeTarget "QMServicesDevelopment-QMUsersCacheModel" */; - buildPhases = ( - 1ADD53E471387C89AB47DBC29F4EC121 /* Sources */, - F0FC79B195CFD08111E9128910F2527B /* Frameworks */, - 9478C112B7133124F2D1D44110D53B58 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "QMServicesDevelopment-QMUsersCacheModel"; - productName = "QMServicesDevelopment-QMUsersCacheModel"; - productReference = 3CE7568C3CA32393DB5DF13B6B047842 /* QMUsersCacheModel.bundle */; - productType = "com.apple.product-type.bundle"; - }; - BD669C0D6F0266E29B35F7AE071BE0A7 /* Flurry-iOS-SDK */ = { - isa = PBXNativeTarget; - buildConfigurationList = 71AFDB09C713BD051B1B23DBADE0FEB4 /* Build configuration list for PBXNativeTarget "Flurry-iOS-SDK" */; - buildPhases = ( - 3DE6347700F682781D6E6D8B02C03A2C /* Sources */, - 89FA48AC9AA158471A611E8989B3BD6B /* Frameworks */, - A0179930F2396F1588C283183BDBF2D9 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Flurry-iOS-SDK"; - productName = "Flurry-iOS-SDK"; - productReference = 3634AA846B694FDCB247930C6F1E00DC /* libFlurry-iOS-SDK.a */; - productType = "com.apple.product-type.library.static"; - }; - C887E366CD38658EFB8D7738027F2DFD /* FirebaseUI-FirebasePhoneAuthUI */ = { - isa = PBXNativeTarget; - buildConfigurationList = 54D28670139C0DBE3BD94F750E236F32 /* Build configuration list for PBXNativeTarget "FirebaseUI-FirebasePhoneAuthUI" */; - buildPhases = ( - 4BC6E8DBDC7599ABB10C231A50534C91 /* Sources */, - 554BD06B018861111279770D87A21095 /* Frameworks */, - 82EC2E2A35FAEA749551A1A2D23C937C /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "FirebaseUI-FirebasePhoneAuthUI"; - productName = "FirebaseUI-FirebasePhoneAuthUI"; - productReference = CDB319DABDE7C42F6505B39CA8EB2812 /* FirebasePhoneAuthUI.bundle */; - productType = "com.apple.product-type.bundle"; - }; - CF4B35B9FC819386EB09219BC91827D7 /* nanopb */ = { - isa = PBXNativeTarget; - buildConfigurationList = B8307E997A097EB50C00A8C7967B858A /* Build configuration list for PBXNativeTarget "nanopb" */; - buildPhases = ( - 5303D5F0966B6798D7AAA88A9ACCB670 /* Sources */, - 94EB8A8937D61E8CED1F3C819230AE4D /* Frameworks */, - 49EE04F5125849E644783C89F23AA9F9 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = nanopb; - productName = nanopb; - productReference = F692D755024EE76EF405FECE13EE6522 /* libnanopb.a */; - productType = "com.apple.product-type.library.static"; - }; - D2289897589673E90494782E1C342882 /* QMCVDevelopment */ = { - isa = PBXNativeTarget; - buildConfigurationList = 98FFA52619B85570E74156AB5AB8356D /* Build configuration list for PBXNativeTarget "QMCVDevelopment" */; - buildPhases = ( - 562D2742FCA96E25599FD7A44E1D3DCE /* Sources */, - F80371051CAAA7FE396D2B54CF85F550 /* Frameworks */, - 0AB8208C10FCAE9BA921F7ACF69DCB3F /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - 01C6A058D5F378922B0549C00C83662E /* PBXTargetDependency */, - B1709745973CDC2FB592FEB5996F474A /* PBXTargetDependency */, - 4DAF39D0C88EAFC73329B3BF58D3C593 /* PBXTargetDependency */, - 7E27308C3E6C988AB1F35528D2FBCC05 /* PBXTargetDependency */, - ); - name = QMCVDevelopment; - productName = QMCVDevelopment; - productReference = 0E70284C36635B95BF9BF6FD47815B2F /* libQMCVDevelopment.a */; - productType = "com.apple.product-type.library.static"; - }; - D24D2A88B10BCFB43CA46716E6A68C14 /* FirebaseUI-FirebaseAuthUI */ = { - isa = PBXNativeTarget; - buildConfigurationList = 08D7552BEFA922406147DC581FAD143C /* Build configuration list for PBXNativeTarget "FirebaseUI-FirebaseAuthUI" */; - buildPhases = ( - E1F168FB6C06FEECC5F388B540F784D4 /* Sources */, - 8FCDD6AF97980CBC17D9F554B52C31D0 /* Frameworks */, - FC7BEE1EF3ADFD50BDE7CA0B31197DC8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "FirebaseUI-FirebaseAuthUI"; - productName = "FirebaseUI-FirebaseAuthUI"; - productReference = F967ED75F1C74FFDD8482A5C0BAEC3EA /* FirebaseAuthUI.bundle */; - productType = "com.apple.product-type.bundle"; - }; - DE868725B18AE240E550C5515AE66BC4 /* GTMSessionFetcher */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4693C211CA1C7318A8B388F1C2D24725 /* Build configuration list for PBXNativeTarget "GTMSessionFetcher" */; - buildPhases = ( - 34191111C8E6A7E0C8B7499BA636A66A /* Sources */, - 8D2BE8CE5663DF1EA1CF1CC5269C6067 /* Frameworks */, - A922FE66E6DEA4BD3090DCEB4580F34E /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = GTMSessionFetcher; - productName = GTMSessionFetcher; - productReference = 3C932EADC9EAA3FFBB6463A1D690FD54 /* libGTMSessionFetcher.a */; - productType = "com.apple.product-type.library.static"; - }; - E0CD2E8BF1C9B76C98D851F19723957E /* Pods-QMShareExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 24A7A1B4BE32DCF483D0486061B9C870 /* Build configuration list for PBXNativeTarget "Pods-QMShareExtension" */; - buildPhases = ( - 7D35B45382FAA48503A789405467268A /* Sources */, - 8265C708D4390616CD14DED7A3118F57 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - AF2AD29158EDCC3488F0277F0AE387D0 /* PBXTargetDependency */, - 85AF264CA38C80534B9FF2CEEF08C29A /* PBXTargetDependency */, - 14EF66E2F941285B51ECCDE9CECB7375 /* PBXTargetDependency */, - 05322D5165B7AD2DEC711762D8A7E275 /* PBXTargetDependency */, - 3C35FEE595569F36D0D77EE1DF1C28EC /* PBXTargetDependency */, - 7E80B3E1DB78892BBCA970023E2AE6B8 /* PBXTargetDependency */, - 4AA996B7EEAF2CE3D1593A31EED1D0BC /* PBXTargetDependency */, - 3DD7D04C0E16F1187E76CC913336C6EB /* PBXTargetDependency */, - ); - name = "Pods-QMShareExtension"; - productName = "Pods-QMShareExtension"; - productReference = 687C44B38AFBF12D2BE5176F39722BD5 /* libPods-QMShareExtension.a */; - productType = "com.apple.product-type.library.static"; - }; - F305603935A816A46FDD1958CB4F3C54 /* NYTPhotoViewer-NYTPhotoViewer */ = { - isa = PBXNativeTarget; - buildConfigurationList = 488835F4521D010A251EC7F3D629D7A0 /* Build configuration list for PBXNativeTarget "NYTPhotoViewer-NYTPhotoViewer" */; - buildPhases = ( - BFA303B17D74334C2F842B206918158F /* Sources */, - 77A240F4BAA176CE8316B238B6D2F12F /* Frameworks */, - 4B228C53FE1E54F0841D5D8D36BB7F64 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "NYTPhotoViewer-NYTPhotoViewer"; - productName = "NYTPhotoViewer-NYTPhotoViewer"; - productReference = FD7035D50E598906E5A45A71DDAD25B0 /* NYTPhotoViewer.bundle */; - productType = "com.apple.product-type.bundle"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0700; - }; - buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = E93C834BEB400D531597867EDA38D12C /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 0E9F6724C731DB563F6A7FC5A489C702 /* Bolts */, - 3C7B23B3FE0CE1A6131C7E09B3F47DA3 /* FBSDKCoreKit */, - 5DC7D7B380A5FEAE815A0DDD986A0174 /* FBSDKLoginKit */, - 4C6C0DEC127307838A58C68F289A3404 /* FBSDKShareKit */, - 1A06F5C7E9649A20BBB3BDB19FF15CD8 /* FFCircularProgressView */, - D24D2A88B10BCFB43CA46716E6A68C14 /* FirebaseUI-FirebaseAuthUI */, - C887E366CD38658EFB8D7738027F2DFD /* FirebaseUI-FirebasePhoneAuthUI */, - 53F8571E2D572C4069860E38654A566A /* FLAnimatedImage */, - BD669C0D6F0266E29B35F7AE071BE0A7 /* Flurry-iOS-SDK */, - 58E7450DB13C5ECCE92D3C0DF7CF0903 /* GoogleToolboxForMac */, - DE868725B18AE240E550C5515AE66BC4 /* GTMSessionFetcher */, - 2DF45F79772046883B169490C8F114D5 /* libextobjc */, - CF4B35B9FC819386EB09219BC91827D7 /* nanopb */, - 9E08ABFDE9A9FEBE05E34F8D602B5D05 /* NYTPhotoViewer */, - F305603935A816A46FDD1958CB4F3C54 /* NYTPhotoViewer-NYTPhotoViewer */, - 920A033878AC85D8D51DCA2DD7082EFA /* Pods-Q-municate */, - E0CD2E8BF1C9B76C98D851F19723957E /* Pods-QMShareExtension */, - A73F7BA2724DA49151347776E962A5BD /* Pods-QMSiriExtension */, - D2289897589673E90494782E1C342882 /* QMCVDevelopment */, - 53E70B95EC311E7F79EEA81B041F3B9D /* QMCVDevelopment-QMChatViewController */, - 4AC6694FB63559D1F05407D6114112E8 /* QMServicesDevelopment */, - 9FEAFD88D24F33B95A476A6CE1C9D7B1 /* QMServicesDevelopment-QMChatCacheModel */, - 0B75BDD839FAE8A626E9F849FAD07E1D /* QMServicesDevelopment-QMContactListCacheModel */, - 38A71AE9A9ECB4C06A722B8AEA6349F0 /* QMServicesDevelopment-QMOpenGraphCacheModel */, - B5565B1B4186F2175F4B214784342804 /* QMServicesDevelopment-QMUsersCacheModel */, - 950C39FC06439A7624B49DD0B04EF6A4 /* Reachability */, - AF8DD809CD36FF2A5C8E36ED6C4D1F07 /* SAMKeychain */, - 83014B2A0ECA41385F1F8E17B56DA168 /* SDWebImage */, - 9759E35C43E441BC28525D08A117A254 /* SVProgressHUD */, - 947C320DA7E2498987AA8DBC41B6962B /* TTTAttributedLabel */, - 0690B3703CDEFCA9E550593425EBA16D /* UIDevice-Hardware */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 2E5A192B7D7B9DDB25B533FCBBF210EE /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 83BF20C36BDA14B51FD071A7E4DDEBF3 /* QMContactListModel.xcdatamodeld in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 36A1220086D0FEB2F2CCA968CF0752CF /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 129B9CF1B1EC74828B7238A8A3115D9A /* QMChatServiceModel.xcdatamodeld in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4B228C53FE1E54F0841D5D8D36BB7F64 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4960F5A74BCA61AD5ED600C323FCEEF7 /* NYTPhotoViewerCloseButtonX.png in Resources */, - B716BDB104EB4011F083173505809879 /* NYTPhotoViewerCloseButtonX@2x.png in Resources */, - 1E890935461208AB7CAFF617DC290958 /* NYTPhotoViewerCloseButtonX@3x.png in Resources */, - 60E17DFC11A2C4F9BE01021684CB63B3 /* NYTPhotoViewerCloseButtonXLandscape.png in Resources */, - 064E9A3A6D936861F835A39CCE47B1F3 /* NYTPhotoViewerCloseButtonXLandscape@2x.png in Resources */, - 4346920DE9CA4C7AA1BD9D08507DA82C /* NYTPhotoViewerCloseButtonXLandscape@3x.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 63D220CAA07AD15D2E9C304ADB7ECE56 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D049F12E9B9C24C5725606C0FB5D4E3C /* attachment_ic.png in Resources */, - 99A3C27049B2ECE115AA912F82BA9FEE /* attachment_ic@2x.png in Resources */, - B2CD7231F7D1961FE90ADCA4B9FDBD0F /* attachment_ic@3x.png in Resources */, - F9C09636DCFEC71F2DE240FA42E69C85 /* cancel_icon.png in Resources */, - DD619BFAB418A5DB47517C5C7ED306E5 /* download_icon.png in Resources */, - 55F892E2510E33010B9E90B9F9938EC1 /* ic_retry-grey.png in Resources */, - 4D75D6C2A324904A26751FD369511D35 /* ic_retry-grey@2x.png in Resources */, - DA2C099642C92745F42A1D8729071374 /* ic_retry-grey@3x.png in Resources */, - 90F4004185DF6032B7D28D8E3454ADFE /* MicButton.png in Resources */, - B196BAC5AF4F49F60C6CE71117053E8E /* MicOverlay.png in Resources */, - 60F6005184FE10014A9FE3AB319D1990 /* MicOverlay@3x.png in Resources */, - B3FC852383A59FF56CF503D76E3FE4EF /* pause_icon.png in Resources */, - 22B2EBF7FE258C9386207F635800DD3D /* play_icon.png in Resources */, - 738E3A9D0A66A5006CD25716C03255B3 /* QMAudioIncomingCell.xib in Resources */, - 8CF6CC4B1DB6893C2FD7777C06FA6DA2 /* QMAudioOutgoingCell.xib in Resources */, - B11B75F2EACBFBC4C16C61D1FC86C577 /* QMAudioRecordView.xib in Resources */, - 3CE6301D27131086AB47EB48588CD0B4 /* QMChatAttachmentIncomingCell.xib in Resources */, - 6B2C9EE132D0725E2DDFB6052E2D2B37 /* QMChatAttachmentOutgoingCell.xib in Resources */, - C4A738A5525CF16CFF3B116D4CE2C42C /* QMChatContactRequestCell.xib in Resources */, - 0242D60D266205CB21346CCED836171E /* QMChatIncomingCell.xib in Resources */, - 0ED8382FF94D45E9D6F97ECB65DB178C /* QMChatIncomingLinkPreviewCell.xib in Resources */, - 97D897FD476082E59409ACE42B4ADB63 /* QMChatLocationIncomingCell.xib in Resources */, - 4A25A3694889332273F230D4E4BEA5A7 /* QMChatLocationOutgoingCell.xib in Resources */, - A314186A8A82AFA5A44E1043DECB38DD /* QMChatNotificationCell.xib in Resources */, - 2B46DBFC8F2C442086674C74D3609B9A /* QMChatOutgoingCell.xib in Resources */, - AB4CD61CAEE5FEB1A8BE5BED72CA9EE4 /* QMChatOutgoingLinkPreviewCell.xib in Resources */, - DDB80F6F7DD3B78118490A45D6166360 /* QMChatViewController.xib in Resources */, - 9257CA625D3F36E5F1E2A4C2AC4E940A /* QMHeaderCollectionReusableView.xib in Resources */, - 45021091672D7F05534F20A50213665B /* QMImageIncomingCell.xib in Resources */, - ADE7E8A03288C9BE3B1C0BF987B163D5 /* QMImageOutgoingCell.xib in Resources */, - FDF0276C21F063C30439A5A4AC9B4F8D /* QMToolbarContentView.xib in Resources */, - C615D29B2900E7E2A1AF170B26758E20 /* QMVideoIncomingCell.xib in Resources */, - EDB69A2612D50516C1859B6443C2E28E /* QMVideoOutgoingCell.xib in Resources */, - 371FB38774107C160D7E4A16E9511A2D /* video-thumbnail.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 82EC2E2A35FAEA749551A1A2D23C937C /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0D7DE4E202070A2856CC1FEF21060589 /* ar.lproj in Resources */, - 3ECCC2BDEC8D7EE01A5A5199D5997A49 /* bg.lproj in Resources */, - AF18661FF893F771C601146859293FCF /* bn.lproj in Resources */, - CA7B8C46BFE8A7185E1A640FA3A661BE /* ca.lproj in Resources */, - BB724A9EAE3B7B265CEEFCBFE7327F8A /* country-codes.json in Resources */, - F1DC23CA770CB649C804879471F29BA8 /* cs.lproj in Resources */, - A409D1030CB93AD669AF88A04770DE28 /* da.lproj in Resources */, - BC4F830BB991984C9457B615EBCB6885 /* de-AT.lproj in Resources */, - 6BB488318F9F4927C35C2E3B9F2A50F6 /* de-CH.lproj in Resources */, - 326E5AA3F3EA9392B45ED044B3660988 /* de.lproj in Resources */, - 95AAF1D32EA73AC75E1A43BA86383C27 /* el.lproj in Resources */, - D6C747A90EC3E85E9E8D3D28E96EEB13 /* en-AU.lproj in Resources */, - D9C0BA6D562AAD3709938AFFD5E74EC7 /* en-CA.lproj in Resources */, - 4FCC9847FEFABF5DE936C7F3D4AE2CEE /* en-GB.lproj in Resources */, - C516167E0A5D7B27BF1809DC1A74F49F /* en-IE.lproj in Resources */, - 8145428C978F68DBF649626A8DED8337 /* en-IN.lproj in Resources */, - A2344CF54FD6B88057F6B9988CF22353 /* en-SG.lproj in Resources */, - 1784CE993795B5204B2E8E29A312776C /* en-ZA.lproj in Resources */, - 6FDDF781065B121C22FF3B89D36F71FE /* en.lproj in Resources */, - EA7F3D8CB1C66E2C5B8E9085F862BC55 /* es-419.lproj in Resources */, - CD99A2179538B0AADB6829708D6A606A /* es-AR.lproj in Resources */, - 9608CFE5E0B47013C3E0FBAC7D983012 /* es-BO.lproj in Resources */, - A9993DE23FC92D8E7DAC89DBBFB0897B /* es-CL.lproj in Resources */, - E2A7CD83BF78316EFCF4A578B363CD9E /* es-CO.lproj in Resources */, - 3A3888132C490D378310ABA71129927E /* es-CR.lproj in Resources */, - 02442CF3F3073F092EAF733BD58F5596 /* es-DO.lproj in Resources */, - 8BC51CF733CFE09BF35D3D3485C83431 /* es-EC.lproj in Resources */, - 80604CAB3BC10E8411FC20189B671DD5 /* es-GT.lproj in Resources */, - 7188DF3730B2487DF61B39542DC33DC4 /* es-HN.lproj in Resources */, - 71BC14A1479569903827A6CF32B62913 /* es-MX.lproj in Resources */, - D46220D483210D56BD569FFA9BE72ACC /* es-NI.lproj in Resources */, - 476336F61045DABCA1D537B30431AA72 /* es-PA.lproj in Resources */, - 243A9027C67641F6F7E2D319264B3AB8 /* es-PE.lproj in Resources */, - 41D340F8A337A928C1496E6E41998917 /* es-PR.lproj in Resources */, - A3103587467D740F38FF889A28F8E074 /* es-PY.lproj in Resources */, - ED549D778B6A5BEE8035C8CDE47C5144 /* es-SV.lproj in Resources */, - C8DC6473F8B7A4EFB310286309BAC223 /* es-US.lproj in Resources */, - 7972C64FE4905C1BD9277817F8F4FF85 /* es-UY.lproj in Resources */, - 892E7FA47FAD48EF6732F09C694B619A /* es-VE.lproj in Resources */, - 4D2F4C67EFEA5A4DF14A60186D189A78 /* es.lproj in Resources */, - 510362610151B31E7521504B607CB291 /* fa.lproj in Resources */, - 1D0AC99DD0F06DBC4A97E3CA52361197 /* fi.lproj in Resources */, - 90EF40B92708B87689D5F26C684FAC60 /* fil.lproj in Resources */, - A75B749521F1B0C1BC28D0A35ECFEC41 /* fr-CH.lproj in Resources */, - B61040E3754180BFEE3CBD1FCE4C81C4 /* fr.lproj in Resources */, - D0E6A116488C70736BE92C6A4765B112 /* FUICodeField.nib in Resources */, - C0635913EB0B98916AC3F320BB53A38B /* FUICountryTableViewController.nib in Resources */, - 8E6A944C7A7A29E67741A962E2CBF25A /* FUIPhoneEntryViewController.nib in Resources */, - 8B7BD14CFC617B92259AC1A3EC9CC517 /* FUIPhoneVerificationViewController.nib in Resources */, - 895A7035AF63DA1585BACBD3E8EB0548 /* gsw.lproj in Resources */, - AB466A265795182D28A0AFA5BE5515DA /* gu.lproj in Resources */, - 0C1CB40A82EB80B82AEAA4C76F8134CC /* he.lproj in Resources */, - 3975A3E4F419171CB7A8AF047035E3C3 /* hi.lproj in Resources */, - 3FC13066DCDBD7950EB3028894885FD5 /* hr.lproj in Resources */, - A82CF4355CC83C465251FCB0F207B799 /* hu.lproj in Resources */, - 93B52E4E902C0FEDA6A9F41A6AE87F5C /* ic_phone.png in Resources */, - BD60D3B37458FF977374C92F0379A878 /* ic_phone@2x.png in Resources */, - AE4A8BC94A838B5FC3F3E416CF0DDC19 /* ic_phone@3x.png in Resources */, - 638C9E7635B674656C5F91FBE5D689AF /* id.lproj in Resources */, - 2F6986B31DB687949F241AAE57CA1E01 /* it.lproj in Resources */, - C8DD139DB23F978B617E9509A3FFF344 /* ja.lproj in Resources */, - 6CA956771DED554091C3AE32DAABB6C5 /* kn.lproj in Resources */, - A678685E67740FD2D7D86E00C0BF501B /* ko.lproj in Resources */, - B354094B27825EC691496ABDFC8F21A7 /* ln.lproj in Resources */, - D0E8CB94FDC99FBF92DDAA23A797879D /* lt.lproj in Resources */, - F9E01E79A640D271E1725EC05BA546F8 /* lv.lproj in Resources */, - 72B17EA055E206AE553FEBA584B44D55 /* mr.lproj in Resources */, - 53820D15FD14F5D236E0F8E4BAF14B7A /* ms.lproj in Resources */, - 064E1AC02E9716101E27121CE8100111 /* nb.lproj in Resources */, - A78841C5FE7A0D955654EA36916ABB37 /* nl.lproj in Resources */, - 37CFFF4074CFC228BDA956EDC226B2DC /* nn-NO.lproj in Resources */, - 3BFDEC8F9EA170B2804F4FB6ACEF5839 /* pl.lproj in Resources */, - 4501151083DEC5D5F719CF5C7FFDA83C /* pt-BR.lproj in Resources */, - 3F667BFDCCDCD68BC4EBCFB79527CBB2 /* pt-PT.lproj in Resources */, - 3D92B26D024D54AE0287F184B712ECDF /* pt.lproj in Resources */, - 5F50FB08A885D5703873E6C3E71AC95F /* ro.lproj in Resources */, - 40A54B61376180D67E2AE4F86CB19057 /* ru.lproj in Resources */, - E878FFDE9DC915A10CB6E8BBD703A079 /* sk.lproj in Resources */, - 82E93746DF0D796E73A568A62578F7C8 /* sl.lproj in Resources */, - 5A3E9BD16583514FF6CF79EDD0AF143B /* sr-Latn.lproj in Resources */, - 981A0C6E3FC678A023E2B8A7946421EC /* sr.lproj in Resources */, - 8CEB0F53C304B2591E79E7FB7D77EB19 /* sv.lproj in Resources */, - D438F83AE3282A0B6115DA3992F871E6 /* ta.lproj in Resources */, - D2B31882760E0D95FE6808076D6D4F7E /* th.lproj in Resources */, - 5AE2C31083C9EDA0B590CA79164E60CC /* tr.lproj in Resources */, - 3C658955C80579F482CD86D38C8C5E45 /* uk.lproj in Resources */, - B12E5654FE40B233E5929E64793383F8 /* ur.lproj in Resources */, - 5A16DF0162FED39CFE34CF225B1A5791 /* vi.lproj in Resources */, - 8EA0CB5542D7F9329D9F663606B7ADB0 /* zh-Hans.lproj in Resources */, - B73BCF62B9D78BF74E254E4276A7353D /* zh-Hant-TW.lproj in Resources */, - 4DFE1F1453F629A46A58841D03BAEB38 /* zh-Hant.lproj in Resources */, - 55B5074E8CE31F8D4952303F1FDEA7A8 /* zh.lproj in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9478C112B7133124F2D1D44110D53B58 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9C4A3D8F1F26FBE9C1216A01CC0B6925 /* QMUsersModel.xcdatamodeld in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F805201DF70DD226E338929FFA7E99BF /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2E56FB20FB8B009CE4CE6810BA15FC0D /* QMOpenGraphModel.xcdatamodeld in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FC7BEE1EF3ADFD50BDE7CA0B31197DC8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D5D2FF4053B18D3B879EBD1BD83A96FF /* ar.lproj in Resources */, - 7CD479D46C6B09F2D4A0F837E46B8113 /* bg.lproj in Resources */, - E07B170DF13D9813730A6F621AAF3159 /* bn.lproj in Resources */, - 629B8D6583BB534C0C6C362C245CD521 /* ca.lproj in Resources */, - 1FA92F302764DA8CAA7891B0A7A2847C /* cs.lproj in Resources */, - 34AFE1C590D6F30F774871E0FF6209A3 /* da.lproj in Resources */, - 5C483C83A347C162B5669117D9059B20 /* de-AT.lproj in Resources */, - 2341A9F292B7A0C8A102E5D28954F97F /* de-CH.lproj in Resources */, - 8EF00CD9F498773F68D59345EE2EE627 /* de.lproj in Resources */, - 5C4E5A23631F8E615502D2B03972D596 /* el.lproj in Resources */, - C884D08B7CEEAFEA2EE259D7E7234E91 /* en-AU.lproj in Resources */, - D3D75F29C35C494F360349D33D3BA9FE /* en-CA.lproj in Resources */, - 8CA0ADBB82280DA1C12FDC7C6ABBC6C2 /* en-GB.lproj in Resources */, - C9D19941349CD43F8E7B1E625DE80105 /* en-IE.lproj in Resources */, - 81689C56A439A56BBBD97C8FDF55799E /* en-IN.lproj in Resources */, - 68ACCC221987134A602989CF31462CB6 /* en-SG.lproj in Resources */, - D1A9B8F8CBCC25BCEB9563E96BE78D2E /* en-ZA.lproj in Resources */, - 8F8B776F8C5565B56049DE92A3621A32 /* en.lproj in Resources */, - EE2DA058BD9FFFE38CD1736EC27C20C2 /* es-419.lproj in Resources */, - 7DFE81077D4C4CCB2F7F11E42A085893 /* es-AR.lproj in Resources */, - D5CF05772E083A861058B6F2E6662ADB /* es-BO.lproj in Resources */, - FB86E96C0821AB646C11F8B087456D7E /* es-CL.lproj in Resources */, - 769D18D4B4C37109C65AD156A0575E73 /* es-CO.lproj in Resources */, - 57BFB8AFD8E057B14D575F905A2E3530 /* es-CR.lproj in Resources */, - 42FB715BB50A9A78277CAF9577037C01 /* es-DO.lproj in Resources */, - 0DEFE39030C10131E1C07393B41D2E14 /* es-EC.lproj in Resources */, - AFD0E1A73FC19F3ADEAFD0CD93E0C4AD /* es-GT.lproj in Resources */, - 2A33B0324BE5253286C0AA9289B3DFDE /* es-HN.lproj in Resources */, - 65DABFCE6D959CE35547948EA84BCE92 /* es-MX.lproj in Resources */, - 58719736B851016B4F635859B478942E /* es-NI.lproj in Resources */, - 6446E8BCBCA8B2CFF18B96858294A4A7 /* es-PA.lproj in Resources */, - 1B47C04D880BC06908BB6A563ADD1A3A /* es-PE.lproj in Resources */, - CFF70058E8EF3D4ABBB67426D0C65194 /* es-PR.lproj in Resources */, - 723DC40F13A52533176C295A1DA2D3B2 /* es-PY.lproj in Resources */, - E0972AD5FACEC99F93A9253F7D852E56 /* es-SV.lproj in Resources */, - 43D159C462988D47E5E4C613DB0794BE /* es-US.lproj in Resources */, - 3837ED6D5E835C0A38209023657C93F2 /* es-UY.lproj in Resources */, - FE77C4C0DA430BBEC07AFDB0A1B0558A /* es-VE.lproj in Resources */, - 9DCDA64200FB07D66A70F209A0E372B6 /* es.lproj in Resources */, - 81F1D2F5A43BF873340F619062DFD88C /* fa.lproj in Resources */, - EC4B11EC46195677AB8664725A48CDF5 /* fi.lproj in Resources */, - D8E6A025AED323C28714807AFAA07C51 /* fil.lproj in Resources */, - A8E0A6DADA9E018D811CF4231ABE4A18 /* fr-CH.lproj in Resources */, - E1CB5887F34F79B3C9030320F222F05C /* fr.lproj in Resources */, - E3AD7A332BC444A6DEBF238AF9724C20 /* FUIAccountSettingsViewController.nib in Resources */, - CD007D6CAE2A8D80CD8A94EA24993BC3 /* FUIAuthPickerViewController.nib in Resources */, - 2E2802F592F55EFC209EB08EC25603EE /* FUIAuthTableViewCell.nib in Resources */, - EBBA44F1CEF276447F3FB88B416107AF /* FUIEmailEntryViewController.nib in Resources */, - 0A2C61A51BC48B22283A3074F6FD8523 /* FUIInputTableViewCell.nib in Resources */, - 78A3456D606445439ACB8B4DD1958F0B /* FUIPasswordRecoveryViewController.nib in Resources */, - 05D496FE261A45B4F7C9512AFCC42608 /* FUIPasswordSignInViewController.nib in Resources */, - DDE9B95EDF4BACF713252651A7D6820D /* FUIPasswordSignUpViewController.nib in Resources */, - 5FE53FE00EE2DEBC4A2D2CC7BB767976 /* FUIPasswordTableViewCell.nib in Resources */, - B6D184454277F8C0EA6FCB2A15967891 /* FUIPasswordVerificationViewController.nib in Resources */, - 8649E761D05E1EC784EED8E64D0BE3EE /* FUIStaticContentTableViewController.nib in Resources */, - 75CA0AE4E19FA1F82CF63F14D4A57EF0 /* gsw.lproj in Resources */, - 90C9ACB59906897964D59B30410C9532 /* gu.lproj in Resources */, - A4C9CFDD0DB371F6A269BF184397FA7E /* he.lproj in Resources */, - 3195FA0C89BA09C6766FC70305355BF4 /* hi.lproj in Resources */, - 5F06A2D2650BE734C54377B3B3BD607B /* hr.lproj in Resources */, - 57D2D2F8A8C998768E3F3283E868D98A /* hu.lproj in Resources */, - 197923EF97E4BE1C801C1851664FF9DF /* ic_email.png in Resources */, - 2BA8D27675B2FAA97D5FAAAE1B17C53E /* ic_email@2x.png in Resources */, - 8AD166274D3E60F3CA0CDE3159EF1B5C /* ic_email@3x.png in Resources */, - 0D18B3173A0C2E31D95CA71282503A9B /* ic_visibility.png in Resources */, - 60B055AB726A480240A938EB323D0E9B /* ic_visibility@2x.png in Resources */, - 9DCC579D0487C7B1D2FD67C2A1ED59ED /* ic_visibility@3x.png in Resources */, - 9F60F98946D6FAC445F71FE04BA052D3 /* ic_visibility_off.png in Resources */, - 09B89844E4BE1314D1AB1717BCEA2DD3 /* ic_visibility_off@2x.png in Resources */, - 3DE4C9518FA00162512CFB383BFD10A1 /* ic_visibility_off@3x.png in Resources */, - 342C587635179DC1E7BDCA5076A5D9E1 /* id.lproj in Resources */, - C64FCB6CB0FD34AF39EF224FC020E147 /* it.lproj in Resources */, - D9846D8A5EBA2C803B4312F81040B9BE /* ja.lproj in Resources */, - EEDA145EBF069A3EA7B73F08DBFF6BA6 /* kn.lproj in Resources */, - F4217632C7B77E48EBBC39AF20A94E29 /* ko.lproj in Resources */, - A94593CDEAE5BE97441A602246F1BB59 /* ln.lproj in Resources */, - EB653973193351FB238FF5D8D7CFAA6F /* lt.lproj in Resources */, - 0DCB0EA8925B92CF60C6758DE2FFE2FF /* lv.lproj in Resources */, - 75A8F85C5015E09A9B983210D084F7E8 /* mr.lproj in Resources */, - CBE74FAD35B0E8E4E0EEE301635EB5D4 /* ms.lproj in Resources */, - 974068EB1A1EA87D5CD88C5DA0588489 /* nb.lproj in Resources */, - 9E11988ED245EDC6D18E42942396984B /* nl.lproj in Resources */, - 0AB1EA101A3C7EF13B01686DE675757E /* nn-NO.lproj in Resources */, - D0C7C616B4B1C5CE71146FE18BBC324D /* pl.lproj in Resources */, - 3246A8C4D595A5D279BAD90F7A00D145 /* pt-BR.lproj in Resources */, - CC4756F8216B07EB20E7E84C9D936C1A /* pt-PT.lproj in Resources */, - E397C7172E8D640B76BE29D6C6DC4FBF /* pt.lproj in Resources */, - E480768AF9D004F73B25CA90C3923DC4 /* ro.lproj in Resources */, - 31CEBF5444BD4C45B15A611760C25111 /* ru.lproj in Resources */, - E9C47E213A48E0D87949F230B49FF691 /* sk.lproj in Resources */, - D211E181E6DD24C4C3B7F10CF105285A /* sl.lproj in Resources */, - 080A83465C35A363E59F4A8C835B1E5E /* sr-Latn.lproj in Resources */, - 293E39F79014F138C3A2AF6417C8F667 /* sr.lproj in Resources */, - 84E122B73E2DC359298387B93C3336C9 /* sv.lproj in Resources */, - 2C389C03A22CD4EC0C77A9E6FA6756E3 /* ta.lproj in Resources */, - B430198CB854B072AE86186220679893 /* th.lproj in Resources */, - D4394246D05343B3906C1BB78B65DA10 /* tr.lproj in Resources */, - BD814A51BEF8AF2D490B557F04237217 /* uk.lproj in Resources */, - EDD69AC4C7A3B2B5398F8B33ADFBC12D /* ur.lproj in Resources */, - A5F51AFF96FE5BD47C96E787B32BDC9A /* vi.lproj in Resources */, - 6ACCD5F6928D618D75115B33000226A9 /* zh-Hans.lproj in Resources */, - F613AE743A2DFA98D4A071CC2A9541D4 /* zh-Hant-TW.lproj in Resources */, - C387A2A89A115C08624A5D4D68BD2053 /* zh-Hant.lproj in Resources */, - 93F1FAFED2A47CF4E88AAA8B6993F9A7 /* zh.lproj in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 0336902738632EBF4558B6BC13E3329F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 11AF308177F4D73ED26A6B8A0C4C9A86 /* NSButton+WebCache.m in Sources */, - 6158C43468F42D4174812663A33B71C0 /* NSData+ImageContentType.m in Sources */, - 179467DCDA58788475FC2347823A8A2E /* NSImage+WebCache.m in Sources */, - 64DC584197326B0C686C2FD63F0BD3CD /* SDImageCache.m in Sources */, - 32057671B8E4B8C7A8A80D83678E4067 /* SDImageCacheConfig.m in Sources */, - 2E67DE05B19B19609C5EF9B3663591DC /* SDWebImage-dummy.m in Sources */, - 44680763E82E72D1F4A68D24A88AB232 /* SDWebImageCoder.m in Sources */, - 9798DFA6ABE2B6A529A4BAF2ADF0D026 /* SDWebImageCoderHelper.m in Sources */, - 88BC81D768B9932854437C0E839FEC8C /* SDWebImageCodersManager.m in Sources */, - 5AEA886DD3DC314FEDFFC3F368195425 /* SDWebImageCompat.m in Sources */, - FA720ECFF1607AC234D0F4CFD8F35A3F /* SDWebImageDownloader.m in Sources */, - B5C396D3227779F8B1920420301F8DAB /* SDWebImageDownloaderOperation.m in Sources */, - A1F1C254BF1D1CB388A7DFBEA39B9AB5 /* SDWebImageFrame.m in Sources */, - 04466987A2419FD6B6F029C464D7603B /* SDWebImageGIFCoder.m in Sources */, - 5110F6F313DF13873F653173881955A5 /* SDWebImageImageIOCoder.m in Sources */, - C3D9A39E398AD862D168957868B1AB86 /* SDWebImageManager.m in Sources */, - D01556105518C17BF03473EAD6EA4521 /* SDWebImagePrefetcher.m in Sources */, - 9F0F5F5359083475FE84E76B7D59DA49 /* SDWebImageTransition.m in Sources */, - D1CD3D7636A15607B18F48100FCBE25C /* UIButton+WebCache.m in Sources */, - 7748A4C275AC4A2F04983A636F05D8FE /* UIImage+ForceDecode.m in Sources */, - 780BB9FBD9B819B01B486746EA2205D8 /* UIImage+GIF.m in Sources */, - 99B2CCAF95EE7CCC8F48E4C2DE7F98D1 /* UIImage+MultiFormat.m in Sources */, - B162263615D291926A957F89A146A951 /* UIImageView+HighlightedWebCache.m in Sources */, - 03432237FE6E69F5CAAE946F100A6CF4 /* UIImageView+WebCache.m in Sources */, - 151DA431A38650EA4CBD382E22C99761 /* UIView+WebCache.m in Sources */, - 8A4C5C58FB27DB89BDEDF38949B5A675 /* UIView+WebCacheOperation.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 04FAFDAEC1A4E8C8F64D2B15F5E88C3E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 89617E1EB8ABD505E51023744BA48CC2 /* _FBSDKLoginRecoveryAttempter.m in Sources */, - 01B04E841F56566F4572AFFB4B62242C /* FBSDKLoginButton.m in Sources */, - F760EE445CF8A732EF0D9C9AC71112F5 /* FBSDKLoginCompletion.m in Sources */, - BAC77565260301406EFDE6E9FA5FA73F /* FBSDKLoginConstants.m in Sources */, - 0EC9F09B9D4C1A7CFED42E20626E523F /* FBSDKLoginError.m in Sources */, - 1F70AA183512CC2FF182C4681D11B067 /* FBSDKLoginKit-dummy.m in Sources */, - ABEA36EB24919172BF5514E6F7B3DF57 /* FBSDKLoginManager.m in Sources */, - DEFECFB091BF9614B1074B06AED9555B /* FBSDKLoginManagerLogger.m in Sources */, - BFA9A8B566A50DAC095C1D1AE26F0AEB /* FBSDKLoginManagerLoginResult.m in Sources */, - 82A0D807276FDBF072CBA377C8C566F3 /* FBSDKLoginTooltipView.m in Sources */, - 266B45B24A4E0312ED7CB0823D07163D /* FBSDKLoginUtility.m in Sources */, - BCD1E99F035A72D3C7412A5E90C3D188 /* FBSDKTooltipView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0E545C396E8A76A1DFC21C02DACF7561 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - A9D45DD1F6754CA9D18CAB20D7676A29 /* SAMKeychain-dummy.m in Sources */, - 9D02E93DA1AA5A9DB56A246349D88D1D /* SAMKeychain.m in Sources */, - 1B214521BB4D24536936647B119383DD /* SAMKeychainQuery.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1ADD53E471387C89AB47DBC29F4EC121 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2800C2672DBE6120AAE6E2368482ECBD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F50F96C6EDBD53866721FEB613ECB5C9 /* Pods-Q-municate-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 29B9054B85E209E9B94DFFC2EF3483D4 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C2B87E77BABEE3523221F1BC8362E592 /* Pods-QMSiriExtension-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 34191111C8E6A7E0C8B7499BA636A66A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9931FBF0D5CD16A87511F3EBD2302A5B /* GTMSessionFetcher-dummy.m in Sources */, - 9417B872ADCACCC4CFED22B51F5E05E0 /* GTMSessionFetcher.m in Sources */, - CF7E7B439D17C5FF57B2DBC7C03E10EF /* GTMSessionFetcherLogging.m in Sources */, - 1B8714DF33ABD898CF49FAA1314DCF34 /* GTMSessionFetcherService.m in Sources */, - E43766C39792FE24EFAF9291C5579176 /* GTMSessionUploadFetcher.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3DE6347700F682781D6E6D8B02C03A2C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DFCFF954B234EC91BFBEA0464D2E22A7 /* Flurry-iOS-SDK-dummy.m in Sources */, - AC9D5161E898434718E42E55BA3DBECE /* FlurryEmpty.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4358D85EBADECB5389A2F9B2EB11357F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B363234376273DC4098A355934A5D03F /* _FBSDKTemporaryErrorRecoveryAttempter.m in Sources */, - FA87E8A20F65ED5A3F443D50CCCCB51F /* FBSDKAccessToken.m in Sources */, - 18E2AD3148A4789FE9F010CE9A9C6423 /* FBSDKAccessTokenCache.m in Sources */, - 6B859744391C5D657BAF6F196ACE43E2 /* FBSDKAccessTokenCacheV3.m in Sources */, - E4ED9290FD0C96EC330AB845313C9B6D /* FBSDKAccessTokenCacheV3_17.m in Sources */, - 2E5793F3CCE2F046D7C2BB0720502727 /* FBSDKAccessTokenCacheV3_21.m in Sources */, - F146DE72403DD552524ED91E49E3487F /* FBSDKAccessTokenCacheV4.m in Sources */, - 2BF9D4DCFFA081B4ED64CE3B0DB3500A /* FBSDKAppEvents.m in Sources */, - 89370CB57F3844C3AC71AB641D2B9CA4 /* FBSDKAppEventsDeviceInfo.m in Sources */, - 2920CB45DB4A37A485869FA1DD068983 /* FBSDKAppEventsState.m in Sources */, - 19ED98E248D79CD3CEEF80B754BB002C /* FBSDKAppEventsStateManager.m in Sources */, - C9B8D7724FA504CC438709E69E1096CA /* FBSDKAppEventsUtility.m in Sources */, - 774547CA17465CE53016022C05C271E8 /* FBSDKApplicationDelegate.m in Sources */, - BD6E97B2C7F885C4DA730791ACB8CFF0 /* FBSDKAppLinkResolver.m in Sources */, - 66F9C6603CE76B21006372A90644B9E1 /* FBSDKAppLinkUtility.m in Sources */, - 19895290593D2763A909999F59D6E561 /* FBSDKAudioResourceLoader.m in Sources */, - D9F8C15E59E4D9ABBCF3F969C7C6DB50 /* FBSDKBase64.m in Sources */, - 280E3CAF6F6DE64E92EA61EC96A53D6B /* FBSDKBoltsMeasurementEventListener.m in Sources */, - 71792DAF91CB73447802C414EBF74F3E /* FBSDKBridgeAPICrypto.m in Sources */, - 76540BF97898CF8A2FF83B6EA6FC3B44 /* FBSDKBridgeAPIProtocolNativeV1.m in Sources */, - 9DCB00163E75FC57C0F59E588C844ED5 /* FBSDKBridgeAPIProtocolWebV1.m in Sources */, - 8FC14AB272B3D184094DEEBEC7ED9F41 /* FBSDKBridgeAPIProtocolWebV2.m in Sources */, - 01BE84F79C4AAA3A6C44981998C6D0EC /* FBSDKBridgeAPIRequest.m in Sources */, - 22BF715C75EA24283898C5AAD6888F79 /* FBSDKBridgeAPIResponse.m in Sources */, - 32BA99E5CB9D3DA949BBB38CB9A677D0 /* FBSDKButton.m in Sources */, - D868E36B46D09F2ECBAF9464F3DB26E1 /* FBSDKCloseIcon.m in Sources */, - 836F143FA117F634DB6563C33E3D809A /* FBSDKColor.m in Sources */, - CF3B2C059B698135ED59C39F3B943898 /* FBSDKConstants.m in Sources */, - 6510E55BDD98350380FDF7C371BF92BE /* FBSDKContainerViewController.m in Sources */, - A2D580AA461813283CC53ABABDA2562C /* FBSDKCoreKit-dummy.m in Sources */, - E91DFFA6975862F723B7DC3DA7987ABD /* FBSDKCrypto.m in Sources */, - 329021B1317884817AF4C9B0C8C85FE5 /* FBSDKDeviceRequestsHelper.m in Sources */, - 0950A4CFA0BA90C7C7C1D65BAB9A8E6A /* FBSDKDialogConfiguration.m in Sources */, - 16F450457562426AED40306799D504E7 /* FBSDKDynamicFrameworkLoader.m in Sources */, - 69B023BF0441AC711FACD1C31A36D52D /* FBSDKError.m in Sources */, - D33D02B5F3D9B5734859306156CAB90C /* FBSDKErrorConfiguration.m in Sources */, - DF9EFA9E58D4FAF47929B3995A47AB23 /* FBSDKErrorRecoveryAttempter.m in Sources */, - 5F1243E2E028D8DBBC86585C4D728781 /* FBSDKErrorRecoveryConfiguration.m in Sources */, - 86C4051CA97EAC380D2115C4DE832D8E /* FBSDKGraphErrorRecoveryProcessor.m in Sources */, - C7F81639D46D8CA384CEFFBEA9EA192B /* FBSDKGraphRequest.m in Sources */, - 5969C041C69FD22E0A93BB1FDA34C86B /* FBSDKGraphRequestBody.m in Sources */, - 9247CC94FF81A45C7B3235104EE18543 /* FBSDKGraphRequestConnection.m in Sources */, - 1B1295077C3F53128EE0ADCB556AB53B /* FBSDKGraphRequestDataAttachment.m in Sources */, - D812B4281AF77DB346084C784A05B0A3 /* FBSDKGraphRequestMetadata.m in Sources */, - 8B03C49A3CE3E5CB23C3882B5E251283 /* FBSDKGraphRequestPiggybackManager.m in Sources */, - 826276AD21052B7BD70849782D99C70B /* FBSDKIcon.m in Sources */, - FAD53C4FBA2A005C96352DB1F3E3CF18 /* FBSDKImageDownloader.m in Sources */, - C43FB67154CCF31E4C4B7BACB300C1FD /* FBSDKInternalUtility.m in Sources */, - 7FD253034441920C22B04A8035D40B55 /* FBSDKKeychainStore.m in Sources */, - 489710CBDE13A878AE09B3AAA1BDACD9 /* FBSDKKeychainStoreViaBundleID.m in Sources */, - 04CE54BBE6008BE750742616CA28E795 /* FBSDKLogger.m in Sources */, - CF5A71B8C0791AD0475C5F6DEAEEE81B /* FBSDKLogo.m in Sources */, - D83F96A6C2994845C5E28D0CB0171D16 /* FBSDKMaleSilhouetteIcon.m in Sources */, - 6013D3EC8382F59BF0D696DD55CFD98A /* FBSDKMath.m in Sources */, - 87F58C0B508F8C664E211C5676830BFC /* FBSDKMonotonicTime.m in Sources */, - F775F3A65D24DFEBAC956508C1CFB158 /* FBSDKPaymentObserver.m in Sources */, - C671098B29180043EA7E73E879DED6A7 /* FBSDKProfile.m in Sources */, - FB264372543BBDD1A8993BB59FA4E3C4 /* FBSDKProfilePictureView.m in Sources */, - 464EC926D168410BF0013123CF73123F /* FBSDKServerConfiguration.m in Sources */, - E427B34FD3B06E68F3037662CB8D3CD4 /* FBSDKServerConfigurationManager.m in Sources */, - 840F7ACE461CB36F7707B76063783D57 /* FBSDKSettings.m in Sources */, - 2F9F8595B81532F59CFC0D65AE0559FE /* FBSDKSystemAccountStoreAdapter.m in Sources */, - 2F1073E9FDC7CF6ED1A34A50B98A2C83 /* FBSDKTestUsersManager.m in Sources */, - F2EA609FDFAA0530E1B0E33AEB9DA8CC /* FBSDKTimeSpentData.m in Sources */, - CC48F7BB9C0737AC6A1BC3EC7EA006A5 /* FBSDKTriStateBOOL.m in Sources */, - CDF56D05379EAEDCCF20FB8A6EA5345A /* FBSDKTypeUtility.m in Sources */, - 24C37351EF49FC19CF798C44EF9293E6 /* FBSDKURLConnection.m in Sources */, - B6F8E4CC9341A361D038CE35B19076F1 /* FBSDKURLSessionTask.m in Sources */, - ED54F88CA4935E54A3F8225974A4BC1A /* FBSDKUtility.m in Sources */, - C08510FC304BA16D89A3F8591043045C /* FBSDKViewImpressionTracker.m in Sources */, - 8F7104EE1368B87F3842C509983FA79E /* FBSDKWebDialog.m in Sources */, - 136311C98F5A6B0EB141F06B9FD17CEF /* FBSDKWebDialogView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4B0EECC2D2B9EFC749F83B8294C48D7C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BC6E8DBDC7599ABB10C231A50534C91 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 522C93B840A358C3A2E8D03832A46C66 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EF63A5227115590E4BD3EC9315315EC4 /* _CDAttachment.m in Sources */, - 5EA4069B46E2A7BFFF3C093DE35ABDF7 /* _CDContactListItem.m in Sources */, - 5940718F515C3A5B9BFE14C96CA2EF6B /* _CDDialog.m in Sources */, - F6AE24630AC6A6047436701060E7BF98 /* _CDMessage.m in Sources */, - 9CCA0235DCA9AEB012EA03D46FBB5E7C /* _CDOpenGraphModel.m in Sources */, - BC245EE9AE2E079996DD318C6036DA69 /* _CDUser.m in Sources */, - 623C286EA331EC090659B998E0F6F590 /* CDAttachment.m in Sources */, - 62B7AB8B647BF8C5AD2A34DC270DF3F7 /* CDContactListItem.m in Sources */, - C4C14557E2AE4B2E9491608E0DFE0492 /* CDDialog.m in Sources */, - A040167AB31ED77676E949EBDA3F8E04 /* CDMessage.m in Sources */, - 27BE024B71C6D86A4A1EDABCE64E566B /* CDOpenGraphModel.m in Sources */, - AE81AB4509182C4C26AC8C0E39B235E4 /* CDUser.m in Sources */, - D9119A84C57C48F9E52988BD6C469732 /* NSArray+QMCDRecord.m in Sources */, - FB3BEAAE40E661E43E67A2EE1B7CFE48 /* NSDictionary+QMCDRecordAdditions.m in Sources */, - DF5126E9FC1445CB9A3F5305FAD18B63 /* NSError+QMCDRecordErrorHandling.m in Sources */, - 049D83C6315D0AD892F4B84BB77FDB7C /* NSManagedObject+QMCDAggregation.m in Sources */, - B25038271B0C97D3F53A79D886B97A7C /* NSManagedObject+QMCDFinders.m in Sources */, - ADFCCB07B208DC84E715D2ADB600F765 /* NSManagedObject+QMCDRecord.m in Sources */, - 24E710DF4C225021ECF5F372A9008380 /* NSManagedObject+QMCDRequests.m in Sources */, - 198D8D110BD20B7CA809132378E98540 /* NSManagedObjectContext+QMCDObserving.m in Sources */, - FACE3FC28DA8CCD8FDA0F729A4394F76 /* NSManagedObjectContext+QMCDRecord.m in Sources */, - B906B3125A567DE8F053C46E56467F4D /* NSManagedObjectContext+QMCDSaves.m in Sources */, - 8BE2FE5B36D4BB15D3CF728014BDA679 /* NSManagedObjectModel+QMCDRecord.m in Sources */, - 0E6CD5FC03C93CEF05889ADB91554312 /* NSPersistentStore+QMCDRecord.m in Sources */, - 073BC25CC222A91E898BD0B9DDA5643D /* NSPersistentStoreCoordinator+QMCDRecord.m in Sources */, - E14D18B5EA579D3E6A49F5918E2A16FA /* QBChatAttachment+QMCustomData.m in Sources */, - C4B707712EBF21FFD3F1973647153789 /* QBChatAttachment+QMCustomParameters.m in Sources */, - 5AD157CE98AC7212BED20FA0DC282AE2 /* QBChatAttachment+QMFactory.m in Sources */, - CAA4E77966B06A9973E9466CC7E3FB06 /* QBChatMessage+QMCustomParameters.m in Sources */, - D881F4690E52DBBE48E336B55BC8D308 /* QBUUser+CustomData.m in Sources */, - D091B7812925C1EA294585D8C9B71348 /* QMAssetLoader.m in Sources */, - 55DFDEFC379B07D56E31331CF0DDC42C /* QMAsynchronousOperation.m in Sources */, - ED869FBFD01737B58849D2C14854202E /* QMAttachmentAssetService.m in Sources */, - E44C8B100F485935E6100D23E3665253 /* QMAttachmentContentService.m in Sources */, - 7E5CECD2332E804BD517F2A387237051 /* QMAttachmentsMemoryStorage.m in Sources */, - B84557C6039374BCBC47AD9C9FB8C99A /* QMAttachmentStoreService.m in Sources */, - F152CF959AB3A12330D060FAB76ACE9D /* QMAuthService+Bolts.m in Sources */, - 8D3FDE2A13A4B3D45C8C2A81EA5CEB70 /* QMAuthService.m in Sources */, - A6370A63B95E254EC6310AA28DB3CC5A /* QMBaseService.m in Sources */, - E1149D84D31C62A5CC3F8E0FD24A134D /* QMCDMigrationManager.m in Sources */, - 6FAB6115C610243E091B73521FA60700 /* QMCDRecord+Options.m in Sources */, - 51824C89E613E032214B602EAA06F176 /* QMCDRecord+VersionInformation.m in Sources */, - A03B556760EC1A4BDB3B0924FB66AA40 /* QMCDRecordInternal.m in Sources */, - A5FD38BF5704D49E27EB77E23611DF98 /* QMCDRecordStack.m in Sources */, - 2BBA08C229055888D65307DE91D79676 /* QMChatAttachmentService.m in Sources */, - 0394A3A1143CC60A45E8BC40B1223AD3 /* QMChatCache.m in Sources */, - 9BF304E90A137F218E3244A6DB7C613E /* QMChatService+Bolts.m in Sources */, - A6B810C4F0D32A3D6636E9F5CD266638 /* QMChatService.m in Sources */, - BAE63364DF4A3685FE486D676E4B1C97 /* QMContactListCache.m in Sources */, - EAB499C4FFBC324D228A2656ED474ADE /* QMContactListMemoryStorage.m in Sources */, - 2F3891F162F9AE34771B438BEA0FB246 /* QMContactListService+Bolts.m in Sources */, - 03DF325FF3DCA5E3B7CD22E1CB3D00AA /* QMContactListService.m in Sources */, - 4D33D3E3A477E7B25749BF391F949FB2 /* QMDBStorage.m in Sources */, - 59C902D3423F00E0E9AD382A4C528F26 /* QMDeferredQueueManager.m in Sources */, - D9713D4B83FDD1ECD42FF75BAE8AB040 /* QMDeferredQueueMemoryStorage.m in Sources */, - C080B7BBDD7B54101E2C03B7569F713B /* QMDialogsMemoryStorage.m in Sources */, - DB0CBA0D1557AC113F4108E0CA07829E /* QMMediaDownloadService.m in Sources */, - 04B5612DD2C36E90510CEBDDF6E3DB2E /* QMMediaUploadService.m in Sources */, - 5FBFC47CD3C4F961062DC0B8C9A2C120 /* QMMessagesMemoryStorage.m in Sources */, - 8FB9749DAE50E11E26119AFAE4C61365 /* QMOpenGraphCache.m in Sources */, - D0F12FF39E4884533EF8099AA95967C1 /* QMOpenGraphItem.m in Sources */, - 8D43A9ADAFAE11BCC7C89E73F0D4B00E /* QMOpenGraphMemoryStorage.m in Sources */, - DA3D01BC3785EE1A9BD30746D989EA9A /* QMOpenGraphService.m in Sources */, - A3C97E779F4E2FEBBBA588B9319F3C86 /* QMServices.m in Sources */, - 792EC4DBDCEB70F39918B96745FA561F /* QMServicesDevelopment-dummy.m in Sources */, - C14671E040C93193345EC2E9D7C61F40 /* QMServicesManager.m in Sources */, - FC6D948092882D69EBCC288D9CDE797A /* QMSLog.m in Sources */, - 97149867039A04C47092D3EE0A2B1B73 /* QMTimeOut.m in Sources */, - 6F3F5A598202557A5B8A8747C7621DC4 /* QMUsersCache.m in Sources */, - 9F08BF920AC877A874FBE054745EFE2D /* QMUsersMemoryStorage.m in Sources */, - 1C0156DC0554C02BE0FDD39AE4895C88 /* QMUsersService.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5303D5F0966B6798D7AAA88A9ACCB670 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 28B7761E1D77D96D267539A7B67188EA /* nanopb-dummy.m in Sources */, - 9CBD14C17446EC9384CFAADBADF12387 /* pb_common.c in Sources */, - F2A7C7D18755231B289C10D16DD6F730 /* pb_decode.c in Sources */, - 91C9C419C2E304B3A68293C22053034E /* pb_encode.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 562D2742FCA96E25599FD7A44E1D3DCE /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 347E7BAFDFD7DAFFFD6D5A3A140393E3 /* NSDate+ChatDataSource.m in Sources */, - 6D4458A67DA7BD76489B393208F2213E /* NSString+QM.m in Sources */, - F668D333F6F5872A44E2DFCC28533D19 /* QBChatMessage+QBDateDivider.m in Sources */, - 0D341AC86F8C286D8F31A94C99FDF489 /* QMAudioIncomingCell.m in Sources */, - 6AB6EC57A65E589869287F0BDF345138 /* QMAudioOutgoingCell.m in Sources */, - 56395CA30484F9EF6C990E756FA3F5C3 /* QMAudioRecordButton.m in Sources */, - 12561E82E99CFD796F2F2A5D12B064D7 /* QMAudioRecordView.m in Sources */, - 52765B5990AAC6F7CB584AFC679161F1 /* QMBaseChatLocationCell.m in Sources */, - 3296B7925B310E2F0474EB4448A98980 /* QMBaseMediaCell.m in Sources */, - 709B84D8CB8045EFFC1276CAC04D7055 /* QMChatAttachmentIncomingCell.m in Sources */, - 153039FA738BADA84A2C73921921B708 /* QMChatAttachmentOutgoingCell.m in Sources */, - 45048ABF6700481C31BA546B2C0D95C1 /* QMChatBaseLinkPreviewCell.m in Sources */, - 10D875C58C58C6FC29C5A71617A449EC /* QMChatCell.m in Sources */, - FBD63049F37FDB5D0F62A60EC1938F68 /* QMChatCellLayoutAttributes.m in Sources */, - EFAA75C69CB94F08A4A81F3C9D14A799 /* QMChatCollectionView.m in Sources */, - F13615ED9A9C5DD6C795EB72142E164F /* QMChatCollectionViewFlowLayout.m in Sources */, - 23C08D0E48816FAA0952D2BE4D33B132 /* QMChatContactRequestCell.m in Sources */, - 725C88E2412018B049C6229EB24BDCA0 /* QMChatContainerView.m in Sources */, - 32AE1D982841FB1594A8623DFB682D78 /* QMChatDataSource.m in Sources */, - A0DD473B7D4BE0CA52AE6B966EFEB51F /* QMChatIncomingCell.m in Sources */, - E4562537D15928114C2E377BB5AB430B /* QMChatIncomingLinkPreviewCell.m in Sources */, - 34CBE21A3E173480273D61D0F88DA5A3 /* QMChatLocationIncomingCell.m in Sources */, - 19E759C73BE10CD549C91140B1E88C64 /* QMChatLocationOutgoingCell.m in Sources */, - 667EB9C80D7BD584207A763BFA4B7960 /* QMChatLocationSnapshotter.m in Sources */, - 96AF35109CA37B8FA415A8825EF80C84 /* QMChatNotificationCell.m in Sources */, - D6D605627B2700B7F3B0D7116E76F0B1 /* QMChatOutgoingCell.m in Sources */, - 20F3B101806797802E4EE1670E45D6E9 /* QMChatOutgoingLinkPreviewCell.m in Sources */, - 0E05E8B0F5D014A4F2575F615569220B /* QMChatResources.m in Sources */, - 575A9E4D2FDB5A6DDC1E42FDE5B5B85F /* QMChatViewController.m in Sources */, - 30ADF38389F07129BFAF30DD1C7105ED /* QMCollectionViewFlowLayoutInvalidationContext.m in Sources */, - BAB87ECFAB0229C3A2F28EFDEB7A45E5 /* QMCVDevelopment-dummy.m in Sources */, - 80CA131A3F0E94CD939976FC0E91D096 /* QMDateUtils.m in Sources */, - B90542914989B784BFFBBEDD5CDDAAA0 /* QMHeaderCollectionReusableView.m in Sources */, - 4858B33C75B4EF6107B74C94537498AE /* QMImageIncomingCell.m in Sources */, - A99A45D4FEC858CE5850D036D6C0997E /* QMImageLoader.m in Sources */, - 433698527056A7E2ED434333F1270480 /* QMImageOutgoingCell.m in Sources */, - 0F26808FCE265E98C8DE22057D0B4AEF /* QMImageView.m in Sources */, - A8BBCF8AD6522C8B098277C0DF807772 /* QMInputToolbar.m in Sources */, - 96DE9AE1E5646EFE59CACAAE40493A41 /* QMKVOView.m in Sources */, - C45C1A240298C148D687C66985B94E3D /* QMMediaIncomingCell.m in Sources */, - 20612285D60CBCFA3B6F2EE4A4166A0B /* QMMediaOutgoingCell.m in Sources */, - 4E115F0709A1E190AC2D16B07675D1E4 /* QMPlaceHolderTextView.m in Sources */, - 698A0D6089EB19BC6C4852BCDA64DE52 /* QMProgressView.m in Sources */, - 748D5D899BDDF005F3AE3749CA3EF282 /* QMToolbarContainer.m in Sources */, - 955AEF50EBD83FC97FDCE4DB4B48AED2 /* QMToolbarContentView.m in Sources */, - F6DC97DC7DA1BE52BC31B0EDEDEA6832 /* QMVideoIncomingCell.m in Sources */, - 8674FFB961D3CEFA8435C60DE791B8C4 /* QMVideoOutgoingCell.m in Sources */, - FEB4F5A07A5C86FEF4BD3BB28037A702 /* UIColor+QM.m in Sources */, - 572BB56685EF5F37F92286B1E7AC3FCA /* UIImage+Cropper.m in Sources */, - 847BF045F34DFF955C750A56A0628D62 /* UIImage+QM.m in Sources */, - 2DF8F8DF44C249F1595C4DA3C51DCBEE /* UIImageView+QMLocationSnapshot.m in Sources */, - 8D78989E47F42E655BEB3431234ADC14 /* UIView+QM.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 73816ECBBEBC550F590E89944C3FA23C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F056F400B438FC93283FA24FB72EF8E1 /* Reachability-dummy.m in Sources */, - 9E65B36510D16F4FF23AAC36C8DA6F6D /* Reachability.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7C7268EAAC6516366BAAD18EE7173DA3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 58102131F407972A258A5B735E6F06C7 /* BFAppLink.m in Sources */, - 8E9F98EB1722C713AFC1D4677A07F6DD /* BFAppLinkNavigation.m in Sources */, - 636540A648A388738369E7C7E25AD82B /* BFAppLinkReturnToRefererController.m in Sources */, - 88C8E5752E034D7960806CD0E7BA90C4 /* BFAppLinkReturnToRefererView.m in Sources */, - DB90D539B2D2CBF891AE08A9BB2ED037 /* BFAppLinkTarget.m in Sources */, - 31865B9117E579EADFEEAABC7FAEB5B7 /* BFCancellationToken.m in Sources */, - 7F24CCF6222C7F0553295897493A4945 /* BFCancellationTokenRegistration.m in Sources */, - 630B2581CB0B78AE4FD930F44E1F8C8A /* BFCancellationTokenSource.m in Sources */, - AF166201D1EC9CF5742A94D21EB649C1 /* BFExecutor.m in Sources */, - 4462203E2C3FA51FFB1F2FF23E3ADDA2 /* BFMeasurementEvent.m in Sources */, - A68D4A6869C10ED61C9CE33D928CC383 /* BFTask.m in Sources */, - F702D3BC1FA6695674145FF41C2AE639 /* BFTaskCompletionSource.m in Sources */, - 39057E210A09B62C58DE7E7F70972E6F /* BFURL.m in Sources */, - E5A3542AD87657E08DDB693CD7C48CD8 /* BFWebViewAppLinkResolver.m in Sources */, - 2441DF3E270DE02FE803BF3D74BADF97 /* Bolts-dummy.m in Sources */, - F24CFB8CDC8FF502392C8ADB97B5693B /* Bolts.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7D35B45382FAA48503A789405467268A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 45B08FB152036153F3B0A9EDEFF1B9CD /* Pods-QMShareExtension-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 91C0EA9627644351F14DD0367D57CE3B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9A240679857C41948A668489081D7FB6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 05F06B12AAC5CD0C807ECE5B3B3D2BAC /* FLAnimatedImage-dummy.m in Sources */, - AD0E1790919F4E9E263D82EE98C11473 /* FLAnimatedImage.m in Sources */, - 4C4AB36C0AEDB4E18E881FB7A5160F7B /* FLAnimatedImageView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A326A0980F22A4A489AC0F730EAA95CC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA679C725B5CBB38C794664311A812B8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - A2BB29196011A7F3C269A5E1B15045F7 /* EXTRuntimeExtensions.m in Sources */, - 92DD86DC0DBE1C361B264EA0180EF534 /* EXTScope.m in Sources */, - 8FC4B5D425DB6638482168602F8350EB /* libextobjc-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - BB4E9B4C84407D5DBEEB2CB6EE325DDD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - FB001E58F2BD98D47FC4BADA7841FEDB /* TTTAttributedLabel-dummy.m in Sources */, - 7FC26CF1318C4908FCF103E788C1E0B4 /* TTTAttributedLabel.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - BFA303B17D74334C2F842B206918158F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - C3FF0394AE75D52DD12A6D2BD97B7BCB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3951FE64DF961AFC27A19B4EB5C573FA /* SVIndefiniteAnimatedView.m in Sources */, - 905F7F6FC4CCFEE60D3819F2F628FB44 /* SVProgressAnimatedView.m in Sources */, - BBCA33CE70A328167C68442E5B0872F2 /* SVProgressHUD-dummy.m in Sources */, - E59C57E2CFA182C9496D8785B929306F /* SVProgressHUD.m in Sources */, - 79FE279B6732E4EBAEAF9254818FB599 /* SVRadialGradientLayer.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CCDF9462017F7ADD5A4E72A96BF43B17 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6C72F3CF7CE4916238663F791BF7C57F /* FFCircularProgressView-dummy.m in Sources */, - 88972D979E4770498CEDA0ADE5A45BDF /* FFCircularProgressView.m in Sources */, - AFCD14E80665E34A3E744B4DBF58FE1E /* UIColor+iOS7.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DA4FB5051BB7C7B1C896461161B6B64E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2CE67D6F57FFBCD493F4CF92C7FE6678 /* NSBundle+NYTPhotoViewer.m in Sources */, - 1EB23C3B6B1C763592CE041B2C845A65 /* NYTPhotoCaptionView.m in Sources */, - 7E1DC0A0E6E467ED0C3099BA33ED8C5F /* NYTPhotoDismissalInteractionController.m in Sources */, - 712031D47052565D64E8C58CFE5994F6 /* NYTPhotosOverlayView.m in Sources */, - B97BAC8ECBB959BFBE645FC00BD91D92 /* NYTPhotosViewController.m in Sources */, - F3285509296F5E4731A74D98808B1D98 /* NYTPhotoTransitionAnimator.m in Sources */, - 177EA7481528AFB4F458FC44038BA9D3 /* NYTPhotoTransitionController.m in Sources */, - E65344E0757DDA3138C54237EE156D3D /* NYTPhotoViewController.m in Sources */, - 09BF4BC22F23CD9986D5D24AAF38B838 /* NYTPhotoViewer-dummy.m in Sources */, - E6256A52A498831065BDDE169D4A3CCF /* NYTPhotoViewerArrayDataSource.m in Sources */, - BE0BDB4691BB3F773FB9A8261FD6BA48 /* NYTPhotoViewerSinglePhotoDataSource.m in Sources */, - 7254E455525B9F45483D95AE3CBAA3BF /* NYTScalingImageView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DB2F46150A8F829D008E8125043030F9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6D9EFBB53CF1920891EE8E1C146777B6 /* FBSDKAppGroupAddDialog.m in Sources */, - 9D0660B4254C1971C80FE1D8392DE9E1 /* FBSDKAppGroupContent.m in Sources */, - E485FBCFA871CB9F257C38C6104B3FD5 /* FBSDKAppGroupJoinDialog.m in Sources */, - 959397073421A21C7B99BE51FF9D911F /* FBSDKAppInviteContent.m in Sources */, - D716F6D75CC4ECE3F44F4D13967BADEA /* FBSDKAppInviteDialog.m in Sources */, - C407F024DE683EDBC59292D8A69A3C6D /* FBSDKCameraEffectArguments.m in Sources */, - 4D14F2994598C6738DB6E9636FB72D80 /* FBSDKCameraEffectTextures.m in Sources */, - 0202994D4B9354DEAA073D61538125C3 /* FBSDKCheckmarkIcon.m in Sources */, - 3C2E9621A3F17BC8628F77E5985E0C5E /* FBSDKGameRequestContent.m in Sources */, - F006CC8B3278EB6D03FD835CA28C33C6 /* FBSDKGameRequestDialog.m in Sources */, - 13A20BEB134B5E233E5BF9A0955DA99E /* FBSDKGameRequestFrictionlessRecipientCache.m in Sources */, - 956D4FC77575AB1A2686A23AD98000E0 /* FBSDKHashtag.m in Sources */, - 74D19669A384604DCD75493D237E3A0C /* FBSDKLikeActionController.m in Sources */, - B9A4ED4C5373748BD4D0CC61923D20E5 /* FBSDKLikeActionControllerCache.m in Sources */, - 1BB8DAE2DE1A3C48ED59C7F15A659D1A /* FBSDKLikeBoxBorderView.m in Sources */, - 7C225D90CCCF964082A155686747A4F4 /* FBSDKLikeBoxView.m in Sources */, - 4AE621994F307DE19F0753F0BAA77709 /* FBSDKLikeButton.m in Sources */, - B0CCE739C5121F05E3C6D9DB892C5063 /* FBSDKLikeButtonPopWAV.m in Sources */, - 5FF987D846FACE55F28AB68BBD8747A5 /* FBSDKLikeControl.m in Sources */, - 78AB667BEBE3A1AFFBBCE14F4722E35B /* FBSDKLikeDialog.m in Sources */, - F66D3FFD1965EB35F6FE239BC2B03B15 /* FBSDKLikeObjectType.m in Sources */, - FB9F36C66EADD18C7E7591FF1672D21F /* FBSDKMessageDialog.m in Sources */, - C5AA9272F6745F92D3AC415019E8FDE0 /* FBSDKMessengerIcon.m in Sources */, - A255F4976F9A4A74593AAD78BF5921FE /* FBSDKSendButton.m in Sources */, - 1BCC3E6A604AFF6D4069F816F195F503 /* FBSDKShareAPI.m in Sources */, - 848C82C9B1C1FE1C1283C1D9645C08FB /* FBSDKShareButton.m in Sources */, - A993AE765E7DE0C265684D5EEAD01AB2 /* FBSDKShareCameraEffectContent.m in Sources */, - 875CF0420CED173A49D7CABACC328671 /* FBSDKShareConstants.m in Sources */, - F72AEB4002F9AE28BE58E8092EEE80C0 /* FBSDKShareDialog.m in Sources */, - 7D471EDF636121F92FD1DFE8F555290F /* FBSDKShareDialogMode.m in Sources */, - 177CC383588858209E669E248DA8A2A1 /* FBSDKShareError.m in Sources */, - 3586CB8CA3352CD2652E683CDBCC127E /* FBSDKShareKit-dummy.m in Sources */, - F936C08FAAB3A29296ABE8DB9B9A9AD0 /* FBSDKShareLinkContent.m in Sources */, - 76A04489E85BE2D2AB36A926A5175988 /* FBSDKShareMediaContent.m in Sources */, - CC142339B92F6CDD28A09819F236532F /* FBSDKShareMessengerContentUtility.m in Sources */, - 6401097C291EBA60A1838A911A6A750D /* FBSDKShareMessengerGenericTemplateContent.m in Sources */, - B368878174AF369829CCEF85BBA2D84C /* FBSDKShareMessengerGenericTemplateElement.m in Sources */, - 612774B44605700550F8835DCB33326D /* FBSDKShareMessengerMediaTemplateContent.m in Sources */, - F0C50AB449C97E65E247A609EDD151E2 /* FBSDKShareMessengerOpenGraphMusicTemplateContent.m in Sources */, - 1A33C45DEC9DF24A0F1441C7B7D3B3B9 /* FBSDKShareMessengerURLActionButton.m in Sources */, - 41C5FD290B3789158E4F10CD957324D1 /* FBSDKShareOpenGraphAction.m in Sources */, - 26B19EAA60FEF2859938B7370286C6E3 /* FBSDKShareOpenGraphContent.m in Sources */, - 68091E0D6315CE37B589B9C5BD12EF52 /* FBSDKShareOpenGraphObject.m in Sources */, - C355CE4AC50EE96B28D6D286E845C90B /* FBSDKShareOpenGraphValueContainer.m in Sources */, - 3357E04069C55774690727CB7BCA3A36 /* FBSDKSharePhoto.m in Sources */, - 5911BB3C032BDF24D6727F388A525F0C /* FBSDKSharePhotoContent.m in Sources */, - 4783B227D49175FAF3DF30011F8DCAA3 /* FBSDKShareUtility.m in Sources */, - 7F00A17A0FABFBDD0B34ADEB6453EB76 /* FBSDKShareVideo.m in Sources */, - FB0288B263496C5EFAFC2C2E962D18A8 /* FBSDKShareVideoContent.m in Sources */, - 549DF790F06617A9D270895115A1B545 /* FBSDKVideoUploader.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E1F168FB6C06FEECC5F388B540F784D4 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F86A0216D6948A1D34655DBC29C561FC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3328D6AA0A6DD5371B63ECAD18718F3F /* GoogleToolboxForMac-dummy.m in Sources */, - EF7722D72FCA3A27E05EC9D4A716D5FD /* GTMNSData+zlib.m in Sources */, - 9EC3208101C0A4CE8E374B61F787355B /* GTMNSDictionary+URLArguments.m in Sources */, - 49524DD7C80C2A517F6A1352B67A44E8 /* GTMNSString+URLArguments.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FE69770E51D99EA3B4D51F7AFBD81F7E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FF33C264A4DF8E26C8BEF5DD5DDDAA4E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D9A8E6B7A21FEA045AF10EBB065A282 /* UIDevice-Hardware-dummy.m in Sources */, - 4ACFC2F7DA9631F78F5AD871C3C472FC /* UIDevice-Hardware.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 01C6A058D5F378922B0549C00C83662E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FFCircularProgressView; - target = 1A06F5C7E9649A20BBB3BDB19FF15CD8 /* FFCircularProgressView */; - targetProxy = 0D05C4DBD11D76BE62B88670587DD552 /* PBXContainerItemProxy */; - }; - 05322D5165B7AD2DEC711762D8A7E275 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = QMServicesDevelopment; - target = 4AC6694FB63559D1F05407D6114112E8 /* QMServicesDevelopment */; - targetProxy = 3F26EA52C5537C980B65566C36D9CB61 /* PBXContainerItemProxy */; - }; - 057BB16DFCC85E7DB25B23957716A000 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Bolts; - target = 0E9F6724C731DB563F6A7FC5A489C702 /* Bolts */; - targetProxy = 17D702CBB4DC6B6FD39130BB1669ABC1 /* PBXContainerItemProxy */; - }; - 0B1FE6A8282DADB6AADDDEAA748C68A4 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FLAnimatedImage; - target = 53F8571E2D572C4069860E38654A566A /* FLAnimatedImage */; - targetProxy = 8897C673AA6B5FAFB722E39FCABF6BA3 /* PBXContainerItemProxy */; - }; - 0B30DCB0B03D78D8313C94F13FCD0577 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "QMServicesDevelopment-QMChatCacheModel"; - target = 9FEAFD88D24F33B95A476A6CE1C9D7B1 /* QMServicesDevelopment-QMChatCacheModel */; - targetProxy = DB16792368A975C187F361791459FC1B /* PBXContainerItemProxy */; - }; - 100C2B99A105683E92DE08C279C72924 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = QMCVDevelopment; - target = D2289897589673E90494782E1C342882 /* QMCVDevelopment */; - targetProxy = D2142A2131404A69C116F691E343907E /* PBXContainerItemProxy */; - }; - 111A77F94FFAF9AF9D080E9B9CA4BAD5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Bolts; - target = 0E9F6724C731DB563F6A7FC5A489C702 /* Bolts */; - targetProxy = 367FA66A25701C6EA69CF29D7FCAD50F /* PBXContainerItemProxy */; - }; - 14EF66E2F941285B51ECCDE9CECB7375 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = QMCVDevelopment; - target = D2289897589673E90494782E1C342882 /* QMCVDevelopment */; - targetProxy = A32794DC12A1850A50F0314D914DA25D /* PBXContainerItemProxy */; - }; - 184B77FA01D37107E5087141D01AC80E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "FirebaseUI-FirebaseAuthUI"; - target = D24D2A88B10BCFB43CA46716E6A68C14 /* FirebaseUI-FirebaseAuthUI */; - targetProxy = 2DD334BB0816528EAB5BAF801D0DFB5E /* PBXContainerItemProxy */; - }; - 1CDAF7ECDDDA4C37835C2A039666C936 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Bolts; - target = 0E9F6724C731DB563F6A7FC5A489C702 /* Bolts */; - targetProxy = 4034748D4A672B46C07FC337C6CD21F4 /* PBXContainerItemProxy */; - }; - 209DFAE2F4A0B9A05833496C3A1E8A08 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FBSDKLoginKit; - target = 5DC7D7B380A5FEAE815A0DDD986A0174 /* FBSDKLoginKit */; - targetProxy = 378108ADE0E77C76C7C91966653D928B /* PBXContainerItemProxy */; - }; - 2395C73175B67C88CCFE09B09257E349 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "QMServicesDevelopment-QMOpenGraphCacheModel"; - target = 38A71AE9A9ECB4C06A722B8AEA6349F0 /* QMServicesDevelopment-QMOpenGraphCacheModel */; - targetProxy = BBA91CA1458F65D7D64AFD38F285C480 /* PBXContainerItemProxy */; - }; - 2951ED6CDDFE728A5A1D065DCB189A2B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FBSDKCoreKit; - target = 3C7B23B3FE0CE1A6131C7E09B3F47DA3 /* FBSDKCoreKit */; - targetProxy = D432BCF829AED800DAE4AF954589AC66 /* PBXContainerItemProxy */; - }; - 2BD0071A78A9962872397E7E8B54F9CF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = libextobjc; - target = 2DF45F79772046883B169490C8F114D5 /* libextobjc */; - targetProxy = B399C58D7C7FF82067B2D725D51EE9ED /* PBXContainerItemProxy */; - }; - 2BD42273316840A4CAA671BFF9C24A03 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "UIDevice-Hardware"; - target = 0690B3703CDEFCA9E550593425EBA16D /* UIDevice-Hardware */; - targetProxy = 1D6498AA387DD9EE95F5A1211047825B /* PBXContainerItemProxy */; - }; - 34CB39E0B837C98BEB1C9EE58AF6DB29 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Bolts; - target = 0E9F6724C731DB563F6A7FC5A489C702 /* Bolts */; - targetProxy = B3D07EE11E1BA2B58A1F5B483302C2D8 /* PBXContainerItemProxy */; - }; - 3ABB3D7972B7CC5DEA50F12EA9774D1B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Flurry-iOS-SDK"; - target = BD669C0D6F0266E29B35F7AE071BE0A7 /* Flurry-iOS-SDK */; - targetProxy = 4480C35EB694FE40EE7DBC0BE7C5C411 /* PBXContainerItemProxy */; - }; - 3C0486F933F155AB50FBFDCA6C3D1B2F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = QMServicesDevelopment; - target = 4AC6694FB63559D1F05407D6114112E8 /* QMServicesDevelopment */; - targetProxy = 829905940B208F27C1872C17FFE40022 /* PBXContainerItemProxy */; - }; - 3C35FEE595569F36D0D77EE1DF1C28EC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Reachability; - target = 950C39FC06439A7624B49DD0B04EF6A4 /* Reachability */; - targetProxy = 914E3A99ABF91B041B18075AB63FFC93 /* PBXContainerItemProxy */; - }; - 3DD7D04C0E16F1187E76CC913336C6EB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = TTTAttributedLabel; - target = 947C320DA7E2498987AA8DBC41B6962B /* TTTAttributedLabel */; - targetProxy = D12E602FE5085511850C080C297EDA1B /* PBXContainerItemProxy */; - }; - 43CF591054033EF14127439E52F975BD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SAMKeychain; - target = AF8DD809CD36FF2A5C8E36ED6C4D1F07 /* SAMKeychain */; - targetProxy = FDFF9C2BD426D729034057EA404ED934 /* PBXContainerItemProxy */; - }; - 48B88E28437E3F10512DE687BD1DE0F6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "FirebaseUI-FirebasePhoneAuthUI"; - target = C887E366CD38658EFB8D7738027F2DFD /* FirebaseUI-FirebasePhoneAuthUI */; - targetProxy = AA91F2DE5D3488C797E21394E8F003E4 /* PBXContainerItemProxy */; - }; - 49A18CAD6CAA11B0D6AF066E57999BFE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FFCircularProgressView; - target = 1A06F5C7E9649A20BBB3BDB19FF15CD8 /* FFCircularProgressView */; - targetProxy = 0B7F8E1543F0D7BA4278796566996C1B /* PBXContainerItemProxy */; - }; - 4AA996B7EEAF2CE3D1593A31EED1D0BC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SVProgressHUD; - target = 9759E35C43E441BC28525D08A117A254 /* SVProgressHUD */; - targetProxy = AD9FF8DD4C171F63B48324649787A64F /* PBXContainerItemProxy */; - }; - 4DAF39D0C88EAFC73329B3BF58D3C593 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImage; - target = 83014B2A0ECA41385F1F8E17B56DA168 /* SDWebImage */; - targetProxy = F72832A02FE8C65E231C121F9EA91ADC /* PBXContainerItemProxy */; - }; - 5091B8859CA16BC18C20BB9F4AE56A81 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Bolts; - target = 0E9F6724C731DB563F6A7FC5A489C702 /* Bolts */; - targetProxy = 6AB88A966B004CDE3585A8DB8D48184B /* PBXContainerItemProxy */; - }; - 6B6FD1A00A83EBE4394A66E9B5D56ABF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FBSDKCoreKit; - target = 3C7B23B3FE0CE1A6131C7E09B3F47DA3 /* FBSDKCoreKit */; - targetProxy = 135C5182914BCB3FA26CBF3BBA6259AA /* PBXContainerItemProxy */; - }; - 751966FF7823728EB203937A4F85718C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = GoogleToolboxForMac; - target = 58E7450DB13C5ECCE92D3C0DF7CF0903 /* GoogleToolboxForMac */; - targetProxy = 12BD50F904C5C78EE7852D987D078882 /* PBXContainerItemProxy */; - }; - 7C505CAB477235264C1907AF3666D8EB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "QMServicesDevelopment-QMContactListCacheModel"; - target = 0B75BDD839FAE8A626E9F849FAD07E1D /* QMServicesDevelopment-QMContactListCacheModel */; - targetProxy = F83C7EAADB03E8D3C9E6929FC5B6EB42 /* PBXContainerItemProxy */; - }; - 7E27308C3E6C988AB1F35528D2FBCC05 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = TTTAttributedLabel; - target = 947C320DA7E2498987AA8DBC41B6962B /* TTTAttributedLabel */; - targetProxy = 9BFBE6572733456061C9BA287E6FDA38 /* PBXContainerItemProxy */; - }; - 7E80B3E1DB78892BBCA970023E2AE6B8 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImage; - target = 83014B2A0ECA41385F1F8E17B56DA168 /* SDWebImage */; - targetProxy = 47DB095DA27E27635A21BCCBC90A1C3A /* PBXContainerItemProxy */; - }; - 7EBE7FDBC22144E7D29825EAAD6BC4E2 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = nanopb; - target = CF4B35B9FC819386EB09219BC91827D7 /* nanopb */; - targetProxy = BB9FFB04762096840A1704F9803EA433 /* PBXContainerItemProxy */; - }; - 85AF264CA38C80534B9FF2CEEF08C29A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FFCircularProgressView; - target = 1A06F5C7E9649A20BBB3BDB19FF15CD8 /* FFCircularProgressView */; - targetProxy = 8D8D71E6C46870674A261E30910304C2 /* PBXContainerItemProxy */; - }; - 9BA358202B8144C9C0B3C3E63CBA7D2E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = QMServicesDevelopment; - target = 4AC6694FB63559D1F05407D6114112E8 /* QMServicesDevelopment */; - targetProxy = A77B9366997A88FAE42654CA551AAF67 /* PBXContainerItemProxy */; - }; - AADCED0C798BE2B8014C1AE5C68E3A09 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "NYTPhotoViewer-NYTPhotoViewer"; - target = F305603935A816A46FDD1958CB4F3C54 /* NYTPhotoViewer-NYTPhotoViewer */; - targetProxy = E9AABB33B7D8FAA00328ED4425645414 /* PBXContainerItemProxy */; - }; - AEC79AC6DB18DA65267629B792F295CE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Reachability; - target = 950C39FC06439A7624B49DD0B04EF6A4 /* Reachability */; - targetProxy = 47A211AD4FB141BB981B22C91B7A2156 /* PBXContainerItemProxy */; - }; - AF2AD29158EDCC3488F0277F0AE387D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Bolts; - target = 0E9F6724C731DB563F6A7FC5A489C702 /* Bolts */; - targetProxy = F2CF0FDE26A8651037BD7C88EC075B0E /* PBXContainerItemProxy */; - }; - B1709745973CDC2FB592FEB5996F474A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "QMCVDevelopment-QMChatViewController"; - target = 53E70B95EC311E7F79EEA81B041F3B9D /* QMCVDevelopment-QMChatViewController */; - targetProxy = 2604B4885A8B9772704A44C4B340EDF1 /* PBXContainerItemProxy */; - }; - B4226DD7EC90BFC21B1B0DF91C495314 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FBSDKShareKit; - target = 4C6C0DEC127307838A58C68F289A3404 /* FBSDKShareKit */; - targetProxy = A144A83551E28D257CFAB4371E794DC2 /* PBXContainerItemProxy */; - }; - B93C0727FA28BC56F0CBCED4E38D0C68 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = GTMSessionFetcher; - target = DE868725B18AE240E550C5515AE66BC4 /* GTMSessionFetcher */; - targetProxy = 0C102706A8F9350ABA99E849962F9796 /* PBXContainerItemProxy */; - }; - BFCDE46E5C3F0DD01CF576208198C7B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FBSDKCoreKit; - target = 3C7B23B3FE0CE1A6131C7E09B3F47DA3 /* FBSDKCoreKit */; - targetProxy = B6E0E10E84820E59A324F381FDB68722 /* PBXContainerItemProxy */; - }; - C48C86A0E4F1518D8C0766A11FBF91F1 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FLAnimatedImage; - target = 53F8571E2D572C4069860E38654A566A /* FLAnimatedImage */; - targetProxy = 79AED5ACD2884AD93AE7B5B2089B98D0 /* PBXContainerItemProxy */; - }; - E693A6BEFB63D60F2095256F4580CD03 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Bolts; - target = 0E9F6724C731DB563F6A7FC5A489C702 /* Bolts */; - targetProxy = 625133541CC8D6C3159038A515D478EE /* PBXContainerItemProxy */; - }; - F3E8D37648A1FBA5997D4E2DE7C9E172 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = NYTPhotoViewer; - target = 9E08ABFDE9A9FEBE05E34F8D602B5D05 /* NYTPhotoViewer */; - targetProxy = E7B063553FD502EAAC947C55C5CCA725 /* PBXContainerItemProxy */; - }; - F4C939F2EA7BCC733F554F7846868A36 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = TTTAttributedLabel; - target = 947C320DA7E2498987AA8DBC41B6962B /* TTTAttributedLabel */; - targetProxy = D1770A9C3D67F530E63D47CD7576CB9E /* PBXContainerItemProxy */; - }; - F8F7A296D39ABE45EADDD6B437F8CFA0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "QMServicesDevelopment-QMUsersCacheModel"; - target = B5565B1B4186F2175F4B214784342804 /* QMServicesDevelopment-QMUsersCacheModel */; - targetProxy = C6AF60302AC683396EF29C7999BEBAFC /* PBXContainerItemProxy */; - }; - FDDB258DF49B3F615CC307E4EB890D04 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImage; - target = 83014B2A0ECA41385F1F8E17B56DA168 /* SDWebImage */; - targetProxy = 795E4F1DE8F7AFDBDFDDC2272BFC6F0C /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 6FC744D1C856216ACFBD8175C970D9C6 /* QMChatViewController.xib */ = { - isa = PBXVariantGroup; - children = ( - 1CAF10C49DAA3E8BC09B92D62F7338AC /* QMChatViewController.xib */, - ); - name = QMChatViewController.xib; - path = QMChatViewController; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 007C12E2F1D73C5AD44E76CF1568901B /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E27B5BE20DBD31E198FFD7F47DC14B2D /* TTTAttributedLabel.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/TTTAttributedLabel/TTTAttributedLabel-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 03FC2C8DB7E0F0446BA790773F3ED34C /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 61D1455F8389D1ABB155D6EC485D6589 /* Flurry-iOS-SDK.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 052992F2DFF1B4EF55F084023CCF5ACE /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0ADB7D74A29F61961C071B362FB63601 /* FLAnimatedImage.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 15C28B368FE0F05B6236E1C35BB14E1F /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 609C3C3571ED002AE687466CD82DEFDB /* libextobjc.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/libextobjc/libextobjc-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 15E516E4C983AE52639C778AFED58FF6 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QMServicesDevelopment"; - INFOPLIST_FILE = "Target Support Files/QMServicesDevelopment/ResourceBundle-QMUsersCacheModel-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = QMUsersCacheModel; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 1C13F00B45D881FA34CA86D9F21D0BFA /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 67EC1CA5C6B4CA229AE4D09D8528703A /* FBSDKCoreKit.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1C569D04588D76A55ED3D6A98A6C0519 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 775970BE5A8EDAB93BBC238592070F0D /* NYTPhotoViewer.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/NYTPhotoViewer/NYTPhotoViewer-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 1CDC302860BC5378B6D696B4E0064336 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8BB4E96EF5B1A0686FF2D45622498106 /* QMCVDevelopment.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QMCVDevelopment"; - INFOPLIST_FILE = "Target Support Files/QMCVDevelopment/ResourceBundle-QMChatViewController-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = QMChatViewController; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 20D8A906B11F303FCFA38C0B121C11D9 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QMServicesDevelopment"; - INFOPLIST_FILE = "Target Support Files/QMServicesDevelopment/ResourceBundle-QMContactListCacheModel-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = QMContactListCacheModel; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 22EDC625E99A166DB3394FACCCDDE674 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QMServicesDevelopment"; - INFOPLIST_FILE = "Target Support Files/QMServicesDevelopment/ResourceBundle-QMUsersCacheModel-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = QMUsersCacheModel; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 23843CF5B39D62989908EFD7B3C94C2B /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7FC8F0941550A4C6CA9AB69375224D74 /* SDWebImage.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 2AB1731ECACBC133840BBD50CF28CFFF /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/QMServicesDevelopment/QMServicesDevelopment-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 2D5118C1115070E37E5FD36DD834CA3D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F327B5445E9F55C394B7A00542AA6312 /* GoogleToolboxForMac.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 311673FA1F7F362BBF48CB5D63A4C9C1 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7263E00578C120C5FB81DA4F6723830C /* SAMKeychain.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/SAMKeychain/SAMKeychain-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 3DD1F0F00B9AA810CF929022335AE1D2 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8D25E20EE508FF8594C4D6FDEF9D5B61 /* Reachability.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/Reachability/Reachability-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 3F9570D695DDCBD2F61DE34514576FCB /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseUI"; - INFOPLIST_FILE = "Target Support Files/FirebaseUI/ResourceBundle-FirebaseAuthUI-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PRODUCT_NAME = FirebaseAuthUI; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 4064C82C2742D555DB5EE37E5FFA0519 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3B9CA800C5C3E5171E4727E3B824C784 /* nanopb.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/nanopb/nanopb-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 43AF2B0B74723A7F8F2D794A90CCB9CF /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8BB4E96EF5B1A0686FF2D45622498106 /* QMCVDevelopment.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QMCVDevelopment"; - INFOPLIST_FILE = "Target Support Files/QMCVDevelopment/ResourceBundle-QMChatViewController-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = QMChatViewController; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 499B06882FFBEB1EA1FE147565544D26 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3B9CA800C5C3E5171E4727E3B824C784 /* nanopb.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/nanopb/nanopb-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 53B61D2A59AACAFA2C65AF5B1F26AA67 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8BB4E96EF5B1A0686FF2D45622498106 /* QMCVDevelopment.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/QMCVDevelopment/QMCVDevelopment-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 5AE291DF76E3325E391885344A193B7C /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E27B5BE20DBD31E198FFD7F47DC14B2D /* TTTAttributedLabel.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/TTTAttributedLabel/TTTAttributedLabel-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 5D33C9E4A0F17970D6C4BF54B82C9ACD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/QMServicesDevelopment/QMServicesDevelopment-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 5FE3551E4E32BE0CABA570D7091A2D56 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F276038B3CAE2F7D051F98B9FC60530E /* Pods-QMSiriExtension.release.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 637814B21DBAA868D15262FE85C3050D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0ADB7D74A29F61961C071B362FB63601 /* FLAnimatedImage.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 673B6E07ED364243703A1675CB6AEF98 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseUI"; - INFOPLIST_FILE = "Target Support Files/FirebaseUI/ResourceBundle-FirebaseAuthUI-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PRODUCT_NAME = FirebaseAuthUI; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 6B4A5A29CC78D59B74C80EA7BF1BE6C0 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 775970BE5A8EDAB93BBC238592070F0D /* NYTPhotoViewer.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/NYTPhotoViewer/NYTPhotoViewer-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 6F9224530522DD3C735EC96CF142642E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Release; - }; - 7506FCD4416EDCCB54DA37D30D1199CB /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QMServicesDevelopment"; - INFOPLIST_FILE = "Target Support Files/QMServicesDevelopment/ResourceBundle-QMOpenGraphCacheModel-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = QMOpenGraphCacheModel; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 759A6CEC9AC5B8BF82CB14134322EA07 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3398544D72AA8140539693E0D80D3084 /* Pods-Q-municate.release.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 75BB8724608E16C01907883D984B82CC /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E16CB789617BA9E146BACC17C4523295 /* GTMSessionFetcher.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 7F958E7E6EA0904B7BF50124274AF17D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2281FD5AE75987CDFA35A7ED2A9EDF42 /* Bolts.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/Bolts/Bolts-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 8554DB09FA90653318990F7B7C5AD4E1 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseUI"; - INFOPLIST_FILE = "Target Support Files/FirebaseUI/ResourceBundle-FirebasePhoneAuthUI-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PRODUCT_NAME = FirebasePhoneAuthUI; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 887A971B88DE0241BED5145A49C6CBA6 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2281FD5AE75987CDFA35A7ED2A9EDF42 /* Bolts.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/Bolts/Bolts-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 90E786FBE92A39C848D1D9AA3C1B75B1 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/FirebaseUI"; - INFOPLIST_FILE = "Target Support Files/FirebaseUI/ResourceBundle-FirebasePhoneAuthUI-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PRODUCT_NAME = FirebasePhoneAuthUI; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 9644E4BB0E26A3B9D4CB2E2123D4214D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 609C3C3571ED002AE687466CD82DEFDB /* libextobjc.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/libextobjc/libextobjc-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 9A6F4B46BD8706DBD4276C0B6E1DB98C /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A8A49BEE0222B6632DAD15E581A05687 /* SVProgressHUD.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - SV_APP_EXTENSIONS, - ); - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 9C67C9A689A7941347A08DA405DA55F1 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QMServicesDevelopment"; - INFOPLIST_FILE = "Target Support Files/QMServicesDevelopment/ResourceBundle-QMOpenGraphCacheModel-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = QMOpenGraphCacheModel; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - A08E94C6BAB38335406A3C5D0BAC8AF3 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 15894AF01E40604475003E1AD4A8A741 /* FFCircularProgressView.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/FFCircularProgressView/FFCircularProgressView-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - A49654F6325EA909BB91A3C63DC64264 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F327B5445E9F55C394B7A00542AA6312 /* GoogleToolboxForMac.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - A5D09A55C07F384B6FFEB3D4BB935F01 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QMServicesDevelopment"; - INFOPLIST_FILE = "Target Support Files/QMServicesDevelopment/ResourceBundle-QMContactListCacheModel-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = QMContactListCacheModel; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - ABD9AC900C0BB35DED33FDFC0CF03E5F /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 99C74C46C05BE270A98670468206DFF2 /* Pods-QMSiriExtension.debug.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - B57951D085A1B98A97F8A1062A5E5C5B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Debug; - }; - B79F1005DFB469EF5CD65AB9C9A4C150 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C0D8735F327235ADF90979C4902A64D1 /* FBSDKLoginKit.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/FBSDKLoginKit/FBSDKLoginKit-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - B9E39B30CF4AFC5E45D0CA5B2136A411 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 88575A598348592AD90C1E635A9AB7B4 /* UIDevice-Hardware.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/UIDevice-Hardware/UIDevice-Hardware-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - BA8E2E604898BCED03ACF4256CF4EBA9 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C0D8735F327235ADF90979C4902A64D1 /* FBSDKLoginKit.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/FBSDKLoginKit/FBSDKLoginKit-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - BEECE4B3C88A22F29A2C3E0B4EC08769 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 775970BE5A8EDAB93BBC238592070F0D /* NYTPhotoViewer.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/NYTPhotoViewer"; - INFOPLIST_FILE = "Target Support Files/NYTPhotoViewer/ResourceBundle-NYTPhotoViewer-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PRODUCT_NAME = NYTPhotoViewer; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - C0D53528184EAC565D07330D74DDF263 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 88575A598348592AD90C1E635A9AB7B4 /* UIDevice-Hardware.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/UIDevice-Hardware/UIDevice-Hardware-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - C5CF8C2F3FFE990F821F4ED8F7D197A1 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2C62470A432A475DC8091742D082B3F9 /* Pods-QMShareExtension.debug.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - C752194F366BBBE463ACF31B4A036C74 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = BA8B97A4E0D7D8B3435DB883EB704FD6 /* Pods-QMShareExtension.release.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - D13E71FE05B4FE17620F653660ED02D6 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 775970BE5A8EDAB93BBC238592070F0D /* NYTPhotoViewer.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/NYTPhotoViewer"; - INFOPLIST_FILE = "Target Support Files/NYTPhotoViewer/ResourceBundle-NYTPhotoViewer-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PRODUCT_NAME = NYTPhotoViewer; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - DA269F9772EFD5FFD103D6AB6D350771 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 61D1455F8389D1ABB155D6EC485D6589 /* Flurry-iOS-SDK.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - DC6134CFE35C817BD71EF18C77FEF161 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DD0313B5B8EF91279B48B3C83DF59C46 /* FBSDKShareKit.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - DC689030BDF43C465BCEB3790DB3A033 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7FC8F0941550A4C6CA9AB69375224D74 /* SDWebImage.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - DDCF221CC2BC4309D64F3B6D05A50460 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DD0313B5B8EF91279B48B3C83DF59C46 /* FBSDKShareKit.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - E01AB96BC4A98DF3D6B6EE13120E37B3 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QMServicesDevelopment"; - INFOPLIST_FILE = "Target Support Files/QMServicesDevelopment/ResourceBundle-QMChatCacheModel-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = QMChatCacheModel; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - E1A8AA8E867D96B45FEF3B7A016AC828 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8D25E20EE508FF8594C4D6FDEF9D5B61 /* Reachability.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/Reachability/Reachability-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - E50F848D2C13A0AC898021896E60D7AA /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C9E3EF85009D878F403D5D4935E4395 /* QMServicesDevelopment.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QMServicesDevelopment"; - INFOPLIST_FILE = "Target Support Files/QMServicesDevelopment/ResourceBundle-QMChatCacheModel-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = QMChatCacheModel; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - E9C5E4AF7C36D235D1BF68B9C8BC05B9 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 15894AF01E40604475003E1AD4A8A741 /* FFCircularProgressView.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/FFCircularProgressView/FFCircularProgressView-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - F088A522B406E373BB117943E4877CCD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7263E00578C120C5FB81DA4F6723830C /* SAMKeychain.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/SAMKeychain/SAMKeychain-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - F133A573125B0B88C5B60E534019C206 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8BB4E96EF5B1A0686FF2D45622498106 /* QMCVDevelopment.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/QMCVDevelopment/QMCVDevelopment-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - F2836265037979304A0DC4966B7CD423 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A8A49BEE0222B6632DAD15E581A05687 /* SVProgressHUD.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - SV_APP_EXTENSIONS, - ); - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - F2E67E54C561C40313A6669866293780 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E16CB789617BA9E146BACC17C4523295 /* GTMSessionFetcher.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - FB262C6F2698D9B5386044D1CFB1F806 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 67EC1CA5C6B4CA229AE4D09D8528703A /* FBSDKCoreKit.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - FE3A5A23EFEC712B9F6285FEA8DF9341 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8CA98F4DE827B68B734521E86678DFCB /* Pods-Q-municate.debug.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 08D7552BEFA922406147DC581FAD143C /* Build configuration list for PBXNativeTarget "FirebaseUI-FirebaseAuthUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3F9570D695DDCBD2F61DE34514576FCB /* Debug */, - 673B6E07ED364243703A1675CB6AEF98 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0E672B1E90B59818D965CC644216AC54 /* Build configuration list for PBXNativeTarget "Reachability" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3DD1F0F00B9AA810CF929022335AE1D2 /* Debug */, - E1A8AA8E867D96B45FEF3B7A016AC828 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0EA4F995CBBF1300B4D566BFA7DD3B38 /* Build configuration list for PBXNativeTarget "FLAnimatedImage" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 637814B21DBAA868D15262FE85C3050D /* Debug */, - 052992F2DFF1B4EF55F084023CCF5ACE /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 10307B4A394B984083F6541BD3D52511 /* Build configuration list for PBXNativeTarget "libextobjc" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9644E4BB0E26A3B9D4CB2E2123D4214D /* Debug */, - 15C28B368FE0F05B6236E1C35BB14E1F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 24A7A1B4BE32DCF483D0486061B9C870 /* Build configuration list for PBXNativeTarget "Pods-QMShareExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C5CF8C2F3FFE990F821F4ED8F7D197A1 /* Debug */, - C752194F366BBBE463ACF31B4A036C74 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 26AE791F404F3732C3335D0EFE25E20A /* Build configuration list for PBXNativeTarget "GoogleToolboxForMac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A49654F6325EA909BB91A3C63DC64264 /* Debug */, - 2D5118C1115070E37E5FD36DD834CA3D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2D3F26C7968B745E49901D577BFBEE61 /* Build configuration list for PBXNativeTarget "QMCVDevelopment-QMChatViewController" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1CDC302860BC5378B6D696B4E0064336 /* Debug */, - 43AF2B0B74723A7F8F2D794A90CCB9CF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B57951D085A1B98A97F8A1062A5E5C5B /* Debug */, - 6F9224530522DD3C735EC96CF142642E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 400B9641D67DA8313CB1F62EDFD136A5 /* Build configuration list for PBXNativeTarget "SAMKeychain" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F088A522B406E373BB117943E4877CCD /* Debug */, - 311673FA1F7F362BBF48CB5D63A4C9C1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4693C211CA1C7318A8B388F1C2D24725 /* Build configuration list for PBXNativeTarget "GTMSessionFetcher" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F2E67E54C561C40313A6669866293780 /* Debug */, - 75BB8724608E16C01907883D984B82CC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4837F1A2EEB666992DEA13CB70B74428 /* Build configuration list for PBXNativeTarget "QMServicesDevelopment" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5D33C9E4A0F17970D6C4BF54B82C9ACD /* Debug */, - 2AB1731ECACBC133840BBD50CF28CFFF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 488835F4521D010A251EC7F3D629D7A0 /* Build configuration list for PBXNativeTarget "NYTPhotoViewer-NYTPhotoViewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BEECE4B3C88A22F29A2C3E0B4EC08769 /* Debug */, - D13E71FE05B4FE17620F653660ED02D6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 513767D61709140E2126747707AC5395 /* Build configuration list for PBXNativeTarget "Pods-Q-municate" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - FE3A5A23EFEC712B9F6285FEA8DF9341 /* Debug */, - 759A6CEC9AC5B8BF82CB14134322EA07 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5164612F51FC4B301DF7EE041D46A746 /* Build configuration list for PBXNativeTarget "FBSDKShareKit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DDCF221CC2BC4309D64F3B6D05A50460 /* Debug */, - DC6134CFE35C817BD71EF18C77FEF161 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 54D28670139C0DBE3BD94F750E236F32 /* Build configuration list for PBXNativeTarget "FirebaseUI-FirebasePhoneAuthUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8554DB09FA90653318990F7B7C5AD4E1 /* Debug */, - 90E786FBE92A39C848D1D9AA3C1B75B1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 54ED1AC30C00A566ABF4273B7106EA84 /* Build configuration list for PBXNativeTarget "FBSDKCoreKit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1C13F00B45D881FA34CA86D9F21D0BFA /* Debug */, - FB262C6F2698D9B5386044D1CFB1F806 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 56D6E2F9B2A8083446F658D5228A194C /* Build configuration list for PBXNativeTarget "FFCircularProgressView" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E9C5E4AF7C36D235D1BF68B9C8BC05B9 /* Debug */, - A08E94C6BAB38335406A3C5D0BAC8AF3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5931207A875964A2905D48D209ECBD94 /* Build configuration list for PBXNativeTarget "UIDevice-Hardware" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B9E39B30CF4AFC5E45D0CA5B2136A411 /* Debug */, - C0D53528184EAC565D07330D74DDF263 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5E24C5272FD257FE60A13BA12B2ED671 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DC689030BDF43C465BCEB3790DB3A033 /* Debug */, - 23843CF5B39D62989908EFD7B3C94C2B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 71AFDB09C713BD051B1B23DBADE0FEB4 /* Build configuration list for PBXNativeTarget "Flurry-iOS-SDK" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 03FC2C8DB7E0F0446BA790773F3ED34C /* Debug */, - DA269F9772EFD5FFD103D6AB6D350771 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 74BE78D97AB340DF909A641CD241C9B0 /* Build configuration list for PBXNativeTarget "TTTAttributedLabel" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 007C12E2F1D73C5AD44E76CF1568901B /* Debug */, - 5AE291DF76E3325E391885344A193B7C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7D0FFB16B3CD0C97180CA14055E3E8CA /* Build configuration list for PBXNativeTarget "NYTPhotoViewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6B4A5A29CC78D59B74C80EA7BF1BE6C0 /* Debug */, - 1C569D04588D76A55ED3D6A98A6C0519 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 859E38FA2F38AE3F07B2E830849D825D /* Build configuration list for PBXNativeTarget "Pods-QMSiriExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - ABD9AC900C0BB35DED33FDFC0CF03E5F /* Debug */, - 5FE3551E4E32BE0CABA570D7091A2D56 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8AE925A3FECD26D8C770C50697A7F672 /* Build configuration list for PBXNativeTarget "Bolts" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 887A971B88DE0241BED5145A49C6CBA6 /* Debug */, - 7F958E7E6EA0904B7BF50124274AF17D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 98FFA52619B85570E74156AB5AB8356D /* Build configuration list for PBXNativeTarget "QMCVDevelopment" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 53B61D2A59AACAFA2C65AF5B1F26AA67 /* Debug */, - F133A573125B0B88C5B60E534019C206 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - AC6FD4401A8A13633E2FECE0BB773A18 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9A6F4B46BD8706DBD4276C0B6E1DB98C /* Debug */, - F2836265037979304A0DC4966B7CD423 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - B0CFCFBC523246113D9ECF0992D10999 /* Build configuration list for PBXNativeTarget "FBSDKLoginKit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B79F1005DFB469EF5CD65AB9C9A4C150 /* Debug */, - BA8E2E604898BCED03ACF4256CF4EBA9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - B8307E997A097EB50C00A8C7967B858A /* Build configuration list for PBXNativeTarget "nanopb" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 499B06882FFBEB1EA1FE147565544D26 /* Debug */, - 4064C82C2742D555DB5EE37E5FFA0519 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - B8BAFB96CF7B7AD9BB399EC00C74110C /* Build configuration list for PBXNativeTarget "QMServicesDevelopment-QMChatCacheModel" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E01AB96BC4A98DF3D6B6EE13120E37B3 /* Debug */, - E50F848D2C13A0AC898021896E60D7AA /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - BE9CBE42CDA7CB2B09E6845D7BC2A90E /* Build configuration list for PBXNativeTarget "QMServicesDevelopment-QMOpenGraphCacheModel" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9C67C9A689A7941347A08DA405DA55F1 /* Debug */, - 7506FCD4416EDCCB54DA37D30D1199CB /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - E99074401543983F0F8396986ED2140A /* Build configuration list for PBXNativeTarget "QMServicesDevelopment-QMUsersCacheModel" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 15E516E4C983AE52639C778AFED58FF6 /* Debug */, - 22EDC625E99A166DB3394FACCCDDE674 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - EE2B7774DA5DBFF8FEEFA97B6E516273 /* Build configuration list for PBXNativeTarget "QMServicesDevelopment-QMContactListCacheModel" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 20D8A906B11F303FCFA38C0B121C11D9 /* Debug */, - A5D09A55C07F384B6FFEB3D4BB935F01 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCVersionGroup section */ - 237B97F795343F5E9108A58C8BFCA228 /* QMChatServiceModel.xcdatamodeld */ = { - isa = XCVersionGroup; - children = ( - 658A266E5094DF1530C2B2E2D8D2F736 /* QMModel.xcdatamodel */, - 25B7E37B807C5A9FCA506974B19FF7A6 /* QMModel2.xcdatamodel */, - 6FE78665008B7C112B1C2EBB118FCA43 /* QMModel3.xcdatamodel */, - 69449FA4E41477D00878048EBD28EA9F /* QMModel4.xcdatamodel */, - 686C7E605ACEC8D8C854D0853AA72E11 /* QMModel5.xcdatamodel */, - 0FB7DB789FDC47139D521427450AAEFB /* QMModel6.xcdatamodel */, - ); - currentVersion = 0FB7DB789FDC47139D521427450AAEFB /* QMModel6.xcdatamodel */; - name = QMChatServiceModel.xcdatamodeld; - path = QMChatCache/QMChatCache/CoreData/QMChatServiceModel.xcdatamodeld; - sourceTree = ""; - versionGroupType = wrapper.xcdatamodel; - }; - 95B147ACCE54F9BCFFAB07C281E4A9F3 /* QMUsersModel.xcdatamodeld */ = { - isa = XCVersionGroup; - children = ( - FDD7AFA71934975E3A246A6EE75A4677 /* QMUsersModel.xcdatamodel */, - 9BCDE679D0719D17C0A9C853079A3E88 /* QMUsersModel2.xcdatamodel */, - ); - currentVersion = 9BCDE679D0719D17C0A9C853079A3E88 /* QMUsersModel2.xcdatamodel */; - name = QMUsersModel.xcdatamodeld; - path = QMUsersCache/QMUsersCache/CoreData/QMUsersModel.xcdatamodeld; - sourceTree = ""; - versionGroupType = wrapper.xcdatamodel; - }; - F9113C63400BB93F9C37E2BEA20D2DD3 /* QMContactListModel.xcdatamodeld */ = { - isa = XCVersionGroup; - children = ( - AD4C10E26ABB9CD908850243EA4D7BC3 /* QMModel.xcdatamodel */, - ); - currentVersion = AD4C10E26ABB9CD908850243EA4D7BC3 /* QMModel.xcdatamodel */; - name = QMContactListModel.xcdatamodeld; - path = QMContactListCache/QMContactListCache/CoreData/QMContactListModel.xcdatamodeld; - sourceTree = ""; - versionGroupType = wrapper.xcdatamodel; - }; - FE34057A7E892095ECCFAEAC196798FC /* QMOpenGraphModel.xcdatamodeld */ = { - isa = XCVersionGroup; - children = ( - A85BA856C2BB78A4507CB55A2EB2071A /* QMOpenGraphModel.xcdatamodel */, - ); - name = QMOpenGraphModel.xcdatamodeld; - path = QMOpenGraphCache/QMOpenGraphCache/CoreData/QMOpenGraphModel.xcdatamodeld; - sourceTree = ""; - versionGroupType = wrapper.xcdatamodel; - }; -/* End XCVersionGroup section */ - }; - rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; -} diff --git a/Pods/QMCVDevelopment/LICENSE b/Pods/QMCVDevelopment/LICENSE deleted file mode 100644 index f44040b20..000000000 --- a/Pods/QMCVDevelopment/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Categories/NSString+QM.h b/Pods/QMCVDevelopment/QMChatViewController/Categories/NSString+QM.h deleted file mode 100644 index 74f9c367e..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Categories/NSString+QM.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// NSString+QM.h -// QMChatViewController -// -// Created by Andrey Ivanov on 21.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -@interface NSString (QM) - -/** - * Removes [ ]+ symbols and trim whitespaces and new line characters - * - * @return clean string - */ -- (NSString *)stringByTrimingWhitespace; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIColor+QM.h b/Pods/QMCVDevelopment/QMChatViewController/Categories/UIColor+QM.h deleted file mode 100644 index 735aee8e1..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIColor+QM.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// UIColor+q_municate.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -@interface UIColor (QM) - -//MARK: - Message bubble colors - -/** - * @return A color object containing HSB values similar to the iOS 7 messages app green bubble color. - */ -+ (UIColor *)messageBubbleGreenColor; - -/** - * @return A color object containing HSB values similar to the iOS 7 messages app blue bubble color. - */ -+ (UIColor *)messageBubbleBlueColor; - -/** - * @return A color object containing HSB values similar to the iOS 7 red color. - */ -+ (UIColor *)messageBubbleRedColor; -/** - * @return A color object containing HSB values similar to the iOS 7 messages app light gray bubble color. - */ -+ (UIColor *)messageBubbleLightGrayColor; - -#pragma mark - Utilities - -/** - * Creates and returns a new color object whose brightness component is decreased by the given value, using the initial color values of the receiver. - * - * @param value A floating point value describing the amount by which to decrease the brightness of the receiver. - * - * @return A new color object whose brightness is decreased by the given values. The other color values remain the same as the receiver. - */ -- (UIColor *)colorByDarkeningColorWithValue:(CGFloat)value; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+Cropper.h b/Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+Cropper.h deleted file mode 100644 index 441f227f9..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+Cropper.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// UIImage+Cropper.h -// QMChatViewController -// -// Created by Igor Alefirenko on 29/11/2013. -// Copyright (c) 2013 Stefano Antonelli. All rights reserved. -// - -#import - -@interface UIImage (Cropper) - -- (UIImage *)imageWithCornerRadius:(CGFloat)cornerRadius - targetSize:(CGSize)targetSize; -- (UIImage *)imageByScaleAndCrop:(CGSize)targetSize; -- (UIImage *)imageByCircularScaleAndCrop:(CGSize)targetSize; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+QM.h b/Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+QM.h deleted file mode 100644 index c7e69a550..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+QM.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// UIImage+QM.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -@interface UIImage (QM) - -/** - * Adds color mask to image - * - * @param maskColor color for mask - * - * @return masked image - */ -- (UIImage *)imageMaskedWithColor:(UIColor *)maskColor; - -/** - * Creates a resizable image with specified color and corner radius - * - * @param color color for mask - * - * @return masked image - */ -+ (UIImage *)resizableImageWithColor:(UIColor *)color - cornerRadius:(CGFloat)cornerRadius; - -@property (nonatomic, strong, readonly) NSData *dataRepresentation; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIView+QM.h b/Pods/QMCVDevelopment/QMChatViewController/Categories/UIView+QM.h deleted file mode 100644 index c387db64b..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIView+QM.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// UIView+QM.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -@interface UIView (QM) - -/** - * Pins the subview of the receiver to the edge of its frame, as specified by the given attribute, by adding a layout constraint. - * - * @param subview The subview to which the receiver will be pinned. - * @param attribute The layout constraint attribute specifying one of `NSLayoutAttributeBottom`, `NSLayoutAttributeTop`, `NSLayoutAttributeLeading`, `NSLayoutAttributeTrailing`. - */ -- (void)pinSubview:(UIView *)subview toEdge:(NSLayoutAttribute)attribute; - -/** - * Pins all edges of the specified subview to the receiver. - * - * @param subview The subview to which the receiver will be pinned. - */ -- (void)pinAllEdgesOfSubview:(UIView *)subview; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_audio.imageset/Contents.json b/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_audio.imageset/Contents.json deleted file mode 100644 index 705770001..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_audio.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "ic_audio.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "template-rendering-intent" : "template", - "preserves-vector-representation" : true - } -} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_cancel.imageset/Contents.json b/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_cancel.imageset/Contents.json deleted file mode 100644 index 12ac4f72c..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_cancel.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "ic_progress-grey.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "template-rendering-intent" : "template", - "preserves-vector-representation" : true - } -} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_download.imageset/Contents.json b/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_download.imageset/Contents.json deleted file mode 100644 index aa94ccbe1..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_download.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "ic_download_grey.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "template-rendering-intent" : "template", - "preserves-vector-representation" : true - } -} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_play.imageset/Contents.json b/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_play.imageset/Contents.json deleted file mode 100644 index 473ac0b83..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_play.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "ic_play_grey.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "template-rendering-intent" : "template", - "preserves-vector-representation" : true - } -} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_retry.imageset/Contents.json b/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_retry.imageset/Contents.json deleted file mode 100644 index 21a157abf..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_retry.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "ic_retry-grey.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - }, - "properties" : { - "template-rendering-intent" : "template", - "preserves-vector-representation" : true - } -} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/MicButton.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/MicButton.png deleted file mode 100644 index 47e18f52f..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/MicButton.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/MicOverlay.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/MicOverlay.png deleted file mode 100644 index 14ea624dd..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/MicOverlay.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/MicOverlay@3x.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/MicOverlay@3x.png deleted file mode 100644 index f143d282e..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/MicOverlay@3x.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/cancel_icon.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/cancel_icon.png deleted file mode 100644 index 0664dbc8e..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/cancel_icon.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/download_icon.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/download_icon.png deleted file mode 100644 index 9c7a1e217..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/download_icon.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/ic_retry-grey.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/ic_retry-grey.png deleted file mode 100644 index e312e2512..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/ic_retry-grey.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/ic_retry-grey@2x.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/ic_retry-grey@2x.png deleted file mode 100644 index e729c7232..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/ic_retry-grey@2x.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/ic_retry-grey@3x.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/ic_retry-grey@3x.png deleted file mode 100644 index af55a2b5a..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/ic_retry-grey@3x.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/pause_icon.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/pause_icon.png deleted file mode 100644 index 645b90c05..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/pause_icon.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/play_icon.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/play_icon.png deleted file mode 100644 index 87b0d46e9..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/play_icon.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/video-thumbnail.png b/Pods/QMCVDevelopment/QMChatViewController/Icons/video-thumbnail.png deleted file mode 100644 index 1b38869ec..000000000 Binary files a/Pods/QMCVDevelopment/QMChatViewController/Icons/video-thumbnail.png and /dev/null differ diff --git a/Pods/QMCVDevelopment/QMChatViewController/Protocols/QMChatCollectionViewDataSource.h b/Pods/QMCVDevelopment/QMChatViewController/Protocols/QMChatCollectionViewDataSource.h deleted file mode 100644 index fd10eda0c..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Protocols/QMChatCollectionViewDataSource.h +++ /dev/null @@ -1,60 +0,0 @@ -// -// QMChatCollectionViewDataSource.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import -#import - -@class QMChatCollectionView; - -/** - * An object that adopts the `QMChatCollectionViewDataSource` protocol is responsible for providing the data and views - * required by a `QMChatCollectionView`. The data source object represents your app’s messaging data model - * and vends information to the collection view as needed. - */ -@protocol QMChatCollectionViewDataSource - -@required - -/** - * Asks the data source for the current sender's display name, that is, the current user who is sending messages. - * - * @return An initialized string describing the current sender to display in a `QMChatCollectionViewCell`. - * - * @warning You must not return `nil` from this method. This value does not need to be unique. - */ -- (NSString *)senderDisplayName; - -/** - * Asks the data source for the current sender's unique identifier, that is, the current user who is sending messages. - * - * @return An initialized string identifier that uniquely identifies the current sender. - * - * @warning You must not return `0` from this method. This value must be unique. - */ -- (NSUInteger)senderID; - -/** - * Height for section header. - * - * @return height for header that used as section header - */ -- (CGFloat)heightForSectionHeader; - -/** - * Asks the data source for the message data that corresponds to the specified item at indexPath in the collectionView. - * - * @param collectionView The object representing the collection view requesting this information. - * @param indexPath The index path that specifies the location of the item. - * - * @return An initialized object that conforms to the `QMChatMessageData` protocol. You must not return `nil` from this method. - */ -//- (id)collectionView:(QMChatCollectionView *)collectionView messageDataForItemAtIndexPath:(NSIndexPath *)indexPath; - -- (NSString *)collectionView:(QMChatCollectionView *)collectionView itemIdAtIndexPath:(NSIndexPath *)indexPath; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Protocols/QMChatCollectionViewDelegateFlowLayout.h b/Pods/QMCVDevelopment/QMChatViewController/Protocols/QMChatCollectionViewDelegateFlowLayout.h deleted file mode 100644 index 127305048..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Protocols/QMChatCollectionViewDelegateFlowLayout.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// QMChatCollectionViewDelegateFlowLayout.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import -#import - -@class QMChatCollectionView; -@class QMChatCollectionViewFlowLayout; -@class QMChatCellLayoutAttributes; - -typedef struct QMChatLayoutModel QMChatCellLayoutModel; - -/** - * The `QMChatCollectionViewDelegateFlowLayout` protocol defines methods that allow you to - * manage additional layout information for the collection view and respond to additional actions on its items. - * The methods of this protocol are all optional. - */ -@protocol QMChatCollectionViewDelegateFlowLayout - -@optional - -- (QMChatCellLayoutModel)collectionView:(QMChatCollectionView *)collectionView layoutModelAtIndexPath:(NSIndexPath *)indexPath; - -- (CGSize)collectionView:(QMChatCollectionView *)collectionView dynamicSizeAtIndexPath:(NSIndexPath *)indexPath maxWidth:(CGFloat)maxWidth; -- (CGFloat)collectionView:(QMChatCollectionView *)collectionView minWidthAtIndexPath:(NSIndexPath *)indexPath; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.h b/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.h deleted file mode 100644 index c40cd5e07..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// NSDate+ChatDataSource.h -// QMChatViewController -// -// Created by Vitaliy Gurkovsky on 8/23/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import - -@interface NSDate (ChatDataSource) - -- (NSComparisonResult)compareWithDate:(NSDate*)dateToCompareWith; - -- (NSDate *)dateAtStartOfDay; -- (NSDate *)dateAtEndOfDay; - -- (BOOL)isBetweenStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate respectOrderedSame:(BOOL)respectOrderedSame; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.h b/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.h deleted file mode 100644 index 073e26334..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// QBChatMessage+QBDateDivider.h -// QMChatViewController -// -// Created by Vitaliy Gurkovsky on 8/16/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import - -@interface QBChatMessage (QBDateDivider) - -@property (assign, nonatomic) BOOL isDateDividerMessage; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QMChatDataSource.h b/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QMChatDataSource.h deleted file mode 100644 index b52ba4cd1..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QMChatDataSource.h +++ /dev/null @@ -1,99 +0,0 @@ -// -// QMChatDataSource.h -// QMChatViewController -// -// Created by Vitaliy Gurkovsky on 8/10/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import -#import - -#import "QBChatMessage+QBDateDivider.h" - -typedef NS_ENUM(NSInteger, QMDataSourceActionType) { - - QMDataSourceActionTypeAdd = 0, - QMDataSourceActionTypeUpdate, - QMDataSourceActionTypeRemove -}; - -@class QBChatMessage; - -@protocol QMChatDataSourceDelegate; - -@interface QMChatDataSource : NSObject - -@property(nonatomic, weak) id delegate; - -/** - * Custom messages date divider interval. - * - * @discussion By default date divider divides messages by days (e.g. Today, Yesterday, etc.). - * Set custom time interval (in seconds) here to make date divider divide messages every N seconds. - * - * @note Should be changed before adding any data do data source, otherwise will require reload of data. - * - * @remark Default value: 0. - */ -@property (nonatomic, assign) NSTimeInterval customDividerInterval; - -- (NSArray *)allMessages; - -- (void)addMessage:(QBChatMessage *)message; -- (void)addMessages:(NSArray *)messages; - -- (void)deleteMessage:(QBChatMessage *)message; -- (void)deleteMessages:(NSArray *)messages; - -- (void)updateMessage:(QBChatMessage *)message; -- (void)updateMessages:(NSArray *)messages; - -- (NSArray *)performChangesWithMessages:(NSArray *)messages updateType:(QMDataSourceActionType)updateType; - -/** - * Messages count. - * - * @return The number of messages in the data source - */ -- (NSInteger)messagesCount; - -/** - * Message for index path. - * - * @param indexPath index path to find message - * - * @return QBChatMessage instance that conforms to indexPath - */ -- (QBChatMessage *)messageForIndexPath:(NSIndexPath *)indexPath; - -/** - * Index path for message. - * - * @param message message to return index path - * - * @return NSIndexPath instance that conforms message or nil if not found - */ -- (NSIndexPath *)indexPathForMessage:(QBChatMessage *)message; - -/** - * Returns a Boolean value that indicates whether a message is present in the data source. - * - * @param message message to check - * - * @return YES if message is present in the data source, otherwise NO. - */ -- (BOOL)messageExists:(QBChatMessage *)message; - -@end - -@protocol QMChatDataSourceDelegate - -- (void)chatDataSource:(QMChatDataSource *)chatDataSource -willBeChangedWithMessageIDs:(NSArray *)messagesIDs; - -- (void)changeDataSource:(QMChatDataSource *)dataSource - withMessages:(NSArray *)messages - updateType:(QMDataSourceActionType)updateType; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.h b/Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.h deleted file mode 100644 index d90d69f5f..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// QMChatLocationSnapshotter.h -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 7/6/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import -#import - -typedef void(^QMChatLocationSnapshotBlock)(UIImage *snapshot); - -@interface QMChatLocationSnapshotter : NSObject - -+ (void)snapshotForLocationCoordinate:(CLLocationCoordinate2D)locationCoordinate - withSize:(CGSize)size - key:(NSString *)key - completion:(QMChatLocationSnapshotBlock)completion; - -+ (void)cancelSnapshotCreationForKey:(NSString *)key; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.h b/Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.h deleted file mode 100644 index ca1bd86ba..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// UIImageView+QMLocationSnapshot.h -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 7/7/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import -#import - -@interface UIImageView (QMLocationSnapshot) - -- (void)setSnapshotWithLocationCoordinate:(CLLocationCoordinate2D)locationCoordinate; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatViewController.h b/Pods/QMCVDevelopment/QMChatViewController/QMChatViewController.h deleted file mode 100644 index 856c0ed1a..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatViewController.h +++ /dev/null @@ -1,290 +0,0 @@ -// -// QMChatViewController.h -// QMChatViewController -// -// Created by Andrey Ivanov on 06.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -#import "QMChatCollectionView.h" -#import "QMChatCollectionViewDelegateFlowLayout.h" -#import "QMChatCollectionViewFlowLayout.h" -#import "QMChatActionsHandler.h" -#import "QMInputToolbar.h" -#import - -#import "QMChatContactRequestCell.h" -#import "QMChatIncomingCell.h" -#import "QMChatOutgoingCell.h" -#import "QMChatNotificationCell.h" -#import "QMChatAttachmentIncomingCell.h" -#import "QMChatAttachmentOutgoingCell.h" -#import "QMChatLocationIncomingCell.h" -#import "QMChatLocationOutgoingCell.h" -#import "QMChatDataSource.h" - -#import "QMVideoIncomingCell.h" -#import "QMAudioIncomingCell.h" -#import "QMImageIncomingCell.h" - -#import "QMVideoOutgoingCell.h" -#import "QMImageOutgoingCell.h" -#import "QMAudioOutgoingCell.h" - -#import "QMMediaViewDelegate.h" -#import "QMChatBaseLinkPreviewCell.h" -#import "QMChatIncomingLinkPreviewCell.h" -#import "QMChatOutgoingLinkPreviewCell.h" - -@interface QMChatViewController : UIViewController - - -@property (strong, nonatomic) QMChatDataSource *chatDataSource; -/** - * Cell's contact request delegate. - */ -@property (weak, nonatomic) id actionsHandler; - -/** - * Returns the collection view object managed by this view controller. - * This view controller is the collection view's data source and delegate. - */ -@property (weak, nonatomic, readonly) QMChatCollectionView *collectionView; - -/** - * Returns the input toolbar view object managed by this view controller. - * This view controller is the toolbar's delegate. - */ -@property (weak, nonatomic, readonly) QMInputToolbar *inputToolbar; - -/** - Progress view. Is hiden by default. - */ -@property (weak, nonatomic) IBOutlet FFCircularProgressView *progressView; - -/** - * The display name of the current user who is sending messages. - * - * @discussion This value does not have to be unique. This value must not be `nil`. - */ -@property (copy, nonatomic) NSString *senderDisplayName; - -/** - * The string identifier that uniquely identifies the current user sending messages. - * - * @discussion This property is used to determine if a message is incoming or outgoing. - * All message data objects returned by `collectionView:messageDataForItemAtIndexPath:` are - * checked against this identifier. This value must not be `nil`. - */ -@property (assign, nonatomic) NSUInteger senderID; - -/** - * Float value that used as height for section header. - * - * @discussion Set this value with data source method '- (CGFloat)heightForSectionHeader'. - * Section header will not be displayed if value is '0'. - */ -@property (assign, nonatomic) CGFloat heightForSectionHeader; - -/** - * Specifies whether or not the view controller should automatically scroll to the most recent message - * when the view appears and when sending, receiving, and composing a new message. - * - * @discussion The default value is `YES`, which allows the view controller to scroll automatically to the most recent message. - * Set to `NO` if you want to manage scrolling yourself. - */ -@property (assign, nonatomic) BOOL automaticallyScrollsToMostRecentMessage; - -/** - * Specifies an additional inset amount to be added to the collectionView's contentInsets.top value. - * - * @discussion Use this property to adjust the top content inset to account for a custom subview at the top of your view controller. - */ -@property (assign, nonatomic) CGFloat topContentAdditionalInset; - -/** - * Enable text checking types for cells. Must be set in view did load. - */ -@property (assign, nonatomic) NSTextCheckingTypes enableTextCheckingTypes; - -/** - * Method to create chat message text attributed string. Have to be overriden in subclasses. - * - * @param messageItem Chat message instance. - * - * @return Configured attributed string. - */ -- (NSAttributedString *)attributedStringForItem:(QBChatMessage *)messageItem; - -/** - * Method to create chat message top label attributed string (Usually - chat message owner name). Have to be overriden in subclasses. - * - * @param messageItem Chat message instance. - * - * @return Configured attributed string. - */ -- (NSAttributedString *)topLabelAttributedStringForItem:(QBChatMessage *)messageItem; - -/** - * Method to create chat message bottom label attributed string (Usually - chat message date sent). Have to be overriden in subclasses. - * - * @param messageItem Chat message instance. - * - * @return Configured attributed string. - */ -- (NSAttributedString *)bottomLabelAttributedStringForItem:(QBChatMessage *)messageItem; - -/** - * Collection Cell View class for specific message. Have to be overriden in subclasses. Defaults cells are supplied with QMChatViewController. - * - * @param item Chat message instance. - * - * @return Collection Cell View Class - */ -- (Class)viewClassForItem:(QBChatMessage *)item; - -- (void)collectionView:(QMChatCollectionView *)collectionView configureCell:(UICollectionViewCell *)cell forIndexPath:(NSIndexPath *)indexPath; - -#pragma mark - Class methods - -/** - * Returns the `UINib` object initialized for a `QMChatViewController`. - * - * @return The initialized `UINib` object or `nil` if there were errors during initialization - * or the nib file could not be located. - * - * @discussion You may override this method to provide a customized nib. If you do, - * you should also override `messagesViewController` to return your - * view controller loaded from your custom nib. - */ -+ (UINib *)nib; - -/** - * Creates and returns a new `QMChatViewController` object. - * - * @discussion This is the designated initializer for programmatic instantiation. - * - * @return An initialized `QMChatViewController` object if successful, `nil` otherwise. - */ -+ (instancetype)messagesViewController; - -#pragma mark - Messages view controller - -/** - * This method is called when the user taps the send button on the inputToolbar - * after composing a message with the specified data. - * - * @param button The send button that was pressed by the user. - * @param text The message text. - * @param senderId The message sender identifier. - * @param senderDisplayName The message sender display name. - * @param date The message date. - */ -- (void)didPressSendButton:(UIButton *)button - withMessageText:(NSString *)text - senderId:(NSUInteger)senderId - senderDisplayName:(NSString *)senderDisplayName - date:(NSDate *)date; - -/** - * This method is called when the user taps the send button on the inputToolbar - * after composing a message with the specified data. - * - * @param button The send button that was pressed by the user. - * @param textAttachments Array of NSTextAttachment. - * @param senderId The message sender identifier. - * @param senderDisplayName The message sender display name. - * @param date The message date. - */ -- (void)didPressSendButton:(UIButton *)button - withTextAttachments:(NSArray *)textAttachments - senderId:(NSUInteger)senderId - senderDisplayName:(NSString *)senderDisplayName - date:(NSDate *)date; -/** - * This method is called when the user taps the accessory button on the `inputToolbar`. - * - * @param sender The accessory button that was pressed by the user. - */ -- (void)didPressAccessoryButton:(UIButton *)sender; - -/** - * This method is called when the user finishes picking attachment image. - * - * @param image image that was picked by user - */ -- (void)didPickAttachmentImage:(UIImage *)image; - -/** - * Animates the sending of a new message. See `finishSendingMessageAnimated:` for more details. - * - * @see `finishSendingMessageAnimated:`. - */ -- (void)finishSendingMessage; - -/** - * Completes the "sending" of a new message by resetting the `inputToolbar`, adding a new collection view cell in the collection view, - * reloading the collection view, and scrolling to the newly sent message as specified by `automaticallyScrollsToMostRecentMessage`. - * Scrolling to the new message can be animated as specified by the animated parameter. - * - * @param animated Specifies whether the sending of a message should be animated or not. Pass `YES` to animate changes, `NO` otherwise. - * - * @discussion You should call this method at the end of `didPressSendButton: withMessageText: senderId: senderDisplayName: date` - * after adding the new message to your data source and performing any related tasks. - * - * @see `automaticallyScrollsToMostRecentMessage`. - */ -- (void)finishSendingMessageAnimated:(BOOL)animated; - -/** - * Animates the receiving of a new message. See `finishReceivingMessageAnimated:` for more details. - * - * @see `finishReceivingMessageAnimated:`. - */ -- (void)finishReceivingMessage; - -/** - * Completes the "receiving" of a new message by adding a new collection view cell in the collection view, - * reloading the collection view, and scrolling to the newly sent message as specified by `automaticallyScrollsToMostRecentMessage`. - * Scrolling to the new message can be animated as specified by the animated parameter. - * - * @param animated Specifies whether the receiving of a message should be animated or not. Pass `YES` to animate changes, `NO` otherwise. - * - * @discussion You should call this method after adding a new "received" message to your data source and performing any related tasks. - * - * @see `automaticallyScrollsToMostRecentMessage`. - */ -- (void)finishReceivingMessageAnimated:(BOOL)animated; - -/** - * Scrolls the collection view such that the bottom most cell is completely visible, above the `inputToolbar`. - * - * @param animated Pass `YES` if you want to animate scrolling, `NO` if it should be immediate. - */ -- (void)scrollToBottomAnimated:(BOOL)animated; - -/** - * Hides keyboard - * - * @param animated Pass `YES` if you want to animate hiding, `NO` if it should be immediate. - */ -- (void)hideKeyboard:(BOOL)animated; - -/** - Make the background layer to spin around its center. This should be called in the main thread. - */ -- (void)startSpinProgress; - -/** - Stop the spinning of the background layer. This should be called in the main thread. - */ -- (void)stopSpinProgress; - -#pragma mark - Methods requiring super - -- (void)viewDidLoad NS_REQUIRES_SUPER; -- (void)viewWillAppear:(BOOL)animated NS_REQUIRES_SUPER; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMChatResources/QMChatResources.h b/Pods/QMCVDevelopment/QMChatViewController/Utils/QMChatResources/QMChatResources.h deleted file mode 100644 index cc434047a..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMChatResources/QMChatResources.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// QMChatResources.h -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 8/10/16. -// Copyright (c) 2016 QuickBlox Team. All rights reserved. -// - -#import - -@interface QMChatResources : NSObject - -+ (NSBundle *)resourceBundle; - -+ (UIImage *)imageNamed:(NSString *)name; -+ (UINib *)nibWithNibName:(NSString *)name; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMChatResources/QMChatResources.m b/Pods/QMCVDevelopment/QMChatViewController/Utils/QMChatResources/QMChatResources.m deleted file mode 100644 index d3ed558fb..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMChatResources/QMChatResources.m +++ /dev/null @@ -1,56 +0,0 @@ -// -// QMChatResources.m -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 8/10/16. -// Copyright (c) 2016 QuickBlox Team. All rights reserved. -// - -#import "QMChatResources.h" - -static inline NSBundle *bundle() { - - static NSBundle *bundle = nil; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - - NSString *path = [[NSBundle bundleForClass:[QMChatResources class]] pathForResource:@"QMChatViewController" ofType:@"bundle"]; - bundle = [NSBundle bundleWithPath:path]; - - if (bundle == nil) { - // if bundle with path is not existent that means that chat controller - // was installed as a source from github, using main bundle instead - bundle = [NSBundle mainBundle]; - } - }); - - return bundle; -} - -@implementation QMChatResources - -+ (NSBundle *)resourceBundle { - - return bundle(); -} - -+ (UIImage *)imageNamed:(NSString *)name { - - UIImage *image = nil; - - NSString *path = [bundle() pathForResource:name ofType:@"png"]; - - if (path != nil) { - image = [UIImage imageWithContentsOfFile:path]; - } - - return image; -} - -+ (UINib *)nibWithNibName:(NSString *)name { - - return [UINib nibWithNibName:name bundle:bundle()]; -} - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMDateUtils/QMDateUtils.h b/Pods/QMCVDevelopment/QMChatViewController/Utils/QMDateUtils/QMDateUtils.h deleted file mode 100644 index 9cb95f737..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMDateUtils/QMDateUtils.h +++ /dev/null @@ -1,97 +0,0 @@ -// -// QMDateUtils.h -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 11/19/15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -@interface QMDateUtils : NSObject - -/** - * Formatted string for date. - * - * @param date date to make formatted string from - * - * @return string with formatted full date (used in chat sections names) - */ -+ (NSString *)formattedStringFromDate:(NSDate *)date; - -/** - * Formatted last seen string. - * - * @param date date to make formatted string from - * @param timePrefix time prefix between date and time - * - * @return string with formatted full date (used for last seen) - */ -+ (NSString *)formattedLastSeenString:(NSDate *)date withTimePrefix:(NSString *)timePrefix; - -/** - * Formatted short date string. - * - * @param date date to make formatted string from - * - * @return string with short date format (e.g. time for today, Yesterday, week day name or full date) - */ -+ (NSString *)formattedShortDateString:(NSDate *)date; - -#pragma mark - custom formatting - -/** - * Formatted string for time of date. - * - * @param date date to make formatted string from - * - * @return string with basic time localized format (e.g. 11:10 AM) - */ -+ (NSString *)formatDateForTimeRange:(NSDate *)date; - -/** - * Formatted string for day of date. - * - * @param date date to make formatted string from - * - * @return string with basic day localized format (e.g. Yesterday, Today, Tomorrow) - */ -+ (NSString *)formatDateForDayRange:(NSDate *)date; - -/** - * Formatted string for week of date. - * - * @param date date to make formatted string from - * - * @return string with basic week localized format (e.g. Monday, Tuesday, Wednesday) - */ -+ (NSString *)formatDateForWeekRange:(NSDate *)date; - -/** - * Formatted string for month of date. - * - * @param date date to make formatted string from - * - * @return string with basic month localized format (e.g. September, October, November) - */ -+ (NSString *)formatDateForMonthRange:(NSDate *)date; - -/** - * Formatted string for year of date. - * - * @param date date to make formatted string from - * - * @return string with basic year format (e.g. 2016) - */ -+ (NSString *)formatDateForYearRange:(NSDate *)date; - -/** - * Formatted string for date. - * - * @param date date to make formatted string from - * - * @return string with base date format (e.g. 11/08/2011) - */ -+ (NSString *)formatDateForString:(NSDate *)date; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMImageLoader/QMImageLoader.h b/Pods/QMCVDevelopment/QMChatViewController/Utils/QMImageLoader/QMImageLoader.h deleted file mode 100644 index f6f42b526..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMImageLoader/QMImageLoader.h +++ /dev/null @@ -1,75 +0,0 @@ -// -// QMImageLoader.h -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 9/12/16. -// Copyright (c) 2016 Quickblox. All rights reserved. -// - -#import -#import -#import "UIImage+Cropper.h" - -NS_ASSUME_NONNULL_BEGIN - -typedef UIImage * _Nullable (^QMCustomTransformBlock)(NSURL *imageURL, UIImage *originalImage); - -typedef NS_ENUM(NSInteger, QMImageTransformType) { - - QMImageTransformTypeScaleAndCrop = 0, - QMImageTransformTypeCircle, - QMImageTransformTypeRounding, - QMImageTransformTypeCustom -}; - - -@interface QMImageTransform : NSObject - -+ (instancetype)transformWithType:(QMImageTransformType)transformType - size:(CGSize)size; - -+ (instancetype)transformWithSize:(CGSize)size customTransformBlock:(QMCustomTransformBlock)customTransformBlock; -+ (instancetype)transformWithSize:(CGSize)size isCircle:(BOOL)isCircle; //deprecate??? -- (void)applyTransformForImage:(UIImage *)image completionBlock:(void(^)(UIImage *transformedImage))transformCompletionBlock; -- (NSString *)keyWithURL:(NSURL *)url; - -@end - -typedef void(^QMWebImageCompletionWithFinishedBlock)(UIImage *_Nullable image, UIImage *_Nullable transfomedImage, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL); - -/** - * QMImageLoader class interface. - * This class is responsible for image caching, loading and size handling using - * SDWebImage component. - */ -@interface QMImageLoader : SDWebImageManager - -@property (nonatomic, readonly, class) QMImageLoader *instance; - - -+ (SDWebImageManager *)sharedManager NS_UNAVAILABLE; - -- (UIImage *)originalImageWithURL:(NSURL *)url; -- (BOOL)hasOriginalImageWithURL:(NSURL *)url; -- (NSString *)pathForOriginalImageWithURL:(NSURL *)url; - - -- (BOOL)hasImageOperationWithURL:(NSURL *)url; -- (id)operationWithURL:(NSURL *)url; -- (void)cancelOperationWithURL:(NSURL *)url; - -- (id)downloadImageWithURL:(NSURL *)url - transform:(nullable QMImageTransform *)transform - options:(SDWebImageOptions)options - progress:(_Nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(QMWebImageCompletionWithFinishedBlock)completedBlock; - -- (id)downloadImageWithURL:(NSURL *)url - token:(nullable NSString *)token - transform:(QMImageTransform *)transform - options:(SDWebImageOptions)options - progress:(_Nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(QMWebImageCompletionWithFinishedBlock)completedBlock; -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentCell/QMChatAttachmentCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentCell/QMChatAttachmentCell.h deleted file mode 100755 index 77f46b07f..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentCell/QMChatAttachmentCell.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// QMChatAttachmentCell.h -// QMChatViewController -// -// Created by Injoit on 7/2/15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -/** - * Protocol which describes required methods and properties for attachment cells. - */ -@protocol QMChatAttachmentCell - -/** - * Unique attachment identifier - */ -@property (nonatomic, strong) NSString *attachmentID; - -/** - * Sets attachment image to cell - * - * @param attachmentImage UIImage object - */ -- (void)setAttachmentImage:(UIImage *)attachmentImage; - -/** - * Updates progress label text - * - * @param progress CGFloat value to set - */ -- (void)updateLoadingProgress:(CGFloat)progress; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.h deleted file mode 100755 index 5f2c7f62b..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// QMChatAttachmentIncomingCell.h -// QMChatViewController -// -// Created by Injoit on 7/1/15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import "QMChatCell.h" -#import "QMChatAttachmentCell.h" - -/** - * Incoming attachment message cell class. - */ -@interface QMChatAttachmentIncomingCell : QMChatCell - -/** - * Attachment image view. - */ -@property (nonatomic, weak) IBOutlet UIImageView *attachmentImageView; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.h deleted file mode 100755 index 1f50ded1f..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// QMChatAttachmentOutgoingCell.h -// QMChatViewController -// -// Created by Injoit on 7/1/15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import "QMChatCell.h" -#import "QMChatAttachmentCell.h" - -/** - * Outgoing attachment message cell class. - */ -@interface QMChatAttachmentOutgoingCell : QMChatCell - -/** - * Attachment image view. - */ -@property (nonatomic, weak) IBOutlet UIImageView *attachmentImageView; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.h deleted file mode 100644 index 4e96a944a..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.h +++ /dev/null @@ -1,211 +0,0 @@ -// -// QMChatCell.h -// QMChatViewController -// -// Created by Andrey Ivanov on 14.05.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import -#import "QMChatContainerView.h" -#import -#import "QMChatCellLayoutAttributes.h" -#import "QMImageView.h" - -struct QMChatLayoutModel { - - CGSize avatarSize; - CGSize containerSize; - UIEdgeInsets containerInsets; - CGFloat topLabelHeight; - CGFloat bottomLabelHeight; - CGSize staticContainerSize; - CGFloat spaceBetweenTopLabelAndTextView; - CGFloat spaceBetweenTextViewAndBottomLabel; - CGFloat maxWidthMarginSpace; - CGFloat maxWidth; -}; - -typedef struct QMChatLayoutModel QMChatCellLayoutModel; - -@class QMChatCell; -@class QMImageView; - -/** - * The `QMChatCellDelegate` protocol defines methods that allow you to manage - * additional interactions within the collection view cell. - */ -@protocol QMChatCellDelegate - -/** - * Protocol methods down below are required to be implemented - */ -@required - -/** - * Tells the delegate that the avatarImageView of the cell has been tapped. - * - * @param cell The cell that received the tap touch event. - */ -- (void)chatCellDidTapAvatar:(QMChatCell *)cell; - -/** - * Tells the delegate that the message container of the cell has been tapped. - * - * @param cell The cell that received the tap touch event. - */ -- (void)chatCellDidTapContainer:(QMChatCell *)cell; - -/** - * Protocol methods down below are optional and can be ignored - */ -@optional - -/** - * Tells the delegate that the cell has been tapped at the point specified by position. - * - * @param cell The cell that received the tap touch event. - * @param position The location of the received touch in the cell's coordinate system. - */ -- (void)chatCell:(QMChatCell *)cell didTapAtPosition:(CGPoint)position; - -/** - * Tells the delegate that an actions has been selected from the menu of this cell. - * This method is automatically called for any registered actions. - * - * @param cell The cell that displayed the menu. - * @param action The action that has been performed. - * @param sender The object that initiated the action. - * - * @see `QMChatCell` - */ -- (void)chatCell:(QMChatCell *)cell didPerformAction:(SEL)action withSender:(id)sender; - -/** - * Tells the delegate that cell receive a tap action on text with a specific checking result. - * - * @param cell cell that received action - * @param textCheckingResult text checking result - */ -- (void)chatCell:(QMChatCell *)cell didTapOnTextCheckingResult:(NSTextCheckingResult *)textCheckingResult; - -@end - -/** - * Base chat cell class. - */ -@interface QMChatCell : UICollectionViewCell - -/** - * Returns the message container view of the cell. This view is the superview of - * the cell's textView, image view or other - * - * @discussion You may customize the cell by adding custom views to this container view. - * To do so, override `collectionView:cellForItemAtIndexPath:` - * - * @warning You should not try to manipulate any properties of this view, for example adjusting - * its frame, nor should you remove this view from the cell or remove any of its subviews. - * Doing so could result in unexpected behavior. - */ -@property (weak, nonatomic, readonly) QMChatContainerView *containerView; -@property (weak, nonatomic, readonly) UIView *messageContainer; - -/** - * Returns the avatar container view of the cell. This view is the superview of the cell's avatarImageView. - * - * @discussion You may customize the cell by adding custom views to this container view. - * To do so, override `collectionView:cellForItemAtIndexPath:` - * - * @warning You should not try to manipulate any properties of this view, for example adjusting - * its frame, nor should you remove this view from the cell or remove any of its subviews. - * Doing so could result in unexpected behavior. - */ -@property (weak, nonatomic, readonly) UIView *avatarContainerView; - -/** - * Property to set avatar view - */ -@property (weak, nonatomic, readonly) QMImageView *avatarView; - -/** - * Returns chat message attributed label. - * - * @warning You should not try to manipulate any properties of this view, for example adjusting - * its frame, nor should you remove this view from the cell or remove any of its subviews. - * Doing so could result in unexpected behavior. - */ -@property (weak, nonatomic, readonly) TTTAttributedLabel *textView; - -/** - * Returns top chat message attributed label. - * - * @warning You should not try to manipulate any properties of this view, for example adjusting - * its frame, nor should you remove this view from the cell or remove any of its subviews. - * Doing so could result in unexpected behavior. - */ -@property (weak, nonatomic, readonly) TTTAttributedLabel *topLabel; - -/** - * Returns bottom chat message attributed label. - * - * @warning You should not try to manipulate any properties of this view, for example adjusting - * its frame, nor should you remove this view from the cell or remove any of its subviews. - * Doing so could result in unexpected behavior. - */ -@property (weak, nonatomic, readonly) TTTAttributedLabel *bottomLabel; - -/** - * Returns the underlying gesture recognizer for tap gestures in the avatarContainerView of the cell. - * This gesture handles the tap event for the avatarContainerView and notifies the cell's delegate. - */ -@property (weak, nonatomic, readonly) UITapGestureRecognizer *tapGestureRecognizer; - -/** - * The object that acts as the delegate for the cell. - */ -@property (weak, nonatomic) id delegate; - -//MARK: - Class methods - -/** - * Returns the `UINib` object initialized for the cell. - * - * @return The initialized `UINib` object or `nil` if there were errors during - * initialization or the nib file could not be located. - */ -+ (UINib *)nib; - -/** - * Returns the default string used to identify a reusable cell for text message items. - * - * @return The string used to identify a reusable cell. - */ -+ (NSString *)cellReuseIdentifier; - -/** - * Registers an action to be available in the cell's menu. - * - * @param action The selector to register with the cell. - * - * @discussion Non-standard or non-system actions must be added to the `UIMenuController` manually. - * You can do this by creating a new `UIMenuItem` and adding it via the controller's `menuItems` property. - * - * @warning Note that all message cells share the all actions registered here. - */ -+ (void)registerMenuAction:(SEL)action; - -/** - * Model that allows modifying layout without changing constraints directly. - * - * @return QMChatCellLayoutModel struct - */ -+ (QMChatCellLayoutModel)layoutModel; - -/** - Registers cell for data view - - @param dataView data view. UITableView or UICollectionView - */ -+ (void)registerForReuseInView:(id)dataView; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.h deleted file mode 100644 index de99bc5a6..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// QMChatContactRequestCell.h -// QMChatViewController -// -// Created by Andrey Ivanov on 14.05.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import "QMChatCell.h" -#import "QMChatActionsHandler.h" - -@protocol QMChatContactRequestCellActions; - -/** - * Contact request cell, includes accept/reject actions delegate. - */ -@interface QMChatContactRequestCell : QMChatCell - -@property (weak, nonatomic) id actionsHandler; - -@end - diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatIncomingCell/QMChatIncomingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatIncomingCell/QMChatIncomingCell.h deleted file mode 100644 index 020392c2c..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatIncomingCell/QMChatIncomingCell.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// QMChatIncomingCell.h -// QMChatViewController -// -// Created by Andrey Ivanov on 29.05.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import "QMChatCell.h" - -/** - * Chat message cell typically used for opponent's messages. - */ -@interface QMChatIncomingCell : QMChatCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationCell/QMBaseChatLocationCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationCell/QMBaseChatLocationCell.h deleted file mode 100644 index 1d1353f54..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationCell/QMBaseChatLocationCell.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// QMBaseChatLocationCell.h -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 7/5/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import "QMChatCell.h" -#import "QMChatLocationCell.h" - -@interface QMBaseChatLocationCell : QMChatCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationCell/QMChatLocationCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationCell/QMChatLocationCell.h deleted file mode 100644 index 5d892eea3..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationCell/QMChatLocationCell.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// QMChatLocationCell.h -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 7/4/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import - -@protocol QMChatLocationCell - -@property (readonly, weak, nonatomic) UIImageView *imageView; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationIncomingCell/QMChatLocationIncomingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationIncomingCell/QMChatLocationIncomingCell.h deleted file mode 100644 index e9f2898be..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationIncomingCell/QMChatLocationIncomingCell.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// QMChatLocationIncomingCell.h -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 7/5/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import "QMBaseChatLocationCell.h" - -@interface QMChatLocationIncomingCell : QMBaseChatLocationCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationOutgoingCell/QMChatLocationOutgoingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationOutgoingCell/QMChatLocationOutgoingCell.h deleted file mode 100644 index 5512f8997..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatLocationOutgoingCell/QMChatLocationOutgoingCell.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// QMLocationOutgoingCell.h -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 7/4/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import "QMBaseChatLocationCell.h" - -@interface QMChatLocationOutgoingCell : QMBaseChatLocationCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioIncomingCell/QMAudioIncomingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioIncomingCell/QMAudioIncomingCell.h deleted file mode 100644 index 13d45c3b1..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioIncomingCell/QMAudioIncomingCell.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// QMAudioIncomingCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 2/13/17. -// -// - -#import "QMMediaIncomingCell.h" -#import "QMProgressView.h" - -@interface QMAudioIncomingCell : QMMediaIncomingCell - -@property (weak, nonatomic) IBOutlet QMProgressView *progressView; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioOutgoingCell/QMAudioOutgoingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioOutgoingCell/QMAudioOutgoingCell.h deleted file mode 100644 index eeaf924e7..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMAudioOutgoingCell/QMAudioOutgoingCell.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// QMAudioOutgoingCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 2/13/17. -// -// - -#import "QMMediaOutgoingCell.h" -#import "QMProgressView.h" - -@interface QMAudioOutgoingCell : QMMediaOutgoingCell - -@property (weak, nonatomic) IBOutlet QMProgressView *progressView; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMBaseChatMediaAttachmentCell/QMBaseMediaCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMBaseChatMediaAttachmentCell/QMBaseMediaCell.h deleted file mode 100644 index 6a6ee25a1..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMBaseChatMediaAttachmentCell/QMBaseMediaCell.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// QMBaseChatMediaAttachmentCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 2/07/17. -// -// - -#import "QMChatCell.h" -#import -#import "QMChatResources.h" -#import "QMMediaViewDelegate.h" - -@interface UIButton (QMAnimated) - -- (void)qm_setImage:(UIImage *)image - animated:(BOOL)animated; -- (void)qm_setImage:(UIImage *)image; - -@end - -@interface QMBaseMediaCell : QMChatCell - -@property (nonatomic, weak) IBOutlet UIImageView *previewImageView; -@property (nonatomic, weak) IBOutlet UIButton *mediaPlayButton; -@property (nonatomic, weak) IBOutlet UILabel *durationLabel; -@property (nonatomic, weak) IBOutlet FFCircularProgressView *circularProgress; - -- (NSString *)timestampString:(NSTimeInterval)currentTime - forDuration:(NSTimeInterval)duration; - -- (CALayer *)maskLayerFromImage:(UIImage *)image - withFrame:(CGRect)frame; - -- (void)setCurrentTime:(NSTimeInterval)currentTime - animated:(BOOL)animated; -@end - - diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMBaseChatMediaAttachmentCell/QMBaseMediaCell.m b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMBaseChatMediaAttachmentCell/QMBaseMediaCell.m deleted file mode 100644 index 10d726b3c..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMBaseChatMediaAttachmentCell/QMBaseMediaCell.m +++ /dev/null @@ -1,324 +0,0 @@ -// -// QMBaseMediaCell.m -// Pods -// -// Created by Vitaliy Gurkovsky on 2/07/17. -// -// - -#import "QMBaseMediaCell.h" -#import "QMMediaViewDelegate.h" -#import "QMChatResources.h" - -@implementation UIButton (QMAnimated) - -- (void)qm_setImage:(UIImage *)image { - [self qm_setImage:image animated:YES]; -} - -- (void)qm_setImage:(UIImage *)buttonImage - animated:(BOOL)animated { - - NSParameterAssert(buttonImage); - - dispatch_block_t imageSetBlock = ^{ - [self setImage:buttonImage - forState:UIControlStateNormal]; - }; - - if (animated) { - [UIView transitionWithView:self - duration:0.15 - options:UIViewAnimationOptionTransitionCrossDissolve - animations:imageSetBlock - completion:nil]; - } - else { - imageSetBlock(); - } -} - -@end - -@implementation QMBaseMediaCell - -@synthesize viewState = _viewState; -@synthesize messageID = _messageID; -@synthesize mediaHandler = _mediaHandler; -@synthesize duration = _duration; -@synthesize currentTime = _currentTime; -@synthesize progress = _progress; -@synthesize image = _image; -@synthesize thumbnailImage = _thumbnailImage; -@synthesize cancellable = _cancellable; -@synthesize playable = _playable; - -- (void)awakeFromNib { - - [super awakeFromNib]; - - self.circularProgress.hideProgressIcons = YES; - self.circularProgress.hidden = YES; - [self.mediaPlayButton setTitle:nil forState:UIControlStateNormal]; - [self.mediaPlayButton addTarget:self - action:@selector(activateMedia:) - forControlEvents:UIControlEventTouchUpInside]; - - [self setViewState:QMMediaViewStateNotReady]; - - UIImage *buttonImage = QMPlayButtonImageForState(_viewState); - - if (buttonImage) { - [self.mediaPlayButton qm_setImage:buttonImage - animated:YES]; - } -} - -- (void)prepareForReuse { - - [super prepareForReuse]; - - [self setViewState:QMMediaViewStateNotReady]; - - self.progress = 0.0; - self.previewImageView.image = nil; - - UIImage *buttonImage = QMPlayButtonImageForState(_viewState); - - if (buttonImage) { - [self.mediaPlayButton qm_setImage:buttonImage - animated:YES]; - } -} - -- (void)setCurrentTime:(NSTimeInterval)currentTime - animated:(BOOL)animated { - - if (_currentTime == currentTime) { - return; - } - - if (currentTime > _duration) { - currentTime = _duration; - } - _currentTime = currentTime; - - self.durationLabel.text = [self timestampString:currentTime - forDuration:_duration]; -} - - -- (void)setCurrentTime:(NSTimeInterval)currentTime { - [self setCurrentTime:currentTime - animated:NO]; -} - -- (void)showLoadingError:(NSError *)error { - -} - -- (void)setProgress:(CGFloat)progress { - - if (self.viewState != QMMediaViewStateLoading) { - return; - } - - if (progress > 0.0) { - - self.circularProgress.hidden = NO; - [self.circularProgress stopSpinProgressBackgroundLayer]; - } - - if (progress >= 1) { - self.circularProgress.hidden = YES; - } - else { - [self.circularProgress setProgress:progress]; - } -} - -- (void)setDuration:(NSTimeInterval)duration { - - _duration = duration; - - self.durationLabel.text = [self timestampString:duration]; -} - - -- (void)setThumbnailImage:(UIImage *)image { - - _thumbnailImage = image; - - self.previewImageView.image = image; - [self.previewImageView setNeedsLayout]; -} - - -- (void)qm_setImage:(UIImage *)image - animated:(BOOL)animated { - - _image = image; - if (animated) { - [UIView transitionWithView:self.previewImageView - duration:0.2f - options:UIViewAnimationOptionTransitionCrossDissolve - animations:^{ - self.previewImageView.image = image; - } completion:^(BOOL finished) { - [self.previewImageView setNeedsLayout]; - }]; - } - else { - self.previewImageView.image = image; - [self.previewImageView setNeedsLayout]; - } -} - -- (void)setImage:(UIImage *)image { - //animate only if the image wasn't been set before - [self qm_setImage:image - animated:_image ? NO : YES]; -} - - -- (IBAction)activateMedia:(id)sender { - - [self.mediaHandler didTapMediaButton:self]; -} - -- (NSString *)timestampString:(NSTimeInterval)duration { - - if (duration < 60) { - return [NSString stringWithFormat:@"0:%02d", (int)round(duration)]; - } - else if (duration < 3600) { - return [NSString stringWithFormat:@"%d:%02d", (int)duration / 60, (int)duration % 60]; - } - - return [NSString stringWithFormat:@"%d:%02d:%02d", (int)duration / 3600, (int)duration / 60, (int)duration % 60]; -} - -- (NSString *)timestampString:(NSTimeInterval)currentTime - forDuration:(NSTimeInterval)duration -{ - - NSString *timestampString = nil; - - if (duration < 60) { - if (currentTime < duration) { - timestampString = [NSString stringWithFormat:@"0:%02d", (int)round(currentTime)]; - } - else { - timestampString = [NSString stringWithFormat:@"0:%02d", (int)ceil(currentTime)]; - } - } - else if (duration < 3600) { - timestampString = [NSString stringWithFormat:@"%d:%02d", (int)currentTime / 60, (int)currentTime % 60]; - } - else { - timestampString = [NSString stringWithFormat:@"%d:%02d:%02d", (int)currentTime / 3600, (int)currentTime / 60, (int)currentTime % 60]; - } - - return timestampString; -} - - -- (CALayer *)maskLayerFromImage:(UIImage *)image - withFrame:(CGRect)frame { - - CALayer *layer = [CALayer layer]; - - layer.frame = frame; - layer.contents = (id)[image CGImage]; - layer.contentsScale = [image scale]; - layer.rasterizationScale = [image scale]; - CGSize imageSize = [image size]; - - NSAssert(image.resizingMode == UIImageResizingModeStretch || UIEdgeInsetsEqualToEdgeInsets(image.capInsets, UIEdgeInsetsZero), - @"the resizing mode of image should be stretch; if not, then its insets must be all-zero"); - - UIEdgeInsets insets = [image capInsets]; - - // These are lifted from what UIImageView does by experimentation. Without these exact values, the stretching is slightly off. - const CGFloat halfPixelFudge = 0.49f; - const CGFloat otherPixelFudge = 0.02f; - // Convert to unit coordinates for the contentsCenter property. - CGRect contentsCenter = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); - if (insets.left > 0 || insets.right > 0) { - contentsCenter.origin.x = ((insets.left + halfPixelFudge) / imageSize.width); - contentsCenter.size.width = (imageSize.width - (insets.left + insets.right + 1.f) + otherPixelFudge) / imageSize.width; - } - if (insets.top > 0 || insets.bottom > 0) { - contentsCenter.origin.y = ((insets.top + halfPixelFudge) / imageSize.height); - contentsCenter.size.height = (imageSize.height - (insets.top + insets.bottom + 1.f) + otherPixelFudge) / imageSize.height; - } - layer.contentsGravity = kCAGravityResize; - layer.contentsCenter = contentsCenter; - - return layer; -} - -- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { - - if ([touch.view isKindOfClass:[UIButton class]]) { - return NO; - } else { - return [super gestureRecognizer:gestureRecognizer shouldReceiveTouch:touch]; - } -} - -- (void)setViewState:(QMMediaViewState)viewState { - - if (_viewState == viewState) { - return; - } - _viewState = viewState; - - [self updateViewWithState:viewState]; -} - -- (void)updateViewWithState:(QMMediaViewState)viewState { - - if (viewState == QMMediaViewStateLoading) { - self.mediaPlayButton.hidden = !self.cancellable; - [self.circularProgress startSpinProgressBackgroundLayer]; - } - else { - self.mediaPlayButton.hidden = !self.playable; - [self.circularProgress stopSpinProgressBackgroundLayer]; - } - - self.circularProgress.hidden = viewState != QMMediaViewStateLoading; - - UIImage *buttonImage = [self imageForButtonWithState:viewState]; - if (!buttonImage) { - buttonImage = QMPlayButtonImageForState(viewState); - } - - [self.mediaPlayButton qm_setImage:buttonImage]; -} - -- (UIImage *)imageForButtonWithState:(QMMediaViewState)viewState { - return nil; -} - -static inline UIImage* QMPlayButtonImageForState(QMMediaViewState state) { - - NSString *imageName = nil; - - switch (state) { - - case QMMediaViewStateNotReady: imageName = @"ic_download"; break; - case QMMediaViewStateReady: imageName = @"ic_play"; break; - case QMMediaViewStateLoading: imageName = @"ic_cancel"; break; - case QMMediaViewStateActive: imageName = @"ic_pause"; break; - case QMMediaViewStateError: imageName = @"ic_retry"; break; - } - - UIImage *buttonImage = - [[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - - return buttonImage; -} - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.h deleted file mode 100644 index 13c6c3b6b..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// QMimageIncomingCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 2/27/17. -// -// - -#import "QMMediaIncomingCell.h" - -@interface QMImageIncomingCell : QMMediaIncomingCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.m b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.m deleted file mode 100644 index 41b3b551a..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageIncomingCell/QMImageIncomingCell.m +++ /dev/null @@ -1,18 +0,0 @@ -// -// QMimageIncomingCell.m -// Pods -// -// Created by Vitaliy Gurkovsky on 2/27/17. -// -// - -#import "QMImageIncomingCell.h" - -@implementation QMImageIncomingCell - -- (void)awakeFromNib { - [super awakeFromNib]; - self.mediaPlayButton.hidden = YES; -} - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.h deleted file mode 100644 index ae5b5c913..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// QMImageOutgoingCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 2/27/17. -// -// - -#import "QMMediaOutgoingCell.h" - -@interface QMImageOutgoingCell : QMMediaOutgoingCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.m b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.m deleted file mode 100644 index b03aa9e5e..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMImageOutgoingCell/QMImageOutgoingCell.m +++ /dev/null @@ -1,18 +0,0 @@ -// -// QMImageOutgoingCell.m -// Pods -// -// Created by Vitaliy Gurkovsky on 2/27/17. -// -// - -#import "QMImageOutgoingCell.h" - -@implementation QMImageOutgoingCell - -- (void)awakeFromNib { - [super awakeFromNib]; - self.mediaPlayButton.hidden = YES; -} - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaIncomingCell/QMMediaIncomingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaIncomingCell/QMMediaIncomingCell.h deleted file mode 100644 index d6d66b224..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaIncomingCell/QMMediaIncomingCell.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// QMMediaIncomingCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 2/10/17. -// -// - -#import "QMBaseMediaCell.h" - -@interface QMMediaIncomingCell : QMBaseMediaCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaOutgoingCell/QMMediaOutgoingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaOutgoingCell/QMMediaOutgoingCell.h deleted file mode 100644 index d760c80cc..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaOutgoingCell/QMMediaOutgoingCell.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// QMMediaOutgoingCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 2/10/17. -// -// - -#import "QMBaseMediaCell.h" - - -@interface QMMediaOutgoingCell : QMBaseMediaCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaViewDelegate/QMMediaViewDelegate.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaViewDelegate/QMMediaViewDelegate.h deleted file mode 100644 index e04191185..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMMediaViewDelegate/QMMediaViewDelegate.h +++ /dev/null @@ -1,111 +0,0 @@ -// -// QMMediaViewDelegate.h -// QMPLayer -// -// Created by Vitaliy Gurkovsky on 1/30/17. -// Copyright © 2017 quickblox. All rights reserved. -// - -#import -#import - -/** - The current state of the media view. - */ -typedef NS_ENUM(NSInteger, QMMediaViewState) { - /** Default view state.*/ - QMMediaViewStateNotReady, - /** The view is ready to play.*/ - QMMediaViewStateReady, - /** The view's model is loading.*/ - QMMediaViewStateLoading, - /** The view is playing.*/ - QMMediaViewStateActive, - /** The error has been occured.*/ - QMMediaViewStateError -}; - -@protocol QMMediaHandler; - -@protocol QMMediaViewDelegate - -@required - -/** - The QMMediaHandler's delegate. - */ -@property (nonatomic, weak) id mediaHandler; - -/** - The message ID. - */ -@property (nonatomic, strong) NSString *messageID; - -@optional - -/** - Determines whether the view should have cancel button. - */ -@property (nonatomic, assign) BOOL cancellable; - -/** - Determines whether the view should have play button. - */ -@property (nonatomic, assign) BOOL playable; - -/** - The state of the view. - @see 'QMMediaViewState'. - */ -@property (nonatomic, assign) QMMediaViewState viewState; - -/** - Represents the current time. - */ -@property (nonatomic, assign) NSTimeInterval currentTime; -/** - Represents the current duration. - */ -@property (nonatomic, assign) NSTimeInterval duration; - -/** - Represents the current progress. - */ -@property (nonatomic, assign) CGFloat progress; - -/** - Sets the thumbnail image. - */ -@property (nonatomic, strong) UIImage *thumbnailImage; - -/** - Sets the image. - */ -@property (nonatomic, strong) UIImage *image; - -/** - Tells the delegate that the error has been occured. - - @param error The instance of NSError. - */ -- (void)showLoadingError:(NSError *)error; - -/** - Tells the delegate that the error has been occured. - - @param error The instance of NSError. - */ -- (void)showUploadingError:(NSError *)error; - -@end - -@protocol QMMediaHandler - -/** - Tells the delegate that the media button has been tapped. - - @param view Instance that adopts id. - */ -- (void)didTapMediaButton:(id)view; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoIncomingCell/QMVideoIncomingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoIncomingCell/QMVideoIncomingCell.h deleted file mode 100644 index 5a7b37d44..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoIncomingCell/QMVideoIncomingCell.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// QMVideoIncomingCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 2/13/17. -// -// - -#import "QMMediaIncomingCell.h" - -@interface QMVideoIncomingCell : QMMediaIncomingCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoOutgoingCell/QMVideoOutgoingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoOutgoingCell/QMVideoOutgoingCell.h deleted file mode 100644 index ad2931fb7..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatMediaAttachmentCell/QMVideoOutgoingCell/QMVideoOutgoingCell.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// QMVideoOutgoingCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 2/13/17. -// -// - -#import "QMMediaOutgoingCell.h" - -@interface QMVideoOutgoingCell : QMMediaOutgoingCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatNotificationCell/QMChatNotificationCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatNotificationCell/QMChatNotificationCell.h deleted file mode 100644 index ba3079036..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatNotificationCell/QMChatNotificationCell.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// QMChatNotificationCell.h -// QMChatViewController -// -// Created by Andrey Ivanov on 03.06.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import "QMChatCell.h" - -/** - * Chat message cell typically used for system notifications. - */ -@interface QMChatNotificationCell : QMChatCell - -@property (weak, nonatomic) IBOutlet UILabel *notificationLabel; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatOutgoingCell/QMChatOutgoingCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatOutgoingCell/QMChatOutgoingCell.h deleted file mode 100644 index 73e8c2045..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatOutgoingCell/QMChatOutgoingCell.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// QMChatOutgoingCell.h -// QMChatViewController -// -// Created by Andrey Ivanov on 29.05.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import "QMChatCell.h" - -/** - * Chat message cell typically used for your messages. - */ -@interface QMChatOutgoingCell : QMChatCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatBaseLinkPreviewCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatBaseLinkPreviewCell.h deleted file mode 100644 index 4548bfc13..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatBaseLinkPreviewCell.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// QMChatBaseLinkPreviewCell.h -// -// -// Created by Vitaliy Gurkovsky on 3/31/17. -// - - -#import "QMChatCell.h" -#import "QMImageView.h" -#import "QMLinkPreviewDelegate.h" - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QMChatBaseLinkPreviewCell : QMChatCell - -@property (nonatomic, weak) IBOutlet UILabel *urlLabel; -@property (nonatomic, weak) IBOutlet TTTAttributedLabel *urlDescription; -@property (nonatomic, weak) IBOutlet UIImageView *previewImageView; - -- (void)setSiteURL:(NSString *)siteURL - urlDescription:(NSString *)urlDesription - previewImage:(UIImage *)previewImage - favicon:(UIImage *)favicon; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatIncomingLinkPreviewCell/QMChatIncomingLinkPreviewCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatIncomingLinkPreviewCell/QMChatIncomingLinkPreviewCell.h deleted file mode 100644 index 6a9b4ca91..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatIncomingLinkPreviewCell/QMChatIncomingLinkPreviewCell.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// QMChatIncomingLinkPreviewCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 3/31/17. -// -// -#import -#import "QMChatBaseLinkPreviewCell.h" - - -@interface QMChatIncomingLinkPreviewCell : QMChatBaseLinkPreviewCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatOutgoingLinkPreviewCell/QMChatOutgoingLinkPreviewCell.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatOutgoingLinkPreviewCell/QMChatOutgoingLinkPreviewCell.h deleted file mode 100644 index 9810152ec..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMChatOutgoingLinkPreviewCell/QMChatOutgoingLinkPreviewCell.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// QMChatOutgoingLinkPreviewCell.h -// Pods -// -// Created by Vitaliy Gurkovsky on 3/31/17. -// -// - -#import -#import "QMChatBaseLinkPreviewCell.h" - -@interface QMChatOutgoingLinkPreviewCell : QMChatBaseLinkPreviewCell - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMLinkPreviewDelegate.h b/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMLinkPreviewDelegate.h deleted file mode 100644 index dd766e324..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMLinkPreviewCell/QMLinkPreviewDelegate.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// QMLinkPreviewDelegate.h -// -// -// Created by Vitaliy Gurkovsky on 5/6/17. -// -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@protocol QMLinkPreviewDelegate - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMChatCellLayoutAttributes.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMChatCellLayoutAttributes.h deleted file mode 100644 index 5a2135bb6..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMChatCellLayoutAttributes.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// QMChatCollectionViewLayoutAttributes.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -@interface QMChatCellLayoutAttributes : UICollectionViewLayoutAttributes - -@property (assign, nonatomic) UIEdgeInsets containerInsets; -@property (assign, nonatomic) CGSize containerSize; -@property (assign, nonatomic) CGSize avatarSize; -@property (assign, nonatomic) CGFloat topLabelHeight; -@property (assign, nonatomic) CGFloat bottomLabelHeight; -@property (assign, nonatomic) CGFloat spaceBetweenTopLabelAndTextView; -@property (assign, nonatomic) CGFloat spaceBetweenTextViewAndBottomLabel; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMChatCollectionViewFlowLayout.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMChatCollectionViewFlowLayout.h deleted file mode 100644 index 0853ab7a5..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMChatCollectionViewFlowLayout.h +++ /dev/null @@ -1,55 +0,0 @@ -// -// QMChatCollectionViewFlowLayout.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - - -@class QMChatCollectionView; - -/** - * The `QMChatCollectionViewFlowLayout` is a concrete layout object that inherits - * from `UICollectionViewFlowLayout` and organizes message items in a vertical list. - * Each `QMChatCollectionViewCell` in the layout can display messages of arbitrary sizes and avatar images, - * as well as metadata such as a timestamp and sender. - * You can easily customize the layout via its properties or its delegate methods - * defined in `QMChatCollectionViewDelegateFlowLayout`. - * - * @see QMChatCollectionViewDelegateFlowLayout. - * @see QMChatCollectionViewCell. - */ -@interface QMChatCollectionViewFlowLayout : UICollectionViewFlowLayout - -/** - * The collection view object currently using this layout object. - */ -@property (weak, nonatomic) QMChatCollectionView *chatCollectionView; - -/** - * Returns the width of items in the layout. - */ -@property (readonly, nonatomic) CGFloat itemWidth; - -- (CGSize)containerViewSizeForItemAtIndexPath:(NSIndexPath *)indexPath; - -/** - * Size for item and index path. - * - * @discussion Returns cached size of item. If size is not in cache, then counts it first. - * - * @return Size of item at index path - */ -- (CGSize)sizeForItemAtIndexPath:(NSIndexPath *)indexPath; - -/** - * Removing size for itemID from cache. - * - * @discussion Use this method before any of collection view reload methods, that will update missed cached sizes. - */ -- (void)removeSizeFromCacheForItemID:(NSString *)itemID; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMCollectionViewFlowLayoutInvalidationContext.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMCollectionViewFlowLayoutInvalidationContext.h deleted file mode 100644 index 62bf62db2..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/Layout/QMCollectionViewFlowLayoutInvalidationContext.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// QMCollectionViewFlowLayoutInvalidationContext.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -@interface QMCollectionViewFlowLayoutInvalidationContext : UICollectionViewFlowLayoutInvalidationContext - -/** - * A boolean indicating whether to empty the messages layout information cache for items and views in the layout. - * The default value is `NO`. - */ -@property (nonatomic, assign) BOOL invalidateFlowLayoutMessagesCache; - -/** - * Creates and returns a new `QMCollectionViewFlowLayoutInvalidationContext` object. - * - * @discussion When you need to invalidate the `QMChatCollectionViewFlowLayout` object for your - * `QMChatViewController` subclass, you should use this method to instantiate a new invalidation - * context and pass this object to `invalidateLayoutWithContext:`. - * - * @return An initialized invalidation context object if successful, otherwise `nil`. - */ -+ (instancetype)context; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/QMChatCollectionView.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/QMChatCollectionView.h deleted file mode 100644 index 3a723235c..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CollectionView/QMChatCollectionView.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// QMChatCollectionView.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -#import "QMChatCollectionViewFlowLayout.h" -#import "QMChatCollectionViewDataSource.h" -#import "QMChatCollectionViewDelegateFlowLayout.h" -#import "QMChatCell.h" - -/** - * Collection View with chat cells. - */ -@interface QMChatCollectionView : UICollectionView -/** - * The object that provides the data for the collection view. - * The data source must adopt the `QMChatCollectionViewDataSource` protocol. - */ -@property (weak, nonatomic) id dataSource; - -/** - * The object that acts as the delegate of the collection view. - * The delegate must adpot the `QMChatCollectionViewDelegateFlowLayout` protocol. - */ -@property (weak, nonatomic) id delegate; - -/** - * The layout used to organize the collection view’s items. - */ -@property (strong, nonatomic) QMChatCollectionViewFlowLayout *collectionViewLayout; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMInputToolbar.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMInputToolbar.h deleted file mode 100644 index d3ce0dbcc..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMInputToolbar.h +++ /dev/null @@ -1,166 +0,0 @@ -// -// QMInputToolbar.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import -#import "QMToolbarContentView.h" - -@class QMInputToolbar; -@class QMToolbarContentView; -@class QMAudioRecordButton; - -/** - * The `QBChatMessageInputToolbarDelegate` protocol defines methods for interacting with - * a `QBChatMessageInputToolbar` object. - */ -@protocol QMInputToolbarDelegate - -@required - -/** - * Tells the delegate that the toolbar's `rightBarButtonItem` has been pressed. - * - * @param toolbar The object representing the toolbar sending this information. - * @param sender The button that received the touch event. - */ -- (void)messagesInputToolbar:(QMInputToolbar *)toolbar - didPressRightBarButton:(UIButton *)sender; - -/** - * Tells the delegate that the toolbar's `leftBarButtonItem` has been pressed. - * - * @param toolbar The object representing the toolbar sending this information. - * @param sender The button that received the touch event. - */ -- (void)messagesInputToolbar:(QMInputToolbar *)toolbar - didPressLeftBarButton:(UIButton *)sender; - -@optional - -/** - Asks the delegate if it can start the audio recording by touching the audio record button. - - @param toolbar An instance of `QBChatMessageInputToolbar` - @return YES if the audio recording should start or NO if it should not. - */ -- (BOOL)messagesInputToolbarAudioRecordingShouldStart:(QMInputToolbar *)toolbar; - -/** - This method is called when an audio recording has started. - - @param toolbar An instance of `QBChatMessageInputToolbar` - */ -- (void)messagesInputToolbarAudioRecordingStart:(QMInputToolbar *)toolbar; - -/** - This method is called when an audio recording has cancelled. - - @param toolbar An instance of `QBChatMessageInputToolbar` - */ -- (void)messagesInputToolbarAudioRecordingCancel:(QMInputToolbar *)toolbar; - -/** - This method is called when an audio recording has completed. - - @param toolbar An instance of `QBChatMessageInputToolbar` - */ -- (void)messagesInputToolbarAudioRecordingComplete:(QMInputToolbar *)toolbar; - -/** - This method is called when an audio recording has paused because of timeout. - @discussion: This mehod will be called only if 'inputPanelAudioRecordingMaximumDuration:' is adopted. - @param toolbar An instance of `QBChatMessageInputToolbar`. - */ -- (void)messagesInputToolbarAudioRecordingPausedByTimeOut:(QMInputToolbar *)toolbar; - -/** - Tells the delegate to return the current duration. - - @param toolbar An instance of `QBChatMessageInputToolbar` - @return Current duration of the audio recorder. - */ -- (NSTimeInterval)inputPanelAudioRecordingDuration:(QMInputToolbar *)toolbar; - -/** - Tells the delegate to return the maximum duration. - - @param toolbar An instance of `QBChatMessageInputToolbar` - @return The maximum duration of the recorded audio. - */ -- (NSTimeInterval)inputPanelAudioRecordingMaximumDuration:(QMInputToolbar *)toolbar; - -@end - -/** - * An instance of `QBChatMessageInputToolbar` defines the input toolbar for - * composing a new message. It is displayed above and follow the movement of - * the system keyboard. - */ -@interface QMInputToolbar : UIToolbar - -/** - * The object that acts as the delegate of the toolbar. - */ -@property (weak, nonatomic) id delegate; - -/** - * Returns the content view of the toolbar. This view contains all subviews of the toolbar. - */ -@property (weak, nonatomic, readonly) QMToolbarContentView *contentView; - -/** - * A boolean value indicating whether the send button is on the right side of the toolbar or not. - * - * @discussion The default value is `YES`, which indicates that the send button is the right-most subview of - * the toolbar's `contentView`. Set to `NO` to specify that the send button is on the left. This - * property is used to determine which touch events correspond to which actions. - * - * @warning Note, this property *does not* change the positions of buttons in the toolbar's content view. - * It only specifies whether the `rightBarButtonItem `or the `leftBarButtonItem` is the send button. - * The other button then acts as the accessory button. - */ -@property (assign, nonatomic) BOOL sendButtonOnRight; - -/** - * Specifies the default height for the toolbar. The default value is `44.0f`. This value must be positive. - */ -@property (assign, nonatomic) CGFloat preferredDefaultHeight; - -/** - * Enables or disables the send button based on whether or not its `textView` has text. - * That is, the send button will be enabled if there is text in the `textView`, and disabled otherwise. - */ -- (void)toggleSendButtonEnabled; - -/** - * Loads the content view for the toolbar. - * - * @discussion Override this method to provide a custom content view for the toolbar. - * - * @return An initialized `QMToolbarContentView` if successful, otherwise `nil`. - */ -- (QMToolbarContentView *)loadToolbarContentView; - -/** - Enables ability to record and send audio attachments. - @default NO - @discussion: If YES, the 'audio record' button is enabled on the 'send button' side. - @warning: Methods of delegate for audio recording should be adopted. - */ -@property (assign, nonatomic) BOOL audioRecordingEnabled; - -/** - Cancels current audio recording and calls the delegate method 'messagesInputToolbarAudioRecordingCancel:' - */ -- (void)cancelAudioRecording; - -/** - Performs the shake animation for audio record button. - */ -- (void)shakeControls; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContainer.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContainer.h deleted file mode 100644 index 70aec2b20..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContainer.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// QMToolbarContainer.h -// Pods -// -// Created by Vitaliy Gurkovsky on 3/9/17. -// -// - -#import - -@interface QMToolbarContainer : UIToolbar - -- (void)addButton:(UIButton *_Nonnull)button - action:(nullable void(^)(UIButton *_Nonnull sender))action; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContainer.m b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContainer.m deleted file mode 100644 index 0668e11d9..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContainer.m +++ /dev/null @@ -1,63 +0,0 @@ -// -// QMToolbarContainer.m -// Pods -// -// Created by Vitaliy Gurkovsky on 3/9/17. -// -// - -#import "QMToolbarContainer.h" - -@interface QMToolbarContainer() - -@property (strong, nonatomic) NSMutableArray *buttonsArray; -@property (strong, nonatomic) NSMutableArray *actionsArray; - -@end - -@implementation QMToolbarContainer - -- (instancetype)init { - - if (self = [super init]){ - _buttonsArray = [NSMutableArray array]; - _actionsArray = [NSMutableArray array]; - } - - return self; -} - -- (void) dealloc { - for (UIView *view in _buttonsArray) { - [view removeObserver:self forKeyPath:@"hidden"]; - } -} - -- (void)addButton:(UIButton *)button - action:(void(^)(UIButton *sender))action { - - if (action != nil) { - - [button addTarget:self - action:@selector(pressButton:) - forControlEvents:UIControlEventTouchUpInside]; - [self.actionsArray addObject:[action copy]]; - } - - if ([self.buttonsArray containsObject:button]) { - [self.buttonsArray addObject:button]; - [button addObserver:self forKeyPath:@"hidden" options:0 context:NULL]; - } -} - - -- (void)pressButton:(UIButton *)button { - - NSUInteger idx = [self.buttonsArray indexOfObject:button]; - - void(^action)(UIButton *sender) = self.actionsArray[idx]; - action(button); -} - - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContentView.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContentView.h deleted file mode 100644 index 984ae7f1e..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/InputToolBar/QMToolbarContentView.h +++ /dev/null @@ -1,122 +0,0 @@ -// -// QMToolbarContentView.h -// QMChatViewController -// -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import -#import "QMPlaceHolderTextView.h" - -typedef NS_ENUM(NSUInteger, QMToolbarPosition) { - QMToolbarPositionRight, - QMToolbarPositionLeft, - QMToolbarPositionBottom -}; - - - - -/** - * A constant value representing the default spacing to use for the left and right edges - * of the toolbar content view. - */ - -FOUNDATION_EXPORT const CGFloat kQMToolbarContentViewHorizontalSpacingDefault; - -/** - * A `QMToolbarContentView` represents the content displayed in a `QMInputToolbar`. - * These subviews consist of a left button, a text view, and a right button. One button is used as - * the send button, and the other as the accessory button. The text view is used for composing messages. - */ -@interface QMToolbarContentView : UIView - -/** - * Returns the text view in which the user composes a message. - */ -@property (weak, nonatomic, readonly) QMPlaceHolderTextView *textView; - -/** - * A custom button item displayed on the left of the toolbar content view. - * - * @discussion The frame height of this button is ignored. When you set this property, the button - * is fitted within a pre-defined default content view, the leftBarButtonContainerView, - * whose height is determined by the height of the toolbar. However, the width of this button - * will be preserved. You may specify a new width using `leftBarButtonItemWidth`. - * If the frame of this button is equal to `CGRectZero` when set, then a default frame size will be used. - * Set this value to `nil` to remove the button. - */ -@property (weak, nonatomic) UIButton *leftBarButtonItem; - -/** - * Specifies the amount of spacing between the content view and the leading edge of leftBarButtonItem. - * - * @discussion The default value is `8.0f`. - */ -@property (assign, nonatomic) CGFloat leftContentPadding; - -/** - * Specifies the width of the leftBarButtonItem. - * - * @discussion This property modifies the width of the leftBarButtonContainerView. - */ -@property (assign, nonatomic) CGFloat leftBarButtonItemWidth; - -/** - * The container view for the leftBarButtonItem. - * - * @discussion - * You may use this property to add additional button items to the left side of the toolbar content view. - * However, you will be completely responsible for responding to all touch events for these buttons - * in your `QMChatViewController` subclass. - */ -@property (weak, nonatomic, readonly) UIView *leftBarButtonContainerView; - -/** - * A custom button item displayed on the right of the toolbar content view. - * - * @discussion The frame height of this button is ignored. When you set this property, the button - * is fitted within a pre-defined default content view, the rightBarButtonContainerView, - * whose height is determined by the height of the toolbar. However, the width of this button - * will be preserved. You may specify a new width using `rightBarButtonItemWidth`. - * If the frame of this button is equal to `CGRectZero` when set, then a default frame size will be used. - * Set this value to `nil` to remove the button. - */ -@property (weak, nonatomic) UIButton *rightBarButtonItem; - -/** - * Specifies the width of the rightBarButtonItem. - * - * @discussion This property modifies the width of the rightBarButtonContainerView. - */ -@property (assign, nonatomic) CGFloat rightBarButtonItemWidth; - -/** - * Specifies the amount of spacing between the content view and the trailing edge of rightBarButtonItem. - * - * @discussion The default value is `8.0f`. - */ -@property (assign, nonatomic) CGFloat rightContentPadding; - -/** - * The container view for the rightBarButtonItem. - * - * @discussion - * You may use this property to add additional button items to the right side of the toolbar content view. - * However, you will be completely responsible for responding to all touch events for these buttons - * in your `QMChatViewController` subclass. - */ -@property (weak, nonatomic, readonly) UIView *rightBarButtonContainerView; - -//MARK: - Class methods - -/** - * Returns the `UINib` object initialized for a `QMToolbarContentView`. - * - * @return The initialized `UINib` object or `nil` if there were errors during - * initialization or the nib file could not be located. - */ -+ (UINib *)nib; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/PlaceHolderTextView/QMPlaceHolderTextView.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/PlaceHolderTextView/QMPlaceHolderTextView.h deleted file mode 100644 index a17a3e8ae..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/PlaceHolderTextView/QMPlaceHolderTextView.h +++ /dev/null @@ -1,78 +0,0 @@ -// -// QMPlaceHolderTextView.h -// QMChatViewController -// -// Created by Andrey Ivanov on 13.05.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import -#import - - -@class QMPlaceHolderTextView; - -NS_ASSUME_NONNULL_BEGIN - -extern NSString * const QMPlaceholderDidChangeHeight; - -@protocol QMPlaceHolderTextViewPasteDelegate; - -/** - * A delegate object used to notify the receiver of paste events from a `QMPlaceHolderTextView`. - */ -@protocol QMPlaceHolderTextViewPasteDelegate - -/** - * Asks the delegate whether or not the `textView` should use the original implementation of `-[UITextView paste]`. - * - * @discussion Use this delegate method to implement custom pasting behavior. - * You should return `NO` when you want to handle pasting. - * Return `YES` to defer functionality to the `textView`. - */ -- (BOOL)placeHolderTextView:(QMPlaceHolderTextView *)textView shouldPasteWithSender:(id)sender; - -@end - -/** - * Input field with placeholder. - */ -@interface QMPlaceHolderTextView : UITextView - -/** - * The object that acts as the paste delegate of the text view. - */ -@property (weak, nonatomic, nullable) id qm_placeholderTextViewPasteDelegate; - -/** - * The text to be displayed when the text view is empty. The default value is `nil`. - */ -@property (copy, nonatomic, nullable) IBInspectable NSString *placeHolder; - -/** - * The color of the place holder text. The default value is `[UIColor lightGrayColor]`. - */ -@property (strong, nonatomic) IBInspectable UIColor *placeHolderColor; - -/** - * Determines whether or not the text view contains text after trimming white space - * from the front and back of its string. - * - * @return `YES` if the text view contains text, `NO` otherwise. - */ -- (BOOL)hasText; - -/** - * Determines whether or not the text view contains image as NSTextAttachment - * - * - * @return `YES` if the text view contains attachment, `NO` otherwise. - */ -- (BOOL)hasTextAttachment; - - -- (void)setDefaultSettings; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordButton/QMAudioRecordButton.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordButton/QMAudioRecordButton.h deleted file mode 100644 index cc9f796f4..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordButton/QMAudioRecordButton.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// QMAudioRecordButton.h -// Pods -// -// Created by Vitaliy Gurkovsky on 3/6/17. -// -// - -#import - -@protocol QMAudioRecordButtonProtocol; - -@interface QMAudioRecordButton : UIButton - -@property (nonatomic, weak) id delegate; - -@property (nonatomic, strong) UIImageView *iconView; - -- (void)animateIn; -- (void)animateOut; - -@end - - -@protocol QMAudioRecordButtonProtocol - -- (void)recordButtonInteractionDidBegin; -- (void)recordButtonInteractionDidCancel:(CGFloat)velocity; -- (void)recordButtonInteractionDidComplete:(CGFloat)velocity; -- (void)recordButtonInteractionDidUpdate:(CGFloat)velocity; -- (void)recordButtonInteractionDidStopped; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordButton/QMAudioRecordButton.m b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordButton/QMAudioRecordButton.m deleted file mode 100644 index 05328eb52..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordButton/QMAudioRecordButton.m +++ /dev/null @@ -1,395 +0,0 @@ -// -// QMAudioRecordButton.m -// Pods -// -// Created by Vitaliy Gurkovsky on 3/6/17. -// -// - -#import "QMAudioRecordButton.h" -#import "QMChatResources.h" - -static const CGFloat innerCircleRadius = 110.0f; -static const CGFloat outerCircleRadius = innerCircleRadius + 50.0f; -static const CGFloat outerCircleMinScale = innerCircleRadius / outerCircleRadius; - -@interface QMAudioRecordButton() { - - CGPoint _touchLocation; - UIPanGestureRecognizer *_panRecognizer; - - CGFloat _lastVelocity; - - bool _processCurrentTouch; - CFAbsoluteTime _lastTouchTime; - bool _acceptTouchDownAsTouchUp; - - UIWindow *_overlayWindow; - - UIImageView *_innerCircleView; - UIImageView *_outerCircleView; - UIImageView *_innerIconView; - - CFAbsoluteTime _animationStartTime; - - CADisplayLink *_displayLink; - CGFloat _currentLevel; - CGFloat _inputLevel; - bool _animatedIn; - - bool _cancelled; -} - -@property (nonatomic, assign) UIEdgeInsets hitTestEdgeInsets; - -@end - -@implementation QMAudioRecordButton - -//MARK: Life cycle - -- (instancetype)initWithFrame:(CGRect)frame -{ - self = [super initWithFrame:frame]; - - if (self != nil) { - - super.exclusiveTouch = true; - _panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)]; - _panRecognizer.cancelsTouchesInView = false; - _panRecognizer.delegate = self; - - UIImage *iconImage = [[UIImage imageNamed:@"ic_audio"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - _innerIconView = [[UIImageView alloc] initWithImage:iconImage]; - _innerIconView.tintColor = [UIColor whiteColor]; - - _iconView.image = [UIImage imageNamed:@"ic_audio"]; - [self addGestureRecognizer:_panRecognizer]; - } - return self; -} - -- (void)dealloc { - - _displayLink.paused = true; - [_displayLink removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; -} - -- (CADisplayLink *)displayLink { - - if (_displayLink == nil) { - _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkUpdate)]; - _displayLink.paused = true; - [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; - } - return _displayLink; -} - -- (void)displayLinkUpdate { - - NSTimeInterval t = CACurrentMediaTime(); - if (t > _animationStartTime + 0.5) { - - _currentLevel = _currentLevel * 0.8f + _inputLevel * 0.2f; - CGFloat scale = outerCircleMinScale + _currentLevel * (1.0f - outerCircleMinScale); - _outerCircleView.transform = CGAffineTransformMakeScale(scale, scale); - } -} - -- (void)_commitCompleted { - - if ([self.delegate respondsToSelector:@selector(recordButtonInteractionDidComplete:)]) - [self.delegate recordButtonInteractionDidComplete:_lastVelocity]; -} - -//MARK: Animations -- (void)animateIn { - - _animatedIn = true; - _animationStartTime = CACurrentMediaTime(); - - if (_overlayWindow == nil) { - - _overlayWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - _overlayWindow.windowLevel = 1000000000.0f; - - _overlayWindow.rootViewController = [[UIViewController alloc] init]; - _overlayWindow.rootViewController.view.backgroundColor = [UIColor clearColor]; - _innerCircleView = [[UIImageView alloc] initWithImage:innerCircleImage()]; - _innerCircleView.alpha = 0.0f; - [_overlayWindow.rootViewController.view addSubview:_innerCircleView]; - - _outerCircleView = [[UIImageView alloc] initWithImage:outerCircleImage()]; - _outerCircleView.alpha = 0.0f; - [_overlayWindow.rootViewController.view addSubview:_outerCircleView]; - - _innerIconView.alpha = 0.0f; - [_overlayWindow.rootViewController.view addSubview:_innerIconView]; - } - - _overlayWindow.hidden = false; - - dispatch_block_t block = ^{ - CGPoint centerPoint = [self.superview convertPoint:self.center toView:_overlayWindow.rootViewController.view]; - _innerCircleView.center = centerPoint; - _outerCircleView.center = centerPoint; - _innerIconView.center = centerPoint; - }; - - block(); - dispatch_async(dispatch_get_main_queue(), block); - - _innerCircleView.transform = CGAffineTransformMakeScale(0.1f, 0.1f); - _outerCircleView.transform = CGAffineTransformMakeScale(0.1f, 0.1f); - _innerCircleView.alpha = 0.2f; - _outerCircleView.alpha = 0.2f; - - [UIView animateWithDuration:0.50 - delay:0.0 - usingSpringWithDamping:0.45f - initialSpringVelocity:0.0f - options:UIViewAnimationOptionBeginFromCurrentState - animations:^{ - _innerCircleView.transform = CGAffineTransformIdentity; - _outerCircleView.transform = CGAffineTransformMakeScale(outerCircleMinScale, outerCircleMinScale); - _innerIconView.transform = CGAffineTransformMakeScale(1.5, 1.5); - - } completion:nil]; - - [UIView animateWithDuration:0.1 animations:^{ - _innerCircleView.alpha = 1.0f; - _iconView.alpha = 0.0f; - _innerIconView.alpha = 1.0f; - _outerCircleView.alpha = 1.0f; - }]; - - - [self displayLink].paused = false; -} - - -- (void)animateOut { - - _animatedIn = false; - _displayLink.paused = true; - _currentLevel = 0.0f; - - [UIView animateWithDuration:0.18 animations:^{ - _innerCircleView.transform = CGAffineTransformMakeScale(0.2f, 0.2f); - _outerCircleView.transform = CGAffineTransformMakeScale(0.2f, 0.2f); - _innerIconView.transform = CGAffineTransformIdentity; - _innerCircleView.alpha = 0.0f; - _outerCircleView.alpha = 0.0f; - _iconView.alpha = 1.0f; - _innerIconView.alpha = 0.0f; - } completion:^(BOOL finished) { - if (finished) { - _overlayWindow.hidden = true; - _overlayWindow = nil; - } - }]; -} - - -//MARK: UIGestureRecognizerDelegate - -- (BOOL)gestureRecognizer:(UIGestureRecognizer *)__unused gestureRecognizer -shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)__unused otherGestureRecognizer { - return true; -} - -- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event -{ - if ([super continueTrackingWithTouch:touch withEvent:event]) - { - _lastVelocity = [_panRecognizer velocityInView:self].x; - - if (_processCurrentTouch) - { - CGFloat distance = [touch locationInView:self].x - _touchLocation.x; - - CGFloat value = (-distance) / 100.0f; - value = MAX(0.0f, MIN(1.0f, value)); - - CGFloat velocity = [_panRecognizer velocityInView:self].x; - - if (CACurrentMediaTime() > _animationStartTime + 1.0) { - CGFloat scale = MAX(0.4f, MIN(1.0f, 1.0f - value)); - if (scale > 0.8f) { - scale = 1.0f; - } else { - scale /= 0.8f; - } - _innerCircleView.transform = CGAffineTransformMakeScale(scale, scale); - } - - if (distance < -100.0f) - { - _cancelled = true; - if ([self.delegate respondsToSelector:@selector(recordButtonInteractionDidCancel:)]) - [self.delegate recordButtonInteractionDidCancel:velocity]; - - return false; - } - - if ([self.delegate respondsToSelector:@selector(recordButtonInteractionDidUpdate:)]) - [self.delegate recordButtonInteractionDidUpdate:value]; - - return true; - } - } - - return false; -} - -- (void)cancelTrackingWithEvent:(UIEvent *)event { - - if (_processCurrentTouch) { - - _cancelled = true; - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - if ([self.delegate respondsToSelector:@selector(recordButtonInteractionDidCancel:)]) { - [self.delegate recordButtonInteractionDidCancel:_lastVelocity]; - } - }); - } - - [super cancelTrackingWithEvent:event]; -} - -- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { - - if (_processCurrentTouch) { - - _cancelled = true; - - CGFloat velocity = _lastVelocity; - - if (velocity < -400.0f) { - - if ([self.delegate respondsToSelector:@selector(recordButtonInteractionDidCancel:)]) - [self.delegate recordButtonInteractionDidCancel:_lastVelocity]; - } - else { - [self _commitCompleted]; - } - } - - [super endTrackingWithTouch:touch withEvent:event]; -} - -- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { - - - if ([super beginTrackingWithTouch:touch withEvent:event]) { - - _lastVelocity = 0.0; - - if (ABS(CFAbsoluteTimeGetCurrent() - _lastTouchTime) < .5) { - _processCurrentTouch = false; - - return false; - } - else { - - _cancelled = false; - - _processCurrentTouch = true; - - _lastTouchTime = CFAbsoluteTimeGetCurrent(); - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - - _processCurrentTouch = !_cancelled; - - if (!_cancelled) { - - if ([self.delegate respondsToSelector:@selector(recordButtonInteractionDidBegin)]) { - [self.delegate recordButtonInteractionDidBegin]; - } - } - else { - - if ([self.delegate respondsToSelector:@selector(recordButtonInteractionDidStopped)]) { - [self.delegate recordButtonInteractionDidStopped]; - } - } - }); - - _touchLocation = [touch locationInView:self]; - } - - return true; - } - - return false; -} - -- (void)panGesture:(UIPanGestureRecognizer *)__unused recognizer { - -} - -- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { - - if (!self.enabled || self.hidden) { - return [super pointInside:point withEvent:event]; - } - CGFloat margin = 100.0; - CGRect hitFrame = CGRectInset(self.bounds, -margin, -margin); - BOOL contains = CGRectContainsPoint(hitFrame, point); - - if (contains && !self.isHighlighted && event.type == UIEventTypeTouches) - { - self.highlighted = YES; - } - - return contains; -} - -//MARK: Static methods -UIColor *QMApplicationColor() -{ - static UIColor *color = nil; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - - color = [UIColor colorWithRed:23.0f/255.0f green:208.0f/255.0f blue:75.0f/255.0f alpha:1.0f]; - }); - - return color; -} - -UIImage *innerCircleImage() { - - static UIImage *image = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - UIGraphicsBeginImageContextWithOptions(CGSizeMake(innerCircleRadius, innerCircleRadius), false, [UIScreen mainScreen].scale); - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextSetFillColorWithColor(context, QMApplicationColor().CGColor); - CGContextFillEllipseInRect(context, CGRectMake(0.0f, 0.0f, innerCircleRadius, innerCircleRadius)); - image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - }); - - return image; -} - -UIImage *outerCircleImage() { - - static UIImage *image = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - UIGraphicsBeginImageContextWithOptions(CGSizeMake(outerCircleRadius, outerCircleRadius), false, [UIScreen mainScreen].scale); - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextSetFillColorWithColor(context, [QMApplicationColor() colorWithAlphaComponent:0.2f].CGColor); - CGContextFillEllipseInRect(context, CGRectMake(0.0f, 0.0f, outerCircleRadius, outerCircleRadius)); - image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - }); - return image; -} - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordView/QMAudioRecordView.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordView/QMAudioRecordView.h deleted file mode 100644 index 7f7f306c4..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMAudioRecordView/QMAudioRecordView.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// QMAudioRecordView.h -// Pods -// -// Created by Vitaliy Gurkovsky on 3/7/17. -// -// - -#import - -@protocol QMAudioRecordViewProtocol; - -@interface QMAudioRecordView : UIView - -@property (weak, nonatomic) id delegate; - -- (void)setShowRecordingInterface:(BOOL)show velocity:(CGFloat)velocity; -- (void)updateInterfaceWithVelocity:(CGFloat)velocity; - -- (void)audioRecordingStarted; -- (void)audioRecordingFinished; - -+ (instancetype)loadAudioRecordView; - -- (void)showErrorMessage:(NSString *)errorMessage completion:(dispatch_block_t)completion; - -@end - -@protocol QMAudioRecordViewProtocol - -- (NSTimeInterval)currentDuration; -- (NSTimeInterval)maximumDuration; -- (void)shouldStopRecordingByTimeOut; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMHeaderCollectionReusableView/QMHeaderCollectionReusableView.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMHeaderCollectionReusableView/QMHeaderCollectionReusableView.h deleted file mode 100644 index 426580fdf..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMHeaderCollectionReusableView/QMHeaderCollectionReusableView.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// QMHeaderCollectionReusableView.h -// QMChatViewController -// -// Created by Vitaliy Gorbachov on 11/16/15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -@interface QMHeaderCollectionReusableView : UICollectionReusableView - -@property (weak, nonatomic) IBOutlet UIView *containerView; -@property (weak, nonatomic) IBOutlet UILabel *headerLabel; - -+ (UINib *)nib; -+ (NSString *)cellReuseIdentifier; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMImageView/QMImageView.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMImageView/QMImageView.h deleted file mode 100644 index ec23c5cbf..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMImageView/QMImageView.h +++ /dev/null @@ -1,49 +0,0 @@ -// -// QMImageView.h -// QMChatViewController -// -// Created by Andrey Ivanov on 27.06.14. -// Copyright (c) 2014 Quickblox. All rights reserved. -// - -#import -#import "QMImageLoader.h" - -@protocol QMImageViewDelegate ; - -typedef NS_ENUM(NSUInteger, QMImageViewType) { - QMImageViewTypeNone, - QMImageViewTypeCircle, - QMImageViewTypeSquare -}; - -@interface QMImageView : UIImageView -/** - Default QMUserImageViewType QMUserImageViewTypeNone - */ -@property (assign, nonatomic) QMImageViewType imageViewType; -@property (strong, nonatomic, readonly) NSURL *url; - -@property (weak, nonatomic) id delegate; - -- (void)setImageWithURL:(NSURL *)url; - -- (void)setImageWithURL:(NSURL *)url - placeholder:(UIImage *)placehoder - options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progress - completedBlock:(SDExternalCompletionBlock)completedBlock; - -- (void)setImageWithURL:(NSURL *)url - title:(NSString *)title - completedBlock:(SDExternalCompletionBlock)completedBlock; - -- (UIImage *)originalImage; - -@end - -@protocol QMImageViewDelegate - -- (void)imageViewDidTap:(QMImageView *)imageView; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMProgressView/QMProgressView.h b/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMProgressView/QMProgressView.h deleted file mode 100644 index c6cf7269b..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/CustomUI/QMProgressView/QMProgressView.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// QMProgressView.h -// Pods -// -// Created by Vitaliy Gurkovsky on 2/20/17. -// -// - -#import - -@interface QMProgressView : UIView - -@property (assign, nonatomic, readonly) CGFloat progress; - -@property (strong, nonatomic) UIColor *progressBarColor; - -- (void)setProgress:(CGFloat)progress - animated:(BOOL)animated; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/QMChatActionsHandler.h b/Pods/QMCVDevelopment/QMChatViewController/Views/QMChatActionsHandler.h deleted file mode 100644 index 481b4d1c9..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/QMChatActionsHandler.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// QMChatActionsHandler.h -// QMChatViewController -// -// Created by Andrey Ivanov on 29.05.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -@protocol QMChatActionsHandler - -- (void)chatContactRequestDidAccept:(BOOL)accept sender:(id)sender; - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/QMChatContainerView.h b/Pods/QMCVDevelopment/QMChatViewController/Views/QMChatContainerView.h deleted file mode 100644 index 789b2c52e..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/QMChatContainerView.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// QMChatContainerView.h -// QMChatViewController -// -// Created by Andrey Ivanov on 14.05.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. -// - -#import - -/** - * Customisable chat container view. - */ -@interface QMChatContainerView : UIView - -@property (strong, nonatomic) IBInspectable UIColor *bgColor; -@property (strong, nonatomic) IBInspectable UIColor *highlightColor; -@property (assign, nonatomic) IBInspectable CGFloat cornerRadius; -@property (assign, nonatomic) IBInspectable BOOL arrow; -@property (assign, nonatomic) IBInspectable BOOL leftArrow; -@property (assign, nonatomic) IBInspectable CGSize arrowSize; - -@property (assign, nonatomic) BOOL highlighted; - -@property (readonly, strong, nonatomic) UIImage *backgroundImage; - -@property (readonly, strong, nonatomic) UIBezierPath *maskPath; - - -@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/QMKVOView.h b/Pods/QMCVDevelopment/QMChatViewController/Views/QMKVOView.h deleted file mode 100644 index 98544a318..000000000 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/QMKVOView.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// QMKVOView.h -// -// -// Created by Vitaliy Gurkovsky on 10/12/16. -// -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QMKVOView : UIView - -@property (nonatomic, copy, nullable) void (^hostViewFrameChangeBlock)(UIView * _Nullable view, BOOL Animated); - -@property (nonatomic, weak) UICollectionView *collectionView; -@property (nonatomic, weak) UIView *inputView; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMCVDevelopment/README.md b/Pods/QMCVDevelopment/README.md deleted file mode 100644 index 1c0c97dbe..000000000 --- a/Pods/QMCVDevelopment/README.md +++ /dev/null @@ -1,239 +0,0 @@ -# QMChatViewController - -[![CocoaPods](https://img.shields.io/cocoapods/v/QMChatViewController.svg)](https://cocoapods.org/pods/QMChatViewController) -[![CocoaPods](https://img.shields.io/cocoapods/dt/QMChatViewController.svg)](https://cocoapods.org/pods/QMChatViewController) -[![CocoaPods](https://img.shields.io/cocoapods/dm/QMChatViewController.svg)](https://cocoapods.org/pods/QMChatViewController) - -An elegant ready-to-go chat view controller for `iOS` chat applications that use `Quickblox communication backend`. - -#Features -- Ready-to-go chat view controller with a set of cells. -- Automatic cell size calculation. -- UI customization for chat cells. -- Flexibility in improving and extending functionality. -- Easy to connect with `Quickblox`. -- Optimized and performant. -- Supports portrait and landscape orientations. -- Auto Layout inside. - -# Screenshots - -Chat View Controller - -# Requirements -- iOS 8.0+ -- ARC -- Xcode 6+ -- Quickblox SDK 2.0+ -- TTTAttributedLabel -- SDWebImage - -# Installation -## CocoaPods - pod 'QMChatViewController' - -## Manually -* Drag` QMChatViewController` folder to your project folder and link to the appropriate target. - -* Install dependencies. - -# Dependencies -- [TTTAttributedLabel](https://github.com/TTTAttributedLabel/TTTAttributedLabel) -- [SDWebImage](https://github.com/rs/SDWebImage) -- [Quickblox iOS SDK v2.0+](https://github.com/QuickBlox/quickblox-ios-sdk/archive/master.zip) - -# Getting started -An example is included in the repository. Try it out to see how chat view controller works. - -Steps to add `QMChatViewController` to Your app: - -1. Create a subclass of `QMChatViewController`. You could create it both from code and Interface Builder. -2. Open your subclass of `QMChatViewController` and do the following in *viewDidLoad* method: - * Configure chat sender ID and display name: - - ```objective-c - self.senderID = 2000; - self.senderDisplayName = @"user1"; - ``` - - * Insert messages using corresponding methods: - - ````objective-c - [self.chatDataSource addMessages:]; - ```` - -3. Handle message sending. - - ```objective-c - - (void)didPressSendButton:(UIButton *)button - withMessageText:(NSString *)text - senderId:(NSUInteger)senderId - senderDisplayName:(NSString *)senderDisplayName - date:(NSDate *)date { - // Add sending message - for example: - QBChatMessage *message = [QBChatMessage message]; - message.text = text; - message.senderID = senderId; - - QBChatAttachment *attacment = [[QBChatAttachment alloc] init]; - message.attachments = @[attacment]; - - [self.chatDataSource addMessage:message]; - - [self finishSendingMessageAnimated:YES]; - - // Save message to your cache/memory storage. - // Send message using Quickblox SDK - } - ``` - -4. Return cell view classes specific to chat message: - - ```objective-c - - (Class)viewClassForItem:(QBChatMessage *)item { - // Cell class for message - if (item.senderID != self.senderID) { - - return [QMChatIncomingCell class]; - } - else { - - return [QMChatOutgoingCell class]; - } - - return nil; - } - - ``` - -5. Calculate size of cell and minimum width: - - ```objective-c - - (CGFloat)collectionView:(QMChatCollectionView *)collectionView minWidthAtIndexPath:(NSIndexPath *)indexPath { - - QBChatMessage *item = [self.chatDataSource messageForIndexPath:indexPath]; - - NSAttributedString *attributedString = item.senderID == self.senderID ? - [self bottomLabelAttributedStringForItem:item] : [self topLabelAttributedStringForItem:item]; - - CGSize size = [TTTAttributedLabel sizeThatFitsAttributedString:attributedString - withConstraints:CGSizeMake(1000, 10000) - limitedToNumberOfLines:1]; - return size.width; - } - ``` - -6. Top, bottom and text labels. - - ```objective-c - - (NSAttributedString *)attributedStringForItem:(QBChatMessage *)messageItem { - - UIColor *textColor = [messageItem senderID] == self.senderID ? - [UIColor whiteColor] : [UIColor colorWithWhite:0.290 alpha:1.000]; - - UIFont *font = [UIFont fontWithName:@"Helvetica" size:15]; - NSDictionary *attributes = @{NSForegroundColorAttributeName:textColor, - NSFontAttributeName:font}; - - NSMutableAttributedString *attrStr = - [[NSMutableAttributedString alloc] initWithString:messageItem.text - attributes:attributes]; - return attrStr; - } - - - (NSAttributedString *)topLabelAttributedStringForItem:(QBChatMessage *)messageItem { - - if (messageItem.senderID == self.senderID) { - - return nil; - } - - UIFont *font = [UIFont fontWithName:@"Helvetica" size:14]; - - UIColor *textColor = [UIColor colorWithRed:0.184 green:0.467 blue:0.733 alpha:1.000]; - - NSDictionary *attributes = @{NSForegroundColorAttributeName:textColor, - NSFontAttributeName:font}; - - NSMutableAttributedString *attrStr = - [[NSMutableAttributedString alloc] initWithString:@"nickname" - attributes:attributes]; - return attrStr; - } - - - (NSAttributedString *)bottomLabelAttributedStringForItem:(QBChatMessage *)messageItem { - - UIFont *font = [UIFont fontWithName:@"Helvetica" size:12]; - UIColor *textColor = [messageItem senderID] == self.senderID ? - - [UIColor colorWithWhite:1.000 alpha:0.510] : [UIColor colorWithWhite:0.000 alpha:0.490]; - - NSDictionary *attributes = @{NSForegroundColorAttributeName:textColor, - NSFontAttributeName:font}; - - NSString *dateStr = @"10:20"; - - NSMutableAttributedString *attrStr = - [[NSMutableAttributedString alloc] initWithString:dateStr - attributes:attributes]; - return attrStr; - } - ``` - -7. Modifying collection chat cell attributes without changing constraints: - - ```objective-c - struct QMChatLayoutModel { - - CGSize avatarSize; - CGSize containerSize; - UIEdgeInsets containerInsets; - CGFloat topLabelHeight; - CGFloat bottomLabelHeight; - CGSize staticContainerSize; - CGFloat maxWidthMarginSpace; - }; - - typedef struct QMChatLayoutModel QMChatCellLayoutModel; - ``` - - * size of the avatar image view - * message view container size - * top label height - * bottom label height - * static size of container view - * margin space between message and screen end - - You can modify this attributes in this method: - - ````objective-c - - (QMChatCellLayoutModel)collectionView:(QMChatCollectionView *)collectionView layoutModelAtIndexPath:(NSIndexPath *)indexPath { - - QMChatCellLayoutModel layoutModel = [super collectionView:collectionView layoutModelAtIndexPath:indexPath]; - //Update attributes here ... - return layoutModel; - } - ```` - - So if you want to hide top label or bottom label you just need to set their height to 0. - -## Attachments - -`QMChatViewController` supports image attachment cell messages. `QMChatAttachmentIncomingCell` is used for incoming attachments, `QMChatAttachmentOutgoingCell` is used for outgoing attachments. Both of them have progress label to display loading progress. XIB's are also included. - -## Chat data source - -`QMChatViewController` contains its data source manager called `QMChatDataSource`. It has implementation of all methods, which you need to work with `QMChatViewController`. -This class should be used to add, update and delete messages from data source. `QMChatDataSource` has delegate, which called whenever data source were modified. - -For more information on methods and its usage check out our inline doc in `QMChatDataSource.h`. - -# Questions & Help -- You could create an issue on GitHub if you are experiencing any problems. We will be happy to help you. -- Or you can ask a 'quickblox' tagged question on StackOverflow http://stackoverflow.com/questions/ask - -# Documentation -Inline code documentation available. - -# License -See [LICENSE](LICENSE) diff --git a/Pods/QMServicesDevelopment/LICENSE.txt b/Pods/QMServicesDevelopment/LICENSE.txt deleted file mode 100644 index f44040b20..000000000 --- a/Pods/QMServicesDevelopment/LICENSE.txt +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Pods/QMServicesDevelopment/QMAuthService/QMAuthService/QMAuthService.h b/Pods/QMServicesDevelopment/QMAuthService/QMAuthService/QMAuthService.h deleted file mode 100644 index 1d63085e5..000000000 --- a/Pods/QMServicesDevelopment/QMAuthService/QMAuthService/QMAuthService.h +++ /dev/null @@ -1,207 +0,0 @@ -// -// QMBaseAuthService.h -// QMServices -// -// Created by Andrey Ivanov on 29.10.14. -// Copyright (c) 2015 Quickblox. All rights reserved. -// - -#import "QMBaseService.h" - -@protocol QMAuthServiceDelegate; - -NS_ASSUME_NONNULL_BEGIN - -@interface QMAuthService : QMBaseService - -/// Identifies user authorisation status. -@property (assign, nonatomic, readonly) BOOL isAuthorized; - -/** - Add instance that confirms auth service multicaste protocol - - @param delegate instance that confirms id protocol - */ -- (void)addDelegate:(id )delegate; - -/** - Remove instance that confirms auth service multicaste protocol - - @param delegate instance that confirms id protocol - */ -- (void)removeDelegate:(id )delegate; - -/** - User sign up and login - - @param user QuickBlox User - @param completion completion block - @return Cancelable request - */ - -- (QBRequest *)signUpAndLoginWithUser:(QBUUser *)user - completion:(nullable void(^)(QBResponse *response, QBUUser * _Nullable userProfile))completion; - -/** - User login - - @param user QuickBlox User - @param completion completion block - @return Cancelable request - */ -- (QBRequest *)logInWithUser:(QBUUser *)user - completion:(nullable void(^)(QBResponse *response, QBUUser * _Nullable userProfile))completion; - -/** - Login with firebase project ID and accessToken - - @param projectID Firebase project ID - @param accessToken Firebase access token - @param completion ompletion block with response and user profile - @return Cancelable request - */ -- (QBRequest *)logInWithFirebaseProjectID:(NSString *)projectID - accessToken:(NSString *)accessToken - completion:(void(^)(QBResponse *response, QBUUser *userProfile))completion; - -/** - Login with facebook - - @param sessionToken Facebook session token - @param completion completion block - @return Cancelable request - */ -- (QBRequest *)logInWithFacebookSessionToken:(NSString *)sessionToken - completion:(nullable void(^)(QBResponse *response, QBUUser * _Nullable userProfile))completion; - -/** - Login with twitter - - @param accessToken Twitter access token - @param accessTokenSecret Twitter access token secret - @param completion completion block - @return Cancelable request - */ - -- (QBRequest *)loginWithTwitterAccessToken:(NSString *)accessToken accessTokenSecret:(NSString *)accessTokenSecret - completion:(nullable void(^)(QBResponse *response, QBUUser * _Nullable userProfile))completion; - -/** - Logout - - @param completion completion block - @return Cancelable request - */ -- (QBRequest *)logOut:(nullable void(^)(QBResponse *response))completion; - -@end - -//MARK: - Bolts - -/** - Bolts methods for QMAuthService - @see In order to know how to work with BFTask's see documentation - https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -@interface QMAuthService (Bolts) - -/** - Sign up user and login using Bolts. - - @param user user instance to sign up and login - @return BFTask with QBUUser instance or error - */ -- (BFTask *)signUpAndLoginWithUser:(QBUUser *)user; - -/** - Login with user using Bolts. - - @param user user instance to login - @return BFTask with QBUUser instance or error - */ -- (BFTask *)loginWithUser:(QBUUser *)user; - -/** - Login with Firebase @see https://firebase.google.com/support/guides/digits-ios - - @param projectID Firebase project ID - @param accessToken Firebase access tocken - @return BFTask with QBUUser instance - */ -- (BFTask *)logInWithFirebaseProjectID:(NSString *)projectID - accessToken:(NSString *)accessToken; - -/** - Login with facebook session token using Bolts. - - @param sessionToken valid facebook token with Email access - @return BFTask with QBUUser instance or error - */ -- (BFTask *)loginWithFacebookSessionToken:(NSString *)sessionToken; - -/** - Login with twitter using Bolts. - - @param accessToken twitter access token - @param accessTokenSecret twitter access token secret - @return BFTask with QBUUser instance or error - */ -- (BFTask *)loginWithTwitterAccessToken:(NSString *)accessToken - accessTokenSecret:(NSString *)accessTokenSecret; - -/** - Logout current user using Bolts. - - @return BFTask with failure error - */ -- (BFTask *)logout; - -@end - -@protocol QMAuthServiceDelegate -@optional - -/** - It called when auth service did log out - - @param authService QMAuthService instance - */ -- (void)authServiceDidLogOut:(QMAuthService *)authService; - -/** - It called when auth service did log in with user - - @param authService QMAuthService instance - @param user logined QBUUser - */ -- (void)authService:(QMAuthService *)authService didLoginWithUser:(QBUUser *)user; - -@end - -@interface QMAuthService(DEPRECATED) - -/** - Login with twitter digits auth headers - - @param authHeaders Taken from '-[DGTOAuthSigning OAuthEchoHeadersToVerifyCredentials]' - @param completion completion block with response and user profile - @return Cancelable request - */ - -- (QBRequest *)loginWithTwitterDigitsAuthHeaders:(NSDictionary *)authHeaders - completion:(nullable void(^)(QBResponse *response, QBUUser * _Nullable userProfile))completion -DEPRECATED_MSG_ATTRIBUTE("Deprecated in 0.5 Use 'logInWithFirebaseProjectID:accessToken:successBlock:errorBlock:'."); - - -/** - Login with twitter digits using Bolts. - - @param authHeaders Taken from '-[DGTOAuthSigning OAuthEchoHeadersToVerifyCredentials]' - @return BFTask with QBUUser instance - */ -- (BFTask *)loginWithTwitterDigitsAuthHeaders:(NSDictionary *)authHeaders -DEPRECATED_MSG_ATTRIBUTE("Deprecated in 0.5 Use 'logInWithFirebaseProjectID:accessToken:'."); - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMAsynchronousOperation/QMAsynchronousOperation.h b/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMAsynchronousOperation/QMAsynchronousOperation.h deleted file mode 100644 index d9e2606b6..000000000 --- a/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMAsynchronousOperation/QMAsynchronousOperation.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// QMAsynchronousOperation.h -// Pods -// -// Created by Vitaliy Gurkovsky on 3/23/17. -// -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -typedef void(^QMAsyncOperationBlock)(dispatch_block_t finish); -typedef void(^QMCancellBlock)(void); - -@protocol QMCancellableObject -@required -- (void)cancel; -@end - - -@interface QMAsynchronousOperation : NSOperation - -@property (nonatomic, copy) NSString *operationID; -@property (nonatomic, copy, nullable) QMCancellBlock cancelBlock; - -@property (nonatomic, strong, nullable) id objectToCancel; - -- (void)finish; - -+ (instancetype)asynchronousOperationWithID:(NSString *)operationID; - -@end - - -@interface QMAsynchronousBlockOperation : QMAsynchronousOperation - -@property (nonatomic, copy, nullable) QMAsyncOperationBlock asyncOperationBlock; -+ (instancetype)asynchronousOperationWithID:(NSString *)operationID; -@end - - -@interface NSOperationQueue(QMAsynchronousOperation) - -- (nullable QMAsynchronousOperation *)operationWithID:(NSString *)operationID; - -- (BOOL)hasOperationWithID:(NSString *)operationID; - -- (void)cancelOperationWithID:(NSString *)operationID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMBaseService.h b/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMBaseService.h deleted file mode 100644 index 9fcbbbfdf..000000000 --- a/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMBaseService.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// QMBaseService.h -// QMServices -// -// Created by Andrey Ivanov on 04.08.14. -// Copyright (c) 2015 Quickblox. All rights reserved. -// - -#import -#import -#import - -#import "QMMemoryStorageProtocol.h" -#import "QMServiceManagerProtocol.h" -#import "QMCancellableService.h" - -NS_ASSUME_NONNULL_BEGIN - -typedef void(^QMTaskSourceBlock)(BFTaskCompletionSource * source); - -BFTask *make_task(QMTaskSourceBlock b); - -@interface QMBaseService : NSObject - -/** - * Service manager reference. - */ -@property (weak, nonatomic, readonly, nullable) id serviceManager; - -- (id)init NS_UNAVAILABLE; - -- (instancetype)initWithServiceManager:(id)serviceManager; - -/** - * Called when the servise is will begin start - */ -- (void)serviceWillStart; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMCancellableService.h b/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMCancellableService.h deleted file mode 100644 index 058ab6666..000000000 --- a/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMCancellableService.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// QMCancellable.h -// Pods -// -// Created by Vitaliy Gurkovsky on 6/27/17. -// - -#import - -@protocol QMCancellableService - -- (void)cancelOperationWithID:(NSString *)operationID; -- (void)cancelAllOperations; - -@end diff --git a/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMMemoryStorageProtocol.h b/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMMemoryStorageProtocol.h deleted file mode 100644 index 4d81f2fa3..000000000 --- a/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMMemoryStorageProtocol.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// QMMemoryStorageProtocol.h -// QMServices -// -// Created by Andrey Ivanov on 28.04.15. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -@protocol QMMemoryStorageProtocol - -@property (nonatomic, readonly) BOOL isEmpty; -/** - * This method used for clean all storage data in memory - */ -- (void)free; - -@end diff --git a/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMServiceManagerProtocol.h b/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMServiceManagerProtocol.h deleted file mode 100644 index 722e678ef..000000000 --- a/Pods/QMServicesDevelopment/QMBaseService/QMBaseService/QMServiceManagerProtocol.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// QMUserProfileProtocol.h -// QMServices -// -// Created by Andrey Ivanov on 28.04.15. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import - -/** - * Main QMServices protocol. - */ - -NS_ASSUME_NONNULL_BEGIN - -@protocol QMServiceManagerProtocol -@required - -/** - * Current user - * - * @return QBUUser instance - */ -@property (nonatomic, strong, readonly) QBUUser *currentUser; - -/** - * Check is current session is authorized - * - * @return YES if authorized - */ -@property (nonatomic, assign, readonly) BOOL isAuthorized; - -/** - * This method called when some QBReqest falling. Use this method for handling errors, like show alert with error. - * - * @param response QBResponse instance. See response.error for falling inforamtion. - */ -- (void)handleErrorResponse:(QBResponse *)response; - -@optional - -- (NSString *)appGroupIdentifier; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDAttachment.h b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDAttachment.h deleted file mode 100644 index b26d6931a..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDAttachment.h +++ /dev/null @@ -1,9 +0,0 @@ - -#import "_CDAttachment.h" - -@interface CDAttachment : _CDAttachment {} - -- (QBChatAttachment *)toQBChatAttachment; -- (void)updateWithQBChatAttachment:(QBChatAttachment *)attachment; - -@end diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDAttachment.m b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDAttachment.m deleted file mode 100644 index 84e220a99..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDAttachment.m +++ /dev/null @@ -1,39 +0,0 @@ -#import "CDAttachment.h" -#import "QMSLog.h" - -@implementation CDAttachment - -- (QBChatAttachment *)toQBChatAttachment { - - QBChatAttachment *attachment = [[QBChatAttachment alloc] init]; - - attachment.name = self.name; - attachment.ID = self.id; - attachment.url = self.url; - attachment.type = self.mimeType; - - NSDictionary *customParameters = [NSKeyedUnarchiver unarchiveObjectWithData:self.customParameters]; - [customParameters enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { - attachment[key] = obj; - }]; - return attachment; -} - -- (void)updateWithQBChatAttachment:(QBChatAttachment *)attachment { - - self.name = attachment.name; - self.id = attachment.ID; - self.url = attachment.url; - self.mimeType = attachment.type; - - self.customParameters = [NSKeyedArchiver archivedDataWithRootObject:attachment.customParameters]; - - if (!self.changedValues.count) { - [self.managedObjectContext refreshObject:self mergeChanges:NO]; - } - else if (!self.isInserted){ - QMSLog(@"Cache > %@ > %@: %@", self.class, self.id ,self.changedValues); - } -} - -@end diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDDialog.h b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDDialog.h deleted file mode 100644 index ad911f699..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDDialog.h +++ /dev/null @@ -1,14 +0,0 @@ -#import "_CDDialog.h" - -@interface CDDialog : _CDDialog {} - -- (QBChatDialog *)toQBChatDialog; -- (void)updateWithQBChatDialog:(QBChatDialog *)dialog; - -@end - -@interface NSArray(CDDialog) - -- (NSArray *)toQBChatDialogs; - -@end diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDDialog.m b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDDialog.m deleted file mode 100644 index a926d35f1..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDDialog.m +++ /dev/null @@ -1,69 +0,0 @@ -#import "CDDialog.h" -#import "QMSLog.h" - -@implementation CDDialog - -- (QBChatDialog *)toQBChatDialog { - - QBChatDialog *dialog = - [[QBChatDialog alloc] initWithDialogID:self.dialogID - type:self.dialogType.intValue]; - - dialog.createdAt = self.createdAt; - dialog.name = self.name; - dialog.photo = self.photo; - dialog.lastMessageText = self.lastMessageText; - dialog.lastMessageDate = self.lastMessageDate; - dialog.updatedAt = self.updatedAt; - dialog.lastMessageUserID = self.lastMessageUserIDValue; - dialog.unreadMessagesCount = self.unreadMessagesCountValue; - dialog.occupantIDs = self.occupantsIDs; - dialog.userID = self.userIDValue; - dialog.data = self.data; - - return dialog; -} - -- (void)updateWithQBChatDialog:(QBChatDialog *)dialog { - - NSAssert(dialog.type != 0, @"dialog type is undefined"); - - self.dialogID = dialog.ID; - self.dialogTypeValue = dialog.type; - self.name = dialog.name; - self.photo = dialog.photo; - self.lastMessageText = dialog.lastMessageText; - self.lastMessageDate = dialog.lastMessageDate; - self.updatedAt = dialog.updatedAt; - self.lastMessageUserIDValue = (int32_t)dialog.lastMessageUserID; - self.unreadMessagesCountValue = (int32_t)dialog.unreadMessagesCount; - self.occupantsIDs = dialog.occupantIDs; - self.userIDValue = (int32_t)dialog.userID; - self.data = dialog.data; - - if (!self.changedValues.count) { - [self.managedObjectContext refreshObject:self mergeChanges:NO]; - } - else if (!self.isInserted){ - QMSLog(@"Cache > %@ > %@: %@", self.class, self.dialogID ,self.changedValues); - } -} - -@end - -@implementation NSArray(CDDialog) - -- (NSArray *)toQBChatDialogs { - - NSMutableArray *result = [NSMutableArray arrayWithCapacity:self.count]; - - for (CDDialog *cache in self) { - - QBChatDialog *dialog = [cache toQBChatDialog]; - [result addObject:dialog]; - } - - return [result copy]; -} - -@end diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDMessage.h b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDMessage.h deleted file mode 100644 index b107f5e2c..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDMessage.h +++ /dev/null @@ -1,15 +0,0 @@ -#import "_CDMessage.h" -#import - -@interface CDMessage : _CDMessage - -- (QBChatMessage *)toQBChatMessage; -- (void)updateWithQBChatMessage:(QBChatMessage *)message; - -@end - -@interface NSArray(CDMessage) - -- (NSArray *)toQBChatMessages; - -@end diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDMessage.m b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDMessage.m deleted file mode 100644 index 81c83e7f4..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/Entries/CDMessage.m +++ /dev/null @@ -1,98 +0,0 @@ -#import "CDMessage.h" -#import "CDAttachment.h" -#import "NSManagedObject+QMCDRecord.h" -#import "QMSLog.h" - -@implementation CDMessage - -- (QBChatMessage *)toQBChatMessage { - - QBChatMessage *message = [QBChatMessage alloc]; - - message.ID = self.messageID; - message.text = self.text; - message.recipientID = self.recipientID.intValue; - message.senderID = self.senderID.intValue; - message.dateSent = self.dateSend; - message.dialogID = self.dialogID; - message.updatedAt = self.updateAt; - message.createdAt = self.createAt; - message.delayed = self.delayed.boolValue; - message.customParameters = [[NSKeyedUnarchiver unarchiveObjectWithData:self.customParameters] mutableCopy]; - message.readIDs = [NSKeyedUnarchiver unarchiveObjectWithData:self.readIDs]; - message.deliveredIDs = [NSKeyedUnarchiver unarchiveObjectWithData:self.deliveredIDs]; - - NSMutableArray *attachments = - [NSMutableArray arrayWithCapacity:self.attachments.count]; - - for (CDAttachment *cdAttachment in self.attachments) { - QBChatAttachment *attachment = [cdAttachment toQBChatAttachment]; - [attachments addObject:attachment]; - } - - message.attachments = [attachments copy]; - - if (!self.changedValues.count) { - [self.managedObjectContext refreshObject:self mergeChanges:NO]; - } - else if (!self.isInserted){ - QMSLog(@"Cache > %@ > %@: %@", self.class, self.messageID ,self.changedValues); - } - return message; -} - -- (void)updateWithQBChatMessage:(QBChatMessage *)message { - - self.messageID = message.ID; - - self.createAt = message.createdAt; - self.updateAt = message.updatedAt; - self.delayedValue = message.delayed; - self.text = message.text; - self.dateSend = message.dateSent; - self.recipientIDValue = (int32_t)message.recipientID; - self.senderID = @(message.senderID); - self.dialogID = message.dialogID; - - self.customParameters = [NSKeyedArchiver archivedDataWithRootObject:message.customParameters]; - self.readIDs = [NSKeyedArchiver archivedDataWithRootObject:message.readIDs]; - self.deliveredIDs = [NSKeyedArchiver archivedDataWithRootObject:message.deliveredIDs]; - - if (message.attachments.count > 0) { - - NSMutableSet *attachments = [NSMutableSet setWithCapacity:message.attachments.count]; - NSManagedObjectContext *context = [self managedObjectContext]; - - for (QBChatAttachment *qbChatAttachment in message.attachments) { - - CDAttachment *attachment = [CDAttachment QM_createEntityInContext:context]; - [attachment updateWithQBChatAttachment:qbChatAttachment]; - [attachments addObject:attachment]; - } - - [self setAttachments:attachments]; - } - else { - message.attachments = @[]; - } -} - -@end - -@implementation NSArray(CDMessage) - -- (NSArray *)toQBChatMessages { - - NSMutableArray *result = - [NSMutableArray arrayWithCapacity:self.count]; - - for (CDMessage *cache in self) { - - QBChatMessage *message = [cache toQBChatMessage]; - [result addObject:message]; - } - - return [result copy]; -} - -@end diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDAttachment.h b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDAttachment.h deleted file mode 100644 index 45c69ef46..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDAttachment.h +++ /dev/null @@ -1,79 +0,0 @@ -// DO NOT EDIT. This file is machine-generated and constantly overwritten. -// Make changes to CDAttachment.h instead. - -#if __has_feature(modules) - @import Foundation; - @import CoreData; -#else - #import - #import -#endif - -NS_ASSUME_NONNULL_BEGIN - -@class CDMessage; - -@interface CDAttachmentID : NSManagedObjectID {} -@end - -@interface _CDAttachment : NSManagedObject -+ (instancetype)insertInManagedObjectContext:(NSManagedObjectContext *)moc_; -+ (NSString*)entityName; -+ (nullable NSEntityDescription*)entityInManagedObjectContext:(NSManagedObjectContext*)moc_; -@property (nonatomic, readonly, strong) CDAttachmentID *objectID; - -@property (nonatomic, strong, nullable) NSData* customParameters; - -@property (nonatomic, strong, nullable) NSString* data; - -@property (nonatomic, strong, nullable) NSString* id; - -@property (nonatomic, strong, nullable) NSString* mimeType; - -@property (nonatomic, strong, nullable) NSString* name; - -@property (nonatomic, strong, nullable) NSString* url; - -@property (nonatomic, strong, nullable) CDMessage *message; - -@end - -@interface _CDAttachment (CoreDataGeneratedPrimitiveAccessors) - -- (nullable NSData*)primitiveCustomParameters; -- (void)setPrimitiveCustomParameters:(nullable NSData*)value; - -- (nullable NSString*)primitiveData; -- (void)setPrimitiveData:(nullable NSString*)value; - -- (nullable NSString*)primitiveId; -- (void)setPrimitiveId:(nullable NSString*)value; - -- (nullable NSString*)primitiveMimeType; -- (void)setPrimitiveMimeType:(nullable NSString*)value; - -- (nullable NSString*)primitiveName; -- (void)setPrimitiveName:(nullable NSString*)value; - -- (nullable NSString*)primitiveUrl; -- (void)setPrimitiveUrl:(nullable NSString*)value; - -- (CDMessage*)primitiveMessage; -- (void)setPrimitiveMessage:(CDMessage*)value; - -@end - -@interface CDAttachmentAttributes: NSObject -+ (NSString *)customParameters; -+ (NSString *)data; -+ (NSString *)id; -+ (NSString *)mimeType; -+ (NSString *)name; -+ (NSString *)url; -@end - -@interface CDAttachmentRelationships: NSObject -+ (NSString *)message; -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDAttachment.m b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDAttachment.m deleted file mode 100644 index 5c1e22824..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDAttachment.m +++ /dev/null @@ -1,77 +0,0 @@ -// DO NOT EDIT. This file is machine-generated and constantly overwritten. -// Make changes to CDAttachment.m instead. - -#import "_CDAttachment.h" - -@implementation CDAttachmentID -@end - -@implementation _CDAttachment - -+ (instancetype)insertInManagedObjectContext:(NSManagedObjectContext *)moc_ { - NSParameterAssert(moc_); - return [NSEntityDescription insertNewObjectForEntityForName:@"CDAttachment" inManagedObjectContext:moc_]; -} - -+ (NSString*)entityName { - return @"CDAttachment"; -} - -+ (NSEntityDescription*)entityInManagedObjectContext:(NSManagedObjectContext*)moc_ { - NSParameterAssert(moc_); - return [NSEntityDescription entityForName:@"CDAttachment" inManagedObjectContext:moc_]; -} - -- (CDAttachmentID*)objectID { - return (CDAttachmentID*)[super objectID]; -} - -+ (NSSet*)keyPathsForValuesAffectingValueForKey:(NSString*)key { - NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; - - return keyPaths; -} - -@dynamic customParameters; - -@dynamic data; - -@dynamic id; - -@dynamic mimeType; - -@dynamic name; - -@dynamic url; - -@dynamic message; - -@end - -@implementation CDAttachmentAttributes -+ (NSString *)customParameters { - return @"customParameters"; -} -+ (NSString *)data { - return @"data"; -} -+ (NSString *)id { - return @"id"; -} -+ (NSString *)mimeType { - return @"mimeType"; -} -+ (NSString *)name { - return @"name"; -} -+ (NSString *)url { - return @"url"; -} -@end - -@implementation CDAttachmentRelationships -+ (NSString *)message { - return @"message"; -} -@end - diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDDialog.h b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDDialog.h deleted file mode 100644 index 120173272..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDDialog.h +++ /dev/null @@ -1,175 +0,0 @@ -// DO NOT EDIT. This file is machine-generated and constantly overwritten. -// Make changes to CDDialog.h instead. - -#if __has_feature(modules) - @import Foundation; - @import CoreData; -#else - #import - #import -#endif - -NS_ASSUME_NONNULL_BEGIN - -@class CDMessage; - -@class NSObject; - -@class NSObject; - -@interface CDDialogID : NSManagedObjectID {} -@end - -@interface _CDDialog : NSManagedObject -+ (instancetype)insertInManagedObjectContext:(NSManagedObjectContext *)moc_; -+ (NSString*)entityName; -+ (nullable NSEntityDescription*)entityInManagedObjectContext:(NSManagedObjectContext*)moc_; -@property (nonatomic, readonly, strong) CDDialogID *objectID; - -@property (nonatomic, strong, nullable) NSDate* createdAt; - -@property (nonatomic, strong, nullable) id data; - -@property (nonatomic, strong, nullable) NSString* dialogID; - -@property (nonatomic, strong, nullable) NSNumber* dialogType; - -@property (atomic) int16_t dialogTypeValue; -- (int16_t)dialogTypeValue; -- (void)setDialogTypeValue:(int16_t)value_; - -@property (nonatomic, strong, nullable) NSDate* lastMessageDate; - -@property (nonatomic, strong, nullable) NSString* lastMessageText; - -@property (nonatomic, strong, nullable) NSNumber* lastMessageUserID; - -@property (atomic) int32_t lastMessageUserIDValue; -- (int32_t)lastMessageUserIDValue; -- (void)setLastMessageUserIDValue:(int32_t)value_; - -@property (nonatomic, strong, nullable) NSString* name; - -@property (nonatomic, strong, nullable) id occupantsIDs; - -@property (nonatomic, strong, nullable) NSString* photo; - -@property (nonatomic, strong, nullable) NSNumber* recipientID; - -@property (atomic) int32_t recipientIDValue; -- (int32_t)recipientIDValue; -- (void)setRecipientIDValue:(int32_t)value_; - -@property (nonatomic, strong, nullable) NSNumber* unreadMessagesCount; - -@property (atomic) int32_t unreadMessagesCountValue; -- (int32_t)unreadMessagesCountValue; -- (void)setUnreadMessagesCountValue:(int32_t)value_; - -@property (nonatomic, strong, nullable) NSDate* updatedAt; - -@property (nonatomic, strong, nullable) NSNumber* userID; - -@property (atomic) int32_t userIDValue; -- (int32_t)userIDValue; -- (void)setUserIDValue:(int32_t)value_; - -@property (nonatomic, strong, nullable) NSSet *messages; -- (nullable NSMutableSet*)messagesSet; - -@end - -@interface _CDDialog (MessagesCoreDataGeneratedAccessors) -- (void)addMessages:(NSSet*)value_; -- (void)removeMessages:(NSSet*)value_; -- (void)addMessagesObject:(CDMessage*)value_; -- (void)removeMessagesObject:(CDMessage*)value_; - -@end - -@interface _CDDialog (CoreDataGeneratedPrimitiveAccessors) - -- (nullable NSDate*)primitiveCreatedAt; -- (void)setPrimitiveCreatedAt:(nullable NSDate*)value; - -- (nullable id)primitiveData; -- (void)setPrimitiveData:(nullable id)value; - -- (nullable NSString*)primitiveDialogID; -- (void)setPrimitiveDialogID:(nullable NSString*)value; - -- (nullable NSNumber*)primitiveDialogType; -- (void)setPrimitiveDialogType:(nullable NSNumber*)value; - -- (int16_t)primitiveDialogTypeValue; -- (void)setPrimitiveDialogTypeValue:(int16_t)value_; - -- (nullable NSDate*)primitiveLastMessageDate; -- (void)setPrimitiveLastMessageDate:(nullable NSDate*)value; - -- (nullable NSString*)primitiveLastMessageText; -- (void)setPrimitiveLastMessageText:(nullable NSString*)value; - -- (nullable NSNumber*)primitiveLastMessageUserID; -- (void)setPrimitiveLastMessageUserID:(nullable NSNumber*)value; - -- (int32_t)primitiveLastMessageUserIDValue; -- (void)setPrimitiveLastMessageUserIDValue:(int32_t)value_; - -- (nullable NSString*)primitiveName; -- (void)setPrimitiveName:(nullable NSString*)value; - -- (nullable id)primitiveOccupantsIDs; -- (void)setPrimitiveOccupantsIDs:(nullable id)value; - -- (nullable NSString*)primitivePhoto; -- (void)setPrimitivePhoto:(nullable NSString*)value; - -- (nullable NSNumber*)primitiveRecipientID; -- (void)setPrimitiveRecipientID:(nullable NSNumber*)value; - -- (int32_t)primitiveRecipientIDValue; -- (void)setPrimitiveRecipientIDValue:(int32_t)value_; - -- (nullable NSNumber*)primitiveUnreadMessagesCount; -- (void)setPrimitiveUnreadMessagesCount:(nullable NSNumber*)value; - -- (int32_t)primitiveUnreadMessagesCountValue; -- (void)setPrimitiveUnreadMessagesCountValue:(int32_t)value_; - -- (nullable NSDate*)primitiveUpdatedAt; -- (void)setPrimitiveUpdatedAt:(nullable NSDate*)value; - -- (nullable NSNumber*)primitiveUserID; -- (void)setPrimitiveUserID:(nullable NSNumber*)value; - -- (int32_t)primitiveUserIDValue; -- (void)setPrimitiveUserIDValue:(int32_t)value_; - -- (NSMutableSet*)primitiveMessages; -- (void)setPrimitiveMessages:(NSMutableSet*)value; - -@end - -@interface CDDialogAttributes: NSObject -+ (NSString *)createdAt; -+ (NSString *)data; -+ (NSString *)dialogID; -+ (NSString *)dialogType; -+ (NSString *)lastMessageDate; -+ (NSString *)lastMessageText; -+ (NSString *)lastMessageUserID; -+ (NSString *)name; -+ (NSString *)occupantsIDs; -+ (NSString *)photo; -+ (NSString *)recipientID; -+ (NSString *)unreadMessagesCount; -+ (NSString *)updatedAt; -+ (NSString *)userID; -@end - -@interface CDDialogRelationships: NSObject -+ (NSString *)messages; -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDDialog.m b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDDialog.m deleted file mode 100644 index 0b0cfeae5..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDDialog.m +++ /dev/null @@ -1,242 +0,0 @@ -// DO NOT EDIT. This file is machine-generated and constantly overwritten. -// Make changes to CDDialog.m instead. - -#import "_CDDialog.h" - -@implementation CDDialogID -@end - -@implementation _CDDialog - -+ (instancetype)insertInManagedObjectContext:(NSManagedObjectContext *)moc_ { - NSParameterAssert(moc_); - return [NSEntityDescription insertNewObjectForEntityForName:@"CDDialog" inManagedObjectContext:moc_]; -} - -+ (NSString*)entityName { - return @"CDDialog"; -} - -+ (NSEntityDescription*)entityInManagedObjectContext:(NSManagedObjectContext*)moc_ { - NSParameterAssert(moc_); - return [NSEntityDescription entityForName:@"CDDialog" inManagedObjectContext:moc_]; -} - -- (CDDialogID*)objectID { - return (CDDialogID*)[super objectID]; -} - -+ (NSSet*)keyPathsForValuesAffectingValueForKey:(NSString*)key { - NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; - - if ([key isEqualToString:@"dialogTypeValue"]) { - NSSet *affectingKey = [NSSet setWithObject:@"dialogType"]; - keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey]; - return keyPaths; - } - if ([key isEqualToString:@"lastMessageUserIDValue"]) { - NSSet *affectingKey = [NSSet setWithObject:@"lastMessageUserID"]; - keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey]; - return keyPaths; - } - if ([key isEqualToString:@"recipientIDValue"]) { - NSSet *affectingKey = [NSSet setWithObject:@"recipientID"]; - keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey]; - return keyPaths; - } - if ([key isEqualToString:@"unreadMessagesCountValue"]) { - NSSet *affectingKey = [NSSet setWithObject:@"unreadMessagesCount"]; - keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey]; - return keyPaths; - } - if ([key isEqualToString:@"userIDValue"]) { - NSSet *affectingKey = [NSSet setWithObject:@"userID"]; - keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey]; - return keyPaths; - } - - return keyPaths; -} - -@dynamic createdAt; - -@dynamic data; - -@dynamic dialogID; - -@dynamic dialogType; - -- (int16_t)dialogTypeValue { - NSNumber *result = [self dialogType]; - return [result shortValue]; -} - -- (void)setDialogTypeValue:(int16_t)value_ { - [self setDialogType:@(value_)]; -} - -- (int16_t)primitiveDialogTypeValue { - NSNumber *result = [self primitiveDialogType]; - return [result shortValue]; -} - -- (void)setPrimitiveDialogTypeValue:(int16_t)value_ { - [self setPrimitiveDialogType:@(value_)]; -} - -@dynamic lastMessageDate; - -@dynamic lastMessageText; - -@dynamic lastMessageUserID; - -- (int32_t)lastMessageUserIDValue { - NSNumber *result = [self lastMessageUserID]; - return [result intValue]; -} - -- (void)setLastMessageUserIDValue:(int32_t)value_ { - [self setLastMessageUserID:@(value_)]; -} - -- (int32_t)primitiveLastMessageUserIDValue { - NSNumber *result = [self primitiveLastMessageUserID]; - return [result intValue]; -} - -- (void)setPrimitiveLastMessageUserIDValue:(int32_t)value_ { - [self setPrimitiveLastMessageUserID:@(value_)]; -} - -@dynamic name; - -@dynamic occupantsIDs; - -@dynamic photo; - -@dynamic recipientID; - -- (int32_t)recipientIDValue { - NSNumber *result = [self recipientID]; - return [result intValue]; -} - -- (void)setRecipientIDValue:(int32_t)value_ { - [self setRecipientID:@(value_)]; -} - -- (int32_t)primitiveRecipientIDValue { - NSNumber *result = [self primitiveRecipientID]; - return [result intValue]; -} - -- (void)setPrimitiveRecipientIDValue:(int32_t)value_ { - [self setPrimitiveRecipientID:@(value_)]; -} - -@dynamic unreadMessagesCount; - -- (int32_t)unreadMessagesCountValue { - NSNumber *result = [self unreadMessagesCount]; - return [result intValue]; -} - -- (void)setUnreadMessagesCountValue:(int32_t)value_ { - [self setUnreadMessagesCount:@(value_)]; -} - -- (int32_t)primitiveUnreadMessagesCountValue { - NSNumber *result = [self primitiveUnreadMessagesCount]; - return [result intValue]; -} - -- (void)setPrimitiveUnreadMessagesCountValue:(int32_t)value_ { - [self setPrimitiveUnreadMessagesCount:@(value_)]; -} - -@dynamic updatedAt; - -@dynamic userID; - -- (int32_t)userIDValue { - NSNumber *result = [self userID]; - return [result intValue]; -} - -- (void)setUserIDValue:(int32_t)value_ { - [self setUserID:@(value_)]; -} - -- (int32_t)primitiveUserIDValue { - NSNumber *result = [self primitiveUserID]; - return [result intValue]; -} - -- (void)setPrimitiveUserIDValue:(int32_t)value_ { - [self setPrimitiveUserID:@(value_)]; -} - -@dynamic messages; - -- (NSMutableSet*)messagesSet { - [self willAccessValueForKey:@"messages"]; - - NSMutableSet *result = (NSMutableSet*)[self mutableSetValueForKey:@"messages"]; - - [self didAccessValueForKey:@"messages"]; - return result; -} - -@end - -@implementation CDDialogAttributes -+ (NSString *)createdAt { - return @"createdAt"; -} -+ (NSString *)data { - return @"data"; -} -+ (NSString *)dialogID { - return @"dialogID"; -} -+ (NSString *)dialogType { - return @"dialogType"; -} -+ (NSString *)lastMessageDate { - return @"lastMessageDate"; -} -+ (NSString *)lastMessageText { - return @"lastMessageText"; -} -+ (NSString *)lastMessageUserID { - return @"lastMessageUserID"; -} -+ (NSString *)name { - return @"name"; -} -+ (NSString *)occupantsIDs { - return @"occupantsIDs"; -} -+ (NSString *)photo { - return @"photo"; -} -+ (NSString *)recipientID { - return @"recipientID"; -} -+ (NSString *)unreadMessagesCount { - return @"unreadMessagesCount"; -} -+ (NSString *)updatedAt { - return @"updatedAt"; -} -+ (NSString *)userID { - return @"userID"; -} -@end - -@implementation CDDialogRelationships -+ (NSString *)messages { - return @"messages"; -} -@end - diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDMessage.h b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDMessage.h deleted file mode 100644 index 5f046ba2d..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDMessage.h +++ /dev/null @@ -1,158 +0,0 @@ -// DO NOT EDIT. This file is machine-generated and constantly overwritten. -// Make changes to CDMessage.h instead. - -#if __has_feature(modules) - @import Foundation; - @import CoreData; -#else - #import - #import -#endif - -NS_ASSUME_NONNULL_BEGIN - -@class CDAttachment; -@class CDDialog; - -@interface CDMessageID : NSManagedObjectID {} -@end - -@interface _CDMessage : NSManagedObject -+ (instancetype)insertInManagedObjectContext:(NSManagedObjectContext *)moc_; -+ (NSString*)entityName; -+ (nullable NSEntityDescription*)entityInManagedObjectContext:(NSManagedObjectContext*)moc_; -@property (nonatomic, readonly, strong) CDMessageID *objectID; - -@property (nonatomic, strong, nullable) NSDate* createAt; - -@property (nonatomic, strong, nullable) NSData* customParameters; - -@property (nonatomic, strong, nullable) NSDate* dateSend; - -@property (nonatomic, strong, nullable) NSNumber* delayed; - -@property (atomic) BOOL delayedValue; -- (BOOL)delayedValue; -- (void)setDelayedValue:(BOOL)value_; - -@property (nonatomic, strong, nullable) NSData* deliveredIDs; - -@property (nonatomic, strong, nullable) NSString* dialogID; - -@property (nonatomic, strong, nullable) NSString* messageID; - -@property (nonatomic, strong, nullable) NSData* readIDs; - -@property (nonatomic, strong, nullable) NSNumber* recipientID; - -@property (atomic) int32_t recipientIDValue; -- (int32_t)recipientIDValue; -- (void)setRecipientIDValue:(int32_t)value_; - -@property (nonatomic, strong, nullable) NSNumber* senderID; - -@property (atomic) int32_t senderIDValue; -- (int32_t)senderIDValue; -- (void)setSenderIDValue:(int32_t)value_; - -@property (nonatomic, strong, nullable) NSString* senderNick; - -@property (nonatomic, strong, nullable) NSString* text; - -@property (nonatomic, strong, nullable) NSDate* updateAt; - -@property (nonatomic, strong, nullable) NSSet *attachments; -- (nullable NSMutableSet*)attachmentsSet; - -@property (nonatomic, strong, nullable) CDDialog *dialog; - -@end - -@interface _CDMessage (AttachmentsCoreDataGeneratedAccessors) -- (void)addAttachments:(NSSet*)value_; -- (void)removeAttachments:(NSSet*)value_; -- (void)addAttachmentsObject:(CDAttachment*)value_; -- (void)removeAttachmentsObject:(CDAttachment*)value_; - -@end - -@interface _CDMessage (CoreDataGeneratedPrimitiveAccessors) - -- (nullable NSDate*)primitiveCreateAt; -- (void)setPrimitiveCreateAt:(nullable NSDate*)value; - -- (nullable NSData*)primitiveCustomParameters; -- (void)setPrimitiveCustomParameters:(nullable NSData*)value; - -- (nullable NSDate*)primitiveDateSend; -- (void)setPrimitiveDateSend:(nullable NSDate*)value; - -- (nullable NSNumber*)primitiveDelayed; -- (void)setPrimitiveDelayed:(nullable NSNumber*)value; - -- (BOOL)primitiveDelayedValue; -- (void)setPrimitiveDelayedValue:(BOOL)value_; - -- (nullable NSData*)primitiveDeliveredIDs; -- (void)setPrimitiveDeliveredIDs:(nullable NSData*)value; - -- (nullable NSString*)primitiveDialogID; -- (void)setPrimitiveDialogID:(nullable NSString*)value; - -- (nullable NSString*)primitiveMessageID; -- (void)setPrimitiveMessageID:(nullable NSString*)value; - -- (nullable NSData*)primitiveReadIDs; -- (void)setPrimitiveReadIDs:(nullable NSData*)value; - -- (nullable NSNumber*)primitiveRecipientID; -- (void)setPrimitiveRecipientID:(nullable NSNumber*)value; - -- (int32_t)primitiveRecipientIDValue; -- (void)setPrimitiveRecipientIDValue:(int32_t)value_; - -- (nullable NSNumber*)primitiveSenderID; -- (void)setPrimitiveSenderID:(nullable NSNumber*)value; - -- (int32_t)primitiveSenderIDValue; -- (void)setPrimitiveSenderIDValue:(int32_t)value_; - -- (nullable NSString*)primitiveSenderNick; -- (void)setPrimitiveSenderNick:(nullable NSString*)value; - -- (nullable NSString*)primitiveText; -- (void)setPrimitiveText:(nullable NSString*)value; - -- (nullable NSDate*)primitiveUpdateAt; -- (void)setPrimitiveUpdateAt:(nullable NSDate*)value; - -- (NSMutableSet*)primitiveAttachments; -- (void)setPrimitiveAttachments:(NSMutableSet*)value; - -- (CDDialog*)primitiveDialog; -- (void)setPrimitiveDialog:(CDDialog*)value; - -@end - -@interface CDMessageAttributes: NSObject -+ (NSString *)createAt; -+ (NSString *)customParameters; -+ (NSString *)dateSend; -+ (NSString *)delayed; -+ (NSString *)deliveredIDs; -+ (NSString *)dialogID; -+ (NSString *)messageID; -+ (NSString *)readIDs; -+ (NSString *)recipientID; -+ (NSString *)senderID; -+ (NSString *)senderNick; -+ (NSString *)text; -+ (NSString *)updateAt; -@end - -@interface CDMessageRelationships: NSObject -+ (NSString *)attachments; -+ (NSString *)dialog; -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDMessage.m b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDMessage.m deleted file mode 100644 index ffa91a873..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/EntriesMachine/_CDMessage.m +++ /dev/null @@ -1,196 +0,0 @@ -// DO NOT EDIT. This file is machine-generated and constantly overwritten. -// Make changes to CDMessage.m instead. - -#import "_CDMessage.h" - -@implementation CDMessageID -@end - -@implementation _CDMessage - -+ (instancetype)insertInManagedObjectContext:(NSManagedObjectContext *)moc_ { - NSParameterAssert(moc_); - return [NSEntityDescription insertNewObjectForEntityForName:@"CDMessage" inManagedObjectContext:moc_]; -} - -+ (NSString*)entityName { - return @"CDMessage"; -} - -+ (NSEntityDescription*)entityInManagedObjectContext:(NSManagedObjectContext*)moc_ { - NSParameterAssert(moc_); - return [NSEntityDescription entityForName:@"CDMessage" inManagedObjectContext:moc_]; -} - -- (CDMessageID*)objectID { - return (CDMessageID*)[super objectID]; -} - -+ (NSSet*)keyPathsForValuesAffectingValueForKey:(NSString*)key { - NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; - - if ([key isEqualToString:@"delayedValue"]) { - NSSet *affectingKey = [NSSet setWithObject:@"delayed"]; - keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey]; - return keyPaths; - } - if ([key isEqualToString:@"recipientIDValue"]) { - NSSet *affectingKey = [NSSet setWithObject:@"recipientID"]; - keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey]; - return keyPaths; - } - if ([key isEqualToString:@"senderIDValue"]) { - NSSet *affectingKey = [NSSet setWithObject:@"senderID"]; - keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKey]; - return keyPaths; - } - - return keyPaths; -} - -@dynamic createAt; - -@dynamic customParameters; - -@dynamic dateSend; - -@dynamic delayed; - -- (BOOL)delayedValue { - NSNumber *result = [self delayed]; - return [result boolValue]; -} - -- (void)setDelayedValue:(BOOL)value_ { - [self setDelayed:@(value_)]; -} - -- (BOOL)primitiveDelayedValue { - NSNumber *result = [self primitiveDelayed]; - return [result boolValue]; -} - -- (void)setPrimitiveDelayedValue:(BOOL)value_ { - [self setPrimitiveDelayed:@(value_)]; -} - -@dynamic deliveredIDs; - -@dynamic dialogID; - -@dynamic messageID; - -@dynamic readIDs; - -@dynamic recipientID; - -- (int32_t)recipientIDValue { - NSNumber *result = [self recipientID]; - return [result intValue]; -} - -- (void)setRecipientIDValue:(int32_t)value_ { - [self setRecipientID:@(value_)]; -} - -- (int32_t)primitiveRecipientIDValue { - NSNumber *result = [self primitiveRecipientID]; - return [result intValue]; -} - -- (void)setPrimitiveRecipientIDValue:(int32_t)value_ { - [self setPrimitiveRecipientID:@(value_)]; -} - -@dynamic senderID; - -- (int32_t)senderIDValue { - NSNumber *result = [self senderID]; - return [result intValue]; -} - -- (void)setSenderIDValue:(int32_t)value_ { - [self setSenderID:@(value_)]; -} - -- (int32_t)primitiveSenderIDValue { - NSNumber *result = [self primitiveSenderID]; - return [result intValue]; -} - -- (void)setPrimitiveSenderIDValue:(int32_t)value_ { - [self setPrimitiveSenderID:@(value_)]; -} - -@dynamic senderNick; - -@dynamic text; - -@dynamic updateAt; - -@dynamic attachments; - -- (NSMutableSet*)attachmentsSet { - [self willAccessValueForKey:@"attachments"]; - - NSMutableSet *result = (NSMutableSet*)[self mutableSetValueForKey:@"attachments"]; - - [self didAccessValueForKey:@"attachments"]; - return result; -} - -@dynamic dialog; - -@end - -@implementation CDMessageAttributes -+ (NSString *)createAt { - return @"createAt"; -} -+ (NSString *)customParameters { - return @"customParameters"; -} -+ (NSString *)dateSend { - return @"dateSend"; -} -+ (NSString *)delayed { - return @"delayed"; -} -+ (NSString *)deliveredIDs { - return @"deliveredIDs"; -} -+ (NSString *)dialogID { - return @"dialogID"; -} -+ (NSString *)messageID { - return @"messageID"; -} -+ (NSString *)readIDs { - return @"readIDs"; -} -+ (NSString *)recipientID { - return @"recipientID"; -} -+ (NSString *)senderID { - return @"senderID"; -} -+ (NSString *)senderNick { - return @"senderNick"; -} -+ (NSString *)text { - return @"text"; -} -+ (NSString *)updateAt { - return @"updateAt"; -} -@end - -@implementation CDMessageRelationships -+ (NSString *)attachments { - return @"attachments"; -} -+ (NSString *)dialog { - return @"dialog"; -} -@end - diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/QMChatServiceModel.xcdatamodeld/QMModel6.xcdatamodel/contents b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/QMChatServiceModel.xcdatamodeld/QMModel6.xcdatamodel/contents deleted file mode 100644 index 8790e7854..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/QMChatServiceModel.xcdatamodeld/QMModel6.xcdatamodel/contents +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/QMChatServiceModelIncludes.h b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/QMChatServiceModelIncludes.h deleted file mode 100644 index 0882bd278..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/CoreData/QMChatServiceModelIncludes.h +++ /dev/null @@ -1,3 +0,0 @@ -#import "CDAttachment.h" -#import "CDDialog.h" -#import "CDMessage.h" diff --git a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/QMChatCache.h b/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/QMChatCache.h deleted file mode 100644 index a3f53cb36..000000000 --- a/Pods/QMServicesDevelopment/QMChatCache/QMChatCache/QMChatCache.h +++ /dev/null @@ -1,282 +0,0 @@ -// -// QMChatCache.h -// QMServices -// -// Created by Andrey Ivanov on 06.11.14. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import "QMDBStorage.h" - -NS_ASSUME_NONNULL_BEGIN -@interface QMChatCache : QMDBStorage - -/** - * Messages limit in storage per dialog - */ -@property (nonatomic, assign) NSUInteger messagesLimitPerDialog; // default - NSNotFound (infinity) - -//MARK: - Singleton - -/** - * Chat cache singleton - * - * @return QMChatCache instance - */ - -@property (nonatomic, readonly, class) QMChatCache *instance; - -//MARK: - Configure store - -/** - * Setup QMChatCache stack with store name - * - * @param storeName Store name - */ -+ (void)setupDBWithStoreNamed:(NSString *)storeName; -/** - * Clean clean chat cache with store name - * - * @param name Store name - */ -+ (void)cleanDBWithStoreName:(NSString *)name; - -//MARK: - Dialogs -//MARK: - Insert / Update / Delete dialog operations - -/** - * Insert/Update dialog in cache - * - * @param dialog QBChatDialog instance - * @param completion Completion block is called after update or insert operation is completed - */ -- (void)insertOrUpdateDialog:(QBChatDialog *)dialog - completion:(nullable dispatch_block_t)completion; - -/** - * Insert/Update dialogs - * - * @param dialogs Array of QBChatDialog instances - * @param completion Completion block is called after update or insert operation is completed - */ -- (void)insertOrUpdateDialogs:(NSArray *)dialogs - completion:(nullable dispatch_block_t)completion; - -/** - * Delete dialog from cache - * - * @param dialogID Dialog Identifier - * @param completion Completion block is called after delete operation is completed - */ -- (void)deleteDialogWithID:(NSString *)dialogID - completion:(nullable dispatch_block_t)completion; - -/** - * Delete all dialogs - * - * @param completion Completion block is called after delete all dialogs operation is completed - */ -- (void)deleteAllDialogsWithCompletion:(nullable dispatch_block_t)completion; - -//MARK: Fetch dialog operations - -/** - Dialog by specific ID - - @param dialogID QBChatDialog identificator - @return Returns requested dialog or nil if not found - */ -- (nullable QBChatDialog *)dialogByID:(NSString *)dialogID; - -/** - Fetch All Dialogs (Fetch in Main Queue context) - - @return Returns an array of QBChatDialog instances - */ -- (NSArray *)allDialogs; - -/** - Fetch Dialogs - - Key for filtering: - id - lastMessageDate - lastMessageText - lastMessageUserID - name; - occupantsIDs - ocupantsIDs - photo - recipientID - roomJID - type - unreadMessagesCount - userID - - @param sortTerm Attribute name to sort by. - @param ascending `YES` if the attribute should be sorted ascending, `NO` for descending. - @param predicate Predicate to evaluate objects against - @return Returns an array of QBChatDialog instances - */ -- (NSArray *)dialogsSortedBy:(NSString *)sortTerm - ascending:(BOOL)ascending - withPredicate:(nullable NSPredicate *)predicate; - -/** - Dialog by specific ID - - @param dialogID QBChatDialog identifier - @param completion Returns requested dialog or nil if not found - */ -- (void)dialogByID:(NSString *)dialogID - completion:(void (^)(QBChatDialog *dialog))completion; - -/** - Fetch All Dialogs (Fetch in Private Queue context) - - @param completion Returns an array of QBChatDialog instances - */ -- (void)allDialogsWithCompletion:(nullable void(^)(NSArray * _Nullable dialogs))completion; -/** - * Asynchronous fetches all cached dialogs - * - * @param sortTerm Attribute name to sort by. - * @param ascending `YES` if the attribute should be sorted ascending, `NO` for descending. - * @param completion Completion block that is called after the fetch has completed. Returns an array of QBChatDialog instances - */ -- (void)dialogsSortedBy:(NSString *)sortTerm - ascending:(BOOL)ascending - completion:(nullable void(^)(NSArray * _Nullable dialogs))completion; -/** - * Fetch cached dialogs with predicate - * - * Key for filtering: - * id - lastMessageDate - lastMessageText - lastMessageUserID - name; - occupantsIDs - ocupantsIDs - photo - recipientID - roomJID - type - unreadMessagesCount - userID - * - * @param sortTerm Attribute name to sort by. - * @param ascending `YES` if the attribute should be sorted ascending, `NO` for descending. - * @param predicate Predicate to evaluate objects against - * @param completion Completion block that is called after the fetch has completed. Returns an array of QBChatDialog instances - */ -- (void)dialogsSortedBy:(NSString *)sortTerm - ascending:(BOOL)ascending - withPredicate:(nullable NSPredicate *)predicate - completion:(nullable void(^)(NSArray * _Nullable dialogs))completion; - -//MARK: - Messages -//MARK: - - -/** - * Asynchronous insert or update message in to persistent store - * - * @param message QBChatMessage instance - * @param dialogID Dialog identifier - * @param completion Completion block is called after update or insert operation is completed - */ -- (void)insertOrUpdateMessage:(QBChatMessage *)message - withDialogId:(NSString *)dialogID - completion:(nullable dispatch_block_t)completion; - -/** - * Asynchronous insert or update messages in to persistent store - * - * @param messages Array of QBChatMessage instances - * @param dialogID Dialog identifier - * @param completion Completion block is called after update or insert operation is completed - */ -- (void)insertOrUpdateMessages:(NSArray *)messages - withDialogId:(NSString *)dialogID - completion:(nullable dispatch_block_t)completion; - -/** - * Asynchronously deletes message - * - * @param message QBChatMessage instance - * @param completion Completion block that is called after the delete operation has completed. - */ -- (void)deleteMessage:(QBChatMessage *)message - completion:(nullable dispatch_block_t)completion; - -/** - Asynchronously deletes messages - - @param messages messages to delete - @param completion Completion block that is called after the delete operation has completed. - */ -- (void)deleteMessages:(NSArray *)messages - completion:(nullable dispatch_block_t)completion; - -/** - Asynchronously deletes messages for dialog ID - - @param dialogID dialog identifier - @param completion Completion block that is called after the delete operation has completed. - */ -- (void)deleteMessageWithDialogID:(NSString *)dialogID - completion:(nullable dispatch_block_t)completion; - -/** - Asynchronously deletes all messages - - @param completion Completion block that is called after the delete all messages operation has completed. - */ -- (void)deleteAllMessagesWithCompletion:(nullable dispatch_block_t)completion; - -//MARK: Fetch Messages operations - -/** - Synchronously fetches cached messages with dialog id and filtering with predicate - @param dialogId Dialog identifier - @param sortTerm Attribute name to sort by. - @param ascending `YES` if the attribute should be sorted ascending, `NO` for descending. - @return returns an array of QBChatMessages instances - */ -- (NSArray *)messagesWithDialogId:(NSString *)dialogId - sortedBy:(NSString *)sortTerm - ascending:(BOOL)ascending; - -/** - Asynchronously fetches cached messages with dialog id and filtering with predicate - - @param dialogId Dialog identifier - @param sortTerm Attribute name to sort by. - @param ascending `YES` if the attribute should be sorted ascending, `NO` for descending. - @param completion returns an array of QBChatMessages instances - */ -- (void)messagesWithDialogId:(NSString *)dialogId - sortedBy:(NSString *)sortTerm - ascending:(BOOL)ascending - completion:(void(^)(NSArray *messages))completion; -/** - Asynchronously fetches messages filtering with predicate - - @param predicate Predicate to evaluate objects against - @param sortTerm Attribute name to sort by. - @param ascending `YES` if the attribute should be sorted ascending, `NO` for descending. - @param completion Completion block that is called after the fetch has completed. Returns an array of QBChatMessage instances - */ -- (void)messagesWithPredicate:(NSPredicate *)predicate - sortedBy:(NSString *)sortTerm - ascending:(BOOL)ascending - completion:(void(^)(NSArray *messages))completion; - -- (void)truncateAll; - -- (void)truncateAll:(nullable dispatch_block_t)completion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomData.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomData.h deleted file mode 100644 index de44aad7e..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomData.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// QBChatAttachment+QMCustomData.h -// QMServices -// -// Created by Vitaliy Gorbachov on 7/5/16. -// Copyright (c) 2016 Quickblox. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QBChatAttachment (QMCustomData) - -/** - * Attachment custom data context, based on dictionary. - * - * @discussion Add or remove data, that you need to put into customData field of attachment. - * - * @note You should always call 'synchronize' method after context change. - */ -@property (strong, nonatomic, readonly) NSMutableDictionary *context; - -/** - * Synchronize context into attachment custom data field. - * - * @discussion Call this method after every context update. - * - * @note This will convert NSDictionary into JSON and put into QBChatAttachment customData field. - */ -- (void)synchronize; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomParameters.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomParameters.h deleted file mode 100644 index 0fe313186..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMCustomParameters.h +++ /dev/null @@ -1,91 +0,0 @@ -// -// QBChatAttachment+QMCustomParameters.h -// QMChatService -// -// Created by Vitaliy Gurkovsky on 3/26/17. -// -// - -#import - -typedef NS_ENUM(NSInteger, QMAttachmentType) { - - QMAttachmentContentTypeAudio = 1, - QMAttachmentContentTypeVideo, - QMAttachmentContentTypeImage, - QMAttachmentContentTypeCustom = 999 -}; - - -extern NSString *const kQMAttachmentTypeAudio; -extern NSString *const kQMAttachmentTypeImage; -extern NSString *const kQMAttachmentTypeVideo; -extern NSString *const kQMAttachmentTypeLocation; - - -@interface QBChatAttachment (QMCustomParameters) - -@property (assign, nonatomic) QMAttachmentType attachmentType; - -/** - * The URL that identifies locally saved attachment resource. - */ -@property (copy, nonatomic) NSURL *localFileURL; - -/** - * Determinates attachment's content type(MIME) - * https://en.wikipedia.org/wiki/Media_type - */ -@property (copy, nonatomic) NSString *contentType; - -/** - * Determinates attachment's file extension. 'Content type' should be specified. - */ -@property (nonatomic, readonly) NSString *fileExtension; - - -/** - * Determinates attachment's core type identifier. 'Content type' should be specified. - * @see UTCoreTypes.h. - */ -@property (nonatomic, readonly) NSString *typeIdentifier; - -/** - * Image of attachment (for video/image). - */ -@property (strong, nonatomic) UIImage *image; - -/** - * Width of attachment (for video/image). - */ -@property (nonatomic, assign) NSInteger width; - -/** - * Height of attachment (for video/image). - */ -@property (nonatomic, assign) NSInteger height; - -/** - * Duration in seconds (for video/audio). - */ -@property (nonatomic, assign) NSInteger duration; - -/** - * Size of attachment in bytes. - */ -@property (nonatomic, assign) NSInteger size; - -/** - * Attachment has all needed values - */ -@property (nonatomic, assign, getter=isPrepared, readonly) BOOL prepared; - -/** - * The NSData instance that identifies attachment resource. - */ -@property (nonatomic, copy) NSData *fileData; - -- (NSURL *)remoteURLWithToken:(BOOL)withToken; -- (NSURL *)remoteURL; - -@end diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMFactory.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMFactory.h deleted file mode 100644 index 770f44538..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatAttachment+QMFactory.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// QBChatAttachment+QMFactory.h -// QMChatService -// -// Created by Vitaliy Gurkovsky on 3/26/17. -// -// - -#import -#import "QBChatAttachment+QMCustomParameters.h" -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QBChatAttachment (QMFactory) - -- (instancetype)initWithName:(NSString *)name - fileURL:(nullable NSURL *)fileURL - contentType:(NSString *)contentType - attachmentType:(NSString *)type; - -+ (instancetype)videoAttachmentWithFileURL:(NSURL *)fileURL; -+ (instancetype)audioAttachmentWithFileURL:(NSURL *)fileURL; -+ (instancetype)imageAttachmentWithImage:(UIImage *)image; -+ (instancetype)locationAttachmentWithCoordinate:(CLLocationCoordinate2D)locationCoordinate; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatMessage+QMCustomParameters.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatMessage+QMCustomParameters.h deleted file mode 100644 index b445fb69c..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/Categories/QBChatMessage+QMCustomParameters.h +++ /dev/null @@ -1,104 +0,0 @@ -// -// QBChatAbstractMessage+QMCustomParameters.h -// QMServices -// -// Created by Andrey Ivanov on 24.07.14. -// Copyright (c) 2015 Quickblox. All rights reserved. -// - -#import "QMChatTypes.h" -#import "QBChatAttachment+QMCustomParameters.h" -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QBChatMessage (QMCustomParameters) - -/** - * Message - */ -@property (strong, nonatomic, nullable) NSString *saveToHistory; -@property (assign, nonatomic) QMMessageType messageType; -@property (strong, nonatomic, nullable) NSString *chatMessageID; -@property (assign, nonatomic) BOOL messageDeliveryStatus; -@property (assign, nonatomic) QMMessageAttachmentStatus attachmentStatus; -@property (assign, nonatomic) CLLocationCoordinate2D locationCoordinate; - - -/** - * Dialog - */ -@property (strong, nonatomic, readonly, nullable) QBChatDialog *dialog; -@property (assign, nonatomic) QMDialogUpdateType dialogUpdateType; -@property (strong, nonatomic, nullable) NSArray *currentOccupantsIDs; -@property (strong, nonatomic, nullable) NSArray *addedOccupantsIDs; -@property (strong, nonatomic, nullable) NSArray *deletedOccupantsIDs; -@property (strong, nonatomic, nullable) NSString *dialogName; -@property (strong, nonatomic, nullable) NSString *dialogPhoto; -@property (strong, nonatomic, nullable) NSDate *dialogUpdatedAt; - -/** - * Save values from QBChatDialog to message custom parameters - * - * @param dialog QBChatDialog that will be saved - */ -- (void)updateCustomParametersWithDialog:(QBChatDialog *)dialog; - -/** - * This method is used to determine if the message data item contains text or media. - * If this method returns `YES`, an instance of `QMChatViewController` will ignore - * the `text` method of this protocol when dequeuing a `QMChatCollectionViewCell` - * and only call the `media` method. - * - * Similarly, if this method returns `NO` then the `media` method will be ignored and - * and only the `text` method will be called. - * - * @return A boolean value specifying whether or not this is a media message or a text message. - * Return `YES` if this item is a media message, and `NO` if it is a text message. - */ -- (BOOL)isMediaMessage; - -/** - * This method is used to determine if the message data item is notification. - * - * @return A boolean value specifying whether or not this is a notification message. - * Return `YES` if this item is a notification message, and `NO` if it is a text message. - */ -- (BOOL)isNotificationMessage; - -/** - * This method is used to determine if the message data item is location. - * - * @return A boolean value specifying whether or not this is a location message. - * Return `YES` if this item is a location message, and `NO` if it is a text message. - */ -- (BOOL)isLocationMessage; - -/** - * This method is used to determine if the message data item is audio attachment. - * - * @return A boolean value specifying whether or not this is a message with audio attachment. - * Return `YES` if this item is a audio attachment, and `NO` if it is a text message. - */ -- (BOOL)isAudioAttachment; - -/** - * This method is used to determine if the message data item is video attachment. - * - * @return A boolean value specifying whether or not this is a message with video attachment. - * Return `YES` if this item is a video attachment, and `NO` if it is a text message. - */ -- (BOOL)isVideoAttachment; - -/** - * This method is used to determine if the message data item is image attachment. - * - * @return A boolean value specifying whether or not this is a message with image attachment. - * Return `YES` if this item is a image attachment, and `NO` if it is a text message. - */ -- (BOOL)isImageAttachment; - - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAssetLoader.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAssetLoader.h deleted file mode 100644 index 03f4f98c3..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAssetLoader.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// QMAssetLoader.h -// -// -// Created by Vitaliy Gurkovsky on 2/26/17. -// -// - -#import -#import "QMAsynchronousOperation.h" -#import "QBChatAttachment+QMCustomParameters.h" - -NS_ASSUME_NONNULL_BEGIN - -typedef void(^QMAssetLoaderCompletionBlock)(NSTimeInterval duration, - CGSize size, - UIImage * __nullable image, - NSError *__nullable error); - -typedef NS_OPTIONS(NSInteger, QMAssetLoaderKeyOptions) { - QMAssetLoaderKeyTracks = 1 << 0, - QMAssetLoaderKeyDuration = 1 << 1, - QMAssetLoaderKeyPlayable = 1 << 2, - QMAssetLoaderKeyImage = 1 << 3 -}; - - -@interface QMAssetOperation : QMAsynchronousOperation - - -- (instancetype)initWithID:(NSString *)operationID - URL:(NSURL *)assetURL - attachmentType:(QMAttachmentType)type - timeOut:(NSTimeInterval)timeInterval - options:(QMAssetLoaderKeyOptions)options - completionBlock:(QMAssetLoaderCompletionBlock)completion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAttachmentAssetService.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAttachmentAssetService.h deleted file mode 100644 index df004ffd6..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentAssetService/QMAttachmentAssetService.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// QMAttachmentAssetService.h -// QMChatService -// -// Created by Vitaliy Gurkovsky on 2/22/17. -// -// - -#import - -#import "QMMediaBlocks.h" -#import "QMCancellableService.h" - -NS_ASSUME_NONNULL_BEGIN -@interface QMAttachmentAssetService : NSObject - -/** - Loads asset from attachment's local file or remote URL. - - @param attachment The 'QBChatAttachment' instance. - @param messageID The message ID that contains attachment. - @param completion The block to be invoked when the loading succeeds, fails, or is cancelled. - */ -- (void)loadAssetForAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - completion:(QMAttachmentAssetLoaderCompletionBlock)completion; -@end -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMAttachmentContentService.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMAttachmentContentService.h deleted file mode 100644 index 4e48dec25..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMAttachmentContentService.h +++ /dev/null @@ -1,115 +0,0 @@ -// -// QMMediaWebService.h -// QMChatService -// -// Created by Vitaliy Gurkovsky on 6/14/17. -// - -#import -#import "QMMediaUploadService.h" -#import "QMMediaDownloadService.h" - -@protocol QMAttachmentContentServiceDelegate; - -NS_ASSUME_NONNULL_BEGIN - -@interface QMAttachmentContentService : NSObject - -/** - The chat attachment content service delegate - */ -@property (weak, nonatomic) id delegate; - -/** - Indicates whether the attachment is downloading. - - @param messageID The message ID that contains attachment. - @return YES if the attachment is downloading, otherwise NO. - */ -- (BOOL)isDownloadingMessageWithID:(NSString *)messageID; - -/** - Indicates whether the attachment is uploading. - - @param messageID The message ID that contains attachment. - @return YES if the attachment is uploading, otherwise NO. - */ -- (BOOL)isUploadingMessageWithID:(NSString *)messageID; - -/** - Downloads the attachment with the file URL. - - @param attachmentID The 'QBChatAttachment' instance ID. - @param message The message that contains attachment. - @param progressBlock A block called repeatedly while the attachment is downloading. - @param completion The block to be invoked when the loading succeeds, fails, or is cancelled. - */ -- (void)downloadAttachmentWithID:(NSString *)attachmentID - message:(QBChatMessage *)message - progressBlock:(QMAttachmentProgressBlock)progressBlock - completionBlock:(void(^)(QMDownloadOperation *downloadOperation))completion; - -/** - Uploads the attachment with the data. - - @param attachment The 'QBChatAttachment' instance. - @param messageID The message ID that contains attachment. - @param data The data representation of the attachment. - @param progressBlock The block called repeatedly while the attachment is uploading. - @param completion The block to be invoked when the loading succeeds, fails, or is cancelled. - */ -- (void)uploadAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - withData:(NSData *)data - progressBlock:(_Nullable QMAttachmentProgressBlock)progressBlock - completionBlock:(void(^)(QMUploadOperation *downloadOperation))completion; - - -/** - Uploads the attachment with the file URL. - - @param attachment The 'QBChatAttachment' instance. - @param messageID The message ID that contains attachment. - @param fileURL The URL of the attachment data on disk. - @param progressBlock The block called repeatedly while the attachment is uploading. - @param completion The block to be invoked when the loading succeeds, fails, or is cancelled. - */ -- (void)uploadAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - withFileURL:(NSURL *)fileURL - progressBlock:(_Nullable QMAttachmentProgressBlock)progressBlock - completionBlock:(void(^)(QMUploadOperation *downloadOperation))completion; - -/** - Returns the progress for message ID. - - @param messageID The message ID that contains attachment. - */ -- (CGFloat)progressForMessageWithID:(NSString *)messageID; - -/** - Cancels queued or executing download operations. - */ -- (void)cancelDownloadOperations; - -@end - -@protocol QMAttachmentContentServiceDelegate - -@optional - -/** - Asks the delegate if the content service should download the attachment. - - @param contentService The 'QMAttachmentContentService' instance. - @param attachment The 'QBChatAttachment' instance. - @param messageID The message ID that contains attachment. - @return YES if the content service should download the attachment; otherwise, NO. - */ -- (BOOL)attachmentContentService:(QMAttachmentContentService *)contentService - shouldDownloadAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadService.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadService.h deleted file mode 100644 index 0f690e9f2..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadService.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// QMMediaDownloadService.h -// QMMediaKit -// -// Created by Vitaliy Gurkovsky on 2/7/17. -// Copyright © 2017 quickblox. All rights reserved. -// - -#import -#import "QMMediaDownloadServiceDelegate.h" -#import "QMCancellableService.h" -#import "QMMediaBlocks.h" - -#import "QMAsynchronousOperation.h" - - -@interface QMDownloadOperation : QMAsynchronousBlockOperation - -@property (nonatomic, strong) QBRequest *request; -@property (nonatomic, strong) NSError *error; -@property (nonatomic, strong) NSData *data; - -@end - -@interface QMMediaDownloadService : NSObject - -- (BOOL)isDownloadingMessageWithID:(NSString *)messageID; - -- (void)downloadAttachmentWithID:(NSString *)attachmentID - messageID:(NSString *)messageID - progressBlock:(QMAttachmentProgressBlock)progressBlock - completionBlock:(void(^)(QMDownloadOperation *downloadOperation))completion; - -@end diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadServiceDelegates/QMMediaDownloadServiceDelegate.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadServiceDelegates/QMMediaDownloadServiceDelegate.h deleted file mode 100644 index e67091e69..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaDownloadSevice/QMMediaDownloadServiceDelegates/QMMediaDownloadServiceDelegate.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// QMMediaDownloadServiceDelegate.h -// QMMediaKit -// -// Created by Vitaliy Gurkovsky on 2/7/17. -// Copyright © 2017 quickblox. All rights reserved. -// - -#import - - - - - diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaUploadService/QMMediaUploadService.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaUploadService/QMMediaUploadService.h deleted file mode 100644 index 723762f3a..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentContentService/QMMediaUploadService/QMMediaUploadService.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// QMMediaUploadService.h -// QMMediaKit -// -// Created by Vitaliy Gurkovsky on 2/9/17. -// Copyright © 2017 quickblox. All rights reserved. -// - -#import -#import "QMMediaBlocks.h" -#import "QMAsynchronousOperation.h" -#import "QMCancellableService.h" - - -NS_ASSUME_NONNULL_BEGIN - -@interface QMUploadOperation : QMAsynchronousBlockOperation - -@property (nonatomic, strong) NSError *error; -@property (nonatomic, copy) NSString *attachmentID; - -@end - -@interface QMMediaUploadService : NSObject - -+ (BFTask *)taskUploadAttachment:(QBChatAttachment *)attachment - withData:(NSData *)data - progressBlock:(_Nullable QMAttachmentProgressBlock)progressBlock - cancellationToken:(BFCancellationToken *)cancellationToken; - -+ (BFTask *)taskUploadAttachment:(QBChatAttachment *)attachment - withFileURL:(NSURL *)fileURL - progressBlock:(_Nullable QMAttachmentProgressBlock)progressBlock - cancellationToken:(BFCancellationToken *)cancellationToken; - - -- (void)uploadAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - withData:(NSData *)data - progressBlock:(_Nullable QMAttachmentProgressBlock)progressBlock - completionBlock:(void(^)(QMUploadOperation *downloadOperation))completion; - - -- (void)uploadAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - withFileURL:(NSURL *)fileURL - progressBlock:(_Nullable QMAttachmentProgressBlock)progressBlock - completionBlock:(void(^)(QMUploadOperation *downloadOperation))completion; - -- (BOOL)isUploadingMessageWithID:(NSString *)messageID; - -@end -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreService.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreService.h deleted file mode 100644 index a7b34978d..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreService.h +++ /dev/null @@ -1,200 +0,0 @@ -// -// QMMediaStoreService.h -// QMMediaKit -// -// Created by Vitaliy Gurkovsky on 2/7/17. -// Copyright © 2017 quickblox. All rights reserved. -// - -#import -#import "QMAttachmentStoreServiceDelegate.h" -#import "QMAttachmentsMemoryStorage.h" -#import "QMCancellableService.h" - -/** - The options for the cache types for attachment. Uses for saving to cache. - */ -typedef NS_OPTIONS(NSInteger, QMAttachmentCacheType) { - /** - * Memory cache. QMAttachmentStoreService should save the attachment to the memory cache. - */ - QMAttachmentCacheTypeMemory = 1 << 0, - - /** - * Disck cache. QMAttachmentStoreService should save the attachment to the disck cache. - */ - QMAttachmentCacheTypeDisc = 1 << 1 -}; - -NS_ASSUME_NONNULL_BEGIN - -@interface QMAttachmentStoreService : NSObject - -/** - The quality of the resulting JPEG image, expressed as a value from 0.0 to 1.0. The value 0.0 represents the maximum compression (or lowest quality) while the value 1.0 represents the least compression (or best quality). Default value - 1.0. - */ -@property (nonatomic) CGFloat jpegCompressionQuality; - -/** - Memory storage for attachments. - */ -@property (strong, nonatomic, readonly) QMAttachmentsMemoryStorage *attachmentsMemoryStorage; - -/** - Attachment store service delegate - */ -@property (nonatomic, weak, nullable) id storeDelegate; - -/** - Initializes an `QMAttachmentStoreService` object with the specified ''. - - @param delegate The instance that confirms @. - @return The newly-initialized 'QMAttachmentStoreService'. - */ -- (instancetype)initWithDelegate:(id )delegate; - -/** - Updates saved 'QBChatAttachment' instance in cache. - - @param attachment 'QBChatAttachment' instance. - @param messageID The message ID that contains attachment. - @param dialogID The dialog ID. - */ -- (void)updateAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - dialogID:(NSString *)dialogID; - -/** - Gets cached image from attachment. - - @param attachment 'QBChatAttachment' instance. - @param messageID The message ID that contains attachment. - @param dialogID The dialog ID. - @param completion The block with the cached image. - */ -- (void)cachedImageForAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - dialogID:(NSString *)dialogID - completion:(void(^)(UIImage * _Nullable image))completion; - -/** - Gets `NSData` representation for provided image. - - @param image 'UIImage' instance. - @return `NSData` instance. - */ -- (NSData *)dataForImage:(UIImage *)image; - -/** - Gets cached data and file URL for attachment. - - @param attachment 'QBChatAttachment' instance. - @param messageID The message ID that contains attachment. - @param dialogID The dialog ID. - @param completion If the attachment was founded in the cache, the block will be with fileURL and data parameters set. - * - */ -- (void)cachedDataForAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - dialogID:(NSString *)dialogID - completion:(void(^)(NSURL *_Nullable fileURL, NSData *_Nullable data))completion; - -/** - Stores attachment for provided cache type. - - @param attachment 'QBChatAttachment' instance. - @param data 'NSData' instance. If this parameter is nil the data will be taken from attachment's image or local file URL. - @param cacheType Type of the cache. - @param messageID The message ID that contains attachment. - @param dialogID The dialog ID. - @param completion The block to be invoked when finishes the storing with file URL. - */ -- (void)storeAttachment:(QBChatAttachment *)attachment - withData:(nullable NSData *)data - cacheType:(QMAttachmentCacheType)cacheType - messageID:(NSString *)messageID - dialogID:(NSString *)dialogID - completion:(void(^)(NSURL *_Nullable fileURL))completion; - -/** - Gets file URL for saved attachment. - - @param attachment The 'QBChatAttachment' instance. - @param messageID The message ID that contains attachment. - @param dialogID The dialog ID. - @return 'NSURL' instance. - */ -- (nullable NSURL *)fileURLForAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - dialogID:(NSString *)dialogID; - -/** - Gets the 'QBChatAttachment' - - @param attachmentID The attachment ID. - @param messageID The message ID that contains attachment. - @return 'QBChatAttachment' instance if exists. - */ -- (nullable QBChatAttachment *)cachedAttachmentWithID:(NSString *)attachmentID - forMessageID:(NSString *)messageID; - -/** - Gets size for provided dialog ID and message ID. - - @param messageID The message ID that contains attachment. - @param dialogID The dialog ID. - - @return Size - */ -- (NSUInteger)sizeForMessageWithID:(nullable NSString *)messageID - dialogID:(NSString *)dialogID; - - -/** - Clears all data related to attachments for specified dialogID and messages ID's array from provided cache type. - - @param cacheType Type of the cache. - @param completion The block to be invoked when finishes the cleaning. - */ -- (void)clearCacheForType:(QMAttachmentCacheType)cacheType - completion:(nullable dispatch_block_t)completion; - -/** - Clears all data related to attachments for specified dialogID from provided cache type. - - @param dialogID The dialog ID. - @param cacheType Type of the cache. - @param completion The block to be invoked when finishes the cleaning. - */ -- (void)clearCacheForDialogWithID:(NSString *)dialogID - cacheType:(QMAttachmentCacheType)cacheType - completion:(nullable dispatch_block_t)completion; - -/** - Clears all data related to attachments for specified dialogID and message ID from provided cache type. - - @param messageID The message ID that contains attachment. - @param dialogID The dialog ID. - @param cacheType Type of the cache. - @param completion The block to be invoked when finishes the cleaning. - */ -- (void)clearCacheForMessageWithID:(NSString *)messageID - dialogID:(NSString *)dialogID - cacheType:(QMAttachmentCacheType)cacheType - completion:(nullable dispatch_block_t)completion; - -/** - Clears all data related to attachments for specified dialogID and messages ID's array from provided cache type. - - @param messagesIDs An instance of NSArray, containing messageIDs. - @param dialogID The dialog ID. - @param cacheType Type of the cache. - @param completion The block to be invoked when finishes the cleaning. - */ -- (void)clearCacheForMessagesWithIDs:(NSArray *)messagesIDs - dialogID:(NSString *)dialogID - cacheType:(QMAttachmentCacheType)cacheType - completion:(nullable dispatch_block_t)completion; -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreServiceDelegate.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreServiceDelegate.h deleted file mode 100644 index a411a6b51..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentStoreService/QMAttachmentStoreServiceDelegate.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// QMMediaStoreServiceDelegate.h -// QMMediaKit -// -// Created by Vitaliy Gurkovsky on 2/7/17. -// Copyright © 2017 quickblox. All rights reserved. -// - -#import - -@class QBChatAttachment; -@class QMAttachmentStoreService; - -NS_ASSUME_NONNULL_BEGIN - -@protocol QMAttachmentStoreServiceDelegate - -@required - -- (void)storeService:(QMAttachmentStoreService *)storeService -didUpdateAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - dialogID:(NSString *)dialogID; - -- (void)storeService:(QMAttachmentStoreService *)storeService -didRemoveAttachment:(QBChatAttachment *)attachment - messageID:(NSString *)messageID - dialogID:(NSString *)dialogID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentsMemoryStorage/QMAttachmentsMemoryStorage.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentsMemoryStorage/QMAttachmentsMemoryStorage.h deleted file mode 100644 index fd02e9259..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMAttachmentsMemoryStorage/QMAttachmentsMemoryStorage.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// QMAttachmentsMemoryStorage.h -// Pods -// -// Created by Vitaliy Gurkovsky on 3/25/17. -// -// - -#import -#import -#import "QMMemoryStorageProtocol.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface QMAttachmentsMemoryStorage : NSObject - -- (void)addAttachment:(QBChatAttachment *)attachment - forMessageID:(NSString *)messageID; - -- (nullable QBChatAttachment *)attachmentWithID:(NSString *)attachmentID - fromMessageID:(NSString *)messageID; - -- (void)updateAttachment:(QBChatAttachment *)attachment - forMessageID:(NSString *)messageID; - -- (void)deleteAttachment:(QBChatAttachment *)attachment - forMessageID:(NSString *)messageID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMChatAttachmentService.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMChatAttachmentService.h deleted file mode 100644 index 0a3ddaf39..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMChatAttachmentService.h +++ /dev/null @@ -1,287 +0,0 @@ -// -// QMChatAttachmentService.h -// QMServices -// -// Created by Injoit on 7/1/15. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import "QMChatTypes.h" - -#import "QMAttachmentStoreService.h" -#import "QMAttachmentAssetService.h" -#import "QMAttachmentContentService.h" -#import "QMCancellableService.h" -#import "QMChatTypes.h" - -@class QMChatService; -@protocol QMChatAttachmentServiceDelegate; - -NS_ASSUME_NONNULL_BEGIN - -@interface QMAttachmentOperation : NSBlockOperation - -@property (copy, nonatomic) NSString *identifier; -@property QBChatAttachment *attachment; -@property NSError *error; - -@property (copy, nonatomic) dispatch_block_t cancelBlock; - -@end - -/** - * Chat attachment service - */ -@interface QMChatAttachmentService : NSObject - -/** - 'QMAttachmentStoreService' instance. - */ -@property (nonatomic, strong, readonly) QMAttachmentStoreService *storeService; - -/** - 'QMAttachmentContentService' instance. - */ -@property (nonatomic, strong, readonly) QMAttachmentContentService *contentService; - -/** - 'QMAttachmentAssetService' instance. - */ -@property (nonatomic, strong, readonly) QMAttachmentAssetService *assetService; - - -- (instancetype)init NS_UNAVAILABLE; -- (instancetype)new NS_UNAVAILABLE; - -/** - Initializes an `QMChatAttachmentService` object with the specified store, content and asset service. - - @param storeService The `QMAttachmentStoreService` instance. - @param contentService The `QMAttachmentContentService` instance. - @param assetService The `QMAttachmentAssetService` instance. - - @return The newly-initialized QMChatAttachmentService. - */ -- (instancetype)initWithStoreService:(QMAttachmentStoreService *)storeService - contentService:(QMAttachmentContentService *)contentService - assetService:(QMAttachmentAssetService *)assetService NS_DESIGNATED_INITIALIZER; - -/** - Returns the current status of the attachment message. - - @param message QBChatMessage instance, that contains attachment. - @return The current status of the attachment message. - */ -- (QMMessageAttachmentStatus)attachmentStatusForMessage:(QBChatMessage *)message; - -/** - Gets the attachment from the attachment message. - - @param attachmentID The ID of the 'QBChatAttachment' instance. - @param message QBChatMessage instance, that contains attachment. - @param progressBlock Block with changed value of progress. Min 0.0, max 1.0. - @param completionBlock Completion block with 'QMAttachmentOperation' instance. - */ -- (void)attachmentWithID:(NSString *)attachmentID - message:(QBChatMessage *)message - progressBlock:(nullable QMAttachmentProgressBlock)progressBlock - completion:(nullable void(^)(QMAttachmentOperation *op))completionBlock; -/** - Indicates whether the attachment, or its URL, can be used to play. - - @abstract Returns YES if attachment is playable. - - @param attachment 'QBChatAttachment' instance - @param message 'QBChatMessage' instance, that contains attachment. - @return YES or NO. - */ -- (BOOL)attachmentIsReadyToPlay:(QBChatAttachment *)attachment - message:(QBChatMessage *)message; - -/** - Cancels queued or executing operations. - - @param messageID The message ID that contains attachment. - */ -- (void)cancelOperationsWithMessageID:(NSString *)messageID; - -/** - Removes all data related to attachments from the disk and the cache. - */ -- (void)removeAllMediaFiles; - -/** - Removes all data related to attachments for the specified dialog with ID from the disk and the cache. - - @param dialogID The dialog ID. - */ -- (void)removeMediaFilesForDialogWithID:(NSString *)dialogID; - -/** - Removes all data related to attachments for the specified dialogID and messageID from the disk and cache. - - @param messageID The message ID that contains attachment. - @param dialogID The dialog ID. - */ -- (void)removeMediaFilesForMessageWithID:(NSString *)messageID - dialogID:(NSString *)dialogID; - - -/** - Removes all data related to attachments for specified dialogID and messages ID's array from disk and cache. - - @param messagesIDs An instance of NSArray, containing messageIDs. - @param dialogID The dialog ID. - */ -- (void)removeMediaFilesForMessagesWithID:(NSArray *)messagesIDs - dialogID:(NSString *)dialogID; - -/** - Directs service to load the values for asset from attachment. - - @param attachment 'QBChatAttachment' instance. - @param message QBChatMessage instance, that contains attachment. - @param completion The block to be invoked when the loading succeeds, fails, or is cancelled. - */ -- (void)prepareAttachment:(QBChatAttachment *)attachment - message:(QBChatMessage *)message - completion:(QMAttachmentAssetLoaderCompletionBlock)completion; - -/** - * Adds delegate (Multicast) - * - * @param delegate An instance that confirmes QMChatAttachmentServiceDelegate protocol - */ -- (void)addDelegate:(id )delegate; - -/** - * Removes delegate from observed list - * - * @param delegate An instance that confirmes QMChatAttachmentServiceDelegate protocol - */ -- (void)removeDelegate:(id )delegate; - -/** - * Chat attachment service delegate - * - * @warning *Deprecated in QMServices 0.4.7:* Use 'addDelegate:' instead. - */ -@property (nonatomic, weak, nullable) id delegate -DEPRECATED_MSG_ATTRIBUTE("Deprecated in 0.4.7. Use 'addDelegate:' instead."); - -/** - * Uploads and sends attachment message to dialog. - * - * @param message QBChatMessage instance, that contains attachment. - * @param dialog QBChatDialog instance. - * @param chatService QMChatService instance. - * @param image Attachment image. - * @param completion Upload message result. - * - * @warning *Deprecated in QMServices 0.5: * Use 'uploadAndSendAttachmentMessage:toDialog:withChatService:attachment:completion:' instead. - */ -- (void)uploadAndSendAttachmentMessage:(QBChatMessage *)message - toDialog:(QBChatDialog *)dialog - withChatService:(QMChatService *)chatService - withAttachedImage:(UIImage *)image - completion:(nullable QBChatCompletionBlock)completion DEPRECATED_MSG_ATTRIBUTE("Deprecated in 0.5 Use 'uploadAndSendAttachmentMessage:toDialog:withChatService:attachment:completion:' instead."); - -/** - * Gets the image from the attachment message. - * - * @param attachmentMessage Message with attachment. - * @param completion Fetched image or error if failed. - */ -- (void)imageForAttachmentMessage:(QBChatMessage *)attachmentMessage - completion:(void(^)(NSError * _Nullable error, UIImage * _Nullable image))completion; - -/** - * Gets local image for attachment message. - * - * @param attachmentMessage Message with attachment. - * @param completion Local image or nil if no image. - */ -- (void)localImageForAttachmentMessage:(QBChatMessage *)attachmentMessage - completion:(void(^)(UIImage * _Nullable image))completion; - -/** - * Uploads and sends attachment message to dialog. - * - * @param message QBChatMessage instance - * @param dialog QBChatDialog instance - * @param chatService QMChatService instance - * @param attachment QBChatAttachment instance - * @param completion Send message result - */ - -- (void)uploadAndSendAttachmentMessage:(QBChatMessage *)message - toDialog:(QBChatDialog *)dialog - withChatService:(QMChatService *)chatService - attachment:(QBChatAttachment *)attachment - completion:(nullable QBChatCompletionBlock)completion; -@end - -@protocol QMChatAttachmentServiceDelegate - -@optional - -/** - * Is called when attachment service did change current state of the attachment. - * Please see QMMessageAttachmentState for additional info. - * - * @param chatAttachmentService The 'QMChatAttachmentService' instance. - * @param status The current status of the attachment messsage. - * @param message QBChatMessage instance, that contains attachment. - */ -- (void)chatAttachmentService:(QMChatAttachmentService *)chatAttachmentService - didChangeAttachmentStatus:(QMMessageAttachmentStatus)status - forMessage:(QBChatMessage *)message; - -/** - * Is called when chat attachment service did change loading progress for some attachment. - * Used for display loading progress. - * - * @param chatAttachmentService instance QMChatAttachmentService - * @param progress changed value of progress min 0.0, max 1.0 - * @param attachment loaded QBChatAttachment - * - * @warning *Deprecated in QMServices 0.5:* Use 'chatAttachmentService:didChangeLoadingProgress:forMessage:attachment:' instead. - */ - -- (void)chatAttachmentService:(QMChatAttachmentService *)chatAttachmentService - didChangeLoadingProgress:(CGFloat)progress - forChatAttachment:(QBChatAttachment *)attachment - -DEPRECATED_MSG_ATTRIBUTE("Deprecated in 0.5 Use 'chatAttachmentService:didChangeLoadingProgress:forMessage:attachment:' instead."); - -/** - * Is called when chat attachment service did change Uploading progress for attachment in message. - * Used for display loading progress. - * - * @param chatAttachmentService QMChatAttachmentService instance. - * @param progress Changed value of progress. Min 0.0, max 1.0. - * @param message QBChatMessage instance, that contains attachment. - */ -- (void)chatAttachmentService:(QMChatAttachmentService *)chatAttachmentService - didChangeUploadingProgress:(CGFloat)progress - forMessage:(QBChatMessage *)message; - -/** - * Is called when chat attachment service did change downloading progress for some attachment. - * Used for display downloading progress. - * - * @param chatAttachmentService 'QMChatAttachmentService' instance. - * @param progress Changed value of progress. Min 0.0, max 1.0 - * @param message QBChatMessage instance, that contains attachment. - * @param attachment 'QBChatAttachment' instance that uploading. - */ -- (void)chatAttachmentService:(QMChatAttachmentService *)chatAttachmentService - didChangeLoadingProgress:(CGFloat)progress - forMessage:(QBChatMessage *)message - attachment:(QBChatAttachment *)attachment; - - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMTimeOut/QMTimeOut.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMTimeOut/QMTimeOut.h deleted file mode 100644 index 129f4f3a6..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMAttachmentService/QMTimeOut/QMTimeOut.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// QMTimeOut.h -// Q-municate -// -// Created by Vitaliy Gurkovsky on 8/4/17. -// Copyright © 2017 Quickblox. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QMTimeOut : NSObject - -@property (nonatomic, assign, readonly) NSTimeInterval timeInterval; - -- (instancetype)initWithTimeInterval:(NSTimeInterval)timeInterval - queue:(nullable dispatch_queue_t)queue; - -- (void)startWithFireBlock:(dispatch_block_t)fireBlock; -- (void)cancelTimeout; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMChatConstants.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMChatConstants.h deleted file mode 100644 index 0d40fbb5e..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMChatConstants.h +++ /dev/null @@ -1,10 +0,0 @@ -// -// QMChatConstants.h -// QMServices -// -// Created by Injoit on 7/6/15. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -static const NSUInteger kQMMessagesLimitPerDialog = 100; -static const NSUInteger kQMChatMessagesPerPage = 100; diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMChatService.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMChatService.h deleted file mode 100644 index c686b990a..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMChatService.h +++ /dev/null @@ -1,1213 +0,0 @@ -// -// QMChatService.h -// QMServices -// -// Created by Andrey Ivanov on 02.07.14. -// Copyright (c) 2015 Quickblox. All rights reserved. -// - -#import -#import "QMBaseService.h" -#import "QMDialogsMemoryStorage.h" -#import "QMMessagesMemoryStorage.h" -#import "QMChatAttachmentService.h" -#import "QMChatTypes.h" -#import "QMChatConstants.h" -#import "QMDeferredQueueManager.h" - -@protocol QMChatServiceDelegate; -@protocol QMChatServiceCacheDataSource; -@protocol QMChatConnectionDelegate; - -NS_ASSUME_NONNULL_BEGIN - -typedef void(^QMCacheCollection)(NSArray * _Nullable collection); -/** - * Chat dialog service - */ -@interface QMChatService : QMBaseService - -/** - * Determines whether auto join for group dialogs is enabled or not. - * Default value is YES. - * - * @discussion Disable auto join if you want to handle group chat dialogs joining manually - * or you are using our Enterprise feature to manage group chat dialogs without join being required. - * By default QMServices will perform join to all existent group dialogs in cache after - * every chat connect/reconnect and every chat dialog receive/update. - */ -@property (assign, nonatomic, getter=isAutoJoinEnabled) BOOL enableAutoJoin; - -/** - * Chat messages per page with messages load methods - */ -@property (assign, nonatomic) NSUInteger chatMessagesPerPage; - -/** - * Dialogs datasoruce - */ -@property (strong, nonatomic, readonly) QMDialogsMemoryStorage *dialogsMemoryStorage; - -/** - * Messages datasource - */ -@property (strong, nonatomic, readonly) QMMessagesMemoryStorage *messagesMemoryStorage; - -/** - * Attachment Service - */ -@property (strong, nonatomic, readonly) QMChatAttachmentService *chatAttachmentService; - - -@property (strong, nonatomic, readonly) QMDeferredQueueManager *deferredQueueManager; - -/** - * Init chat service - * - * @param serviceManager delegate confirmed QMServiceManagerProtocol protocol - * @param cacheDataSource delegate confirmed QMChatServiceCacheDataSource - * - * @return Return QMChatService instance - */ -- (instancetype)initWithServiceManager:(id)serviceManager - cacheDataSource:(nullable id)cacheDataSource; -/** - * Add delegate (Multicast) - * - * @param delegate Instance confirmed QMChatServiceDelegate protocol - */ -- (void)addDelegate:(id)delegate; - -/** - * Remove delegate from observed list - * - * @param delegate Instance confirmed QMChatServiceDelegate protocol - */ -- (void)removeDelegate:(id)delegate; - -/** - * Connect to chat - * - * @param completion The block which informs whether a chat did connect or not. nil if no errors. - */ -- (void)connectWithCompletionBlock:(nullable QBChatCompletionBlock)completion; - -/** - * Disconnect from chat - * - * @param completion The block which informs whether a chat did disconnect or not. nil if no errors. - */ -- (void)disconnectWithCompletionBlock:(nullable QBChatCompletionBlock)completion; - -//MARK: - Group dialog join - -/** - * Joins user to group dialog and correctly updates cache. Please use this method instead of 'join' in QBChatDialog if you are using QMServices. - * - * @param dialog dialog to join - * @param completion completion block with failure error - */ -- (void)joinToGroupDialog:(QBChatDialog *)dialog completion:(nullable QBChatCompletionBlock)completion; - -//MARK: - Dialog history - -/** - * Retrieve chat dialogs - * - * @param extendedRequest Set of request parameters. http://quickblox.com/developers/SimpleSample-chat_users-ios#Filters - * @param completion Block with response dialogs instances - */ -- (void)allDialogsWithPageLimit:(NSUInteger)limit - extendedRequest:(nullable NSDictionary *)extendedRequest - iterationBlock:(nullable void(^)(QBResponse *response, NSArray * _Nullable dialogObjects, NSSet * _Nullable dialogsUsersIDs, BOOL *stop))iterationBlock - completion:(nullable void(^)(QBResponse *response))completion; - -//MARK: - Chat dialog creation - -/** - * Create p2p dialog - * - * @param opponent QBUUser opponent - * @param completion Block with response and created chat dialog instances - */ -- (void)createPrivateChatDialogWithOpponent:(QBUUser *)opponent - completion:(nullable void(^)(QBResponse *response, QBChatDialog * _Nullable createdDialog))completion; - -/** - * Create group dialog - * - * @param name Dialog name - * @param occupants QBUUser collection - * @param completion Block with response and created chat dialog instances - */ -- (void)createGroupChatDialogWithName:(nullable NSString *)name photo:(nullable NSString *)photo occupants:(NSArray *)occupants completion:(nullable void(^)(QBResponse *response, QBChatDialog * _Nullable createdDialog))completion; - -/** - * Create p2p dialog - * - * @param opponentID Opponent ID - * @param completion Block with response and created chat dialog instances - */ -- (void)createPrivateChatDialogWithOpponentID:(NSUInteger)opponentID - completion:(nullable void(^)(QBResponse *response, QBChatDialog * _Nullable createdDialog))completion; - -//MARK: - Edit dialog methods - -/** - * Change dialog name - * - * @param dialogName Dialog name - * @param chatDialog QBChatDialog instance - * @param completion Block with response and updated chat dialog instances - */ -- (void)changeDialogName:(NSString *)dialogName forChatDialog:(QBChatDialog *)chatDialog - completion:(nullable void(^)(QBResponse *response, QBChatDialog * _Nullable updatedDialog))completion; - -/** - * Change dialog avatar - * - * @param avatarPublicUrl avatar url - * @param chatDialog QBChatDialog instance - * @param completion Block with response and updated chat dialog instances - */ -- (void)changeDialogAvatar:(NSString *)avatarPublicUrl forChatDialog:(QBChatDialog *)chatDialog - completion:(nullable void(^)(QBResponse *response, QBChatDialog * _Nullable updatedDialog))completion; - -/** - * Join occupants - * - * @param ids Occupants ids - * @param chatDialog QBChatDialog instance - * @param completion Block with response and updated chat dialog instances - */ -- (void)joinOccupantsWithIDs:(NSArray *)ids toChatDialog:(QBChatDialog *)chatDialog - completion:(nullable void(^)(QBResponse *response, QBChatDialog * _Nullable updatedDialog))completion; - -/** - * Delete dialog by id on server and chat cache - * - * @param completion Block with response dialogs instances - */ -- (void)deleteDialogWithID:(NSString *)dialogId - completion:(nullable void(^)(QBResponse *response))completion; - -/** - * Loads dialogs specific to user from disc cache and puth them in memory storage. - * @warning This method MUST be called after the login. - * - * @param completion Completion block to handle ending of operation. - */ -- (void)loadCachedDialogsWithCompletion:(nullable dispatch_block_t)completion; - -//MARK: - System Messages - -/** - * Send system message to users about adding to dialog with dialog inside with text. - * - * @param chatDialog created dialog we notificate about - * @param usersIDs array of users id to send message - * @param text text to users - * @param completion completion block with failure error - */ -- (void)sendSystemMessageAboutAddingToDialog:(QBChatDialog *)chatDialog - toUsersIDs:(NSArray *)usersIDs - withText:(nullable NSString *)text - completion:(nullable QBChatCompletionBlock)completion; - -//MARK: - Notification messages - -/** - * Send message about accepting or rejecting contact requst. - * - * @param accept YES - accept, NO reject - * @param opponentID opponent ID - * @param completion completion block with failure error - */ -- (void)sendMessageAboutAcceptingContactRequest:(BOOL)accept - toOpponentID:(NSUInteger)opponentID - completion:(nullable QBChatCompletionBlock)completion; - -/** - * Sending notification message about adding occupants to specific dialog. - * - * @param occupantsIDs array of occupants that were added to a specific dialog - * @param chatDialog chat dialog to send notification message to - * @param notificationText notification message body (text) - * @param completion completion block with failure error - */ -- (void)sendNotificationMessageAboutAddingOccupants:(NSArray *)occupantsIDs - toDialog:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText - completion:(nullable QBChatCompletionBlock)completion; - -/** - * Sending notification message about leaving dialog. - * - * @param chatDialog chat dialog to send message to - * @param notificationText notification message body (text) - * @param completion completion block with failure error - */ -- (void)sendNotificationMessageAboutLeavingDialog:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText - completion:(nullable QBChatCompletionBlock)completion; - -/** - * Sending notification message about changing dialog photo. - * - * @param chatDialog chat dialog to send message to - * @param notificationText notification message body (text) - * @param completion completion block with failure error - */ -- (void)sendNotificationMessageAboutChangingDialogPhoto:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText - completion:(nullable QBChatCompletionBlock)completion; - -/** - * Sending notification message about changing dialog name. - * - * @param chatDialog chat dialog to send message to - * @param notificationText notification message body (text) - * @param completion completion block with failure error - */ -- (void)sendNotificationMessageAboutChangingDialogName:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText - completion:(nullable QBChatCompletionBlock)completion; - -//MARK: - Fetch messages - -/** - * Updating message in cache and memory storage. - * - * @param message message to update - */ -- (void)updateMessageLocally:(QBChatMessage *)message; - -/** - * Deleting message from cache and memory storage. - * - * @param message message to delete - */ -- (void)deleteMessageLocally:(QBChatMessage *)message; - -/** - * Deleting messages from cache and memory storage. - * - * @param messages messages to delete - * @param dialogID chat dialog identifier - */ -- (void)deleteMessagesLocally:(NSArray *)messages forDialogID:(NSString *)dialogID; - -/** - * Fetch messages with chat dialog id from the latest (newest) message in cache. - * - * @param chatDialogID Chat dialog id - * @param completion Block with response instance and array of chat messages if request succeded or nil if failed - */ -- (void)messagesWithChatDialogID:(NSString *)chatDialogID - completion:(nullable void(^)(QBResponse *response, NSArray * _Nullable messages))completion; - -/** - * Fetch messages with chat dialog id using custom extended request. - * - * @param chatDialogID Chat dialog id - * @param extendedRequest extended parameters - * @param completion Block with response instance and array of chat messages if request succeded or nil if failed - * - * @discussion Pass nil or empty dictionary into extendedRequest to load only newest messages from latest message in cache. - */ -- (void)messagesWithChatDialogID:(NSString *)chatDialogID - extendedRequest:(nullable NSDictionary *)extendedRequest - completion:(nullable void(^)(QBResponse *response, NSArray * _Nullable messages))completion; - -/** - * Fetch messages with chat dialog id using custom extended request. - * - * @param chatDialogID Chat dialog id - * @param iterationBlock iteration block (pagination handling) - * @param completion Block with response instance and array of chat messages that were already iterated in iteration block - */ -- (void)messagesWithChatDialogID:(NSString *)chatDialogID - iterationBlock:(nullable void(^)(QBResponse *response, NSArray * _Nullable messages, BOOL *stop))iterationBlock - completion:(nullable void(^)(QBResponse *response, NSArray * _Nullable messages))completion; - -/** - * Fetch messages with chat dialog id using custom extended request. - * - * @param chatDialogID Chat dialog id - * @param extendedRequest extended parameters - * @param iterationBlock iteration block (pagination handling) - * @param completion Block with response instance and array of chat messages that were already iterated in iteration block - * - * @discussion Pass nil or empty dictionary into extendedRequest to load only newest messages from latest message in cache. - */ -- (void)messagesWithChatDialogID:(NSString *)chatDialogID - extendedRequest:(nullable NSDictionary *)extendedRequest - iterationBlock:(nullable void(^)(QBResponse *response, NSArray * _Nullable messages, BOOL *stop))iterationBlock - completion:(nullable void(^)(QBResponse *response, NSArray * _Nullable messages))completion; -/** - * Loads messages that are older than oldest message in cache. - * - * @param chatDialogID Chat dialog identifier - * @param completion Block with response instance and array of chat messages if request succeded or nil if failed - */ -- (void)earlierMessagesWithChatDialogID:(NSString *)chatDialogID - completion:(nullable void(^)(QBResponse *response, NSArray * _Nullable messages))completion; -//MARK: - Fetch dialogs - -/** - * Fetch dialog with dialog id. - * - * @param dialogID Dialog identifier - * @param completion Block with dialog if request succeded or nil if failed - */ -- (void)fetchDialogWithID:(NSString *)dialogID completion:(nullable void (^)(QBChatDialog * _Nullable dialog))completion; - -/** - * Load dialog with dialog id from Quickblox and saving to memory storage and cache. - * - * @param dialogID Dialog identifier - * @param completion Block with dialog if request succeded or nil if failed - */ -- (void)loadDialogWithID:(NSString *)dialogID completion:(nullable void (^)(QBChatDialog * _Nullable loadedDialog))completion; - -/** - * Fetch dialog with last activity date from date - * - * @param date date to fetch dialogs from - * @param limit page limit - * @param iteration iteration block with dialogs for pages - * @param completion Block with response when fetching finished - */ -- (void)fetchDialogsUpdatedFromDate:(NSDate *)date - andPageLimit:(NSUInteger)limit - iterationBlock:(nullable void(^)(QBResponse *response, NSArray * _Nullable dialogObjects, NSSet * _Nullable dialogsUsersIDs, BOOL *stop))iteration - completionBlock:(nullable void (^)(QBResponse *response))completion; - -//MARK: Send message - -/** - * Send message with a specific message type to dialog with identifier. - * - * @param message QBChatMessage instance - * @param type QMMessageType type - * @param dialog QBChatDialog instance - * @param saveToHistory if YES - saves message to chat history - * @param saveToStorage if YES - saves to local storage - * @param completion completion block with failure error - * - * @discussion The purpose of this method is to have a proper way of sending messages - * with a different message type, which does not have their own methods (e.g. contact request). - */ -- (void)sendMessage:(QBChatMessage *)message - type:(QMMessageType)type - toDialog:(QBChatDialog *)dialog - saveToHistory:(BOOL)saveToHistory - saveToStorage:(BOOL)saveToStorage - completion:(nullable QBChatCompletionBlock)completion; - -/** - * Send message to dialog with identifier. - * - * @param message QBChatMessage instance - * @param dialogID dialog identifier - * @param saveToHistory if YES - saves message to chat history - * @param saveToStorage if YES - saves to local storage - * @param completion completion block with failure error - */ -- (void)sendMessage:(QBChatMessage *)message - toDialogID:(NSString *)dialogID - saveToHistory:(BOOL)saveToHistory - saveToStorage:(BOOL)saveToStorage - completion:(nullable QBChatCompletionBlock)completion; - -/** - * Send message to. - * - * @param message QBChatMessage instance - * @param dialog dialog instance to send message to - * @param saveToHistory if YES - saves message to chat history - * @param saveToStorage if YES - saves to local storage - * @param completion completion block with failure error - */ -- (void)sendMessage:(QBChatMessage *)message - toDialog:(QBChatDialog *)dialog - saveToHistory:(BOOL)saveToHistory - saveToStorage:(BOOL)saveToStorage - completion:(nullable QBChatCompletionBlock)completion; - -/** - * Send attachment message to dialog. - * - * @param attachmentMessage QBChatMessage instance with attachment - * @param dialog dialog instance to send message to - * @param image attachment image to upload - * @param completion completion block with failure error - */ -- (void)sendAttachmentMessage:(QBChatMessage *)attachmentMessage - toDialog:(QBChatDialog *)dialog - withAttachmentImage:(UIImage *)image - completion:(nullable QBChatCompletionBlock)completion; -/** - * Send attachment message to dialog. - * - * @param attachmentMessage QBChatMessage instance with attachment - * @param dialog dialog instance to send message to - * @param attachment QBChatAttachment instance to upload and send - * @param completion completion block with failure error - */ -- (void)sendAttachmentMessage:(QBChatMessage *)attachmentMessage - toDialog:(QBChatDialog *)dialog - withAttachment:(QBChatAttachment *)attachment - completion:(nullable QBChatCompletionBlock)completion; - -//MARK: - mark as delivered - -/** - * Mark message as delivered. - * - * @param message QBChatMessage instance to mark as delivered - * @param completion completion block with failure error - */ -- (void)markMessageAsDelivered:(QBChatMessage *)message completion:(nullable QBChatCompletionBlock)completion; - -/** - * Mark messages as delivered. - * - * @param messages array of QBChatMessage instances to mark as delivered - * @param completion completion block with failure error - */ -- (void)markMessagesAsDelivered:(NSArray *)messages completion:(nullable QBChatCompletionBlock)completion; - -//MARK: - read messages - -/** - * Sending read status for message and updating unreadMessageCount for dialog in cache - * - * @param message QBChatMessage instance to mark as read - * @param completion completion block with failure error - */ -- (void)readMessage:(QBChatMessage *)message completion:(nullable QBChatCompletionBlock)completion; - -/** - * Sending read status for messages and updating unreadMessageCount for dialog in cache - * - * @param messages Array of QBChatMessage instances to mark as read - * @param dialogID ID of dialog to update - * @param completion completion block with failure error - */ -- (void)readMessages:(NSArray *)messages forDialogID:(NSString *)dialogID completion:(nullable QBChatCompletionBlock)completion; - -//MARK:- QMLinkPreview - -//- (void)getLinkPreviewForMessage:(QBChatMessage *)message withCompletion:(QMLinkPreviewCompletionBlock)completion; -// -//- (QMLinkPreview *)linkPreviewForMessage:(QBChatMessage *)message; - -@end - -//MARK: - Bolts - -/** - * Bolts methods for QMChatService - */ -@interface QMChatService (Bolts) - -/** - * Connect to the chat using Bolts. - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)connect DEPRECATED_ATTRIBUTE; - -/** - * Connect to the chat using Bolts. - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)connectWithUserID:(NSUInteger)userID password:(NSString *)password; - -/** - * Disconnect from the chat using Bolts. - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)disconnect; - -/** - * Join group chat dialog. - * - * @param dialog group chat dialog to join - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)joinToGroupDialog:(QBChatDialog *)dialog; - -/** - * Retrieve chat dialogs using Bolts. - * - * @param extendedRequest Set of request parameters. http://quickblox.com/developers/SimpleSample-chat_users-ios#Filters - * @param iterationBlock block with dialog pagination - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)allDialogsWithPageLimit:(NSUInteger)limit - extendedRequest:(nullable NSDictionary *)extendedRequest - iterationBlock:(nullable void(^)(QBResponse *response, NSArray * _Nullable dialogObjects, NSSet * _Nullable dialogsUsersIDs, BOOL *stop))iterationBlock; - -/** - * Create private dialog with user if needed using Bolts. - * - * @param opponent opponent user to create private dialog with - * - * @return BFTask with created chat dialog - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)createPrivateChatDialogWithOpponent:(QBUUser *)opponent; - -/** - * Create group chat using Bolts. - * - * @param name group chat name - * @param photo group chatm photo url - * @param occupants array of QBUUser instances to add to chat - * - * @return BFTask with created chat dialog - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)createGroupChatDialogWithName:(nullable NSString *)name photo:(nullable NSString *)photo occupants:(NSArray *)occupants; - -/** - * Create private dialog if needed using Bolts. - * - * @param opponentID opponent user identificatior to create dialog with - * - * @return BFTask with created chat dialog - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)createPrivateChatDialogWithOpponentID:(NSUInteger)opponentID; - -/** - * Change dialog name using Bolts. - * - * @param dialogName new dialog name - * @param chatDialog chat dialog to update - * - * @return BFTask with updated dialog - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)changeDialogName:(NSString *)dialogName forChatDialog:(QBChatDialog *)chatDialog; - -/** - * Change dialog avatar using Bolts. - * - * @param avatarPublicUrl avatar url - * @param chatDialog chat dialog to update - * - * @return BFTask with updated dialog - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)changeDialogAvatar:(NSString *)avatarPublicUrl forChatDialog:(QBChatDialog *)chatDialog; - -/** - * Join occupants to dialog using Bolts. - * - * @param ids occupants ids to join - * @param chatDialog chat dialog to update - * - * @return BFTask with updated dialog - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)joinOccupantsWithIDs:(NSArray *)ids toChatDialog:(QBChatDialog *)chatDialog; - -/** - * Delete dialog by id on server and chat cache using Bolts - * - * @param dialogID id of dialog to delete - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)deleteDialogWithID:(NSString *)dialogID; - -/** - * Fetch messages with chat dialog id using Bolts. - * - * @param chatDialogID chat dialog identifier to fetch messages from - * - * @return BFTask with NSArray of QBChatMessage instances - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *> *)messagesWithChatDialogID:(NSString *)chatDialogID; - -/** - * Fetch messages with chat dialog id using Bolts. - * - * @param chatDialogID chat dialog identifier to fetch messages from - * @param extendedRequest extended parameters - * - * @return BFTask with NSArray of QBChatMessage instances - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *> *)messagesWithChatDialogID:(NSString *)chatDialogID - extendedRequest:(nullable NSDictionary *)extendedRequest; - -/** - * Fetch messages with chat dialog id using custom extended request using Bolts. - * - * @param chatDialogID Chat dialog id - * @param iterationBlock iteration block (pagination handling) - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *> *)messagesWithChatDialogID:(NSString *)chatDialogID - iterationBlock:(nullable void(^)(QBResponse *response, NSArray * _Nullable messages, BOOL *stop))iterationBlock; - -/** - * Fetch messages with chat dialog id using custom extended request using Bolts. - * - * @param chatDialogID Chat dialog id - * @param extendedRequest extended parameters - * @param iterationBlock iteration block (pagination handling) - * - * @discussion Pass nil or empty dictionary into extendedRequest to load only newest messages from latest message in cache. - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *> *)messagesWithChatDialogID:(NSString *)chatDialogID - extendedRequest:(nullable NSDictionary *)extendedRequest - iterationBlock:(nullable void(^)(QBResponse *response, NSArray * _Nullable messages, BOOL *stop))iterationBlock; - -/** - * Loads messages that are older than oldest message in cache. - * - * @param chatDialogID chat dialog identifier - * - * @return BFTask instance of QBChatMessage's array - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *> *)loadEarlierMessagesWithChatDialogID:(NSString *)chatDialogID; - -/** - * Fetch dialog with identifier using Bolts. - * - * @param dialogID dialog identifier to fetch - * - * @return BFTask with chat dialog - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)fetchDialogWithID:(NSString *)dialogID; - -/** - * Load dialog with dialog identifier from server and saving to memory storage and cache using Bolts. - * - * @param dialogID dialog identifier to load. - * - * @return BFTask with chat dialog - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)loadDialogWithID:(NSString *)dialogID; - -/** - * Fetch dialog with last activity date from date using Bolts. - * - * @param date date to fetch dialogs from - * @param limit page limit - * @param iterationBlock iteration block with dialogs for pages - * - * @return BFTask with chat dialog - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)fetchDialogsUpdatedFromDate:(NSDate *)date - andPageLimit:(NSUInteger)limit - iterationBlock:(nullable void(^)(QBResponse *response, NSArray * _Nullable dialogObjects, NSSet * _Nullable dialogsUsersIDs, BOOL *stop))iterationBlock; - -/** - * Send system message to users about adding to dialog with dialog inside using Bolts. - * - * @param chatDialog created dialog we notificate about - * @param usersIDs array of users id to send message - * @param text text to users - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendSystemMessageAboutAddingToDialog:(QBChatDialog *)chatDialog - toUsersIDs:(NSArray *)usersIDs - withText:(nullable NSString *)text; - -/** - * Send message about accepting or rejecting contact requst using Bolts. - * - * @param accept YES - accept, NO reject - * @param opponentID opponent ID - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendMessageAboutAcceptingContactRequest:(BOOL)accept - toOpponentID:(NSUInteger)opponentID; - -/** - * Sending notification message about adding occupants to specific dialog using Bolts. - * - * @param occupantsIDs array of occupants that were added to a specific dialog - * @param chatDialog chat dialog to send notification message to - * @param notificationText notification message body (text) - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendNotificationMessageAboutAddingOccupants:(NSArray *)occupantsIDs - toDialog:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText; - -/** - * Sending notification message about leaving dialog using Bolts. - * - * @param chatDialog chat dialog to send message to - * @param notificationText notification message body (text) - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendNotificationMessageAboutLeavingDialog:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText; - -/** - * Sending notification message about changing dialog photo using Bolts. - * - * @param chatDialog chat dialog to send message to - * @param notificationText notification message body (text) - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendNotificationMessageAboutChangingDialogPhoto:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText; - -/** - * Sending notification message about changing dialog name. - * - * @param chatDialog chat dialog to send message to - * @param notificationText notification message body (text) - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendNotificationMessageAboutChangingDialogName:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText; - -/** - * Send message with a specific message type to dialog with identifier using Bolts. - * - * @param message QBChatMessage instance - * @param type QMMessageType type - * @param dialog QBChatDialog instance - * @param saveToHistory if YES - saves message to chat history - * @param saveToStorage if YES - saves to local storage - * - * @discussion The purpose of this method is to have a proper way of sending messages - * with a different message type, which does not have their own methods (e.g. contact request). - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendMessage:(QBChatMessage *)message - type:(QMMessageType)type - toDialog:(QBChatDialog *)dialog - saveToHistory:(BOOL)saveToHistory - saveToStorage:(BOOL)saveToStorage; - -/** - * Send message to dialog with identifier using Bolts. - * - * @param message QBChatMessage instance - * @param dialogID dialog identifier - * @param saveToHistory if YES - saves message to chat history - * @param saveToStorage if YES - saves to local storage - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendMessage:(QBChatMessage *)message - toDialogID:(NSString *)dialogID - saveToHistory:(BOOL)saveToHistory - saveToStorage:(BOOL)saveToStorage; - -/** - * Send message to using Bolts. - * - * @param message QBChatMessage instance - * @param dialog dialog instance to send message to - * @param saveToHistory if YES - saves message to chat history - * @param saveToStorage if YES - saves to local storage - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendMessage:(QBChatMessage *)message - toDialog:(QBChatDialog *)dialog - saveToHistory:(BOOL)saveToHistory - saveToStorage:(BOOL)saveToStorage; - -/** - * Send attachment message to dialog using Bolts. - * - * @param attachmentMessage QBChatMessage instance with attachment - * @param dialog dialog instance to send message to - * @param image attachment image to upload - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendAttachmentMessage:(QBChatMessage *)attachmentMessage - toDialog:(QBChatDialog *)dialog - withAttachmentImage:(UIImage *)image; - -/** - * Send attachment message to dialog using Bolts. - * - * @param attachmentMessage QBChatMessage instance with attachment - * @param dialog dialog instance to send message to - * @param attachment QBChatAttachment instance to upload and send - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)sendAttachmentMessage:(QBChatMessage *)attachmentMessage - toDialog:(QBChatDialog *)dialog - withAttachment:(QBChatAttachment *)attachment; - -/** - * Mark message as delivered. - * - * @param message QBChatMessage instance to mark as delivered - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)markMessageAsDelivered:(QBChatMessage *)message; - -/** - * Mark messages as delivered. - * - * @param messages array of QBChatMessage instances to mark as delivered - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)markMessagesAsDelivered:(NSArray *)messages; - -/** - * Sending read status for message and updating unreadMessageCount for dialog in cache - * - * @param message QBChatMessage instance to mark as read - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)readMessage:(QBChatMessage *)message; - -/** - * Sending read status for messages and updating unreadMessageCount for dialog in cache - * - * @param messages Array of QBChatMessage instances to mark as read - * @param dialogID ID of dialog to update - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)readMessages:(NSArray *)messages forDialogID:(NSString *)dialogID; - - -/** - * Loads the later messages which were added to the cache after the last message in the memory storage and saves them to the memory storage. - * - * @param dialogID ID of dialog to update - * - * @return BFTask with 'NSArray' instance. - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask*> *)syncMessagesWithCacheForDialogID:(NSString *)dialogID; - -/** - * Loads the later dialogs which were added to the cache after the last message in the memory storage and saves them to the memory storage. - * - * @param date 'NSDate' instance to sync dialogs from - * - * @return BFTask with 'NSArray' instance. - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask*> *)syncLaterDialogsWithCacheFromDate:(NSDate *)date; - -@end - -@protocol QMChatServiceCacheDataSource -@required - -/** - * Is called when chat service will start. Need to use for inserting initial data QMDialogsMemoryStorage - * - * @param block Block for provide QBChatDialogs collection - */ -- (void)cachedDialogs:(nullable QMCacheCollection)block; - -/** - * Will return dialog with specific identificator from cache or nil if dialog doesn't exist - * - * @param dialogID dialog identificator - * @param completion completion block with dialog - */ -- (void)cachedDialogWithID:(NSString *)dialogID completion:(nullable void (^)(QBChatDialog * _Nullable dialog))completion; - -/** - * Is called when begin fetch messages. @see -messagesWithChatDialogID:completion: - * Need to use for inserting initial data QMMessagesMemoryStorage by dialogID - * - * @param dialogID Dialog ID - * @param block Block for provide QBChatMessages collection - */ -- (void)cachedMessagesWithDialogID:(NSString *)dialogID block:(nullable QMCacheCollection)block; - -@optional - -/** - * Is called when begin fetch messages with predicate. - * Need to use for inserting to 'QMMessagesMemoryStorage' instance - * - * @param predicate NSPredicate instance - * @param block Block for providing QBChatMessages collection - */ -- (void)cachedMessagesWithPredicate:(NSPredicate *)predicate - block:(nullable QMCacheCollection)block; - -/** - * Is called when begin fetch dialogs with predicate. - * Need to use for inserting to 'QMDialogsMemoryStorage' instance - * - * @param predicate NSPredicate instance - * @param block Block for providing QBChatDialog collection - */ -- (void)cachedDialogsWithPredicate:(NSPredicate *)predicate - block:(nullable QMCacheCollection)block; - -@end - -@protocol QMChatServiceDelegate -@optional -/** - * Is called when ChatDialogs did load from cache. - * - * @param chatService instance - * @param dialogs array of QBChatDialogs loaded from cache - * @param dialogsUsersIDs all users from all ChatDialogs - */ -- (void)chatService:(QMChatService *)chatService didLoadChatDialogsFromCache:(NSArray *)dialogs withUsers:(NSSet *)dialogsUsersIDs; - -/** - * Is called when messages did load from cache for some dialog. - * - * @param chatService instance - * @param messages array of QBChatMessages loaded from cache - * @param dialogID messages dialog ID - */ -- (void)chatService:(QMChatService *)chatService didLoadMessagesFromCache:(NSArray *)messages forDialogID:(NSString *)dialogID; - -/** - * Is called when dialog instance did add to memmory storage. - * - * @param chatService instance - * @param chatDialog QBChatDialog has added to memory storage - */ -- (void)chatService:(QMChatService *)chatService didAddChatDialogToMemoryStorage:(QBChatDialog *)chatDialog; - -/** - * Is called when dialogs array did add to memmory storage. - * - * @param chatService instance - * @param chatDialogs QBChatDialog items has added to memory storage - */ -- (void)chatService:(QMChatService *)chatService didAddChatDialogsToMemoryStorage:(NSArray *)chatDialogs; - -/** - * Is called when some dialog did update in memory storage - * - * @param chatService instance - * @param chatDialog updated QBChatDialog - */ -- (void)chatService:(QMChatService *)chatService didUpdateChatDialogInMemoryStorage:(QBChatDialog *)chatDialog; - -/** - * Is called when some dialogs did update in memory storage - * - * @param chatService instance - * @param dialogs updated array of QBChatDialog's - */ -- (void)chatService:(QMChatService *)chatService didUpdateChatDialogsInMemoryStorage:(NSArray *)dialogs; - -/** - * Is called when some dialog did delete from memory storage - * - * @param chatService instance - * @param chatDialogID deleted QBChatDialog - */ -- (void)chatService:(QMChatService *)chatService didDeleteChatDialogWithIDFromMemoryStorage:(NSString *)chatDialogID; - -/** - * Is called when message did add to memory storage for dialog with id - * - * @param chatService instance - * @param message added QBChatMessage - * @param dialogID message dialog ID - */ -- (void)chatService:(QMChatService *)chatService didAddMessageToMemoryStorage:(QBChatMessage *)message forDialogID:(NSString *)dialogID; - -/** - * Is called when message did update in memory storage for dialog with id - * - * @param chatService instance - * @param message updated QBChatMessage - * @param dialogID message dialog ID - */ -- (void)chatService:(QMChatService *)chatService didUpdateMessage:(QBChatMessage *)message forDialogID:(NSString *)dialogID; - -/** - * Is called when message did update in memory storage for dialog with id - * - * @param chatService instance - * @param messages array of updated messages - * @param dialogID messages dialog ID - */ -- (void)chatService:(QMChatService *)chatService didUpdateMessages:(NSArray *)messages forDialogID:(NSString *)dialogID; - -/** - * Is called when messages did add to memory storage for dialog with id - * - * @param chatService instance - * @param messages array of QBChatMessage - * @param dialogID message dialog ID - */ -- (void)chatService:(QMChatService *)chatService didAddMessagesToMemoryStorage:(NSArray*)messages forDialogID:(NSString *)dialogID; - -/** - * Is called when message was deleted from memory storage for dialog id - * - * @param chatService chat service instance - * @param message message that was deleted - * @param dialogID dialog identifier of deleted message - */ -- (void)chatService:(QMChatService *)chatService didDeleteMessageFromMemoryStorage:(QBChatMessage *)message forDialogID:(NSString *)dialogID; - -/** - * Is called when messages was deleted from memory storage for dialog id - * - * @param chatService chat service instance - * @param messages messages that were deleted - * @param dialogID dialog identifier of deleted messages - */ -- (void)chatService:(QMChatService *)chatService didDeleteMessagesFromMemoryStorage:(NSArray*)messages forDialogID:(NSString *)dialogID; - -/** - * Is called when chat service did receive notification message - * - * @param chatService instance - * @param message received notification message - * @param dialog QBChatDialog from notification message - */ -- (void)chatService:(QMChatService *)chatService didReceiveNotificationMessage:(QBChatMessage *)message createDialog:(QBChatDialog *)dialog; - -@end - -/** - * Chat connection delegate can handle chat stream events. Like did connect, did reconnect etc... - */ - -@protocol QMChatConnectionDelegate -@optional - -/** - * Called when chat service did start connecting to the chat. - * - * @param chatService QMChatService instance - */ -- (void)chatServiceChatHasStartedConnecting:(QMChatService *)chatService; - -/** - * It called when chat did connect. - * - * @param chatService instance - */ -- (void)chatServiceChatDidConnect:(QMChatService *)chatService; - -/** - * Called when chat did not connect. - * - * @param chatService instance - * @param error connection failure error - */ -- (void)chatService:(QMChatService *)chatService chatDidNotConnectWithError:(NSError *)error; - -/** - * It called when chat did accidentally disconnect - * - * @param chatService instance - */ -- (void)chatServiceChatDidAccidentallyDisconnect:(QMChatService *)chatService; - -/** - * It called when chat did reconnect - * - * @param chatService instance - */ -- (void)chatServiceChatDidReconnect:(QMChatService *)chatService; - -/** - * It called when chat did catch error from chat stream - * - * @param error NSError from stream - */ -- (void)chatServiceChatDidFailWithStreamError:(NSError *)error; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMChatTypes.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMChatTypes.h deleted file mode 100644 index beeab95ee..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMChatTypes.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// QMChatTypes.h -// QMServices -// -// Created by Andrey Ivanov on 29.04.15. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -typedef NS_ENUM(NSUInteger, QMMessageType) { - /** Default message type*/ - QMMessageTypeText = 0, - QMMessageTypeCreateGroupDialog = 1, - QMMessageTypeUpdateGroupDialog = 2, - - QMMessageTypeContactRequest = 4, - QMMessageTypeAcceptContactRequest, - QMMessageTypeRejectContactRequest, - QMMessageTypeDeleteContactRequest -}; - -typedef NS_ENUM(NSUInteger, QMDialogUpdateType) { - QMDialogUpdateTypeNone = 0, - QMDialogUpdateTypePhoto = 1, - QMDialogUpdateTypeName = 2, - QMDialogUpdateTypeOccupants = 3 -}; - -/** - The current status of the attachment message. - */ -typedef NS_ENUM(NSUInteger, QMMessageAttachmentStatus) { - /** Default attachment state. Attachment has no active processes */ - QMMessageAttachmentStatusNotLoaded = 0, - /** The attachment has started the download process. */ - QMMessageAttachmentStatusLoading, - /** The attachment has started the upload process. */ - QMMessageAttachmentStatusUploading, - /** The attachment has started the asset-loading process. */ - QMMessageAttachmentStatusPreparing, - /** The attachment process has been completed successfully. */ - QMMessageAttachmentStatusLoaded, - /** The attachment process failed because of an error. */ - QMMessageAttachmentStatusError -}; diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMDialogsMemoryStorage/QMDialogsMemoryStorage.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMDialogsMemoryStorage/QMDialogsMemoryStorage.h deleted file mode 100644 index 9083b4c63..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMDialogsMemoryStorage/QMDialogsMemoryStorage.h +++ /dev/null @@ -1,113 +0,0 @@ -// -// QMDialogsMemoryStorage.h -// QMServices -// -// Created by Andrey on 03.11.14. -// Copyright (c) 2014 Quickblox. All rights reserved. -// - -#import -#import -#import "QMMemoryStorageProtocol.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface QMDialogsMemoryStorage : NSObject - -/** - * Add dialog to memory storage. - * - * @param chatDialog QBChatDialog instnace - * @param join YES to join in dialog immediately - * @param completion completion block with error if failed or nil if succeed - */ -- (void)addChatDialog:(QBChatDialog *)chatDialog - andJoin:(BOOL)join - completion:(nullable void(^)(QBChatDialog *addedDialog, NSError * _Nullable error))completion; - -/** - * Add dialogs to memory storage - * - * @param dialogs QBChatDialog items - * @param join YES to join in dialog immediately - */ -- (void)addChatDialogs:(NSArray *)dialogs andJoin:(BOOL)join; - -/** - * Delete dialog from memory storage - * - * @param chatDialogID item ID to delete - */ -- (void)deleteChatDialogWithID:(NSString *)chatDialogID; - -/** - * Find dialog in memory storage by ID - * - * @param dialogID chat dialog ID - * - * @return QBChatDialog instance - */ -- (nullable QBChatDialog *)chatDialogWithID:(NSString *)dialogID; - -/** - * Find private dialog in memory storage by opponent ID - * - * @param opponentID opponent ID - * - * @return QBChatDialog instance - */ -- (nullable QBChatDialog *)privateChatDialogWithOpponentID:(NSUInteger)opponentID; - -/** - * Get dialogs with unread messages in memory storage - * - * @return Array of QBChatDialog items - */ -- (NSArray *)unreadDialogs; - -/** - * Get all dialogs with specific user ids. - * - * @param usersIDs array of users ids - * - * @return array of finded QBChatDialog's - */ -- (NSArray *)chatDialogsWithUsersIDs:(NSArray *)usersIDs; - -/** - * Get all dialogs in memory storage - * - * @return Array of QBChatDialog items - */ -- (NSArray *)unsortedDialogs; - -/** - * Get all dialogs in memory storage sorted by last message date - * - * @param ascending sorting parameter - * - * @return Array of QBChatDialog items - */ -- (NSArray *)dialogsSortByLastMessageDateWithAscending:(BOOL)ascending; - -/** - * Get all dialogs in memory storage sorted by updated at - * - * @param ascending sorting parameter - * - * @return Array of QBChatDialog items - */ -- (NSArray *)dialogsSortByUpdatedAtWithAscending:(BOOL)ascending; - -/** - * Get all dialogs in memory storage sorted by sort descriptors - * - * @param descriptors Array of NSSortDescriptors - * - * @return Array of QBChatDialog items - */ -- (NSArray *)dialogsWithSortDescriptors:(NSArray *)descriptors; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMMediaBlocks.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMMediaBlocks.h deleted file mode 100644 index 557cb3143..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMMediaBlocks.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// QMMediaBlocks.h -// QMMediaKit -// -// Created by Vitaliy Gurkovsky on 2/8/17. -// Copyright © 2017 quickblox. All rights reserved. -// - -#import "QMChatTypes.h" - -NS_ASSUME_NONNULL_BEGIN - -typedef void (^QMAttachmentProgressBlock)(float progress); - -typedef void (^QMAttachmentAssetLoaderCompletionBlock)(UIImage * _Nullable image, Float64 durationInSeconds, CGSize size, NSError * _Nullable error, BOOL cancelled); - -NS_ASSUME_NONNULL_END - diff --git a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMMessagesMemoryStorage/QMMessagesMemoryStorage.h b/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMMessagesMemoryStorage/QMMessagesMemoryStorage.h deleted file mode 100644 index b0f764f78..000000000 --- a/Pods/QMServicesDevelopment/QMChatService/QMChatService/QMMessagesMemoryStorage/QMMessagesMemoryStorage.h +++ /dev/null @@ -1,142 +0,0 @@ -// -// QMMessagesMemoryStorage.h -// QMServices -// -// Created by Andrey on 28.11.14. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import "QMMemoryStorageProtocol.h" - -@protocol QMMemoryTemporaryQueueDelegate; - -NS_ASSUME_NONNULL_BEGIN - -@interface QMMessagesMemoryStorage : NSObject - -@property (weak, nonatomic, nullable) id delegate; - -/** - * Add message to memory storage - * - * @param message QBChatMessage instnace - * @param dialogID Chat dialog identifier - */ -- (void)addMessage:(QBChatMessage *)message forDialogID:(NSString *)dialogID; - -/** - * Add messages to memory storage - * - * @param messages Array of QBChatMessage items - * @param dialogID Chat dialog identifier - */ -- (void)addMessages:(NSArray *)messages forDialogID:(NSString *)dialogID; - -/** - * Replace messages in memory storage for dialog identifier - * - * @param messages Array of QBChatMessage instances to replace - * @param dialogID Chat dialog identifier - */ -- (void)replaceMessages:(NSArray *)messages forDialogID:(NSString *)dialogID; - -/** - * Updates message in memory storage. Dialog ID is taken from message. - * - * @param message Updated message. - */ -- (void)updateMessage:(QBChatMessage *)message; - -//MARK: - Getters - -/** - * Messages with chat dialog identifier - * - * @param dialogID Chat dialog identifier - * - * @return return array of QBChatMessage instances - */ -- (NSArray *)messagesWithDialogID:(NSString *)dialogID; - -/** - * Delete message from memory storage. - * - * @param message message to delete. - */ -- (void)deleteMessage:(QBChatMessage *)message; - -/** - * Delete messages from memory storage. - * - * @param messages messages to delete - * @param dialogID chat dialog identifier - */ -- (void)deleteMessages:(NSArray *)messages forDialogID:(NSString *)dialogID; - -/** - * Delete messages with dialog indetifier - * - * @param dialogID Chat dialog identifier - */ -- (void)deleteMessagesWithDialogID:(NSString *)dialogID; - -/** - * Message with ID - * - * @param messageID Message identifier - * - * @return QBChatMessage object - */ -- (nullable QBChatMessage *)messageWithID:(NSString *)messageID fromDialogID:(NSString *)dialogID; - -/** - * Get last message in memory storage from dialog by ID - * - * @param dialogID dialog ID - * - * @return QBChatMessage object - */ -- (nullable QBChatMessage *)lastMessageFromDialogID:(NSString *)dialogID; - -/** - * Is message existent for dialog. - * - * @param message QBChatMessage instance - * @param dialogID dialog ID - * - * @return whether message existent for a specific dialog - */ -- (BOOL)isMessageExistent:(QBChatMessage *)message forDialogID:(NSString *)dialogID; - -//MARK: - Helpers - -/** - * Checks if dialog doesn't have messages - * - * @param dialogID dialog ID - * - * @return YES if dialog empty - */ -- (BOOL)isEmptyForDialogID:(NSString *)dialogID; - -/** - * Get first message in memory storage from dialog by ID - * - * @param dialogID dialog ID - * - * @return QBChatMessage object - */ -- (nullable QBChatMessage *)oldestMessageForDialogID:(NSString *)dialogID; - -@end - -@protocol QMMemoryTemporaryQueueDelegate - -@optional - -- (nullable NSArray *)localMessagesForDialogWithID:(NSString *)dialogID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMContactListCache/QMContactListCache/QMContactListCache.h b/Pods/QMServicesDevelopment/QMContactListCache/QMContactListCache/QMContactListCache.h deleted file mode 100644 index 29eb2f67a..000000000 --- a/Pods/QMServicesDevelopment/QMContactListCache/QMContactListCache/QMContactListCache.h +++ /dev/null @@ -1,117 +0,0 @@ -// -// QMContactListCache.h -// QMServices -// -// Created by Andrey Ivanov on 06.11.14. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import "QMDBStorage.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface QMContactListCache : QMDBStorage - -//MARK: - Singleton - -/** - * Chat cache singleton - * - * @return QMContactListCache instance - */ -+ (nullable QMContactListCache *)instance; - -//MARK: - Configure store - -/** - * Setup QMContactListCache stake wit store name - * - * @param storeName Store name - */ -+ (void)setupDBWithStoreNamed:(NSString *)storeName; -/** - * Clean clean chat cache with store name - * - * @param name Store name - */ -+ (void)cleanDBWithStoreName:(NSString *)name; - -//MARK: - -//MARK: Dialogs -//MARK: - -//MARK: Insert / Update / Delete contact items - -/** - * Insert/Update QBContactListItem in cache - * - * @param contactListItems QBContactListItem instance - * @param completion Completion block is called after update or insert operation is completed - */ -- (void)insertOrUpdateContactListItem:(QBContactListItem *)contactListItems - completion:(nullable dispatch_block_t)completion; -/** - * Insert/Update QBContactListItem's in cache - * - * @param contactListItems Array of QBContactListItem instances - * @param completion Completion block is called after update or insert operation is completed - */ -- (void)insertOrUpdateContactListWithItems:(NSArray *)contactListItems - completion:(nullable dispatch_block_t)completion; - -/** - * Insert/Update QBContactListItem's in cache - * - * @param contactList QBContactList instance - * @param completion Completion block is called after update or insert operation is completed - */ -- (void)insertOrUpdateContactListItemsWithContactList:(QBContactList *)contactList - completion:(nullable dispatch_block_t)completion; -/** - * Delete ContactListItem from cache - * - * @param contactListItem QBContactListItem instance - * @param completion Completion block is called after delete operation is completed - */ -- (void)deleteContactListItem:(QBContactListItem *)contactListItem - completion:(nullable dispatch_block_t)completion; - -/** - * Delete all contact list items - * - * @param completion Completion block is called after delete contact list items operation is completed - */ -- (void)deleteContactList:(nullable dispatch_block_t)completion; - -- (void)truncateAll; - -//MARK: Fetch ContactList operations - -/** - * Fetch all contact list items - * - * @param completion Completion block that is called after the fetch has completed. Returns an array of QBContactListItem instances - */ -- (void)contactListItems:(nullable void(^)(NSArray *contactListItems))completion; - - -/** - * Fetch all contact list items (Fetch in Main Queue context) - * - * @return Returns an array of QBContactListItem instances - */ -- (NSArray *)allContactListItems; - -/** - * Fetch contact list item wiht user ID - * - * @param userID userID which you would like to Fetch from cache - * @param completion Completion block that is called after the fetch has completed. Returns an instance of QBContactListItem - */ -- (void)contactListItemWithUserID:(NSUInteger)userID - completion:(nullable void(^)(QBContactListItem *contactListItems))completion; - - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListMemoryStorage/QMContactListMemoryStorage.h b/Pods/QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListMemoryStorage/QMContactListMemoryStorage.h deleted file mode 100644 index 581796fce..000000000 --- a/Pods/QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListMemoryStorage/QMContactListMemoryStorage.h +++ /dev/null @@ -1,58 +0,0 @@ -// -// QMContactListMemoryStorage.h -// QMServices -// -// Created by Andrey on 25.11.14. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import "QMMemoryStorageProtocol.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * Contact list memory storage - */ -@interface QMContactListMemoryStorage : NSObject - -/** - * Update memory storage with QBContactList instance. - * - * @param contactList QBContactList instance - */ -- (void)updateWithContactList:(QBContactList *)contactList; - -/** - * Update memory storage with QBContactLists items. - * - * @param contactListItems QBContactList items - */ -- (void)updateWithContactListItems:(NSArray *)contactListItems; - -/** - * Find QBContactListItem by user ID. - * - * @param userID NSUInteger user ID - * - * @return finded QBContactListItem instance - */ -- (nullable QBContactListItem *)contactListItemWithUserID:(NSUInteger)userID; - -/** - * Get all stored User IDs. - * - * @return array of user IDs - */ -- (NSArray *)userIDsFromContactList; - -/** - * Get all stored contact list items. - * - * @return array of contact list items. - */ -- (NSArray *)allContactListItems; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListService.h b/Pods/QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListService.h deleted file mode 100644 index 1d7fdeb11..000000000 --- a/Pods/QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListService.h +++ /dev/null @@ -1,199 +0,0 @@ -// -// QMContactsService.h -// QMServices -// -// Created by Ivanov A.V on 14/02/2014. -// Copyright (c) 2015 Quickblox. All rights reserved. -// - -#import -#import "QMBaseService.h" -#import "QMContactListMemoryStorage.h" -#import "QMUsersMemoryStorage.h" -#import "QBUUser+CustomData.h" - -NS_ASSUME_NONNULL_BEGIN - -@class QBGeneralResponsePage; - -typedef void(^QMCacheCollection)(NSArray * _Nullable collection); - -@protocol QMContactListServiceDelegate; -@protocol QMContactListServiceCacheDataSource; - - -/** - * Service which used for handling users from contact list. - */ -@interface QMContactListService : QMBaseService - -/** - * Memory storage for contact list items. - */ -@property (strong, nonatomic, readonly) QMContactListMemoryStorage *contactListMemoryStorage; - -/** - * Init with service data delegate and contact list cache protocol. - * - * @param serviceManager instance confirmed id protocol - * @param cacheDataSource instance confirmed id protocol - * - * @return QMContactListService instance - */ -- (instancetype)initWithServiceManager:(id)serviceManager - cacheDataSource:(nullable id)cacheDataSource; - -/** - * Add instance that confirms contact list service multicaste protocol - * - * @param delegate instance that confirms id protocol - */ -- (void)addDelegate:(id )delegate; - -/** - * Remove instance that confirms contact list service multicaste protocol - * - * @param delegate instance that confirms id protocol - */ -- (void)removeDelegate:(id )delegate; - -/** - * Add user to contact list request - * - * @param user user which you would like to add to contact list - * @param completion completion block - */ -- (void)addUserToContactListRequest:(QBUUser *)user completion:(nullable void(^)(BOOL success))completion; - -/** - * Remove user from contact list request - * - * @param userID user ID which you would like to remove from contact list - * @param completion completion block - */ -- (void)removeUserFromContactListWithUserID:(NSUInteger)userID completion:(nullable void(^)(BOOL success))completion; - -/** - * Accept contact request - * - * @param userID user ID from which you would like to accept contact request - * @param completion completion block - */ -- (void)acceptContactRequest:(NSUInteger)userID completion:(nullable void (^)(BOOL success))completion; - -/** - * Reject contact request - * - * @param userID user ID from which you would like to reject contact request - * @param completion completion block - */ -- (void)rejectContactRequest:(NSUInteger)userID completion:(nullable void(^)(BOOL success))completion; - -@end - -//MARK: - Bolts - -/** - * Bolts methods for QMContactListService - */ -@interface QMContactListService (Bolts) - -/** - * Add user to contact list request using Bolts. - * - * @param user user to add to contact list - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)addUserToContactListRequest:(QBUUser *)user; - -/** - * Remove user from contact list using Bolts. - * - * @param userID id of user to remove - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)removeUserFromContactListWithUserID:(NSUInteger)userID; - -/** - * Accept contact request using Bolts. - * - * @param userID id of user to accept contact request - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)acceptContactRequest:(NSUInteger)userID; - -/** - * Reject contact request for user id using Bolts. - * - * @param userID id of user to reject contact request - * - * @return BFTask with failure error - * - * @see In order to know how to work with BFTask's see documentation https://github.com/BoltsFramework/Bolts-iOS#bolts - */ -- (BFTask *)rejectContactRequest:(NSUInteger)userID; - -@end - -//MARK: - Protocols - -/** - * Data source for QMContactList Service - */ - -@protocol QMContactListServiceCacheDataSource -@required - -/** - * Is called when chat service will start. Need to use for inserting initial data QMContactListMemoryStorage - * - * @param block Block for provide QBContactListItem collection - */ -- (void)cachedContactListItems:(nullable QMCacheCollection)block; - -@optional - -- (void)contactListDidAddUser:(QBUUser *)user; - -@end - -/** - * Actions from QMContactList Service - */ - -@protocol QMContactListServiceDelegate -@optional - -/** - * Is called when contact list service did load data from cache data source in memory storage - */ -- (void)contactListServiceDidLoadCache; - -/** - * Is called when contact list service did change some QBContactList item in memory storage - * - * @param contactList updated QBContactList - */ -- (void)contactListService:(QMContactListService *)contactListService contactListDidChange:(QBContactList *)contactList; - -/** - * Is called when contact list service did recieve some activity changes of userID - * - * @param userID id of user - * @param isOnline online status for user - * @param status custom status for user - */ -- (void)contactListService:(QMContactListService *)contactListService didReceiveContactItemActivity:(NSUInteger)userID isOnline:(BOOL)isOnline status:(nullable NSString *)status; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListService.m b/Pods/QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListService.m deleted file mode 100644 index 2e38e435a..000000000 --- a/Pods/QMServicesDevelopment/QMContactListService/QMContactListService/QMContactListService.m +++ /dev/null @@ -1,187 +0,0 @@ -// -// QMContactsService.m -// QMServices -// -// Created by Andrey Ivanov on 14/02/2014. -// Copyright (c) 2015 Quickblox. All rights reserved. -// - -#import "QMContactListService.h" - -#import "QMSLog.h" - -static inline BOOL isContactListEmpty(QBContactList *contactList) { - - return (contactList == nil || (contactList.contacts.count == 0 && contactList.pendingApproval.count == 0)); -} - -@interface QMContactListService() - - - -@property (strong, nonatomic) QBMulticastDelegate *multicastDelegate; -@property (weak, nonatomic) id cacheDataSource; -@property (strong, nonatomic) QMContactListMemoryStorage *contactListMemoryStorage; - -@end - -@implementation QMContactListService - -- (void)dealloc { - - QMSLog(@"%@ - %@", NSStringFromSelector(_cmd), self); - [[QBChat instance] removeDelegate:self]; - self.contactListMemoryStorage = nil; -} - -- (instancetype)initWithServiceManager:(id)serviceManager - cacheDataSource:(id)cacheDataSource { - - self = [super initWithServiceManager:serviceManager]; - if (self) { - - _cacheDataSource = cacheDataSource; - [self loadCachedData]; - } - - return self; -} - -//MARK: - Service will start - -- (void)serviceWillStart { - - self.multicastDelegate = (id)[[QBMulticastDelegate alloc] init]; - self.contactListMemoryStorage = [[QMContactListMemoryStorage alloc] init]; - - [[QBChat instance] addDelegate:self]; -} - -- (void)loadCachedData { - - __weak __typeof(self)weakSelf = self; - - if ([self.cacheDataSource respondsToSelector:@selector(cachedContactListItems:)]) { - - [self.cacheDataSource cachedContactListItems:^(NSArray *collection) { - [weakSelf.contactListMemoryStorage updateWithContactListItems:collection]; - }]; - } - - - if ([self.multicastDelegate respondsToSelector:@selector(contactListServiceDidLoadCache)]) { - [self.multicastDelegate contactListServiceDidLoadCache]; - } -} - -//MARK: - Add Remove multicaste delegate - -- (void)addDelegate:(id )delegate { - - [self.multicastDelegate addDelegate:delegate]; -} - -- (void)removeDelegate:(id )delegate { - - [self.multicastDelegate removeDelegate:delegate]; -} - -//MARK: - QBChatDelegate - -- (void)chatContactListDidChange:(QBContactList *)contactList { - - if (isContactListEmpty(contactList) - && ![QBChat instance].isConnected) { - // no need to erase contact list cache due to chat - // disconnect triggers nil contact list change - return; - } - - [self.contactListMemoryStorage updateWithContactList:contactList]; - - if ([self.multicastDelegate respondsToSelector:@selector(contactListService:contactListDidChange:)]) { - [self.multicastDelegate contactListService:self contactListDidChange:contactList]; - } -} - -- (void)chatDidReceiveContactItemActivity:(NSUInteger)userID isOnline:(BOOL)isOnline status:(NSString *)status { - - if ([self.multicastDelegate respondsToSelector:@selector(contactListService:didReceiveContactItemActivity:isOnline:status:)]) { - [self.multicastDelegate contactListService:self didReceiveContactItemActivity:userID isOnline:isOnline status:status]; - } -} - -//MARK: - ContactList Request - -- (void)addUserToContactListRequest:(QBUUser *)user completion:(void(^)(BOOL success))completion { - - __weak __typeof(self)weakSelf = self; - [[QBChat instance] addUserToContactListRequest:user.ID completion:^(NSError *error) { - __typeof(self) strongSelf = weakSelf; - - if (error == nil) { - - if ([strongSelf.cacheDataSource respondsToSelector:@selector(contactListDidAddUser:)]) { - [strongSelf.cacheDataSource contactListDidAddUser:user]; - } - - if (completion) { - - completion(YES); - } - } - else { - - if (completion) { - - completion(NO); - } - } - }]; -} - -- (void)removeUserFromContactListWithUserID:(NSUInteger)userID completion:(void(^)(BOOL success))completion { - - [[QBChat instance] removeUserFromContactList:userID completion:^(NSError *error) { - - if (completion) { - completion(error == nil); - } - }]; -} - -- (void)acceptContactRequest:(NSUInteger)userID completion:(void(^)(BOOL success))completion { - - [[QBChat instance] confirmAddContactRequest:userID completion:^(NSError *error) { - - if (completion) { - completion(error == nil); - } - }]; -} - -- (void)rejectContactRequest:(NSUInteger)userID completion:(void(^)(BOOL success))completion { - - [[QBChat instance] rejectAddContactRequest:userID completion:^(NSError *error) { - - if (completion) { - completion(error == nil); - } - }]; -} - -//MARK: - QMUsersMemoryStorageDelegate - -- (NSArray *)contactsIDS { - - return [self.contactListMemoryStorage userIDsFromContactList]; -} - -#pragma QMMemoryStorageProtocol - -- (void)free { - - [self.contactListMemoryStorage free]; -} - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDAggregation.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDAggregation.h deleted file mode 100755 index c17731c0b..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDAggregation.h +++ /dev/null @@ -1,84 +0,0 @@ -// -// NSManagedObject+QMCDAggregation.h -// QMCD Record -// -// Created by Injoit on 3/7/12. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -/** - Category methods that make aggregating and counting managed objects easier. - - @since Available in v2.0 and later. - */ -@interface NSManagedObject (QMCDAggregation) - -+ (NSNumber *)QM_numberOfEntitiesWithContext:(NSManagedObjectContext *)context; - -+ (NSNumber *)QM_numberOfEntitiesWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context; - -/** - Count of entities for the current class in the supplied context. - - @param context Managed object context - - @return Count of entities - - @since Available in v2.0 and later. - */ -+ (NSUInteger)QM_countOfEntitiesWithContext:(NSManagedObjectContext *)context; - -/** - Count of entities for the current class matching the supplied predicate in the supplied context. - - @param predicate Predicate to evaluate objects against - @param context Managed object context - - @return Count of entities - - @since Available in v2.0 and later. - */ -+ (NSUInteger)QM_countOfEntitiesWithPredicate:(NSPredicate *)predicate - inContext:(NSManagedObjectContext *)context; - -/** - Check that there is at least one entity matching the current class in the supplied context. - - @param context Managed object context - - @return `YES` if there is at least on entity, otherwise `NO`. - - @since Available in v2.0 and later. - */ -+ (BOOL)QM_hasAtLeastOneEntityInContext:(NSManagedObjectContext *)context; - -- (id)QM_minValueFor:(NSString *)property; -- (id)QM_maxValueFor:(NSString *)property; - -/** - Supports aggregating values using a key-value collection operator that can be grouped by an attribute. - See https://developer.apple.com/library/ios/documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html for a list of valid collection operators. - - @param collectionOperator Collection operator - @param attributeName Entity attribute to apply the collection operator to - @param predicate Predicate to filter results - @param groupingKeyPath Key path to group results by - @param context Context to perform the request in - - @return Results of the collection operator, filtered by the provided predicate and grouped by the provided key path - - @since Available in v2.3 and later. - */ -+ (NSArray *)QM_aggregateOperation:(NSString *)collectionOperator - onAttribute:(NSString *)attributeName - withPredicate:(NSPredicate *)predicate - groupBy:(NSString*)groupingKeyPath - inContext:(NSManagedObjectContext *)context; - -- (id)QM_objectWithMinValueFor:(NSString *)property; -- (id)QM_objectWithMinValueFor:(NSString *)property - inContext:(NSManagedObjectContext *)context; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDFinders.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDFinders.h deleted file mode 100755 index 3b854a6b2..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDFinders.h +++ /dev/null @@ -1,89 +0,0 @@ -// -// NSManagedObject+QMCDFinders.h -// QMCD Record -// -// Created by Injoit on 3/7/12. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import - -@protocol QMCDFinderExtensions - -@optional -- (NSString *) fetchedResultsControllerCacheName; - -@end - -/** - Category methods to make finding entities easier. - - @since Available since v1.8. - */ -@interface NSManagedObject (QMCDFinders) - -+ (NSArray *)QM_findAllInContext:(NSManagedObjectContext *)context; - -+ (NSArray *)QM_findAllSortedBy:(NSString *)sortTerm - ascending:(BOOL)ascending - withPredicate:(NSPredicate *)searchTerm - inContext:(NSManagedObjectContext *)context; - -+ (NSArray *)QM_findAllWithPredicate:(NSPredicate *)searchTerm - inContext:(NSManagedObjectContext *)context; - -+ (instancetype)QM_findFirstWithPredicate:(NSPredicate *)searchTerm - inContext:(NSManagedObjectContext *)context; - -+ (instancetype)QM_findFirstWithPredicate:(NSPredicate *)searchterm - sortedBy:(NSString *)property - ascending:(BOOL)ascending - inContext:(NSManagedObjectContext *)context; - -+ (NSArray *)QM_findAllSortedBy:(NSString *)sortTerm - ascending:(BOOL)ascending - withPredicate:(NSPredicate *)searchTerm - offset:(NSUInteger)offset - limit:(NSUInteger)limit - inContext:(NSManagedObjectContext *)context; - -+ (instancetype)QM_findFirstWithPredicate:(NSPredicate *)searchTerm - andRetrieveAttributes:(NSArray *)attributes - inContext:(NSManagedObjectContext *)context; - -+ (instancetype)QM_findFirstWithPredicate:(NSPredicate *)searchTerm - sortedBy:(NSString *)sortBy - ascending:(BOOL)ascending - inContext:(NSManagedObjectContext *)context - andRetrieveAttributes:(id)attributes, ...; - -+ (instancetype)QM_findFirstByAttribute:(NSString *)attribute - withValue:(id)searchValue - inContext:(NSManagedObjectContext *)context; - -+ (instancetype)QM_findFirstByAttribute:(NSString *)attribute - withValue:(id)searchValue - orderedBy:(NSString *)orderedBy - ascending:(BOOL)ascending - inContext:(NSManagedObjectContext *)context; - -+ (instancetype)QM_findFirstOrderedByAttribute:(NSString *)attribute - ascending:(BOOL)ascending - inContext:(NSManagedObjectContext *)context; - -+ (instancetype)QM_findFirstOrCreateByAttribute:(NSString *)attribute - withValue:(id)searchValue - inContext:(NSManagedObjectContext *)context; - -+ (NSArray *)QM_findByAttribute:(NSString *)attribute - withValue:(id)searchValue - inContext:(NSManagedObjectContext *)context; - -+ (NSArray *)QM_findByAttribute:(NSString *)attribute - withValue:(id)searchValue - andOrderBy:(NSString *)sortTerm - ascending:(BOOL)ascending - inContext:(NSManagedObjectContext *)context; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRecord.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRecord.h deleted file mode 100755 index 045f57dc8..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRecord.h +++ /dev/null @@ -1,243 +0,0 @@ -// -// -// Created by Injoit on 11/15/09. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import "QMCDRecord.h" - -@protocol QMCDRecordManagedObjectProtocol - -@optional -/** - Work around for situation with inserting the same object into many nested contexts. This will be called once, while awakeFromInsert has the potential to be called mutliple times for the same insert. - */ -- (void)QM_awakeFromCreation; - -@end - -/** - Categories that simplify working with the NSManagedObject class. - - @since Available in v1.0 and later. - */ -@interface NSManagedObject (QMCDRecord) - -/** - @name Entity Information - */ - -/** - If you want to customize the entity name that is returned, you can override either `+ (NSString *)QM_entityName` or `+ (NSString *) entityName` in your `NSManagedObject` subclasses. `+ (NSString *) entityName` is declared in the default mogenerator templates. - - @return Name of the managed object's entity, or if that is unavailable the name of the managed object's class as a string - - @since Available in v2.0 and later. - */ -+ (NSString *)QM_entityName; - -+ (NSEntityDescription *)QM_entityDescriptionInContext:(NSManagedObjectContext *)context; - -+ (NSArray *)QM_propertiesNamed:(NSArray *)properties - inContext:(NSManagedObjectContext *)context; - -/** - @name Fetch Requests - */ - -+ (NSArray *)QM_executeFetchRequest:(NSFetchRequest *)request - inContext:(NSManagedObjectContext *)context; - -+ (id)QM_executeFetchRequestAndReturnFirstObject:(NSFetchRequest *)request - inContext:(NSManagedObjectContext *)context; - -/** - @name Creating Entities - */ - -+ (instancetype)QM_createEntityInContext:(NSManagedObjectContext *)context; - -/** - Create a new entity using the provided entity description. - - @discussion Useful for creating entities that are not attached to a managed object context — just pass a valid entity description and a nil context. - - @param entityDescription Entity description or nil. A valid context must be provided if this parameter is nil. - @param context Managed Object Context or nil. A valid entity description must be provided if this parameter is nil. - - @return a new instance of the current NSManagedObject subclass - */ -+ (instancetype)QM_createEntityWithDescription:(NSEntityDescription *)entityDescription - inContext:(NSManagedObjectContext *)context; - -/** - Check if an object has been saved to at least one persistent store - - @return YES if object has a permanent ID - */ -- (BOOL)QM_isTemporaryObject; - -/** - @name Deleting Entities - */ - -/** - Checks the `isDeleted` and `managedObjectContext` methods to determine if the managed object has been deleted. - - @return YES if the object has been deleted, otherwise NO - - @since Available in v2.3 and later. - */ -- (BOOL)QM_isEntityDeleted; - -/** - Deletes the entity from the default context of the default stack. - - The default stack must be setup and available for use before using this method. - - @return YES if the delete was performed successfully, otherwise NO. - - @since Available in v1.8 and later. - */ -- (BOOL)QM_deleteEntity; - -/** - Deletes the entity from the supplied context. - - @param context Managed object context - - @return YES if the delete was performed successfully, otherwise NO. - - @since Available in v2.3 and later. - */ -- (BOOL)QM_deleteEntityInContext:(NSManagedObjectContext *)context; - -/** - Deletes all entities matching the passed predicate from the supplied context. - - @param predicate Predicate to evaluate objects against - @param context Managed object context - - @return YES if the delete was performed successfully, otherwise NO. - - @since Available in v1.8 and later. - */ -+ (BOOL)QM_deleteAllMatchingPredicate:(NSPredicate *)predicate inContext:(NSManagedObjectContext *)context; - -/** - Deletes all entities with a class that matches this subclass from the supplied context. - - @param context Managed object context - - @return YES if the delete was performed successfully, otherwise NO. - - @since Available in v1.8 and later. - */ -+ (BOOL)QM_truncateAllInContext:(NSManagedObjectContext *)context; - -/** - @name Sorting Entities - */ - -/** - Initializes an array of ascending sort descriptors for the supplied attributes. - - @param attributesToSortBy Array of attribute names to sort by. - - @return Array of sort descriptors. - - @since Available in v1.8 and later. - */ -+ (NSArray *)QM_ascendingSortDescriptors:(NSArray *)attributesToSortBy; - -/** - Initializes an array of descending sort descriptors for the supplied attributes. - - @param attributesToSortBy Array of attribute names to sort by. - - @return Array of sort descriptors. - - @since Available in v1.8 and later. - */ -+ (NSArray *)QM_descendingSortDescriptors:(NSArray *)attributesToSortBy; - -/** - Initializes an array of sort descriptors for the supplied attributes, sorted according to the supplied `ascending` value. - - @param ascending Whether to sort the descriptors ascending (`YES`) or descending (`NO`). - @param attributesToSortBy Array of attribute names to sort by. - - @return Array of sort descriptors. - - @since Available in v2.3 and later. - */ -+ (NSArray *)QM_sortAscending:(BOOL)ascending attributes:(NSArray *)attributesToSortBy; - -/** - @name Working Across Contexts - */ - -/** - If the object has a temporary object identifier, this method requests a permanent object identifier from the object's current context. - - @since Available in v2.1 and later. - */ -- (void)QM_obtainPermanentObjectID; - -/** - Updates the persistent properties of a managed object to use the latest values from the persistent store. - - @since Available in v3.0 and later. - */ -- (void)QM_refresh; - -/** - Retrieves an instance of the current managed object from another context. - - If the current managed object's context matches `otherContext`, self will be returned immediately. - - If the current managed object has a temporary ID, an exception with name "NSObjectInaccessibleException" will be thrown. - - @param otherContext Valid managed object context - - @return Managed object from the supplied context - - @since Available in v1.8 and later. - */ -- (instancetype)QM_inContext:(NSManagedObjectContext *)otherContext; - -/** - If the current managed object has a temporary ID, returns self immediately otherwise calls `- QM_inContext:` on self with the supplied managed object context. - - @param otherContext Valid managed object context - - @return Managed object from the supplied context - - @since Available in v3.0 and later. - */ -- (instancetype)QM_inContextIfTemporaryObject:(NSManagedObjectContext *)otherContext; - -/** - @name Validation - */ - -/** - Wrapper around `-validateForInsert:` that automatically logs any errors. - - @return YES if the entity is valid for insertion, otherwise NO. - - @since Available in v3.0 and later. - */ -- (BOOL)QM_isValidForInsert; - -/** - Wrapper around `-validateForUpdate:` that automatically logs any errors. - - @return YES if the entity is valid for updating, otherwise NO. - - @since Available in v3.0 and later. - */ -- (BOOL)QM_isValidForUpdate; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRequests.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRequests.h deleted file mode 100755 index 6fef3415e..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObject/NSManagedObject+QMCDRequests.h +++ /dev/null @@ -1,126 +0,0 @@ -// -// NSManagedObject+QMCDRequests.h -// QMCD Record -// -// Created by Injoit on 3/7/12. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -/** - Category methods to make creating fetch requests easier. - - @since Available in v1.8 and later. - */ -@interface NSManagedObject (QMCDRequests) - -/** - @name Global Options - */ - -/** - The current default batch size. - - Defaults to 20. - - @return Current batch size - - @since Available in v2.3 and later. - */ -+ (NSUInteger)QM_defaultBatchSize; - -/** - Sets the number of items to fetch by default. - - @param newBatchSize Number of items to fetch by default. - - @since Available in v2.3 and later. - */ -+ (void)QM_setDefaultBatchSize:(NSUInteger)newBatchSize; - -/** - @name Fetch Request Creation - */ - -/** - Initializes a fetch request that queries a context for all entities of the current type. - - @return Fetch request - - @since Available in v1.8 and later. - */ -+ (NSFetchRequest *)QM_requestAll; - -/** - Initializes a fetch request that queries a context for all entities of the current type that match the supplied predicate. - - @param predicate Predicate to evaluate objects against - - @return Fetch request - - @since Available in v1.8 and later. - */ -+ (NSFetchRequest *)QM_requestAllWithPredicate:(NSPredicate *)predicate; - -/** - Initializes a fetch request that queries a context for all entities of the current type where the supplied property has the supplied value. - - @param attributeName Attribute or property name to match the supplied value against. - @param value Value to match against. - - @return Fetch request - - @since Available in v1.8 and later. - */ -+ (NSFetchRequest *)QM_requestAllWhere:(NSString *)attributeName isEqualTo:(id)value; - -/** - Initializes a fetch request that queries a context for the first entity of the current type that matches the supplied predicate. - - @param predicate Predicate to evaluate objects against - - @return Fetch request - - @since Available in v1.8 and later. - */ -+ (NSFetchRequest *)QM_requestFirstWithPredicate:(NSPredicate *)predicate; - -/** - Initializes a fetch request that queries a context for the first entity of the current type where the supplied property has the supplied value. - - @param attributeName Attribute or property name to match the supplied value against. - @param value Value to match against. - - @return Fetch request - - @since Available in v1.8 and later. - */ -+ (NSFetchRequest *)QM_requestFirstByAttribute:(NSString *)attributeName withValue:(id)value; - -/** - Initializes a fetch request that queries a context for all entities of the current type, sorted by the supplied sort term in the supplied order. - - @param sortTerm Attribute name to sort by. - @param ascending `YES` if the attribute should be sorted ascending, `NO` for descending. - - @return Fetch request - - @since Available in v1.8 and later. - */ -+ (NSFetchRequest *)QM_requestAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending; - -/** - Initializes a fetch request that queries a context for all entities of the current type, sorted by the supplied sort term in the supplied order that match the supplied predicate. - - @param sortTerm Attribute name to sort by. - @param ascending `YES` if the attribute should be sorted ascending, `NO` for descending. - @param predicate Predicate to evaluate objects against - - @return Fetch request - - @since Available in v1.8 and later. - */ -+ (NSFetchRequest *)QM_requestAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)predicate; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDObserving.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDObserving.h deleted file mode 100755 index 55e8029dd..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDObserving.h +++ /dev/null @@ -1,81 +0,0 @@ -// -// NSManagedObjectContext+QMCDObserving.h -// QMCD Record -// -// Created by Injoit on 3/9/12. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -extern NSString * const QMCDRecordDidMergeChangesFromiCloudNotification; - -/** - Category methods to aid in observing changes in other contexts. - - @since Available in v3.0 and later. - */ -@interface NSManagedObjectContext (QMCDObserving) - -/** - Merge changes from another context into self. - - @param otherContext Managed object context to observe. - - @since Available in v3.0 and later. - */ -- (void)QM_observeContextDidSave:(NSManagedObjectContext *)otherContext; - -/** - Stops merging changes from the supplied context into self. - - @param otherContext Managed object context to stop observing. - - @since Available in v3.0 and later. - */ -- (void)QM_stopObservingContextDidSave:(NSManagedObjectContext *)otherContext; - -/** - Merges changes from another context into self on the main thread. - - @param otherContext Managed object context to observe. - - @since Available in v2.0 and later. - */ -- (void)QM_observeContextOnMainThread:(NSManagedObjectContext *)otherContext; - -/** - Merges changes from another context into self, saving after each change. - - If self is QMCDRecord's `+QM_rootContext`, changes will be persisted to the store. - - @param otherContext Alternate context that the current context should observe - - @since Available in v3.0 and later. - */ -- (void)QM_observeContextDidSaveAndSaveChangesToSelf:(NSManagedObjectContext *)otherContext; - -/** - Merges changes from the supplied persistent store coordinator into self in response to changes from iCloud. - - @param coordinator Persistent store coordinator - - @see -QM_stopObservingiCloudChangesInCoordinator: - - @since Available in v2.0 and later. - */ -- (void)QM_observeiCloudChangesInCoordinator:(NSPersistentStoreCoordinator *)coordinator; - -/** - Stops observation and merging of changes from the supplied persistent store coordinator in response to changes from iCloud. - - @param coordinator Persistent store coordinator - - @see -QM_observeiCloudChangesInCoordinator: - - @since Available in v2.0 and later. - */ -- (void)QM_stopObservingiCloudChangesInCoordinator:(NSPersistentStoreCoordinator *)coordinator; - -@end - diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDRecord.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDRecord.h deleted file mode 100755 index 425df3563..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDRecord.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// NSManagedObjectContext+QMCDRecord.h -// -// Created by Injoit on 11/23/09. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -extern NSString * const QMCDRecordDidMergeChangesFromiCloudNotification; - -@interface NSManagedObjectContext (QMCDRecord) - -- (void)QM_obtainPermanentIDsForObjects:(NSArray *)objects; - -+ (NSManagedObjectContext *)QM_context NS_RETURNS_RETAINED; -+ (NSManagedObjectContext *)QM_mainQueueContext; -+ (NSManagedObjectContext *)QM_privateQueueContext; - -+ (NSManagedObjectContext *)QM_privateQueueContextWithStoreCoordinator:(NSPersistentStoreCoordinator *)coordinator NS_RETURNS_RETAINED; - -- (NSString *)QM_description; -- (NSString *)QM_parentChain; - -- (void)QM_setWorkingName:(NSString *)workingName; -- (NSString *)QM_workingName; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDSaves.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDSaves.h deleted file mode 100755 index 3c0fecf2e..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectContext/NSManagedObjectContext+QMCDSaves.h +++ /dev/null @@ -1,108 +0,0 @@ -// -// NSManagedObjectContext+QMCDSaves.h -// QMCD Record -// -// Created by Injoit on 3/9/12. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -@import CoreData; - -/** - Options that can be passed when saving a context - - @since Available in v2.1 and later. - */ -typedef NS_OPTIONS(NSUInteger, MRContextSaveOptions) { - /** No options — used for cleanliness only */ - MRContextSaveOptionsNone = 0, - - /** When saving, continue saving parent contexts until the changes are present in the persistent store. */ - MRContextSaveOptionsSaveParentContexts = 1 << 0, - - /** Peform saves synchronously, blocking execution on the current thread until the save is complete. */ - MRContextSaveOptionsSaveSynchronously = 1 << 1 -}; - -typedef void (^MRSaveCompletionHandler)(BOOL success, NSError *error); - -/** - Category methods to simplify saving managed object contexts. - - @since Available in 2.0 and later. - */ -@interface NSManagedObjectContext (QMCDSaves) - -/** - Asynchronously save changes in the current context and it's parent. - Executes a save on the current context's dispatch queue asynchronously. This method only saves the current context, and the parent of the current context if one is set. - - @param completion Completion block that is called after the save has completed. The block is passed a success state as a `BOOL` and an `NSError` instance if an error occurs. - - @since Available in 2.1 and later. - */ -- (void)QM_saveOnlySelfWithCompletion:(MRSaveCompletionHandler)completion; - -/** - Asynchronously save changes in the current context all the way back to the persistent store. - Executes asynchronous saves on the current context, and any ancestors, until the changes have been persisted to the assigned persistent store. - - @param completion Completion block that is called after the save has completed. The block is passed a success state as a `BOOL` and an `NSError` instance if an error occurs. - - @since Available in 2.1 and later. - */ -- (void)QM_saveToPersistentStoreWithCompletion:(MRSaveCompletionHandler)completion; - -/** - Synchronously save changes in the current context and it's parent. - Executes a save on the current context's dispatch queue. This method only saves the current context, and the parent of the current context if one is set. The method will not return until the save is complete. - - @return Success state of the save. - - @since Available in 2.1 and later. - */ -- (BOOL)QM_saveOnlySelfAndWait; - -/** - Synchronously save changes in the current context and merge changes to it's parent. - - @param error Pass in an NSError by reference to receive any errors encountered during the save. - - @return Success state of the save - - @since Available in 2.1 and later. - */ -- (BOOL)QM_saveOnlySelfAndWaitWithError:(NSError **)error; - -/** - Synchronously save changes in the current context all the way back to the persistent store. - Executes saves on the current context, and any ancestors, until the changes have been persisted to the assigned persistent store. The method will not return until the save is complete. - - @return Success state of the save. - - @since Available in 2.1 and later. - */ -- (BOOL)QM_saveToPersistentStoreAndWait; - -/** - Synchronously save changes in the current context all the way back to the persistent store. - - @param error Pass in an NSError by reference to receive any errors encountered during the save. - - @return Success state of the save. - - @since Available in 2.1 and later. - */ -- (BOOL)QM_saveToPersistentStoreAndWaitWithError:(NSError **)error; - -/** - Save the current context with options. All other save methods are convenience wrappers around this method. - - @param saveOptions Values from MRContextSaveOptions bitmasked for the save process. - @param completion Completion block that is called after the save has completed. The block is passed a success state as a `BOOL` and an `NSError` instance if an error occurs. - - @since Available in 2.1 and later. - */ - - (void)QM_saveWithOptions:(MRContextSaveOptions)saveOptions completion:(MRSaveCompletionHandler)completion; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectModel+QMCDRecord.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectModel+QMCDRecord.h deleted file mode 100755 index d895fea29..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSManagedObjectModel+QMCDRecord.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// NSManagedObjectModel+QMCDRecord.h -// -// Created by Injoit on 3/11/10. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -@interface NSManagedObjectModel (QMCDRecord) - -+ (NSManagedObjectModel *)QM_managedObjectModelAtURL:(NSURL *)url; -+ (NSManagedObjectModel *)QM_mergedObjectModelFromMainBundle; -+ (NSManagedObjectModel *)QM_managedObjectModelNamed:(NSString *)modelFileName; -+ (NSManagedObjectModel *)QM_newModelNamed:(NSString *)modelName inBundleNamed:(NSString *)bundleName NS_RETURNS_RETAINED; -+ (NSManagedObjectModel *)QM_newModelNamed:(NSString *)modelName inBundleNamed:(NSString *)bundleName fromClass:(Class)aClass NS_RETURNS_RETAINED; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecord.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecord.h deleted file mode 100755 index 53184c391..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecord.h +++ /dev/null @@ -1,76 +0,0 @@ -// -// NSPersistentStore+QMCDRecord.h -// -// Created by Injoit on 3/11/10. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import "QMCDRecord.h" - -@interface NSPersistentStore (QMCDRecord) - -/** - Default location and filename for the persistent store created by QMCDRecord. - - This is usually `/Users/MyAccount/Library/Application Support/MyAppName/CoreDataStore.sqlite`. - - @return URL for the default persistent store file. - - @since Available in v2.3 and later. - */ -+ (NSURL *)QM_defaultLocalStoreUrl; - -/** - Given the provided filename, return a URL to the default location for storing persistent stores. By default this is in the application support directory, ie: `/Users/${USER}/Library/Application Support/${MY_APPLICATION_NAME}/{$storeFileName}` - - @param storeFileName Filename that you'd like to use. This should include a valid file extension. - - @return URL to proposed persistent store file. - - @since Available in v2.3 and later. - */ -+ (NSURL *)QM_fileURLForStoreName:(NSString *)storeFileName; - - -+ (NSURL *)QM_fileURLForStoreName:(NSString *)storeFileName applicationGroupIdentifier:(NSString *)appGroupIdentifier; - -+ (NSDictionary *)QM_migrationOptionsForStoreName:(NSString *)storeFileName applicationGroupIdentifier:(NSString *)appGroupIdentifier; - -/** - Uses the result of `+ QM_fileURLForStoreName: applicationGroupIdentifier:`, but returns nil if the store file does not exist at the returned URL. - - @param storeFileName Filename that you'd like to use. This should include a valid file extension. - - @return URL to proposed persistent store file if it exists, otherwise nil - */ -+ (NSURL *)QM_fileURLForStoreNameIfExistsOnDisk:(NSString *)storeFileName applicationGroupIdentifier:(NSString *)appGroupIdentifier; - -+ (NSURL *)QM_cloudURLForUbiqutiousContainer:(NSString *)bucketName; - -- (NSArray *)QM_sqliteURLs; - -- (BOOL)QM_copyToURL:(NSURL *)destinationUrl error:(NSError **)error; - -/** - Removes the store files for this persistent store. - - @return YES if removing all items was successful - - @see +QM_removePersistentStoreFilesAtURL: - - @since Available in v2.3 and later. - */ -- (BOOL)QM_removePersistentStoreFiles; - -/** - Removes the persistent store files at the specified URL, as well as any sidecar files that are present, such as STORENAME.sqlite-shm and STORENAME.sqlite-wal - - @param url File URL pointing to an NSPersistentStore file - - @return YES if removing all items was successful - - @since Available in v2.3 and later. - */ -+ (BOOL)QM_removePersistentStoreFilesAtURL:(NSURL*)url; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecordPrivate.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecordPrivate.h deleted file mode 100755 index e17630048..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStore+QMCDRecordPrivate.h +++ /dev/null @@ -1,10 +0,0 @@ -// -// Created by Tony Arnold on 28/04/2014. -// Copyright (c) 2014 QMCD Panda Software LLC. All rights reserved. -// - -#import - -NSString *QM_defaultApplicationStorePath(void); -NSString *QM_userDocumentsPath(void); -NSString *QM_storePathForApplicationGroupIdentifier(NSString *groupidentifier); diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStoreCoordinator/NSPersistentStoreCoordinator+QMCDRecord.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStoreCoordinator/NSPersistentStoreCoordinator+QMCDRecord.h deleted file mode 100755 index e855592d8..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/CoreData/NSPersistentStoreCoordinator/NSPersistentStoreCoordinator+QMCDRecord.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// NSPersistentStoreCoordinator+QMCDRecord.h -// -// Created by Injoit on 3/11/10. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import "QMCDRecord.h" -#import "NSPersistentStore+QMCDRecord.h" - -extern NSString * const QMCDRecordShouldDeletePersistentStoreOnModelMismatchKey; -extern NSString * const QMCDRecordShouldMigrateKey; -extern NSString * const QMCDRecordShouldDeleteOldDBKey; -extern NSString * const QMCDRecordTargetURLKey; -extern NSString * const QMCDRecordSourceURLKey; -extern NSString * const QMCDRecordGroupURLKey; - -@interface NSPersistentStoreCoordinator (QMCDRecord) - -- (NSPersistentStore *)QM_addSqliteStoreAtURL:(NSURL *)url withOptions:(NSDictionary *__autoreleasing)options; -- (NSPersistentStore *)QM_addSqliteStoreNamed:(id)storeFileName withOptions:(__autoreleasing NSDictionary *)options; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSArray+QMCDRecord.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSArray+QMCDRecord.h deleted file mode 100755 index 4888c3a4f..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSArray+QMCDRecord.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// Created by Tony Arnold on 8/04/2014. Originally proposed by Raymond Edwards on 09/07/2013 -// Copyright (c) 2014 QMCD Panda Software LLC. All rights reserved. -// - -#import - -/** - Category methods for working with NSManagedObjects within NSArray instances. - - @since Available in v2.3 and later. - */ -@interface NSArray (QMCDRecord) - -/** - Enumerates an array of NSManagedObjects and retrieves them from the specified context if possible. - If it's not possible to retrieve any of the managed objects from the specified context, they will not be included in the result. - - @param context Managed object context - @return Array of NSManagedObjects in the specified context - - @since Available in v2.3 and later. - */ -- (NSArray *)QM_entitiesInContext:(NSManagedObjectContext *)context; - -/** - Deletes any managed objects in the array instance from the specified context. - @param context Managed object context - - @since Available in v2.3 and later. - */ -- (void)QM_deleteEntitiesInContext:(NSManagedObjectContext *)context; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSDictionary+QMCDRecordAdditions.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSDictionary+QMCDRecordAdditions.h deleted file mode 100755 index 5b4fc724b..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSDictionary+QMCDRecordAdditions.h +++ /dev/null @@ -1,55 +0,0 @@ -// -// NSDictionary+QMCDRecordAdditions.h -// QMCDRecord -// -// Created by Injoit on 9/14/13. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -/** - NSDictionary category methods to support various aspects of QMCDRecord. - - @since Available in v3.0 and later. - */ -@interface NSDictionary (QMCDRecordAdditions) - -/** - Adds the entries from another dictionary into this dictionary. - - @param dictionary Another dictionary instance - - @return Dictionary containing entries from both dictionaries. - */ -- (NSMutableDictionary *)QM_dictionaryByMergingDictionary:(NSDictionary *)dictionary; - -/** - Default SQLite store options for setting up a persistent store. - - @return Dictionary containing default options for a SQLite-based store. - */ -+ (NSDictionary *)QM_defaultSqliteStoreOptions; - -/** - Setup options for a persistent store that specify that the store should be automatically migrated if possible. - - @return Dictionary containing options for a persistent store. - */ -+ (NSDictionary *)QM_autoMigrationOptions; - -/** - Setup options for a persistent store that specify that the store should not be automatically migrated. - - @return Dictionary containing options for a persistent store. - */ -+ (NSDictionary *)QM_manualMigrationOptions; - -/** - Convenience method to read the value for the `QMCDRecordShouldDeletePersistentStoreOnModelMismatchKey` key from self and return the value as a BOOL. - - @return BOOL value for key. - */ -- (BOOL)QM_shouldDeletePersistentStoreOnModelMismatch; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSError+QMCDRecordErrorHandling.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSError+QMCDRecordErrorHandling.h deleted file mode 100755 index f2ef57cc1..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/Categories/Foundation/NSError+QMCDRecordErrorHandling.h +++ /dev/null @@ -1,98 +0,0 @@ -// -// NSError+QMCDRecordErrorHandling.h -// Sidekick -// -// Created by Injoit on 5/7/13. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -/** - Category method to make logging to the console easier. - - @since Available in v3.0 and later. - */ -@interface NSString (QMCDRecordLogging) - -/** - Logs self to the console. - - @since Available in v3.0 and later. - */ -- (void)QM_logToConsole; - -@end - -/** - Category method to make dealing with errors returned by Core Data easier. - - @since Available in v3.0 and later. - */ -@interface NSError (QMCDRecordErrorHandling) - -/** - Generates a descriptive string based upon self. - - @return String description of the error. - - @since Available in v3.0 and later. - */ -- (NSString *)QM_coreDataDescription; - -@end - -/** - Checks if the supplied error code represents a validation error. - - @param errorCode Error code - - @return `YES` if the code is a validation error, otherwise `NO`. - - @since Available in v3.0 and later. - */ -BOOL QM_errorCodeIsValidationErrorCode(NSInteger errorCode); - -/** - Checks if the supplied error code represents a persistent store error. - - @param errorCode Error code - - @return `YES` if the code is a persistent store error, otherwise `NO`. - - @since Available in v3.0 and later. - */ -BOOL QM_errorCodeIsPersistentStoreErrorCode(NSInteger errorCode); - -/** - Checks if the supplied error code represents a migration error. - - @param errorCode Error code - - @return `YES` if the code is a migration error, otherwise `NO`. - - @since Available in v3.0 and later. - */ -BOOL QM_errorCodeIsMigrationErrorCode(NSInteger errorCode); - -/** - Checks if the supplied error code represents an object graph error. - - @param errorCode Error code - - @return `YES` if the code is an object graph error, otherwise `NO`. - - @since Available in v3.0 and later. - */ -BOOL QM_errorCodeIsObjectGraphErrorCode(NSInteger errorCode); - -/** - Generates a string summary from the supplied error code. - - @param errorCode Error code - - @return Summary of the supplied error code. - - @since Available in v3.0 and later. - */ -NSString *QM_errorSummaryFromErrorCode(NSInteger errorCode); diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDMigrationManager.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDMigrationManager.h deleted file mode 100755 index 5572dec6b..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDMigrationManager.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// QMCDMigrationManager.h -// Photobucket Next -// -// Created by Injoit on 8/6/13. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -@interface QMCDMigrationManager : NSObject - -@property (nonatomic, copy) NSString *sourceModelName; -@property (nonatomic, copy) NSString *targetModelName; -@property (nonatomic, copy) NSString *versionedModelName; - -- (instancetype) initWithSourceModelName:(NSString *)sourceName targetModelName:(NSString *)targetName; - -- (BOOL) migrateStoreAtURL:(NSURL *)sourceStoreURL toStoreAtURL:(NSURL *)targetStoreURL; -- (BOOL) migrateStoreAtURL:(NSURL *)sourceStoreURL toStoreAtURL:(NSURL *)targetStoreURL mappingModelURL:(NSURL *)mappingModelURL; -- (BOOL) migrateStoreAtURL:(NSURL *)sourceStoreURL toStoreAtURL:(NSURL *)targetStoreURL mappingModelURL:(NSURL *)mappingModelURL progressiveMigration:(BOOL)progressiveMigration; - -@end - - diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord.h deleted file mode 100755 index 8d47480b6..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// Created by Injoit on 3/11/10. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - - -#ifdef __OBJC__ -#import -#import - -#import "QMCDRecordInternal.h" -#import "QMCDRecord+Options.h" -#import "QMCDRecord+VersionInformation.h" - -#import "QMCDRecordStack.h" - -#import "NSArray+QMCDRecord.h" - -#import "NSManagedObject+QMCDRecord.h" -#import "NSManagedObject+QMCDRequests.h" -#import "NSManagedObject+QMCDFinders.h" -#import "NSManagedObject+QMCDAggregation.h" -#import "NSManagedObjectContext+QMCDRecord.h" -#import "NSManagedObjectContext+QMCDObserving.h" -#import "NSManagedObjectContext+QMCDSaves.h" - -#import "NSPersistentStoreCoordinator+QMCDRecord.h" - -#import "NSManagedObjectModel+QMCDRecord.h" -#import "NSPersistentStore+QMCDRecord.h" - -#import "NSError+QMCDRecordErrorHandling.h" - -#endif // ifdef __OBJC__ diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+Options.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+Options.h deleted file mode 100755 index b2f39b28b..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+Options.h +++ /dev/null @@ -1,90 +0,0 @@ -// -// QMCDRecord+Options.h -// QMCD Record -// -// Created by Injoit on 3/6/12. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import "QMCDRecord.h" - -/** - Defines "levels" of logging that will be used as values in a bitmask that filters log messages. - - @since Available in v2.3 and later. - */ -typedef NS_ENUM (NSInteger, QMCDRecordLoggingMask) -{ - /** Disable all logging */ - QMCDRecordLoggingMaskOff = 0, - - /** Log fatal errors */ - QMCDRecordLoggingMaskFatal = 1 << 0, - - /** Log all errors */ - QMCDRecordLoggingMaskError = 1 << 1, - - /** Log warnings, and all errors */ - QMCDRecordLoggingMaskWarn = 1 << 2, - - /** Log informative messagess, warnings and all errors */ - QMCDRecordLoggingMaskInfo = 1 << 3, - - /** Log verbose diagnostic information, messages, warnings and all errors */ - QMCDRecordLoggingMaskVerbose = 1 << 4, -}; - -/** - Defines a mask for logging that will be used by to filter log messages. - - @since Available in v2.3 and later. - */ -typedef NS_ENUM (NSInteger, QMCDRecordLoggingLevel) -{ - /** Don't log anything */ - QMCDRecordLoggingLevelOff = 0, - - /** Log all fatal messages */ - QMCDRecordLoggingLevelFatal = (QMCDRecordLoggingMaskFatal), - - /** Log all errors and fatal messages */ - QMCDRecordLoggingLevelError = (QMCDRecordLoggingMaskFatal | QMCDRecordLoggingMaskError), - - /** Log warnings, errors and fatal messages */ - QMCDRecordLoggingLevelWarn = (QMCDRecordLoggingMaskFatal | QMCDRecordLoggingMaskError | QMCDRecordLoggingMaskWarn), - - /** Log informative, warning and error messages */ - QMCDRecordLoggingLevelInfo = (QMCDRecordLoggingMaskFatal | QMCDRecordLoggingMaskError | QMCDRecordLoggingMaskWarn | QMCDRecordLoggingMaskInfo), - - /** Log verbose diagnostic, informative, warning and error messages */ - QMCDRecordLoggingLevelVerbose = (QMCDRecordLoggingMaskFatal | QMCDRecordLoggingMaskError | QMCDRecordLoggingMaskWarn | QMCDRecordLoggingMaskInfo | QMCDRecordLoggingMaskVerbose), -}; - -/** - Provides options for configuring QMCDRecord. - */ -@interface QMCDRecord (Options) - -/** - @name Logging Level - */ - -/** - Returns the current logging level for QMCDRecord in the current application. - - @return Current QMCDRecordLoggingLevel - - @since Available in v2.3 and later. - */ -+ (QMCDRecordLoggingLevel) loggingLevel; - -/** - Sets the logging level for QMCDRecord in the current application. - - @param level Any value from QMCDRecordLoggingLevel - - @since Available in v2.3 and later. - */ -+ (void) setLoggingLevel:(QMCDRecordLoggingLevel)level; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+Options.m b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+Options.m deleted file mode 100755 index 57877a947..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+Options.m +++ /dev/null @@ -1,25 +0,0 @@ -// -// QMCDRecord+Options.m -// QMCD Record -// -// Created by Injoit on 3/6/12. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import "QMCDRecord+Options.h" - -static QMCDRecordLoggingLevel magicalRecordLoggingLevel = QMCDRecordLoggingLevelVerbose; - -@implementation QMCDRecord (Options) - -+ (QMCDRecordLoggingLevel) loggingLevel; -{ - return magicalRecordLoggingLevel; -} - -+ (void) setLoggingLevel:(QMCDRecordLoggingLevel)level; -{ - magicalRecordLoggingLevel = level; -} - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+VersionInformation.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+VersionInformation.h deleted file mode 100755 index 8c6fbe4e2..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecord+VersionInformation.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// Created by Tony Arnold on 8/04/2014. -// Copyright (c) 2014 QMCD Panda Software LLC. All rights reserved. -// - -#import "QMCDRecord.h" - -/** - Defines current and historical version numbers of QMCDRecord. - - @since Available in v2.3 and later. - */ -typedef NS_ENUM(NSUInteger, QMCDRecordVersionNumber) -{ - /** Version 2.2.0 */ - QMCDRecordVersionNumber2_2 = 220, - - /** Version 2.3.0 */ - QMCDRecordVersionNumber2_3 = 230, - - /** Version 3.0.0 */ - QMCDRecordVersionNumber3_0 = 300, -}; - -/** - Provides an way for developers to retrieve the version of QMCDRecord they are currently using within their apps. - - @since Available in v2.3 and later. - */ -@interface QMCDRecord (VersionInformation) - -///--------------------------- -/// @name Version Information -///--------------------------- - -/** - Returns the current version of QMCDRecord. See the QMCDRecordVersionNumber enumeration for valid current and historical values. - - @return The current version as a double. - - @since Available in v2.3 and later - */ -+ (QMCDRecordVersionNumber)version; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordInternal.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordInternal.h deleted file mode 100755 index f0cd90660..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordInternal.h +++ /dev/null @@ -1,18 +0,0 @@ -#import - -/** - @since Available in v2.0 and later. - */ -@interface QMCDRecord : NSObject - - -/** - Determines the store file name your app should use. This method is used by the QMCDRecord SQLite stacks when a store file is not specified. The file name returned is in the form ".sqlite". `` is taken from the application's info dictionary, which is retrieved from the method [[NSBundle mainBundle] infoDictionary]. If no bundle name is available, "CoreDataStore.sqlite" will be used. - - @return String of the form .sqlite - - @since Available in v2.0 and later. - */ -+ (NSString *) defaultStoreName; - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordLogging.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordLogging.h deleted file mode 100755 index 84bde08cd..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecord/QMCDRecordLogging.h +++ /dev/null @@ -1,69 +0,0 @@ -// -// QMCDRecordLogging.h -// QMCDRecord -// -// Created by Injoit on 10/4/13. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#ifndef QMCDRecord_QMCDRecordLogging_h -#define QMCDRecord_QMCDRecordLogging_h - -#import "QMCDRecord+Options.h" - -#define QMLOG_ASYNC_ENABLED YES - -#define QMLOG_ASYNC_ERROR ( NO && QMLOG_ASYNC_ENABLED) -#define QMLOG_ASYNC_WARN (YES && QMLOG_ASYNC_ENABLED) -#define QMLOG_ASYNC_INFO (YES && QMLOG_ASYNC_ENABLED) -#define QMLOG_ASYNC_VERBOSE (YES && QMLOG_ASYNC_ENABLED) - -//#define QM_LOGGING_ENABLED YES - -#ifdef QM_LOGGING_ENABLED - -#ifndef QMLOG_MACRO - -#define QMLOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \ -NSLog (frmt, ##__VA_ARGS__) - -#define QMLOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \ -do { if ((lvl & flg) == flg) { QMLOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } } while(0) - -#define QMLOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \ -QMLOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__) - -#define QMLOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \ -QMLOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__) - -#endif - -#define QMCDLogFatal(frmt, ...) QMLOG_OBJC_MAYBE(QMLOG_ASYNC_ERROR, [QMCDRecord loggingLevel], QMCDRecordLoggingMaskFatal, 0, frmt, ##__VA_ARGS__) -#define QMCDLogError(frmt, ...) QMLOG_OBJC_MAYBE(QMLOG_ASYNC_ERROR, [QMCDRecord loggingLevel], QMCDRecordLoggingMaskError, 0, frmt, ##__VA_ARGS__) -#define QMCDLogWarn(frmt, ...) QMLOG_OBJC_MAYBE(QMLOG_ASYNC_WARN, [QMCDRecord loggingLevel], QMCDRecordLoggingMaskWarn, 0, frmt, ##__VA_ARGS__) -#define QMCDLogInfo(frmt, ...) QMLOG_OBJC_MAYBE(QMLOG_ASYNC_INFO, [QMCDRecord loggingLevel], QMCDRecordLoggingMaskInfo, 0, frmt, ##__VA_ARGS__) -#define QMCDLogVerbose(frmt, ...) QMLOG_OBJC_MAYBE(QMLOG_ASYNC_VERBOSE, [QMCDRecord loggingLevel], QMCDRecordLoggingMaskVerbose, 0, frmt, ##__VA_ARGS__) - -#define QMCDLogCFatal(frmt, ...) QMLOG_C_MAYBE(QMLOG_ASYNC_ERROR, [QMCDRecord loggingLevel], QMCDRecordLoggingMaskFatal, 0, frmt, ##__VA_ARGS__) -#define QMCDLogCError(frmt, ...) QMLOG_C_MAYBE(QMLOG_ASYNC_ERROR, [QMCDRecord loggingLevel], QMCDRecordLoggingMaskError, 0, frmt, ##__VA_ARGS__) -#define QMCDLogCWarn(frmt, ...) QMLOG_C_MAYBE(QMLOG_ASYNC_WARN, [QMCDRecord loggingLevel], QMCDRecordLoggingMaskWarn, 0, frmt, ##__VA_ARGS__) -#define QMCDLogCInfo(frmt, ...) QMLOG_C_MAYBE(QMLOG_ASYNC_INFO, [QMCDRecord loggingLevel], QMCDRecordLoggingMaskInfo, 0, frmt, ##__VA_ARGS__) -#define QMCDLogCVerbose(frmt, ...) QMLOG_C_MAYBE(QMLOG_ASYNC_VERBOSE, [QMCDRecord loggingLevel], QMCDRecordLoggingMaskVerbose, 0, frmt, ##__VA_ARGS__) - -#else - -#define QMCDLogFatal(frmt, ...) ((void)0) -#define QMCDLogError(frmt, ...) ((void)0) -#define QMCDLogWarn(frmt, ...) ((void)0) -#define QMCDLogInfo(frmt, ...) ((void)0) -#define QMCDLogVerbose(frmt, ...) ((void)0) - -#define QMCDLogCFatal(frmt, ...) ((void)0) -#define QMCDLogCError(frmt, ...) ((void)0) -#define QMCDLogCWarn(frmt, ...) ((void)0) -#define QMCDLogCInfo(frmt, ...) ((void)0) -#define QMCDLogCVerbose(frmt, ...) ((void)0) - -#endif - -#endif diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecordStack/QMCDRecordStack.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecordStack/QMCDRecordStack.h deleted file mode 100755 index e63354b2c..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMCDRecord/QMCDRecordStack/QMCDRecordStack.h +++ /dev/null @@ -1,54 +0,0 @@ -// -// QMCDRecordStack.h -// QMCDRecord -// -// Created by Injoit on 9/14/13. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -@interface QMCDRecordStack : NSObject - -@property (nonatomic, copy) NSString *stackName; - -@property (nonatomic, strong, readonly) NSManagedObjectContext *privateWriterContext; - -@property (nonatomic, strong) NSManagedObjectModel *model; -@property (nonatomic, strong) NSPersistentStoreCoordinator *coordinator; -@property (nonatomic, strong) NSPersistentStore *store; - - -/*! - @property shouldDeletePersistentStoreOnModelMistmatch - @abstract If true, when configuring the persistant store coordinator, and QMCD Record encounters a store that does not match the model, it will attempt to remove it and re-create a new store. - This is extremely useful during development where every model change could potentially require a delete/reinstall of the app. - */ - -@property (nonatomic, assign) BOOL shouldDeletePersistentStoreOnModelMismatch; - -@property (nonatomic, copy, readwrite) NSDictionary *storeOptions; -@property (nonatomic, copy, readonly) NSURL *storeURL; - -@property (nonatomic, assign) BOOL loggingEnabled; -@property (nonatomic, assign) BOOL saveOnApplicationWillTerminate; -@property (nonatomic, assign) BOOL saveOnApplicationWillResignActive; - -+ (instancetype)stack; - -- (void)reset; - -- (void)setModelFromClass:(Class)modelClass; -- (void)setModelNamed:(NSString *)modelName; - -+ (instancetype)stackWithStoreNamed:(NSString *)name - model:(NSManagedObjectModel *)model; - -+ (instancetype)stackWithStoreNamed:(NSString *)name - model:(NSManagedObjectModel *)model - applicationGroupIdentifier:(NSString *)appGroupIdentifier; - -- (NSDictionary *)defaultStoreOptions; - - -@end diff --git a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMDBStorage.h b/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMDBStorage.h deleted file mode 100644 index baef1c38b..000000000 --- a/Pods/QMServicesDevelopment/QMDBStorage/QMDBStorage/QMDBStorage.h +++ /dev/null @@ -1,79 +0,0 @@ -// -// QMDBStorage.h -// QMDBStorage -// -// Created by Andrey Ivanov on 06.11.14. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import "QMCDRecord.h" - -#define IS(attrName, attrVal) [NSPredicate predicateWithFormat:@"%K == %@", attrName, attrVal] - -NS_ASSUME_NONNULL_BEGIN - -@interface QMDBStorage : NSObject - -@property (strong, nonatomic) QMCDRecordStack *stack; - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -/** - Init with store name, model and app group identifier - - @param storeName Store name - @param model model name - @param appGroupIdentifier App group identifier - @return instance - */ -- (instancetype)initWithStoreNamed:(NSString *)storeName - model:(NSManagedObjectModel *)model - applicationGroupIdentifier:(nullable NSString *)appGroupIdentifier NS_DESIGNATED_INITIALIZER; - -/** - Setup database - - @brief Load CoreData(Sqlite) file - @param storeName - filename - */ -+ (void)setupDBWithStoreNamed:(NSString *)storeName; - -/** - Setup stack with store name and group identifier - - @param storeName Store name - @param appGroupIdentifier App group identifier - */ -+ (void)setupDBWithStoreNamed:(NSString *)storeName - applicationGroupIdentifier:(nullable NSString *)appGroupIdentifier; - -/** - Clean data base with store name - */ -+ (void)cleanDBWithStoreName:(NSString *)name; - -/** - Asynchronously performs a given block on the NSPrivateQueueConcurrencyType queue. - @param block Background queue context (NSPrivateQueueConcurrencyType) - */ -- (void)performBackgroundQueue:(void (^)(NSManagedObjectContext *ctx))block; - -/** - Synchronously performs a given block on the NSPrivateQueueConcurrencyType queue. - */ -- (void)performMainQueue:(void (^)(NSManagedObjectContext *ctx))block; - -/** - Saves to Persistent Store. - - @param block Asynchronously performs a given block on the NSPrivateQueueConcurrencyType queue - @param finish Asyncronously performs a given block after saveToPersistentStoreAndWait on the main queue - */ -- (void)save:(void (^)(NSManagedObjectContext *ctx))block - finish:(dispatch_block_t)finish; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMManagers/QMDeferredQueueManager.h b/Pods/QMServicesDevelopment/QMManagers/QMDeferredQueueManager.h deleted file mode 100644 index 1c7f7b779..000000000 --- a/Pods/QMServicesDevelopment/QMManagers/QMDeferredQueueManager.h +++ /dev/null @@ -1,72 +0,0 @@ -// -// QMDeferredQueueManager.h -// QMServices -// -// Created by Vitaliy Gurkovsky on 8/16/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import -#import "QMBaseService.h" - -@protocol QMDeferredQueueManagerDelegate; -@protocol QMMemoryTemporaryQueueDelegate; - - -NS_ASSUME_NONNULL_BEGIN - -typedef NS_ENUM(NSUInteger, QMMessageStatus) { - QMMessageStatusSent = 0, - QMMessageStatusSending, - QMMessageStatusNotSent -}; - -@interface QMDeferredQueueManager : QMBaseService - -@property (nonatomic, assign) NSTimeInterval autoSendTimeInterval; -@property (nonatomic, assign) NSUInteger maxDeferredActionsCount; - -- (void)addDelegate:(id )delegate; -- (void)removeDelegate:(id )delegate; - -- (void)addOrUpdateMessage:(QBChatMessage *)message; -- (void)removeMessage:(QBChatMessage *)message; - -- (void)removeMessage:(QBChatMessage *)message - andCallDelegate:(BOOL)shouldCallDelegate; - -- (void)performDeferredActions; -- (void)performDeferredActionsForDialogWithID:(NSString *)dialogID; - -- (void)perfromDefferedActionForMessage:(QBChatMessage *)message - withCompletion:(nullable QBChatCompletionBlock)completion; - -- (QMMessageStatus)statusForMessage:(QBChatMessage *)message; - -- (BOOL)shouldSendMessagesInDialogWithID:(NSString *)dialogID; - -@end - -@protocol QMDeferredQueueManagerDelegate - -@optional - -- (void)deferredQueueManager:(QMDeferredQueueManager *)queueManager - performActionWithMessage:(QBChatMessage *)message - withCompletion:(nullable QBChatCompletionBlock)completion; - -- (void)deferredQueueManager:(QMDeferredQueueManager *)queueManager - didAddMessageLocally:(QBChatMessage *)addedMessage; - -- (void)deferredQueueManager:(QMDeferredQueueManager *)queueManager - didUpdateMessageLocally:(QBChatMessage *)updatedMessage; - -- (void)deferredQueueManager:(QMDeferredQueueManager *)queueManager - didRemoveMessageLocally:(QBChatMessage *)removedMessage; - -- (void)deferredQueueManager:(QMDeferredQueueManager *)queueManager - didUpdateMessageStatus:(QMMessageStatus)status - message:(QBChatMessage *)message; -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMManagers/QMDeferredQueueMemoryStorage.h b/Pods/QMServicesDevelopment/QMManagers/QMDeferredQueueMemoryStorage.h deleted file mode 100644 index 35052a424..000000000 --- a/Pods/QMServicesDevelopment/QMManagers/QMDeferredQueueMemoryStorage.h +++ /dev/null @@ -1,59 +0,0 @@ -// -// QMDeferredQueueMemoryStorage.h -// QMServices -// -// Created by Vitaliy Gurkovsky on 8/16/16. -// Copyright © 2016 Quickblox. All rights reserved. -// - -#import -#import "QMMemoryStorageProtocol.h" -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QMDeferredQueueMemoryStorage : NSObject - -/** - Add message to memory storage - - @param message QBChatMessage instance - */ -- (void)addMessage:(QBChatMessage *)message; - -/** - Remove message from memory storage - - @param message QBChatMessage instance - */ -- (void)removeMessage:(QBChatMessage *)message; - -/** - Check message is contains in memory storage - - @param message QBChatMessage instance - @return return YES if message containts in memory storage - */ -- (BOOL)containsMessage:(QBChatMessage *)message; - -//MARK: Filters - -/** - Get messages sorted by dateSent - - @return Array of QBChatMessage's - */ -- (NSArray *)messages; - - -/** - Get sorted messages using descriptors - - @param descriptors Array of NSSortDescriptor - @return Array of QBChatMessage's - */ -- (NSArray *)sortedMessagesUsingDescriptors:(NSArray *)descriptors; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMManagers/QMServicesManager.h b/Pods/QMServicesDevelopment/QMManagers/QMServicesManager.h deleted file mode 100644 index fa8789031..000000000 --- a/Pods/QMServicesDevelopment/QMManagers/QMServicesManager.h +++ /dev/null @@ -1,72 +0,0 @@ -// -// QMServiceManager.h -// QMServices -// -// Created by Andrey Moskvin on 5/19/15. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import "QMServices.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * Base manager that handles authentication and chat functionality. - */ -@interface QMServicesManager : NSObject -< -QMServiceManagerProtocol, -QMChatServiceCacheDataSource, -QMChatServiceDelegate, -QMChatConnectionDelegate, -QMUsersServiceCacheDataSource, -QMUsersServiceDelegate -> - -/** - * REST authentication service. - */ -@property (strong, nonatomic, readonly) QMAuthService *authService; - -/** - * Chat service. - */ -@property (strong, nonatomic, readonly) QMChatService *chatService; - -/** - * Users service. - */ -@property (strong, nonatomic, readonly) QMUsersService *usersService; - -+ (instancetype)instance; - -/** - * Determines whether extended services logging is enabled. - * - * @param flag whether logs should be enabled or not - * - * @discussion By default logs are enabled. - * - * @note If you don't want logs in production environment you should disable them within this flag. - */ -+ (void)enableLogging:(BOOL)flag; - -/** - * Login to Quickblox REST and chat, group dialog join. - * - * @param user QBUUser for login. - * @param completion Completion block with a result. - */ -- (void)logInWithUser:(QBUUser *)user completion:(nullable void(^)(BOOL success, NSString * _Nullable errorMessage))completion; - -/** - * Logouts from Quickblox REST and chat, clears dialogs and messages. - * - * @param completion Completion block with a result. - */ -- (void)logoutWithCompletion:(nullable dispatch_block_t)completion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/QMOpenGraphCache.h b/Pods/QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/QMOpenGraphCache.h deleted file mode 100644 index 5d9dcf20d..000000000 --- a/Pods/QMServicesDevelopment/QMOpenGraphCache/QMOpenGraphCache/QMOpenGraphCache.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// QMOpenGraphCache.h -// QMOpenGraphCache -// -// Created by Andrey Ivanov on 14/06/2017. -// Copyright © 2017 QuickBlox. All rights reserved. -// - -#import -#import "QMDBStorage.h" -#import "QMOpenGraphItem.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface QMOpenGraphCache : QMDBStorage - -@property (class, readonly) QMOpenGraphCache *instance; - -/** - Get Open Graph Item with url if exist - - @param ID key - @return QMOpenGraphItem instance for - */ -- (nullable QMOpenGraphItem *)openGrapItemWithID:(NSString *)ID; - -/** - Insert or update openGraphItem - @param openGraphItem QMOpenGraphItem instance - @param completion completion block - */ -- (void)insertOrUpdateOpenGraphItem:(QMOpenGraphItem *)openGraphItem - completion:(nullable dispatch_block_t)completion; - -/** - Remove all Open Graph items from storage - - @param completion completion block - */ -- (void)deleteAllOpenGraphItemsWithCompletion:(nullable dispatch_block_t)completion; - -- (void)truncateAll; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphItem.h b/Pods/QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphItem.h deleted file mode 100644 index 5cfb61e22..000000000 --- a/Pods/QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphItem.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// QMOpenGraphItem.h -// QMOpenGraphService -// -// Created by Andrey Ivanov on 14/06/2017. -// Copyright © 2017 QuickBlox. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface QMOpenGraphItem : NSObject - -@property (nonatomic, copy, nullable) NSString *ID; -@property (nonatomic, copy, nullable) NSString *baseUrl; -@property (nonatomic, copy, nullable) NSString *faviconUrl; -@property (nonatomic, copy, nullable) NSString *siteTitle; -@property (nonatomic, copy, nullable) NSString *siteDescription; -@property (nonatomic, copy, nullable) NSString *imageURL; -@property (nonatomic, assign) NSUInteger imageHeight; -@property (nonatomic, assign) NSUInteger imageWidth; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphMemoryStorage.h b/Pods/QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphMemoryStorage.h deleted file mode 100644 index 57f463285..000000000 --- a/Pods/QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphMemoryStorage.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// QMOpenGraphMemoryStorage.h -// QMOpenGraphService -// -// Created by Andrey Ivanov on 14/06/2017. -// Copyright © 2017 QuickBlox. All rights reserved. -// - -#import -#import "QMMemoryStorageProtocol.h" - -@class QMOpenGraphItem; - -NS_ASSUME_NONNULL_BEGIN - -@interface QMOpenGraphMemoryStorage : NSObject - -- (nullable QMOpenGraphItem *)openGraphItemWithBaseURL:(NSString *)baseUrl; -- (nullable QMOpenGraphItem *)objectForKeyedSubscript:(NSString *)key; -- (void)setObject:(nullable QMOpenGraphItem *)obj forKeyedSubscript:(NSString *)key; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphService.h b/Pods/QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphService.h deleted file mode 100644 index a41637642..000000000 --- a/Pods/QMServicesDevelopment/QMOpenGraphService/QMOpenGraphService/QMOpenGraphService.h +++ /dev/null @@ -1,89 +0,0 @@ -// -// QMOpenGraphService.h -// QMOpenGraphService -// -// Created by Andrey Ivanov on 14/06/2017. -// Copyright © 2017 QuickBlox. All rights reserved. -// - -#import - -#import "QMOpenGraphMemoryStorage.h" -#import "QMOpenGraphItem.h" -#import "QMBaseService.h" -#import - -@protocol QMOpenGraphServiceDelegate; -@protocol QMOpenGraphCacheDataSource; - -NS_ASSUME_NONNULL_BEGIN - -@interface QMOpenGraphService : QMBaseService - -/** - Memory storage for QMLinkPreview - */ -@property (nonatomic, readonly) QMOpenGraphMemoryStorage *memoryStorage; - -- (instancetype)initWithServiceManager:(id)serviceManager - cacheDataSource:(id)cacheDataSource NS_DESIGNATED_INITIALIZER; - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; -/** - * Add instance that confirms Open Graph service multicaste protocol. - * - * @param delegate instance that confirms id protocol - */ -- (void)addDelegate:(id )delegate; - -/** - * Remove instance that confirms Open Graph service multicaste protocol. - * - * @param delegate instance that confirms id protocol - */ -- (void)removeDelegate:(id )delegate; - -/** - Method returns cached instance of QMOpenGraphItem class - - @param ID Identifier - */ -- (void)preloadGraphItemForText:(NSString *)text ID:(NSString *)ID; - -- (void)cancelAllloads; - -@end - -@protocol QMOpenGraphServiceDelegate - -@optional -/** - Called if .. - - @param openGraphSerivce Open graph serivce - @param openGraphItem QMOpenGraphItem instance - */ -- (void)openGraphSerivce:(QMOpenGraphService *)openGraphSerivce -didAddOpenGraphItemToMemoryStorage:(QMOpenGraphItem *)openGraphItem; - -- (void)openGraphSerivce:(QMOpenGraphService *)openGraphSerivce - hasFaviconURL:(NSURL *)url - completion:(dispatch_block_t)completion; - -- (void)openGraphSerivce:(QMOpenGraphService *)openGraphSerivce - hasImageURL:(NSURL *)url - completion:(dispatch_block_t)completion; - -- (void)openGraphSerivce:(QMOpenGraphService *)openGraphSerivce - didLoadFromCache:(QMOpenGraphItem *)openGraph; -@end - -@protocol QMOpenGraphCacheDataSource - -@optional -- (nullable QMOpenGraphItem *)cachedOpenGraphItemWithID:(NSString *)ID; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMServices/QMSLog.h b/Pods/QMServicesDevelopment/QMServices/QMSLog.h deleted file mode 100644 index 70ced5ed7..000000000 --- a/Pods/QMServicesDevelopment/QMServices/QMSLog.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// QMSLog.h -// QMServices -// -// Created by Vitaliy Gorbachov on 6/17/16. -// Copyright (c) 2016 Quickblox Team. All rights reserved. -// - -#import - -// NSLog is unavailable for QMServices project -// Use QMSLog instead. - -#ifdef __cplusplus -extern "C" { -#endif - -void QMSLogSetEnabled(BOOL enabled); -BOOL QMSLogEnabled(void); -void QMSLog(NSString *format, ...); - -#ifdef __cplusplus -} -#endif diff --git a/Pods/QMServicesDevelopment/QMServices/QMServices.h b/Pods/QMServicesDevelopment/QMServices/QMServices.h deleted file mode 100644 index 52d525893..000000000 --- a/Pods/QMServicesDevelopment/QMServices/QMServices.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// QMServices.h -// QMServices -// -// Created by Andrey on 21.11.14. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import -#import - -#import "QMDBStorage.h" -#import "QMChatCache.h" -#import "QMUsersCache.h" -#import "QMOpenGraphCache.h" -#import "QMContactListCache.h" - -#import "QMContactListService.h" -#import "QMChatService.h" -#import "QMAuthService.h" -#import "QMUsersService.h" - -#import "QBChatMessage+QMCustomParameters.h" -#import "QBChatAttachment+QMCustomData.h" -#import "QBChatAttachment+QMFactory.h" -#import "QBChatAttachment+QMCustomParameters.h" -#import "QMUsersMemoryStorage.h" -#import "QMContactListMemoryStorage.h" -#import "QMMessagesMemoryStorage.h" -#import "QMAsynchronousOperation.h" diff --git a/Pods/QMServicesDevelopment/QMServices/QMServices.m b/Pods/QMServicesDevelopment/QMServices/QMServices.m deleted file mode 100644 index b73cd3de4..000000000 --- a/Pods/QMServicesDevelopment/QMServices/QMServices.m +++ /dev/null @@ -1,20 +0,0 @@ -// -// QMServices.m -// QMServices -// -// Created by Andrey on 21.11.14. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import "QMServicesManager.h" - -@interface QMServices_lib : NSObject -@end - -@implementation QMServices_lib - -- (void)main { - [QMServicesManager instance]; -} -@end diff --git a/Pods/QMServicesDevelopment/QMUsersCache/QMUsersCache/CoreData/Entries/CDUser.h b/Pods/QMServicesDevelopment/QMUsersCache/QMUsersCache/CoreData/Entries/CDUser.h deleted file mode 100644 index 020858086..000000000 --- a/Pods/QMServicesDevelopment/QMUsersCache/QMUsersCache/CoreData/Entries/CDUser.h +++ /dev/null @@ -1,16 +0,0 @@ -#import "_CDUser.h" - -@interface CDUser : _CDUser - -- (QBUUser *)toQBUUser; -- (void)updateWithQBUser:(QBUUser *)user; - -@end - -@interface NSArray(CDUser) - -- (NSArray *)toQBUUsers; - -@end - - diff --git a/Pods/QMServicesDevelopment/QMUsersCache/QMUsersCache/QMUsersCache.h b/Pods/QMServicesDevelopment/QMUsersCache/QMUsersCache/QMUsersCache.h deleted file mode 100644 index 42c239bf8..000000000 --- a/Pods/QMServicesDevelopment/QMUsersCache/QMUsersCache/QMUsersCache.h +++ /dev/null @@ -1,84 +0,0 @@ -// -// QMUsersCache.h -// QMUsersCache -// -// Created by Andrey Moskvin on 10/23/15. -// Copyright © 2015 Quickblox. All rights reserved. -// - -#import -#import -#import -#import "QMDBStorage.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface QMUsersCache : QMDBStorage - -@property (readonly, class) QMUsersCache *instance; - -+ (nullable QMUsersCache *)instance; - -//MARK: - Insert/Update/Delete users in cache - -/** - * Insert/Update user in cache - * - * @param user QBUUser instance - */ -- (BFTask *)insertOrUpdateUser:(QBUUser *)user; - -/** - * Insert/Update users in cache - * - * @param users Array of QBUUser instances - */ -- (BFTask *)insertOrUpdateUsers:(NSArray *)users; - -/** - * Delete user from cahce - * - * @param user QBUUser instance - */ -- (BFTask *)deleteUser:(QBUUser *)user; - -/** - * Delete all users async - */ -- (BFTask *)deleteAllUsers; - -- (BFTask *)truncateAll; - -//MARK: - Fetch users - -- (NSArray *)allUsers; - -/** - * Fetch user with predicate - * - * @param predicate Predicate to evaluate objects against - */ -- (BFTask *)userWithPredicate:(NSPredicate *) predicate; - -/** - * Fetch users with sort attribute, sorted ascending - * - * @param sortTerm Attribute name to sort by. - * @param ascending `YES` if the attribute should be sorted ascending, `NO` for descending. - */ -- (BFTask *> *)usersSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending; - -/** - * Fetch users with predicate, sort attribute, sorted ascending - * - * @param predicate Predicate to evaluate objects against - * @param sortTerm Attribute name to sort by. - * @param ascending `YES` if the attribute should be sorted ascending, `NO` for descending. - */ -- (BFTask *> *)usersWithPredicate:(nullable NSPredicate *)predicate - sortedBy:(NSString *)sortTerm - ascending:(BOOL)ascending; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMUsersService/QMUsersService/Categories/QBUUser+CustomData.h b/Pods/QMServicesDevelopment/QMUsersService/QMUsersService/Categories/QBUUser+CustomData.h deleted file mode 100644 index cb6265484..000000000 --- a/Pods/QMServicesDevelopment/QMUsersService/QMUsersService/Categories/QBUUser+CustomData.h +++ /dev/null @@ -1,47 +0,0 @@ -// -// QBUUser+CustomData.h -// QMServices -// -// Created by Andrey Ivanov on 27.04.15. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * QBUUser+QMAssociatedObject class interface. - * Used to store and synchronize custom data of QBUUser. - */ -@interface QBUUser (QMAssociatedObject) - -/** - * User custom data context, based on dictionary. - * - * @discussion Add or remove data, that you need to put into customData field of user. - * - * @note You should always call 'synchronize' method after context change. - */ -@property (strong, nonatomic, readonly) NSMutableDictionary *context; - -/** - * Synchronize context into user custom data field. - * - * @discussion Call this method after every context update. - * - * @note This will convert NSDictionary into JSON and put into QBUUser customData field. - */ -- (void)synchronize; - -@end - -@interface QBUUser (CustomData) - -@property (copy, nonatomic, nullable) NSString *avatarUrl; -@property (copy, nonatomic, nullable) NSString *status; -@property (assign, nonatomic) BOOL isImport; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMUsersService/QMUsersService/QMUsersMemoryStorage/QMUsersMemoryStorage.h b/Pods/QMServicesDevelopment/QMUsersService/QMUsersService/QMUsersMemoryStorage/QMUsersMemoryStorage.h deleted file mode 100644 index 2ee35730b..000000000 --- a/Pods/QMServicesDevelopment/QMUsersService/QMUsersService/QMUsersMemoryStorage/QMUsersMemoryStorage.h +++ /dev/null @@ -1,223 +0,0 @@ -// -// QMUsersMemoryStorage.h -// QMServices -// -// Created by Andrey on 26.11.14. -// Copyright (c) 2015 Quickblox Team. All rights reserved. -// - -#import -#import "QMMemoryStorageProtocol.h" - -NS_ASSUME_NONNULL_BEGIN - -struct QMUsersSearchKeyStruct { - __unsafe_unretained NSString * _Nullable foundObjects; - __unsafe_unretained NSString * _Nullable notFoundSearchValues; -}; - -extern const struct QMUsersSearchKeyStruct QMUsersSearchKey; - -@protocol QMUsersMemoryStorageDelegate - -- (nullable NSArray *)contactsIDS; - -@end - -@interface QMUsersMemoryStorage : NSObject - -/** - * Delegate for getting UsersMemoryStorage user ids. - */ -@property (weak, nonatomic, nullable) id delegate; - -/** - * Add user to memory storage. - * - * @param user QBUUser instance of user to add - */ -- (void)addUser:(QBUUser *)user; - -/** - * Add users to memory storage. - * - * @param users array of QBUUser instances of users to add - */ -- (void)addUsers:(NSArray *)users; - -//MARK: - Sorting - -/** - * Get all users from memory storage without sorting. - * - * @return Array of QBUUsers instances as users - */ -- (NSArray *)unsortedUsers; - -/** - * Get all users in memory storage sorted by key. - * - * @param key sorted key - * @param ascending ascending value - * - * @return Array of QBUUsers instances as users - */ -- (NSArray*)usersSortedByKey:(NSString *)key ascending:(BOOL)ascending; - -//MARK: Contacts - -/** - * Get all contacts in memory storage sorted by key. - * - * @param key sorted key - * @param ascending ascending value - * - * @return Array of QBUUsers instances as users - */ -- (NSArray *)contactsSortedByKey:(NSString *)key ascending:(BOOL)ascending; - -//MARK: Utils - -/** - * Get users with ids without some id. - * - * @param IDs array of users IDs - * @param ID exclude ID - * - * @return Array of QBUUsers instances as users - */ -- (NSArray *)usersWithIDs:(NSArray *)IDs withoutID:(NSUInteger)ID; - -/** - * Get string created from users full names, separated by ",". - * - * @param users array of QBUUser instances - * - * @return joined names string, separated by "," - */ -- (NSString *)joinedNamesbyUsers:(NSArray *)users; - -//MARK: - Fetch - -/** - * Get user with user id. - * - * @param userID user ID - * - * @return QBUUser instance of user - */ -- (nullable QBUUser *)userWithID:(NSUInteger)userID; - -/** - * Get user with external user id. - * - * @param externalUserID external user ID - * - * @return QBUUser instance of user - */ -- (nullable QBUUser *)userWithExternalID:(NSUInteger)externalUserID; - -/** - * Get users with external user ids. - * - * @param externalUserIDs external users IDs - * - * @return Array of QBUUser instances as users - */ -- (NSArray *)usersWithExternalIDs:(NSArray *)externalUserIDs; - -/** - * Get users with user ids. - * - * @param ids users IDs - * - * @return Array of QBUUser instances as users - */ -- (NSArray *)usersWithIDs:(NSArray *)ids; - -/** - * Get users with user logins. - * - * @param logins array of user logins - * - * @return Array of QBUUser instances as users - */ -- (NSArray *)usersWithLogins:(NSArray *)logins; - -/** - * Get users with user emails. - * - * @param emails array of user emails - * - * @return Array of QBUUser instances as users - */ -- (NSArray *)usersWithEmails:(NSArray *)emails; - -/** - * Get users with user facebook ids. - * - * @param facebookIDs array of user facebook IDs - * - * @return Array of QBUUser instances as users - */ -- (NSArray *)usersWithFacebookIDs:(NSArray *)facebookIDs; - -/** - * Get users with user twitter ids. - * - * @param twitterIDs array of user twitter IDs - * - * @return Array of QBUUser instances as users - */ -- (NSArray *)usersWithTwitterIDs:(NSArray *)twitterIDs; - -//MARK: - Search & Exclude - -/** - * Search for users excluding users with users ids. - * - * @param ids users ids to exclude - * - * @return dictionary of found and not found users - */ -- (NSDictionary *)usersByExcludingUsersIDs:(NSArray *)ids; - -/** - * Search for users excluding users with users logins. - * - * @param logins users logins to exclude - * - * @return dictionary of found and not found users - */ -- (NSDictionary *)usersByExcludingLogins:(NSArray *)logins; - -/** - * Search for users excluding users with users logins. - * - * @param emails users emails to exclude - * - * @return dictionary of found and not found users - */ -- (NSDictionary *)usersByExcludingEmails:(NSArray *)emails; - -/** - * Search for users excluding users with users facebook IDs. - * - * @param facebookIDs users facebookIDs to exclude - * - * @return dictionary of found and not found users - */ -- (NSDictionary *)usersByExcludingFacebookIDs:(NSArray *)facebookIDs; - -/** - * Search for users excluding users with users twitter IDs. - * - * @param twitterIDs users twitterIDs to exclude - * - * @return dictionary of found and not found users - */ -- (NSDictionary *)usersByExcludingTwitterIDs:(NSArray *)twitterIDs; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/QMUsersService/QMUsersService/QMUsersService.h b/Pods/QMServicesDevelopment/QMUsersService/QMUsersService/QMUsersService.h deleted file mode 100644 index d61cb91ec..000000000 --- a/Pods/QMServicesDevelopment/QMUsersService/QMUsersService/QMUsersService.h +++ /dev/null @@ -1,509 +0,0 @@ -// -// QMUsersService.h -// QMUsersService -// -// Created by Andrey Moskvin on 10/23/15. -// Copyright © 2015 Quickblox. All rights reserved. -// - -#import -#import "QMBaseService.h" -#import "QMUsersMemoryStorage.h" - -@protocol QMUsersServiceDelegate; -@protocol QMUsersServiceCacheDataSource; -@protocol QMUsersServiceListenerProtocol; - -NS_ASSUME_NONNULL_BEGIN - -@interface QMUsersService : QMBaseService - -/** - * Memory storage for users items. - */ -@property (strong, nonatomic, readonly) QMUsersMemoryStorage *usersMemoryStorage; - -/** - * Init with service data delegate and users cache protocol. - * - * @param serviceManager instance confirmed id protocol - * @param cacheDataSource instance confirmed id protocol - * - * @return QMUsersService instance - */ -- (instancetype)initWithServiceManager:(id)serviceManager - cacheDataSource:(nullable id)cacheDataSource; - -/** - * Add instance that confirms users service multicaste protocol. - * - * @param delegate instance that confirms id protocol - */ -- (void)addDelegate:(id )delegate; - -/** - * Remove instance that confirms users service multicaste protocol. - * - * @param delegate instance that confirms id protocol - */ -- (void)removeDelegate:(id )delegate; - -/** - * Start listen for user updates. - * - * @param listener class that conforms to QMUsersServiceListenerProtocol protocol - * @param user user instance to subscribe for - * - * @see QMUsersServiceListenerProtocol - */ -- (void)addListener:(id)listener forUser:(QBUUser *)user; - -/** - * Stop listen for user updates. - * - * @param listener class that conforms to QMUsersServiceListenerProtocol protocol - * @param user user instance to subscribe for - * - * @see QMUsersServiceListenerProtocol - */ -- (void)removeListener:(id)listener forUser:(QBUUser *)user; - -//MARK: - Tasks -//MARK: - Intelligent fetch - -/** - * Get user by id. - * - * @param userID id of user to retreive - * - * @return BFTask with QBUUser as a result - */ -- (BFTask *)getUserWithID:(NSUInteger)userID; - -/** - * Get user by id. - * - * @param userID id of user to retreive - * @param forceLoad whether user should be loaded from server even when he is already existing in cache - * - * @discussion Use forceLoad flag if you want to update user in cache by loading him from server. - * - * @return BFTask with QBUUser as a result - */ -- (BFTask *)getUserWithID:(NSUInteger)userID forceLoad:(BOOL)forceLoad; - -/** - * Get users by ids. - * - * @param usersIDs array of user ids - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithIDs:(NSArray *)usersIDs; - -/** - * Get users by ids. - * - * @param usersIDs array of user ids - * @param forceLoad whether users should be loaded from server even when they are already existing in cache - * - * @discussion Use forceLoad flag if you want to update users in cache by loading them from server. - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithIDs:(NSArray *)usersIDs - forceLoad:(BOOL)forceLoad; - -/** - * Get users by ids with extended pagination parameters. - * - * @param usersIDs array of user ids - * @param page QBGeneralResponsePage instance with extended pagination parameters - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithIDs:(NSArray *)usersIDs - page:(QBGeneralResponsePage *)page; - -/** - * Get users by ids with extended pagination parameters. - * - * @param usersIDs array of user ids - * @param page QBGeneralResponsePage instance with extended pagination parameters - * @param forceLoad whether users should be loaded from server even when they are already existing in cache - * - * @discussion Use forceLoad flag if you want to update users in cache by loading them from server. - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithIDs:(NSArray *)usersIDs - page:(QBGeneralResponsePage *)page - forceLoad:(BOOL)forceLoad; - -/** - * Get user with - * - * @param externalUserID external user ID - * - * @return BFTask with user as a result. - */ -- (BFTask *)getUserWithExternalID:(NSUInteger)externalUserID; - -/** - * Get user with - * - * @param externalUserID external user ID - * @param forceLoad whether user should be loaded from server even when they are already existing in cache - * - * @discussion Use forceLoad flag if you want to update user in cache by loading him from server. - * - * @return BFTask with user as a result. - */ -- (BFTask *)getUserWithExternalID:(NSUInteger)externalUserID - forceLoad:(BOOL)forceLoad; - -/** - * Get users by emails. - * - * @param emails array of user emails - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithEmails:(NSArray *)emails; - -/** - * Get users by emails. - * - * @param emails array of user emails - * @param forceLoad whether users should be loaded from server even when they are already existing in cache - * - * @discussion Use forceLoad flag if you want to update users in cache by loading them from server. - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithEmails:(NSArray *)emails - forceLoad:(BOOL)forceLoad; - -/** - * Get users by emails with extended pagination parameters. - * - * @param emails array of user emails - * @param page QBGeneralResponsePage instance with extended pagination parameters - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithEmails:(NSArray *)emails - page:(QBGeneralResponsePage *)page; - -/** - * Get users by emails with extended pagination parameters. - * - * @param emails array of user emails - * @param page QBGeneralResponsePage instance with extended pagination parameters - * @param forceLoad whether users should be loaded from server even when they are already existing in cache - * - * @discussion Use forceLoad flag if you want to update users in cache by loading them from server. - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithEmails:(NSArray *)emails - page:(QBGeneralResponsePage *)page - forceLoad:(BOOL)forceLoad; - -/** - * Get users by facebook ids. - * - * @param facebookIDs array of user facebook ids - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithFacebookIDs:(NSArray *)facebookIDs; - -/** - * Get users by facebook ids. - * - * @param facebookIDs array of user facebook ids - * @param forceLoad whether users should be loaded from server even when they are already existing in cache - * - * @discussion Use forceLoad flag if you want to update users in cache by loading them from server. - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithFacebookIDs:(NSArray *)facebookIDs - forceLoad:(BOOL)forceLoad; - -/** - * Get users by facebook ids with extended pagination parameters. - * - * @param facebookIDs array of user facebook ids - * @param page QBGeneralResponsePage instance with extended pagination parameters - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithFacebookIDs:(NSArray *)facebookIDs - page:(QBGeneralResponsePage *)page; - -/** - * Get users by facebook ids with extended pagination parameters. - * - * @param facebookIDs array of user facebook ids - * @param page QBGeneralResponsePage instance with extended pagination parameters - * @param forceLoad whether users should be loaded from server even when they are already existing in cache - * - * @discussion Use forceLoad flag if you want to update users in cache by loading them from server. - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithFacebookIDs:(NSArray *)facebookIDs - page:(QBGeneralResponsePage *)page - forceLoad:(BOOL)forceLoad; -/** - * Get users by twitter ids. - * - * @param twitterIDs array of user twitter ids - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithTwitterIDs:(NSArray *)twitterIDs; - -/** - * Get users by twitter ids. - * - * @param twitterIDs array of user twitter ids - * @param forceLoad whether users should be loaded from server even when they are already existing in cache - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithTwitterIDs:(NSArray *)twitterIDs - forceLoad:(BOOL)forceLoad; - -/** - * Get users by twitter ids with extended pagination parameters. - * - * @param twitterIDs array of user twitter ids - * @param page QBGeneralResponsePage instance with extended pagination parameters - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithTwitterIDs:(NSArray *)twitterIDs - page:(QBGeneralResponsePage *)page; - -/** - * Get users by twitter ids with extended pagination parameters. - * - * @param twitterIDs array of user twitter ids - * @param page QBGeneralResponsePage instance with extended pagination parameters - * @param forceLoad whether users should be loaded from server even when they are already existing in cache - */ -- (BFTask *> *)getUsersWithTwitterIDs:(NSArray *)twitterIDs - page:(QBGeneralResponsePage *)page - forceLoad:(BOOL)forceLoad; -/** - * Get users by logins. - * - * @param logins array of user logins - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithLogins:(NSArray *)logins; - -/** - * Get users by logins. - * - * @param logins array of user logins - * @param forceLoad whether users should be loaded from server even when they are already existing in cache - * - * @discussion Use forceLoad flag if you want to update users in cache by loading them from server. - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithLogins:(NSArray *)logins - forceLoad:(BOOL)forceLoad; - -/** - * Get users by logins with extended pagination parameters. - * - * @param logins array of user logins - * @param page QBGeneralResponsePage instance with extended pagination parameters - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithLogins:(NSArray *)logins - page:(QBGeneralResponsePage *)page; - -/** - * Get users by logins with extended pagination parameters. - * - * @param logins array of user logins - * @param page QBGeneralResponsePage instance with extended pagination parameters - * @param forceLoad whether users should be loaded from server even when they are already existing in cache - * - * @discussion Use forceLoad flag if you want to update users in cache by loading them from server. - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)getUsersWithLogins:(NSArray *)logins - page:(QBGeneralResponsePage *)page - forceLoad:(BOOL)forceLoad; - - -//MARK: - Search - -/** - * Search for users by full name. - * - * @param searchText user full name - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)searchUsersWithFullName:(NSString *)searchText; - -/** - * Search for users by full name with extended pagination parameters. - * - * @param searchText user full name - * @param page QBGeneralResponsePage instance with extended pagination parameters - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)searchUsersWithFullName:(NSString *)searchText - page:(QBGeneralResponsePage *)page; - -/** - * Search for users by tags. - * - * @param tags array of user tags - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)searchUsersWithTags:(NSArray *)tags; - -/** - * Search for users by tags with extended pagination parameters. - * - * @param tags array of user tags - * @param page QBGeneralResponsePage instance with extended pagination parameters - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)searchUsersWithTags:(NSArray *)tags - page:(QBGeneralResponsePage *)page; - -/** - * Search for users by phone numbers. - * - * @param phoneNumbers array of user phone numbers - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)searchUsersWithPhoneNumbers:(NSArray *)phoneNumbers; - -/** - * Search for users by phone numbers with extended pagination parameters. - * - * @param phoneNumbers array of user phone numbers - * @param page QBGeneralResponsePage instance with extended pagination parameters - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *> *)searchUsersWithPhoneNumbers:(NSArray *)phoneNumbers - page:(QBGeneralResponsePage *)page; - -/** - * Search for users by extended request. - * - * @param extendedRequest extended request - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *)searchUsersWithExtendedRequest:(NSDictionary *)extendedRequest; - -/** - * Search for users by extended request with extended pagination parameters. - * - * @param extendedRequest extended request - * @param page pagination params - * - * @return BFTask with NSArray of QBUUser instances as a result - */ -- (BFTask *)searchUsersWithExtendedRequest:(NSDictionary *)extendedRequest - page:(QBGeneralResponsePage *)page; - -// MARK: Public users management - -/** - * Update users in memory storage and cache. - * - * @param users array of users - */ -- (void)updateUsers:(NSArray *)users; - -@end - -//MARK: - Protocols - -/** - * Data source for QMUsersService - */ - -@protocol QMUsersServiceCacheDataSource -@required - -/** - * Is called when users service will start. Need to use for inserting initial data QMUsersMemoryStorage. - * - * @param block Block for provide QBUUsers collection - */ -- (void)cachedUsersWithCompletion:(nullable void(^)(NSArray * _Nullable collection))block; - -@end - -@protocol QMUsersServiceDelegate - -@optional - -/** - * Is called when users were loaded from cache to memory storage - * - * @param usersService QMUsersService instance - * @param users NSArray of QBUUser instances as users - */ -- (void)usersService:(QMUsersService *)usersService didLoadUsersFromCache:(NSArray *)users; - -/** - * Is called when users were added to QMUsersService. - * - * @param usersService QMUsersService instance - * @param users NSArray of QBUUser instances as users - */ -- (void)usersService:(QMUsersService *)usersService didAddUsers:(NSArray *)users; - -/** - * Is called when users were updated in cache by forcing its load from server. - * - * @param usersService QMUsersService instance - * @param users NSArray of QBUUser instances as users - */ -- (void)usersService:(QMUsersService *)usersService didUpdateUsers:(NSArray *)users; - -@end - -/** - * QMUsersServiceListenerProtocol protocol interface. - * This protocol allows to receive updates only for a specific user. - */ -@protocol QMUsersServiceListenerProtocol - -@required - -/** - * Called when specific user you subscribed for was updaed. - * - * @param usersService QMUsersService instance - * @param user user instance that was updated - */ -- (void)usersService:(QMUsersService *)usersService didUpdateUser:(QBUUser *)user; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/QMServicesDevelopment/README.md b/Pods/QMServicesDevelopment/README.md deleted file mode 100644 index e7f79a394..000000000 --- a/Pods/QMServicesDevelopment/README.md +++ /dev/null @@ -1,1670 +0,0 @@ -[![CocoaPods](https://img.shields.io/cocoapods/v/QMServices.svg)](https://cocoapods.org/pods/QMServices) -[![CocoaPods](https://img.shields.io/cocoapods/dt/QMServices.svg)](https://cocoapods.org/pods/QMServices) -[![CocoaPods](https://img.shields.io/cocoapods/dm/QMServices.svg)](https://cocoapods.org/pods/QMServices) - -- [QMServices](#qmservices) -- [Features](#features) -- [Requirements](#requirements) -- [Dependencies](#dependencies) -- [Installation](#installation) - - [1. Cocoapods](#1-cocoapods) - - [2. Using an Xcode subproject](#2-using-an-xcode-subproject) - - [Bundle generation](#bundle-generation) -- [Architecture](#architecture) -- [Getting started](#getting-started) - - [Service Manager](#service-manager) - - [Logs](#logs) - - [Authentication](#authentication) - - [Login](#login) - - [Logout](#logout) - - [Fetching chat dialogs](#fetching-chat-dialogs) - - [Fetching chat messages](#fetching-chat-messages) - - [Sending message](#sending-message) - - [Fetching users](#fetching-users) - - [Subclass of QMServicesManager example](#qmservices-example) - - [QMAuthService](#qmauthservice) - - [QMAuthService + Bolts](#qmauthservice--bolts) - - [QMChatService](#qmauthservice) - - [QMChatService + Bolts](#qmchatservice--bolts) - - [QMDialogsMemoryStorage](#qmdialogsmemorystorage) - - [QMMessagesMemoryStorage](#qmmessagesmemorystorage) - - [QMChatAttachmentService](#qmchatattachmentservice) - - [QMContactListService](#qmcontactlistservice) - - [QMContactListMemoryStorage](#qmcontactlistmemorystorage) - - [QMUsersService](#qmusersservice) - - [QMUsersMemoryStorage](#qmusersmemorystorage) - - [Add users](#add-users) - - [Get users](#get-users) - - [Search and Exclude](#search-and-exclude) -- [Documentation](#documentation) -- [License](#license) - -# QMServices - -Easy-to-use services for Quickblox SDK, for speeding up development of iOS chat applications. - -# Features - -* High level API for Chat features including authentication service for logging to Quickblox REST and XMPP -* Inbox persistent storage for messages, dialogs and users -* Inbox memory storage for messages, dialogs and users -* Bolts version of all methods. See [Bolts-iOS](https://github.com/BoltsFramework/Bolts-iOS "Bolts-iOS"") for more information. - -# Requirements - -- Xcode 6+ -- ARC - -# Dependencies - -- [Quickblox](https://github.com/QuickBlox/quickblox-ios-sdk 'Quickblox iOS SDK') SDK 2.6.5+ -- [Bolts](https://github.com/BoltsFramework/Bolts-iOS 'Bolts-iOS') 1.5.0+ - -# Installation - -There are several ways to add **QMServices** to your project. They are described below: - -## 1. Cocoapods - -You can install **QMServices** using Cocoapods just by adding following line in your Podfile: - -``` -pod 'QMServices' -``` - -## 2. Using an Xcode subproject - -Xcode sub-projects allow your project to use and build QMServices as an implicit dependency. - -Add QMServices to your project as a Git submodule: - -``` -$ cd MyXcodeProjectFolder -$ git submodule add https://github.com/QuickBlox/q-municate-services-ios.git Vendor/QMServices -$ git commit -m "Added QMServices submodule" -``` - -This will add QMServices as a submodule and download Bolts as dependency. -Drag `Vendor/QMServices/QMServices.xcodeproj ` into your existing Xcode project. - -Navigate to your project's settings, then select the target you wish to add QMServices to. - -Navigate to **Build Settings**, then search for **Header Search Paths** and double-click it to edit - -Add a new item using **+**: `"$(SRCROOT)/Vendor/QMServices"` and ensure that it is set to *recursive* - -Navigate to **Build Settings**, then search for **Framework Search Paths** and double-click it to edit - -Add a new item using **+**: `"$(SRCROOT)/Vendor/QMServices/Frameworks"` - -

** NOTE**

-

Only for manual installation: if you do not follow the steps below you will get compiler errors that Quickblox.framework and Bolts.framework are not found

Quickblox.framework and Bolts.framework in `"$(SRCROOT)/Vendor/QMServices/Frameworks"` does NOT contain binary data, they used only for generating bundles.
-If you plan to use QMServices as sub-project, then
-1. Download Quickblox.framework https://github.com/QuickBlox/quickblox-ios-sdk/archive/master.zip
-2. Download Bolts.framework https://github.com/BoltsFramework/Bolts-ObjC/releases/download/1.5.1/Bolts-iOS.zip
-3. Put the frameworks in the folder 'Vendor/QMServices/Frameworks'
- -> ** NOTE**: By default, *QMServices* subprojects reference Quickblox and Bolts frameworks at `../Frameworks`. -> To change the path, you need to open Quickblox.xcconfig file and replace `../Frameworks` with your path to the Quickblox.framework and Bolts.framework. - -> ** NOTE** Please be aware that if you've set Xcode's **Link Frameworks Automatically** to **No** then you may need to add the Quickblox.framework, CoreData.framework to your project on iOS, as UIKit does not include Core Data by default. On OS X, Cocoa includes Core Data. - -Now navigate to QMServices.xcodeproj subproject, open **Build Settings**, search for **Framework Search Paths** and locate Quickblox and Bolts frameworks folder there. -Remember, that you have to link *QMServices* in **Target Dependencies** and (or) *libQMServices.a* in **Link Binary with Libraries**. -Don't forget to add Quickblox and Bolts frameworks to your project. - -Next step is to copy all bundles into your Copy bundle resources in Build Phases tab of your project settings. -Navigate to QMServices.xcodeproj/Cache and move QMUsersCacheModel.bundle, QMContactListCacheModel.bundle and QMChatCacheModel.bundle that are existent in its subprojects to Copy Bundle Resources of your project. In a pop-up window select only "Create folder references". - -If you are adding QMServices to the Swift project, you need to import them in your bridging header: - -```swift -#import "QMServices.h" -``` - -To integrate Quckblox iOS SDK into your Swift project see our detailed guide [here](http://quickblox.com/developers/IOS-how-to-connect-Quickblox-framework#Additional_steps_for_Swift_using_Manual_Installation). - -If you are still experiencing some crashes, check if you have set up correct Other linker flags for your project (-lxml2, -ObjC, -lstdc++) otherwise feel free to create an issue and let us know your problem. - -### Bundle generation -**NOTE:** You can skip this step if you do not use dialogs, messages and users memory and disc storage. - -Bundle allows to pass .xcdatamodel file together with static library so it is required for **QMChatCache** and **QMContactListCache** projects. - -To generate bundle for contact list you need to open **QMServices** project, navigate to Cache folder and select **QMContactListCache.xcodeproj**. Open project folder - you will see red **QMContactListCacheModel.bundle**. To create it select scheme **QMContactListCacheModel** and run it. After successful build **QMContactListCacheModel.bundle** color will change to black and you will be able to copy it to the project that uses **QMServices**. Include this bundle in your project. - -To generate bundle for dialogs and messages you need to open **QMServices** project, navigate to Cache folder and select **QMChatCache.xcodeproj**. Open project folder - you will see red **QMChatCacheModel.bundle**. To create it select scheme **QMChatCacheModel** and run it. After successful build **QMChatCacheModel.bundle`** color will change to black and you will be able to copy it to the project that uses **QMServices**. Include this bundle in your project. - -# Architecture - -QMServices contain: - -* **QMAuthService** -* **QMChatService** -* **QMContactListService** -* **QMUsersService** - - -They all inherited from **QMBaseService**. -To support CoreData caching you can use **QMContactListCache**, **QMChatCache** and **QMUsersCache**, which are inherited from **QMDBStorage**. Of course you could use your own database storage - just need to implement **QMChatServiceDelegate**, **QMContactListServiceDelegate** or **QMUsersServiceDelegate** depending on your needs. - -# Getting started -Add **#import \** to your app's *.pch* file. - -## Service Manager - -To start using services you could either use existing **QMServicesManager** class or create a subclass from it. -Detailed explanation of the **QMServicesManager** class is below. - -**QMServicesManager** has 2 functions - user login(login to REST API, chat)/logout(Logging out from chat, REST API, clearing persistent and memory cache) and establishing connection between **QMChatCache** and **QMChatService** to enable storing dialogs and messages data on disc. - -Here is **QMServicesManager.h**: - -```objective-c -@interface QMServicesManager : NSObject - -+ (instancetype)instance; - -- (void)logInWithUser:(QBUUser *)user completion:(void (^)(BOOL success, NSString *errorMessage))completion; -- (void)logoutWithCompletion:(dispatch_block_t)completion; - -@property (nonatomic, readonly) QMAuthService* authService; -@property (nonatomic, readonly) QMChatService* chatService; - -@end -``` - -And extension in **QMServicesManager.m**: - -```objective-c -@interface QMServicesManager () - -@property (nonatomic, strong) QMAuthService* authService; -@property (nonatomic, strong) QMChatService* chatService; - -@property (nonatomic, strong) dispatch_group_t logoutGroup; - -@end -``` - -In ``init`` method, services and cache are initialised. - -```objective-c -- (instancetype)init { - self = [super init]; - if (self) { - [QMChatCache setupDBWithStoreNamed:@"sample-cache"]; - [QMChatCache instance].messagesLimitPerDialog = 10; - - _authService = [[QMAuthService alloc] initWithServiceManager:self]; - _chatService = [[QMChatService alloc] initWithServiceManager:self cacheDataSource:self]; - [_chatService addDelegate:self]; - _logoutGroup = dispatch_group_create(); - } - return self; -} -``` - -* Cache setup (You could skip it if you don't need persistent storage). - - * Initiates Core Data database for dialog and messages: - - ```objective-c - [QMChatCache setupDBWithStoreNamed:@"sample-cache"]; - ``` - -* Services setup - - * Authentication service: - - ```objective-c - _authService = [[QMAuthService alloc] initWithServiceManager:self]; - ``` - - * Chat service (responsible for establishing chat connection and responding to chat events (message, presences and so on)): - - ```objective-c - _chatService = [[QMChatService alloc] initWithServiceManager:self cacheDataSource:self]; - ``` - -Also you have to implement **QMServiceManagerProtocol** methods: - -```objective-c -- (void)handleErrorResponse:(QBResponse *)response { - // handle error response from services here -} - -- (BOOL)isAuthorized { - return self.authService.isAuthorized; -} - -- (QBUUser *)currentUser { - return [QBSession currentSession].currentUser; -} -``` - -To implement chat messages and dialogs caching you should implement following methods from **QMChatServiceDelegate** protocol: - -```objective-c -- (void)chatService:(QMChatService *)chatService didAddChatDialogToMemoryStorage:(QBChatDialog *)chatDialog { - [QMChatCache.instance insertOrUpdateDialog:chatDialog completion:nil]; -} - -- (void)chatService:(QMChatService *)chatService didAddChatDialogsToMemoryStorage:(NSArray *)chatDialogs { - [QMChatCache.instance insertOrUpdateDialogs:chatDialogs completion:nil]; -} - -- (void)chatService:(QMChatService *)chatService didAddMessageToMemoryStorage:(QBChatMessage *)message forDialogID:(NSString *)dialogID { - [QMChatCache.instance insertOrUpdateMessage:message withDialogId:dialogID completion:nil]; -} - -- (void)chatService:(QMChatService *)chatService didAddMessagesToMemoryStorage:(NSArray *)messages forDialogID:(NSString *)dialogID { - [QMChatCache.instance insertOrUpdateMessages:messages withDialogId:dialogID completion:nil]; -} - -- (void)chatService:(QMChatService *)chatService didDeleteChatDialogWithIDFromMemoryStorage:(NSString *)chatDialogID { - [QMChatCache.instance deleteDialogWithID:chatDialogID completion:nil]; -} - -- (void)chatService:(QMChatService *)chatService didReceiveNotificationMessage:(QBChatMessage *)message createDialog:(QBChatDialog *)dialog { - [QMChatCache.instance insertOrUpdateMessage:message withDialogId:dialog.ID completion:nil]; - [QMChatCache.instance insertOrUpdateDialog:dialog completion:nil]; -} - -- (void)chatService:(QMChatService *)chatService didUpdateChatDialogInMemoryStorage:(QBChatDialog *)chatDialog { - [[QMChatCache instance] insertOrUpdateDialog:chatDialog completion:nil]; -} -``` - -Also for prefetching initial dialogs and messages you have to implement **QMChatServiceCacheDataSource** protocol: - -```objective-c -- (void)cachedDialogs:(QMCacheCollection)block { - [QMChatCache.instance dialogsSortedBy:CDDialogAttributes.lastMessageDate ascending:YES completion:^(NSArray *dialogs) { - block(dialogs); - }]; -} - -- (void)cachedMessagesWithDialogID:(NSString *)dialogID block:(QMCacheCollection)block { - [QMChatCache.instance messagesWithDialogId:dialogID sortedBy:CDMessageAttributes.messageID ascending:YES completion:^(NSArray *array) { - block(array); - }]; -} -``` - -## Logs - -By default QMServices logging its information in developer console. You may want to disable them (for example for production, logs can slow your app sometimes). In order to do so use QMServicesManager static method: - -```objective-c -+ (void)enableLogging:(BOOL)flag; -``` - -Just set it, for example, in your AppDelegate class like this: - -```objective-c -[QMServicesManager enableLogging:NO]; -``` - -## Authentication - -### Login - -This method logins user to Quickblox REST API backend and to the Quickblox Chat backend. Also it automatically tries to join to all cached group dialogs - to immediately receive incomming messages. - -```objective-c -- (void)logInWithUser:(QBUUser *)user - completion:(void (^)(BOOL success, NSString *errorMessage))completion -{ - __weak typeof(self) weakSelf = self; - [self.authService logInWithUser:user completion:^(QBResponse *response, QBUUser *userProfile) { - if (response.error != nil) { - if (completion != nil) { - completion(NO, response.error.error.localizedDescription); - } - return; - } - - [weakSelf.chatService connectWithCompletionBlock:^(NSError * _Nullable error) { - // - __typeof(self) strongSelf = weakSelf; - - [strongSelf.chatService loadCachedDialogsWithCompletion:^{ - NSArray* dialogs = [strongSelf.chatService.dialogsMemoryStorage unsortedDialogs]; - for (QBChatDialog* dialog in dialogs) { - if (dialog.type != QBChatDialogTypePrivate) { - [strongSelf.chatService joinToGroupDialog:dialog completion:^(NSError * _Nullable error) { - // - if (error != nil) { - NSLog(@"Join error: %@", error.localizedDescription); - } - }]; - } - } - - if (completion != nil) { - completion(error == nil, error.localizedDescription); - } - - }]; - }]; - }]; -} - - -``` - -Example of usage: - -```objective-c - // Logging in to Quickblox REST API and chat. - [QMServicesManager.instance logInWithUser:selectedUser completion:^(BOOL success, NSString *errorMessage) { - if (success) { - // Handle success login - } else { - // Handle error with error message - } - }]; -``` - -### Logout - -```objective-c -- (void)logoutWithCompletion:(dispatch_block_t)completion -{ - if ([QBSession currentSession].currentUser != nil) { - __weak typeof(self)weakSelf = self; - - dispatch_group_enter(self.logoutGroup); - [self.authService logOut:^(QBResponse *response) { - __typeof(self) strongSelf = weakSelf; - [strongSelf.chatService disconnectWithCompletionBlock:nil]; - [strongSelf.chatService free]; - dispatch_group_leave(strongSelf.logoutGroup); - }]; - - dispatch_group_enter(self.logoutGroup); - [[QMChatCache instance] deleteAllDialogsWithCompletion:^{ - __typeof(self) strongSelf = weakSelf; - dispatch_group_leave(strongSelf.logoutGroup); - }]; - - dispatch_group_enter(self.logoutGroup); - [[QMChatCache instance] deleteAllMessagesWithCompletion:^{ - __typeof(self) strongSelf = weakSelf; - dispatch_group_leave(strongSelf.logoutGroup); - }]; - - dispatch_group_notify(self.logoutGroup, dispatch_get_main_queue(), ^{ - if (completion) { - completion(); - } - }); - } else { - if (completion) { - completion(); - } - } -} -``` - -Example of usage: - -```objective-c - [[QMServicesManager instance] logoutWithCompletion:^{ - // Handle logout - }]; -``` - -## Fetching chat dialogs - -Load all dialogs from REST API: - -Extended request parameters could be taken from http://quickblox.com/developers/SimpleSample-chat_users-ios#Filters. - -```objective-c - -[QMServicesManager.instance.chatService allDialogsWithPageLimit:100 extendedRequest:nil iterationBlock:^(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, BOOL *stop) { - // reload UI, this block is called when page is loaded -} completion:^(QBResponse *response) { - // loading finished, all dialogs fetched -}]; -``` - -These dialogs are automatically stored in **QMDialogsMemoryStorage** class. - -## Fetching chat messages - -Fetching messages from REST API history: - -```objective-c -[QMServicesManager instance].chatService messagesWithChatDialogID:@"53fdc87fe4b0f91d92fbb27e" completion:^(QBResponse *response, NSArray *messages) { - // update UI, handle messages -}]; -``` - -These message are automatically stored in **QMMessagesMemoryStorage** class. - -## Sending message - -Send message to dialog: - -```objective-c - -QBChatMessage *message = [QBChatMessage message]; -message.text = @"Awesome text"; -message.senderID = 2308497; - -[[QMServicesManager instance].chatService sendMessage:message type:QMMessageTypeText toDialogId:@"53fdc87fe4b0f91d92fbb27e" saveToHistory:YES saveToStorage:YES completion:nil]; -``` - -Message is automatically added to **QMMessagesMemoryStorage** class. - -## Fetching users - - -```objective-c -[[[QMServicesManager instance].usersService getUsersWithIDs:@[@(2308497), @(2308498)]] continueWithBlock:^id(BFTask *> *task) { - if (task.error == nil) { - // handle users - } - return nil; -}]; -``` - -Users are automatically stored in **QMUsersMemoryStorage** class. - -## Subclass of QMServicesManager example - -This example adds additional functionality - storing of users in contact list cache, error handling, storing currently opened dialog identifier. - -Header file: - -```objective-c -@interface ServicesManager : QMServicesManager - -// Replaces with any users service you are already using or going to use -@property (nonatomic, readonly) UsersService* usersService; - -@property (nonatomic, strong) NSString* currentDialogID; - -@end - -``` - -Implementation file: - -```objective-c -@interface ServicesManager () - -@property (nonatomic, strong) QMContactListService* contactListService; - -@end - -@implementation ServicesManager - -- (instancetype)init { - self = [super init]; - - if (self) { - [QMContactListCache setupDBWithStoreNamed:kContactListCacheNameKey]; - _contactListService = [[QMContactListService alloc] initWithServiceManager:self cacheDataSource:self]; - // Replace with any users service you are already using or going to use - _usersService = [[UsersService alloc] initWithContactListService:_contactListService]; - } - - return self; -} - -- (void)showNotificationForMessage:(QBChatMessage *)message inDialogID:(NSString *)dialogID -{ - if ([self.currentDialogID isEqualToString:dialogID]) return; - - if (message.senderID == self.currentUser.ID) return; - - NSString* dialogName = @"New message"; - - QBChatDialog* dialog = [self.chatService.dialogsMemoryStorage chatDialogWithID:dialogID]; - - if (dialog.type != QBChatDialogTypePrivate) { - dialogName = dialog.name; - } else { - QBUUser* user = [[StorageManager instance] userByID:dialog.recipientID]; - if (user != nil) { - dialogName = user.login; - } - } - - // Display notification UI -} - -- (void)handleErrorResponse:(QBResponse *)response { - - [super handleErrorResponse:response]; - - if (![self isAuthorized]) return; - NSString *errorMessage = [[response.error description] stringByReplacingOccurrencesOfString:@"(" withString:@""]; - errorMessage = [errorMessage stringByReplacingOccurrencesOfString:@")" withString:@""]; - - if( response.status == 502 ) { // bad gateway, server error - errorMessage = @"Bad Gateway, please try again"; - } - else if( response.status == 0 ) { // bad gateway, server error - errorMessage = @"Connection network error, please try again"; - } - - // Display notification UI -} - -#pragma mark QMChatServiceCache delegate - -- (void)chatService:(QMChatService *)chatService didAddMessageToMemoryStorage:(QBChatMessage *)message forDialogID:(NSString *)dialogID { - [super chatService:chatService didAddMessageToMemoryStorage:message forDialogID:dialogID]; - - [self showNotificationForMessage:message inDialogID:dialogID]; -} - -#pragma mark QMContactListServiceCacheDelegate delegate - -- (void)cachedUsers:(QMCacheCollection)block { - [QMContactListCache.instance usersSortedBy:@"id" ascending:YES completion:block]; -} - -- (void)cachedContactListItems:(QMCacheCollection)block { - [QMContactListCache.instance contactListItems:block]; -} - -@end -``` - -## QMAuthService - -This class is responsible for authentication operations. - -Current user authorisation status: - -```objective-c - -@property (assign, nonatomic, readonly) BOOL isAuthorized; - -``` - -Sign up user and login to Quickblox. - -```objective-c - -- (QBRequest *)signUpAndLoginWithUser:(QBUUser *)user completion:(void(^)(QBResponse *response, QBUUser *userProfile))completion; - -``` - -Login user to Quickblox. - -```objective-c - -- (QBRequest *)logInWithUser:(QBUUser *)user completion:(void(^)(QBResponse *response, QBUUser *userProfile))completion; - -``` - -Login with facebook session token. - -```objective-c - -- (QBRequest *)logInWithFacebookSessionToken:(NSString *)sessionToken completion:(void(^)(QBResponse *response, QBUUser *userProfile))completion; - -``` - -Logout user from Quickblox. - -```objective-c - -- (QBRequest *)logInWithFacebookSessionToken:(NSString *)sessionToken completion:(void(^)(QBResponse *response, QBUUser *userProfile))completion; - -``` - -### QMAuthService + Bolts - -QMAuthService also has all methods implemented using BFTasks. - -Sign up user and log's in to Quickblox using Bolts. - -```objective-c - -- (BFTask *)signUpAndLoginWithUser:(QBUUser *)user; - -``` - -Login user to Quickblox using Bolts. - -```objective-c - -- (BFTask *)loginWithUser:(QBUUser *)user; - -``` - -Login with facebook session token using Bolts. - -```objective-c - -- (BFTask *)loginWithFacebookSessionToken:(NSString *)sessionToken; - -``` - -Logout user from Quickblox using Bolts. - -```objective-c - -- (BFTask *)logout; - -``` - -## QMChatService - -This class is responsible for operation with messages and dialogs. - -Connect user to Quickblox chat. - -```objective-c - -- (void)connectWithCompletionBlock:(QBChatCompletionBlock)completion; - -``` - -Disconnect user from Quickblox chat. - -```objective-c - -- (void)disconnectWithCompletionBlock:(QBChatCompletionBlock)completion; - -``` - -Join user to group dialog. - -```objective-c - -- (void)joinToGroupDialog:(QBChatDialog *)dialog completion:(QBChatCompletionBlock)completion; - -``` - -Create group chat dialog with occupants on Quickblox. - -```objective-c - -- (void)createGroupChatDialogWithName:(NSString *)name photo:(NSString *)photo occupants:(NSArray *)occupants -completion:(void(^)(QBResponse *response, QBChatDialog *createdDialog))completion; - -``` - -Create private chat dialog with opponent on Quickblox. - -```objective-c - -- (void)createPrivateChatDialogWithOpponent:(QBUUser *)opponent -completion:(void(^)(QBResponse *response, QBChatDialog *createdDialog))completion; - -``` - -Change dialog name. - -```objective-c - -- (void)changeDialogName:(NSString *)dialogName forChatDialog:(QBChatDialog *)chatDialog -completion:(void(^)(QBResponse *response, QBChatDialog *updatedDialog))completion; - -``` - -Change dialog avatar. - -```objective-c - -- (void)changeDialogAvatar:(NSString *)avatarPublicUrl forChatDialog:(QBChatDialog *)chatDialog -completion:(void(^)(QBResponse *response, QBChatDialog *updatedDialog))completion; - -``` - -Add occupants to dialog. - -``` objective-c - -- (void)joinOccupantsWithIDs:(NSArray *)ids toChatDialog:(QBChatDialog *)chatDialog -completion:(void(^)(QBResponse *response, QBChatDialog *updatedDialog))completion; - - -``` - - -Deletes dialog on service and in cache. - -```objective-c - -- (void)deleteDialogWithID:(NSString *)dialogId -completion:(void(^)(QBResponse *response))completion; - -``` - -Recursively fetch all dialogs from Quickblox. - -```objective-c - -- (void)allDialogsWithPageLimit:(NSUInteger)limit - extendedRequest:(NSDictionary *)extendedRequest - iterationBlock:(void(^)(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, BOOL *stop))iterationBlock - completion:(void(^)(QBResponse *response))completion; -``` - -Send system message to users about adding to dialog with dialog inside. - -```objective-c - -- (void)sendSystemMessageAboutAddingToDialog:(QBChatDialog *)chatDialog - toUsersIDs:(NSArray *)usersIDs - completion:(QBChatCompletionBlock)completion; - -``` - -Send message about updated dialog with dialog inside and notification. - -```objective-c - -- (void)sendMessageAboutUpdateDialog:(QBChatDialog *)updatedDialog - withNotificationText:(NSString *)notificationText - customParameters:(NSDictionary *)customParameters - completion:(QBChatCompletionBlock)completion; - -``` - -Send message about accepting or rejecting contact requst. - -```objective-c - -- (void)sendMessageAboutAcceptingContactRequest:(BOOL)accept - toOpponentID:(NSUInteger)opponentID - completion:(QBChatCompletionBlock)completion; - -``` - -Sending notification message about adding occupants to specific dialog. - -```objective-c - -- (void)sendNotificationMessageAboutAddingOccupants:(NSArray *)occupantsIDs - toDialog:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText - completion:(QBChatCompletionBlock)completion; - -``` - -Sending notification message about leaving dialog. - -```objective-c - -- (void)sendNotificationMessageAboutLeavingDialog:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText - completion:(QBChatCompletionBlock)completion; - -``` - -Sending notification message about changing dialog photo. - -```objective-c - -- (void)sendNotificationMessageAboutChangingDialogPhoto:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText - completion:(QBChatCompletionBlock)completion; - -``` - -Sending notification message about changing dialog name. - -```objective-c - -- (void)sendNotificationMessageAboutChangingDialogName:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText - completion:(QBChatCompletionBlock)completion; - -``` - -Fetches 100 messages starting from latest message in cache. - -```objective-c - -- (void)messagesWithChatDialogID:(NSString *)chatDialogID completion:(void(^)(QBResponse *response, NSArray *messages))completion; - -``` - -Fetches 100 messages that are older than oldest message in cache. - -```objective-c - -- (BFTask *> *)loadEarlierMessagesWithChatDialogID:(NSString *)chatDialogID; - -``` - -Fetch dialog with dialog identifier. - -```objective-c - -- (void)fetchDialogWithID:(NSString *)dialogID completion:(void (^)(QBChatDialog *dialog))completion; - -``` - -Load dialog with dialog identifier from Quickblox server and save to local storage. - -```objective-c - -- (void)loadDialogWithID:(NSString *)dialogID completion:(void (^)(QBChatDialog *loadedDialog))completion; - -``` - -Fetch dialogs updated from date. - -```objective-c - -- (void)fetchDialogsUpdatedFromDate:(NSDate *)date - andPageLimit:(NSUInteger)limit - iterationBlock:(void(^)(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, BOOL *stop))iteration - completionBlock:(void (^)(QBResponse *response))completion; - -``` - -Send message to dialog. - -```objective-c - -- (void)sendMessage:(QBChatMessage *)message - toDialog:(QBChatDialog *)dialog - saveToHistory:(BOOL)saveToHistory - saveToStorage:(BOOL)saveToStorage - completion:(QBChatCompletionBlock)completion; - -``` - -Send attachment message to dialog. - -```objective-c - -- (void)sendAttachmentMessage:(QBChatMessage *)attachmentMessage - toDialog:(QBChatDialog *)dialog - withAttachmentImage:(UIImage *)image - completion:(QBChatCompletionBlock)completion; - -``` - -Mark message as delivered. - -```objective-c - -- (void)markMessageAsDelivered:(QBChatMessage *)message completion:(QBChatCompletionBlock)completion; - -``` - -Mark messages as delivered. - -```objective-c - -- (void)markMessagesAsDelivered:(NSArray *)messages completion:(QBChatCompletionBlock)completion; - -``` - -Send read status for message and update unreadMessageCount for dialog in storage. - -```objective-c - -- (void)readMessage:(QBChatMessage *)message completion:(QBChatCompletionBlock)completion; - -``` - -Send read status for messages and update unreadMessageCount for dialog in storage. - -```objective-c - -- (void)readMessages:(NSArray *)messages forDialogID:(NSString *)dialogID completion:(QBChatCompletionBlock)completion; - -``` - -### QMChatService + Bolts - -QMChatService also has all methods implemented using BFTasks. - -Connect user to Quickblox chat using Bolts. - -```objective-c - -- (BFTask *)connect; - -``` - -Disconnect user from Quickblox chat using Bolts. - -```objective-c - -- (BFTask *)disconnect; - -``` - -Join user to group dialog using Bolts. - -```objective-c - -- (BFTask *)joinToGroupDialog:(QBChatDialog *)dialog; - -``` - -Create group chat dialog with occupants on Quickblox using Bolts. - -```objective-c - -- (BFTask *)createGroupChatDialogWithName:(NSString *)name photo:(NSString *)photo occupants:(NSArray *)occupants; - -``` - -Create private chat dialog with opponent on Quickblox using Bolts. - -```objective-c - -- (BFTask *)createPrivateChatDialogWithOpponent:(QBUUser *)opponent; - -``` - -Change dialog name using Bolts. - -```objective-c - -- (BFTask *)changeDialogName:(NSString *)dialogName forChatDialog:(QBChatDialog *)chatDialog; - -``` - -Change dialog avatar using Bolts. - -```objective-c - -- (BFTask *)changeDialogAvatar:(NSString *)avatarPublicUrl forChatDialog:(QBChatDialog *)chatDialog; - -``` - -Add occupants to dialog using Bolts. - -``` objective-c - -- (BFTask *)joinOccupantsWithIDs:(NSArray *)ids toChatDialog:(QBChatDialog *)chatDialog; - -``` - -Deletes dialog on service and in cache using Bolts. - -```objective-c - -- (BFTask *)deleteDialogWithID:(NSString *)dialogID; - -``` - -Recursively fetch all dialogs from Quickblox using Bolts. - -```objective-c - -- (BFTask *)allDialogsWithPageLimit:(NSUInteger)limit - extendedRequest:(NSDictionary *)extendedRequest - iterationBlock:(void(^)(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, BOOL *stop))iterationBlock; - -``` - -Send system message to users about adding to dialog with dialog inside using Bolts. - -```objective-c - -- (BFTask *)sendSystemMessageAboutAddingToDialog:(QBChatDialog *)chatDialog - toUsersIDs:(NSArray *)usersIDs; - -``` - -Send message about accepting or rejecting contact requst using Bolts. - -```objective-c - -- (BFTask *)sendMessageAboutAcceptingContactRequest:(BOOL)accept - toOpponentID:(NSUInteger)opponentID; - -``` - -Sending notification message about adding occupants to specific dialog using Bolts. - -```objective-c - -- (BFTask *)sendNotificationMessageAboutAddingOccupants:(NSArray *)occupantsIDs - toDialog:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText; - -``` - -Sending notification message about leaving dialog using Bolts. - -```objective-c - -- (BFTask *)sendNotificationMessageAboutLeavingDialog:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText; - -``` - -Sending notification message about changing dialog photo using Bolts. - -```objective-c - -- (BFTask *)sendNotificationMessageAboutChangingDialogPhoto:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText; - -``` - -Sending notification message about changing dialog name using Bolts. - -```objective-c - -- (BFTask *)sendNotificationMessageAboutChangingDialogName:(QBChatDialog *)chatDialog - withNotificationText:(NSString *)notificationText; - -``` - -Fetches messages with chat dialog ID using Bolts. - -```objective-c - -- (BFTask *)messagesWithChatDialogID:(NSString *)chatDialogID; - -``` - -Fetch dialog with dialog identifier using Bolts. - -```objective-c - -- (BFTask *)fetchDialogWithID:(NSString *)dialogID; - -``` - -Load dialog with dialog identifier from Quickblox server and save to local storage using Bolts. - -```objective-c - -- (BFTask *)loadDialogWithID:(NSString *)dialogID; - -``` - -Fetch dialogs updated from date using Bolts. - -```objective-c - -- (BFTask *)fetchDialogsUpdatedFromDate:(NSDate *)date - andPageLimit:(NSUInteger)limit - iterationBlock:(void(^)(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, BOOL *stop))iteration; - -``` - -Send message to dialog using Bolts. - -```objective-c - -- (BFTask *)sendMessage:(QBChatMessage *)message - toDialog:(QBChatDialog *)dialog - saveToHistory:(BOOL)saveToHistory - saveToStorage:(BOOL)saveToStorage; - -``` - -Send attachment message to dialog using Bolts. - -```objective-c - -- (BFTask *)sendAttachmentMessage:(QBChatMessage *)attachmentMessage - toDialog:(QBChatDialog *)dialog - withAttachmentImage:(UIImage *)image; - -``` - -Mark message as delivered using Bolts. - -```objective-c - -- (BFTask *)markMessageAsDelivered:(QBChatMessage *)message; - -``` - -Send read status for message and update unreadMessageCount for dialog in storage using Bolts. - -```objective-c - -- (BFTask *)readMessage:(QBChatMessage *)message; - -``` - -### QMDialogsMemoryStorage - -This class is responsible for in-memory dialogs storage. - -Adds chat dialog and joins if chosen. - -```objective-c - -- (void)addChatDialog:(QBChatDialog *)chatDialog andJoin:(BOOL)join completion:(void(^)(QBChatDialog *addedDialog, NSError *error))completion; - -``` - -Adds chat dialogs and joins. - -```objective-c - -- (void)addChatDialogs:(NSArray *)dialogs andJoin:(BOOL)join; - -``` - -Deletes chat dialog. - -```objective-c - -- (void)deleteChatDialogWithID:(NSString *)chatDialogID; - -``` - -Find dialog by identifier. - -```objective-c - -- (QBChatDialog *)chatDialogWithID:(NSString *)dialogID; - -``` - -Find private chat dialog with opponent ID. - -```objective-c - -- (QBChatDialog *)privateChatDialogWithOpponentID:(NSUInteger)opponentID; - -``` - -Find unread dialogs. - -```objective-c - -- (NSArray *)unreadDialogs; - -``` - -Fetch all dialogs. - -```objective-c - -- (NSArray *)unsortedDialogs; - -``` - -Fetch all dialogs sorted by last message date. - -```objective-c - -- (NSArray *)dialogsSortByLastMessageDateWithAscending:(BOOL)ascending; - -``` - -Fetch all dialogs sorted by updated at. - -```objective-c - -- (NSArray *)dialogsSortByUpdatedAtWithAscending:(BOOL)ascending; - -``` - -Fetch dialogs with specified sort descriptors. - -```objective-c - -- (NSArray *)dialogsWithSortDescriptors:(NSArray *)descriptors; - -``` - -### QMMessagesMemoryStorage - -This class is responsible for in-memory messages storage. - -Add message. - -```objective-c - -- (void)addMessage:(QBChatMessage *)message forDialogID:(NSString *)dialogID; - -``` - -Add messages. - -```objective-c - -- (void)addMessages:(NSArray *)messages forDialogID:(NSString *)dialogID; - -``` - -Replace all messages for dialog. - -```objective-c - -- (void)replaceMessages:(NSArray *)messages forDialogID:(NSString *)dialogID; - -``` - -Update message. - -```objective-c - -- (void)updateMessage:(QBChatMessage *)message; - -``` - -Fetch messages. - -```objective-c - -- (NSArray *)messagesWithDialogID:(NSString *)dialogID; - -``` - -Delete messages for dialog. - -```objective-c - -- (void)deleteMessagesWithDialogID:(NSString *)dialogID; - -``` - -Fetch message by identifier. - -```objective-c - -- (QBChatMessage *)messageWithID:(NSString *)messageID fromDialogID:(NSString *)dialogID; - -``` - -Fetch last message. - -```objective-c - -- (QBChatMessage *)lastMessageFromDialogID:(NSString *)dialogID; - -``` - -Checks if dialog has messages. - -```objective-c - -- (BOOL)isEmptyForDialogID:(NSString *)dialogID; - -``` - -Fetch oldest(first) message. - -```objective-c - -- (QBChatMessage *)oldestMessageForDialogID:(NSString *)dialogID; - -``` - -### QMChatAttachmentService - -This class is responsible for attachment operations (sending, receiving, loading, saving). - -Attachment status delegate: - -```objective-c - -@property (nonatomic, weak) id delegate; - -``` - -Get attachment image. (Download from Quickblox or load from disc). - -```objective-c - -- (void)getImageForAttachmentMessage:(QBChatMessage *)attachmentMessage completion:(void(^)(NSError *error, UIImage *image))completion; - -``` - -## QMContactListService - -This class is responsible for contact list operations. - -Add user to contact list. - -```objective-c - -- (void)addUserToContactListRequest:(QBUUser *)user completion:(void(^)(BOOL success))completion; - -``` - -Remove user from contact list. - -```objective-c - -- (void)removeUserFromContactListWithUserID:(NSUInteger)userID completion:(void(^)(BOOL success))completion; - -``` - -Accept contact request. - -```objective-c - -- (void)acceptContactRequest:(NSUInteger)userID completion:(void (^)(BOOL success))completion; - -``` - -Reject contact request. - -```objective-c - -- (void)rejectContactRequest:(NSUInteger)userID completion:(void(^)(BOOL success))completion; - -``` - -### QMContactListMemoryStorage - -This class is responsible for in-memory contact list storage. - -Update contact list memory storage. - -```objective-c - -- (void)updateWithContactList:(QBContactList *)contactList; - -``` - -Update contact list memory storage with array of contact list items. - -```objective-c - -- (void)updateWithContactList:(QBContactList *)contactList; - -``` - -Fetch contact list item. - -```objective-c - -- (QBContactListItem *)contactListItemWithUserID:(NSUInteger)userID; - -``` - -Fetch user ids from contact list memory storage. - -```objective-c - -- (NSArray *)userIDsFromContactList; - -``` - -## QMUsersService - -This class is responsible for operations with users and uses [BFTasks](https://github.com/BoltsFramework/Bolts-iOS "Bolts-iOS"). - -Load users to memory storage from disc cache. - -```objective-c - -- (BFTask *> *)loadFromCache; - -``` - -###Get users - -There are several ways to get users by methods below. By default every get method first checking for a specific user in cache. If such user was found in cache method will exclude him from server request, and send request only for users, that weren't found in local cache. If you want to update users in cache, you need to force them to be loaded from server, even though they are already being cached. -Every get method has also its implementation with forceLoad flag, set it to YES in order to force users loading from server. - -Get user by id: - -```objective-c - -- (BFTask *)getUserWithID:(NSUInteger)userID; - -``` - -Get users by ids: - -```objective-c - -- (BFTask *> *)getUsersWithIDs:(NSArray *)usersIDs; - -``` - -Get users by ids with extended pagination parameters: - -```objective-c - -- (BFTask *> *)getUsersWithIDs:(NSArray *)usersIDs page:(QBGeneralResponsePage *)page; - -``` - -Get users by emails: - -```objective-c - -- (BFTask *> *)getUsersWithEmails:(NSArray *)emails; - -``` - -Get users by emails with extended pagination parameters: - -```objective-c - -- (BFTask *> *)getUsersWithEmails:(NSArray *)emails page:(QBGeneralResponsePage *)page; - -``` - -Get users by facebook ids: - -```objective-c - -- (BFTask *> *)getUsersWithFacebookIDs:(NSArray *)facebookIDs; - -``` - -Get users by facebook ids with extended pagination parameters: - -```objective-c - -- (BFTask *> *)getUsersWithFacebookIDs:(NSArray *)facebookIDs page:(QBGeneralResponsePage *)page; - -``` - -Get users by logins: - -```objective-c - -- (BFTask *> *)getUsersWithLogins:(NSArray *)logins; - -``` - -Get users by logins with extended pagination parameters: - -```objective-c - -- (BFTask *> *)getUsersWithLogins:(NSArray *)logins page:(QBGeneralResponsePage *)page; - -``` - -###Search users - -Search for users by full name: - -```objective-c - -- (BFTask *> *)searchUsersWithFullName:(NSString *)searchText; - -``` - -Search for users by full name with extended pagination parameters: - -```objective-c - -- (BFTask *> *)searchUsersWithFullName:(NSString *)searchText page:(QBGeneralResponsePage *)page; - -``` - -Search for users by tags: - -```objective-c - -- (BFTask *> *)searchUsersWithTags:(NSArray *)tags; - -``` - -Search for users by tags with extended pagination parameters: - -```objective-c - -- (BFTask *> *)searchUsersWithTags:(NSArray *)tags page:(QBGeneralResponsePage *)page; - -``` - -### QMUsersMemoryStorage - -This class is responsible for in-memory users storage. - -Delegate for getting UsersMemoryStorage user ids. - -```objective-c - -@property (weak, nonatomic) id delegate; - -``` - -#### Add users - -Add user to memory storage. - -```objective-c - -- (void)addUser:(QBUUser *)user; - -``` - -Add users to memory storage. - -```objective-c - -- (void)addUsers:(NSArray *)users; - -``` - -#### Get users - -Get all users from memory storage without sorting. - -```objective-c - -- (NSArray *)unsortedUsers; - -``` - -Get all users in memory storage sorted by key. - -```objective-c - -- (NSArray *)usersSortedByKey:(NSString *)key ascending:(BOOL)ascending; - -``` - -Get all contacts in memory storage sorted by key. - -```objective-c - -- (NSArray *)contactsSortedByKey:(NSString *)key ascending:(BOOL)ascending; - -``` - -Get users with ids without some id. - -```objective-c - -- (NSArray *)usersWithIDs:(NSArray *)IDs withoutID:(NSUInteger)ID; - -``` - -Get string created from users full names, separated by ",". - -```objective-c - -- (NSString *)joinedNamesbyUsers:(NSArray *)users; - -``` - -Get user with user id. - -```objective-c - -- (QBUUser *)userWithID:(NSUInteger)userID; - -``` - -Get users with user ids. - -```objective-c - -- (NSArray *)usersWithIDs:(NSArray *)ids; - -``` - -Get users with user logins. - -```objective-c - -- (NSArray *)usersWithLogins:(NSArray *)logins; - -``` - -Get users with user emails. - -```objective-c - -- (NSArray *)usersWithEmails:(NSArray *)emails; - -``` - -Get users with user facebook ids. - -```objective-c - -- (NSArray *)usersWithFacebookIDs:(NSArray *)facebookIDs; - -``` - -#### Search and Exclude -Search for users excluding users with users ids. Result dictionary will contain an array of found users, and an array of not found search criteria (ids, logins, emails etc). - -```objective-c - -- (NSDictionary *)usersByExcludingUsersIDs:(NSArray *)ids; - -``` - -Search for users excluding users with logins. - -```objective-c - -- (NSDictionary *)usersByExcludingLogins:(NSArray *)logins; - -``` - -Search for users excluding users with email. - -```objective-c - -- (NSDictionary *)usersByExcludingEmails:(NSArray *)emails; - -``` - -Search for users excluding users with facebook IDs. - -```objective-c - -- (NSDictionary *)usersByExcludingFacebookIDs:(NSArray *)facebookIDs; - -``` - -# Documentation - -For more information see our inline code documentation. - -# License - -See [LICENSE.txt](LICENSE.txt) diff --git a/Pods/Reachability/LICENCE.txt b/Pods/Reachability/LICENCE.txt deleted file mode 100644 index 12b7844c3..000000000 --- a/Pods/Reachability/LICENCE.txt +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2011-2013, Tony Million. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/Pods/Reachability/README.md b/Pods/Reachability/README.md deleted file mode 100644 index 4814e6d4b..000000000 --- a/Pods/Reachability/README.md +++ /dev/null @@ -1,75 +0,0 @@ -[![Reference Status](https://www.versioneye.com/objective-c/reachability/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/reachability/references) - -# Reachability - -This is a drop-in replacement for Apple's `Reachability` class. It is ARC-compatible, and it uses the new GCD methods to notify of network interface changes. - -In addition to the standard `NSNotification`, it supports the use of blocks for when the network becomes reachable and unreachable. - -Finally, you can specify whether a WWAN connection is considered "reachable". - -*DO NOT OPEN BUGS UNTIL YOU HAVE TESTED ON DEVICE* - -## Requirements - -Once you have added the `.h/m` files to your project, simply: - -* Go to the `Project->TARGETS->Build Phases->Link Binary With Libraries`. -* Press the plus in the lower left of the list. -* Add `SystemConfiguration.framework`. - -Boom, you're done. - -## Examples - -### Block Example - -This sample uses blocks to notify when the interface state has changed. The blocks will be called on a **BACKGROUND THREAD**, so you need to dispatch UI updates onto the main thread. - - // Allocate a reachability object - Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"]; - - // Set the blocks - reach.reachableBlock = ^(Reachability*reach) - { - // keep in mind this is called on a background thread - // and if you are updating the UI it needs to happen - // on the main thread, like this: - - dispatch_async(dispatch_get_main_queue(), ^{ - NSLog(@"REACHABLE!"); - }); - }; - - reach.unreachableBlock = ^(Reachability*reach) - { - NSLog(@"UNREACHABLE!"); - }; - - // Start the notifier, which will cause the reachability object to retain itself! - [reach startNotifier]; - -### `NSNotification` Example - -This sample will use `NSNotification`s to notify when the interface has changed. They will be delivered on the **MAIN THREAD**, so you *can* do UI updates from within the function. - -In addition, it asks the `Reachability` object to consider the WWAN (3G/EDGE/CDMA) as a non-reachable connection (you might use this if you are writing a video streaming app, for example, to save the user's data plan). - - // Allocate a reachability object - Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"]; - - // Tell the reachability that we DON'T want to be reachable on 3G/EDGE/CDMA - reach.reachableOnWWAN = NO; - - // Here we set up a NSNotification observer. The Reachability that caused the notification - // is passed in the object parameter - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(reachabilityChanged:) - name:kReachabilityChangedNotification - object:nil]; - - [reach startNotifier]; - -## Tell the world - -Head over to [Projects using Reachability](https://github.com/tonymillion/Reachability/wiki/Projects-using-Reachability) and add your project for "Maximum Wins!". diff --git a/Pods/Reachability/Reachability.h b/Pods/Reachability/Reachability.h deleted file mode 100644 index c43215236..000000000 --- a/Pods/Reachability/Reachability.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - Copyright (c) 2011, Tony Million. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import - - -/** - * Create NS_ENUM macro if it does not exist on the targeted version of iOS or OS X. - * - * @see http://nshipster.com/ns_enum-ns_options/ - **/ -#ifndef NS_ENUM -#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type -#endif - -extern NSString *const kReachabilityChangedNotification; - -typedef NS_ENUM(NSInteger, NetworkStatus) { - // Apple NetworkStatus Compatible Names. - NotReachable = 0, - ReachableViaWiFi = 2, - ReachableViaWWAN = 1 -}; - -@class Reachability; - -typedef void (^NetworkReachable)(Reachability * reachability); -typedef void (^NetworkUnreachable)(Reachability * reachability); - - -@interface Reachability : NSObject - -@property (nonatomic, copy) NetworkReachable reachableBlock; -@property (nonatomic, copy) NetworkUnreachable unreachableBlock; - -@property (nonatomic, assign) BOOL reachableOnWWAN; - - -+(Reachability*)reachabilityWithHostname:(NSString*)hostname; -// This is identical to the function above, but is here to maintain -//compatibility with Apples original code. (see .m) -+(Reachability*)reachabilityWithHostName:(NSString*)hostname; -+(Reachability*)reachabilityForInternetConnection; -+(Reachability*)reachabilityWithAddress:(void *)hostAddress; -+(Reachability*)reachabilityForLocalWiFi; - --(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref; - --(BOOL)startNotifier; --(void)stopNotifier; - --(BOOL)isReachable; --(BOOL)isReachableViaWWAN; --(BOOL)isReachableViaWiFi; - -// WWAN may be available, but not active until a connection has been established. -// WiFi may require a connection for VPN on Demand. --(BOOL)isConnectionRequired; // Identical DDG variant. --(BOOL)connectionRequired; // Apple's routine. -// Dynamic, on demand connection? --(BOOL)isConnectionOnDemand; -// Is user intervention required? --(BOOL)isInterventionRequired; - --(NetworkStatus)currentReachabilityStatus; --(SCNetworkReachabilityFlags)reachabilityFlags; --(NSString*)currentReachabilityString; --(NSString*)currentReachabilityFlags; - -@end diff --git a/Pods/Reachability/Reachability.m b/Pods/Reachability/Reachability.m deleted file mode 100644 index f2952d934..000000000 --- a/Pods/Reachability/Reachability.m +++ /dev/null @@ -1,469 +0,0 @@ -/* - Copyright (c) 2011, Tony Million. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - */ - -#import "Reachability.h" - -#import -#import -#import -#import -#import -#import - - -NSString *const kReachabilityChangedNotification = @"kReachabilityChangedNotification"; - - -@interface Reachability () - -@property (nonatomic, assign) SCNetworkReachabilityRef reachabilityRef; -@property (nonatomic, strong) dispatch_queue_t reachabilitySerialQueue; -@property (nonatomic, strong) id reachabilityObject; - --(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags; --(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags; - -@end - - -static NSString *reachabilityFlags(SCNetworkReachabilityFlags flags) -{ - return [NSString stringWithFormat:@"%c%c %c%c%c%c%c%c%c", -#if TARGET_OS_IPHONE - (flags & kSCNetworkReachabilityFlagsIsWWAN) ? 'W' : '-', -#else - 'X', -#endif - (flags & kSCNetworkReachabilityFlagsReachable) ? 'R' : '-', - (flags & kSCNetworkReachabilityFlagsConnectionRequired) ? 'c' : '-', - (flags & kSCNetworkReachabilityFlagsTransientConnection) ? 't' : '-', - (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-', - (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) ? 'C' : '-', - (flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ? 'D' : '-', - (flags & kSCNetworkReachabilityFlagsIsLocalAddress) ? 'l' : '-', - (flags & kSCNetworkReachabilityFlagsIsDirect) ? 'd' : '-']; -} - -// Start listening for reachability notifications on the current run loop -static void TMReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) -{ -#pragma unused (target) - - Reachability *reachability = ((__bridge Reachability*)info); - - // We probably don't need an autoreleasepool here, as GCD docs state each queue has its own autorelease pool, - // but what the heck eh? - @autoreleasepool - { - [reachability reachabilityChanged:flags]; - } -} - - -@implementation Reachability - -#pragma mark - Class Constructor Methods - -+(Reachability*)reachabilityWithHostName:(NSString*)hostname -{ - return [Reachability reachabilityWithHostname:hostname]; -} - -+(Reachability*)reachabilityWithHostname:(NSString*)hostname -{ - SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]); - if (ref) - { - id reachability = [[self alloc] initWithReachabilityRef:ref]; - - return reachability; - } - - return nil; -} - -+(Reachability *)reachabilityWithAddress:(void *)hostAddress -{ - SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress); - if (ref) - { - id reachability = [[self alloc] initWithReachabilityRef:ref]; - - return reachability; - } - - return nil; -} - -+(Reachability *)reachabilityForInternetConnection -{ - struct sockaddr_in zeroAddress; - bzero(&zeroAddress, sizeof(zeroAddress)); - zeroAddress.sin_len = sizeof(zeroAddress); - zeroAddress.sin_family = AF_INET; - - return [self reachabilityWithAddress:&zeroAddress]; -} - -+(Reachability*)reachabilityForLocalWiFi -{ - struct sockaddr_in localWifiAddress; - bzero(&localWifiAddress, sizeof(localWifiAddress)); - localWifiAddress.sin_len = sizeof(localWifiAddress); - localWifiAddress.sin_family = AF_INET; - // IN_LINKLOCALNETNUM is defined in as 169.254.0.0 - localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM); - - return [self reachabilityWithAddress:&localWifiAddress]; -} - - -// Initialization methods - --(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref -{ - self = [super init]; - if (self != nil) - { - self.reachableOnWWAN = YES; - self.reachabilityRef = ref; - - // We need to create a serial queue. - // We allocate this once for the lifetime of the notifier. - - self.reachabilitySerialQueue = dispatch_queue_create("com.tonymillion.reachability", NULL); - } - - return self; -} - --(void)dealloc -{ - [self stopNotifier]; - - if(self.reachabilityRef) - { - CFRelease(self.reachabilityRef); - self.reachabilityRef = nil; - } - - self.reachableBlock = nil; - self.unreachableBlock = nil; - self.reachabilitySerialQueue = nil; -} - -#pragma mark - Notifier Methods - -// Notifier -// NOTE: This uses GCD to trigger the blocks - they *WILL NOT* be called on THE MAIN THREAD -// - In other words DO NOT DO ANY UI UPDATES IN THE BLOCKS. -// INSTEAD USE dispatch_async(dispatch_get_main_queue(), ^{UISTUFF}) (or dispatch_sync if you want) - --(BOOL)startNotifier -{ - // allow start notifier to be called multiple times - if(self.reachabilityObject && (self.reachabilityObject == self)) - { - return YES; - } - - - SCNetworkReachabilityContext context = { 0, NULL, NULL, NULL, NULL }; - context.info = (__bridge void *)self; - - if(SCNetworkReachabilitySetCallback(self.reachabilityRef, TMReachabilityCallback, &context)) - { - // Set it as our reachability queue, which will retain the queue - if(SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, self.reachabilitySerialQueue)) - { - // this should do a retain on ourself, so as long as we're in notifier mode we shouldn't disappear out from under ourselves - // woah - self.reachabilityObject = self; - return YES; - } - else - { -#ifdef DEBUG - NSLog(@"SCNetworkReachabilitySetDispatchQueue() failed: %s", SCErrorString(SCError())); -#endif - - // UH OH - FAILURE - stop any callbacks! - SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL); - } - } - else - { -#ifdef DEBUG - NSLog(@"SCNetworkReachabilitySetCallback() failed: %s", SCErrorString(SCError())); -#endif - } - - // if we get here we fail at the internet - self.reachabilityObject = nil; - return NO; -} - --(void)stopNotifier -{ - // First stop, any callbacks! - SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL); - - // Unregister target from the GCD serial dispatch queue. - SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, NULL); - - self.reachabilityObject = nil; -} - -#pragma mark - reachability tests - -// This is for the case where you flick the airplane mode; -// you end up getting something like this: -//Reachability: WR ct----- -//Reachability: -- ------- -//Reachability: WR ct----- -//Reachability: -- ------- -// We treat this as 4 UNREACHABLE triggers - really apple should do better than this - -#define testcase (kSCNetworkReachabilityFlagsConnectionRequired | kSCNetworkReachabilityFlagsTransientConnection) - --(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags -{ - BOOL connectionUP = YES; - - if(!(flags & kSCNetworkReachabilityFlagsReachable)) - connectionUP = NO; - - if( (flags & testcase) == testcase ) - connectionUP = NO; - -#if TARGET_OS_IPHONE - if(flags & kSCNetworkReachabilityFlagsIsWWAN) - { - // We're on 3G. - if(!self.reachableOnWWAN) - { - // We don't want to connect when on 3G. - connectionUP = NO; - } - } -#endif - - return connectionUP; -} - --(BOOL)isReachable -{ - SCNetworkReachabilityFlags flags; - - if(!SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - return NO; - - return [self isReachableWithFlags:flags]; -} - --(BOOL)isReachableViaWWAN -{ -#if TARGET_OS_IPHONE - - SCNetworkReachabilityFlags flags = 0; - - if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - // Check we're REACHABLE - if(flags & kSCNetworkReachabilityFlagsReachable) - { - // Now, check we're on WWAN - if(flags & kSCNetworkReachabilityFlagsIsWWAN) - { - return YES; - } - } - } -#endif - - return NO; -} - --(BOOL)isReachableViaWiFi -{ - SCNetworkReachabilityFlags flags = 0; - - if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - // Check we're reachable - if((flags & kSCNetworkReachabilityFlagsReachable)) - { -#if TARGET_OS_IPHONE - // Check we're NOT on WWAN - if((flags & kSCNetworkReachabilityFlagsIsWWAN)) - { - return NO; - } -#endif - return YES; - } - } - - return NO; -} - - -// WWAN may be available, but not active until a connection has been established. -// WiFi may require a connection for VPN on Demand. --(BOOL)isConnectionRequired -{ - return [self connectionRequired]; -} - --(BOOL)connectionRequired -{ - SCNetworkReachabilityFlags flags; - - if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - return (flags & kSCNetworkReachabilityFlagsConnectionRequired); - } - - return NO; -} - -// Dynamic, on demand connection? --(BOOL)isConnectionOnDemand -{ - SCNetworkReachabilityFlags flags; - - if (SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - return ((flags & kSCNetworkReachabilityFlagsConnectionRequired) && - (flags & (kSCNetworkReachabilityFlagsConnectionOnTraffic | kSCNetworkReachabilityFlagsConnectionOnDemand))); - } - - return NO; -} - -// Is user intervention required? --(BOOL)isInterventionRequired -{ - SCNetworkReachabilityFlags flags; - - if (SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - return ((flags & kSCNetworkReachabilityFlagsConnectionRequired) && - (flags & kSCNetworkReachabilityFlagsInterventionRequired)); - } - - return NO; -} - - -#pragma mark - reachability status stuff - --(NetworkStatus)currentReachabilityStatus -{ - if([self isReachable]) - { - if([self isReachableViaWiFi]) - return ReachableViaWiFi; - -#if TARGET_OS_IPHONE - return ReachableViaWWAN; -#endif - } - - return NotReachable; -} - --(SCNetworkReachabilityFlags)reachabilityFlags -{ - SCNetworkReachabilityFlags flags = 0; - - if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) - { - return flags; - } - - return 0; -} - --(NSString*)currentReachabilityString -{ - NetworkStatus temp = [self currentReachabilityStatus]; - - if(temp == ReachableViaWWAN) - { - // Updated for the fact that we have CDMA phones now! - return NSLocalizedString(@"Cellular", @""); - } - if (temp == ReachableViaWiFi) - { - return NSLocalizedString(@"WiFi", @""); - } - - return NSLocalizedString(@"No Connection", @""); -} - --(NSString*)currentReachabilityFlags -{ - return reachabilityFlags([self reachabilityFlags]); -} - -#pragma mark - Callback function calls this method - --(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags -{ - if([self isReachableWithFlags:flags]) - { - if(self.reachableBlock) - { - self.reachableBlock(self); - } - } - else - { - if(self.unreachableBlock) - { - self.unreachableBlock(self); - } - } - - // this makes sure the change notification happens on the MAIN THREAD - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification - object:self]; - }); -} - -#pragma mark - Debug Description - -- (NSString *) description -{ - NSString *description = [NSString stringWithFormat:@"<%@: %#x (%@)>", - NSStringFromClass([self class]), (unsigned int) self, [self currentReachabilityFlags]]; - return description; -} - -@end diff --git a/Pods/SAMKeychain/LICENSE b/Pods/SAMKeychain/LICENSE deleted file mode 100644 index 21fe4ef8f..000000000 --- a/Pods/SAMKeychain/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2010-2016 Sam Soffes, http://soff.es - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/SAMKeychain/Readme.markdown b/Pods/SAMKeychain/Readme.markdown deleted file mode 100644 index fbd8d9630..000000000 --- a/Pods/SAMKeychain/Readme.markdown +++ /dev/null @@ -1,87 +0,0 @@ -# SAMKeychain - -[![Version](https://img.shields.io/github/release/soffes/SAMKeychain.svg)](https://github.com/soffes/SAMKeychain/releases) -[![CocoaPods](https://img.shields.io/cocoapods/v/SAMKeychain.svg)](https://cocoapods.org/pods/SAMKeychain) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) - -SAMKeychain is a simple wrapper for accessing accounts, getting passwords, setting passwords, and deleting passwords using the system Keychain on Mac OS X and iOS. - -## Adding to Your Project - -Simply add the following to your Podfile if you're using CocoaPods: - -``` ruby -pod 'SAMKeychain' -``` - -or Cartfile if you're using Carthage: - -``` -github "soffes/SAMKeychain" -``` - -To manually add to your project: - -1. Add `Security.framework` to your target -2. Add `SAMKeychain.h`, `SAMKeychain.m`, `SAMKeychainQuery.h`, and `SAMKeychainQuery.m` to your project. - -SAMKeychain requires ARC. - -Note: Currently SAMKeychain does not support Mac OS 10.6. - -## Working with the Keychain - -SAMKeychain has the following class methods for working with the system keychain: - -```objective-c -+ (NSArray *)allAccounts; -+ (NSArray *)accountsForService:(NSString *)serviceName; -+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account; -+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account; -+ (void)setAccessibilityType:(CFTypeRef)accessibilityType; -+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account; -``` - -Easy as that. (See [SAMKeychain.h](https://github.com/soffes/samkeychain/blob/master/Sources/SAMKeychain.h) and [SAMKeychainQuery.h](https://github.com/soffes/samkeychain/blob/master/Sources/SAMKeychainQuery.h) for all of the methods.) - - -## Documentation - -### Use prepared documentation - -Read the [online documentation](http://cocoadocs.org/docsets/SAMKeychain). - -## Debugging - -If your saving to the keychain fails, use the NSError object to handle it. You can invoke `[error code]` to get the numeric error code. A few values are defined in SAMKeychain.h, and the rest in SecBase.h. - -```objective-c -NSError *error = nil; -SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init]; -query.service = @"MyService"; -query.account = @"soffes"; -[query fetch:&error]; - -if ([error code] == errSecItemNotFound) { - NSLog(@"Password not found"); -} else if (error != nil) { - NSLog(@"Some other error occurred: %@", [error localizedDescription]); -} -``` - -Obviously, you should do something more sophisticated. You can just call `[error localizedDescription]` if all you need is the error message. - -## Disclaimer - -Working with the keychain is pretty sucky. You should really check for errors and failures. This library doesn't make it any more stable, it just wraps up all of the annoying C APIs. - -You also really should not use the default but set the `accessibilityType`. -`kSecAttrAccessibleWhenUnlocked` should work for most applications. See -[Apple Documentation](https://developer.apple.com/library/ios/DOCUMENTATION/Security/Reference/keychainservices/Reference/reference.html#//apple_ref/doc/constant_group/Keychain_Item_Accessibility_Constants) -for other options. - -## Thanks - -This was originally inspired by EMKeychain and SDKeychain (both of which are now gone). Thanks to the authors. SAMKeychain has since switched to a simpler implementation that was abstracted from [SSToolkit](https://github.com/soffes/sstoolkit). - -A huge thanks to [Caleb Davenport](https://github.com/calebd) for leading the way on version 1.0 of SAMKeychain. diff --git a/Pods/SAMKeychain/Sources/SAMKeychain.h b/Pods/SAMKeychain/Sources/SAMKeychain.h deleted file mode 100644 index 2af305d75..000000000 --- a/Pods/SAMKeychain/Sources/SAMKeychain.h +++ /dev/null @@ -1,203 +0,0 @@ -// -// SAMKeychain.h -// SAMKeychain -// -// Created by Sam Soffes on 5/19/10. -// Copyright (c) 2010-2014 Sam Soffes. All rights reserved. -// - -#if __has_feature(modules) - @import Foundation; -#else - #import -#endif - -NS_ASSUME_NONNULL_BEGIN - -/** - Error code specific to SAMKeychain that can be returned in NSError objects. - For codes returned by the operating system, refer to SecBase.h for your - platform. - */ -typedef NS_ENUM(OSStatus, SAMKeychainErrorCode) { - /** Some of the arguments were invalid. */ - SAMKeychainErrorBadArguments = -1001, -}; - -/** SAMKeychain error domain */ -extern NSString *const kSAMKeychainErrorDomain; - -/** Account name. */ -extern NSString *const kSAMKeychainAccountKey; - -/** - Time the item was created. - - The value will be a string. - */ -extern NSString *const kSAMKeychainCreatedAtKey; - -/** Item class. */ -extern NSString *const kSAMKeychainClassKey; - -/** Item description. */ -extern NSString *const kSAMKeychainDescriptionKey; - -/** Item label. */ -extern NSString *const kSAMKeychainLabelKey; - -/** Time the item was last modified. - - The value will be a string. - */ -extern NSString *const kSAMKeychainLastModifiedKey; - -/** Where the item was created. */ -extern NSString *const kSAMKeychainWhereKey; - -/** - Simple wrapper for accessing accounts, getting passwords, setting passwords, and deleting passwords using the system - Keychain on Mac OS X and iOS. - - This was originally inspired by EMKeychain and SDKeychain (both of which are now gone). Thanks to the authors. - SAMKeychain has since switched to a simpler implementation that was abstracted from [SSToolkit](http://sstoolk.it). - */ -@interface SAMKeychain : NSObject - -#pragma mark - Classic methods - -/** - Returns a string containing the password for a given account and service, or `nil` if the Keychain doesn't have a - password for the given parameters. - - @param serviceName The service for which to return the corresponding password. - - @param account The account for which to return the corresponding password. - - @return Returns a string containing the password for a given account and service, or `nil` if the Keychain doesn't - have a password for the given parameters. - */ -+ (nullable NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account; -+ (nullable NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error __attribute__((swift_error(none))); - -/** - Returns a nsdata containing the password for a given account and service, or `nil` if the Keychain doesn't have a - password for the given parameters. - - @param serviceName The service for which to return the corresponding password. - - @param account The account for which to return the corresponding password. - - @return Returns a nsdata containing the password for a given account and service, or `nil` if the Keychain doesn't - have a password for the given parameters. - */ -+ (nullable NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account; -+ (nullable NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error __attribute__((swift_error(none))); - - -/** - Deletes a password from the Keychain. - - @param serviceName The service for which to delete the corresponding password. - - @param account The account for which to delete the corresponding password. - - @return Returns `YES` on success, or `NO` on failure. - */ -+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account; -+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error __attribute__((swift_error(none))); - - -/** - Sets a password in the Keychain. - - @param password The password to store in the Keychain. - - @param serviceName The service for which to set the corresponding password. - - @param account The account for which to set the corresponding password. - - @return Returns `YES` on success, or `NO` on failure. - */ -+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account; -+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error __attribute__((swift_error(none))); - -/** - Sets a password in the Keychain. - - @param password The password to store in the Keychain. - - @param serviceName The service for which to set the corresponding password. - - @param account The account for which to set the corresponding password. - - @return Returns `YES` on success, or `NO` on failure. - */ -+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account; -+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error __attribute__((swift_error(none))); - -/** - Returns an array containing the Keychain's accounts, or `nil` if the Keychain has no accounts. - - See the `NSString` constants declared in SAMKeychain.h for a list of keys that can be used when accessing the - dictionaries returned by this method. - - @return An array of dictionaries containing the Keychain's accounts, or `nil` if the Keychain doesn't have any - accounts. The order of the objects in the array isn't defined. - */ -+ (nullable NSArray *> *)allAccounts; -+ (nullable NSArray *> *)allAccounts:(NSError *__autoreleasing *)error __attribute__((swift_error(none))); - - -/** - Returns an array containing the Keychain's accounts for a given service, or `nil` if the Keychain doesn't have any - accounts for the given service. - - See the `NSString` constants declared in SAMKeychain.h for a list of keys that can be used when accessing the - dictionaries returned by this method. - - @param serviceName The service for which to return the corresponding accounts. - - @return An array of dictionaries containing the Keychain's accounts for a given `serviceName`, or `nil` if the Keychain - doesn't have any accounts for the given `serviceName`. The order of the objects in the array isn't defined. - */ -+ (nullable NSArray *> *)accountsForService:(nullable NSString *)serviceName; -+ (nullable NSArray *> *)accountsForService:(nullable NSString *)serviceName error:(NSError *__autoreleasing *)error __attribute__((swift_error(none))); - - -#pragma mark - Configuration - -#if __IPHONE_4_0 && TARGET_OS_IPHONE -/** - Returns the accessibility type for all future passwords saved to the Keychain. - - @return Returns the accessibility type. - - The return value will be `NULL` or one of the "Keychain Item Accessibility - Constants" used for determining when a keychain item should be readable. - - @see setAccessibilityType - */ -+ (CFTypeRef)accessibilityType; - -/** - Sets the accessibility type for all future passwords saved to the Keychain. - - @param accessibilityType One of the "Keychain Item Accessibility Constants" - used for determining when a keychain item should be readable. - - If the value is `NULL` (the default), the Keychain default will be used which - is highly insecure. You really should use at least `kSecAttrAccessibleAfterFirstUnlock` - for background applications or `kSecAttrAccessibleWhenUnlocked` for all - other applications. - - @see accessibilityType - */ -+ (void)setAccessibilityType:(CFTypeRef)accessibilityType; -#endif - -@end - -NS_ASSUME_NONNULL_END - -#import diff --git a/Pods/SAMKeychain/Sources/SAMKeychain.m b/Pods/SAMKeychain/Sources/SAMKeychain.m deleted file mode 100644 index 6d01d3d62..000000000 --- a/Pods/SAMKeychain/Sources/SAMKeychain.m +++ /dev/null @@ -1,130 +0,0 @@ -// -// SAMKeychain.m -// SAMKeychain -// -// Created by Sam Soffes on 5/19/10. -// Copyright (c) 2010-2014 Sam Soffes. All rights reserved. -// - -#import "SAMKeychain.h" -#import "SAMKeychainQuery.h" - -NSString *const kSAMKeychainErrorDomain = @"com.samsoffes.samkeychain"; -NSString *const kSAMKeychainAccountKey = @"acct"; -NSString *const kSAMKeychainCreatedAtKey = @"cdat"; -NSString *const kSAMKeychainClassKey = @"labl"; -NSString *const kSAMKeychainDescriptionKey = @"desc"; -NSString *const kSAMKeychainLabelKey = @"labl"; -NSString *const kSAMKeychainLastModifiedKey = @"mdat"; -NSString *const kSAMKeychainWhereKey = @"svce"; - -#if __IPHONE_4_0 && TARGET_OS_IPHONE - static CFTypeRef SAMKeychainAccessibilityType = NULL; -#endif - -@implementation SAMKeychain - -+ (nullable NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account { - return [self passwordForService:serviceName account:account error:nil]; -} - - -+ (nullable NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error { - SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init]; - query.service = serviceName; - query.account = account; - [query fetch:error]; - return query.password; -} - -+ (nullable NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account { - return [self passwordDataForService:serviceName account:account error:nil]; -} - -+ (nullable NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error { - SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init]; - query.service = serviceName; - query.account = account; - [query fetch:error]; - - return query.passwordData; -} - - -+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account { - return [self deletePasswordForService:serviceName account:account error:nil]; -} - - -+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error { - SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init]; - query.service = serviceName; - query.account = account; - return [query deleteItem:error]; -} - - -+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account { - return [self setPassword:password forService:serviceName account:account error:nil]; -} - - -+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error { - SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init]; - query.service = serviceName; - query.account = account; - query.password = password; - return [query save:error]; -} - -+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account { - return [self setPasswordData:password forService:serviceName account:account error:nil]; -} - - -+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error { - SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init]; - query.service = serviceName; - query.account = account; - query.passwordData = password; - return [query save:error]; -} - -+ (nullable NSArray *)allAccounts { - return [self allAccounts:nil]; -} - - -+ (nullable NSArray *)allAccounts:(NSError *__autoreleasing *)error { - return [self accountsForService:nil error:error]; -} - - -+ (nullable NSArray *)accountsForService:(nullable NSString *)serviceName { - return [self accountsForService:serviceName error:nil]; -} - - -+ (nullable NSArray *)accountsForService:(nullable NSString *)serviceName error:(NSError *__autoreleasing *)error { - SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init]; - query.service = serviceName; - return [query fetchAll:error]; -} - - -#if __IPHONE_4_0 && TARGET_OS_IPHONE -+ (CFTypeRef)accessibilityType { - return SAMKeychainAccessibilityType; -} - - -+ (void)setAccessibilityType:(CFTypeRef)accessibilityType { - CFRetain(accessibilityType); - if (SAMKeychainAccessibilityType) { - CFRelease(SAMKeychainAccessibilityType); - } - SAMKeychainAccessibilityType = accessibilityType; -} -#endif - -@end diff --git a/Pods/SAMKeychain/Sources/SAMKeychainQuery.h b/Pods/SAMKeychain/Sources/SAMKeychainQuery.h deleted file mode 100644 index 84658e239..000000000 --- a/Pods/SAMKeychain/Sources/SAMKeychainQuery.h +++ /dev/null @@ -1,147 +0,0 @@ -// -// SAMKeychainQuery.h -// SAMKeychain -// -// Created by Caleb Davenport on 3/19/13. -// Copyright (c) 2013-2014 Sam Soffes. All rights reserved. -// - -#if __has_feature(modules) - @import Foundation; - @import Security; -#else - #import - #import -#endif - -NS_ASSUME_NONNULL_BEGIN - -#if __IPHONE_7_0 || __MAC_10_9 - // Keychain synchronization available at compile time - #define SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE 1 -#endif - -#if __IPHONE_3_0 || __MAC_10_9 - // Keychain access group available at compile time - #define SAMKEYCHAIN_ACCESS_GROUP_AVAILABLE 1 -#endif - -#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE -typedef NS_ENUM(NSUInteger, SAMKeychainQuerySynchronizationMode) { - SAMKeychainQuerySynchronizationModeAny, - SAMKeychainQuerySynchronizationModeNo, - SAMKeychainQuerySynchronizationModeYes -}; -#endif - -/** - Simple interface for querying or modifying keychain items. - */ -@interface SAMKeychainQuery : NSObject - -/** kSecAttrAccount */ -@property (nonatomic, copy, nullable) NSString *account; - -/** kSecAttrService */ -@property (nonatomic, copy, nullable) NSString *service; - -/** kSecAttrLabel */ -@property (nonatomic, copy, nullable) NSString *label; - -#ifdef SAMKEYCHAIN_ACCESS_GROUP_AVAILABLE -/** kSecAttrAccessGroup (only used on iOS) */ -@property (nonatomic, copy, nullable) NSString *accessGroup; -#endif - -#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE -/** kSecAttrSynchronizable */ -@property (nonatomic) SAMKeychainQuerySynchronizationMode synchronizationMode; -#endif - -/** Root storage for password information */ -@property (nonatomic, copy, nullable) NSData *passwordData; - -/** - This property automatically transitions between an object and the value of - `passwordData` using NSKeyedArchiver and NSKeyedUnarchiver. - */ -@property (nonatomic, copy, nullable) id passwordObject; - -/** - Convenience accessor for setting and getting a password string. Passes through - to `passwordData` using UTF-8 string encoding. - */ -@property (nonatomic, copy, nullable) NSString *password; - - -///------------------------ -/// @name Saving & Deleting -///------------------------ - -/** - Save the receiver's attributes as a keychain item. Existing items with the - given account, service, and access group will first be deleted. - - @param error Populated should an error occur. - - @return `YES` if saving was successful, `NO` otherwise. - */ -- (BOOL)save:(NSError **)error; - -/** - Delete keychain items that match the given account, service, and access group. - - @param error Populated should an error occur. - - @return `YES` if saving was successful, `NO` otherwise. - */ -- (BOOL)deleteItem:(NSError **)error; - - -///--------------- -/// @name Fetching -///--------------- - -/** - Fetch all keychain items that match the given account, service, and access - group. The values of `password` and `passwordData` are ignored when fetching. - - @param error Populated should an error occur. - - @return An array of dictionaries that represent all matching keychain items or - `nil` should an error occur. - The order of the items is not determined. - */ -- (nullable NSArray *> *)fetchAll:(NSError **)error; - -/** - Fetch the keychain item that matches the given account, service, and access - group. The `password` and `passwordData` properties will be populated unless - an error occurs. The values of `password` and `passwordData` are ignored when - fetching. - - @param error Populated should an error occur. - - @return `YES` if fetching was successful, `NO` otherwise. - */ -- (BOOL)fetch:(NSError **)error; - - -///----------------------------- -/// @name Synchronization Status -///----------------------------- - -#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE -/** - Returns a boolean indicating if keychain synchronization is available on the device at runtime. The #define - SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE is only for compile time. If you are checking for the presence of synchronization, - you should use this method. - - @return A value indicating if keychain synchronization is available - */ -+ (BOOL)isSynchronizationAvailable; -#endif - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/SAMKeychain/Sources/SAMKeychainQuery.m b/Pods/SAMKeychain/Sources/SAMKeychainQuery.m deleted file mode 100644 index 00ecb80e8..000000000 --- a/Pods/SAMKeychain/Sources/SAMKeychainQuery.m +++ /dev/null @@ -1,316 +0,0 @@ -// -// SAMKeychainQuery.m -// SAMKeychain -// -// Created by Caleb Davenport on 3/19/13. -// Copyright (c) 2013-2014 Sam Soffes. All rights reserved. -// - -#import "SAMKeychainQuery.h" -#import "SAMKeychain.h" - -@implementation SAMKeychainQuery - -@synthesize account = _account; -@synthesize service = _service; -@synthesize label = _label; -@synthesize passwordData = _passwordData; - -#ifdef SAMKEYCHAIN_ACCESS_GROUP_AVAILABLE -@synthesize accessGroup = _accessGroup; -#endif - -#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE -@synthesize synchronizationMode = _synchronizationMode; -#endif - -#pragma mark - Public - -- (BOOL)save:(NSError *__autoreleasing *)error { - OSStatus status = SAMKeychainErrorBadArguments; - if (!self.service || !self.account || !self.passwordData) { - if (error) { - *error = [[self class] errorWithCode:status]; - } - return NO; - } - NSMutableDictionary *query = nil; - NSMutableDictionary * searchQuery = [self query]; - status = SecItemCopyMatching((__bridge CFDictionaryRef)searchQuery, nil); - if (status == errSecSuccess) {//item already exists, update it! - query = [[NSMutableDictionary alloc]init]; - [query setObject:self.passwordData forKey:(__bridge id)kSecValueData]; -#if __IPHONE_4_0 && TARGET_OS_IPHONE - CFTypeRef accessibilityType = [SAMKeychain accessibilityType]; - if (accessibilityType) { - [query setObject:(__bridge id)accessibilityType forKey:(__bridge id)kSecAttrAccessible]; - } -#endif - status = SecItemUpdate((__bridge CFDictionaryRef)(searchQuery), (__bridge CFDictionaryRef)(query)); - }else if(status == errSecItemNotFound){//item not found, create it! - query = [self query]; - if (self.label) { - [query setObject:self.label forKey:(__bridge id)kSecAttrLabel]; - } - [query setObject:self.passwordData forKey:(__bridge id)kSecValueData]; -#if __IPHONE_4_0 && TARGET_OS_IPHONE - CFTypeRef accessibilityType = [SAMKeychain accessibilityType]; - if (accessibilityType) { - [query setObject:(__bridge id)accessibilityType forKey:(__bridge id)kSecAttrAccessible]; - } -#endif - status = SecItemAdd((__bridge CFDictionaryRef)query, NULL); - } - if (status != errSecSuccess && error != NULL) { - *error = [[self class] errorWithCode:status]; - } - return (status == errSecSuccess);} - - -- (BOOL)deleteItem:(NSError *__autoreleasing *)error { - OSStatus status = SAMKeychainErrorBadArguments; - if (!self.service || !self.account) { - if (error) { - *error = [[self class] errorWithCode:status]; - } - return NO; - } - - NSMutableDictionary *query = [self query]; -#if TARGET_OS_IPHONE - status = SecItemDelete((__bridge CFDictionaryRef)query); -#else - // On Mac OS, SecItemDelete will not delete a key created in a different - // app, nor in a different version of the same app. - // - // To replicate the issue, save a password, change to the code and - // rebuild the app, and then attempt to delete that password. - // - // This was true in OS X 10.6 and probably later versions as well. - // - // Work around it by using SecItemCopyMatching and SecKeychainItemDelete. - CFTypeRef result = NULL; - [query setObject:@YES forKey:(__bridge id)kSecReturnRef]; - status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); - if (status == errSecSuccess) { - status = SecKeychainItemDelete((SecKeychainItemRef)result); - CFRelease(result); - } -#endif - - if (status != errSecSuccess && error != NULL) { - *error = [[self class] errorWithCode:status]; - } - - return (status == errSecSuccess); -} - - -- (nullable NSArray *)fetchAll:(NSError *__autoreleasing *)error { - NSMutableDictionary *query = [self query]; - [query setObject:@YES forKey:(__bridge id)kSecReturnAttributes]; - [query setObject:(__bridge id)kSecMatchLimitAll forKey:(__bridge id)kSecMatchLimit]; -#if __IPHONE_4_0 && TARGET_OS_IPHONE - CFTypeRef accessibilityType = [SAMKeychain accessibilityType]; - if (accessibilityType) { - [query setObject:(__bridge id)accessibilityType forKey:(__bridge id)kSecAttrAccessible]; - } -#endif - - CFTypeRef result = NULL; - OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); - if (status != errSecSuccess && error != NULL) { - *error = [[self class] errorWithCode:status]; - return nil; - } - - return (__bridge_transfer NSArray *)result; -} - - -- (BOOL)fetch:(NSError *__autoreleasing *)error { - OSStatus status = SAMKeychainErrorBadArguments; - if (!self.service || !self.account) { - if (error) { - *error = [[self class] errorWithCode:status]; - } - return NO; - } - - CFTypeRef result = NULL; - NSMutableDictionary *query = [self query]; - [query setObject:@YES forKey:(__bridge id)kSecReturnData]; - [query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; - status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); - - if (status != errSecSuccess) { - if (error) { - *error = [[self class] errorWithCode:status]; - } - return NO; - } - - self.passwordData = (__bridge_transfer NSData *)result; - return YES; -} - - -#pragma mark - Accessors - -- (void)setPasswordObject:(id)object { - self.passwordData = [NSKeyedArchiver archivedDataWithRootObject:object]; -} - - -- (id)passwordObject { - if ([self.passwordData length]) { - return [NSKeyedUnarchiver unarchiveObjectWithData:self.passwordData]; - } - return nil; -} - - -- (void)setPassword:(NSString *)password { - self.passwordData = [password dataUsingEncoding:NSUTF8StringEncoding]; -} - - -- (NSString *)password { - if ([self.passwordData length]) { - return [[NSString alloc] initWithData:self.passwordData encoding:NSUTF8StringEncoding]; - } - return nil; -} - - -#pragma mark - Synchronization Status - -#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE -+ (BOOL)isSynchronizationAvailable { -#if TARGET_OS_IPHONE - // Apple suggested way to check for 7.0 at runtime - // https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/SupportingEarlieriOS.html - return floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1; -#else - return floor(NSFoundationVersionNumber) > NSFoundationVersionNumber10_8_4; -#endif -} -#endif - - -#pragma mark - Private - -- (NSMutableDictionary *)query { - NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:3]; - [dictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; - - if (self.service) { - [dictionary setObject:self.service forKey:(__bridge id)kSecAttrService]; - } - - if (self.account) { - [dictionary setObject:self.account forKey:(__bridge id)kSecAttrAccount]; - } - -#ifdef SAMKEYCHAIN_ACCESS_GROUP_AVAILABLE -#if !TARGET_IPHONE_SIMULATOR - if (self.accessGroup) { - [dictionary setObject:self.accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; - } -#endif -#endif - -#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE - if ([[self class] isSynchronizationAvailable]) { - id value; - - switch (self.synchronizationMode) { - case SAMKeychainQuerySynchronizationModeNo: { - value = @NO; - break; - } - case SAMKeychainQuerySynchronizationModeYes: { - value = @YES; - break; - } - case SAMKeychainQuerySynchronizationModeAny: { - value = (__bridge id)(kSecAttrSynchronizableAny); - break; - } - } - - [dictionary setObject:value forKey:(__bridge id)(kSecAttrSynchronizable)]; - } -#endif - - return dictionary; -} - - -+ (NSError *)errorWithCode:(OSStatus) code { - static dispatch_once_t onceToken; - static NSBundle *resourcesBundle = nil; - dispatch_once(&onceToken, ^{ - NSURL *url = [[NSBundle bundleForClass:[SAMKeychainQuery class]] URLForResource:@"SAMKeychain" withExtension:@"bundle"]; - resourcesBundle = [NSBundle bundleWithURL:url]; - }); - - NSString *message = nil; - switch (code) { - case errSecSuccess: return nil; - case SAMKeychainErrorBadArguments: message = NSLocalizedStringFromTableInBundle(@"SAMKeychainErrorBadArguments", @"SAMKeychain", resourcesBundle, nil); break; - -#if TARGET_OS_IPHONE - case errSecUnimplemented: { - message = NSLocalizedStringFromTableInBundle(@"errSecUnimplemented", @"SAMKeychain", resourcesBundle, nil); - break; - } - case errSecParam: { - message = NSLocalizedStringFromTableInBundle(@"errSecParam", @"SAMKeychain", resourcesBundle, nil); - break; - } - case errSecAllocate: { - message = NSLocalizedStringFromTableInBundle(@"errSecAllocate", @"SAMKeychain", resourcesBundle, nil); - break; - } - case errSecNotAvailable: { - message = NSLocalizedStringFromTableInBundle(@"errSecNotAvailable", @"SAMKeychain", resourcesBundle, nil); - break; - } - case errSecDuplicateItem: { - message = NSLocalizedStringFromTableInBundle(@"errSecDuplicateItem", @"SAMKeychain", resourcesBundle, nil); - break; - } - case errSecItemNotFound: { - message = NSLocalizedStringFromTableInBundle(@"errSecItemNotFound", @"SAMKeychain", resourcesBundle, nil); - break; - } - case errSecInteractionNotAllowed: { - message = NSLocalizedStringFromTableInBundle(@"errSecInteractionNotAllowed", @"SAMKeychain", resourcesBundle, nil); - break; - } - case errSecDecode: { - message = NSLocalizedStringFromTableInBundle(@"errSecDecode", @"SAMKeychain", resourcesBundle, nil); - break; - } - case errSecAuthFailed: { - message = NSLocalizedStringFromTableInBundle(@"errSecAuthFailed", @"SAMKeychain", resourcesBundle, nil); - break; - } - default: { - message = NSLocalizedStringFromTableInBundle(@"errSecDefault", @"SAMKeychain", resourcesBundle, nil); - } -#else - default: - message = (__bridge_transfer NSString *)SecCopyErrorMessageString(code, NULL); -#endif - } - - NSDictionary *userInfo = nil; - if (message) { - userInfo = @{ NSLocalizedDescriptionKey : message }; - } - return [NSError errorWithDomain:kSAMKeychainErrorDomain code:code userInfo:userInfo]; -} - -@end diff --git a/Pods/SAMKeychain/Support/SAMKeychain.bundle/en.lproj/SAMKeychain.strings b/Pods/SAMKeychain/Support/SAMKeychain.bundle/en.lproj/SAMKeychain.strings deleted file mode 100644 index 5c0f174ae..000000000 Binary files a/Pods/SAMKeychain/Support/SAMKeychain.bundle/en.lproj/SAMKeychain.strings and /dev/null differ diff --git a/Pods/SDWebImage/LICENSE b/Pods/SDWebImage/LICENSE deleted file mode 100644 index 92a252a9f..000000000 --- a/Pods/SDWebImage/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2009-2017 Olivier Poitrey rs@dailymotion.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/Pods/SDWebImage/README.md b/Pods/SDWebImage/README.md deleted file mode 100644 index 389344ee7..000000000 --- a/Pods/SDWebImage/README.md +++ /dev/null @@ -1,178 +0,0 @@ -

- -

- - -[![Build Status](http://img.shields.io/travis/rs/SDWebImage/master.svg?style=flat)](https://travis-ci.org/rs/SDWebImage) -[![Pod Version](http://img.shields.io/cocoapods/v/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) -[![Pod Platform](http://img.shields.io/cocoapods/p/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) -[![Pod License](http://img.shields.io/cocoapods/l/SDWebImage.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0.html) -[![Dependency Status](https://www.versioneye.com/objective-c/sdwebimage/badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage) -[![Reference Status](https://www.versioneye.com/objective-c/sdwebimage/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/references) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/rs/SDWebImage) -[![codecov](https://codecov.io/gh/rs/SDWebImage/branch/master/graph/badge.svg)](https://codecov.io/gh/rs/SDWebImage) - -This library provides an async image downloader with cache support. For convenience, we added categories for UI elements like `UIImageView`, `UIButton`, `MKAnnotationView`. - -## Features - -- [x] Categories for `UIImageView`, `UIButton`, `MKAnnotationView` adding web image and cache management -- [x] An asynchronous image downloader -- [x] An asynchronous memory + disk image caching with automatic cache expiration handling -- [x] A background image decompression -- [x] A guarantee that the same URL won't be downloaded several times -- [x] A guarantee that bogus URLs won't be retried again and again -- [x] A guarantee that main thread will never be blocked -- [x] Performances! -- [x] Use GCD and ARC - -## Supported Image Formats - -- Image formats supported by UIImage (JPEG, PNG, ...), including GIF -- WebP format, including animated WebP (use the `WebP` subspec) - -## Requirements - -- iOS 7.0 or later -- tvOS 9.0 or later -- watchOS 2.0 or later -- OS X 10.8 or later -- Xcode 7.3 or later - -#### Backwards compatibility - -- For iOS 5 and 6, use [any 3.x version up to 3.7.6](https://github.com/rs/SDWebImage/tree/3.7.6) -- For iOS < 5.0, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). - -## Getting Started - -- Read this Readme doc -- Read the [How to use section](https://github.com/rs/SDWebImage#how-to-use) -- Read the [Documentation @ CocoaDocs](http://cocoadocs.org/docsets/SDWebImage/) -- Try the example by downloading the project from Github or even easier using CocoaPods try `pod try SDWebImage` -- Read the [Installation Guide](https://github.com/rs/SDWebImage/wiki/Installation-Guide) -- Read the [SDWebImage 4.0 Migration Guide](Docs/SDWebImage-4.0-Migration-guide.md) to get an idea of the changes from 3.x to 4.x -- Read the [Common Problems](https://github.com/rs/SDWebImage/wiki/Common-Problems) to find the solution for common problems -- Go to the [Wiki Page](https://github.com/rs/SDWebImage/wiki) for more information such as [Advanced Usage](https://github.com/rs/SDWebImage/wiki/Advanced-Usage) - -## Who Uses It -- Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. - -## Communication - -- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/sdwebimage). (Tag 'sdwebimage') -- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/sdwebimage). -- If you **found a bug**, open an issue. -- If you **have a feature request**, open an issue. -- If you **want to contribute**, submit a pull request. - -## How To Use - -* Objective-C - -```objective-c -#import -... -[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] - placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; -``` - -* Swift - -```swift -import SDWebImage - -imageView.sd_setImage(with: URL(string: "http://www.domain.com/path/to/image.jpg"), placeholderImage: UIImage(named: "placeholder.png")) -``` - -- For details about how to use the library and clear examples, see [The detailed How to use](Docs/HowToUse.md) - -## Animated Images (GIF) support - -- Starting with the 4.0 version, we rely on [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) to take care of our animated images. -- If you use cocoapods, add `pod 'SDWebImage/GIF'` to your podfile. -- To use it, simply make sure you use `FLAnimatedImageView` instead of `UIImageView`. -- **Note**: there is a backwards compatible feature, so if you are still trying to load a GIF into a `UIImageView`, it will only show the 1st frame as a static image by default. However, you can enable the full GIF support by using the built-in GIF coder. See [GIF coder](https://github.com/rs/SDWebImage/wiki/Advanced-Usage#gif-coder) -- **Important**: FLAnimatedImage only works on the iOS platform. For OS X, use `NSImageView` with `animates` set to `YES` to show the entire animated images and `NO` to only show the 1st frame. For all the other platforms (tvOS, watchOS) we will fallback to the backwards compatibility feature described above - -## Installation - -There are three ways to use SDWebImage in your project: -- using CocoaPods -- using Carthage -- by cloning the project into your repository - -### Installation with CocoaPods - -[CocoaPods](http://cocoapods.org/) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries in your projects. See the [Get Started](http://cocoapods.org/#get_started) section for more details. - -#### Podfile -``` -platform :ios, '7.0' -pod 'SDWebImage', '~> 4.0' -``` - -If you are using Swift, be sure to add `use_frameworks!` and set your target to iOS 8+: -``` -platform :ios, '8.0' -use_frameworks! -``` - -#### Subspecs - -There are 4 subspecs available now: `Core`, `MapKit`, `GIF` and `WebP` (this means you can install only some of the SDWebImage modules. By default, you get just `Core`, so if you need `WebP`, you need to specify it). - -Podfile example: -``` -pod 'SDWebImage/WebP' -``` - -### Installation with Carthage (iOS 8+) - -[Carthage](https://github.com/Carthage/Carthage) is a lightweight dependency manager for Swift and Objective-C. It leverages CocoaTouch modules and is less invasive than CocoaPods. - -To install with carthage, follow the instruction on [Carthage](https://github.com/Carthage/Carthage) - -#### Cartfile -``` -github "rs/SDWebImage" -``` - -### Installation by cloning the repository -- see [Manual install](Docs/ManualInstallation.md) - -### Import headers in your source files - -In the source files where you need to use the library, import the header file: - -```objective-c -#import -``` - -### Build Project - -At this point your workspace should build without error. If you are having problem, post to the Issue and the -community can help you solve it. - -## Author -- [Olivier Poitrey](https://github.com/rs) - -## Collaborators -- [Konstantinos K.](https://github.com/mythodeia) -- [Bogdan Poplauschi](https://github.com/bpoplauschi) -- [Chester Liu](https://github.com/skyline75489) -- [DreamPiggy](https://github.com/dreampiggy) - -## Licenses - -All source code is licensed under the [MIT License](https://raw.github.com/rs/SDWebImage/master/LICENSE). - -## Architecture - -

- -

- -

- -

diff --git a/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h b/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h deleted file mode 100644 index 57f7115e7..000000000 --- a/Pods/SDWebImage/SDWebImage/NSButton+WebCache.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -#if SD_MAC - -#import "SDWebImageManager.h" - -@interface NSButton (WebCache) - -#pragma mark - Image - -/** - * Get the current image URL. - */ -- (nullable NSURL *)sd_currentImageURL; - -/** - * Set the button `image` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT; - -/** - * Set the button `image` with an `url` and a placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @see sd_setImageWithURL:placeholderImage:options: - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; - -/** - * Set the button `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; - -/** - * Set the button `image` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the button `image` with an `url`, placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; - -/** - * Set the button `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the button `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param progressBlock A block called while image is downloading - * @note the progress block is executed on a background queue - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock; - -#pragma mark - Alternate Image - -/** - * Get the current alternateImage URL. - */ -- (nullable NSURL *)sd_currentAlternateImageURL; - -/** - * Set the button `alternateImage` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the alternateImage. - */ -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT; - -/** - * Set the button `alternateImage` with an `url` and a placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the alternateImage. - * @param placeholder The alternateImage to be set initially, until the alternateImage request finishes. - * @see sd_setAlternateImageWithURL:placeholderImage:options: - */ -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; - -/** - * Set the button `alternateImage` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the alternateImage. - * @param placeholder The alternateImage to be set initially, until the alternateImage request finishes. - * @param options The options to use when downloading the alternateImage. @see SDWebImageOptions for the possible values. - */ -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; - -/** - * Set the button `alternateImage` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the alternateImage. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the alternateImage parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the alternateImage was retrieved from the local cache or from the network. - * The fourth parameter is the original alternateImage url. - */ -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the button `alternateImage` with an `url`, placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the alternateImage. - * @param placeholder The alternateImage to be set initially, until the alternateImage request finishes. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the alternateImage parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the alternateImage was retrieved from the local cache or from the network. - * The fourth parameter is the original alternateImage url. - */ -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; - -/** - * Set the button `alternateImage` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the alternateImage. - * @param placeholder The alternateImage to be set initially, until the alternateImage request finishes. - * @param options The options to use when downloading the alternateImage. @see SDWebImageOptions for the possible values. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the alternateImage parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the alternateImage was retrieved from the local cache or from the network. - * The fourth parameter is the original alternateImage url. - */ -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the button `alternateImage` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the alternateImage. - * @param placeholder The alternateImage to be set initially, until the alternateImage request finishes. - * @param options The options to use when downloading the alternateImage. @see SDWebImageOptions for the possible values. - * @param progressBlock A block called while alternateImage is downloading - * @note the progress block is executed on a background queue - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the alternateImage parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the alternateImage was retrieved from the local cache or from the network. - * The fourth parameter is the original alternateImage url. - */ -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock; - -#pragma mark - Cancel - -/** - * Cancel the current image download - */ -- (void)sd_cancelCurrentImageLoad; - -/** - * Cancel the current alternateImage download - */ -- (void)sd_cancelCurrentAlternateImageLoad; - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m b/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m deleted file mode 100644 index 3ca080f2f..000000000 --- a/Pods/SDWebImage/SDWebImage/NSButton+WebCache.m +++ /dev/null @@ -1,147 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "NSButton+WebCache.h" - -#if SD_MAC - -#import "objc/runtime.h" -#import "UIView+WebCacheOperation.h" -#import "UIView+WebCache.h" - -static inline NSString * imageOperationKey() { - return @"NSButtonImageOperation"; -} - -static inline NSString * alternateImageOperationKey() { - return @"NSButtonAlternateImageOperation"; -} - -@implementation NSButton (WebCache) - -#pragma mark - Image - -- (void)sd_setImageWithURL:(nullable NSURL *)url { - [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock { - self.sd_currentImageURL = url; - - __weak typeof(self)weakSelf = self; - [self sd_internalSetImageWithURL:url - placeholderImage:placeholder - options:options - operationKey:imageOperationKey() - setImageBlock:^(NSImage * _Nullable image, NSData * _Nullable imageData) { - weakSelf.image = image; - } - progress:progressBlock - completed:completedBlock]; -} - -#pragma mark - Alternate Image - -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url { - [self sd_setAlternateImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; -} - -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder { - [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; -} - -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; -} - -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setAlternateImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; -} - -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; -} - -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; -} - -- (void)sd_setAlternateImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock { - self.sd_currentAlternateImageURL = url; - - __weak typeof(self)weakSelf = self; - [self sd_internalSetImageWithURL:url - placeholderImage:placeholder - options:options - operationKey:alternateImageOperationKey() - setImageBlock:^(NSImage * _Nullable image, NSData * _Nullable imageData) { - weakSelf.alternateImage = image; - } - progress:progressBlock - completed:completedBlock]; -} - -#pragma mark - Cancel - -- (void)sd_cancelCurrentImageLoad { - [self sd_cancelImageLoadOperationWithKey:imageOperationKey()]; -} - -- (void)sd_cancelCurrentAlternateImageLoad { - [self sd_cancelImageLoadOperationWithKey:alternateImageOperationKey()]; -} - -#pragma mar - Private - -- (NSURL *)sd_currentImageURL { - return objc_getAssociatedObject(self, @selector(sd_currentImageURL)); -} - -- (void)setSd_currentImageURL:(NSURL *)sd_currentImageURL { - objc_setAssociatedObject(self, @selector(sd_currentImageURL), sd_currentImageURL, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (NSURL *)sd_currentAlternateImageURL { - return objc_getAssociatedObject(self, @selector(sd_currentAlternateImageURL)); -} - -- (void)setSd_currentAlternateImageURL:(NSURL *)sd_currentAlternateImageURL { - objc_setAssociatedObject(self, @selector(sd_currentAlternateImageURL), sd_currentAlternateImageURL, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h b/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h deleted file mode 100644 index 0ca226d8a..000000000 --- a/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * (c) Fabrice Aneche - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageCompat.h" - -typedef NS_ENUM(NSInteger, SDImageFormat) { - SDImageFormatUndefined = -1, - SDImageFormatJPEG = 0, - SDImageFormatPNG, - SDImageFormatGIF, - SDImageFormatTIFF, - SDImageFormatWebP, - SDImageFormatHEIC -}; - -@interface NSData (ImageContentType) - -/** - * Return image format - * - * @param data the input image data - * - * @return the image format as `SDImageFormat` (enum) - */ -+ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data; - -/** - Convert SDImageFormat to UTType - - @param format Format as SDImageFormat - @return The UTType as CFStringRef - */ -+ (nonnull CFStringRef)sd_UTTypeFromSDImageFormat:(SDImageFormat)format; - -@end diff --git a/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m b/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m deleted file mode 100644 index 6a590611d..000000000 --- a/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m +++ /dev/null @@ -1,98 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * (c) Fabrice Aneche - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "NSData+ImageContentType.h" -#if SD_MAC -#import -#else -#import -#endif - -// Currently Image/IO does not support WebP -#define kSDUTTypeWebP ((__bridge CFStringRef)@"public.webp") -// AVFileTypeHEIC is defined in AVFoundation via iOS 11, we use this without import AVFoundation -#define kSDUTTypeHEIC ((__bridge CFStringRef)@"public.heic") - -@implementation NSData (ImageContentType) - -+ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data { - if (!data) { - return SDImageFormatUndefined; - } - - // File signatures table: http://www.garykessler.net/library/file_sigs.html - uint8_t c; - [data getBytes:&c length:1]; - switch (c) { - case 0xFF: - return SDImageFormatJPEG; - case 0x89: - return SDImageFormatPNG; - case 0x47: - return SDImageFormatGIF; - case 0x49: - case 0x4D: - return SDImageFormatTIFF; - case 0x52: { - if (data.length >= 12) { - //RIFF....WEBP - NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; - if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { - return SDImageFormatWebP; - } - } - break; - } - case 0x00: { - if (data.length >= 12) { - //....ftypheic ....ftypheix ....ftyphevc ....ftyphevx - NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(4, 8)] encoding:NSASCIIStringEncoding]; - if ([testString isEqualToString:@"ftypheic"] - || [testString isEqualToString:@"ftypheix"] - || [testString isEqualToString:@"ftyphevc"] - || [testString isEqualToString:@"ftyphevx"]) { - return SDImageFormatHEIC; - } - } - break; - } - } - return SDImageFormatUndefined; -} - -+ (nonnull CFStringRef)sd_UTTypeFromSDImageFormat:(SDImageFormat)format { - CFStringRef UTType; - switch (format) { - case SDImageFormatJPEG: - UTType = kUTTypeJPEG; - break; - case SDImageFormatPNG: - UTType = kUTTypePNG; - break; - case SDImageFormatGIF: - UTType = kUTTypeGIF; - break; - case SDImageFormatTIFF: - UTType = kUTTypeTIFF; - break; - case SDImageFormatWebP: - UTType = kSDUTTypeWebP; - break; - case SDImageFormatHEIC: - UTType = kSDUTTypeHEIC; - break; - default: - // default is kUTTypePNG - UTType = kUTTypePNG; - break; - } - return UTType; -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h b/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h deleted file mode 100644 index 7515d4074..000000000 --- a/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -#if SD_MAC - -#import - -@interface NSImage (WebCache) - -- (CGImageRef)CGImage; -- (NSArray *)images; -- (BOOL)isGIF; - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m b/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m deleted file mode 100644 index 140ed6ce7..000000000 --- a/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "NSImage+WebCache.h" - -#if SD_MAC - -@implementation NSImage (WebCache) - -- (CGImageRef)CGImage { - NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height); - CGImageRef cgImage = [self CGImageForProposedRect:&imageRect context:NULL hints:nil]; - return cgImage; -} - -- (NSArray *)images { - return nil; -} - -- (BOOL)isGIF { - BOOL isGIF = NO; - for (NSImageRep *rep in self.representations) { - if ([rep isKindOfClass:[NSBitmapImageRep class]]) { - NSBitmapImageRep *bitmapRep = (NSBitmapImageRep *)rep; - NSUInteger frameCount = [[bitmapRep valueForProperty:NSImageFrameCount] unsignedIntegerValue]; - isGIF = frameCount > 1 ? YES : NO; - break; - } - } - return isGIF; -} - -@end - -#endif - diff --git a/Pods/SDWebImage/SDWebImage/SDImageCache.h b/Pods/SDWebImage/SDWebImage/SDImageCache.h deleted file mode 100644 index 216151d7b..000000000 --- a/Pods/SDWebImage/SDWebImage/SDImageCache.h +++ /dev/null @@ -1,295 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageCompat.h" -#import "SDImageCacheConfig.h" - -typedef NS_ENUM(NSInteger, SDImageCacheType) { - /** - * The image wasn't available the SDWebImage caches, but was downloaded from the web. - */ - SDImageCacheTypeNone, - /** - * The image was obtained from the disk cache. - */ - SDImageCacheTypeDisk, - /** - * The image was obtained from the memory cache. - */ - SDImageCacheTypeMemory -}; - -typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) { - /** - * By default, we do not query disk data when the image is cached in memory. This mask can force to query disk data at the same time. - */ - SDImageCacheQueryDataWhenInMemory = 1 << 0, - /** - * By default, we query the memory cache synchronously, disk cache asynchronously. This mask can force to query disk cache synchronously. - */ - SDImageCacheQueryDiskSync = 1 << 1 -}; - -typedef void(^SDCacheQueryCompletedBlock)(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType); - -typedef void(^SDWebImageCheckCacheCompletionBlock)(BOOL isInCache); - -typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger totalSize); - - -/** - * SDImageCache maintains a memory cache and an optional disk cache. Disk cache write operations are performed - * asynchronous so it doesn’t add unnecessary latency to the UI. - */ -@interface SDImageCache : NSObject - -#pragma mark - Properties - -/** - * Cache Config object - storing all kind of settings - */ -@property (nonatomic, nonnull, readonly) SDImageCacheConfig *config; - -/** - * The maximum "total cost" of the in-memory image cache. The cost function is the number of pixels held in memory. - */ -@property (assign, nonatomic) NSUInteger maxMemoryCost; - -/** - * The maximum number of objects the cache should hold. - */ -@property (assign, nonatomic) NSUInteger maxMemoryCountLimit; - -#pragma mark - Singleton and initialization - -/** - * Returns global shared cache instance - * - * @return SDImageCache global instance - */ -+ (nonnull instancetype)sharedImageCache; - -/** - * Init a new cache store with a specific namespace - * - * @param ns The namespace to use for this cache store - */ -- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns; - -/** - * Init a new cache store with a specific namespace and directory - * - * @param ns The namespace to use for this cache store - * @param directory Directory to cache disk images in - */ -- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns - diskCacheDirectory:(nonnull NSString *)directory NS_DESIGNATED_INITIALIZER; - -#pragma mark - Cache paths - -- (nullable NSString *)makeDiskCachePath:(nonnull NSString*)fullNamespace; - -/** - * Add a read-only cache path to search for images pre-cached by SDImageCache - * Useful if you want to bundle pre-loaded images with your app - * - * @param path The path to use for this read-only cache path - */ -- (void)addReadOnlyCachePath:(nonnull NSString *)path; - -#pragma mark - Store Ops - -/** - * Asynchronously store an image into memory and disk cache at the given key. - * - * @param image The image to store - * @param key The unique image cache key, usually it's image absolute URL - * @param completionBlock A block executed after the operation is finished - */ -- (void)storeImage:(nullable UIImage *)image - forKey:(nullable NSString *)key - completion:(nullable SDWebImageNoParamsBlock)completionBlock; - -/** - * Asynchronously store an image into memory and disk cache at the given key. - * - * @param image The image to store - * @param key The unique image cache key, usually it's image absolute URL - * @param toDisk Store the image to disk cache if YES - * @param completionBlock A block executed after the operation is finished - */ -- (void)storeImage:(nullable UIImage *)image - forKey:(nullable NSString *)key - toDisk:(BOOL)toDisk - completion:(nullable SDWebImageNoParamsBlock)completionBlock; - -/** - * Asynchronously store an image into memory and disk cache at the given key. - * - * @param image The image to store - * @param imageData The image data as returned by the server, this representation will be used for disk storage - * instead of converting the given image object into a storable/compressed image format in order - * to save quality and CPU - * @param key The unique image cache key, usually it's image absolute URL - * @param toDisk Store the image to disk cache if YES - * @param completionBlock A block executed after the operation is finished - */ -- (void)storeImage:(nullable UIImage *)image - imageData:(nullable NSData *)imageData - forKey:(nullable NSString *)key - toDisk:(BOOL)toDisk - completion:(nullable SDWebImageNoParamsBlock)completionBlock; - -/** - * Synchronously store image NSData into disk cache at the given key. - * - * @warning This method is synchronous, make sure to call it from the ioQueue - * - * @param imageData The image data to store - * @param key The unique image cache key, usually it's image absolute URL - */ -- (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key; - -#pragma mark - Query and Retrieve Ops - -/** - * Async check if image exists in disk cache already (does not load the image) - * - * @param key the key describing the url - * @param completionBlock the block to be executed when the check is done. - * @note the completion block will be always executed on the main queue - */ -- (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; - -/** - * Sync check if image data exists in disk cache already (does not load the image) - * - * @param key the key describing the url - */ -- (BOOL)diskImageDataExistsWithKey:(nullable NSString *)key; - -/** - * Operation that queries the cache asynchronously and call the completion when done. - * - * @param key The unique key used to store the wanted image - * @param doneBlock The completion block. Will not get called if the operation is cancelled - * - * @return a NSOperation instance containing the cache op - */ -- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key done:(nullable SDCacheQueryCompletedBlock)doneBlock; - -/** - * Operation that queries the cache asynchronously and call the completion when done. - * - * @param key The unique key used to store the wanted image - * @param options A mask to specify options to use for this cache query - * @param doneBlock The completion block. Will not get called if the operation is cancelled - * - * @return a NSOperation instance containing the cache op - */ -- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options done:(nullable SDCacheQueryCompletedBlock)doneBlock; - -/** - * Query the memory cache synchronously. - * - * @param key The unique key used to store the image - */ -- (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key; - -/** - * Query the disk cache synchronously. - * - * @param key The unique key used to store the image - */ -- (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key; - -/** - * Query the cache (memory and or disk) synchronously after checking the memory cache. - * - * @param key The unique key used to store the image - */ -- (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key; - -#pragma mark - Remove Ops - -/** - * Remove the image from memory and disk cache asynchronously - * - * @param key The unique image cache key - * @param completion A block that should be executed after the image has been removed (optional) - */ -- (void)removeImageForKey:(nullable NSString *)key withCompletion:(nullable SDWebImageNoParamsBlock)completion; - -/** - * Remove the image from memory and optionally disk cache asynchronously - * - * @param key The unique image cache key - * @param fromDisk Also remove cache entry from disk if YES - * @param completion A block that should be executed after the image has been removed (optional) - */ -- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion; - -#pragma mark - Cache clean Ops - -/** - * Clear all memory cached images - */ -- (void)clearMemory; - -/** - * Async clear all disk cached images. Non-blocking method - returns immediately. - * @param completion A block that should be executed after cache expiration completes (optional) - */ -- (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion; - -/** - * Async remove all expired cached image from disk. Non-blocking method - returns immediately. - * @param completionBlock A block that should be executed after cache expiration completes (optional) - */ -- (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock; - -#pragma mark - Cache Info - -/** - * Get the size used by the disk cache - */ -- (NSUInteger)getSize; - -/** - * Get the number of images in the disk cache - */ -- (NSUInteger)getDiskCount; - -/** - * Asynchronously calculate the disk cache's size. - */ -- (void)calculateSizeWithCompletionBlock:(nullable SDWebImageCalculateSizeBlock)completionBlock; - -#pragma mark - Cache Paths - -/** - * Get the cache path for a certain key (needs the cache path root folder) - * - * @param key the key (can be obtained from url using cacheKeyForURL) - * @param path the cache path root folder - * - * @return the cache path - */ -- (nullable NSString *)cachePathForKey:(nullable NSString *)key inPath:(nonnull NSString *)path; - -/** - * Get the default cache path for a certain key - * - * @param key the key (can be obtained from url using cacheKeyForURL) - * - * @return the default cache path - */ -- (nullable NSString *)defaultCachePathForKey:(nullable NSString *)key; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDImageCache.m b/Pods/SDWebImage/SDWebImage/SDImageCache.m deleted file mode 100644 index 54bc006dd..000000000 --- a/Pods/SDWebImage/SDWebImage/SDImageCache.m +++ /dev/null @@ -1,656 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDImageCache.h" -#import -#import "NSImage+WebCache.h" -#import "SDWebImageCodersManager.h" - -FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { -#if SD_MAC - return image.size.height * image.size.width; -#elif SD_UIKIT || SD_WATCH - return image.size.height * image.size.width * image.scale * image.scale; -#endif -} - -@interface SDImageCache () - -#pragma mark - Properties -@property (strong, nonatomic, nonnull) NSCache *memCache; -@property (strong, nonatomic, nonnull) NSString *diskCachePath; -@property (strong, nonatomic, nullable) NSMutableArray *customPaths; -@property (strong, nonatomic, nullable) dispatch_queue_t ioQueue; - -@end - - -@implementation SDImageCache { - NSFileManager *_fileManager; -} - -#pragma mark - Singleton, init, dealloc - -+ (nonnull instancetype)sharedImageCache { - static dispatch_once_t once; - static id instance; - dispatch_once(&once, ^{ - instance = [self new]; - }); - return instance; -} - -- (instancetype)init { - return [self initWithNamespace:@"default"]; -} - -- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns { - NSString *path = [self makeDiskCachePath:ns]; - return [self initWithNamespace:ns diskCacheDirectory:path]; -} - -- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns - diskCacheDirectory:(nonnull NSString *)directory { - if ((self = [super init])) { - NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns]; - - // Create IO serial queue - _ioQueue = dispatch_queue_create("com.hackemist.SDWebImageCache", DISPATCH_QUEUE_SERIAL); - - _config = [[SDImageCacheConfig alloc] init]; - - // Init the memory cache - _memCache = [[NSCache alloc] init]; - _memCache.name = fullNamespace; - - // Init the disk cache - if (directory != nil) { - _diskCachePath = [directory stringByAppendingPathComponent:fullNamespace]; - } else { - NSString *path = [self makeDiskCachePath:ns]; - _diskCachePath = path; - } - - dispatch_sync(_ioQueue, ^{ - _fileManager = [NSFileManager new]; - }); - -#if SD_UIKIT - // Subscribe to app events - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(clearMemory) - name:UIApplicationDidReceiveMemoryWarningNotification - object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(deleteOldFiles) - name:UIApplicationWillTerminateNotification - object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(backgroundDeleteOldFiles) - name:UIApplicationDidEnterBackgroundNotification - object:nil]; -#endif - } - - return self; -} - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - Cache paths - -- (void)addReadOnlyCachePath:(nonnull NSString *)path { - if (!self.customPaths) { - self.customPaths = [NSMutableArray new]; - } - - if (![self.customPaths containsObject:path]) { - [self.customPaths addObject:path]; - } -} - -- (nullable NSString *)cachePathForKey:(nullable NSString *)key inPath:(nonnull NSString *)path { - NSString *filename = [self cachedFileNameForKey:key]; - return [path stringByAppendingPathComponent:filename]; -} - -- (nullable NSString *)defaultCachePathForKey:(nullable NSString *)key { - return [self cachePathForKey:key inPath:self.diskCachePath]; -} - -- (nullable NSString *)cachedFileNameForKey:(nullable NSString *)key { - const char *str = key.UTF8String; - if (str == NULL) { - str = ""; - } - unsigned char r[CC_MD5_DIGEST_LENGTH]; - CC_MD5(str, (CC_LONG)strlen(str), r); - NSURL *keyURL = [NSURL URLWithString:key]; - NSString *ext = keyURL ? keyURL.pathExtension : key.pathExtension; - NSString *filename = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%@", - r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], - r[11], r[12], r[13], r[14], r[15], ext.length == 0 ? @"" : [NSString stringWithFormat:@".%@", ext]]; - return filename; -} - -- (nullable NSString *)makeDiskCachePath:(nonnull NSString*)fullNamespace { - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); - return [paths[0] stringByAppendingPathComponent:fullNamespace]; -} - -#pragma mark - Store Ops - -- (void)storeImage:(nullable UIImage *)image - forKey:(nullable NSString *)key - completion:(nullable SDWebImageNoParamsBlock)completionBlock { - [self storeImage:image imageData:nil forKey:key toDisk:YES completion:completionBlock]; -} - -- (void)storeImage:(nullable UIImage *)image - forKey:(nullable NSString *)key - toDisk:(BOOL)toDisk - completion:(nullable SDWebImageNoParamsBlock)completionBlock { - [self storeImage:image imageData:nil forKey:key toDisk:toDisk completion:completionBlock]; -} - -- (void)storeImage:(nullable UIImage *)image - imageData:(nullable NSData *)imageData - forKey:(nullable NSString *)key - toDisk:(BOOL)toDisk - completion:(nullable SDWebImageNoParamsBlock)completionBlock { - if (!image || !key) { - if (completionBlock) { - completionBlock(); - } - return; - } - // if memory cache is enabled - if (self.config.shouldCacheImagesInMemory) { - NSUInteger cost = SDCacheCostForImage(image); - [self.memCache setObject:image forKey:key cost:cost]; - } - - if (toDisk) { - dispatch_async(self.ioQueue, ^{ - @autoreleasepool { - NSData *data = imageData; - if (!data && image) { - // If we do not have any data to detect image format, check whether it contains alpha channel to use PNG or JPEG format - SDImageFormat format; - if (SDCGImageRefContainsAlpha(image.CGImage)) { - format = SDImageFormatPNG; - } else { - format = SDImageFormatJPEG; - } - data = [[SDWebImageCodersManager sharedInstance] encodedDataWithImage:image format:format]; - } - [self _storeImageDataToDisk:data forKey:key]; - } - - if (completionBlock) { - dispatch_async(dispatch_get_main_queue(), ^{ - completionBlock(); - }); - } - }); - } else { - if (completionBlock) { - completionBlock(); - } - } -} - -- (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key { - if (!imageData || !key) { - return; - } - dispatch_sync(self.ioQueue, ^{ - [self _storeImageDataToDisk:imageData forKey:key]; - }); -} - -// Make sure to call form io queue by caller -- (void)_storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key { - if (!imageData || !key) { - return; - } - - if (![_fileManager fileExistsAtPath:_diskCachePath]) { - [_fileManager createDirectoryAtPath:_diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; - } - - // get cache Path for image key - NSString *cachePathForKey = [self defaultCachePathForKey:key]; - // transform to NSUrl - NSURL *fileURL = [NSURL fileURLWithPath:cachePathForKey]; - - [imageData writeToURL:fileURL options:self.config.diskCacheWritingOptions error:nil]; - - // disable iCloud backup - if (self.config.shouldDisableiCloud) { - [fileURL setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil]; - } -} - -#pragma mark - Query and Retrieve Ops - -- (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { - dispatch_async(self.ioQueue, ^{ - BOOL exists = [self _diskImageDataExistsWithKey:key]; - if (completionBlock) { - dispatch_async(dispatch_get_main_queue(), ^{ - completionBlock(exists); - }); - } - }); -} - -- (BOOL)diskImageDataExistsWithKey:(nullable NSString *)key { - if (!key) { - return NO; - } - __block BOOL exists = NO; - dispatch_sync(self.ioQueue, ^{ - exists = [self _diskImageDataExistsWithKey:key]; - }); - - return exists; -} - -// Make sure to call form io queue by caller -- (BOOL)_diskImageDataExistsWithKey:(nullable NSString *)key { - if (!key) { - return NO; - } - BOOL exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key]]; - - // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name - // checking the key with and without the extension - if (!exists) { - exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key].stringByDeletingPathExtension]; - } - - return exists; -} - -- (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key { - return [self.memCache objectForKey:key]; -} - -- (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key { - UIImage *diskImage = [self diskImageForKey:key]; - if (diskImage && self.config.shouldCacheImagesInMemory) { - NSUInteger cost = SDCacheCostForImage(diskImage); - [self.memCache setObject:diskImage forKey:key cost:cost]; - } - - return diskImage; -} - -- (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key { - // First check the in-memory cache... - UIImage *image = [self imageFromMemoryCacheForKey:key]; - if (image) { - return image; - } - - // Second check the disk cache... - image = [self imageFromDiskCacheForKey:key]; - return image; -} - -- (nullable NSData *)diskImageDataBySearchingAllPathsForKey:(nullable NSString *)key { - NSString *defaultPath = [self defaultCachePathForKey:key]; - NSData *data = [NSData dataWithContentsOfFile:defaultPath options:self.config.diskCacheReadingOptions error:nil]; - if (data) { - return data; - } - - // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name - // checking the key with and without the extension - data = [NSData dataWithContentsOfFile:defaultPath.stringByDeletingPathExtension options:self.config.diskCacheReadingOptions error:nil]; - if (data) { - return data; - } - - NSArray *customPaths = [self.customPaths copy]; - for (NSString *path in customPaths) { - NSString *filePath = [self cachePathForKey:key inPath:path]; - NSData *imageData = [NSData dataWithContentsOfFile:filePath options:self.config.diskCacheReadingOptions error:nil]; - if (imageData) { - return imageData; - } - - // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name - // checking the key with and without the extension - imageData = [NSData dataWithContentsOfFile:filePath.stringByDeletingPathExtension options:self.config.diskCacheReadingOptions error:nil]; - if (imageData) { - return imageData; - } - } - - return nil; -} - -- (nullable UIImage *)diskImageForKey:(nullable NSString *)key { - NSData *data = [self diskImageDataBySearchingAllPathsForKey:key]; - return [self diskImageForKey:key data:data]; -} - -- (nullable UIImage *)diskImageForKey:(nullable NSString *)key data:(nullable NSData *)data { - if (data) { - UIImage *image = [[SDWebImageCodersManager sharedInstance] decodedImageWithData:data]; - image = [self scaledImageForKey:key image:image]; - if (self.config.shouldDecompressImages) { - image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&data options:@{SDWebImageCoderScaleDownLargeImagesKey: @(NO)}]; - } - return image; - } else { - return nil; - } -} - -- (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable UIImage *)image { - return SDScaledImageForKey(key, image); -} - -- (NSOperation *)queryCacheOperationForKey:(NSString *)key done:(SDCacheQueryCompletedBlock)doneBlock { - return [self queryCacheOperationForKey:key options:0 done:doneBlock]; -} - -- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options done:(nullable SDCacheQueryCompletedBlock)doneBlock { - if (!key) { - if (doneBlock) { - doneBlock(nil, nil, SDImageCacheTypeNone); - } - return nil; - } - - // First check the in-memory cache... - UIImage *image = [self imageFromMemoryCacheForKey:key]; - BOOL shouldQueryMemoryOnly = (image && !(options & SDImageCacheQueryDataWhenInMemory)); - if (shouldQueryMemoryOnly) { - if (doneBlock) { - doneBlock(image, nil, SDImageCacheTypeMemory); - } - return nil; - } - - NSOperation *operation = [NSOperation new]; - void(^queryDiskBlock)(void) = ^{ - if (operation.isCancelled) { - // do not call the completion if cancelled - return; - } - - @autoreleasepool { - NSData *diskData = [self diskImageDataBySearchingAllPathsForKey:key]; - UIImage *diskImage = image; - if (!diskImage && diskData) { - // decode image data only if in-memory cache missed - diskImage = [self diskImageForKey:key data:diskData]; - if (diskImage && self.config.shouldCacheImagesInMemory) { - NSUInteger cost = SDCacheCostForImage(diskImage); - [self.memCache setObject:diskImage forKey:key cost:cost]; - } - } - - if (doneBlock) { - if (options & SDImageCacheQueryDiskSync) { - doneBlock(diskImage, diskData, SDImageCacheTypeDisk); - } else { - dispatch_async(dispatch_get_main_queue(), ^{ - doneBlock(diskImage, diskData, SDImageCacheTypeDisk); - }); - } - } - } - }; - - if (options & SDImageCacheQueryDiskSync) { - queryDiskBlock(); - } else { - dispatch_async(self.ioQueue, queryDiskBlock); - } - - return operation; -} - -#pragma mark - Remove Ops - -- (void)removeImageForKey:(nullable NSString *)key withCompletion:(nullable SDWebImageNoParamsBlock)completion { - [self removeImageForKey:key fromDisk:YES withCompletion:completion]; -} - -- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion { - if (key == nil) { - return; - } - - if (self.config.shouldCacheImagesInMemory) { - [self.memCache removeObjectForKey:key]; - } - - if (fromDisk) { - dispatch_async(self.ioQueue, ^{ - [_fileManager removeItemAtPath:[self defaultCachePathForKey:key] error:nil]; - - if (completion) { - dispatch_async(dispatch_get_main_queue(), ^{ - completion(); - }); - } - }); - } else if (completion){ - completion(); - } - -} - -# pragma mark - Mem Cache settings - -- (void)setMaxMemoryCost:(NSUInteger)maxMemoryCost { - self.memCache.totalCostLimit = maxMemoryCost; -} - -- (NSUInteger)maxMemoryCost { - return self.memCache.totalCostLimit; -} - -- (NSUInteger)maxMemoryCountLimit { - return self.memCache.countLimit; -} - -- (void)setMaxMemoryCountLimit:(NSUInteger)maxCountLimit { - self.memCache.countLimit = maxCountLimit; -} - -#pragma mark - Cache clean Ops - -- (void)clearMemory { - [self.memCache removeAllObjects]; -} - -- (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion { - dispatch_async(self.ioQueue, ^{ - [_fileManager removeItemAtPath:self.diskCachePath error:nil]; - [_fileManager createDirectoryAtPath:self.diskCachePath - withIntermediateDirectories:YES - attributes:nil - error:NULL]; - - if (completion) { - dispatch_async(dispatch_get_main_queue(), ^{ - completion(); - }); - } - }); -} - -- (void)deleteOldFiles { - [self deleteOldFilesWithCompletionBlock:nil]; -} - -- (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock { - dispatch_async(self.ioQueue, ^{ - NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; - NSArray *resourceKeys = @[NSURLIsDirectoryKey, NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey]; - - // This enumerator prefetches useful properties for our cache files. - NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtURL:diskCacheURL - includingPropertiesForKeys:resourceKeys - options:NSDirectoryEnumerationSkipsHiddenFiles - errorHandler:NULL]; - - NSDate *expirationDate = [NSDate dateWithTimeIntervalSinceNow:-self.config.maxCacheAge]; - NSMutableDictionary *> *cacheFiles = [NSMutableDictionary dictionary]; - NSUInteger currentCacheSize = 0; - - // Enumerate all of the files in the cache directory. This loop has two purposes: - // - // 1. Removing files that are older than the expiration date. - // 2. Storing file attributes for the size-based cleanup pass. - NSMutableArray *urlsToDelete = [[NSMutableArray alloc] init]; - for (NSURL *fileURL in fileEnumerator) { - NSError *error; - NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:&error]; - - // Skip directories and errors. - if (error || !resourceValues || [resourceValues[NSURLIsDirectoryKey] boolValue]) { - continue; - } - - // Remove files that are older than the expiration date; - NSDate *modificationDate = resourceValues[NSURLContentModificationDateKey]; - if ([[modificationDate laterDate:expirationDate] isEqualToDate:expirationDate]) { - [urlsToDelete addObject:fileURL]; - continue; - } - - // Store a reference to this file and account for its total size. - NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; - currentCacheSize += totalAllocatedSize.unsignedIntegerValue; - cacheFiles[fileURL] = resourceValues; - } - - for (NSURL *fileURL in urlsToDelete) { - [_fileManager removeItemAtURL:fileURL error:nil]; - } - - // If our remaining disk cache exceeds a configured maximum size, perform a second - // size-based cleanup pass. We delete the oldest files first. - if (self.config.maxCacheSize > 0 && currentCacheSize > self.config.maxCacheSize) { - // Target half of our maximum cache size for this cleanup pass. - const NSUInteger desiredCacheSize = self.config.maxCacheSize / 2; - - // Sort the remaining cache files by their last modification time (oldest first). - NSArray *sortedFiles = [cacheFiles keysSortedByValueWithOptions:NSSortConcurrent - usingComparator:^NSComparisonResult(id obj1, id obj2) { - return [obj1[NSURLContentModificationDateKey] compare:obj2[NSURLContentModificationDateKey]]; - }]; - - // Delete files until we fall below our desired cache size. - for (NSURL *fileURL in sortedFiles) { - if ([_fileManager removeItemAtURL:fileURL error:nil]) { - NSDictionary *resourceValues = cacheFiles[fileURL]; - NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; - currentCacheSize -= totalAllocatedSize.unsignedIntegerValue; - - if (currentCacheSize < desiredCacheSize) { - break; - } - } - } - } - if (completionBlock) { - dispatch_async(dispatch_get_main_queue(), ^{ - completionBlock(); - }); - } - }); -} - -#if SD_UIKIT -- (void)backgroundDeleteOldFiles { - Class UIApplicationClass = NSClassFromString(@"UIApplication"); - if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { - return; - } - UIApplication *application = [UIApplication performSelector:@selector(sharedApplication)]; - __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ - // Clean up any unfinished task business by marking where you - // stopped or ending the task outright. - [application endBackgroundTask:bgTask]; - bgTask = UIBackgroundTaskInvalid; - }]; - - // Start the long-running task and return immediately. - [self deleteOldFilesWithCompletionBlock:^{ - [application endBackgroundTask:bgTask]; - bgTask = UIBackgroundTaskInvalid; - }]; -} -#endif - -#pragma mark - Cache Info - -- (NSUInteger)getSize { - __block NSUInteger size = 0; - dispatch_sync(self.ioQueue, ^{ - NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath]; - for (NSString *fileName in fileEnumerator) { - NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName]; - NSDictionary *attrs = [_fileManager attributesOfItemAtPath:filePath error:nil]; - size += [attrs fileSize]; - } - }); - return size; -} - -- (NSUInteger)getDiskCount { - __block NSUInteger count = 0; - dispatch_sync(self.ioQueue, ^{ - NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath]; - count = fileEnumerator.allObjects.count; - }); - return count; -} - -- (void)calculateSizeWithCompletionBlock:(nullable SDWebImageCalculateSizeBlock)completionBlock { - NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; - - dispatch_async(self.ioQueue, ^{ - NSUInteger fileCount = 0; - NSUInteger totalSize = 0; - - NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtURL:diskCacheURL - includingPropertiesForKeys:@[NSFileSize] - options:NSDirectoryEnumerationSkipsHiddenFiles - errorHandler:NULL]; - - for (NSURL *fileURL in fileEnumerator) { - NSNumber *fileSize; - [fileURL getResourceValue:&fileSize forKey:NSURLFileSizeKey error:NULL]; - totalSize += fileSize.unsignedIntegerValue; - fileCount += 1; - } - - if (completionBlock) { - dispatch_async(dispatch_get_main_queue(), ^{ - completionBlock(fileCount, totalSize); - }); - } - }); -} - -@end - diff --git a/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h b/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h deleted file mode 100644 index d3cb5421d..000000000 --- a/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageCompat.h" - -@interface SDImageCacheConfig : NSObject - -/** - * Decompressing images that are downloaded and cached can improve performance but can consume lot of memory. - * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. - */ -@property (assign, nonatomic) BOOL shouldDecompressImages; - -/** - * disable iCloud backup [defaults to YES] - */ -@property (assign, nonatomic) BOOL shouldDisableiCloud; - -/** - * use memory cache [defaults to YES] - */ -@property (assign, nonatomic) BOOL shouldCacheImagesInMemory; - -/** - * The reading options while reading cache from disk. - * Defaults to 0. You can set this to `NSDataReadingMappedIfSafe` to improve performance. - */ -@property (assign, nonatomic) NSDataReadingOptions diskCacheReadingOptions; - -/** - * The writing options while writing cache to disk. - * Defaults to `NSDataWritingAtomic`. You can set this to `NSDataWritingWithoutOverwriting` to prevent overwriting an existing file. - */ -@property (assign, nonatomic) NSDataWritingOptions diskCacheWritingOptions; - -/** - * The maximum length of time to keep an image in the cache, in seconds. - */ -@property (assign, nonatomic) NSInteger maxCacheAge; - -/** - * The maximum size of the cache, in bytes. - */ -@property (assign, nonatomic) NSUInteger maxCacheSize; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m b/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m deleted file mode 100644 index 923506d0f..000000000 --- a/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDImageCacheConfig.h" - -static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week - -@implementation SDImageCacheConfig - -- (instancetype)init { - if (self = [super init]) { - _shouldDecompressImages = YES; - _shouldDisableiCloud = YES; - _shouldCacheImagesInMemory = YES; - _diskCacheReadingOptions = 0; - _diskCacheWritingOptions = NSDataWritingAtomic; - _maxCacheAge = kDefaultCacheMaxCacheAge; - _maxCacheSize = 0; - } - return self; -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h b/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h deleted file mode 100644 index 7c0a63f28..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageCoder.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageCompat.h" -#import "NSData+ImageContentType.h" - -/** - A Boolean value indicating whether to scale down large images during decompressing. (NSNumber) - */ -FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageCoderScaleDownLargeImagesKey; - -/** - Return the shared device-dependent RGB color space created with CGColorSpaceCreateDeviceRGB. - - @return The device-dependent RGB color space - */ -CG_EXTERN CGColorSpaceRef _Nonnull SDCGColorSpaceGetDeviceRGB(void); - -/** - Check whether CGImageRef contains alpha channel. - - @param imageRef The CGImageRef - @return Return YES if CGImageRef contains alpha channel, otherwise return NO - */ -CG_EXTERN BOOL SDCGImageRefContainsAlpha(_Nullable CGImageRef imageRef); - - -/** - This is the image coder protocol to provide custom image decoding/encoding. - These methods are all required to implement. - @note Pay attention that these methods are not called from main queue. - */ -@protocol SDWebImageCoder - -@required -#pragma mark - Decoding -/** - Returns YES if this coder can decode some data. Otherwise, the data should be passed to another coder. - - @param data The image data so we can look at it - @return YES if this coder can decode the data, NO otherwise - */ -- (BOOL)canDecodeFromData:(nullable NSData *)data; - -/** - Decode the image data to image. - - @param data The image data to be decoded - @return The decoded image from data - */ -- (nullable UIImage *)decodedImageWithData:(nullable NSData *)data; - -/** - Decompress the image with original image and image data. - - @param image The original image to be decompressed - @param data The pointer to original image data. The pointer itself is nonnull but image data can be null. This data will set to cache if needed. If you do not need to modify data at the sametime, ignore this param. - @param optionsDict A dictionary containing any decompressing options. Pass {SDWebImageCoderScaleDownLargeImagesKey: @(YES)} to scale down large images - @return The decompressed image - */ -- (nullable UIImage *)decompressedImageWithImage:(nullable UIImage *)image - data:(NSData * _Nullable * _Nonnull)data - options:(nullable NSDictionary*)optionsDict; - -#pragma mark - Encoding - -/** - Returns YES if this coder can encode some image. Otherwise, it should be passed to another coder. - - @param format The image format - @return YES if this coder can encode the image, NO otherwise - */ -- (BOOL)canEncodeToFormat:(SDImageFormat)format; - -/** - Encode the image to image data. - - @param image The image to be encoded - @param format The image format to encode, you should note `SDImageFormatUndefined` format is also possible - @return The encoded image data - */ -- (nullable NSData *)encodedDataWithImage:(nullable UIImage *)image format:(SDImageFormat)format; - -@end - - -/** - This is the image coder protocol to provide custom progressive image decoding. - These methods are all required to implement. - @note Pay attention that these methods are not called from main queue. - */ -@protocol SDWebImageProgressiveCoder - -@required -/** - Returns YES if this coder can incremental decode some data. Otherwise, it should be passed to another coder. - - @param data The image data so we can look at it - @return YES if this coder can decode the data, NO otherwise - */ -- (BOOL)canIncrementallyDecodeFromData:(nullable NSData *)data; - -/** - Incremental decode the image data to image. - - @param data The image data has been downloaded so far - @param finished Whether the download has finished - @warning because incremental decoding need to keep the decoded context, we will alloc a new instance with the same class for each download operation to avoid conflicts - @return The decoded image from data - */ -- (nullable UIImage *)incrementallyDecodedImageWithData:(nullable NSData *)data finished:(BOOL)finished; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m b/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m deleted file mode 100644 index 9357fe521..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageCoder.m +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCoder.h" - -NSString * const SDWebImageCoderScaleDownLargeImagesKey = @"scaleDownLargeImages"; - -CGColorSpaceRef SDCGColorSpaceGetDeviceRGB(void) { - static CGColorSpaceRef colorSpace; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - colorSpace = CGColorSpaceCreateDeviceRGB(); - }); - return colorSpace; -} - -BOOL SDCGImageRefContainsAlpha(CGImageRef imageRef) { - if (!imageRef) { - return NO; - } - CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef); - BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone || - alphaInfo == kCGImageAlphaNoneSkipFirst || - alphaInfo == kCGImageAlphaNoneSkipLast); - return hasAlpha; -} diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h b/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h deleted file mode 100644 index cdafd88db..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageCompat.h" -#import "SDWebImageFrame.h" - -@interface SDWebImageCoderHelper : NSObject - -/** - Return an animated image with frames array. - For UIKit, this will apply the patch and then create animated UIImage. The patch is because that `+[UIImage animatedImageWithImages:duration:]` just use the averate of duration for each image. So it will not work if different frame has different duration. Therefore we repeat the specify frame for specify times to let it work. - For AppKit, NSImage does not support animates other than GIF. This will try to encode the frames to GIF format and then create an animated NSImage for rendering. - - @param frames The frames array. If no frames or frames is empty, return nil - @return A animated image for rendering on UIImageView(UIKit) or NSImageView(AppKit) - */ -+ (UIImage * _Nullable)animatedImageWithFrames:(NSArray * _Nullable)frames; - -/** - Return frames array from an animated image. - For UIKit, this will unapply the patch for the description above and then create frames array. This will also work for normal animated UIImage. - For AppKit, NSImage does not support animates other than GIF. This will try to decode the GIF imageRep and then create frames array. - - @param animatedImage A animated image. If it's not animated, return nil - @return The frames array - */ -+ (NSArray * _Nullable)framesFromAnimatedImage:(UIImage * _Nullable)animatedImage; - -#if SD_UIKIT || SD_WATCH -/** - Convert an EXIF image orientation to an iOS one. - - @param exifOrientation EXIF orientation - @return iOS orientation - */ -+ (UIImageOrientation)imageOrientationFromEXIFOrientation:(NSInteger)exifOrientation; -/** - Convert an iOS orientation to an EXIF image orientation. - - @param imageOrientation iOS orientation - @return EXIF orientation - */ -+ (NSInteger)exifOrientationFromImageOrientation:(UIImageOrientation)imageOrientation; -#endif - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m b/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m deleted file mode 100644 index b2b651a20..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageCoderHelper.m +++ /dev/null @@ -1,255 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCoderHelper.h" -#import "SDWebImageFrame.h" -#import "UIImage+MultiFormat.h" -#import "NSImage+WebCache.h" -#import - -@implementation SDWebImageCoderHelper - -+ (UIImage *)animatedImageWithFrames:(NSArray *)frames { - NSUInteger frameCount = frames.count; - if (frameCount == 0) { - return nil; - } - - UIImage *animatedImage; - -#if SD_UIKIT || SD_WATCH - NSUInteger durations[frameCount]; - for (size_t i = 0; i < frameCount; i++) { - durations[i] = frames[i].duration * 1000; - } - NSUInteger const gcd = gcdArray(frameCount, durations); - __block NSUInteger totalDuration = 0; - NSMutableArray *animatedImages = [NSMutableArray arrayWithCapacity:frameCount]; - [frames enumerateObjectsUsingBlock:^(SDWebImageFrame * _Nonnull frame, NSUInteger idx, BOOL * _Nonnull stop) { - UIImage *image = frame.image; - NSUInteger duration = frame.duration * 1000; - totalDuration += duration; - NSUInteger repeatCount; - if (gcd) { - repeatCount = duration / gcd; - } else { - repeatCount = 1; - } - for (size_t i = 0; i < repeatCount; ++i) { - [animatedImages addObject:image]; - } - }]; - - animatedImage = [UIImage animatedImageWithImages:animatedImages duration:totalDuration / 1000.f]; - -#else - - NSMutableData *imageData = [NSMutableData data]; - CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:SDImageFormatGIF]; - // Create an image destination. GIF does not support EXIF image orientation - CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, frameCount, NULL); - if (!imageDestination) { - // Handle failure. - return nil; - } - - for (size_t i = 0; i < frameCount; i++) { - @autoreleasepool { - SDWebImageFrame *frame = frames[i]; - float frameDuration = frame.duration; - CGImageRef frameImageRef = frame.image.CGImage; - NSDictionary *frameProperties = @{(__bridge_transfer NSString *)kCGImagePropertyGIFDictionary : @{(__bridge_transfer NSString *)kCGImagePropertyGIFUnclampedDelayTime : @(frameDuration)}}; - CGImageDestinationAddImage(imageDestination, frameImageRef, (__bridge CFDictionaryRef)frameProperties); - } - } - // Finalize the destination. - if (CGImageDestinationFinalize(imageDestination) == NO) { - // Handle failure. - CFRelease(imageDestination); - return nil; - } - CFRelease(imageDestination); - animatedImage = [[NSImage alloc] initWithData:imageData]; -#endif - - return animatedImage; -} - -+ (NSArray *)framesFromAnimatedImage:(UIImage *)animatedImage { - if (!animatedImage) { - return nil; - } - - NSMutableArray *frames = [NSMutableArray array]; - NSUInteger frameCount = 0; - -#if SD_UIKIT || SD_WATCH - NSArray *animatedImages = animatedImage.images; - frameCount = animatedImages.count; - if (frameCount == 0) { - return nil; - } - - NSTimeInterval avgDuration = animatedImage.duration / frameCount; - if (avgDuration == 0) { - avgDuration = 0.1; // if it's a animated image but no duration, set it to default 100ms (this do not have that 10ms limit like GIF or WebP to allow custom coder provide the limit) - } - - __block NSUInteger index = 0; - __block NSUInteger repeatCount = 1; - __block UIImage *previousImage = animatedImages.firstObject; - [animatedImages enumerateObjectsUsingBlock:^(UIImage * _Nonnull image, NSUInteger idx, BOOL * _Nonnull stop) { - // ignore first - if (idx == 0) { - return; - } - if ([image isEqual:previousImage]) { - repeatCount++; - } else { - SDWebImageFrame *frame = [SDWebImageFrame frameWithImage:previousImage duration:avgDuration * repeatCount]; - [frames addObject:frame]; - repeatCount = 1; - index++; - } - previousImage = image; - // last one - if (idx == frameCount - 1) { - SDWebImageFrame *frame = [SDWebImageFrame frameWithImage:previousImage duration:avgDuration * repeatCount]; - [frames addObject:frame]; - } - }]; - -#else - - NSBitmapImageRep *bitmapRep; - for (NSImageRep *imageRep in animatedImage.representations) { - if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) { - bitmapRep = (NSBitmapImageRep *)imageRep; - break; - } - } - if (bitmapRep) { - frameCount = [[bitmapRep valueForProperty:NSImageFrameCount] unsignedIntegerValue]; - } - - if (frameCount == 0) { - return nil; - } - - for (size_t i = 0; i < frameCount; i++) { - @autoreleasepool { - // NSBitmapImageRep need to manually change frame. "Good taste" API - [bitmapRep setProperty:NSImageCurrentFrame withValue:@(i)]; - float frameDuration = [[bitmapRep valueForProperty:NSImageCurrentFrameDuration] floatValue]; - NSImage *frameImage = [[NSImage alloc] initWithCGImage:bitmapRep.CGImage size:CGSizeZero]; - SDWebImageFrame *frame = [SDWebImageFrame frameWithImage:frameImage duration:frameDuration]; - [frames addObject:frame]; - } - } -#endif - - return frames; -} - -#if SD_UIKIT || SD_WATCH -// Convert an EXIF image orientation to an iOS one. -+ (UIImageOrientation)imageOrientationFromEXIFOrientation:(NSInteger)exifOrientation { - // CGImagePropertyOrientation is available on iOS 8 above. Currently kept for compatibility - UIImageOrientation imageOrientation = UIImageOrientationUp; - switch (exifOrientation) { - case 1: - imageOrientation = UIImageOrientationUp; - break; - case 3: - imageOrientation = UIImageOrientationDown; - break; - case 8: - imageOrientation = UIImageOrientationLeft; - break; - case 6: - imageOrientation = UIImageOrientationRight; - break; - case 2: - imageOrientation = UIImageOrientationUpMirrored; - break; - case 4: - imageOrientation = UIImageOrientationDownMirrored; - break; - case 5: - imageOrientation = UIImageOrientationLeftMirrored; - break; - case 7: - imageOrientation = UIImageOrientationRightMirrored; - break; - default: - break; - } - return imageOrientation; -} - -// Convert an iOS orientation to an EXIF image orientation. -+ (NSInteger)exifOrientationFromImageOrientation:(UIImageOrientation)imageOrientation { - // CGImagePropertyOrientation is available on iOS 8 above. Currently kept for compatibility - NSInteger exifOrientation = 1; - switch (imageOrientation) { - case UIImageOrientationUp: - exifOrientation = 1; - break; - case UIImageOrientationDown: - exifOrientation = 3; - break; - case UIImageOrientationLeft: - exifOrientation = 8; - break; - case UIImageOrientationRight: - exifOrientation = 6; - break; - case UIImageOrientationUpMirrored: - exifOrientation = 2; - break; - case UIImageOrientationDownMirrored: - exifOrientation = 4; - break; - case UIImageOrientationLeftMirrored: - exifOrientation = 5; - break; - case UIImageOrientationRightMirrored: - exifOrientation = 7; - break; - default: - break; - } - return exifOrientation; -} -#endif - -#pragma mark - Helper Fuction -#if SD_UIKIT || SD_WATCH -static NSUInteger gcd(NSUInteger a, NSUInteger b) { - NSUInteger c; - while (a != 0) { - c = a; - a = b % a; - b = c; - } - return b; -} - -static NSUInteger gcdArray(size_t const count, NSUInteger const * const values) { - if (count == 0) { - return 0; - } - NSUInteger result = values[0]; - for (size_t i = 1; i < count; ++i) { - result = gcd(values[i], result); - } - return result; -} -#endif - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h b/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h deleted file mode 100644 index 5c3d4b372..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageCoder.h" - -/** - Global object holding the array of coders, so that we avoid passing them from object to object. - Uses a priority queue behind scenes, which means the latest added coders have the highest priority. - This is done so when encoding/decoding something, we go through the list and ask each coder if they can handle the current data. - That way, users can add their custom coders while preserving our existing prebuilt ones - - Note: the `coders` getter will return the coders in their reversed order - Example: - - by default we internally set coders = `IOCoder`, `WebPCoder`. (`GIFCoder` is not recommended to add only if you want to get GIF support without `FLAnimatedImage`) - - calling `coders` will return `@[WebPCoder, IOCoder]` - - call `[addCoder:[MyCrazyCoder new]]` - - calling `coders` now returns `@[MyCrazyCoder, WebPCoder, IOCoder]` - - Coders - ------ - A coder must conform to the `SDWebImageCoder` protocol or even to `SDWebImageProgressiveCoder` if it supports progressive decoding - Conformance is important because that way, they will implement `canDecodeFromData` or `canEncodeToFormat` - Those methods are called on each coder in the array (using the priority order) until one of them returns YES. - That means that coder can decode that data / encode to that format - */ -@interface SDWebImageCodersManager : NSObject - -/** - Shared reusable instance - */ -+ (nonnull instancetype)sharedInstance; - -/** - All coders in coders manager. The coders array is a priority queue, which means the later added coder will have the highest priority - */ -@property (nonatomic, strong, readwrite, nullable) NSArray* coders; - -/** - Add a new coder to the end of coders array. Which has the highest priority. - - @param coder coder - */ -- (void)addCoder:(nonnull id)coder; - -/** - Remove a coder in the coders array. - - @param coder coder - */ -- (void)removeCoder:(nonnull id)coder; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m b/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m deleted file mode 100644 index 6134aa882..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageCodersManager.m +++ /dev/null @@ -1,133 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCodersManager.h" -#import "SDWebImageImageIOCoder.h" -#import "SDWebImageGIFCoder.h" -#ifdef SD_WEBP -#import "SDWebImageWebPCoder.h" -#endif - -@interface SDWebImageCodersManager () - -@property (strong, nonatomic, nonnull) NSMutableArray* mutableCoders; -@property (strong, nonatomic, nullable) dispatch_queue_t mutableCodersAccessQueue; - -@end - -@implementation SDWebImageCodersManager - -+ (nonnull instancetype)sharedInstance { - static dispatch_once_t once; - static id instance; - dispatch_once(&once, ^{ - instance = [self new]; - }); - return instance; -} - -- (instancetype)init { - if (self = [super init]) { - // initialize with default coders - _mutableCoders = [@[[SDWebImageImageIOCoder sharedCoder]] mutableCopy]; -#ifdef SD_WEBP - [_mutableCoders addObject:[SDWebImageWebPCoder sharedCoder]]; -#endif - _mutableCodersAccessQueue = dispatch_queue_create("com.hackemist.SDWebImageCodersManager", DISPATCH_QUEUE_CONCURRENT); - } - return self; -} - -#pragma mark - Coder IO operations - -- (void)addCoder:(nonnull id)coder { - if ([coder conformsToProtocol:@protocol(SDWebImageCoder)]) { - dispatch_barrier_sync(self.mutableCodersAccessQueue, ^{ - [self.mutableCoders addObject:coder]; - }); - } -} - -- (void)removeCoder:(nonnull id)coder { - dispatch_barrier_sync(self.mutableCodersAccessQueue, ^{ - [self.mutableCoders removeObject:coder]; - }); -} - -- (NSArray *)coders { - __block NSArray *sortedCoders = nil; - dispatch_sync(self.mutableCodersAccessQueue, ^{ - sortedCoders = (NSArray *)[[[self.mutableCoders copy] reverseObjectEnumerator] allObjects]; - }); - return sortedCoders; -} - -- (void)setCoders:(NSArray *)coders { - dispatch_barrier_sync(self.mutableCodersAccessQueue, ^{ - self.mutableCoders = [coders mutableCopy]; - }); -} - -#pragma mark - SDWebImageCoder -- (BOOL)canDecodeFromData:(NSData *)data { - for (id coder in self.coders) { - if ([coder canDecodeFromData:data]) { - return YES; - } - } - return NO; -} - -- (BOOL)canEncodeToFormat:(SDImageFormat)format { - for (id coder in self.coders) { - if ([coder canEncodeToFormat:format]) { - return YES; - } - } - return NO; -} - -- (UIImage *)decodedImageWithData:(NSData *)data { - if (!data) { - return nil; - } - for (id coder in self.coders) { - if ([coder canDecodeFromData:data]) { - return [coder decodedImageWithData:data]; - } - } - return nil; -} - -- (UIImage *)decompressedImageWithImage:(UIImage *)image - data:(NSData *__autoreleasing _Nullable *)data - options:(nullable NSDictionary*)optionsDict { - if (!image) { - return nil; - } - for (id coder in self.coders) { - if ([coder canDecodeFromData:*data]) { - return [coder decompressedImageWithImage:image data:data options:optionsDict]; - } - } - return nil; -} - -- (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format { - if (!image) { - return nil; - } - for (id coder in self.coders) { - if ([coder canEncodeToFormat:format]) { - return [coder encodedDataWithImage:image format:format]; - } - } - return nil; -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h b/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h deleted file mode 100644 index ce0680710..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * (c) Jamie Pinkham - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import - -#ifdef __OBJC_GC__ - #error SDWebImage does not support Objective-C Garbage Collection -#endif - -// Apple's defines from TargetConditionals.h are a bit weird. -// Seems like TARGET_OS_MAC is always defined (on all platforms). -// To determine if we are running on OSX, we can only rely on TARGET_OS_IPHONE=0 and all the other platforms -#if !TARGET_OS_IPHONE && !TARGET_OS_IOS && !TARGET_OS_TV && !TARGET_OS_WATCH - #define SD_MAC 1 -#else - #define SD_MAC 0 -#endif - -// iOS and tvOS are very similar, UIKit exists on both platforms -// Note: watchOS also has UIKit, but it's very limited -#if TARGET_OS_IOS || TARGET_OS_TV - #define SD_UIKIT 1 -#else - #define SD_UIKIT 0 -#endif - -#if TARGET_OS_IOS - #define SD_IOS 1 -#else - #define SD_IOS 0 -#endif - -#if TARGET_OS_TV - #define SD_TV 1 -#else - #define SD_TV 0 -#endif - -#if TARGET_OS_WATCH - #define SD_WATCH 1 -#else - #define SD_WATCH 0 -#endif - - -#if SD_MAC - #import - #ifndef UIImage - #define UIImage NSImage - #endif - #ifndef UIImageView - #define UIImageView NSImageView - #endif - #ifndef UIView - #define UIView NSView - #endif -#else - #if __IPHONE_OS_VERSION_MIN_REQUIRED != 20000 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 - #error SDWebImage doesn't support Deployment Target version < 5.0 - #endif - - #if SD_UIKIT - #import - #endif - #if SD_WATCH - #import - #endif -#endif - -#ifndef NS_ENUM -#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type -#endif - -#ifndef NS_OPTIONS -#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type -#endif - -FOUNDATION_EXPORT UIImage *SDScaledImageForKey(NSString *key, UIImage *image); - -typedef void(^SDWebImageNoParamsBlock)(void); - -FOUNDATION_EXPORT NSString *const SDWebImageErrorDomain; - -#ifndef dispatch_queue_async_safe -#define dispatch_queue_async_safe(queue, block)\ - if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(queue)) == 0) {\ - block();\ - } else {\ - dispatch_async(queue, block);\ - } -#endif - -#ifndef dispatch_main_async_safe -#define dispatch_main_async_safe(block) dispatch_queue_async_safe(dispatch_get_main_queue(), block) -#endif diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m b/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m deleted file mode 100644 index bb53495ef..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" -#import "UIImage+MultiFormat.h" - -#if !__has_feature(objc_arc) - #error SDWebImage is ARC only. Either turn on ARC for the project or use -fobjc-arc flag -#endif - -#if !OS_OBJECT_USE_OBJC - #error SDWebImage need ARC for dispatch object -#endif - -inline UIImage *SDScaledImageForKey(NSString * _Nullable key, UIImage * _Nullable image) { - if (!image) { - return nil; - } - -#if SD_MAC - return image; -#elif SD_UIKIT || SD_WATCH - if ((image.images).count > 0) { - NSMutableArray *scaledImages = [NSMutableArray array]; - - for (UIImage *tempImage in image.images) { - [scaledImages addObject:SDScaledImageForKey(key, tempImage)]; - } - - UIImage *animatedImage = [UIImage animatedImageWithImages:scaledImages duration:image.duration]; - if (animatedImage) { - animatedImage.sd_imageLoopCount = image.sd_imageLoopCount; - } - return animatedImage; - } else { -#if SD_WATCH - if ([[WKInterfaceDevice currentDevice] respondsToSelector:@selector(screenScale)]) { -#elif SD_UIKIT - if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { -#endif - CGFloat scale = 1; - if (key.length >= 8) { - NSRange range = [key rangeOfString:@"@2x."]; - if (range.location != NSNotFound) { - scale = 2.0; - } - - range = [key rangeOfString:@"@3x."]; - if (range.location != NSNotFound) { - scale = 3.0; - } - } - - UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation]; - image = scaledImage; - } - return image; - } -#endif -} - -NSString *const SDWebImageErrorDomain = @"SDWebImageErrorDomain"; diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h b/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h deleted file mode 100644 index 54224c5c4..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h +++ /dev/null @@ -1,264 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageCompat.h" -#import "SDWebImageOperation.h" - -typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { - SDWebImageDownloaderLowPriority = 1 << 0, - SDWebImageDownloaderProgressiveDownload = 1 << 1, - - /** - * By default, request prevent the use of NSURLCache. With this flag, NSURLCache - * is used with default policies. - */ - SDWebImageDownloaderUseNSURLCache = 1 << 2, - - /** - * Call completion block with nil image/imageData if the image was read from NSURLCache - * (to be combined with `SDWebImageDownloaderUseNSURLCache`). - */ - SDWebImageDownloaderIgnoreCachedResponse = 1 << 3, - - /** - * In iOS 4+, continue the download of the image if the app goes to background. This is achieved by asking the system for - * extra time in background to let the request finish. If the background task expires the operation will be cancelled. - */ - SDWebImageDownloaderContinueInBackground = 1 << 4, - - /** - * Handles cookies stored in NSHTTPCookieStore by setting - * NSMutableURLRequest.HTTPShouldHandleCookies = YES; - */ - SDWebImageDownloaderHandleCookies = 1 << 5, - - /** - * Enable to allow untrusted SSL certificates. - * Useful for testing purposes. Use with caution in production. - */ - SDWebImageDownloaderAllowInvalidSSLCertificates = 1 << 6, - - /** - * Put the image in the high priority queue. - */ - SDWebImageDownloaderHighPriority = 1 << 7, - - /** - * Scale down the image - */ - SDWebImageDownloaderScaleDownLargeImages = 1 << 8, -}; - -typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { - /** - * Default value. All download operations will execute in queue style (first-in-first-out). - */ - SDWebImageDownloaderFIFOExecutionOrder, - - /** - * All download operations will execute in stack style (last-in-first-out). - */ - SDWebImageDownloaderLIFOExecutionOrder -}; - -FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadStartNotification; -FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadStopNotification; - -typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL); - -typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished); - -typedef NSDictionary SDHTTPHeadersDictionary; -typedef NSMutableDictionary SDHTTPHeadersMutableDictionary; - -typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterBlock)(NSURL * _Nullable url, SDHTTPHeadersDictionary * _Nullable headers); - -/** - * A token associated with each download. Can be used to cancel a download - */ -@interface SDWebImageDownloadToken : NSObject - -/** - The download's URL. This should be readonly and you should not modify - */ -@property (nonatomic, strong, nullable) NSURL *url; -/** - The cancel token taken from `addHandlersForProgress:completed`. This should be readonly and you should not modify - @note use `-[SDWebImageDownloadToken cancel]` to cancel the token - */ -@property (nonatomic, strong, nullable) id downloadOperationCancelToken; - -@end - - -/** - * Asynchronous downloader dedicated and optimized for image loading. - */ -@interface SDWebImageDownloader : NSObject - -/** - * Decompressing images that are downloaded and cached can improve performance but can consume lot of memory. - * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. - */ -@property (assign, nonatomic) BOOL shouldDecompressImages; - -/** - * The maximum number of concurrent downloads - */ -@property (assign, nonatomic) NSInteger maxConcurrentDownloads; - -/** - * Shows the current amount of downloads that still need to be downloaded - */ -@property (readonly, nonatomic) NSUInteger currentDownloadCount; - -/** - * The timeout value (in seconds) for the download operation. Default: 15.0. - */ -@property (assign, nonatomic) NSTimeInterval downloadTimeout; - -/** - * The configuration in use by the internal NSURLSession. - * Mutating this object directly has no effect. - * - * @see createNewSessionWithConfiguration: - */ -@property (readonly, nonatomic, nonnull) NSURLSessionConfiguration *sessionConfiguration; - - -/** - * Changes download operations execution order. Default value is `SDWebImageDownloaderFIFOExecutionOrder`. - */ -@property (assign, nonatomic) SDWebImageDownloaderExecutionOrder executionOrder; - -/** - * Singleton method, returns the shared instance - * - * @return global shared instance of downloader class - */ -+ (nonnull instancetype)sharedDownloader; - -/** - * Set the default URL credential to be set for request operations. - */ -@property (strong, nonatomic, nullable) NSURLCredential *urlCredential; - -/** - * Set username - */ -@property (strong, nonatomic, nullable) NSString *username; - -/** - * Set password - */ -@property (strong, nonatomic, nullable) NSString *password; - -/** - * Set filter to pick headers for downloading image HTTP request. - * - * This block will be invoked for each downloading image request, returned - * NSDictionary will be used as headers in corresponding HTTP request. - */ -@property (nonatomic, copy, nullable) SDWebImageDownloaderHeadersFilterBlock headersFilter; - -/** - * Creates an instance of a downloader with specified session configuration. - * @note `timeoutIntervalForRequest` is going to be overwritten. - * @return new instance of downloader class - */ -- (nonnull instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)sessionConfiguration NS_DESIGNATED_INITIALIZER; - -/** - * Set a value for a HTTP header to be appended to each download HTTP request. - * - * @param value The value for the header field. Use `nil` value to remove the header. - * @param field The name of the header field to set. - */ -- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field; - -/** - * Returns the value of the specified HTTP header field. - * - * @return The value associated with the header field field, or `nil` if there is no corresponding header field. - */ -- (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field; - -/** - * Sets a subclass of `SDWebImageDownloaderOperation` as the default - * `NSOperation` to be used each time SDWebImage constructs a request - * operation to download an image. - * - * @param operationClass The subclass of `SDWebImageDownloaderOperation` to set - * as default. Passing `nil` will revert to `SDWebImageDownloaderOperation`. - */ -- (void)setOperationClass:(nullable Class)operationClass; - -/** - * Creates a SDWebImageDownloader async downloader instance with a given URL - * - * The delegate will be informed when the image is finish downloaded or an error has happen. - * - * @see SDWebImageDownloaderDelegate - * - * @param url The URL to the image to download - * @param options The options to be used for this download - * @param progressBlock A block called repeatedly while the image is downloading - * @note the progress block is executed on a background queue - * @param completedBlock A block called once the download is completed. - * If the download succeeded, the image parameter is set, in case of error, - * error parameter is set with the error. The last parameter is always YES - * if SDWebImageDownloaderProgressiveDownload isn't use. With the - * SDWebImageDownloaderProgressiveDownload option, this block is called - * repeatedly with the partial image object and the finished argument set to NO - * before to be called a last time with the full image and finished argument - * set to YES. In case of error, the finished argument is always YES. - * - * @return A token (SDWebImageDownloadToken) that can be passed to -cancel: to cancel this operation - */ -- (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url - options:(SDWebImageDownloaderOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock; - -/** - * Cancels a download that was previously queued using -downloadImageWithURL:options:progress:completed: - * - * @param token The token received from -downloadImageWithURL:options:progress:completed: that should be canceled. - */ -- (void)cancel:(nullable SDWebImageDownloadToken *)token; - -/** - * Sets the download queue suspension state - */ -- (void)setSuspended:(BOOL)suspended; - -/** - * Cancels all download operations in the queue - */ -- (void)cancelAllDownloads; - -/** - * Forces SDWebImageDownloader to create and use a new NSURLSession that is - * initialized with the given configuration. - * @note All existing download operations in the queue will be cancelled. - * @note `timeoutIntervalForRequest` is going to be overwritten. - * - * @param sessionConfiguration The configuration to use for the new NSURLSession - */ -- (void)createNewSessionWithConfiguration:(nonnull NSURLSessionConfiguration *)sessionConfiguration; - -/** - * Invalidates the managed session, optionally canceling pending operations. - * @note If you use custom downloader instead of the shared downloader, you need call this method when you do not use it to avoid memory leak - * @param cancelPendingOperations Whether or not to cancel pending operations. - * @note Calling this method on the shared downloader has no effect. - */ -- (void)invalidateSessionAndCancel:(BOOL)cancelPendingOperations; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m b/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m deleted file mode 100644 index 19d689f6f..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m +++ /dev/null @@ -1,406 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageDownloader.h" -#import "SDWebImageDownloaderOperation.h" - -#define LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); -#define UNLOCK(lock) dispatch_semaphore_signal(lock); - -@interface SDWebImageDownloadToken () - -@property (nonatomic, weak, nullable) NSOperation *downloadOperation; - -@end - -@implementation SDWebImageDownloadToken - -- (void)cancel { - if (self.downloadOperation) { - SDWebImageDownloadToken *cancelToken = self.downloadOperationCancelToken; - if (cancelToken) { - [self.downloadOperation cancel:cancelToken]; - } - } -} - -@end - - -@interface SDWebImageDownloader () - -@property (strong, nonatomic, nonnull) NSOperationQueue *downloadQueue; -@property (weak, nonatomic, nullable) NSOperation *lastAddedOperation; -@property (assign, nonatomic, nullable) Class operationClass; -@property (strong, nonatomic, nonnull) NSMutableDictionary *URLOperations; -@property (strong, nonatomic, nullable) SDHTTPHeadersMutableDictionary *HTTPHeaders; -@property (strong, nonatomic, nonnull) dispatch_semaphore_t operationsLock; // a lock to keep the access to `URLOperations` thread-safe -@property (strong, nonatomic, nonnull) dispatch_semaphore_t headersLock; // a lock to keep the access to `HTTPHeaders` thread-safe - -// The session in which data tasks will run -@property (strong, nonatomic) NSURLSession *session; - -@end - -@implementation SDWebImageDownloader - -+ (void)initialize { - // Bind SDNetworkActivityIndicator if available (download it here: http://github.com/rs/SDNetworkActivityIndicator ) - // To use it, just add #import "SDNetworkActivityIndicator.h" in addition to the SDWebImage import - if (NSClassFromString(@"SDNetworkActivityIndicator")) { - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - id activityIndicator = [NSClassFromString(@"SDNetworkActivityIndicator") performSelector:NSSelectorFromString(@"sharedActivityIndicator")]; -#pragma clang diagnostic pop - - // Remove observer in case it was previously added. - [[NSNotificationCenter defaultCenter] removeObserver:activityIndicator name:SDWebImageDownloadStartNotification object:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:activityIndicator name:SDWebImageDownloadStopNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:activityIndicator - selector:NSSelectorFromString(@"startActivity") - name:SDWebImageDownloadStartNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:activityIndicator - selector:NSSelectorFromString(@"stopActivity") - name:SDWebImageDownloadStopNotification object:nil]; - } -} - -+ (nonnull instancetype)sharedDownloader { - static dispatch_once_t once; - static id instance; - dispatch_once(&once, ^{ - instance = [self new]; - }); - return instance; -} - -- (nonnull instancetype)init { - return [self initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; -} - -- (nonnull instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)sessionConfiguration { - if ((self = [super init])) { - _operationClass = [SDWebImageDownloaderOperation class]; - _shouldDecompressImages = YES; - _executionOrder = SDWebImageDownloaderFIFOExecutionOrder; - _downloadQueue = [NSOperationQueue new]; - _downloadQueue.maxConcurrentOperationCount = 6; - _downloadQueue.name = @"com.hackemist.SDWebImageDownloader"; - _URLOperations = [NSMutableDictionary new]; -#ifdef SD_WEBP - _HTTPHeaders = [@{@"Accept": @"image/webp,image/*;q=0.8"} mutableCopy]; -#else - _HTTPHeaders = [@{@"Accept": @"image/*;q=0.8"} mutableCopy]; -#endif - _operationsLock = dispatch_semaphore_create(1); - _headersLock = dispatch_semaphore_create(1); - _downloadTimeout = 15.0; - - [self createNewSessionWithConfiguration:sessionConfiguration]; - } - return self; -} - -- (void)createNewSessionWithConfiguration:(NSURLSessionConfiguration *)sessionConfiguration { - [self cancelAllDownloads]; - - if (self.session) { - [self.session invalidateAndCancel]; - } - - sessionConfiguration.timeoutIntervalForRequest = self.downloadTimeout; - - /** - * Create the session for this task - * We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate - * method calls and completion handler calls. - */ - self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration - delegate:self - delegateQueue:nil]; -} - -- (void)invalidateSessionAndCancel:(BOOL)cancelPendingOperations { - if (self == [SDWebImageDownloader sharedDownloader]) { - return; - } - if (cancelPendingOperations) { - [self.session invalidateAndCancel]; - } else { - [self.session finishTasksAndInvalidate]; - } -} - -- (void)dealloc { - [self.session invalidateAndCancel]; - self.session = nil; - - [self.downloadQueue cancelAllOperations]; -} - -- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field { - LOCK(self.headersLock); - if (value) { - self.HTTPHeaders[field] = value; - } else { - [self.HTTPHeaders removeObjectForKey:field]; - } - UNLOCK(self.headersLock); -} - -- (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field { - if (!field) { - return nil; - } - return [[self allHTTPHeaderFields] objectForKey:field]; -} - -- (nonnull SDHTTPHeadersDictionary *)allHTTPHeaderFields { - LOCK(self.headersLock); - SDHTTPHeadersDictionary *allHTTPHeaderFields = [self.HTTPHeaders copy]; - UNLOCK(self.headersLock); - return allHTTPHeaderFields; -} - -- (void)setMaxConcurrentDownloads:(NSInteger)maxConcurrentDownloads { - _downloadQueue.maxConcurrentOperationCount = maxConcurrentDownloads; -} - -- (NSUInteger)currentDownloadCount { - return _downloadQueue.operationCount; -} - -- (NSInteger)maxConcurrentDownloads { - return _downloadQueue.maxConcurrentOperationCount; -} - -- (NSURLSessionConfiguration *)sessionConfiguration { - return self.session.configuration; -} - -- (void)setOperationClass:(nullable Class)operationClass { - if (operationClass && [operationClass isSubclassOfClass:[NSOperation class]] && [operationClass conformsToProtocol:@protocol(SDWebImageDownloaderOperationInterface)]) { - _operationClass = operationClass; - } else { - _operationClass = [SDWebImageDownloaderOperation class]; - } -} - -- (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url - options:(SDWebImageDownloaderOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { - __weak SDWebImageDownloader *wself = self; - - return [self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^SDWebImageDownloaderOperation *{ - __strong __typeof (wself) sself = wself; - NSTimeInterval timeoutInterval = sself.downloadTimeout; - if (timeoutInterval == 0.0) { - timeoutInterval = 15.0; - } - - // In order to prevent from potential duplicate caching (NSURLCache + SDImageCache) we disable the cache for image requests if told otherwise - NSURLRequestCachePolicy cachePolicy = options & SDWebImageDownloaderUseNSURLCache ? NSURLRequestUseProtocolCachePolicy : NSURLRequestReloadIgnoringLocalCacheData; - NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url - cachePolicy:cachePolicy - timeoutInterval:timeoutInterval]; - - request.HTTPShouldHandleCookies = (options & SDWebImageDownloaderHandleCookies); - request.HTTPShouldUsePipelining = YES; - if (sself.headersFilter) { - request.allHTTPHeaderFields = sself.headersFilter(url, [sself allHTTPHeaderFields]); - } - else { - request.allHTTPHeaderFields = [sself allHTTPHeaderFields]; - } - SDWebImageDownloaderOperation *operation = [[sself.operationClass alloc] initWithRequest:request inSession:sself.session options:options]; - operation.shouldDecompressImages = sself.shouldDecompressImages; - - if (sself.urlCredential) { - operation.credential = sself.urlCredential; - } else if (sself.username && sself.password) { - operation.credential = [NSURLCredential credentialWithUser:sself.username password:sself.password persistence:NSURLCredentialPersistenceForSession]; - } - - if (options & SDWebImageDownloaderHighPriority) { - operation.queuePriority = NSOperationQueuePriorityHigh; - } else if (options & SDWebImageDownloaderLowPriority) { - operation.queuePriority = NSOperationQueuePriorityLow; - } - - [sself.downloadQueue addOperation:operation]; - if (sself.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) { - // Emulate LIFO execution order by systematically adding new operations as last operation's dependency - [sself.lastAddedOperation addDependency:operation]; - sself.lastAddedOperation = operation; - } - - return operation; - }]; -} - -- (void)cancel:(nullable SDWebImageDownloadToken *)token { - NSURL *url = token.url; - if (!url) { - return; - } - LOCK(self.operationsLock); - SDWebImageDownloaderOperation *operation = [self.URLOperations objectForKey:url]; - if (operation) { - BOOL canceled = [operation cancel:token.downloadOperationCancelToken]; - if (canceled) { - [self.URLOperations removeObjectForKey:url]; - } - } - UNLOCK(self.operationsLock); -} - -- (nullable SDWebImageDownloadToken *)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock - completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock - forURL:(nullable NSURL *)url - createCallback:(SDWebImageDownloaderOperation *(^)(void))createCallback { - // The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data. - if (url == nil) { - if (completedBlock != nil) { - completedBlock(nil, nil, nil, NO); - } - return nil; - } - - LOCK(self.operationsLock); - SDWebImageDownloaderOperation *operation = [self.URLOperations objectForKey:url]; - if (!operation) { - operation = createCallback(); - __weak typeof(self) wself = self; - operation.completionBlock = ^{ - __strong typeof(wself) sself = wself; - if (!sself) { - return; - } - LOCK(sself.operationsLock); - [sself.URLOperations removeObjectForKey:url]; - UNLOCK(sself.operationsLock); - }; - [self.URLOperations setObject:operation forKey:url]; - } - UNLOCK(self.operationsLock); - - id downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock]; - - SDWebImageDownloadToken *token = [SDWebImageDownloadToken new]; - token.downloadOperation = operation; - token.url = url; - token.downloadOperationCancelToken = downloadOperationCancelToken; - - return token; -} - -- (void)setSuspended:(BOOL)suspended { - self.downloadQueue.suspended = suspended; -} - -- (void)cancelAllDownloads { - [self.downloadQueue cancelAllOperations]; -} - -#pragma mark Helper methods - -- (SDWebImageDownloaderOperation *)operationWithTask:(NSURLSessionTask *)task { - SDWebImageDownloaderOperation *returnOperation = nil; - for (SDWebImageDownloaderOperation *operation in self.downloadQueue.operations) { - if (operation.dataTask.taskIdentifier == task.taskIdentifier) { - returnOperation = operation; - break; - } - } - return returnOperation; -} - -#pragma mark NSURLSessionDataDelegate - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask -didReceiveResponse:(NSURLResponse *)response - completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { - - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; - if ([dataOperation respondsToSelector:@selector(URLSession:dataTask:didReceiveResponse:completionHandler:)]) { - [dataOperation URLSession:session dataTask:dataTask didReceiveResponse:response completionHandler:completionHandler]; - } else { - if (completionHandler) { - completionHandler(NSURLSessionResponseAllow); - } - } -} - -- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { - - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; - if ([dataOperation respondsToSelector:@selector(URLSession:dataTask:didReceiveData:)]) { - [dataOperation URLSession:session dataTask:dataTask didReceiveData:data]; - } -} - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask - willCacheResponse:(NSCachedURLResponse *)proposedResponse - completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { - - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; - if ([dataOperation respondsToSelector:@selector(URLSession:dataTask:willCacheResponse:completionHandler:)]) { - [dataOperation URLSession:session dataTask:dataTask willCacheResponse:proposedResponse completionHandler:completionHandler]; - } else { - if (completionHandler) { - completionHandler(proposedResponse); - } - } -} - -#pragma mark NSURLSessionTaskDelegate - -- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { - - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:task]; - if ([dataOperation respondsToSelector:@selector(URLSession:task:didCompleteWithError:)]) { - [dataOperation URLSession:session task:task didCompleteWithError:error]; - } -} - -- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler { - - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:task]; - if ([dataOperation respondsToSelector:@selector(URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:)]) { - [dataOperation URLSession:session task:task willPerformHTTPRedirection:response newRequest:request completionHandler:completionHandler]; - } else { - if (completionHandler) { - completionHandler(request); - } - } -} - -- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { - - // Identify the operation that runs this task and pass it the delegate method - SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:task]; - if ([dataOperation respondsToSelector:@selector(URLSession:task:didReceiveChallenge:completionHandler:)]) { - [dataOperation URLSession:session task:task didReceiveChallenge:challenge completionHandler:completionHandler]; - } else { - if (completionHandler) { - completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil); - } - } -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h b/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h deleted file mode 100644 index bb2dc7e31..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageDownloader.h" -#import "SDWebImageOperation.h" - -FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadStartNotification; -FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadReceiveResponseNotification; -FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadStopNotification; -FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageDownloadFinishNotification; - - - -/** - Describes a downloader operation. If one wants to use a custom downloader op, it needs to inherit from `NSOperation` and conform to this protocol - For the description about these methods, see `SDWebImageDownloaderOperation` - */ -@protocol SDWebImageDownloaderOperationInterface - -- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request - inSession:(nullable NSURLSession *)session - options:(SDWebImageDownloaderOptions)options; - -- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock; - -- (BOOL)shouldDecompressImages; -- (void)setShouldDecompressImages:(BOOL)value; - -- (nullable NSURLCredential *)credential; -- (void)setCredential:(nullable NSURLCredential *)value; - -- (BOOL)cancel:(nullable id)token; - -@end - - -@interface SDWebImageDownloaderOperation : NSOperation - -/** - * The request used by the operation's task. - */ -@property (strong, nonatomic, readonly, nullable) NSURLRequest *request; - -/** - * The operation's task - */ -@property (strong, nonatomic, readonly, nullable) NSURLSessionTask *dataTask; - - -@property (assign, nonatomic) BOOL shouldDecompressImages; - -/** - * Was used to determine whether the URL connection should consult the credential storage for authenticating the connection. - * @deprecated Not used for a couple of versions - */ -@property (nonatomic, assign) BOOL shouldUseCredentialStorage __deprecated_msg("Property deprecated. Does nothing. Kept only for backwards compatibility"); - -/** - * The credential used for authentication challenges in `-connection:didReceiveAuthenticationChallenge:`. - * - * This will be overridden by any shared credentials that exist for the username or password of the request URL, if present. - */ -@property (nonatomic, strong, nullable) NSURLCredential *credential; - -/** - * The SDWebImageDownloaderOptions for the receiver. - */ -@property (assign, nonatomic, readonly) SDWebImageDownloaderOptions options; - -/** - * The expected size of data. - */ -@property (assign, nonatomic) NSInteger expectedSize; - -/** - * The response returned by the operation's connection. - */ -@property (strong, nonatomic, nullable) NSURLResponse *response; - -/** - * Initializes a `SDWebImageDownloaderOperation` object - * - * @see SDWebImageDownloaderOperation - * - * @param request the URL request - * @param session the URL session in which this operation will run - * @param options downloader options - * - * @return the initialized instance - */ -- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request - inSession:(nullable NSURLSession *)session - options:(SDWebImageDownloaderOptions)options NS_DESIGNATED_INITIALIZER; - -/** - * Adds handlers for progress and completion. Returns a tokent that can be passed to -cancel: to cancel this set of - * callbacks. - * - * @param progressBlock the block executed when a new chunk of data arrives. - * @note the progress block is executed on a background queue - * @param completedBlock the block executed when the download is done. - * @note the completed block is executed on the main queue for success. If errors are found, there is a chance the block will be executed on a background queue - * - * @return the token to use to cancel this set of handlers - */ -- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock; - -/** - * Cancels a set of callbacks. Once all callbacks are canceled, the operation is cancelled. - * - * @param token the token representing a set of callbacks to cancel - * - * @return YES if the operation was stopped because this was the last token to be canceled. NO otherwise. - */ -- (BOOL)cancel:(nullable id)token; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m b/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m deleted file mode 100644 index 11ae0e2c8..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m +++ /dev/null @@ -1,488 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageDownloaderOperation.h" -#import "SDWebImageManager.h" -#import "NSImage+WebCache.h" -#import "SDWebImageCodersManager.h" - -NSString *const SDWebImageDownloadStartNotification = @"SDWebImageDownloadStartNotification"; -NSString *const SDWebImageDownloadReceiveResponseNotification = @"SDWebImageDownloadReceiveResponseNotification"; -NSString *const SDWebImageDownloadStopNotification = @"SDWebImageDownloadStopNotification"; -NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinishNotification"; - -static NSString *const kProgressCallbackKey = @"progress"; -static NSString *const kCompletedCallbackKey = @"completed"; - -typedef NSMutableDictionary SDCallbacksDictionary; - -@interface SDWebImageDownloaderOperation () - -@property (strong, nonatomic, nonnull) NSMutableArray *callbackBlocks; - -@property (assign, nonatomic, getter = isExecuting) BOOL executing; -@property (assign, nonatomic, getter = isFinished) BOOL finished; -@property (strong, nonatomic, nullable) NSMutableData *imageData; -@property (copy, nonatomic, nullable) NSData *cachedData; - -// This is weak because it is injected by whoever manages this session. If this gets nil-ed out, we won't be able to run -// the task associated with this operation -@property (weak, nonatomic, nullable) NSURLSession *unownedSession; -// This is set if we're using not using an injected NSURLSession. We're responsible of invalidating this one -@property (strong, nonatomic, nullable) NSURLSession *ownedSession; - -@property (strong, nonatomic, readwrite, nullable) NSURLSessionTask *dataTask; - -@property (strong, nonatomic, nullable) dispatch_queue_t barrierQueue; - -#if SD_UIKIT -@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId; -#endif - -@property (strong, nonatomic, nullable) id progressiveCoder; - -@end - -@implementation SDWebImageDownloaderOperation - -@synthesize executing = _executing; -@synthesize finished = _finished; - -- (nonnull instancetype)init { - return [self initWithRequest:nil inSession:nil options:0]; -} - -- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request - inSession:(nullable NSURLSession *)session - options:(SDWebImageDownloaderOptions)options { - if ((self = [super init])) { - _request = [request copy]; - _shouldDecompressImages = YES; - _options = options; - _callbackBlocks = [NSMutableArray new]; - _executing = NO; - _finished = NO; - _expectedSize = 0; - _unownedSession = session; - _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderOperationBarrierQueue", DISPATCH_QUEUE_CONCURRENT); - } - return self; -} - -- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { - SDCallbacksDictionary *callbacks = [NSMutableDictionary new]; - if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy]; - if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy]; - dispatch_barrier_async(self.barrierQueue, ^{ - [self.callbackBlocks addObject:callbacks]; - }); - return callbacks; -} - -- (nullable NSArray *)callbacksForKey:(NSString *)key { - __block NSMutableArray *callbacks = nil; - dispatch_sync(self.barrierQueue, ^{ - // We need to remove [NSNull null] because there might not always be a progress block for each callback - callbacks = [[self.callbackBlocks valueForKey:key] mutableCopy]; - [callbacks removeObjectIdenticalTo:[NSNull null]]; - }); - return [callbacks copy]; // strip mutability here -} - -- (BOOL)cancel:(nullable id)token { - __block BOOL shouldCancel = NO; - dispatch_barrier_sync(self.barrierQueue, ^{ - [self.callbackBlocks removeObjectIdenticalTo:token]; - if (self.callbackBlocks.count == 0) { - shouldCancel = YES; - } - }); - if (shouldCancel) { - [self cancel]; - } - return shouldCancel; -} - -- (void)start { - @synchronized (self) { - if (self.isCancelled) { - self.finished = YES; - [self reset]; - return; - } - -#if SD_UIKIT - Class UIApplicationClass = NSClassFromString(@"UIApplication"); - BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]; - if (hasApplication && [self shouldContinueWhenAppEntersBackground]) { - __weak __typeof__ (self) wself = self; - UIApplication * app = [UIApplicationClass performSelector:@selector(sharedApplication)]; - self.backgroundTaskId = [app beginBackgroundTaskWithExpirationHandler:^{ - __strong __typeof (wself) sself = wself; - - if (sself) { - [sself cancel]; - - [app endBackgroundTask:sself.backgroundTaskId]; - sself.backgroundTaskId = UIBackgroundTaskInvalid; - } - }]; - } -#endif - NSURLSession *session = self.unownedSession; - if (!self.unownedSession) { - NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; - sessionConfig.timeoutIntervalForRequest = 15; - - /** - * Create the session for this task - * We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate - * method calls and completion handler calls. - */ - self.ownedSession = [NSURLSession sessionWithConfiguration:sessionConfig - delegate:self - delegateQueue:nil]; - session = self.ownedSession; - } - - if (self.options & SDWebImageDownloaderIgnoreCachedResponse) { - // Grab the cached data for later check - NSURLCache *URLCache = session.configuration.URLCache; - if (!URLCache) { - URLCache = [NSURLCache sharedURLCache]; - } - NSCachedURLResponse *cachedResponse; - // NSURLCache's `cachedResponseForRequest:` is not thread-safe, see https://developer.apple.com/documentation/foundation/nsurlcache#2317483 - @synchronized (URLCache) { - cachedResponse = [URLCache cachedResponseForRequest:self.request]; - } - if (cachedResponse) { - self.cachedData = cachedResponse.data; - } - } - - self.dataTask = [session dataTaskWithRequest:self.request]; - self.executing = YES; - } - - [self.dataTask resume]; - - if (self.dataTask) { - for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { - progressBlock(0, NSURLResponseUnknownLength, self.request.URL); - } - __weak typeof(self) weakSelf = self; - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:weakSelf]; - }); - } else { - [self callCompletionBlocksWithError:[NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Task can't be initialized"}]]; - } - -#if SD_UIKIT - Class UIApplicationClass = NSClassFromString(@"UIApplication"); - if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { - return; - } - if (self.backgroundTaskId != UIBackgroundTaskInvalid) { - UIApplication * app = [UIApplication performSelector:@selector(sharedApplication)]; - [app endBackgroundTask:self.backgroundTaskId]; - self.backgroundTaskId = UIBackgroundTaskInvalid; - } -#endif -} - -- (void)cancel { - @synchronized (self) { - [self cancelInternal]; - } -} - -- (void)cancelInternal { - if (self.isFinished) return; - [super cancel]; - - if (self.dataTask) { - [self.dataTask cancel]; - __weak typeof(self) weakSelf = self; - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:weakSelf]; - }); - - // As we cancelled the task, its callback won't be called and thus won't - // maintain the isFinished and isExecuting flags. - if (self.isExecuting) self.executing = NO; - if (!self.isFinished) self.finished = YES; - } - - [self reset]; -} - -- (void)done { - self.finished = YES; - self.executing = NO; - [self reset]; -} - -- (void)reset { - __weak typeof(self) weakSelf = self; - dispatch_barrier_async(self.barrierQueue, ^{ - [weakSelf.callbackBlocks removeAllObjects]; - }); - self.dataTask = nil; - - NSOperationQueue *delegateQueue; - if (self.unownedSession) { - delegateQueue = self.unownedSession.delegateQueue; - } else { - delegateQueue = self.ownedSession.delegateQueue; - } - if (delegateQueue) { - NSAssert(delegateQueue.maxConcurrentOperationCount == 1, @"NSURLSession delegate queue should be a serial queue"); - [delegateQueue addOperationWithBlock:^{ - weakSelf.imageData = nil; - }]; - } - - if (self.ownedSession) { - [self.ownedSession invalidateAndCancel]; - self.ownedSession = nil; - } -} - -- (void)setFinished:(BOOL)finished { - [self willChangeValueForKey:@"isFinished"]; - _finished = finished; - [self didChangeValueForKey:@"isFinished"]; -} - -- (void)setExecuting:(BOOL)executing { - [self willChangeValueForKey:@"isExecuting"]; - _executing = executing; - [self didChangeValueForKey:@"isExecuting"]; -} - -- (BOOL)isConcurrent { - return YES; -} - -#pragma mark NSURLSessionDataDelegate - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask -didReceiveResponse:(NSURLResponse *)response - completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { - NSURLSessionResponseDisposition disposition = NSURLSessionResponseAllow; - NSInteger expected = (NSInteger)response.expectedContentLength; - expected = expected > 0 ? expected : 0; - self.expectedSize = expected; - self.response = response; - - //'304 Not Modified' is an exceptional one. It should be treated as cancelled. - if (![response respondsToSelector:@selector(statusCode)] || (((NSHTTPURLResponse *)response).statusCode < 400 && ((NSHTTPURLResponse *)response).statusCode != 304)) { - for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { - progressBlock(0, expected, self.request.URL); - } - } else { - // Status code invalid and marked as cancelled. Do not call `[self.dataTask cancel]` which may mass up URLSession life cycle - disposition = NSURLSessionResponseCancel; - } - - __weak typeof(self) weakSelf = self; - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadReceiveResponseNotification object:weakSelf]; - }); - - if (completionHandler) { - completionHandler(disposition); - } -} - -- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { - if (!self.imageData) { - self.imageData = [[NSMutableData alloc] initWithCapacity:self.expectedSize]; - } - [self.imageData appendData:data]; - - if ((self.options & SDWebImageDownloaderProgressiveDownload) && self.expectedSize > 0) { - // Get the image data - NSData *imageData = [self.imageData copy]; - // Get the total bytes downloaded - const NSInteger totalSize = imageData.length; - // Get the finish status - BOOL finished = (totalSize >= self.expectedSize); - - if (!self.progressiveCoder) { - // We need to create a new instance for progressive decoding to avoid conflicts - for (idcoder in [SDWebImageCodersManager sharedInstance].coders) { - if ([coder conformsToProtocol:@protocol(SDWebImageProgressiveCoder)] && - [((id)coder) canIncrementallyDecodeFromData:imageData]) { - self.progressiveCoder = [[[coder class] alloc] init]; - break; - } - } - } - - UIImage *image = [self.progressiveCoder incrementallyDecodedImageWithData:imageData finished:finished]; - if (image) { - NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; - image = [self scaledImageForKey:key image:image]; - if (self.shouldDecompressImages) { - image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&data options:@{SDWebImageCoderScaleDownLargeImagesKey: @(NO)}]; - } - - [self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO]; - } - } - - for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { - progressBlock(self.imageData.length, self.expectedSize, self.request.URL); - } -} - -- (void)URLSession:(NSURLSession *)session - dataTask:(NSURLSessionDataTask *)dataTask - willCacheResponse:(NSCachedURLResponse *)proposedResponse - completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { - - NSCachedURLResponse *cachedResponse = proposedResponse; - - if (!(self.options & SDWebImageDownloaderUseNSURLCache)) { - // Prevents caching of responses - cachedResponse = nil; - } - if (completionHandler) { - completionHandler(cachedResponse); - } -} - -#pragma mark NSURLSessionTaskDelegate - -- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { - @synchronized(self) { - self.dataTask = nil; - __weak typeof(self) weakSelf = self; - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:weakSelf]; - if (!error) { - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadFinishNotification object:weakSelf]; - } - }); - } - - if (error) { - [self callCompletionBlocksWithError:error]; - } else { - if ([self callbacksForKey:kCompletedCallbackKey].count > 0) { - /** - * If you specified to use `NSURLCache`, then the response you get here is what you need. - */ - NSData *imageData = [self.imageData copy]; - if (imageData) { - /** if you specified to only use cached data via `SDWebImageDownloaderIgnoreCachedResponse`, - * then we should check if the cached data is equal to image data - */ - if (self.options & SDWebImageDownloaderIgnoreCachedResponse && [self.cachedData isEqualToData:imageData]) { - // call completion block with nil - [self callCompletionBlocksWithImage:nil imageData:nil error:nil finished:YES]; - } else { - UIImage *image = [[SDWebImageCodersManager sharedInstance] decodedImageWithData:imageData]; - NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; - image = [self scaledImageForKey:key image:image]; - - BOOL shouldDecode = YES; - // Do not force decoding animated GIFs and WebPs - if (image.images) { - shouldDecode = NO; - } else { -#ifdef SD_WEBP - SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:imageData]; - if (imageFormat == SDImageFormatWebP) { - shouldDecode = NO; - } -#endif - } - - if (shouldDecode) { - if (self.shouldDecompressImages) { - BOOL shouldScaleDown = self.options & SDWebImageDownloaderScaleDownLargeImages; - image = [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&imageData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(shouldScaleDown)}]; - } - } - CGSize imageSize = image.size; - if (imageSize.width == 0 || imageSize.height == 0) { - [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}]]; - } else { - [self callCompletionBlocksWithImage:image imageData:imageData error:nil finished:YES]; - } - } - } else { - [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}]]; - } - } - } - [self done]; -} - -- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { - - NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; - __block NSURLCredential *credential = nil; - - if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { - if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates)) { - disposition = NSURLSessionAuthChallengePerformDefaultHandling; - } else { - credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; - disposition = NSURLSessionAuthChallengeUseCredential; - } - } else { - if (challenge.previousFailureCount == 0) { - if (self.credential) { - credential = self.credential; - disposition = NSURLSessionAuthChallengeUseCredential; - } else { - disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; - } - } else { - disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; - } - } - - if (completionHandler) { - completionHandler(disposition, credential); - } -} - -#pragma mark Helper methods -- (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable UIImage *)image { - return SDScaledImageForKey(key, image); -} - -- (BOOL)shouldContinueWhenAppEntersBackground { - return self.options & SDWebImageDownloaderContinueInBackground; -} - -- (void)callCompletionBlocksWithError:(nullable NSError *)error { - [self callCompletionBlocksWithImage:nil imageData:nil error:error finished:YES]; -} - -- (void)callCompletionBlocksWithImage:(nullable UIImage *)image - imageData:(nullable NSData *)imageData - error:(nullable NSError *)error - finished:(BOOL)finished { - NSArray *completionBlocks = [self callbacksForKey:kCompletedCallbackKey]; - dispatch_main_async_safe(^{ - for (SDWebImageDownloaderCompletedBlock completedBlock in completionBlocks) { - completedBlock(image, imageData, error, finished); - } - }); -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h b/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h deleted file mode 100644 index d8ba18120..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageFrame.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageCompat.h" - -@interface SDWebImageFrame : NSObject - -// This class is used for creating animated images via `animatedImageWithFrames` in `SDWebImageCoderHelper`. Attension if you need animated images loop count, use `sd_imageLoopCount` property in `UIImage+MultiFormat` - -/** - The image of current frame. You should not set an animated image. - */ -@property (nonatomic, strong, readonly, nonnull) UIImage *image; -/** - The duration of current frame to be displayed. The number is seconds but not milliseconds. You should not set this to zero. - */ -@property (nonatomic, readonly, assign) NSTimeInterval duration; - -/** - Create a frame instance with specify image and duration - - @param image current frame's image - @param duration current frame's duration - @return frame instance - */ -+ (instancetype _Nonnull)frameWithImage:(UIImage * _Nonnull)image duration:(NSTimeInterval)duration; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m b/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m deleted file mode 100644 index b0aefe54e..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageFrame.m +++ /dev/null @@ -1,28 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageFrame.h" - -@interface SDWebImageFrame () - -@property (nonatomic, strong, readwrite, nonnull) UIImage *image; -@property (nonatomic, readwrite, assign) NSTimeInterval duration; - -@end - -@implementation SDWebImageFrame - -+ (instancetype)frameWithImage:(UIImage *)image duration:(NSTimeInterval)duration { - SDWebImageFrame *frame = [[SDWebImageFrame alloc] init]; - frame.image = image; - frame.duration = duration; - - return frame; -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h b/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h deleted file mode 100644 index 30521f9e1..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageCoder.h" - -/** - Built in coder using ImageIO that supports GIF encoding/decoding - @note `SDWebImageIOCoder` supports GIF but only as static (will use the 1st frame). - @note Use `SDWebImageGIFCoder` for fully animated GIFs - less performant than `FLAnimatedImage` - @note If you decide to make all `UIImageView`(including `FLAnimatedImageView`) instance support GIF. You should add this coder to `SDWebImageCodersManager` and make sure that it has a higher priority than `SDWebImageIOCoder` - @note The recommended approach for animated GIFs is using `FLAnimatedImage`. It's more performant than `UIImageView` for GIF displaying - */ -@interface SDWebImageGIFCoder : NSObject - -+ (nonnull instancetype)sharedCoder; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m b/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m deleted file mode 100644 index e63afa040..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageGIFCoder.m +++ /dev/null @@ -1,179 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageGIFCoder.h" -#import "NSImage+WebCache.h" -#import -#import "NSData+ImageContentType.h" -#import "UIImage+MultiFormat.h" -#import "SDWebImageCoderHelper.h" - -@implementation SDWebImageGIFCoder - -+ (instancetype)sharedCoder { - static SDWebImageGIFCoder *coder; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - coder = [[SDWebImageGIFCoder alloc] init]; - }); - return coder; -} - -#pragma mark - Decode -- (BOOL)canDecodeFromData:(nullable NSData *)data { - return ([NSData sd_imageFormatForImageData:data] == SDImageFormatGIF); -} - -- (UIImage *)decodedImageWithData:(NSData *)data { - if (!data) { - return nil; - } - -#if SD_MAC - return [[UIImage alloc] initWithData:data]; -#else - - CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL); - if (!source) { - return nil; - } - size_t count = CGImageSourceGetCount(source); - - UIImage *animatedImage; - - if (count <= 1) { - animatedImage = [[UIImage alloc] initWithData:data]; - } else { - NSMutableArray *frames = [NSMutableArray array]; - - for (size_t i = 0; i < count; i++) { - CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, i, NULL); - if (!imageRef) { - continue; - } - - float duration = [self sd_frameDurationAtIndex:i source:source]; - UIImage *image = [[UIImage alloc] initWithCGImage:imageRef]; - CGImageRelease(imageRef); - - SDWebImageFrame *frame = [SDWebImageFrame frameWithImage:image duration:duration]; - [frames addObject:frame]; - } - - NSUInteger loopCount = 1; - NSDictionary *imageProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyProperties(source, nil); - NSDictionary *gifProperties = [imageProperties valueForKey:(__bridge_transfer NSString *)kCGImagePropertyGIFDictionary]; - if (gifProperties) { - NSNumber *gifLoopCount = [gifProperties valueForKey:(__bridge_transfer NSString *)kCGImagePropertyGIFLoopCount]; - if (gifLoopCount != nil) { - loopCount = gifLoopCount.unsignedIntegerValue; - } - } - - animatedImage = [SDWebImageCoderHelper animatedImageWithFrames:frames]; - animatedImage.sd_imageLoopCount = loopCount; - } - - CFRelease(source); - - return animatedImage; -#endif -} - -- (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source { - float frameDuration = 0.1f; - CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil); - if (!cfFrameProperties) { - return frameDuration; - } - NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties; - NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary]; - - NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime]; - if (delayTimeUnclampedProp != nil) { - frameDuration = [delayTimeUnclampedProp floatValue]; - } else { - NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime]; - if (delayTimeProp != nil) { - frameDuration = [delayTimeProp floatValue]; - } - } - - // Many annoying ads specify a 0 duration to make an image flash as quickly as possible. - // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify - // a duration of <= 10 ms. See and - // for more information. - - if (frameDuration < 0.011f) { - frameDuration = 0.100f; - } - - CFRelease(cfFrameProperties); - return frameDuration; -} - -- (UIImage *)decompressedImageWithImage:(UIImage *)image - data:(NSData *__autoreleasing _Nullable *)data - options:(nullable NSDictionary*)optionsDict { - // GIF do not decompress - return image; -} - -#pragma mark - Encode -- (BOOL)canEncodeToFormat:(SDImageFormat)format { - return (format == SDImageFormatGIF); -} - -- (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format { - if (!image) { - return nil; - } - - if (format != SDImageFormatGIF) { - return nil; - } - - NSMutableData *imageData = [NSMutableData data]; - CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:SDImageFormatGIF]; - NSArray *frames = [SDWebImageCoderHelper framesFromAnimatedImage:image]; - - // Create an image destination. GIF does not support EXIF image orientation - CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, frames.count, NULL); - if (!imageDestination) { - // Handle failure. - return nil; - } - if (frames.count == 0) { - // for static single GIF images - CGImageDestinationAddImage(imageDestination, image.CGImage, nil); - } else { - // for animated GIF images - NSUInteger loopCount = image.sd_imageLoopCount; - NSDictionary *gifProperties = @{(__bridge_transfer NSString *)kCGImagePropertyGIFDictionary: @{(__bridge_transfer NSString *)kCGImagePropertyGIFLoopCount : @(loopCount)}}; - CGImageDestinationSetProperties(imageDestination, (__bridge CFDictionaryRef)gifProperties); - - for (size_t i = 0; i < frames.count; i++) { - SDWebImageFrame *frame = frames[i]; - float frameDuration = frame.duration; - CGImageRef frameImageRef = frame.image.CGImage; - NSDictionary *frameProperties = @{(__bridge_transfer NSString *)kCGImagePropertyGIFDictionary : @{(__bridge_transfer NSString *)kCGImagePropertyGIFUnclampedDelayTime : @(frameDuration)}}; - CGImageDestinationAddImage(imageDestination, frameImageRef, (__bridge CFDictionaryRef)frameProperties); - } - } - // Finalize the destination. - if (CGImageDestinationFinalize(imageDestination) == NO) { - // Handle failure. - imageData = nil; - } - - CFRelease(imageDestination); - - return [imageData copy]; -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h b/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h deleted file mode 100644 index 04f68fb9f..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageCoder.h" - -/** - Built in coder that supports PNG, JPEG, TIFF, includes support for progressive decoding. - - GIF - Also supports static GIF (meaning will only handle the 1st frame). - For a full GIF support, we recommend `FLAnimatedImage` or our less performant `SDWebImageGIFCoder` - - HEIC - This coder also supports HEIC format because ImageIO supports it natively. But it depends on the system capabilities, so it won't work on all devices, see: https://devstreaming-cdn.apple.com/videos/wwdc/2017/511tj33587vdhds/511/511_working_with_heif_and_hevc.pdf - Decode(Software): !Simulator && (iOS 11 || tvOS 11 || macOS 10.13) - Decode(Hardware): !Simulator && ((iOS 11 && A9Chip) || (macOS 10.13 && 6thGenerationIntelCPU)) - Encode(Software): macOS 10.13 - Encode(Hardware): !Simulator && ((iOS 11 && A10FusionChip) || (macOS 10.13 && 6thGenerationIntelCPU)) - */ -@interface SDWebImageImageIOCoder : NSObject - -+ (nonnull instancetype)sharedCoder; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m b/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m deleted file mode 100644 index c2271c60b..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageImageIOCoder.m +++ /dev/null @@ -1,575 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageImageIOCoder.h" -#import "SDWebImageCoderHelper.h" -#import "NSImage+WebCache.h" -#import -#import "NSData+ImageContentType.h" - -#if SD_UIKIT || SD_WATCH -static const size_t kBytesPerPixel = 4; -static const size_t kBitsPerComponent = 8; - -/* - * Defines the maximum size in MB of the decoded image when the flag `SDWebImageScaleDownLargeImages` is set - * Suggested value for iPad1 and iPhone 3GS: 60. - * Suggested value for iPad2 and iPhone 4: 120. - * Suggested value for iPhone 3G and iPod 2 and earlier devices: 30. - */ -static const CGFloat kDestImageSizeMB = 60.0f; - -/* - * Defines the maximum size in MB of a tile used to decode image when the flag `SDWebImageScaleDownLargeImages` is set - * Suggested value for iPad1 and iPhone 3GS: 20. - * Suggested value for iPad2 and iPhone 4: 40. - * Suggested value for iPhone 3G and iPod 2 and earlier devices: 10. - */ -static const CGFloat kSourceImageTileSizeMB = 20.0f; - -static const CGFloat kBytesPerMB = 1024.0f * 1024.0f; -static const CGFloat kPixelsPerMB = kBytesPerMB / kBytesPerPixel; -static const CGFloat kDestTotalPixels = kDestImageSizeMB * kPixelsPerMB; -static const CGFloat kTileTotalPixels = kSourceImageTileSizeMB * kPixelsPerMB; - -static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to overlap the seems where tiles meet. -#endif - -@implementation SDWebImageImageIOCoder { - size_t _width, _height; -#if SD_UIKIT || SD_WATCH - UIImageOrientation _orientation; -#endif - CGImageSourceRef _imageSource; -} - -- (void)dealloc { - if (_imageSource) { - CFRelease(_imageSource); - _imageSource = NULL; - } -} - -+ (instancetype)sharedCoder { - static SDWebImageImageIOCoder *coder; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - coder = [[SDWebImageImageIOCoder alloc] init]; - }); - return coder; -} - -#pragma mark - Decode -- (BOOL)canDecodeFromData:(nullable NSData *)data { - switch ([NSData sd_imageFormatForImageData:data]) { - case SDImageFormatWebP: - // Do not support WebP decoding - return NO; - case SDImageFormatHEIC: - // Check HEIC decoding compatibility - return [[self class] canDecodeFromHEICFormat]; - default: - return YES; - } -} - -- (BOOL)canIncrementallyDecodeFromData:(NSData *)data { - switch ([NSData sd_imageFormatForImageData:data]) { - case SDImageFormatWebP: - // Do not support WebP progressive decoding - return NO; - case SDImageFormatHEIC: - // Check HEIC decoding compatibility - return [[self class] canDecodeFromHEICFormat]; - default: - return YES; - } -} - -- (UIImage *)decodedImageWithData:(NSData *)data { - if (!data) { - return nil; - } - - UIImage *image = [[UIImage alloc] initWithData:data]; - -#if SD_MAC - return image; -#else - if (!image) { - return nil; - } - - UIImageOrientation orientation = [[self class] sd_imageOrientationFromImageData:data]; - if (orientation != UIImageOrientationUp) { - image = [[UIImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:orientation]; - } - - return image; -#endif -} - -- (UIImage *)incrementallyDecodedImageWithData:(NSData *)data finished:(BOOL)finished { - if (!_imageSource) { - _imageSource = CGImageSourceCreateIncremental(NULL); - } - UIImage *image; - - // The following code is from http://www.cocoaintheshell.com/2011/05/progressive-images-download-imageio/ - // Thanks to the author @Nyx0uf - - // Update the data source, we must pass ALL the data, not just the new bytes - CGImageSourceUpdateData(_imageSource, (__bridge CFDataRef)data, finished); - - if (_width + _height == 0) { - CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(_imageSource, 0, NULL); - if (properties) { - NSInteger orientationValue = 1; - CFTypeRef val = CFDictionaryGetValue(properties, kCGImagePropertyPixelHeight); - if (val) CFNumberGetValue(val, kCFNumberLongType, &_height); - val = CFDictionaryGetValue(properties, kCGImagePropertyPixelWidth); - if (val) CFNumberGetValue(val, kCFNumberLongType, &_width); - val = CFDictionaryGetValue(properties, kCGImagePropertyOrientation); - if (val) CFNumberGetValue(val, kCFNumberNSIntegerType, &orientationValue); - CFRelease(properties); - - // When we draw to Core Graphics, we lose orientation information, - // which means the image below born of initWithCGIImage will be - // oriented incorrectly sometimes. (Unlike the image born of initWithData - // in didCompleteWithError.) So save it here and pass it on later. -#if SD_UIKIT || SD_WATCH - _orientation = [SDWebImageCoderHelper imageOrientationFromEXIFOrientation:orientationValue]; -#endif - } - } - - if (_width + _height > 0) { - // Create the image - CGImageRef partialImageRef = CGImageSourceCreateImageAtIndex(_imageSource, 0, NULL); - -#if SD_UIKIT || SD_WATCH - // Workaround for iOS anamorphic image - if (partialImageRef) { - const size_t partialHeight = CGImageGetHeight(partialImageRef); - CGColorSpaceRef colorSpace = SDCGColorSpaceGetDeviceRGB(); - CGContextRef bmContext = CGBitmapContextCreate(NULL, _width, _height, 8, 0, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst); - if (bmContext) { - CGContextDrawImage(bmContext, (CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = _width, .size.height = partialHeight}, partialImageRef); - CGImageRelease(partialImageRef); - partialImageRef = CGBitmapContextCreateImage(bmContext); - CGContextRelease(bmContext); - } - else { - CGImageRelease(partialImageRef); - partialImageRef = nil; - } - } -#endif - - if (partialImageRef) { -#if SD_UIKIT || SD_WATCH - image = [[UIImage alloc] initWithCGImage:partialImageRef scale:1 orientation:_orientation]; -#elif SD_MAC - image = [[UIImage alloc] initWithCGImage:partialImageRef size:NSZeroSize]; -#endif - CGImageRelease(partialImageRef); - } - } - - if (finished) { - if (_imageSource) { - CFRelease(_imageSource); - _imageSource = NULL; - } - } - - return image; -} - -- (UIImage *)decompressedImageWithImage:(UIImage *)image - data:(NSData *__autoreleasing _Nullable *)data - options:(nullable NSDictionary*)optionsDict { -#if SD_MAC - return image; -#endif -#if SD_UIKIT || SD_WATCH - BOOL shouldScaleDown = NO; - if (optionsDict != nil) { - NSNumber *scaleDownLargeImagesOption = nil; - if ([optionsDict[SDWebImageCoderScaleDownLargeImagesKey] isKindOfClass:[NSNumber class]]) { - scaleDownLargeImagesOption = (NSNumber *)optionsDict[SDWebImageCoderScaleDownLargeImagesKey]; - } - if (scaleDownLargeImagesOption != nil) { - shouldScaleDown = [scaleDownLargeImagesOption boolValue]; - } - } - if (!shouldScaleDown) { - return [self sd_decompressedImageWithImage:image]; - } else { - UIImage *scaledDownImage = [self sd_decompressedAndScaledDownImageWithImage:image]; - if (scaledDownImage && !CGSizeEqualToSize(scaledDownImage.size, image.size)) { - // if the image is scaled down, need to modify the data pointer as well - SDImageFormat format = [NSData sd_imageFormatForImageData:*data]; - NSData *imageData = [self encodedDataWithImage:scaledDownImage format:format]; - if (imageData) { - *data = imageData; - } - } - return scaledDownImage; - } -#endif -} - -#if SD_UIKIT || SD_WATCH -- (nullable UIImage *)sd_decompressedImageWithImage:(nullable UIImage *)image { - if (![[self class] shouldDecodeImage:image]) { - return image; - } - - // autorelease the bitmap context and all vars to help system to free memory when there are memory warning. - // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory]; - @autoreleasepool{ - - CGImageRef imageRef = image.CGImage; - CGColorSpaceRef colorspaceRef = [[self class] colorSpaceForImageRef:imageRef]; - - size_t width = CGImageGetWidth(imageRef); - size_t height = CGImageGetHeight(imageRef); - - // kCGImageAlphaNone is not supported in CGBitmapContextCreate. - // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast - // to create bitmap graphics contexts without alpha info. - CGContextRef context = CGBitmapContextCreate(NULL, - width, - height, - kBitsPerComponent, - 0, - colorspaceRef, - kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast); - if (context == NULL) { - return image; - } - - // Draw the image into the context and retrieve the new bitmap image without alpha - CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); - CGImageRef imageRefWithoutAlpha = CGBitmapContextCreateImage(context); - UIImage *imageWithoutAlpha = [[UIImage alloc] initWithCGImage:imageRefWithoutAlpha scale:image.scale orientation:image.imageOrientation]; - CGContextRelease(context); - CGImageRelease(imageRefWithoutAlpha); - - return imageWithoutAlpha; - } -} - -- (nullable UIImage *)sd_decompressedAndScaledDownImageWithImage:(nullable UIImage *)image { - if (![[self class] shouldDecodeImage:image]) { - return image; - } - - if (![[self class] shouldScaleDownImage:image]) { - return [self sd_decompressedImageWithImage:image]; - } - - CGContextRef destContext; - - // autorelease the bitmap context and all vars to help system to free memory when there are memory warning. - // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory]; - @autoreleasepool { - CGImageRef sourceImageRef = image.CGImage; - - CGSize sourceResolution = CGSizeZero; - sourceResolution.width = CGImageGetWidth(sourceImageRef); - sourceResolution.height = CGImageGetHeight(sourceImageRef); - float sourceTotalPixels = sourceResolution.width * sourceResolution.height; - // Determine the scale ratio to apply to the input image - // that results in an output image of the defined size. - // see kDestImageSizeMB, and how it relates to destTotalPixels. - float imageScale = kDestTotalPixels / sourceTotalPixels; - CGSize destResolution = CGSizeZero; - destResolution.width = (int)(sourceResolution.width*imageScale); - destResolution.height = (int)(sourceResolution.height*imageScale); - - // current color space - CGColorSpaceRef colorspaceRef = [[self class] colorSpaceForImageRef:sourceImageRef]; - - // kCGImageAlphaNone is not supported in CGBitmapContextCreate. - // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast - // to create bitmap graphics contexts without alpha info. - destContext = CGBitmapContextCreate(NULL, - destResolution.width, - destResolution.height, - kBitsPerComponent, - 0, - colorspaceRef, - kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast); - - if (destContext == NULL) { - return image; - } - CGContextSetInterpolationQuality(destContext, kCGInterpolationHigh); - - // Now define the size of the rectangle to be used for the - // incremental blits from the input image to the output image. - // we use a source tile width equal to the width of the source - // image due to the way that iOS retrieves image data from disk. - // iOS must decode an image from disk in full width 'bands', even - // if current graphics context is clipped to a subrect within that - // band. Therefore we fully utilize all of the pixel data that results - // from a decoding opertion by achnoring our tile size to the full - // width of the input image. - CGRect sourceTile = CGRectZero; - sourceTile.size.width = sourceResolution.width; - // The source tile height is dynamic. Since we specified the size - // of the source tile in MB, see how many rows of pixels high it - // can be given the input image width. - sourceTile.size.height = (int)(kTileTotalPixels / sourceTile.size.width ); - sourceTile.origin.x = 0.0f; - // The output tile is the same proportions as the input tile, but - // scaled to image scale. - CGRect destTile; - destTile.size.width = destResolution.width; - destTile.size.height = sourceTile.size.height * imageScale; - destTile.origin.x = 0.0f; - // The source seem overlap is proportionate to the destination seem overlap. - // this is the amount of pixels to overlap each tile as we assemble the ouput image. - float sourceSeemOverlap = (int)((kDestSeemOverlap/destResolution.height)*sourceResolution.height); - CGImageRef sourceTileImageRef; - // calculate the number of read/write operations required to assemble the - // output image. - int iterations = (int)( sourceResolution.height / sourceTile.size.height ); - // If tile height doesn't divide the image height evenly, add another iteration - // to account for the remaining pixels. - int remainder = (int)sourceResolution.height % (int)sourceTile.size.height; - if(remainder) { - iterations++; - } - // Add seem overlaps to the tiles, but save the original tile height for y coordinate calculations. - float sourceTileHeightMinusOverlap = sourceTile.size.height; - sourceTile.size.height += sourceSeemOverlap; - destTile.size.height += kDestSeemOverlap; - for( int y = 0; y < iterations; ++y ) { - @autoreleasepool { - sourceTile.origin.y = y * sourceTileHeightMinusOverlap + sourceSeemOverlap; - destTile.origin.y = destResolution.height - (( y + 1 ) * sourceTileHeightMinusOverlap * imageScale + kDestSeemOverlap); - sourceTileImageRef = CGImageCreateWithImageInRect( sourceImageRef, sourceTile ); - if( y == iterations - 1 && remainder ) { - float dify = destTile.size.height; - destTile.size.height = CGImageGetHeight( sourceTileImageRef ) * imageScale; - dify -= destTile.size.height; - destTile.origin.y += dify; - } - CGContextDrawImage( destContext, destTile, sourceTileImageRef ); - CGImageRelease( sourceTileImageRef ); - } - } - - CGImageRef destImageRef = CGBitmapContextCreateImage(destContext); - CGContextRelease(destContext); - if (destImageRef == NULL) { - return image; - } - UIImage *destImage = [[UIImage alloc] initWithCGImage:destImageRef scale:image.scale orientation:image.imageOrientation]; - CGImageRelease(destImageRef); - if (destImage == nil) { - return image; - } - return destImage; - } -} -#endif - -#pragma mark - Encode -- (BOOL)canEncodeToFormat:(SDImageFormat)format { - switch (format) { - case SDImageFormatWebP: - // Do not support WebP encoding - return NO; - case SDImageFormatHEIC: - // Check HEIC encoding compatibility - return [[self class] canEncodeToHEICFormat]; - default: - return YES; - } -} - -- (NSData *)encodedDataWithImage:(UIImage *)image format:(SDImageFormat)format { - if (!image) { - return nil; - } - - if (format == SDImageFormatUndefined) { - BOOL hasAlpha = SDCGImageRefContainsAlpha(image.CGImage); - if (hasAlpha) { - format = SDImageFormatPNG; - } else { - format = SDImageFormatJPEG; - } - } - - NSMutableData *imageData = [NSMutableData data]; - CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:format]; - - // Create an image destination. - CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, 1, NULL); - if (!imageDestination) { - // Handle failure. - return nil; - } - - NSMutableDictionary *properties = [NSMutableDictionary dictionary]; -#if SD_UIKIT || SD_WATCH - NSInteger exifOrientation = [SDWebImageCoderHelper exifOrientationFromImageOrientation:image.imageOrientation]; - [properties setValue:@(exifOrientation) forKey:(__bridge_transfer NSString *)kCGImagePropertyOrientation]; -#endif - - // Add your image to the destination. - CGImageDestinationAddImage(imageDestination, image.CGImage, (__bridge CFDictionaryRef)properties); - - // Finalize the destination. - if (CGImageDestinationFinalize(imageDestination) == NO) { - // Handle failure. - imageData = nil; - } - - CFRelease(imageDestination); - - return [imageData copy]; -} - -#pragma mark - Helper -+ (BOOL)shouldDecodeImage:(nullable UIImage *)image { - // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error - if (image == nil) { - return NO; - } - - // do not decode animated images - if (image.images != nil) { - return NO; - } - - CGImageRef imageRef = image.CGImage; - - BOOL hasAlpha = SDCGImageRefContainsAlpha(imageRef); - // do not decode images with alpha - if (hasAlpha) { - return NO; - } - - return YES; -} - -+ (BOOL)canDecodeFromHEICFormat { - static BOOL canDecode = NO; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ -#if TARGET_OS_SIMULATOR || SD_WATCH - canDecode = NO; -#elif SD_MAC - NSProcessInfo *processInfo = [NSProcessInfo processInfo]; - if ([processInfo respondsToSelector:@selector(operatingSystemVersion)]) { - // macOS 10.13+ - canDecode = processInfo.operatingSystemVersion.minorVersion >= 13; - } else { - canDecode = NO; - } -#elif SD_UIKIT - NSProcessInfo *processInfo = [NSProcessInfo processInfo]; - if ([processInfo respondsToSelector:@selector(operatingSystemVersion)]) { - // iOS 11+ && tvOS 11+ - canDecode = processInfo.operatingSystemVersion.majorVersion >= 11; - } else { - canDecode = NO; - } -#endif - }); - return canDecode; -} - -+ (BOOL)canEncodeToHEICFormat { - static BOOL canEncode = NO; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSMutableData *imageData = [NSMutableData data]; - CFStringRef imageUTType = [NSData sd_UTTypeFromSDImageFormat:SDImageFormatHEIC]; - - // Create an image destination. - CGImageDestinationRef imageDestination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, imageUTType, 1, NULL); - if (!imageDestination) { - // Can't encode to HEIC - canEncode = NO; - } else { - // Can encode to HEIC - CFRelease(imageDestination); - canEncode = YES; - } - }); - return canEncode; -} - -#if SD_UIKIT || SD_WATCH -#pragma mark EXIF orientation tag converter -+ (UIImageOrientation)sd_imageOrientationFromImageData:(nonnull NSData *)imageData { - UIImageOrientation result = UIImageOrientationUp; - CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); - if (imageSource) { - CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL); - if (properties) { - CFTypeRef val; - NSInteger exifOrientation; - val = CFDictionaryGetValue(properties, kCGImagePropertyOrientation); - if (val) { - CFNumberGetValue(val, kCFNumberNSIntegerType, &exifOrientation); - result = [SDWebImageCoderHelper imageOrientationFromEXIFOrientation:exifOrientation]; - } // else - if it's not set it remains at up - CFRelease((CFTypeRef) properties); - } else { - //NSLog(@"NO PROPERTIES, FAIL"); - } - CFRelease(imageSource); - } - return result; -} -#endif - -#if SD_UIKIT || SD_WATCH -+ (BOOL)shouldScaleDownImage:(nonnull UIImage *)image { - BOOL shouldScaleDown = YES; - - CGImageRef sourceImageRef = image.CGImage; - CGSize sourceResolution = CGSizeZero; - sourceResolution.width = CGImageGetWidth(sourceImageRef); - sourceResolution.height = CGImageGetHeight(sourceImageRef); - float sourceTotalPixels = sourceResolution.width * sourceResolution.height; - float imageScale = kDestTotalPixels / sourceTotalPixels; - if (imageScale < 1) { - shouldScaleDown = YES; - } else { - shouldScaleDown = NO; - } - - return shouldScaleDown; -} - -+ (CGColorSpaceRef)colorSpaceForImageRef:(CGImageRef)imageRef { - // current - CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(CGImageGetColorSpace(imageRef)); - CGColorSpaceRef colorspaceRef = CGImageGetColorSpace(imageRef); - - BOOL unsupportedColorSpace = (imageColorSpaceModel == kCGColorSpaceModelUnknown || - imageColorSpaceModel == kCGColorSpaceModelMonochrome || - imageColorSpaceModel == kCGColorSpaceModelCMYK || - imageColorSpaceModel == kCGColorSpaceModelIndexed); - if (unsupportedColorSpace) { - colorspaceRef = SDCGColorSpaceGetDeviceRGB(); - } - return colorspaceRef; -} -#endif - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageManager.h b/Pods/SDWebImage/SDWebImage/SDWebImageManager.h deleted file mode 100644 index 508042ec7..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageManager.h +++ /dev/null @@ -1,296 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" -#import "SDWebImageOperation.h" -#import "SDWebImageDownloader.h" -#import "SDImageCache.h" - -typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { - /** - * By default, when a URL fail to be downloaded, the URL is blacklisted so the library won't keep trying. - * This flag disable this blacklisting. - */ - SDWebImageRetryFailed = 1 << 0, - - /** - * By default, image downloads are started during UI interactions, this flags disable this feature, - * leading to delayed download on UIScrollView deceleration for instance. - */ - SDWebImageLowPriority = 1 << 1, - - /** - * This flag disables on-disk caching after the download finished, only cache in memory - */ - SDWebImageCacheMemoryOnly = 1 << 2, - - /** - * This flag enables progressive download, the image is displayed progressively during download as a browser would do. - * By default, the image is only displayed once completely downloaded. - */ - SDWebImageProgressiveDownload = 1 << 3, - - /** - * Even if the image is cached, respect the HTTP response cache control, and refresh the image from remote location if needed. - * The disk caching will be handled by NSURLCache instead of SDWebImage leading to slight performance degradation. - * This option helps deal with images changing behind the same request URL, e.g. Facebook graph api profile pics. - * If a cached image is refreshed, the completion block is called once with the cached image and again with the final image. - * - * Use this flag only if you can't make your URLs static with embedded cache busting parameter. - */ - SDWebImageRefreshCached = 1 << 4, - - /** - * In iOS 4+, continue the download of the image if the app goes to background. This is achieved by asking the system for - * extra time in background to let the request finish. If the background task expires the operation will be cancelled. - */ - SDWebImageContinueInBackground = 1 << 5, - - /** - * Handles cookies stored in NSHTTPCookieStore by setting - * NSMutableURLRequest.HTTPShouldHandleCookies = YES; - */ - SDWebImageHandleCookies = 1 << 6, - - /** - * Enable to allow untrusted SSL certificates. - * Useful for testing purposes. Use with caution in production. - */ - SDWebImageAllowInvalidSSLCertificates = 1 << 7, - - /** - * By default, images are loaded in the order in which they were queued. This flag moves them to - * the front of the queue. - */ - SDWebImageHighPriority = 1 << 8, - - /** - * By default, placeholder images are loaded while the image is loading. This flag will delay the loading - * of the placeholder image until after the image has finished loading. - */ - SDWebImageDelayPlaceholder = 1 << 9, - - /** - * We usually don't call transformDownloadedImage delegate method on animated images, - * as most transformation code would mangle it. - * Use this flag to transform them anyway. - */ - SDWebImageTransformAnimatedImage = 1 << 10, - - /** - * By default, image is added to the imageView after download. But in some cases, we want to - * have the hand before setting the image (apply a filter or add it with cross-fade animation for instance) - * Use this flag if you want to manually set the image in the completion when success - */ - SDWebImageAvoidAutoSetImage = 1 << 11, - - /** - * By default, images are decoded respecting their original size. On iOS, this flag will scale down the - * images to a size compatible with the constrained memory of devices. - * If `SDWebImageProgressiveDownload` flag is set the scale down is deactivated. - */ - SDWebImageScaleDownLargeImages = 1 << 12, - - /** - * By default, we do not query disk data when the image is cached in memory. This mask can force to query disk data at the same time. - * This flag is recommend to be used with `SDWebImageQueryDiskSync` to ensure the image is loaded in the same runloop. - */ - SDWebImageQueryDataWhenInMemory = 1 << 13, - - /** - * By default, we query the memory cache synchronously, disk cache asynchronously. This mask can force to query disk cache synchronously to ensure that image is loaded in the same runloop. - * This flag can avoid flashing during cell reuse if you disable memory cache or in some other cases. - */ - SDWebImageQueryDiskSync = 1 << 14, - - /** - * By default, when the cache missed, the image is download from the network. This flag can prevent network to load from cache only. - */ - SDWebImageFromCacheOnly = 1 << 15, - /** - * By default, when you use `SDWebImageTransition` to do some view transition after the image load finished, this transition is only applied for image download from the network. This mask can force to apply view transition for memory and disk cache as well. - */ - SDWebImageForceTransition = 1 << 16 -}; - -typedef void(^SDExternalCompletionBlock)(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL); - -typedef void(^SDInternalCompletionBlock)(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL); - -typedef NSString * _Nullable (^SDWebImageCacheKeyFilterBlock)(NSURL * _Nullable url); - - -@class SDWebImageManager; - -@protocol SDWebImageManagerDelegate - -@optional - -/** - * Controls which image should be downloaded when the image is not found in the cache. - * - * @param imageManager The current `SDWebImageManager` - * @param imageURL The url of the image to be downloaded - * - * @return Return NO to prevent the downloading of the image on cache misses. If not implemented, YES is implied. - */ -- (BOOL)imageManager:(nonnull SDWebImageManager *)imageManager shouldDownloadImageForURL:(nullable NSURL *)imageURL; - -/** - * Allows to transform the image immediately after it has been downloaded and just before to cache it on disk and memory. - * NOTE: This method is called from a global queue in order to not to block the main thread. - * - * @param imageManager The current `SDWebImageManager` - * @param image The image to transform - * @param imageURL The url of the image to transform - * - * @return The transformed image object. - */ -- (nullable UIImage *)imageManager:(nonnull SDWebImageManager *)imageManager transformDownloadedImage:(nullable UIImage *)image withURL:(nullable NSURL *)imageURL; - -@end - -/** - * The SDWebImageManager is the class behind the UIImageView+WebCache category and likes. - * It ties the asynchronous downloader (SDWebImageDownloader) with the image cache store (SDImageCache). - * You can use this class directly to benefit from web image downloading with caching in another context than - * a UIView. - * - * Here is a simple example of how to use SDWebImageManager: - * - * @code - -SDWebImageManager *manager = [SDWebImageManager sharedManager]; -[manager loadImageWithURL:imageURL - options:0 - progress:nil - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (image) { - // do something with image - } - }]; - - * @endcode - */ -@interface SDWebImageManager : NSObject - -@property (weak, nonatomic, nullable) id delegate; - -@property (strong, nonatomic, readonly, nullable) SDImageCache *imageCache; -@property (strong, nonatomic, readonly, nullable) SDWebImageDownloader *imageDownloader; - -/** - * The cache filter is a block used each time SDWebImageManager need to convert an URL into a cache key. This can - * be used to remove dynamic part of an image URL. - * - * The following example sets a filter in the application delegate that will remove any query-string from the - * URL before to use it as a cache key: - * - * @code - -[[SDWebImageManager sharedManager] setCacheKeyFilter:^(NSURL *url) { - url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; - return [url absoluteString]; -}]; - - * @endcode - */ -@property (nonatomic, copy, nullable) SDWebImageCacheKeyFilterBlock cacheKeyFilter; - -/** - * Returns global SDWebImageManager instance. - * - * @return SDWebImageManager shared instance - */ -+ (nonnull instancetype)sharedManager; - -/** - * Allows to specify instance of cache and image downloader used with image manager. - * @return new instance of `SDWebImageManager` with specified cache and downloader. - */ -- (nonnull instancetype)initWithCache:(nonnull SDImageCache *)cache downloader:(nonnull SDWebImageDownloader *)downloader NS_DESIGNATED_INITIALIZER; - -/** - * Downloads the image at the given URL if not present in cache or return the cached version otherwise. - * - * @param url The URL to the image - * @param options A mask to specify options to use for this request - * @param progressBlock A block called while image is downloading - * @note the progress block is executed on a background queue - * @param completedBlock A block called when operation has been completed. - * - * This parameter is required. - * - * This block has no return value and takes the requested UIImage as first parameter and the NSData representation as second parameter. - * In case of error the image parameter is nil and the third parameter may contain an NSError. - * - * The forth parameter is an `SDImageCacheType` enum indicating if the image was retrieved from the local cache - * or from the memory cache or from the network. - * - * The fith parameter is set to NO when the SDWebImageProgressiveDownload option is used and the image is - * downloading. This block is thus called repeatedly with a partial image. When image is fully downloaded, the - * block is called a last time with the full image and the last parameter set to YES. - * - * The last parameter is the original image URL - * - * @return Returns an NSObject conforming to SDWebImageOperation. Should be an instance of SDWebImageDownloaderOperation - */ -- (nullable id )loadImageWithURL:(nullable NSURL *)url - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDInternalCompletionBlock)completedBlock; - -/** - * Saves image to cache for given URL - * - * @param image The image to cache - * @param url The URL to the image - * - */ - -- (void)saveImageToCache:(nullable UIImage *)image forURL:(nullable NSURL *)url; - -/** - * Cancel all current operations - */ -- (void)cancelAll; - -/** - * Check one or more operations running - */ -- (BOOL)isRunning; - -/** - * Async check if image has already been cached - * - * @param url image url - * @param completionBlock the block to be executed when the check is finished - * - * @note the completion block is always executed on the main queue - */ -- (void)cachedImageExistsForURL:(nullable NSURL *)url - completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; - -/** - * Async check if image has already been cached on disk only - * - * @param url image url - * @param completionBlock the block to be executed when the check is finished - * - * @note the completion block is always executed on the main queue - */ -- (void)diskImageExistsForURL:(nullable NSURL *)url - completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; - - -/** - *Return the cache key for a given URL - */ -- (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageManager.m b/Pods/SDWebImage/SDWebImage/SDWebImageManager.m deleted file mode 100644 index 674b88caa..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageManager.m +++ /dev/null @@ -1,338 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageManager.h" -#import "NSImage+WebCache.h" -#import - -@interface SDWebImageCombinedOperation : NSObject - -@property (assign, nonatomic, getter = isCancelled) BOOL cancelled; -@property (strong, nonatomic, nullable) SDWebImageDownloadToken *downloadToken; -@property (strong, nonatomic, nullable) NSOperation *cacheOperation; -@property (weak, nonatomic, nullable) SDWebImageManager *manager; - -@end - -@interface SDWebImageManager () - -@property (strong, nonatomic, readwrite, nonnull) SDImageCache *imageCache; -@property (strong, nonatomic, readwrite, nonnull) SDWebImageDownloader *imageDownloader; -@property (strong, nonatomic, nonnull) NSMutableSet *failedURLs; -@property (strong, nonatomic, nonnull) NSMutableArray *runningOperations; - -@end - -@implementation SDWebImageManager - -+ (nonnull instancetype)sharedManager { - static dispatch_once_t once; - static id instance; - dispatch_once(&once, ^{ - instance = [self new]; - }); - return instance; -} - -- (nonnull instancetype)init { - SDImageCache *cache = [SDImageCache sharedImageCache]; - SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader]; - return [self initWithCache:cache downloader:downloader]; -} - -- (nonnull instancetype)initWithCache:(nonnull SDImageCache *)cache downloader:(nonnull SDWebImageDownloader *)downloader { - if ((self = [super init])) { - _imageCache = cache; - _imageDownloader = downloader; - _failedURLs = [NSMutableSet new]; - _runningOperations = [NSMutableArray new]; - } - return self; -} - -- (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url { - if (!url) { - return @""; - } - - if (self.cacheKeyFilter) { - return self.cacheKeyFilter(url); - } else { - return url.absoluteString; - } -} - -- (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable UIImage *)image { - return SDScaledImageForKey(key, image); -} - -- (void)cachedImageExistsForURL:(nullable NSURL *)url - completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { - NSString *key = [self cacheKeyForURL:url]; - - BOOL isInMemoryCache = ([self.imageCache imageFromMemoryCacheForKey:key] != nil); - - if (isInMemoryCache) { - // making sure we call the completion block on the main queue - dispatch_async(dispatch_get_main_queue(), ^{ - if (completionBlock) { - completionBlock(YES); - } - }); - return; - } - - [self.imageCache diskImageExistsWithKey:key completion:^(BOOL isInDiskCache) { - // the completion block of checkDiskCacheForImageWithKey:completion: is always called on the main queue, no need to further dispatch - if (completionBlock) { - completionBlock(isInDiskCache); - } - }]; -} - -- (void)diskImageExistsForURL:(nullable NSURL *)url - completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { - NSString *key = [self cacheKeyForURL:url]; - - [self.imageCache diskImageExistsWithKey:key completion:^(BOOL isInDiskCache) { - // the completion block of checkDiskCacheForImageWithKey:completion: is always called on the main queue, no need to further dispatch - if (completionBlock) { - completionBlock(isInDiskCache); - } - }]; -} - -- (id )loadImageWithURL:(nullable NSURL *)url - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDInternalCompletionBlock)completedBlock { - // Invoking this method without a completedBlock is pointless - NSAssert(completedBlock != nil, @"If you mean to prefetch the image, use -[SDWebImagePrefetcher prefetchURLs] instead"); - - // Very common mistake is to send the URL using NSString object instead of NSURL. For some strange reason, Xcode won't - // throw any warning for this type mismatch. Here we failsafe this error by allowing URLs to be passed as NSString. - if ([url isKindOfClass:NSString.class]) { - url = [NSURL URLWithString:(NSString *)url]; - } - - // Prevents app crashing on argument type error like sending NSNull instead of NSURL - if (![url isKindOfClass:NSURL.class]) { - url = nil; - } - - SDWebImageCombinedOperation *operation = [SDWebImageCombinedOperation new]; - operation.manager = self; - - BOOL isFailedUrl = NO; - if (url) { - @synchronized (self.failedURLs) { - isFailedUrl = [self.failedURLs containsObject:url]; - } - } - - if (url.absoluteString.length == 0 || (!(options & SDWebImageRetryFailed) && isFailedUrl)) { - [self callCompletionBlockForOperation:operation completion:completedBlock error:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil] url:url]; - return operation; - } - - @synchronized (self.runningOperations) { - [self.runningOperations addObject:operation]; - } - NSString *key = [self cacheKeyForURL:url]; - - SDImageCacheOptions cacheOptions = 0; - if (options & SDWebImageQueryDataWhenInMemory) cacheOptions |= SDImageCacheQueryDataWhenInMemory; - if (options & SDWebImageQueryDiskSync) cacheOptions |= SDImageCacheQueryDiskSync; - - __weak SDWebImageCombinedOperation *weakOperation = operation; - operation.cacheOperation = [self.imageCache queryCacheOperationForKey:key options:cacheOptions done:^(UIImage *cachedImage, NSData *cachedData, SDImageCacheType cacheType) { - __strong __typeof(weakOperation) strongOperation = weakOperation; - if (!strongOperation || strongOperation.isCancelled) { - [self safelyRemoveOperationFromRunning:strongOperation]; - return; - } - - // Check whether we should download image from network - BOOL shouldDownload = (!(options & SDWebImageFromCacheOnly)) - && (!cachedImage || options & SDWebImageRefreshCached) - && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url]); - if (shouldDownload) { - if (cachedImage && options & SDWebImageRefreshCached) { - // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image - // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server. - [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url]; - } - - // download if no image or requested to refresh anyway, and download allowed by delegate - SDWebImageDownloaderOptions downloaderOptions = 0; - if (options & SDWebImageLowPriority) downloaderOptions |= SDWebImageDownloaderLowPriority; - if (options & SDWebImageProgressiveDownload) downloaderOptions |= SDWebImageDownloaderProgressiveDownload; - if (options & SDWebImageRefreshCached) downloaderOptions |= SDWebImageDownloaderUseNSURLCache; - if (options & SDWebImageContinueInBackground) downloaderOptions |= SDWebImageDownloaderContinueInBackground; - if (options & SDWebImageHandleCookies) downloaderOptions |= SDWebImageDownloaderHandleCookies; - if (options & SDWebImageAllowInvalidSSLCertificates) downloaderOptions |= SDWebImageDownloaderAllowInvalidSSLCertificates; - if (options & SDWebImageHighPriority) downloaderOptions |= SDWebImageDownloaderHighPriority; - if (options & SDWebImageScaleDownLargeImages) downloaderOptions |= SDWebImageDownloaderScaleDownLargeImages; - - if (cachedImage && options & SDWebImageRefreshCached) { - // force progressive off if image already cached but forced refreshing - downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload; - // ignore image read from NSURLCache if image if cached but force refreshing - downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse; - } - - // `SDWebImageCombinedOperation` -> `SDWebImageDownloadToken` -> `downloadOperationCancelToken`, which is a `SDCallbacksDictionary` and retain the completed block bellow, so we need weak-strong again to avoid retain cycle - __weak typeof(strongOperation) weakSubOperation = strongOperation; - strongOperation.downloadToken = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *downloadedData, NSError *error, BOOL finished) { - __strong typeof(weakSubOperation) strongSubOperation = weakSubOperation; - if (!strongSubOperation || strongSubOperation.isCancelled) { - // Do nothing if the operation was cancelled - // See #699 for more details - // if we would call the completedBlock, there could be a race condition between this block and another completedBlock for the same object, so if this one is called second, we will overwrite the new data - } else if (error) { - [self callCompletionBlockForOperation:strongSubOperation completion:completedBlock error:error url:url]; - - if ( error.code != NSURLErrorNotConnectedToInternet - && error.code != NSURLErrorCancelled - && error.code != NSURLErrorTimedOut - && error.code != NSURLErrorInternationalRoamingOff - && error.code != NSURLErrorDataNotAllowed - && error.code != NSURLErrorCannotFindHost - && error.code != NSURLErrorCannotConnectToHost - && error.code != NSURLErrorNetworkConnectionLost) { - @synchronized (self.failedURLs) { - [self.failedURLs addObject:url]; - } - } - } - else { - if ((options & SDWebImageRetryFailed)) { - @synchronized (self.failedURLs) { - [self.failedURLs removeObject:url]; - } - } - - BOOL cacheOnDisk = !(options & SDWebImageCacheMemoryOnly); - - // We've done the scale process in SDWebImageDownloader with the shared manager, this is used for custom manager and avoid extra scale. - if (self != [SDWebImageManager sharedManager] && self.cacheKeyFilter && downloadedImage) { - downloadedImage = [self scaledImageForKey:key image:downloadedImage]; - } - - if (options & SDWebImageRefreshCached && cachedImage && !downloadedImage) { - // Image refresh hit the NSURLCache cache, do not call the completion block - } else if (downloadedImage && (!downloadedImage.images || (options & SDWebImageTransformAnimatedImage)) && [self.delegate respondsToSelector:@selector(imageManager:transformDownloadedImage:withURL:)]) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ - UIImage *transformedImage = [self.delegate imageManager:self transformDownloadedImage:downloadedImage withURL:url]; - - if (transformedImage && finished) { - BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage]; - // pass nil if the image was transformed, so we can recalculate the data from the image - [self.imageCache storeImage:transformedImage imageData:(imageWasTransformed ? nil : downloadedData) forKey:key toDisk:cacheOnDisk completion:nil]; - } - - [self callCompletionBlockForOperation:strongSubOperation completion:completedBlock image:transformedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url]; - }); - } else { - if (downloadedImage && finished) { - [self.imageCache storeImage:downloadedImage imageData:downloadedData forKey:key toDisk:cacheOnDisk completion:nil]; - } - [self callCompletionBlockForOperation:strongSubOperation completion:completedBlock image:downloadedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url]; - } - } - - if (finished) { - [self safelyRemoveOperationFromRunning:strongSubOperation]; - } - }]; - } else if (cachedImage) { - [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url]; - [self safelyRemoveOperationFromRunning:strongOperation]; - } else { - // Image not in cache and download disallowed by delegate - [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:nil data:nil error:nil cacheType:SDImageCacheTypeNone finished:YES url:url]; - [self safelyRemoveOperationFromRunning:strongOperation]; - } - }]; - - return operation; -} - -- (void)saveImageToCache:(nullable UIImage *)image forURL:(nullable NSURL *)url { - if (image && url) { - NSString *key = [self cacheKeyForURL:url]; - [self.imageCache storeImage:image forKey:key toDisk:YES completion:nil]; - } -} - -- (void)cancelAll { - @synchronized (self.runningOperations) { - NSArray *copiedOperations = [self.runningOperations copy]; - [copiedOperations makeObjectsPerformSelector:@selector(cancel)]; - [self.runningOperations removeObjectsInArray:copiedOperations]; - } -} - -- (BOOL)isRunning { - BOOL isRunning = NO; - @synchronized (self.runningOperations) { - isRunning = (self.runningOperations.count > 0); - } - return isRunning; -} - -- (void)safelyRemoveOperationFromRunning:(nullable SDWebImageCombinedOperation*)operation { - @synchronized (self.runningOperations) { - if (operation) { - [self.runningOperations removeObject:operation]; - } - } -} - -- (void)callCompletionBlockForOperation:(nullable SDWebImageCombinedOperation*)operation - completion:(nullable SDInternalCompletionBlock)completionBlock - error:(nullable NSError *)error - url:(nullable NSURL *)url { - [self callCompletionBlockForOperation:operation completion:completionBlock image:nil data:nil error:error cacheType:SDImageCacheTypeNone finished:YES url:url]; -} - -- (void)callCompletionBlockForOperation:(nullable SDWebImageCombinedOperation*)operation - completion:(nullable SDInternalCompletionBlock)completionBlock - image:(nullable UIImage *)image - data:(nullable NSData *)data - error:(nullable NSError *)error - cacheType:(SDImageCacheType)cacheType - finished:(BOOL)finished - url:(nullable NSURL *)url { - dispatch_main_async_safe(^{ - if (operation && !operation.isCancelled && completionBlock) { - completionBlock(image, data, error, cacheType, finished, url); - } - }); -} - -@end - - -@implementation SDWebImageCombinedOperation - -- (void)cancel { - @synchronized(self) { - self.cancelled = YES; - if (self.cacheOperation) { - [self.cacheOperation cancel]; - self.cacheOperation = nil; - } - if (self.downloadToken) { - [self.manager.imageDownloader cancel:self.downloadToken]; - } - [self.manager safelyRemoveOperationFromRunning:self]; - } -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h b/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h deleted file mode 100644 index 71094ee36..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import - -@protocol SDWebImageOperation - -- (void)cancel; - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h b/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h deleted file mode 100644 index 93357f4ec..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import -#import "SDWebImageManager.h" - -@class SDWebImagePrefetcher; - -@protocol SDWebImagePrefetcherDelegate - -@optional - -/** - * Called when an image was prefetched. - * - * @param imagePrefetcher The current image prefetcher - * @param imageURL The image url that was prefetched - * @param finishedCount The total number of images that were prefetched (successful or not) - * @param totalCount The total number of images that were to be prefetched - */ -- (void)imagePrefetcher:(nonnull SDWebImagePrefetcher *)imagePrefetcher didPrefetchURL:(nullable NSURL *)imageURL finishedCount:(NSUInteger)finishedCount totalCount:(NSUInteger)totalCount; - -/** - * Called when all images are prefetched. - * @param imagePrefetcher The current image prefetcher - * @param totalCount The total number of images that were prefetched (whether successful or not) - * @param skippedCount The total number of images that were skipped - */ -- (void)imagePrefetcher:(nonnull SDWebImagePrefetcher *)imagePrefetcher didFinishWithTotalCount:(NSUInteger)totalCount skippedCount:(NSUInteger)skippedCount; - -@end - -typedef void(^SDWebImagePrefetcherProgressBlock)(NSUInteger noOfFinishedUrls, NSUInteger noOfTotalUrls); -typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, NSUInteger noOfSkippedUrls); - -/** - * Prefetch some URLs in the cache for future use. Images are downloaded in low priority. - */ -@interface SDWebImagePrefetcher : NSObject - -/** - * The web image manager - */ -@property (strong, nonatomic, readonly, nonnull) SDWebImageManager *manager; - -/** - * Maximum number of URLs to prefetch at the same time. Defaults to 3. - */ -@property (nonatomic, assign) NSUInteger maxConcurrentDownloads; - -/** - * SDWebImageOptions for prefetcher. Defaults to SDWebImageLowPriority. - */ -@property (nonatomic, assign) SDWebImageOptions options; - -/** - * Queue options for Prefetcher. Defaults to Main Queue. - */ -@property (strong, nonatomic, nonnull) dispatch_queue_t prefetcherQueue; - -@property (weak, nonatomic, nullable) id delegate; - -/** - * Return the global image prefetcher instance. - */ -+ (nonnull instancetype)sharedImagePrefetcher; - -/** - * Allows you to instantiate a prefetcher with any arbitrary image manager. - */ -- (nonnull instancetype)initWithImageManager:(nonnull SDWebImageManager *)manager NS_DESIGNATED_INITIALIZER; - -/** - * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, - * currently one image is downloaded at a time, - * and skips images for failed downloads and proceed to the next image in the list. - * Any previously-running prefetch operations are canceled. - * - * @param urls list of URLs to prefetch - */ -- (void)prefetchURLs:(nullable NSArray *)urls; - -/** - * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, - * currently one image is downloaded at a time, - * and skips images for failed downloads and proceed to the next image in the list. - * Any previously-running prefetch operations are canceled. - * - * @param urls list of URLs to prefetch - * @param progressBlock block to be called when progress updates; - * first parameter is the number of completed (successful or not) requests, - * second parameter is the total number of images originally requested to be prefetched - * @param completionBlock block to be called when prefetching is completed - * first param is the number of completed (successful or not) requests, - * second parameter is the number of skipped requests - */ -- (void)prefetchURLs:(nullable NSArray *)urls - progress:(nullable SDWebImagePrefetcherProgressBlock)progressBlock - completed:(nullable SDWebImagePrefetcherCompletionBlock)completionBlock; - -/** - * Remove and cancel queued list - */ -- (void)cancelPrefetching; - - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m b/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m deleted file mode 100644 index 18c433e7d..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m +++ /dev/null @@ -1,144 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImagePrefetcher.h" - -@interface SDWebImagePrefetcher () - -@property (strong, nonatomic, nonnull) SDWebImageManager *manager; -@property (strong, atomic, nullable) NSArray *prefetchURLs; // may be accessed from different queue -@property (assign, nonatomic) NSUInteger requestedCount; -@property (assign, nonatomic) NSUInteger skippedCount; -@property (assign, nonatomic) NSUInteger finishedCount; -@property (assign, nonatomic) NSTimeInterval startedTime; -@property (copy, nonatomic, nullable) SDWebImagePrefetcherCompletionBlock completionBlock; -@property (copy, nonatomic, nullable) SDWebImagePrefetcherProgressBlock progressBlock; - -@end - -@implementation SDWebImagePrefetcher - -+ (nonnull instancetype)sharedImagePrefetcher { - static dispatch_once_t once; - static id instance; - dispatch_once(&once, ^{ - instance = [self new]; - }); - return instance; -} - -- (nonnull instancetype)init { - return [self initWithImageManager:[SDWebImageManager new]]; -} - -- (nonnull instancetype)initWithImageManager:(SDWebImageManager *)manager { - if ((self = [super init])) { - _manager = manager; - _options = SDWebImageLowPriority; - _prefetcherQueue = dispatch_get_main_queue(); - self.maxConcurrentDownloads = 3; - } - return self; -} - -- (void)setMaxConcurrentDownloads:(NSUInteger)maxConcurrentDownloads { - self.manager.imageDownloader.maxConcurrentDownloads = maxConcurrentDownloads; -} - -- (NSUInteger)maxConcurrentDownloads { - return self.manager.imageDownloader.maxConcurrentDownloads; -} - -- (void)startPrefetchingAtIndex:(NSUInteger)index { - NSURL *currentURL; - @synchronized(self) { - if (index >= self.prefetchURLs.count) return; - currentURL = self.prefetchURLs[index]; - self.requestedCount++; - } - [self.manager loadImageWithURL:currentURL options:self.options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!finished) return; - self.finishedCount++; - - if (self.progressBlock) { - self.progressBlock(self.finishedCount,(self.prefetchURLs).count); - } - if (!image) { - // Add last failed - self.skippedCount++; - } - if ([self.delegate respondsToSelector:@selector(imagePrefetcher:didPrefetchURL:finishedCount:totalCount:)]) { - [self.delegate imagePrefetcher:self - didPrefetchURL:currentURL - finishedCount:self.finishedCount - totalCount:self.prefetchURLs.count - ]; - } - if (self.prefetchURLs.count > self.requestedCount) { - dispatch_async(self.prefetcherQueue, ^{ - // we need dispatch to avoid function recursion call. This can prevent stack overflow even for huge urls list - [self startPrefetchingAtIndex:self.requestedCount]; - }); - } else if (self.finishedCount == self.requestedCount) { - [self reportStatus]; - if (self.completionBlock) { - self.completionBlock(self.finishedCount, self.skippedCount); - self.completionBlock = nil; - } - self.progressBlock = nil; - } - }]; -} - -- (void)reportStatus { - NSUInteger total = (self.prefetchURLs).count; - if ([self.delegate respondsToSelector:@selector(imagePrefetcher:didFinishWithTotalCount:skippedCount:)]) { - [self.delegate imagePrefetcher:self - didFinishWithTotalCount:(total - self.skippedCount) - skippedCount:self.skippedCount - ]; - } -} - -- (void)prefetchURLs:(nullable NSArray *)urls { - [self prefetchURLs:urls progress:nil completed:nil]; -} - -- (void)prefetchURLs:(nullable NSArray *)urls - progress:(nullable SDWebImagePrefetcherProgressBlock)progressBlock - completed:(nullable SDWebImagePrefetcherCompletionBlock)completionBlock { - [self cancelPrefetching]; // Prevent duplicate prefetch request - self.startedTime = CFAbsoluteTimeGetCurrent(); - self.prefetchURLs = urls; - self.completionBlock = completionBlock; - self.progressBlock = progressBlock; - - if (urls.count == 0) { - if (completionBlock) { - completionBlock(0,0); - } - } else { - // Starts prefetching from the very first image on the list with the max allowed concurrency - NSUInteger listCount = self.prefetchURLs.count; - for (NSUInteger i = 0; i < self.maxConcurrentDownloads && self.requestedCount < listCount; i++) { - [self startPrefetchingAtIndex:i]; - } - } -} - -- (void)cancelPrefetching { - @synchronized(self) { - self.prefetchURLs = nil; - self.skippedCount = 0; - self.requestedCount = 0; - self.finishedCount = 0; - } - [self.manager cancelAll]; -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h b/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h deleted file mode 100644 index 01925947a..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageTransition.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -#if SD_UIKIT || SD_MAC -#import "SDImageCache.h" - -// This class is used to provide a transition animation after the view category load image finished. Use this on `sd_imageTransition` in UIView+WebCache.h -// for UIKit(iOS & tvOS), we use `+[UIView transitionWithView:duration:options:animations:completion]` for transition animation. -// for AppKit(macOS), we use `+[NSAnimationContext runAnimationGroup:completionHandler:]` for transition animation. You can call `+[NSAnimationContext currentContext]` to grab the context during animations block. -// These transition are provided for basic usage. If you need complicated animation, consider to directly use Core Animation or use `SDWebImageAvoidAutoSetImage` and implement your own after image load finished. - -#if SD_UIKIT -typedef UIViewAnimationOptions SDWebImageAnimationOptions; -#else -typedef NS_OPTIONS(NSUInteger, SDWebImageAnimationOptions) { - SDWebImageAnimationOptionAllowsImplicitAnimation = 1 << 0, // specify `allowsImplicitAnimation` for the `NSAnimationContext` -}; -#endif - -typedef void (^SDWebImageTransitionPreparesBlock)(__kindof UIView * _Nonnull view, UIImage * _Nullable image, NSData * _Nullable imageData, SDImageCacheType cacheType, NSURL * _Nullable imageURL); -typedef void (^SDWebImageTransitionAnimationsBlock)(__kindof UIView * _Nonnull view, UIImage * _Nullable image); -typedef void (^SDWebImageTransitionCompletionBlock)(BOOL finished); - -@interface SDWebImageTransition : NSObject - -/** - By default, we set the image to the view at the beginning of the animtions. You can disable this and provide custom set image process - */ -@property (nonatomic, assign) BOOL avoidAutoSetImage; -/** - The duration of the transition animation, measured in seconds. Defaults to 0.5. - */ -@property (nonatomic, assign) NSTimeInterval duration; -/** - The timing function used for all animations within this transition animation (macOS). - */ -@property (nonatomic, strong, nullable) CAMediaTimingFunction *timingFunction NS_AVAILABLE_MAC(10_7); -/** - A mask of options indicating how you want to perform the animations. - */ -@property (nonatomic, assign) SDWebImageAnimationOptions animationOptions; -/** - A block object to be executed before the animation sequence starts. - */ -@property (nonatomic, copy, nullable) SDWebImageTransitionPreparesBlock prepares; -/** - A block object that contains the changes you want to make to the specified view. - */ -@property (nonatomic, copy, nullable) SDWebImageTransitionAnimationsBlock animations; -/** - A block object to be executed when the animation sequence ends. - */ -@property (nonatomic, copy, nullable) SDWebImageTransitionCompletionBlock completion; - -@end - -// Convenience way to create transition. Remember to specify the duration if needed. -// for UIKit, these transition just use the correspond `animationOptions` -// for AppKit, these transition use Core Animation in `animations`. So your view must be layer-backed. Set `wantsLayer = YES` before you apply it. - -@interface SDWebImageTransition (Conveniences) - -// class property is available in Xcode 8. We will drop the Xcode 7.3 support in 5.x -#if __has_feature(objc_class_property) -/// Fade transition. -@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *fadeTransition; -/// Flip from left transition. -@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromLeftTransition; -/// Flip from right transition. -@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromRightTransition; -/// Flip from top transition. -@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromTopTransition; -/// Flip from bottom transition. -@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromBottomTransition; -/// Curl up transition. -@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *curlUpTransition; -/// Curl down transition. -@property (nonatomic, class, nonnull, readonly) SDWebImageTransition *curlDownTransition; -#else -+ (nonnull instancetype)fadeTransition; -+ (nonnull instancetype)flipFromLeftTransition; -+ (nonnull instancetype)flipFromRightTransition; -+ (nonnull instancetype)flipFromTopTransition; -+ (nonnull instancetype)flipFromBottomTransition; -+ (nonnull instancetype)curlUpTransition; -+ (nonnull instancetype)curlDownTransition; -#endif - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m b/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m deleted file mode 100644 index 122b982f9..000000000 --- a/Pods/SDWebImage/SDWebImage/SDWebImageTransition.m +++ /dev/null @@ -1,137 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageTransition.h" - -#if SD_UIKIT || SD_MAC - -#if SD_MAC -#import -#endif - -@implementation SDWebImageTransition - -- (instancetype)init { - self = [super init]; - if (self) { - self.duration = 0.5; - } - return self; -} - -@end - -@implementation SDWebImageTransition (Conveniences) - -+ (SDWebImageTransition *)fadeTransition { - SDWebImageTransition *transition = [SDWebImageTransition new]; -#if SD_UIKIT - transition.animationOptions = UIViewAnimationOptionTransitionCrossDissolve; -#else - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { - CATransition *trans = [CATransition animation]; - trans.type = kCATransitionFade; - [view.layer addAnimation:trans forKey:kCATransition]; - }; -#endif - return transition; -} - -+ (SDWebImageTransition *)flipFromLeftTransition { - SDWebImageTransition *transition = [SDWebImageTransition new]; -#if SD_UIKIT - transition.animationOptions = UIViewAnimationOptionTransitionFlipFromLeft; -#else - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { - CATransition *trans = [CATransition animation]; - trans.type = kCATransitionPush; - trans.subtype = kCATransitionFromLeft; - [view.layer addAnimation:trans forKey:kCATransition]; - }; -#endif - return transition; -} - -+ (SDWebImageTransition *)flipFromRightTransition { - SDWebImageTransition *transition = [SDWebImageTransition new]; -#if SD_UIKIT - transition.animationOptions = UIViewAnimationOptionTransitionFlipFromRight; -#else - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { - CATransition *trans = [CATransition animation]; - trans.type = kCATransitionPush; - trans.subtype = kCATransitionFromRight; - [view.layer addAnimation:trans forKey:kCATransition]; - }; -#endif - return transition; -} - -+ (SDWebImageTransition *)flipFromTopTransition { - SDWebImageTransition *transition = [SDWebImageTransition new]; -#if SD_UIKIT - transition.animationOptions = UIViewAnimationOptionTransitionFlipFromTop; -#else - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { - CATransition *trans = [CATransition animation]; - trans.type = kCATransitionPush; - trans.subtype = kCATransitionFromTop; - [view.layer addAnimation:trans forKey:kCATransition]; - }; -#endif - return transition; -} - -+ (SDWebImageTransition *)flipFromBottomTransition { - SDWebImageTransition *transition = [SDWebImageTransition new]; -#if SD_UIKIT - transition.animationOptions = UIViewAnimationOptionTransitionFlipFromBottom; -#else - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { - CATransition *trans = [CATransition animation]; - trans.type = kCATransitionPush; - trans.subtype = kCATransitionFromBottom; - [view.layer addAnimation:trans forKey:kCATransition]; - }; -#endif - return transition; -} - -+ (SDWebImageTransition *)curlUpTransition { - SDWebImageTransition *transition = [SDWebImageTransition new]; -#if SD_UIKIT - transition.animationOptions = UIViewAnimationOptionTransitionCurlUp; -#else - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { - CATransition *trans = [CATransition animation]; - trans.type = kCATransitionReveal; - trans.subtype = kCATransitionFromTop; - [view.layer addAnimation:trans forKey:kCATransition]; - }; -#endif - return transition; -} - -+ (SDWebImageTransition *)curlDownTransition { - SDWebImageTransition *transition = [SDWebImageTransition new]; -#if SD_UIKIT - transition.animationOptions = UIViewAnimationOptionTransitionCurlDown; -#else - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) { - CATransition *trans = [CATransition animation]; - trans.type = kCATransitionReveal; - trans.subtype = kCATransitionFromBottom; - [view.layer addAnimation:trans forKey:kCATransition]; - }; -#endif - return transition; -} - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h b/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h deleted file mode 100644 index 61fada621..000000000 --- a/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h +++ /dev/null @@ -1,255 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -#if SD_UIKIT - -#import "SDWebImageManager.h" - -/** - * Integrates SDWebImage async downloading and caching of remote images with UIButtonView. - */ -@interface UIButton (WebCache) - -#pragma mark - Image - -/** - * Get the current image URL. - */ -- (nullable NSURL *)sd_currentImageURL; - -/** - * Get the image URL for a control state. - * - * @param state Which state you want to know the URL for. The values are described in UIControlState. - */ -- (nullable NSURL *)sd_imageURLForState:(UIControlState)state; - -/** - * Set the imageView `image` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `image` with an `url` and a placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - * @param placeholder The image to be set initially, until the image request finishes. - * @see sd_setImageWithURL:placeholderImage:options: - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `image` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the imageView `image` with an `url`, placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - * @param placeholder The image to be set initially, until the image request finishes. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder - completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - completed:(nullable SDExternalCompletionBlock)completedBlock; - -#pragma mark - Background Image - -/** - * Get the current background image URL. - */ -- (nullable NSURL *)sd_currentBackgroundImageURL; - -/** - * Get the background image URL for a control state. - * - * @param state Which state you want to know the URL for. The values are described in UIControlState. - */ -- (nullable NSURL *)sd_backgroundImageURLForState:(UIControlState)state; - -/** - * Set the backgroundImageView `image` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - */ -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state NS_REFINED_FOR_SWIFT; - -/** - * Set the backgroundImageView `image` with an `url` and a placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - * @param placeholder The image to be set initially, until the image request finishes. - * @see sd_setImageWithURL:placeholderImage:options: - */ -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; - -/** - * Set the backgroundImageView `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - */ -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; - -/** - * Set the backgroundImageView `image` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the backgroundImageView `image` with an `url`, placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param state The state that uses the specified title. The values are described in UIControlState. - * @param placeholder The image to be set initially, until the image request finishes. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder - completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; - -/** - * Set the backgroundImageView `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - completed:(nullable SDExternalCompletionBlock)completedBlock; - -#pragma mark - Cancel - -/** - * Cancel the current image download - */ -- (void)sd_cancelImageLoadForState:(UIControlState)state; - -/** - * Cancel the current backgroundImage download - */ -- (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state; - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m b/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m deleted file mode 100644 index 8cdadb678..000000000 --- a/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m +++ /dev/null @@ -1,181 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIButton+WebCache.h" - -#if SD_UIKIT - -#import "objc/runtime.h" -#import "UIView+WebCacheOperation.h" -#import "UIView+WebCache.h" - -static char imageURLStorageKey; - -typedef NSMutableDictionary SDStateImageURLDictionary; - -static inline NSString * imageURLKeyForState(UIControlState state) { - return [NSString stringWithFormat:@"image_%lu", (unsigned long)state]; -} - -static inline NSString * backgroundImageURLKeyForState(UIControlState state) { - return [NSString stringWithFormat:@"backgroundImage_%lu", (unsigned long)state]; -} - -static inline NSString * imageOperationKeyForState(UIControlState state) { - return [NSString stringWithFormat:@"UIButtonImageOperation%lu", (unsigned long)state]; -} - -static inline NSString * backgroundImageOperationKeyForState(UIControlState state) { - return [NSString stringWithFormat:@"UIButtonBackgroundImageOperation%lu", (unsigned long)state]; -} - -@implementation UIButton (WebCache) - -#pragma mark - Image - -- (nullable NSURL *)sd_currentImageURL { - NSURL *url = self.sd_imageURLStorage[imageURLKeyForState(self.state)]; - - if (!url) { - url = self.sd_imageURLStorage[imageURLKeyForState(UIControlStateNormal)]; - } - - return url; -} - -- (nullable NSURL *)sd_imageURLForState:(UIControlState)state { - return self.sd_imageURLStorage[imageURLKeyForState(state)]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { - [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - completed:(nullable SDExternalCompletionBlock)completedBlock { - if (!url) { - [self.sd_imageURLStorage removeObjectForKey:imageURLKeyForState(state)]; - } else { - self.sd_imageURLStorage[imageURLKeyForState(state)] = url; - } - - __weak typeof(self)weakSelf = self; - [self sd_internalSetImageWithURL:url - placeholderImage:placeholder - options:options - operationKey:imageOperationKeyForState(state) - setImageBlock:^(UIImage *image, NSData *imageData) { - [weakSelf setImage:image forState:state]; - } - progress:nil - completed:completedBlock]; -} - -#pragma mark - Background Image - -- (nullable NSURL *)sd_currentBackgroundImageURL { - NSURL *url = self.sd_imageURLStorage[backgroundImageURLKeyForState(self.state)]; - - if (!url) { - url = self.sd_imageURLStorage[backgroundImageURLKeyForState(UIControlStateNormal)]; - } - - return url; -} - -- (nullable NSURL *)sd_backgroundImageURLForState:(UIControlState)state { - return self.sd_imageURLStorage[backgroundImageURLKeyForState(state)]; -} - -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; -} - -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; -} - -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; -} - -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock]; -} - -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock]; -} - -- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url - forState:(UIControlState)state - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - completed:(nullable SDExternalCompletionBlock)completedBlock { - if (!url) { - [self.sd_imageURLStorage removeObjectForKey:backgroundImageURLKeyForState(state)]; - } else { - self.sd_imageURLStorage[backgroundImageURLKeyForState(state)] = url; - } - - __weak typeof(self)weakSelf = self; - [self sd_internalSetImageWithURL:url - placeholderImage:placeholder - options:options - operationKey:backgroundImageOperationKeyForState(state) - setImageBlock:^(UIImage *image, NSData *imageData) { - [weakSelf setBackgroundImage:image forState:state]; - } - progress:nil - completed:completedBlock]; -} - -#pragma mark - Cancel - -- (void)sd_cancelImageLoadForState:(UIControlState)state { - [self sd_cancelImageLoadOperationWithKey:imageOperationKeyForState(state)]; -} - -- (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state { - [self sd_cancelImageLoadOperationWithKey:backgroundImageOperationKeyForState(state)]; -} - -#pragma mark - Private - -- (SDStateImageURLDictionary *)sd_imageURLStorage { - SDStateImageURLDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey); - if (!storage) { - storage = [NSMutableDictionary dictionary]; - objc_setAssociatedObject(self, &imageURLStorageKey, storage, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - } - - return storage; -} - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h b/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h deleted file mode 100644 index 708c37b0b..000000000 --- a/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -@interface UIImage (ForceDecode) - -+ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image; - -+ (nullable UIImage *)decodedAndScaledDownImageWithImage:(nullable UIImage *)image; - -@end diff --git a/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m b/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m deleted file mode 100644 index ee55aee71..000000000 --- a/Pods/SDWebImage/SDWebImage/UIImage+ForceDecode.m +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIImage+ForceDecode.h" -#import "SDWebImageCodersManager.h" - -@implementation UIImage (ForceDecode) - -+ (UIImage *)decodedImageWithImage:(UIImage *)image { - if (!image) { - return nil; - } - NSData *tempData; - return [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&tempData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(NO)}]; -} - -+ (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image { - if (!image) { - return nil; - } - NSData *tempData; - return [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&tempData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(YES)}]; -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/UIImage+GIF.h b/Pods/SDWebImage/SDWebImage/UIImage+GIF.h deleted file mode 100644 index a3a664656..000000000 --- a/Pods/SDWebImage/SDWebImage/UIImage+GIF.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * (c) Laurin Brandner - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -@interface UIImage (GIF) - -/** - * Creates an animated UIImage from an NSData. - * For static GIF, will create an UIImage with `images` array set to nil. For animated GIF, will create an UIImage with valid `images` array. - */ -+ (UIImage *)sd_animatedGIFWithData:(NSData *)data; - -/** - * Checks if an UIImage instance is a GIF. Will use the `images` array. - */ -- (BOOL)isGIF; - -@end diff --git a/Pods/SDWebImage/SDWebImage/UIImage+GIF.m b/Pods/SDWebImage/SDWebImage/UIImage+GIF.m deleted file mode 100644 index 6fbca7ae4..000000000 --- a/Pods/SDWebImage/SDWebImage/UIImage+GIF.m +++ /dev/null @@ -1,27 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * (c) Laurin Brandner - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIImage+GIF.h" -#import "SDWebImageGIFCoder.h" -#import "NSImage+WebCache.h" - -@implementation UIImage (GIF) - -+ (UIImage *)sd_animatedGIFWithData:(NSData *)data { - if (!data) { - return nil; - } - return [[SDWebImageGIFCoder sharedCoder] decodedImageWithData:data]; -} - -- (BOOL)isGIF { - return (self.images != nil); -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h b/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h deleted file mode 100644 index c0792d1bc..000000000 --- a/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" -#import "NSData+ImageContentType.h" - -@interface UIImage (MultiFormat) - -/** - * UIKit: - * For static image format, this value is always 0. - * For animated image format, 0 means infinite looping. - * Note that because of the limitations of categories this property can get out of sync if you create another instance with CGImage or other methods. - * AppKit: - * NSImage currently only support animated via GIF imageRep unlike UIImage. - * The getter of this property will get the loop count from GIF imageRep - * The setter of this property will set the loop count from GIF imageRep - */ -@property (nonatomic, assign) NSUInteger sd_imageLoopCount; - -+ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data; -- (nullable NSData *)sd_imageData; -- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat; - -@end diff --git a/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m b/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m deleted file mode 100644 index 664e09699..000000000 --- a/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIImage+MultiFormat.h" - -#import "objc/runtime.h" -#import "SDWebImageCodersManager.h" - -@implementation UIImage (MultiFormat) - -#if SD_MAC -- (NSUInteger)sd_imageLoopCount { - NSUInteger imageLoopCount = 0; - for (NSImageRep *rep in self.representations) { - if ([rep isKindOfClass:[NSBitmapImageRep class]]) { - NSBitmapImageRep *bitmapRep = (NSBitmapImageRep *)rep; - imageLoopCount = [[bitmapRep valueForProperty:NSImageLoopCount] unsignedIntegerValue]; - break; - } - } - return imageLoopCount; -} - -- (void)setSd_imageLoopCount:(NSUInteger)sd_imageLoopCount { - for (NSImageRep *rep in self.representations) { - if ([rep isKindOfClass:[NSBitmapImageRep class]]) { - NSBitmapImageRep *bitmapRep = (NSBitmapImageRep *)rep; - [bitmapRep setProperty:NSImageLoopCount withValue:@(sd_imageLoopCount)]; - break; - } - } -} - -#else - -- (NSUInteger)sd_imageLoopCount { - NSUInteger imageLoopCount = 0; - NSNumber *value = objc_getAssociatedObject(self, @selector(sd_imageLoopCount)); - if ([value isKindOfClass:[NSNumber class]]) { - imageLoopCount = value.unsignedIntegerValue; - } - return imageLoopCount; -} - -- (void)setSd_imageLoopCount:(NSUInteger)sd_imageLoopCount { - NSNumber *value = @(sd_imageLoopCount); - objc_setAssociatedObject(self, @selector(sd_imageLoopCount), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} -#endif - -+ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data { - return [[SDWebImageCodersManager sharedInstance] decodedImageWithData:data]; -} - -- (nullable NSData *)sd_imageData { - return [self sd_imageDataAsFormat:SDImageFormatUndefined]; -} - -- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat { - NSData *imageData = nil; - if (self) { - imageData = [[SDWebImageCodersManager sharedInstance] encodedDataWithImage:self format:imageFormat]; - } - return imageData; -} - - -@end diff --git a/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h b/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h deleted file mode 100644 index c806e5f29..000000000 --- a/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -#if SD_UIKIT - -#import "SDWebImageManager.h" - -/** - * Integrates SDWebImage async downloading and caching of remote images with UIImageView for highlighted state. - */ -@interface UIImageView (HighlightedWebCache) - -/** - * Set the imageView `highlightedImage` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - */ -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `highlightedImage` with an `url` and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - */ -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url - options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `highlightedImage` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url - completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `highlightedImage` with an `url` and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url - options:(SDWebImageOptions)options - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the imageView `highlightedImage` with an `url` and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param progressBlock A block called while image is downloading - * @note the progress block is executed on a background queue - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock; - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m b/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m deleted file mode 100644 index fb13bd8b1..000000000 --- a/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIImageView+HighlightedWebCache.h" - -#if SD_UIKIT - -#import "UIView+WebCacheOperation.h" -#import "UIView+WebCache.h" - -@implementation UIImageView (HighlightedWebCache) - -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url { - [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:nil]; -} - -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options { - [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:nil]; -} - -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:completedBlock]; -} - -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:completedBlock]; -} - -- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock { - __weak typeof(self)weakSelf = self; - [self sd_internalSetImageWithURL:url - placeholderImage:nil - options:options - operationKey:@"UIImageViewImageOperationHighlighted" - setImageBlock:^(UIImage *image, NSData *imageData) { - weakSelf.highlightedImage = image; - } - progress:progressBlock - completed:completedBlock]; -} - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h b/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h deleted file mode 100644 index ef2eacfd4..000000000 --- a/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -#if SD_UIKIT || SD_MAC - -#import "SDWebImageManager.h" - -/** - * Integrates SDWebImage async downloading and caching of remote images with UIImageView. - * - * Usage with a UITableViewCell sub-class: - * - * @code - -#import - -... - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - static NSString *MyIdentifier = @"MyIdentifier"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; - - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] - autorelease]; - } - - // Here we use the provided sd_setImageWithURL: method to load the web image - // Ensure you use a placeholder image otherwise cells will be initialized with no image - [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://example.com/image.jpg"] - placeholderImage:[UIImage imageNamed:@"placeholder"]]; - - cell.textLabel.text = @"My Text"; - return cell; -} - - * @endcode - */ -@interface UIImageView (WebCache) - -/** - * Set the imageView `image` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `image` with an `url` and a placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @see sd_setImageWithURL:placeholderImage:options: - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `image` with an `url`. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the imageView `image` with an `url`, placeholder. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - completed:(nullable SDExternalCompletionBlock)completedBlock NS_REFINED_FOR_SWIFT; - -/** - * Set the imageView `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the imageView `image` with an `url`, placeholder and custom options. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param progressBlock A block called while image is downloading - * @note the progress block is executed on a background queue - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the imageView `image` with an `url` and custom options. The placeholder image is from previous cached image and will use the provided one instead if the query failed. - * This method was designed to ensure that placeholder and query cache process happened in the same runloop to avoid flashing on cell during two `setImage:` call. But it's really misunderstanding and deprecated. - * This can be done by using `sd_setImageWithURL:` with `SDWebImageQueryDiskSync`. But take care that if the memory cache missed, query disk cache synchronously may reduce the frame rate - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param progressBlock A block called while image is downloading - * @note the progress block is executed on a background queue - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - * @deprecated consider using `SDWebImageQueryDiskSync` options with `sd_setImageWithURL:` instead - */ -- (void)sd_setImageWithPreviousCachedImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock __deprecated_msg("This method is misunderstanding and deprecated, consider using `SDWebImageQueryDiskSync` options with `sd_setImageWithURL:` instead"); - -#if SD_UIKIT - -#pragma mark - Animation of multiple images - -/** - * Download an array of images and starts them in an animation loop - * - * @param arrayOfURLs An array of NSURL - */ -- (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs; - -- (void)sd_cancelCurrentAnimationImagesLoad; - -#endif - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m b/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m deleted file mode 100644 index aa8ce4311..000000000 --- a/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m +++ /dev/null @@ -1,144 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIImageView+WebCache.h" - -#if SD_UIKIT || SD_MAC - -#import "objc/runtime.h" -#import "UIView+WebCacheOperation.h" -#import "UIView+WebCache.h" - -@implementation UIImageView (WebCache) - -- (void)sd_setImageWithURL:(nullable NSURL *)url { - [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; -} - -- (void)sd_setImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock { - [self sd_internalSetImageWithURL:url - placeholderImage:placeholder - options:options - operationKey:nil - setImageBlock:nil - progress:progressBlock - completed:completedBlock]; -} - -- (void)sd_setImageWithPreviousCachedImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock { - NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:url]; - UIImage *lastPreviousCachedImage = [[SDImageCache sharedImageCache] imageFromCacheForKey:key]; - - [self sd_setImageWithURL:url placeholderImage:lastPreviousCachedImage ?: placeholder options:options progress:progressBlock completed:completedBlock]; -} - -#if SD_UIKIT - -#pragma mark - Animation of multiple images - -- (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs { - [self sd_cancelCurrentAnimationImagesLoad]; - NSPointerArray *operationsArray = [self sd_animationOperationArray]; - - [arrayOfURLs enumerateObjectsUsingBlock:^(NSURL *logoImageURL, NSUInteger idx, BOOL * _Nonnull stop) { - __weak __typeof(self) wself = self; - id operation = [[SDWebImageManager sharedManager] loadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - __strong typeof(wself) sself = wself; - if (!sself) return; - dispatch_main_async_safe(^{ - [sself stopAnimating]; - if (sself && image) { - NSMutableArray *currentImages = [[sself animationImages] mutableCopy]; - if (!currentImages) { - currentImages = [[NSMutableArray alloc] init]; - } - - // We know what index objects should be at when they are returned so - // we will put the object at the index, filling any empty indexes - // with the image that was returned too "early". These images will - // be overwritten. (does not require additional sorting datastructure) - while ([currentImages count] < idx) { - [currentImages addObject:image]; - } - - currentImages[idx] = image; - - sself.animationImages = currentImages; - [sself setNeedsLayout]; - } - [sself startAnimating]; - }); - }]; - @synchronized (self) { - [operationsArray addPointer:(__bridge void *)(operation)]; - } - }]; -} - -static char animationLoadOperationKey; - -// element is weak because operation instance is retained by SDWebImageManager's runningOperations property -// we should use lock to keep thread-safe because these method may not be acessed from main queue -- (NSPointerArray *)sd_animationOperationArray { - @synchronized(self) { - NSPointerArray *operationsArray = objc_getAssociatedObject(self, &animationLoadOperationKey); - if (operationsArray) { - return operationsArray; - } - operationsArray = [NSPointerArray weakObjectsPointerArray]; - objc_setAssociatedObject(self, &animationLoadOperationKey, operationsArray, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - return operationsArray; - } -} - -- (void)sd_cancelCurrentAnimationImagesLoad { - NSPointerArray *operationsArray = [self sd_animationOperationArray]; - if (operationsArray) { - @synchronized (self) { - for (id operation in operationsArray) { - if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]) { - [operation cancel]; - } - } - operationsArray.count = 0; - } - } -} -#endif - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/UIView+WebCache.h b/Pods/SDWebImage/SDWebImage/UIView+WebCache.h deleted file mode 100644 index d89452d82..000000000 --- a/Pods/SDWebImage/SDWebImage/UIView+WebCache.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -#if SD_UIKIT || SD_MAC - -#import "SDWebImageManager.h" -#import "SDWebImageTransition.h" - -/** - A Dispatch group to maintain setImageBlock and completionBlock. This key should be used only internally and may be changed in the future. (dispatch_group_t) - */ -FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageInternalSetImageGroupKey; -/** - A SDWebImageManager instance to control the image download and cache process using in UIImageView+WebCache category and likes. If not provided, use the shared manager (SDWebImageManager) - */ -FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageExternalCustomManagerKey; -/** - The value specify that the image progress unit count cannot be determined because the progressBlock is not been called. - */ -FOUNDATION_EXPORT const int64_t SDWebImageProgressUnitCountUnknown; /* 1LL */ - -typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable imageData); - -@interface UIView (WebCache) - -/** - * Get the current image URL. - * - * @note Note that because of the limitations of categories this property can get out of sync if you use setImage: directly. - */ -- (nullable NSURL *)sd_imageURL; - -/** - * The current image loading progress associated to the view. The unit count is the received size and excepted size of download. - * The `totalUnitCount` and `completedUnitCount` will be reset to 0 after a new image loading start (change from current queue). And they will be set to `SDWebImageProgressUnitCountUnknown` if the progressBlock not been called but the image loading success to mark the progress finished (change from main queue). - * @note You can use Key-Value Observing on the progress, but you should take care that the change to progress is from a background queue during download(the same as progressBlock). If you want to using KVO and update the UI, make sure to dispatch on the main queue. And it's recommand to use some KVO libs like KVOController because it's more safe and easy to use. - * @note The getter will create a progress instance if the value is nil. You can also set a custom progress instance and let it been updated during image loading - * @note Note that because of the limitations of categories this property can get out of sync if you update the progress directly. - */ -@property (nonatomic, strong, null_resettable) NSProgress *sd_imageProgress; - -/** - * Set the imageView `image` with an `url` and optionally a placeholder image. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param operationKey A string to be used as the operation key. If nil, will use the class name - * @param setImageBlock Block used for custom set image code - * @param progressBlock A block called while image is downloading - * @note the progress block is executed on a background queue - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - */ -- (void)sd_internalSetImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - operationKey:(nullable NSString *)operationKey - setImageBlock:(nullable SDSetImageBlock)setImageBlock - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock; - -/** - * Set the imageView `image` with an `url` and optionally a placeholder image. - * - * The download is asynchronous and cached. - * - * @param url The url for the image. - * @param placeholder The image to be set initially, until the image request finishes. - * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. - * @param operationKey A string to be used as the operation key. If nil, will use the class name - * @param setImageBlock Block used for custom set image code - * @param progressBlock A block called while image is downloading - * @note the progress block is executed on a background queue - * @param completedBlock A block called when operation has been completed. This block has no return value - * and takes the requested UIImage as first parameter. In case of error the image parameter - * is nil and the second parameter may contain an NSError. The third parameter is a Boolean - * indicating if the image was retrieved from the local cache or from the network. - * The fourth parameter is the original image url. - * @param context A context with extra information to perform specify changes or processes. - */ -- (void)sd_internalSetImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - operationKey:(nullable NSString *)operationKey - setImageBlock:(nullable SDSetImageBlock)setImageBlock - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock - context:(nullable NSDictionary *)context; - -/** - * Cancel the current image load - */ -- (void)sd_cancelCurrentImageLoad; - -#pragma mark - Image Transition - -/** - The image transition when image load finished. See `SDWebImageTransition`. - If you specify nil, do not do transition. Defautls to nil. - */ -@property (nonatomic, strong, nullable) SDWebImageTransition *sd_imageTransition; - -#if SD_UIKIT - -#pragma mark - Activity indicator - -/** - * Show activity UIActivityIndicatorView - */ -- (void)sd_setShowActivityIndicatorView:(BOOL)show; - -/** - * set desired UIActivityIndicatorViewStyle - * - * @param style The style of the UIActivityIndicatorView - */ -- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style; - -- (BOOL)sd_showActivityIndicatorView; -- (void)sd_addActivityIndicator; -- (void)sd_removeActivityIndicator; - -#endif - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/UIView+WebCache.m b/Pods/SDWebImage/SDWebImage/UIView+WebCache.m deleted file mode 100644 index e9f6dc684..000000000 --- a/Pods/SDWebImage/SDWebImage/UIView+WebCache.m +++ /dev/null @@ -1,351 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIView+WebCache.h" - -#if SD_UIKIT || SD_MAC - -#import "objc/runtime.h" -#import "UIView+WebCacheOperation.h" - -NSString * const SDWebImageInternalSetImageGroupKey = @"internalSetImageGroup"; -NSString * const SDWebImageExternalCustomManagerKey = @"externalCustomManager"; - -const int64_t SDWebImageProgressUnitCountUnknown = 1LL; - -static char imageURLKey; - -#if SD_UIKIT -static char TAG_ACTIVITY_INDICATOR; -static char TAG_ACTIVITY_STYLE; -#endif -static char TAG_ACTIVITY_SHOW; - -@implementation UIView (WebCache) - -- (nullable NSURL *)sd_imageURL { - return objc_getAssociatedObject(self, &imageURLKey); -} - -- (NSProgress *)sd_imageProgress { - NSProgress *progress = objc_getAssociatedObject(self, @selector(sd_imageProgress)); - if (!progress) { - progress = [[NSProgress alloc] initWithParent:nil userInfo:nil]; - self.sd_imageProgress = progress; - } - return progress; -} - -- (void)setSd_imageProgress:(NSProgress *)sd_imageProgress { - objc_setAssociatedObject(self, @selector(sd_imageProgress), sd_imageProgress, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (void)sd_internalSetImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - operationKey:(nullable NSString *)operationKey - setImageBlock:(nullable SDSetImageBlock)setImageBlock - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock { - return [self sd_internalSetImageWithURL:url placeholderImage:placeholder options:options operationKey:operationKey setImageBlock:setImageBlock progress:progressBlock completed:completedBlock context:nil]; -} - -- (void)sd_internalSetImageWithURL:(nullable NSURL *)url - placeholderImage:(nullable UIImage *)placeholder - options:(SDWebImageOptions)options - operationKey:(nullable NSString *)operationKey - setImageBlock:(nullable SDSetImageBlock)setImageBlock - progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock - completed:(nullable SDExternalCompletionBlock)completedBlock - context:(nullable NSDictionary *)context { - NSString *validOperationKey = operationKey ?: NSStringFromClass([self class]); - [self sd_cancelImageLoadOperationWithKey:validOperationKey]; - objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - - if (!(options & SDWebImageDelayPlaceholder)) { - if ([context valueForKey:SDWebImageInternalSetImageGroupKey]) { - dispatch_group_t group = [context valueForKey:SDWebImageInternalSetImageGroupKey]; - dispatch_group_enter(group); - } - dispatch_main_async_safe(^{ - [self sd_setImage:placeholder imageData:nil basedOnClassOrViaCustomSetImageBlock:setImageBlock]; - }); - } - - if (url) { - // check if activityView is enabled or not - if ([self sd_showActivityIndicatorView]) { - [self sd_addActivityIndicator]; - } - - // reset the progress - self.sd_imageProgress.totalUnitCount = 0; - self.sd_imageProgress.completedUnitCount = 0; - - SDWebImageManager *manager; - if ([context valueForKey:SDWebImageExternalCustomManagerKey]) { - manager = (SDWebImageManager *)[context valueForKey:SDWebImageExternalCustomManagerKey]; - } else { - manager = [SDWebImageManager sharedManager]; - } - - __weak __typeof(self)wself = self; - SDWebImageDownloaderProgressBlock combinedProgressBlock = ^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) { - wself.sd_imageProgress.totalUnitCount = expectedSize; - wself.sd_imageProgress.completedUnitCount = receivedSize; - if (progressBlock) { - progressBlock(receivedSize, expectedSize, targetURL); - } - }; - id operation = [manager loadImageWithURL:url options:options progress:combinedProgressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - __strong __typeof (wself) sself = wself; - if (!sself) { return; } - [sself sd_removeActivityIndicator]; - // if the progress not been updated, mark it to complete state - if (finished && !error && sself.sd_imageProgress.totalUnitCount == 0 && sself.sd_imageProgress.completedUnitCount == 0) { - sself.sd_imageProgress.totalUnitCount = SDWebImageProgressUnitCountUnknown; - sself.sd_imageProgress.completedUnitCount = SDWebImageProgressUnitCountUnknown; - } - BOOL shouldCallCompletedBlock = finished || (options & SDWebImageAvoidAutoSetImage); - BOOL shouldNotSetImage = ((image && (options & SDWebImageAvoidAutoSetImage)) || - (!image && !(options & SDWebImageDelayPlaceholder))); - SDWebImageNoParamsBlock callCompletedBlockClojure = ^{ - if (!sself) { return; } - if (!shouldNotSetImage) { - [sself sd_setNeedsLayout]; - } - if (completedBlock && shouldCallCompletedBlock) { - completedBlock(image, error, cacheType, url); - } - }; - - // case 1a: we got an image, but the SDWebImageAvoidAutoSetImage flag is set - // OR - // case 1b: we got no image and the SDWebImageDelayPlaceholder is not set - if (shouldNotSetImage) { - dispatch_main_async_safe(callCompletedBlockClojure); - return; - } - - UIImage *targetImage = nil; - NSData *targetData = nil; - if (image) { - // case 2a: we got an image and the SDWebImageAvoidAutoSetImage is not set - targetImage = image; - targetData = data; - } else if (options & SDWebImageDelayPlaceholder) { - // case 2b: we got no image and the SDWebImageDelayPlaceholder flag is set - targetImage = placeholder; - targetData = nil; - } - - // check whether we should use the image transition - SDWebImageTransition *transition = nil; - if (finished && (options & SDWebImageForceTransition || cacheType == SDImageCacheTypeNone)) { - transition = sself.sd_imageTransition; - } - if ([context valueForKey:SDWebImageInternalSetImageGroupKey]) { - dispatch_group_t group = [context valueForKey:SDWebImageInternalSetImageGroupKey]; - dispatch_group_enter(group); - dispatch_main_async_safe(^{ - [sself sd_setImage:targetImage imageData:targetData basedOnClassOrViaCustomSetImageBlock:setImageBlock transition:transition cacheType:cacheType imageURL:imageURL]; - }); - // ensure completion block is called after custom setImage process finish - dispatch_group_notify(group, dispatch_get_main_queue(), ^{ - callCompletedBlockClojure(); - }); - } else { - dispatch_main_async_safe(^{ - [sself sd_setImage:targetImage imageData:targetData basedOnClassOrViaCustomSetImageBlock:setImageBlock transition:transition cacheType:cacheType imageURL:imageURL]; - callCompletedBlockClojure(); - }); - } - }]; - [self sd_setImageLoadOperation:operation forKey:validOperationKey]; - } else { - dispatch_main_async_safe(^{ - [self sd_removeActivityIndicator]; - if (completedBlock) { - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - } -} - -- (void)sd_cancelCurrentImageLoad { - [self sd_cancelImageLoadOperationWithKey:NSStringFromClass([self class])]; -} - -- (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDSetImageBlock)setImageBlock { - [self sd_setImage:image imageData:imageData basedOnClassOrViaCustomSetImageBlock:setImageBlock transition:nil cacheType:0 imageURL:nil]; -} - -- (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDSetImageBlock)setImageBlock transition:(SDWebImageTransition *)transition cacheType:(SDImageCacheType)cacheType imageURL:(NSURL *)imageURL { - UIView *view = self; - SDSetImageBlock finalSetImageBlock; - if (setImageBlock) { - finalSetImageBlock = setImageBlock; - } -#if SD_UIKIT || SD_MAC - else if ([view isKindOfClass:[UIImageView class]]) { - UIImageView *imageView = (UIImageView *)view; - finalSetImageBlock = ^(UIImage *setImage, NSData *setImageData) { - imageView.image = setImage; - }; - } -#endif -#if SD_UIKIT - else if ([view isKindOfClass:[UIButton class]]) { - UIButton *button = (UIButton *)view; - finalSetImageBlock = ^(UIImage *setImage, NSData *setImageData){ - [button setImage:setImage forState:UIControlStateNormal]; - }; - } -#endif - - if (transition) { -#if SD_UIKIT - [UIView transitionWithView:view duration:0 options:0 animations:^{ - // 0 duration to let UIKit render placeholder and prepares block - if (transition.prepares) { - transition.prepares(view, image, imageData, cacheType, imageURL); - } - } completion:^(BOOL finished) { - [UIView transitionWithView:view duration:transition.duration options:transition.animationOptions animations:^{ - if (finalSetImageBlock && !transition.avoidAutoSetImage) { - finalSetImageBlock(image, imageData); - } - if (transition.animations) { - transition.animations(view, image); - } - } completion:transition.completion]; - }]; -#elif SD_MAC - [NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull prepareContext) { - // 0 duration to let AppKit render placeholder and prepares block - prepareContext.duration = 0; - if (transition.prepares) { - transition.prepares(view, image, imageData, cacheType, imageURL); - } - } completionHandler:^{ - [NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull context) { - context.duration = transition.duration; - context.timingFunction = transition.timingFunction; - context.allowsImplicitAnimation = (transition.animationOptions & SDWebImageAnimationOptionAllowsImplicitAnimation); - if (finalSetImageBlock && !transition.avoidAutoSetImage) { - finalSetImageBlock(image, imageData); - } - if (transition.animations) { - transition.animations(view, image); - } - } completionHandler:^{ - if (transition.completion) { - transition.completion(YES); - } - }]; - }]; -#endif - } else { - if (finalSetImageBlock) { - finalSetImageBlock(image, imageData); - } - } -} - -- (void)sd_setNeedsLayout { -#if SD_UIKIT - [self setNeedsLayout]; -#elif SD_MAC - [self setNeedsLayout:YES]; -#endif -} - -#pragma mark - Image Transition -- (SDWebImageTransition *)sd_imageTransition { - return objc_getAssociatedObject(self, @selector(sd_imageTransition)); -} - -- (void)setSd_imageTransition:(SDWebImageTransition *)sd_imageTransition { - objc_setAssociatedObject(self, @selector(sd_imageTransition), sd_imageTransition, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -#pragma mark - Activity indicator - -#pragma mark - -#if SD_UIKIT -- (UIActivityIndicatorView *)activityIndicator { - return (UIActivityIndicatorView *)objc_getAssociatedObject(self, &TAG_ACTIVITY_INDICATOR); -} - -- (void)setActivityIndicator:(UIActivityIndicatorView *)activityIndicator { - objc_setAssociatedObject(self, &TAG_ACTIVITY_INDICATOR, activityIndicator, OBJC_ASSOCIATION_RETAIN); -} -#endif - -- (void)sd_setShowActivityIndicatorView:(BOOL)show { - objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN); -} - -- (BOOL)sd_showActivityIndicatorView { - return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; -} - -#if SD_UIKIT -- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style{ - objc_setAssociatedObject(self, &TAG_ACTIVITY_STYLE, [NSNumber numberWithInt:style], OBJC_ASSOCIATION_RETAIN); -} - -- (int)sd_getIndicatorStyle{ - return [objc_getAssociatedObject(self, &TAG_ACTIVITY_STYLE) intValue]; -} -#endif - -- (void)sd_addActivityIndicator { -#if SD_UIKIT - dispatch_main_async_safe(^{ - if (!self.activityIndicator) { - self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self sd_getIndicatorStyle]]; - self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; - - [self addSubview:self.activityIndicator]; - - [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator - attribute:NSLayoutAttributeCenterX - relatedBy:NSLayoutRelationEqual - toItem:self - attribute:NSLayoutAttributeCenterX - multiplier:1.0 - constant:0.0]]; - [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self - attribute:NSLayoutAttributeCenterY - multiplier:1.0 - constant:0.0]]; - } - [self.activityIndicator startAnimating]; - }); -#endif -} - -- (void)sd_removeActivityIndicator { -#if SD_UIKIT - dispatch_main_async_safe(^{ - if (self.activityIndicator) { - [self.activityIndicator removeFromSuperview]; - self.activityIndicator = nil; - } - }); -#endif -} - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h b/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h deleted file mode 100644 index 5d44691fc..000000000 --- a/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "SDWebImageCompat.h" - -#if SD_UIKIT || SD_MAC - -#import "SDWebImageManager.h" - -// These methods are used to support canceling for UIView image loading, it's designed to be used internal but not external. -// All the stored operations are weak, so it will be dalloced after image loading finished. If you need to store operations, use your own class to keep a strong reference for them. -@interface UIView (WebCacheOperation) - -/** - * Set the image load operation (storage in a UIView based weak map table) - * - * @param operation the operation - * @param key key for storing the operation - */ -- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key; - -/** - * Cancel all operations for the current UIView and key - * - * @param key key for identifying the operations - */ -- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key; - -/** - * Just remove the operations corresponding to the current UIView and key without cancelling them - * - * @param key key for identifying the operations - */ -- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key; - -@end - -#endif diff --git a/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m b/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m deleted file mode 100644 index 78d58f413..000000000 --- a/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of the SDWebImage package. - * (c) Olivier Poitrey - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -#import "UIView+WebCacheOperation.h" - -#if SD_UIKIT || SD_MAC - -#import "objc/runtime.h" - -static char loadOperationKey; - -// key is copy, value is weak because operation instance is retained by SDWebImageManager's runningOperations property -// we should use lock to keep thread-safe because these method may not be acessed from main queue -typedef NSMapTable> SDOperationsDictionary; - -@implementation UIView (WebCacheOperation) - -- (SDOperationsDictionary *)sd_operationDictionary { - @synchronized(self) { - SDOperationsDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey); - if (operations) { - return operations; - } - operations = [[NSMapTable alloc] initWithKeyOptions:NSMapTableCopyIn valueOptions:NSMapTableWeakMemory capacity:0]; - objc_setAssociatedObject(self, &loadOperationKey, operations, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - return operations; - } -} - -- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key { - if (key) { - [self sd_cancelImageLoadOperationWithKey:key]; - if (operation) { - SDOperationsDictionary *operationDictionary = [self sd_operationDictionary]; - @synchronized (self) { - [operationDictionary setObject:operation forKey:key]; - } - } - } -} - -- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key { - // Cancel in progress downloader from queue - SDOperationsDictionary *operationDictionary = [self sd_operationDictionary]; - id operation; - @synchronized (self) { - operation = [operationDictionary objectForKey:key]; - } - if (operation) { - if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]){ - [operation cancel]; - } - @synchronized (self) { - [operationDictionary removeObjectForKey:key]; - } - } -} - -- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key { - if (key) { - SDOperationsDictionary *operationDictionary = [self sd_operationDictionary]; - @synchronized (self) { - [operationDictionary removeObjectForKey:key]; - } - } -} - -@end - -#endif diff --git a/Pods/SVProgressHUD/LICENSE.txt b/Pods/SVProgressHUD/LICENSE.txt deleted file mode 100644 index ef855c595..000000000 --- a/Pods/SVProgressHUD/LICENSE.txt +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) 2011-2017 Sam Vermette, Tobias Tiemerding and contributors. - -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. - -A different license may apply to other resources included in this package, including Freepik Icons. Please consult their respective headers for the terms of their individual licenses. diff --git a/Pods/SVProgressHUD/README.md b/Pods/SVProgressHUD/README.md deleted file mode 100644 index 4d5923570..000000000 --- a/Pods/SVProgressHUD/README.md +++ /dev/null @@ -1,217 +0,0 @@ -# SVProgressHUD - -![Pod Version](https://img.shields.io/cocoapods/v/SVProgressHUD.svg?style=flat) -![Pod Platform](https://img.shields.io/cocoapods/p/SVProgressHUD.svg?style=flat) -![Pod License](https://img.shields.io/cocoapods/l/SVProgressHUD.svg?style=flat) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) - -`SVProgressHUD` is a clean and easy-to-use HUD meant to display the progress of an ongoing task on iOS and tvOS. - -![SVProgressHUD](http://f.cl.ly/items/2G1F1Z0M0k0h2U3V1p39/SVProgressHUD.gif) - -## Demo - -Try `SVProgressHUD` on [Appetize.io](https://appetize.io/app/p8r2cvy8kq74x7q7tjqf5gyatr). - -## Installation - -### From CocoaPods - -[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like `SVProgressHUD` in your projects. First, add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html): - -```ruby -pod 'SVProgressHUD' -``` - -If you want to use the latest features of `SVProgressHUD` use normal external source dependencies. - -```ruby -pod 'SVProgressHUD', :git => 'https://github.com/SVProgressHUD/SVProgressHUD.git' -``` - -This pulls from the `master` branch directly. - -Second, install `SVProgressHUD` into your project: - -```ruby -pod install -``` - -### Carthage - -[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate `SVProgressHUD` into your Xcode project using Carthage, specify it in your `Cartfile`: - -```ogdl -github "SVProgressHUD/SVProgressHUD" -``` - -Run `carthage update` to build the framework and drag the built `SVProgressHUD.framework` (in Carthage/Build/iOS folder) into your Xcode project (Linked Frameworks and Libraries in `Targets`). - - -### Manually - -* Drag the `SVProgressHUD/SVProgressHUD` folder into your project. -* Take care that `SVProgressHUD.bundle` is added to `Targets->Build Phases->Copy Bundle Resources`. -* Add the **QuartzCore** framework to your project. - -## Swift - -Even though `SVProgressHUD` is written in Objective-C, it can be used in Swift with no hassle. If you use [CocoaPods](http://cocoapods.org) add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html): - -```ruby -use_frameworks! -``` - -If you added `SVProgressHUD` manually, just add a [bridging header](https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html) file to your project with the `SVProgressHUD` header included. - -## Usage - -(see sample Xcode project in `/Demo`) - -`SVProgressHUD` is created as a singleton (i.e. it doesn't need to be explicitly allocated and instantiated; you directly call `[SVProgressHUD method]`). - -**Use `SVProgressHUD` wisely! Only use it if you absolutely need to perform a task before taking the user forward. Bad use case examples: pull to refresh, infinite scrolling, sending message.** - -Using `SVProgressHUD` in your app will usually look as simple as this (using Grand Central Dispatch): - -```objective-c -[SVProgressHUD show]; -dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - // time-consuming task - dispatch_async(dispatch_get_main_queue(), ^{ - [SVProgressHUD dismiss]; - }); -}); -``` - -### Showing the HUD - -You can show the status of indeterminate tasks using one of the following: - -```objective-c -+ (void)show; -+ (void)showWithStatus:(NSString*)string; -``` - -If you'd like the HUD to reflect the progress of a task, use one of these: - -```objective-c -+ (void)showProgress:(CGFloat)progress; -+ (void)showProgress:(CGFloat)progress status:(NSString*)status; -``` - -### Dismissing the HUD - -The HUD can be dismissed using: - -```objective-c -+ (void)dismiss; -+ (void)dismissWithDelay:(NSTimeInterval)delay; -``` - -If you'd like to stack HUDs, you can balance out every show call using: - -``` -+ (void)popActivity; -``` - -The HUD will get dismissed once the popActivity calls will match the number of show calls. - -Or show a confirmation glyph before before getting dismissed a little bit later. The display time depends on `minimumDismissTimeInterval` and the length of the given string. - -```objective-c -+ (void)showInfoWithStatus:(NSString*)string; -+ (void)showSuccessWithStatus:(NSString*)string; -+ (void)showErrorWithStatus:(NSString*)string; -+ (void)showImage:(UIImage*)image status:(NSString*)string; -``` - -## Customization - -`SVProgressHUD` can be customized via the following methods: - -```objective-c -+ (void)setDefaultStyle:(SVProgressHUDStyle)style; // default is SVProgressHUDStyleLight -+ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone -+ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type; // default is SVProgressHUDAnimationTypeFlat -+ (void)setContainerView:(UIView*)containerView; // default is window level -+ (void)setMinimumSize:(CGSize)minimumSize; // default is CGSizeZero, can be used to avoid resizing -+ (void)setRingThickness:(CGFloat)width; // default is 2 pt -+ (void)setRingRadius:(CGFloat)radius; // default is 18 pt -+ (void)setRingNoTextRadius:(CGFloat)radius; // default is 24 pt -+ (void)setCornerRadius:(CGFloat)cornerRadius; // default is 14 pt -+ (void)setBorderColor:(nonnull UIColor*)color; // default is nil -+ (void)setBorderWidth:(CGFloat)width; // default is 0 -+ (void)setFont:(UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] -+ (void)setForegroundColor:(UIColor*)color; // default is [UIColor blackColor], only used for SVProgressHUDStyleCustom -+ (void)setBackgroundColor:(UIColor*)color; // default is [UIColor whiteColor], only used for SVProgressHUDStyleCustom -+ (void)setBackgroundLayerColor:(UIColor*)color; // default is [UIColor colorWithWhite:0 alpha:0.4], only used for SVProgressHUDMaskTypeCustom -+ (void)setImageViewSize:(CGSize)size; // default is 28x28 pt -+ (void)setInfoImage:(UIImage*)image; // default is the bundled info image provided by Freepik -+ (void)setSuccessImage:(UIImage*)image; // default is bundled success image from Freepik -+ (void)setErrorImage:(UIImage*)image; // default is bundled error image from Freepik -+ (void)setViewForExtension:(UIView*)view; // default is nil, only used if #define SV_APP_EXTENSIONS is set -+ (void)setGraceTimeInterval:(NSTimeInterval)interval; // default is 0 seconds -+ (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval; // default is 5.0 seconds -+ (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval; // default is CGFLOAT_MAX -+ (void)setFadeInAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds -+ (void)setFadeOutAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds -+ (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel; // default is UIWindowLevelNormal -+ (void)setHapticsEnabled:(BOOL)hapticsEnabled; // default is NO -``` - -Additionally `SVProgressHUD` supports the `UIAppearance` protocol for most of the above methods. - -### Hint - -As standard `SVProgressHUD` offers two preconfigured styles: - -* `SVProgressHUDStyleLight`: White background with black spinner and text -* `SVProgressHUDStyleDark`: Black background with white spinner and text - -If you want to use custom colors use `setForegroundColor` and `setBackgroundColor:`. These implicity set the HUD's style to `SVProgressHUDStyleCustom`. - -## Haptic Feedback - -For users with newer devices (starting with the iPhone 7), `SVProgressHUD` can automatically trigger haptic feedback depending on which HUD is being displayed. The feedback maps as follows: - -* `showSuccessWithStatus:` <-> `UINotificationFeedbackTypeSuccess` -* `showInfoWithStatus:` <-> `UINotificationFeedbackTypeWarning` -* `showErrorWithStatus:` <-> `UINotificationFeedbackTypeError` - -To enable this functionality, use `setHapticsEnabled:`. - -Users with devices prior to iPhone 7 will have no change in functionality. - -## Notifications - -`SVProgressHUD` posts four notifications via `NSNotificationCenter` in response to being shown/dismissed: -* `SVProgressHUDWillAppearNotification` when the show animation starts -* `SVProgressHUDDidAppearNotification` when the show animation completes -* `SVProgressHUDWillDisappearNotification` when the dismiss animation starts -* `SVProgressHUDDidDisappearNotification` when the dismiss animation completes - -Each notification passes a `userInfo` dictionary holding the HUD's status string (if any), retrievable via `SVProgressHUDStatusUserInfoKey`. - -`SVProgressHUD` also posts `SVProgressHUDDidReceiveTouchEventNotification` when users touch on the overall screen or `SVProgressHUDDidTouchDownInsideNotification` when a user touches on the HUD directly. For this notifications `userInfo` is not passed but the object parameter contains the `UIEvent` that related to the touch. - -## App Extensions - -When using `SVProgressHUD` in an App Extension, `#define SV_APP_EXTENSIONS` to avoid using unavailable APIs. Additionally call `setViewForExtension:` from your extensions view controller with `self.view`. - -## Contributing to this project - -If you have feature requests or bug reports, feel free to help out by sending pull requests or by [creating new issues](https://github.com/SVProgressHUD/SVProgressHUD/issues/new). Please take a moment to -review the guidelines written by [Nicolas Gallagher](https://github.com/necolas): - -* [Bug reports](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#bugs) -* [Feature requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#features) -* [Pull requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#pull-requests) - -## License - -`SVProgressHUD` is distributed under the terms and conditions of the [MIT license](https://github.com/SVProgressHUD/SVProgressHUD/blob/master/LICENSE.txt). The success, error and info icons are made by [Freepik](http://www.freepik.com) from [Flaticon](http://www.flaticon.com) and are licensed under [Creative Commons BY 3.0](http://creativecommons.org/licenses/by/3.0/). - -## Credits - -`SVProgressHUD` is brought to you by [Sam Vermette](http://samvermette.com), [Tobias Tiemerding](http://tiemerding.com) and [contributors to the project](https://github.com/SVProgressHUD/SVProgressHUD/contributors). If you're using `SVProgressHUD` in your project, attribution would be very appreciated. diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h b/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h deleted file mode 100644 index 30141e370..000000000 --- a/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// SVIndefiniteAnimatedView.h -// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD -// -// Copyright (c) 2014-2017 Guillaume Campagna. All rights reserved. -// - -#import - -@interface SVIndefiniteAnimatedView : UIView - -@property (nonatomic, assign) CGFloat strokeThickness; -@property (nonatomic, assign) CGFloat radius; -@property (nonatomic, strong) UIColor *strokeColor; - -@end - diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m b/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m deleted file mode 100644 index 064533d51..000000000 --- a/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m +++ /dev/null @@ -1,137 +0,0 @@ -// -// SVIndefiniteAnimatedView.m -// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD -// -// Copyright (c) 2014-2017 Guillaume Campagna. All rights reserved. -// - -#import "SVIndefiniteAnimatedView.h" -#import "SVProgressHUD.h" - -@interface SVIndefiniteAnimatedView () - -@property (nonatomic, strong) CAShapeLayer *indefiniteAnimatedLayer; - -@end - -@implementation SVIndefiniteAnimatedView - -- (void)willMoveToSuperview:(UIView*)newSuperview { - if (newSuperview) { - [self layoutAnimatedLayer]; - } else { - [_indefiniteAnimatedLayer removeFromSuperlayer]; - _indefiniteAnimatedLayer = nil; - } -} - -- (void)layoutAnimatedLayer { - CALayer *layer = self.indefiniteAnimatedLayer; - [self.layer addSublayer:layer]; - - CGFloat widthDiff = CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds); - CGFloat heightDiff = CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds); - layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2 - widthDiff / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2 - heightDiff / 2); -} - -- (CAShapeLayer*)indefiniteAnimatedLayer { - if(!_indefiniteAnimatedLayer) { - CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5); - UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter radius:self.radius startAngle:(CGFloat) (M_PI*3/2) endAngle:(CGFloat) (M_PI/2+M_PI*5) clockwise:YES]; - - _indefiniteAnimatedLayer = [CAShapeLayer layer]; - _indefiniteAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale]; - _indefiniteAnimatedLayer.frame = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2); - _indefiniteAnimatedLayer.fillColor = [UIColor clearColor].CGColor; - _indefiniteAnimatedLayer.strokeColor = self.strokeColor.CGColor; - _indefiniteAnimatedLayer.lineWidth = self.strokeThickness; - _indefiniteAnimatedLayer.lineCap = kCALineCapRound; - _indefiniteAnimatedLayer.lineJoin = kCALineJoinBevel; - _indefiniteAnimatedLayer.path = smoothedPath.CGPath; - - CALayer *maskLayer = [CALayer layer]; - - NSBundle *bundle = [NSBundle bundleForClass:[SVProgressHUD class]]; - NSURL *url = [bundle URLForResource:@"SVProgressHUD" withExtension:@"bundle"]; - NSBundle *imageBundle = [NSBundle bundleWithURL:url]; - - NSString *path = [imageBundle pathForResource:@"angle-mask" ofType:@"png"]; - - maskLayer.contents = (__bridge id)[[UIImage imageWithContentsOfFile:path] CGImage]; - maskLayer.frame = _indefiniteAnimatedLayer.bounds; - _indefiniteAnimatedLayer.mask = maskLayer; - - NSTimeInterval animationDuration = 1; - CAMediaTimingFunction *linearCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; - - CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; - animation.fromValue = (id) 0; - animation.toValue = @(M_PI*2); - animation.duration = animationDuration; - animation.timingFunction = linearCurve; - animation.removedOnCompletion = NO; - animation.repeatCount = INFINITY; - animation.fillMode = kCAFillModeForwards; - animation.autoreverses = NO; - [_indefiniteAnimatedLayer.mask addAnimation:animation forKey:@"rotate"]; - - CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; - animationGroup.duration = animationDuration; - animationGroup.repeatCount = INFINITY; - animationGroup.removedOnCompletion = NO; - animationGroup.timingFunction = linearCurve; - - CABasicAnimation *strokeStartAnimation = [CABasicAnimation animationWithKeyPath:@"strokeStart"]; - strokeStartAnimation.fromValue = @0.015; - strokeStartAnimation.toValue = @0.515; - - CABasicAnimation *strokeEndAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; - strokeEndAnimation.fromValue = @0.485; - strokeEndAnimation.toValue = @0.985; - - animationGroup.animations = @[strokeStartAnimation, strokeEndAnimation]; - [_indefiniteAnimatedLayer addAnimation:animationGroup forKey:@"progress"]; - - } - return _indefiniteAnimatedLayer; -} - -- (void)setFrame:(CGRect)frame { - if(!CGRectEqualToRect(frame, super.frame)) { - [super setFrame:frame]; - - if(self.superview) { - [self layoutAnimatedLayer]; - } - } - -} - -- (void)setRadius:(CGFloat)radius { - if(radius != _radius) { - _radius = radius; - - [_indefiniteAnimatedLayer removeFromSuperlayer]; - _indefiniteAnimatedLayer = nil; - - if(self.superview) { - [self layoutAnimatedLayer]; - } - } -} - -- (void)setStrokeColor:(UIColor*)strokeColor { - _strokeColor = strokeColor; - _indefiniteAnimatedLayer.strokeColor = strokeColor.CGColor; -} - -- (void)setStrokeThickness:(CGFloat)strokeThickness { - _strokeThickness = strokeThickness; - _indefiniteAnimatedLayer.lineWidth = _strokeThickness; -} - -- (CGSize)sizeThatFits:(CGSize)size { - return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2); -} - -@end diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.h b/Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.h deleted file mode 100644 index 5c02a8231..000000000 --- a/Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// SVProgressAnimatedView.h -// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD -// -// Copyright (c) 2017 Tobias Tiemerding. All rights reserved. -// - -#import - -@interface SVProgressAnimatedView : UIView - -@property (nonatomic, assign) CGFloat radius; -@property (nonatomic, assign) CGFloat strokeThickness; -@property (nonatomic, strong) UIColor *strokeColor; -@property (nonatomic, assign) CGFloat strokeEnd; - -@end diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.m b/Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.m deleted file mode 100644 index 0e11c9333..000000000 --- a/Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.m +++ /dev/null @@ -1,96 +0,0 @@ -// -// SVProgressAnimatedView.m -// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD -// -// Copyright (c) 2017 Tobias Tiemerding. All rights reserved. -// - -#import "SVProgressAnimatedView.h" - -@interface SVProgressAnimatedView () - -@property (nonatomic, strong) CAShapeLayer *ringAnimatedLayer; - -@end - -@implementation SVProgressAnimatedView - -- (void)willMoveToSuperview:(UIView*)newSuperview { - if (newSuperview) { - [self layoutAnimatedLayer]; - } else { - [_ringAnimatedLayer removeFromSuperlayer]; - _ringAnimatedLayer = nil; - } -} - -- (void)layoutAnimatedLayer { - CALayer *layer = self.ringAnimatedLayer; - [self.layer addSublayer:layer]; - - CGFloat widthDiff = CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds); - CGFloat heightDiff = CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds); - layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2 - widthDiff / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2 - heightDiff / 2); -} - -- (CAShapeLayer*)ringAnimatedLayer { - if(!_ringAnimatedLayer) { - CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5); - UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter radius:self.radius startAngle:(CGFloat)-M_PI_2 endAngle:(CGFloat) (M_PI + M_PI_2) clockwise:YES]; - - _ringAnimatedLayer = [CAShapeLayer layer]; - _ringAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale]; - _ringAnimatedLayer.frame = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2); - _ringAnimatedLayer.fillColor = [UIColor clearColor].CGColor; - _ringAnimatedLayer.strokeColor = self.strokeColor.CGColor; - _ringAnimatedLayer.lineWidth = self.strokeThickness; - _ringAnimatedLayer.lineCap = kCALineCapRound; - _ringAnimatedLayer.lineJoin = kCALineJoinBevel; - _ringAnimatedLayer.path = smoothedPath.CGPath; - } - return _ringAnimatedLayer; -} - -- (void)setFrame:(CGRect)frame { - if(!CGRectEqualToRect(frame, super.frame)) { - [super setFrame:frame]; - - if(self.superview) { - [self layoutAnimatedLayer]; - } - } -} - -- (void)setRadius:(CGFloat)radius { - if(radius != _radius) { - _radius = radius; - - [_ringAnimatedLayer removeFromSuperlayer]; - _ringAnimatedLayer = nil; - - if(self.superview) { - [self layoutAnimatedLayer]; - } - } -} - -- (void)setStrokeColor:(UIColor*)strokeColor { - _strokeColor = strokeColor; - _ringAnimatedLayer.strokeColor = strokeColor.CGColor; -} - -- (void)setStrokeThickness:(CGFloat)strokeThickness { - _strokeThickness = strokeThickness; - _ringAnimatedLayer.lineWidth = _strokeThickness; -} - -- (void)setStrokeEnd:(CGFloat)strokeEnd { - _strokeEnd = strokeEnd; - _ringAnimatedLayer.strokeEnd = _strokeEnd; -} - -- (CGSize)sizeThatFits:(CGSize)size { - return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2); -} - -@end diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png deleted file mode 100644 index 0150a03f5..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png deleted file mode 100644 index 9a302b680..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png deleted file mode 100644 index d07f3ce67..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png deleted file mode 100644 index a57c8e446..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png deleted file mode 100644 index aaf679854..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png deleted file mode 100644 index c92518f85..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png deleted file mode 100644 index a3a1f75c2..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png deleted file mode 100644 index 1b333e7b8..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png deleted file mode 100644 index d56aa0c22..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png deleted file mode 100644 index 44769d028..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png deleted file mode 100644 index a9d16532f..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png deleted file mode 100644 index 42bad9be6..000000000 Binary files a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png and /dev/null differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h deleted file mode 100644 index d02698154..000000000 --- a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h +++ /dev/null @@ -1,151 +0,0 @@ -// -// SVProgressHUD.h -// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD -// -// Copyright (c) 2011-2017 Sam Vermette and contributors. All rights reserved. -// - -#import -#import - -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 - -#define UI_APPEARANCE_SELECTOR - -#endif - -extern NSString * _Nonnull const SVProgressHUDDidReceiveTouchEventNotification; -extern NSString * _Nonnull const SVProgressHUDDidTouchDownInsideNotification; -extern NSString * _Nonnull const SVProgressHUDWillDisappearNotification; -extern NSString * _Nonnull const SVProgressHUDDidDisappearNotification; -extern NSString * _Nonnull const SVProgressHUDWillAppearNotification; -extern NSString * _Nonnull const SVProgressHUDDidAppearNotification; - -extern NSString * _Nonnull const SVProgressHUDStatusUserInfoKey; - -typedef NS_ENUM(NSInteger, SVProgressHUDStyle) { - SVProgressHUDStyleLight, // default style, white HUD with black text, HUD background will be blurred - SVProgressHUDStyleDark, // black HUD and white text, HUD background will be blurred - SVProgressHUDStyleCustom // uses the fore- and background color properties -}; - -typedef NS_ENUM(NSUInteger, SVProgressHUDMaskType) { - SVProgressHUDMaskTypeNone = 1, // default mask type, allow user interactions while HUD is displayed - SVProgressHUDMaskTypeClear, // don't allow user interactions with background objects - SVProgressHUDMaskTypeBlack, // don't allow user interactions with background objects and dim the UI in the back of the HUD (as seen in iOS 7 and above) - SVProgressHUDMaskTypeGradient, // don't allow user interactions with background objects and dim the UI with a a-la UIAlertView background gradient (as seen in iOS 6) - SVProgressHUDMaskTypeCustom // don't allow user interactions with background objects and dim the UI in the back of the HUD with a custom color -}; - -typedef NS_ENUM(NSUInteger, SVProgressHUDAnimationType) { - SVProgressHUDAnimationTypeFlat, // default animation type, custom flat animation (indefinite animated ring) - SVProgressHUDAnimationTypeNative // iOS native UIActivityIndicatorView -}; - -typedef void (^SVProgressHUDShowCompletion)(void); -typedef void (^SVProgressHUDDismissCompletion)(void); - -@interface SVProgressHUD : UIView - -#pragma mark - Customization - -@property (assign, nonatomic) SVProgressHUDStyle defaultStyle UI_APPEARANCE_SELECTOR; // default is SVProgressHUDStyleLight -@property (assign, nonatomic) SVProgressHUDMaskType defaultMaskType UI_APPEARANCE_SELECTOR; // default is SVProgressHUDMaskTypeNone -@property (assign, nonatomic) SVProgressHUDAnimationType defaultAnimationType UI_APPEARANCE_SELECTOR; // default is SVProgressHUDAnimationTypeFlat -@property (strong, nonatomic, nullable) UIView *containerView; // if nil then use default window level -@property (assign, nonatomic) CGSize minimumSize UI_APPEARANCE_SELECTOR; // default is CGSizeZero, can be used to avoid resizing for a larger message -@property (assign, nonatomic) CGFloat ringThickness UI_APPEARANCE_SELECTOR; // default is 2 pt -@property (assign, nonatomic) CGFloat ringRadius UI_APPEARANCE_SELECTOR; // default is 18 pt -@property (assign, nonatomic) CGFloat ringNoTextRadius UI_APPEARANCE_SELECTOR; // default is 24 pt -@property (assign, nonatomic) CGFloat cornerRadius UI_APPEARANCE_SELECTOR; // default is 14 pt -@property (strong, nonatomic, nonnull) UIFont *font UI_APPEARANCE_SELECTOR; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] -@property (strong, nonatomic, nonnull) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; // default is [UIColor whiteColor] -@property (strong, nonatomic, nonnull) UIColor *foregroundColor UI_APPEARANCE_SELECTOR; // default is [UIColor blackColor] -@property (strong, nonatomic, nonnull) UIColor *backgroundLayerColor UI_APPEARANCE_SELECTOR;// default is [UIColor colorWithWhite:0 alpha:0.4] -@property (assign, nonatomic) CGSize imageViewSize UI_APPEARANCE_SELECTOR; // default is 28x28 pt -@property (strong, nonatomic, nonnull) UIImage *infoImage UI_APPEARANCE_SELECTOR; // default is the bundled info image provided by Freepik -@property (strong, nonatomic, nonnull) UIImage *successImage UI_APPEARANCE_SELECTOR; // default is the bundled success image provided by Freepik -@property (strong, nonatomic, nonnull) UIImage *errorImage UI_APPEARANCE_SELECTOR; // default is the bundled error image provided by Freepik -@property (strong, nonatomic, nonnull) UIView *viewForExtension UI_APPEARANCE_SELECTOR; // default is nil, only used if #define SV_APP_EXTENSIONS is set -@property (assign, nonatomic) NSTimeInterval graceTimeInterval; // default is 0 seconds -@property (assign, nonatomic) NSTimeInterval minimumDismissTimeInterval; // default is 5.0 seconds -@property (assign, nonatomic) NSTimeInterval maximumDismissTimeInterval; // default is CGFLOAT_MAX - -@property (assign, nonatomic) UIOffset offsetFromCenter UI_APPEARANCE_SELECTOR; // default is 0, 0 - -@property (assign, nonatomic) NSTimeInterval fadeInAnimationDuration UI_APPEARANCE_SELECTOR; // default is 0.15 -@property (assign, nonatomic) NSTimeInterval fadeOutAnimationDuration UI_APPEARANCE_SELECTOR; // default is 0.15 - -@property (assign, nonatomic) UIWindowLevel maxSupportedWindowLevel; // default is UIWindowLevelNormal - -@property (assign, nonatomic) BOOL hapticsEnabled; // default is NO - -+ (void)setDefaultStyle:(SVProgressHUDStyle)style; // default is SVProgressHUDStyleLight -+ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone -+ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type; // default is SVProgressHUDAnimationTypeFlat -+ (void)setContainerView:(nullable UIView*)containerView; // default is window level -+ (void)setMinimumSize:(CGSize)minimumSize; // default is CGSizeZero, can be used to avoid resizing for a larger message -+ (void)setRingThickness:(CGFloat)ringThickness; // default is 2 pt -+ (void)setRingRadius:(CGFloat)radius; // default is 18 pt -+ (void)setRingNoTextRadius:(CGFloat)radius; // default is 24 pt -+ (void)setCornerRadius:(CGFloat)cornerRadius; // default is 14 pt -+ (void)setBorderColor:(nonnull UIColor*)color; // default is nil -+ (void)setBorderWidth:(CGFloat)width; // default is 0 -+ (void)setFont:(nonnull UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] -+ (void)setForegroundColor:(nonnull UIColor*)color; // default is [UIColor blackColor], only used for SVProgressHUDStyleCustom -+ (void)setBackgroundColor:(nonnull UIColor*)color; // default is [UIColor whiteColor], only used for SVProgressHUDStyleCustom -+ (void)setBackgroundLayerColor:(nonnull UIColor*)color; // default is [UIColor colorWithWhite:0 alpha:0.5], only used for SVProgressHUDMaskTypeCustom -+ (void)setImageViewSize:(CGSize)size; // default is 28x28 pt -+ (void)setInfoImage:(nonnull UIImage*)image; // default is the bundled info image provided by Freepik -+ (void)setSuccessImage:(nonnull UIImage*)image; // default is the bundled success image provided by Freepik -+ (void)setErrorImage:(nonnull UIImage*)image; // default is the bundled error image provided by Freepik -+ (void)setViewForExtension:(nonnull UIView*)view; // default is nil, only used if #define SV_APP_EXTENSIONS is set -+ (void)setGraceTimeInterval:(NSTimeInterval)interval; // default is 0 seconds -+ (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval; // default is 5.0 seconds -+ (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval; // default is infinite -+ (void)setFadeInAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds -+ (void)setFadeOutAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds -+ (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel; // default is UIWindowLevelNormal -+ (void)setHapticsEnabled:(BOOL)hapticsEnabled; // default is NO - -#pragma mark - Show Methods - -+ (void)show; -+ (void)showWithMaskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use show and setDefaultMaskType: instead."))); -+ (void)showWithStatus:(nullable NSString*)status; -+ (void)showWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showWithStatus: and setDefaultMaskType: instead."))); - -+ (void)showProgress:(float)progress; -+ (void)showProgress:(float)progress maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showProgress: and setDefaultMaskType: instead."))); -+ (void)showProgress:(float)progress status:(nullable NSString*)status; -+ (void)showProgress:(float)progress status:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showProgress:status: and setDefaultMaskType: instead."))); - -+ (void)setStatus:(nullable NSString*)status; // change the HUD loading status while it's showing - -// stops the activity indicator, shows a glyph + status, and dismisses the HUD a little bit later -+ (void)showInfoWithStatus:(nullable NSString*)status; -+ (void)showInfoWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showInfoWithStatus: and setDefaultMaskType: instead."))); -+ (void)showSuccessWithStatus:(nullable NSString*)status; -+ (void)showSuccessWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showSuccessWithStatus: and setDefaultMaskType: instead."))); -+ (void)showErrorWithStatus:(nullable NSString*)status; -+ (void)showErrorWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showErrorWithStatus: and setDefaultMaskType: instead."))); - -// shows a image + status, use white PNGs with the imageViewSize (default is 28x28 pt) -+ (void)showImage:(nonnull UIImage*)image status:(nullable NSString*)status; -+ (void)showImage:(nonnull UIImage*)image status:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showImage:status: and setDefaultMaskType: instead."))); - -+ (void)setOffsetFromCenter:(UIOffset)offset; -+ (void)resetOffsetFromCenter; - -+ (void)popActivity; // decrease activity count, if activity count == 0 the HUD is dismissed -+ (void)dismiss; -+ (void)dismissWithCompletion:(nullable SVProgressHUDDismissCompletion)completion; -+ (void)dismissWithDelay:(NSTimeInterval)delay; -+ (void)dismissWithDelay:(NSTimeInterval)delay completion:(nullable SVProgressHUDDismissCompletion)completion; - -+ (BOOL)isVisible; - -+ (NSTimeInterval)displayDurationForString:(nullable NSString*)string; - -@end - diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m deleted file mode 100644 index 342ee3e6e..000000000 --- a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m +++ /dev/null @@ -1,1537 +0,0 @@ -// -// SVProgressHUD.h -// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD -// -// Copyright (c) 2011-2017 Sam Vermette and contributors. All rights reserved. -// - -#if !__has_feature(objc_arc) -#error SVProgressHUD is ARC only. Either turn on ARC for the project or use -fobjc-arc flag -#endif - -#import "SVProgressHUD.h" -#import "SVIndefiniteAnimatedView.h" -#import "SVProgressAnimatedView.h" -#import "SVRadialGradientLayer.h" - -NSString * const SVProgressHUDDidReceiveTouchEventNotification = @"SVProgressHUDDidReceiveTouchEventNotification"; -NSString * const SVProgressHUDDidTouchDownInsideNotification = @"SVProgressHUDDidTouchDownInsideNotification"; -NSString * const SVProgressHUDWillDisappearNotification = @"SVProgressHUDWillDisappearNotification"; -NSString * const SVProgressHUDDidDisappearNotification = @"SVProgressHUDDidDisappearNotification"; -NSString * const SVProgressHUDWillAppearNotification = @"SVProgressHUDWillAppearNotification"; -NSString * const SVProgressHUDDidAppearNotification = @"SVProgressHUDDidAppearNotification"; - -NSString * const SVProgressHUDStatusUserInfoKey = @"SVProgressHUDStatusUserInfoKey"; - -static const CGFloat SVProgressHUDParallaxDepthPoints = 10.0f; -static const CGFloat SVProgressHUDUndefinedProgress = -1; -static const CGFloat SVProgressHUDDefaultAnimationDuration = 0.15f; -static const CGFloat SVProgressHUDVerticalSpacing = 12.0f; -static const CGFloat SVProgressHUDHorizontalSpacing = 12.0f; -static const CGFloat SVProgressHUDLabelSpacing = 8.0f; - - -@interface SVProgressHUD () - -@property (nonatomic, strong) NSTimer *graceTimer; -@property (nonatomic, strong) NSTimer *fadeOutTimer; - -@property (nonatomic, strong) UIControl *controlView; -@property (nonatomic, strong) UIView *backgroundView; -@property (nonatomic, strong) SVRadialGradientLayer *backgroundRadialGradientLayer; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 -@property (nonatomic, strong) UIVisualEffectView *hudView; -#else -@property (nonatomic, strong) UIView *hudView; -#endif -@property (nonatomic, strong) UILabel *statusLabel; -@property (nonatomic, strong) UIImageView *imageView; - -@property (nonatomic, strong) UIView *indefiniteAnimatedView; -@property (nonatomic, strong) SVProgressAnimatedView *ringView; -@property (nonatomic, strong) SVProgressAnimatedView *backgroundRingView; - -@property (nonatomic, readwrite) CGFloat progress; -@property (nonatomic, readwrite) NSUInteger activityCount; - -@property (nonatomic, readonly) CGFloat visibleKeyboardHeight; -@property (nonatomic, readonly) UIWindow *frontWindow; - -#if TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 -@property (nonatomic, strong) UINotificationFeedbackGenerator *hapticGenerator; -#endif - -@end - -@implementation SVProgressHUD { - BOOL _isInitializing; -} - -+ (SVProgressHUD*)sharedView { - static dispatch_once_t once; - - static SVProgressHUD *sharedView; -#if !defined(SV_APP_EXTENSIONS) - dispatch_once(&once, ^{ sharedView = [[self alloc] initWithFrame:[[[UIApplication sharedApplication] delegate] window].bounds]; }); -#else - dispatch_once(&once, ^{ sharedView = [[self alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; }); -#endif - return sharedView; -} - - -#pragma mark - Setters - -+ (void)setStatus:(NSString*)status { - [[self sharedView] setStatus:status]; -} - -+ (void)setDefaultStyle:(SVProgressHUDStyle)style { - [self sharedView].defaultStyle = style; -} - -+ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType { - [self sharedView].defaultMaskType = maskType; -} - -+ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type { - [self sharedView].defaultAnimationType = type; -} - -+ (void)setContainerView:(nullable UIView*)containerView { - [self sharedView].containerView = containerView; -} - -+ (void)setMinimumSize:(CGSize)minimumSize { - [self sharedView].minimumSize = minimumSize; -} - -+ (void)setRingThickness:(CGFloat)ringThickness { - [self sharedView].ringThickness = ringThickness; -} - -+ (void)setRingRadius:(CGFloat)radius { - [self sharedView].ringRadius = radius; -} - -+ (void)setRingNoTextRadius:(CGFloat)radius { - [self sharedView].ringNoTextRadius = radius; -} - -+ (void)setCornerRadius:(CGFloat)cornerRadius { - [self sharedView].cornerRadius = cornerRadius; -} - -+ (void)setBorderColor:(nonnull UIColor*)color { - [self sharedView].hudView.layer.borderColor = color.CGColor; -} - -+ (void)setBorderWidth:(CGFloat)width { - [self sharedView].hudView.layer.borderWidth = width; -} - -+ (void)setFont:(UIFont*)font { - [self sharedView].font = font; -} - -+ (void)setForegroundColor:(UIColor*)color { - [self sharedView].foregroundColor = color; - [self setDefaultStyle:SVProgressHUDStyleCustom]; -} - -+ (void)setBackgroundColor:(UIColor*)color { - [self sharedView].backgroundColor = color; - [self setDefaultStyle:SVProgressHUDStyleCustom]; -} - -+ (void)setBackgroundLayerColor:(UIColor*)color { - [self sharedView].backgroundLayerColor = color; -} - -+ (void)setImageViewSize:(CGSize)size { - [self sharedView].imageViewSize = size; -} - -+ (void)setInfoImage:(UIImage*)image { - [self sharedView].infoImage = image; -} - -+ (void)setSuccessImage:(UIImage*)image { - [self sharedView].successImage = image; -} - -+ (void)setErrorImage:(UIImage*)image { - [self sharedView].errorImage = image; -} - -+ (void)setViewForExtension:(UIView*)view { - [self sharedView].viewForExtension = view; -} - -+ (void)setGraceTimeInterval:(NSTimeInterval)interval { - [self sharedView].graceTimeInterval = interval; -} - -+ (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval { - [self sharedView].minimumDismissTimeInterval = interval; -} - -+ (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval { - [self sharedView].maximumDismissTimeInterval = interval; -} - -+ (void)setFadeInAnimationDuration:(NSTimeInterval)duration { - [self sharedView].fadeInAnimationDuration = duration; -} - -+ (void)setFadeOutAnimationDuration:(NSTimeInterval)duration { - [self sharedView].fadeOutAnimationDuration = duration; -} - -+ (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel { - [self sharedView].maxSupportedWindowLevel = windowLevel; -} - -+ (void)setHapticsEnabled:(BOOL)hapticsEnabled { - [self sharedView].hapticsEnabled = hapticsEnabled; -} - -#pragma mark - Show Methods - -+ (void)show { - [self showWithStatus:nil]; -} - -+ (void)showWithMaskType:(SVProgressHUDMaskType)maskType { - SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; - [self setDefaultMaskType:maskType]; - [self show]; - [self setDefaultMaskType:existingMaskType]; -} - -+ (void)showWithStatus:(NSString*)status { - [self showProgress:SVProgressHUDUndefinedProgress status:status]; -} - -+ (void)showWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType { - SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; - [self setDefaultMaskType:maskType]; - [self showWithStatus:status]; - [self setDefaultMaskType:existingMaskType]; -} - -+ (void)showProgress:(float)progress { - [self showProgress:progress status:nil]; -} - -+ (void)showProgress:(float)progress maskType:(SVProgressHUDMaskType)maskType { - SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; - [self setDefaultMaskType:maskType]; - [self showProgress:progress]; - [self setDefaultMaskType:existingMaskType]; -} - -+ (void)showProgress:(float)progress status:(NSString*)status { - [[self sharedView] showProgress:progress status:status]; -} - -+ (void)showProgress:(float)progress status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType { - SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; - [self setDefaultMaskType:maskType]; - [self showProgress:progress status:status]; - [self setDefaultMaskType:existingMaskType]; -} - - -#pragma mark - Show, then automatically dismiss methods - -+ (void)showInfoWithStatus:(NSString*)status { - [self showImage:[self sharedView].infoImage status:status]; - -#if TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 - dispatch_async(dispatch_get_main_queue(), ^{ - [[self sharedView].hapticGenerator notificationOccurred:UINotificationFeedbackTypeWarning]; - }); -#endif -} - -+ (void)showInfoWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType { - SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; - [self setDefaultMaskType:maskType]; - [self showInfoWithStatus:status]; - [self setDefaultMaskType:existingMaskType]; -} - -+ (void)showSuccessWithStatus:(NSString*)status { - [self showImage:[self sharedView].successImage status:status]; - -#if TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 - dispatch_async(dispatch_get_main_queue(), ^{ - [[self sharedView].hapticGenerator notificationOccurred:UINotificationFeedbackTypeSuccess]; - }); -#endif -} - -+ (void)showSuccessWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType { - SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; - [self setDefaultMaskType:maskType]; - [self showSuccessWithStatus:status]; - [self setDefaultMaskType:existingMaskType]; - -#if TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 - dispatch_async(dispatch_get_main_queue(), ^{ - [[self sharedView].hapticGenerator notificationOccurred:UINotificationFeedbackTypeSuccess]; - }); -#endif -} - -+ (void)showErrorWithStatus:(NSString*)status { - [self showImage:[self sharedView].errorImage status:status]; - -#if TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 - dispatch_async(dispatch_get_main_queue(), ^{ - [[self sharedView].hapticGenerator notificationOccurred:UINotificationFeedbackTypeError]; - }); -#endif -} - -+ (void)showErrorWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType { - SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; - [self setDefaultMaskType:maskType]; - [self showErrorWithStatus:status]; - [self setDefaultMaskType:existingMaskType]; - -#if TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 - dispatch_async(dispatch_get_main_queue(), ^{ - [[self sharedView].hapticGenerator notificationOccurred:UINotificationFeedbackTypeError]; - }); -#endif -} - -+ (void)showImage:(UIImage*)image status:(NSString*)status { - NSTimeInterval displayInterval = [self displayDurationForString:status]; - [[self sharedView] showImage:image status:status duration:displayInterval]; -} - -+ (void)showImage:(UIImage*)image status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType { - SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; - [self setDefaultMaskType:maskType]; - [self showImage:image status:status]; - [self setDefaultMaskType:existingMaskType]; -} - - -#pragma mark - Dismiss Methods - -+ (void)popActivity { - if([self sharedView].activityCount > 0) { - [self sharedView].activityCount--; - } - if([self sharedView].activityCount == 0) { - [[self sharedView] dismiss]; - } -} - -+ (void)dismiss { - [self dismissWithDelay:0.0 completion:nil]; -} - -+ (void)dismissWithCompletion:(SVProgressHUDDismissCompletion)completion { - [self dismissWithDelay:0.0 completion:completion]; -} - -+ (void)dismissWithDelay:(NSTimeInterval)delay { - [self dismissWithDelay:delay completion:nil]; -} - -+ (void)dismissWithDelay:(NSTimeInterval)delay completion:(SVProgressHUDDismissCompletion)completion { - [[self sharedView] dismissWithDelay:delay completion:completion]; -} - - -#pragma mark - Offset - -+ (void)setOffsetFromCenter:(UIOffset)offset { - [self sharedView].offsetFromCenter = offset; -} - -+ (void)resetOffsetFromCenter { - [self setOffsetFromCenter:UIOffsetZero]; -} - - -#pragma mark - Instance Methods - -- (instancetype)initWithFrame:(CGRect)frame { - if((self = [super initWithFrame:frame])) { - _isInitializing = YES; - - self.userInteractionEnabled = NO; - self.activityCount = 0; - - self.backgroundView.alpha = 0.0f; - self.imageView.alpha = 0.0f; - self.statusLabel.alpha = 0.0f; - self.indefiniteAnimatedView.alpha = 0.0f; - self.ringView.alpha = self.backgroundRingView.alpha = 0.0f; - - - _backgroundColor = [UIColor whiteColor]; - _foregroundColor = [UIColor blackColor]; - _backgroundLayerColor = [UIColor colorWithWhite:0 alpha:0.4]; - - // Set default values - _defaultMaskType = SVProgressHUDMaskTypeNone; - _defaultStyle = SVProgressHUDStyleLight; - _defaultAnimationType = SVProgressHUDAnimationTypeFlat; - _minimumSize = CGSizeZero; - _font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; - - NSBundle *bundle = [NSBundle bundleForClass:[SVProgressHUD class]]; - NSURL *url = [bundle URLForResource:@"SVProgressHUD" withExtension:@"bundle"]; - NSBundle *imageBundle = [NSBundle bundleWithURL:url]; - - UIImage* infoImage = [UIImage imageWithContentsOfFile:[imageBundle pathForResource:@"info" ofType:@"png"]]; - UIImage* successImage = [UIImage imageWithContentsOfFile:[imageBundle pathForResource:@"success" ofType:@"png"]]; - UIImage* errorImage = [UIImage imageWithContentsOfFile:[imageBundle pathForResource:@"error" ofType:@"png"]]; - - _infoImage = [infoImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - _successImage = [successImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - _errorImage = [errorImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - - _ringThickness = 2.0f; - _ringRadius = 18.0f; - _ringNoTextRadius = 24.0f; - - _cornerRadius = 14.0f; - - _imageViewSize = CGSizeMake(28.0f, 28.0f); - - _graceTimeInterval = 0.0f; - _minimumDismissTimeInterval = 5.0; - _maximumDismissTimeInterval = CGFLOAT_MAX; - - _fadeInAnimationDuration = SVProgressHUDDefaultAnimationDuration; - _fadeOutAnimationDuration = SVProgressHUDDefaultAnimationDuration; - - _maxSupportedWindowLevel = UIWindowLevelNormal; - - _hapticsEnabled = NO; - - // Accessibility support - self.accessibilityIdentifier = @"SVProgressHUD"; - self.isAccessibilityElement = YES; - - _isInitializing = NO; - } - return self; -} - -- (void)updateHUDFrame { - // Check if an image or progress ring is displayed - BOOL imageUsed = (self.imageView.image) && !(self.imageView.hidden); - BOOL progressUsed = self.imageView.hidden; - - // Calculate size of string - CGRect labelRect = CGRectZero; - CGFloat labelHeight = 0.0f; - CGFloat labelWidth = 0.0f; - - if(self.statusLabel.text) { - CGSize constraintSize = CGSizeMake(200.0f, 300.0f); - labelRect = [self.statusLabel.text boundingRectWithSize:constraintSize - options:(NSStringDrawingOptions)(NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin) - attributes:@{NSFontAttributeName: self.statusLabel.font} - context:NULL]; - labelHeight = ceilf(CGRectGetHeight(labelRect)); - labelWidth = ceilf(CGRectGetWidth(labelRect)); - } - - // Calculate hud size based on content - // For the beginning use default values, these - // might get update if string is too large etc. - CGFloat hudWidth; - CGFloat hudHeight; - - CGFloat contentWidth = 0.0f; - CGFloat contentHeight = 0.0f; - - if(imageUsed || progressUsed) { - contentWidth = CGRectGetWidth(imageUsed ? self.imageView.frame : self.indefiniteAnimatedView.frame); - contentHeight = CGRectGetHeight(imageUsed ? self.imageView.frame : self.indefiniteAnimatedView.frame); - } - - // |-spacing-content-spacing-| - hudWidth = SVProgressHUDHorizontalSpacing + MAX(labelWidth, contentWidth) + SVProgressHUDHorizontalSpacing; - - // |-spacing-content-(labelSpacing-label-)spacing-| - hudHeight = SVProgressHUDVerticalSpacing + labelHeight + contentHeight + SVProgressHUDVerticalSpacing; - if(self.statusLabel.text && (imageUsed || progressUsed)){ - // Add spacing if both content and label are used - hudHeight += SVProgressHUDLabelSpacing; - } - - // Update values on subviews - self.hudView.bounds = CGRectMake(0.0f, 0.0f, MAX(self.minimumSize.width, hudWidth), MAX(self.minimumSize.height, hudHeight)); - - // Animate value update - [CATransaction begin]; - [CATransaction setDisableActions:YES]; - - // Spinner and image view - CGFloat centerY; - if(self.statusLabel.text) { - CGFloat yOffset = MAX(SVProgressHUDVerticalSpacing, (self.minimumSize.height - contentHeight - SVProgressHUDLabelSpacing - labelHeight) / 2.0f); - centerY = yOffset + contentHeight / 2.0f; - } else { - centerY = CGRectGetMidY(self.hudView.bounds); - } - self.indefiniteAnimatedView.center = CGPointMake(CGRectGetMidX(self.hudView.bounds), centerY); - if(self.progress != SVProgressHUDUndefinedProgress) { - self.backgroundRingView.center = self.ringView.center = CGPointMake(CGRectGetMidX(self.hudView.bounds), centerY); - } - self.imageView.center = CGPointMake(CGRectGetMidX(self.hudView.bounds), centerY); - - // Label - if(imageUsed || progressUsed) { - centerY = CGRectGetMaxY(imageUsed ? self.imageView.frame : self.indefiniteAnimatedView.frame) + SVProgressHUDLabelSpacing + labelHeight / 2.0f; - } else { - centerY = CGRectGetMidY(self.hudView.bounds); - } - self.statusLabel.frame = labelRect; - self.statusLabel.center = CGPointMake(CGRectGetMidX(self.hudView.bounds), centerY); - - [CATransaction commit]; -} - -#if TARGET_OS_IOS -- (void)updateMotionEffectForOrientation:(UIInterfaceOrientation)orientation { - UIInterpolatingMotionEffectType xMotionEffectType = UIInterfaceOrientationIsPortrait(orientation) ? UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis : UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis; - UIInterpolatingMotionEffectType yMotionEffectType = UIInterfaceOrientationIsPortrait(orientation) ? UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis : UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis; - [self updateMotionEffectForXMotionEffectType:xMotionEffectType yMotionEffectType:yMotionEffectType]; -} -#endif - -- (void)updateMotionEffectForXMotionEffectType:(UIInterpolatingMotionEffectType)xMotionEffectType yMotionEffectType:(UIInterpolatingMotionEffectType)yMotionEffectType { - UIInterpolatingMotionEffect *effectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:xMotionEffectType]; - effectX.minimumRelativeValue = @(-SVProgressHUDParallaxDepthPoints); - effectX.maximumRelativeValue = @(SVProgressHUDParallaxDepthPoints); - - UIInterpolatingMotionEffect *effectY = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:yMotionEffectType]; - effectY.minimumRelativeValue = @(-SVProgressHUDParallaxDepthPoints); - effectY.maximumRelativeValue = @(SVProgressHUDParallaxDepthPoints); - - UIMotionEffectGroup *effectGroup = [UIMotionEffectGroup new]; - effectGroup.motionEffects = @[effectX, effectY]; - - // Clear old motion effect, then add new motion effects - self.hudView.motionEffects = @[]; - [self.hudView addMotionEffect:effectGroup]; -} - -- (void)updateViewHierarchy { - // Add the overlay to the application window if necessary - if(!self.controlView.superview) { - if(self.containerView){ - [self.containerView addSubview:self.controlView]; - } else { -#if !defined(SV_APP_EXTENSIONS) - [self.frontWindow addSubview:self.controlView]; -#else - // If SVProgressHUD is used inside an app extension add it to the given view - if(self.viewForExtension) { - [self.viewForExtension addSubview:self.controlView]; - } -#endif - } - } else { - // The HUD is already on screen, but maybe not in front. Therefore - // ensure that overlay will be on top of rootViewController (which may - // be changed during runtime). - [self.controlView.superview bringSubviewToFront:self.controlView]; - } - - // Add self to the overlay view - if(!self.superview) { - [self.controlView addSubview:self]; - } -} - -- (void)setStatus:(NSString*)status { - self.statusLabel.text = status; - [self updateHUDFrame]; -} - -- (void)setGraceTimer:(NSTimer*)timer { - if(_graceTimer) { - [_graceTimer invalidate]; - _graceTimer = nil; - } - if(timer) { - _graceTimer = timer; - } -} - -- (void)setFadeOutTimer:(NSTimer*)timer { - if(_fadeOutTimer) { - [_fadeOutTimer invalidate]; - _fadeOutTimer = nil; - } - if(timer) { - _fadeOutTimer = timer; - } -} - - -#pragma mark - Notifications and their handling - -- (void)registerNotifications { -#if TARGET_OS_IOS - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(positionHUD:) - name:UIApplicationDidChangeStatusBarOrientationNotification - object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(positionHUD:) - name:UIKeyboardWillHideNotification - object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(positionHUD:) - name:UIKeyboardDidHideNotification - object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(positionHUD:) - name:UIKeyboardWillShowNotification - object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(positionHUD:) - name:UIKeyboardDidShowNotification - object:nil]; -#endif - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(positionHUD:) - name:UIApplicationDidBecomeActiveNotification - object:nil]; -} - -- (NSDictionary*)notificationUserInfo { - return (self.statusLabel.text ? @{SVProgressHUDStatusUserInfoKey : self.statusLabel.text} : nil); -} - -- (void)positionHUD:(NSNotification*)notification { - CGFloat keyboardHeight = 0.0f; - double animationDuration = 0.0; - -#if !defined(SV_APP_EXTENSIONS) && TARGET_OS_IOS - self.frame = [[[UIApplication sharedApplication] delegate] window].bounds; - UIInterfaceOrientation orientation = UIApplication.sharedApplication.statusBarOrientation; -#elif !defined(SV_APP_EXTENSIONS) && !TARGET_OS_IOS - self.frame= [UIApplication sharedApplication].keyWindow.bounds; -#else - if (self.viewForExtension) { - self.frame = self.viewForExtension.frame; - } else { - self.frame = UIScreen.mainScreen.bounds; - } -#if TARGET_OS_IOS - UIInterfaceOrientation orientation = CGRectGetWidth(self.frame) > CGRectGetHeight(self.frame) ? UIInterfaceOrientationLandscapeLeft : UIInterfaceOrientationPortrait; -#endif -#endif - - // No transforms applied to window in iOS 8, but only if compiled with iOS 8 SDK as base SDK, otherwise system supports old rotation logic. - BOOL ignoreOrientation = NO; -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - if([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]) { - ignoreOrientation = YES; - } -#endif - -#if TARGET_OS_IOS - // Get keyboardHeight in regard to current state - if(notification) { - NSDictionary* keyboardInfo = [notification userInfo]; - CGRect keyboardFrame = [keyboardInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue]; - animationDuration = [keyboardInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - - if(notification.name == UIKeyboardWillShowNotification || notification.name == UIKeyboardDidShowNotification) { - keyboardHeight = CGRectGetWidth(keyboardFrame); - - if(ignoreOrientation || UIInterfaceOrientationIsPortrait(orientation)) { - keyboardHeight = CGRectGetHeight(keyboardFrame); - } - } - } else { - keyboardHeight = self.visibleKeyboardHeight; - } -#endif - - // Get the currently active frame of the display (depends on orientation) - CGRect orientationFrame = self.bounds; - -#if !defined(SV_APP_EXTENSIONS) && TARGET_OS_IOS - CGRect statusBarFrame = UIApplication.sharedApplication.statusBarFrame; -#else - CGRect statusBarFrame = CGRectZero; -#endif - -#if TARGET_OS_IOS - if(!ignoreOrientation && UIInterfaceOrientationIsLandscape(orientation)) { - float temp = CGRectGetWidth(orientationFrame); - orientationFrame.size.width = CGRectGetHeight(orientationFrame); - orientationFrame.size.height = temp; - - temp = CGRectGetWidth(statusBarFrame); - statusBarFrame.size.width = CGRectGetHeight(statusBarFrame); - statusBarFrame.size.height = temp; - } - - // Update the motion effects in regard to orientation - [self updateMotionEffectForOrientation:orientation]; -#else - [self updateMotionEffectForXMotionEffectType:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis yMotionEffectType:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis]; -#endif - - // Calculate available height for display - CGFloat activeHeight = CGRectGetHeight(orientationFrame); - if(keyboardHeight > 0) { - activeHeight += CGRectGetHeight(statusBarFrame) * 2; - } - activeHeight -= keyboardHeight; - - CGFloat posX = CGRectGetMidX(orientationFrame); - CGFloat posY = floorf(activeHeight*0.45f); - - CGFloat rotateAngle = 0.0; - CGPoint newCenter = CGPointMake(posX, posY); - - if(notification) { - // Animate update if notification was present - [UIView animateWithDuration:animationDuration - delay:0 - options:(UIViewAnimationOptions) (UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState) - animations:^{ - [self moveToPoint:newCenter rotateAngle:rotateAngle]; - [self.hudView setNeedsDisplay]; - } completion:nil]; - } else { - [self moveToPoint:newCenter rotateAngle:rotateAngle]; - } -} - -- (void)moveToPoint:(CGPoint)newCenter rotateAngle:(CGFloat)angle { - self.hudView.transform = CGAffineTransformMakeRotation(angle); - if (self.containerView) { - self.hudView.center = CGPointMake(self.containerView.center.x + self.offsetFromCenter.horizontal, self.containerView.center.y + self.offsetFromCenter.vertical); - } else { - self.hudView.center = CGPointMake(newCenter.x + self.offsetFromCenter.horizontal, newCenter.y + self.offsetFromCenter.vertical); - } -} - - -#pragma mark - Event handling - -- (void)controlViewDidReceiveTouchEvent:(id)sender forEvent:(UIEvent*)event { - [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidReceiveTouchEventNotification - object:self - userInfo:[self notificationUserInfo]]; - - UITouch *touch = event.allTouches.anyObject; - CGPoint touchLocation = [touch locationInView:self]; - - if(CGRectContainsPoint(self.hudView.frame, touchLocation)) { - [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidTouchDownInsideNotification - object:self - userInfo:[self notificationUserInfo]]; - } -} - - -#pragma mark - Master show/dismiss methods - -- (void)showProgress:(float)progress status:(NSString*)status { - __weak SVProgressHUD *weakSelf = self; - [[NSOperationQueue mainQueue] addOperationWithBlock:^{ - __strong SVProgressHUD *strongSelf = weakSelf; - if(strongSelf){ - if(strongSelf.fadeOutTimer) { - strongSelf.activityCount = 0; - } - - // Stop timer - strongSelf.fadeOutTimer = nil; - strongSelf.graceTimer = nil; - - // Update / Check view hierarchy to ensure the HUD is visible - [strongSelf updateViewHierarchy]; - - // Reset imageView and fadeout timer if an image is currently displayed - strongSelf.imageView.hidden = YES; - strongSelf.imageView.image = nil; - - // Update text and set progress to the given value - strongSelf.statusLabel.hidden = status.length == 0; - strongSelf.statusLabel.text = status; - strongSelf.progress = progress; - - // Choose the "right" indicator depending on the progress - if(progress >= 0) { - // Cancel the indefiniteAnimatedView, then show the ringLayer - [strongSelf cancelIndefiniteAnimatedViewAnimation]; - - // Add ring to HUD - if(!strongSelf.ringView.superview){ -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - [strongSelf.hudView.contentView addSubview:strongSelf.ringView]; -#else - [strongSelf.hudView addSubview:strongSelf.ringView]; -#endif - } - if(!strongSelf.backgroundRingView.superview){ -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - [strongSelf.hudView.contentView addSubview:strongSelf.backgroundRingView]; -#else - [strongSelf.hudView addSubview:strongSelf.backgroundRingView]; -#endif - } - - // Set progress animated - [CATransaction begin]; - [CATransaction setDisableActions:YES]; - strongSelf.ringView.strokeEnd = progress; - [CATransaction commit]; - - // Update the activity count - if(progress == 0) { - strongSelf.activityCount++; - } - } else { - // Cancel the ringLayer animation, then show the indefiniteAnimatedView - [strongSelf cancelRingLayerAnimation]; - - // Add indefiniteAnimatedView to HUD -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - [strongSelf.hudView.contentView addSubview:strongSelf.indefiniteAnimatedView]; -#else - [strongSelf.hudView addSubview:strongSelf.indefiniteAnimatedView]; -#endif - if([strongSelf.indefiniteAnimatedView respondsToSelector:@selector(startAnimating)]) { - [(id)strongSelf.indefiniteAnimatedView startAnimating]; - } - - // Update the activity count - strongSelf.activityCount++; - } - - // Fade in delayed if a grace time is set - if (self.graceTimeInterval > 0.0 && self.backgroundView.alpha == 0.0f) { - strongSelf.graceTimer = [NSTimer timerWithTimeInterval:self.graceTimeInterval target:strongSelf selector:@selector(fadeIn:) userInfo:nil repeats:NO]; - [[NSRunLoop mainRunLoop] addTimer:strongSelf.graceTimer forMode:NSRunLoopCommonModes]; - } else { - [strongSelf fadeIn:nil]; - } - - // Tell the Haptics Generator to prepare for feedback, which may come soon -#if TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 - [strongSelf.hapticGenerator prepare]; -#endif - } - }]; -} - -- (void)showImage:(UIImage*)image status:(NSString*)status duration:(NSTimeInterval)duration { - __weak SVProgressHUD *weakSelf = self; - [[NSOperationQueue mainQueue] addOperationWithBlock:^{ - __strong SVProgressHUD *strongSelf = weakSelf; - if(strongSelf){ - // Stop timer - strongSelf.fadeOutTimer = nil; - strongSelf.graceTimer = nil; - - // Update / Check view hierarchy to ensure the HUD is visible - [strongSelf updateViewHierarchy]; - - // Reset progress and cancel any running animation - strongSelf.progress = SVProgressHUDUndefinedProgress; - [strongSelf cancelRingLayerAnimation]; - [strongSelf cancelIndefiniteAnimatedViewAnimation]; - - // Update imageView - strongSelf.imageView.tintColor = strongSelf.foregroundColorForStyle; - strongSelf.imageView.image = image; - strongSelf.imageView.hidden = NO; - - // Update text - strongSelf.statusLabel.hidden = status.length == 0; - strongSelf.statusLabel.text = status; - - // Fade in delayed if a grace time is set - // An image will be dismissed automatically. Thus pass the duration as userInfo. - if (self.graceTimeInterval > 0.0 && self.backgroundView.alpha == 0.0f) { - strongSelf.graceTimer = [NSTimer timerWithTimeInterval:self.graceTimeInterval target:strongSelf selector:@selector(fadeIn:) userInfo:@(duration) repeats:NO]; - [[NSRunLoop mainRunLoop] addTimer:strongSelf.graceTimer forMode:NSRunLoopCommonModes]; - } else { - [strongSelf fadeIn:@(duration)]; - } - } - }]; -} - -- (void)fadeIn:(id)data { - // Update the HUDs frame to the new content and position HUD - [self updateHUDFrame]; - [self positionHUD:nil]; - - // Update accessibility as well as user interaction - if(self.defaultMaskType != SVProgressHUDMaskTypeNone) { - self.controlView.userInteractionEnabled = YES; - self.accessibilityLabel = self.statusLabel.text ?: NSLocalizedString(@"Loading", nil); - self.isAccessibilityElement = YES; - } else { - self.controlView.userInteractionEnabled = NO; - self.hudView.accessibilityLabel = self.statusLabel.text ?: NSLocalizedString(@"Loading", nil); - self.hudView.isAccessibilityElement = YES; - } - - // Get duration - id duration = [data isKindOfClass:[NSTimer class]] ? ((NSTimer *)data).userInfo : data; - - // Show if not already visible - if(self.backgroundView.alpha != 1.0f) { - // Post notification to inform user - [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDWillAppearNotification - object:self - userInfo:[self notificationUserInfo]]; - - // Shrink HUD to to make a nice appear / pop up animation - self.hudView.transform = self.hudView.transform = CGAffineTransformScale(self.hudView.transform, 1/1.5f, 1/1.5f); - - __block void (^animationsBlock)(void) = ^{ - // Zoom HUD a little to make a nice appear / pop up animation - self.hudView.transform = CGAffineTransformIdentity; - - // Fade in all effects (colors, blur, etc.) - [self fadeInEffects]; - }; - - __block void (^completionBlock)(void) = ^{ - // Check if we really achieved to show the HUD (<=> alpha) - // and the change of these values has not been cancelled in between e.g. due to a dismissal - if(self.backgroundView.alpha == 1.0f){ - // Register observer <=> we now have to handle orientation changes etc. - [self registerNotifications]; - - // Post notification to inform user - [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidAppearNotification - object:self - userInfo:[self notificationUserInfo]]; - - // Update accessibility - UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); - UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, self.statusLabel.text); - - // Dismiss automatically if a duration was passed as userInfo. We start a timer - // which then will call dismiss after the predefined duration - if(duration){ - self.fadeOutTimer = [NSTimer timerWithTimeInterval:[(NSNumber *)duration doubleValue] target:self selector:@selector(dismiss) userInfo:nil repeats:NO]; - [[NSRunLoop mainRunLoop] addTimer:self.fadeOutTimer forMode:NSRunLoopCommonModes]; - } - } - }; - - // Animate appearance - if (self.fadeInAnimationDuration > 0) { - // Animate appearance - [UIView animateWithDuration:self.fadeInAnimationDuration - delay:0 - options:(UIViewAnimationOptions) (UIViewAnimationOptionAllowUserInteraction | UIViewAnimationCurveEaseIn | UIViewAnimationOptionBeginFromCurrentState) - animations:^{ - animationsBlock(); - } completion:^(BOOL finished) { - completionBlock(); - }]; - } else { - animationsBlock(); - completionBlock(); - } - - // Inform iOS to redraw the view hierarchy - [self setNeedsDisplay]; - } else { - // Update accessibility - UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); - UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, self.statusLabel.text); - - // Dismiss automatically if a duration was passed as userInfo. We start a timer - // which then will call dismiss after the predefined duration - if(duration){ - self.fadeOutTimer = [NSTimer timerWithTimeInterval:[(NSNumber *)duration doubleValue] target:self selector:@selector(dismiss) userInfo:nil repeats:NO]; - [[NSRunLoop mainRunLoop] addTimer:self.fadeOutTimer forMode:NSRunLoopCommonModes]; - } - } -} - -- (void)dismiss { - [self dismissWithDelay:0.0 completion:nil]; -} - -- (void)dismissWithDelay:(NSTimeInterval)delay completion:(SVProgressHUDDismissCompletion)completion { - __weak SVProgressHUD *weakSelf = self; - [[NSOperationQueue mainQueue] addOperationWithBlock:^{ - __strong SVProgressHUD *strongSelf = weakSelf; - if(strongSelf){ - // Stop timer - strongSelf.graceTimer = nil; - - // Post notification to inform user - [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDWillDisappearNotification - object:nil - userInfo:[strongSelf notificationUserInfo]]; - - // Reset activity count - strongSelf.activityCount = 0; - - __block void (^animationsBlock)(void) = ^{ - // Shrink HUD a little to make a nice disappear animation - strongSelf.hudView.transform = CGAffineTransformScale(strongSelf.hudView.transform, 1/1.3f, 1/1.3f); - - // Fade out all effects (colors, blur, etc.) - [strongSelf fadeOutEffects]; - }; - - __block void (^completionBlock)(void) = ^{ - // Check if we really achieved to dismiss the HUD (<=> alpha values are applied) - // and the change of these values has not been cancelled in between e.g. due to a new show - if(self.backgroundView.alpha == 0.0f){ - // Clean up view hierarchy (overlays) - [strongSelf.controlView removeFromSuperview]; - [strongSelf.backgroundView removeFromSuperview]; - [strongSelf.hudView removeFromSuperview]; - [strongSelf removeFromSuperview]; - - // Reset progress and cancel any running animation - strongSelf.progress = SVProgressHUDUndefinedProgress; - [strongSelf cancelRingLayerAnimation]; - [strongSelf cancelIndefiniteAnimatedViewAnimation]; - - // Remove observer <=> we do not have to handle orientation changes etc. - [[NSNotificationCenter defaultCenter] removeObserver:strongSelf]; - - // Post notification to inform user - [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidDisappearNotification - object:strongSelf - userInfo:[strongSelf notificationUserInfo]]; - - // Tell the rootViewController to update the StatusBar appearance -#if !defined(SV_APP_EXTENSIONS) && TARGET_OS_IOS - UIViewController *rootController = [[UIApplication sharedApplication] keyWindow].rootViewController; - [rootController setNeedsStatusBarAppearanceUpdate]; -#endif - - // Run an (optional) completionHandler - if (completion) { - completion(); - } - } - }; - - // UIViewAnimationOptionBeginFromCurrentState AND a delay doesn't always work as expected - // When UIViewAnimationOptionBeginFromCurrentState is set, animateWithDuration: evaluates the current - // values to check if an animation is necessary. The evaluation happens at function call time and not - // after the delay => the animation is sometimes skipped. Therefore we delay using dispatch_after. - - dispatch_time_t dipatchTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)); - dispatch_after(dipatchTime, dispatch_get_main_queue(), ^{ - if (strongSelf.fadeOutAnimationDuration > 0) { - // Animate appearance - [UIView animateWithDuration:strongSelf.fadeOutAnimationDuration - delay:0 - options:(UIViewAnimationOptions) (UIViewAnimationOptionAllowUserInteraction | UIViewAnimationCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState) - animations:^{ - animationsBlock(); - } completion:^(BOOL finished) { - completionBlock(); - }]; - } else { - animationsBlock(); - completionBlock(); - } - }); - - // Inform iOS to redraw the view hierarchy - [strongSelf setNeedsDisplay]; - } - }]; -} - - -#pragma mark - Ring progress animation - -- (UIView*)indefiniteAnimatedView { - // Get the correct spinner for defaultAnimationType - if(self.defaultAnimationType == SVProgressHUDAnimationTypeFlat){ - // Check if spinner exists and is an object of different class - if(_indefiniteAnimatedView && ![_indefiniteAnimatedView isKindOfClass:[SVIndefiniteAnimatedView class]]){ - [_indefiniteAnimatedView removeFromSuperview]; - _indefiniteAnimatedView = nil; - } - - if(!_indefiniteAnimatedView){ - _indefiniteAnimatedView = [[SVIndefiniteAnimatedView alloc] initWithFrame:CGRectZero]; - } - - // Update styling - SVIndefiniteAnimatedView *indefiniteAnimatedView = (SVIndefiniteAnimatedView*)_indefiniteAnimatedView; - indefiniteAnimatedView.strokeColor = self.foregroundColorForStyle; - indefiniteAnimatedView.strokeThickness = self.ringThickness; - indefiniteAnimatedView.radius = self.statusLabel.text ? self.ringRadius : self.ringNoTextRadius; - } else { - // Check if spinner exists and is an object of different class - if(_indefiniteAnimatedView && ![_indefiniteAnimatedView isKindOfClass:[UIActivityIndicatorView class]]){ - [_indefiniteAnimatedView removeFromSuperview]; - _indefiniteAnimatedView = nil; - } - - if(!_indefiniteAnimatedView){ - _indefiniteAnimatedView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; - } - - // Update styling - UIActivityIndicatorView *activityIndicatorView = (UIActivityIndicatorView*)_indefiniteAnimatedView; - activityIndicatorView.color = self.foregroundColorForStyle; - } - [_indefiniteAnimatedView sizeToFit]; - - return _indefiniteAnimatedView; -} - -- (SVProgressAnimatedView*)ringView { - if(!_ringView) { - _ringView = [[SVProgressAnimatedView alloc] initWithFrame:CGRectZero]; - } - - // Update styling - _ringView.strokeColor = self.foregroundColorForStyle; - _ringView.strokeThickness = self.ringThickness; - _ringView.radius = self.statusLabel.text ? self.ringRadius : self.ringNoTextRadius; - - return _ringView; -} - -- (SVProgressAnimatedView*)backgroundRingView { - if(!_backgroundRingView) { - _backgroundRingView = [[SVProgressAnimatedView alloc] initWithFrame:CGRectZero]; - _backgroundRingView.strokeEnd = 1.0f; - } - - // Update styling - _backgroundRingView.strokeColor = [self.foregroundColorForStyle colorWithAlphaComponent:0.1f]; - _backgroundRingView.strokeThickness = self.ringThickness; - _backgroundRingView.radius = self.statusLabel.text ? self.ringRadius : self.ringNoTextRadius; - - return _backgroundRingView; -} - -- (void)cancelRingLayerAnimation { - // Animate value update, stop animation - [CATransaction begin]; - [CATransaction setDisableActions:YES]; - - [self.hudView.layer removeAllAnimations]; - self.ringView.strokeEnd = 0.0f; - - [CATransaction commit]; - - // Remove from view - [self.ringView removeFromSuperview]; - [self.backgroundRingView removeFromSuperview]; -} - -- (void)cancelIndefiniteAnimatedViewAnimation { - // Stop animation - if([self.indefiniteAnimatedView respondsToSelector:@selector(stopAnimating)]) { - [(id)self.indefiniteAnimatedView stopAnimating]; - } - // Remove from view - [self.indefiniteAnimatedView removeFromSuperview]; -} - - -#pragma mark - Utilities - -+ (BOOL)isVisible { - // Checking one alpha value is sufficient as they are all the same - return [self sharedView].backgroundView.alpha > 0.0f; -} - - -#pragma mark - Getters - -+ (NSTimeInterval)displayDurationForString:(NSString*)string { - CGFloat minimum = MAX((CGFloat)string.length * 0.06 + 0.5, [self sharedView].minimumDismissTimeInterval); - return MIN(minimum, [self sharedView].maximumDismissTimeInterval); -} - -- (UIColor*)foregroundColorForStyle { - if(self.defaultStyle == SVProgressHUDStyleLight) { - return [UIColor blackColor]; - } else if(self.defaultStyle == SVProgressHUDStyleDark) { - return [UIColor whiteColor]; - } else { - return self.foregroundColor; - } -} - -- (UIColor*)backgroundColorForStyle { - if(self.defaultStyle == SVProgressHUDStyleLight) { - return [UIColor whiteColor]; - } else if(self.defaultStyle == SVProgressHUDStyleDark) { - return [UIColor blackColor]; - } else { - return self.backgroundColor; - } -} - -- (UIControl*)controlView { - if(!_controlView) { - _controlView = [UIControl new]; - _controlView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - _controlView.backgroundColor = [UIColor clearColor]; - _controlView.userInteractionEnabled = YES; - [_controlView addTarget:self action:@selector(controlViewDidReceiveTouchEvent:forEvent:) forControlEvents:UIControlEventTouchDown]; - } - - // Update frames -#if !defined(SV_APP_EXTENSIONS) - CGRect windowBounds = [[[UIApplication sharedApplication] delegate] window].bounds; - _controlView.frame = windowBounds; -#else - _controlView.frame = [UIScreen mainScreen].bounds; -#endif - - return _controlView; -} - --(UIView *)backgroundView { - if(!_backgroundView){ - _backgroundView = [UIView new]; - _backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - } - if(!_backgroundView.superview){ - [self insertSubview:_backgroundView belowSubview:self.hudView]; - } - - // Update styling - if(self.defaultMaskType == SVProgressHUDMaskTypeGradient){ - if(!_backgroundRadialGradientLayer){ - _backgroundRadialGradientLayer = [SVRadialGradientLayer layer]; - } - if(!_backgroundRadialGradientLayer.superlayer){ - [_backgroundView.layer insertSublayer:_backgroundRadialGradientLayer atIndex:0]; - } - _backgroundView.backgroundColor = [UIColor clearColor]; - } else { - if(_backgroundRadialGradientLayer && _backgroundRadialGradientLayer.superlayer){ - [_backgroundRadialGradientLayer removeFromSuperlayer]; - } - if(self.defaultMaskType == SVProgressHUDMaskTypeBlack){ - _backgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.4]; - } else if(self.defaultMaskType == SVProgressHUDMaskTypeCustom){ - _backgroundView.backgroundColor = self.backgroundLayerColor; - } else { - _backgroundView.backgroundColor = [UIColor clearColor]; - } - } - - // Update frame - if(_backgroundView){ - _backgroundView.frame = self.bounds; - } - if(_backgroundRadialGradientLayer){ - _backgroundRadialGradientLayer.frame = self.bounds; - - // Calculate the new center of the gradient, it may change if keyboard is visible - CGPoint gradientCenter = self.center; - gradientCenter.y = (self.bounds.size.height - self.visibleKeyboardHeight)/2; - _backgroundRadialGradientLayer.gradientCenter = gradientCenter; - [_backgroundRadialGradientLayer setNeedsDisplay]; - } - - return _backgroundView; -} -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 -- (UIVisualEffectView*)hudView { -#else -- (UIView*)hudView { -#endif - if(!_hudView) { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - _hudView = [UIVisualEffectView new]; -#else - _hudView = [UIView new]; -#endif - _hudView.layer.masksToBounds = YES; - _hudView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin; - } - if(!_hudView.superview) { - [self addSubview:_hudView]; - } - - // Update styling - _hudView.layer.cornerRadius = self.cornerRadius; - - return _hudView; -} - -- (UILabel*)statusLabel { - if(!_statusLabel) { - _statusLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _statusLabel.backgroundColor = [UIColor clearColor]; - _statusLabel.adjustsFontSizeToFitWidth = YES; - _statusLabel.textAlignment = NSTextAlignmentCenter; - _statusLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters; - _statusLabel.numberOfLines = 0; - } - if(!_statusLabel.superview) { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - [self.hudView.contentView addSubview:_statusLabel]; -#else - [self.hudView addSubview:_statusLabel]; -#endif - } - - // Update styling - _statusLabel.textColor = self.foregroundColorForStyle; - _statusLabel.font = self.font; - - return _statusLabel; -} - -- (UIImageView*)imageView { - if(_imageView && !CGSizeEqualToSize(_imageView.bounds.size, _imageViewSize)) { - [_imageView removeFromSuperview]; - _imageView = nil; - } - - if(!_imageView) { - _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, _imageViewSize.width, _imageViewSize.height)]; - } - if(!_imageView.superview) { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - [self.hudView.contentView addSubview:_imageView]; -#else - [self.hudView addSubview:_imageView]; -#endif - } - - return _imageView; -} - - -#pragma mark - Helper - -- (CGFloat)visibleKeyboardHeight { -#if !defined(SV_APP_EXTENSIONS) - UIWindow *keyboardWindow = nil; - for (UIWindow *testWindow in UIApplication.sharedApplication.windows) { - if(![testWindow.class isEqual:UIWindow.class]) { - keyboardWindow = testWindow; - break; - } - } - - for (__strong UIView *possibleKeyboard in keyboardWindow.subviews) { - NSString *viewName = NSStringFromClass(possibleKeyboard.class); - if([viewName hasPrefix:@"UI"]){ - if([viewName hasSuffix:@"PeripheralHostView"] || [viewName hasSuffix:@"Keyboard"]){ - return CGRectGetHeight(possibleKeyboard.bounds); - } else if ([viewName hasSuffix:@"InputSetContainerView"]){ - for (__strong UIView *possibleKeyboardSubview in possibleKeyboard.subviews) { - viewName = NSStringFromClass(possibleKeyboardSubview.class); - if([viewName hasPrefix:@"UI"] && [viewName hasSuffix:@"InputSetHostView"]) { - return CGRectGetHeight(possibleKeyboardSubview.bounds); - } - } - } - } - } -#endif - return 0; -} - -- (UIWindow *)frontWindow { -#if !defined(SV_APP_EXTENSIONS) - NSEnumerator *frontToBackWindows = [UIApplication.sharedApplication.windows reverseObjectEnumerator]; - for (UIWindow *window in frontToBackWindows) { - BOOL windowOnMainScreen = window.screen == UIScreen.mainScreen; - BOOL windowIsVisible = !window.hidden && window.alpha > 0; - BOOL windowLevelSupported = (window.windowLevel >= UIWindowLevelNormal && window.windowLevel <= self.maxSupportedWindowLevel); - BOOL windowKeyWindow = window.isKeyWindow; - - if(windowOnMainScreen && windowIsVisible && windowLevelSupported && windowKeyWindow) { - return window; - } - } -#endif - return nil; -} - -- (void)fadeInEffects { -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - if(self.defaultStyle != SVProgressHUDStyleCustom) { - // Add blur effect - UIBlurEffectStyle blurEffectStyle = self.defaultStyle == SVProgressHUDStyleDark ? UIBlurEffectStyleDark : UIBlurEffectStyleLight; - UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:blurEffectStyle]; - self.hudView.effect = blurEffect; - - // We omit UIVibrancy effect and use a suitable background color as an alternative. - // This will make everyting more readable. See the following for details: - // https://www.omnigroup.com/developer/how-to-make-text-in-a-uivisualeffectview-readable-on-any-background - - self.hudView.backgroundColor = [self.backgroundColorForStyle colorWithAlphaComponent:0.6f]; - } else { - self.hudView.backgroundColor = self.backgroundColorForStyle; - } -#else - self.hudView.backgroundColor = self.backgroundColorForStyle; -#endif - - // Fade in views - self.backgroundView.alpha = 1.0f; - - self.imageView.alpha = 1.0f; - self.statusLabel.alpha = 1.0f; - self.indefiniteAnimatedView.alpha = 1.0f; - self.ringView.alpha = self.backgroundRingView.alpha = 1.0f; -} - -- (void)fadeOutEffects -{ -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 - if(self.defaultStyle != SVProgressHUDStyleCustom) { - // Remove blur effect - self.hudView.effect = nil; - } -#endif - - // Remove background color - self.hudView.backgroundColor = [UIColor clearColor]; - - // Fade out views - self.backgroundView.alpha = 0.0f; - - self.imageView.alpha = 0.0f; - self.statusLabel.alpha = 0.0f; - self.indefiniteAnimatedView.alpha = 0.0f; - self.ringView.alpha = self.backgroundRingView.alpha = 0.0f; -} - -#if TARGET_OS_IOS && __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 -- (UINotificationFeedbackGenerator *)hapticGenerator { - // Only return if haptics are enabled - if(!self.hapticsEnabled) { - return nil; - } - - if(!_hapticGenerator) { - _hapticGenerator = [[UINotificationFeedbackGenerator alloc] init]; - } - return _hapticGenerator; -} -#endif - - -#pragma mark - UIAppearance Setters - -- (void)setDefaultStyle:(SVProgressHUDStyle)style { - if (!_isInitializing) _defaultStyle = style; -} - -- (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType { - if (!_isInitializing) _defaultMaskType = maskType; -} - -- (void)setDefaultAnimationType:(SVProgressHUDAnimationType)animationType { - if (!_isInitializing) _defaultAnimationType = animationType; -} - -- (void)setContainerView:(UIView *)containerView { - if (!_isInitializing) _containerView = containerView; -} - -- (void)setMinimumSize:(CGSize)minimumSize { - if (!_isInitializing) _minimumSize = minimumSize; -} - -- (void)setRingThickness:(CGFloat)ringThickness { - if (!_isInitializing) _ringThickness = ringThickness; -} - -- (void)setRingRadius:(CGFloat)ringRadius { - if (!_isInitializing) _ringRadius = ringRadius; -} - -- (void)setRingNoTextRadius:(CGFloat)ringNoTextRadius { - if (!_isInitializing) _ringNoTextRadius = ringNoTextRadius; -} - -- (void)setCornerRadius:(CGFloat)cornerRadius { - if (!_isInitializing) _cornerRadius = cornerRadius; -} - -- (void)setFont:(UIFont*)font { - if (!_isInitializing) _font = font; -} - -- (void)setForegroundColor:(UIColor*)color { - if (!_isInitializing) _foregroundColor = color; -} - -- (void)setBackgroundColor:(UIColor*)color { - if (!_isInitializing) _backgroundColor = color; -} - -- (void)setBackgroundLayerColor:(UIColor*)color { - if (!_isInitializing) _backgroundLayerColor = color; -} - -- (void)setInfoImage:(UIImage*)image { - if (!_isInitializing) _infoImage = image; -} - -- (void)setSuccessImage:(UIImage*)image { - if (!_isInitializing) _successImage = image; -} - -- (void)setErrorImage:(UIImage*)image { - if (!_isInitializing) _errorImage = image; -} - -- (void)setViewForExtension:(UIView*)view { - if (!_isInitializing) _viewForExtension = view; -} - -- (void)setOffsetFromCenter:(UIOffset)offset { - if (!_isInitializing) _offsetFromCenter = offset; -} - -- (void)setMinimumDismissTimeInterval:(NSTimeInterval)minimumDismissTimeInterval { - if (!_isInitializing) _minimumDismissTimeInterval = minimumDismissTimeInterval; -} - -- (void)setFadeInAnimationDuration:(NSTimeInterval)duration { - if (!_isInitializing) _fadeInAnimationDuration = duration; -} - -- (void)setFadeOutAnimationDuration:(NSTimeInterval)duration { - if (!_isInitializing) _fadeOutAnimationDuration = duration; -} - -- (void)setMaxSupportedWindowLevel:(UIWindowLevel)maxSupportedWindowLevel { - if (!_isInitializing) _maxSupportedWindowLevel = maxSupportedWindowLevel; -} - -@end diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h b/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h deleted file mode 100644 index fcfb152eb..000000000 --- a/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// SVRadialGradientLayer.h -// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD -// -// Copyright (c) 2014-2017 Tobias Tiemerding. All rights reserved. -// - -#import - -@interface SVRadialGradientLayer : CALayer - -@property (nonatomic) CGPoint gradientCenter; - -@end diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m b/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m deleted file mode 100644 index 764705886..000000000 --- a/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m +++ /dev/null @@ -1,25 +0,0 @@ -// -// SVRadialGradientLayer.m -// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD -// -// Copyright (c) 2014-2017 Tobias Tiemerding. All rights reserved. -// - -#import "SVRadialGradientLayer.h" - -@implementation SVRadialGradientLayer - -- (void)drawInContext:(CGContextRef)context { - size_t locationsCount = 2; - CGFloat locations[2] = {0.0f, 1.0f}; - CGFloat colors[8] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.75f}; - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount); - CGColorSpaceRelease(colorSpace); - - float radius = MIN(self.bounds.size.width , self.bounds.size.height); - CGContextDrawRadialGradient (context, gradient, self.gradientCenter, 0, self.gradientCenter, radius, kCGGradientDrawsAfterEndLocation); - CGGradientRelease(gradient); -} - -@end diff --git a/Pods/TTTAttributedLabel/LICENSE b/Pods/TTTAttributedLabel/LICENSE deleted file mode 100644 index 11028caca..000000000 --- a/Pods/TTTAttributedLabel/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Mattt Thompson (http://mattt.me/) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Pods/TTTAttributedLabel/README.md b/Pods/TTTAttributedLabel/README.md deleted file mode 100644 index cbc81b4a1..000000000 --- a/Pods/TTTAttributedLabel/README.md +++ /dev/null @@ -1,159 +0,0 @@ -# TTTAttributedLabel - -[![Circle CI](https://circleci.com/gh/TTTAttributedLabel/TTTAttributedLabel.svg?style=svg)](https://circleci.com/gh/TTTAttributedLabel/TTTAttributedLabel) [![Documentation](https://img.shields.io/cocoapods/v/TTTAttributedLabel.svg?style=flat)](http://cocoadocs.org/docsets/TTTAttributedLabel/) [![codecov.io](https://codecov.io/github/TTTAttributedLabel/TTTAttributedLabel/coverage.svg?branch=master)](http://codecov.io/github/TTTAttributedLabel/TTTAttributedLabel?branch=master) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) - -**A drop-in replacement for `UILabel` that supports attributes, data detectors, links, and more** - -`TTTAttributedLabel` is a drop-in replacement for `UILabel` providing a simple way to performantly render [attributed strings](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSAttributedString_Class/Reference/Reference.html). As a bonus, it also supports link embedding, both automatically with `NSTextCheckingTypes` and manually by specifying a range for a URL, address, phone number, event, or transit information. - -> Already using this library? Please comment on [this issue](https://github.com/TTTAttributedLabel/TTTAttributedLabel/issues/586) to let us know which versions of iOS your app supports. - -Even though `UILabel` received support for `NSAttributedString` in iOS 6, `TTTAttributedLabel` has several unique features: - -- Compatibility with iOS >= 4.3 -- Automatic data detection -- Manual link embedding -- Label style inheritance for attributed strings -- Custom styling for links within the label -- Long-press gestures in addition to tap gestures for links - -It also includes advanced paragraph style properties: - -- `attributedTruncationToken` -- `firstLineIndent` -- `highlightedShadowRadius` -- `highlightedShadowOffset` -- `highlightedShadowColor` -- `lineHeightMultiple` -- `lineSpacing` -- `minimumLineHeight` -- `maximumLineHeight` -- `shadowRadius` -- `textInsets` -- `verticalAlignment` - -### Accessibility - -As of version 1.10.0, `TTTAttributedLabel` supports VoiceOver through the `UIAccessibilityElement` protocol. Each link can be individually selected, with an `accessibilityLabel` equal to its string value, and a corresponding `accessibilityValue` for URL, phone number, and date links. Developers who wish to change this behavior or provide custom values should create a subclass and override `accessibilityElements`. - -## Communication - -- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/tttattributedlabel). (Tag `tttattributedlabel`) -- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/tttattributedlabel). -- If you **found a bug**, open an issue. -- If you **have a feature request**, open an issue. -- If you **want to contribute**, submit a pull request. - -## Installation - -[CocoaPods](https://cocoapods.org/) is the recommended method of installing `TTTAttributedLabel`. Simply add the following line to your `Podfile`: - -```ruby -# Podfile - -pod 'TTTAttributedLabel' -``` - -## Usage - -`TTTAttributedLabel` can display both plain and attributed text: just pass an `NSString` or `NSAttributedString` to the `setText:` setter. Never assign to the `attributedText` property. - -```objc -// NSAttributedString - -TTTAttributedLabel *attributedLabel = [[TTTAttributedLabel alloc] initWithFrame:CGRectZero]; - -NSAttributedString *attString = [[NSAttributedString alloc] initWithString:@"Tom Bombadil" - attributes:@{ - (id)kCTForegroundColorAttributeName : (id)[UIColor redColor].CGColor, - NSFontAttributeName : [UIFont boldSystemFontOfSize:16], - NSKernAttributeName : [NSNull null], - (id)kTTTBackgroundFillColorAttributeName : (id)[UIColor greenColor].CGColor -}]; - -// The attributed string is directly set, without inheriting any other text -// properties of the label. -attributedLabel.text = attString; -``` - -```objc -// NSString - -TTTAttributedLabel *label = [[TTTAttributedLabel alloc] initWithFrame:CGRectZero]; -label.font = [UIFont systemFontOfSize:14]; -label.textColor = [UIColor darkGrayColor]; -label.lineBreakMode = NSLineBreakByWordWrapping; -label.numberOfLines = 0; - -// If you're using a simple `NSString` for your text, -// assign to the `text` property last so it can inherit other label properties. -NSString *text = @"Lorem ipsum dolor sit amet"; -[label setText:text afterInheritingLabelAttributesAndConfiguringWithBlock:^ NSMutableAttributedString *(NSMutableAttributedString *mutableAttributedString) { - NSRange boldRange = [[mutableAttributedString string] rangeOfString:@"ipsum dolor" options:NSCaseInsensitiveSearch]; - NSRange strikeRange = [[mutableAttributedString string] rangeOfString:@"sit amet" options:NSCaseInsensitiveSearch]; - - // Core Text APIs use C functions without a direct bridge to UIFont. See Apple's "Core Text Programming Guide" to learn how to configure string attributes. - UIFont *boldSystemFont = [UIFont boldSystemFontOfSize:14]; - CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL); - if (font) { - [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)font range:boldRange]; - [mutableAttributedString addAttribute:kTTTStrikeOutAttributeName value:@YES range:strikeRange]; - CFRelease(font); - } - - return mutableAttributedString; -}]; -``` - -First, we create and configure the label, the same way you would instantiate `UILabel`. Any text properties that are set on the label are inherited as the base attributes when using the `-setText:afterInheritingLabelAttributesAndConfiguringWithBlock:` method. In this example, the substring "ipsum dolar", would appear in bold, such that the label would read "Lorem **ipsum dolar** sit amet", in size 14 Helvetica, with a dark gray color. - -## `IBDesignable` - -`TTTAttributedLabel` includes `IBInspectable` and `IB_DESIGNABLE` annotations to enable configuring the label inside Interface Builder. However, if you see these warnings when building... - -``` -IB Designables: Failed to update auto layout status: Failed to load designables from path (null) -IB Designables: Failed to render instance of TTTAttributedLabel: Failed to load designables from path (null) -``` - -...then you are likely using `TTTAttributedLabel` as a static library, which does not support IB annotations. Some workarounds include: - -- Install `TTTAttributedLabel` as a dynamic framework using CocoaPods with `use_frameworks!` in your `Podfile`, or with Carthage -- Install `TTTAttributedLabel` by dragging its source files to your project - -### Links and Data Detection - -In addition to supporting rich text, `TTTAttributedLabel` can automatically detect links for dates, addresses, URLs, phone numbers, transit information, and allows you to embed your own links. - -``` objective-c -label.enabledTextCheckingTypes = NSTextCheckingTypeLink; // Automatically detect links when the label text is subsequently changed -label.delegate = self; // Delegate methods are called when the user taps on a link (see `TTTAttributedLabelDelegate` protocol) - -label.text = @"Fork me on GitHub! (https://github.com/mattt/TTTAttributedLabel/)"; // Repository URL will be automatically detected and linked - -NSRange range = [label.text rangeOfString:@"me"]; -[label addLinkToURL:[NSURL URLWithString:@"http://github.com/mattt/"] withRange:range]; // Embedding a custom link in a substring -``` - -## Demo - -```bash -pod try TTTAttributedLabel -``` - -...or clone this repo and build and run/test the `Espressos` project in Xcode to see `TTTAttributedLabel` in action. If you don't have [CocoaPods](http://cocoapods.org) installed, grab it with `[sudo] gem install cocoapods`. - -```bash -cd Example -pod install -open Espressos.xcworkspace -``` - -## Requirements - -- iOS 8+ / tvOS 9+ -- Xcode 6+ - -## License - -`TTTAttributedLabel` is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/TTTAttributedLabel/TTTAttributedLabel/TTTAttributedLabel.h b/Pods/TTTAttributedLabel/TTTAttributedLabel/TTTAttributedLabel.h deleted file mode 100644 index 80ad4d650..000000000 --- a/Pods/TTTAttributedLabel/TTTAttributedLabel/TTTAttributedLabel.h +++ /dev/null @@ -1,681 +0,0 @@ -// TTTAttributedLabel.h -// -// Copyright (c) 2011 Mattt Thompson (http://mattt.me) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import -#import - -//! Project version number for TTTAttributedLabel. -FOUNDATION_EXPORT double TTTAttributedLabelVersionNumber; - -//! Project version string for TTTAttributedLabel. -FOUNDATION_EXPORT const unsigned char TTTAttributedLabelVersionString[]; - -@class TTTAttributedLabelLink; - -/** - Vertical alignment for text in a label whose bounds are larger than its text bounds - */ -typedef NS_ENUM(NSInteger, TTTAttributedLabelVerticalAlignment) { - TTTAttributedLabelVerticalAlignmentCenter = 0, - TTTAttributedLabelVerticalAlignmentTop = 1, - TTTAttributedLabelVerticalAlignmentBottom = 2, -}; - -/** - Determines whether the text to which this attribute applies has a strikeout drawn through itself. - */ -extern NSString * const kTTTStrikeOutAttributeName; - -/** - The background fill color. Value must be a `CGColorRef`. Default value is `nil` (no fill). - */ -extern NSString * const kTTTBackgroundFillColorAttributeName; - -/** - The padding for the background fill. Value must be a `UIEdgeInsets`. Default value is `UIEdgeInsetsZero` (no padding). - */ -extern NSString * const kTTTBackgroundFillPaddingAttributeName; - -/** - The background stroke color. Value must be a `CGColorRef`. Default value is `nil` (no stroke). - */ -extern NSString * const kTTTBackgroundStrokeColorAttributeName; - -/** - The background stroke line width. Value must be an `NSNumber`. Default value is `1.0f`. - */ -extern NSString * const kTTTBackgroundLineWidthAttributeName; - -/** - The background corner radius. Value must be an `NSNumber`. Default value is `5.0f`. - */ -extern NSString * const kTTTBackgroundCornerRadiusAttributeName; - -@protocol TTTAttributedLabelDelegate; - -// Override UILabel @property to accept both NSString and NSAttributedString -@protocol TTTAttributedLabel -@property (nonatomic, copy) IBInspectable id text; -@end - -IB_DESIGNABLE - -/** - `TTTAttributedLabel` is a drop-in replacement for `UILabel` that supports `NSAttributedString`, as well as automatically-detected and manually-added links to URLs, addresses, phone numbers, and dates. - - ## Differences Between `TTTAttributedLabel` and `UILabel` - - For the most part, `TTTAttributedLabel` behaves just like `UILabel`. The following are notable exceptions, in which `TTTAttributedLabel` may act differently: - - - `text` - This property now takes an `id` type argument, which can either be a kind of `NSString` or `NSAttributedString` (mutable or immutable in both cases) - - `attributedText` - Do not set this property directly. Instead, pass an `NSAttributedString` to `text`. - - `lineBreakMode` - This property displays only the first line when the value is `UILineBreakModeHeadTruncation`, `UILineBreakModeTailTruncation`, or `UILineBreakModeMiddleTruncation` - - `adjustsFontsizeToFitWidth` - Supported in iOS 5 and greater, this property is effective for any value of `numberOfLines` greater than zero. In iOS 4, setting `numberOfLines` to a value greater than 1 with `adjustsFontSizeToFitWidth` set to `YES` may cause `sizeToFit` to execute indefinitely. - - `baselineAdjustment` - This property has no affect. - - `textAlignment` - This property does not support justified alignment. - - `NSTextAttachment` - This string attribute is not supported. - - Any properties affecting text or paragraph styling, such as `firstLineIndent` will only apply when text is set with an `NSString`. If the text is set with an `NSAttributedString`, these properties will not apply. - - ### NSCoding - - `TTTAttributedLabel`, like `UILabel`, conforms to `NSCoding`. However, if the build target is set to less than iOS 6.0, `linkAttributes` and `activeLinkAttributes` will not be encoded or decoded. This is due to an runtime exception thrown when attempting to copy non-object CoreText values in dictionaries. - - @warning Any properties changed on the label after setting the text will not be reflected until a subsequent call to `setText:` or `setText:afterInheritingLabelAttributesAndConfiguringWithBlock:`. This is to say, order of operations matters in this case. For example, if the label text color is originally black when the text is set, changing the text color to red will have no effect on the display of the label until the text is set once again. - - @bug Setting `attributedText` directly is not recommended, as it may cause a crash when attempting to access any links previously set. Instead, call `setText:`, passing an `NSAttributedString`. - */ -@interface TTTAttributedLabel : UILabel - -/** - * The designated initializers are @c initWithFrame: and @c initWithCoder:. - * init will not properly initialize many required properties and other configuration. - */ -- (instancetype) init NS_UNAVAILABLE; - -///----------------------------- -/// @name Accessing the Delegate -///----------------------------- - -/** - The receiver's delegate. - - @discussion A `TTTAttributedLabel` delegate responds to messages sent by tapping on links in the label. You can use the delegate to respond to links referencing a URL, address, phone number, date, or date with a specified time zone and duration. - */ -@property (nonatomic, unsafe_unretained) IBOutlet id delegate; - -///-------------------------------------------- -/// @name Detecting, Accessing, & Styling Links -///-------------------------------------------- - -/** - A bitmask of `NSTextCheckingType` which are used to automatically detect links in the label text. - - @warning You must specify `enabledTextCheckingTypes` before setting the `text`, with either `setText:` or `setText:afterInheritingLabelAttributesAndConfiguringWithBlock:`. - */ -@property (nonatomic, assign) NSTextCheckingTypes enabledTextCheckingTypes; - -/** - An array of `NSTextCheckingResult` objects for links detected or manually added to the label text. - */ -@property (readonly, nonatomic, strong) NSArray *links; - -/** - A dictionary containing the default `NSAttributedString` attributes to be applied to links detected or manually added to the label text. The default link style is blue and underlined. - - @warning You must specify `linkAttributes` before setting autodecting or manually-adding links for these attributes to be applied. - */ -@property (nonatomic, strong) NSDictionary *linkAttributes; - -/** - A dictionary containing the default `NSAttributedString` attributes to be applied to links when they are in the active state. If `nil` or an empty `NSDictionary`, active links will not be styled. The default active link style is red and underlined. - */ -@property (nonatomic, strong) NSDictionary *activeLinkAttributes; - -/** - A dictionary containing the default `NSAttributedString` attributes to be applied to links when they are in the inactive state, which is triggered by a change in `tintColor` in iOS 7 and later. If `nil` or an empty `NSDictionary`, inactive links will not be styled. The default inactive link style is gray and unadorned. - */ -@property (nonatomic, strong) NSDictionary *inactiveLinkAttributes; - -/** - The edge inset for the background of a link. The default value is `{0, -1, 0, -1}`. - */ -@property (nonatomic, assign) UIEdgeInsets linkBackgroundEdgeInset; - -/** - Indicates if links will be detected within an extended area around the touch - to emulate the link detection behaviour of UIWebView. - Default value is NO. Enabling this may adversely impact performance. - */ -@property (nonatomic, assign) BOOL extendsLinkTouchArea; - -///--------------------------------------- -/// @name Acccessing Text Style Attributes -///--------------------------------------- - -/** - The shadow blur radius for the label. A value of 0 indicates no blur, while larger values produce correspondingly larger blurring. This value must not be negative. The default value is 0. - */ -@property (nonatomic, assign) IBInspectable CGFloat shadowRadius; - -/** - The shadow blur radius for the label when the label's `highlighted` property is `YES`. A value of 0 indicates no blur, while larger values produce correspondingly larger blurring. This value must not be negative. The default value is 0. - */ -@property (nonatomic, assign) IBInspectable CGFloat highlightedShadowRadius; -/** - The shadow offset for the label when the label's `highlighted` property is `YES`. A size of {0, 0} indicates no offset, with positive values extending down and to the right. The default size is {0, 0}. - */ -@property (nonatomic, assign) IBInspectable CGSize highlightedShadowOffset; -/** - The shadow color for the label when the label's `highlighted` property is `YES`. The default value is `nil` (no shadow color). - */ -@property (nonatomic, strong) IBInspectable UIColor *highlightedShadowColor; - -/** - The amount to kern the next character. Default is standard kerning. If this attribute is set to 0.0, no kerning is done at all. - */ -@property (nonatomic, assign) IBInspectable CGFloat kern; - -///-------------------------------------------- -/// @name Acccessing Paragraph Style Attributes -///-------------------------------------------- - -/** - The distance, in points, from the leading margin of a frame to the beginning of the - paragraph's first line. This value is always nonnegative, and is 0.0 by default. - This applies to the full text, rather than any specific paragraph metrics. - */ -@property (nonatomic, assign) IBInspectable CGFloat firstLineIndent; - -/** - The space in points added between lines within the paragraph. This value is always nonnegative and is 0.0 by default. - */ -@property (nonatomic, assign) IBInspectable CGFloat lineSpacing; - -/** - The minimum line height within the paragraph. If the value is 0.0, the minimum line height is set to the line height of the `font`. 0.0 by default. - */ -@property (nonatomic, assign) IBInspectable CGFloat minimumLineHeight; - -/** - The maximum line height within the paragraph. If the value is 0.0, the maximum line height is set to the line height of the `font`. 0.0 by default. - */ -@property (nonatomic, assign) IBInspectable CGFloat maximumLineHeight; - -/** - The line height multiple. This value is 1.0 by default. - */ -@property (nonatomic, assign) IBInspectable CGFloat lineHeightMultiple; - -/** - The distance, in points, from the margin to the text container. This value is `UIEdgeInsetsZero` by default. - sizeThatFits: will have its returned size increased by these margins. - drawTextInRect: will inset all drawn text by these margins. - */ -@property (nonatomic, assign) IBInspectable UIEdgeInsets textInsets; - -/** - The vertical text alignment for the label, for when the frame size is greater than the text rect size. The vertical alignment is `TTTAttributedLabelVerticalAlignmentCenter` by default. - */ -@property (nonatomic, assign) TTTAttributedLabelVerticalAlignment verticalAlignment; - -///-------------------------------------------- -/// @name Accessing Truncation Token Appearance -///-------------------------------------------- - -/** - The attributed string to apply to the truncation token at the end of a truncated line. Overrides `truncationTokenStringAttributes` and `truncationTokenString`. If unspecified, attributes will fallback to `truncationTokenStringAttributes` and `truncationTokenString`. - */ -@property (nonatomic, strong) IBInspectable NSAttributedString *attributedTruncationToken; - -///-------------------------- -/// @name Long press gestures -///-------------------------- - -/** - * The long-press gesture recognizer used internally by the label. - */ -@property (nonatomic, strong, readonly) UILongPressGestureRecognizer *longPressGestureRecognizer; - -///-------------------------------------------- -/// @name Calculating Size of Attributed String -///-------------------------------------------- - -/** - Calculate and return the size that best fits an attributed string, given the specified constraints on size and number of lines. - - @param attributedString The attributed string. - @param size The maximum dimensions used to calculate size. - @param numberOfLines The maximum number of lines in the text to draw, if the constraining size cannot accomodate the full attributed string. - - @return The size that fits the attributed string within the specified constraints. - */ -+ (CGSize)sizeThatFitsAttributedString:(NSAttributedString *)attributedString - withConstraints:(CGSize)size - limitedToNumberOfLines:(NSUInteger)numberOfLines; - -///---------------------------------- -/// @name Setting the Text Attributes -///---------------------------------- - -/** - Sets the text displayed by the label. - - @param text An `NSString` or `NSAttributedString` object to be displayed by the label. If the specified text is an `NSString`, the label will display the text like a `UILabel`, inheriting the text styles of the label. If the specified text is an `NSAttributedString`, the label text styles will be overridden by the styles specified in the attributed string. - - @discussion This method overrides `UILabel -setText:` to accept both `NSString` and `NSAttributedString` objects. This string is `nil` by default. - */ -- (void)setText:(id)text; - -/** - Sets the text displayed by the label, after configuring an attributed string containing the text attributes inherited from the label in a block. - - @param text An `NSString` or `NSAttributedString` object to be displayed by the label. - @param block A block object that returns an `NSMutableAttributedString` object and takes a single argument, which is an `NSMutableAttributedString` object with the text from the first parameter, and the text attributes inherited from the label text styles. For example, if you specified the `font` of the label to be `[UIFont boldSystemFontOfSize:14]` and `textColor` to be `[UIColor redColor]`, the `NSAttributedString` argument of the block would be contain the `NSAttributedString` attribute equivalents of those properties. In this block, you can set further attributes on particular ranges. - - @discussion This string is `nil` by default. - */ -- (void)setText:(id)text -afterInheritingLabelAttributesAndConfiguringWithBlock:(NSMutableAttributedString *(^)(NSMutableAttributedString *mutableAttributedString))block; - -///------------------------------------ -/// @name Accessing the Text Attributes -///------------------------------------ - -/** - A copy of the label's current attributedText. This returns `nil` if an attributed string has never been set on the label. - - @warning Do not set this property directly. Instead, set @c text to an @c NSAttributedString. - */ -@property (readwrite, nonatomic, copy) NSAttributedString *attributedText; - -///------------------- -/// @name Adding Links -///------------------- - -/** - Adds a link. You can customize an individual link's appearance and accessibility value by creating your own @c TTTAttributedLabelLink and passing it to this method. The other methods for adding links will use the label's default attributes. - - @warning Modifying the link's attribute dictionaries must be done before calling this method. - - @param link A @c TTTAttributedLabelLink object. - */ -- (void)addLink:(TTTAttributedLabelLink *)link; - -/** - Adds a link to an @c NSTextCheckingResult. - - @param result An @c NSTextCheckingResult representing the link's location and type. - - @return The newly added link object. - */ -- (TTTAttributedLabelLink *)addLinkWithTextCheckingResult:(NSTextCheckingResult *)result; - -/** - Adds a link to an @c NSTextCheckingResult. - - @param result An @c NSTextCheckingResult representing the link's location and type. - @param attributes The attributes to be added to the text in the range of the specified link. If set, the label's @c activeAttributes and @c inactiveAttributes will be applied to the link. If `nil`, no attributes are added to the link. - - @return The newly added link object. - */ -- (TTTAttributedLabelLink *)addLinkWithTextCheckingResult:(NSTextCheckingResult *)result - attributes:(NSDictionary *)attributes; - -/** - Adds a link to a URL for a specified range in the label text. - - @param url The url to be linked to - @param range The range in the label text of the link. The range must not exceed the bounds of the receiver. - - @return The newly added link object. - */ -- (TTTAttributedLabelLink *)addLinkToURL:(NSURL *)url - withRange:(NSRange)range; - -/** - Adds a link to an address for a specified range in the label text. - - @param addressComponents A dictionary of address components for the address to be linked to - @param range The range in the label text of the link. The range must not exceed the bounds of the receiver. - - @discussion The address component dictionary keys are described in `NSTextCheckingResult`'s "Keys for Address Components." - - @return The newly added link object. - */ -- (TTTAttributedLabelLink *)addLinkToAddress:(NSDictionary *)addressComponents - withRange:(NSRange)range; - -/** - Adds a link to a phone number for a specified range in the label text. - - @param phoneNumber The phone number to be linked to. - @param range The range in the label text of the link. The range must not exceed the bounds of the receiver. - - @return The newly added link object. - */ -- (TTTAttributedLabelLink *)addLinkToPhoneNumber:(NSString *)phoneNumber - withRange:(NSRange)range; - -/** - Adds a link to a date for a specified range in the label text. - - @param date The date to be linked to. - @param range The range in the label text of the link. The range must not exceed the bounds of the receiver. - - @return The newly added link object. - */ -- (TTTAttributedLabelLink *)addLinkToDate:(NSDate *)date - withRange:(NSRange)range; - -/** - Adds a link to a date with a particular time zone and duration for a specified range in the label text. - - @param date The date to be linked to. - @param timeZone The time zone of the specified date. - @param duration The duration, in seconds from the specified date. - @param range The range in the label text of the link. The range must not exceed the bounds of the receiver. - - @return The newly added link object. - */ -- (TTTAttributedLabelLink *)addLinkToDate:(NSDate *)date - timeZone:(NSTimeZone *)timeZone - duration:(NSTimeInterval)duration - withRange:(NSRange)range; - -/** - Adds a link to transit information for a specified range in the label text. - - @param components A dictionary containing the transit components. The currently supported keys are `NSTextCheckingAirlineKey` and `NSTextCheckingFlightKey`. - @param range The range in the label text of the link. The range must not exceed the bounds of the receiver. - - @return The newly added link object. - */ -- (TTTAttributedLabelLink *)addLinkToTransitInformation:(NSDictionary *)components - withRange:(NSRange)range; - -/** - Returns whether an @c NSTextCheckingResult is found at the give point. - - @discussion This can be used together with @c UITapGestureRecognizer to tap interactions with overlapping views. - - @param point The point inside the label. - */ -- (BOOL)containslinkAtPoint:(CGPoint)point; - -/** - Returns the @c TTTAttributedLabelLink at the give point if it exists. - - @discussion This can be used together with @c UIViewControllerPreviewingDelegate to peek into links. - - @param point The point inside the label. - */ -- (TTTAttributedLabelLink *)linkAtPoint:(CGPoint)point; - -@end - -/** - The `TTTAttributedLabelDelegate` protocol defines the messages sent to an attributed label delegate when links are tapped. All of the methods of this protocol are optional. - */ -@protocol TTTAttributedLabelDelegate - -///----------------------------------- -/// @name Responding to Link Selection -///----------------------------------- -@optional - -/** - Tells the delegate that the user did select a link to a URL. - - @param label The label whose link was selected. - @param url The URL for the selected link. - */ -- (void)attributedLabel:(TTTAttributedLabel *)label - didSelectLinkWithURL:(NSURL *)url; - -/** - Tells the delegate that the user did select a link to an address. - - @param label The label whose link was selected. - @param addressComponents The components of the address for the selected link. - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didSelectLinkWithAddress:(NSDictionary *)addressComponents; - -/** - Tells the delegate that the user did select a link to a phone number. - - @param label The label whose link was selected. - @param phoneNumber The phone number for the selected link. - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didSelectLinkWithPhoneNumber:(NSString *)phoneNumber; - -/** - Tells the delegate that the user did select a link to a date. - - @param label The label whose link was selected. - @param date The datefor the selected link. - */ -- (void)attributedLabel:(TTTAttributedLabel *)label - didSelectLinkWithDate:(NSDate *)date; - -/** - Tells the delegate that the user did select a link to a date with a time zone and duration. - - @param label The label whose link was selected. - @param date The date for the selected link. - @param timeZone The time zone of the date for the selected link. - @param duration The duration, in seconds from the date for the selected link. - */ -- (void)attributedLabel:(TTTAttributedLabel *)label - didSelectLinkWithDate:(NSDate *)date - timeZone:(NSTimeZone *)timeZone - duration:(NSTimeInterval)duration; - -/** - Tells the delegate that the user did select a link to transit information - - @param label The label whose link was selected. - @param components A dictionary containing the transit components. The currently supported keys are `NSTextCheckingAirlineKey` and `NSTextCheckingFlightKey`. - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didSelectLinkWithTransitInformation:(NSDictionary *)components; - -/** - Tells the delegate that the user did select a link to a text checking result. - - @discussion This method is called if no other delegate method was called, which can occur by either now implementing the method in `TTTAttributedLabelDelegate` corresponding to a particular link, or the link was added by passing an instance of a custom `NSTextCheckingResult` subclass into `-addLinkWithTextCheckingResult:`. - - @param label The label whose link was selected. - @param result The custom text checking result. - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didSelectLinkWithTextCheckingResult:(NSTextCheckingResult *)result; - -///--------------------------------- -/// @name Responding to Long Presses -///--------------------------------- - -/** - * Long-press delegate methods include the CGPoint tapped within the label's coordinate space. - * This may be useful on iPad to present a popover from a specific origin point. - */ - -/** - Tells the delegate that the user long-pressed a link to a URL. - - @param label The label whose link was long pressed. - @param url The URL for the link. - @param point the point pressed, in the label's coordinate space - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didLongPressLinkWithURL:(NSURL *)url - atPoint:(CGPoint)point; - -/** - Tells the delegate that the user long-pressed a link to an address. - - @param label The label whose link was long pressed. - @param addressComponents The components of the address for the link. - @param point the point pressed, in the label's coordinate space - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didLongPressLinkWithAddress:(NSDictionary *)addressComponents - atPoint:(CGPoint)point; - -/** - Tells the delegate that the user long-pressed a link to a phone number. - - @param label The label whose link was long pressed. - @param phoneNumber The phone number for the link. - @param point the point pressed, in the label's coordinate space - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didLongPressLinkWithPhoneNumber:(NSString *)phoneNumber - atPoint:(CGPoint)point; - - -/** - Tells the delegate that the user long-pressed a link to a date. - - @param label The label whose link was long pressed. - @param date The date for the selected link. - @param point the point pressed, in the label's coordinate space - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didLongPressLinkWithDate:(NSDate *)date - atPoint:(CGPoint)point; - - -/** - Tells the delegate that the user long-pressed a link to a date with a time zone and duration. - - @param label The label whose link was long pressed. - @param date The date for the link. - @param timeZone The time zone of the date for the link. - @param duration The duration, in seconds from the date for the link. - @param point the point pressed, in the label's coordinate space - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didLongPressLinkWithDate:(NSDate *)date - timeZone:(NSTimeZone *)timeZone - duration:(NSTimeInterval)duration - atPoint:(CGPoint)point; - - -/** - Tells the delegate that the user long-pressed a link to transit information. - - @param label The label whose link was long pressed. - @param components A dictionary containing the transit components. The currently supported keys are `NSTextCheckingAirlineKey` and `NSTextCheckingFlightKey`. - @param point the point pressed, in the label's coordinate space - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didLongPressLinkWithTransitInformation:(NSDictionary *)components - atPoint:(CGPoint)point; - -/** - Tells the delegate that the user long-pressed a link to a text checking result. - - @discussion Similar to `-attributedLabel:didSelectLinkWithTextCheckingResult:`, this method is called if a link is long pressed and the delegate does not implement the method corresponding to this type of link. - - @param label The label whose link was long pressed. - @param result The custom text checking result. - @param point the point pressed, in the label's coordinate space - */ -- (void)attributedLabel:(TTTAttributedLabel *)label -didLongPressLinkWithTextCheckingResult:(NSTextCheckingResult *)result - atPoint:(CGPoint)point; - -@end - -@interface TTTAttributedLabelLink : NSObject - -typedef void (^TTTAttributedLabelLinkBlock) (TTTAttributedLabel *, TTTAttributedLabelLink *); - -/** - An `NSTextCheckingResult` representing the link's location and type. - */ -@property (readonly, nonatomic, strong) NSTextCheckingResult *result; - -/** - A dictionary containing the @c NSAttributedString attributes to be applied to the link. - */ -@property (readonly, nonatomic, copy) NSDictionary *attributes; - -/** - A dictionary containing the @c NSAttributedString attributes to be applied to the link when it is in the active state. - */ -@property (readonly, nonatomic, copy) NSDictionary *activeAttributes; - -/** - A dictionary containing the @c NSAttributedString attributes to be applied to the link when it is in the inactive state, which is triggered by a change in `tintColor` in iOS 7 and later. - */ -@property (readonly, nonatomic, copy) NSDictionary *inactiveAttributes; - -/** - Additional information about a link for VoiceOver users. Has default values if the link's @c result is @c NSTextCheckingTypeLink, @c NSTextCheckingTypePhoneNumber, or @c NSTextCheckingTypeDate. - */ -@property (nonatomic, copy) NSString *accessibilityValue; - -/** - A block called when this link is tapped. - If non-nil, tapping on this link will call this block instead of the - @c TTTAttributedLabelDelegate tap methods, which will not be called for this link. - */ -@property (nonatomic, copy) TTTAttributedLabelLinkBlock linkTapBlock; - -/** - A block called when this link is long-pressed. - If non-nil, long pressing on this link will call this block instead of the - @c TTTAttributedLabelDelegate long press methods, which will not be called for this link. - */ -@property (nonatomic, copy) TTTAttributedLabelLinkBlock linkLongPressBlock; - -/** - Initializes a link using the attribute dictionaries specified. - - @param attributes The @c attributes property for the link. - @param activeAttributes The @c activeAttributes property for the link. - @param inactiveAttributes The @c inactiveAttributes property for the link. - @param result An @c NSTextCheckingResult representing the link's location and type. - - @return The initialized link object. - */ -- (instancetype)initWithAttributes:(NSDictionary *)attributes - activeAttributes:(NSDictionary *)activeAttributes - inactiveAttributes:(NSDictionary *)inactiveAttributes - textCheckingResult:(NSTextCheckingResult *)result; - -/** - Initializes a link using the attribute dictionaries set on a specified label. - - @param label The attributed label from which to inherit attribute dictionaries. - @param result An @c NSTextCheckingResult representing the link's location and type. - - @return The initialized link object. - */ -- (instancetype)initWithAttributesFromLabel:(TTTAttributedLabel*)label - textCheckingResult:(NSTextCheckingResult *)result; - -@end diff --git a/Pods/TTTAttributedLabel/TTTAttributedLabel/TTTAttributedLabel.m b/Pods/TTTAttributedLabel/TTTAttributedLabel/TTTAttributedLabel.m deleted file mode 100644 index 48f63287c..000000000 --- a/Pods/TTTAttributedLabel/TTTAttributedLabel/TTTAttributedLabel.m +++ /dev/null @@ -1,1898 +0,0 @@ -// TTTAttributedLabel.m -// -// Copyright (c) 2011 Mattt Thompson (http://mattt.me) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#import "TTTAttributedLabel.h" - -#import -#import -#import - -#define kTTTLineBreakWordWrapTextWidthScalingFactor (M_PI / M_E) - -static CGFloat const TTTFLOAT_MAX = 100000; - -NSString * const kTTTStrikeOutAttributeName = @"TTTStrikeOutAttribute"; -NSString * const kTTTBackgroundFillColorAttributeName = @"TTTBackgroundFillColor"; -NSString * const kTTTBackgroundFillPaddingAttributeName = @"TTTBackgroundFillPadding"; -NSString * const kTTTBackgroundStrokeColorAttributeName = @"TTTBackgroundStrokeColor"; -NSString * const kTTTBackgroundLineWidthAttributeName = @"TTTBackgroundLineWidth"; -NSString * const kTTTBackgroundCornerRadiusAttributeName = @"TTTBackgroundCornerRadius"; - -const NSTextAlignment TTTTextAlignmentLeft = NSTextAlignmentLeft; -const NSTextAlignment TTTTextAlignmentCenter = NSTextAlignmentCenter; -const NSTextAlignment TTTTextAlignmentRight = NSTextAlignmentRight; -const NSTextAlignment TTTTextAlignmentJustified = NSTextAlignmentJustified; -const NSTextAlignment TTTTextAlignmentNatural = NSTextAlignmentNatural; - -const NSLineBreakMode TTTLineBreakByWordWrapping = NSLineBreakByWordWrapping; -const NSLineBreakMode TTTLineBreakByCharWrapping = NSLineBreakByCharWrapping; -const NSLineBreakMode TTTLineBreakByClipping = NSLineBreakByClipping; -const NSLineBreakMode TTTLineBreakByTruncatingHead = NSLineBreakByTruncatingHead; -const NSLineBreakMode TTTLineBreakByTruncatingMiddle = NSLineBreakByTruncatingMiddle; -const NSLineBreakMode TTTLineBreakByTruncatingTail = NSLineBreakByTruncatingTail; - -typedef NSTextAlignment TTTTextAlignment; -typedef NSLineBreakMode TTTLineBreakMode; - - -static inline CTTextAlignment CTTextAlignmentFromTTTTextAlignment(TTTTextAlignment alignment) { - switch (alignment) { -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 90000 - case NSTextAlignmentLeft: return kCTTextAlignmentLeft; - case NSTextAlignmentCenter: return kCTTextAlignmentCenter; - case NSTextAlignmentRight: return kCTTextAlignmentRight; - default: return kCTTextAlignmentNatural; -#else - case NSTextAlignmentLeft: return kCTLeftTextAlignment; - case NSTextAlignmentCenter: return kCTCenterTextAlignment; - case NSTextAlignmentRight: return kCTRightTextAlignment; - default: return kCTNaturalTextAlignment; -#endif - } -} - -static inline CTLineBreakMode CTLineBreakModeFromTTTLineBreakMode(TTTLineBreakMode lineBreakMode) { - switch (lineBreakMode) { - case NSLineBreakByWordWrapping: return kCTLineBreakByWordWrapping; - case NSLineBreakByCharWrapping: return kCTLineBreakByCharWrapping; - case NSLineBreakByClipping: return kCTLineBreakByClipping; - case NSLineBreakByTruncatingHead: return kCTLineBreakByTruncatingHead; - case NSLineBreakByTruncatingTail: return kCTLineBreakByTruncatingTail; - case NSLineBreakByTruncatingMiddle: return kCTLineBreakByTruncatingMiddle; - default: return 0; - } -} - -static inline CGFLOAT_TYPE CGFloat_ceil(CGFLOAT_TYPE cgfloat) { -#if CGFLOAT_IS_DOUBLE - return ceil(cgfloat); -#else - return ceilf(cgfloat); -#endif -} - -static inline CGFLOAT_TYPE CGFloat_floor(CGFLOAT_TYPE cgfloat) { -#if CGFLOAT_IS_DOUBLE - return floor(cgfloat); -#else - return floorf(cgfloat); -#endif -} - -static inline CGFLOAT_TYPE CGFloat_round(CGFLOAT_TYPE cgfloat) { -#if CGFLOAT_IS_DOUBLE - return round(cgfloat); -#else - return roundf(cgfloat); -#endif -} - -static inline CGFLOAT_TYPE CGFloat_sqrt(CGFLOAT_TYPE cgfloat) { -#if CGFLOAT_IS_DOUBLE - return sqrt(cgfloat); -#else - return sqrtf(cgfloat); -#endif -} - -static inline CGFloat TTTFlushFactorForTextAlignment(NSTextAlignment textAlignment) { - switch (textAlignment) { - case TTTTextAlignmentCenter: - return 0.5f; - case TTTTextAlignmentRight: - return 1.0f; - case TTTTextAlignmentLeft: - default: - return 0.0f; - } -} - -static inline NSDictionary * NSAttributedStringAttributesFromLabel(TTTAttributedLabel *label) { - NSMutableDictionary *mutableAttributes = [NSMutableDictionary dictionary]; - - if ([NSMutableParagraphStyle class]) { - [mutableAttributes setObject:label.font forKey:(NSString *)kCTFontAttributeName]; - [mutableAttributes setObject:label.textColor forKey:(NSString *)kCTForegroundColorAttributeName]; - [mutableAttributes setObject:@(label.kern) forKey:(NSString *)kCTKernAttributeName]; - - NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; - paragraphStyle.alignment = label.textAlignment; - paragraphStyle.lineSpacing = label.lineSpacing; - paragraphStyle.minimumLineHeight = label.minimumLineHeight > 0 ? label.minimumLineHeight : label.font.lineHeight * label.lineHeightMultiple; - paragraphStyle.maximumLineHeight = label.maximumLineHeight > 0 ? label.maximumLineHeight : label.font.lineHeight * label.lineHeightMultiple; - paragraphStyle.lineHeightMultiple = label.lineHeightMultiple; - paragraphStyle.firstLineHeadIndent = label.firstLineIndent; - - if (label.numberOfLines == 1) { - paragraphStyle.lineBreakMode = label.lineBreakMode; - } else { - paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping; - } - - [mutableAttributes setObject:paragraphStyle forKey:(NSString *)kCTParagraphStyleAttributeName]; - } else { - CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)label.font.fontName, label.font.pointSize, NULL); - [mutableAttributes setObject:(__bridge id)font forKey:(NSString *)kCTFontAttributeName]; - CFRelease(font); - - [mutableAttributes setObject:(id)[label.textColor CGColor] forKey:(NSString *)kCTForegroundColorAttributeName]; - [mutableAttributes setObject:@(label.kern) forKey:(NSString *)kCTKernAttributeName]; - - CTTextAlignment alignment = CTTextAlignmentFromTTTTextAlignment(label.textAlignment); - CGFloat lineSpacing = label.lineSpacing; - CGFloat minimumLineHeight = label.minimumLineHeight * label.lineHeightMultiple; - CGFloat maximumLineHeight = label.maximumLineHeight * label.lineHeightMultiple; - CGFloat lineSpacingAdjustment = CGFloat_ceil(label.font.lineHeight - label.font.ascender + label.font.descender); - CGFloat lineHeightMultiple = label.lineHeightMultiple; - CGFloat firstLineIndent = label.firstLineIndent; - - CTLineBreakMode lineBreakMode = kCTLineBreakByWordWrapping; - if (label.numberOfLines == 1) { - lineBreakMode = CTLineBreakModeFromTTTLineBreakMode(label.lineBreakMode); - } - - CTParagraphStyleSetting paragraphStyles[12] = { - {.spec = kCTParagraphStyleSpecifierAlignment, .valueSize = sizeof(CTTextAlignment), .value = (const void *)&alignment}, - {.spec = kCTParagraphStyleSpecifierLineBreakMode, .valueSize = sizeof(CTLineBreakMode), .value = (const void *)&lineBreakMode}, - {.spec = kCTParagraphStyleSpecifierLineSpacing, .valueSize = sizeof(CGFloat), .value = (const void *)&lineSpacing}, - {.spec = kCTParagraphStyleSpecifierMinimumLineSpacing, .valueSize = sizeof(CGFloat), .value = (const void *)&minimumLineHeight}, - {.spec = kCTParagraphStyleSpecifierMaximumLineSpacing, .valueSize = sizeof(CGFloat), .value = (const void *)&maximumLineHeight}, - {.spec = kCTParagraphStyleSpecifierLineSpacingAdjustment, .valueSize = sizeof (CGFloat), .value = (const void *)&lineSpacingAdjustment}, - {.spec = kCTParagraphStyleSpecifierLineHeightMultiple, .valueSize = sizeof(CGFloat), .value = (const void *)&lineHeightMultiple}, - {.spec = kCTParagraphStyleSpecifierFirstLineHeadIndent, .valueSize = sizeof(CGFloat), .value = (const void *)&firstLineIndent}, - }; - - CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(paragraphStyles, 12); - - [mutableAttributes setObject:(__bridge id)paragraphStyle forKey:(NSString *)kCTParagraphStyleAttributeName]; - - CFRelease(paragraphStyle); - } - - return [NSDictionary dictionaryWithDictionary:mutableAttributes]; -} - -static inline CGColorRef CGColorRefFromColor(id color); -static inline NSDictionary * convertNSAttributedStringAttributesToCTAttributes(NSDictionary *attributes); - -static inline NSAttributedString * NSAttributedStringByScalingFontSize(NSAttributedString *attributedString, CGFloat scale) { - NSMutableAttributedString *mutableAttributedString = [attributedString mutableCopy]; - [mutableAttributedString enumerateAttribute:(NSString *)kCTFontAttributeName inRange:NSMakeRange(0, [mutableAttributedString length]) options:0 usingBlock:^(id value, NSRange range, BOOL * __unused stop) { - UIFont *font = (UIFont *)value; - if (font) { - NSString *fontName; - CGFloat pointSize; - - if ([font isKindOfClass:[UIFont class]]) { - fontName = font.fontName; - pointSize = font.pointSize; - } else { - fontName = (NSString *)CFBridgingRelease(CTFontCopyName((__bridge CTFontRef)font, kCTFontPostScriptNameKey)); - pointSize = CTFontGetSize((__bridge CTFontRef)font); - } - - [mutableAttributedString removeAttribute:(NSString *)kCTFontAttributeName range:range]; - CTFontRef fontRef = CTFontCreateWithName((__bridge CFStringRef)fontName, CGFloat_floor(pointSize * scale), NULL); - [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)fontRef range:range]; - CFRelease(fontRef); - } - }]; - - return mutableAttributedString; -} - -static inline NSAttributedString * NSAttributedStringBySettingColorFromContext(NSAttributedString *attributedString, UIColor *color) { - if (!color) { - return attributedString; - } - - NSMutableAttributedString *mutableAttributedString = [attributedString mutableCopy]; - [mutableAttributedString enumerateAttribute:(NSString *)kCTForegroundColorFromContextAttributeName inRange:NSMakeRange(0, [mutableAttributedString length]) options:0 usingBlock:^(id value, NSRange range, __unused BOOL *stop) { - BOOL usesColorFromContext = (BOOL)value; - if (usesColorFromContext) { - [mutableAttributedString setAttributes:[NSDictionary dictionaryWithObject:color forKey:(NSString *)kCTForegroundColorAttributeName] range:range]; - [mutableAttributedString removeAttribute:(NSString *)kCTForegroundColorFromContextAttributeName range:range]; - } - }]; - - return mutableAttributedString; -} - -static inline CGSize CTFramesetterSuggestFrameSizeForAttributedStringWithConstraints(CTFramesetterRef framesetter, NSAttributedString *attributedString, CGSize size, NSUInteger numberOfLines) { - CFRange rangeToSize = CFRangeMake(0, (CFIndex)[attributedString length]); - CGSize constraints = CGSizeMake(size.width, TTTFLOAT_MAX); - - if (numberOfLines == 1) { - // If there is one line, the size that fits is the full width of the line - constraints = CGSizeMake(TTTFLOAT_MAX, TTTFLOAT_MAX); - } else if (numberOfLines > 0) { - // If the line count of the label more than 1, limit the range to size to the number of lines that have been set - CGMutablePathRef path = CGPathCreateMutable(); - CGPathAddRect(path, NULL, CGRectMake(0.0f, 0.0f, constraints.width, TTTFLOAT_MAX)); - CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL); - CFArrayRef lines = CTFrameGetLines(frame); - - if (CFArrayGetCount(lines) > 0) { - NSInteger lastVisibleLineIndex = MIN((CFIndex)numberOfLines, CFArrayGetCount(lines)) - 1; - CTLineRef lastVisibleLine = CFArrayGetValueAtIndex(lines, lastVisibleLineIndex); - - CFRange rangeToLayout = CTLineGetStringRange(lastVisibleLine); - rangeToSize = CFRangeMake(0, rangeToLayout.location + rangeToLayout.length); - } - - CFRelease(frame); - CGPathRelease(path); - } - - CGSize suggestedSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, rangeToSize, NULL, constraints, NULL); - - return CGSizeMake(CGFloat_ceil(suggestedSize.width), CGFloat_ceil(suggestedSize.height)); -} - -@interface TTTAccessibilityElement : UIAccessibilityElement -@property (nonatomic, weak) UIView *superview; -@property (nonatomic, assign) CGRect boundingRect; -@end - -@implementation TTTAccessibilityElement - -- (CGRect)accessibilityFrame { - return UIAccessibilityConvertFrameToScreenCoordinates(self.boundingRect, self.superview); -} - -@end - -@interface TTTAttributedLabel () -@property (readwrite, nonatomic, copy) NSAttributedString *inactiveAttributedText; -@property (readwrite, nonatomic, copy) NSAttributedString *renderedAttributedText; -@property (readwrite, atomic, strong) NSDataDetector *dataDetector; -@property (readwrite, nonatomic, strong) NSArray *linkModels; -@property (readwrite, nonatomic, strong) TTTAttributedLabelLink *activeLink; -@property (readwrite, nonatomic, strong) NSArray *accessibilityElements; - -- (void) longPressGestureDidFire:(UILongPressGestureRecognizer *)sender; -@end - -@implementation TTTAttributedLabel { -@private - BOOL _needsFramesetter; - CTFramesetterRef _framesetter; - CTFramesetterRef _highlightFramesetter; -} - -@dynamic text; -@synthesize attributedText = _attributedText; - -#ifndef kCFCoreFoundationVersionNumber_iOS_7_0 -#define kCFCoreFoundationVersionNumber_iOS_7_0 847.2 -#endif - -+ (void)load { - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_7_0) { - Class class = [self class]; - Class superclass = class_getSuperclass(class); - - NSArray *strings = @[ - NSStringFromSelector(@selector(isAccessibilityElement)), - NSStringFromSelector(@selector(accessibilityElementCount)), - NSStringFromSelector(@selector(accessibilityElementAtIndex:)), - NSStringFromSelector(@selector(indexOfAccessibilityElement:)), - ]; - - for (NSString *string in strings) { - SEL selector = NSSelectorFromString(string); - IMP superImplementation = class_getMethodImplementation(superclass, selector); - Method method = class_getInstanceMethod(class, selector); - const char *types = method_getTypeEncoding(method); - class_replaceMethod(class, selector, superImplementation, types); - } - } - }); -} - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) { - return nil; - } - - [self commonInit]; - - return self; -} - -- (void)commonInit { - self.userInteractionEnabled = YES; -#if !TARGET_OS_TV - self.multipleTouchEnabled = NO; -#endif - - self.textInsets = UIEdgeInsetsZero; - self.lineHeightMultiple = 1.0f; - - self.linkModels = [NSArray array]; - - self.linkBackgroundEdgeInset = UIEdgeInsetsMake(0.0f, -1.0f, 0.0f, -1.0f); - - NSMutableDictionary *mutableLinkAttributes = [NSMutableDictionary dictionary]; - [mutableLinkAttributes setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCTUnderlineStyleAttributeName]; - - NSMutableDictionary *mutableActiveLinkAttributes = [NSMutableDictionary dictionary]; - [mutableActiveLinkAttributes setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCTUnderlineStyleAttributeName]; - - NSMutableDictionary *mutableInactiveLinkAttributes = [NSMutableDictionary dictionary]; - [mutableInactiveLinkAttributes setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCTUnderlineStyleAttributeName]; - - if ([NSMutableParagraphStyle class]) { - [mutableLinkAttributes setObject:[UIColor blueColor] forKey:(NSString *)kCTForegroundColorAttributeName]; - [mutableActiveLinkAttributes setObject:[UIColor redColor] forKey:(NSString *)kCTForegroundColorAttributeName]; - [mutableInactiveLinkAttributes setObject:[UIColor grayColor] forKey:(NSString *)kCTForegroundColorAttributeName]; - } else { - [mutableLinkAttributes setObject:(__bridge id)[[UIColor blueColor] CGColor] forKey:(NSString *)kCTForegroundColorAttributeName]; - [mutableActiveLinkAttributes setObject:(__bridge id)[[UIColor redColor] CGColor] forKey:(NSString *)kCTForegroundColorAttributeName]; - [mutableInactiveLinkAttributes setObject:(__bridge id)[[UIColor grayColor] CGColor] forKey:(NSString *)kCTForegroundColorAttributeName]; - } - - self.linkAttributes = [NSDictionary dictionaryWithDictionary:mutableLinkAttributes]; - self.activeLinkAttributes = [NSDictionary dictionaryWithDictionary:mutableActiveLinkAttributes]; - self.inactiveLinkAttributes = [NSDictionary dictionaryWithDictionary:mutableInactiveLinkAttributes]; - _extendsLinkTouchArea = NO; - _longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self - action:@selector(longPressGestureDidFire:)]; - self.longPressGestureRecognizer.delegate = self; - [self addGestureRecognizer:self.longPressGestureRecognizer]; -} - -- (void)dealloc { - if (_framesetter) { - CFRelease(_framesetter); - } - - if (_highlightFramesetter) { - CFRelease(_highlightFramesetter); - } - - if (_longPressGestureRecognizer) { - [self removeGestureRecognizer:_longPressGestureRecognizer]; - } -} - -#pragma mark - - -+ (CGSize)sizeThatFitsAttributedString:(NSAttributedString *)attributedString - withConstraints:(CGSize)size - limitedToNumberOfLines:(NSUInteger)numberOfLines -{ - if (!attributedString || attributedString.length == 0) { - return CGSizeZero; - } - - CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attributedString); - - CGSize calculatedSize = CTFramesetterSuggestFrameSizeForAttributedStringWithConstraints(framesetter, attributedString, size, numberOfLines); - - CFRelease(framesetter); - - return calculatedSize; -} - -#pragma mark - - -- (void)setAttributedText:(NSAttributedString *)text { - if ([text isEqualToAttributedString:_attributedText]) { - return; - } - - _attributedText = [text copy]; - - [self setNeedsFramesetter]; - [self setNeedsDisplay]; - - if ([self respondsToSelector:@selector(invalidateIntrinsicContentSize)]) { - [self invalidateIntrinsicContentSize]; - } - - [super setText:[self.attributedText string]]; -} - -- (NSAttributedString *)renderedAttributedText { - if (!_renderedAttributedText) { - self.renderedAttributedText = NSAttributedStringBySettingColorFromContext(self.attributedText, self.textColor); - } - - return _renderedAttributedText; -} - -- (NSArray *) links { - return [_linkModels valueForKey:@"result"]; -} - -- (void)setLinkModels:(NSArray *)linkModels { - _linkModels = linkModels; - - self.accessibilityElements = nil; -} - -- (void)setNeedsFramesetter { - // Reset the rendered attributed text so it has a chance to regenerate - self.renderedAttributedText = nil; - - _needsFramesetter = YES; -} - -- (CTFramesetterRef)framesetter { - if (_needsFramesetter) { - @synchronized(self) { - CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)self.renderedAttributedText); - [self setFramesetter:framesetter]; - [self setHighlightFramesetter:nil]; - _needsFramesetter = NO; - - if (framesetter) { - CFRelease(framesetter); - } - } - } - - return _framesetter; -} - -- (void)setFramesetter:(CTFramesetterRef)framesetter { - if (framesetter) { - CFRetain(framesetter); - } - - if (_framesetter) { - CFRelease(_framesetter); - } - - _framesetter = framesetter; -} - -- (CTFramesetterRef)highlightFramesetter { - return _highlightFramesetter; -} - -- (void)setHighlightFramesetter:(CTFramesetterRef)highlightFramesetter { - if (highlightFramesetter) { - CFRetain(highlightFramesetter); - } - - if (_highlightFramesetter) { - CFRelease(_highlightFramesetter); - } - - _highlightFramesetter = highlightFramesetter; -} - -#pragma mark - - -- (void)setEnabledTextCheckingTypes:(NSTextCheckingTypes)enabledTextCheckingTypes { - if (self.enabledTextCheckingTypes == enabledTextCheckingTypes) { - return; - } - - _enabledTextCheckingTypes = enabledTextCheckingTypes; - - // one detector instance per type (combination), fast reuse e.g. in cells - static NSMutableDictionary *dataDetectorsByType = nil; - - if (!dataDetectorsByType) { - dataDetectorsByType = [NSMutableDictionary dictionary]; - } - - if (enabledTextCheckingTypes) { - if (![dataDetectorsByType objectForKey:@(enabledTextCheckingTypes)]) { - NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:enabledTextCheckingTypes - error:nil]; - if (detector) { - [dataDetectorsByType setObject:detector forKey:@(enabledTextCheckingTypes)]; - } - } - self.dataDetector = [dataDetectorsByType objectForKey:@(enabledTextCheckingTypes)]; - } else { - self.dataDetector = nil; - } -} - -- (void)addLink:(TTTAttributedLabelLink *)link { - [self addLinks:@[link]]; -} - -- (void)addLinks:(NSArray *)links { - NSMutableArray *mutableLinkModels = [NSMutableArray arrayWithArray:self.linkModels]; - - NSMutableAttributedString *mutableAttributedString = [self.attributedText mutableCopy]; - - for (TTTAttributedLabelLink *link in links) { - if (link.attributes) { - [mutableAttributedString addAttributes:link.attributes range:link.result.range]; - } - } - - self.attributedText = mutableAttributedString; - [self setNeedsDisplay]; - - [mutableLinkModels addObjectsFromArray:links]; - - self.linkModels = [NSArray arrayWithArray:mutableLinkModels]; -} - -- (TTTAttributedLabelLink *)addLinkWithTextCheckingResult:(NSTextCheckingResult *)result - attributes:(NSDictionary *)attributes -{ - return [self addLinksWithTextCheckingResults:@[result] attributes:attributes].firstObject; -} - -- (NSArray *)addLinksWithTextCheckingResults:(NSArray *)results - attributes:(NSDictionary *)attributes -{ - NSMutableArray *links = [NSMutableArray array]; - - for (NSTextCheckingResult *result in results) { - NSDictionary *activeAttributes = attributes ? self.activeLinkAttributes : nil; - NSDictionary *inactiveAttributes = attributes ? self.inactiveLinkAttributes : nil; - - TTTAttributedLabelLink *link = [[TTTAttributedLabelLink alloc] initWithAttributes:attributes - activeAttributes:activeAttributes - inactiveAttributes:inactiveAttributes - textCheckingResult:result]; - - [links addObject:link]; - } - - [self addLinks:links]; - - return links; -} - -- (TTTAttributedLabelLink *)addLinkWithTextCheckingResult:(NSTextCheckingResult *)result { - return [self addLinkWithTextCheckingResult:result attributes:self.linkAttributes]; -} - -- (TTTAttributedLabelLink *)addLinkToURL:(NSURL *)url - withRange:(NSRange)range -{ - return [self addLinkWithTextCheckingResult:[NSTextCheckingResult linkCheckingResultWithRange:range URL:url]]; -} - -- (TTTAttributedLabelLink *)addLinkToAddress:(NSDictionary *)addressComponents - withRange:(NSRange)range -{ - return [self addLinkWithTextCheckingResult:[NSTextCheckingResult addressCheckingResultWithRange:range components:addressComponents]]; -} - -- (TTTAttributedLabelLink *)addLinkToPhoneNumber:(NSString *)phoneNumber - withRange:(NSRange)range -{ - return [self addLinkWithTextCheckingResult:[NSTextCheckingResult phoneNumberCheckingResultWithRange:range phoneNumber:phoneNumber]]; -} - -- (TTTAttributedLabelLink *)addLinkToDate:(NSDate *)date - withRange:(NSRange)range -{ - return [self addLinkWithTextCheckingResult:[NSTextCheckingResult dateCheckingResultWithRange:range date:date]]; -} - -- (TTTAttributedLabelLink *)addLinkToDate:(NSDate *)date - timeZone:(NSTimeZone *)timeZone - duration:(NSTimeInterval)duration - withRange:(NSRange)range -{ - return [self addLinkWithTextCheckingResult:[NSTextCheckingResult dateCheckingResultWithRange:range date:date timeZone:timeZone duration:duration]]; -} - -- (TTTAttributedLabelLink *)addLinkToTransitInformation:(NSDictionary *)components - withRange:(NSRange)range -{ - return [self addLinkWithTextCheckingResult:[NSTextCheckingResult transitInformationCheckingResultWithRange:range components:components]]; -} - -#pragma mark - - -- (BOOL)containslinkAtPoint:(CGPoint)point { - return [self linkAtPoint:point] != nil; -} - -- (TTTAttributedLabelLink *)linkAtPoint:(CGPoint)point { - - // Stop quickly if none of the points to be tested are in the bounds. - if (!CGRectContainsPoint(CGRectInset(self.bounds, -15.f, -15.f), point) || self.links.count == 0) { - return nil; - } - - TTTAttributedLabelLink *result = [self linkAtCharacterIndex:[self characterIndexAtPoint:point]]; - - if (!result && self.extendsLinkTouchArea) { - result = [self linkAtRadius:2.5f aroundPoint:point] - ?: [self linkAtRadius:5.f aroundPoint:point] - ?: [self linkAtRadius:7.5f aroundPoint:point] - ?: [self linkAtRadius:12.5f aroundPoint:point] - ?: [self linkAtRadius:15.f aroundPoint:point]; - } - - return result; -} - -- (TTTAttributedLabelLink *)linkAtRadius:(const CGFloat)radius aroundPoint:(CGPoint)point { - const CGFloat diagonal = CGFloat_sqrt(2 * radius * radius); - const CGPoint deltas[] = { - CGPointMake(0, -radius), CGPointMake(0, radius), // Above and below - CGPointMake(-radius, 0), CGPointMake(radius, 0), // Beside - CGPointMake(-diagonal, -diagonal), CGPointMake(-diagonal, diagonal), - CGPointMake(diagonal, diagonal), CGPointMake(diagonal, -diagonal) // Diagonal - }; - const size_t count = sizeof(deltas) / sizeof(CGPoint); - - TTTAttributedLabelLink *link = nil; - - for (NSInteger i = 0; i < count && link.result == nil; i ++) { - CGPoint currentPoint = CGPointMake(point.x + deltas[i].x, point.y + deltas[i].y); - link = [self linkAtCharacterIndex:[self characterIndexAtPoint:currentPoint]]; - } - - return link; -} - -- (TTTAttributedLabelLink *)linkAtCharacterIndex:(CFIndex)idx { - // Do not enumerate if the index is outside of the bounds of the text. - if (!NSLocationInRange((NSUInteger)idx, NSMakeRange(0, self.attributedText.length))) { - return nil; - } - - NSEnumerator *enumerator = [self.linkModels reverseObjectEnumerator]; - TTTAttributedLabelLink *link = nil; - while ((link = [enumerator nextObject])) { - if (NSLocationInRange((NSUInteger)idx, link.result.range)) { - return link; - } - } - - return nil; -} - -- (CFIndex)characterIndexAtPoint:(CGPoint)p { - if (!CGRectContainsPoint(self.bounds, p)) { - return NSNotFound; - } - - CGRect textRect = [self textRectForBounds:self.bounds limitedToNumberOfLines:self.numberOfLines]; - if (!CGRectContainsPoint(textRect, p)) { - return NSNotFound; - } - - // Offset tap coordinates by textRect origin to make them relative to the origin of frame - p = CGPointMake(p.x - textRect.origin.x, p.y - textRect.origin.y); - // Convert tap coordinates (start at top left) to CT coordinates (start at bottom left) - p = CGPointMake(p.x, textRect.size.height - p.y); - - CGMutablePathRef path = CGPathCreateMutable(); - CGPathAddRect(path, NULL, textRect); - CTFrameRef frame = CTFramesetterCreateFrame([self framesetter], CFRangeMake(0, (CFIndex)[self.attributedText length]), path, NULL); - if (frame == NULL) { - CGPathRelease(path); - return NSNotFound; - } - - CFArrayRef lines = CTFrameGetLines(frame); - NSInteger numberOfLines = self.numberOfLines > 0 ? MIN(self.numberOfLines, CFArrayGetCount(lines)) : CFArrayGetCount(lines); - if (numberOfLines == 0) { - CFRelease(frame); - CGPathRelease(path); - return NSNotFound; - } - - CFIndex idx = NSNotFound; - - CGPoint lineOrigins[numberOfLines]; - CTFrameGetLineOrigins(frame, CFRangeMake(0, numberOfLines), lineOrigins); - - for (CFIndex lineIndex = 0; lineIndex < numberOfLines; lineIndex++) { - CGPoint lineOrigin = lineOrigins[lineIndex]; - CTLineRef line = CFArrayGetValueAtIndex(lines, lineIndex); - - // Get bounding information of line - CGFloat ascent = 0.0f, descent = 0.0f, leading = 0.0f; - CGFloat width = (CGFloat)CTLineGetTypographicBounds(line, &ascent, &descent, &leading); - CGFloat yMin = (CGFloat)floor(lineOrigin.y - descent); - CGFloat yMax = (CGFloat)ceil(lineOrigin.y + ascent); - - // Apply penOffset using flushFactor for horizontal alignment to set lineOrigin since this is the horizontal offset from drawFramesetter - CGFloat flushFactor = TTTFlushFactorForTextAlignment(self.textAlignment); - CGFloat penOffset = (CGFloat)CTLineGetPenOffsetForFlush(line, flushFactor, textRect.size.width); - lineOrigin.x = penOffset; - - // Check if we've already passed the line - if (p.y > yMax) { - break; - } - // Check if the point is within this line vertically - if (p.y >= yMin) { - // Check if the point is within this line horizontally - if (p.x >= lineOrigin.x && p.x <= lineOrigin.x + width) { - // Convert CT coordinates to line-relative coordinates - CGPoint relativePoint = CGPointMake(p.x - lineOrigin.x, p.y - lineOrigin.y); - idx = CTLineGetStringIndexForPosition(line, relativePoint); - break; - } - } - } - - CFRelease(frame); - CGPathRelease(path); - - return idx; -} - -- (CGRect)boundingRectForCharacterRange:(NSRange)range { - NSMutableAttributedString *mutableAttributedString = [self.attributedText mutableCopy]; - - NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:mutableAttributedString]; - - NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; - [textStorage addLayoutManager:layoutManager]; - - NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.bounds.size]; - [layoutManager addTextContainer:textContainer]; - - NSRange glyphRange; - [layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange]; - - return [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer]; -} - -- (void)drawFramesetter:(CTFramesetterRef)framesetter - attributedString:(NSAttributedString *)attributedString - textRange:(CFRange)textRange - inRect:(CGRect)rect - context:(CGContextRef)c -{ - CGMutablePathRef path = CGPathCreateMutable(); - CGPathAddRect(path, NULL, rect); - CTFrameRef frame = CTFramesetterCreateFrame(framesetter, textRange, path, NULL); - - [self drawBackground:frame inRect:rect context:c]; - - CFArrayRef lines = CTFrameGetLines(frame); - NSInteger numberOfLines = self.numberOfLines > 0 ? MIN(self.numberOfLines, CFArrayGetCount(lines)) : CFArrayGetCount(lines); - BOOL truncateLastLine = (self.lineBreakMode == TTTLineBreakByTruncatingHead || self.lineBreakMode == TTTLineBreakByTruncatingMiddle || self.lineBreakMode == TTTLineBreakByTruncatingTail); - - CGPoint lineOrigins[numberOfLines]; - CTFrameGetLineOrigins(frame, CFRangeMake(0, numberOfLines), lineOrigins); - - for (CFIndex lineIndex = 0; lineIndex < numberOfLines; lineIndex++) { - CGPoint lineOrigin = lineOrigins[lineIndex]; - CGContextSetTextPosition(c, lineOrigin.x, lineOrigin.y); - CTLineRef line = CFArrayGetValueAtIndex(lines, lineIndex); - - CGFloat descent = 0.0f; - CTLineGetTypographicBounds((CTLineRef)line, NULL, &descent, NULL); - - // Adjust pen offset for flush depending on text alignment - CGFloat flushFactor = TTTFlushFactorForTextAlignment(self.textAlignment); - - if (lineIndex == numberOfLines - 1 && truncateLastLine) { - // Check if the range of text in the last line reaches the end of the full attributed string - CFRange lastLineRange = CTLineGetStringRange(line); - - if (!(lastLineRange.length == 0 && lastLineRange.location == 0) && lastLineRange.location + lastLineRange.length < textRange.location + textRange.length) { - // Get correct truncationType and attribute position - CTLineTruncationType truncationType; - CFIndex truncationAttributePosition = lastLineRange.location; - TTTLineBreakMode lineBreakMode = self.lineBreakMode; - - // Multiple lines, only use UILineBreakModeTailTruncation - if (numberOfLines != 1) { - lineBreakMode = TTTLineBreakByTruncatingTail; - } - - switch (lineBreakMode) { - case TTTLineBreakByTruncatingHead: - truncationType = kCTLineTruncationStart; - break; - case TTTLineBreakByTruncatingMiddle: - truncationType = kCTLineTruncationMiddle; - truncationAttributePosition += (lastLineRange.length / 2); - break; - case TTTLineBreakByTruncatingTail: - default: - truncationType = kCTLineTruncationEnd; - truncationAttributePosition += (lastLineRange.length - 1); - break; - } - - NSAttributedString *attributedTruncationString = self.attributedTruncationToken; - if (!attributedTruncationString) { - NSString *truncationTokenString = @"\u2026"; // Unicode Character 'HORIZONTAL ELLIPSIS' (U+2026) - - NSDictionary *truncationTokenStringAttributes = truncationTokenStringAttributes = [attributedString attributesAtIndex:(NSUInteger)truncationAttributePosition effectiveRange:NULL]; - - attributedTruncationString = [[NSAttributedString alloc] initWithString:truncationTokenString attributes:truncationTokenStringAttributes]; - } - CTLineRef truncationToken = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)attributedTruncationString); - - // Append truncationToken to the string - // because if string isn't too long, CT won't add the truncationToken on its own. - // There is no chance of a double truncationToken because CT only adds the - // token if it removes characters (and the one we add will go first) - NSMutableAttributedString *truncationString = [[NSMutableAttributedString alloc] initWithAttributedString: - [attributedString attributedSubstringFromRange: - NSMakeRange((NSUInteger)lastLineRange.location, - (NSUInteger)lastLineRange.length)]]; - if (lastLineRange.length > 0) { - // Remove any newline at the end (we don't want newline space between the text and the truncation token). There can only be one, because the second would be on the next line. - unichar lastCharacter = [[truncationString string] characterAtIndex:(NSUInteger)(lastLineRange.length - 1)]; - if ([[NSCharacterSet newlineCharacterSet] characterIsMember:lastCharacter]) { - [truncationString deleteCharactersInRange:NSMakeRange((NSUInteger)(lastLineRange.length - 1), 1)]; - } - } - [truncationString appendAttributedString:attributedTruncationString]; - CTLineRef truncationLine = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)truncationString); - - // Truncate the line in case it is too long. - CTLineRef truncatedLine = CTLineCreateTruncatedLine(truncationLine, rect.size.width, truncationType, truncationToken); - if (!truncatedLine) { - // If the line is not as wide as the truncationToken, truncatedLine is NULL - truncatedLine = CFRetain(truncationToken); - } - - CGFloat penOffset = (CGFloat)CTLineGetPenOffsetForFlush(truncatedLine, flushFactor, rect.size.width); - CGContextSetTextPosition(c, penOffset, lineOrigin.y - descent - self.font.descender); - - CTLineDraw(truncatedLine, c); - - NSRange linkRange; - if ([attributedTruncationString attribute:NSLinkAttributeName atIndex:0 effectiveRange:&linkRange]) { - NSRange tokenRange = [truncationString.string rangeOfString:attributedTruncationString.string]; - NSRange tokenLinkRange = NSMakeRange((NSUInteger)(lastLineRange.location+lastLineRange.length)-tokenRange.length, (NSUInteger)tokenRange.length); - - [self addLinkToURL:[attributedTruncationString attribute:NSLinkAttributeName atIndex:0 effectiveRange:&linkRange] withRange:tokenLinkRange]; - } - - CFRelease(truncatedLine); - CFRelease(truncationLine); - CFRelease(truncationToken); - } else { - CGFloat penOffset = (CGFloat)CTLineGetPenOffsetForFlush(line, flushFactor, rect.size.width); - CGContextSetTextPosition(c, penOffset, lineOrigin.y - descent - self.font.descender); - CTLineDraw(line, c); - } - } else { - CGFloat penOffset = (CGFloat)CTLineGetPenOffsetForFlush(line, flushFactor, rect.size.width); - CGContextSetTextPosition(c, penOffset, lineOrigin.y - descent - self.font.descender); - CTLineDraw(line, c); - } - } - - [self drawStrike:frame inRect:rect context:c]; - - CFRelease(frame); - CGPathRelease(path); -} - -- (void)drawBackground:(CTFrameRef)frame - inRect:(CGRect)rect - context:(CGContextRef)c -{ - NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame); - CGPoint origins[[lines count]]; - CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), origins); - - CFIndex lineIndex = 0; - for (id line in lines) { - CGFloat ascent = 0.0f, descent = 0.0f, leading = 0.0f; - CGFloat width = (CGFloat)CTLineGetTypographicBounds((__bridge CTLineRef)line, &ascent, &descent, &leading) ; - - for (id glyphRun in (__bridge NSArray *)CTLineGetGlyphRuns((__bridge CTLineRef)line)) { - NSDictionary *attributes = (__bridge NSDictionary *)CTRunGetAttributes((__bridge CTRunRef) glyphRun); - CGColorRef strokeColor = CGColorRefFromColor([attributes objectForKey:kTTTBackgroundStrokeColorAttributeName]); - CGColorRef fillColor = CGColorRefFromColor([attributes objectForKey:kTTTBackgroundFillColorAttributeName]); - UIEdgeInsets fillPadding = [[attributes objectForKey:kTTTBackgroundFillPaddingAttributeName] UIEdgeInsetsValue]; - CGFloat cornerRadius = [[attributes objectForKey:kTTTBackgroundCornerRadiusAttributeName] floatValue]; - CGFloat lineWidth = [[attributes objectForKey:kTTTBackgroundLineWidthAttributeName] floatValue]; - - if (strokeColor || fillColor) { - CGRect runBounds = CGRectZero; - CGFloat runAscent = 0.0f; - CGFloat runDescent = 0.0f; - - runBounds.size.width = (CGFloat)CTRunGetTypographicBounds((__bridge CTRunRef)glyphRun, CFRangeMake(0, 0), &runAscent, &runDescent, NULL) + fillPadding.left + fillPadding.right; - runBounds.size.height = runAscent + runDescent + fillPadding.top + fillPadding.bottom; - - CGFloat xOffset = 0.0f; - CFRange glyphRange = CTRunGetStringRange((__bridge CTRunRef)glyphRun); - switch (CTRunGetStatus((__bridge CTRunRef)glyphRun)) { - case kCTRunStatusRightToLeft: - xOffset = CTLineGetOffsetForStringIndex((__bridge CTLineRef)line, glyphRange.location + glyphRange.length, NULL); - break; - default: - xOffset = CTLineGetOffsetForStringIndex((__bridge CTLineRef)line, glyphRange.location, NULL); - break; - } - - runBounds.origin.x = origins[lineIndex].x + rect.origin.x + xOffset - fillPadding.left - rect.origin.x; - runBounds.origin.y = origins[lineIndex].y + rect.origin.y - fillPadding.bottom - rect.origin.y; - runBounds.origin.y -= runDescent; - - // Don't draw higlightedLinkBackground too far to the right - if (CGRectGetWidth(runBounds) > width) { - runBounds.size.width = width; - } - - CGPathRef path = [[UIBezierPath bezierPathWithRoundedRect:CGRectInset(UIEdgeInsetsInsetRect(runBounds, self.linkBackgroundEdgeInset), lineWidth, lineWidth) cornerRadius:cornerRadius] CGPath]; - - CGContextSetLineJoin(c, kCGLineJoinRound); - - if (fillColor) { - CGContextSetFillColorWithColor(c, fillColor); - CGContextAddPath(c, path); - CGContextFillPath(c); - } - - if (strokeColor) { - CGContextSetStrokeColorWithColor(c, strokeColor); - CGContextAddPath(c, path); - CGContextStrokePath(c); - } - } - } - - lineIndex++; - } -} - -- (void)drawStrike:(CTFrameRef)frame - inRect:(__unused CGRect)rect - context:(CGContextRef)c -{ - NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame); - CGPoint origins[[lines count]]; - CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), origins); - - CFIndex lineIndex = 0; - for (id line in lines) { - CGFloat ascent = 0.0f, descent = 0.0f, leading = 0.0f; - CGFloat width = (CGFloat)CTLineGetTypographicBounds((__bridge CTLineRef)line, &ascent, &descent, &leading) ; - - for (id glyphRun in (__bridge NSArray *)CTLineGetGlyphRuns((__bridge CTLineRef)line)) { - NSDictionary *attributes = (__bridge NSDictionary *)CTRunGetAttributes((__bridge CTRunRef) glyphRun); - BOOL strikeOut = [[attributes objectForKey:kTTTStrikeOutAttributeName] boolValue]; - NSInteger superscriptStyle = [[attributes objectForKey:(id)kCTSuperscriptAttributeName] integerValue]; - - if (strikeOut) { - CGRect runBounds = CGRectZero; - CGFloat runAscent = 0.0f; - CGFloat runDescent = 0.0f; - - runBounds.size.width = (CGFloat)CTRunGetTypographicBounds((__bridge CTRunRef)glyphRun, CFRangeMake(0, 0), &runAscent, &runDescent, NULL); - runBounds.size.height = runAscent + runDescent; - - CGFloat xOffset = 0.0f; - CFRange glyphRange = CTRunGetStringRange((__bridge CTRunRef)glyphRun); - switch (CTRunGetStatus((__bridge CTRunRef)glyphRun)) { - case kCTRunStatusRightToLeft: - xOffset = CTLineGetOffsetForStringIndex((__bridge CTLineRef)line, glyphRange.location + glyphRange.length, NULL); - break; - default: - xOffset = CTLineGetOffsetForStringIndex((__bridge CTLineRef)line, glyphRange.location, NULL); - break; - } - runBounds.origin.x = origins[lineIndex].x + xOffset; - runBounds.origin.y = origins[lineIndex].y; - runBounds.origin.y -= runDescent; - - // Don't draw strikeout too far to the right - if (CGRectGetWidth(runBounds) > width) { - runBounds.size.width = width; - } - - switch (superscriptStyle) { - case 1: - runBounds.origin.y -= runAscent * 0.47f; - break; - case -1: - runBounds.origin.y += runAscent * 0.25f; - break; - default: - break; - } - - // Use text color, or default to black - id color = [attributes objectForKey:(id)kCTForegroundColorAttributeName]; - if (color) { - CGContextSetStrokeColorWithColor(c, CGColorRefFromColor(color)); - } else { - CGContextSetGrayStrokeColor(c, 0.0f, 1.0); - } - - CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)self.font.fontName, self.font.pointSize, NULL); - CGContextSetLineWidth(c, CTFontGetUnderlineThickness(font)); - CFRelease(font); - - CGFloat y = CGFloat_round(runBounds.origin.y + runBounds.size.height / 2.0f); - CGContextMoveToPoint(c, runBounds.origin.x, y); - CGContextAddLineToPoint(c, runBounds.origin.x + runBounds.size.width, y); - - CGContextStrokePath(c); - } - } - - lineIndex++; - } -} - -#pragma mark - TTTAttributedLabel - -- (void)setText:(id)text { - NSParameterAssert(!text || [text isKindOfClass:[NSAttributedString class]] || [text isKindOfClass:[NSString class]]); - - if ([text isKindOfClass:[NSString class]]) { - [self setText:text afterInheritingLabelAttributesAndConfiguringWithBlock:nil]; - return; - } - - self.attributedText = text; - self.activeLink = nil; - - self.linkModels = [NSArray array]; - if (text && self.attributedText && self.enabledTextCheckingTypes) { - __weak __typeof(self)weakSelf = self; - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - __strong __typeof(weakSelf)strongSelf = weakSelf; - - NSDataDetector *dataDetector = strongSelf.dataDetector; - if (dataDetector && [dataDetector respondsToSelector:@selector(matchesInString:options:range:)]) { - NSArray *results = [dataDetector matchesInString:[(NSAttributedString *)text string] options:0 range:NSMakeRange(0, [(NSAttributedString *)text length])]; - if ([results count] > 0) { - dispatch_async(dispatch_get_main_queue(), ^{ - if ([[strongSelf.attributedText string] isEqualToString:[(NSAttributedString *)text string]]) { - [strongSelf addLinksWithTextCheckingResults:results attributes:strongSelf.linkAttributes]; - } - }); - } - } - }); - } - - [self.attributedText enumerateAttribute:NSLinkAttributeName inRange:NSMakeRange(0, self.attributedText.length) options:0 usingBlock:^(id value, __unused NSRange range, __unused BOOL *stop) { - if (value) { - NSURL *URL = [value isKindOfClass:[NSString class]] ? [NSURL URLWithString:value] : value; - [self addLinkToURL:URL withRange:range]; - } - }]; -} - -- (void)setText:(id)text -afterInheritingLabelAttributesAndConfiguringWithBlock:(NSMutableAttributedString * (^)(NSMutableAttributedString *mutableAttributedString))block -{ - NSMutableAttributedString *mutableAttributedString = nil; - if ([text isKindOfClass:[NSString class]]) { - mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:text attributes:NSAttributedStringAttributesFromLabel(self)]; - } else { - mutableAttributedString = [[NSMutableAttributedString alloc] initWithAttributedString:text]; - [mutableAttributedString addAttributes:NSAttributedStringAttributesFromLabel(self) range:NSMakeRange(0, [mutableAttributedString length])]; - } - - if (block) { - mutableAttributedString = block(mutableAttributedString); - } - - [self setText:mutableAttributedString]; -} - -- (void)setActiveLink:(TTTAttributedLabelLink *)activeLink { - _activeLink = activeLink; - - NSDictionary *activeAttributes = activeLink.activeAttributes ?: self.activeLinkAttributes; - - if (_activeLink && activeAttributes.count > 0) { - if (!self.inactiveAttributedText) { - self.inactiveAttributedText = [self.attributedText copy]; - } - - NSMutableAttributedString *mutableAttributedString = [self.inactiveAttributedText mutableCopy]; - if (self.activeLink.result.range.length > 0 && NSLocationInRange(NSMaxRange(self.activeLink.result.range) - 1, NSMakeRange(0, [self.inactiveAttributedText length]))) { - [mutableAttributedString addAttributes:activeAttributes range:self.activeLink.result.range]; - } - - self.attributedText = mutableAttributedString; - [self setNeedsDisplay]; - - [CATransaction flush]; - } else if (self.inactiveAttributedText) { - self.attributedText = self.inactiveAttributedText; - self.inactiveAttributedText = nil; - - [self setNeedsDisplay]; - } -} - -- (void)setLinkAttributes:(NSDictionary *)linkAttributes { - _linkAttributes = convertNSAttributedStringAttributesToCTAttributes(linkAttributes); -} - -- (void)setActiveLinkAttributes:(NSDictionary *)activeLinkAttributes { - _activeLinkAttributes = convertNSAttributedStringAttributesToCTAttributes(activeLinkAttributes); -} - -- (void)setInactiveLinkAttributes:(NSDictionary *)inactiveLinkAttributes { - _inactiveLinkAttributes = convertNSAttributedStringAttributesToCTAttributes(inactiveLinkAttributes); -} - -#pragma mark - UILabel - -- (void)setHighlighted:(BOOL)highlighted { - [super setHighlighted:highlighted]; - [self setNeedsDisplay]; -} - -// Fixes crash when loading from a UIStoryboard -- (UIColor *)textColor { - UIColor *color = [super textColor]; - if (!color) { - color = [UIColor blackColor]; - } - - return color; -} - -- (void)setTextColor:(UIColor *)textColor { - UIColor *oldTextColor = self.textColor; - [super setTextColor:textColor]; - - // Redraw to allow any ColorFromContext attributes a chance to update - if (textColor != oldTextColor) { - [self setNeedsFramesetter]; - [self setNeedsDisplay]; - } -} - -- (CGRect)textRectForBounds:(CGRect)bounds - limitedToNumberOfLines:(NSInteger)numberOfLines -{ - bounds = UIEdgeInsetsInsetRect(bounds, self.textInsets); - if (!self.attributedText) { - return [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines]; - } - - CGRect textRect = bounds; - - // Calculate height with a minimum of double the font pointSize, to ensure that CTFramesetterSuggestFrameSizeWithConstraints doesn't return CGSizeZero, as it would if textRect height is insufficient. - textRect.size.height = MAX(self.font.lineHeight * MAX(2, numberOfLines), bounds.size.height); - - // Adjust the text to be in the center vertically, if the text size is smaller than bounds - CGSize textSize = CTFramesetterSuggestFrameSizeWithConstraints([self framesetter], CFRangeMake(0, (CFIndex)[self.attributedText length]), NULL, textRect.size, NULL); - textSize = CGSizeMake(CGFloat_ceil(textSize.width), CGFloat_ceil(textSize.height)); // Fix for iOS 4, CTFramesetterSuggestFrameSizeWithConstraints sometimes returns fractional sizes - - if (textSize.height < bounds.size.height) { - CGFloat yOffset = 0.0f; - switch (self.verticalAlignment) { - case TTTAttributedLabelVerticalAlignmentCenter: - yOffset = CGFloat_floor((bounds.size.height - textSize.height) / 2.0f); - break; - case TTTAttributedLabelVerticalAlignmentBottom: - yOffset = bounds.size.height - textSize.height; - break; - case TTTAttributedLabelVerticalAlignmentTop: - default: - break; - } - - textRect.origin.y += yOffset; - } - - return textRect; -} - -- (void)drawTextInRect:(CGRect)rect { - CGRect insetRect = UIEdgeInsetsInsetRect(rect, self.textInsets); - if (!self.attributedText) { - [super drawTextInRect:insetRect]; - return; - } - - NSAttributedString *originalAttributedText = nil; - - // Adjust the font size to fit width, if necessarry - if (self.adjustsFontSizeToFitWidth && self.numberOfLines > 0) { - // Framesetter could still be working with a resized version of the text; - // need to reset so we start from the original font size. - // See #393. - [self setNeedsFramesetter]; - [self setNeedsDisplay]; - - if ([self respondsToSelector:@selector(invalidateIntrinsicContentSize)]) { - [self invalidateIntrinsicContentSize]; - } - - // Use infinite width to find the max width, which will be compared to availableWidth if needed. - CGSize maxSize = (self.numberOfLines > 1) ? CGSizeMake(TTTFLOAT_MAX, TTTFLOAT_MAX) : CGSizeZero; - - CGFloat textWidth = [self sizeThatFits:maxSize].width; - CGFloat availableWidth = self.frame.size.width * self.numberOfLines; - if (self.numberOfLines > 1 && self.lineBreakMode == TTTLineBreakByWordWrapping) { - textWidth *= kTTTLineBreakWordWrapTextWidthScalingFactor; - } - - if (textWidth > availableWidth && textWidth > 0.0f) { - originalAttributedText = [self.attributedText copy]; - - CGFloat scaleFactor = availableWidth / textWidth; - if ([self respondsToSelector:@selector(minimumScaleFactor)] && self.minimumScaleFactor > scaleFactor) { - scaleFactor = self.minimumScaleFactor; - } - - self.attributedText = NSAttributedStringByScalingFontSize(self.attributedText, scaleFactor); - } - } - - CGContextRef c = UIGraphicsGetCurrentContext(); - CGContextSaveGState(c); - { - CGContextSetTextMatrix(c, CGAffineTransformIdentity); - - // Inverts the CTM to match iOS coordinates (otherwise text draws upside-down; Mac OS's system is different) - CGContextTranslateCTM(c, 0.0f, insetRect.size.height); - CGContextScaleCTM(c, 1.0f, -1.0f); - - CFRange textRange = CFRangeMake(0, (CFIndex)[self.attributedText length]); - - // First, get the text rect (which takes vertical centering into account) - CGRect textRect = [self textRectForBounds:rect limitedToNumberOfLines:self.numberOfLines]; - - // CoreText draws its text aligned to the bottom, so we move the CTM here to take our vertical offsets into account - CGContextTranslateCTM(c, insetRect.origin.x, insetRect.size.height - textRect.origin.y - textRect.size.height); - - // Second, trace the shadow before the actual text, if we have one - if (self.shadowColor && !self.highlighted) { - CGContextSetShadowWithColor(c, self.shadowOffset, self.shadowRadius, [self.shadowColor CGColor]); - } else if (self.highlightedShadowColor) { - CGContextSetShadowWithColor(c, self.highlightedShadowOffset, self.highlightedShadowRadius, [self.highlightedShadowColor CGColor]); - } - - // Finally, draw the text or highlighted text itself (on top of the shadow, if there is one) - if (self.highlightedTextColor && self.highlighted) { - NSMutableAttributedString *highlightAttributedString = [self.renderedAttributedText mutableCopy]; - [highlightAttributedString addAttribute:(__bridge NSString *)kCTForegroundColorAttributeName value:(id)[self.highlightedTextColor CGColor] range:NSMakeRange(0, highlightAttributedString.length)]; - - if (![self highlightFramesetter]) { - CTFramesetterRef highlightFramesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)highlightAttributedString); - [self setHighlightFramesetter:highlightFramesetter]; - CFRelease(highlightFramesetter); - } - - [self drawFramesetter:[self highlightFramesetter] attributedString:highlightAttributedString textRange:textRange inRect:textRect context:c]; - } else { - [self drawFramesetter:[self framesetter] attributedString:self.renderedAttributedText textRange:textRange inRect:textRect context:c]; - } - - // If we adjusted the font size, set it back to its original size - if (originalAttributedText) { - // Use ivar directly to avoid clearing out framesetter and renderedAttributedText - _attributedText = originalAttributedText; - } - } - CGContextRestoreGState(c); -} - -#pragma mark - UIAccessibilityElement - -- (BOOL)isAccessibilityElement { - return NO; -} - -- (NSInteger)accessibilityElementCount { - return (NSInteger)[[self accessibilityElements] count]; -} - -- (id)accessibilityElementAtIndex:(NSInteger)index { - return [[self accessibilityElements] objectAtIndex:(NSUInteger)index]; -} - -- (NSInteger)indexOfAccessibilityElement:(id)element { - return (NSInteger)[[self accessibilityElements] indexOfObject:element]; -} - -- (NSArray *)accessibilityElements { - if (!_accessibilityElements) { - @synchronized(self) { - NSMutableArray *mutableAccessibilityItems = [NSMutableArray array]; - - for (TTTAttributedLabelLink *link in self.linkModels) { - - if (link.result.range.location == NSNotFound) { - continue; - } - - NSString *sourceText = [self.text isKindOfClass:[NSString class]] ? self.text : [(NSAttributedString *)self.text string]; - - NSString *accessibilityLabel = [sourceText substringWithRange:link.result.range]; - NSString *accessibilityValue = link.accessibilityValue; - - if (accessibilityLabel) { - TTTAccessibilityElement *linkElement = [[TTTAccessibilityElement alloc] initWithAccessibilityContainer:self]; - linkElement.accessibilityTraits = UIAccessibilityTraitLink; - linkElement.boundingRect = [self boundingRectForCharacterRange:link.result.range]; - linkElement.superview = self; - linkElement.accessibilityLabel = accessibilityLabel; - - if (![accessibilityLabel isEqualToString:accessibilityValue]) { - linkElement.accessibilityValue = accessibilityValue; - } - - [mutableAccessibilityItems addObject:linkElement]; - } - } - - TTTAccessibilityElement *baseElement = [[TTTAccessibilityElement alloc] initWithAccessibilityContainer:self]; - baseElement.accessibilityLabel = [super accessibilityLabel]; - baseElement.accessibilityHint = [super accessibilityHint]; - baseElement.accessibilityValue = [super accessibilityValue]; - baseElement.boundingRect = self.bounds; - baseElement.superview = self; - baseElement.accessibilityTraits = [super accessibilityTraits]; - - [mutableAccessibilityItems addObject:baseElement]; - - self.accessibilityElements = [NSArray arrayWithArray:mutableAccessibilityItems]; - } - } - - return _accessibilityElements; -} - -#pragma mark - UIView - -- (CGSize)sizeThatFits:(CGSize)size { - if (!self.attributedText) { - return [super sizeThatFits:size]; - } else { - NSMutableAttributedString *fullString = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText]; - - if (self.attributedTruncationToken) { - [fullString appendAttributedString:self.attributedTruncationToken]; - } - - NSAttributedString *string = [[NSAttributedString alloc] initWithAttributedString:fullString]; - - CGSize labelSize = CTFramesetterSuggestFrameSizeForAttributedStringWithConstraints([self framesetter], string, size, (NSUInteger)self.numberOfLines); - labelSize.width += self.textInsets.left + self.textInsets.right; - labelSize.height += self.textInsets.top + self.textInsets.bottom; - - return labelSize; - } -} - -- (CGSize)intrinsicContentSize { - // There's an implicit width from the original UILabel implementation - return [self sizeThatFits:[super intrinsicContentSize]]; -} - -- (void)tintColorDidChange { - if (!self.inactiveLinkAttributes || [self.inactiveLinkAttributes count] == 0) { - return; - } - - BOOL isInactive = (self.tintAdjustmentMode == UIViewTintAdjustmentModeDimmed); - - NSMutableAttributedString *mutableAttributedString = [self.attributedText mutableCopy]; - for (TTTAttributedLabelLink *link in self.linkModels) { - NSDictionary *attributesToRemove = isInactive ? link.attributes : link.inactiveAttributes; - NSDictionary *attributesToAdd = isInactive ? link.inactiveAttributes : link.attributes; - - [attributesToRemove enumerateKeysAndObjectsUsingBlock:^(NSString *name, __unused id value, __unused BOOL *stop) { - if (NSMaxRange(link.result.range) <= mutableAttributedString.length) { - [mutableAttributedString removeAttribute:name range:link.result.range]; - } - }]; - - if (attributesToAdd) { - if (NSMaxRange(link.result.range) <= mutableAttributedString.length) { - [mutableAttributedString addAttributes:attributesToAdd range:link.result.range]; - } - } - } - - self.attributedText = mutableAttributedString; - - [self setNeedsDisplay]; -} - -- (UIView *)hitTest:(CGPoint)point - withEvent:(UIEvent *)event -{ - if (![self linkAtPoint:point] || !self.userInteractionEnabled || self.hidden || self.alpha < 0.01) { - return [super hitTest:point withEvent:event]; - } - - return self; -} - -#pragma mark - UIResponder - -- (BOOL)canBecomeFirstResponder { - return YES; -} - -- (BOOL)canPerformAction:(SEL)action - withSender:(__unused id)sender -{ -#if !TARGET_OS_TV - return (action == @selector(copy:)); -#else - return NO; -#endif -} - -- (void)touchesBegan:(NSSet *)touches - withEvent:(UIEvent *)event -{ - UITouch *touch = [touches anyObject]; - - self.activeLink = [self linkAtPoint:[touch locationInView:self]]; - - if (!self.activeLink) { - [super touchesBegan:touches withEvent:event]; - } -} - -- (void)touchesMoved:(NSSet *)touches - withEvent:(UIEvent *)event -{ - if (self.activeLink) { - UITouch *touch = [touches anyObject]; - - if (self.activeLink != [self linkAtPoint:[touch locationInView:self]]) { - self.activeLink = nil; - } - } else { - [super touchesMoved:touches withEvent:event]; - } -} - -- (void)touchesEnded:(NSSet *)touches - withEvent:(UIEvent *)event -{ - if (self.activeLink) { - if (self.activeLink.linkTapBlock) { - self.activeLink.linkTapBlock(self, self.activeLink); - self.activeLink = nil; - return; - } - - NSTextCheckingResult *result = self.activeLink.result; - self.activeLink = nil; - - switch (result.resultType) { - case NSTextCheckingTypeLink: - if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithURL:)]) { - [self.delegate attributedLabel:self didSelectLinkWithURL:result.URL]; - return; - } - break; - case NSTextCheckingTypeAddress: - if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithAddress:)]) { - [self.delegate attributedLabel:self didSelectLinkWithAddress:result.addressComponents]; - return; - } - break; - case NSTextCheckingTypePhoneNumber: - if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithPhoneNumber:)]) { - [self.delegate attributedLabel:self didSelectLinkWithPhoneNumber:result.phoneNumber]; - return; - } - break; - case NSTextCheckingTypeDate: - if (result.timeZone && [self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithDate:timeZone:duration:)]) { - [self.delegate attributedLabel:self didSelectLinkWithDate:result.date timeZone:result.timeZone duration:result.duration]; - return; - } else if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithDate:)]) { - [self.delegate attributedLabel:self didSelectLinkWithDate:result.date]; - return; - } - break; - case NSTextCheckingTypeTransitInformation: - if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithTransitInformation:)]) { - [self.delegate attributedLabel:self didSelectLinkWithTransitInformation:result.components]; - return; - } - default: - break; - } - - // Fallback to `attributedLabel:didSelectLinkWithTextCheckingResult:` if no other delegate method matched. - if ([self.delegate respondsToSelector:@selector(attributedLabel:didSelectLinkWithTextCheckingResult:)]) { - [self.delegate attributedLabel:self didSelectLinkWithTextCheckingResult:result]; - } - } else { - [super touchesEnded:touches withEvent:event]; - } -} - -- (void)touchesCancelled:(NSSet *)touches - withEvent:(UIEvent *)event -{ - if (self.activeLink) { - self.activeLink = nil; - } else { - [super touchesCancelled:touches withEvent:event]; - } -} - -#pragma mark - UIGestureRecognizerDelegate - -- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { - return [self containslinkAtPoint:[touch locationInView:self]]; -} - -#pragma mark - UILongPressGestureRecognizer - -- (void)longPressGestureDidFire:(UILongPressGestureRecognizer *)sender { - switch (sender.state) { - case UIGestureRecognizerStateBegan: { - CGPoint touchPoint = [sender locationInView:self]; - TTTAttributedLabelLink *link = [self linkAtPoint:touchPoint]; - - if (link) { - if (link.linkLongPressBlock) { - link.linkLongPressBlock(self, link); - return; - } - - NSTextCheckingResult *result = link.result; - - if (!result) { - return; - } - - switch (result.resultType) { - case NSTextCheckingTypeLink: - if ([self.delegate respondsToSelector:@selector(attributedLabel:didLongPressLinkWithURL:atPoint:)]) { - [self.delegate attributedLabel:self didLongPressLinkWithURL:result.URL atPoint:touchPoint]; - return; - } - break; - case NSTextCheckingTypeAddress: - if ([self.delegate respondsToSelector:@selector(attributedLabel:didLongPressLinkWithAddress:atPoint:)]) { - [self.delegate attributedLabel:self didLongPressLinkWithAddress:result.addressComponents atPoint:touchPoint]; - return; - } - break; - case NSTextCheckingTypePhoneNumber: - if ([self.delegate respondsToSelector:@selector(attributedLabel:didLongPressLinkWithPhoneNumber:atPoint:)]) { - [self.delegate attributedLabel:self didLongPressLinkWithPhoneNumber:result.phoneNumber atPoint:touchPoint]; - return; - } - break; - case NSTextCheckingTypeDate: - if (result.timeZone && [self.delegate respondsToSelector:@selector(attributedLabel:didLongPressLinkWithDate:timeZone:duration:atPoint:)]) { - [self.delegate attributedLabel:self didLongPressLinkWithDate:result.date timeZone:result.timeZone duration:result.duration atPoint:touchPoint]; - return; - } else if ([self.delegate respondsToSelector:@selector(attributedLabel:didLongPressLinkWithDate:atPoint:)]) { - [self.delegate attributedLabel:self didLongPressLinkWithDate:result.date atPoint:touchPoint]; - return; - } - break; - case NSTextCheckingTypeTransitInformation: - if ([self.delegate respondsToSelector:@selector(attributedLabel:didLongPressLinkWithTransitInformation:atPoint:)]) { - [self.delegate attributedLabel:self didLongPressLinkWithTransitInformation:result.components atPoint:touchPoint]; - return; - } - default: - break; - } - - // Fallback to `attributedLabel:didLongPressLinkWithTextCheckingResult:atPoint:` if no other delegate method matched. - if ([self.delegate respondsToSelector:@selector(attributedLabel:didLongPressLinkWithTextCheckingResult:atPoint:)]) { - [self.delegate attributedLabel:self didLongPressLinkWithTextCheckingResult:result atPoint:touchPoint]; - } - } - break; - } - default: - break; - } -} - -#if !TARGET_OS_TV -#pragma mark - UIResponderStandardEditActions - -- (void)copy:(__unused id)sender { - [[UIPasteboard generalPasteboard] setString:self.text]; -} -#endif - -#pragma mark - NSCoding - -- (void)encodeWithCoder:(NSCoder *)coder { - [super encodeWithCoder:coder]; - - [coder encodeObject:@(self.enabledTextCheckingTypes) forKey:NSStringFromSelector(@selector(enabledTextCheckingTypes))]; - - [coder encodeObject:self.linkModels forKey:NSStringFromSelector(@selector(linkModels))]; - if ([NSMutableParagraphStyle class]) { - [coder encodeObject:self.linkAttributes forKey:NSStringFromSelector(@selector(linkAttributes))]; - [coder encodeObject:self.activeLinkAttributes forKey:NSStringFromSelector(@selector(activeLinkAttributes))]; - [coder encodeObject:self.inactiveLinkAttributes forKey:NSStringFromSelector(@selector(inactiveLinkAttributes))]; - } - [coder encodeObject:@(self.shadowRadius) forKey:NSStringFromSelector(@selector(shadowRadius))]; - [coder encodeObject:@(self.highlightedShadowRadius) forKey:NSStringFromSelector(@selector(highlightedShadowRadius))]; - [coder encodeCGSize:self.highlightedShadowOffset forKey:NSStringFromSelector(@selector(highlightedShadowOffset))]; - [coder encodeObject:self.highlightedShadowColor forKey:NSStringFromSelector(@selector(highlightedShadowColor))]; - [coder encodeObject:@(self.kern) forKey:NSStringFromSelector(@selector(kern))]; - [coder encodeObject:@(self.firstLineIndent) forKey:NSStringFromSelector(@selector(firstLineIndent))]; - [coder encodeObject:@(self.lineSpacing) forKey:NSStringFromSelector(@selector(lineSpacing))]; - [coder encodeObject:@(self.lineHeightMultiple) forKey:NSStringFromSelector(@selector(lineHeightMultiple))]; - [coder encodeUIEdgeInsets:self.textInsets forKey:NSStringFromSelector(@selector(textInsets))]; - [coder encodeInteger:self.verticalAlignment forKey:NSStringFromSelector(@selector(verticalAlignment))]; - - [coder encodeObject:self.attributedTruncationToken forKey:NSStringFromSelector(@selector(attributedTruncationToken))]; - - [coder encodeObject:NSStringFromUIEdgeInsets(self.linkBackgroundEdgeInset) forKey:NSStringFromSelector(@selector(linkBackgroundEdgeInset))]; - [coder encodeObject:self.attributedText forKey:NSStringFromSelector(@selector(attributedText))]; - [coder encodeObject:self.text forKey:NSStringFromSelector(@selector(text))]; -} - -- (id)initWithCoder:(NSCoder *)coder { - self = [super initWithCoder:coder]; - if (!self) { - return nil; - } - - [self commonInit]; - - if ([coder containsValueForKey:NSStringFromSelector(@selector(enabledTextCheckingTypes))]) { - self.enabledTextCheckingTypes = [[coder decodeObjectForKey:NSStringFromSelector(@selector(enabledTextCheckingTypes))] unsignedLongLongValue]; - } - - if ([NSMutableParagraphStyle class]) { - if ([coder containsValueForKey:NSStringFromSelector(@selector(linkAttributes))]) { - self.linkAttributes = [coder decodeObjectForKey:NSStringFromSelector(@selector(linkAttributes))]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(activeLinkAttributes))]) { - self.activeLinkAttributes = [coder decodeObjectForKey:NSStringFromSelector(@selector(activeLinkAttributes))]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(inactiveLinkAttributes))]) { - self.inactiveLinkAttributes = [coder decodeObjectForKey:NSStringFromSelector(@selector(inactiveLinkAttributes))]; - } - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(links))]) { - NSArray *oldLinks = [coder decodeObjectForKey:NSStringFromSelector(@selector(links))]; - [self addLinksWithTextCheckingResults:oldLinks attributes:nil]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(linkModels))]) { - self.linkModels = [coder decodeObjectForKey:NSStringFromSelector(@selector(linkModels))]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(shadowRadius))]) { - self.shadowRadius = [[coder decodeObjectForKey:NSStringFromSelector(@selector(shadowRadius))] floatValue]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(highlightedShadowRadius))]) { - self.highlightedShadowRadius = [[coder decodeObjectForKey:NSStringFromSelector(@selector(highlightedShadowRadius))] floatValue]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(highlightedShadowOffset))]) { - self.highlightedShadowOffset = [coder decodeCGSizeForKey:NSStringFromSelector(@selector(highlightedShadowOffset))]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(highlightedShadowColor))]) { - self.highlightedShadowColor = [coder decodeObjectForKey:NSStringFromSelector(@selector(highlightedShadowColor))]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(kern))]) { - self.kern = [[coder decodeObjectForKey:NSStringFromSelector(@selector(kern))] floatValue]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(firstLineIndent))]) { - self.firstLineIndent = [[coder decodeObjectForKey:NSStringFromSelector(@selector(firstLineIndent))] floatValue]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(lineSpacing))]) { - self.lineSpacing = [[coder decodeObjectForKey:NSStringFromSelector(@selector(lineSpacing))] floatValue]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(minimumLineHeight))]) { - self.minimumLineHeight = [[coder decodeObjectForKey:NSStringFromSelector(@selector(minimumLineHeight))] floatValue]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(maximumLineHeight))]) { - self.maximumLineHeight = [[coder decodeObjectForKey:NSStringFromSelector(@selector(maximumLineHeight))] floatValue]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(lineHeightMultiple))]) { - self.lineHeightMultiple = [[coder decodeObjectForKey:NSStringFromSelector(@selector(lineHeightMultiple))] floatValue]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(textInsets))]) { - self.textInsets = [coder decodeUIEdgeInsetsForKey:NSStringFromSelector(@selector(textInsets))]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(verticalAlignment))]) { - self.verticalAlignment = [coder decodeIntegerForKey:NSStringFromSelector(@selector(verticalAlignment))]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(attributedTruncationToken))]) { - self.attributedTruncationToken = [coder decodeObjectForKey:NSStringFromSelector(@selector(attributedTruncationToken))]; - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(linkBackgroundEdgeInset))]) { - self.linkBackgroundEdgeInset = UIEdgeInsetsFromString([coder decodeObjectForKey:NSStringFromSelector(@selector(linkBackgroundEdgeInset))]); - } - - if ([coder containsValueForKey:NSStringFromSelector(@selector(attributedText))]) { - self.attributedText = [coder decodeObjectForKey:NSStringFromSelector(@selector(attributedText))]; - } else { - self.text = super.text; - } - - return self; -} - -@end - -#pragma mark - TTTAttributedLabelLink - -@implementation TTTAttributedLabelLink - -- (instancetype)initWithAttributes:(NSDictionary *)attributes - activeAttributes:(NSDictionary *)activeAttributes - inactiveAttributes:(NSDictionary *)inactiveAttributes - textCheckingResult:(NSTextCheckingResult *)result { - - if ((self = [super init])) { - _result = result; - _attributes = [attributes copy]; - _activeAttributes = [activeAttributes copy]; - _inactiveAttributes = [inactiveAttributes copy]; - } - - return self; -} - -- (instancetype)initWithAttributesFromLabel:(TTTAttributedLabel*)label - textCheckingResult:(NSTextCheckingResult *)result { - - return [self initWithAttributes:label.linkAttributes - activeAttributes:label.activeLinkAttributes - inactiveAttributes:label.inactiveLinkAttributes - textCheckingResult:result]; -} - -#pragma mark - Accessibility - -- (NSString *) accessibilityValue { - if ([_accessibilityValue length] == 0) { - switch (self.result.resultType) { - case NSTextCheckingTypeLink: - _accessibilityValue = self.result.URL.absoluteString; - break; - case NSTextCheckingTypePhoneNumber: - _accessibilityValue = self.result.phoneNumber; - break; - case NSTextCheckingTypeDate: - _accessibilityValue = [NSDateFormatter localizedStringFromDate:self.result.date - dateStyle:NSDateFormatterLongStyle - timeStyle:NSDateFormatterLongStyle]; - break; - default: - break; - } - } - - return _accessibilityValue; -} - -#pragma mark - NSCoding - -- (void)encodeWithCoder:(NSCoder *)aCoder { - [aCoder encodeObject:self.result forKey:NSStringFromSelector(@selector(result))]; - [aCoder encodeObject:self.attributes forKey:NSStringFromSelector(@selector(attributes))]; - [aCoder encodeObject:self.activeAttributes forKey:NSStringFromSelector(@selector(activeAttributes))]; - [aCoder encodeObject:self.inactiveAttributes forKey:NSStringFromSelector(@selector(inactiveAttributes))]; - [aCoder encodeObject:self.accessibilityValue forKey:NSStringFromSelector(@selector(accessibilityValue))]; -} - -- (id)initWithCoder:(NSCoder *)aDecoder { - if ((self = [super init])) { - _result = [aDecoder decodeObjectForKey:NSStringFromSelector(@selector(result))]; - _attributes = [aDecoder decodeObjectForKey:NSStringFromSelector(@selector(attributes))]; - _activeAttributes = [aDecoder decodeObjectForKey:NSStringFromSelector(@selector(activeAttributes))]; - _inactiveAttributes = [aDecoder decodeObjectForKey:NSStringFromSelector(@selector(inactiveAttributes))]; - self.accessibilityValue = [aDecoder decodeObjectForKey:NSStringFromSelector(@selector(accessibilityValue))]; - } - - return self; -} - -@end - -#pragma mark - - -static inline CGColorRef CGColorRefFromColor(id color) { - return [color isKindOfClass:[UIColor class]] ? [color CGColor] : (__bridge CGColorRef)color; -} - -static inline CTFontRef CTFontRefFromUIFont(UIFont * font) { - CTFontRef ctfont = CTFontCreateWithName((__bridge CFStringRef)font.fontName, font.pointSize, NULL); - return CFAutorelease(ctfont); -} - -static inline NSDictionary * convertNSAttributedStringAttributesToCTAttributes(NSDictionary *attributes) { - if (!attributes) return nil; - - NSMutableDictionary *mutableAttributes = [NSMutableDictionary dictionary]; - - NSDictionary *NSToCTAttributeNamesMap = @{ - NSFontAttributeName: (NSString *)kCTFontAttributeName, - NSBackgroundColorAttributeName: (NSString *)kTTTBackgroundFillColorAttributeName, - NSForegroundColorAttributeName: (NSString *)kCTForegroundColorAttributeName, - NSUnderlineColorAttributeName: (NSString *)kCTUnderlineColorAttributeName, - NSUnderlineStyleAttributeName: (NSString *)kCTUnderlineStyleAttributeName, - NSStrokeWidthAttributeName: (NSString *)kCTStrokeWidthAttributeName, - NSStrokeColorAttributeName: (NSString *)kCTStrokeWidthAttributeName, - NSKernAttributeName: (NSString *)kCTKernAttributeName, - NSLigatureAttributeName: (NSString *)kCTLigatureAttributeName - }; - - [attributes enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { - key = [NSToCTAttributeNamesMap objectForKey:key] ? : key; - - if (![NSMutableParagraphStyle class]) { - if ([value isKindOfClass:[UIFont class]]) { - value = (__bridge id)CTFontRefFromUIFont(value); - } else if ([value isKindOfClass:[UIColor class]]) { - value = (__bridge id)((UIColor *)value).CGColor; - } - } - - [mutableAttributes setObject:value forKey:key]; - }]; - - return [NSDictionary dictionaryWithDictionary:mutableAttributes]; -} diff --git a/Pods/Target Support Files/Bolts/Bolts-dummy.m b/Pods/Target Support Files/Bolts/Bolts-dummy.m deleted file mode 100644 index aeabf61a7..000000000 --- a/Pods/Target Support Files/Bolts/Bolts-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Bolts : NSObject -@end -@implementation PodsDummy_Bolts -@end diff --git a/Pods/Target Support Files/Bolts/Bolts-prefix.pch b/Pods/Target Support Files/Bolts/Bolts-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/Bolts/Bolts-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/Bolts/Bolts.xcconfig b/Pods/Target Support Files/Bolts/Bolts.xcconfig deleted file mode 100644 index b64951709..000000000 --- a/Pods/Target Support Files/Bolts/Bolts.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Bolts -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Bolts" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/Bolts -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-dummy.m b/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-dummy.m deleted file mode 100644 index eb4f9dff8..000000000 --- a/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_FBSDKCoreKit : NSObject -@end -@implementation PodsDummy_FBSDKCoreKit -@end diff --git a/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch b/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit.xcconfig b/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit.xcconfig deleted file mode 100644 index d77b3f289..000000000 --- a/Pods/Target Support Files/FBSDKCoreKit/FBSDKCoreKit.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Bolts" -OTHER_LDFLAGS = -weak_framework "Accounts" -weak_framework "AudioToolbox" -weak_framework "CoreGraphics" -weak_framework "CoreLocation" -weak_framework "Foundation" -weak_framework "QuartzCore" -weak_framework "Security" -weak_framework "Social" -weak_framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/FBSDKCoreKit -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FBSDKLoginKit/FBSDKLoginKit-dummy.m b/Pods/Target Support Files/FBSDKLoginKit/FBSDKLoginKit-dummy.m deleted file mode 100644 index ff16b395f..000000000 --- a/Pods/Target Support Files/FBSDKLoginKit/FBSDKLoginKit-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_FBSDKLoginKit : NSObject -@end -@implementation PodsDummy_FBSDKLoginKit -@end diff --git a/Pods/Target Support Files/FBSDKLoginKit/FBSDKLoginKit-prefix.pch b/Pods/Target Support Files/FBSDKLoginKit/FBSDKLoginKit-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/FBSDKLoginKit/FBSDKLoginKit-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/FBSDKLoginKit/FBSDKLoginKit.xcconfig b/Pods/Target Support Files/FBSDKLoginKit/FBSDKLoginKit.xcconfig deleted file mode 100644 index e7d1f00e7..000000000 --- a/Pods/Target Support Files/FBSDKLoginKit/FBSDKLoginKit.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FBSDKLoginKit -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Bolts" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit" -OTHER_LDFLAGS = -weak_framework "Accounts" -weak_framework "AudioToolbox" -weak_framework "CoreGraphics" -weak_framework "CoreLocation" -weak_framework "Foundation" -weak_framework "QuartzCore" -weak_framework "Security" -weak_framework "Social" -weak_framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/FBSDKLoginKit -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-dummy.m b/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-dummy.m deleted file mode 100644 index 8f7024923..000000000 --- a/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_FBSDKShareKit : NSObject -@end -@implementation PodsDummy_FBSDKShareKit -@end diff --git a/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch b/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit.xcconfig b/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit.xcconfig deleted file mode 100644 index 7e641084d..000000000 --- a/Pods/Target Support Files/FBSDKShareKit/FBSDKShareKit.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FBSDKShareKit -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBSDKShareKit" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Bolts" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit" -OTHER_LDFLAGS = -weak_framework "Accounts" -weak_framework "AudioToolbox" -weak_framework "CoreGraphics" -weak_framework "CoreLocation" -weak_framework "Foundation" -weak_framework "QuartzCore" -weak_framework "Security" -weak_framework "Social" -weak_framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/FBSDKShareKit -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FFCircularProgressView/FFCircularProgressView-dummy.m b/Pods/Target Support Files/FFCircularProgressView/FFCircularProgressView-dummy.m deleted file mode 100644 index 08f4b66b5..000000000 --- a/Pods/Target Support Files/FFCircularProgressView/FFCircularProgressView-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_FFCircularProgressView : NSObject -@end -@implementation PodsDummy_FFCircularProgressView -@end diff --git a/Pods/Target Support Files/FFCircularProgressView/FFCircularProgressView-prefix.pch b/Pods/Target Support Files/FFCircularProgressView/FFCircularProgressView-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/FFCircularProgressView/FFCircularProgressView-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/FFCircularProgressView/FFCircularProgressView.xcconfig b/Pods/Target Support Files/FFCircularProgressView/FFCircularProgressView.xcconfig deleted file mode 100644 index 0d62fb59f..000000000 --- a/Pods/Target Support Files/FFCircularProgressView/FFCircularProgressView.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FFCircularProgressView -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FFCircularProgressView" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = -framework "CoreGraphics" -framework "QuartzCore" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/FFCircularProgressView -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m b/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m deleted file mode 100644 index 343e6b017..000000000 --- a/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_FLAnimatedImage : NSObject -@end -@implementation PodsDummy_FLAnimatedImage -@end diff --git a/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch b/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig b/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig deleted file mode 100644 index 973285809..000000000 --- a/Pods/Target Support Files/FLAnimatedImage/FLAnimatedImage.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FLAnimatedImage" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = -framework "CoreGraphics" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/FLAnimatedImage -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FirebaseUI/ResourceBundle-FirebaseAuthUI-Info.plist b/Pods/Target Support Files/FirebaseUI/ResourceBundle-FirebaseAuthUI-Info.plist deleted file mode 100644 index 5ce5c56d4..000000000 --- a/Pods/Target Support Files/FirebaseUI/ResourceBundle-FirebaseAuthUI-Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 4.5.1 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/FirebaseUI/ResourceBundle-FirebasePhoneAuthUI-Info.plist b/Pods/Target Support Files/FirebaseUI/ResourceBundle-FirebasePhoneAuthUI-Info.plist deleted file mode 100644 index 5ce5c56d4..000000000 --- a/Pods/Target Support Files/FirebaseUI/ResourceBundle-FirebasePhoneAuthUI-Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 4.5.1 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK-dummy.m b/Pods/Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK-dummy.m deleted file mode 100644 index 49a63b9aa..000000000 --- a/Pods/Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Flurry_iOS_SDK : NSObject -@end -@implementation PodsDummy_Flurry_iOS_SDK -@end diff --git a/Pods/Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK-prefix.pch b/Pods/Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK.xcconfig b/Pods/Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK.xcconfig deleted file mode 100644 index d6167986e..000000000 --- a/Pods/Target Support Files/Flurry-iOS-SDK/Flurry-iOS-SDK.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Flurry-iOS-SDK/Flurry" -OTHER_LDFLAGS = -l"Flurry_8.3.1" -framework "Foundation" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "WatchConnectivity" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/Flurry-iOS-SDK -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m deleted file mode 100644 index 13d68b3fc..000000000 --- a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_GTMSessionFetcher : NSObject -@end -@implementation PodsDummy_GTMSessionFetcher -@end diff --git a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.xcconfig b/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.xcconfig deleted file mode 100644 index 12d447211..000000000 --- a/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = -framework "Security" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/GTMSessionFetcher -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-dummy.m b/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-dummy.m deleted file mode 100644 index 9e35ec0f8..000000000 --- a/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_GoogleToolboxForMac : NSObject -@end -@implementation PodsDummy_GoogleToolboxForMac -@end diff --git a/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-prefix.pch b/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac.xcconfig b/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac.xcconfig deleted file mode 100644 index b46c0f8c9..000000000 --- a/Pods/Target Support Files/GoogleToolboxForMac/GoogleToolboxForMac.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleToolboxForMac -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = -l"z" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleToolboxForMac -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/NYTPhotoViewer/NYTPhotoViewer-dummy.m b/Pods/Target Support Files/NYTPhotoViewer/NYTPhotoViewer-dummy.m deleted file mode 100644 index 0c8de428c..000000000 --- a/Pods/Target Support Files/NYTPhotoViewer/NYTPhotoViewer-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_NYTPhotoViewer : NSObject -@end -@implementation PodsDummy_NYTPhotoViewer -@end diff --git a/Pods/Target Support Files/NYTPhotoViewer/NYTPhotoViewer-prefix.pch b/Pods/Target Support Files/NYTPhotoViewer/NYTPhotoViewer-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/NYTPhotoViewer/NYTPhotoViewer-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/NYTPhotoViewer/NYTPhotoViewer.xcconfig b/Pods/Target Support Files/NYTPhotoViewer/NYTPhotoViewer.xcconfig deleted file mode 100644 index b6aa59ddd..000000000 --- a/Pods/Target Support Files/NYTPhotoViewer/NYTPhotoViewer.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/NYTPhotoViewer -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 ANIMATED_GIF_SUPPORT=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" -OTHER_LDFLAGS = -framework "Foundation" -framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/NYTPhotoViewer -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/NYTPhotoViewer/ResourceBundle-NYTPhotoViewer-Info.plist b/Pods/Target Support Files/NYTPhotoViewer/ResourceBundle-NYTPhotoViewer-Info.plist deleted file mode 100644 index 16a4ec9e5..000000000 --- a/Pods/Target Support Files/NYTPhotoViewer/ResourceBundle-NYTPhotoViewer-Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 2.0.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-acknowledgements.markdown b/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-acknowledgements.markdown deleted file mode 100644 index 735fee9aa..000000000 --- a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-acknowledgements.markdown +++ /dev/null @@ -1,1028 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## Bolts - -BSD License - -For Bolts software - -Copyright (c) 2013-present, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## Crashlytics - -Fabric: Copyright 2017 Google, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. Crashlytics Kit: Copyright 2017 Crashlytics, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Crashlytics Terms of Service located at http://try.crashlytics.com/terms/terms-of-service.pdf and the Crashlytics Privacy Policy located at http://try.crashlytics.com/terms/privacy-policy.pdf. OSS: http://get.fabric.io/terms/opensource.txt - -## FBSDKCoreKit - -Copyright (c) 2014-present, Facebook, Inc. All rights reserved. - -You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -copy, modify, and distribute this software in source code or binary form for use -in connection with the web services and APIs provided by Facebook. - -As with any software that integrates with the Facebook platform, your use of -this software is subject to the Facebook Developer Principles and Policies -[http://developers.facebook.com/policy/]. This copyright 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. - - -## FBSDKLoginKit - -Copyright (c) 2014-present, Facebook, Inc. All rights reserved. - -You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -copy, modify, and distribute this software in source code or binary form for use -in connection with the web services and APIs provided by Facebook. - -As with any software that integrates with the Facebook platform, your use of -this software is subject to the Facebook Developer Principles and Policies -[http://developers.facebook.com/policy/]. This copyright 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. - - -## FBSDKShareKit - -Copyright (c) 2014-present, Facebook, Inc. All rights reserved. - -You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -copy, modify, and distribute this software in source code or binary form for use -in connection with the web services and APIs provided by Facebook. - -As with any software that integrates with the Facebook platform, your use of -this software is subject to the Facebook Developer Principles and Policies -[http://developers.facebook.com/policy/]. This copyright 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. - - -## FFCircularProgressView - -Copyright (c) 2013 Fabiano Francesconi - -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. - -## FLAnimatedImage - -The MIT License (MIT) - -Copyright (c) 2014-2016 Flipboard - -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. - - -## Fabric - -Fabric: Copyright 2017 Google, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. OSS: http://get.fabric.io/terms/opensource.txt - -## Firebase - -Copyright 2018 Google - -## FirebaseAnalytics - -Copyright 2018 Google - -## FirebaseAuth - -Copyright 2018 Google - -## FirebaseCore - -Copyright 2018 Google - -## FirebaseInstanceID - -Copyright 2017 Google - -## FirebaseUI - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -## Flurry-iOS-SDK - -Developer's use of the SDK is governed by the license in the applicable Flurry Terms of Service. Some components of the SDK are governed by open source software licenses. In the event of any conflict between the license in the applicable Flurry Terms of Service and the applicable open source license, the terms of the open source license shall prevail with respect to those components. - - -## GTMSessionFetcher - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -## GoogleToolboxForMac - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -## NYTPhotoViewer - -Copyright (c) 2015-2017 The New York Times Company - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this library except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - - -## QMCVDevelopment - -Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## QMServicesDevelopment - -Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## Reachability - -Copyright (c) 2011, Tony Million. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -## SAMKeychain - -Copyright (c) 2010-2016 Sam Soffes, http://soff.es - -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. - - -## SDWebImage - -Copyright (c) 2009-2017 Olivier Poitrey rs@dailymotion.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - -## TTTAttributedLabel - -Copyright (c) 2011 Mattt Thompson (http://mattt.me/) - -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. - - -## UIDevice-Hardware - -Copyright (c) 2013, Erica Sadun -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of the FreeBSD Project. - -## libextobjc - -**Copyright (c) 2012 - 2014 Justin Spahr-Summers** - -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. - - -## nanopb - -Copyright (c) 2011 Petteri Aimonen - -This software is provided 'as-is', without any express or -implied warranty. In no event will the authors be held liable -for any damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you - must not claim that you wrote the original software. If you use - this software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and - must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source - distribution. - -Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-acknowledgements.plist b/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-acknowledgements.plist deleted file mode 100644 index 211f565e0..000000000 --- a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-acknowledgements.plist +++ /dev/null @@ -1,1216 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - BSD License - -For Bolts software - -Copyright (c) 2013-present, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - License - BSD - Title - Bolts - Type - PSGroupSpecifier - - - FooterText - Fabric: Copyright 2017 Google, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. Crashlytics Kit: Copyright 2017 Crashlytics, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Crashlytics Terms of Service located at http://try.crashlytics.com/terms/terms-of-service.pdf and the Crashlytics Privacy Policy located at http://try.crashlytics.com/terms/privacy-policy.pdf. OSS: http://get.fabric.io/terms/opensource.txt - License - Commercial - Title - Crashlytics - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2014-present, Facebook, Inc. All rights reserved. - -You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -copy, modify, and distribute this software in source code or binary form for use -in connection with the web services and APIs provided by Facebook. - -As with any software that integrates with the Facebook platform, your use of -this software is subject to the Facebook Developer Principles and Policies -[http://developers.facebook.com/policy/]. This copyright notice shall be -included in all copies or substantial portions of the software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - License - Facebook Platform License - Title - FBSDKCoreKit - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2014-present, Facebook, Inc. All rights reserved. - -You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -copy, modify, and distribute this software in source code or binary form for use -in connection with the web services and APIs provided by Facebook. - -As with any software that integrates with the Facebook platform, your use of -this software is subject to the Facebook Developer Principles and Policies -[http://developers.facebook.com/policy/]. This copyright notice shall be -included in all copies or substantial portions of the software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - License - Facebook Platform License - Title - FBSDKLoginKit - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2014-present, Facebook, Inc. All rights reserved. - -You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -copy, modify, and distribute this software in source code or binary form for use -in connection with the web services and APIs provided by Facebook. - -As with any software that integrates with the Facebook platform, your use of -this software is subject to the Facebook Developer Principles and Policies -[http://developers.facebook.com/policy/]. This copyright notice shall be -included in all copies or substantial portions of the software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - License - Facebook Platform License - Title - FBSDKShareKit - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2013 Fabiano Francesconi - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - License - MIT - Title - FFCircularProgressView - Type - PSGroupSpecifier - - - FooterText - The MIT License (MIT) - -Copyright (c) 2014-2016 Flipboard - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - License - MIT - Title - FLAnimatedImage - Type - PSGroupSpecifier - - - FooterText - Fabric: Copyright 2017 Google, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. OSS: http://get.fabric.io/terms/opensource.txt - License - Commercial - Title - Fabric - Type - PSGroupSpecifier - - - FooterText - Copyright 2018 Google - License - Copyright - Title - Firebase - Type - PSGroupSpecifier - - - FooterText - Copyright 2018 Google - License - Copyright - Title - FirebaseAnalytics - Type - PSGroupSpecifier - - - FooterText - Copyright 2018 Google - License - Copyright - Title - FirebaseAuth - Type - PSGroupSpecifier - - - FooterText - Copyright 2018 Google - License - Copyright - Title - FirebaseCore - Type - PSGroupSpecifier - - - FooterText - Copyright 2017 Google - License - Copyright - Title - FirebaseInstanceID - Type - PSGroupSpecifier - - - FooterText - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - License - Apache 2.0 - Title - FirebaseUI - Type - PSGroupSpecifier - - - FooterText - Developer's use of the SDK is governed by the license in the applicable Flurry Terms of Service. Some components of the SDK are governed by open source software licenses. In the event of any conflict between the license in the applicable Flurry Terms of Service and the applicable open source license, the terms of the open source license shall prevail with respect to those components. - - License - Commercial - Title - Flurry-iOS-SDK - Type - PSGroupSpecifier - - - FooterText - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - License - Apache - Title - GTMSessionFetcher - Type - PSGroupSpecifier - - - FooterText - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - License - Apache - Title - GoogleToolboxForMac - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2015-2017 The New York Times Company - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this library except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - - License - Apache 2.0 - Title - NYTPhotoViewer - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - License - BSD - Title - QMCVDevelopment - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - License - BSD - Title - QMServicesDevelopment - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2011, Tony Million. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - License - BSD - Title - Reachability - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2010-2016 Sam Soffes, http://soff.es - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - License - MIT - Title - SAMKeychain - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2009-2017 Olivier Poitrey rs@dailymotion.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - License - MIT - Title - SDWebImage - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2011 Mattt Thompson (http://mattt.me/) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - License - MIT - Title - TTTAttributedLabel - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2013, Erica Sadun -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of the FreeBSD Project. - License - BSD - Title - UIDevice-Hardware - Type - PSGroupSpecifier - - - FooterText - **Copyright (c) 2012 - 2014 Justin Spahr-Summers** - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - License - MIT - Title - libextobjc - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2011 Petteri Aimonen <jpa at nanopb.mail.kapsi.fi> - -This software is provided 'as-is', without any express or -implied warranty. In no event will the authors be held liable -for any damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you - must not claim that you wrote the original software. If you use - this software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and - must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source - distribution. - - License - zlib - Title - nanopb - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-dummy.m b/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-dummy.m deleted file mode 100644 index 6f02a66cb..000000000 --- a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_Q_municate : NSObject -@end -@implementation PodsDummy_Pods_Q_municate -@end diff --git a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-frameworks.sh b/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-frameworks.sh deleted file mode 100755 index 881cbaed3..000000000 --- a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-frameworks.sh +++ /dev/null @@ -1,137 +0,0 @@ -#!/bin/sh -set -e - -echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" - -# Used as a return value for each invocation of `strip_invalid_archs` function. -STRIP_BINARY_RETVAL=0 - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -# Copies and strips a vendored framework -install_framework() -{ - if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then - local source="${BUILT_PRODUCTS_DIR}/$1" - elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then - local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" - elif [ -r "$1" ]; then - local source="$1" - fi - - local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - - if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" - fi - - # Use filter instead of exclude so missing patterns don't throw errors. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" - - local basename - basename="$(basename -s .framework "$1")" - binary="${destination}/${basename}.framework/${basename}" - if ! [ -r "$binary" ]; then - binary="${destination}/${basename}" - fi - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then - strip_invalid_archs "$binary" - fi - - # Resign the code if required by the build settings to avoid unstable apps - code_sign_if_enabled "${destination}/$(basename "$1")" - - # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. - if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then - local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) - for lib in $swift_runtime_libs; do - echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" - rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" - code_sign_if_enabled "${destination}/${lib}" - done - fi -} - -# Copies and strips a vendored dSYM -install_dsym() { - local source="$1" - if [ -r "$source" ]; then - # Copy the dSYM into a the targets temp dir. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" - - local basename - basename="$(basename -s .framework.dSYM "$source")" - binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then - strip_invalid_archs "$binary" - fi - - if [[ $STRIP_BINARY_RETVAL == 1 ]]; then - # Move the stripped file into its final destination. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" - else - # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. - touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" - fi - fi -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identitiy - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} - -# Strip invalid architectures -strip_invalid_archs() { - binary="$1" - # Get architectures for current target binary - binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" - # Intersect them with the architectures we are building for - intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" - # If there are no archs supported by this binary then warn the user - if [[ -z "$intersected_archs" ]]; then - echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." - STRIP_BINARY_RETVAL=0 - return - fi - stripped="" - for arch in $binary_archs; do - if ! [[ "${ARCHS}" == *"$arch"* ]]; then - # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" || exit 1 - stripped="$stripped $arch" - fi - done - if [[ "$stripped" ]]; then - echo "Stripped $binary of architectures:$stripped" - fi - STRIP_BINARY_RETVAL=1 -} - -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-resources.sh b/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-resources.sh deleted file mode 100755 index 08a7ee78d..000000000 --- a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-resources.sh +++ /dev/null @@ -1,132 +0,0 @@ -#!/bin/sh -set -e - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} -if [[ "$CONFIGURATION" == "Debug" ]]; then - install_resource "${PODS_ROOT}/FBSDKCoreKit/FacebookSDKStrings.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseUI/FirebaseAuthUI.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseUI/FirebasePhoneAuthUI.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/NYTPhotoViewer/NYTPhotoViewer.bundle" - install_resource "${PODS_ROOT}/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment/QMChatViewController.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMChatCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMContactListCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMUsersCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMOpenGraphCacheModel.bundle" - install_resource "${PODS_ROOT}/SAMKeychain/Support/SAMKeychain.bundle" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_resource "${PODS_ROOT}/FBSDKCoreKit/FacebookSDKStrings.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseUI/FirebaseAuthUI.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseUI/FirebasePhoneAuthUI.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/NYTPhotoViewer/NYTPhotoViewer.bundle" - install_resource "${PODS_ROOT}/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment/QMChatViewController.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMChatCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMContactListCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMUsersCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMOpenGraphCacheModel.bundle" - install_resource "${PODS_ROOT}/SAMKeychain/Support/SAMKeychain.bundle" -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${BUILD_DIR}/assetcatalog_generated_info.plist" -fi diff --git a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate.debug.xcconfig b/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate.debug.xcconfig deleted file mode 100644 index 60ca31610..000000000 --- a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate.debug.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/../../Framework $(PODS_ROOT)/../External "${PODS_ROOT}/Crashlytics/iOS" "${PODS_ROOT}/Fabric/iOS" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/FirebaseAuth/Frameworks" "${PODS_ROOT}/FirebaseCore/Frameworks" "${PODS_ROOT}/FirebaseInstanceID/Frameworks" "${PODS_ROOT}/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks" "${PODS_ROOT}/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 ANIMATED_GIF_SUPPORT=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 -HEADER_SEARCH_PATHS = $(inherited) ${PODS_ROOT}/Firebase/Core/Sources /usr/include/libxml2 $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Bolts" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKLoginKit" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKShareKit" "${PODS_CONFIGURATION_BUILD_DIR}/FFCircularProgressView" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleToolboxForMac" "${PODS_CONFIGURATION_BUILD_DIR}/NYTPhotoViewer" "${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment" "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SAMKeychain" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel" "${PODS_CONFIGURATION_BUILD_DIR}/UIDevice-Hardware" "${PODS_CONFIGURATION_BUILD_DIR}/libextobjc" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/Flurry-iOS-SDK/Flurry" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Bolts" -isystem "${PODS_ROOT}/Headers/Public/Crashlytics" -isystem "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKShareKit" -isystem "${PODS_ROOT}/Headers/Public/FFCircularProgressView" -isystem "${PODS_ROOT}/Headers/Public/FLAnimatedImage" -isystem "${PODS_ROOT}/Headers/Public/Fabric" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseCore" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseUI" -isystem "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" -isystem "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" -isystem "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" -isystem "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" -isystem "${PODS_ROOT}/Headers/Public/QMCVDevelopment" -isystem "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" -isystem "${PODS_ROOT}/Headers/Public/Reachability" -isystem "${PODS_ROOT}/Headers/Public/SAMKeychain" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/SVProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" -isystem "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" -isystem "${PODS_ROOT}/Headers/Public/libextobjc" -isystem "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Bolts" -l"FBSDKCoreKit" -l"FBSDKLoginKit" -l"FBSDKShareKit" -l"FFCircularProgressView" -l"FLAnimatedImage" -l"Flurry-iOS-SDK" -l"Flurry_8.3.1" -l"GTMSessionFetcher" -l"GoogleToolboxForMac" -l"NYTPhotoViewer" -l"QMCVDevelopment" -l"QMServicesDevelopment" -l"Reachability" -l"SAMKeychain" -l"SDWebImage" -l"TTTAttributedLabel" -l"UIDevice-Hardware" -l"c++" -l"libextobjc" -l"nanopb" -l"resolv" -l"sqlite3" -l"stdc++" -l"xml2" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreData" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreText" -framework "CoreVideo" -framework "Crashlytics" -framework "Fabric" -framework "FirebaseAnalytics" -framework "FirebaseAuth" -framework "FirebaseAuthUI" -framework "FirebaseCore" -framework "FirebaseCoreDiagnostics" -framework "FirebaseInstanceID" -framework "FirebaseNanoPB" -framework "FirebasePhoneAuthUI" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "SafariServices" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "Accounts" -weak_framework "AudioToolbox" -weak_framework "CoreGraphics" -weak_framework "CoreLocation" -weak_framework "Foundation" -weak_framework "QuartzCore" -weak_framework "Security" -weak_framework "Social" -weak_framework "UIKit" -weak_framework "WatchConnectivity" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate.release.xcconfig b/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate.release.xcconfig deleted file mode 100644 index 60ca31610..000000000 --- a/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate.release.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/../../Framework $(PODS_ROOT)/../External "${PODS_ROOT}/Crashlytics/iOS" "${PODS_ROOT}/Fabric/iOS" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/FirebaseAuth/Frameworks" "${PODS_ROOT}/FirebaseCore/Frameworks" "${PODS_ROOT}/FirebaseInstanceID/Frameworks" "${PODS_ROOT}/FirebaseUI/FirebaseUIFrameworks/FirebaseAuthUI/Frameworks" "${PODS_ROOT}/FirebaseUI/FirebaseUIFrameworks/FirebasePhoneAuthUI/Frameworks" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 ANIMATED_GIF_SUPPORT=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 -HEADER_SEARCH_PATHS = $(inherited) ${PODS_ROOT}/Firebase/Core/Sources /usr/include/libxml2 $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Bolts" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKLoginKit" "${PODS_CONFIGURATION_BUILD_DIR}/FBSDKShareKit" "${PODS_CONFIGURATION_BUILD_DIR}/FFCircularProgressView" "${PODS_CONFIGURATION_BUILD_DIR}/FLAnimatedImage" "${PODS_CONFIGURATION_BUILD_DIR}/Flurry-iOS-SDK" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleToolboxForMac" "${PODS_CONFIGURATION_BUILD_DIR}/NYTPhotoViewer" "${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment" "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SAMKeychain" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel" "${PODS_CONFIGURATION_BUILD_DIR}/UIDevice-Hardware" "${PODS_CONFIGURATION_BUILD_DIR}/libextobjc" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_ROOT}/Flurry-iOS-SDK/Flurry" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Bolts" -isystem "${PODS_ROOT}/Headers/Public/Crashlytics" -isystem "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKShareKit" -isystem "${PODS_ROOT}/Headers/Public/FFCircularProgressView" -isystem "${PODS_ROOT}/Headers/Public/FLAnimatedImage" -isystem "${PODS_ROOT}/Headers/Public/Fabric" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseCore" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseUI" -isystem "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" -isystem "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" -isystem "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" -isystem "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" -isystem "${PODS_ROOT}/Headers/Public/QMCVDevelopment" -isystem "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" -isystem "${PODS_ROOT}/Headers/Public/Reachability" -isystem "${PODS_ROOT}/Headers/Public/SAMKeychain" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/SVProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" -isystem "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" -isystem "${PODS_ROOT}/Headers/Public/libextobjc" -isystem "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Bolts" -l"FBSDKCoreKit" -l"FBSDKLoginKit" -l"FBSDKShareKit" -l"FFCircularProgressView" -l"FLAnimatedImage" -l"Flurry-iOS-SDK" -l"Flurry_8.3.1" -l"GTMSessionFetcher" -l"GoogleToolboxForMac" -l"NYTPhotoViewer" -l"QMCVDevelopment" -l"QMServicesDevelopment" -l"Reachability" -l"SAMKeychain" -l"SDWebImage" -l"TTTAttributedLabel" -l"UIDevice-Hardware" -l"c++" -l"libextobjc" -l"nanopb" -l"resolv" -l"sqlite3" -l"stdc++" -l"xml2" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreData" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreText" -framework "CoreVideo" -framework "Crashlytics" -framework "Fabric" -framework "FirebaseAnalytics" -framework "FirebaseAuth" -framework "FirebaseAuthUI" -framework "FirebaseCore" -framework "FirebaseCoreDiagnostics" -framework "FirebaseInstanceID" -framework "FirebaseNanoPB" -framework "FirebasePhoneAuthUI" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "SafariServices" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "Accounts" -weak_framework "AudioToolbox" -weak_framework "CoreGraphics" -weak_framework "CoreLocation" -weak_framework "Foundation" -weak_framework "QuartzCore" -weak_framework "Security" -weak_framework "Social" -weak_framework "UIKit" -weak_framework "WatchConnectivity" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-acknowledgements.markdown b/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-acknowledgements.markdown deleted file mode 100644 index 1fa71a1fb..000000000 --- a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-acknowledgements.markdown +++ /dev/null @@ -1,186 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## Bolts - -BSD License - -For Bolts software - -Copyright (c) 2013-present, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## FFCircularProgressView - -Copyright (c) 2013 Fabiano Francesconi - -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. - -## QMCVDevelopment - -Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## QMServicesDevelopment - -Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## Reachability - -Copyright (c) 2011, Tony Million. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -## SDWebImage - -Copyright (c) 2009-2017 Olivier Poitrey rs@dailymotion.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - -## TTTAttributedLabel - -Copyright (c) 2011 Mattt Thompson (http://mattt.me/) - -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. - - -## SVProgressHUD - -Copyright (c) 2011-2017 Sam Vermette, Tobias Tiemerding and contributors. - -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. - -A different license may apply to other resources included in this package, including Freepik Icons. Please consult their respective headers for the terms of their individual licenses. - -Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-acknowledgements.plist b/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-acknowledgements.plist deleted file mode 100644 index bea3cdbea..000000000 --- a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-acknowledgements.plist +++ /dev/null @@ -1,260 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - BSD License - -For Bolts software - -Copyright (c) 2013-present, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - License - BSD - Title - Bolts - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2013 Fabiano Francesconi - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - License - MIT - Title - FFCircularProgressView - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - License - BSD - Title - QMCVDevelopment - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - License - BSD - Title - QMServicesDevelopment - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2011, Tony Million. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - License - BSD - Title - Reachability - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2009-2017 Olivier Poitrey rs@dailymotion.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - - License - MIT - Title - SDWebImage - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2011 Mattt Thompson (http://mattt.me/) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - License - MIT - Title - TTTAttributedLabel - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2011-2017 Sam Vermette, Tobias Tiemerding and contributors. - -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. - -A different license may apply to other resources included in this package, including Freepik Icons. Please consult their respective headers for the terms of their individual licenses. - - License - MIT - Title - SVProgressHUD - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-dummy.m b/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-dummy.m deleted file mode 100644 index 713c40dbf..000000000 --- a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_QMShareExtension : NSObject -@end -@implementation PodsDummy_Pods_QMShareExtension -@end diff --git a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-resources.sh b/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-resources.sh deleted file mode 100755 index b3ecce8b6..000000000 --- a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-resources.sh +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/sh -set -e - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} -if [[ "$CONFIGURATION" == "Debug" ]]; then - install_resource "${PODS_ROOT}/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment/QMChatViewController.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMChatCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMContactListCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMUsersCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMOpenGraphCacheModel.bundle" - install_resource "${PODS_ROOT}/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_resource "${PODS_ROOT}/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment/QMChatViewController.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMChatCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMContactListCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMUsersCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMOpenGraphCacheModel.bundle" - install_resource "${PODS_ROOT}/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle" -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi diff --git a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension.debug.xcconfig b/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension.debug.xcconfig deleted file mode 100644 index 90782dc76..000000000 --- a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension.debug.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/../../Framework $(PODS_ROOT)/../External -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = /usr/include/libxml2 $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Bolts" "${PODS_CONFIGURATION_BUILD_DIR}/FFCircularProgressView" "${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment" "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Bolts" -isystem "${PODS_ROOT}/Headers/Public/Crashlytics" -isystem "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKShareKit" -isystem "${PODS_ROOT}/Headers/Public/FFCircularProgressView" -isystem "${PODS_ROOT}/Headers/Public/FLAnimatedImage" -isystem "${PODS_ROOT}/Headers/Public/Fabric" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseCore" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseUI" -isystem "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" -isystem "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" -isystem "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" -isystem "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" -isystem "${PODS_ROOT}/Headers/Public/QMCVDevelopment" -isystem "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" -isystem "${PODS_ROOT}/Headers/Public/Reachability" -isystem "${PODS_ROOT}/Headers/Public/SAMKeychain" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/SVProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" -isystem "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" -isystem "${PODS_ROOT}/Headers/Public/libextobjc" -isystem "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Bolts" -l"FFCircularProgressView" -l"QMCVDevelopment" -l"QMServicesDevelopment" -l"Reachability" -l"SDWebImage" -l"SVProgressHUD" -l"TTTAttributedLabel" -l"resolv" -l"stdc++" -l"xml2" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreData" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreText" -framework "CoreVideo" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "SystemConfiguration" -framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension.release.xcconfig b/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension.release.xcconfig deleted file mode 100644 index 90782dc76..000000000 --- a/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension.release.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/../../Framework $(PODS_ROOT)/../External -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = /usr/include/libxml2 $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Bolts" "${PODS_CONFIGURATION_BUILD_DIR}/FFCircularProgressView" "${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment" "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment" "${PODS_CONFIGURATION_BUILD_DIR}/Reachability" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Bolts" -isystem "${PODS_ROOT}/Headers/Public/Crashlytics" -isystem "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKShareKit" -isystem "${PODS_ROOT}/Headers/Public/FFCircularProgressView" -isystem "${PODS_ROOT}/Headers/Public/FLAnimatedImage" -isystem "${PODS_ROOT}/Headers/Public/Fabric" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseCore" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseUI" -isystem "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" -isystem "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" -isystem "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" -isystem "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" -isystem "${PODS_ROOT}/Headers/Public/QMCVDevelopment" -isystem "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" -isystem "${PODS_ROOT}/Headers/Public/Reachability" -isystem "${PODS_ROOT}/Headers/Public/SAMKeychain" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/SVProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" -isystem "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" -isystem "${PODS_ROOT}/Headers/Public/libextobjc" -isystem "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Bolts" -l"FFCircularProgressView" -l"QMCVDevelopment" -l"QMServicesDevelopment" -l"Reachability" -l"SDWebImage" -l"SVProgressHUD" -l"TTTAttributedLabel" -l"resolv" -l"stdc++" -l"xml2" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreData" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreText" -framework "CoreVideo" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "SystemConfiguration" -framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-acknowledgements.markdown b/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-acknowledgements.markdown deleted file mode 100644 index d91acc3cc..000000000 --- a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-acknowledgements.markdown +++ /dev/null @@ -1,63 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## Bolts - -BSD License - -For Bolts software - -Copyright (c) 2013-present, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## QMServicesDevelopment - -Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-acknowledgements.plist b/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-acknowledgements.plist deleted file mode 100644 index f46152b70..000000000 --- a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-acknowledgements.plist +++ /dev/null @@ -1,101 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - BSD License - -For Bolts software - -Copyright (c) 2013-present, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - License - BSD - Title - Bolts - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2016, QuickBlox -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the QuickBlox nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - License - BSD - Title - QMServicesDevelopment - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-dummy.m b/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-dummy.m deleted file mode 100644 index d401b92ef..000000000 --- a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_QMSiriExtension : NSObject -@end -@implementation PodsDummy_Pods_QMSiriExtension -@end diff --git a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-resources.sh b/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-resources.sh deleted file mode 100755 index c60a04010..000000000 --- a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-resources.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/sh -set -e - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} -if [[ "$CONFIGURATION" == "Debug" ]]; then - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMChatCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMContactListCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMUsersCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMOpenGraphCacheModel.bundle" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMChatCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMContactListCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMUsersCacheModel.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMOpenGraphCacheModel.bundle" -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi diff --git a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension.debug.xcconfig b/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension.debug.xcconfig deleted file mode 100644 index 4af6fa1e1..000000000 --- a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension.debug.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/../../Framework $(PODS_ROOT)/../External -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = /usr/include/libxml2 $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Bolts" "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Bolts" -isystem "${PODS_ROOT}/Headers/Public/Crashlytics" -isystem "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKShareKit" -isystem "${PODS_ROOT}/Headers/Public/FFCircularProgressView" -isystem "${PODS_ROOT}/Headers/Public/FLAnimatedImage" -isystem "${PODS_ROOT}/Headers/Public/Fabric" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseCore" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseUI" -isystem "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" -isystem "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" -isystem "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" -isystem "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" -isystem "${PODS_ROOT}/Headers/Public/QMCVDevelopment" -isystem "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" -isystem "${PODS_ROOT}/Headers/Public/Reachability" -isystem "${PODS_ROOT}/Headers/Public/SAMKeychain" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/SVProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" -isystem "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" -isystem "${PODS_ROOT}/Headers/Public/libextobjc" -isystem "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Bolts" -l"QMServicesDevelopment" -l"resolv" -l"stdc++" -l"xml2" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreData" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreVideo" -framework "MobileCoreServices" -framework "SystemConfiguration" -framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension.release.xcconfig b/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension.release.xcconfig deleted file mode 100644 index 4af6fa1e1..000000000 --- a/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension.release.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/../../Framework $(PODS_ROOT)/../External -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = /usr/include/libxml2 $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Bolts" "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Bolts" -isystem "${PODS_ROOT}/Headers/Public/Crashlytics" -isystem "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" -isystem "${PODS_ROOT}/Headers/Public/FBSDKShareKit" -isystem "${PODS_ROOT}/Headers/Public/FFCircularProgressView" -isystem "${PODS_ROOT}/Headers/Public/FLAnimatedImage" -isystem "${PODS_ROOT}/Headers/Public/Fabric" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseCore" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/FirebaseUI" -isystem "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" -isystem "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" -isystem "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" -isystem "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" -isystem "${PODS_ROOT}/Headers/Public/QMCVDevelopment" -isystem "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" -isystem "${PODS_ROOT}/Headers/Public/Reachability" -isystem "${PODS_ROOT}/Headers/Public/SAMKeychain" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/SVProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" -isystem "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" -isystem "${PODS_ROOT}/Headers/Public/libextobjc" -isystem "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Bolts" -l"QMServicesDevelopment" -l"resolv" -l"stdc++" -l"xml2" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreData" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreVideo" -framework "MobileCoreServices" -framework "SystemConfiguration" -framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/QMCVDevelopment/QMCVDevelopment-dummy.m b/Pods/Target Support Files/QMCVDevelopment/QMCVDevelopment-dummy.m deleted file mode 100644 index 983e1d635..000000000 --- a/Pods/Target Support Files/QMCVDevelopment/QMCVDevelopment-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_QMCVDevelopment : NSObject -@end -@implementation PodsDummy_QMCVDevelopment -@end diff --git a/Pods/Target Support Files/QMCVDevelopment/QMCVDevelopment-prefix.pch b/Pods/Target Support Files/QMCVDevelopment/QMCVDevelopment-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/QMCVDevelopment/QMCVDevelopment-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/QMCVDevelopment/QMCVDevelopment.xcconfig b/Pods/Target Support Files/QMCVDevelopment/QMCVDevelopment.xcconfig deleted file mode 100644 index 2aae7cef3..000000000 --- a/Pods/Target Support Files/QMCVDevelopment/QMCVDevelopment.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/../../Framework $(PODS_ROOT)/../External -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/QMCVDevelopment" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FFCircularProgressView" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/QMCVDevelopment -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/QMCVDevelopment/ResourceBundle-QMChatViewController-Info.plist b/Pods/Target Support Files/QMCVDevelopment/ResourceBundle-QMChatViewController-Info.plist deleted file mode 100644 index 7b2b09883..000000000 --- a/Pods/Target Support Files/QMCVDevelopment/ResourceBundle-QMChatViewController-Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 0.6.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/QMServicesDevelopment/QMServicesDevelopment-dummy.m b/Pods/Target Support Files/QMServicesDevelopment/QMServicesDevelopment-dummy.m deleted file mode 100644 index 056e6348f..000000000 --- a/Pods/Target Support Files/QMServicesDevelopment/QMServicesDevelopment-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_QMServicesDevelopment : NSObject -@end -@implementation PodsDummy_QMServicesDevelopment -@end diff --git a/Pods/Target Support Files/QMServicesDevelopment/QMServicesDevelopment-prefix.pch b/Pods/Target Support Files/QMServicesDevelopment/QMServicesDevelopment-prefix.pch deleted file mode 100644 index ae94b5666..000000000 --- a/Pods/Target Support Files/QMServicesDevelopment/QMServicesDevelopment-prefix.pch +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - -#import -#import -#import -#import diff --git a/Pods/Target Support Files/QMServicesDevelopment/QMServicesDevelopment.xcconfig b/Pods/Target Support Files/QMServicesDevelopment/QMServicesDevelopment.xcconfig deleted file mode 100644 index d9cb3df3d..000000000 --- a/Pods/Target Support Files/QMServicesDevelopment/QMServicesDevelopment.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/../../Framework $(PODS_ROOT)/../External -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" /usr/include/libxml2 -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Bolts" -OTHER_LDFLAGS = -l"resolv" -l"stdc++" -l"xml2" -l"z" -framework "AVFoundation" -framework "Accelerate" -framework "AudioToolbox" -framework "CFNetwork" -framework "CoreData" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreMedia" -framework "CoreVideo" -framework "MobileCoreServices" -framework "SystemConfiguration" -framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/QMServicesDevelopment -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMChatCacheModel-Info.plist b/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMChatCacheModel-Info.plist deleted file mode 100644 index 090498ac0..000000000 --- a/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMChatCacheModel-Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 0.6.1 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMContactListCacheModel-Info.plist b/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMContactListCacheModel-Info.plist deleted file mode 100644 index 090498ac0..000000000 --- a/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMContactListCacheModel-Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 0.6.1 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMOpenGraphCacheModel-Info.plist b/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMOpenGraphCacheModel-Info.plist deleted file mode 100644 index 090498ac0..000000000 --- a/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMOpenGraphCacheModel-Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 0.6.1 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMUsersCacheModel-Info.plist b/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMUsersCacheModel-Info.plist deleted file mode 100644 index 090498ac0..000000000 --- a/Pods/Target Support Files/QMServicesDevelopment/ResourceBundle-QMUsersCacheModel-Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 0.6.1 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/Reachability/Reachability-dummy.m b/Pods/Target Support Files/Reachability/Reachability-dummy.m deleted file mode 100644 index 119024a8e..000000000 --- a/Pods/Target Support Files/Reachability/Reachability-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Reachability : NSObject -@end -@implementation PodsDummy_Reachability -@end diff --git a/Pods/Target Support Files/Reachability/Reachability-prefix.pch b/Pods/Target Support Files/Reachability/Reachability-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/Reachability/Reachability-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/Reachability/Reachability.xcconfig b/Pods/Target Support Files/Reachability/Reachability.xcconfig deleted file mode 100644 index 2a20f0e3b..000000000 --- a/Pods/Target Support Files/Reachability/Reachability.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Reachability -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Reachability" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = -framework "SystemConfiguration" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/Reachability -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/SAMKeychain/SAMKeychain-dummy.m b/Pods/Target Support Files/SAMKeychain/SAMKeychain-dummy.m deleted file mode 100644 index 7bb8fc3f9..000000000 --- a/Pods/Target Support Files/SAMKeychain/SAMKeychain-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_SAMKeychain : NSObject -@end -@implementation PodsDummy_SAMKeychain -@end diff --git a/Pods/Target Support Files/SAMKeychain/SAMKeychain-prefix.pch b/Pods/Target Support Files/SAMKeychain/SAMKeychain-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/SAMKeychain/SAMKeychain-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/SAMKeychain/SAMKeychain.xcconfig b/Pods/Target Support Files/SAMKeychain/SAMKeychain.xcconfig deleted file mode 100644 index f2f825989..000000000 --- a/Pods/Target Support Files/SAMKeychain/SAMKeychain.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SAMKeychain -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SAMKeychain" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = -framework "Foundation" -framework "Security" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/SAMKeychain -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m b/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m deleted file mode 100644 index 86d2b5f68..000000000 --- a/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_SDWebImage : NSObject -@end -@implementation PodsDummy_SDWebImage -@end diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch b/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig b/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig deleted file mode 100644 index 40ac620d1..000000000 --- a/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SDWebImage" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = -framework "ImageIO" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/SDWebImage -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-dummy.m b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-dummy.m deleted file mode 100644 index 696032a70..000000000 --- a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_SVProgressHUD : NSObject -@end -@implementation PodsDummy_SVProgressHUD -@end diff --git a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.xcconfig b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.xcconfig deleted file mode 100644 index 92ab28110..000000000 --- a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SVProgressHUD" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = -framework "QuartzCore" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/SVProgressHUD -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/TTTAttributedLabel/TTTAttributedLabel-dummy.m b/Pods/Target Support Files/TTTAttributedLabel/TTTAttributedLabel-dummy.m deleted file mode 100644 index 7e82a9936..000000000 --- a/Pods/Target Support Files/TTTAttributedLabel/TTTAttributedLabel-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_TTTAttributedLabel : NSObject -@end -@implementation PodsDummy_TTTAttributedLabel -@end diff --git a/Pods/Target Support Files/TTTAttributedLabel/TTTAttributedLabel-prefix.pch b/Pods/Target Support Files/TTTAttributedLabel/TTTAttributedLabel-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/TTTAttributedLabel/TTTAttributedLabel-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/TTTAttributedLabel/TTTAttributedLabel.xcconfig b/Pods/Target Support Files/TTTAttributedLabel/TTTAttributedLabel.xcconfig deleted file mode 100644 index 5f9141d7e..000000000 --- a/Pods/Target Support Files/TTTAttributedLabel/TTTAttributedLabel.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -OTHER_LDFLAGS = -framework "CoreGraphics" -framework "CoreText" -framework "QuartzCore" -framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/TTTAttributedLabel -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/UIDevice-Hardware/UIDevice-Hardware-dummy.m b/Pods/Target Support Files/UIDevice-Hardware/UIDevice-Hardware-dummy.m deleted file mode 100644 index 58f43089a..000000000 --- a/Pods/Target Support Files/UIDevice-Hardware/UIDevice-Hardware-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_UIDevice_Hardware : NSObject -@end -@implementation PodsDummy_UIDevice_Hardware -@end diff --git a/Pods/Target Support Files/UIDevice-Hardware/UIDevice-Hardware-prefix.pch b/Pods/Target Support Files/UIDevice-Hardware/UIDevice-Hardware-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/UIDevice-Hardware/UIDevice-Hardware-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/UIDevice-Hardware/UIDevice-Hardware.xcconfig b/Pods/Target Support Files/UIDevice-Hardware/UIDevice-Hardware.xcconfig deleted file mode 100644 index 724b77584..000000000 --- a/Pods/Target Support Files/UIDevice-Hardware/UIDevice-Hardware.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/UIDevice-Hardware -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/UIDevice-Hardware -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/libextobjc/libextobjc-dummy.m b/Pods/Target Support Files/libextobjc/libextobjc-dummy.m deleted file mode 100644 index 03e5cedc2..000000000 --- a/Pods/Target Support Files/libextobjc/libextobjc-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_libextobjc : NSObject -@end -@implementation PodsDummy_libextobjc -@end diff --git a/Pods/Target Support Files/libextobjc/libextobjc-prefix.pch b/Pods/Target Support Files/libextobjc/libextobjc-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/libextobjc/libextobjc-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/libextobjc/libextobjc.xcconfig b/Pods/Target Support Files/libextobjc/libextobjc.xcconfig deleted file mode 100644 index c4b387f6e..000000000 --- a/Pods/Target Support Files/libextobjc/libextobjc.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/libextobjc -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/libextobjc" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/libextobjc -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/nanopb/nanopb-dummy.m b/Pods/Target Support Files/nanopb/nanopb-dummy.m deleted file mode 100644 index b3fa5956e..000000000 --- a/Pods/Target Support Files/nanopb/nanopb-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_nanopb : NSObject -@end -@implementation PodsDummy_nanopb -@end diff --git a/Pods/Target Support Files/nanopb/nanopb-prefix.pch b/Pods/Target Support Files/nanopb/nanopb-prefix.pch deleted file mode 100644 index beb2a2441..000000000 --- a/Pods/Target Support Files/nanopb/nanopb-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/nanopb/nanopb.xcconfig b/Pods/Target Support Files/nanopb/nanopb.xcconfig deleted file mode 100644 index 1a60bc475..000000000 --- a/Pods/Target Support Files/nanopb/nanopb.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/nanopb -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/nanopb" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Bolts" "${PODS_ROOT}/Headers/Public/Crashlytics" "${PODS_ROOT}/Headers/Public/FBSDKCoreKit" "${PODS_ROOT}/Headers/Public/FBSDKLoginKit" "${PODS_ROOT}/Headers/Public/FBSDKShareKit" "${PODS_ROOT}/Headers/Public/FFCircularProgressView" "${PODS_ROOT}/Headers/Public/FLAnimatedImage" "${PODS_ROOT}/Headers/Public/Fabric" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/FirebaseUI" "${PODS_ROOT}/Headers/Public/Flurry-iOS-SDK" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/NYTPhotoViewer" "${PODS_ROOT}/Headers/Public/QMCVDevelopment" "${PODS_ROOT}/Headers/Public/QMServicesDevelopment" "${PODS_ROOT}/Headers/Public/Reachability" "${PODS_ROOT}/Headers/Public/SAMKeychain" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/TTTAttributedLabel" "${PODS_ROOT}/Headers/Public/UIDevice-Hardware" "${PODS_ROOT}/Headers/Public/libextobjc" "${PODS_ROOT}/Headers/Public/nanopb" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/nanopb -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/UIDevice-Hardware/LICENSE b/Pods/UIDevice-Hardware/LICENSE deleted file mode 100644 index 10aad6f57..000000000 --- a/Pods/UIDevice-Hardware/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2013, Erica Sadun -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those -of the authors and should not be interpreted as representing official policies, -either expressed or implied, of the FreeBSD Project. \ No newline at end of file diff --git a/Pods/UIDevice-Hardware/UIDevice-Hardware.h b/Pods/UIDevice-Hardware/UIDevice-Hardware.h deleted file mode 100644 index c57a870de..000000000 --- a/Pods/UIDevice-Hardware/UIDevice-Hardware.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - Erica Sadun, http://ericasadun.com - iPhone Developer's Cookbook, 6.x Edition - BSD License, Use at your own risk - - Modified by Eric Horacek for Monospace Ltd. on 2/4/13 - */ - -#import - -typedef NS_ENUM(NSUInteger, UIDeviceFamily) { - UIDeviceFamilyiPhone, - UIDeviceFamilyiPod, - UIDeviceFamilyiPad, - UIDeviceFamilyAppleTV, - UIDeviceFamilyUnknown, -}; - -@interface UIDevice (Hardware) - -/** - Returns a machine-readable model name in the format of "iPhone4,1" - */ -- (NSString *)modelIdentifier; - -/** - Returns a human-readable model name in the format of "iPhone 4S". Fallback of the the `modelIdentifier` value. - */ -- (NSString *)modelName; - -/** - Returns the device family as a `UIDeviceFamily` - */ -- (UIDeviceFamily)deviceFamily; - -@end diff --git a/Pods/UIDevice-Hardware/UIDevice-Hardware.m b/Pods/UIDevice-Hardware/UIDevice-Hardware.m deleted file mode 100644 index b46777ed9..000000000 --- a/Pods/UIDevice-Hardware/UIDevice-Hardware.m +++ /dev/null @@ -1,160 +0,0 @@ -/* - Erica Sadun, http://ericasadun.com - iPhone Developer's Cookbook, 6.x Edition - BSD License, Use at your own risk - - Modified by Eric Horacek for Monospace Ltd. on 2/4/13 - */ - -#include -#import "UIDevice-Hardware.h" - -@interface UIDevice (Hardward) - -- (NSString *)modelNameForModelIdentifier:(NSString *)modelIdentifier; - -@end - -@implementation UIDevice (Hardware) - -- (NSString *)getSysInfoByName:(char *)typeSpecifier -{ - size_t size; - sysctlbyname(typeSpecifier, NULL, &size, NULL, 0); - - char *answer = malloc(size); - sysctlbyname(typeSpecifier, answer, &size, NULL, 0); - - NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding]; - - free(answer); - return results; -} - -- (NSString *)modelIdentifier -{ - return [self getSysInfoByName:"hw.machine"]; -} - -- (NSString *)modelName -{ - return [self modelNameForModelIdentifier:[self modelIdentifier]]; -} - -- (NSString *)modelNameForModelIdentifier:(NSString *)modelIdentifier -{ - // iPhone http://theiphonewiki.com/wiki/IPhone - - if ([modelIdentifier isEqualToString:@"iPhone1,1"]) return @"iPhone 1G"; - if ([modelIdentifier isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; - if ([modelIdentifier isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS"; - if ([modelIdentifier isEqualToString:@"iPhone3,1"]) return @"iPhone 4 (GSM)"; - if ([modelIdentifier isEqualToString:@"iPhone3,2"]) return @"iPhone 4 (GSM Rev A)"; - if ([modelIdentifier isEqualToString:@"iPhone3,3"]) return @"iPhone 4 (CDMA)"; - if ([modelIdentifier isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; - if ([modelIdentifier isEqualToString:@"iPhone5,1"]) return @"iPhone 5 (GSM)"; - if ([modelIdentifier isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (Global)"; - if ([modelIdentifier isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (GSM)"; - if ([modelIdentifier isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (Global)"; - if ([modelIdentifier isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (GSM)"; - if ([modelIdentifier isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (Global)"; - if ([modelIdentifier isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus"; - if ([modelIdentifier isEqualToString:@"iPhone7,2"]) return @"iPhone 6"; - if ([modelIdentifier isEqualToString:@"iPhone8,1"]) return @"iPhone 6s"; - if ([modelIdentifier isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus"; - if ([modelIdentifier isEqualToString:@"iPhone8,4"]) return @"iPhone SE"; - if ([modelIdentifier isEqualToString:@"iPhone9,1"]) return @"iPhone 7"; - if ([modelIdentifier isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus"; - if ([modelIdentifier isEqualToString:@"iPhone9,3"]) return @"iPhone 7"; - if ([modelIdentifier isEqualToString:@"iPhone9,4"]) return @"iPhone 7 Plus"; - if ([modelIdentifier isEqualToString:@"iPhone10,1"]) return @"iPhone 8"; // US (Verizon), China, Japan - if ([modelIdentifier isEqualToString:@"iPhone10,2"]) return @"iPhone 8 Plus"; // US (Verizon), China, Japan - if ([modelIdentifier isEqualToString:@"iPhone10,3"]) return @"iPhone X"; // US (Verizon), China, Japan - if ([modelIdentifier isEqualToString:@"iPhone10,4"]) return @"iPhone 8"; // AT&T, Global - if ([modelIdentifier isEqualToString:@"iPhone10,5"]) return @"iPhone 8 Plus"; // AT&T, Global - if ([modelIdentifier isEqualToString:@"iPhone10,6"]) return @"iPhone X"; // AT&T, Global - - // iPad http://theiphonewiki.com/wiki/IPad - - if ([modelIdentifier isEqualToString:@"iPad1,1"]) return @"iPad 1G"; - if ([modelIdentifier isEqualToString:@"iPad2,1"]) return @"iPad 2 (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad2,2"]) return @"iPad 2 (GSM)"; - if ([modelIdentifier isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)"; - if ([modelIdentifier isEqualToString:@"iPad2,4"]) return @"iPad 2 (Rev A)"; - if ([modelIdentifier isEqualToString:@"iPad3,1"]) return @"iPad 3 (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad3,2"]) return @"iPad 3 (GSM)"; - if ([modelIdentifier isEqualToString:@"iPad3,3"]) return @"iPad 3 (Global)"; - if ([modelIdentifier isEqualToString:@"iPad3,4"]) return @"iPad 4 (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad3,5"]) return @"iPad 4 (GSM)"; - if ([modelIdentifier isEqualToString:@"iPad3,6"]) return @"iPad 4 (Global)"; - if ([modelIdentifier isEqualToString:@"iPad6,11"]) return @"iPad (5th gen) (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad6,12"]) return @"iPad (5th gen) (Cellular)"; - - if ([modelIdentifier isEqualToString:@"iPad4,1"]) return @"iPad Air (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad4,2"]) return @"iPad Air (Cellular)"; - if ([modelIdentifier isEqualToString:@"iPad5,3"]) return @"iPad Air 2 (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad5,4"]) return @"iPad Air 2 (Cellular)"; - - // iPad Mini http://theiphonewiki.com/wiki/IPad_mini - - if ([modelIdentifier isEqualToString:@"iPad2,5"]) return @"iPad mini 1G (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad2,6"]) return @"iPad mini 1G (GSM)"; - if ([modelIdentifier isEqualToString:@"iPad2,7"]) return @"iPad mini 1G (Global)"; - if ([modelIdentifier isEqualToString:@"iPad4,4"]) return @"iPad mini 2G (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad4,5"]) return @"iPad mini 2G (Cellular)"; - if ([modelIdentifier isEqualToString:@"iPad4,6"]) return @"iPad mini 2G (Cellular)"; // TD-LTE model see https://support.apple.com/en-us/HT201471#iPad-mini2 - if ([modelIdentifier isEqualToString:@"iPad4,7"]) return @"iPad mini 3G (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad4,8"]) return @"iPad mini 3G (Cellular)"; - if ([modelIdentifier isEqualToString:@"iPad4,9"]) return @"iPad mini 3G (Cellular)"; - if ([modelIdentifier isEqualToString:@"iPad5,1"]) return @"iPad mini 4G (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad5,2"]) return @"iPad mini 4G (Cellular)"; - - // iPad Pro https://www.theiphonewiki.com/wiki/IPad_Pro - - if ([modelIdentifier isEqualToString:@"iPad6,3"]) return @"iPad Pro (9.7 inch) 1G (Wi-Fi)"; // http://pdadb.net/index.php?m=specs&id=9938&c=apple_ipad_pro_9.7-inch_a1673_wifi_32gb_apple_ipad_6,3 - if ([modelIdentifier isEqualToString:@"iPad6,4"]) return @"iPad Pro (9.7 inch) 1G (Cellular)"; // http://pdadb.net/index.php?m=specs&id=9981&c=apple_ipad_pro_9.7-inch_a1675_td-lte_32gb_apple_ipad_6,4 - if ([modelIdentifier isEqualToString:@"iPad6,7"]) return @"iPad Pro (12.9 inch) 1G (Wi-Fi)"; // http://pdadb.net/index.php?m=specs&id=8960&c=apple_ipad_pro_wifi_a1584_128gb - if ([modelIdentifier isEqualToString:@"iPad6,8"]) return @"iPad Pro (12.9 inch) 1G (Cellular)"; // http://pdadb.net/index.php?m=specs&id=8965&c=apple_ipad_pro_td-lte_a1652_32gb_apple_ipad_6,8 - if ([modelIdentifier isEqualToString:@"iPad 7,1"]) return @"iPad Pro (12.9 inch) 2G (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad 7,2"]) return @"iPad Pro (12.9 inch) 2G (Cellular)"; - if ([modelIdentifier isEqualToString:@"iPad 7,3"]) return @"iPad Pro (10.5 inch) 1G (Wi-Fi)"; - if ([modelIdentifier isEqualToString:@"iPad 7,4"]) return @"iPad Pro (10.5 inch) 1G (Cellular)"; - - // iPod http://theiphonewiki.com/wiki/IPod - - if ([modelIdentifier isEqualToString:@"iPod1,1"]) return @"iPod touch 1G"; - if ([modelIdentifier isEqualToString:@"iPod2,1"]) return @"iPod touch 2G"; - if ([modelIdentifier isEqualToString:@"iPod3,1"]) return @"iPod touch 3G"; - if ([modelIdentifier isEqualToString:@"iPod4,1"]) return @"iPod touch 4G"; - if ([modelIdentifier isEqualToString:@"iPod5,1"]) return @"iPod touch 5G"; - if ([modelIdentifier isEqualToString:@"iPod7,1"]) return @"iPod touch 6G"; // as 6,1 was never released 7,1 is actually 6th generation - - // Apple TV https://www.theiphonewiki.com/wiki/Apple_TV - - if ([modelIdentifier isEqualToString:@"AppleTV1,1"]) return @"Apple TV 1G"; - if ([modelIdentifier isEqualToString:@"AppleTV2,1"]) return @"Apple TV 2G"; - if ([modelIdentifier isEqualToString:@"AppleTV3,1"]) return @"Apple TV 3G"; - if ([modelIdentifier isEqualToString:@"AppleTV3,2"]) return @"Apple TV 3G"; // small, incremental update over 3,1 - if ([modelIdentifier isEqualToString:@"AppleTV5,3"]) return @"Apple TV 4G"; // as 4,1 was never released, 5,1 is actually 4th generation - - // Simulator - if ([modelIdentifier hasSuffix:@"86"] || [modelIdentifier isEqual:@"x86_64"]) - { - BOOL smallerScreen = ([[UIScreen mainScreen] bounds].size.width < 768.0); - return (smallerScreen ? @"iPhone Simulator" : @"iPad Simulator"); - } - - return modelIdentifier; -} - -- (UIDeviceFamily) deviceFamily -{ - NSString *modelIdentifier = [self modelIdentifier]; - if ([modelIdentifier hasPrefix:@"iPhone"]) return UIDeviceFamilyiPhone; - if ([modelIdentifier hasPrefix:@"iPod"]) return UIDeviceFamilyiPod; - if ([modelIdentifier hasPrefix:@"iPad"]) return UIDeviceFamilyiPad; - if ([modelIdentifier hasPrefix:@"AppleTV"]) return UIDeviceFamilyAppleTV; - return UIDeviceFamilyUnknown; -} - -@end diff --git a/Pods/libextobjc/LICENSE.md b/Pods/libextobjc/LICENSE.md deleted file mode 100644 index 255c6f242..000000000 --- a/Pods/libextobjc/LICENSE.md +++ /dev/null @@ -1,18 +0,0 @@ -**Copyright (c) 2012 - 2014 Justin Spahr-Summers** - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/libextobjc/README.md b/Pods/libextobjc/README.md deleted file mode 100644 index 21a606e05..000000000 --- a/Pods/libextobjc/README.md +++ /dev/null @@ -1,75 +0,0 @@ -The Extended Objective-C library extends the dynamism of the Objective-C programming language to support additional patterns present in other programming languages (including those that are not necessarily object-oriented). - -libextobjc is meant to be very modular – most of its classes and modules can be used with no more than one or two dependencies. - -Please feel free to open issues for feature requests or ideas for language extensions (even if you have no idea how they'd work)! - -# Features - -libextobjc currently includes the following features: - - * **Safe categories**, using EXTSafeCategory, for adding methods to a class without overwriting anything already there (identifying conflicts for you). - * **Concrete protocols**, using EXTConcreteProtocol, for providing default implementations of the methods in a protocol. - * **Simpler and safer key paths**, using EXTKeyPathCoding, which automatically checks key paths at compile-time. - * **Compile-time checking of selectors** to ensure that an object declares a given selector, using EXTSelectorChecking. - * **Easier use of weak variables in blocks**, using `@weakify`, `@unsafeify`, and `@strongify` from the EXTScope module. - * **Scope-based resource cleanup**, using `@onExit` in the EXTScope module, for automatically cleaning up manually-allocated memory, file handles, locks, etc., at the end of a scope. - * **Algebraic data types** generated completely at compile-time, defined using EXTADT. - * **Synthesized properties for categories**, using EXTSynthesize. - * **Block-based coroutines**, using EXTCoroutine. - * **EXTNil, which is like `NSNull`, but behaves much more closely to actual `nil`** (i.e., doesn't crash when sent unrecognized messages). - * **Lots of extensions** and additional functionality built on top of ``, including extremely customizable method injection, reflection upon object properties, and various functions to extend class hierarchy checks and method lookups. - -The [experimental](https://github.com/jspahrsummers/libextobjc/tree/experimental) -branch contains additional features that may be interesting, but are not -considered stable or safe for production use. Check out the headers for more -information. - -# Running tests - -To execute libextobjc's tests, first run `git submodule update --init --recursive` -to bring in the [xcconfigs](https://github.com/jspahrsummers/xcconfigs) submodule, -then open the project file and choose the desired test target. - -# Adding to your project - -If you want to add libextobjc as a dependency to an **application**, add the -repository as a [submodule](http://git-scm.com/book/en/Git-Tools-Submodules), -then include the source files you care about in your Xcode project. - -If you want to add libextobjc as a dependency to a **framework or library**, -prefer [subtree merging](http://git-scm.com/book/en/Git-Tools-Subtree-Merging), -which will allow you to rename symbols to avoid conflicts, and make any tweaks -you need to for your library. - -To create a libextobjc subtree: - -``` -$ git remote add libextobjc https://github.com/jspahrsummers/libextobjc.git -$ git fetch libextobjc -$ git read-tree --prefix=External/ -u libextobjc/master -$ git reset -``` - -Rename any symbols or change whatever you want, `git add` the specific files -that you want in your library, and then add them to your Xcode project. - -To bring in upstream changes later: - -``` -$ git fetch -p libextobjc -$ git merge -Xsubtree=External/ libextobjc/master -$ git reset -``` - -Then, again, just add the changes you want. - -# License - -Released under the MIT License. See the -[LICENSE](https://github.com/jspahrsummers/libextobjc/blob/master/LICENSE.md) -file for more information. - -# Requirements - -libextobjc must be built with ARC enabled, and many of its macros require ARC in the calling files as well. MRR usage is not supported. diff --git a/Pods/libextobjc/extobjc/EXTRuntimeExtensions.h b/Pods/libextobjc/extobjc/EXTRuntimeExtensions.h deleted file mode 100644 index ca0582672..000000000 --- a/Pods/libextobjc/extobjc/EXTRuntimeExtensions.h +++ /dev/null @@ -1,382 +0,0 @@ -// -// EXTRuntimeExtensions.h -// extobjc -// -// Created by Justin Spahr-Summers on 2011-03-05. -// Copyright (C) 2012 Justin Spahr-Summers. -// Released under the MIT license. -// - -#import - -/** - * A callback indicating that the given method failed to be added to the given - * class. The reason for the failure depends on the attempted task. - */ -typedef void (*ext_failedMethodCallback)(Class, Method); - -/** - * Used with #ext_injectMethods to determine injection behavior. - */ -typedef NS_OPTIONS(NSUInteger, ext_methodInjectionBehavior) { - /** - * Indicates that any existing methods on the destination class should be - * overwritten. - */ - ext_methodInjectionReplace = 0x00, - - /** - * Avoid overwriting methods on the immediate destination class. - */ - ext_methodInjectionFailOnExisting = 0x01, - - /** - * Avoid overriding methods implemented in any superclass of the destination - * class. - */ - ext_methodInjectionFailOnSuperclassExisting = 0x02, - - /** - * Avoid overwriting methods implemented in the immediate destination class - * or any superclass. This is equivalent to - * ext_methodInjectionFailOnExisting | ext_methodInjectionFailOnSuperclassExisting. - */ - ext_methodInjectionFailOnAnyExisting = 0x03, - - /** - * Ignore the \c +load class method. This does not affect instance method - * injection. - */ - ext_methodInjectionIgnoreLoad = 1U << 2, - - /** - * Ignore the \c +initialize class method. This does not affect instance method - * injection. - */ - ext_methodInjectionIgnoreInitialize = 1U << 3 -}; - -/** - * A mask for the overwriting behavior flags of #ext_methodInjectionBehavior. - */ -static const ext_methodInjectionBehavior ext_methodInjectionOverwriteBehaviorMask = 0x3; - -/** - * Describes the memory management policy of a property. - */ -typedef enum { - /** - * The value is assigned. - */ - ext_propertyMemoryManagementPolicyAssign = 0, - - /** - * The value is retained. - */ - ext_propertyMemoryManagementPolicyRetain, - - /** - * The value is copied. - */ - ext_propertyMemoryManagementPolicyCopy -} ext_propertyMemoryManagementPolicy; - -/** - * Describes the attributes and type information of a property. - */ -typedef struct { - /** - * Whether this property was declared with the \c readonly attribute. - */ - BOOL readonly; - - /** - * Whether this property was declared with the \c nonatomic attribute. - */ - BOOL nonatomic; - - /** - * Whether the property is a weak reference. - */ - BOOL weak; - - /** - * Whether the property is eligible for garbage collection. - */ - BOOL canBeCollected; - - /** - * Whether this property is defined with \c \@dynamic. - */ - BOOL dynamic; - - /** - * The memory management policy for this property. This will always be - * #ext_propertyMemoryManagementPolicyAssign if #readonly is \c YES. - */ - ext_propertyMemoryManagementPolicy memoryManagementPolicy; - - /** - * The selector for the getter of this property. This will reflect any - * custom \c getter= attribute provided in the property declaration, or the - * inferred getter name otherwise. - */ - SEL getter; - - /** - * The selector for the setter of this property. This will reflect any - * custom \c setter= attribute provided in the property declaration, or the - * inferred setter name otherwise. - * - * @note If #readonly is \c YES, this value will represent what the setter - * \e would be, if the property were writable. - */ - SEL setter; - - /** - * The backing instance variable for this property, or \c NULL if \c - * \c @synthesize was not used, and therefore no instance variable exists. This - * would also be the case if the property is implemented dynamically. - */ - const char *ivar; - - /** - * If this property is defined as being an instance of a specific class, - * this will be the class object representing it. - * - * This will be \c nil if the property was defined as type \c id, if the - * property is not of an object type, or if the class could not be found at - * runtime. - */ - Class objectClass; - - /** - * The type encoding for the value of this property. This is the type as it - * would be returned by the \c \@encode() directive. - */ - char type[]; -} ext_propertyAttributes; - -/** - * Iterates through the first \a count entries in \a methods and attempts to add - * each one to \a aClass. If a method by the same name already exists on \a - * aClass, it is \e not overridden. If \a checkSuperclasses is \c YES, and - * a method by the same name already exists on any superclass of \a aClass, it - * is not overridden. - * - * Returns the number of methods added successfully. For each method that fails - * to be added, \a failedToAddCallback (if provided) is invoked. - */ -unsigned ext_addMethods (Class aClass, Method *methods, unsigned count, BOOL checkSuperclasses, ext_failedMethodCallback failedToAddCallback); - -/** - * Iterates through all instance and class methods of \a srcClass and attempts - * to add each one to \a dstClass. If a method by the same name already exists - * on \a aClass, it is \e not overridden. If \a checkSuperclasses is \c YES, and - * a method by the same name already exists on any superclass of \a aClass, it - * is not overridden. - * - * Returns whether all methods were added successfully. For each method that fails - * to be added, \a failedToAddCallback (if provided) is invoked. - * - * @note This ignores any \c +load method on \a srcClass. \a srcClass and \a - * dstClass must not be metaclasses. - */ -BOOL ext_addMethodsFromClass (Class srcClass, Class dstClass, BOOL checkSuperclasses, ext_failedMethodCallback failedToAddCallback); - -/** - * Returns the superclass of \a receiver which immediately descends from \a - * superclass. If \a superclass is not in the hierarchy of \a receiver, or is - * equal to \a receiver, \c nil is returned. - */ -Class ext_classBeforeSuperclass (Class receiver, Class superclass); - -/** - * Returns whether \a receiver is \a aClass, or inherits directly from it. - */ -BOOL ext_classIsKindOfClass (Class receiver, Class aClass); - -/** - * Returns the full list of classes registered with the runtime, terminated with - * \c NULL. If \a count is not \c NULL, it is filled in with the total number of - * classes returned. You must \c free() the returned array. - */ -Class *ext_copyClassList (unsigned *count); - -/** - * Looks through the complete list of classes registered with the runtime and - * finds all classes which conform to \a protocol. Returns \c *count classes - * terminated by a \c NULL. You must \c free() the returned array. If there are no - * classes conforming to \a protocol, \c NULL is returned. - * - * @note \a count may be \c NULL. - */ -Class *ext_copyClassListConformingToProtocol (Protocol *protocol, unsigned *count); - -/** - * Returns a pointer to a structure containing information about \a property. - * You must \c free() the returned pointer. Returns \c NULL if there is an error - * obtaining information from \a property. - */ -ext_propertyAttributes *ext_copyPropertyAttributes (objc_property_t property); - -/** - * Looks through the complete list of classes registered with the runtime and - * finds all classes which are descendant from \a aClass. Returns \c - * *subclassCount classes terminated by a \c NULL. You must \c free() the - * returned array. If there are no subclasses of \a aClass, \c NULL is - * returned. - * - * @note \a subclassCount may be \c NULL. \a aClass may be a metaclass to get - * all subclass metaclass objects. - */ -Class *ext_copySubclassList (Class aClass, unsigned *subclassCount); - -/** - * Finds the instance method named \a aSelector on \a aClass and returns it, or - * returns \c NULL if no such instance method exists. Unlike \c - * class_getInstanceMethod(), this does not search superclasses. - * - * @note To get class methods in this manner, use a metaclass for \a aClass. - */ -Method ext_getImmediateInstanceMethod (Class aClass, SEL aSelector); - -/** - * Returns the value of \c Ivar \a IVAR from instance \a OBJ. The instance - * variable must be of type \a TYPE, and is returned as such. - * - * @warning Depending on the platform, this may or may not work with aggregate - * or floating-point types. - */ -#define ext_getIvar(OBJ, IVAR, TYPE) \ - ((TYPE (*)(id, Ivar)object_getIvar)((OBJ), (IVAR))) - -/** - * Returns the value of the instance variable identified by the string \a NAME - * from instance \a OBJ. The instance variable must be of type \a TYPE, and is - * returned as such. - * - * @note \a OBJ is evaluated twice. - * - * @warning Depending on the platform, this may or may not work with aggregate - * or floating-point types. - */ -#define ext_getIvarByName(OBJ, NAME, TYPE) \ - ext_getIvar((OBJ), class_getInstanceVariable(object_getClass((OBJ)), (NAME)), TYPE) - -/** - * Returns the accessor methods for \a property, as implemented in \a aClass or - * any of its superclasses. The getter, if implemented, is returned in \a - * getter, and the setter, if implemented, is returned in \a setter. If either - * \a getter or \a setter are \c NULL, that accessor is not returned. If either - * accessor is not implemented, the argument is left unmodified. - * - * Returns \c YES if a valid accessor was found, or \c NO if \a aClass and its - * superclasses do not implement \a property or if an error occurs. - */ -BOOL ext_getPropertyAccessorsForClass (objc_property_t property, Class aClass, Method *getter, Method *setter); - -/** - * For all classes registered with the runtime, invokes \c - * methodSignatureForSelector: and \c instanceMethodSignatureForSelector: to - * determine a method signature for \a aSelector. If one or more valid - * signatures is found, the first one is returned. If no valid signatures were - * found, \c nil is returned. - */ -NSMethodSignature *ext_globalMethodSignatureForSelector (SEL aSelector); - -/** - * Highly-configurable method injection. Adds the first \a count entries from \a - * methods into \a aClass according to \a behavior. - * - * Returns the number of methods added successfully. For each method that fails - * to be added, \a failedToAddCallback (if provided) is invoked. - * - * @note \c +load and \c +initialize methods are included in the number of - * successful methods when ignored for injection. - */ -unsigned ext_injectMethods (Class aClass, Method *methods, unsigned count, ext_methodInjectionBehavior behavior, ext_failedMethodCallback failedToAddCallback); - -/** - * Invokes #ext_injectMethods with the instance methods and class methods from - * \a srcClass. #ext_methodInjectionIgnoreLoad is added to #behavior for class - * method injection. - * - * Returns whether all methods were added successfully. For each method that fails - * to be added, \a failedToAddCallback (if provided) is invoked. - * - * @note \c +load and \c +initialize methods are considered to be added - * successfully when ignored for injection. - */ -BOOL ext_injectMethodsFromClass (Class srcClass, Class dstClass, ext_methodInjectionBehavior behavior, ext_failedMethodCallback failedToAddCallback); - -/** - * Loads a "special protocol" into an internal list. A special protocol is any - * protocol for which implementing classes need injection behavior (i.e., any - * class conforming to the protocol needs to be reflected upon). Returns \c NO - * if loading failed. - * - * Using this facility proceeds as follows: - * - * @li Each protocol is loaded with #ext_loadSpecialProtocol and a custom block - * that describes its injection behavior on each conforming class. - * @li Each protocol is marked as being ready for injection with - * #ext_specialProtocolReadyForInjection. - * @li The entire Objective-C class list is retrieved, and each special - * protocol's \a injectionBehavior block is run for all conforming classes. - * - * It is an error to call this function without later calling - * #ext_specialProtocolReadyForInjection as well. - * - * @note A special protocol X which conforms to another special protocol Y is - * always injected \e after Y. - */ -BOOL ext_loadSpecialProtocol (Protocol *protocol, void (^injectionBehavior)(Class destinationClass)); - -/** - * Marks a special protocol as being ready for injection. Injection is actually - * performed only after all special protocols have been marked in this way. - * - * @sa ext_loadSpecialProtocol - */ -void ext_specialProtocolReadyForInjection (Protocol *protocol); - -/** - * Creates a human-readable description of the data in \a bytes, interpreting it - * according to the given Objective-C type encoding. - * - * This is intended for use with debugging, and code should not depend upon the - * format of the returned string (just like a call to \c -description). - */ -NSString *ext_stringFromTypedBytes (const void *bytes, const char *encoding); - -/** - * "Removes" any instance method matching \a methodName from \a aClass. This - * removal can mean one of two things: - * - * @li If any superclass of \a aClass implements a method by the same name, the - * implementation of the closest such superclass is used. - * @li If no superclasses of \a aClass implement a method by the same name, the - * method is replaced with an implementation internal to the runtime, used for - * message forwarding. - * - * @warning Adding a method by the same name into a superclass of \a aClass \e - * after using this function may obscure it from the subclass. - */ -void ext_removeMethod (Class aClass, SEL methodName); - -/** - * Iterates through the first \a count entries in \a methods and adds each one - * to \a aClass, replacing any existing implementation. - */ -void ext_replaceMethods (Class aClass, Method *methods, unsigned count); - -/** - * Iterates through all instance and class methods of \a srcClass and adds each - * one to \a dstClass, replacing any existing implementation. - * - * @note This ignores any \c +load method on \a srcClass. \a srcClass and \a - * dstClass must not be metaclasses. - */ -void ext_replaceMethodsFromClass (Class srcClass, Class dstClass); - diff --git a/Pods/libextobjc/extobjc/EXTRuntimeExtensions.m b/Pods/libextobjc/extobjc/EXTRuntimeExtensions.m deleted file mode 100644 index ea7664660..000000000 --- a/Pods/libextobjc/extobjc/EXTRuntimeExtensions.m +++ /dev/null @@ -1,1026 +0,0 @@ -// -// EXTRuntimeExtensions.m -// extobjc -// -// Created by Justin Spahr-Summers on 2011-03-05. -// Copyright (C) 2012 Justin Spahr-Summers. -// Released under the MIT license. -// - -#import "EXTRuntimeExtensions.h" -#import -#import -#import -#import -#import -#import -#import - -typedef NSMethodSignature *(*methodSignatureForSelectorIMP)(id, SEL, SEL); -typedef void (^ext_specialProtocolInjectionBlock)(Class); - -// a `const char *` equivalent to system struct objc_method_description -typedef struct { - SEL name; - const char *types; -} ext_methodDescription; - -// contains the information needed to reference a full special protocol -typedef struct { - // the actual protocol declaration (@protocol block) - __unsafe_unretained Protocol *protocol; - - // the injection block associated with this protocol - // - // this block is RETAINED and must eventually be released by transferring it - // back to ARC - void *injectionBlock; - - // whether this protocol is ready to be injected to its conforming classes - // - // this does NOT refer to a special protocol having been injected already - BOOL ready; -} EXTSpecialProtocol; - -// the full list of special protocols (an array of EXTSpecialProtocol structs) -static EXTSpecialProtocol * restrict specialProtocols = NULL; - -// the number of special protocols stored in the array -static size_t specialProtocolCount = 0; - -// the total capacity of the array -// we use a doubling algorithm to amortize the cost of insertion, so this is -// generally going to be a power-of-two -static size_t specialProtocolCapacity = 0; - -// the number of EXTSpecialProtocols which have been marked as ready for -// injection (though not necessary injected) -// -// in other words, the total count which have 'ready' set to YES -static size_t specialProtocolsReady = 0; - -// a mutex is used to guard against multiple threads changing the above static -// variables -static pthread_mutex_t specialProtocolsLock = PTHREAD_MUTEX_INITIALIZER; - -/** - * This function actually performs the hard work of special protocol injection. - * It obtains a full list of all classes registered with the Objective-C - * runtime, finds those conforming to special protocols, and then runs the - * injection blocks as appropriate. - */ -static void ext_injectSpecialProtocols (void) { - /* - * don't lock specialProtocolsLock in this function, as it is called only - * from public functions which already perform the synchronization - */ - - /* - * This will sort special protocols in the order they should be loaded. If - * a special protocol conforms to another special protocol, the former - * will be prioritized above the latter. - */ - qsort_b(specialProtocols, specialProtocolCount, sizeof(EXTSpecialProtocol), ^(const void *a, const void *b){ - // if the pointers are equal, it must be the same protocol - if (a == b) - return 0; - - const EXTSpecialProtocol *protoA = a; - const EXTSpecialProtocol *protoB = b; - - // A higher return value here means a higher priority - int (^protocolInjectionPriority)(const EXTSpecialProtocol *) = ^(const EXTSpecialProtocol *specialProtocol){ - int runningTotal = 0; - - for (size_t i = 0;i < specialProtocolCount;++i) { - // the pointer passed into this block is guaranteed to point - // into the 'specialProtocols' array, so we can compare the - // pointers directly for identity - if (specialProtocol == specialProtocols + i) - continue; - - if (protocol_conformsToProtocol(specialProtocol->protocol, specialProtocols[i].protocol)) - runningTotal++; - } - - return runningTotal; - }; - - /* - * This will return: - * 0 if the protocols are equal in priority (such that load order does not matter) - * < 0 if A is more important than B - * > 0 if B is more important than A - */ - return protocolInjectionPriority(protoB) - protocolInjectionPriority(protoA); - }); - - unsigned classCount = objc_getClassList(NULL, 0); - if (!classCount) { - fprintf(stderr, "ERROR: No classes registered with the runtime\n"); - return; - } - - Class *allClasses = (Class *)malloc(sizeof(Class) * (classCount + 1)); - if (!allClasses) { - fprintf(stderr, "ERROR: Could not allocate space for %u classes\n", classCount); - return; - } - - // use this instead of ext_copyClassList() to avoid sending +initialize to - // classes that we don't plan to inject into (this avoids some SenTestingKit - // timing issues) - classCount = objc_getClassList(allClasses, classCount); - - /* - * set up an autorelease pool in case any Cocoa classes get used during - * the injection process or +initialize - */ - @autoreleasepool { - // loop through the special protocols, and apply each one to all the - // classes in turn - // - // ORDER IS IMPORTANT HERE: protocols have to be injected to all classes in - // the order in which they appear in specialProtocols. Consider classes - // X and Y that implement protocols A and B, respectively. B needs to get - // its implementation into Y before A gets into X. - for (size_t i = 0;i < specialProtocolCount;++i) { - Protocol *protocol = specialProtocols[i].protocol; - - // transfer ownership of the injection block to ARC and remove it - // from the structure - ext_specialProtocolInjectionBlock injectionBlock = (__bridge_transfer id)specialProtocols[i].injectionBlock; - specialProtocols[i].injectionBlock = NULL; - - // loop through all classes - for (unsigned classIndex = 0;classIndex < classCount;++classIndex) { - Class class = allClasses[classIndex]; - - // if this class doesn't conform to the protocol, continue to the - // next class immediately - if (!class_conformsToProtocol(class, protocol)) - continue; - - injectionBlock(class); - } - } - } - - // free the allocated class list - free(allClasses); - - // now that everything's injected, the special protocol list can also be - // destroyed - free(specialProtocols); specialProtocols = NULL; - specialProtocolCount = 0; - specialProtocolCapacity = 0; - specialProtocolsReady = 0; -} - -unsigned ext_injectMethods ( - Class aClass, - Method *methods, - unsigned count, - ext_methodInjectionBehavior behavior, - ext_failedMethodCallback failedToAddCallback -) { - unsigned successes = 0; - - /* - * set up an autorelease pool in case any Cocoa classes invoke +initialize - * during this process - */ - @autoreleasepool { - BOOL isMeta = class_isMetaClass(aClass); - - if (!isMeta) { - // clear any +load and +initialize ignore flags - behavior &= ~(ext_methodInjectionIgnoreLoad | ext_methodInjectionIgnoreInitialize); - } - - for (unsigned methodIndex = 0;methodIndex < count;++methodIndex) { - Method method = methods[methodIndex]; - SEL methodName = method_getName(method); - - if (behavior & ext_methodInjectionIgnoreLoad) { - if (methodName == @selector(load)) { - ++successes; - continue; - } - } - - if (behavior & ext_methodInjectionIgnoreInitialize) { - if (methodName == @selector(initialize)) { - ++successes; - continue; - } - } - - BOOL success = YES; - IMP impl = method_getImplementation(method); - const char *type = method_getTypeEncoding(method); - - switch (behavior & ext_methodInjectionOverwriteBehaviorMask) { - case ext_methodInjectionFailOnExisting: - success = class_addMethod(aClass, methodName, impl, type); - break; - - case ext_methodInjectionFailOnAnyExisting: - if (class_getInstanceMethod(aClass, methodName)) { - success = NO; - break; - } - - // else fall through - - case ext_methodInjectionReplace: - class_replaceMethod(aClass, methodName, impl, type); - break; - - case ext_methodInjectionFailOnSuperclassExisting: - { - Class superclass = class_getSuperclass(aClass); - if (superclass && class_getInstanceMethod(superclass, methodName)) - success = NO; - else - class_replaceMethod(aClass, methodName, impl, type); - } - - break; - - default: - fprintf(stderr, "ERROR: Unrecognized method injection behavior: %i\n", (int)(behavior & ext_methodInjectionOverwriteBehaviorMask)); - } - - if (success) - ++successes; - else - failedToAddCallback(aClass, method); - } - } - - return successes; -} - -BOOL ext_injectMethodsFromClass ( - Class srcClass, - Class dstClass, - ext_methodInjectionBehavior behavior, - ext_failedMethodCallback failedToAddCallback) -{ - unsigned count, addedCount; - BOOL success = YES; - - count = 0; - Method *instanceMethods = class_copyMethodList(srcClass, &count); - - addedCount = ext_injectMethods( - dstClass, - instanceMethods, - count, - behavior, - failedToAddCallback - ); - - free(instanceMethods); - if (addedCount < count) - success = NO; - - count = 0; - Method *classMethods = class_copyMethodList(object_getClass(srcClass), &count); - - // ignore +load - behavior |= ext_methodInjectionIgnoreLoad; - addedCount = ext_injectMethods( - object_getClass(dstClass), - classMethods, - count, - behavior, - failedToAddCallback - ); - - free(classMethods); - if (addedCount < count) - success = NO; - - return success; -} - -Class ext_classBeforeSuperclass (Class receiver, Class superclass) { - Class previousClass = nil; - - while (![receiver isEqual:superclass]) { - previousClass = receiver; - receiver = class_getSuperclass(receiver); - } - - return previousClass; -} - -Class *ext_copyClassList (unsigned *count) { - // get the number of classes registered with the runtime - int classCount = objc_getClassList(NULL, 0); - if (!classCount) { - if (count) - *count = 0; - - return NULL; - } - - // allocate space for them plus NULL - Class *allClasses = (Class *)malloc(sizeof(Class) * (classCount + 1)); - if (!allClasses) { - fprintf(stderr, "ERROR: Could allocate memory for all classes\n"); - if (count) - *count = 0; - - return NULL; - } - - // and then actually pull the list of the class objects - classCount = objc_getClassList(allClasses, classCount); - allClasses[classCount] = NULL; - - @autoreleasepool { - // weed out classes that do weird things when reflected upon - for (int i = 0;i < classCount;) { - Class class = allClasses[i]; - BOOL keep = YES; - - if (keep) - keep &= class_respondsToSelector(class, @selector(methodSignatureForSelector:)); - - if (keep) { - if (class_respondsToSelector(class, @selector(isProxy))) - keep &= ![class isProxy]; - } - - if (!keep) { - if (--classCount > i) { - memmove(allClasses + i, allClasses + i + 1, (classCount - i) * sizeof(*allClasses)); - } - - continue; - } - - ++i; - } - } - - if (count) - *count = (unsigned)classCount; - - return allClasses; -} - -unsigned ext_addMethods (Class aClass, Method *methods, unsigned count, BOOL checkSuperclasses, ext_failedMethodCallback failedToAddCallback) { - ext_methodInjectionBehavior behavior = ext_methodInjectionFailOnExisting; - if (checkSuperclasses) - behavior |= ext_methodInjectionFailOnSuperclassExisting; - - return ext_injectMethods( - aClass, - methods, - count, - behavior, - failedToAddCallback - ); -} - -BOOL ext_addMethodsFromClass (Class srcClass, Class dstClass, BOOL checkSuperclasses, ext_failedMethodCallback failedToAddCallback) { - ext_methodInjectionBehavior behavior = ext_methodInjectionFailOnExisting; - if (checkSuperclasses) - behavior |= ext_methodInjectionFailOnSuperclassExisting; - - return ext_injectMethodsFromClass(srcClass, dstClass, behavior, failedToAddCallback); -} - -BOOL ext_classIsKindOfClass (Class receiver, Class aClass) { - while (receiver) { - if (receiver == aClass) - return YES; - - receiver = class_getSuperclass(receiver); - } - - return NO; -} - -Class *ext_copyClassListConformingToProtocol (Protocol *protocol, unsigned *count) { - Class *allClasses; - - /* - * set up an autorelease pool in case any Cocoa classes invoke +initialize - * during this process - */ - @autoreleasepool { - unsigned classCount = 0; - allClasses = ext_copyClassList(&classCount); - - if (!allClasses) - return NULL; - - // we're going to reuse allClasses for the return value, so returnIndex will - // keep track of the indices we replace with new values - unsigned returnIndex = 0; - - for (unsigned classIndex = 0;classIndex < classCount;++classIndex) { - Class cls = allClasses[classIndex]; - if (class_conformsToProtocol(cls, protocol)) - allClasses[returnIndex++] = cls; - } - - allClasses[returnIndex] = NULL; - if (count) - *count = returnIndex; - } - - return allClasses; -} - -ext_propertyAttributes *ext_copyPropertyAttributes (objc_property_t property) { - const char * const attrString = property_getAttributes(property); - if (!attrString) { - fprintf(stderr, "ERROR: Could not get attribute string from property %s\n", property_getName(property)); - return NULL; - } - - if (attrString[0] != 'T') { - fprintf(stderr, "ERROR: Expected attribute string \"%s\" for property %s to start with 'T'\n", attrString, property_getName(property)); - return NULL; - } - - const char *typeString = attrString + 1; - const char *next = NSGetSizeAndAlignment(typeString, NULL, NULL); - if (!next) { - fprintf(stderr, "ERROR: Could not read past type in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); - return NULL; - } - - size_t typeLength = next - typeString; - if (!typeLength) { - fprintf(stderr, "ERROR: Invalid type in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); - return NULL; - } - - // allocate enough space for the structure and the type string (plus a NUL) - ext_propertyAttributes *attributes = calloc(1, sizeof(ext_propertyAttributes) + typeLength + 1); - if (!attributes) { - fprintf(stderr, "ERROR: Could not allocate ext_propertyAttributes structure for attribute string \"%s\" for property %s\n", attrString, property_getName(property)); - return NULL; - } - - // copy the type string - strncpy(attributes->type, typeString, typeLength); - attributes->type[typeLength] = '\0'; - - // if this is an object type, and immediately followed by a quoted string... - if (typeString[0] == *(@encode(id)) && typeString[1] == '"') { - // we should be able to extract a class name - const char *className = typeString + 2; - next = strchr(className, '"'); - - if (!next) { - fprintf(stderr, "ERROR: Could not read class name in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); - return NULL; - } - - if (className != next) { - size_t classNameLength = next - className; - char trimmedName[classNameLength + 1]; - - strncpy(trimmedName, className, classNameLength); - trimmedName[classNameLength] = '\0'; - - // attempt to look up the class in the runtime - attributes->objectClass = objc_getClass(trimmedName); - } - } - - if (*next != '\0') { - // skip past any junk before the first flag - next = strchr(next, ','); - } - - while (next && *next == ',') { - char flag = next[1]; - next += 2; - - switch (flag) { - case '\0': - break; - - case 'R': - attributes->readonly = YES; - break; - - case 'C': - attributes->memoryManagementPolicy = ext_propertyMemoryManagementPolicyCopy; - break; - - case '&': - attributes->memoryManagementPolicy = ext_propertyMemoryManagementPolicyRetain; - break; - - case 'N': - attributes->nonatomic = YES; - break; - - case 'G': - case 'S': - { - const char *nextFlag = strchr(next, ','); - SEL name = NULL; - - if (!nextFlag) { - // assume that the rest of the string is the selector - const char *selectorString = next; - next = ""; - - name = sel_registerName(selectorString); - } else { - size_t selectorLength = nextFlag - next; - if (!selectorLength) { - fprintf(stderr, "ERROR: Found zero length selector name in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); - goto errorOut; - } - - char selectorString[selectorLength + 1]; - - strncpy(selectorString, next, selectorLength); - selectorString[selectorLength] = '\0'; - - name = sel_registerName(selectorString); - next = nextFlag; - } - - if (flag == 'G') - attributes->getter = name; - else - attributes->setter = name; - } - - break; - - case 'D': - attributes->dynamic = YES; - attributes->ivar = NULL; - break; - - case 'V': - // assume that the rest of the string (if present) is the ivar name - if (*next == '\0') { - // if there's nothing there, let's assume this is dynamic - attributes->ivar = NULL; - } else { - attributes->ivar = next; - next = ""; - } - - break; - - case 'W': - attributes->weak = YES; - break; - - case 'P': - attributes->canBeCollected = YES; - break; - - case 't': - fprintf(stderr, "ERROR: Old-style type encoding is unsupported in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); - - // skip over this type encoding - while (*next != ',' && *next != '\0') - ++next; - - break; - - default: - fprintf(stderr, "ERROR: Unrecognized attribute string flag '%c' in attribute string \"%s\" for property %s\n", flag, attrString, property_getName(property)); - } - } - - if (next && *next != '\0') { - fprintf(stderr, "Warning: Unparsed data \"%s\" in attribute string \"%s\" for property %s\n", next, attrString, property_getName(property)); - } - - if (!attributes->getter) { - // use the property name as the getter by default - attributes->getter = sel_registerName(property_getName(property)); - } - - if (!attributes->setter) { - const char *propertyName = property_getName(property); - size_t propertyNameLength = strlen(propertyName); - - // we want to transform the name to setProperty: style - size_t setterLength = propertyNameLength + 4; - - char setterName[setterLength + 1]; - strncpy(setterName, "set", 3); - strncpy(setterName + 3, propertyName, propertyNameLength); - - // capitalize property name for the setter - setterName[3] = (char)toupper(setterName[3]); - - setterName[setterLength - 1] = ':'; - setterName[setterLength] = '\0'; - - attributes->setter = sel_registerName(setterName); - } - - return attributes; - -errorOut: - free(attributes); - return NULL; -} - -Class *ext_copySubclassList (Class targetClass, unsigned *subclassCount) { - unsigned classCount = 0; - Class *allClasses = ext_copyClassList(&classCount); - if (!allClasses || !classCount) { - fprintf(stderr, "ERROR: No classes registered with the runtime, cannot find %s!\n", class_getName(targetClass)); - return NULL; - } - - // we're going to reuse allClasses for the return value, so returnIndex will - // keep track of the indices we replace with new values - unsigned returnIndex = 0; - - BOOL isMeta = class_isMetaClass(targetClass); - - for (unsigned classIndex = 0;classIndex < classCount;++classIndex) { - Class cls = allClasses[classIndex]; - Class superclass = class_getSuperclass(cls); - - while (superclass != NULL) { - if (isMeta) { - if (object_getClass(superclass) == targetClass) - break; - } else if (superclass == targetClass) - break; - - superclass = class_getSuperclass(superclass); - } - - if (!superclass) - continue; - - // at this point, 'cls' is definitively a subclass of targetClass - if (isMeta) - cls = object_getClass(cls); - - allClasses[returnIndex++] = cls; - } - - allClasses[returnIndex] = NULL; - if (subclassCount) - *subclassCount = returnIndex; - - return allClasses; -} - -Method ext_getImmediateInstanceMethod (Class aClass, SEL aSelector) { - unsigned methodCount = 0; - Method *methods = class_copyMethodList(aClass, &methodCount); - Method foundMethod = NULL; - - for (unsigned methodIndex = 0;methodIndex < methodCount;++methodIndex) { - if (method_getName(methods[methodIndex]) == aSelector) { - foundMethod = methods[methodIndex]; - break; - } - } - - free(methods); - return foundMethod; -} - -BOOL ext_getPropertyAccessorsForClass (objc_property_t property, Class aClass, Method *getter, Method *setter) { - ext_propertyAttributes *attributes = ext_copyPropertyAttributes(property); - if (!attributes) - return NO; - - SEL getterName = attributes->getter; - SEL setterName = attributes->setter; - - free(attributes); - attributes = NULL; - - /* - * set up an autorelease pool in case this sends aClass its first message - */ - @autoreleasepool { - Method foundGetter = class_getInstanceMethod(aClass, getterName); - if (!foundGetter) { - return NO; - } - - if (getter) - *getter = foundGetter; - - if (setter) { - Method foundSetter = class_getInstanceMethod(aClass, setterName); - if (foundSetter) - *setter = foundSetter; - } - } - - return YES; -} - -NSMethodSignature *ext_globalMethodSignatureForSelector (SEL aSelector) { - NSCParameterAssert(aSelector != NULL); - - // set up a small & simple cache/hash to avoid repeatedly scouring every - // class & protocol in the runtime. - static const size_t selectorCacheLength = 1 << 8; - static const uintptr_t selectorCacheMask = (selectorCacheLength - 1); - static ext_methodDescription volatile methodDescriptionCache[selectorCacheLength]; - - // reads and writes need to be atomic, but will be ridiculously fast, - // so we can stay in userland for locks, and keep the speed. - static OSSpinLock lock = OS_SPINLOCK_INIT; - - uintptr_t hash = (uintptr_t)((void *)aSelector) & selectorCacheMask; - ext_methodDescription methodDesc; - - OSSpinLockLock(&lock); - methodDesc = methodDescriptionCache[hash]; - OSSpinLockUnlock(&lock); - - // cache hit? check the selector to insure we aren't colliding - if (methodDesc.name == aSelector) { - return [NSMethodSignature signatureWithObjCTypes:methodDesc.types]; - } - - methodDesc = (ext_methodDescription){.name = NULL, .types = NULL}; - - uint classCount = 0; - Class *classes = ext_copyClassList(&classCount); - - if (classes) { - @autoreleasepool { - // set up an autorelease pool in case any Cocoa classes invoke - //+initialize during this process - for (uint i = 0;i < classCount;++i) { - Class cls = classes[i]; - - Method method = class_getInstanceMethod(cls, aSelector); - if (!method) - method = class_getClassMethod(cls, aSelector); - - if (method) { - methodDesc = (ext_methodDescription){.name = aSelector, .types = method_getTypeEncoding(method)}; - break; - } - } - } - free(classes); - } - - // if not found, then we can look through optional protocol methods for completeness - if (!methodDesc.name) { - uint protocolCount = 0; - Protocol * __unsafe_unretained *protocols = objc_copyProtocolList(&protocolCount); - if (protocols) { - struct objc_method_description objcMethodDesc; - for (uint i = 0;i < protocolCount;++i) { - objcMethodDesc = protocol_getMethodDescription(protocols[i], aSelector, NO, YES); - if (!objcMethodDesc.name) - objcMethodDesc = protocol_getMethodDescription(protocols[i], aSelector, NO, NO); - - if (objcMethodDesc.name) { - methodDesc = (ext_methodDescription){.name = objcMethodDesc.name, .types = objcMethodDesc.types}; - break; - } - } - free(protocols); - } - } - - if (methodDesc.name) { - // if not locked, cache this value, but don't wait around - if (OSSpinLockTry(&lock)) { - methodDescriptionCache[hash] = methodDesc; - OSSpinLockUnlock(&lock); - } - - // NB: there are some esoteric system type encodings that cause -signatureWithObjCTypes: to fail, - // e.g on OS X 10.8, -[NSDecimalNumber* -initWithDecimal:]. Doubt it's worth trying to catch here. - return [NSMethodSignature signatureWithObjCTypes:methodDesc.types]; - } else { - return nil; - } -} - -BOOL ext_loadSpecialProtocol (Protocol *protocol, void (^injectionBehavior)(Class destinationClass)) { - @autoreleasepool { - NSCParameterAssert(protocol != nil); - NSCParameterAssert(injectionBehavior != nil); - - // lock the mutex to prevent accesses from other threads while we perform - // this work - if (pthread_mutex_lock(&specialProtocolsLock) != 0) { - fprintf(stderr, "ERROR: Could not synchronize on special protocol data\n"); - return NO; - } - - // if we've hit the hard maximum for number of special protocols, we can't - // continue - if (specialProtocolCount == SIZE_MAX) { - pthread_mutex_unlock(&specialProtocolsLock); - return NO; - } - - // if the array has no more space, we will need to allocate additional - // entries - if (specialProtocolCount >= specialProtocolCapacity) { - size_t newCapacity; - if (specialProtocolCapacity == 0) - // if there are no entries, make space for just one - newCapacity = 1; - else { - // otherwise, double the current capacity - newCapacity = specialProtocolCapacity << 1; - - // if the new capacity is less than the current capacity, that's - // unsigned integer overflow - if (newCapacity < specialProtocolCapacity) { - // set it to the maximum possible instead - newCapacity = SIZE_MAX; - - // if the new capacity is still not greater than the current - // (for instance, if it was already SIZE_MAX), we can't continue - if (newCapacity <= specialProtocolCapacity) { - pthread_mutex_unlock(&specialProtocolsLock); - return NO; - } - } - } - - // we have a new capacity, so resize the list of all special protocols - // to add the new entries - void * restrict ptr = realloc(specialProtocols, sizeof(*specialProtocols) * newCapacity); - if (!ptr) { - // the allocation failed, abort - pthread_mutex_unlock(&specialProtocolsLock); - return NO; - } - - specialProtocols = ptr; - specialProtocolCapacity = newCapacity; - } - - // at this point, there absolutely must be at least one empty entry in the - // array - assert(specialProtocolCount < specialProtocolCapacity); - - // disable warning about "leaking" this block, which is released in - // ext_injectSpecialProtocols() - #ifndef __clang_analyzer__ - ext_specialProtocolInjectionBlock copiedBlock = [injectionBehavior copy]; - - // construct a new EXTSpecialProtocol structure and add it to the first - // empty space in the array - specialProtocols[specialProtocolCount] = (EXTSpecialProtocol){ - .protocol = protocol, - .injectionBlock = (__bridge_retained void *)copiedBlock, - .ready = NO - }; - #endif - - ++specialProtocolCount; - pthread_mutex_unlock(&specialProtocolsLock); - } - - // success! - return YES; -} - -void ext_specialProtocolReadyForInjection (Protocol *protocol) { - @autoreleasepool { - NSCParameterAssert(protocol != nil); - - // lock the mutex to prevent accesses from other threads while we perform - // this work - if (pthread_mutex_lock(&specialProtocolsLock) != 0) { - fprintf(stderr, "ERROR: Could not synchronize on special protocol data\n"); - return; - } - - // loop through all the special protocols in our list, trying to find the - // one associated with 'protocol' - for (size_t i = 0;i < specialProtocolCount;++i) { - if (specialProtocols[i].protocol == protocol) { - // found the matching special protocol, check to see if it's - // already ready - if (!specialProtocols[i].ready) { - // if it's not, mark it as being ready now - specialProtocols[i].ready = YES; - - // since this special protocol was in our array, and it was not - // loaded, the total number of protocols loaded must be less - // than the total count at this point in time - assert(specialProtocolsReady < specialProtocolCount); - - // ... and then increment the total number of special protocols - // loaded – if it now matches the total count of special - // protocols, begin the injection process - if (++specialProtocolsReady == specialProtocolCount) - ext_injectSpecialProtocols(); - } - - break; - } - } - - pthread_mutex_unlock(&specialProtocolsLock); - } -} - -void ext_removeMethod (Class aClass, SEL methodName) { - Method existingMethod = ext_getImmediateInstanceMethod(aClass, methodName); - if (!existingMethod) { - return; - } - - /* - * set up an autorelease pool in case any Cocoa classes invoke +initialize - * during this process - */ - @autoreleasepool { - Method superclassMethod = NULL; - Class superclass = class_getSuperclass(aClass); - if (superclass) - superclassMethod = class_getInstanceMethod(superclass, methodName); - - if (superclassMethod) { - method_setImplementation(existingMethod, method_getImplementation(superclassMethod)); - } else { - // since we now know that the method doesn't exist on any - // superclass, get an IMP internal to the runtime for message forwarding - IMP forward = class_getMethodImplementation(superclass, methodName); - - method_setImplementation(existingMethod, forward); - } - } -} - -void ext_replaceMethods (Class aClass, Method *methods, unsigned count) { - ext_injectMethods( - aClass, - methods, - count, - ext_methodInjectionReplace, - NULL - ); -} - -void ext_replaceMethodsFromClass (Class srcClass, Class dstClass) { - ext_injectMethodsFromClass(srcClass, dstClass, ext_methodInjectionReplace, NULL); -} - -NSString *ext_stringFromTypedBytes (const void *bytes, const char *encoding) { - switch (*encoding) { - case 'c': return @(*(char *)bytes).description; - case 'C': return @(*(unsigned char *)bytes).description; - case 'i': return @(*(int *)bytes).description; - case 'I': return @(*(unsigned int *)bytes).description; - case 's': return @(*(short *)bytes).description; - case 'S': return @(*(unsigned short *)bytes).description; - case 'l': return @(*(long *)bytes).description; - case 'L': return @(*(unsigned long *)bytes).description; - case 'q': return @(*(long long *)bytes).description; - case 'Q': return @(*(unsigned long long *)bytes).description; - case 'f': return @(*(float *)bytes).description; - case 'd': return @(*(double *)bytes).description; - case 'B': return @(*(_Bool *)bytes).description; - case 'v': return @"(void)"; - case '*': return [NSString stringWithFormat:@"\"%s\"", bytes]; - - case '@': - case '#': { - id obj = *(__unsafe_unretained id *)bytes; - if (obj) - return [obj description]; - else - return @"(nil)"; - } - - case '?': - case '^': { - const void *ptr = *(const void **)bytes; - if (ptr) - return [NSString stringWithFormat:@"%p", ptr]; - else - return @"(null)"; - } - - default: - return [[NSValue valueWithBytes:bytes objCType:encoding] description]; - } -} - diff --git a/Pods/libextobjc/extobjc/EXTScope.h b/Pods/libextobjc/extobjc/EXTScope.h deleted file mode 100644 index cdc549bb4..000000000 --- a/Pods/libextobjc/extobjc/EXTScope.h +++ /dev/null @@ -1,116 +0,0 @@ -// -// EXTScope.h -// extobjc -// -// Created by Justin Spahr-Summers on 2011-05-04. -// Copyright (C) 2012 Justin Spahr-Summers. -// Released under the MIT license. -// - -#import "metamacros.h" - -/** - * \@onExit defines some code to be executed when the current scope exits. The - * code must be enclosed in braces and terminated with a semicolon, and will be - * executed regardless of how the scope is exited, including from exceptions, - * \c goto, \c return, \c break, and \c continue. - * - * Provided code will go into a block to be executed later. Keep this in mind as - * it pertains to memory management, restrictions on assignment, etc. Because - * the code is used within a block, \c return is a legal (though perhaps - * confusing) way to exit the cleanup block early. - * - * Multiple \@onExit statements in the same scope are executed in reverse - * lexical order. This helps when pairing resource acquisition with \@onExit - * statements, as it guarantees teardown in the opposite order of acquisition. - * - * @note This statement cannot be used within scopes defined without braces - * (like a one line \c if). In practice, this is not an issue, since \@onExit is - * a useless construct in such a case anyways. - */ -#define onExit \ - ext_keywordify \ - __strong ext_cleanupBlock_t metamacro_concat(ext_exitBlock_, __LINE__) __attribute__((cleanup(ext_executeCleanupBlock), unused)) = ^ - -/** - * Creates \c __weak shadow variables for each of the variables provided as - * arguments, which can later be made strong again with #strongify. - * - * This is typically used to weakly reference variables in a block, but then - * ensure that the variables stay alive during the actual execution of the block - * (if they were live upon entry). - * - * See #strongify for an example of usage. - */ -#define weakify(...) \ - ext_keywordify \ - metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__) - -/** - * Like #weakify, but uses \c __unsafe_unretained instead, for targets or - * classes that do not support weak references. - */ -#define unsafeify(...) \ - ext_keywordify \ - metamacro_foreach_cxt(ext_weakify_,, __unsafe_unretained, __VA_ARGS__) - -/** - * Strongly references each of the variables provided as arguments, which must - * have previously been passed to #weakify. - * - * The strong references created will shadow the original variable names, such - * that the original names can be used without issue (and a significantly - * reduced risk of retain cycles) in the current scope. - * - * @code - - id foo = [[NSObject alloc] init]; - id bar = [[NSObject alloc] init]; - - @weakify(foo, bar); - - // this block will not keep 'foo' or 'bar' alive - BOOL (^matchesFooOrBar)(id) = ^ BOOL (id obj){ - // but now, upon entry, 'foo' and 'bar' will stay alive until the block has - // finished executing - @strongify(foo, bar); - - return [foo isEqual:obj] || [bar isEqual:obj]; - }; - - * @endcode - */ -#define strongify(...) \ - ext_keywordify \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wshadow\"") \ - metamacro_foreach(ext_strongify_,, __VA_ARGS__) \ - _Pragma("clang diagnostic pop") - -/*** implementation details follow ***/ -typedef void (^ext_cleanupBlock_t)(); - -void ext_executeCleanupBlock (__strong ext_cleanupBlock_t *block); - -#define ext_weakify_(INDEX, CONTEXT, VAR) \ - CONTEXT __typeof__(VAR) metamacro_concat(VAR, _weak_) = (VAR); - -#define ext_strongify_(INDEX, VAR) \ - __strong __typeof__(VAR) VAR = metamacro_concat(VAR, _weak_); - -// Details about the choice of backing keyword: -// -// The use of @try/@catch/@finally can cause the compiler to suppress -// return-type warnings. -// The use of @autoreleasepool {} is not optimized away by the compiler, -// resulting in superfluous creation of autorelease pools. -// -// Since neither option is perfect, and with no other alternatives, the -// compromise is to use @autorelease in DEBUG builds to maintain compiler -// analysis, and to use @try/@catch otherwise to avoid insertion of unnecessary -// autorelease pools. -#if DEBUG -#define ext_keywordify autoreleasepool {} -#else -#define ext_keywordify try {} @catch (...) {} -#endif diff --git a/Pods/libextobjc/extobjc/EXTScope.m b/Pods/libextobjc/extobjc/EXTScope.m deleted file mode 100644 index 5e68a9a07..000000000 --- a/Pods/libextobjc/extobjc/EXTScope.m +++ /dev/null @@ -1,15 +0,0 @@ -// -// EXTScope.m -// extobjc -// -// Created by Justin Spahr-Summers on 2011-05-04. -// Copyright (C) 2012 Justin Spahr-Summers. -// Released under the MIT license. -// - -#import "EXTScope.h" - -void ext_executeCleanupBlock (__strong ext_cleanupBlock_t *block) { - (*block)(); -} - diff --git a/Pods/libextobjc/extobjc/metamacros.h b/Pods/libextobjc/extobjc/metamacros.h deleted file mode 100644 index dd90d99bb..000000000 --- a/Pods/libextobjc/extobjc/metamacros.h +++ /dev/null @@ -1,667 +0,0 @@ -/** - * Macros for metaprogramming - * ExtendedC - * - * Copyright (C) 2012 Justin Spahr-Summers - * Released under the MIT license - */ - -#ifndef EXTC_METAMACROS_H -#define EXTC_METAMACROS_H - - -/** - * Executes one or more expressions (which may have a void type, such as a call - * to a function that returns no value) and always returns true. - */ -#define metamacro_exprify(...) \ - ((__VA_ARGS__), true) - -/** - * Returns a string representation of VALUE after full macro expansion. - */ -#define metamacro_stringify(VALUE) \ - metamacro_stringify_(VALUE) - -/** - * Returns A and B concatenated after full macro expansion. - */ -#define metamacro_concat(A, B) \ - metamacro_concat_(A, B) - -/** - * Returns the Nth variadic argument (starting from zero). At least - * N + 1 variadic arguments must be given. N must be between zero and twenty, - * inclusive. - */ -#define metamacro_at(N, ...) \ - metamacro_concat(metamacro_at, N)(__VA_ARGS__) - -/** - * Returns the number of arguments (up to twenty) provided to the macro. At - * least one argument must be provided. - * - * Inspired by P99: http://p99.gforge.inria.fr - */ -#define metamacro_argcount(...) \ - metamacro_at(20, __VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) - -/** - * Identical to #metamacro_foreach_cxt, except that no CONTEXT argument is - * given. Only the index and current argument will thus be passed to MACRO. - */ -#define metamacro_foreach(MACRO, SEP, ...) \ - metamacro_foreach_cxt(metamacro_foreach_iter, SEP, MACRO, __VA_ARGS__) - -/** - * For each consecutive variadic argument (up to twenty), MACRO is passed the - * zero-based index of the current argument, CONTEXT, and then the argument - * itself. The results of adjoining invocations of MACRO are then separated by - * SEP. - * - * Inspired by P99: http://p99.gforge.inria.fr - */ -#define metamacro_foreach_cxt(MACRO, SEP, CONTEXT, ...) \ - metamacro_concat(metamacro_foreach_cxt, metamacro_argcount(__VA_ARGS__))(MACRO, SEP, CONTEXT, __VA_ARGS__) - -/** - * Identical to #metamacro_foreach_cxt. This can be used when the former would - * fail due to recursive macro expansion. - */ -#define metamacro_foreach_cxt_recursive(MACRO, SEP, CONTEXT, ...) \ - metamacro_concat(metamacro_foreach_cxt_recursive, metamacro_argcount(__VA_ARGS__))(MACRO, SEP, CONTEXT, __VA_ARGS__) - -/** - * In consecutive order, appends each variadic argument (up to twenty) onto - * BASE. The resulting concatenations are then separated by SEP. - * - * This is primarily useful to manipulate a list of macro invocations into instead - * invoking a different, possibly related macro. - */ -#define metamacro_foreach_concat(BASE, SEP, ...) \ - metamacro_foreach_cxt(metamacro_foreach_concat_iter, SEP, BASE, __VA_ARGS__) - -/** - * Iterates COUNT times, each time invoking MACRO with the current index - * (starting at zero) and CONTEXT. The results of adjoining invocations of MACRO - * are then separated by SEP. - * - * COUNT must be an integer between zero and twenty, inclusive. - */ -#define metamacro_for_cxt(COUNT, MACRO, SEP, CONTEXT) \ - metamacro_concat(metamacro_for_cxt, COUNT)(MACRO, SEP, CONTEXT) - -/** - * Returns the first argument given. At least one argument must be provided. - * - * This is useful when implementing a variadic macro, where you may have only - * one variadic argument, but no way to retrieve it (for example, because \c ... - * always needs to match at least one argument). - * - * @code - -#define varmacro(...) \ - metamacro_head(__VA_ARGS__) - - * @endcode - */ -#define metamacro_head(...) \ - metamacro_head_(__VA_ARGS__, 0) - -/** - * Returns every argument except the first. At least two arguments must be - * provided. - */ -#define metamacro_tail(...) \ - metamacro_tail_(__VA_ARGS__) - -/** - * Returns the first N (up to twenty) variadic arguments as a new argument list. - * At least N variadic arguments must be provided. - */ -#define metamacro_take(N, ...) \ - metamacro_concat(metamacro_take, N)(__VA_ARGS__) - -/** - * Removes the first N (up to twenty) variadic arguments from the given argument - * list. At least N variadic arguments must be provided. - */ -#define metamacro_drop(N, ...) \ - metamacro_concat(metamacro_drop, N)(__VA_ARGS__) - -/** - * Decrements VAL, which must be a number between zero and twenty, inclusive. - * - * This is primarily useful when dealing with indexes and counts in - * metaprogramming. - */ -#define metamacro_dec(VAL) \ - metamacro_at(VAL, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19) - -/** - * Increments VAL, which must be a number between zero and twenty, inclusive. - * - * This is primarily useful when dealing with indexes and counts in - * metaprogramming. - */ -#define metamacro_inc(VAL) \ - metamacro_at(VAL, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21) - -/** - * If A is equal to B, the next argument list is expanded; otherwise, the - * argument list after that is expanded. A and B must be numbers between zero - * and twenty, inclusive. Additionally, B must be greater than or equal to A. - * - * @code - -// expands to true -metamacro_if_eq(0, 0)(true)(false) - -// expands to false -metamacro_if_eq(0, 1)(true)(false) - - * @endcode - * - * This is primarily useful when dealing with indexes and counts in - * metaprogramming. - */ -#define metamacro_if_eq(A, B) \ - metamacro_concat(metamacro_if_eq, A)(B) - -/** - * Identical to #metamacro_if_eq. This can be used when the former would fail - * due to recursive macro expansion. - */ -#define metamacro_if_eq_recursive(A, B) \ - metamacro_concat(metamacro_if_eq_recursive, A)(B) - -/** - * Returns 1 if N is an even number, or 0 otherwise. N must be between zero and - * twenty, inclusive. - * - * For the purposes of this test, zero is considered even. - */ -#define metamacro_is_even(N) \ - metamacro_at(N, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1) - -/** - * Returns the logical NOT of B, which must be the number zero or one. - */ -#define metamacro_not(B) \ - metamacro_at(B, 1, 0) - -// IMPLEMENTATION DETAILS FOLLOW! -// Do not write code that depends on anything below this line. -#define metamacro_stringify_(VALUE) # VALUE -#define metamacro_concat_(A, B) A ## B -#define metamacro_foreach_iter(INDEX, MACRO, ARG) MACRO(INDEX, ARG) -#define metamacro_head_(FIRST, ...) FIRST -#define metamacro_tail_(FIRST, ...) __VA_ARGS__ -#define metamacro_consume_(...) -#define metamacro_expand_(...) __VA_ARGS__ - -// implemented from scratch so that metamacro_concat() doesn't end up nesting -#define metamacro_foreach_concat_iter(INDEX, BASE, ARG) metamacro_foreach_concat_iter_(BASE, ARG) -#define metamacro_foreach_concat_iter_(BASE, ARG) BASE ## ARG - -// metamacro_at expansions -#define metamacro_at0(...) metamacro_head(__VA_ARGS__) -#define metamacro_at1(_0, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at2(_0, _1, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at3(_0, _1, _2, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at4(_0, _1, _2, _3, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at5(_0, _1, _2, _3, _4, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at6(_0, _1, _2, _3, _4, _5, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at7(_0, _1, _2, _3, _4, _5, _6, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at8(_0, _1, _2, _3, _4, _5, _6, _7, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at9(_0, _1, _2, _3, _4, _5, _6, _7, _8, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at10(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at11(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at12(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at13(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at14(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at15(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at17(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at18(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at19(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, ...) metamacro_head(__VA_ARGS__) -#define metamacro_at20(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, ...) metamacro_head(__VA_ARGS__) - -// metamacro_foreach_cxt expansions -#define metamacro_foreach_cxt0(MACRO, SEP, CONTEXT) -#define metamacro_foreach_cxt1(MACRO, SEP, CONTEXT, _0) MACRO(0, CONTEXT, _0) - -#define metamacro_foreach_cxt2(MACRO, SEP, CONTEXT, _0, _1) \ - metamacro_foreach_cxt1(MACRO, SEP, CONTEXT, _0) \ - SEP \ - MACRO(1, CONTEXT, _1) - -#define metamacro_foreach_cxt3(MACRO, SEP, CONTEXT, _0, _1, _2) \ - metamacro_foreach_cxt2(MACRO, SEP, CONTEXT, _0, _1) \ - SEP \ - MACRO(2, CONTEXT, _2) - -#define metamacro_foreach_cxt4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ - metamacro_foreach_cxt3(MACRO, SEP, CONTEXT, _0, _1, _2) \ - SEP \ - MACRO(3, CONTEXT, _3) - -#define metamacro_foreach_cxt5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ - metamacro_foreach_cxt4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ - SEP \ - MACRO(4, CONTEXT, _4) - -#define metamacro_foreach_cxt6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ - metamacro_foreach_cxt5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ - SEP \ - MACRO(5, CONTEXT, _5) - -#define metamacro_foreach_cxt7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ - metamacro_foreach_cxt6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ - SEP \ - MACRO(6, CONTEXT, _6) - -#define metamacro_foreach_cxt8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ - metamacro_foreach_cxt7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ - SEP \ - MACRO(7, CONTEXT, _7) - -#define metamacro_foreach_cxt9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ - metamacro_foreach_cxt8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ - SEP \ - MACRO(8, CONTEXT, _8) - -#define metamacro_foreach_cxt10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ - metamacro_foreach_cxt9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ - SEP \ - MACRO(9, CONTEXT, _9) - -#define metamacro_foreach_cxt11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ - metamacro_foreach_cxt10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ - SEP \ - MACRO(10, CONTEXT, _10) - -#define metamacro_foreach_cxt12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ - metamacro_foreach_cxt11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ - SEP \ - MACRO(11, CONTEXT, _11) - -#define metamacro_foreach_cxt13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ - metamacro_foreach_cxt12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ - SEP \ - MACRO(12, CONTEXT, _12) - -#define metamacro_foreach_cxt14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ - metamacro_foreach_cxt13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ - SEP \ - MACRO(13, CONTEXT, _13) - -#define metamacro_foreach_cxt15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ - metamacro_foreach_cxt14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ - SEP \ - MACRO(14, CONTEXT, _14) - -#define metamacro_foreach_cxt16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ - metamacro_foreach_cxt15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ - SEP \ - MACRO(15, CONTEXT, _15) - -#define metamacro_foreach_cxt17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ - metamacro_foreach_cxt16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ - SEP \ - MACRO(16, CONTEXT, _16) - -#define metamacro_foreach_cxt18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ - metamacro_foreach_cxt17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ - SEP \ - MACRO(17, CONTEXT, _17) - -#define metamacro_foreach_cxt19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ - metamacro_foreach_cxt18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ - SEP \ - MACRO(18, CONTEXT, _18) - -#define metamacro_foreach_cxt20(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \ - metamacro_foreach_cxt19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ - SEP \ - MACRO(19, CONTEXT, _19) - -// metamacro_foreach_cxt_recursive expansions -#define metamacro_foreach_cxt_recursive0(MACRO, SEP, CONTEXT) -#define metamacro_foreach_cxt_recursive1(MACRO, SEP, CONTEXT, _0) MACRO(0, CONTEXT, _0) - -#define metamacro_foreach_cxt_recursive2(MACRO, SEP, CONTEXT, _0, _1) \ - metamacro_foreach_cxt_recursive1(MACRO, SEP, CONTEXT, _0) \ - SEP \ - MACRO(1, CONTEXT, _1) - -#define metamacro_foreach_cxt_recursive3(MACRO, SEP, CONTEXT, _0, _1, _2) \ - metamacro_foreach_cxt_recursive2(MACRO, SEP, CONTEXT, _0, _1) \ - SEP \ - MACRO(2, CONTEXT, _2) - -#define metamacro_foreach_cxt_recursive4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ - metamacro_foreach_cxt_recursive3(MACRO, SEP, CONTEXT, _0, _1, _2) \ - SEP \ - MACRO(3, CONTEXT, _3) - -#define metamacro_foreach_cxt_recursive5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ - metamacro_foreach_cxt_recursive4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ - SEP \ - MACRO(4, CONTEXT, _4) - -#define metamacro_foreach_cxt_recursive6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ - metamacro_foreach_cxt_recursive5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ - SEP \ - MACRO(5, CONTEXT, _5) - -#define metamacro_foreach_cxt_recursive7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ - metamacro_foreach_cxt_recursive6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ - SEP \ - MACRO(6, CONTEXT, _6) - -#define metamacro_foreach_cxt_recursive8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ - metamacro_foreach_cxt_recursive7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ - SEP \ - MACRO(7, CONTEXT, _7) - -#define metamacro_foreach_cxt_recursive9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ - metamacro_foreach_cxt_recursive8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ - SEP \ - MACRO(8, CONTEXT, _8) - -#define metamacro_foreach_cxt_recursive10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ - metamacro_foreach_cxt_recursive9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ - SEP \ - MACRO(9, CONTEXT, _9) - -#define metamacro_foreach_cxt_recursive11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ - metamacro_foreach_cxt_recursive10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ - SEP \ - MACRO(10, CONTEXT, _10) - -#define metamacro_foreach_cxt_recursive12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ - metamacro_foreach_cxt_recursive11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ - SEP \ - MACRO(11, CONTEXT, _11) - -#define metamacro_foreach_cxt_recursive13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ - metamacro_foreach_cxt_recursive12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ - SEP \ - MACRO(12, CONTEXT, _12) - -#define metamacro_foreach_cxt_recursive14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ - metamacro_foreach_cxt_recursive13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ - SEP \ - MACRO(13, CONTEXT, _13) - -#define metamacro_foreach_cxt_recursive15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ - metamacro_foreach_cxt_recursive14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ - SEP \ - MACRO(14, CONTEXT, _14) - -#define metamacro_foreach_cxt_recursive16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ - metamacro_foreach_cxt_recursive15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ - SEP \ - MACRO(15, CONTEXT, _15) - -#define metamacro_foreach_cxt_recursive17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ - metamacro_foreach_cxt_recursive16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ - SEP \ - MACRO(16, CONTEXT, _16) - -#define metamacro_foreach_cxt_recursive18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ - metamacro_foreach_cxt_recursive17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ - SEP \ - MACRO(17, CONTEXT, _17) - -#define metamacro_foreach_cxt_recursive19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ - metamacro_foreach_cxt_recursive18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ - SEP \ - MACRO(18, CONTEXT, _18) - -#define metamacro_foreach_cxt_recursive20(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \ - metamacro_foreach_cxt_recursive19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ - SEP \ - MACRO(19, CONTEXT, _19) - -// metamacro_for_cxt expansions -#define metamacro_for_cxt0(MACRO, SEP, CONTEXT) -#define metamacro_for_cxt1(MACRO, SEP, CONTEXT) MACRO(0, CONTEXT) - -#define metamacro_for_cxt2(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt1(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(1, CONTEXT) - -#define metamacro_for_cxt3(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt2(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(2, CONTEXT) - -#define metamacro_for_cxt4(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt3(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(3, CONTEXT) - -#define metamacro_for_cxt5(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt4(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(4, CONTEXT) - -#define metamacro_for_cxt6(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt5(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(5, CONTEXT) - -#define metamacro_for_cxt7(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt6(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(6, CONTEXT) - -#define metamacro_for_cxt8(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt7(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(7, CONTEXT) - -#define metamacro_for_cxt9(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt8(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(8, CONTEXT) - -#define metamacro_for_cxt10(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt9(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(9, CONTEXT) - -#define metamacro_for_cxt11(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt10(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(10, CONTEXT) - -#define metamacro_for_cxt12(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt11(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(11, CONTEXT) - -#define metamacro_for_cxt13(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt12(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(12, CONTEXT) - -#define metamacro_for_cxt14(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt13(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(13, CONTEXT) - -#define metamacro_for_cxt15(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt14(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(14, CONTEXT) - -#define metamacro_for_cxt16(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt15(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(15, CONTEXT) - -#define metamacro_for_cxt17(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt16(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(16, CONTEXT) - -#define metamacro_for_cxt18(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt17(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(17, CONTEXT) - -#define metamacro_for_cxt19(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt18(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(18, CONTEXT) - -#define metamacro_for_cxt20(MACRO, SEP, CONTEXT) \ - metamacro_for_cxt19(MACRO, SEP, CONTEXT) \ - SEP \ - MACRO(19, CONTEXT) - -// metamacro_if_eq expansions -#define metamacro_if_eq0(VALUE) \ - metamacro_concat(metamacro_if_eq0_, VALUE) - -#define metamacro_if_eq0_0(...) __VA_ARGS__ metamacro_consume_ -#define metamacro_if_eq0_1(...) metamacro_expand_ -#define metamacro_if_eq0_2(...) metamacro_expand_ -#define metamacro_if_eq0_3(...) metamacro_expand_ -#define metamacro_if_eq0_4(...) metamacro_expand_ -#define metamacro_if_eq0_5(...) metamacro_expand_ -#define metamacro_if_eq0_6(...) metamacro_expand_ -#define metamacro_if_eq0_7(...) metamacro_expand_ -#define metamacro_if_eq0_8(...) metamacro_expand_ -#define metamacro_if_eq0_9(...) metamacro_expand_ -#define metamacro_if_eq0_10(...) metamacro_expand_ -#define metamacro_if_eq0_11(...) metamacro_expand_ -#define metamacro_if_eq0_12(...) metamacro_expand_ -#define metamacro_if_eq0_13(...) metamacro_expand_ -#define metamacro_if_eq0_14(...) metamacro_expand_ -#define metamacro_if_eq0_15(...) metamacro_expand_ -#define metamacro_if_eq0_16(...) metamacro_expand_ -#define metamacro_if_eq0_17(...) metamacro_expand_ -#define metamacro_if_eq0_18(...) metamacro_expand_ -#define metamacro_if_eq0_19(...) metamacro_expand_ -#define metamacro_if_eq0_20(...) metamacro_expand_ - -#define metamacro_if_eq1(VALUE) metamacro_if_eq0(metamacro_dec(VALUE)) -#define metamacro_if_eq2(VALUE) metamacro_if_eq1(metamacro_dec(VALUE)) -#define metamacro_if_eq3(VALUE) metamacro_if_eq2(metamacro_dec(VALUE)) -#define metamacro_if_eq4(VALUE) metamacro_if_eq3(metamacro_dec(VALUE)) -#define metamacro_if_eq5(VALUE) metamacro_if_eq4(metamacro_dec(VALUE)) -#define metamacro_if_eq6(VALUE) metamacro_if_eq5(metamacro_dec(VALUE)) -#define metamacro_if_eq7(VALUE) metamacro_if_eq6(metamacro_dec(VALUE)) -#define metamacro_if_eq8(VALUE) metamacro_if_eq7(metamacro_dec(VALUE)) -#define metamacro_if_eq9(VALUE) metamacro_if_eq8(metamacro_dec(VALUE)) -#define metamacro_if_eq10(VALUE) metamacro_if_eq9(metamacro_dec(VALUE)) -#define metamacro_if_eq11(VALUE) metamacro_if_eq10(metamacro_dec(VALUE)) -#define metamacro_if_eq12(VALUE) metamacro_if_eq11(metamacro_dec(VALUE)) -#define metamacro_if_eq13(VALUE) metamacro_if_eq12(metamacro_dec(VALUE)) -#define metamacro_if_eq14(VALUE) metamacro_if_eq13(metamacro_dec(VALUE)) -#define metamacro_if_eq15(VALUE) metamacro_if_eq14(metamacro_dec(VALUE)) -#define metamacro_if_eq16(VALUE) metamacro_if_eq15(metamacro_dec(VALUE)) -#define metamacro_if_eq17(VALUE) metamacro_if_eq16(metamacro_dec(VALUE)) -#define metamacro_if_eq18(VALUE) metamacro_if_eq17(metamacro_dec(VALUE)) -#define metamacro_if_eq19(VALUE) metamacro_if_eq18(metamacro_dec(VALUE)) -#define metamacro_if_eq20(VALUE) metamacro_if_eq19(metamacro_dec(VALUE)) - -// metamacro_if_eq_recursive expansions -#define metamacro_if_eq_recursive0(VALUE) \ - metamacro_concat(metamacro_if_eq_recursive0_, VALUE) - -#define metamacro_if_eq_recursive0_0(...) __VA_ARGS__ metamacro_consume_ -#define metamacro_if_eq_recursive0_1(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_2(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_3(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_4(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_5(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_6(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_7(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_8(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_9(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_10(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_11(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_12(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_13(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_14(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_15(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_16(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_17(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_18(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_19(...) metamacro_expand_ -#define metamacro_if_eq_recursive0_20(...) metamacro_expand_ - -#define metamacro_if_eq_recursive1(VALUE) metamacro_if_eq_recursive0(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive2(VALUE) metamacro_if_eq_recursive1(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive3(VALUE) metamacro_if_eq_recursive2(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive4(VALUE) metamacro_if_eq_recursive3(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive5(VALUE) metamacro_if_eq_recursive4(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive6(VALUE) metamacro_if_eq_recursive5(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive7(VALUE) metamacro_if_eq_recursive6(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive8(VALUE) metamacro_if_eq_recursive7(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive9(VALUE) metamacro_if_eq_recursive8(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive10(VALUE) metamacro_if_eq_recursive9(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive11(VALUE) metamacro_if_eq_recursive10(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive12(VALUE) metamacro_if_eq_recursive11(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive13(VALUE) metamacro_if_eq_recursive12(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive14(VALUE) metamacro_if_eq_recursive13(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive15(VALUE) metamacro_if_eq_recursive14(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive16(VALUE) metamacro_if_eq_recursive15(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive17(VALUE) metamacro_if_eq_recursive16(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive18(VALUE) metamacro_if_eq_recursive17(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive19(VALUE) metamacro_if_eq_recursive18(metamacro_dec(VALUE)) -#define metamacro_if_eq_recursive20(VALUE) metamacro_if_eq_recursive19(metamacro_dec(VALUE)) - -// metamacro_take expansions -#define metamacro_take0(...) -#define metamacro_take1(...) metamacro_head(__VA_ARGS__) -#define metamacro_take2(...) metamacro_head(__VA_ARGS__), metamacro_take1(metamacro_tail(__VA_ARGS__)) -#define metamacro_take3(...) metamacro_head(__VA_ARGS__), metamacro_take2(metamacro_tail(__VA_ARGS__)) -#define metamacro_take4(...) metamacro_head(__VA_ARGS__), metamacro_take3(metamacro_tail(__VA_ARGS__)) -#define metamacro_take5(...) metamacro_head(__VA_ARGS__), metamacro_take4(metamacro_tail(__VA_ARGS__)) -#define metamacro_take6(...) metamacro_head(__VA_ARGS__), metamacro_take5(metamacro_tail(__VA_ARGS__)) -#define metamacro_take7(...) metamacro_head(__VA_ARGS__), metamacro_take6(metamacro_tail(__VA_ARGS__)) -#define metamacro_take8(...) metamacro_head(__VA_ARGS__), metamacro_take7(metamacro_tail(__VA_ARGS__)) -#define metamacro_take9(...) metamacro_head(__VA_ARGS__), metamacro_take8(metamacro_tail(__VA_ARGS__)) -#define metamacro_take10(...) metamacro_head(__VA_ARGS__), metamacro_take9(metamacro_tail(__VA_ARGS__)) -#define metamacro_take11(...) metamacro_head(__VA_ARGS__), metamacro_take10(metamacro_tail(__VA_ARGS__)) -#define metamacro_take12(...) metamacro_head(__VA_ARGS__), metamacro_take11(metamacro_tail(__VA_ARGS__)) -#define metamacro_take13(...) metamacro_head(__VA_ARGS__), metamacro_take12(metamacro_tail(__VA_ARGS__)) -#define metamacro_take14(...) metamacro_head(__VA_ARGS__), metamacro_take13(metamacro_tail(__VA_ARGS__)) -#define metamacro_take15(...) metamacro_head(__VA_ARGS__), metamacro_take14(metamacro_tail(__VA_ARGS__)) -#define metamacro_take16(...) metamacro_head(__VA_ARGS__), metamacro_take15(metamacro_tail(__VA_ARGS__)) -#define metamacro_take17(...) metamacro_head(__VA_ARGS__), metamacro_take16(metamacro_tail(__VA_ARGS__)) -#define metamacro_take18(...) metamacro_head(__VA_ARGS__), metamacro_take17(metamacro_tail(__VA_ARGS__)) -#define metamacro_take19(...) metamacro_head(__VA_ARGS__), metamacro_take18(metamacro_tail(__VA_ARGS__)) -#define metamacro_take20(...) metamacro_head(__VA_ARGS__), metamacro_take19(metamacro_tail(__VA_ARGS__)) - -// metamacro_drop expansions -#define metamacro_drop0(...) __VA_ARGS__ -#define metamacro_drop1(...) metamacro_tail(__VA_ARGS__) -#define metamacro_drop2(...) metamacro_drop1(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop3(...) metamacro_drop2(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop4(...) metamacro_drop3(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop5(...) metamacro_drop4(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop6(...) metamacro_drop5(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop7(...) metamacro_drop6(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop8(...) metamacro_drop7(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop9(...) metamacro_drop8(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop10(...) metamacro_drop9(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop11(...) metamacro_drop10(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop12(...) metamacro_drop11(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop13(...) metamacro_drop12(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop14(...) metamacro_drop13(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop15(...) metamacro_drop14(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop16(...) metamacro_drop15(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop17(...) metamacro_drop16(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop18(...) metamacro_drop17(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop19(...) metamacro_drop18(metamacro_tail(__VA_ARGS__)) -#define metamacro_drop20(...) metamacro_drop19(metamacro_tail(__VA_ARGS__)) - -#endif diff --git a/Pods/nanopb/LICENSE.txt b/Pods/nanopb/LICENSE.txt deleted file mode 100644 index d11c9af1d..000000000 --- a/Pods/nanopb/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2011 Petteri Aimonen - -This software is provided 'as-is', without any express or -implied warranty. In no event will the authors be held liable -for any damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you - must not claim that you wrote the original software. If you use - this software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and - must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source - distribution. diff --git a/Pods/nanopb/README.md b/Pods/nanopb/README.md deleted file mode 100644 index 07860f067..000000000 --- a/Pods/nanopb/README.md +++ /dev/null @@ -1,71 +0,0 @@ -Nanopb - Protocol Buffers for Embedded Systems -============================================== - -[![Build Status](https://travis-ci.org/nanopb/nanopb.svg?branch=master)](https://travis-ci.org/nanopb/nanopb) - -Nanopb is a small code-size Protocol Buffers implementation in ansi C. It is -especially suitable for use in microcontrollers, but fits any memory -restricted system. - -* **Homepage:** https://jpa.kapsi.fi/nanopb/ -* **Documentation:** https://jpa.kapsi.fi/nanopb/docs/ -* **Downloads:** https://jpa.kapsi.fi/nanopb/download/ -* **Forum:** https://groups.google.com/forum/#!forum/nanopb - - - -Using the nanopb library ------------------------- -To use the nanopb library, you need to do two things: - -1. Compile your .proto files for nanopb, using protoc. -2. Include pb_encode.c, pb_decode.c and pb_common.c in your project. - -The easiest way to get started is to study the project in "examples/simple". -It contains a Makefile, which should work directly under most Linux systems. -However, for any other kind of build system, see the manual steps in -README.txt in that folder. - - - -Using the Protocol Buffers compiler (protoc) --------------------------------------------- -The nanopb generator is implemented as a plugin for the Google's own protoc -compiler. This has the advantage that there is no need to reimplement the -basic parsing of .proto files. However, it does mean that you need the -Google's protobuf library in order to run the generator. - -If you have downloaded a binary package for nanopb (either Windows, Linux or -Mac OS X version), the 'protoc' binary is included in the 'generator-bin' -folder. In this case, you are ready to go. Simply run this command: - - generator-bin/protoc --nanopb_out=. myprotocol.proto - -However, if you are using a git checkout or a plain source distribution, you -need to provide your own version of protoc and the Google's protobuf library. -On Linux, the necessary packages are protobuf-compiler and python-protobuf. -On Windows, you can either build Google's protobuf library from source or use -one of the binary distributions of it. In either case, if you use a separate -protoc, you need to manually give the path to nanopb generator: - - protoc --plugin=protoc-gen-nanopb=nanopb/generator/protoc-gen-nanopb ... - - - -Running the tests ------------------ -If you want to perform further development of the nanopb core, or to verify -its functionality using your compiler and platform, you'll want to run the -test suite. The build rules for the test suite are implemented using Scons, -so you need to have that installed. To run the tests: - - cd tests - scons - -This will show the progress of various test cases. If the output does not -end in an error, the test cases were successful. - -Note: Mac OS X by default aliases 'clang' as 'gcc', while not actually -supporting the same command line options as gcc does. To run tests on -Mac OS X, use: "scons CC=clang CXX=clang". Same way can be used to run -tests with different compilers on any platform. diff --git a/Pods/nanopb/pb.h b/Pods/nanopb/pb.h deleted file mode 100644 index bf05a63c7..000000000 --- a/Pods/nanopb/pb.h +++ /dev/null @@ -1,583 +0,0 @@ -/* Common parts of the nanopb library. Most of these are quite low-level - * stuff. For the high-level interface, see pb_encode.h and pb_decode.h. - */ - -#ifndef PB_H_INCLUDED -#define PB_H_INCLUDED - -/***************************************************************** - * Nanopb compilation time options. You can change these here by * - * uncommenting the lines, or on the compiler command line. * - *****************************************************************/ - -/* Enable support for dynamically allocated fields */ -/* #define PB_ENABLE_MALLOC 1 */ - -/* Define this if your CPU / compiler combination does not support - * unaligned memory access to packed structures. */ -/* #define PB_NO_PACKED_STRUCTS 1 */ - -/* Increase the number of required fields that are tracked. - * A compiler warning will tell if you need this. */ -/* #define PB_MAX_REQUIRED_FIELDS 256 */ - -/* Add support for tag numbers > 255 and fields larger than 255 bytes. */ -/* #define PB_FIELD_16BIT 1 */ - -/* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */ -/* #define PB_FIELD_32BIT 1 */ - -/* Disable support for error messages in order to save some code space. */ -/* #define PB_NO_ERRMSG 1 */ - -/* Disable support for custom streams (support only memory buffers). */ -/* #define PB_BUFFER_ONLY 1 */ - -/* Switch back to the old-style callback function signature. - * This was the default until nanopb-0.2.1. */ -/* #define PB_OLD_CALLBACK_STYLE */ - - -/****************************************************************** - * You usually don't need to change anything below this line. * - * Feel free to look around and use the defined macros, though. * - ******************************************************************/ - - -/* Version of the nanopb library. Just in case you want to check it in - * your own program. */ -#define NANOPB_VERSION nanopb-0.3.8 - -/* Include all the system headers needed by nanopb. You will need the - * definitions of the following: - * - strlen, memcpy, memset functions - * - [u]int_least8_t, uint_fast8_t, [u]int_least16_t, [u]int32_t, [u]int64_t - * - size_t - * - bool - * - * If you don't have the standard header files, you can instead provide - * a custom header that defines or includes all this. In that case, - * define PB_SYSTEM_HEADER to the path of this file. - */ -#ifdef PB_SYSTEM_HEADER -#include PB_SYSTEM_HEADER -#else -#include -#include -#include -#include - -#ifdef PB_ENABLE_MALLOC -#include -#endif -#endif - -/* Macro for defining packed structures (compiler dependent). - * This just reduces memory requirements, but is not required. - */ -#if defined(PB_NO_PACKED_STRUCTS) - /* Disable struct packing */ -# define PB_PACKED_STRUCT_START -# define PB_PACKED_STRUCT_END -# define pb_packed -#elif defined(__GNUC__) || defined(__clang__) - /* For GCC and clang */ -# define PB_PACKED_STRUCT_START -# define PB_PACKED_STRUCT_END -# define pb_packed __attribute__((packed)) -#elif defined(__ICCARM__) || defined(__CC_ARM) - /* For IAR ARM and Keil MDK-ARM compilers */ -# define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)") -# define PB_PACKED_STRUCT_END _Pragma("pack(pop)") -# define pb_packed -#elif defined(_MSC_VER) && (_MSC_VER >= 1500) - /* For Microsoft Visual C++ */ -# define PB_PACKED_STRUCT_START __pragma(pack(push, 1)) -# define PB_PACKED_STRUCT_END __pragma(pack(pop)) -# define pb_packed -#else - /* Unknown compiler */ -# define PB_PACKED_STRUCT_START -# define PB_PACKED_STRUCT_END -# define pb_packed -#endif - -/* Handly macro for suppressing unreferenced-parameter compiler warnings. */ -#ifndef PB_UNUSED -#define PB_UNUSED(x) (void)(x) -#endif - -/* Compile-time assertion, used for checking compatible compilation options. - * If this does not work properly on your compiler, use - * #define PB_NO_STATIC_ASSERT to disable it. - * - * But before doing that, check carefully the error message / place where it - * comes from to see if the error has a real cause. Unfortunately the error - * message is not always very clear to read, but you can see the reason better - * in the place where the PB_STATIC_ASSERT macro was called. - */ -#ifndef PB_NO_STATIC_ASSERT -#ifndef PB_STATIC_ASSERT -#define PB_STATIC_ASSERT(COND,MSG) typedef char PB_STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND)?1:-1]; -#define PB_STATIC_ASSERT_MSG(MSG, LINE, COUNTER) PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) -#define PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) pb_static_assertion_##MSG##LINE##COUNTER -#endif -#else -#define PB_STATIC_ASSERT(COND,MSG) -#endif - -/* Number of required fields to keep track of. */ -#ifndef PB_MAX_REQUIRED_FIELDS -#define PB_MAX_REQUIRED_FIELDS 64 -#endif - -#if PB_MAX_REQUIRED_FIELDS < 64 -#error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64). -#endif - -/* List of possible field types. These are used in the autogenerated code. - * Least-significant 4 bits tell the scalar type - * Most-significant 4 bits specify repeated/required/packed etc. - */ - -typedef uint_least8_t pb_type_t; - -/**** Field data types ****/ - -/* Numeric types */ -#define PB_LTYPE_VARINT 0x00 /* int32, int64, enum, bool */ -#define PB_LTYPE_UVARINT 0x01 /* uint32, uint64 */ -#define PB_LTYPE_SVARINT 0x02 /* sint32, sint64 */ -#define PB_LTYPE_FIXED32 0x03 /* fixed32, sfixed32, float */ -#define PB_LTYPE_FIXED64 0x04 /* fixed64, sfixed64, double */ - -/* Marker for last packable field type. */ -#define PB_LTYPE_LAST_PACKABLE 0x04 - -/* Byte array with pre-allocated buffer. - * data_size is the length of the allocated PB_BYTES_ARRAY structure. */ -#define PB_LTYPE_BYTES 0x05 - -/* String with pre-allocated buffer. - * data_size is the maximum length. */ -#define PB_LTYPE_STRING 0x06 - -/* Submessage - * submsg_fields is pointer to field descriptions */ -#define PB_LTYPE_SUBMESSAGE 0x07 - -/* Extension pseudo-field - * The field contains a pointer to pb_extension_t */ -#define PB_LTYPE_EXTENSION 0x08 - -/* Byte array with inline, pre-allocated byffer. - * data_size is the length of the inline, allocated buffer. - * This differs from PB_LTYPE_BYTES by defining the element as - * pb_byte_t[data_size] rather than pb_bytes_array_t. */ -#define PB_LTYPE_FIXED_LENGTH_BYTES 0x09 - -/* Number of declared LTYPES */ -#define PB_LTYPES_COUNT 0x0A -#define PB_LTYPE_MASK 0x0F - -/**** Field repetition rules ****/ - -#define PB_HTYPE_REQUIRED 0x00 -#define PB_HTYPE_OPTIONAL 0x10 -#define PB_HTYPE_REPEATED 0x20 -#define PB_HTYPE_ONEOF 0x30 -#define PB_HTYPE_MASK 0x30 - -/**** Field allocation types ****/ - -#define PB_ATYPE_STATIC 0x00 -#define PB_ATYPE_POINTER 0x80 -#define PB_ATYPE_CALLBACK 0x40 -#define PB_ATYPE_MASK 0xC0 - -#define PB_ATYPE(x) ((x) & PB_ATYPE_MASK) -#define PB_HTYPE(x) ((x) & PB_HTYPE_MASK) -#define PB_LTYPE(x) ((x) & PB_LTYPE_MASK) - -/* Data type used for storing sizes of struct fields - * and array counts. - */ -#if defined(PB_FIELD_32BIT) - typedef uint32_t pb_size_t; - typedef int32_t pb_ssize_t; -#elif defined(PB_FIELD_16BIT) - typedef uint_least16_t pb_size_t; - typedef int_least16_t pb_ssize_t; -#else - typedef uint_least8_t pb_size_t; - typedef int_least8_t pb_ssize_t; -#endif -#define PB_SIZE_MAX ((pb_size_t)-1) - -/* Data type for storing encoded data and other byte streams. - * This typedef exists to support platforms where uint8_t does not exist. - * You can regard it as equivalent on uint8_t on other platforms. - */ -typedef uint_least8_t pb_byte_t; - -/* This structure is used in auto-generated constants - * to specify struct fields. - * You can change field sizes if you need structures - * larger than 256 bytes or field tags larger than 256. - * The compiler should complain if your .proto has such - * structures. Fix that by defining PB_FIELD_16BIT or - * PB_FIELD_32BIT. - */ -PB_PACKED_STRUCT_START -typedef struct pb_field_s pb_field_t; -struct pb_field_s { - pb_size_t tag; - pb_type_t type; - pb_size_t data_offset; /* Offset of field data, relative to previous field. */ - pb_ssize_t size_offset; /* Offset of array size or has-boolean, relative to data */ - pb_size_t data_size; /* Data size in bytes for a single item */ - pb_size_t array_size; /* Maximum number of entries in array */ - - /* Field definitions for submessage - * OR default value for all other non-array, non-callback types - * If null, then field will zeroed. */ - const void *ptr; -} pb_packed; -PB_PACKED_STRUCT_END - -/* Make sure that the standard integer types are of the expected sizes. - * Otherwise fixed32/fixed64 fields can break. - * - * If you get errors here, it probably means that your stdint.h is not - * correct for your platform. - */ -PB_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t), INT64_T_WRONG_SIZE) -PB_STATIC_ASSERT(sizeof(uint64_t) == 2 * sizeof(uint32_t), UINT64_T_WRONG_SIZE) - -/* This structure is used for 'bytes' arrays. - * It has the number of bytes in the beginning, and after that an array. - * Note that actual structs used will have a different length of bytes array. - */ -#define PB_BYTES_ARRAY_T(n) struct { pb_size_t size; pb_byte_t bytes[n]; } -#define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(pb_bytes_array_t, bytes)) - -struct pb_bytes_array_s { - pb_size_t size; - pb_byte_t bytes[1]; -}; -typedef struct pb_bytes_array_s pb_bytes_array_t; - -/* This structure is used for giving the callback function. - * It is stored in the message structure and filled in by the method that - * calls pb_decode. - * - * The decoding callback will be given a limited-length stream - * If the wire type was string, the length is the length of the string. - * If the wire type was a varint/fixed32/fixed64, the length is the length - * of the actual value. - * The function may be called multiple times (especially for repeated types, - * but also otherwise if the message happens to contain the field multiple - * times.) - * - * The encoding callback will receive the actual output stream. - * It should write all the data in one call, including the field tag and - * wire type. It can write multiple fields. - * - * The callback can be null if you want to skip a field. - */ -typedef struct pb_istream_s pb_istream_t; -typedef struct pb_ostream_s pb_ostream_t; -typedef struct pb_callback_s pb_callback_t; -struct pb_callback_s { -#ifdef PB_OLD_CALLBACK_STYLE - /* Deprecated since nanopb-0.2.1 */ - union { - bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void *arg); - bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, const void *arg); - } funcs; -#else - /* New function signature, which allows modifying arg contents in callback. */ - union { - bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg); - bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg); - } funcs; -#endif - - /* Free arg for use by callback */ - void *arg; -}; - -/* Wire types. Library user needs these only in encoder callbacks. */ -typedef enum { - PB_WT_VARINT = 0, - PB_WT_64BIT = 1, - PB_WT_STRING = 2, - PB_WT_32BIT = 5 -} pb_wire_type_t; - -/* Structure for defining the handling of unknown/extension fields. - * Usually the pb_extension_type_t structure is automatically generated, - * while the pb_extension_t structure is created by the user. However, - * if you want to catch all unknown fields, you can also create a custom - * pb_extension_type_t with your own callback. - */ -typedef struct pb_extension_type_s pb_extension_type_t; -typedef struct pb_extension_s pb_extension_t; -struct pb_extension_type_s { - /* Called for each unknown field in the message. - * If you handle the field, read off all of its data and return true. - * If you do not handle the field, do not read anything and return true. - * If you run into an error, return false. - * Set to NULL for default handler. - */ - bool (*decode)(pb_istream_t *stream, pb_extension_t *extension, - uint32_t tag, pb_wire_type_t wire_type); - - /* Called once after all regular fields have been encoded. - * If you have something to write, do so and return true. - * If you do not have anything to write, just return true. - * If you run into an error, return false. - * Set to NULL for default handler. - */ - bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension); - - /* Free field for use by the callback. */ - const void *arg; -}; - -struct pb_extension_s { - /* Type describing the extension field. Usually you'll initialize - * this to a pointer to the automatically generated structure. */ - const pb_extension_type_t *type; - - /* Destination for the decoded data. This must match the datatype - * of the extension field. */ - void *dest; - - /* Pointer to the next extension handler, or NULL. - * If this extension does not match a field, the next handler is - * automatically called. */ - pb_extension_t *next; - - /* The decoder sets this to true if the extension was found. - * Ignored for encoding. */ - bool found; -}; - -/* Memory allocation functions to use. You can define pb_realloc and - * pb_free to custom functions if you want. */ -#ifdef PB_ENABLE_MALLOC -# ifndef pb_realloc -# define pb_realloc(ptr, size) realloc(ptr, size) -# endif -# ifndef pb_free -# define pb_free(ptr) free(ptr) -# endif -#endif - -/* This is used to inform about need to regenerate .pb.h/.pb.c files. */ -#define PB_PROTO_HEADER_VERSION 30 - -/* These macros are used to declare pb_field_t's in the constant array. */ -/* Size of a structure member, in bytes. */ -#define pb_membersize(st, m) (sizeof ((st*)0)->m) -/* Number of entries in an array. */ -#define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0])) -/* Delta from start of one member to the start of another member. */ -#define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2)) -/* Marks the end of the field list */ -#define PB_LAST_FIELD {0,(pb_type_t) 0,0,0,0,0,0} - -/* Macros for filling in the data_offset field */ -/* data_offset for first field in a message */ -#define PB_DATAOFFSET_FIRST(st, m1, m2) (offsetof(st, m1)) -/* data_offset for subsequent fields */ -#define PB_DATAOFFSET_OTHER(st, m1, m2) (offsetof(st, m1) - offsetof(st, m2) - pb_membersize(st, m2)) -/* data offset for subsequent fields inside an union (oneof) */ -#define PB_DATAOFFSET_UNION(st, m1, m2) (PB_SIZE_MAX) -/* Choose first/other based on m1 == m2 (deprecated, remains for backwards compatibility) */ -#define PB_DATAOFFSET_CHOOSE(st, m1, m2) (int)(offsetof(st, m1) == offsetof(st, m2) \ - ? PB_DATAOFFSET_FIRST(st, m1, m2) \ - : PB_DATAOFFSET_OTHER(st, m1, m2)) - -/* Required fields are the simplest. They just have delta (padding) from - * previous field end, and the size of the field. Pointer is used for - * submessages and default values. - */ -#define PB_REQUIRED_STATIC(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_STATIC | PB_HTYPE_REQUIRED | ltype, \ - fd, 0, pb_membersize(st, m), 0, ptr} - -/* Optional fields add the delta to the has_ variable. */ -#define PB_OPTIONAL_STATIC(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \ - fd, \ - pb_delta(st, has_ ## m, m), \ - pb_membersize(st, m), 0, ptr} - -#define PB_SINGULAR_STATIC(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \ - fd, 0, pb_membersize(st, m), 0, ptr} - -/* Repeated fields have a _count field and also the maximum number of entries. */ -#define PB_REPEATED_STATIC(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_STATIC | PB_HTYPE_REPEATED | ltype, \ - fd, \ - pb_delta(st, m ## _count, m), \ - pb_membersize(st, m[0]), \ - pb_arraysize(st, m), ptr} - -/* Allocated fields carry the size of the actual data, not the pointer */ -#define PB_REQUIRED_POINTER(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_POINTER | PB_HTYPE_REQUIRED | ltype, \ - fd, 0, pb_membersize(st, m[0]), 0, ptr} - -/* Optional fields don't need a has_ variable, as information would be redundant */ -#define PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \ - fd, 0, pb_membersize(st, m[0]), 0, ptr} - -/* Same as optional fields*/ -#define PB_SINGULAR_POINTER(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \ - fd, 0, pb_membersize(st, m[0]), 0, ptr} - -/* Repeated fields have a _count field and a pointer to array of pointers */ -#define PB_REPEATED_POINTER(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_POINTER | PB_HTYPE_REPEATED | ltype, \ - fd, pb_delta(st, m ## _count, m), \ - pb_membersize(st, m[0]), 0, ptr} - -/* Callbacks are much like required fields except with special datatype. */ -#define PB_REQUIRED_CALLBACK(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REQUIRED | ltype, \ - fd, 0, pb_membersize(st, m), 0, ptr} - -#define PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \ - fd, 0, pb_membersize(st, m), 0, ptr} - -#define PB_SINGULAR_CALLBACK(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \ - fd, 0, pb_membersize(st, m), 0, ptr} - -#define PB_REPEATED_CALLBACK(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REPEATED | ltype, \ - fd, 0, pb_membersize(st, m), 0, ptr} - -/* Optional extensions don't have the has_ field, as that would be redundant. - * Furthermore, the combination of OPTIONAL without has_ field is used - * for indicating proto3 style fields. Extensions exist in proto2 mode only, - * so they should be encoded according to proto2 rules. To avoid the conflict, - * extensions are marked as REQUIRED instead. - */ -#define PB_OPTEXT_STATIC(tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_STATIC | PB_HTYPE_REQUIRED | ltype, \ - 0, \ - 0, \ - pb_membersize(st, m), 0, ptr} - -#define PB_OPTEXT_POINTER(tag, st, m, fd, ltype, ptr) \ - PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr) - -#define PB_OPTEXT_CALLBACK(tag, st, m, fd, ltype, ptr) \ - PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr) - -/* The mapping from protobuf types to LTYPEs is done using these macros. */ -#define PB_LTYPE_MAP_BOOL PB_LTYPE_VARINT -#define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES -#define PB_LTYPE_MAP_DOUBLE PB_LTYPE_FIXED64 -#define PB_LTYPE_MAP_ENUM PB_LTYPE_VARINT -#define PB_LTYPE_MAP_UENUM PB_LTYPE_UVARINT -#define PB_LTYPE_MAP_FIXED32 PB_LTYPE_FIXED32 -#define PB_LTYPE_MAP_FIXED64 PB_LTYPE_FIXED64 -#define PB_LTYPE_MAP_FLOAT PB_LTYPE_FIXED32 -#define PB_LTYPE_MAP_INT32 PB_LTYPE_VARINT -#define PB_LTYPE_MAP_INT64 PB_LTYPE_VARINT -#define PB_LTYPE_MAP_MESSAGE PB_LTYPE_SUBMESSAGE -#define PB_LTYPE_MAP_SFIXED32 PB_LTYPE_FIXED32 -#define PB_LTYPE_MAP_SFIXED64 PB_LTYPE_FIXED64 -#define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT -#define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT -#define PB_LTYPE_MAP_STRING PB_LTYPE_STRING -#define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT -#define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT -#define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION -#define PB_LTYPE_MAP_FIXED_LENGTH_BYTES PB_LTYPE_FIXED_LENGTH_BYTES - -/* This is the actual macro used in field descriptions. - * It takes these arguments: - * - Field tag number - * - Field type: BOOL, BYTES, DOUBLE, ENUM, UENUM, FIXED32, FIXED64, - * FLOAT, INT32, INT64, MESSAGE, SFIXED32, SFIXED64 - * SINT32, SINT64, STRING, UINT32, UINT64 or EXTENSION - * - Field rules: REQUIRED, OPTIONAL or REPEATED - * - Allocation: STATIC, CALLBACK or POINTER - * - Placement: FIRST or OTHER, depending on if this is the first field in structure. - * - Message name - * - Field name - * - Previous field name (or field name again for first field) - * - Pointer to default value or submsg fields. - */ - -#define PB_FIELD(tag, type, rules, allocation, placement, message, field, prevfield, ptr) \ - PB_ ## rules ## _ ## allocation(tag, message, field, \ - PB_DATAOFFSET_ ## placement(message, field, prevfield), \ - PB_LTYPE_MAP_ ## type, ptr) - -/* Field description for oneof fields. This requires taking into account the - * union name also, that's why a separate set of macros is needed. - */ -#define PB_ONEOF_STATIC(u, tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_STATIC | PB_HTYPE_ONEOF | ltype, \ - fd, pb_delta(st, which_ ## u, u.m), \ - pb_membersize(st, u.m), 0, ptr} - -#define PB_ONEOF_POINTER(u, tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_POINTER | PB_HTYPE_ONEOF | ltype, \ - fd, pb_delta(st, which_ ## u, u.m), \ - pb_membersize(st, u.m[0]), 0, ptr} - -#define PB_ONEOF_FIELD(union_name, tag, type, rules, allocation, placement, message, field, prevfield, ptr) \ - PB_ONEOF_ ## allocation(union_name, tag, message, field, \ - PB_DATAOFFSET_ ## placement(message, union_name.field, prevfield), \ - PB_LTYPE_MAP_ ## type, ptr) - -#define PB_ANONYMOUS_ONEOF_STATIC(u, tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_STATIC | PB_HTYPE_ONEOF | ltype, \ - fd, pb_delta(st, which_ ## u, m), \ - pb_membersize(st, m), 0, ptr} - -#define PB_ANONYMOUS_ONEOF_POINTER(u, tag, st, m, fd, ltype, ptr) \ - {tag, PB_ATYPE_POINTER | PB_HTYPE_ONEOF | ltype, \ - fd, pb_delta(st, which_ ## u, m), \ - pb_membersize(st, m[0]), 0, ptr} - -#define PB_ANONYMOUS_ONEOF_FIELD(union_name, tag, type, rules, allocation, placement, message, field, prevfield, ptr) \ - PB_ANONYMOUS_ONEOF_ ## allocation(union_name, tag, message, field, \ - PB_DATAOFFSET_ ## placement(message, field, prevfield), \ - PB_LTYPE_MAP_ ## type, ptr) - -/* These macros are used for giving out error messages. - * They are mostly a debugging aid; the main error information - * is the true/false return value from functions. - * Some code space can be saved by disabling the error - * messages if not used. - * - * PB_SET_ERROR() sets the error message if none has been set yet. - * msg must be a constant string literal. - * PB_GET_ERROR() always returns a pointer to a string. - * PB_RETURN_ERROR() sets the error and returns false from current - * function. - */ -#ifdef PB_NO_ERRMSG -#define PB_SET_ERROR(stream, msg) PB_UNUSED(stream) -#define PB_GET_ERROR(stream) "(errmsg disabled)" -#else -#define PB_SET_ERROR(stream, msg) (stream->errmsg = (stream)->errmsg ? (stream)->errmsg : (msg)) -#define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)") -#endif - -#define PB_RETURN_ERROR(stream, msg) return PB_SET_ERROR(stream, msg), false - -#endif diff --git a/Pods/nanopb/pb_common.c b/Pods/nanopb/pb_common.c deleted file mode 100644 index 4fb7186b7..000000000 --- a/Pods/nanopb/pb_common.c +++ /dev/null @@ -1,97 +0,0 @@ -/* pb_common.c: Common support functions for pb_encode.c and pb_decode.c. - * - * 2014 Petteri Aimonen - */ - -#include "pb_common.h" - -bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_field_t *fields, void *dest_struct) -{ - iter->start = fields; - iter->pos = fields; - iter->required_field_index = 0; - iter->dest_struct = dest_struct; - iter->pData = (char*)dest_struct + iter->pos->data_offset; - iter->pSize = (char*)iter->pData + iter->pos->size_offset; - - return (iter->pos->tag != 0); -} - -bool pb_field_iter_next(pb_field_iter_t *iter) -{ - const pb_field_t *prev_field = iter->pos; - - if (prev_field->tag == 0) - { - /* Handle empty message types, where the first field is already the terminator. - * In other cases, the iter->pos never points to the terminator. */ - return false; - } - - iter->pos++; - - if (iter->pos->tag == 0) - { - /* Wrapped back to beginning, reinitialize */ - (void)pb_field_iter_begin(iter, iter->start, iter->dest_struct); - return false; - } - else - { - /* Increment the pointers based on previous field size */ - size_t prev_size = prev_field->data_size; - - if (PB_HTYPE(prev_field->type) == PB_HTYPE_ONEOF && - PB_HTYPE(iter->pos->type) == PB_HTYPE_ONEOF && - iter->pos->data_offset == PB_SIZE_MAX) - { - /* Don't advance pointers inside unions */ - return true; - } - else if (PB_ATYPE(prev_field->type) == PB_ATYPE_STATIC && - PB_HTYPE(prev_field->type) == PB_HTYPE_REPEATED) - { - /* In static arrays, the data_size tells the size of a single entry and - * array_size is the number of entries */ - prev_size *= prev_field->array_size; - } - else if (PB_ATYPE(prev_field->type) == PB_ATYPE_POINTER) - { - /* Pointer fields always have a constant size in the main structure. - * The data_size only applies to the dynamically allocated area. */ - prev_size = sizeof(void*); - } - - if (PB_HTYPE(prev_field->type) == PB_HTYPE_REQUIRED) - { - /* Count the required fields, in order to check their presence in the - * decoder. */ - iter->required_field_index++; - } - - iter->pData = (char*)iter->pData + prev_size + iter->pos->data_offset; - iter->pSize = (char*)iter->pData + iter->pos->size_offset; - return true; - } -} - -bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag) -{ - const pb_field_t *start = iter->pos; - - do { - if (iter->pos->tag == tag && - PB_LTYPE(iter->pos->type) != PB_LTYPE_EXTENSION) - { - /* Found the wanted field */ - return true; - } - - (void)pb_field_iter_next(iter); - } while (iter->pos != start); - - /* Searched all the way back to start, and found nothing. */ - return false; -} - - diff --git a/Pods/nanopb/pb_common.h b/Pods/nanopb/pb_common.h deleted file mode 100644 index 60b3d3749..000000000 --- a/Pods/nanopb/pb_common.h +++ /dev/null @@ -1,42 +0,0 @@ -/* pb_common.h: Common support functions for pb_encode.c and pb_decode.c. - * These functions are rarely needed by applications directly. - */ - -#ifndef PB_COMMON_H_INCLUDED -#define PB_COMMON_H_INCLUDED - -#include "pb.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Iterator for pb_field_t list */ -struct pb_field_iter_s { - const pb_field_t *start; /* Start of the pb_field_t array */ - const pb_field_t *pos; /* Current position of the iterator */ - unsigned required_field_index; /* Zero-based index that counts only the required fields */ - void *dest_struct; /* Pointer to start of the structure */ - void *pData; /* Pointer to current field value */ - void *pSize; /* Pointer to count/has field */ -}; -typedef struct pb_field_iter_s pb_field_iter_t; - -/* Initialize the field iterator structure to beginning. - * Returns false if the message type is empty. */ -bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_field_t *fields, void *dest_struct); - -/* Advance the iterator to the next field. - * Returns false when the iterator wraps back to the first field. */ -bool pb_field_iter_next(pb_field_iter_t *iter); - -/* Advance the iterator until it points at a field with the given tag. - * Returns false if no such field exists. */ -bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif - diff --git a/Pods/nanopb/pb_decode.c b/Pods/nanopb/pb_decode.c deleted file mode 100644 index e2e90caab..000000000 --- a/Pods/nanopb/pb_decode.c +++ /dev/null @@ -1,1379 +0,0 @@ -/* pb_decode.c -- decode a protobuf using minimal resources - * - * 2011 Petteri Aimonen - */ - -/* Use the GCC warn_unused_result attribute to check that all return values - * are propagated correctly. On other compilers and gcc before 3.4.0 just - * ignore the annotation. - */ -#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) - #define checkreturn -#else - #define checkreturn __attribute__((warn_unused_result)) -#endif - -#include "pb.h" -#include "pb_decode.h" -#include "pb_common.h" - -/************************************** - * Declarations internal to this file * - **************************************/ - -typedef bool (*pb_decoder_t)(pb_istream_t *stream, const pb_field_t *field, void *dest) checkreturn; - -static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count); -static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size); -static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter); -static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter); -static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter); -static void iter_from_extension(pb_field_iter_t *iter, pb_extension_t *extension); -static bool checkreturn default_extension_decoder(pb_istream_t *stream, pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type); -static bool checkreturn decode_extension(pb_istream_t *stream, uint32_t tag, pb_wire_type_t wire_type, pb_field_iter_t *iter); -static bool checkreturn find_extension_field(pb_field_iter_t *iter); -static void pb_field_set_to_default(pb_field_iter_t *iter); -static void pb_message_set_to_defaults(const pb_field_t fields[], void *dest_struct); -static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, void *dest); -static bool checkreturn pb_dec_uvarint(pb_istream_t *stream, const pb_field_t *field, void *dest); -static bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, void *dest); -static bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest); -static bool checkreturn pb_dec_fixed64(pb_istream_t *stream, const pb_field_t *field, void *dest); -static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest); -static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_t *field, void *dest); -static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field, void *dest); -static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest); -static bool checkreturn pb_skip_varint(pb_istream_t *stream); -static bool checkreturn pb_skip_string(pb_istream_t *stream); - -#ifdef PB_ENABLE_MALLOC -static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size); -static bool checkreturn pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *iter); -static void pb_release_single_field(const pb_field_iter_t *iter); -#endif - -/* --- Function pointers to field decoders --- - * Order in the array must match pb_action_t LTYPE numbering. - */ -static const pb_decoder_t PB_DECODERS[PB_LTYPES_COUNT] = { - &pb_dec_varint, - &pb_dec_uvarint, - &pb_dec_svarint, - &pb_dec_fixed32, - &pb_dec_fixed64, - - &pb_dec_bytes, - &pb_dec_string, - &pb_dec_submessage, - NULL, /* extensions */ - &pb_dec_fixed_length_bytes -}; - -/******************************* - * pb_istream_t implementation * - *******************************/ - -static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count) -{ - size_t i; - const pb_byte_t *source = (const pb_byte_t*)stream->state; - stream->state = (pb_byte_t*)stream->state + count; - - if (buf != NULL) - { - for (i = 0; i < count; i++) - buf[i] = source[i]; - } - - return true; -} - -bool checkreturn pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count) -{ -#ifndef PB_BUFFER_ONLY - if (buf == NULL && stream->callback != buf_read) - { - /* Skip input bytes */ - pb_byte_t tmp[16]; - while (count > 16) - { - if (!pb_read(stream, tmp, 16)) - return false; - - count -= 16; - } - - return pb_read(stream, tmp, count); - } -#endif - - if (stream->bytes_left < count) - PB_RETURN_ERROR(stream, "end-of-stream"); - -#ifndef PB_BUFFER_ONLY - if (!stream->callback(stream, buf, count)) - PB_RETURN_ERROR(stream, "io error"); -#else - if (!buf_read(stream, buf, count)) - return false; -#endif - - stream->bytes_left -= count; - return true; -} - -/* Read a single byte from input stream. buf may not be NULL. - * This is an optimization for the varint decoding. */ -static bool checkreturn pb_readbyte(pb_istream_t *stream, pb_byte_t *buf) -{ - if (stream->bytes_left == 0) - PB_RETURN_ERROR(stream, "end-of-stream"); - -#ifndef PB_BUFFER_ONLY - if (!stream->callback(stream, buf, 1)) - PB_RETURN_ERROR(stream, "io error"); -#else - *buf = *(const pb_byte_t*)stream->state; - stream->state = (pb_byte_t*)stream->state + 1; -#endif - - stream->bytes_left--; - - return true; -} - -pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize) -{ - pb_istream_t stream; - /* Cast away the const from buf without a compiler error. We are - * careful to use it only in a const manner in the callbacks. - */ - union { - void *state; - const void *c_state; - } state; -#ifdef PB_BUFFER_ONLY - stream.callback = NULL; -#else - stream.callback = &buf_read; -#endif - state.c_state = buf; - stream.state = state.state; - stream.bytes_left = bufsize; -#ifndef PB_NO_ERRMSG - stream.errmsg = NULL; -#endif - return stream; -} - -/******************** - * Helper functions * - ********************/ - -bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest) -{ - pb_byte_t byte; - uint32_t result; - - if (!pb_readbyte(stream, &byte)) - return false; - - if ((byte & 0x80) == 0) - { - /* Quick case, 1 byte value */ - result = byte; - } - else - { - /* Multibyte case */ - uint_fast8_t bitpos = 7; - result = byte & 0x7F; - - do - { - if (bitpos >= 32) - PB_RETURN_ERROR(stream, "varint overflow"); - - if (!pb_readbyte(stream, &byte)) - return false; - - result |= (uint32_t)(byte & 0x7F) << bitpos; - bitpos = (uint_fast8_t)(bitpos + 7); - } while (byte & 0x80); - } - - *dest = result; - return true; -} - -bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest) -{ - pb_byte_t byte; - uint_fast8_t bitpos = 0; - uint64_t result = 0; - - do - { - if (bitpos >= 64) - PB_RETURN_ERROR(stream, "varint overflow"); - - if (!pb_readbyte(stream, &byte)) - return false; - - result |= (uint64_t)(byte & 0x7F) << bitpos; - bitpos = (uint_fast8_t)(bitpos + 7); - } while (byte & 0x80); - - *dest = result; - return true; -} - -bool checkreturn pb_skip_varint(pb_istream_t *stream) -{ - pb_byte_t byte; - do - { - if (!pb_read(stream, &byte, 1)) - return false; - } while (byte & 0x80); - return true; -} - -bool checkreturn pb_skip_string(pb_istream_t *stream) -{ - uint32_t length; - if (!pb_decode_varint32(stream, &length)) - return false; - - return pb_read(stream, NULL, length); -} - -bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof) -{ - uint32_t temp; - *eof = false; - *wire_type = (pb_wire_type_t) 0; - *tag = 0; - - if (!pb_decode_varint32(stream, &temp)) - { - if (stream->bytes_left == 0) - *eof = true; - - return false; - } - - if (temp == 0) - { - *eof = true; /* Special feature: allow 0-terminated messages. */ - return false; - } - - *tag = temp >> 3; - *wire_type = (pb_wire_type_t)(temp & 7); - return true; -} - -bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type) -{ - switch (wire_type) - { - case PB_WT_VARINT: return pb_skip_varint(stream); - case PB_WT_64BIT: return pb_read(stream, NULL, 8); - case PB_WT_STRING: return pb_skip_string(stream); - case PB_WT_32BIT: return pb_read(stream, NULL, 4); - default: PB_RETURN_ERROR(stream, "invalid wire_type"); - } -} - -/* Read a raw value to buffer, for the purpose of passing it to callback as - * a substream. Size is maximum size on call, and actual size on return. - */ -static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size) -{ - size_t max_size = *size; - switch (wire_type) - { - case PB_WT_VARINT: - *size = 0; - do - { - (*size)++; - if (*size > max_size) return false; - if (!pb_read(stream, buf, 1)) return false; - } while (*buf++ & 0x80); - return true; - - case PB_WT_64BIT: - *size = 8; - return pb_read(stream, buf, 8); - - case PB_WT_32BIT: - *size = 4; - return pb_read(stream, buf, 4); - - default: PB_RETURN_ERROR(stream, "invalid wire_type"); - } -} - -/* Decode string length from stream and return a substream with limited length. - * Remember to close the substream using pb_close_string_substream(). - */ -bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream) -{ - uint32_t size; - if (!pb_decode_varint32(stream, &size)) - return false; - - *substream = *stream; - if (substream->bytes_left < size) - PB_RETURN_ERROR(stream, "parent stream too short"); - - substream->bytes_left = size; - stream->bytes_left -= size; - return true; -} - -bool checkreturn pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream) -{ - if (substream->bytes_left) { - if (!pb_read(substream, NULL, substream->bytes_left)) - return false; - } - - stream->state = substream->state; - -#ifndef PB_NO_ERRMSG - stream->errmsg = substream->errmsg; -#endif - return true; -} - -/************************* - * Decode a single field * - *************************/ - -static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) -{ - pb_type_t type; - pb_decoder_t func; - - type = iter->pos->type; - func = PB_DECODERS[PB_LTYPE(type)]; - - switch (PB_HTYPE(type)) - { - case PB_HTYPE_REQUIRED: - return func(stream, iter->pos, iter->pData); - - case PB_HTYPE_OPTIONAL: - if (iter->pSize != iter->pData) - *(bool*)iter->pSize = true; - return func(stream, iter->pos, iter->pData); - - case PB_HTYPE_REPEATED: - if (wire_type == PB_WT_STRING - && PB_LTYPE(type) <= PB_LTYPE_LAST_PACKABLE) - { - /* Packed array */ - bool status = true; - pb_size_t *size = (pb_size_t*)iter->pSize; - pb_istream_t substream; - if (!pb_make_string_substream(stream, &substream)) - return false; - - while (substream.bytes_left > 0 && *size < iter->pos->array_size) - { - void *pItem = (char*)iter->pData + iter->pos->data_size * (*size); - if (!func(&substream, iter->pos, pItem)) - { - status = false; - break; - } - (*size)++; - } - - if (substream.bytes_left != 0) - PB_RETURN_ERROR(stream, "array overflow"); - if (!pb_close_string_substream(stream, &substream)) - return false; - - return status; - } - else - { - /* Repeated field */ - pb_size_t *size = (pb_size_t*)iter->pSize; - void *pItem = (char*)iter->pData + iter->pos->data_size * (*size); - if (*size >= iter->pos->array_size) - PB_RETURN_ERROR(stream, "array overflow"); - - (*size)++; - return func(stream, iter->pos, pItem); - } - - case PB_HTYPE_ONEOF: - *(pb_size_t*)iter->pSize = iter->pos->tag; - if (PB_LTYPE(type) == PB_LTYPE_SUBMESSAGE) - { - /* We memset to zero so that any callbacks are set to NULL. - * Then set any default values. */ - memset(iter->pData, 0, iter->pos->data_size); - pb_message_set_to_defaults((const pb_field_t*)iter->pos->ptr, iter->pData); - } - return func(stream, iter->pos, iter->pData); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -#ifdef PB_ENABLE_MALLOC -/* Allocate storage for the field and store the pointer at iter->pData. - * array_size is the number of entries to reserve in an array. - * Zero size is not allowed, use pb_free() for releasing. - */ -static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size) -{ - void *ptr = *(void**)pData; - - if (data_size == 0 || array_size == 0) - PB_RETURN_ERROR(stream, "invalid size"); - - /* Check for multiplication overflows. - * This code avoids the costly division if the sizes are small enough. - * Multiplication is safe as long as only half of bits are set - * in either multiplicand. - */ - { - const size_t check_limit = (size_t)1 << (sizeof(size_t) * 4); - if (data_size >= check_limit || array_size >= check_limit) - { - const size_t size_max = (size_t)-1; - if (size_max / array_size < data_size) - { - PB_RETURN_ERROR(stream, "size too large"); - } - } - } - - /* Allocate new or expand previous allocation */ - /* Note: on failure the old pointer will remain in the structure, - * the message must be freed by caller also on error return. */ - ptr = pb_realloc(ptr, array_size * data_size); - if (ptr == NULL) - PB_RETURN_ERROR(stream, "realloc failed"); - - *(void**)pData = ptr; - return true; -} - -/* Clear a newly allocated item in case it contains a pointer, or is a submessage. */ -static void initialize_pointer_field(void *pItem, pb_field_iter_t *iter) -{ - if (PB_LTYPE(iter->pos->type) == PB_LTYPE_STRING || - PB_LTYPE(iter->pos->type) == PB_LTYPE_BYTES) - { - *(void**)pItem = NULL; - } - else if (PB_LTYPE(iter->pos->type) == PB_LTYPE_SUBMESSAGE) - { - pb_message_set_to_defaults((const pb_field_t *) iter->pos->ptr, pItem); - } -} -#endif - -static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) -{ -#ifndef PB_ENABLE_MALLOC - PB_UNUSED(wire_type); - PB_UNUSED(iter); - PB_RETURN_ERROR(stream, "no malloc support"); -#else - pb_type_t type; - pb_decoder_t func; - - type = iter->pos->type; - func = PB_DECODERS[PB_LTYPE(type)]; - - switch (PB_HTYPE(type)) - { - case PB_HTYPE_REQUIRED: - case PB_HTYPE_OPTIONAL: - case PB_HTYPE_ONEOF: - if (PB_LTYPE(type) == PB_LTYPE_SUBMESSAGE && - *(void**)iter->pData != NULL) - { - /* Duplicate field, have to release the old allocation first. */ - pb_release_single_field(iter); - } - - if (PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - *(pb_size_t*)iter->pSize = iter->pos->tag; - } - - if (PB_LTYPE(type) == PB_LTYPE_STRING || - PB_LTYPE(type) == PB_LTYPE_BYTES) - { - return func(stream, iter->pos, iter->pData); - } - else - { - if (!allocate_field(stream, iter->pData, iter->pos->data_size, 1)) - return false; - - initialize_pointer_field(*(void**)iter->pData, iter); - return func(stream, iter->pos, *(void**)iter->pData); - } - - case PB_HTYPE_REPEATED: - if (wire_type == PB_WT_STRING - && PB_LTYPE(type) <= PB_LTYPE_LAST_PACKABLE) - { - /* Packed array, multiple items come in at once. */ - bool status = true; - pb_size_t *size = (pb_size_t*)iter->pSize; - size_t allocated_size = *size; - void *pItem; - pb_istream_t substream; - - if (!pb_make_string_substream(stream, &substream)) - return false; - - while (substream.bytes_left) - { - if ((size_t)*size + 1 > allocated_size) - { - /* Allocate more storage. This tries to guess the - * number of remaining entries. Round the division - * upwards. */ - allocated_size += (substream.bytes_left - 1) / iter->pos->data_size + 1; - - if (!allocate_field(&substream, iter->pData, iter->pos->data_size, allocated_size)) - { - status = false; - break; - } - } - - /* Decode the array entry */ - pItem = *(char**)iter->pData + iter->pos->data_size * (*size); - initialize_pointer_field(pItem, iter); - if (!func(&substream, iter->pos, pItem)) - { - status = false; - break; - } - - if (*size == PB_SIZE_MAX) - { -#ifndef PB_NO_ERRMSG - stream->errmsg = "too many array entries"; -#endif - status = false; - break; - } - - (*size)++; - } - if (!pb_close_string_substream(stream, &substream)) - return false; - - return status; - } - else - { - /* Normal repeated field, i.e. only one item at a time. */ - pb_size_t *size = (pb_size_t*)iter->pSize; - void *pItem; - - if (*size == PB_SIZE_MAX) - PB_RETURN_ERROR(stream, "too many array entries"); - - (*size)++; - if (!allocate_field(stream, iter->pData, iter->pos->data_size, *size)) - return false; - - pItem = *(char**)iter->pData + iter->pos->data_size * (*size - 1); - initialize_pointer_field(pItem, iter); - return func(stream, iter->pos, pItem); - } - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -#endif -} - -static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) -{ - pb_callback_t *pCallback = (pb_callback_t*)iter->pData; - -#ifdef PB_OLD_CALLBACK_STYLE - void *arg = pCallback->arg; -#else - void **arg = &(pCallback->arg); -#endif - - if (pCallback->funcs.decode == NULL) - return pb_skip_field(stream, wire_type); - - if (wire_type == PB_WT_STRING) - { - pb_istream_t substream; - - if (!pb_make_string_substream(stream, &substream)) - return false; - - do - { - if (!pCallback->funcs.decode(&substream, iter->pos, arg)) - PB_RETURN_ERROR(stream, "callback failed"); - } while (substream.bytes_left); - - if (!pb_close_string_substream(stream, &substream)) - return false; - - return true; - } - else - { - /* Copy the single scalar value to stack. - * This is required so that we can limit the stream length, - * which in turn allows to use same callback for packed and - * not-packed fields. */ - pb_istream_t substream; - pb_byte_t buffer[10]; - size_t size = sizeof(buffer); - - if (!read_raw_value(stream, wire_type, buffer, &size)) - return false; - substream = pb_istream_from_buffer(buffer, size); - - return pCallback->funcs.decode(&substream, iter->pos, arg); - } -} - -static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) -{ -#ifdef PB_ENABLE_MALLOC - /* When decoding an oneof field, check if there is old data that must be - * released first. */ - if (PB_HTYPE(iter->pos->type) == PB_HTYPE_ONEOF) - { - if (!pb_release_union_field(stream, iter)) - return false; - } -#endif - - switch (PB_ATYPE(iter->pos->type)) - { - case PB_ATYPE_STATIC: - return decode_static_field(stream, wire_type, iter); - - case PB_ATYPE_POINTER: - return decode_pointer_field(stream, wire_type, iter); - - case PB_ATYPE_CALLBACK: - return decode_callback_field(stream, wire_type, iter); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -static void iter_from_extension(pb_field_iter_t *iter, pb_extension_t *extension) -{ - /* Fake a field iterator for the extension field. - * It is not actually safe to advance this iterator, but decode_field - * will not even try to. */ - const pb_field_t *field = (const pb_field_t*)extension->type->arg; - (void)pb_field_iter_begin(iter, field, extension->dest); - iter->pData = extension->dest; - iter->pSize = &extension->found; - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { - /* For pointer extensions, the pointer is stored directly - * in the extension structure. This avoids having an extra - * indirection. */ - iter->pData = &extension->dest; - } -} - -/* Default handler for extension fields. Expects a pb_field_t structure - * in extension->type->arg. */ -static bool checkreturn default_extension_decoder(pb_istream_t *stream, - pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type) -{ - const pb_field_t *field = (const pb_field_t*)extension->type->arg; - pb_field_iter_t iter; - - if (field->tag != tag) - return true; - - iter_from_extension(&iter, extension); - extension->found = true; - return decode_field(stream, wire_type, &iter); -} - -/* Try to decode an unknown field as an extension field. Tries each extension - * decoder in turn, until one of them handles the field or loop ends. */ -static bool checkreturn decode_extension(pb_istream_t *stream, - uint32_t tag, pb_wire_type_t wire_type, pb_field_iter_t *iter) -{ - pb_extension_t *extension = *(pb_extension_t* const *)iter->pData; - size_t pos = stream->bytes_left; - - while (extension != NULL && pos == stream->bytes_left) - { - bool status; - if (extension->type->decode) - status = extension->type->decode(stream, extension, tag, wire_type); - else - status = default_extension_decoder(stream, extension, tag, wire_type); - - if (!status) - return false; - - extension = extension->next; - } - - return true; -} - -/* Step through the iterator until an extension field is found or until all - * entries have been checked. There can be only one extension field per - * message. Returns false if no extension field is found. */ -static bool checkreturn find_extension_field(pb_field_iter_t *iter) -{ - const pb_field_t *start = iter->pos; - - do { - if (PB_LTYPE(iter->pos->type) == PB_LTYPE_EXTENSION) - return true; - (void)pb_field_iter_next(iter); - } while (iter->pos != start); - - return false; -} - -/* Initialize message fields to default values, recursively */ -static void pb_field_set_to_default(pb_field_iter_t *iter) -{ - pb_type_t type; - type = iter->pos->type; - - if (PB_LTYPE(type) == PB_LTYPE_EXTENSION) - { - pb_extension_t *ext = *(pb_extension_t* const *)iter->pData; - while (ext != NULL) - { - pb_field_iter_t ext_iter; - ext->found = false; - iter_from_extension(&ext_iter, ext); - pb_field_set_to_default(&ext_iter); - ext = ext->next; - } - } - else if (PB_ATYPE(type) == PB_ATYPE_STATIC) - { - bool init_data = true; - if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && iter->pSize != iter->pData) - { - /* Set has_field to false. Still initialize the optional field - * itself also. */ - *(bool*)iter->pSize = false; - } - else if (PB_HTYPE(type) == PB_HTYPE_REPEATED || - PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - /* REPEATED: Set array count to 0, no need to initialize contents. - ONEOF: Set which_field to 0. */ - *(pb_size_t*)iter->pSize = 0; - init_data = false; - } - - if (init_data) - { - if (PB_LTYPE(iter->pos->type) == PB_LTYPE_SUBMESSAGE) - { - /* Initialize submessage to defaults */ - pb_message_set_to_defaults((const pb_field_t *) iter->pos->ptr, iter->pData); - } - else if (iter->pos->ptr != NULL) - { - /* Initialize to default value */ - memcpy(iter->pData, iter->pos->ptr, iter->pos->data_size); - } - else - { - /* Initialize to zeros */ - memset(iter->pData, 0, iter->pos->data_size); - } - } - } - else if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - /* Initialize the pointer to NULL. */ - *(void**)iter->pData = NULL; - - /* Initialize array count to 0. */ - if (PB_HTYPE(type) == PB_HTYPE_REPEATED || - PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - *(pb_size_t*)iter->pSize = 0; - } - } - else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK) - { - /* Don't overwrite callback */ - } -} - -static void pb_message_set_to_defaults(const pb_field_t fields[], void *dest_struct) -{ - pb_field_iter_t iter; - - if (!pb_field_iter_begin(&iter, fields, dest_struct)) - return; /* Empty message type */ - - do - { - pb_field_set_to_default(&iter); - } while (pb_field_iter_next(&iter)); -} - -/********************* - * Decode all fields * - *********************/ - -bool checkreturn pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) -{ - uint32_t fields_seen[(PB_MAX_REQUIRED_FIELDS + 31) / 32] = {0, 0}; - const uint32_t allbits = ~(uint32_t)0; - uint32_t extension_range_start = 0; - pb_field_iter_t iter; - - /* Return value ignored, as empty message types will be correctly handled by - * pb_field_iter_find() anyway. */ - (void)pb_field_iter_begin(&iter, fields, dest_struct); - - while (stream->bytes_left) - { - uint32_t tag; - pb_wire_type_t wire_type; - bool eof; - - if (!pb_decode_tag(stream, &wire_type, &tag, &eof)) - { - if (eof) - break; - else - return false; - } - - if (!pb_field_iter_find(&iter, tag)) - { - /* No match found, check if it matches an extension. */ - if (tag >= extension_range_start) - { - if (!find_extension_field(&iter)) - extension_range_start = (uint32_t)-1; - else - extension_range_start = iter.pos->tag; - - if (tag >= extension_range_start) - { - size_t pos = stream->bytes_left; - - if (!decode_extension(stream, tag, wire_type, &iter)) - return false; - - if (pos != stream->bytes_left) - { - /* The field was handled */ - continue; - } - } - } - - /* No match found, skip data */ - if (!pb_skip_field(stream, wire_type)) - return false; - continue; - } - - if (PB_HTYPE(iter.pos->type) == PB_HTYPE_REQUIRED - && iter.required_field_index < PB_MAX_REQUIRED_FIELDS) - { - uint32_t tmp = ((uint32_t)1 << (iter.required_field_index & 31)); - fields_seen[iter.required_field_index >> 5] |= tmp; - } - - if (!decode_field(stream, wire_type, &iter)) - return false; - } - - /* Check that all required fields were present. */ - { - /* First figure out the number of required fields by - * seeking to the end of the field array. Usually we - * are already close to end after decoding. - */ - unsigned req_field_count; - pb_type_t last_type; - unsigned i; - do { - req_field_count = iter.required_field_index; - last_type = iter.pos->type; - } while (pb_field_iter_next(&iter)); - - /* Fixup if last field was also required. */ - if (PB_HTYPE(last_type) == PB_HTYPE_REQUIRED && iter.pos->tag != 0) - req_field_count++; - - if (req_field_count > 0) - { - /* Check the whole words */ - for (i = 0; i < (req_field_count >> 5); i++) - { - if (fields_seen[i] != allbits) - PB_RETURN_ERROR(stream, "missing required field"); - } - - /* Check the remaining bits */ - if (fields_seen[req_field_count >> 5] != (allbits >> (32 - (req_field_count & 31)))) - PB_RETURN_ERROR(stream, "missing required field"); - } - } - - return true; -} - -bool checkreturn pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) -{ - bool status; - pb_message_set_to_defaults(fields, dest_struct); - status = pb_decode_noinit(stream, fields, dest_struct); - -#ifdef PB_ENABLE_MALLOC - if (!status) - pb_release(fields, dest_struct); -#endif - - return status; -} - -bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) -{ - pb_istream_t substream; - bool status; - - if (!pb_make_string_substream(stream, &substream)) - return false; - - status = pb_decode(&substream, fields, dest_struct); - - if (!pb_close_string_substream(stream, &substream)) - return false; - return status; -} - -#ifdef PB_ENABLE_MALLOC -/* Given an oneof field, if there has already been a field inside this oneof, - * release it before overwriting with a different one. */ -static bool pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *iter) -{ - pb_size_t old_tag = *(pb_size_t*)iter->pSize; /* Previous which_ value */ - pb_size_t new_tag = iter->pos->tag; /* New which_ value */ - - if (old_tag == 0) - return true; /* Ok, no old data in union */ - - if (old_tag == new_tag) - return true; /* Ok, old data is of same type => merge */ - - /* Release old data. The find can fail if the message struct contains - * invalid data. */ - if (!pb_field_iter_find(iter, old_tag)) - PB_RETURN_ERROR(stream, "invalid union tag"); - - pb_release_single_field(iter); - - /* Restore iterator to where it should be. - * This shouldn't fail unless the pb_field_t structure is corrupted. */ - if (!pb_field_iter_find(iter, new_tag)) - PB_RETURN_ERROR(stream, "iterator error"); - - return true; -} - -static void pb_release_single_field(const pb_field_iter_t *iter) -{ - pb_type_t type; - type = iter->pos->type; - - if (PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - if (*(pb_size_t*)iter->pSize != iter->pos->tag) - return; /* This is not the current field in the union */ - } - - /* Release anything contained inside an extension or submsg. - * This has to be done even if the submsg itself is statically - * allocated. */ - if (PB_LTYPE(type) == PB_LTYPE_EXTENSION) - { - /* Release fields from all extensions in the linked list */ - pb_extension_t *ext = *(pb_extension_t**)iter->pData; - while (ext != NULL) - { - pb_field_iter_t ext_iter; - iter_from_extension(&ext_iter, ext); - pb_release_single_field(&ext_iter); - ext = ext->next; - } - } - else if (PB_LTYPE(type) == PB_LTYPE_SUBMESSAGE) - { - /* Release fields in submessage or submsg array */ - void *pItem = iter->pData; - pb_size_t count = 1; - - if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - pItem = *(void**)iter->pData; - } - - if (PB_HTYPE(type) == PB_HTYPE_REPEATED) - { - count = *(pb_size_t*)iter->pSize; - - if (PB_ATYPE(type) == PB_ATYPE_STATIC && count > iter->pos->array_size) - { - /* Protect against corrupted _count fields */ - count = iter->pos->array_size; - } - } - - if (pItem) - { - while (count--) - { - pb_release((const pb_field_t*)iter->pos->ptr, pItem); - pItem = (char*)pItem + iter->pos->data_size; - } - } - } - - if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - if (PB_HTYPE(type) == PB_HTYPE_REPEATED && - (PB_LTYPE(type) == PB_LTYPE_STRING || - PB_LTYPE(type) == PB_LTYPE_BYTES)) - { - /* Release entries in repeated string or bytes array */ - void **pItem = *(void***)iter->pData; - pb_size_t count = *(pb_size_t*)iter->pSize; - while (count--) - { - pb_free(*pItem); - *pItem++ = NULL; - } - } - - if (PB_HTYPE(type) == PB_HTYPE_REPEATED) - { - /* We are going to release the array, so set the size to 0 */ - *(pb_size_t*)iter->pSize = 0; - } - - /* Release main item */ - pb_free(*(void**)iter->pData); - *(void**)iter->pData = NULL; - } -} - -void pb_release(const pb_field_t fields[], void *dest_struct) -{ - pb_field_iter_t iter; - - if (!dest_struct) - return; /* Ignore NULL pointers, similar to free() */ - - if (!pb_field_iter_begin(&iter, fields, dest_struct)) - return; /* Empty message type */ - - do - { - pb_release_single_field(&iter); - } while (pb_field_iter_next(&iter)); -} -#endif - -/* Field decoders */ - -bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest) -{ - uint64_t value; - if (!pb_decode_varint(stream, &value)) - return false; - - if (value & 1) - *dest = (int64_t)(~(value >> 1)); - else - *dest = (int64_t)(value >> 1); - - return true; -} - -bool pb_decode_fixed32(pb_istream_t *stream, void *dest) -{ - pb_byte_t bytes[4]; - - if (!pb_read(stream, bytes, 4)) - return false; - - *(uint32_t*)dest = ((uint32_t)bytes[0] << 0) | - ((uint32_t)bytes[1] << 8) | - ((uint32_t)bytes[2] << 16) | - ((uint32_t)bytes[3] << 24); - return true; -} - -bool pb_decode_fixed64(pb_istream_t *stream, void *dest) -{ - pb_byte_t bytes[8]; - - if (!pb_read(stream, bytes, 8)) - return false; - - *(uint64_t*)dest = ((uint64_t)bytes[0] << 0) | - ((uint64_t)bytes[1] << 8) | - ((uint64_t)bytes[2] << 16) | - ((uint64_t)bytes[3] << 24) | - ((uint64_t)bytes[4] << 32) | - ((uint64_t)bytes[5] << 40) | - ((uint64_t)bytes[6] << 48) | - ((uint64_t)bytes[7] << 56); - - return true; -} - -static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, void *dest) -{ - uint64_t value; - int64_t svalue; - int64_t clamped; - if (!pb_decode_varint(stream, &value)) - return false; - - /* See issue 97: Google's C++ protobuf allows negative varint values to - * be cast as int32_t, instead of the int64_t that should be used when - * encoding. Previous nanopb versions had a bug in encoding. In order to - * not break decoding of such messages, we cast <=32 bit fields to - * int32_t first to get the sign correct. - */ - if (field->data_size == sizeof(int64_t)) - svalue = (int64_t)value; - else - svalue = (int32_t)value; - - /* Cast to the proper field size, while checking for overflows */ - if (field->data_size == sizeof(int64_t)) - clamped = *(int64_t*)dest = svalue; - else if (field->data_size == sizeof(int32_t)) - clamped = *(int32_t*)dest = (int32_t)svalue; - else if (field->data_size == sizeof(int_least16_t)) - clamped = *(int_least16_t*)dest = (int_least16_t)svalue; - else if (field->data_size == sizeof(int_least8_t)) - clamped = *(int_least8_t*)dest = (int_least8_t)svalue; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - if (clamped != svalue) - PB_RETURN_ERROR(stream, "integer too large"); - - return true; -} - -static bool checkreturn pb_dec_uvarint(pb_istream_t *stream, const pb_field_t *field, void *dest) -{ - uint64_t value, clamped; - if (!pb_decode_varint(stream, &value)) - return false; - - /* Cast to the proper field size, while checking for overflows */ - if (field->data_size == sizeof(uint64_t)) - clamped = *(uint64_t*)dest = value; - else if (field->data_size == sizeof(uint32_t)) - clamped = *(uint32_t*)dest = (uint32_t)value; - else if (field->data_size == sizeof(uint_least16_t)) - clamped = *(uint_least16_t*)dest = (uint_least16_t)value; - else if (field->data_size == sizeof(uint_least8_t)) - clamped = *(uint_least8_t*)dest = (uint_least8_t)value; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - if (clamped != value) - PB_RETURN_ERROR(stream, "integer too large"); - - return true; -} - -static bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, void *dest) -{ - int64_t value, clamped; - if (!pb_decode_svarint(stream, &value)) - return false; - - /* Cast to the proper field size, while checking for overflows */ - if (field->data_size == sizeof(int64_t)) - clamped = *(int64_t*)dest = value; - else if (field->data_size == sizeof(int32_t)) - clamped = *(int32_t*)dest = (int32_t)value; - else if (field->data_size == sizeof(int_least16_t)) - clamped = *(int_least16_t*)dest = (int_least16_t)value; - else if (field->data_size == sizeof(int_least8_t)) - clamped = *(int_least8_t*)dest = (int_least8_t)value; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - if (clamped != value) - PB_RETURN_ERROR(stream, "integer too large"); - - return true; -} - -static bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest) -{ - PB_UNUSED(field); - return pb_decode_fixed32(stream, dest); -} - -static bool checkreturn pb_dec_fixed64(pb_istream_t *stream, const pb_field_t *field, void *dest) -{ - PB_UNUSED(field); - return pb_decode_fixed64(stream, dest); -} - -static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest) -{ - uint32_t size; - size_t alloc_size; - pb_bytes_array_t *bdest; - - if (!pb_decode_varint32(stream, &size)) - return false; - - if (size > PB_SIZE_MAX) - PB_RETURN_ERROR(stream, "bytes overflow"); - - alloc_size = PB_BYTES_ARRAY_T_ALLOCSIZE(size); - if (size > alloc_size) - PB_RETURN_ERROR(stream, "size too large"); - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { -#ifndef PB_ENABLE_MALLOC - PB_RETURN_ERROR(stream, "no malloc support"); -#else - if (!allocate_field(stream, dest, alloc_size, 1)) - return false; - bdest = *(pb_bytes_array_t**)dest; -#endif - } - else - { - if (alloc_size > field->data_size) - PB_RETURN_ERROR(stream, "bytes overflow"); - bdest = (pb_bytes_array_t*)dest; - } - - bdest->size = (pb_size_t)size; - return pb_read(stream, bdest->bytes, size); -} - -static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_t *field, void *dest) -{ - uint32_t size; - size_t alloc_size; - bool status; - if (!pb_decode_varint32(stream, &size)) - return false; - - /* Space for null terminator */ - alloc_size = size + 1; - - if (alloc_size < size) - PB_RETURN_ERROR(stream, "size too large"); - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { -#ifndef PB_ENABLE_MALLOC - PB_RETURN_ERROR(stream, "no malloc support"); -#else - if (!allocate_field(stream, dest, alloc_size, 1)) - return false; - dest = *(void**)dest; -#endif - } - else - { - if (alloc_size > field->data_size) - PB_RETURN_ERROR(stream, "string overflow"); - } - - status = pb_read(stream, (pb_byte_t*)dest, size); - *((pb_byte_t*)dest + size) = 0; - return status; -} - -static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field, void *dest) -{ - bool status; - pb_istream_t substream; - const pb_field_t* submsg_fields = (const pb_field_t*)field->ptr; - - if (!pb_make_string_substream(stream, &substream)) - return false; - - if (field->ptr == NULL) - PB_RETURN_ERROR(stream, "invalid field descriptor"); - - /* New array entries need to be initialized, while required and optional - * submessages have already been initialized in the top-level pb_decode. */ - if (PB_HTYPE(field->type) == PB_HTYPE_REPEATED) - status = pb_decode(&substream, submsg_fields, dest); - else - status = pb_decode_noinit(&substream, submsg_fields, dest); - - if (!pb_close_string_substream(stream, &substream)) - return false; - return status; -} - -static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest) -{ - uint32_t size; - - if (!pb_decode_varint32(stream, &size)) - return false; - - if (size > PB_SIZE_MAX) - PB_RETURN_ERROR(stream, "bytes overflow"); - - if (size == 0) - { - /* As a special case, treat empty bytes string as all zeros for fixed_length_bytes. */ - memset(dest, 0, field->data_size); - return true; - } - - if (size != field->data_size) - PB_RETURN_ERROR(stream, "incorrect fixed length bytes size"); - - return pb_read(stream, (pb_byte_t*)dest, field->data_size); -} diff --git a/Pods/nanopb/pb_decode.h b/Pods/nanopb/pb_decode.h deleted file mode 100644 index a426bdd70..000000000 --- a/Pods/nanopb/pb_decode.h +++ /dev/null @@ -1,153 +0,0 @@ -/* pb_decode.h: Functions to decode protocol buffers. Depends on pb_decode.c. - * The main function is pb_decode. You also need an input stream, and the - * field descriptions created by nanopb_generator.py. - */ - -#ifndef PB_DECODE_H_INCLUDED -#define PB_DECODE_H_INCLUDED - -#include "pb.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Structure for defining custom input streams. You will need to provide - * a callback function to read the bytes from your storage, which can be - * for example a file or a network socket. - * - * The callback must conform to these rules: - * - * 1) Return false on IO errors. This will cause decoding to abort. - * 2) You can use state to store your own data (e.g. buffer pointer), - * and rely on pb_read to verify that no-body reads past bytes_left. - * 3) Your callback may be used with substreams, in which case bytes_left - * is different than from the main stream. Don't use bytes_left to compute - * any pointers. - */ -struct pb_istream_s -{ -#ifdef PB_BUFFER_ONLY - /* Callback pointer is not used in buffer-only configuration. - * Having an int pointer here allows binary compatibility but - * gives an error if someone tries to assign callback function. - */ - int *callback; -#else - bool (*callback)(pb_istream_t *stream, pb_byte_t *buf, size_t count); -#endif - - void *state; /* Free field for use by callback implementation */ - size_t bytes_left; - -#ifndef PB_NO_ERRMSG - const char *errmsg; -#endif -}; - -/*************************** - * Main decoding functions * - ***************************/ - -/* Decode a single protocol buffers message from input stream into a C structure. - * Returns true on success, false on any failure. - * The actual struct pointed to by dest must match the description in fields. - * Callback fields of the destination structure must be initialized by caller. - * All other fields will be initialized by this function. - * - * Example usage: - * MyMessage msg = {}; - * uint8_t buffer[64]; - * pb_istream_t stream; - * - * // ... read some data into buffer ... - * - * stream = pb_istream_from_buffer(buffer, count); - * pb_decode(&stream, MyMessage_fields, &msg); - */ -bool pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); - -/* Same as pb_decode, except does not initialize the destination structure - * to default values. This is slightly faster if you need no default values - * and just do memset(struct, 0, sizeof(struct)) yourself. - * - * This can also be used for 'merging' two messages, i.e. update only the - * fields that exist in the new message. - * - * Note: If this function returns with an error, it will not release any - * dynamically allocated fields. You will need to call pb_release() yourself. - */ -bool pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); - -/* Same as pb_decode, except expects the stream to start with the message size - * encoded as varint. Corresponds to parseDelimitedFrom() in Google's - * protobuf API. - */ -bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); - -#ifdef PB_ENABLE_MALLOC -/* Release any allocated pointer fields. If you use dynamic allocation, you should - * call this for any successfully decoded message when you are done with it. If - * pb_decode() returns with an error, the message is already released. - */ -void pb_release(const pb_field_t fields[], void *dest_struct); -#endif - - -/************************************** - * Functions for manipulating streams * - **************************************/ - -/* Create an input stream for reading from a memory buffer. - * - * Alternatively, you can use a custom stream that reads directly from e.g. - * a file or a network socket. - */ -pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize); - -/* Function to read from a pb_istream_t. You can use this if you need to - * read some custom header data, or to read data in field callbacks. - */ -bool pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count); - - -/************************************************ - * Helper functions for writing field callbacks * - ************************************************/ - -/* Decode the tag for the next field in the stream. Gives the wire type and - * field tag. At end of the message, returns false and sets eof to true. */ -bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof); - -/* Skip the field payload data, given the wire type. */ -bool pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type); - -/* Decode an integer in the varint format. This works for bool, enum, int32, - * int64, uint32 and uint64 field types. */ -bool pb_decode_varint(pb_istream_t *stream, uint64_t *dest); - -/* Decode an integer in the varint format. This works for bool, enum, int32, - * and uint32 field types. */ -bool pb_decode_varint32(pb_istream_t *stream, uint32_t *dest); - -/* Decode an integer in the zig-zagged svarint format. This works for sint32 - * and sint64. */ -bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest); - -/* Decode a fixed32, sfixed32 or float value. You need to pass a pointer to - * a 4-byte wide C variable. */ -bool pb_decode_fixed32(pb_istream_t *stream, void *dest); - -/* Decode a fixed64, sfixed64 or double value. You need to pass a pointer to - * a 8-byte wide C variable. */ -bool pb_decode_fixed64(pb_istream_t *stream, void *dest); - -/* Make a limited-length substream for reading a PB_WT_STRING field. */ -bool pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream); -bool pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/Pods/nanopb/pb_encode.c b/Pods/nanopb/pb_encode.c deleted file mode 100644 index 30f60d83b..000000000 --- a/Pods/nanopb/pb_encode.c +++ /dev/null @@ -1,777 +0,0 @@ -/* pb_encode.c -- encode a protobuf using minimal resources - * - * 2011 Petteri Aimonen - */ - -#include "pb.h" -#include "pb_encode.h" -#include "pb_common.h" - -/* Use the GCC warn_unused_result attribute to check that all return values - * are propagated correctly. On other compilers and gcc before 3.4.0 just - * ignore the annotation. - */ -#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) - #define checkreturn -#else - #define checkreturn __attribute__((warn_unused_result)) -#endif - -/************************************** - * Declarations internal to this file * - **************************************/ -typedef bool (*pb_encoder_t)(pb_ostream_t *stream, const pb_field_t *field, const void *src) checkreturn; - -static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); -static bool checkreturn encode_array(pb_ostream_t *stream, const pb_field_t *field, const void *pData, size_t count, pb_encoder_t func); -static bool checkreturn encode_field(pb_ostream_t *stream, const pb_field_t *field, const void *pData); -static bool checkreturn default_extension_encoder(pb_ostream_t *stream, const pb_extension_t *extension); -static bool checkreturn encode_extension_field(pb_ostream_t *stream, const pb_field_t *field, const void *pData); -static void *pb_const_cast(const void *p); -static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_t *field, const void *src); -static bool checkreturn pb_enc_uvarint(pb_ostream_t *stream, const pb_field_t *field, const void *src); -static bool checkreturn pb_enc_svarint(pb_ostream_t *stream, const pb_field_t *field, const void *src); -static bool checkreturn pb_enc_fixed32(pb_ostream_t *stream, const pb_field_t *field, const void *src); -static bool checkreturn pb_enc_fixed64(pb_ostream_t *stream, const pb_field_t *field, const void *src); -static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src); -static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src); -static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src); -static bool checkreturn pb_enc_fixed_length_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src); - -/* --- Function pointers to field encoders --- - * Order in the array must match pb_action_t LTYPE numbering. - */ -static const pb_encoder_t PB_ENCODERS[PB_LTYPES_COUNT] = { - &pb_enc_varint, - &pb_enc_uvarint, - &pb_enc_svarint, - &pb_enc_fixed32, - &pb_enc_fixed64, - - &pb_enc_bytes, - &pb_enc_string, - &pb_enc_submessage, - NULL, /* extensions */ - &pb_enc_fixed_length_bytes -}; - -/******************************* - * pb_ostream_t implementation * - *******************************/ - -static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count) -{ - size_t i; - pb_byte_t *dest = (pb_byte_t*)stream->state; - stream->state = dest + count; - - for (i = 0; i < count; i++) - dest[i] = buf[i]; - - return true; -} - -pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize) -{ - pb_ostream_t stream; -#ifdef PB_BUFFER_ONLY - stream.callback = (void*)1; /* Just a marker value */ -#else - stream.callback = &buf_write; -#endif - stream.state = buf; - stream.max_size = bufsize; - stream.bytes_written = 0; -#ifndef PB_NO_ERRMSG - stream.errmsg = NULL; -#endif - return stream; -} - -bool checkreturn pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count) -{ - if (stream->callback != NULL) - { - if (stream->bytes_written + count > stream->max_size) - PB_RETURN_ERROR(stream, "stream full"); - -#ifdef PB_BUFFER_ONLY - if (!buf_write(stream, buf, count)) - PB_RETURN_ERROR(stream, "io error"); -#else - if (!stream->callback(stream, buf, count)) - PB_RETURN_ERROR(stream, "io error"); -#endif - } - - stream->bytes_written += count; - return true; -} - -/************************* - * Encode a single field * - *************************/ - -/* Encode a static array. Handles the size calculations and possible packing. */ -static bool checkreturn encode_array(pb_ostream_t *stream, const pb_field_t *field, - const void *pData, size_t count, pb_encoder_t func) -{ - size_t i; - const void *p; - size_t size; - - if (count == 0) - return true; - - if (PB_ATYPE(field->type) != PB_ATYPE_POINTER && count > field->array_size) - PB_RETURN_ERROR(stream, "array max size exceeded"); - - /* We always pack arrays if the datatype allows it. */ - if (PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE) - { - if (!pb_encode_tag(stream, PB_WT_STRING, field->tag)) - return false; - - /* Determine the total size of packed array. */ - if (PB_LTYPE(field->type) == PB_LTYPE_FIXED32) - { - size = 4 * count; - } - else if (PB_LTYPE(field->type) == PB_LTYPE_FIXED64) - { - size = 8 * count; - } - else - { - pb_ostream_t sizestream = PB_OSTREAM_SIZING; - p = pData; - for (i = 0; i < count; i++) - { - if (!func(&sizestream, field, p)) - return false; - p = (const char*)p + field->data_size; - } - size = sizestream.bytes_written; - } - - if (!pb_encode_varint(stream, (uint64_t)size)) - return false; - - if (stream->callback == NULL) - return pb_write(stream, NULL, size); /* Just sizing.. */ - - /* Write the data */ - p = pData; - for (i = 0; i < count; i++) - { - if (!func(stream, field, p)) - return false; - p = (const char*)p + field->data_size; - } - } - else - { - p = pData; - for (i = 0; i < count; i++) - { - if (!pb_encode_tag_for_field(stream, field)) - return false; - - /* Normally the data is stored directly in the array entries, but - * for pointer-type string and bytes fields, the array entries are - * actually pointers themselves also. So we have to dereference once - * more to get to the actual data. */ - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER && - (PB_LTYPE(field->type) == PB_LTYPE_STRING || - PB_LTYPE(field->type) == PB_LTYPE_BYTES)) - { - if (!func(stream, field, *(const void* const*)p)) - return false; - } - else - { - if (!func(stream, field, p)) - return false; - } - p = (const char*)p + field->data_size; - } - } - - return true; -} - -/* In proto3, all fields are optional and are only encoded if their value is "non-zero". - * This function implements the check for the zero value. */ -static bool pb_check_proto3_default_value(const pb_field_t *field, const void *pData) -{ - if (PB_ATYPE(field->type) == PB_ATYPE_STATIC) - { - if (PB_LTYPE(field->type) == PB_LTYPE_BYTES) - { - const pb_bytes_array_t *bytes = (const pb_bytes_array_t*)pData; - return bytes->size == 0; - } - else if (PB_LTYPE(field->type) == PB_LTYPE_STRING) - { - return *(const char*)pData == '\0'; - } - else if (PB_LTYPE(field->type) == PB_LTYPE_FIXED_LENGTH_BYTES) - { - /* Fixed length bytes is only empty if its length is fixed - * as 0. Which would be pretty strange, but we can check - * it anyway. */ - return field->data_size == 0; - } - else if (PB_LTYPE(field->type) == PB_LTYPE_SUBMESSAGE) - { - /* Check all fields in the submessage to find if any of them - * are non-zero. The comparison cannot be done byte-per-byte - * because the C struct may contain padding bytes that must - * be skipped. - */ - pb_field_iter_t iter; - if (pb_field_iter_begin(&iter, (const pb_field_t*)field->ptr, pb_const_cast(pData))) - { - do - { - if (!pb_check_proto3_default_value(iter.pos, iter.pData)) - { - return false; - } - } while (pb_field_iter_next(&iter)); - } - return true; - } - } - - { - /* Catch-all branch that does byte-per-byte comparison for zero value. - * - * This is for all pointer fields, and for static PB_LTYPE_VARINT, - * UVARINT, SVARINT, FIXED32, FIXED64, EXTENSION fields, and also - * callback fields. These all have integer or pointer value which - * can be compared with 0. - */ - pb_size_t i; - const char *p = (const char*)pData; - for (i = 0; i < field->data_size; i++) - { - if (p[i] != 0) - { - return false; - } - } - - return true; - } -} - -/* Encode a field with static or pointer allocation, i.e. one whose data - * is available to the encoder directly. */ -static bool checkreturn encode_basic_field(pb_ostream_t *stream, - const pb_field_t *field, const void *pData) -{ - pb_encoder_t func; - bool implicit_has; - const void *pSize = &implicit_has; - - func = PB_ENCODERS[PB_LTYPE(field->type)]; - - if (field->size_offset) - { - /* Static optional, repeated or oneof field */ - pSize = (const char*)pData + field->size_offset; - } - else if (PB_HTYPE(field->type) == PB_HTYPE_OPTIONAL) - { - /* Proto3 style field, optional but without explicit has_ field. */ - implicit_has = !pb_check_proto3_default_value(field, pData); - } - else - { - /* Required field, always present */ - implicit_has = true; - } - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { - /* pData is a pointer to the field, which contains pointer to - * the data. If the 2nd pointer is NULL, it is interpreted as if - * the has_field was false. - */ - pData = *(const void* const*)pData; - implicit_has = (pData != NULL); - } - - switch (PB_HTYPE(field->type)) - { - case PB_HTYPE_REQUIRED: - if (!pData) - PB_RETURN_ERROR(stream, "missing required field"); - if (!pb_encode_tag_for_field(stream, field)) - return false; - if (!func(stream, field, pData)) - return false; - break; - - case PB_HTYPE_OPTIONAL: - if (*(const bool*)pSize) - { - if (!pb_encode_tag_for_field(stream, field)) - return false; - - if (!func(stream, field, pData)) - return false; - } - break; - - case PB_HTYPE_REPEATED: - if (!encode_array(stream, field, pData, *(const pb_size_t*)pSize, func)) - return false; - break; - - case PB_HTYPE_ONEOF: - if (*(const pb_size_t*)pSize == field->tag) - { - if (!pb_encode_tag_for_field(stream, field)) - return false; - - if (!func(stream, field, pData)) - return false; - } - break; - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } - - return true; -} - -/* Encode a field with callback semantics. This means that a user function is - * called to provide and encode the actual data. */ -static bool checkreturn encode_callback_field(pb_ostream_t *stream, - const pb_field_t *field, const void *pData) -{ - const pb_callback_t *callback = (const pb_callback_t*)pData; - -#ifdef PB_OLD_CALLBACK_STYLE - const void *arg = callback->arg; -#else - void * const *arg = &(callback->arg); -#endif - - if (callback->funcs.encode != NULL) - { - if (!callback->funcs.encode(stream, field, arg)) - PB_RETURN_ERROR(stream, "callback error"); - } - return true; -} - -/* Encode a single field of any callback or static type. */ -static bool checkreturn encode_field(pb_ostream_t *stream, - const pb_field_t *field, const void *pData) -{ - switch (PB_ATYPE(field->type)) - { - case PB_ATYPE_STATIC: - case PB_ATYPE_POINTER: - return encode_basic_field(stream, field, pData); - - case PB_ATYPE_CALLBACK: - return encode_callback_field(stream, field, pData); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -/* Default handler for extension fields. Expects to have a pb_field_t - * pointer in the extension->type->arg field. */ -static bool checkreturn default_extension_encoder(pb_ostream_t *stream, - const pb_extension_t *extension) -{ - const pb_field_t *field = (const pb_field_t*)extension->type->arg; - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { - /* For pointer extensions, the pointer is stored directly - * in the extension structure. This avoids having an extra - * indirection. */ - return encode_field(stream, field, &extension->dest); - } - else - { - return encode_field(stream, field, extension->dest); - } -} - -/* Walk through all the registered extensions and give them a chance - * to encode themselves. */ -static bool checkreturn encode_extension_field(pb_ostream_t *stream, - const pb_field_t *field, const void *pData) -{ - const pb_extension_t *extension = *(const pb_extension_t* const *)pData; - PB_UNUSED(field); - - while (extension) - { - bool status; - if (extension->type->encode) - status = extension->type->encode(stream, extension); - else - status = default_extension_encoder(stream, extension); - - if (!status) - return false; - - extension = extension->next; - } - - return true; -} - -/********************* - * Encode all fields * - *********************/ - -static void *pb_const_cast(const void *p) -{ - /* Note: this casts away const, in order to use the common field iterator - * logic for both encoding and decoding. */ - union { - void *p1; - const void *p2; - } t; - t.p2 = p; - return t.p1; -} - -bool checkreturn pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct) -{ - pb_field_iter_t iter; - if (!pb_field_iter_begin(&iter, fields, pb_const_cast(src_struct))) - return true; /* Empty message type */ - - do { - if (PB_LTYPE(iter.pos->type) == PB_LTYPE_EXTENSION) - { - /* Special case for the extension field placeholder */ - if (!encode_extension_field(stream, iter.pos, iter.pData)) - return false; - } - else - { - /* Regular field */ - if (!encode_field(stream, iter.pos, iter.pData)) - return false; - } - } while (pb_field_iter_next(&iter)); - - return true; -} - -bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct) -{ - return pb_encode_submessage(stream, fields, src_struct); -} - -bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct) -{ - pb_ostream_t stream = PB_OSTREAM_SIZING; - - if (!pb_encode(&stream, fields, src_struct)) - return false; - - *size = stream.bytes_written; - return true; -} - -/******************** - * Helper functions * - ********************/ -bool checkreturn pb_encode_varint(pb_ostream_t *stream, uint64_t value) -{ - pb_byte_t buffer[10]; - size_t i = 0; - - if (value <= 0x7F) - { - pb_byte_t v = (pb_byte_t)value; - return pb_write(stream, &v, 1); - } - - while (value) - { - buffer[i] = (pb_byte_t)((value & 0x7F) | 0x80); - value >>= 7; - i++; - } - buffer[i-1] &= 0x7F; /* Unset top bit on last byte */ - - return pb_write(stream, buffer, i); -} - -bool checkreturn pb_encode_svarint(pb_ostream_t *stream, int64_t value) -{ - uint64_t zigzagged; - if (value < 0) - zigzagged = ~((uint64_t)value << 1); - else - zigzagged = (uint64_t)value << 1; - - return pb_encode_varint(stream, zigzagged); -} - -bool checkreturn pb_encode_fixed32(pb_ostream_t *stream, const void *value) -{ - uint32_t val = *(const uint32_t*)value; - pb_byte_t bytes[4]; - bytes[0] = (pb_byte_t)(val & 0xFF); - bytes[1] = (pb_byte_t)((val >> 8) & 0xFF); - bytes[2] = (pb_byte_t)((val >> 16) & 0xFF); - bytes[3] = (pb_byte_t)((val >> 24) & 0xFF); - return pb_write(stream, bytes, 4); -} - -bool checkreturn pb_encode_fixed64(pb_ostream_t *stream, const void *value) -{ - uint64_t val = *(const uint64_t*)value; - pb_byte_t bytes[8]; - bytes[0] = (pb_byte_t)(val & 0xFF); - bytes[1] = (pb_byte_t)((val >> 8) & 0xFF); - bytes[2] = (pb_byte_t)((val >> 16) & 0xFF); - bytes[3] = (pb_byte_t)((val >> 24) & 0xFF); - bytes[4] = (pb_byte_t)((val >> 32) & 0xFF); - bytes[5] = (pb_byte_t)((val >> 40) & 0xFF); - bytes[6] = (pb_byte_t)((val >> 48) & 0xFF); - bytes[7] = (pb_byte_t)((val >> 56) & 0xFF); - return pb_write(stream, bytes, 8); -} - -bool checkreturn pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number) -{ - uint64_t tag = ((uint64_t)field_number << 3) | wiretype; - return pb_encode_varint(stream, tag); -} - -bool checkreturn pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_t *field) -{ - pb_wire_type_t wiretype; - switch (PB_LTYPE(field->type)) - { - case PB_LTYPE_VARINT: - case PB_LTYPE_UVARINT: - case PB_LTYPE_SVARINT: - wiretype = PB_WT_VARINT; - break; - - case PB_LTYPE_FIXED32: - wiretype = PB_WT_32BIT; - break; - - case PB_LTYPE_FIXED64: - wiretype = PB_WT_64BIT; - break; - - case PB_LTYPE_BYTES: - case PB_LTYPE_STRING: - case PB_LTYPE_SUBMESSAGE: - case PB_LTYPE_FIXED_LENGTH_BYTES: - wiretype = PB_WT_STRING; - break; - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } - - return pb_encode_tag(stream, wiretype, field->tag); -} - -bool checkreturn pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size) -{ - if (!pb_encode_varint(stream, (uint64_t)size)) - return false; - - return pb_write(stream, buffer, size); -} - -bool checkreturn pb_encode_submessage(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct) -{ - /* First calculate the message size using a non-writing substream. */ - pb_ostream_t substream = PB_OSTREAM_SIZING; - size_t size; - bool status; - - if (!pb_encode(&substream, fields, src_struct)) - { -#ifndef PB_NO_ERRMSG - stream->errmsg = substream.errmsg; -#endif - return false; - } - - size = substream.bytes_written; - - if (!pb_encode_varint(stream, (uint64_t)size)) - return false; - - if (stream->callback == NULL) - return pb_write(stream, NULL, size); /* Just sizing */ - - if (stream->bytes_written + size > stream->max_size) - PB_RETURN_ERROR(stream, "stream full"); - - /* Use a substream to verify that a callback doesn't write more than - * what it did the first time. */ - substream.callback = stream->callback; - substream.state = stream->state; - substream.max_size = size; - substream.bytes_written = 0; -#ifndef PB_NO_ERRMSG - substream.errmsg = NULL; -#endif - - status = pb_encode(&substream, fields, src_struct); - - stream->bytes_written += substream.bytes_written; - stream->state = substream.state; -#ifndef PB_NO_ERRMSG - stream->errmsg = substream.errmsg; -#endif - - if (substream.bytes_written != size) - PB_RETURN_ERROR(stream, "submsg size changed"); - - return status; -} - -/* Field encoders */ - -static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_t *field, const void *src) -{ - int64_t value = 0; - - if (field->data_size == sizeof(int_least8_t)) - value = *(const int_least8_t*)src; - else if (field->data_size == sizeof(int_least16_t)) - value = *(const int_least16_t*)src; - else if (field->data_size == sizeof(int32_t)) - value = *(const int32_t*)src; - else if (field->data_size == sizeof(int64_t)) - value = *(const int64_t*)src; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - return pb_encode_varint(stream, (uint64_t)value); -} - -static bool checkreturn pb_enc_uvarint(pb_ostream_t *stream, const pb_field_t *field, const void *src) -{ - uint64_t value = 0; - - if (field->data_size == sizeof(uint_least8_t)) - value = *(const uint_least8_t*)src; - else if (field->data_size == sizeof(uint_least16_t)) - value = *(const uint_least16_t*)src; - else if (field->data_size == sizeof(uint32_t)) - value = *(const uint32_t*)src; - else if (field->data_size == sizeof(uint64_t)) - value = *(const uint64_t*)src; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - return pb_encode_varint(stream, value); -} - -static bool checkreturn pb_enc_svarint(pb_ostream_t *stream, const pb_field_t *field, const void *src) -{ - int64_t value = 0; - - if (field->data_size == sizeof(int_least8_t)) - value = *(const int_least8_t*)src; - else if (field->data_size == sizeof(int_least16_t)) - value = *(const int_least16_t*)src; - else if (field->data_size == sizeof(int32_t)) - value = *(const int32_t*)src; - else if (field->data_size == sizeof(int64_t)) - value = *(const int64_t*)src; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - return pb_encode_svarint(stream, value); -} - -static bool checkreturn pb_enc_fixed64(pb_ostream_t *stream, const pb_field_t *field, const void *src) -{ - PB_UNUSED(field); - return pb_encode_fixed64(stream, src); -} - -static bool checkreturn pb_enc_fixed32(pb_ostream_t *stream, const pb_field_t *field, const void *src) -{ - PB_UNUSED(field); - return pb_encode_fixed32(stream, src); -} - -static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src) -{ - const pb_bytes_array_t *bytes = NULL; - - bytes = (const pb_bytes_array_t*)src; - - if (src == NULL) - { - /* Treat null pointer as an empty bytes field */ - return pb_encode_string(stream, NULL, 0); - } - - if (PB_ATYPE(field->type) == PB_ATYPE_STATIC && - PB_BYTES_ARRAY_T_ALLOCSIZE(bytes->size) > field->data_size) - { - PB_RETURN_ERROR(stream, "bytes size exceeded"); - } - - return pb_encode_string(stream, bytes->bytes, bytes->size); -} - -static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src) -{ - size_t size = 0; - size_t max_size = field->data_size; - const char *p = (const char*)src; - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - max_size = (size_t)-1; - - if (src == NULL) - { - size = 0; /* Treat null pointer as an empty string */ - } - else - { - /* strnlen() is not always available, so just use a loop */ - while (size < max_size && *p != '\0') - { - size++; - p++; - } - } - - return pb_encode_string(stream, (const pb_byte_t*)src, size); -} - -static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src) -{ - if (field->ptr == NULL) - PB_RETURN_ERROR(stream, "invalid field descriptor"); - - return pb_encode_submessage(stream, (const pb_field_t*)field->ptr, src); -} - -static bool checkreturn pb_enc_fixed_length_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src) -{ - return pb_encode_string(stream, (const pb_byte_t*)src, field->data_size); -} - diff --git a/Pods/nanopb/pb_encode.h b/Pods/nanopb/pb_encode.h deleted file mode 100644 index d9909fb01..000000000 --- a/Pods/nanopb/pb_encode.h +++ /dev/null @@ -1,154 +0,0 @@ -/* pb_encode.h: Functions to encode protocol buffers. Depends on pb_encode.c. - * The main function is pb_encode. You also need an output stream, and the - * field descriptions created by nanopb_generator.py. - */ - -#ifndef PB_ENCODE_H_INCLUDED -#define PB_ENCODE_H_INCLUDED - -#include "pb.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Structure for defining custom output streams. You will need to provide - * a callback function to write the bytes to your storage, which can be - * for example a file or a network socket. - * - * The callback must conform to these rules: - * - * 1) Return false on IO errors. This will cause encoding to abort. - * 2) You can use state to store your own data (e.g. buffer pointer). - * 3) pb_write will update bytes_written after your callback runs. - * 4) Substreams will modify max_size and bytes_written. Don't use them - * to calculate any pointers. - */ -struct pb_ostream_s -{ -#ifdef PB_BUFFER_ONLY - /* Callback pointer is not used in buffer-only configuration. - * Having an int pointer here allows binary compatibility but - * gives an error if someone tries to assign callback function. - * Also, NULL pointer marks a 'sizing stream' that does not - * write anything. - */ - int *callback; -#else - bool (*callback)(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); -#endif - void *state; /* Free field for use by callback implementation. */ - size_t max_size; /* Limit number of output bytes written (or use SIZE_MAX). */ - size_t bytes_written; /* Number of bytes written so far. */ - -#ifndef PB_NO_ERRMSG - const char *errmsg; -#endif -}; - -/*************************** - * Main encoding functions * - ***************************/ - -/* Encode a single protocol buffers message from C structure into a stream. - * Returns true on success, false on any failure. - * The actual struct pointed to by src_struct must match the description in fields. - * All required fields in the struct are assumed to have been filled in. - * - * Example usage: - * MyMessage msg = {}; - * uint8_t buffer[64]; - * pb_ostream_t stream; - * - * msg.field1 = 42; - * stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); - * pb_encode(&stream, MyMessage_fields, &msg); - */ -bool pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); - -/* Same as pb_encode, but prepends the length of the message as a varint. - * Corresponds to writeDelimitedTo() in Google's protobuf API. - */ -bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); - -/* Encode the message to get the size of the encoded data, but do not store - * the data. */ -bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct); - -/************************************** - * Functions for manipulating streams * - **************************************/ - -/* Create an output stream for writing into a memory buffer. - * The number of bytes written can be found in stream.bytes_written after - * encoding the message. - * - * Alternatively, you can use a custom stream that writes directly to e.g. - * a file or a network socket. - */ -pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize); - -/* Pseudo-stream for measuring the size of a message without actually storing - * the encoded data. - * - * Example usage: - * MyMessage msg = {}; - * pb_ostream_t stream = PB_OSTREAM_SIZING; - * pb_encode(&stream, MyMessage_fields, &msg); - * printf("Message size is %d\n", stream.bytes_written); - */ -#ifndef PB_NO_ERRMSG -#define PB_OSTREAM_SIZING {0,0,0,0,0} -#else -#define PB_OSTREAM_SIZING {0,0,0,0} -#endif - -/* Function to write into a pb_ostream_t stream. You can use this if you need - * to append or prepend some custom headers to the message. - */ -bool pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); - - -/************************************************ - * Helper functions for writing field callbacks * - ************************************************/ - -/* Encode field header based on type and field number defined in the field - * structure. Call this from the callback before writing out field contents. */ -bool pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_t *field); - -/* Encode field header by manually specifing wire type. You need to use this - * if you want to write out packed arrays from a callback field. */ -bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number); - -/* Encode an integer in the varint format. - * This works for bool, enum, int32, int64, uint32 and uint64 field types. */ -bool pb_encode_varint(pb_ostream_t *stream, uint64_t value); - -/* Encode an integer in the zig-zagged svarint format. - * This works for sint32 and sint64. */ -bool pb_encode_svarint(pb_ostream_t *stream, int64_t value); - -/* Encode a string or bytes type field. For strings, pass strlen(s) as size. */ -bool pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size); - -/* Encode a fixed32, sfixed32 or float value. - * You need to pass a pointer to a 4-byte wide C variable. */ -bool pb_encode_fixed32(pb_ostream_t *stream, const void *value); - -/* Encode a fixed64, sfixed64 or double value. - * You need to pass a pointer to a 8-byte wide C variable. */ -bool pb_encode_fixed64(pb_ostream_t *stream, const void *value); - -/* Encode a submessage field. - * You need to pass the pb_field_t array and pointer to struct, just like - * with pb_encode(). This internally encodes the submessage twice, first to - * calculate message size and then to actually write it out. - */ -bool pb_encode_submessage(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/Q-municate Tests/Q_municate_Tests.m b/Q-municate Tests/Q_municate_Tests.m index cb6ad894e..3e72e0296 100644 --- a/Q-municate Tests/Q_municate_Tests.m +++ b/Q-municate Tests/Q_municate_Tests.m @@ -2,8 +2,8 @@ // Q_municate_Tests.m // Q-municate Tests // -// Created by Andrey Ivanov on 06.08.14. -// Copyright (c) 2014 Quickblox. All rights reserved. +// Created by Injoit on 06.08.14. +// Copyright © 2014 QuickBlox. All rights reserved. // #import diff --git a/Q-municate.xcodeproj/project.pbxproj b/Q-municate.xcodeproj/project.pbxproj index 2bffd0369..0e6895405 100644 --- a/Q-municate.xcodeproj/project.pbxproj +++ b/Q-municate.xcodeproj/project.pbxproj @@ -7,7 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - 4147AE579C0000F3FEADFC43 /* libPods-Q-municate.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FC7B184059841C99E1DFD62B /* libPods-Q-municate.a */; }; + 035EDA3AA292DA92BFCEF8DE /* Pods_QMSiriExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E7A04F78E6642A2DA605239 /* Pods_QMSiriExtension.framework */; }; + 061A1EA1A3EB22270D9A947C /* Pods_QMShareExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 67AD362B1BAE08A2AF1AF45D /* Pods_QMShareExtension.framework */; }; 55286996199131B5006F92CB /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 55286995199131B5006F92CB /* Localizable.strings */; }; 559BDFEA19618D3D000588FE /* QMWelcomeScreenViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 559BDFE619618D3D000588FE /* QMWelcomeScreenViewController.m */; }; 55A8B06E1965986A00B5D33B /* QMSoundManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 55A8B05C1965986A00B5D33B /* QMSoundManager.m */; }; @@ -30,8 +31,6 @@ 580FEBEA1CC4EF8E000AED72 /* QMNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 580FEBE91CC4EF8E000AED72 /* QMNotification.m */; }; 580FEBF61CC50423000AED72 /* QMMessagesHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 580FEBF51CC50423000AED72 /* QMMessagesHelper.m */; }; 581BAC8E1CAD8DD900E0567D /* QMColors.m in Sources */ = {isa = PBXBuildFile; fileRef = 581BAC8D1CAD8DD900E0567D /* QMColors.m */; }; - 581DA1D01BF3732900F75D8B /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 581DA1CF1BF3732900F75D8B /* libc++.tbd */; }; - 581DA1D21BF373A100F75D8B /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 581DA1D11BF373A100F75D8B /* VideoToolbox.framework */; }; 581F6E221D3E3E1C0087BC7A /* QMHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 581F6E211D3E3E1C0087BC7A /* QMHelpers.m */; }; 5838FD531D378EB900DB97BB /* QMCallNotificationItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 5838FD521D378EB900DB97BB /* QMCallNotificationItem.m */; }; 5839F26E1CC531AD0055EBF8 /* QMBaseTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5839F26D1CC531AD0055EBF8 /* QMBaseTitleView.m */; }; @@ -136,55 +135,359 @@ 58FD668A1CEF058400B72425 /* QMFeedbackViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 58FD66891CEF058400B72425 /* QMFeedbackViewController.m */; }; 58FD668E1CEF12D500B72425 /* QMAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 58FD668D1CEF12D500B72425 /* QMAlert.m */; }; 58FD66971CEF378200B72425 /* QMChangePasswordViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 58FD66961CEF378200B72425 /* QMChangePasswordViewController.m */; }; - 690A271518CA0F35003D6B80 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 690A271418CA0F35003D6B80 /* AddressBook.framework */; }; 697E2D4C196EA82400CD2BDE /* QMLicenseAgreementViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 697E2D4B196EA82400CD2BDE /* QMLicenseAgreementViewController.m */; }; - 69CF189518AE1C3C003262EF /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF189418AE1C3C003262EF /* CFNetwork.framework */; }; - 69CF189718AE1C49003262EF /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF189618AE1C48003262EF /* SystemConfiguration.framework */; }; - 69CF189918AE1C52003262EF /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF189818AE1C52003262EF /* MobileCoreServices.framework */; }; - 69CF189B18AE1C63003262EF /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF189A18AE1C63003262EF /* CoreLocation.framework */; }; - 69CF189D18AE1C6A003262EF /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF189C18AE1C6A003262EF /* CoreData.framework */; }; - 69CF189F18AE1C76003262EF /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF189E18AE1C76003262EF /* AudioToolbox.framework */; }; - 69CF18A118AE1C7E003262EF /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF18A018AE1C7E003262EF /* CoreMedia.framework */; }; - 69CF18A318AE1C85003262EF /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF18A218AE1C85003262EF /* Accelerate.framework */; }; - 69CF18A518AE1C8D003262EF /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF18A418AE1C8D003262EF /* CoreVideo.framework */; }; - 69CF18A718AE1C98003262EF /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF18A618AE1C98003262EF /* AVFoundation.framework */; }; - 69CF18A918AE1C9F003262EF /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69CF18A818AE1C9F003262EF /* Security.framework */; }; - 69D57E5618ACC11C00A9900A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69D57E5518ACC11C00A9900A /* Foundation.framework */; }; - 69D57E5818ACC11C00A9900A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69D57E5718ACC11C00A9900A /* CoreGraphics.framework */; }; - 69D57E5A18ACC11C00A9900A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69D57E5918ACC11C00A9900A /* UIKit.framework */; }; 69D57E6218ACC11C00A9900A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 69D57E6118ACC11C00A9900A /* main.m */; }; 69D57E6618ACC11C00A9900A /* QMAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 69D57E6518ACC11C00A9900A /* QMAppDelegate.m */; }; 69D57E6818ACC11C00A9900A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69D57E6718ACC11C00A9900A /* Images.xcassets */; }; - 69DB5EF518E31D6400277226 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69DB5EF418E31D6400277226 /* MessageUI.framework */; }; - 7C5635D17C49461162761660 /* libPods-QMShareExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DC91E0EEDD13E8E5F666C98A /* libPods-QMShareExtension.a */; }; - 86FD874D1982512000B6FA43 /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 86FD874C1982512000B6FA43 /* GLKit.framework */; }; - AFEFF67A44830D1258A26554 /* libPods-QMSiriExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BDCDFBABCBCAE9059D55762E /* libPods-QMSiriExtension.a */; }; + C8D562FD352DC0A9FF821A89 /* Pods_Q_municate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 594E7276015B6E39FCBE7812 /* Pods_Q_municate.framework */; }; + CE5563A621FBBC970051EC2D /* QMShareItemsDataProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55637221FBBC960051EC2D /* QMShareItemsDataProvider.m */; }; + CE5563A721FBBC970051EC2D /* QMShareItemsDataProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55637221FBBC960051EC2D /* QMShareItemsDataProvider.m */; }; + CE5563A821FBBC970051EC2D /* QMShareDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55637421FBBC960051EC2D /* QMShareDataSource.m */; }; + CE5563A921FBBC970051EC2D /* QMShareDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55637421FBBC960051EC2D /* QMShareDataSource.m */; }; + CE5563AA21FBBC970051EC2D /* Image.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE55637621FBBC960051EC2D /* Image.xcassets */; }; + CE5563AB21FBBC970051EC2D /* Image.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE55637621FBBC960051EC2D /* Image.xcassets */; }; + CE5563AC21FBBC970051EC2D /* QMShareTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE55637821FBBC960051EC2D /* QMShareTableViewController.xib */; }; + CE5563AD21FBBC970051EC2D /* QMShareTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE55637821FBBC960051EC2D /* QMShareTableViewController.xib */; }; + CE5563AF21FBBC970051EC2D /* QMShareRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55637921FBBC960051EC2D /* QMShareRootViewController.m */; }; + CE5563B121FBBC970051EC2D /* QMShareTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55637A21FBBC960051EC2D /* QMShareTableViewController.m */; }; + CE5563B221FBBC970051EC2D /* ShareInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CE55637D21FBBC960051EC2D /* ShareInterface.storyboard */; }; + CE5563B321FBBC970051EC2D /* ShareInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CE55637D21FBBC960051EC2D /* ShareInterface.storyboard */; }; + CE5563B521FBBC970051EC2D /* QMShareTasks.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55638121FBBC960051EC2D /* QMShareTasks.m */; }; + CE5563B621FBBC970051EC2D /* QMAttachmentProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55638321FBBC960051EC2D /* QMAttachmentProvider.m */; }; + CE5563B721FBBC970051EC2D /* QMAttachmentProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55638321FBBC960051EC2D /* QMAttachmentProvider.m */; }; + CE5563B821FBBC970051EC2D /* QMShareEtxentionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55638521FBBC960051EC2D /* QMShareEtxentionOperation.m */; }; + CE5563B921FBBC970051EC2D /* QMShareEtxentionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55638521FBBC960051EC2D /* QMShareEtxentionOperation.m */; }; + CE5563BA21FBBC970051EC2D /* QMShareCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE55638921FBBC960051EC2D /* QMShareCollectionViewCell.xib */; }; + CE5563BB21FBBC970051EC2D /* QMShareCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE55638921FBBC960051EC2D /* QMShareCollectionViewCell.xib */; }; + CE5563BC21FBBC970051EC2D /* QMShareCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55638A21FBBC960051EC2D /* QMShareCollectionViewCell.m */; }; + CE5563BD21FBBC970051EC2D /* QMShareCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55638A21FBBC960051EC2D /* QMShareCollectionViewCell.m */; }; + CE5563BE21FBBC970051EC2D /* QMShareTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55638C21FBBC960051EC2D /* QMShareTableViewCell.m */; }; + CE5563BF21FBBC970051EC2D /* QMShareTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55638C21FBBC960051EC2D /* QMShareTableViewCell.m */; }; + CE5563C021FBBC970051EC2D /* QMShareTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE55638E21FBBC960051EC2D /* QMShareTableViewCell.xib */; }; + CE5563C121FBBC970051EC2D /* QMShareTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE55638E21FBBC960051EC2D /* QMShareTableViewCell.xib */; }; + CE5563C221FBBC970051EC2D /* QMShareContactsTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE55639021FBBC960051EC2D /* QMShareContactsTableViewCell.xib */; }; + CE5563C321FBBC970051EC2D /* QMShareContactsTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE55639021FBBC960051EC2D /* QMShareContactsTableViewCell.xib */; }; + CE5563C421FBBC970051EC2D /* QMShareContactsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55639121FBBC960051EC2D /* QMShareContactsTableViewCell.m */; }; + CE5563C521FBBC970051EC2D /* QMShareContactsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55639121FBBC960051EC2D /* QMShareContactsTableViewCell.m */; }; + CE5563C621FBBC970051EC2D /* QMExtensionCache+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55639621FBBC960051EC2D /* QMExtensionCache+QMShareExtension.m */; }; + CE5563C721FBBC970051EC2D /* QMExtensionCache+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55639621FBBC960051EC2D /* QMExtensionCache+QMShareExtension.m */; }; + CE5563C821FBBC970051EC2D /* NSError+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55639821FBBC970051EC2D /* NSError+QMShareExtension.m */; }; + CE5563C921FBBC970051EC2D /* NSError+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55639821FBBC970051EC2D /* NSError+QMShareExtension.m */; }; + CE5563CA21FBBC970051EC2D /* NSURL+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55639B21FBBC970051EC2D /* NSURL+QMShareExtension.m */; }; + CE5563CB21FBBC970051EC2D /* NSURL+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55639B21FBBC970051EC2D /* NSURL+QMShareExtension.m */; }; + CE5563CC21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55639D21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol.m */; }; + CE5563CD21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55639D21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol.m */; }; + CE5563CE21FBBC970051EC2D /* QBUUser+QMShareItemProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5563A121FBBC970051EC2D /* QBUUser+QMShareItemProtocol.m */; }; + CE5563CF21FBBC970051EC2D /* QBUUser+QMShareItemProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5563A121FBBC970051EC2D /* QBUUser+QMShareItemProtocol.m */; }; + CE5563EB21FBBCA30051EC2D /* QBChatDialog+INPerson.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5563D321FBBCA30051EC2D /* QBChatDialog+INPerson.m */; }; + CE5563ED21FBBCA30051EC2D /* QMSiriHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5563D421FBBCA30051EC2D /* QMSiriHelper.m */; }; + CE5563EF21FBBCA30051EC2D /* IntentHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5563D821FBBCA30051EC2D /* IntentHandler.m */; }; + CE5563F121FBBCA30051EC2D /* QMMessageIntentHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5563D921FBBCA30051EC2D /* QMMessageIntentHandler.m */; }; + CE5563F321FBBCA30051EC2D /* QBUUser+INPerson.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5563E021FBBCA30051EC2D /* QBUUser+INPerson.m */; }; + CE5563F521FBBCA30051EC2D /* QMExtensionCache+QMSiriExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5563E121FBBCA30051EC2D /* QMExtensionCache+QMSiriExtension.m */; }; + CE57CD0921FA002E0026A23F /* QMChatViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CC5A21FA002D0026A23F /* QMChatViewController.xib */; }; + CE57CD0A21FA002E0026A23F /* QMChatResources.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC5F21FA002D0026A23F /* QMChatResources.m */; }; + CE57CD0B21FA002E0026A23F /* QMDateUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC6321FA002D0026A23F /* QMDateUtils.m */; }; + CE57CD0C21FA002E0026A23F /* QMImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC6521FA002D0026A23F /* QMImageLoader.m */; }; + CE57CD0D21FA002E0026A23F /* QMChatViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC6721FA002D0026A23F /* QMChatViewController.m */; }; + CE57CD0E21FA002E0026A23F /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE57CC6921FA002D0026A23F /* Media.xcassets */; }; + CE57CD0F21FA002E0026A23F /* QBChatMessage+QBDateDivider.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC6E21FA002D0026A23F /* QBChatMessage+QBDateDivider.m */; }; + CE57CD1021FA002E0026A23F /* NSDate+ChatDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC6F21FA002D0026A23F /* NSDate+ChatDataSource.m */; }; + CE57CD1121FA002E0026A23F /* QMChatDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC7021FA002D0026A23F /* QMChatDataSource.m */; }; + CE57CD1221FA002E0026A23F /* QMChatAttachmentOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC7521FA002D0026A23F /* QMChatAttachmentOutgoingCell.m */; }; + CE57CD1321FA002E0026A23F /* QMChatAttachmentOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CC7721FA002D0026A23F /* QMChatAttachmentOutgoingCell.xib */; }; + CE57CD1421FA002E0026A23F /* QMChatIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CC7A21FA002D0026A23F /* QMChatIncomingCell.xib */; }; + CE57CD1521FA002E0026A23F /* QMChatIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC7B21FA002D0026A23F /* QMChatIncomingCell.m */; }; + CE57CD1621FA002E0026A23F /* QMChatContactRequestCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC7E21FA002D0026A23F /* QMChatContactRequestCell.m */; }; + CE57CD1721FA002E0026A23F /* QMChatContactRequestCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CC7F21FA002D0026A23F /* QMChatContactRequestCell.xib */; }; + CE57CD1821FA002E0026A23F /* QMChatCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC8221FA002D0026A23F /* QMChatCell.m */; }; + CE57CD1921FA002E0026A23F /* QMChatBaseLinkPreviewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC8421FA002D0026A23F /* QMChatBaseLinkPreviewCell.m */; }; + CE57CD1A21FA002E0026A23F /* QMChatOutgoingLinkPreviewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC8621FA002D0026A23F /* QMChatOutgoingLinkPreviewCell.m */; }; + CE57CD1B21FA002E0026A23F /* QMChatOutgoingLinkPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CC8821FA002D0026A23F /* QMChatOutgoingLinkPreviewCell.xib */; }; + CE57CD1C21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CC8D21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.xib */; }; + CE57CD1D21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC8E21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.m */; }; + CE57CD1E21FA002E0026A23F /* QMImageOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC9121FA002E0026A23F /* QMImageOutgoingCell.m */; }; + CE57CD1F21FA002E0026A23F /* QMImageOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CC9321FA002E0026A23F /* QMImageOutgoingCell.xib */; }; + CE57CD2021FA002E0026A23F /* QMBaseMediaCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC9521FA002E0026A23F /* QMBaseMediaCell.m */; }; + CE57CD2121FA002E0026A23F /* QMAudioIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CC9921FA002E0026A23F /* QMAudioIncomingCell.xib */; }; + CE57CD2221FA002E0026A23F /* QMAudioIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC9A21FA002E0026A23F /* QMAudioIncomingCell.m */; }; + CE57CD2321FA002E0026A23F /* QMMediaOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC9C21FA002E0026A23F /* QMMediaOutgoingCell.m */; }; + CE57CD2421FA002E0026A23F /* QMVideoIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCA021FA002E0026A23F /* QMVideoIncomingCell.xib */; }; + CE57CD2521FA002E0026A23F /* QMVideoIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCA121FA002E0026A23F /* QMVideoIncomingCell.m */; }; + CE57CD2621FA002E0026A23F /* QMImageIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCA521FA002E0026A23F /* QMImageIncomingCell.m */; }; + CE57CD2721FA002E0026A23F /* QMImageIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCA721FA002E0026A23F /* QMImageIncomingCell.xib */; }; + CE57CD2821FA002E0026A23F /* QMAudioOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCAA21FA002E0026A23F /* QMAudioOutgoingCell.m */; }; + CE57CD2921FA002E0026A23F /* QMAudioOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCAB21FA002E0026A23F /* QMAudioOutgoingCell.xib */; }; + CE57CD2A21FA002E0026A23F /* QMMediaIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCAD21FA002E0026A23F /* QMMediaIncomingCell.m */; }; + CE57CD2B21FA002E0026A23F /* QMVideoOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCB121FA002E0026A23F /* QMVideoOutgoingCell.xib */; }; + CE57CD2C21FA002E0026A23F /* QMVideoOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCB221FA002E0026A23F /* QMVideoOutgoingCell.m */; }; + CE57CD2D21FA002E0026A23F /* QMChatLocationIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCB521FA002E0026A23F /* QMChatLocationIncomingCell.m */; }; + CE57CD2E21FA002E0026A23F /* QMChatLocationIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCB621FA002E0026A23F /* QMChatLocationIncomingCell.xib */; }; + CE57CD2F21FA002E0026A23F /* QMChatAttachmentIncomingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCB821FA002E0026A23F /* QMChatAttachmentIncomingCell.m */; }; + CE57CD3021FA002E0026A23F /* QMChatAttachmentIncomingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCB921FA002E0026A23F /* QMChatAttachmentIncomingCell.xib */; }; + CE57CD3121FA002E0026A23F /* QMBaseChatLocationCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCC021FA002E0026A23F /* QMBaseChatLocationCell.m */; }; + CE57CD3221FA002E0026A23F /* QMChatOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCC321FA002E0026A23F /* QMChatOutgoingCell.m */; }; + CE57CD3321FA002E0026A23F /* QMChatOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCC421FA002E0026A23F /* QMChatOutgoingCell.xib */; }; + CE57CD3421FA002E0026A23F /* QMChatLocationOutgoingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCC721FA002E0026A23F /* QMChatLocationOutgoingCell.m */; }; + CE57CD3521FA002E0026A23F /* QMChatLocationOutgoingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCC821FA002E0026A23F /* QMChatLocationOutgoingCell.xib */; }; + CE57CD3621FA002E0026A23F /* QMChatNotificationCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCCA21FA002E0026A23F /* QMChatNotificationCell.xib */; }; + CE57CD3721FA002E0026A23F /* QMChatNotificationCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCCC21FA002E0026A23F /* QMChatNotificationCell.m */; }; + CE57CD3821FA002E0026A23F /* QMHeaderCollectionReusableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCD021FA002E0026A23F /* QMHeaderCollectionReusableView.xib */; }; + CE57CD3921FA002E0026A23F /* QMHeaderCollectionReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCD121FA002E0026A23F /* QMHeaderCollectionReusableView.m */; }; + CE57CD3A21FA002E0026A23F /* QMPlaceHolderTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCD421FA002E0026A23F /* QMPlaceHolderTextView.m */; }; + CE57CD3B21FA002E0026A23F /* QMInputToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCD621FA002E0026A23F /* QMInputToolbar.m */; }; + CE57CD3C21FA002E0026A23F /* QMToolbarContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCD921FA002E0026A23F /* QMToolbarContentView.xib */; }; + CE57CD3D21FA002E0026A23F /* QMToolbarContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCDA21FA002E0026A23F /* QMToolbarContentView.m */; }; + CE57CD3E21FA002E0026A23F /* QMProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCDD21FA002E0026A23F /* QMProgressView.m */; }; + CE57CD3F21FA002E0026A23F /* QMAudioRecordView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCE021FA002E0026A23F /* QMAudioRecordView.m */; }; + CE57CD4021FA002E0026A23F /* QMAudioRecordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE57CCE121FA002E0026A23F /* QMAudioRecordView.xib */; }; + CE57CD4121FA002E0026A23F /* QMImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCE321FA002E0026A23F /* QMImageView.m */; }; + CE57CD4221FA002E0026A23F /* QMAudioRecordButton.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCE621FA002E0026A23F /* QMAudioRecordButton.m */; }; + CE57CD4321FA002E0026A23F /* QMChatCellLayoutAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCEC21FA002E0026A23F /* QMChatCellLayoutAttributes.m */; }; + CE57CD4421FA002E0026A23F /* QMCollectionViewFlowLayoutInvalidationContext.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCEE21FA002E0026A23F /* QMCollectionViewFlowLayoutInvalidationContext.m */; }; + CE57CD4521FA002E0026A23F /* QMChatCollectionViewFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCEF21FA002E0026A23F /* QMChatCollectionViewFlowLayout.m */; }; + CE57CD4621FA002E0026A23F /* QMChatCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCF021FA002E0026A23F /* QMChatCollectionView.m */; }; + CE57CD4721FA002E0026A23F /* QMKVOView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCF321FA002E0026A23F /* QMKVOView.m */; }; + CE57CD4821FA002E0026A23F /* QMChatContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCF521FA002E0026A23F /* QMChatContainerView.m */; }; + CE57CD4921FA002E0026A23F /* UIColor+QM.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCF721FA002E0026A23F /* UIColor+QM.m */; }; + CE57CD4A21FA002E0026A23F /* UIImage+Cropper.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCF821FA002E0026A23F /* UIImage+Cropper.m */; }; + CE57CD4B21FA002E0026A23F /* NSString+QM.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCFA21FA002E0026A23F /* NSString+QM.m */; }; + CE57CD4C21FA002E0026A23F /* UIView+QM.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCFF21FA002E0026A23F /* UIView+QM.m */; }; + CE57CD4D21FA002E0026A23F /* UIImage+QM.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CD0021FA002E0026A23F /* UIImage+QM.m */; }; + CE57CD4E21FA002E0026A23F /* UIImageView+QMLocationSnapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CD0521FA002E0026A23F /* UIImageView+QMLocationSnapshot.m */; }; + CE57CD4F21FA002E0026A23F /* QMChatLocationSnapshotter.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CD0621FA002E0026A23F /* QMChatLocationSnapshotter.m */; }; + CE57CD5021FA132F0026A23F /* QMImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CC6521FA002D0026A23F /* QMImageLoader.m */; }; + CE8ED2A221FBBFB2002FC461 /* QMShareTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE55637A21FBBC960051EC2D /* QMShareTableViewController.m */; }; + CEBF330621FA16710074A431 /* UIImage+QM.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CD0021FA002E0026A23F /* UIImage+QM.m */; }; + CEBF330721FA16C70074A431 /* QMImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCE321FA002E0026A23F /* QMImageView.m */; }; + CEBF330821FA16F10074A431 /* UIImage+Cropper.m in Sources */ = {isa = PBXBuildFile; fileRef = CE57CCF821FA002E0026A23F /* UIImage+Cropper.m */; }; + CEBFEE8021F7731C00FED85A /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = CEBFEE7F21F7731C00FED85A /* GoogleService-Info.plist */; }; + CEFBFB9E21FB929A00E1ECB2 /* QMOpenGraphCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAC521FB929900E1ECB2 /* QMOpenGraphCache.m */; }; + CEFBFB9F21FB929A00E1ECB2 /* QMOpenGraphCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAC521FB929900E1ECB2 /* QMOpenGraphCache.m */; }; + CEFBFBA021FB929A00E1ECB2 /* QMOpenGraphCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAC521FB929900E1ECB2 /* QMOpenGraphCache.m */; }; + CEFBFBA121FB929A00E1ECB2 /* QMOpenGraphModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAC721FB929900E1ECB2 /* QMOpenGraphModel.xcdatamodeld */; }; + CEFBFBA221FB929A00E1ECB2 /* QMOpenGraphModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAC721FB929900E1ECB2 /* QMOpenGraphModel.xcdatamodeld */; }; + CEFBFBA321FB929A00E1ECB2 /* QMOpenGraphModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAC721FB929900E1ECB2 /* QMOpenGraphModel.xcdatamodeld */; }; + CEFBFBA421FB929A00E1ECB2 /* CDOpenGraphModel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFACB21FB929900E1ECB2 /* CDOpenGraphModel.m */; }; + CEFBFBA521FB929A00E1ECB2 /* CDOpenGraphModel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFACB21FB929900E1ECB2 /* CDOpenGraphModel.m */; }; + CEFBFBA621FB929A00E1ECB2 /* CDOpenGraphModel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFACB21FB929900E1ECB2 /* CDOpenGraphModel.m */; }; + CEFBFBA721FB929A00E1ECB2 /* _CDOpenGraphModel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFACE21FB929900E1ECB2 /* _CDOpenGraphModel.m */; }; + CEFBFBA821FB929A00E1ECB2 /* _CDOpenGraphModel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFACE21FB929900E1ECB2 /* _CDOpenGraphModel.m */; }; + CEFBFBA921FB929A00E1ECB2 /* _CDOpenGraphModel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFACE21FB929900E1ECB2 /* _CDOpenGraphModel.m */; }; + CEFBFBAA21FB929A00E1ECB2 /* QMOpenGraphMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD221FB929900E1ECB2 /* QMOpenGraphMemoryStorage.m */; }; + CEFBFBAB21FB929A00E1ECB2 /* QMOpenGraphMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD221FB929900E1ECB2 /* QMOpenGraphMemoryStorage.m */; }; + CEFBFBAC21FB929A00E1ECB2 /* QMOpenGraphMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD221FB929900E1ECB2 /* QMOpenGraphMemoryStorage.m */; }; + CEFBFBAD21FB929A00E1ECB2 /* QMOpenGraphItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD321FB929900E1ECB2 /* QMOpenGraphItem.m */; }; + CEFBFBAE21FB929A00E1ECB2 /* QMOpenGraphItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD321FB929900E1ECB2 /* QMOpenGraphItem.m */; }; + CEFBFBAF21FB929A00E1ECB2 /* QMOpenGraphItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD321FB929900E1ECB2 /* QMOpenGraphItem.m */; }; + CEFBFBB021FB929A00E1ECB2 /* QMOpenGraphService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD421FB929900E1ECB2 /* QMOpenGraphService.m */; }; + CEFBFBB121FB929A00E1ECB2 /* QMOpenGraphService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD421FB929900E1ECB2 /* QMOpenGraphService.m */; }; + CEFBFBB221FB929A00E1ECB2 /* QMOpenGraphService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD421FB929900E1ECB2 /* QMOpenGraphService.m */; }; + CEFBFBB321FB929A00E1ECB2 /* QMDeferredQueueMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD921FB929900E1ECB2 /* QMDeferredQueueMemoryStorage.m */; }; + CEFBFBB421FB929A00E1ECB2 /* QMDeferredQueueMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD921FB929900E1ECB2 /* QMDeferredQueueMemoryStorage.m */; }; + CEFBFBB521FB929A00E1ECB2 /* QMDeferredQueueMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAD921FB929900E1ECB2 /* QMDeferredQueueMemoryStorage.m */; }; + CEFBFBB621FB929A00E1ECB2 /* QMServicesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFADB21FB929900E1ECB2 /* QMServicesManager.m */; }; + CEFBFBB721FB929A00E1ECB2 /* QMServicesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFADB21FB929900E1ECB2 /* QMServicesManager.m */; }; + CEFBFBB821FB929A00E1ECB2 /* QMServicesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFADB21FB929900E1ECB2 /* QMServicesManager.m */; }; + CEFBFBB921FB929A00E1ECB2 /* QMDeferredQueueManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFADD21FB929900E1ECB2 /* QMDeferredQueueManager.m */; }; + CEFBFBBA21FB929A00E1ECB2 /* QMDeferredQueueManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFADD21FB929900E1ECB2 /* QMDeferredQueueManager.m */; }; + CEFBFBBB21FB929A00E1ECB2 /* QMDeferredQueueManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFADD21FB929900E1ECB2 /* QMDeferredQueueManager.m */; }; + CEFBFBBC21FB929A00E1ECB2 /* QMChatServiceModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAE121FB929900E1ECB2 /* QMChatServiceModel.xcdatamodeld */; }; + CEFBFBBD21FB929A00E1ECB2 /* QMChatServiceModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAE121FB929900E1ECB2 /* QMChatServiceModel.xcdatamodeld */; }; + CEFBFBBE21FB929A00E1ECB2 /* QMChatServiceModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAE121FB929900E1ECB2 /* QMChatServiceModel.xcdatamodeld */; }; + CEFBFBBF21FB929A00E1ECB2 /* QMCDMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAEB21FB929900E1ECB2 /* QMCDMessage.m */; }; + CEFBFBC021FB929A00E1ECB2 /* QMCDMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAEB21FB929900E1ECB2 /* QMCDMessage.m */; }; + CEFBFBC121FB929A00E1ECB2 /* QMCDMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAEB21FB929900E1ECB2 /* QMCDMessage.m */; }; + CEFBFBC221FB929A00E1ECB2 /* QMCDAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAEE21FB929900E1ECB2 /* QMCDAttachment.m */; }; + CEFBFBC321FB929A00E1ECB2 /* QMCDAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAEE21FB929900E1ECB2 /* QMCDAttachment.m */; }; + CEFBFBC421FB929A00E1ECB2 /* QMCDAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAEE21FB929900E1ECB2 /* QMCDAttachment.m */; }; + CEFBFBC521FB929A00E1ECB2 /* QMCDDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAEF21FB929900E1ECB2 /* QMCDDialog.m */; }; + CEFBFBC621FB929A00E1ECB2 /* QMCDDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAEF21FB929900E1ECB2 /* QMCDDialog.m */; }; + CEFBFBC721FB929A00E1ECB2 /* QMCDDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAEF21FB929900E1ECB2 /* QMCDDialog.m */; }; + CEFBFBC821FB929A00E1ECB2 /* _QMCDAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF121FB929900E1ECB2 /* _QMCDAttachment.m */; }; + CEFBFBC921FB929A00E1ECB2 /* _QMCDAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF121FB929900E1ECB2 /* _QMCDAttachment.m */; }; + CEFBFBCA21FB929A00E1ECB2 /* _QMCDAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF121FB929900E1ECB2 /* _QMCDAttachment.m */; }; + CEFBFBCB21FB929A00E1ECB2 /* _QMCDMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF321FB929900E1ECB2 /* _QMCDMessage.m */; }; + CEFBFBCC21FB929A00E1ECB2 /* _QMCDMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF321FB929900E1ECB2 /* _QMCDMessage.m */; }; + CEFBFBCD21FB929A00E1ECB2 /* _QMCDMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF321FB929900E1ECB2 /* _QMCDMessage.m */; }; + CEFBFBCE21FB929A00E1ECB2 /* _QMCDDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF621FB929A00E1ECB2 /* _QMCDDialog.m */; }; + CEFBFBCF21FB929A00E1ECB2 /* _QMCDDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF621FB929A00E1ECB2 /* _QMCDDialog.m */; }; + CEFBFBD021FB929A00E1ECB2 /* _QMCDDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF621FB929A00E1ECB2 /* _QMCDDialog.m */; }; + CEFBFBD121FB929A00E1ECB2 /* QMChatCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF921FB929A00E1ECB2 /* QMChatCache.m */; }; + CEFBFBD221FB929A00E1ECB2 /* QMChatCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF921FB929A00E1ECB2 /* QMChatCache.m */; }; + CEFBFBD321FB929A00E1ECB2 /* QMChatCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAF921FB929A00E1ECB2 /* QMChatCache.m */; }; + CEFBFBD421FB929A00E1ECB2 /* QMContactListService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAFD21FB929A00E1ECB2 /* QMContactListService+Bolts.m */; }; + CEFBFBD521FB929A00E1ECB2 /* QMContactListService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAFD21FB929A00E1ECB2 /* QMContactListService+Bolts.m */; }; + CEFBFBD621FB929A00E1ECB2 /* QMContactListService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAFD21FB929A00E1ECB2 /* QMContactListService+Bolts.m */; }; + CEFBFBD721FB929A00E1ECB2 /* QMContactListMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAFF21FB929A00E1ECB2 /* QMContactListMemoryStorage.m */; }; + CEFBFBD821FB929A00E1ECB2 /* QMContactListMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAFF21FB929A00E1ECB2 /* QMContactListMemoryStorage.m */; }; + CEFBFBD921FB929A00E1ECB2 /* QMContactListMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFAFF21FB929A00E1ECB2 /* QMContactListMemoryStorage.m */; }; + CEFBFBDA21FB929A00E1ECB2 /* QMContactListService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0121FB929A00E1ECB2 /* QMContactListService.m */; }; + CEFBFBDB21FB929A00E1ECB2 /* QMContactListService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0121FB929A00E1ECB2 /* QMContactListService.m */; }; + CEFBFBDC21FB929A00E1ECB2 /* QMContactListService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0121FB929A00E1ECB2 /* QMContactListService.m */; }; + CEFBFBDD21FB929A00E1ECB2 /* QMBaseService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0321FB929A00E1ECB2 /* QMBaseService.m */; }; + CEFBFBDE21FB929A00E1ECB2 /* QMBaseService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0321FB929A00E1ECB2 /* QMBaseService.m */; }; + CEFBFBDF21FB929A00E1ECB2 /* QMBaseService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0321FB929A00E1ECB2 /* QMBaseService.m */; }; + CEFBFBE021FB929A00E1ECB2 /* QMAsynchronousOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0921FB929A00E1ECB2 /* QMAsynchronousOperation.m */; }; + CEFBFBE121FB929A00E1ECB2 /* QMAsynchronousOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0921FB929A00E1ECB2 /* QMAsynchronousOperation.m */; }; + CEFBFBE221FB929A00E1ECB2 /* QMAsynchronousOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0921FB929A00E1ECB2 /* QMAsynchronousOperation.m */; }; + CEFBFBE321FB929A00E1ECB2 /* CDUser.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0F21FB929A00E1ECB2 /* CDUser.m */; }; + CEFBFBE421FB929A00E1ECB2 /* CDUser.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0F21FB929A00E1ECB2 /* CDUser.m */; }; + CEFBFBE521FB929A00E1ECB2 /* CDUser.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB0F21FB929A00E1ECB2 /* CDUser.m */; }; + CEFBFBE621FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1121FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld */; }; + CEFBFBE721FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1121FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld */; }; + CEFBFBE821FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1121FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld */; }; + CEFBFBE921FB929A00E1ECB2 /* _CDUser.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1521FB929A00E1ECB2 /* _CDUser.m */; }; + CEFBFBEA21FB929A00E1ECB2 /* _CDUser.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1521FB929A00E1ECB2 /* _CDUser.m */; }; + CEFBFBEB21FB929A00E1ECB2 /* _CDUser.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1521FB929A00E1ECB2 /* _CDUser.m */; }; + CEFBFBEC21FB929A00E1ECB2 /* QMUsersCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1821FB929A00E1ECB2 /* QMUsersCache.m */; }; + CEFBFBED21FB929A00E1ECB2 /* QMUsersCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1821FB929A00E1ECB2 /* QMUsersCache.m */; }; + CEFBFBEE21FB929A00E1ECB2 /* QMUsersCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1821FB929A00E1ECB2 /* QMUsersCache.m */; }; + CEFBFBEF21FB929A00E1ECB2 /* QMSLog.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1B21FB929A00E1ECB2 /* QMSLog.m */; }; + CEFBFBF021FB929A00E1ECB2 /* QMSLog.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1B21FB929A00E1ECB2 /* QMSLog.m */; }; + CEFBFBF121FB929A00E1ECB2 /* QMSLog.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1B21FB929A00E1ECB2 /* QMSLog.m */; }; + CEFBFBF221FB929A00E1ECB2 /* QMServices.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1D21FB929A00E1ECB2 /* QMServices.m */; }; + CEFBFBF321FB929A00E1ECB2 /* QMServices.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1D21FB929A00E1ECB2 /* QMServices.m */; }; + CEFBFBF421FB929A00E1ECB2 /* QMServices.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1D21FB929A00E1ECB2 /* QMServices.m */; }; + CEFBFBF521FB929A00E1ECB2 /* QMAuthService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1F21FB929A00E1ECB2 /* QMAuthService.m */; }; + CEFBFBF621FB929A00E1ECB2 /* QMAuthService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1F21FB929A00E1ECB2 /* QMAuthService.m */; }; + CEFBFBF721FB929A00E1ECB2 /* QMAuthService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB1F21FB929A00E1ECB2 /* QMAuthService.m */; }; + CEFBFBF821FB929A00E1ECB2 /* QMAuthService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2121FB929A00E1ECB2 /* QMAuthService+Bolts.m */; }; + CEFBFBF921FB929A00E1ECB2 /* QMAuthService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2121FB929A00E1ECB2 /* QMAuthService+Bolts.m */; }; + CEFBFBFA21FB929A00E1ECB2 /* QMAuthService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2121FB929A00E1ECB2 /* QMAuthService+Bolts.m */; }; + CEFBFBFB21FB929A00E1ECB2 /* QMContactListCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2421FB929A00E1ECB2 /* QMContactListCache.m */; }; + CEFBFBFC21FB929A00E1ECB2 /* QMContactListCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2421FB929A00E1ECB2 /* QMContactListCache.m */; }; + CEFBFBFD21FB929A00E1ECB2 /* QMContactListCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2421FB929A00E1ECB2 /* QMContactListCache.m */; }; + CEFBFBFE21FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2621FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld */; }; + CEFBFBFF21FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2621FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld */; }; + CEFBFC0021FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2621FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld */; }; + CEFBFC0121FB929A00E1ECB2 /* CDContactListItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2A21FB929A00E1ECB2 /* CDContactListItem.m */; }; + CEFBFC0221FB929A00E1ECB2 /* CDContactListItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2A21FB929A00E1ECB2 /* CDContactListItem.m */; }; + CEFBFC0321FB929A00E1ECB2 /* CDContactListItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2A21FB929A00E1ECB2 /* CDContactListItem.m */; }; + CEFBFC0421FB929A00E1ECB2 /* _CDContactListItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2D21FB929A00E1ECB2 /* _CDContactListItem.m */; }; + CEFBFC0521FB929A00E1ECB2 /* _CDContactListItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2D21FB929A00E1ECB2 /* _CDContactListItem.m */; }; + CEFBFC0621FB929A00E1ECB2 /* _CDContactListItem.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB2D21FB929A00E1ECB2 /* _CDContactListItem.m */; }; + CEFBFC0721FB929A00E1ECB2 /* QMUsersService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3121FB929A00E1ECB2 /* QMUsersService.m */; }; + CEFBFC0821FB929A00E1ECB2 /* QMUsersService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3121FB929A00E1ECB2 /* QMUsersService.m */; }; + CEFBFC0921FB929A00E1ECB2 /* QMUsersService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3121FB929A00E1ECB2 /* QMUsersService.m */; }; + CEFBFC0A21FB929A00E1ECB2 /* QBUUser+CustomData.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3521FB929A00E1ECB2 /* QBUUser+CustomData.m */; }; + CEFBFC0B21FB929A00E1ECB2 /* QBUUser+CustomData.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3521FB929A00E1ECB2 /* QBUUser+CustomData.m */; }; + CEFBFC0C21FB929A00E1ECB2 /* QBUUser+CustomData.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3521FB929A00E1ECB2 /* QBUUser+CustomData.m */; }; + CEFBFC0D21FB929A00E1ECB2 /* QMUsersMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3821FB929A00E1ECB2 /* QMUsersMemoryStorage.m */; }; + CEFBFC0E21FB929A00E1ECB2 /* QMUsersMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3821FB929A00E1ECB2 /* QMUsersMemoryStorage.m */; }; + CEFBFC0F21FB929A00E1ECB2 /* QMUsersMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3821FB929A00E1ECB2 /* QMUsersMemoryStorage.m */; }; + CEFBFC1021FB929A00E1ECB2 /* QMCDMigrationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3C21FB929A00E1ECB2 /* QMCDMigrationManager.m */; }; + CEFBFC1321FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3F21FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m */; }; + CEFBFC1421FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3F21FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m */; }; + CEFBFC1521FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB3F21FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m */; }; + CEFBFC1621FB929A00E1ECB2 /* QMCDRecord+Options.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4121FB929A00E1ECB2 /* QMCDRecord+Options.m */; }; + CEFBFC1721FB929A00E1ECB2 /* QMCDRecord+Options.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4121FB929A00E1ECB2 /* QMCDRecord+Options.m */; }; + CEFBFC1821FB929A00E1ECB2 /* QMCDRecord+Options.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4121FB929A00E1ECB2 /* QMCDRecord+Options.m */; }; + CEFBFC1921FB929A00E1ECB2 /* QMCDRecordInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4221FB929A00E1ECB2 /* QMCDRecordInternal.m */; }; + CEFBFC1A21FB929A00E1ECB2 /* QMCDRecordInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4221FB929A00E1ECB2 /* QMCDRecordInternal.m */; }; + CEFBFC1B21FB929A00E1ECB2 /* QMCDRecordInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4221FB929A00E1ECB2 /* QMCDRecordInternal.m */; }; + CEFBFC1C21FB929A00E1ECB2 /* NSArray+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4A21FB929A00E1ECB2 /* NSArray+QMCDRecord.m */; }; + CEFBFC1D21FB929A00E1ECB2 /* NSArray+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4A21FB929A00E1ECB2 /* NSArray+QMCDRecord.m */; }; + CEFBFC1E21FB929A00E1ECB2 /* NSArray+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4A21FB929A00E1ECB2 /* NSArray+QMCDRecord.m */; }; + CEFBFC1F21FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4C21FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m */; }; + CEFBFC2021FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4C21FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m */; }; + CEFBFC2121FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4C21FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m */; }; + CEFBFC2221FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4D21FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m */; }; + CEFBFC2321FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4D21FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m */; }; + CEFBFC2421FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB4D21FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m */; }; + CEFBFC2521FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5021FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m */; }; + CEFBFC2621FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5021FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m */; }; + CEFBFC2721FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5021FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m */; }; + CEFBFC2821FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5221FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m */; }; + CEFBFC2921FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5221FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m */; }; + CEFBFC2A21FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5221FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m */; }; + CEFBFC2B21FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5321FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m */; }; + CEFBFC2C21FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5321FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m */; }; + CEFBFC2D21FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5321FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m */; }; + CEFBFC2E21FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5621FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m */; }; + CEFBFC2F21FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5621FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m */; }; + CEFBFC3021FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5621FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m */; }; + CEFBFC3121FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5921FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m */; }; + CEFBFC3221FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5921FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m */; }; + CEFBFC3321FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5921FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m */; }; + CEFBFC3421FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5B21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m */; }; + CEFBFC3521FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5B21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m */; }; + CEFBFC3621FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5B21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m */; }; + CEFBFC3721FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5E21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m */; }; + CEFBFC3821FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5E21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m */; }; + CEFBFC3921FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB5E21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m */; }; + CEFBFC3A21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6021FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m */; }; + CEFBFC3B21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6021FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m */; }; + CEFBFC3C21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6021FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m */; }; + CEFBFC3D21FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6321FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m */; }; + CEFBFC3E21FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6321FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m */; }; + CEFBFC3F21FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6321FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m */; }; + CEFBFC4021FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6621FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m */; }; + CEFBFC4121FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6621FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m */; }; + CEFBFC4221FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6621FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m */; }; + CEFBFC4321FB929A00E1ECB2 /* QMCDRecordStack.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6A21FB929A00E1ECB2 /* QMCDRecordStack.m */; }; + CEFBFC4621FB929A00E1ECB2 /* QMDBStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6B21FB929A00E1ECB2 /* QMDBStorage.m */; }; + CEFBFC4921FB929A00E1ECB2 /* QMDialogsMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7021FB929A00E1ECB2 /* QMDialogsMemoryStorage.m */; }; + CEFBFC4A21FB929A00E1ECB2 /* QMDialogsMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7021FB929A00E1ECB2 /* QMDialogsMemoryStorage.m */; }; + CEFBFC4B21FB929A00E1ECB2 /* QMDialogsMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7021FB929A00E1ECB2 /* QMDialogsMemoryStorage.m */; }; + CEFBFC4C21FB929A00E1ECB2 /* QMChatService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7421FB929A00E1ECB2 /* QMChatService+Bolts.m */; }; + CEFBFC4D21FB929A00E1ECB2 /* QMChatService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7421FB929A00E1ECB2 /* QMChatService+Bolts.m */; }; + CEFBFC4E21FB929A00E1ECB2 /* QMChatService+Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7421FB929A00E1ECB2 /* QMChatService+Bolts.m */; }; + CEFBFC4F21FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7721FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m */; }; + CEFBFC5021FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7721FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m */; }; + CEFBFC5121FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7721FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m */; }; + CEFBFC5221FB929A00E1ECB2 /* QMChatAttachmentService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7921FB929A00E1ECB2 /* QMChatAttachmentService.m */; }; + CEFBFC5321FB929A00E1ECB2 /* QMChatAttachmentService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7921FB929A00E1ECB2 /* QMChatAttachmentService.m */; }; + CEFBFC5421FB929A00E1ECB2 /* QMChatAttachmentService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7921FB929A00E1ECB2 /* QMChatAttachmentService.m */; }; + CEFBFC5521FB929A00E1ECB2 /* QMAttachmentStoreService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7B21FB929A00E1ECB2 /* QMAttachmentStoreService.m */; }; + CEFBFC5621FB929A00E1ECB2 /* QMAttachmentStoreService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7B21FB929A00E1ECB2 /* QMAttachmentStoreService.m */; }; + CEFBFC5721FB929A00E1ECB2 /* QMAttachmentStoreService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB7B21FB929A00E1ECB2 /* QMAttachmentStoreService.m */; }; + CEFBFC5821FB929A00E1ECB2 /* QMTimeOut.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8021FB929A00E1ECB2 /* QMTimeOut.m */; }; + CEFBFC5921FB929A00E1ECB2 /* QMTimeOut.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8021FB929A00E1ECB2 /* QMTimeOut.m */; }; + CEFBFC5A21FB929A00E1ECB2 /* QMTimeOut.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8021FB929A00E1ECB2 /* QMTimeOut.m */; }; + CEFBFC5B21FB929A00E1ECB2 /* QMAssetLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8421FB929A00E1ECB2 /* QMAssetLoader.m */; }; + CEFBFC5C21FB929A00E1ECB2 /* QMAssetLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8421FB929A00E1ECB2 /* QMAssetLoader.m */; }; + CEFBFC5D21FB929A00E1ECB2 /* QMAssetLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8421FB929A00E1ECB2 /* QMAssetLoader.m */; }; + CEFBFC5E21FB929A00E1ECB2 /* QMAttachmentAssetService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8521FB929A00E1ECB2 /* QMAttachmentAssetService.m */; }; + CEFBFC5F21FB929A00E1ECB2 /* QMAttachmentAssetService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8521FB929A00E1ECB2 /* QMAttachmentAssetService.m */; }; + CEFBFC6021FB929A00E1ECB2 /* QMAttachmentAssetService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8521FB929A00E1ECB2 /* QMAttachmentAssetService.m */; }; + CEFBFC6121FB929A00E1ECB2 /* QMMediaUploadService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8A21FB929A00E1ECB2 /* QMMediaUploadService.m */; }; + CEFBFC6221FB929A00E1ECB2 /* QMMediaUploadService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8A21FB929A00E1ECB2 /* QMMediaUploadService.m */; }; + CEFBFC6321FB929A00E1ECB2 /* QMMediaUploadService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8A21FB929A00E1ECB2 /* QMMediaUploadService.m */; }; + CEFBFC6421FB929A00E1ECB2 /* QMMediaDownloadService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8D21FB929A00E1ECB2 /* QMMediaDownloadService.m */; }; + CEFBFC6521FB929A00E1ECB2 /* QMMediaDownloadService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8D21FB929A00E1ECB2 /* QMMediaDownloadService.m */; }; + CEFBFC6621FB929A00E1ECB2 /* QMMediaDownloadService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8D21FB929A00E1ECB2 /* QMMediaDownloadService.m */; }; + CEFBFC6721FB929A00E1ECB2 /* QMAttachmentContentService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8E21FB929A00E1ECB2 /* QMAttachmentContentService.m */; }; + CEFBFC6821FB929A00E1ECB2 /* QMAttachmentContentService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8E21FB929A00E1ECB2 /* QMAttachmentContentService.m */; }; + CEFBFC6921FB929A00E1ECB2 /* QMAttachmentContentService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB8E21FB929A00E1ECB2 /* QMAttachmentContentService.m */; }; + CEFBFC6A21FB929A00E1ECB2 /* QMChatService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9021FB929A00E1ECB2 /* QMChatService.m */; }; + CEFBFC6B21FB929A00E1ECB2 /* QMChatService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9021FB929A00E1ECB2 /* QMChatService.m */; }; + CEFBFC6C21FB929A00E1ECB2 /* QMChatService.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9021FB929A00E1ECB2 /* QMChatService.m */; }; + CEFBFC6D21FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9221FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m */; }; + CEFBFC6E21FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9221FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m */; }; + CEFBFC6F21FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9221FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m */; }; + CEFBFC7021FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9521FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m */; }; + CEFBFC7121FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9521FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m */; }; + CEFBFC7221FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9521FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m */; }; + CEFBFC7321FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9721FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m */; }; + CEFBFC7421FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9721FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m */; }; + CEFBFC7521FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9721FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m */; }; + CEFBFC7621FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9821FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m */; }; + CEFBFC7721FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9821FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m */; }; + CEFBFC7821FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9821FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m */; }; + CEFBFC7921FB929A00E1ECB2 /* QMMessagesMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9C21FB929A00E1ECB2 /* QMMessagesMemoryStorage.m */; }; + CEFBFC7A21FB929A00E1ECB2 /* QMMessagesMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9C21FB929A00E1ECB2 /* QMMessagesMemoryStorage.m */; }; + CEFBFC7B21FB929A00E1ECB2 /* QMMessagesMemoryStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB9C21FB929A00E1ECB2 /* QMMessagesMemoryStorage.m */; }; + CEFBFC7C21FB9A2E00E1ECB2 /* QMDBStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6B21FB929A00E1ECB2 /* QMDBStorage.m */; }; + CEFBFC7D21FB9A2F00E1ECB2 /* QMDBStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6B21FB929A00E1ECB2 /* QMDBStorage.m */; }; + CEFBFC7E21FB9A5900E1ECB2 /* QMCDRecordStack.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6A21FB929A00E1ECB2 /* QMCDRecordStack.m */; }; + CEFBFC7F21FB9A5A00E1ECB2 /* QMCDRecordStack.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFBFB6A21FB929A00E1ECB2 /* QMCDRecordStack.m */; }; E002F3F11F508CF90044B0B3 /* NSString+QMValidation.m in Sources */ = {isa = PBXBuildFile; fileRef = E002F3F01F508CF90044B0B3 /* NSString+QMValidation.m */; }; - E01A5DD91F93F1FB00A85EC8 /* ShareInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E0CA1F4D1F84F78A00E9B293 /* ShareInterface.storyboard */; }; - E01A5DDA1F93F20500A85EC8 /* QMShareTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7951F8F7B0300382443 /* QMShareTableViewCell.m */; }; - E01A5DDB1F93F20800A85EC8 /* QMShareTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E0A8A7961F8F7B0300382443 /* QMShareTableViewCell.xib */; }; - E01A5DDE1F93F21400A85EC8 /* QMShareContactsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E0AA0E681F90E38C0082750E /* QMShareContactsTableViewCell.m */; }; - E01A5DDF1F93F21700A85EC8 /* QMShareContactsTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E0AA0E691F90E38C0082750E /* QMShareContactsTableViewCell.xib */; }; - E01A5DE11F93F22400A85EC8 /* QMShareDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A79A1F8F7B0300382443 /* QMShareDataSource.m */; }; - E01A5DE21F93F22600A85EC8 /* QMShareItemsDataProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A79D1F8F7B0300382443 /* QMShareItemsDataProvider.m */; }; - E01A5DE31F93F23000A85EC8 /* QBUUser+QMShareItemProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7BE1F8F9CAA00382443 /* QBUUser+QMShareItemProtocol.m */; }; - E01A5DE41F93F23600A85EC8 /* QBChatDialog+QMShareItemProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7801F8F7B0200382443 /* QBChatDialog+QMShareItemProtocol.m */; }; - E01A5DE51F93F23C00A85EC8 /* QMExtensionCache+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7861F8F7B0200382443 /* QMExtensionCache+QMShareExtension.m */; }; - E01A5DE61F93F37600A85EC8 /* QMShareCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E0A8A7921F8F7B0300382443 /* QMShareCollectionViewCell.xib */; }; - E01A5DE71F93F37900A85EC8 /* QMShareCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7911F8F7B0300382443 /* QMShareCollectionViewCell.m */; }; E01A5DE81F93F3BE00A85EC8 /* QMExtensionCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7B71F8F818800382443 /* QMExtensionCache.m */; }; - E01D88F41FAB69340049CD06 /* QMShareEtxentionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E01D88F31FAB69340049CD06 /* QMShareEtxentionOperation.m */; }; - E01D88F51FAB69340049CD06 /* QMShareEtxentionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E01D88F31FAB69340049CD06 /* QMShareEtxentionOperation.m */; }; E026A76E1E82B9A10054AD83 /* UIScreen+QMLock.m in Sources */ = {isa = PBXBuildFile; fileRef = E026A76D1E82B9A10054AD83 /* UIScreen+QMLock.m */; }; - E02AAC531FC4656A003C69BF /* Quickblox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E02AAC511FC46562003C69BF /* Quickblox.framework */; }; - E02AAC541FC4656A003C69BF /* Quickblox.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E02AAC511FC46562003C69BF /* Quickblox.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - E03871CD1DDB354700554EB9 /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E03871CB1DDB354700554EB9 /* Intents.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - E03871CE1DDB354700554EB9 /* IntentsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E03871CC1DDB354700554EB9 /* IntentsUI.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; E03AD8EE1F556D7500F411CE /* QMExpandableTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E03AD8ED1F556D7500F411CE /* QMExpandableTableViewController.m */; }; E03AD8F31F55703400F411CE /* QMValidationCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E03AD8F11F55703300F411CE /* QMValidationCell.m */; }; E03AD8F41F55703400F411CE /* QMValidationCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E03AD8F21F55703300F411CE /* QMValidationCell.xib */; }; - E03AF8041FACDC6400DFEE7A /* NSError+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E03AF8031FACDC6400DFEE7A /* NSError+QMShareExtension.m */; }; - E03AF8051FACDC6400DFEE7A /* NSError+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E03AF8031FACDC6400DFEE7A /* NSError+QMShareExtension.m */; }; E03AF8131FACDE5E00DFEE7A /* QBSettings+Qmunicate.m in Sources */ = {isa = PBXBuildFile; fileRef = E03AF8121FACDE5E00DFEE7A /* QBSettings+Qmunicate.m */; }; E03AF8141FACDE5E00DFEE7A /* QBSettings+Qmunicate.m in Sources */ = {isa = PBXBuildFile; fileRef = E03AF8121FACDE5E00DFEE7A /* QBSettings+Qmunicate.m */; }; E03AF8151FACDE5E00DFEE7A /* QBSettings+Qmunicate.m in Sources */ = {isa = PBXBuildFile; fileRef = E03AF8121FACDE5E00DFEE7A /* QBSettings+Qmunicate.m */; }; @@ -200,30 +503,14 @@ E049C7671F8D166C00CD0376 /* QMTableViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 5877D6D31C46709A00938E5D /* QMTableViewDataSource.m */; }; E04D268E1F8E4408005CB2FD /* QMNoResultsCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 58D847921C89A9FE000C40BA /* QMNoResultsCell.m */; }; E04D268F1F8E440C005CB2FD /* QMNoResultsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 58D847941C89AA38000C40BA /* QMNoResultsCell.xib */; }; - E04E45C71DE5A78700A0E0FC /* QMSiriHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E04E45C61DE5A78700A0E0FC /* QMSiriHelper.m */; }; - E051D6371F3CA3600054D46B /* QMLog.m in Sources */ = {isa = PBXBuildFile; fileRef = E051D6361F3CA3600054D46B /* QMLog.m */; }; - E05AEC5A1F9A0E1F004D3274 /* NSURL+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E05AEC591F9A0E1F004D3274 /* NSURL+QMShareExtension.m */; }; - E05AEC5E1F9A4AE8004D3274 /* QMShareTasks.m in Sources */ = {isa = PBXBuildFile; fileRef = E05AEC5D1F9A4AE8004D3274 /* QMShareTasks.m */; }; E05DEA1B1FB1F6FE00D36C6E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 55286995199131B5006F92CB /* Localizable.strings */; }; - E063556D1E1D1D4F00BE9061 /* IntentHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = E063556A1E1D1D4F00BE9061 /* IntentHandler.m */; }; - E063556E1E1D1D4F00BE9061 /* QMMessageIntentHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = E063556C1E1D1D4F00BE9061 /* QMMessageIntentHandler.m */; }; - E06355721E1D1E3300BE9061 /* QBUUser+INPerson.m in Sources */ = {isa = PBXBuildFile; fileRef = E06355711E1D1E3300BE9061 /* QBUUser+INPerson.m */; }; - E06355771E1D3CA800BE9061 /* QBChatDialog+INPerson.m in Sources */ = {isa = PBXBuildFile; fileRef = E06355761E1D3CA800BE9061 /* QBChatDialog+INPerson.m */; }; - E0695E5F1FBA6BB000B53E6D /* NSURL+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E05AEC591F9A0E1F004D3274 /* NSURL+QMShareExtension.m */; }; E069B0171FC6FFF5005F9AB1 /* QMTasks.m in Sources */ = {isa = PBXBuildFile; fileRef = E069B0161FC6FFF5005F9AB1 /* QMTasks.m */; }; E069B0191FC73130005F9AB1 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69D57E6718ACC11C00A9900A /* Images.xcassets */; }; - E06B0D8D1FA7B5E9002E75D5 /* QMAttachmentProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = E06B0D8C1FA7B5E9002E75D5 /* QMAttachmentProvider.m */; }; - E06B0D8E1FA8CE02002E75D5 /* QMAttachmentProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = E06B0D8C1FA7B5E9002E75D5 /* QMAttachmentProvider.m */; }; E06F890B1E60FFF30017BBEC /* QMCallWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = E06F890A1E60FFF30017BBEC /* QMCallWindow.m */; }; E074459D1F87903200D12325 /* QMColors.m in Sources */ = {isa = PBXBuildFile; fileRef = 581BAC8D1CAD8DD900E0567D /* QMColors.m */; }; E074459E1F87AD0000D12325 /* QMAlphabetizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 589792981C99941400CC6438 /* QMAlphabetizer.m */; }; E07773A01FB5CD43006B63FA /* QMShareHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E077739F1FB5CD43006B63FA /* QMShareHelper.m */; }; E07BC2271DDF5FD900B8D3B0 /* QMSiriExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = E07BC21F1DDF5FD900B8D3B0 /* QMSiriExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - E07CB8A51FAD2B1A0027087E /* QMShareRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E07CB8A31FAD2B1A0027087E /* QMShareRootViewController.m */; }; - E07CB8A81FAD2F640027087E /* QMShareTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E07CB8A71FAD2F640027087E /* QMShareTableViewController.m */; }; - E07CB8A91FAD2F640027087E /* QMShareTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E07CB8A71FAD2F640027087E /* QMShareTableViewController.m */; }; - E07CB8AB1FAD31320027087E /* QMShareTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E07CB8AA1FAD31320027087E /* QMShareTableViewController.xib */; }; - E07CB8AC1FAD31320027087E /* QMShareTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E07CB8AA1FAD31320027087E /* QMShareTableViewController.xib */; }; E08441D91E1E611D00B87D0F /* NSString+QMSiriUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = E08441D81E1E611D00B87D0F /* NSString+QMSiriUtils.m */; }; E08441DA1E1E611D00B87D0F /* NSString+QMSiriUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = E08441D81E1E611D00B87D0F /* NSString+QMSiriUtils.m */; }; E08ADF5E1F8CCD6D0099CF99 /* QMDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = E08ADF5D1F8CCD6D0099CF99 /* QMDataSource.m */; }; @@ -231,37 +518,14 @@ E08B868B1F86540000FA8291 /* QMTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 5877D6D91C46720600938E5D /* QMTableViewCell.m */; }; E08D52151E5AABF700918B5B /* QMMediaController.m in Sources */ = {isa = PBXBuildFile; fileRef = E08D52141E5AABF700918B5B /* QMMediaController.m */; }; E0921D941F6FEE11005961CF /* QMImageBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E0921D931F6FEE11005961CF /* QMImageBarButtonItem.m */; }; - E096AABA1F9F391800EDDEE3 /* QMLog.m in Sources */ = {isa = PBXBuildFile; fileRef = E051D6361F3CA3600054D46B /* QMLog.m */; }; E09FCA671E60A9270013E3EB /* QMAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = E09FCA661E60A9270013E3EB /* QMAudioPlayer.m */; }; - E0A8A79E1F8F7B0300382443 /* QBChatDialog+QMShareItemProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7801F8F7B0200382443 /* QBChatDialog+QMShareItemProtocol.m */; }; - E0A8A7A01F8F7B0300382443 /* QMExtensionCache+QMShareExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7861F8F7B0200382443 /* QMExtensionCache+QMShareExtension.m */; }; - E0A8A7A31F8F7B0300382443 /* QMShareCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7911F8F7B0300382443 /* QMShareCollectionViewCell.m */; }; - E0A8A7A41F8F7B0300382443 /* QMShareCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E0A8A7921F8F7B0300382443 /* QMShareCollectionViewCell.xib */; }; - E0A8A7A51F8F7B0300382443 /* QMShareTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7951F8F7B0300382443 /* QMShareTableViewCell.m */; }; - E0A8A7A61F8F7B0300382443 /* QMShareTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E0A8A7961F8F7B0300382443 /* QMShareTableViewCell.xib */; }; - E0A8A7A71F8F7B0300382443 /* QMShareDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A79A1F8F7B0300382443 /* QMShareDataSource.m */; }; - E0A8A7A81F8F7B0300382443 /* QMShareItemsDataProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A79D1F8F7B0300382443 /* QMShareItemsDataProvider.m */; }; E0A8A7B91F8F818B00382443 /* QMExtensionCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7B71F8F818800382443 /* QMExtensionCache.m */; }; E0A8A7BA1F8F818C00382443 /* QMExtensionCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7B71F8F818800382443 /* QMExtensionCache.m */; }; - E0A8A7BD1F8F8B3000382443 /* QMExtensionCache+QMSiriExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7BC1F8F8B3000382443 /* QMExtensionCache+QMSiriExtension.m */; }; - E0A8A7BF1F8F9CAA00382443 /* QBUUser+QMShareItemProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A8A7BE1F8F9CAA00382443 /* QBUUser+QMShareItemProtocol.m */; }; E0A8A7C01F8FADB200382443 /* QMImages.m in Sources */ = {isa = PBXBuildFile; fileRef = 58D9522F1CEE078F001C43F7 /* QMImages.m */; }; - E0A996681FC84043008AFFBE /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A9965E1FC84042008AFFBE /* SVIndefiniteAnimatedView.m */; }; - E0A996691FC84043008AFFBE /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A996601FC84042008AFFBE /* SVProgressAnimatedView.m */; }; - E0A9966A1FC84043008AFFBE /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = E0A996621FC84042008AFFBE /* SVProgressHUD.bundle */; }; - E0A9966B1FC84043008AFFBE /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A996641FC84042008AFFBE /* SVProgressHUD.m */; }; - E0A9966C1FC84043008AFFBE /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = E0A996661FC84042008AFFBE /* SVRadialGradientLayer.m */; }; - E0AA0E6A1F90E38C0082750E /* QMShareContactsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E0AA0E681F90E38C0082750E /* QMShareContactsTableViewCell.m */; }; - E0AA0E6B1F90E38C0082750E /* QMShareContactsTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E0AA0E691F90E38C0082750E /* QMShareContactsTableViewCell.xib */; }; E0B5CEDD1F978689004CB06D /* QMActivityItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E0B5CEDC1F978688004CB06D /* QMActivityItem.m */; }; E0B5CEDE1F978689004CB06D /* QMActivityItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E0B5CEDC1F978688004CB06D /* QMActivityItem.m */; }; E0B6A3361E2A615E001125FC /* AppIntentVocabulary.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0B6A3381E2A615E001125FC /* AppIntentVocabulary.plist */; }; - E0CA1F4F1F84F78A00E9B293 /* ShareInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E0CA1F4D1F84F78A00E9B293 /* ShareInterface.storyboard */; }; E0CA1F531F84F78A00E9B293 /* QMShareExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = E0CA1F481F84F78A00E9B293 /* QMShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - E0D3D9A51F4DCCBB006AB505 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E0D3D9A41F4DCCBA006AB505 /* CoreTelephony.framework */; }; - E333FBA81F5461FA0095F224 /* QuickbloxWebRTC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E333FBA51F5461FA0095F224 /* QuickbloxWebRTC.framework */; }; - E333FBA91F5461FA0095F224 /* QuickbloxWebRTC.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E333FBA51F5461FA0095F224 /* QuickbloxWebRTC.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - E39BEBBA1F6BF04000F7D50F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E39BEBB91F6BF02700F7D50F /* GoogleService-Info.plist */; }; E3A99BCF1FD00C8F00D0907B /* QMCallKitAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = E3A99BCE1FD00C8F00D0907B /* QMCallKitAdapter.m */; }; E3D2EEA41EF7C693002DC44E /* QMTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E3D2EEA31EF7C693002DC44E /* QMTableViewController.m */; }; E3D2EEA81EF7E71C002DC44E /* QMViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E3D2EEA71EF7E71C002DC44E /* QMViewController.m */; }; @@ -287,35 +551,42 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - E03871F31DDB36F800554EB9 /* Embed App Extensions */ = { + CE5DA6B4232A56D50057C865 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; - dstSubfolderSpec = 13; + dstSubfolderSpec = 10; files = ( - E0CA1F531F84F78A00E9B293 /* QMShareExtension.appex in Embed App Extensions */, - E07BC2271DDF5FD900B8D3B0 /* QMSiriExtension.appex in Embed App Extensions */, ); - name = "Embed App Extensions"; + name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - E333FBA31F5460E70095F224 /* Embed Frameworks */ = { + CE5DA6B7232A56EB0057C865 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - E333FBA91F5461FA0095F224 /* QuickbloxWebRTC.framework in Embed Frameworks */, - E02AAC541FC4656A003C69BF /* Quickblox.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + E03871F31DDB36F800554EB9 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + E0CA1F531F84F78A00E9B293 /* QMShareExtension.appex in Embed App Extensions */, + E07BC2271DDF5FD900B8D3B0 /* QMSiriExtension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 269116E9D6D043D8FAC9E1D8 /* Pods-Q-municate.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Q-municate.release.xcconfig"; path = "Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate.release.xcconfig"; sourceTree = ""; }; - 380C6A0B58B1BD8187211951 /* Pods-QMShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QMShareExtension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension.debug.xcconfig"; sourceTree = ""; }; + 3CB1BC82EABEC4527C5698BE /* Pods-QMShareExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QMShareExtension.release.xcconfig"; path = "Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension.release.xcconfig"; sourceTree = ""; }; 55286995199131B5006F92CB /* Localizable.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; 559327A2199216FB001C4BF8 /* Q-municate Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Q-municate Tests-Info.plist"; sourceTree = ""; }; 559327A4199216FB001C4BF8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -357,7 +628,6 @@ 580FEBF51CC50423000AED72 /* QMMessagesHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMMessagesHelper.m; sourceTree = ""; }; 581BAC8C1CAD8DD900E0567D /* QMColors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMColors.h; sourceTree = ""; }; 581BAC8D1CAD8DD900E0567D /* QMColors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMColors.m; sourceTree = ""; }; - 581DA1CF1BF3732900F75D8B /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; 581DA1D11BF373A100F75D8B /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; 581F6E201D3E3E1C0087BC7A /* QMHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QMHelpers.h; path = QMHelpers/QMHelpers.h; sourceTree = ""; }; 581F6E211D3E3E1C0087BC7A /* QMHelpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = QMHelpers.m; path = QMHelpers/QMHelpers.m; sourceTree = ""; }; @@ -558,6 +828,9 @@ 58FD668D1CEF12D500B72425 /* QMAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAlert.m; sourceTree = ""; }; 58FD66951CEF378200B72425 /* QMChangePasswordViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChangePasswordViewController.h; sourceTree = ""; }; 58FD66961CEF378200B72425 /* QMChangePasswordViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChangePasswordViewController.m; sourceTree = ""; }; + 594E7276015B6E39FCBE7812 /* Pods_Q_municate.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Q_municate.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5E7A04F78E6642A2DA605239 /* Pods_QMSiriExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_QMSiriExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 67AD362B1BAE08A2AF1AF45D /* Pods_QMShareExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_QMShareExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 690A271418CA0F35003D6B80 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; 697E2D4A196EA82400CD2BDE /* QMLicenseAgreementViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMLicenseAgreementViewController.h; sourceTree = ""; }; 697E2D4B196EA82400CD2BDE /* QMLicenseAgreementViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMLicenseAgreementViewController.m; sourceTree = ""; }; @@ -585,30 +858,371 @@ 69DB5EF418E31D6400277226 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; 86FD874A1982510700B6FA43 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 86FD874C1982512000B6FA43 /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; }; - 914D22F55FCE43364D718A2A /* Pods-QMSiriExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QMSiriExtension.release.xcconfig"; path = "Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension.release.xcconfig"; sourceTree = ""; }; - AAF30F47522590E10692EA18 /* Pods-QMSiriExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QMSiriExtension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension.debug.xcconfig"; sourceTree = ""; }; - AD92D3E3278E539BF388354D /* Pods-QMShareExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QMShareExtension.release.xcconfig"; path = "Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension.release.xcconfig"; sourceTree = ""; }; - BDCDFBABCBCAE9059D55762E /* libPods-QMSiriExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-QMSiriExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - DC91E0EEDD13E8E5F666C98A /* libPods-QMShareExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-QMShareExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + A882BC1317494F7309B1EF9C /* Pods-Q-municate.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Q-municate.debug.xcconfig"; path = "Target Support Files/Pods-Q-municate/Pods-Q-municate.debug.xcconfig"; sourceTree = ""; }; + C64575C942EA97E9F5225A33 /* Pods-Q-municate.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Q-municate.release.xcconfig"; path = "Target Support Files/Pods-Q-municate/Pods-Q-municate.release.xcconfig"; sourceTree = ""; }; + CAF70B5C04A0C1D0C4EB5E2E /* Pods-QMShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QMShareExtension.debug.xcconfig"; path = "Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension.debug.xcconfig"; sourceTree = ""; }; + CE55636E21FBBC960051EC2D /* QMShareExtension.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = QMShareExtension.entitlements; sourceTree = ""; }; + CE55637121FBBC960051EC2D /* QMShareItemsDataProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareItemsDataProvider.h; sourceTree = ""; }; + CE55637221FBBC960051EC2D /* QMShareItemsDataProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareItemsDataProvider.m; sourceTree = ""; }; + CE55637421FBBC960051EC2D /* QMShareDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareDataSource.m; sourceTree = ""; }; + CE55637521FBBC960051EC2D /* QMShareDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareDataSource.h; sourceTree = ""; }; + CE55637621FBBC960051EC2D /* Image.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Image.xcassets; sourceTree = ""; }; + CE55637821FBBC960051EC2D /* QMShareTableViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMShareTableViewController.xib; sourceTree = ""; }; + CE55637921FBBC960051EC2D /* QMShareRootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareRootViewController.m; sourceTree = ""; }; + CE55637A21FBBC960051EC2D /* QMShareTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareTableViewController.m; sourceTree = ""; }; + CE55637B21FBBC960051EC2D /* QMShareTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareTableViewController.h; sourceTree = ""; }; + CE55637C21FBBC960051EC2D /* QMShareRootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareRootViewController.h; sourceTree = ""; }; + CE55637E21FBBC960051EC2D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ShareInterface.storyboard; sourceTree = ""; }; + CE55638021FBBC960051EC2D /* QMAttachmentProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAttachmentProvider.h; sourceTree = ""; }; + CE55638121FBBC960051EC2D /* QMShareTasks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareTasks.m; sourceTree = ""; }; + CE55638221FBBC960051EC2D /* QMShareEtxentionOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareEtxentionOperation.h; sourceTree = ""; }; + CE55638321FBBC960051EC2D /* QMAttachmentProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAttachmentProvider.m; sourceTree = ""; }; + CE55638421FBBC960051EC2D /* QMShareTasks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareTasks.h; sourceTree = ""; }; + CE55638521FBBC960051EC2D /* QMShareEtxentionOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareEtxentionOperation.m; sourceTree = ""; }; + CE55638821FBBC960051EC2D /* QMShareCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareCollectionViewCell.h; sourceTree = ""; }; + CE55638921FBBC960051EC2D /* QMShareCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMShareCollectionViewCell.xib; sourceTree = ""; }; + CE55638A21FBBC960051EC2D /* QMShareCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareCollectionViewCell.m; sourceTree = ""; }; + CE55638C21FBBC960051EC2D /* QMShareTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareTableViewCell.m; sourceTree = ""; }; + CE55638D21FBBC960051EC2D /* QMShareTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareTableViewCell.h; sourceTree = ""; }; + CE55638E21FBBC960051EC2D /* QMShareTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMShareTableViewCell.xib; sourceTree = ""; }; + CE55639021FBBC960051EC2D /* QMShareContactsTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMShareContactsTableViewCell.xib; sourceTree = ""; }; + CE55639121FBBC960051EC2D /* QMShareContactsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareContactsTableViewCell.m; sourceTree = ""; }; + CE55639221FBBC960051EC2D /* QMShareContactsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareContactsTableViewCell.h; sourceTree = ""; }; + CE55639521FBBC960051EC2D /* QMExtensionCache+QMShareExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QMExtensionCache+QMShareExtension.h"; sourceTree = ""; }; + CE55639621FBBC960051EC2D /* QMExtensionCache+QMShareExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QMExtensionCache+QMShareExtension.m"; sourceTree = ""; }; + CE55639821FBBC970051EC2D /* NSError+QMShareExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+QMShareExtension.m"; sourceTree = ""; }; + CE55639921FBBC970051EC2D /* NSURL+QMShareExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURL+QMShareExtension.h"; sourceTree = ""; }; + CE55639A21FBBC970051EC2D /* NSError+QMShareExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+QMShareExtension.h"; sourceTree = ""; }; + CE55639B21FBBC970051EC2D /* NSURL+QMShareExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURL+QMShareExtension.m"; sourceTree = ""; }; + CE55639D21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBChatDialog+QMShareItemProtocol.m"; sourceTree = ""; }; + CE55639E21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBChatDialog+QMShareItemProtocol.h"; sourceTree = ""; }; + CE5563A021FBBC970051EC2D /* QBUUser+QMShareItemProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBUUser+QMShareItemProtocol.h"; sourceTree = ""; }; + CE5563A121FBBC970051EC2D /* QBUUser+QMShareItemProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBUUser+QMShareItemProtocol.m"; sourceTree = ""; }; + CE5563A321FBBC970051EC2D /* QMShareItemProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareItemProtocol.h; sourceTree = ""; }; + CE5563A421FBBC970051EC2D /* QMShareViewProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareViewProtocol.h; sourceTree = ""; }; + CE5563A521FBBC970051EC2D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CE5563D321FBBCA30051EC2D /* QBChatDialog+INPerson.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBChatDialog+INPerson.m"; sourceTree = ""; }; + CE5563D421FBBCA30051EC2D /* QMSiriHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMSiriHelper.m; sourceTree = ""; }; + CE5563D621FBBCA30051EC2D /* QMMessageIntentHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMMessageIntentHandler.h; sourceTree = ""; }; + CE5563D721FBBCA30051EC2D /* IntentHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntentHandler.h; sourceTree = ""; }; + CE5563D821FBBCA30051EC2D /* IntentHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IntentHandler.m; sourceTree = ""; }; + CE5563D921FBBCA30051EC2D /* QMMessageIntentHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMMessageIntentHandler.m; sourceTree = ""; }; + CE5563DA21FBBCA30051EC2D /* QBChatDialog+INPerson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBChatDialog+INPerson.h"; sourceTree = ""; }; + CE5563DB21FBBCA30051EC2D /* QMSiriExtension.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = QMSiriExtension.entitlements; sourceTree = ""; }; + CE5563DC21FBBCA30051EC2D /* QMSiriHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMSiriHelper.h; sourceTree = ""; }; + CE5563DE21FBBCA30051EC2D /* QMExtensionCache+QMSiriExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QMExtensionCache+QMSiriExtension.h"; sourceTree = ""; }; + CE5563DF21FBBCA30051EC2D /* QBUUser+INPerson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBUUser+INPerson.h"; sourceTree = ""; }; + CE5563E021FBBCA30051EC2D /* QBUUser+INPerson.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBUUser+INPerson.m"; sourceTree = ""; }; + CE5563E121FBBCA30051EC2D /* QMExtensionCache+QMSiriExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QMExtensionCache+QMSiriExtension.m"; sourceTree = ""; }; + CE5563E221FBBCA30051EC2D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CE5563E421FBBCA30051EC2D /* IntentViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntentViewController.h; sourceTree = ""; }; + CE5563E621FBBCA30051EC2D /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainInterface.storyboard; sourceTree = ""; }; + CE5563E721FBBCA30051EC2D /* QMSiriExtensionUI.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = QMSiriExtensionUI.entitlements; sourceTree = ""; }; + CE5563E821FBBCA30051EC2D /* IntentViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IntentViewController.m; sourceTree = ""; }; + CE5563E921FBBCA30051EC2D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CE57CC5B21FA002D0026A23F /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/QMChatViewController.xib; sourceTree = ""; }; + CE57CC5C21FA002D0026A23F /* QMChatViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatViewController.h; sourceTree = ""; }; + CE57CC5F21FA002D0026A23F /* QMChatResources.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatResources.m; sourceTree = ""; }; + CE57CC6021FA002D0026A23F /* QMChatResources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatResources.h; sourceTree = ""; }; + CE57CC6221FA002D0026A23F /* QMDateUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMDateUtils.h; sourceTree = ""; }; + CE57CC6321FA002D0026A23F /* QMDateUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMDateUtils.m; sourceTree = ""; }; + CE57CC6521FA002D0026A23F /* QMImageLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMImageLoader.m; sourceTree = ""; }; + CE57CC6621FA002D0026A23F /* QMImageLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMImageLoader.h; sourceTree = ""; }; + CE57CC6721FA002D0026A23F /* QMChatViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatViewController.m; sourceTree = ""; }; + CE57CC6921FA002D0026A23F /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; + CE57CC6B21FA002D0026A23F /* QBChatMessage+QBDateDivider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBChatMessage+QBDateDivider.h"; sourceTree = ""; }; + CE57CC6C21FA002D0026A23F /* NSDate+ChatDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+ChatDataSource.h"; sourceTree = ""; }; + CE57CC6D21FA002D0026A23F /* QMChatDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatDataSource.h; sourceTree = ""; }; + CE57CC6E21FA002D0026A23F /* QBChatMessage+QBDateDivider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBChatMessage+QBDateDivider.m"; sourceTree = ""; }; + CE57CC6F21FA002D0026A23F /* NSDate+ChatDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+ChatDataSource.m"; sourceTree = ""; }; + CE57CC7021FA002D0026A23F /* QMChatDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatDataSource.m; sourceTree = ""; }; + CE57CC7221FA002D0026A23F /* QMKVOView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMKVOView.h; sourceTree = ""; }; + CE57CC7521FA002D0026A23F /* QMChatAttachmentOutgoingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatAttachmentOutgoingCell.m; sourceTree = ""; }; + CE57CC7621FA002D0026A23F /* QMChatAttachmentOutgoingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatAttachmentOutgoingCell.h; sourceTree = ""; }; + CE57CC7721FA002D0026A23F /* QMChatAttachmentOutgoingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMChatAttachmentOutgoingCell.xib; sourceTree = ""; }; + CE57CC7921FA002D0026A23F /* QMChatIncomingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatIncomingCell.h; sourceTree = ""; }; + CE57CC7A21FA002D0026A23F /* QMChatIncomingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMChatIncomingCell.xib; sourceTree = ""; }; + CE57CC7B21FA002D0026A23F /* QMChatIncomingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatIncomingCell.m; sourceTree = ""; }; + CE57CC7D21FA002D0026A23F /* QMChatContactRequestCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatContactRequestCell.h; sourceTree = ""; }; + CE57CC7E21FA002D0026A23F /* QMChatContactRequestCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatContactRequestCell.m; sourceTree = ""; }; + CE57CC7F21FA002D0026A23F /* QMChatContactRequestCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMChatContactRequestCell.xib; sourceTree = ""; }; + CE57CC8121FA002D0026A23F /* QMChatCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatCell.h; sourceTree = ""; }; + CE57CC8221FA002D0026A23F /* QMChatCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatCell.m; sourceTree = ""; }; + CE57CC8421FA002D0026A23F /* QMChatBaseLinkPreviewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatBaseLinkPreviewCell.m; sourceTree = ""; }; + CE57CC8621FA002D0026A23F /* QMChatOutgoingLinkPreviewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatOutgoingLinkPreviewCell.m; sourceTree = ""; }; + CE57CC8721FA002D0026A23F /* QMChatOutgoingLinkPreviewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatOutgoingLinkPreviewCell.h; sourceTree = ""; }; + CE57CC8821FA002D0026A23F /* QMChatOutgoingLinkPreviewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMChatOutgoingLinkPreviewCell.xib; sourceTree = ""; }; + CE57CC8921FA002E0026A23F /* QMChatBaseLinkPreviewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatBaseLinkPreviewCell.h; sourceTree = ""; }; + CE57CC8A21FA002E0026A23F /* QMLinkPreviewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMLinkPreviewDelegate.h; sourceTree = ""; }; + CE57CC8C21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatIncomingLinkPreviewCell.h; sourceTree = ""; }; + CE57CC8D21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMChatIncomingLinkPreviewCell.xib; sourceTree = ""; }; + CE57CC8E21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatIncomingLinkPreviewCell.m; sourceTree = ""; }; + CE57CC9121FA002E0026A23F /* QMImageOutgoingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMImageOutgoingCell.m; sourceTree = ""; }; + CE57CC9221FA002E0026A23F /* QMImageOutgoingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMImageOutgoingCell.h; sourceTree = ""; }; + CE57CC9321FA002E0026A23F /* QMImageOutgoingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMImageOutgoingCell.xib; sourceTree = ""; }; + CE57CC9521FA002E0026A23F /* QMBaseMediaCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMBaseMediaCell.m; sourceTree = ""; }; + CE57CC9621FA002E0026A23F /* QMBaseMediaCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMBaseMediaCell.h; sourceTree = ""; }; + CE57CC9821FA002E0026A23F /* QMAudioIncomingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAudioIncomingCell.h; sourceTree = ""; }; + CE57CC9921FA002E0026A23F /* QMAudioIncomingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMAudioIncomingCell.xib; sourceTree = ""; }; + CE57CC9A21FA002E0026A23F /* QMAudioIncomingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAudioIncomingCell.m; sourceTree = ""; }; + CE57CC9C21FA002E0026A23F /* QMMediaOutgoingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMMediaOutgoingCell.m; sourceTree = ""; }; + CE57CC9D21FA002E0026A23F /* QMMediaOutgoingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMMediaOutgoingCell.h; sourceTree = ""; }; + CE57CC9F21FA002E0026A23F /* QMVideoIncomingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMVideoIncomingCell.h; sourceTree = ""; }; + CE57CCA021FA002E0026A23F /* QMVideoIncomingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMVideoIncomingCell.xib; sourceTree = ""; }; + CE57CCA121FA002E0026A23F /* QMVideoIncomingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMVideoIncomingCell.m; sourceTree = ""; }; + CE57CCA321FA002E0026A23F /* QMMediaViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMMediaViewDelegate.h; sourceTree = ""; }; + CE57CCA521FA002E0026A23F /* QMImageIncomingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMImageIncomingCell.m; sourceTree = ""; }; + CE57CCA621FA002E0026A23F /* QMImageIncomingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMImageIncomingCell.h; sourceTree = ""; }; + CE57CCA721FA002E0026A23F /* QMImageIncomingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMImageIncomingCell.xib; sourceTree = ""; }; + CE57CCA921FA002E0026A23F /* QMAudioOutgoingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAudioOutgoingCell.h; sourceTree = ""; }; + CE57CCAA21FA002E0026A23F /* QMAudioOutgoingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAudioOutgoingCell.m; sourceTree = ""; }; + CE57CCAB21FA002E0026A23F /* QMAudioOutgoingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMAudioOutgoingCell.xib; sourceTree = ""; }; + CE57CCAD21FA002E0026A23F /* QMMediaIncomingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMMediaIncomingCell.m; sourceTree = ""; }; + CE57CCAE21FA002E0026A23F /* QMMediaIncomingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMMediaIncomingCell.h; sourceTree = ""; }; + CE57CCB021FA002E0026A23F /* QMVideoOutgoingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMVideoOutgoingCell.h; sourceTree = ""; }; + CE57CCB121FA002E0026A23F /* QMVideoOutgoingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMVideoOutgoingCell.xib; sourceTree = ""; }; + CE57CCB221FA002E0026A23F /* QMVideoOutgoingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMVideoOutgoingCell.m; sourceTree = ""; }; + CE57CCB421FA002E0026A23F /* QMChatLocationIncomingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatLocationIncomingCell.h; sourceTree = ""; }; + CE57CCB521FA002E0026A23F /* QMChatLocationIncomingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatLocationIncomingCell.m; sourceTree = ""; }; + CE57CCB621FA002E0026A23F /* QMChatLocationIncomingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMChatLocationIncomingCell.xib; sourceTree = ""; }; + CE57CCB821FA002E0026A23F /* QMChatAttachmentIncomingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatAttachmentIncomingCell.m; sourceTree = ""; }; + CE57CCB921FA002E0026A23F /* QMChatAttachmentIncomingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMChatAttachmentIncomingCell.xib; sourceTree = ""; }; + CE57CCBA21FA002E0026A23F /* QMChatAttachmentIncomingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatAttachmentIncomingCell.h; sourceTree = ""; }; + CE57CCBC21FA002E0026A23F /* QMChatAttachmentCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatAttachmentCell.h; sourceTree = ""; }; + CE57CCBE21FA002E0026A23F /* QMBaseChatLocationCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMBaseChatLocationCell.h; sourceTree = ""; }; + CE57CCBF21FA002E0026A23F /* QMChatLocationCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatLocationCell.h; sourceTree = ""; }; + CE57CCC021FA002E0026A23F /* QMBaseChatLocationCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMBaseChatLocationCell.m; sourceTree = ""; }; + CE57CCC221FA002E0026A23F /* QMChatOutgoingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatOutgoingCell.h; sourceTree = ""; }; + CE57CCC321FA002E0026A23F /* QMChatOutgoingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatOutgoingCell.m; sourceTree = ""; }; + CE57CCC421FA002E0026A23F /* QMChatOutgoingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMChatOutgoingCell.xib; sourceTree = ""; }; + CE57CCC621FA002E0026A23F /* QMChatLocationOutgoingCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatLocationOutgoingCell.h; sourceTree = ""; }; + CE57CCC721FA002E0026A23F /* QMChatLocationOutgoingCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatLocationOutgoingCell.m; sourceTree = ""; }; + CE57CCC821FA002E0026A23F /* QMChatLocationOutgoingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMChatLocationOutgoingCell.xib; sourceTree = ""; }; + CE57CCCA21FA002E0026A23F /* QMChatNotificationCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMChatNotificationCell.xib; sourceTree = ""; }; + CE57CCCB21FA002E0026A23F /* QMChatNotificationCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatNotificationCell.h; sourceTree = ""; }; + CE57CCCC21FA002E0026A23F /* QMChatNotificationCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatNotificationCell.m; sourceTree = ""; }; + CE57CCCF21FA002E0026A23F /* QMHeaderCollectionReusableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMHeaderCollectionReusableView.h; sourceTree = ""; }; + CE57CCD021FA002E0026A23F /* QMHeaderCollectionReusableView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMHeaderCollectionReusableView.xib; sourceTree = ""; }; + CE57CCD121FA002E0026A23F /* QMHeaderCollectionReusableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMHeaderCollectionReusableView.m; sourceTree = ""; }; + CE57CCD321FA002E0026A23F /* QMPlaceHolderTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMPlaceHolderTextView.h; sourceTree = ""; }; + CE57CCD421FA002E0026A23F /* QMPlaceHolderTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMPlaceHolderTextView.m; sourceTree = ""; }; + CE57CCD621FA002E0026A23F /* QMInputToolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMInputToolbar.m; sourceTree = ""; }; + CE57CCD721FA002E0026A23F /* QMToolbarContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMToolbarContentView.h; sourceTree = ""; }; + CE57CCD821FA002E0026A23F /* QMInputToolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMInputToolbar.h; sourceTree = ""; }; + CE57CCD921FA002E0026A23F /* QMToolbarContentView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMToolbarContentView.xib; sourceTree = ""; }; + CE57CCDA21FA002E0026A23F /* QMToolbarContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMToolbarContentView.m; sourceTree = ""; }; + CE57CCDC21FA002E0026A23F /* QMProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMProgressView.h; sourceTree = ""; }; + CE57CCDD21FA002E0026A23F /* QMProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMProgressView.m; sourceTree = ""; }; + CE57CCDF21FA002E0026A23F /* QMAudioRecordView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAudioRecordView.h; sourceTree = ""; }; + CE57CCE021FA002E0026A23F /* QMAudioRecordView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAudioRecordView.m; sourceTree = ""; }; + CE57CCE121FA002E0026A23F /* QMAudioRecordView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMAudioRecordView.xib; sourceTree = ""; }; + CE57CCE321FA002E0026A23F /* QMImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMImageView.m; sourceTree = ""; }; + CE57CCE421FA002E0026A23F /* QMImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMImageView.h; sourceTree = ""; }; + CE57CCE621FA002E0026A23F /* QMAudioRecordButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAudioRecordButton.m; sourceTree = ""; }; + CE57CCE721FA002E0026A23F /* QMAudioRecordButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAudioRecordButton.h; sourceTree = ""; }; + CE57CCEA21FA002E0026A23F /* QMChatCollectionViewFlowLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatCollectionViewFlowLayout.h; sourceTree = ""; }; + CE57CCEB21FA002E0026A23F /* QMCollectionViewFlowLayoutInvalidationContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCollectionViewFlowLayoutInvalidationContext.h; sourceTree = ""; }; + CE57CCEC21FA002E0026A23F /* QMChatCellLayoutAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatCellLayoutAttributes.m; sourceTree = ""; }; + CE57CCED21FA002E0026A23F /* QMChatCellLayoutAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatCellLayoutAttributes.h; sourceTree = ""; }; + CE57CCEE21FA002E0026A23F /* QMCollectionViewFlowLayoutInvalidationContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMCollectionViewFlowLayoutInvalidationContext.m; sourceTree = ""; }; + CE57CCEF21FA002E0026A23F /* QMChatCollectionViewFlowLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatCollectionViewFlowLayout.m; sourceTree = ""; }; + CE57CCF021FA002E0026A23F /* QMChatCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatCollectionView.m; sourceTree = ""; }; + CE57CCF121FA002E0026A23F /* QMChatCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatCollectionView.h; sourceTree = ""; }; + CE57CCF221FA002E0026A23F /* QMChatContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatContainerView.h; sourceTree = ""; }; + CE57CCF321FA002E0026A23F /* QMKVOView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMKVOView.m; sourceTree = ""; }; + CE57CCF421FA002E0026A23F /* QMChatActionsHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatActionsHandler.h; sourceTree = ""; }; + CE57CCF521FA002E0026A23F /* QMChatContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatContainerView.m; sourceTree = ""; }; + CE57CCF721FA002E0026A23F /* UIColor+QM.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+QM.m"; sourceTree = ""; }; + CE57CCF821FA002E0026A23F /* UIImage+Cropper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Cropper.m"; sourceTree = ""; }; + CE57CCF921FA002E0026A23F /* UIView+QM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+QM.h"; sourceTree = ""; }; + CE57CCFA21FA002E0026A23F /* NSString+QM.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+QM.m"; sourceTree = ""; }; + CE57CCFB21FA002E0026A23F /* UIImage+QM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+QM.h"; sourceTree = ""; }; + CE57CCFC21FA002E0026A23F /* UIColor+QM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+QM.h"; sourceTree = ""; }; + CE57CCFD21FA002E0026A23F /* UIImage+Cropper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Cropper.h"; sourceTree = ""; }; + CE57CCFE21FA002E0026A23F /* NSString+QM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+QM.h"; sourceTree = ""; }; + CE57CCFF21FA002E0026A23F /* UIView+QM.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+QM.m"; sourceTree = ""; }; + CE57CD0021FA002E0026A23F /* UIImage+QM.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+QM.m"; sourceTree = ""; }; + CE57CD0221FA002E0026A23F /* QMChatCollectionViewDelegateFlowLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatCollectionViewDelegateFlowLayout.h; sourceTree = ""; }; + CE57CD0321FA002E0026A23F /* QMChatCollectionViewDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatCollectionViewDataSource.h; sourceTree = ""; }; + CE57CD0521FA002E0026A23F /* UIImageView+QMLocationSnapshot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+QMLocationSnapshot.m"; sourceTree = ""; }; + CE57CD0621FA002E0026A23F /* QMChatLocationSnapshotter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatLocationSnapshotter.m; sourceTree = ""; }; + CE57CD0721FA002E0026A23F /* UIImageView+QMLocationSnapshot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+QMLocationSnapshot.h"; sourceTree = ""; }; + CE57CD0821FA002E0026A23F /* QMChatLocationSnapshotter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatLocationSnapshotter.h; sourceTree = ""; }; + CEBFEE7F21F7731C00FED85A /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + CEFBFAC521FB929900E1ECB2 /* QMOpenGraphCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMOpenGraphCache.m; sourceTree = ""; }; + CEFBFAC821FB929900E1ECB2 /* QMOpenGraphModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMOpenGraphModel.xcdatamodel; sourceTree = ""; }; + CEFBFAC921FB929900E1ECB2 /* QMOpenGraphModelIncludes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMOpenGraphModelIncludes.h; sourceTree = ""; }; + CEFBFACB21FB929900E1ECB2 /* CDOpenGraphModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDOpenGraphModel.m; sourceTree = ""; }; + CEFBFACC21FB929900E1ECB2 /* CDOpenGraphModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDOpenGraphModel.h; sourceTree = ""; }; + CEFBFACE21FB929900E1ECB2 /* _CDOpenGraphModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CDOpenGraphModel.m; sourceTree = ""; }; + CEFBFACF21FB929900E1ECB2 /* _CDOpenGraphModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CDOpenGraphModel.h; sourceTree = ""; }; + CEFBFAD021FB929900E1ECB2 /* QMOpenGraphCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMOpenGraphCache.h; sourceTree = ""; }; + CEFBFAD221FB929900E1ECB2 /* QMOpenGraphMemoryStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMOpenGraphMemoryStorage.m; sourceTree = ""; }; + CEFBFAD321FB929900E1ECB2 /* QMOpenGraphItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMOpenGraphItem.m; sourceTree = ""; }; + CEFBFAD421FB929900E1ECB2 /* QMOpenGraphService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMOpenGraphService.m; sourceTree = ""; }; + CEFBFAD521FB929900E1ECB2 /* QMOpenGraphMemoryStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMOpenGraphMemoryStorage.h; sourceTree = ""; }; + CEFBFAD621FB929900E1ECB2 /* QMOpenGraphItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMOpenGraphItem.h; sourceTree = ""; }; + CEFBFAD721FB929900E1ECB2 /* QMOpenGraphService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMOpenGraphService.h; sourceTree = ""; }; + CEFBFAD921FB929900E1ECB2 /* QMDeferredQueueMemoryStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMDeferredQueueMemoryStorage.m; sourceTree = ""; }; + CEFBFADA21FB929900E1ECB2 /* QMDeferredQueueManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMDeferredQueueManager.h; sourceTree = ""; }; + CEFBFADB21FB929900E1ECB2 /* QMServicesManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMServicesManager.m; sourceTree = ""; }; + CEFBFADC21FB929900E1ECB2 /* QMDeferredQueueMemoryStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMDeferredQueueMemoryStorage.h; sourceTree = ""; }; + CEFBFADD21FB929900E1ECB2 /* QMDeferredQueueManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMDeferredQueueManager.m; sourceTree = ""; }; + CEFBFADE21FB929900E1ECB2 /* QMServicesManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMServicesManager.h; sourceTree = ""; }; + CEFBFAE221FB929900E1ECB2 /* QMModel5.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMModel5.xcdatamodel; sourceTree = ""; }; + CEFBFAE321FB929900E1ECB2 /* QMModel6.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMModel6.xcdatamodel; sourceTree = ""; }; + CEFBFAE421FB929900E1ECB2 /* QMModel3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMModel3.xcdatamodel; sourceTree = ""; }; + CEFBFAE521FB929900E1ECB2 /* QMModel4.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMModel4.xcdatamodel; sourceTree = ""; }; + CEFBFAE621FB929900E1ECB2 /* QMModel2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMModel2.xcdatamodel; sourceTree = ""; }; + CEFBFAE721FB929900E1ECB2 /* QMModel7.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMModel7.xcdatamodel; sourceTree = ""; }; + CEFBFAE821FB929900E1ECB2 /* QMModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMModel.xcdatamodel; sourceTree = ""; }; + CEFBFAEA21FB929900E1ECB2 /* QMCDAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCDAttachment.h; sourceTree = ""; }; + CEFBFAEB21FB929900E1ECB2 /* QMCDMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMCDMessage.m; sourceTree = ""; }; + CEFBFAEC21FB929900E1ECB2 /* QMCDDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCDDialog.h; sourceTree = ""; }; + CEFBFAED21FB929900E1ECB2 /* QMCDMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCDMessage.h; sourceTree = ""; }; + CEFBFAEE21FB929900E1ECB2 /* QMCDAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMCDAttachment.m; sourceTree = ""; }; + CEFBFAEF21FB929900E1ECB2 /* QMCDDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMCDDialog.m; sourceTree = ""; }; + CEFBFAF121FB929900E1ECB2 /* _QMCDAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _QMCDAttachment.m; sourceTree = ""; }; + CEFBFAF221FB929900E1ECB2 /* _QMCDDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _QMCDDialog.h; sourceTree = ""; }; + CEFBFAF321FB929900E1ECB2 /* _QMCDMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _QMCDMessage.m; sourceTree = ""; }; + CEFBFAF421FB929A00E1ECB2 /* _QMCDAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _QMCDAttachment.h; sourceTree = ""; }; + CEFBFAF521FB929A00E1ECB2 /* _QMCDMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _QMCDMessage.h; sourceTree = ""; }; + CEFBFAF621FB929A00E1ECB2 /* _QMCDDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _QMCDDialog.m; sourceTree = ""; }; + CEFBFAF721FB929A00E1ECB2 /* QMChatServiceModelIncludes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatServiceModelIncludes.h; sourceTree = ""; }; + CEFBFAF821FB929A00E1ECB2 /* QMChatCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatCache.h; sourceTree = ""; }; + CEFBFAF921FB929A00E1ECB2 /* QMChatCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatCache.m; sourceTree = ""; }; + CEFBFAFB21FB929A00E1ECB2 /* QMContactListService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMContactListService.h; sourceTree = ""; }; + CEFBFAFD21FB929A00E1ECB2 /* QMContactListService+Bolts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QMContactListService+Bolts.m"; sourceTree = ""; }; + CEFBFAFF21FB929A00E1ECB2 /* QMContactListMemoryStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMContactListMemoryStorage.m; sourceTree = ""; }; + CEFBFB0021FB929A00E1ECB2 /* QMContactListMemoryStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMContactListMemoryStorage.h; sourceTree = ""; }; + CEFBFB0121FB929A00E1ECB2 /* QMContactListService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMContactListService.m; sourceTree = ""; }; + CEFBFB0321FB929A00E1ECB2 /* QMBaseService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMBaseService.m; sourceTree = ""; }; + CEFBFB0421FB929A00E1ECB2 /* QMCancellableService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCancellableService.h; sourceTree = ""; }; + CEFBFB0521FB929A00E1ECB2 /* QMMemoryStorageProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMMemoryStorageProtocol.h; sourceTree = ""; }; + CEFBFB0621FB929A00E1ECB2 /* QMBaseService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMBaseService.h; sourceTree = ""; }; + CEFBFB0721FB929A00E1ECB2 /* QMServiceManagerProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMServiceManagerProtocol.h; sourceTree = ""; }; + CEFBFB0921FB929A00E1ECB2 /* QMAsynchronousOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAsynchronousOperation.m; sourceTree = ""; }; + CEFBFB0A21FB929A00E1ECB2 /* QMAsynchronousOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAsynchronousOperation.h; sourceTree = ""; }; + CEFBFB0C21FB929A00E1ECB2 /* QMUsersCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMUsersCache.h; sourceTree = ""; }; + CEFBFB0F21FB929A00E1ECB2 /* CDUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDUser.m; sourceTree = ""; }; + CEFBFB1021FB929A00E1ECB2 /* CDUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDUser.h; sourceTree = ""; }; + CEFBFB1221FB929A00E1ECB2 /* QMUsersModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMUsersModel.xcdatamodel; sourceTree = ""; }; + CEFBFB1321FB929A00E1ECB2 /* QMUsersModel2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMUsersModel2.xcdatamodel; sourceTree = ""; }; + CEFBFB1521FB929A00E1ECB2 /* _CDUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CDUser.m; sourceTree = ""; }; + CEFBFB1621FB929A00E1ECB2 /* _CDUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CDUser.h; sourceTree = ""; }; + CEFBFB1721FB929A00E1ECB2 /* QMUsersModelIncludes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMUsersModelIncludes.h; sourceTree = ""; }; + CEFBFB1821FB929A00E1ECB2 /* QMUsersCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMUsersCache.m; sourceTree = ""; }; + CEFBFB1A21FB929A00E1ECB2 /* QMServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMServices.h; sourceTree = ""; }; + CEFBFB1B21FB929A00E1ECB2 /* QMSLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMSLog.m; sourceTree = ""; }; + CEFBFB1C21FB929A00E1ECB2 /* QMSLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMSLog.h; sourceTree = ""; }; + CEFBFB1D21FB929A00E1ECB2 /* QMServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMServices.m; sourceTree = ""; }; + CEFBFB1F21FB929A00E1ECB2 /* QMAuthService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAuthService.m; sourceTree = ""; }; + CEFBFB2121FB929A00E1ECB2 /* QMAuthService+Bolts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QMAuthService+Bolts.m"; sourceTree = ""; }; + CEFBFB2221FB929A00E1ECB2 /* QMAuthService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAuthService.h; sourceTree = ""; }; + CEFBFB2421FB929A00E1ECB2 /* QMContactListCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMContactListCache.m; sourceTree = ""; }; + CEFBFB2721FB929A00E1ECB2 /* QMModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = QMModel.xcdatamodel; sourceTree = ""; }; + CEFBFB2821FB929A00E1ECB2 /* QMContactListModelIncludes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMContactListModelIncludes.h; sourceTree = ""; }; + CEFBFB2A21FB929A00E1ECB2 /* CDContactListItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDContactListItem.m; sourceTree = ""; }; + CEFBFB2B21FB929A00E1ECB2 /* CDContactListItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDContactListItem.h; sourceTree = ""; }; + CEFBFB2D21FB929A00E1ECB2 /* _CDContactListItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CDContactListItem.m; sourceTree = ""; }; + CEFBFB2E21FB929A00E1ECB2 /* _CDContactListItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CDContactListItem.h; sourceTree = ""; }; + CEFBFB2F21FB929A00E1ECB2 /* QMContactListCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMContactListCache.h; sourceTree = ""; }; + CEFBFB3121FB929A00E1ECB2 /* QMUsersService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMUsersService.m; sourceTree = ""; }; + CEFBFB3221FB929A00E1ECB2 /* QMUsersService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMUsersService.h; sourceTree = ""; }; + CEFBFB3421FB929A00E1ECB2 /* QBUUser+CustomData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBUUser+CustomData.h"; sourceTree = ""; }; + CEFBFB3521FB929A00E1ECB2 /* QBUUser+CustomData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBUUser+CustomData.m"; sourceTree = ""; }; + CEFBFB3721FB929A00E1ECB2 /* QMUsersMemoryStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMUsersMemoryStorage.h; sourceTree = ""; }; + CEFBFB3821FB929A00E1ECB2 /* QMUsersMemoryStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMUsersMemoryStorage.m; sourceTree = ""; }; + CEFBFB3A21FB929A00E1ECB2 /* QMDBStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMDBStorage.h; sourceTree = ""; }; + CEFBFB3C21FB929A00E1ECB2 /* QMCDMigrationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMCDMigrationManager.m; sourceTree = ""; }; + CEFBFB3D21FB929A00E1ECB2 /* QMCDRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCDRecord.h; sourceTree = ""; }; + CEFBFB3F21FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QMCDRecord+VersionInformation.m"; sourceTree = ""; }; + CEFBFB4021FB929A00E1ECB2 /* QMCDRecordInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCDRecordInternal.h; sourceTree = ""; }; + CEFBFB4121FB929A00E1ECB2 /* QMCDRecord+Options.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QMCDRecord+Options.m"; sourceTree = ""; }; + CEFBFB4221FB929A00E1ECB2 /* QMCDRecordInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMCDRecordInternal.m; sourceTree = ""; }; + CEFBFB4321FB929A00E1ECB2 /* QMCDRecord+VersionInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QMCDRecord+VersionInformation.h"; sourceTree = ""; }; + CEFBFB4421FB929A00E1ECB2 /* QMCDRecordLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCDRecordLogging.h; sourceTree = ""; }; + CEFBFB4521FB929A00E1ECB2 /* QMCDRecord+Options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QMCDRecord+Options.h"; sourceTree = ""; }; + CEFBFB4621FB929A00E1ECB2 /* QMCDMigrationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCDMigrationManager.h; sourceTree = ""; }; + CEFBFB4921FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+QMCDRecordErrorHandling.h"; sourceTree = ""; }; + CEFBFB4A21FB929A00E1ECB2 /* NSArray+QMCDRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+QMCDRecord.m"; sourceTree = ""; }; + CEFBFB4B21FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+QMCDRecordAdditions.h"; sourceTree = ""; }; + CEFBFB4C21FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+QMCDRecordErrorHandling.m"; sourceTree = ""; }; + CEFBFB4D21FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+QMCDRecordAdditions.m"; sourceTree = ""; }; + CEFBFB4E21FB929A00E1ECB2 /* NSArray+QMCDRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+QMCDRecord.h"; sourceTree = ""; }; + CEFBFB5021FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSPersistentStore+QMCDRecord.m"; sourceTree = ""; }; + CEFBFB5221FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObject+QMCDRequests.m"; sourceTree = ""; }; + CEFBFB5321FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObject+QMCDAggregation.m"; sourceTree = ""; }; + CEFBFB5421FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObject+QMCDFinders.h"; sourceTree = ""; }; + CEFBFB5521FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObject+QMCDRecord.h"; sourceTree = ""; }; + CEFBFB5621FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObject+QMCDFinders.m"; sourceTree = ""; }; + CEFBFB5721FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObject+QMCDAggregation.h"; sourceTree = ""; }; + CEFBFB5821FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObject+QMCDRequests.h"; sourceTree = ""; }; + CEFBFB5921FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObject+QMCDRecord.m"; sourceTree = ""; }; + CEFBFB5B21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObjectContext+QMCDSaves.m"; sourceTree = ""; }; + CEFBFB5C21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObjectContext+QMCDObserving.h"; sourceTree = ""; }; + CEFBFB5D21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObjectContext+QMCDRecord.h"; sourceTree = ""; }; + CEFBFB5E21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObjectContext+QMCDObserving.m"; sourceTree = ""; }; + CEFBFB5F21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObjectContext+QMCDSaves.h"; sourceTree = ""; }; + CEFBFB6021FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObjectContext+QMCDRecord.m"; sourceTree = ""; }; + CEFBFB6121FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObjectModel+QMCDRecord.h"; sourceTree = ""; }; + CEFBFB6221FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSPersistentStore+QMCDRecord.h"; sourceTree = ""; }; + CEFBFB6321FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObjectModel+QMCDRecord.m"; sourceTree = ""; }; + CEFBFB6421FB929A00E1ECB2 /* NSPersistentStore+QMCDRecordPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSPersistentStore+QMCDRecordPrivate.h"; sourceTree = ""; }; + CEFBFB6621FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSPersistentStoreCoordinator+QMCDRecord.m"; sourceTree = ""; }; + CEFBFB6721FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSPersistentStoreCoordinator+QMCDRecord.h"; sourceTree = ""; }; + CEFBFB6921FB929A00E1ECB2 /* QMCDRecordStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCDRecordStack.h; sourceTree = ""; }; + CEFBFB6A21FB929A00E1ECB2 /* QMCDRecordStack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMCDRecordStack.m; sourceTree = ""; }; + CEFBFB6B21FB929A00E1ECB2 /* QMDBStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMDBStorage.m; sourceTree = ""; }; + CEFBFB6D21FB929A00E1ECB2 /* QMChatTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatTypes.h; sourceTree = ""; }; + CEFBFB6E21FB929A00E1ECB2 /* QMChatService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatService.h; sourceTree = ""; }; + CEFBFB7021FB929A00E1ECB2 /* QMDialogsMemoryStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMDialogsMemoryStorage.m; sourceTree = ""; }; + CEFBFB7121FB929A00E1ECB2 /* QMDialogsMemoryStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMDialogsMemoryStorage.h; sourceTree = ""; }; + CEFBFB7221FB929A00E1ECB2 /* QMChatConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatConstants.h; sourceTree = ""; }; + CEFBFB7421FB929A00E1ECB2 /* QMChatService+Bolts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QMChatService+Bolts.m"; sourceTree = ""; }; + CEFBFB7721FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAttachmentsMemoryStorage.m; sourceTree = ""; }; + CEFBFB7821FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAttachmentsMemoryStorage.h; sourceTree = ""; }; + CEFBFB7921FB929A00E1ECB2 /* QMChatAttachmentService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatAttachmentService.m; sourceTree = ""; }; + CEFBFB7B21FB929A00E1ECB2 /* QMAttachmentStoreService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAttachmentStoreService.m; sourceTree = ""; }; + CEFBFB7C21FB929A00E1ECB2 /* QMAttachmentStoreService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAttachmentStoreService.h; sourceTree = ""; }; + CEFBFB7D21FB929A00E1ECB2 /* QMAttachmentStoreServiceDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAttachmentStoreServiceDelegate.h; sourceTree = ""; }; + CEFBFB7F21FB929A00E1ECB2 /* QMTimeOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMTimeOut.h; sourceTree = ""; }; + CEFBFB8021FB929A00E1ECB2 /* QMTimeOut.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMTimeOut.m; sourceTree = ""; }; + CEFBFB8221FB929A00E1ECB2 /* QMAssetLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAssetLoader.h; sourceTree = ""; }; + CEFBFB8321FB929A00E1ECB2 /* QMAttachmentAssetService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAttachmentAssetService.h; sourceTree = ""; }; + CEFBFB8421FB929A00E1ECB2 /* QMAssetLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAssetLoader.m; sourceTree = ""; }; + CEFBFB8521FB929A00E1ECB2 /* QMAttachmentAssetService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAttachmentAssetService.m; sourceTree = ""; }; + CEFBFB8621FB929A00E1ECB2 /* QMChatAttachmentService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMChatAttachmentService.h; sourceTree = ""; }; + CEFBFB8921FB929A00E1ECB2 /* QMMediaUploadService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMMediaUploadService.h; sourceTree = ""; }; + CEFBFB8A21FB929A00E1ECB2 /* QMMediaUploadService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMMediaUploadService.m; sourceTree = ""; }; + CEFBFB8C21FB929A00E1ECB2 /* QMMediaDownloadService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMMediaDownloadService.h; sourceTree = ""; }; + CEFBFB8D21FB929A00E1ECB2 /* QMMediaDownloadService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMMediaDownloadService.m; sourceTree = ""; }; + CEFBFB8E21FB929A00E1ECB2 /* QMAttachmentContentService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAttachmentContentService.m; sourceTree = ""; }; + CEFBFB8F21FB929A00E1ECB2 /* QMAttachmentContentService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAttachmentContentService.h; sourceTree = ""; }; + CEFBFB9021FB929A00E1ECB2 /* QMChatService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMChatService.m; sourceTree = ""; }; + CEFBFB9221FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBChatMessage+QMCustomParameters.m"; sourceTree = ""; }; + CEFBFB9321FB929A00E1ECB2 /* QBChatAttachment+QMFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBChatAttachment+QMFactory.h"; sourceTree = ""; }; + CEFBFB9421FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBChatAttachment+QMCustomParameters.h"; sourceTree = ""; }; + CEFBFB9521FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBChatAttachment+QMCustomData.m"; sourceTree = ""; }; + CEFBFB9621FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBChatMessage+QMCustomParameters.h"; sourceTree = ""; }; + CEFBFB9721FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBChatAttachment+QMCustomParameters.m"; sourceTree = ""; }; + CEFBFB9821FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBChatAttachment+QMFactory.m"; sourceTree = ""; }; + CEFBFB9921FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBChatAttachment+QMCustomData.h"; sourceTree = ""; }; + CEFBFB9B21FB929A00E1ECB2 /* QMMessagesMemoryStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMMessagesMemoryStorage.h; sourceTree = ""; }; + CEFBFB9C21FB929A00E1ECB2 /* QMMessagesMemoryStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMMessagesMemoryStorage.m; sourceTree = ""; }; + CEFBFB9D21FB929A00E1ECB2 /* QMMediaBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMMediaBlocks.h; sourceTree = ""; }; + DF5DEED5E5E7BE521787B524 /* Pods-QMSiriExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QMSiriExtension.debug.xcconfig"; path = "Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension.debug.xcconfig"; sourceTree = ""; }; E002F3EF1F508CF90044B0B3 /* NSString+QMValidation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSString+QMValidation.h"; sourceTree = ""; }; E002F3F01F508CF90044B0B3 /* NSString+QMValidation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSString+QMValidation.m"; sourceTree = ""; }; - E01D88F21FAB69340049CD06 /* QMShareEtxentionOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMShareEtxentionOperation.h; sourceTree = ""; }; - E01D88F31FAB69340049CD06 /* QMShareEtxentionOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMShareEtxentionOperation.m; sourceTree = ""; }; E026A76C1E82B9A10054AD83 /* UIScreen+QMLock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScreen+QMLock.h"; sourceTree = ""; }; E026A76D1E82B9A10054AD83 /* UIScreen+QMLock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScreen+QMLock.m"; sourceTree = ""; }; - E02AAC511FC46562003C69BF /* Quickblox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quickblox.framework; path = External/Quickblox.framework; sourceTree = ""; }; E03871CB1DDB354700554EB9 /* Intents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Intents.framework; path = System/Library/Frameworks/Intents.framework; sourceTree = SDKROOT; }; E03871CC1DDB354700554EB9 /* IntentsUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IntentsUI.framework; path = System/Library/Frameworks/IntentsUI.framework; sourceTree = SDKROOT; }; - E03871E01DDB36F800554EB9 /* IntentViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IntentViewController.h; sourceTree = ""; }; - E03871E11DDB36F800554EB9 /* IntentViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IntentViewController.m; sourceTree = ""; }; - E03871E61DDB36F800554EB9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; E03AD8EC1F556D7500F411CE /* QMExpandableTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMExpandableTableViewController.h; sourceTree = ""; }; E03AD8ED1F556D7500F411CE /* QMExpandableTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMExpandableTableViewController.m; sourceTree = ""; }; E03AD8F01F55703300F411CE /* QMValidationCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMValidationCell.h; sourceTree = ""; }; E03AD8F11F55703300F411CE /* QMValidationCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMValidationCell.m; sourceTree = ""; }; E03AD8F21F55703300F411CE /* QMValidationCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMValidationCell.xib; sourceTree = ""; }; - E03AF8021FACDC6400DFEE7A /* NSError+QMShareExtension.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "NSError+QMShareExtension.h"; path = "NSURL+QMShareExtension/NSError+QMShareExtension.h"; sourceTree = ""; }; - E03AF8031FACDC6400DFEE7A /* NSError+QMShareExtension.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "NSError+QMShareExtension.m"; path = "NSURL+QMShareExtension/NSError+QMShareExtension.m"; sourceTree = ""; }; E03AF8111FACDE5E00DFEE7A /* QBSettings+Qmunicate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "QBSettings+Qmunicate.h"; sourceTree = ""; }; E03AF8121FACDE5E00DFEE7A /* QBSettings+Qmunicate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "QBSettings+Qmunicate.m"; sourceTree = ""; }; E03C83151E61F9E30039A9D0 /* QMCallViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCallViewDelegate.h; sourceTree = ""; }; @@ -620,39 +1234,14 @@ E043459B1F29545F0066851D /* QMAttachmentController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMAttachmentController.m; sourceTree = ""; }; E048781F1E8006C60008F497 /* QMAudioRecorder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAudioRecorder.m; sourceTree = ""; }; E04878201E8006C60008F497 /* QMAudioRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAudioRecorder.h; sourceTree = ""; }; - E04E45C51DE5A78700A0E0FC /* QMSiriHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMSiriHelper.h; sourceTree = ""; }; - E04E45C61DE5A78700A0E0FC /* QMSiriHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMSiriHelper.m; sourceTree = ""; }; - E051D6351F3CA3600054D46B /* QMLog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMLog.h; sourceTree = ""; }; - E051D6361F3CA3600054D46B /* QMLog.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMLog.m; sourceTree = ""; }; - E0562DCF1DDCA0DF0086A083 /* QMSiriExtensionUI.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = QMSiriExtensionUI.entitlements; sourceTree = ""; }; - E05AEC581F9A0E1F004D3274 /* NSURL+QMShareExtension.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSURL+QMShareExtension.h"; sourceTree = ""; }; - E05AEC591F9A0E1F004D3274 /* NSURL+QMShareExtension.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSURL+QMShareExtension.m"; sourceTree = ""; }; - E05AEC5C1F9A4AE8004D3274 /* QMShareTasks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMShareTasks.h; sourceTree = ""; }; - E05AEC5D1F9A4AE8004D3274 /* QMShareTasks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMShareTasks.m; sourceTree = ""; }; - E06355691E1D1D4F00BE9061 /* IntentHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntentHandler.h; sourceTree = ""; }; - E063556A1E1D1D4F00BE9061 /* IntentHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IntentHandler.m; sourceTree = ""; }; - E063556B1E1D1D4F00BE9061 /* QMMessageIntentHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMMessageIntentHandler.h; sourceTree = ""; }; - E063556C1E1D1D4F00BE9061 /* QMMessageIntentHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMMessageIntentHandler.m; sourceTree = ""; }; - E06355701E1D1E3300BE9061 /* QBUUser+INPerson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "QBUUser+INPerson.h"; path = "Categories/QBUUser+INPerson.h"; sourceTree = ""; }; - E06355711E1D1E3300BE9061 /* QBUUser+INPerson.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "QBUUser+INPerson.m"; path = "Categories/QBUUser+INPerson.m"; sourceTree = ""; }; E06355731E1D3B7D00BE9061 /* QMINPersonProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QMINPersonProtocol.h; path = "Q-municate/Classes/Common/QMINPersonProtocol.h"; sourceTree = SOURCE_ROOT; }; - E06355751E1D3CA800BE9061 /* QBChatDialog+INPerson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBChatDialog+INPerson.h"; sourceTree = ""; }; - E06355761E1D3CA800BE9061 /* QBChatDialog+INPerson.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBChatDialog+INPerson.m"; sourceTree = ""; }; E069B0151FC6FFF5005F9AB1 /* QMTasks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMTasks.h; sourceTree = ""; }; E069B0161FC6FFF5005F9AB1 /* QMTasks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMTasks.m; sourceTree = ""; }; - E06B0D8B1FA7B5E9002E75D5 /* QMAttachmentProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMAttachmentProvider.h; sourceTree = ""; }; - E06B0D8C1FA7B5E9002E75D5 /* QMAttachmentProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMAttachmentProvider.m; sourceTree = ""; }; E06F89091E60FFF30017BBEC /* QMCallWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMCallWindow.h; sourceTree = ""; }; E06F890A1E60FFF30017BBEC /* QMCallWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMCallWindow.m; sourceTree = ""; }; E077739E1FB5CD43006B63FA /* QMShareHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMShareHelper.h; sourceTree = ""; }; E077739F1FB5CD43006B63FA /* QMShareHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMShareHelper.m; sourceTree = ""; }; E07BC21F1DDF5FD900B8D3B0 /* QMSiriExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = QMSiriExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - E07BC2241DDF5FD900B8D3B0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E07CB8A21FAD2B1A0027087E /* QMShareRootViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMShareRootViewController.h; sourceTree = ""; }; - E07CB8A31FAD2B1A0027087E /* QMShareRootViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMShareRootViewController.m; sourceTree = ""; }; - E07CB8A61FAD2F640027087E /* QMShareTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMShareTableViewController.h; sourceTree = ""; }; - E07CB8A71FAD2F640027087E /* QMShareTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMShareTableViewController.m; sourceTree = ""; }; - E07CB8AA1FAD31320027087E /* QMShareTableViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = QMShareTableViewController.xib; path = "QMShareExtension/View Controllers/QMShareTableViewController.xib"; sourceTree = SOURCE_ROOT; }; E08441D71E1E611D00B87D0F /* NSString+QMSiriUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+QMSiriUtils.h"; sourceTree = ""; }; E08441D81E1E611D00B87D0F /* NSString+QMSiriUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+QMSiriUtils.m"; sourceTree = ""; }; E08ADF5C1F8CCD6D0099CF99 /* QMDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMDataSource.h; sourceTree = ""; }; @@ -663,53 +1252,13 @@ E0921D931F6FEE11005961CF /* QMImageBarButtonItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMImageBarButtonItem.m; sourceTree = ""; }; E09FCA651E60A9270013E3EB /* QMAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMAudioPlayer.h; sourceTree = ""; }; E09FCA661E60A9270013E3EB /* QMAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMAudioPlayer.m; sourceTree = ""; }; - E0A8A77B1F8F7B0200382443 /* QMShareItemProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareItemProtocol.h; sourceTree = ""; }; - E0A8A77C1F8F7B0200382443 /* QMShareViewProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareViewProtocol.h; sourceTree = ""; }; - E0A8A77F1F8F7B0200382443 /* QBChatDialog+QMShareItemProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBChatDialog+QMShareItemProtocol.h"; sourceTree = ""; }; - E0A8A7801F8F7B0200382443 /* QBChatDialog+QMShareItemProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBChatDialog+QMShareItemProtocol.m"; sourceTree = ""; }; - E0A8A7821F8F7B0200382443 /* QBUUser+QMShareItemProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QBUUser+QMShareItemProtocol.h"; sourceTree = ""; }; - E0A8A7851F8F7B0200382443 /* QMExtensionCache+QMShareExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "QMExtensionCache+QMShareExtension.h"; sourceTree = ""; }; - E0A8A7861F8F7B0200382443 /* QMExtensionCache+QMShareExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QMExtensionCache+QMShareExtension.m"; sourceTree = ""; }; - E0A8A7901F8F7B0300382443 /* QMShareCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareCollectionViewCell.h; sourceTree = ""; }; - E0A8A7911F8F7B0300382443 /* QMShareCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareCollectionViewCell.m; sourceTree = ""; }; - E0A8A7921F8F7B0300382443 /* QMShareCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMShareCollectionViewCell.xib; sourceTree = ""; }; - E0A8A7941F8F7B0300382443 /* QMShareTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareTableViewCell.h; sourceTree = ""; }; - E0A8A7951F8F7B0300382443 /* QMShareTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareTableViewCell.m; sourceTree = ""; }; - E0A8A7961F8F7B0300382443 /* QMShareTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = QMShareTableViewCell.xib; sourceTree = ""; }; - E0A8A7991F8F7B0300382443 /* QMShareDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareDataSource.h; sourceTree = ""; }; - E0A8A79A1F8F7B0300382443 /* QMShareDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareDataSource.m; sourceTree = ""; }; - E0A8A79C1F8F7B0300382443 /* QMShareItemsDataProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMShareItemsDataProvider.h; sourceTree = ""; }; - E0A8A79D1F8F7B0300382443 /* QMShareItemsDataProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMShareItemsDataProvider.m; sourceTree = ""; }; E0A8A7B21F8F814300382443 /* QMExtensionCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QMExtensionCache.h; sourceTree = ""; }; E0A8A7B71F8F818800382443 /* QMExtensionCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QMExtensionCache.m; sourceTree = ""; }; - E0A8A7BB1F8F8B3000382443 /* QMExtensionCache+QMSiriExtension.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "QMExtensionCache+QMSiriExtension.h"; sourceTree = ""; }; - E0A8A7BC1F8F8B3000382443 /* QMExtensionCache+QMSiriExtension.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "QMExtensionCache+QMSiriExtension.m"; sourceTree = ""; }; - E0A8A7BE1F8F9CAA00382443 /* QBUUser+QMShareItemProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "QBUUser+QMShareItemProtocol.m"; sourceTree = ""; }; - E0A9965D1FC84042008AFFBE /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVIndefiniteAnimatedView.h; sourceTree = ""; }; - E0A9965E1FC84042008AFFBE /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVIndefiniteAnimatedView.m; sourceTree = ""; }; - E0A9965F1FC84042008AFFBE /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVProgressAnimatedView.h; sourceTree = ""; }; - E0A996601FC84042008AFFBE /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVProgressAnimatedView.m; sourceTree = ""; }; - E0A996611FC84042008AFFBE /* SVProgressHUD-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-Prefix.pch"; sourceTree = ""; }; - E0A996621FC84042008AFFBE /* SVProgressHUD.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = SVProgressHUD.bundle; sourceTree = ""; }; - E0A996631FC84042008AFFBE /* SVProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVProgressHUD.h; sourceTree = ""; }; - E0A996641FC84042008AFFBE /* SVProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVProgressHUD.m; sourceTree = ""; }; - E0A996651FC84042008AFFBE /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVRadialGradientLayer.h; sourceTree = ""; }; - E0A996661FC84042008AFFBE /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVRadialGradientLayer.m; sourceTree = ""; }; - E0AA0E671F90E38C0082750E /* QMShareContactsTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMShareContactsTableViewCell.h; sourceTree = ""; }; - E0AA0E681F90E38C0082750E /* QMShareContactsTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMShareContactsTableViewCell.m; sourceTree = ""; }; - E0AA0E691F90E38C0082750E /* QMShareContactsTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = QMShareContactsTableViewCell.xib; sourceTree = ""; }; E0B5CEDB1F978688004CB06D /* QMActivityItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMActivityItem.h; sourceTree = ""; }; E0B5CEDC1F978688004CB06D /* QMActivityItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMActivityItem.m; sourceTree = ""; }; - E0B6A3351E2A614B001125FC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainInterface.storyboard; sourceTree = ""; }; E0B6A3371E2A615E001125FC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/AppIntentVocabulary.plist; sourceTree = ""; }; - E0C175731DE507AA00B5990C /* QMSiriExtension.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = QMSiriExtension.entitlements; sourceTree = ""; }; E0CA1F481F84F78A00E9B293 /* QMShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = QMShareExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - E0CA1F4E1F84F78A00E9B293 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ShareInterface.storyboard; sourceTree = ""; }; - E0CA1F501F84F78A00E9B293 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E0CA1F571F84F7DE00E9B293 /* QMShareExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = QMShareExtension.entitlements; sourceTree = ""; }; E0D3D9A41F4DCCBA006AB505 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; - E333FBA51F5461FA0095F224 /* QuickbloxWebRTC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickbloxWebRTC.framework; path = External/QuickbloxWebRTC.framework; sourceTree = ""; }; - E39BEBB91F6BF02700F7D50F /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; E3A99BCD1FD00C8F00D0907B /* QMCallKitAdapter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QMCallKitAdapter.h; sourceTree = ""; }; E3A99BCE1FD00C8F00D0907B /* QMCallKitAdapter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QMCallKitAdapter.m; sourceTree = ""; }; E3D2EEA21EF7C693002DC44E /* QMTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QMTableViewController.h; path = QMTableViewController/QMTableViewController.h; sourceTree = ""; }; @@ -718,10 +1267,9 @@ E3D2EEA71EF7E71C002DC44E /* QMViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = QMViewController.m; path = QMViewController/QMViewController.m; sourceTree = ""; }; E3D2EEA91EF7F6A2002DC44E /* QMNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QMNavigationController.h; path = QMNavigationController/QMNavigationController.h; sourceTree = ""; }; E3D2EEAA1EF7F6A2002DC44E /* QMNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = QMNavigationController.m; path = QMNavigationController/QMNavigationController.m; sourceTree = ""; }; - F334A9F28F73239275E50842 /* Pods-Q-municate.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Q-municate.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate.debug.xcconfig"; sourceTree = ""; }; + EFB338E65DEED3B4B5896E6E /* Pods-QMSiriExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QMSiriExtension.release.xcconfig"; path = "Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension.release.xcconfig"; sourceTree = ""; }; FBE42BCA1FF6807C00F139E9 /* MPGNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPGNotification.h; sourceTree = ""; }; FBE42BCB1FF6807D00F139E9 /* MPGNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPGNotification.m; sourceTree = ""; }; - FC7B184059841C99E1DFD62B /* libPods-Q-municate.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Q-municate.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -729,31 +1277,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E0D3D9A51F4DCCBB006AB505 /* CoreTelephony.framework in Frameworks */, - E03871CD1DDB354700554EB9 /* Intents.framework in Frameworks */, - E03871CE1DDB354700554EB9 /* IntentsUI.framework in Frameworks */, - 581DA1D21BF373A100F75D8B /* VideoToolbox.framework in Frameworks */, - 581DA1D01BF3732900F75D8B /* libc++.tbd in Frameworks */, - 86FD874D1982512000B6FA43 /* GLKit.framework in Frameworks */, - 69CF189D18AE1C6A003262EF /* CoreData.framework in Frameworks */, - E333FBA81F5461FA0095F224 /* QuickbloxWebRTC.framework in Frameworks */, - 69DB5EF518E31D6400277226 /* MessageUI.framework in Frameworks */, - 690A271518CA0F35003D6B80 /* AddressBook.framework in Frameworks */, - 69CF18A918AE1C9F003262EF /* Security.framework in Frameworks */, - 69CF18A718AE1C98003262EF /* AVFoundation.framework in Frameworks */, - 69CF18A518AE1C8D003262EF /* CoreVideo.framework in Frameworks */, - 69CF18A318AE1C85003262EF /* Accelerate.framework in Frameworks */, - 69CF18A118AE1C7E003262EF /* CoreMedia.framework in Frameworks */, - 69CF189F18AE1C76003262EF /* AudioToolbox.framework in Frameworks */, - 69CF189B18AE1C63003262EF /* CoreLocation.framework in Frameworks */, - 69D57E5818ACC11C00A9900A /* CoreGraphics.framework in Frameworks */, - 69CF189918AE1C52003262EF /* MobileCoreServices.framework in Frameworks */, - 69CF189718AE1C49003262EF /* SystemConfiguration.framework in Frameworks */, - 69CF189518AE1C3C003262EF /* CFNetwork.framework in Frameworks */, - 69D57E5A18ACC11C00A9900A /* UIKit.framework in Frameworks */, - E02AAC531FC4656A003C69BF /* Quickblox.framework in Frameworks */, - 69D57E5618ACC11C00A9900A /* Foundation.framework in Frameworks */, - 4147AE579C0000F3FEADFC43 /* libPods-Q-municate.a in Frameworks */, + C8D562FD352DC0A9FF821A89 /* Pods_Q_municate.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -761,7 +1285,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - AFEFF67A44830D1258A26554 /* libPods-QMSiriExtension.a in Frameworks */, + 035EDA3AA292DA92BFCEF8DE /* Pods_QMSiriExtension.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -769,26 +1293,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7C5635D17C49461162761660 /* libPods-QMShareExtension.a in Frameworks */, + 061A1EA1A3EB22270D9A947C /* Pods_QMShareExtension.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2990C48781F85786E91AD25D /* Pods */ = { - isa = PBXGroup; - children = ( - F334A9F28F73239275E50842 /* Pods-Q-municate.debug.xcconfig */, - 269116E9D6D043D8FAC9E1D8 /* Pods-Q-municate.release.xcconfig */, - AAF30F47522590E10692EA18 /* Pods-QMSiriExtension.debug.xcconfig */, - 914D22F55FCE43364D718A2A /* Pods-QMSiriExtension.release.xcconfig */, - 380C6A0B58B1BD8187211951 /* Pods-QMShareExtension.debug.xcconfig */, - AD92D3E3278E539BF388354D /* Pods-QMShareExtension.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; 5524C2CF1998B560007450DB /* QMImagePicker */ = { isa = PBXGroup; children = ( @@ -940,8 +1451,6 @@ children = ( 584277DA1C3FE5BC00CDE35B /* QMCore.h */, 584277DB1C3FE5BC00CDE35B /* QMCore.m */, - E051D6351F3CA3600054D46B /* QMLog.h */, - E051D6361F3CA3600054D46B /* QMLog.m */, ); path = QMCore; sourceTree = ""; @@ -2071,6 +2580,8 @@ 695F4B2118B60A62006C9DA5 /* Classes */ = { isa = PBXGroup; children = ( + CEFBFAC321FB929900E1ECB2 /* QMServices */, + CE57CC5921FA002D0026A23F /* QMChatViewController */, E3A99BCC1FD00C7800D0907B /* QMCallKitAdapter */, E0A996581FC84042008AFFBE /* ThirdPartyLibraries */, E069B0141FC6FFF5005F9AB1 /* QMTasks */, @@ -2114,13 +2625,13 @@ 69D57E6518ACC11C00A9900A /* QMAppDelegate.m */, 5877D6C51C466B2D00938E5D /* Launch Screen.storyboard */, 69D57E5B18ACC11C00A9900A /* Q-municate */, - E03871DF1DDB36F800554EB9 /* QMSiriExtensionUI */, - E07BC2201DDF5FD900B8D3B0 /* QMSiriExtension */, - E0CA1F491F84F78A00E9B293 /* QMShareExtension */, + CE5563D221FBBCA30051EC2D /* QMSiriExtension */, + CE5563E321FBBCA30051EC2D /* QMSiriExtensionUI */, + CE55636D21FBBC960051EC2D /* QMShareExtension */, 69D57E5418ACC11C00A9900A /* Frameworks */, 69D57E5318ACC11C00A9900A /* Products */, 559327A0199216FB001C4BF8 /* Q-municate Tests */, - 2990C48781F85786E91AD25D /* Pods */, + EC0070C2176873443C60030E /* Pods */, ); sourceTree = ""; }; @@ -2137,14 +2648,11 @@ 69D57E5418ACC11C00A9900A /* Frameworks */ = { isa = PBXGroup; children = ( - E02AAC511FC46562003C69BF /* Quickblox.framework */, E0D3D9A41F4DCCBA006AB505 /* CoreTelephony.framework */, - E333FBA51F5461FA0095F224 /* QuickbloxWebRTC.framework */, E03871CB1DDB354700554EB9 /* Intents.framework */, E03871CC1DDB354700554EB9 /* IntentsUI.framework */, 5835E89C1D9D303C00A7B114 /* UserNotifications.framework */, 581DA1D11BF373A100F75D8B /* VideoToolbox.framework */, - 581DA1CF1BF3732900F75D8B /* libc++.tbd */, 86FD874C1982512000B6FA43 /* GLKit.framework */, 86FD874A1982510700B6FA43 /* OpenGLES.framework */, 69DB5EF418E31D6400277226 /* MessageUI.framework */, @@ -2163,9 +2671,9 @@ 69D57E5518ACC11C00A9900A /* Foundation.framework */, 69D57E5718ACC11C00A9900A /* CoreGraphics.framework */, 69D57E5918ACC11C00A9900A /* UIKit.framework */, - FC7B184059841C99E1DFD62B /* libPods-Q-municate.a */, - DC91E0EEDD13E8E5F666C98A /* libPods-QMShareExtension.a */, - BDCDFBABCBCAE9059D55762E /* libPods-QMSiriExtension.a */, + 594E7276015B6E39FCBE7812 /* Pods_Q_municate.framework */, + 67AD362B1BAE08A2AF1AF45D /* Pods_QMShareExtension.framework */, + 5E7A04F78E6642A2DA605239 /* Pods_QMSiriExtension.framework */, ); name = Frameworks; sourceTree = ""; @@ -2185,7 +2693,7 @@ 69D57E5C18ACC11C00A9900A /* Supporting Files */ = { isa = PBXGroup; children = ( - E39BEBB91F6BF02700F7D50F /* GoogleService-Info.plist */, + CEBFEE7F21F7731C00FED85A /* GoogleService-Info.plist */, 5828D2651D8C12CC00CB7BE1 /* Q-municate.entitlements */, 69D57E5D18ACC11C00A9900A /* Q-municate-Info.plist */, 69D57E6318ACC11C00A9900A /* Q-municate-Prefix.pch */, @@ -2195,510 +2703,1585 @@ path = "Supporting Files"; sourceTree = ""; }; - E002F3EE1F508CE20044B0B3 /* NSString */ = { + CE55636D21FBBC960051EC2D /* QMShareExtension */ = { isa = PBXGroup; children = ( - E002F3EF1F508CF90044B0B3 /* NSString+QMValidation.h */, - E002F3F01F508CF90044B0B3 /* NSString+QMValidation.m */, + CE55636E21FBBC960051EC2D /* QMShareExtension.entitlements */, + CE55636F21FBBC960051EC2D /* Data Source */, + CE55637621FBBC960051EC2D /* Image.xcassets */, + CE55637721FBBC960051EC2D /* View Controllers */, + CE55637D21FBBC960051EC2D /* ShareInterface.storyboard */, + CE55637F21FBBC960051EC2D /* Common classes */, + CE55638621FBBC960051EC2D /* Views */, + CE55639321FBBC960051EC2D /* Categories */, + CE5563A221FBBC970051EC2D /* Protocols */, + CE5563A521FBBC970051EC2D /* Info.plist */, ); - path = NSString; + path = QMShareExtension; sourceTree = ""; }; - E026A76B1E82B98C0054AD83 /* UIScreen */ = { + CE55636F21FBBC960051EC2D /* Data Source */ = { isa = PBXGroup; children = ( - E026A76C1E82B9A10054AD83 /* UIScreen+QMLock.h */, - E026A76D1E82B9A10054AD83 /* UIScreen+QMLock.m */, + CE55637021FBBC960051EC2D /* QMShareItemsDataProvider */, + CE55637321FBBC960051EC2D /* QMShareDataSource */, ); - path = UIScreen; + path = "Data Source"; sourceTree = ""; }; - E03871DF1DDB36F800554EB9 /* QMSiriExtensionUI */ = { + CE55637021FBBC960051EC2D /* QMShareItemsDataProvider */ = { isa = PBXGroup; children = ( - E0562DCF1DDCA0DF0086A083 /* QMSiriExtensionUI.entitlements */, - E03871E01DDB36F800554EB9 /* IntentViewController.h */, - E03871E11DDB36F800554EB9 /* IntentViewController.m */, - E03871E31DDB36F800554EB9 /* MainInterface.storyboard */, - E03871E61DDB36F800554EB9 /* Info.plist */, + CE55637121FBBC960051EC2D /* QMShareItemsDataProvider.h */, + CE55637221FBBC960051EC2D /* QMShareItemsDataProvider.m */, ); - path = QMSiriExtensionUI; + path = QMShareItemsDataProvider; sourceTree = ""; }; - E03AD8EB1F556D6100F411CE /* QMExpandableTableViewController */ = { + CE55637321FBBC960051EC2D /* QMShareDataSource */ = { isa = PBXGroup; children = ( - E03AD8EC1F556D7500F411CE /* QMExpandableTableViewController.h */, - E03AD8ED1F556D7500F411CE /* QMExpandableTableViewController.m */, + CE55637421FBBC960051EC2D /* QMShareDataSource.m */, + CE55637521FBBC960051EC2D /* QMShareDataSource.h */, ); - path = QMExpandableTableViewController; + path = QMShareDataSource; sourceTree = ""; }; - E03AD8EF1F55703300F411CE /* QMValidationCell */ = { + CE55637721FBBC960051EC2D /* View Controllers */ = { isa = PBXGroup; children = ( - E03AD8F01F55703300F411CE /* QMValidationCell.h */, - E03AD8F11F55703300F411CE /* QMValidationCell.m */, - E03AD8F21F55703300F411CE /* QMValidationCell.xib */, + CE55637821FBBC960051EC2D /* QMShareTableViewController.xib */, + CE55637921FBBC960051EC2D /* QMShareRootViewController.m */, + CE55637A21FBBC960051EC2D /* QMShareTableViewController.m */, + CE55637B21FBBC960051EC2D /* QMShareTableViewController.h */, + CE55637C21FBBC960051EC2D /* QMShareRootViewController.h */, ); - path = QMValidationCell; + path = "View Controllers"; sourceTree = ""; }; - E03F3D321E1C71E100A46884 /* Common */ = { + CE55637F21FBBC960051EC2D /* Common classes */ = { isa = PBXGroup; children = ( - E03F3D331E1C724E00A46884 /* NSString+QMTransliterating.h */, - E03F3D341E1C724E00A46884 /* NSString+QMTransliterating.m */, - E08441D71E1E611D00B87D0F /* NSString+QMSiriUtils.h */, - E08441D81E1E611D00B87D0F /* NSString+QMSiriUtils.m */, + CE55638021FBBC960051EC2D /* QMAttachmentProvider.h */, + CE55638121FBBC960051EC2D /* QMShareTasks.m */, + CE55638221FBBC960051EC2D /* QMShareEtxentionOperation.h */, + CE55638321FBBC960051EC2D /* QMAttachmentProvider.m */, + CE55638421FBBC960051EC2D /* QMShareTasks.h */, + CE55638521FBBC960051EC2D /* QMShareEtxentionOperation.m */, ); - path = Common; + path = "Common classes"; sourceTree = ""; }; - E0425AB51FC37AF200CD8A58 /* UIAlertViewController */ = { + CE55638621FBBC960051EC2D /* Views */ = { isa = PBXGroup; children = ( - E0425AB61FC37B1800CD8A58 /* UIAlertController+QM.h */, - E0425AB71FC37B1800CD8A58 /* UIAlertController+QM.m */, + CE55638721FBBC960051EC2D /* QMShareCollectionViewCell */, + CE55638B21FBBC960051EC2D /* QMShareTableViewCell */, + CE55638F21FBBC960051EC2D /* QMShareContactsTableViewCell */, ); - path = UIAlertViewController; + path = Views; sourceTree = ""; }; - E05AEC571F9A0E10004D3274 /* NSURL+QMShareExtension */ = { + CE55638721FBBC960051EC2D /* QMShareCollectionViewCell */ = { isa = PBXGroup; children = ( - E05AEC581F9A0E1F004D3274 /* NSURL+QMShareExtension.h */, - E05AEC591F9A0E1F004D3274 /* NSURL+QMShareExtension.m */, + CE55638821FBBC960051EC2D /* QMShareCollectionViewCell.h */, + CE55638921FBBC960051EC2D /* QMShareCollectionViewCell.xib */, + CE55638A21FBBC960051EC2D /* QMShareCollectionViewCell.m */, ); - path = "NSURL+QMShareExtension"; + path = QMShareCollectionViewCell; sourceTree = ""; }; - E05AEC5B1F9A4AD7004D3274 /* Common classes */ = { + CE55638B21FBBC960051EC2D /* QMShareTableViewCell */ = { isa = PBXGroup; children = ( - E05AEC5C1F9A4AE8004D3274 /* QMShareTasks.h */, - E05AEC5D1F9A4AE8004D3274 /* QMShareTasks.m */, - E06B0D8B1FA7B5E9002E75D5 /* QMAttachmentProvider.h */, - E06B0D8C1FA7B5E9002E75D5 /* QMAttachmentProvider.m */, - E01D88F21FAB69340049CD06 /* QMShareEtxentionOperation.h */, - E01D88F31FAB69340049CD06 /* QMShareEtxentionOperation.m */, + CE55638C21FBBC960051EC2D /* QMShareTableViewCell.m */, + CE55638D21FBBC960051EC2D /* QMShareTableViewCell.h */, + CE55638E21FBBC960051EC2D /* QMShareTableViewCell.xib */, ); - path = "Common classes"; + path = QMShareTableViewCell; sourceTree = ""; }; - E06355681E1D1D4F00BE9061 /* IntentHandler */ = { + CE55638F21FBBC960051EC2D /* QMShareContactsTableViewCell */ = { isa = PBXGroup; children = ( - E06355691E1D1D4F00BE9061 /* IntentHandler.h */, - E063556A1E1D1D4F00BE9061 /* IntentHandler.m */, - E063556B1E1D1D4F00BE9061 /* QMMessageIntentHandler.h */, - E063556C1E1D1D4F00BE9061 /* QMMessageIntentHandler.m */, + CE55639021FBBC960051EC2D /* QMShareContactsTableViewCell.xib */, + CE55639121FBBC960051EC2D /* QMShareContactsTableViewCell.m */, + CE55639221FBBC960051EC2D /* QMShareContactsTableViewCell.h */, ); - path = IntentHandler; + path = QMShareContactsTableViewCell; sourceTree = ""; }; - E063556F1E1D1DE100BE9061 /* Categories */ = { + CE55639321FBBC960051EC2D /* Categories */ = { isa = PBXGroup; children = ( - E0A8A7BB1F8F8B3000382443 /* QMExtensionCache+QMSiriExtension.h */, - E0A8A7BC1F8F8B3000382443 /* QMExtensionCache+QMSiriExtension.m */, + CE55639421FBBC960051EC2D /* QMExtensionCache+QMShareExtension */, + CE55639721FBBC970051EC2D /* NSURL+QMShareExtension */, + CE55639C21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol */, + CE55639F21FBBC970051EC2D /* QBUUser+QMShareItemProtocol */, ); path = Categories; sourceTree = ""; }; - E069B0141FC6FFF5005F9AB1 /* QMTasks */ = { + CE55639421FBBC960051EC2D /* QMExtensionCache+QMShareExtension */ = { isa = PBXGroup; children = ( - E069B0151FC6FFF5005F9AB1 /* QMTasks.h */, - E069B0161FC6FFF5005F9AB1 /* QMTasks.m */, + CE55639521FBBC960051EC2D /* QMExtensionCache+QMShareExtension.h */, + CE55639621FBBC960051EC2D /* QMExtensionCache+QMShareExtension.m */, ); - path = QMTasks; + path = "QMExtensionCache+QMShareExtension"; sourceTree = ""; }; - E077739D1FB5CD24006B63FA /* QMShareHelper */ = { + CE55639721FBBC970051EC2D /* NSURL+QMShareExtension */ = { isa = PBXGroup; children = ( - E077739E1FB5CD43006B63FA /* QMShareHelper.h */, - E077739F1FB5CD43006B63FA /* QMShareHelper.m */, + CE55639821FBBC970051EC2D /* NSError+QMShareExtension.m */, + CE55639921FBBC970051EC2D /* NSURL+QMShareExtension.h */, + CE55639A21FBBC970051EC2D /* NSError+QMShareExtension.h */, + CE55639B21FBBC970051EC2D /* NSURL+QMShareExtension.m */, ); - path = QMShareHelper; + path = "NSURL+QMShareExtension"; sourceTree = ""; }; - E07BC2201DDF5FD900B8D3B0 /* QMSiriExtension */ = { + CE55639C21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol */ = { isa = PBXGroup; children = ( - E063556F1E1D1DE100BE9061 /* Categories */, - E06355681E1D1D4F00BE9061 /* IntentHandler */, - E0C175731DE507AA00B5990C /* QMSiriExtension.entitlements */, - E07BC2241DDF5FD900B8D3B0 /* Info.plist */, - E04E45C51DE5A78700A0E0FC /* QMSiriHelper.h */, - E04E45C61DE5A78700A0E0FC /* QMSiriHelper.m */, - E06355701E1D1E3300BE9061 /* QBUUser+INPerson.h */, - E06355711E1D1E3300BE9061 /* QBUUser+INPerson.m */, - E06355751E1D3CA800BE9061 /* QBChatDialog+INPerson.h */, - E06355761E1D3CA800BE9061 /* QBChatDialog+INPerson.m */, + CE55639D21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol.m */, + CE55639E21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol.h */, ); - path = QMSiriExtension; + path = "QBChatDialog+QMShareItemProtocol"; sourceTree = ""; }; - E08ADF5B1F8CCD550099CF99 /* QMDataSource */ = { + CE55639F21FBBC970051EC2D /* QBUUser+QMShareItemProtocol */ = { isa = PBXGroup; children = ( - E08ADF5C1F8CCD6D0099CF99 /* QMDataSource.h */, - E08ADF5D1F8CCD6D0099CF99 /* QMDataSource.m */, + CE5563A021FBBC970051EC2D /* QBUUser+QMShareItemProtocol.h */, + CE5563A121FBBC970051EC2D /* QBUUser+QMShareItemProtocol.m */, ); - path = QMDataSource; + path = "QBUUser+QMShareItemProtocol"; sourceTree = ""; }; - E08D52121E5AABE200918B5B /* QMMediaController */ = { + CE5563A221FBBC970051EC2D /* Protocols */ = { isa = PBXGroup; children = ( - E048781F1E8006C60008F497 /* QMAudioRecorder.m */, - E04878201E8006C60008F497 /* QMAudioRecorder.h */, - E09FCA651E60A9270013E3EB /* QMAudioPlayer.h */, - E09FCA661E60A9270013E3EB /* QMAudioPlayer.m */, - E08D52131E5AABF700918B5B /* QMMediaController.h */, - E08D52141E5AABF700918B5B /* QMMediaController.m */, - E043459A1F29545F0066851D /* QMAttachmentController.h */, - E043459B1F29545F0066851D /* QMAttachmentController.m */, + CE5563A321FBBC970051EC2D /* QMShareItemProtocol.h */, + CE5563A421FBBC970051EC2D /* QMShareViewProtocol.h */, ); - path = QMMediaController; + path = Protocols; sourceTree = ""; }; - E0921D911F6FEE11005961CF /* QMImageBarButtonItem */ = { + CE5563D221FBBCA30051EC2D /* QMSiriExtension */ = { isa = PBXGroup; children = ( - E0921D921F6FEE11005961CF /* QMImageBarButtonItem.h */, - E0921D931F6FEE11005961CF /* QMImageBarButtonItem.m */, + CE5563D321FBBCA30051EC2D /* QBChatDialog+INPerson.m */, + CE5563D421FBBCA30051EC2D /* QMSiriHelper.m */, + CE5563D521FBBCA30051EC2D /* IntentHandler */, + CE5563DA21FBBCA30051EC2D /* QBChatDialog+INPerson.h */, + CE5563DB21FBBCA30051EC2D /* QMSiriExtension.entitlements */, + CE5563DC21FBBCA30051EC2D /* QMSiriHelper.h */, + CE5563DD21FBBCA30051EC2D /* Categories */, + CE5563E221FBBCA30051EC2D /* Info.plist */, ); - path = QMImageBarButtonItem; + path = QMSiriExtension; sourceTree = ""; }; - E0A8A77A1F8F7B0200382443 /* Protocols */ = { + CE5563D521FBBCA30051EC2D /* IntentHandler */ = { isa = PBXGroup; children = ( - E0A8A77B1F8F7B0200382443 /* QMShareItemProtocol.h */, - E0A8A77C1F8F7B0200382443 /* QMShareViewProtocol.h */, + CE5563D621FBBCA30051EC2D /* QMMessageIntentHandler.h */, + CE5563D721FBBCA30051EC2D /* IntentHandler.h */, + CE5563D821FBBCA30051EC2D /* IntentHandler.m */, + CE5563D921FBBCA30051EC2D /* QMMessageIntentHandler.m */, ); - path = Protocols; + path = IntentHandler; sourceTree = ""; }; - E0A8A77D1F8F7B0200382443 /* Categories */ = { + CE5563DD21FBBCA30051EC2D /* Categories */ = { isa = PBXGroup; children = ( - E05AEC571F9A0E10004D3274 /* NSURL+QMShareExtension */, - E0A8A77E1F8F7B0200382443 /* QBChatDialog+QMShareItemProtocol */, - E0A8A7811F8F7B0200382443 /* QBUUser+QMShareItemProtocol */, - E0A8A7841F8F7B0200382443 /* QMExtensionCache+QMShareExtension */, - E03AF8021FACDC6400DFEE7A /* NSError+QMShareExtension.h */, - E03AF8031FACDC6400DFEE7A /* NSError+QMShareExtension.m */, + CE5563DE21FBBCA30051EC2D /* QMExtensionCache+QMSiriExtension.h */, + CE5563DF21FBBCA30051EC2D /* QBUUser+INPerson.h */, + CE5563E021FBBCA30051EC2D /* QBUUser+INPerson.m */, + CE5563E121FBBCA30051EC2D /* QMExtensionCache+QMSiriExtension.m */, ); path = Categories; sourceTree = ""; }; - E0A8A77E1F8F7B0200382443 /* QBChatDialog+QMShareItemProtocol */ = { + CE5563E321FBBCA30051EC2D /* QMSiriExtensionUI */ = { isa = PBXGroup; children = ( - E0A8A77F1F8F7B0200382443 /* QBChatDialog+QMShareItemProtocol.h */, - E0A8A7801F8F7B0200382443 /* QBChatDialog+QMShareItemProtocol.m */, + CE5563E421FBBCA30051EC2D /* IntentViewController.h */, + CE5563E521FBBCA30051EC2D /* MainInterface.storyboard */, + CE5563E721FBBCA30051EC2D /* QMSiriExtensionUI.entitlements */, + CE5563E821FBBCA30051EC2D /* IntentViewController.m */, + CE5563E921FBBCA30051EC2D /* Info.plist */, ); - path = "QBChatDialog+QMShareItemProtocol"; + path = QMSiriExtensionUI; sourceTree = ""; }; - E0A8A7811F8F7B0200382443 /* QBUUser+QMShareItemProtocol */ = { + CE57CC5921FA002D0026A23F /* QMChatViewController */ = { isa = PBXGroup; children = ( - E0A8A7821F8F7B0200382443 /* QBUUser+QMShareItemProtocol.h */, - E0A8A7BE1F8F9CAA00382443 /* QBUUser+QMShareItemProtocol.m */, + CE57CC5A21FA002D0026A23F /* QMChatViewController.xib */, + CE57CC5C21FA002D0026A23F /* QMChatViewController.h */, + CE57CC5D21FA002D0026A23F /* Utils */, + CE57CC6721FA002D0026A23F /* QMChatViewController.m */, + CE57CC6821FA002D0026A23F /* Icons */, + CE57CC6A21FA002D0026A23F /* QMChatDataSource */, + CE57CC7121FA002D0026A23F /* Views */, + CE57CCF621FA002E0026A23F /* Categories */, + CE57CD0121FA002E0026A23F /* Protocols */, + CE57CD0421FA002E0026A23F /* QMChatLocationSnapshotter */, ); - path = "QBUUser+QMShareItemProtocol"; + path = QMChatViewController; sourceTree = ""; }; - E0A8A7841F8F7B0200382443 /* QMExtensionCache+QMShareExtension */ = { + CE57CC5D21FA002D0026A23F /* Utils */ = { isa = PBXGroup; children = ( - E0A8A7851F8F7B0200382443 /* QMExtensionCache+QMShareExtension.h */, - E0A8A7861F8F7B0200382443 /* QMExtensionCache+QMShareExtension.m */, + CE57CC5E21FA002D0026A23F /* QMChatResources */, + CE57CC6121FA002D0026A23F /* QMDateUtils */, + CE57CC6421FA002D0026A23F /* QMImageLoader */, ); - path = "QMExtensionCache+QMShareExtension"; + path = Utils; sourceTree = ""; }; - E0A8A7871F8F7B0300382443 /* View Controllers */ = { + CE57CC5E21FA002D0026A23F /* QMChatResources */ = { isa = PBXGroup; children = ( - E07CB8A21FAD2B1A0027087E /* QMShareRootViewController.h */, - E07CB8A31FAD2B1A0027087E /* QMShareRootViewController.m */, - E07CB8AA1FAD31320027087E /* QMShareTableViewController.xib */, - E07CB8A61FAD2F640027087E /* QMShareTableViewController.h */, - E07CB8A71FAD2F640027087E /* QMShareTableViewController.m */, + CE57CC5F21FA002D0026A23F /* QMChatResources.m */, + CE57CC6021FA002D0026A23F /* QMChatResources.h */, ); - path = "View Controllers"; + path = QMChatResources; + sourceTree = ""; + }; + CE57CC6121FA002D0026A23F /* QMDateUtils */ = { + isa = PBXGroup; + children = ( + CE57CC6221FA002D0026A23F /* QMDateUtils.h */, + CE57CC6321FA002D0026A23F /* QMDateUtils.m */, + ); + path = QMDateUtils; + sourceTree = ""; + }; + CE57CC6421FA002D0026A23F /* QMImageLoader */ = { + isa = PBXGroup; + children = ( + CE57CC6521FA002D0026A23F /* QMImageLoader.m */, + CE57CC6621FA002D0026A23F /* QMImageLoader.h */, + ); + path = QMImageLoader; + sourceTree = ""; + }; + CE57CC6821FA002D0026A23F /* Icons */ = { + isa = PBXGroup; + children = ( + CE57CC6921FA002D0026A23F /* Media.xcassets */, + ); + path = Icons; sourceTree = ""; }; - E0A8A78E1F8F7B0300382443 /* Views */ = { + CE57CC6A21FA002D0026A23F /* QMChatDataSource */ = { isa = PBXGroup; children = ( - E0AA0E661F90E34B0082750E /* QMShareContactsTableViewCell */, - E0A8A78F1F8F7B0300382443 /* QMShareCollectionViewCell */, - E0A8A7931F8F7B0300382443 /* QMShareTableViewCell */, + CE57CC6B21FA002D0026A23F /* QBChatMessage+QBDateDivider.h */, + CE57CC6C21FA002D0026A23F /* NSDate+ChatDataSource.h */, + CE57CC6D21FA002D0026A23F /* QMChatDataSource.h */, + CE57CC6E21FA002D0026A23F /* QBChatMessage+QBDateDivider.m */, + CE57CC6F21FA002D0026A23F /* NSDate+ChatDataSource.m */, + CE57CC7021FA002D0026A23F /* QMChatDataSource.m */, + ); + path = QMChatDataSource; + sourceTree = ""; + }; + CE57CC7121FA002D0026A23F /* Views */ = { + isa = PBXGroup; + children = ( + CE57CC7221FA002D0026A23F /* QMKVOView.h */, + CE57CC7321FA002D0026A23F /* Cells */, + CE57CCCD21FA002E0026A23F /* CustomUI */, + CE57CCE821FA002E0026A23F /* CollectionView */, + CE57CCF221FA002E0026A23F /* QMChatContainerView.h */, + CE57CCF321FA002E0026A23F /* QMKVOView.m */, + CE57CCF421FA002E0026A23F /* QMChatActionsHandler.h */, + CE57CCF521FA002E0026A23F /* QMChatContainerView.m */, ); path = Views; sourceTree = ""; }; - E0A8A78F1F8F7B0300382443 /* QMShareCollectionViewCell */ = { + CE57CC7321FA002D0026A23F /* Cells */ = { isa = PBXGroup; children = ( - E0A8A7901F8F7B0300382443 /* QMShareCollectionViewCell.h */, - E0A8A7911F8F7B0300382443 /* QMShareCollectionViewCell.m */, - E0A8A7921F8F7B0300382443 /* QMShareCollectionViewCell.xib */, + CE57CC7421FA002D0026A23F /* QMChatAttachmentOutgoingCell */, + CE57CC7821FA002D0026A23F /* QMChatIncomingCell */, + CE57CC7C21FA002D0026A23F /* QMChatContactRequestCell */, + CE57CC8021FA002D0026A23F /* QMChatCell */, + CE57CC8321FA002D0026A23F /* QMLinkPreviewCell */, + CE57CC8F21FA002E0026A23F /* QMChatMediaAttachmentCell */, + CE57CCB321FA002E0026A23F /* QMChatLocationIncomingCell */, + CE57CCB721FA002E0026A23F /* QMChatAttachmentIncomingCell */, + CE57CCBB21FA002E0026A23F /* QMChatAttachmentCell */, + CE57CCBD21FA002E0026A23F /* QMChatLocationCell */, + CE57CCC121FA002E0026A23F /* QMChatOutgoingCell */, + CE57CCC521FA002E0026A23F /* QMChatLocationOutgoingCell */, + CE57CCC921FA002E0026A23F /* QMChatNotificationCell */, ); - path = QMShareCollectionViewCell; + path = Cells; sourceTree = ""; }; - E0A8A7931F8F7B0300382443 /* QMShareTableViewCell */ = { + CE57CC7421FA002D0026A23F /* QMChatAttachmentOutgoingCell */ = { isa = PBXGroup; children = ( - E0A8A7941F8F7B0300382443 /* QMShareTableViewCell.h */, - E0A8A7951F8F7B0300382443 /* QMShareTableViewCell.m */, - E0A8A7961F8F7B0300382443 /* QMShareTableViewCell.xib */, + CE57CC7521FA002D0026A23F /* QMChatAttachmentOutgoingCell.m */, + CE57CC7621FA002D0026A23F /* QMChatAttachmentOutgoingCell.h */, + CE57CC7721FA002D0026A23F /* QMChatAttachmentOutgoingCell.xib */, ); - path = QMShareTableViewCell; + path = QMChatAttachmentOutgoingCell; sourceTree = ""; }; - E0A8A7971F8F7B0300382443 /* Data Source */ = { + CE57CC7821FA002D0026A23F /* QMChatIncomingCell */ = { isa = PBXGroup; children = ( - E0A8A7981F8F7B0300382443 /* QMShareDataSource */, - E0A8A79B1F8F7B0300382443 /* QMShareItemsDataProvider */, + CE57CC7921FA002D0026A23F /* QMChatIncomingCell.h */, + CE57CC7A21FA002D0026A23F /* QMChatIncomingCell.xib */, + CE57CC7B21FA002D0026A23F /* QMChatIncomingCell.m */, ); - path = "Data Source"; + path = QMChatIncomingCell; sourceTree = ""; }; - E0A8A7981F8F7B0300382443 /* QMShareDataSource */ = { + CE57CC7C21FA002D0026A23F /* QMChatContactRequestCell */ = { isa = PBXGroup; children = ( - E0A8A7991F8F7B0300382443 /* QMShareDataSource.h */, - E0A8A79A1F8F7B0300382443 /* QMShareDataSource.m */, + CE57CC7D21FA002D0026A23F /* QMChatContactRequestCell.h */, + CE57CC7E21FA002D0026A23F /* QMChatContactRequestCell.m */, + CE57CC7F21FA002D0026A23F /* QMChatContactRequestCell.xib */, ); - path = QMShareDataSource; + path = QMChatContactRequestCell; sourceTree = ""; }; - E0A8A79B1F8F7B0300382443 /* QMShareItemsDataProvider */ = { + CE57CC8021FA002D0026A23F /* QMChatCell */ = { isa = PBXGroup; children = ( - E0A8A79C1F8F7B0300382443 /* QMShareItemsDataProvider.h */, - E0A8A79D1F8F7B0300382443 /* QMShareItemsDataProvider.m */, + CE57CC8121FA002D0026A23F /* QMChatCell.h */, + CE57CC8221FA002D0026A23F /* QMChatCell.m */, ); - path = QMShareItemsDataProvider; + path = QMChatCell; sourceTree = ""; }; - E0A8A7B11F8F810E00382443 /* QMExtensionCache */ = { + CE57CC8321FA002D0026A23F /* QMLinkPreviewCell */ = { isa = PBXGroup; children = ( - E0A8A7B21F8F814300382443 /* QMExtensionCache.h */, - E0A8A7B71F8F818800382443 /* QMExtensionCache.m */, + CE57CC8421FA002D0026A23F /* QMChatBaseLinkPreviewCell.m */, + CE57CC8521FA002D0026A23F /* QMChatOutgoingLinkPreviewCell */, + CE57CC8921FA002E0026A23F /* QMChatBaseLinkPreviewCell.h */, + CE57CC8A21FA002E0026A23F /* QMLinkPreviewDelegate.h */, + CE57CC8B21FA002E0026A23F /* QMChatIncomingLinkPreviewCell */, ); - name = QMExtensionCache; - path = Common/QMExtensionCache; + path = QMLinkPreviewCell; sourceTree = ""; }; - E0A996581FC84042008AFFBE /* ThirdPartyLibraries */ = { + CE57CC8521FA002D0026A23F /* QMChatOutgoingLinkPreviewCell */ = { isa = PBXGroup; children = ( - E0A996591FC84042008AFFBE /* MPGNotification */, - E0A9965C1FC84042008AFFBE /* SVProgressHUD */, + CE57CC8621FA002D0026A23F /* QMChatOutgoingLinkPreviewCell.m */, + CE57CC8721FA002D0026A23F /* QMChatOutgoingLinkPreviewCell.h */, + CE57CC8821FA002D0026A23F /* QMChatOutgoingLinkPreviewCell.xib */, ); - path = ThirdPartyLibraries; + path = QMChatOutgoingLinkPreviewCell; sourceTree = ""; }; - E0A996591FC84042008AFFBE /* MPGNotification */ = { + CE57CC8B21FA002E0026A23F /* QMChatIncomingLinkPreviewCell */ = { isa = PBXGroup; children = ( - FBE42BCA1FF6807C00F139E9 /* MPGNotification.h */, - FBE42BCB1FF6807D00F139E9 /* MPGNotification.m */, + CE57CC8C21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.h */, + CE57CC8D21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.xib */, + CE57CC8E21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.m */, ); - path = MPGNotification; + path = QMChatIncomingLinkPreviewCell; sourceTree = ""; }; - E0A9965C1FC84042008AFFBE /* SVProgressHUD */ = { + CE57CC8F21FA002E0026A23F /* QMChatMediaAttachmentCell */ = { isa = PBXGroup; children = ( - E0A9965D1FC84042008AFFBE /* SVIndefiniteAnimatedView.h */, - E0A9965E1FC84042008AFFBE /* SVIndefiniteAnimatedView.m */, - E0A9965F1FC84042008AFFBE /* SVProgressAnimatedView.h */, - E0A996601FC84042008AFFBE /* SVProgressAnimatedView.m */, - E0A996611FC84042008AFFBE /* SVProgressHUD-Prefix.pch */, - E0A996621FC84042008AFFBE /* SVProgressHUD.bundle */, - E0A996631FC84042008AFFBE /* SVProgressHUD.h */, - E0A996641FC84042008AFFBE /* SVProgressHUD.m */, - E0A996651FC84042008AFFBE /* SVRadialGradientLayer.h */, - E0A996661FC84042008AFFBE /* SVRadialGradientLayer.m */, + CE57CC9021FA002E0026A23F /* QMImageOutgoingCell */, + CE57CC9421FA002E0026A23F /* QMBaseChatMediaAttachmentCell */, + CE57CC9721FA002E0026A23F /* QMAudioIncomingCell */, + CE57CC9B21FA002E0026A23F /* QMMediaOutgoingCell */, + CE57CC9E21FA002E0026A23F /* QMVideoIncomingCell */, + CE57CCA221FA002E0026A23F /* QMMediaViewDelegate */, + CE57CCA421FA002E0026A23F /* QMImageIncomingCell */, + CE57CCA821FA002E0026A23F /* QMAudioOutgoingCell */, + CE57CCAC21FA002E0026A23F /* QMMediaIncomingCell */, + CE57CCAF21FA002E0026A23F /* QMVideoOutgoingCell */, ); - path = SVProgressHUD; + path = QMChatMediaAttachmentCell; sourceTree = ""; }; - E0AA0E661F90E34B0082750E /* QMShareContactsTableViewCell */ = { + CE57CC9021FA002E0026A23F /* QMImageOutgoingCell */ = { isa = PBXGroup; children = ( - E0AA0E671F90E38C0082750E /* QMShareContactsTableViewCell.h */, - E0AA0E681F90E38C0082750E /* QMShareContactsTableViewCell.m */, - E0AA0E691F90E38C0082750E /* QMShareContactsTableViewCell.xib */, + CE57CC9121FA002E0026A23F /* QMImageOutgoingCell.m */, + CE57CC9221FA002E0026A23F /* QMImageOutgoingCell.h */, + CE57CC9321FA002E0026A23F /* QMImageOutgoingCell.xib */, ); - path = QMShareContactsTableViewCell; + path = QMImageOutgoingCell; sourceTree = ""; }; - E0B5CEDA1F97865D004CB06D /* QMActivityItem */ = { + CE57CC9421FA002E0026A23F /* QMBaseChatMediaAttachmentCell */ = { isa = PBXGroup; children = ( - E0B5CEDB1F978688004CB06D /* QMActivityItem.h */, - E0B5CEDC1F978688004CB06D /* QMActivityItem.m */, + CE57CC9521FA002E0026A23F /* QMBaseMediaCell.m */, + CE57CC9621FA002E0026A23F /* QMBaseMediaCell.h */, ); - name = QMActivityItem; - path = Common/QMActivityItem; + path = QMBaseChatMediaAttachmentCell; sourceTree = ""; }; - E0CA1F491F84F78A00E9B293 /* QMShareExtension */ = { + CE57CC9721FA002E0026A23F /* QMAudioIncomingCell */ = { isa = PBXGroup; children = ( - E05AEC5B1F9A4AD7004D3274 /* Common classes */, - E0A8A77D1F8F7B0200382443 /* Categories */, - E0A8A7971F8F7B0300382443 /* Data Source */, - E0A8A77A1F8F7B0200382443 /* Protocols */, - E0A8A7871F8F7B0300382443 /* View Controllers */, - E0A8A78E1F8F7B0300382443 /* Views */, - E0CA1F571F84F7DE00E9B293 /* QMShareExtension.entitlements */, - E0CA1F4D1F84F78A00E9B293 /* ShareInterface.storyboard */, - E0CA1F501F84F78A00E9B293 /* Info.plist */, + CE57CC9821FA002E0026A23F /* QMAudioIncomingCell.h */, + CE57CC9921FA002E0026A23F /* QMAudioIncomingCell.xib */, + CE57CC9A21FA002E0026A23F /* QMAudioIncomingCell.m */, ); - path = QMShareExtension; + path = QMAudioIncomingCell; sourceTree = ""; }; - E0D9ED131F9E384E00EF6043 /* QBSettings */ = { + CE57CC9B21FA002E0026A23F /* QMMediaOutgoingCell */ = { isa = PBXGroup; children = ( - E03AF8111FACDE5E00DFEE7A /* QBSettings+Qmunicate.h */, - E03AF8121FACDE5E00DFEE7A /* QBSettings+Qmunicate.m */, + CE57CC9C21FA002E0026A23F /* QMMediaOutgoingCell.m */, + CE57CC9D21FA002E0026A23F /* QMMediaOutgoingCell.h */, ); - path = QBSettings; + path = QMMediaOutgoingCell; sourceTree = ""; }; - E3A99BCC1FD00C7800D0907B /* QMCallKitAdapter */ = { + CE57CC9E21FA002E0026A23F /* QMVideoIncomingCell */ = { isa = PBXGroup; children = ( - E3A99BCD1FD00C8F00D0907B /* QMCallKitAdapter.h */, - E3A99BCE1FD00C8F00D0907B /* QMCallKitAdapter.m */, + CE57CC9F21FA002E0026A23F /* QMVideoIncomingCell.h */, + CE57CCA021FA002E0026A23F /* QMVideoIncomingCell.xib */, + CE57CCA121FA002E0026A23F /* QMVideoIncomingCell.m */, ); - path = QMCallKitAdapter; + path = QMVideoIncomingCell; sourceTree = ""; }; - E3D2EE9D1EF42D7C002DC44E /* QMNavigationController */ = { + CE57CCA221FA002E0026A23F /* QMMediaViewDelegate */ = { isa = PBXGroup; children = ( - E3D2EEA91EF7F6A2002DC44E /* QMNavigationController.h */, - E3D2EEAA1EF7F6A2002DC44E /* QMNavigationController.m */, + CE57CCA321FA002E0026A23F /* QMMediaViewDelegate.h */, ); - name = QMNavigationController; + path = QMMediaViewDelegate; sourceTree = ""; }; - E3D2EEA11EF7C675002DC44E /* QMTableViewController */ = { + CE57CCA421FA002E0026A23F /* QMImageIncomingCell */ = { isa = PBXGroup; children = ( - E3D2EEA21EF7C693002DC44E /* QMTableViewController.h */, - E3D2EEA31EF7C693002DC44E /* QMTableViewController.m */, + CE57CCA521FA002E0026A23F /* QMImageIncomingCell.m */, + CE57CCA621FA002E0026A23F /* QMImageIncomingCell.h */, + CE57CCA721FA002E0026A23F /* QMImageIncomingCell.xib */, ); - name = QMTableViewController; + path = QMImageIncomingCell; sourceTree = ""; }; - E3D2EEA51EF7E707002DC44E /* QMViewController */ = { + CE57CCA821FA002E0026A23F /* QMAudioOutgoingCell */ = { isa = PBXGroup; children = ( - E3D2EEA61EF7E71C002DC44E /* QMViewController.h */, - E3D2EEA71EF7E71C002DC44E /* QMViewController.m */, + CE57CCA921FA002E0026A23F /* QMAudioOutgoingCell.h */, + CE57CCAA21FA002E0026A23F /* QMAudioOutgoingCell.m */, + CE57CCAB21FA002E0026A23F /* QMAudioOutgoingCell.xib */, ); - name = QMViewController; + path = QMAudioOutgoingCell; sourceTree = ""; }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 69D57E5118ACC11C00A9900A /* Q-municate */ = { - isa = PBXNativeTarget; - buildConfigurationList = 69D57E7E18ACC11C00A9900A /* Build configuration list for PBXNativeTarget "Q-municate" */; - buildPhases = ( - E6936DF91158CD5FF2D1E6C5 /* [CP] Check Pods Manifest.lock */, - 69D57E4E18ACC11C00A9900A /* Sources */, - 69D57E4F18ACC11C00A9900A /* Frameworks */, - 69D57E5018ACC11C00A9900A /* Resources */, - 584B79C41C452A7A00356FB9 /* Run Script */, - A3EB8C6F63D28CDDF9DD7F5E /* [CP] Embed Pods Frameworks */, - CFF0567CBCC50E2F953F149B /* [CP] Copy Pods Resources */, - E03871F31DDB36F800554EB9 /* Embed App Extensions */, - E333FBA31F5460E70095F224 /* Embed Frameworks */, - 5803F2BA1D4F568800AE4934 /* ShellScript */, - E37EE59C1F2790BE00B1E538 /* ShellScript */, + CE57CCAC21FA002E0026A23F /* QMMediaIncomingCell */ = { + isa = PBXGroup; + children = ( + CE57CCAD21FA002E0026A23F /* QMMediaIncomingCell.m */, + CE57CCAE21FA002E0026A23F /* QMMediaIncomingCell.h */, ); - buildRules = ( + path = QMMediaIncomingCell; + sourceTree = ""; + }; + CE57CCAF21FA002E0026A23F /* QMVideoOutgoingCell */ = { + isa = PBXGroup; + children = ( + CE57CCB021FA002E0026A23F /* QMVideoOutgoingCell.h */, + CE57CCB121FA002E0026A23F /* QMVideoOutgoingCell.xib */, + CE57CCB221FA002E0026A23F /* QMVideoOutgoingCell.m */, ); - dependencies = ( - E07BC2261DDF5FD900B8D3B0 /* PBXTargetDependency */, - E0CA1F521F84F78A00E9B293 /* PBXTargetDependency */, + path = QMVideoOutgoingCell; + sourceTree = ""; + }; + CE57CCB321FA002E0026A23F /* QMChatLocationIncomingCell */ = { + isa = PBXGroup; + children = ( + CE57CCB421FA002E0026A23F /* QMChatLocationIncomingCell.h */, + CE57CCB521FA002E0026A23F /* QMChatLocationIncomingCell.m */, + CE57CCB621FA002E0026A23F /* QMChatLocationIncomingCell.xib */, ); - name = "Q-municate"; - productName = "Q-municate"; - productReference = 69D57E5218ACC11C00A9900A /* Q-municate.app */; - productType = "com.apple.product-type.application"; + path = QMChatLocationIncomingCell; + sourceTree = ""; }; - E07BC21E1DDF5FD900B8D3B0 /* QMSiriExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = E07BC2281DDF5FD900B8D3B0 /* Build configuration list for PBXNativeTarget "QMSiriExtension" */; - buildPhases = ( - E38D9249A28F87BADEA652EE /* [CP] Check Pods Manifest.lock */, - E07BC21B1DDF5FD900B8D3B0 /* Sources */, - E07BC21C1DDF5FD900B8D3B0 /* Frameworks */, - E07BC21D1DDF5FD900B8D3B0 /* Resources */, - E911BC553233DD014AE11AC7 /* [CP] Copy Pods Resources */, + CE57CCB721FA002E0026A23F /* QMChatAttachmentIncomingCell */ = { + isa = PBXGroup; + children = ( + CE57CCB821FA002E0026A23F /* QMChatAttachmentIncomingCell.m */, + CE57CCB921FA002E0026A23F /* QMChatAttachmentIncomingCell.xib */, + CE57CCBA21FA002E0026A23F /* QMChatAttachmentIncomingCell.h */, ); - buildRules = ( + path = QMChatAttachmentIncomingCell; + sourceTree = ""; + }; + CE57CCBB21FA002E0026A23F /* QMChatAttachmentCell */ = { + isa = PBXGroup; + children = ( + CE57CCBC21FA002E0026A23F /* QMChatAttachmentCell.h */, ); - dependencies = ( + path = QMChatAttachmentCell; + sourceTree = ""; + }; + CE57CCBD21FA002E0026A23F /* QMChatLocationCell */ = { + isa = PBXGroup; + children = ( + CE57CCBE21FA002E0026A23F /* QMBaseChatLocationCell.h */, + CE57CCBF21FA002E0026A23F /* QMChatLocationCell.h */, + CE57CCC021FA002E0026A23F /* QMBaseChatLocationCell.m */, ); - name = QMSiriExtension; - productName = QMSiriExtension; - productReference = E07BC21F1DDF5FD900B8D3B0 /* QMSiriExtension.appex */; - productType = "com.apple.product-type.app-extension"; + path = QMChatLocationCell; + sourceTree = ""; }; - E0CA1F471F84F78A00E9B293 /* QMShareExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = E0CA1F561F84F78A00E9B293 /* Build configuration list for PBXNativeTarget "QMShareExtension" */; - buildPhases = ( - 05A9BCF94B2CDA2708BECF61 /* [CP] Check Pods Manifest.lock */, - E0CA1F441F84F78A00E9B293 /* Sources */, - E0CA1F451F84F78A00E9B293 /* Frameworks */, - E0CA1F461F84F78A00E9B293 /* Resources */, - F94AD707CEDF6BCDE4AAF85B /* [CP] Copy Pods Resources */, + CE57CCC121FA002E0026A23F /* QMChatOutgoingCell */ = { + isa = PBXGroup; + children = ( + CE57CCC221FA002E0026A23F /* QMChatOutgoingCell.h */, + CE57CCC321FA002E0026A23F /* QMChatOutgoingCell.m */, + CE57CCC421FA002E0026A23F /* QMChatOutgoingCell.xib */, ); - buildRules = ( + path = QMChatOutgoingCell; + sourceTree = ""; + }; + CE57CCC521FA002E0026A23F /* QMChatLocationOutgoingCell */ = { + isa = PBXGroup; + children = ( + CE57CCC621FA002E0026A23F /* QMChatLocationOutgoingCell.h */, + CE57CCC721FA002E0026A23F /* QMChatLocationOutgoingCell.m */, + CE57CCC821FA002E0026A23F /* QMChatLocationOutgoingCell.xib */, ); - dependencies = ( + path = QMChatLocationOutgoingCell; + sourceTree = ""; + }; + CE57CCC921FA002E0026A23F /* QMChatNotificationCell */ = { + isa = PBXGroup; + children = ( + CE57CCCA21FA002E0026A23F /* QMChatNotificationCell.xib */, + CE57CCCB21FA002E0026A23F /* QMChatNotificationCell.h */, + CE57CCCC21FA002E0026A23F /* QMChatNotificationCell.m */, ); - name = QMShareExtension; - productName = QMShareExtension; - productReference = E0CA1F481F84F78A00E9B293 /* QMShareExtension.appex */; - productType = "com.apple.product-type.app-extension"; + path = QMChatNotificationCell; + sourceTree = ""; }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 69D57E4A18ACC11C00A9900A /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = QM; - LastUpgradeCheck = 0900; - ORGANIZATIONNAME = Quickblox; + CE57CCCD21FA002E0026A23F /* CustomUI */ = { + isa = PBXGroup; + children = ( + CE57CCCE21FA002E0026A23F /* QMHeaderCollectionReusableView */, + CE57CCD221FA002E0026A23F /* PlaceHolderTextView */, + CE57CCD521FA002E0026A23F /* InputToolBar */, + CE57CCDB21FA002E0026A23F /* QMProgressView */, + CE57CCDE21FA002E0026A23F /* QMAudioRecordView */, + CE57CCE221FA002E0026A23F /* QMImageView */, + CE57CCE521FA002E0026A23F /* QMAudioRecordButton */, + ); + path = CustomUI; + sourceTree = ""; + }; + CE57CCCE21FA002E0026A23F /* QMHeaderCollectionReusableView */ = { + isa = PBXGroup; + children = ( + CE57CCCF21FA002E0026A23F /* QMHeaderCollectionReusableView.h */, + CE57CCD021FA002E0026A23F /* QMHeaderCollectionReusableView.xib */, + CE57CCD121FA002E0026A23F /* QMHeaderCollectionReusableView.m */, + ); + path = QMHeaderCollectionReusableView; + sourceTree = ""; + }; + CE57CCD221FA002E0026A23F /* PlaceHolderTextView */ = { + isa = PBXGroup; + children = ( + CE57CCD321FA002E0026A23F /* QMPlaceHolderTextView.h */, + CE57CCD421FA002E0026A23F /* QMPlaceHolderTextView.m */, + ); + path = PlaceHolderTextView; + sourceTree = ""; + }; + CE57CCD521FA002E0026A23F /* InputToolBar */ = { + isa = PBXGroup; + children = ( + CE57CCD621FA002E0026A23F /* QMInputToolbar.m */, + CE57CCD721FA002E0026A23F /* QMToolbarContentView.h */, + CE57CCD821FA002E0026A23F /* QMInputToolbar.h */, + CE57CCD921FA002E0026A23F /* QMToolbarContentView.xib */, + CE57CCDA21FA002E0026A23F /* QMToolbarContentView.m */, + ); + path = InputToolBar; + sourceTree = ""; + }; + CE57CCDB21FA002E0026A23F /* QMProgressView */ = { + isa = PBXGroup; + children = ( + CE57CCDC21FA002E0026A23F /* QMProgressView.h */, + CE57CCDD21FA002E0026A23F /* QMProgressView.m */, + ); + path = QMProgressView; + sourceTree = ""; + }; + CE57CCDE21FA002E0026A23F /* QMAudioRecordView */ = { + isa = PBXGroup; + children = ( + CE57CCDF21FA002E0026A23F /* QMAudioRecordView.h */, + CE57CCE021FA002E0026A23F /* QMAudioRecordView.m */, + CE57CCE121FA002E0026A23F /* QMAudioRecordView.xib */, + ); + path = QMAudioRecordView; + sourceTree = ""; + }; + CE57CCE221FA002E0026A23F /* QMImageView */ = { + isa = PBXGroup; + children = ( + CE57CCE321FA002E0026A23F /* QMImageView.m */, + CE57CCE421FA002E0026A23F /* QMImageView.h */, + ); + path = QMImageView; + sourceTree = ""; + }; + CE57CCE521FA002E0026A23F /* QMAudioRecordButton */ = { + isa = PBXGroup; + children = ( + CE57CCE621FA002E0026A23F /* QMAudioRecordButton.m */, + CE57CCE721FA002E0026A23F /* QMAudioRecordButton.h */, + ); + path = QMAudioRecordButton; + sourceTree = ""; + }; + CE57CCE821FA002E0026A23F /* CollectionView */ = { + isa = PBXGroup; + children = ( + CE57CCE921FA002E0026A23F /* Layout */, + CE57CCF021FA002E0026A23F /* QMChatCollectionView.m */, + CE57CCF121FA002E0026A23F /* QMChatCollectionView.h */, + ); + path = CollectionView; + sourceTree = ""; + }; + CE57CCE921FA002E0026A23F /* Layout */ = { + isa = PBXGroup; + children = ( + CE57CCEA21FA002E0026A23F /* QMChatCollectionViewFlowLayout.h */, + CE57CCEB21FA002E0026A23F /* QMCollectionViewFlowLayoutInvalidationContext.h */, + CE57CCEC21FA002E0026A23F /* QMChatCellLayoutAttributes.m */, + CE57CCED21FA002E0026A23F /* QMChatCellLayoutAttributes.h */, + CE57CCEE21FA002E0026A23F /* QMCollectionViewFlowLayoutInvalidationContext.m */, + CE57CCEF21FA002E0026A23F /* QMChatCollectionViewFlowLayout.m */, + ); + path = Layout; + sourceTree = ""; + }; + CE57CCF621FA002E0026A23F /* Categories */ = { + isa = PBXGroup; + children = ( + CE57CCF721FA002E0026A23F /* UIColor+QM.m */, + CE57CCF821FA002E0026A23F /* UIImage+Cropper.m */, + CE57CCF921FA002E0026A23F /* UIView+QM.h */, + CE57CCFA21FA002E0026A23F /* NSString+QM.m */, + CE57CCFB21FA002E0026A23F /* UIImage+QM.h */, + CE57CCFC21FA002E0026A23F /* UIColor+QM.h */, + CE57CCFD21FA002E0026A23F /* UIImage+Cropper.h */, + CE57CCFE21FA002E0026A23F /* NSString+QM.h */, + CE57CCFF21FA002E0026A23F /* UIView+QM.m */, + CE57CD0021FA002E0026A23F /* UIImage+QM.m */, + ); + path = Categories; + sourceTree = ""; + }; + CE57CD0121FA002E0026A23F /* Protocols */ = { + isa = PBXGroup; + children = ( + CE57CD0221FA002E0026A23F /* QMChatCollectionViewDelegateFlowLayout.h */, + CE57CD0321FA002E0026A23F /* QMChatCollectionViewDataSource.h */, + ); + path = Protocols; + sourceTree = ""; + }; + CE57CD0421FA002E0026A23F /* QMChatLocationSnapshotter */ = { + isa = PBXGroup; + children = ( + CE57CD0521FA002E0026A23F /* UIImageView+QMLocationSnapshot.m */, + CE57CD0621FA002E0026A23F /* QMChatLocationSnapshotter.m */, + CE57CD0721FA002E0026A23F /* UIImageView+QMLocationSnapshot.h */, + CE57CD0821FA002E0026A23F /* QMChatLocationSnapshotter.h */, + ); + path = QMChatLocationSnapshotter; + sourceTree = ""; + }; + CEFBFAC321FB929900E1ECB2 /* QMServices */ = { + isa = PBXGroup; + children = ( + CEFBFAC421FB929900E1ECB2 /* QMOpenGraphCache */, + CEFBFAD121FB929900E1ECB2 /* QMOpenGraphService */, + CEFBFAD821FB929900E1ECB2 /* QMManagers */, + CEFBFADF21FB929900E1ECB2 /* QMChatCache */, + CEFBFAFA21FB929A00E1ECB2 /* QMContactListService */, + CEFBFB0221FB929A00E1ECB2 /* QMBaseService */, + CEFBFB0B21FB929A00E1ECB2 /* QMUsersCache */, + CEFBFB1921FB929A00E1ECB2 /* QMServices */, + CEFBFB1E21FB929A00E1ECB2 /* QMAuthService */, + CEFBFB2321FB929A00E1ECB2 /* QMContactListCache */, + CEFBFB3021FB929A00E1ECB2 /* QMUsersService */, + CEFBFB3921FB929A00E1ECB2 /* QMDBStorage */, + CEFBFB6C21FB929A00E1ECB2 /* QMChatService */, + ); + path = QMServices; + sourceTree = ""; + }; + CEFBFAC421FB929900E1ECB2 /* QMOpenGraphCache */ = { + isa = PBXGroup; + children = ( + CEFBFAC521FB929900E1ECB2 /* QMOpenGraphCache.m */, + CEFBFAC621FB929900E1ECB2 /* CoreData */, + CEFBFAD021FB929900E1ECB2 /* QMOpenGraphCache.h */, + ); + path = QMOpenGraphCache; + sourceTree = ""; + }; + CEFBFAC621FB929900E1ECB2 /* CoreData */ = { + isa = PBXGroup; + children = ( + CEFBFAC721FB929900E1ECB2 /* QMOpenGraphModel.xcdatamodeld */, + CEFBFAC921FB929900E1ECB2 /* QMOpenGraphModelIncludes.h */, + CEFBFACA21FB929900E1ECB2 /* Entries */, + CEFBFACD21FB929900E1ECB2 /* EntriesMachine */, + ); + path = CoreData; + sourceTree = ""; + }; + CEFBFACA21FB929900E1ECB2 /* Entries */ = { + isa = PBXGroup; + children = ( + CEFBFACB21FB929900E1ECB2 /* CDOpenGraphModel.m */, + CEFBFACC21FB929900E1ECB2 /* CDOpenGraphModel.h */, + ); + path = Entries; + sourceTree = ""; + }; + CEFBFACD21FB929900E1ECB2 /* EntriesMachine */ = { + isa = PBXGroup; + children = ( + CEFBFACE21FB929900E1ECB2 /* _CDOpenGraphModel.m */, + CEFBFACF21FB929900E1ECB2 /* _CDOpenGraphModel.h */, + ); + path = EntriesMachine; + sourceTree = ""; + }; + CEFBFAD121FB929900E1ECB2 /* QMOpenGraphService */ = { + isa = PBXGroup; + children = ( + CEFBFAD221FB929900E1ECB2 /* QMOpenGraphMemoryStorage.m */, + CEFBFAD321FB929900E1ECB2 /* QMOpenGraphItem.m */, + CEFBFAD421FB929900E1ECB2 /* QMOpenGraphService.m */, + CEFBFAD521FB929900E1ECB2 /* QMOpenGraphMemoryStorage.h */, + CEFBFAD621FB929900E1ECB2 /* QMOpenGraphItem.h */, + CEFBFAD721FB929900E1ECB2 /* QMOpenGraphService.h */, + ); + path = QMOpenGraphService; + sourceTree = ""; + }; + CEFBFAD821FB929900E1ECB2 /* QMManagers */ = { + isa = PBXGroup; + children = ( + CEFBFAD921FB929900E1ECB2 /* QMDeferredQueueMemoryStorage.m */, + CEFBFADA21FB929900E1ECB2 /* QMDeferredQueueManager.h */, + CEFBFADB21FB929900E1ECB2 /* QMServicesManager.m */, + CEFBFADC21FB929900E1ECB2 /* QMDeferredQueueMemoryStorage.h */, + CEFBFADD21FB929900E1ECB2 /* QMDeferredQueueManager.m */, + CEFBFADE21FB929900E1ECB2 /* QMServicesManager.h */, + ); + path = QMManagers; + sourceTree = ""; + }; + CEFBFADF21FB929900E1ECB2 /* QMChatCache */ = { + isa = PBXGroup; + children = ( + CEFBFAE021FB929900E1ECB2 /* CoreData */, + CEFBFAF821FB929A00E1ECB2 /* QMChatCache.h */, + CEFBFAF921FB929A00E1ECB2 /* QMChatCache.m */, + ); + path = QMChatCache; + sourceTree = ""; + }; + CEFBFAE021FB929900E1ECB2 /* CoreData */ = { + isa = PBXGroup; + children = ( + CEFBFAE121FB929900E1ECB2 /* QMChatServiceModel.xcdatamodeld */, + CEFBFAE921FB929900E1ECB2 /* Entries */, + CEFBFAF021FB929900E1ECB2 /* EntriesMachine */, + CEFBFAF721FB929A00E1ECB2 /* QMChatServiceModelIncludes.h */, + ); + path = CoreData; + sourceTree = ""; + }; + CEFBFAE921FB929900E1ECB2 /* Entries */ = { + isa = PBXGroup; + children = ( + CEFBFAEA21FB929900E1ECB2 /* QMCDAttachment.h */, + CEFBFAEB21FB929900E1ECB2 /* QMCDMessage.m */, + CEFBFAEC21FB929900E1ECB2 /* QMCDDialog.h */, + CEFBFAED21FB929900E1ECB2 /* QMCDMessage.h */, + CEFBFAEE21FB929900E1ECB2 /* QMCDAttachment.m */, + CEFBFAEF21FB929900E1ECB2 /* QMCDDialog.m */, + ); + path = Entries; + sourceTree = ""; + }; + CEFBFAF021FB929900E1ECB2 /* EntriesMachine */ = { + isa = PBXGroup; + children = ( + CEFBFAF121FB929900E1ECB2 /* _QMCDAttachment.m */, + CEFBFAF221FB929900E1ECB2 /* _QMCDDialog.h */, + CEFBFAF321FB929900E1ECB2 /* _QMCDMessage.m */, + CEFBFAF421FB929A00E1ECB2 /* _QMCDAttachment.h */, + CEFBFAF521FB929A00E1ECB2 /* _QMCDMessage.h */, + CEFBFAF621FB929A00E1ECB2 /* _QMCDDialog.m */, + ); + path = EntriesMachine; + sourceTree = ""; + }; + CEFBFAFA21FB929A00E1ECB2 /* QMContactListService */ = { + isa = PBXGroup; + children = ( + CEFBFAFB21FB929A00E1ECB2 /* QMContactListService.h */, + CEFBFAFC21FB929A00E1ECB2 /* Bolts */, + CEFBFAFE21FB929A00E1ECB2 /* QMContactListMemoryStorage */, + CEFBFB0121FB929A00E1ECB2 /* QMContactListService.m */, + ); + path = QMContactListService; + sourceTree = ""; + }; + CEFBFAFC21FB929A00E1ECB2 /* Bolts */ = { + isa = PBXGroup; + children = ( + CEFBFAFD21FB929A00E1ECB2 /* QMContactListService+Bolts.m */, + ); + path = Bolts; + sourceTree = ""; + }; + CEFBFAFE21FB929A00E1ECB2 /* QMContactListMemoryStorage */ = { + isa = PBXGroup; + children = ( + CEFBFAFF21FB929A00E1ECB2 /* QMContactListMemoryStorage.m */, + CEFBFB0021FB929A00E1ECB2 /* QMContactListMemoryStorage.h */, + ); + path = QMContactListMemoryStorage; + sourceTree = ""; + }; + CEFBFB0221FB929A00E1ECB2 /* QMBaseService */ = { + isa = PBXGroup; + children = ( + CEFBFB0321FB929A00E1ECB2 /* QMBaseService.m */, + CEFBFB0421FB929A00E1ECB2 /* QMCancellableService.h */, + CEFBFB0521FB929A00E1ECB2 /* QMMemoryStorageProtocol.h */, + CEFBFB0621FB929A00E1ECB2 /* QMBaseService.h */, + CEFBFB0721FB929A00E1ECB2 /* QMServiceManagerProtocol.h */, + CEFBFB0821FB929A00E1ECB2 /* QMAsynchronousOperation */, + ); + path = QMBaseService; + sourceTree = ""; + }; + CEFBFB0821FB929A00E1ECB2 /* QMAsynchronousOperation */ = { + isa = PBXGroup; + children = ( + CEFBFB0921FB929A00E1ECB2 /* QMAsynchronousOperation.m */, + CEFBFB0A21FB929A00E1ECB2 /* QMAsynchronousOperation.h */, + ); + path = QMAsynchronousOperation; + sourceTree = ""; + }; + CEFBFB0B21FB929A00E1ECB2 /* QMUsersCache */ = { + isa = PBXGroup; + children = ( + CEFBFB0C21FB929A00E1ECB2 /* QMUsersCache.h */, + CEFBFB0D21FB929A00E1ECB2 /* CoreData */, + CEFBFB1821FB929A00E1ECB2 /* QMUsersCache.m */, + ); + path = QMUsersCache; + sourceTree = ""; + }; + CEFBFB0D21FB929A00E1ECB2 /* CoreData */ = { + isa = PBXGroup; + children = ( + CEFBFB0E21FB929A00E1ECB2 /* Entries */, + CEFBFB1121FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld */, + CEFBFB1421FB929A00E1ECB2 /* EntriesMachine */, + CEFBFB1721FB929A00E1ECB2 /* QMUsersModelIncludes.h */, + ); + path = CoreData; + sourceTree = ""; + }; + CEFBFB0E21FB929A00E1ECB2 /* Entries */ = { + isa = PBXGroup; + children = ( + CEFBFB0F21FB929A00E1ECB2 /* CDUser.m */, + CEFBFB1021FB929A00E1ECB2 /* CDUser.h */, + ); + path = Entries; + sourceTree = ""; + }; + CEFBFB1421FB929A00E1ECB2 /* EntriesMachine */ = { + isa = PBXGroup; + children = ( + CEFBFB1521FB929A00E1ECB2 /* _CDUser.m */, + CEFBFB1621FB929A00E1ECB2 /* _CDUser.h */, + ); + path = EntriesMachine; + sourceTree = ""; + }; + CEFBFB1921FB929A00E1ECB2 /* QMServices */ = { + isa = PBXGroup; + children = ( + CEFBFB1A21FB929A00E1ECB2 /* QMServices.h */, + CEFBFB1B21FB929A00E1ECB2 /* QMSLog.m */, + CEFBFB1C21FB929A00E1ECB2 /* QMSLog.h */, + CEFBFB1D21FB929A00E1ECB2 /* QMServices.m */, + ); + path = QMServices; + sourceTree = ""; + }; + CEFBFB1E21FB929A00E1ECB2 /* QMAuthService */ = { + isa = PBXGroup; + children = ( + CEFBFB1F21FB929A00E1ECB2 /* QMAuthService.m */, + CEFBFB2021FB929A00E1ECB2 /* Bolts */, + CEFBFB2221FB929A00E1ECB2 /* QMAuthService.h */, + ); + path = QMAuthService; + sourceTree = ""; + }; + CEFBFB2021FB929A00E1ECB2 /* Bolts */ = { + isa = PBXGroup; + children = ( + CEFBFB2121FB929A00E1ECB2 /* QMAuthService+Bolts.m */, + ); + path = Bolts; + sourceTree = ""; + }; + CEFBFB2321FB929A00E1ECB2 /* QMContactListCache */ = { + isa = PBXGroup; + children = ( + CEFBFB2421FB929A00E1ECB2 /* QMContactListCache.m */, + CEFBFB2521FB929A00E1ECB2 /* CoreData */, + CEFBFB2F21FB929A00E1ECB2 /* QMContactListCache.h */, + ); + path = QMContactListCache; + sourceTree = ""; + }; + CEFBFB2521FB929A00E1ECB2 /* CoreData */ = { + isa = PBXGroup; + children = ( + CEFBFB2621FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld */, + CEFBFB2821FB929A00E1ECB2 /* QMContactListModelIncludes.h */, + CEFBFB2921FB929A00E1ECB2 /* Entries */, + CEFBFB2C21FB929A00E1ECB2 /* EntriesMachine */, + ); + path = CoreData; + sourceTree = ""; + }; + CEFBFB2921FB929A00E1ECB2 /* Entries */ = { + isa = PBXGroup; + children = ( + CEFBFB2A21FB929A00E1ECB2 /* CDContactListItem.m */, + CEFBFB2B21FB929A00E1ECB2 /* CDContactListItem.h */, + ); + path = Entries; + sourceTree = ""; + }; + CEFBFB2C21FB929A00E1ECB2 /* EntriesMachine */ = { + isa = PBXGroup; + children = ( + CEFBFB2D21FB929A00E1ECB2 /* _CDContactListItem.m */, + CEFBFB2E21FB929A00E1ECB2 /* _CDContactListItem.h */, + ); + path = EntriesMachine; + sourceTree = ""; + }; + CEFBFB3021FB929A00E1ECB2 /* QMUsersService */ = { + isa = PBXGroup; + children = ( + CEFBFB3121FB929A00E1ECB2 /* QMUsersService.m */, + CEFBFB3221FB929A00E1ECB2 /* QMUsersService.h */, + CEFBFB3321FB929A00E1ECB2 /* Categories */, + CEFBFB3621FB929A00E1ECB2 /* QMUsersMemoryStorage */, + ); + path = QMUsersService; + sourceTree = ""; + }; + CEFBFB3321FB929A00E1ECB2 /* Categories */ = { + isa = PBXGroup; + children = ( + CEFBFB3421FB929A00E1ECB2 /* QBUUser+CustomData.h */, + CEFBFB3521FB929A00E1ECB2 /* QBUUser+CustomData.m */, + ); + path = Categories; + sourceTree = ""; + }; + CEFBFB3621FB929A00E1ECB2 /* QMUsersMemoryStorage */ = { + isa = PBXGroup; + children = ( + CEFBFB3721FB929A00E1ECB2 /* QMUsersMemoryStorage.h */, + CEFBFB3821FB929A00E1ECB2 /* QMUsersMemoryStorage.m */, + ); + path = QMUsersMemoryStorage; + sourceTree = ""; + }; + CEFBFB3921FB929A00E1ECB2 /* QMDBStorage */ = { + isa = PBXGroup; + children = ( + CEFBFB3A21FB929A00E1ECB2 /* QMDBStorage.h */, + CEFBFB3B21FB929A00E1ECB2 /* QMCDRecord */, + CEFBFB6B21FB929A00E1ECB2 /* QMDBStorage.m */, + ); + path = QMDBStorage; + sourceTree = ""; + }; + CEFBFB3B21FB929A00E1ECB2 /* QMCDRecord */ = { + isa = PBXGroup; + children = ( + CEFBFB3C21FB929A00E1ECB2 /* QMCDMigrationManager.m */, + CEFBFB3D21FB929A00E1ECB2 /* QMCDRecord.h */, + CEFBFB3E21FB929A00E1ECB2 /* QMCDRecord */, + CEFBFB4621FB929A00E1ECB2 /* QMCDMigrationManager.h */, + CEFBFB4721FB929A00E1ECB2 /* Categories */, + CEFBFB6821FB929A00E1ECB2 /* QMCDRecordStack */, + ); + path = QMCDRecord; + sourceTree = ""; + }; + CEFBFB3E21FB929A00E1ECB2 /* QMCDRecord */ = { + isa = PBXGroup; + children = ( + CEFBFB3F21FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m */, + CEFBFB4021FB929A00E1ECB2 /* QMCDRecordInternal.h */, + CEFBFB4121FB929A00E1ECB2 /* QMCDRecord+Options.m */, + CEFBFB4221FB929A00E1ECB2 /* QMCDRecordInternal.m */, + CEFBFB4321FB929A00E1ECB2 /* QMCDRecord+VersionInformation.h */, + CEFBFB4421FB929A00E1ECB2 /* QMCDRecordLogging.h */, + CEFBFB4521FB929A00E1ECB2 /* QMCDRecord+Options.h */, + ); + path = QMCDRecord; + sourceTree = ""; + }; + CEFBFB4721FB929A00E1ECB2 /* Categories */ = { + isa = PBXGroup; + children = ( + CEFBFB4821FB929A00E1ECB2 /* Foundation */, + CEFBFB4F21FB929A00E1ECB2 /* CoreData */, + ); + path = Categories; + sourceTree = ""; + }; + CEFBFB4821FB929A00E1ECB2 /* Foundation */ = { + isa = PBXGroup; + children = ( + CEFBFB4921FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.h */, + CEFBFB4A21FB929A00E1ECB2 /* NSArray+QMCDRecord.m */, + CEFBFB4B21FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.h */, + CEFBFB4C21FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m */, + CEFBFB4D21FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m */, + CEFBFB4E21FB929A00E1ECB2 /* NSArray+QMCDRecord.h */, + ); + path = Foundation; + sourceTree = ""; + }; + CEFBFB4F21FB929A00E1ECB2 /* CoreData */ = { + isa = PBXGroup; + children = ( + CEFBFB5021FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m */, + CEFBFB5121FB929A00E1ECB2 /* NSManagedObject */, + CEFBFB5A21FB929A00E1ECB2 /* NSManagedObjectContext */, + CEFBFB6121FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.h */, + CEFBFB6221FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.h */, + CEFBFB6321FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m */, + CEFBFB6421FB929A00E1ECB2 /* NSPersistentStore+QMCDRecordPrivate.h */, + CEFBFB6521FB929A00E1ECB2 /* NSPersistentStoreCoordinator */, + ); + path = CoreData; + sourceTree = ""; + }; + CEFBFB5121FB929A00E1ECB2 /* NSManagedObject */ = { + isa = PBXGroup; + children = ( + CEFBFB5221FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m */, + CEFBFB5321FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m */, + CEFBFB5421FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.h */, + CEFBFB5521FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.h */, + CEFBFB5621FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m */, + CEFBFB5721FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.h */, + CEFBFB5821FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.h */, + CEFBFB5921FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m */, + ); + path = NSManagedObject; + sourceTree = ""; + }; + CEFBFB5A21FB929A00E1ECB2 /* NSManagedObjectContext */ = { + isa = PBXGroup; + children = ( + CEFBFB5B21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m */, + CEFBFB5C21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.h */, + CEFBFB5D21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.h */, + CEFBFB5E21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m */, + CEFBFB5F21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.h */, + CEFBFB6021FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m */, + ); + path = NSManagedObjectContext; + sourceTree = ""; + }; + CEFBFB6521FB929A00E1ECB2 /* NSPersistentStoreCoordinator */ = { + isa = PBXGroup; + children = ( + CEFBFB6621FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m */, + CEFBFB6721FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.h */, + ); + path = NSPersistentStoreCoordinator; + sourceTree = ""; + }; + CEFBFB6821FB929A00E1ECB2 /* QMCDRecordStack */ = { + isa = PBXGroup; + children = ( + CEFBFB6921FB929A00E1ECB2 /* QMCDRecordStack.h */, + CEFBFB6A21FB929A00E1ECB2 /* QMCDRecordStack.m */, + ); + path = QMCDRecordStack; + sourceTree = ""; + }; + CEFBFB6C21FB929A00E1ECB2 /* QMChatService */ = { + isa = PBXGroup; + children = ( + CEFBFB6D21FB929A00E1ECB2 /* QMChatTypes.h */, + CEFBFB6E21FB929A00E1ECB2 /* QMChatService.h */, + CEFBFB6F21FB929A00E1ECB2 /* QMDialogsMemoryStorage */, + CEFBFB7221FB929A00E1ECB2 /* QMChatConstants.h */, + CEFBFB7321FB929A00E1ECB2 /* Bolts */, + CEFBFB7521FB929A00E1ECB2 /* QMAttachmentService */, + CEFBFB9021FB929A00E1ECB2 /* QMChatService.m */, + CEFBFB9121FB929A00E1ECB2 /* Categories */, + CEFBFB9A21FB929A00E1ECB2 /* QMMessagesMemoryStorage */, + CEFBFB9D21FB929A00E1ECB2 /* QMMediaBlocks.h */, + ); + path = QMChatService; + sourceTree = ""; + }; + CEFBFB6F21FB929A00E1ECB2 /* QMDialogsMemoryStorage */ = { + isa = PBXGroup; + children = ( + CEFBFB7021FB929A00E1ECB2 /* QMDialogsMemoryStorage.m */, + CEFBFB7121FB929A00E1ECB2 /* QMDialogsMemoryStorage.h */, + ); + path = QMDialogsMemoryStorage; + sourceTree = ""; + }; + CEFBFB7321FB929A00E1ECB2 /* Bolts */ = { + isa = PBXGroup; + children = ( + CEFBFB7421FB929A00E1ECB2 /* QMChatService+Bolts.m */, + ); + path = Bolts; + sourceTree = ""; + }; + CEFBFB7521FB929A00E1ECB2 /* QMAttachmentService */ = { + isa = PBXGroup; + children = ( + CEFBFB7621FB929A00E1ECB2 /* QMAttachmentsMemoryStorage */, + CEFBFB7921FB929A00E1ECB2 /* QMChatAttachmentService.m */, + CEFBFB7A21FB929A00E1ECB2 /* QMAttachmentStoreService */, + CEFBFB7E21FB929A00E1ECB2 /* QMTimeOut */, + CEFBFB8121FB929A00E1ECB2 /* QMAttachmentAssetService */, + CEFBFB8621FB929A00E1ECB2 /* QMChatAttachmentService.h */, + CEFBFB8721FB929A00E1ECB2 /* QMAttachmentContentService */, + ); + path = QMAttachmentService; + sourceTree = ""; + }; + CEFBFB7621FB929A00E1ECB2 /* QMAttachmentsMemoryStorage */ = { + isa = PBXGroup; + children = ( + CEFBFB7721FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m */, + CEFBFB7821FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.h */, + ); + path = QMAttachmentsMemoryStorage; + sourceTree = ""; + }; + CEFBFB7A21FB929A00E1ECB2 /* QMAttachmentStoreService */ = { + isa = PBXGroup; + children = ( + CEFBFB7B21FB929A00E1ECB2 /* QMAttachmentStoreService.m */, + CEFBFB7C21FB929A00E1ECB2 /* QMAttachmentStoreService.h */, + CEFBFB7D21FB929A00E1ECB2 /* QMAttachmentStoreServiceDelegate.h */, + ); + path = QMAttachmentStoreService; + sourceTree = ""; + }; + CEFBFB7E21FB929A00E1ECB2 /* QMTimeOut */ = { + isa = PBXGroup; + children = ( + CEFBFB7F21FB929A00E1ECB2 /* QMTimeOut.h */, + CEFBFB8021FB929A00E1ECB2 /* QMTimeOut.m */, + ); + path = QMTimeOut; + sourceTree = ""; + }; + CEFBFB8121FB929A00E1ECB2 /* QMAttachmentAssetService */ = { + isa = PBXGroup; + children = ( + CEFBFB8221FB929A00E1ECB2 /* QMAssetLoader.h */, + CEFBFB8321FB929A00E1ECB2 /* QMAttachmentAssetService.h */, + CEFBFB8421FB929A00E1ECB2 /* QMAssetLoader.m */, + CEFBFB8521FB929A00E1ECB2 /* QMAttachmentAssetService.m */, + ); + path = QMAttachmentAssetService; + sourceTree = ""; + }; + CEFBFB8721FB929A00E1ECB2 /* QMAttachmentContentService */ = { + isa = PBXGroup; + children = ( + CEFBFB8821FB929A00E1ECB2 /* QMMediaUploadService */, + CEFBFB8B21FB929A00E1ECB2 /* QMMediaDownloadSevice */, + CEFBFB8E21FB929A00E1ECB2 /* QMAttachmentContentService.m */, + CEFBFB8F21FB929A00E1ECB2 /* QMAttachmentContentService.h */, + ); + path = QMAttachmentContentService; + sourceTree = ""; + }; + CEFBFB8821FB929A00E1ECB2 /* QMMediaUploadService */ = { + isa = PBXGroup; + children = ( + CEFBFB8921FB929A00E1ECB2 /* QMMediaUploadService.h */, + CEFBFB8A21FB929A00E1ECB2 /* QMMediaUploadService.m */, + ); + path = QMMediaUploadService; + sourceTree = ""; + }; + CEFBFB8B21FB929A00E1ECB2 /* QMMediaDownloadSevice */ = { + isa = PBXGroup; + children = ( + CEFBFB8C21FB929A00E1ECB2 /* QMMediaDownloadService.h */, + CEFBFB8D21FB929A00E1ECB2 /* QMMediaDownloadService.m */, + ); + path = QMMediaDownloadSevice; + sourceTree = ""; + }; + CEFBFB9121FB929A00E1ECB2 /* Categories */ = { + isa = PBXGroup; + children = ( + CEFBFB9221FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m */, + CEFBFB9321FB929A00E1ECB2 /* QBChatAttachment+QMFactory.h */, + CEFBFB9421FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.h */, + CEFBFB9521FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m */, + CEFBFB9621FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.h */, + CEFBFB9721FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m */, + CEFBFB9821FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m */, + CEFBFB9921FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.h */, + ); + path = Categories; + sourceTree = ""; + }; + CEFBFB9A21FB929A00E1ECB2 /* QMMessagesMemoryStorage */ = { + isa = PBXGroup; + children = ( + CEFBFB9B21FB929A00E1ECB2 /* QMMessagesMemoryStorage.h */, + CEFBFB9C21FB929A00E1ECB2 /* QMMessagesMemoryStorage.m */, + ); + path = QMMessagesMemoryStorage; + sourceTree = ""; + }; + E002F3EE1F508CE20044B0B3 /* NSString */ = { + isa = PBXGroup; + children = ( + E002F3EF1F508CF90044B0B3 /* NSString+QMValidation.h */, + E002F3F01F508CF90044B0B3 /* NSString+QMValidation.m */, + ); + path = NSString; + sourceTree = ""; + }; + E026A76B1E82B98C0054AD83 /* UIScreen */ = { + isa = PBXGroup; + children = ( + E026A76C1E82B9A10054AD83 /* UIScreen+QMLock.h */, + E026A76D1E82B9A10054AD83 /* UIScreen+QMLock.m */, + ); + path = UIScreen; + sourceTree = ""; + }; + E03AD8EB1F556D6100F411CE /* QMExpandableTableViewController */ = { + isa = PBXGroup; + children = ( + E03AD8EC1F556D7500F411CE /* QMExpandableTableViewController.h */, + E03AD8ED1F556D7500F411CE /* QMExpandableTableViewController.m */, + ); + path = QMExpandableTableViewController; + sourceTree = ""; + }; + E03AD8EF1F55703300F411CE /* QMValidationCell */ = { + isa = PBXGroup; + children = ( + E03AD8F01F55703300F411CE /* QMValidationCell.h */, + E03AD8F11F55703300F411CE /* QMValidationCell.m */, + E03AD8F21F55703300F411CE /* QMValidationCell.xib */, + ); + path = QMValidationCell; + sourceTree = ""; + }; + E03F3D321E1C71E100A46884 /* Common */ = { + isa = PBXGroup; + children = ( + E03F3D331E1C724E00A46884 /* NSString+QMTransliterating.h */, + E03F3D341E1C724E00A46884 /* NSString+QMTransliterating.m */, + E08441D71E1E611D00B87D0F /* NSString+QMSiriUtils.h */, + E08441D81E1E611D00B87D0F /* NSString+QMSiriUtils.m */, + ); + path = Common; + sourceTree = ""; + }; + E0425AB51FC37AF200CD8A58 /* UIAlertViewController */ = { + isa = PBXGroup; + children = ( + E0425AB61FC37B1800CD8A58 /* UIAlertController+QM.h */, + E0425AB71FC37B1800CD8A58 /* UIAlertController+QM.m */, + ); + path = UIAlertViewController; + sourceTree = ""; + }; + E069B0141FC6FFF5005F9AB1 /* QMTasks */ = { + isa = PBXGroup; + children = ( + E069B0151FC6FFF5005F9AB1 /* QMTasks.h */, + E069B0161FC6FFF5005F9AB1 /* QMTasks.m */, + ); + path = QMTasks; + sourceTree = ""; + }; + E077739D1FB5CD24006B63FA /* QMShareHelper */ = { + isa = PBXGroup; + children = ( + E077739E1FB5CD43006B63FA /* QMShareHelper.h */, + E077739F1FB5CD43006B63FA /* QMShareHelper.m */, + ); + path = QMShareHelper; + sourceTree = ""; + }; + E08ADF5B1F8CCD550099CF99 /* QMDataSource */ = { + isa = PBXGroup; + children = ( + E08ADF5C1F8CCD6D0099CF99 /* QMDataSource.h */, + E08ADF5D1F8CCD6D0099CF99 /* QMDataSource.m */, + ); + path = QMDataSource; + sourceTree = ""; + }; + E08D52121E5AABE200918B5B /* QMMediaController */ = { + isa = PBXGroup; + children = ( + E048781F1E8006C60008F497 /* QMAudioRecorder.m */, + E04878201E8006C60008F497 /* QMAudioRecorder.h */, + E09FCA651E60A9270013E3EB /* QMAudioPlayer.h */, + E09FCA661E60A9270013E3EB /* QMAudioPlayer.m */, + E08D52131E5AABF700918B5B /* QMMediaController.h */, + E08D52141E5AABF700918B5B /* QMMediaController.m */, + E043459A1F29545F0066851D /* QMAttachmentController.h */, + E043459B1F29545F0066851D /* QMAttachmentController.m */, + ); + path = QMMediaController; + sourceTree = ""; + }; + E0921D911F6FEE11005961CF /* QMImageBarButtonItem */ = { + isa = PBXGroup; + children = ( + E0921D921F6FEE11005961CF /* QMImageBarButtonItem.h */, + E0921D931F6FEE11005961CF /* QMImageBarButtonItem.m */, + ); + path = QMImageBarButtonItem; + sourceTree = ""; + }; + E0A8A7B11F8F810E00382443 /* QMExtensionCache */ = { + isa = PBXGroup; + children = ( + E0A8A7B21F8F814300382443 /* QMExtensionCache.h */, + E0A8A7B71F8F818800382443 /* QMExtensionCache.m */, + ); + name = QMExtensionCache; + path = Common/QMExtensionCache; + sourceTree = ""; + }; + E0A996581FC84042008AFFBE /* ThirdPartyLibraries */ = { + isa = PBXGroup; + children = ( + E0A996591FC84042008AFFBE /* MPGNotification */, + ); + path = ThirdPartyLibraries; + sourceTree = ""; + }; + E0A996591FC84042008AFFBE /* MPGNotification */ = { + isa = PBXGroup; + children = ( + FBE42BCA1FF6807C00F139E9 /* MPGNotification.h */, + FBE42BCB1FF6807D00F139E9 /* MPGNotification.m */, + ); + path = MPGNotification; + sourceTree = ""; + }; + E0B5CEDA1F97865D004CB06D /* QMActivityItem */ = { + isa = PBXGroup; + children = ( + E0B5CEDB1F978688004CB06D /* QMActivityItem.h */, + E0B5CEDC1F978688004CB06D /* QMActivityItem.m */, + ); + name = QMActivityItem; + path = Common/QMActivityItem; + sourceTree = ""; + }; + E0D9ED131F9E384E00EF6043 /* QBSettings */ = { + isa = PBXGroup; + children = ( + E03AF8111FACDE5E00DFEE7A /* QBSettings+Qmunicate.h */, + E03AF8121FACDE5E00DFEE7A /* QBSettings+Qmunicate.m */, + ); + path = QBSettings; + sourceTree = ""; + }; + E3A99BCC1FD00C7800D0907B /* QMCallKitAdapter */ = { + isa = PBXGroup; + children = ( + E3A99BCD1FD00C8F00D0907B /* QMCallKitAdapter.h */, + E3A99BCE1FD00C8F00D0907B /* QMCallKitAdapter.m */, + ); + path = QMCallKitAdapter; + sourceTree = ""; + }; + E3D2EE9D1EF42D7C002DC44E /* QMNavigationController */ = { + isa = PBXGroup; + children = ( + E3D2EEA91EF7F6A2002DC44E /* QMNavigationController.h */, + E3D2EEAA1EF7F6A2002DC44E /* QMNavigationController.m */, + ); + name = QMNavigationController; + sourceTree = ""; + }; + E3D2EEA11EF7C675002DC44E /* QMTableViewController */ = { + isa = PBXGroup; + children = ( + E3D2EEA21EF7C693002DC44E /* QMTableViewController.h */, + E3D2EEA31EF7C693002DC44E /* QMTableViewController.m */, + ); + name = QMTableViewController; + sourceTree = ""; + }; + E3D2EEA51EF7E707002DC44E /* QMViewController */ = { + isa = PBXGroup; + children = ( + E3D2EEA61EF7E71C002DC44E /* QMViewController.h */, + E3D2EEA71EF7E71C002DC44E /* QMViewController.m */, + ); + name = QMViewController; + sourceTree = ""; + }; + EC0070C2176873443C60030E /* Pods */ = { + isa = PBXGroup; + children = ( + A882BC1317494F7309B1EF9C /* Pods-Q-municate.debug.xcconfig */, + C64575C942EA97E9F5225A33 /* Pods-Q-municate.release.xcconfig */, + CAF70B5C04A0C1D0C4EB5E2E /* Pods-QMShareExtension.debug.xcconfig */, + 3CB1BC82EABEC4527C5698BE /* Pods-QMShareExtension.release.xcconfig */, + DF5DEED5E5E7BE521787B524 /* Pods-QMSiriExtension.debug.xcconfig */, + EFB338E65DEED3B4B5896E6E /* Pods-QMSiriExtension.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 69D57E5118ACC11C00A9900A /* Q-municate */ = { + isa = PBXNativeTarget; + buildConfigurationList = 69D57E7E18ACC11C00A9900A /* Build configuration list for PBXNativeTarget "Q-municate" */; + buildPhases = ( + 1C6FF08B1B6E143A1E4DBB7A /* [CP] Check Pods Manifest.lock */, + 69D57E4E18ACC11C00A9900A /* Sources */, + 69D57E4F18ACC11C00A9900A /* Frameworks */, + 69D57E5018ACC11C00A9900A /* Resources */, + E03871F31DDB36F800554EB9 /* Embed App Extensions */, + CE7F5BE0232B951B004DEE15 /* ShellScript */, + CE7F5BE1232B951E004DEE15 /* ShellScript */, + 4E3E19C64F417377EF66C43F /* [CP] Embed Pods Frameworks */, + C84B7A20D5EB1176FAF68208 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + E07BC2261DDF5FD900B8D3B0 /* PBXTargetDependency */, + E0CA1F521F84F78A00E9B293 /* PBXTargetDependency */, + ); + name = "Q-municate"; + productName = "Q-municate"; + productReference = 69D57E5218ACC11C00A9900A /* Q-municate.app */; + productType = "com.apple.product-type.application"; + }; + E07BC21E1DDF5FD900B8D3B0 /* QMSiriExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = E07BC2281DDF5FD900B8D3B0 /* Build configuration list for PBXNativeTarget "QMSiriExtension" */; + buildPhases = ( + F4CAEB6649E720206F80C504 /* [CP] Check Pods Manifest.lock */, + E07BC21B1DDF5FD900B8D3B0 /* Sources */, + E07BC21C1DDF5FD900B8D3B0 /* Frameworks */, + E07BC21D1DDF5FD900B8D3B0 /* Resources */, + CE5DA6B4232A56D50057C865 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = QMSiriExtension; + productName = QMSiriExtension; + productReference = E07BC21F1DDF5FD900B8D3B0 /* QMSiriExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; + E0CA1F471F84F78A00E9B293 /* QMShareExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = E0CA1F561F84F78A00E9B293 /* Build configuration list for PBXNativeTarget "QMShareExtension" */; + buildPhases = ( + 2F08686F139B10746D380897 /* [CP] Check Pods Manifest.lock */, + E0CA1F441F84F78A00E9B293 /* Sources */, + E0CA1F451F84F78A00E9B293 /* Frameworks */, + E0CA1F461F84F78A00E9B293 /* Resources */, + CE5DA6B7232A56EB0057C865 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = QMShareExtension; + productName = QMShareExtension; + productReference = E0CA1F481F84F78A00E9B293 /* QMShareExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 69D57E4A18ACC11C00A9900A /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = QM; + LastUpgradeCheck = 1030; + ORGANIZATIONNAME = Quickblox; TargetAttributes = { 69D57E5118ACC11C00A9900A = { DevelopmentTeam = 8885H5G2YX; - ProvisioningStyle = Manual; + ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { enabled = 1; @@ -2723,8 +4306,11 @@ E07BC21E1DDF5FD900B8D3B0 = { CreatedOnToolsVersion = 8.1; DevelopmentTeam = 8885H5G2YX; - ProvisioningStyle = Manual; + ProvisioningStyle = Automatic; SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; com.apple.Keychain = { enabled = 1; }; @@ -2733,7 +4319,7 @@ E0CA1F471F84F78A00E9B293 = { CreatedOnToolsVersion = 9.0; DevelopmentTeam = 8885H5G2YX; - ProvisioningStyle = Manual; + ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { enabled = 1; @@ -2750,6 +4336,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, Base, ); @@ -2770,37 +4357,58 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - E39BEBBA1F6BF04000F7D50F /* GoogleService-Info.plist in Resources */, + CE5563AA21FBBC970051EC2D /* Image.xcassets in Resources */, + CE57CD2721FA002E0026A23F /* QMImageIncomingCell.xib in Resources */, + CE57CD4021FA002E0026A23F /* QMAudioRecordView.xib in Resources */, 5868B06D1CE9C6ED004F9233 /* QMCallInfoView.xib in Resources */, + CE57CD2421FA002E0026A23F /* QMVideoIncomingCell.xib in Resources */, 5868B07A1CE9E61E004F9233 /* QMNoContactsCell.xib in Resources */, 55A8B06F1965986A00B5D33B /* busy.wav in Resources */, - E01A5DE61F93F37600A85EC8 /* QMShareCollectionViewCell.xib in Resources */, - E01A5DD91F93F1FB00A85EC8 /* ShareInterface.storyboard in Resources */, + CE57CD1C21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.xib in Resources */, 584277C71C3D46D000CDE35B /* Settings.storyboard in Resources */, 584277BB1C3D404A00CDE35B /* Start.storyboard in Resources */, + CE5563BA21FBBC970051EC2D /* QMShareCollectionViewCell.xib in Resources */, + CE5563B221FBBC970051EC2D /* ShareInterface.storyboard in Resources */, 55A8B0701965986A00B5D33B /* calling.wav in Resources */, + CE57CD1B21FA002E0026A23F /* QMChatOutgoingLinkPreviewCell.xib in Resources */, + CE57CD3021FA002E0026A23F /* QMChatAttachmentIncomingCell.xib in Resources */, 55A8B0731965986A00B5D33B /* ringtone.wav in Resources */, E0B6A3361E2A615E001125FC /* AppIntentVocabulary.plist in Resources */, + CE57CD0E21FA002E0026A23F /* Media.xcassets in Resources */, + CE57CD3C21FA002E0026A23F /* QMToolbarContentView.xib in Resources */, + CE57CD1F21FA002E0026A23F /* QMImageOutgoingCell.xib in Resources */, 58D847721C85BBAB000C40BA /* QMSearchCell.xib in Resources */, 58D847641C85A02B000C40BA /* QMDialogCell.xib in Resources */, - E01A5DDF1F93F21700A85EC8 /* QMShareContactsTableViewCell.xib in Resources */, + CE57CD3521FA002E0026A23F /* QMChatLocationOutgoingCell.xib in Resources */, + CE57CD2E21FA002E0026A23F /* QMChatLocationIncomingCell.xib in Resources */, 55A8B0741965986A00B5D33B /* sent.wav in Resources */, + CE5563AC21FBBC970051EC2D /* QMShareTableViewController.xib in Resources */, + CE57CD2B21FA002E0026A23F /* QMVideoOutgoingCell.xib in Resources */, + CE5563C021FBBC970051EC2D /* QMShareTableViewCell.xib in Resources */, 584277C31C3D44AB00CDE35B /* Chat.storyboard in Resources */, 58B550751CC7BFBA00C93F93 /* QMSelectableContactCell.xib in Resources */, 584277B41C3D374400CDE35B /* Auth.storyboard in Resources */, - E0A9966A1FC84043008AFFBE /* SVProgressHUD.bundle in Resources */, + CE57CD1321FA002E0026A23F /* QMChatAttachmentOutgoingCell.xib in Resources */, + CE57CD2921FA002E0026A23F /* QMAudioOutgoingCell.xib in Resources */, + CEBFEE8021F7731C00FED85A /* GoogleService-Info.plist in Resources */, E03AD8F41F55703400F411CE /* QMValidationCell.xib in Resources */, 55A8B0711965986A00B5D33B /* end_of_call.wav in Resources */, + CE57CD3621FA002E0026A23F /* QMChatNotificationCell.xib in Resources */, 5877D6C61C466B2D00938E5D /* Launch Screen.storyboard in Resources */, + CE57CD2121FA002E0026A23F /* QMAudioIncomingCell.xib in Resources */, 69D57E6818ACC11C00A9900A /* Images.xcassets in Resources */, + CE5563C221FBBC970051EC2D /* QMShareContactsTableViewCell.xib in Resources */, + CE57CD0921FA002E0026A23F /* QMChatViewController.xib in Resources */, + CE57CD3321FA002E0026A23F /* QMChatOutgoingCell.xib in Resources */, + CE57CD1721FA002E0026A23F /* QMChatContactRequestCell.xib in Resources */, 55286996199131B5006F92CB /* Localizable.strings in Resources */, 589D4CFF1C981D74005F1E76 /* QMContactCell.xib in Resources */, 58D847951C89AA39000C40BA /* QMNoResultsCell.xib in Resources */, 55A8B0721965986A00B5D33B /* received.wav in Resources */, - E01A5DDB1F93F20800A85EC8 /* QMShareTableViewCell.xib in Resources */, + CE57CD1421FA002E0026A23F /* QMChatIncomingCell.xib in Resources */, + CE57CD3821FA002E0026A23F /* QMHeaderCollectionReusableView.xib in Resources */, 584277B91C3D401C00CDE35B /* Main.storyboard in Resources */, 5868B06E1CE9C6ED004F9233 /* QMVideoCallInfoView.xib in Resources */, - E07CB8AB1FAD31320027087E /* QMShareTableViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2815,222 +4423,193 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - E0A8A7A41F8F7B0300382443 /* QMShareCollectionViewCell.xib in Resources */, E069B0191FC73130005F9AB1 /* Images.xcassets in Resources */, - E0AA0E6B1F90E38C0082750E /* QMShareContactsTableViewCell.xib in Resources */, - E0A8A7A61F8F7B0300382443 /* QMShareTableViewCell.xib in Resources */, + CE5563BB21FBBC970051EC2D /* QMShareCollectionViewCell.xib in Resources */, + CE5563AB21FBBC970051EC2D /* Image.xcassets in Resources */, E05DEA1B1FB1F6FE00D36C6E /* Localizable.strings in Resources */, + CE5563C321FBBC970051EC2D /* QMShareContactsTableViewCell.xib in Resources */, E04D268F1F8E440C005CB2FD /* QMNoResultsCell.xib in Resources */, - E0CA1F4F1F84F78A00E9B293 /* ShareInterface.storyboard in Resources */, - E07CB8AC1FAD31320027087E /* QMShareTableViewController.xib in Resources */, + CE5563C121FBBC970051EC2D /* QMShareTableViewCell.xib in Resources */, + CE5563B321FBBC970051EC2D /* ShareInterface.storyboard in Resources */, + CE5563AD21FBBC970051EC2D /* QMShareTableViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 05A9BCF94B2CDA2708BECF61 /* [CP] Check Pods Manifest.lock */ = { + 1C6FF08B1B6E143A1E4DBB7A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( "${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-QMShareExtension-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Q-municate-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 5803F2BA1D4F568800AE4934 /* ShellScript */ = { + 2F08686F139B10746D380897 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "bash \"${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Quickblox.framework/strip-framework.sh\""; - }; - 584B79C41C452A7A00356FB9 /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( + inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-QMShareExtension-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "${PODS_ROOT}/Fabric/run 7aea78439bec41a9005c7488bb6751c5e33fe270 343e58f13448a59778de3a8f630a0bd4a03803d1ae397818fbe2e76c66d09398"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - A3EB8C6F63D28CDDF9DD7F5E /* [CP] Embed Pods Frameworks */ = { + 4E3E19C64F417377EF66C43F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-frameworks.sh", + "${PODS_ROOT}/Target Support Files/Pods-Q-municate/Pods-Q-municate-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/FBSDKCoreKit/FBSDKCoreKit.framework", + "${BUILT_PRODUCTS_DIR}/FBSDKLoginKit/FBSDKLoginKit.framework", + "${BUILT_PRODUCTS_DIR}/FFCircularProgressView/FFCircularProgressView.framework", + "${BUILT_PRODUCTS_DIR}/FLAnimatedImage/FLAnimatedImage.framework", + "${BUILT_PRODUCTS_DIR}/Flurry-iOS-SDK/Flurry_iOS_SDK.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/NYTPhotoViewer/NYTPhotoViewer.framework", "${PODS_ROOT}/QuickBlox/Quickblox.framework", + "${PODS_ROOT}/Quickblox-WebRTC/QuickbloxWebRTC.framework", + "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", + "${BUILT_PRODUCTS_DIR}/SAMKeychain/SAMKeychain.framework", + "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", + "${BUILT_PRODUCTS_DIR}/TTTAttributedLabel/TTTAttributedLabel.framework", + "${BUILT_PRODUCTS_DIR}/UIDevice-Hardware/UIDevice_Hardware.framework", + "${BUILT_PRODUCTS_DIR}/libextobjc/libextobjc.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${BUILT_PRODUCTS_DIR}/Bolts/Bolts.framework", + "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKCoreKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBSDKLoginKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FFCircularProgressView.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FLAnimatedImage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flurry_iOS_SDK.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NYTPhotoViewer.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Quickblox.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/QuickbloxWebRTC.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SAMKeychain.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TTTAttributedLabel.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/UIDevice_Hardware.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libextobjc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Bolts.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Q-municate/Pods-Q-municate-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - CFF0567CBCC50E2F953F149B /* [CP] Copy Pods Resources */ = { + C84B7A20D5EB1176FAF68208 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-resources.sh", - "${PODS_ROOT}/FBSDKCoreKit/FacebookSDKStrings.bundle", + "${PODS_ROOT}/Target Support Files/Pods-Q-municate/Pods-Q-municate-resources.sh", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseUI/FirebaseAuthUI.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseUI/FirebasePhoneAuthUI.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/NYTPhotoViewer/NYTPhotoViewer.bundle", - "${PODS_ROOT}/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets", - "${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment/QMChatViewController.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMChatCacheModel.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMContactListCacheModel.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMUsersCacheModel.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMOpenGraphCacheModel.bundle", - "${PODS_ROOT}/SAMKeychain/Support/SAMKeychain.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FacebookSDKStrings.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseAuthUI.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebasePhoneAuthUI.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/NYTPhotoViewer.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Media.xcassets", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMChatViewController.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMChatCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMContactListCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMUsersCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMOpenGraphCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SAMKeychain.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Q-municate/Pods-Q-municate-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Q-municate/Pods-Q-municate-resources.sh\"\n"; showEnvVarsInLog = 0; }; - E37EE59C1F2790BE00B1E538 /* ShellScript */ = { + CE7F5BE0232B951B004DEE15 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( ); + outputFileListPaths = ( + ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "bash \"${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/QuickbloxWebRTC.framework/strip-framework.sh\""; + shellScript = "bash \"${PODS_ROOT}/Quickblox-WebRTC/QuickbloxWebRTC.framework/strip-framework.sh\"\n"; }; - E38D9249A28F87BADEA652EE /* [CP] Check Pods Manifest.lock */ = { + CE7F5BE1232B951E004DEE15 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-QMSiriExtension-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "bash \"${PODS_ROOT}/Quickblox/Quickblox.framework/strip-framework.sh\"\n"; }; - E6936DF91158CD5FF2D1E6C5 /* [CP] Check Pods Manifest.lock */ = { + F4CAEB6649E720206F80C504 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( "${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Q-municate-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - E911BC553233DD014AE11AC7 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMChatCacheModel.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMContactListCacheModel.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMUsersCacheModel.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMOpenGraphCacheModel.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMChatCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMContactListCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMUsersCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMOpenGraphCacheModel.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-QMSiriExtension/Pods-QMSiriExtension-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - F94AD707CEDF6BCDE4AAF85B /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( + outputFileListPaths = ( ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-resources.sh", - "${PODS_ROOT}/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets", - "${PODS_CONFIGURATION_BUILD_DIR}/QMCVDevelopment/QMChatViewController.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMChatCacheModel.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMContactListCacheModel.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMUsersCacheModel.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/QMServicesDevelopment/QMOpenGraphCacheModel.bundle", - "${PODS_ROOT}/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle", - ); - name = "[CP] Copy Pods Resources"; outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Media.xcassets", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMChatViewController.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMChatCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMContactListCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMUsersCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QMOpenGraphCacheModel.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SVProgressHUD.bundle", + "$(DERIVED_FILE_DIR)/Pods-QMSiriExtension-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-QMShareExtension/Pods-QMShareExtension-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -3041,155 +4620,274 @@ buildActionMask = 2147483647; files = ( 58F86EDB1CA2EF6C00DA4758 /* QMUserInfoViewController.m in Sources */, + CE57CD1821FA002E0026A23F /* QMChatCell.m in Sources */, + CEFBFBA421FB929A00E1ECB2 /* CDOpenGraphModel.m in Sources */, + CEFBFBEC21FB929A00E1ECB2 /* QMUsersCache.m in Sources */, E03AD8F31F55703400F411CE /* QMValidationCell.m in Sources */, 58D8478C1C873F58000C40BA /* QMSearchDataSource.m in Sources */, 580FEBEA1CC4EF8E000AED72 /* QMNotification.m in Sources */, + CEFBFBF221FB929A00E1ECB2 /* QMServices.m in Sources */, + CEFBFBF521FB929A00E1ECB2 /* QMAuthService.m in Sources */, 5838FD531D378EB900DB97BB /* QMCallNotificationItem.m in Sources */, + CE57CD1A21FA002E0026A23F /* QMChatOutgoingLinkPreviewCell.m in Sources */, + CE57CD1021FA002E0026A23F /* NSDate+ChatDataSource.m in Sources */, + CE5563C421FBBC970051EC2D /* QMShareContactsTableViewCell.m in Sources */, 697E2D4C196EA82400CD2BDE /* QMLicenseAgreementViewController.m in Sources */, + CEFBFC2B21FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m in Sources */, + CEFBFBC821FB929A00E1ECB2 /* _QMCDAttachment.m in Sources */, 58FA416B1C96E19400E61586 /* QMOnlineTitleView.m in Sources */, - E0A9966B1FC84043008AFFBE /* SVProgressHUD.m in Sources */, 58B3C9CD1CB52C4600B08A27 /* QMShadowView.m in Sources */, + CEFBFC5B21FB929A00E1ECB2 /* QMAssetLoader.m in Sources */, 588CF1061CA6C01200B23C00 /* QMNotificationPanelView.m in Sources */, 58F1434B1D366E2B001AB123 /* QBChatMessage+QMCallNotifications.m in Sources */, 58E398B01CAE943F0053BA4D /* QMNavigationBar.m in Sources */, E3D2EEA81EF7E71C002DC44E /* QMViewController.m in Sources */, 584A6DD61C9E222A00B7D641 /* QMNewMessageContactListSearchDataSource.m in Sources */, 5868B0671CE9C6DC004F9233 /* QMLocalVideoView.m in Sources */, + CEFBFBEF21FB929A00E1ECB2 /* QMSLog.m in Sources */, + CEFBFBE021FB929A00E1ECB2 /* QMAsynchronousOperation.m in Sources */, 5868B0711CE9C6FC004F9233 /* QMCallToolbar.m in Sources */, 5889AAE61C43CEB400997A40 /* QMLogInViewController.m in Sources */, 58A639291CEB5C7200D682C4 /* QMSearchResultsController.m in Sources */, + CEFBFBC221FB929A00E1ECB2 /* QMCDAttachment.m in Sources */, + CE57CD4D21FA002E0026A23F /* UIImage+QM.m in Sources */, + CE57CD4421FA002E0026A23F /* QMCollectionViewFlowLayoutInvalidationContext.m in Sources */, + CEFBFBA721FB929A00E1ECB2 /* _CDOpenGraphModel.m in Sources */, 589792BD1C9C3DEE00CC6438 /* QMSelectableContactCell.m in Sources */, 580D34E21BC027BD0034813A /* QMSplashViewController.m in Sources */, + CE57CD2D21FA002E0026A23F /* QMChatLocationIncomingCell.m in Sources */, + CEFBFBE621FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld in Sources */, + CE5563B621FBBC970051EC2D /* QMAttachmentProvider.m in Sources */, + CE57CD2321FA002E0026A23F /* QMMediaOutgoingCell.m in Sources */, + CEFBFC7921FB929A00E1ECB2 /* QMMessagesMemoryStorage.m in Sources */, 589792B51C9C3C1F00CC6438 /* QMMessageContactListViewController.m in Sources */, E03AD8EE1F556D7500F411CE /* QMExpandableTableViewController.m in Sources */, + CE57CD4321FA002E0026A23F /* QMChatCellLayoutAttributes.m in Sources */, 55A8B06E1965986A00B5D33B /* QMSoundManager.m in Sources */, 58EC00221CF30C380052A06A /* QMGroupNameViewController.m in Sources */, + CEFBFC4C21FB929A00E1ECB2 /* QMChatService+Bolts.m in Sources */, + CEFBFBCE21FB929A00E1ECB2 /* _QMCDDialog.m in Sources */, E07773A01FB5CD43006B63FA /* QMShareHelper.m in Sources */, + CE57CD4921FA002E0026A23F /* UIColor+QM.m in Sources */, 5868B05E1CE9C668004F9233 /* QMCallManager.m in Sources */, + CEFBFBDA21FB929A00E1ECB2 /* QMContactListService.m in Sources */, 589D4CF51C9816E9005F1E76 /* QMNewMessageViewController.m in Sources */, 584277A41C3D336300CDE35B /* QMCornerButton.m in Sources */, + CEFBFC5821FB929A00E1ECB2 /* QMTimeOut.m in Sources */, 58FD668E1CEF12D500B72425 /* QMAlert.m in Sources */, E08441D91E1E611D00B87D0F /* NSString+QMSiriUtils.m in Sources */, 5877D6E31C4675B900938E5D /* QMBadgeView.m in Sources */, + CE5563A821FBBC970051EC2D /* QMShareDataSource.m in Sources */, 58D952301CEE078F001C43F7 /* QMImages.m in Sources */, + CE57CD4A21FA002E0026A23F /* UIImage+Cropper.m in Sources */, + CE8ED2A221FBBFB2002FC461 /* QMShareTableViewController.m in Sources */, + CE57CD4C21FA002E0026A23F /* UIView+QM.m in Sources */, 584277E01C3FED0E00CDE35B /* QMContent.m in Sources */, 585C82671D75D2CA0010C71E /* QMImagePreview.m in Sources */, 58B3C9C41CB3FBBE00B08A27 /* QMLeaveChatCell.m in Sources */, - E0A996691FC84043008AFFBE /* SVProgressAnimatedView.m in Sources */, 580590FD1CA548130055BC2F /* QMContactManager.m in Sources */, 5868B0781CE9E59E004F9233 /* QMContactsViewController.m in Sources */, - E01A5DE31F93F23000A85EC8 /* QBUUser+QMShareItemProtocol.m in Sources */, + CE57CD1121FA002E0026A23F /* QMChatDataSource.m in Sources */, + CE57CD1521FA002E0026A23F /* QMChatIncomingCell.m in Sources */, 589D4CF11C98158E005F1E76 /* QMRootViewControllerSegue.m in Sources */, - E01A5DDE1F93F21400A85EC8 /* QMShareContactsTableViewCell.m in Sources */, + CEFBFC7621FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m in Sources */, 584277D11C3FBD1600CDE35B /* QMProfile.m in Sources */, 5808F1C21CFC585100F1A210 /* QMSettingsFooterView.m in Sources */, + CE57CD3E21FA002E0026A23F /* QMProgressView.m in Sources */, + CE57CD3121FA002E0026A23F /* QMBaseChatLocationCell.m in Sources */, + CE57CD1921FA002E0026A23F /* QMChatBaseLinkPreviewCell.m in Sources */, 55BBA75C19730B960040DB5C /* REMessageUI.m in Sources */, 585037591CFEE99900374A3C /* QMUserInfoCell.m in Sources */, + CEFBFBB021FB929A00E1ECB2 /* QMOpenGraphService.m in Sources */, 58BB52631CDA3EA300869FA9 /* QMSettingsViewController.m in Sources */, + CEFBFBBC21FB929A00E1ECB2 /* QMChatServiceModel.xcdatamodeld in Sources */, + CEFBFC1F21FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m in Sources */, 583E1D471D2BC505008111DB /* QMLocationPinView.m in Sources */, 58B550731CC79C8500C93F93 /* QMGroupAddUsersViewController.m in Sources */, - E01A5DE51F93F23C00A85EC8 /* QMExtensionCache+QMShareExtension.m in Sources */, 584A6DC91C9DEBC200B7D641 /* QMTextField.m in Sources */, 58C261F41CDC926000AA9CF2 /* QMUpdateUserViewController.m in Sources */, 69D57E6618ACC11C00A9900A /* QMAppDelegate.m in Sources */, + CEFBFC4F21FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m in Sources */, 5877D6CA1C466DE600938E5D /* QMDialogsViewController.m in Sources */, + CE57CD3921FA002E0026A23F /* QMHeaderCollectionReusableView.m in Sources */, + CEFBFBDD21FB929A00E1ECB2 /* QMBaseService.m in Sources */, + CEFBFBF821FB929A00E1ECB2 /* QMAuthService+Bolts.m in Sources */, + CEFBFC4321FB929A00E1ECB2 /* QMCDRecordStack.m in Sources */, 58D847811C871469000C40BA /* QMSearchDataProvider.m in Sources */, + CEFBFC1021FB929A00E1ECB2 /* QMCDMigrationManager.m in Sources */, + CEFBFBC521FB929A00E1ECB2 /* QMCDDialog.m in Sources */, E3A99BCF1FD00C8F00D0907B /* QMCallKitAdapter.m in Sources */, - E03AF8041FACDC6400DFEE7A /* NSError+QMShareExtension.m in Sources */, + CEFBFBE321FB929A00E1ECB2 /* CDUser.m in Sources */, + CEFBFC3421FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m in Sources */, E06F890B1E60FFF30017BBEC /* QMCallWindow.m in Sources */, + CE57CD4621FA002E0026A23F /* QMChatCollectionView.m in Sources */, + CE5563B821FBBC970051EC2D /* QMShareEtxentionOperation.m in Sources */, + CE57CD1E21FA002E0026A23F /* QMImageOutgoingCell.m in Sources */, E0425AB81FC37B1800CD8A58 /* UIAlertController+QM.m in Sources */, + CE57CD0B21FA002E0026A23F /* QMDateUtils.m in Sources */, 559BDFEA19618D3D000588FE /* QMWelcomeScreenViewController.m in Sources */, E08ADF5E1F8CCD6D0099CF99 /* QMDataSource.m in Sources */, + CEFBFC5521FB929A00E1ECB2 /* QMAttachmentStoreService.m in Sources */, 5868B06C1CE9C6ED004F9233 /* QMCallInfoView.m in Sources */, + CEFBFBFE21FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld in Sources */, 58FA41671C96B21200E61586 /* QMStatusStringBuilder.m in Sources */, + CE57CD4521FA002E0026A23F /* QMChatCollectionViewFlowLayout.m in Sources */, + CEFBFC2521FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m in Sources */, 55D8AD0419AC753600DAF79F /* QMImagePicker.m in Sources */, + CE5563CE21FBBC970051EC2D /* QBUUser+QMShareItemProtocol.m in Sources */, + CEFBFC7021FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m in Sources */, E03AF8131FACDE5E00DFEE7A /* QBSettings+Qmunicate.m in Sources */, + CEFBFC0421FB929A00E1ECB2 /* _CDContactListItem.m in Sources */, + CEFBFC0721FB929A00E1ECB2 /* QMUsersService.m in Sources */, + CEFBFC1621FB929A00E1ECB2 /* QMCDRecord+Options.m in Sources */, E01A5DE81F93F3BE00A85EC8 /* QMExtensionCache.m in Sources */, + CE57CD3B21FA002E0026A23F /* QMInputToolbar.m in Sources */, 58F398091CB7DE91006C1D5E /* QMChatManager.m in Sources */, E069B0171FC6FFF5005F9AB1 /* QMTasks.m in Sources */, + CEFBFC5221FB929A00E1ECB2 /* QMChatAttachmentService.m in Sources */, + CEFBFBE921FB929A00E1ECB2 /* _CDUser.m in Sources */, E04878211E8006C60008F497 /* QMAudioRecorder.m in Sources */, 584A6DB31C9DB7DC00B7D641 /* QMTagFieldView.m in Sources */, + CE57CD3D21FA002E0026A23F /* QMToolbarContentView.m in Sources */, 58FD66971CEF378200B72425 /* QMChangePasswordViewController.m in Sources */, - E0A996681FC84043008AFFBE /* SVIndefiniteAnimatedView.m in Sources */, + CEFBFC4621FB929A00E1ECB2 /* QMDBStorage.m in Sources */, E0B5CEDD1F978689004CB06D /* QMActivityItem.m in Sources */, - E06B0D8E1FA8CE02002E75D5 /* QMAttachmentProvider.m in Sources */, + CEFBFC5E21FB929A00E1ECB2 /* QMAttachmentAssetService.m in Sources */, + CE57CD4821FA002E0026A23F /* QMChatContainerView.m in Sources */, 589D4CFD1C981D44005F1E76 /* QMContactCell.m in Sources */, + CEFBFC6421FB929A00E1ECB2 /* QMMediaDownloadService.m in Sources */, + CEFBFBAA21FB929A00E1ECB2 /* QMOpenGraphMemoryStorage.m in Sources */, 5806509D1D2AA0350013A5E8 /* QMMapView.m in Sources */, 69D57E6218ACC11C00A9900A /* main.m in Sources */, 55D8ADB519AC761000DAF79F /* QMForgotPasswordViewController.m in Sources */, 5868B0611CE9C67D004F9233 /* QMCallButtonsFactory.m in Sources */, 58B3C9B41CB3ECF700B08A27 /* QMGroupInfoViewController.m in Sources */, 5877D6DE1C46728200938E5D /* QMDialogCell.m in Sources */, + CEFBFC2221FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m in Sources */, + CE57CD3F21FA002E0026A23F /* QMAudioRecordView.m in Sources */, 5877D6D41C46709A00938E5D /* QMTableViewDataSource.m in Sources */, + CEFBFC0A21FB929A00E1ECB2 /* QBUUser+CustomData.m in Sources */, 5839F26E1CC531AD0055EBF8 /* QMBaseTitleView.m in Sources */, + CEFBFC0D21FB929A00E1ECB2 /* QMUsersMemoryStorage.m in Sources */, 5897928D1C998C4A00CC6438 /* QMNoContactsCell.m in Sources */, + CEFBFC6721FB929A00E1ECB2 /* QMAttachmentContentService.m in Sources */, + CEFBFC7321FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m in Sources */, + CE5563C821FBBC970051EC2D /* NSError+QMShareExtension.m in Sources */, 589407B41BB958DE00C1CA78 /* QBUpdateUserParameters+CustomData.m in Sources */, 58550ABC1CF5BA790024EAFC /* QBChatDialog+OpponentID.m in Sources */, + CE57CD2F21FA002E0026A23F /* QMChatAttachmentIncomingCell.m in Sources */, + CE57CD2A21FA002E0026A23F /* QMMediaIncomingCell.m in Sources */, + CE5563C621FBBC970051EC2D /* QMExtensionCache+QMShareExtension.m in Sources */, E3D2EEA41EF7C693002DC44E /* QMTableViewController.m in Sources */, - E01A5DE21F93F22600A85EC8 /* QMShareItemsDataProvider.m in Sources */, E002F3F11F508CF90044B0B3 /* NSString+QMValidation.m in Sources */, + CEFBFC2E21FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m in Sources */, 58C64D071C90699A00F1387B /* QMChatButtonsFactory.m in Sources */, 58D847861C871BDB000C40BA /* QMDialogsSearchDataProvider.m in Sources */, 58B3C9D21CB6717200B08A27 /* QMSeparatorCell.m in Sources */, + CEFBFBB621FB929A00E1ECB2 /* QMServicesManager.m in Sources */, + CE57CD2621FA002E0026A23F /* QMImageIncomingCell.m in Sources */, 5877D6DA1C46720600938E5D /* QMTableViewCell.m in Sources */, 580D34DF1BBFF5850034813A /* UIImage+fixOrientation.m in Sources */, + CE5563BC21FBBC970051EC2D /* QMShareCollectionViewCell.m in Sources */, 588CF1021CA6BF8200B23C00 /* QMNotificationPanelUtils.m in Sources */, - E01A5DE41F93F23600A85EC8 /* QBChatDialog+QMShareItemProtocol.m in Sources */, + CEFBFC3A21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m in Sources */, 589792991C99941400CC6438 /* QMAlphabetizer.m in Sources */, 5868B0741CE9DF5E004F9233 /* QMMessageNotification.m in Sources */, + CE57CD4E21FA002E0026A23F /* UIImageView+QMLocationSnapshot.m in Sources */, + CE57CD4121FA002E0026A23F /* QMImageView.m in Sources */, + CEFBFBA121FB929A00E1ECB2 /* QMOpenGraphModel.xcdatamodeld in Sources */, 584277DC1C3FE5BC00CDE35B /* QMCore.m in Sources */, + CE57CD0A21FA002E0026A23F /* QMChatResources.m in Sources */, 58B3C9C01CB3F9F100B08A27 /* QMAddMemberCell.m in Sources */, 589792A21C9AA69B00CC6438 /* QMContactsSearchDataProvider.m in Sources */, + CE5563BE21FBBC970051EC2D /* QMShareTableViewCell.m in Sources */, + CEFBFC0121FB929A00E1ECB2 /* CDContactListItem.m in Sources */, 58B3C9C81CB4044000B08A27 /* QMTableSectionHeaderView.m in Sources */, + CE57CD3421FA002E0026A23F /* QMChatLocationOutgoingCell.m in Sources */, + CEFBFBFB21FB929A00E1ECB2 /* QMContactListCache.m in Sources */, 58A639261CEB3ECA00D682C4 /* QMTabBarVC.m in Sources */, - E051D6371F3CA3600054D46B /* QMLog.m in Sources */, 58D847931C89A9FE000C40BA /* QMNoResultsCell.m in Sources */, 58B3C9BC1CB3EE8400B08A27 /* QMGroupOccupantsDataSource.m in Sources */, + CEFBFB9E21FB929A00E1ECB2 /* QMOpenGraphCache.m in Sources */, + CE57CD0D21FA002E0026A23F /* QMChatViewController.m in Sources */, 58B3C9D61CB6827600B08A27 /* NSArray+Intersection.m in Sources */, + CE57CD4F21FA002E0026A23F /* QMChatLocationSnapshotter.m in Sources */, 581F6E221D3E3E1C0087BC7A /* QMHelpers.m in Sources */, 58D8478F1C8886D8000C40BA /* QMGlobalSearchDataProvider.m in Sources */, + CEFBFBAD21FB929A00E1ECB2 /* QMOpenGraphItem.m in Sources */, 5868B0641CE9C68C004F9233 /* QMPermissions.m in Sources */, - E0A9966C1FC84043008AFFBE /* SVRadialGradientLayer.m in Sources */, 584A6DC51C9DC80900B7D641 /* QMTagView.m in Sources */, + CE57CD0F21FA002E0026A23F /* QBChatMessage+QBDateDivider.m in Sources */, 58D847581C848272000C40BA /* QMDialogsSearchDataSource.m in Sources */, 58B072531CFDB831006F4D29 /* UIViewController+SmartDeselection.m in Sources */, + CEFBFC1C21FB929A00E1ECB2 /* NSArray+QMCDRecord.m in Sources */, E026A76E1E82B9A10054AD83 /* UIScreen+QMLock.m in Sources */, E03F3D351E1C724E00A46884 /* NSString+QMTransliterating.m in Sources */, + CEFBFC1921FB929A00E1ECB2 /* QMCDRecordInternal.m in Sources */, FBE42BCC1FF6807D00F139E9 /* MPGNotification.m in Sources */, 55D8ADFB19AC833300DAF79F /* QMLicenseAgreement.m in Sources */, 58D847681C85A1DB000C40BA /* QMGlobalSearchDataSource.m in Sources */, 58D952381CEE2345001C43F7 /* QMPhoto.m in Sources */, 589D4CF91C981888005F1E76 /* QMContactsDataSource.m in Sources */, - E0695E5F1FBA6BB000B53E6D /* NSURL+QMShareExtension.m in Sources */, + CEFBFC6A21FB929A00E1ECB2 /* QMChatService.m in Sources */, + CEFBFBB321FB929A00E1ECB2 /* QMDeferredQueueMemoryStorage.m in Sources */, + CEFBFC3721FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m in Sources */, + CE57CD4221FA002E0026A23F /* QMAudioRecordButton.m in Sources */, + CE57CD2021FA002E0026A23F /* QMBaseMediaCell.m in Sources */, 5868B05B1CE9C647004F9233 /* QMCallViewController.m in Sources */, - E01A5DE71F93F37900A85EC8 /* QMShareCollectionViewCell.m in Sources */, + CE5563CC21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol.m in Sources */, + CEFBFC4921FB929A00E1ECB2 /* QMDialogsMemoryStorage.m in Sources */, + CEFBFC6D21FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m in Sources */, 580FEBF61CC50423000AED72 /* QMMessagesHelper.m in Sources */, + CEFBFC2821FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m in Sources */, + CE5563A621FBBC970051EC2D /* QMShareItemsDataProvider.m in Sources */, E0921D941F6FEE11005961CF /* QMImageBarButtonItem.m in Sources */, - E01D88F41FAB69340049CD06 /* QMShareEtxentionOperation.m in Sources */, 584A6D971C9D9D9F00B7D641 /* QMAlphabetizedTableViewDataSource.m in Sources */, E043459C1F29545F0066851D /* QMAttachmentController.m in Sources */, + CE5563CA21FBBC970051EC2D /* NSURL+QMShareExtension.m in Sources */, 589B62921CE1CB4A0038F5E0 /* QMPushNotificationManager.m in Sources */, 584277D51C3FCFBA00CDE35B /* QMFacebook.m in Sources */, - E01A5DE11F93F22400A85EC8 /* QMShareDataSource.m in Sources */, E09FCA671E60A9270013E3EB /* QMAudioPlayer.m in Sources */, - E07CB8A81FAD2F640027087E /* QMShareTableViewController.m in Sources */, + CE57CD3A21FA002E0026A23F /* QMPlaceHolderTextView.m in Sources */, + CE57CD4721FA002E0026A23F /* QMKVOView.m in Sources */, + CE57CD1221FA002E0026A23F /* QMChatAttachmentOutgoingCell.m in Sources */, + CE57CD2521FA002E0026A23F /* QMVideoIncomingCell.m in Sources */, 58C64D031C905F9800F1387B /* QMChatVC.m in Sources */, + CE57CD3221FA002E0026A23F /* QMChatOutgoingCell.m in Sources */, 58D847701C85BB36000C40BA /* QMSearchCell.m in Sources */, + CEFBFC6121FB929A00E1ECB2 /* QMMediaUploadService.m in Sources */, 583E1D391D2BA57F008111DB /* QMLocationButton.m in Sources */, 58B3C9B81CB3ED8000B08A27 /* QMGroupOccupantsViewController.m in Sources */, + CE57CD0C21FA002E0026A23F /* QMImageLoader.m in Sources */, + CE57CD1621FA002E0026A23F /* QMChatContactRequestCell.m in Sources */, + CEFBFBBF21FB929A00E1ECB2 /* QMCDMessage.m in Sources */, + CE57CD2821FA002E0026A23F /* QMAudioOutgoingCell.m in Sources */, 58FD668A1CEF058400B72425 /* QMFeedbackViewController.m in Sources */, 5877D6CE1C46702400938E5D /* QMDialogsDataSource.m in Sources */, + CEFBFC1321FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m in Sources */, E08D52151E5AABF700918B5B /* QMMediaController.m in Sources */, + CEFBFBD721FB929A00E1ECB2 /* QMContactListMemoryStorage.m in Sources */, + CEFBFBCB21FB929A00E1ECB2 /* _QMCDMessage.m in Sources */, 581BAC8E1CAD8DD900E0567D /* QMColors.m in Sources */, 585DE45F1C4686060068E03E /* QMErrorsFactory.m in Sources */, 58A6392D1CEB78D000D682C4 /* QMLinkViewController.m in Sources */, + CEFBFBD421FB929A00E1ECB2 /* QMContactListService+Bolts.m in Sources */, + CEFBFC3D21FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m in Sources */, E3D2EEAB1EF7F6A2002DC44E /* QMNavigationController.m in Sources */, 5839F2761CC533A30055EBF8 /* QMGroupHeaderView.m in Sources */, + CE57CD1D21FA002E0026A23F /* QMChatIncomingLinkPreviewCell.m in Sources */, + CE57CD2C21FA002E0026A23F /* QMVideoOutgoingCell.m in Sources */, + CE57CD2221FA002E0026A23F /* QMAudioIncomingCell.m in Sources */, + CEFBFBD121FB929A00E1ECB2 /* QMChatCache.m in Sources */, + CE57CD3721FA002E0026A23F /* QMChatNotificationCell.m in Sources */, + CEFBFC3121FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m in Sources */, 584AF9061D6F3BBD00B6CF69 /* QMSplitViewController.m in Sources */, - E01A5DDA1F93F20500A85EC8 /* QMShareTableViewCell.m in Sources */, 585A46381CC8F16F004FBC3D /* QMGroupAddUsersSearchDataProvider.m in Sources */, + CEFBFC4021FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m in Sources */, 580650991D2A9FD50013A5E8 /* QMLocationViewController.m in Sources */, + CEFBFBB921FB929A00E1ECB2 /* QMDeferredQueueManager.m in Sources */, 5897929E1C9AA65400CC6438 /* QMContactsSearchDataSource.m in Sources */, + CE57CD4B21FA002E0026A23F /* NSString+QM.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3197,16 +4895,89 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + CEFBFC1721FB929A00E1ECB2 /* QMCDRecord+Options.m in Sources */, + CEFBFC3221FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m in Sources */, + CEFBFBA221FB929A00E1ECB2 /* QMOpenGraphModel.xcdatamodeld in Sources */, + CEFBFBA821FB929A00E1ECB2 /* _CDOpenGraphModel.m in Sources */, + CEFBFC2C21FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m in Sources */, + CEFBFBCC21FB929A00E1ECB2 /* _QMCDMessage.m in Sources */, + CEFBFBC021FB929A00E1ECB2 /* QMCDMessage.m in Sources */, + CEFBFBB121FB929A00E1ECB2 /* QMOpenGraphService.m in Sources */, + CEFBFC1421FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m in Sources */, + CEFBFC2621FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m in Sources */, + CEFBFC3821FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m in Sources */, + CEFBFBC621FB929A00E1ECB2 /* QMCDDialog.m in Sources */, + CEFBFC7421FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m in Sources */, + CEFBFBD221FB929A00E1ECB2 /* QMChatCache.m in Sources */, + CEFBFC5F21FB929A00E1ECB2 /* QMAttachmentAssetService.m in Sources */, + CEFBFBF921FB929A00E1ECB2 /* QMAuthService+Bolts.m in Sources */, + CEFBFBFF21FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld in Sources */, + CEFBFBEA21FB929A00E1ECB2 /* _CDUser.m in Sources */, + CEFBFC0B21FB929A00E1ECB2 /* QBUUser+CustomData.m in Sources */, + CEFBFC6521FB929A00E1ECB2 /* QMMediaDownloadService.m in Sources */, + CEFBFC0221FB929A00E1ECB2 /* CDContactListItem.m in Sources */, + CEFBFC2921FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m in Sources */, + CEFBFC2F21FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m in Sources */, + CEFBFBCF21FB929A00E1ECB2 /* _QMCDDialog.m in Sources */, + CEFBFC0521FB929A00E1ECB2 /* _CDContactListItem.m in Sources */, + CEFBFBDE21FB929A00E1ECB2 /* QMBaseService.m in Sources */, + CEFBFBB421FB929A00E1ECB2 /* QMDeferredQueueMemoryStorage.m in Sources */, + CEFBFC1A21FB929A00E1ECB2 /* QMCDRecordInternal.m in Sources */, + CEFBFC7A21FB929A00E1ECB2 /* QMMessagesMemoryStorage.m in Sources */, + CE5563F321FBBCA30051EC2D /* QBUUser+INPerson.m in Sources */, + CEFBFC6B21FB929A00E1ECB2 /* QMChatService.m in Sources */, + CEFBFC3E21FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m in Sources */, + CEFBFBC321FB929A00E1ECB2 /* QMCDAttachment.m in Sources */, + CE5563EB21FBBCA30051EC2D /* QBChatDialog+INPerson.m in Sources */, + CEFBFC3521FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m in Sources */, + CEFBFBC921FB929A00E1ECB2 /* _QMCDAttachment.m in Sources */, + CEFBFBBA21FB929A00E1ECB2 /* QMDeferredQueueManager.m in Sources */, + CEFBFC5021FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m in Sources */, E03F3D361E1C724E00A46884 /* NSString+QMTransliterating.m in Sources */, + CE5563ED21FBBCA30051EC2D /* QMSiriHelper.m in Sources */, + CEFBFBF621FB929A00E1ECB2 /* QMAuthService.m in Sources */, + CEFBFBAE21FB929A00E1ECB2 /* QMOpenGraphItem.m in Sources */, + CEFBFBED21FB929A00E1ECB2 /* QMUsersCache.m in Sources */, + CE5563EF21FBBCA30051EC2D /* IntentHandler.m in Sources */, + CEFBFBA521FB929A00E1ECB2 /* CDOpenGraphModel.m in Sources */, E03AF8141FACDE5E00DFEE7A /* QBSettings+Qmunicate.m in Sources */, - E0A8A7BD1F8F8B3000382443 /* QMExtensionCache+QMSiriExtension.m in Sources */, - E06355771E1D3CA800BE9061 /* QBChatDialog+INPerson.m in Sources */, + CEFBFC6E21FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m in Sources */, + CEFBFC7E21FB9A5900E1ECB2 /* QMCDRecordStack.m in Sources */, + CEFBFC7121FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m in Sources */, + CEFBFBFC21FB929A00E1ECB2 /* QMContactListCache.m in Sources */, + CEFBFBAB21FB929A00E1ECB2 /* QMOpenGraphMemoryStorage.m in Sources */, + CEFBFC6821FB929A00E1ECB2 /* QMAttachmentContentService.m in Sources */, + CEFBFBD521FB929A00E1ECB2 /* QMContactListService+Bolts.m in Sources */, + CEFBFBE721FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld in Sources */, + CEFBFC7C21FB9A2E00E1ECB2 /* QMDBStorage.m in Sources */, + CEFBFC1D21FB929A00E1ECB2 /* NSArray+QMCDRecord.m in Sources */, + CEFBFC5C21FB929A00E1ECB2 /* QMAssetLoader.m in Sources */, + CEFBFC6221FB929A00E1ECB2 /* QMMediaUploadService.m in Sources */, + CEFBFC0821FB929A00E1ECB2 /* QMUsersService.m in Sources */, + CEFBFBF021FB929A00E1ECB2 /* QMSLog.m in Sources */, + CEFBFBDB21FB929A00E1ECB2 /* QMContactListService.m in Sources */, + CEFBFC4A21FB929A00E1ECB2 /* QMDialogsMemoryStorage.m in Sources */, + CEFBFC4121FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m in Sources */, + CEFBFC5321FB929A00E1ECB2 /* QMChatAttachmentService.m in Sources */, E08441DA1E1E611D00B87D0F /* NSString+QMSiriUtils.m in Sources */, - E04E45C71DE5A78700A0E0FC /* QMSiriHelper.m in Sources */, - E063556D1E1D1D4F00BE9061 /* IntentHandler.m in Sources */, - E06355721E1D1E3300BE9061 /* QBUUser+INPerson.m in Sources */, + CEFBFBE421FB929A00E1ECB2 /* CDUser.m in Sources */, + CEFBFBE121FB929A00E1ECB2 /* QMAsynchronousOperation.m in Sources */, + CE5563F121FBBCA30051EC2D /* QMMessageIntentHandler.m in Sources */, + CEFBFC2321FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m in Sources */, + CEFBFC0E21FB929A00E1ECB2 /* QMUsersMemoryStorage.m in Sources */, + CE5563F521FBBCA30051EC2D /* QMExtensionCache+QMSiriExtension.m in Sources */, + CEFBFBF321FB929A00E1ECB2 /* QMServices.m in Sources */, + CEFBFBD821FB929A00E1ECB2 /* QMContactListMemoryStorage.m in Sources */, + CEFBFC4D21FB929A00E1ECB2 /* QMChatService+Bolts.m in Sources */, + CEFBFB9F21FB929A00E1ECB2 /* QMOpenGraphCache.m in Sources */, + CEFBFBB721FB929A00E1ECB2 /* QMServicesManager.m in Sources */, + CEFBFC7721FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m in Sources */, + CEFBFBBD21FB929A00E1ECB2 /* QMChatServiceModel.xcdatamodeld in Sources */, + CEFBFC5621FB929A00E1ECB2 /* QMAttachmentStoreService.m in Sources */, + CEFBFC3B21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m in Sources */, E0A8A7BA1F8F818C00382443 /* QMExtensionCache.m in Sources */, - E063556E1E1D1D4F00BE9061 /* QMMessageIntentHandler.m in Sources */, + CEFBFC5921FB929A00E1ECB2 /* QMTimeOut.m in Sources */, + CEFBFC2021FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3214,36 +4985,112 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + CEFBFC7821FB929A00E1ECB2 /* QBChatAttachment+QMFactory.m in Sources */, E049C7671F8D166C00CD0376 /* QMTableViewDataSource.m in Sources */, - E0A8A7BF1F8F9CAA00382443 /* QBUUser+QMShareItemProtocol.m in Sources */, - E0A8A7A01F8F7B0300382443 /* QMExtensionCache+QMShareExtension.m in Sources */, - E01D88F51FAB69340049CD06 /* QMShareEtxentionOperation.m in Sources */, - E07CB8A91FAD2F640027087E /* QMShareTableViewController.m in Sources */, - E05AEC5A1F9A0E1F004D3274 /* NSURL+QMShareExtension.m in Sources */, + CEFBFBDC21FB929A00E1ECB2 /* QMContactListService.m in Sources */, + CEFBFBA921FB929A00E1ECB2 /* _CDOpenGraphModel.m in Sources */, + CEBF330721FA16C70074A431 /* QMImageView.m in Sources */, + CEFBFC4221FB929A00E1ECB2 /* NSPersistentStoreCoordinator+QMCDRecord.m in Sources */, + CEBF330821FA16F10074A431 /* UIImage+Cropper.m in Sources */, + CEFBFC4B21FB929A00E1ECB2 /* QMDialogsMemoryStorage.m in Sources */, + CEFBFBB821FB929A00E1ECB2 /* QMServicesManager.m in Sources */, E0A8A7B91F8F818B00382443 /* QMExtensionCache.m in Sources */, + CEFBFC5A21FB929A00E1ECB2 /* QMTimeOut.m in Sources */, + CE5563B721FBBC970051EC2D /* QMAttachmentProvider.m in Sources */, + CEFBFC2721FB929A00E1ECB2 /* NSPersistentStore+QMCDRecord.m in Sources */, + CEFBFC5721FB929A00E1ECB2 /* QMAttachmentStoreService.m in Sources */, + CEFBFC1821FB929A00E1ECB2 /* QMCDRecord+Options.m in Sources */, + CEFBFC0F21FB929A00E1ECB2 /* QMUsersMemoryStorage.m in Sources */, + CEFBFBE521FB929A00E1ECB2 /* CDUser.m in Sources */, + CEFBFC1521FB929A00E1ECB2 /* QMCDRecord+VersionInformation.m in Sources */, + CEFBFC4E21FB929A00E1ECB2 /* QMChatService+Bolts.m in Sources */, + CEFBFC6F21FB929A00E1ECB2 /* QBChatMessage+QMCustomParameters.m in Sources */, + CEFBFC1E21FB929A00E1ECB2 /* NSArray+QMCDRecord.m in Sources */, + CEFBFBD021FB929A00E1ECB2 /* _QMCDDialog.m in Sources */, + CEFBFC5421FB929A00E1ECB2 /* QMChatAttachmentService.m in Sources */, + CEFBFBCA21FB929A00E1ECB2 /* _QMCDAttachment.m in Sources */, + CEFBFC2D21FB929A00E1ECB2 /* NSManagedObject+QMCDAggregation.m in Sources */, + CE5563B121FBBC970051EC2D /* QMShareTableViewController.m in Sources */, + CEFBFBF121FB929A00E1ECB2 /* QMSLog.m in Sources */, + CE5563A721FBBC970051EC2D /* QMShareItemsDataProvider.m in Sources */, E049C7661F8D165C00CD0376 /* QMSearchDataProvider.m in Sources */, + CEFBFC0921FB929A00E1ECB2 /* QMUsersService.m in Sources */, + CEFBFC2121FB929A00E1ECB2 /* NSError+QMCDRecordErrorHandling.m in Sources */, + CEFBFC0621FB929A00E1ECB2 /* _CDContactListItem.m in Sources */, + CEFBFC2421FB929A00E1ECB2 /* NSDictionary+QMCDRecordAdditions.m in Sources */, + CE5563B521FBBC970051EC2D /* QMShareTasks.m in Sources */, + CE5563BD21FBBC970051EC2D /* QMShareCollectionViewCell.m in Sources */, E074459E1F87AD0000D12325 /* QMAlphabetizer.m in Sources */, E0A8A7C01F8FADB200382443 /* QMImages.m in Sources */, - E05AEC5E1F9A4AE8004D3274 /* QMShareTasks.m in Sources */, + CE5563CD21FBBC970051EC2D /* QBChatDialog+QMShareItemProtocol.m in Sources */, E074459D1F87903200D12325 /* QMColors.m in Sources */, - E096AABA1F9F391800EDDEE3 /* QMLog.m in Sources */, + CEFBFC3021FB929A00E1ECB2 /* NSManagedObject+QMCDFinders.m in Sources */, + CEFBFC1B21FB929A00E1ECB2 /* QMCDRecordInternal.m in Sources */, + CEFBFC0021FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld in Sources */, E0B5CEDE1F978689004CB06D /* QMActivityItem.m in Sources */, + CEFBFBBE21FB929A00E1ECB2 /* QMChatServiceModel.xcdatamodeld in Sources */, + CEFBFBAC21FB929A00E1ECB2 /* QMOpenGraphMemoryStorage.m in Sources */, + CEFBFBEB21FB929A00E1ECB2 /* _CDUser.m in Sources */, + CEFBFC6C21FB929A00E1ECB2 /* QMChatService.m in Sources */, + CE5563C721FBBC970051EC2D /* QMExtensionCache+QMShareExtension.m in Sources */, + CEFBFC0C21FB929A00E1ECB2 /* QBUUser+CustomData.m in Sources */, + CEFBFBA621FB929A00E1ECB2 /* CDOpenGraphModel.m in Sources */, + CEFBFC3C21FB929A00E1ECB2 /* NSManagedObjectContext+QMCDRecord.m in Sources */, E08B868B1F86540000FA8291 /* QMTableViewCell.m in Sources */, + CE5563C521FBBC970051EC2D /* QMShareContactsTableViewCell.m in Sources */, + CEFBFC5D21FB929A00E1ECB2 /* QMAssetLoader.m in Sources */, E08ADF5F1F8CCD6D0099CF99 /* QMDataSource.m in Sources */, - E07CB8A51FAD2B1A0027087E /* QMShareRootViewController.m in Sources */, E03AF8151FACDE5E00DFEE7A /* QBSettings+Qmunicate.m in Sources */, - E0AA0E6A1F90E38C0082750E /* QMShareContactsTableViewCell.m in Sources */, - E0A8A7A81F8F7B0300382443 /* QMShareItemsDataProvider.m in Sources */, - E0A8A7A51F8F7B0300382443 /* QMShareTableViewCell.m in Sources */, - E0A8A79E1F8F7B0300382443 /* QBChatDialog+QMShareItemProtocol.m in Sources */, - E03AF8051FACDC6400DFEE7A /* NSError+QMShareExtension.m in Sources */, + CE5563BF21FBBC970051EC2D /* QMShareTableViewCell.m in Sources */, + CEFBFC0321FB929A00E1ECB2 /* CDContactListItem.m in Sources */, + CEFBFC3621FB929A00E1ECB2 /* NSManagedObjectContext+QMCDSaves.m in Sources */, + CEFBFBCD21FB929A00E1ECB2 /* _QMCDMessage.m in Sources */, + CEFBFC3321FB929A00E1ECB2 /* NSManagedObject+QMCDRecord.m in Sources */, + CEFBFBB521FB929A00E1ECB2 /* QMDeferredQueueMemoryStorage.m in Sources */, + CEFBFC3F21FB929A00E1ECB2 /* NSManagedObjectModel+QMCDRecord.m in Sources */, + CEFBFBA321FB929A00E1ECB2 /* QMOpenGraphModel.xcdatamodeld in Sources */, + CEFBFC6021FB929A00E1ECB2 /* QMAttachmentAssetService.m in Sources */, + CEFBFC6621FB929A00E1ECB2 /* QMMediaDownloadService.m in Sources */, + CEFBFBBB21FB929A00E1ECB2 /* QMDeferredQueueManager.m in Sources */, + CEFBFBF721FB929A00E1ECB2 /* QMAuthService.m in Sources */, + CEFBFC7B21FB929A00E1ECB2 /* QMMessagesMemoryStorage.m in Sources */, + CEFBFBD621FB929A00E1ECB2 /* QMContactListService+Bolts.m in Sources */, + CEFBFC7221FB929A00E1ECB2 /* QBChatAttachment+QMCustomData.m in Sources */, E04D268E1F8E4408005CB2FD /* QMNoResultsCell.m in Sources */, + CEFBFC6921FB929A00E1ECB2 /* QMAttachmentContentService.m in Sources */, + CEFBFC7F21FB9A5A00E1ECB2 /* QMCDRecordStack.m in Sources */, + CEFBFBF421FB929A00E1ECB2 /* QMServices.m in Sources */, + CEFBFBFD21FB929A00E1ECB2 /* QMContactListCache.m in Sources */, + CEFBFBE221FB929A00E1ECB2 /* QMAsynchronousOperation.m in Sources */, + CEFBFC5121FB929A00E1ECB2 /* QMAttachmentsMemoryStorage.m in Sources */, + CEFBFBD921FB929A00E1ECB2 /* QMContactListMemoryStorage.m in Sources */, E049C7641F8D00BC00CD0376 /* QMSearchResultsController.m in Sources */, + CEFBFBB221FB929A00E1ECB2 /* QMOpenGraphService.m in Sources */, + CEFBFBFA21FB929A00E1ECB2 /* QMAuthService+Bolts.m in Sources */, + CE5563CF21FBBC970051EC2D /* QBUUser+QMShareItemProtocol.m in Sources */, + CEFBFC7521FB929A00E1ECB2 /* QBChatAttachment+QMCustomParameters.m in Sources */, + CEFBFC7D21FB9A2F00E1ECB2 /* QMDBStorage.m in Sources */, + CEFBFBD321FB929A00E1ECB2 /* QMChatCache.m in Sources */, + CEFBFBC421FB929A00E1ECB2 /* QMCDAttachment.m in Sources */, E0425AB91FC399C600CD8A58 /* UIAlertController+QM.m in Sources */, E049C7651F8D160500CD0376 /* QMSearchDataSource.m in Sources */, - E0A8A7A31F8F7B0300382443 /* QMShareCollectionViewCell.m in Sources */, - E0A8A7A71F8F7B0300382443 /* QMShareDataSource.m in Sources */, - E06B0D8D1FA7B5E9002E75D5 /* QMAttachmentProvider.m in Sources */, + CE57CD5021FA132F0026A23F /* QMImageLoader.m in Sources */, + CEFBFBC121FB929A00E1ECB2 /* QMCDMessage.m in Sources */, + CEFBFC6321FB929A00E1ECB2 /* QMMediaUploadService.m in Sources */, + CEFBFBC721FB929A00E1ECB2 /* QMCDDialog.m in Sources */, + CEFBFBDF21FB929A00E1ECB2 /* QMBaseService.m in Sources */, + CEFBFBE821FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld in Sources */, + CEFBFBAF21FB929A00E1ECB2 /* QMOpenGraphItem.m in Sources */, + CEFBFC2A21FB929A00E1ECB2 /* NSManagedObject+QMCDRequests.m in Sources */, + CE5563AF21FBBC970051EC2D /* QMShareRootViewController.m in Sources */, + CE5563CB21FBBC970051EC2D /* NSURL+QMShareExtension.m in Sources */, + CE5563C921FBBC970051EC2D /* NSError+QMShareExtension.m in Sources */, + CEFBFC3921FB929A00E1ECB2 /* NSManagedObjectContext+QMCDObserving.m in Sources */, + CE5563A921FBBC970051EC2D /* QMShareDataSource.m in Sources */, + CEFBFBA021FB929A00E1ECB2 /* QMOpenGraphCache.m in Sources */, + CEFBFBEE21FB929A00E1ECB2 /* QMUsersCache.m in Sources */, + CE5563B921FBBC970051EC2D /* QMShareEtxentionOperation.m in Sources */, + CEBF330621FA16710074A431 /* UIImage+QM.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3272,28 +5119,36 @@ path = .; sourceTree = ""; }; - E03871E31DDB36F800554EB9 /* MainInterface.storyboard */ = { + CE55637D21FBBC960051EC2D /* ShareInterface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + CE55637E21FBBC960051EC2D /* Base */, + ); + name = ShareInterface.storyboard; + sourceTree = ""; + }; + CE5563E521FBBCA30051EC2D /* MainInterface.storyboard */ = { isa = PBXVariantGroup; children = ( - E0B6A3351E2A614B001125FC /* en */, + CE5563E621FBBCA30051EC2D /* en */, ); name = MainInterface.storyboard; sourceTree = ""; }; - E0B6A3381E2A615E001125FC /* AppIntentVocabulary.plist */ = { + CE57CC5A21FA002D0026A23F /* QMChatViewController.xib */ = { isa = PBXVariantGroup; children = ( - E0B6A3371E2A615E001125FC /* en */, + CE57CC5B21FA002D0026A23F /* en */, ); - name = AppIntentVocabulary.plist; + name = QMChatViewController.xib; sourceTree = ""; }; - E0CA1F4D1F84F78A00E9B293 /* ShareInterface.storyboard */ = { + E0B6A3381E2A615E001125FC /* AppIntentVocabulary.plist */ = { isa = PBXVariantGroup; children = ( - E0CA1F4E1F84F78A00E9B293 /* Base */, + E0B6A3371E2A615E001125FC /* en */, ); - name = ShareInterface.storyboard; + name = AppIntentVocabulary.plist; sourceTree = ""; }; /* End PBXVariantGroup section */ @@ -3303,6 +5158,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -3311,12 +5167,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -3340,12 +5198,12 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -3355,6 +5213,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -3363,12 +5222,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -3385,12 +5246,12 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -3398,36 +5259,48 @@ }; 69D57E7F18ACC11C00A9900A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F334A9F28F73239275E50842 /* Pods-Q-municate.debug.xcconfig */; + baseConfigurationReference = A882BC1317494F7309B1EF9C /* Pods-Q-municate.debug.xcconfig */; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; - CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = NO; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_FLOAT_CONVERSION = NO; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO; CODE_SIGN_ENTITLEMENTS = "Q-municate/Q-municate.entitlements"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_RESOURCE_RULES_PATH = ""; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 2281; DEVELOPMENT_TEAM = 8885H5G2YX; ENABLE_BITCODE = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", + "$(PROJECT_DIR)/Q-municate", + "$(PROJECT_DIR)", "$(PROJECT_DIR)/External", ); GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Q-municate/Supporting Files/Q-municate-Prefix.pch"; - GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; - GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; - GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = NO; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VALUE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", /usr/include/libxml2, + "\"$(SRCROOT)/Pods/QuickBlox/Quickblox.framework\"/**", ); INFOPLIST_FILE = "Q-municate/Supporting Files/Q-municate-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; + MARKETING_VERSION = 2.8.2; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ( "$(inherited)", @@ -3438,44 +5311,40 @@ OTHER_LIBTOOLFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = com.quickblox.qmunicate; PRODUCT_NAME = "Q-municate"; - PROVISIONING_PROFILE = "dae2630b-8ad2-43ba-a863-40572a05f4a7"; - PROVISIONING_PROFILE_SPECIFIER = "Q-municate Development"; + PROVISIONING_PROFILE_SPECIFIER = ""; REZ_SEARCH_PATHS = "$(inherited)"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited)"; - VALID_ARCHS = "arm64 armv7 armv7s"; - WARNING_CFLAGS = ( - "-Wall", - "-Wdeprecated-implementations", - "-Wextra", - "-Wfloat-equal", - "-Wimplicit-retain-self", - "-Wshadow", - "-Wsign-compare", - "-Wreturn-type", - "-Wundef", - ); + VALID_ARCHS = "arm64 arm64e armv7 armv7s"; + WARNING_CFLAGS = ""; WRAPPER_EXTENSION = app; }; name = Debug; }; 69D57E8018ACC11C00A9900A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 269116E9D6D043D8FAC9E1D8 /* Pods-Q-municate.release.xcconfig */; + baseConfigurationReference = C64575C942EA97E9F5225A33 /* Pods-Q-municate.release.xcconfig */; buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; - CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = NO; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_FLOAT_CONVERSION = NO; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO; CODE_SIGN_ENTITLEMENTS = "Q-municate/Q-municate.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_RESOURCE_RULES_PATH = ""; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 2281; DEVELOPMENT_TEAM = 8885H5G2YX; ENABLE_BITCODE = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", + "\"$(SRCROOT)/../Framework\"", + "$(PROJECT_DIR)", "$(PROJECT_DIR)/External", ); GCC_OPTIMIZATION_LEVEL = s; @@ -3486,17 +5355,22 @@ "COCOAPODS=1", DNDEBUG, ); - GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; - GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; - GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = NO; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VALUE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", /usr/include/libxml2, + "\"$(SRCROOT)/Pods/QuickBlox/Quickblox.framework\"/**", ); INFOPLIST_FILE = "Q-municate/Supporting Files/Q-municate-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; + MARKETING_VERSION = 2.8.2; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = ( "$(inherited)", @@ -3507,21 +5381,21 @@ OTHER_LIBTOOLFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = com.quickblox.qmunicate; PRODUCT_NAME = "Q-municate"; - PROVISIONING_PROFILE = "727957ca-2e37-4283-8c56-18624ec111ae"; - PROVISIONING_PROFILE_SPECIFIER = "Q-municate Ad hoc"; + PROVISIONING_PROFILE_SPECIFIER = ""; REZ_SEARCH_PATHS = "$(inherited)"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(inherited)"; - VALID_ARCHS = "arm64 armv7 armv7s"; + VALID_ARCHS = "arm64 arm64e armv7 armv7s"; WRAPPER_EXTENSION = app; }; name = Release; }; E07BC2291DDF5FD900B8D3B0 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AAF30F47522590E10692EA18 /* Pods-QMSiriExtension.debug.xcconfig */; + baseConfigurationReference = DF5DEED5E5E7BE521787B524 /* Pods-QMSiriExtension.debug.xcconfig */; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_INFINITE_RECURSION = YES; @@ -3529,22 +5403,39 @@ CODE_SIGN_ENTITLEMENTS = QMSiriExtension/QMSiriExtension.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 8885H5G2YX; ENABLE_BITCODE = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Bolts\"", + "$(PROJECT_DIR)/External", + ); GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNINITIALIZED_AUTOS = YES; INFOPLIST_FILE = "$(SRCROOT)/QMSiriExtension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + OTHER_CFLAGS = ( + "$(inherited)", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Bolts/Bolts.framework/Headers\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public/Firebase\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public/FirebaseAuthInterop\"", + "-DQM_SIRI_EXTENTION", + ); PRODUCT_BUNDLE_IDENTIFIER = com.quickblox.qmunicate.QMSiriExtension; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "ca209d9c-a65d-4bf1-91e8-50d0feccb006"; - PROVISIONING_PROFILE_SPECIFIER = "Q-municate Siri Extension Development"; + PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -3552,32 +5443,50 @@ }; E07BC22A1DDF5FD900B8D3B0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 914D22F55FCE43364D718A2A /* Pods-QMSiriExtension.release.xcconfig */; + baseConfigurationReference = EFB338E65DEED3B4B5896E6E /* Pods-QMSiriExtension.release.xcconfig */; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CODE_SIGN_ENTITLEMENTS = QMSiriExtension/QMSiriExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 8885H5G2YX; ENABLE_BITCODE = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Bolts\"", + "$(PROJECT_DIR)/External", + ); GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNINITIALIZED_AUTOS = YES; INFOPLIST_FILE = "$(SRCROOT)/QMSiriExtension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = ( + "$(inherited)", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Bolts/Bolts.framework/Headers\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public/Firebase\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public/FirebaseAuthInterop\"", + "-DQM_SIRI_EXTENTION", + ); PRODUCT_BUNDLE_IDENTIFIER = com.quickblox.qmunicate.QMSiriExtension; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "1b224f6e-b9da-4b38-aa22-984c27c395b7"; - PROVISIONING_PROFILE_SPECIFIER = "Q-municate Siri extension AdHoc"; + PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -3585,19 +5494,25 @@ }; E0CA1F541F84F78A00E9B293 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 380C6A0B58B1BD8187211951 /* Pods-QMShareExtension.debug.xcconfig */; + baseConfigurationReference = CAF70B5C04A0C1D0C4EB5E2E /* Pods-QMShareExtension.debug.xcconfig */; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES; CODE_SIGN_ENTITLEMENTS = QMShareExtension/QMShareExtension.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 8885H5G2YX; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/External", + ); GCC_C_LANGUAGE_STANDARD = gnu11; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -3606,15 +5521,36 @@ "SV_APP_EXTENSIONS=1", ); GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNINITIALIZED_AUTOS = YES; INFOPLIST_FILE = QMShareExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + OTHER_CFLAGS = ( + "$(inherited)", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Bolts/Bolts.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/FFCircularProgressView/FFCircularProgressView.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Reachability/Reachability.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel/TTTAttributedLabel.framework/Headers\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public/Firebase\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public/FirebaseAuthInterop\"", + "-DQM_SHARE_EXTENTION", + ); PRODUCT_BUNDLE_IDENTIFIER = com.quickblox.qmunicate.QMShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "0b010eea-a71f-455d-823b-3b15832bb5e8"; - PROVISIONING_PROFILE_SPECIFIER = "Q-municate Share Extension Development"; + PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -3622,20 +5558,26 @@ }; E0CA1F551F84F78A00E9B293 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AD92D3E3278E539BF388354D /* Pods-QMShareExtension.release.xcconfig */; + baseConfigurationReference = 3CB1BC82EABEC4527C5698BE /* Pods-QMShareExtension.release.xcconfig */; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES; CODE_SIGN_ENTITLEMENTS = QMShareExtension/QMShareExtension.entitlements; - CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 8885H5G2YX; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/External", + ); GCC_C_LANGUAGE_STANDARD = gnu11; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", @@ -3643,15 +5585,36 @@ "SV_APP_EXTENSIONS=1", ); GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNINITIALIZED_AUTOS = YES; INFOPLIST_FILE = QMShareExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = ( + "$(inherited)", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Bolts/Bolts.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/FFCircularProgressView/FFCircularProgressView.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Reachability/Reachability.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers\"", + "-iquote", + "\"${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel/TTTAttributedLabel.framework/Headers\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public/Firebase\"", + "-isystem", + "\"${PODS_ROOT}/Headers/Public/FirebaseAuthInterop\"", + "-DQM_SHARE_EXTENTION", + ); PRODUCT_BUNDLE_IDENTIFIER = com.quickblox.qmunicate.QMShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "4ef68bf4-5fd5-4d21-b180-dc27cacb44a6"; - PROVISIONING_PROFILE_SPECIFIER = "Q-municate Share Extension AdHoc"; + PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -3697,6 +5660,56 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + CEFBFAC721FB929900E1ECB2 /* QMOpenGraphModel.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + CEFBFAC821FB929900E1ECB2 /* QMOpenGraphModel.xcdatamodel */, + ); + currentVersion = CEFBFAC821FB929900E1ECB2 /* QMOpenGraphModel.xcdatamodel */; + path = QMOpenGraphModel.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; + CEFBFAE121FB929900E1ECB2 /* QMChatServiceModel.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + CEFBFAE221FB929900E1ECB2 /* QMModel5.xcdatamodel */, + CEFBFAE321FB929900E1ECB2 /* QMModel6.xcdatamodel */, + CEFBFAE421FB929900E1ECB2 /* QMModel3.xcdatamodel */, + CEFBFAE521FB929900E1ECB2 /* QMModel4.xcdatamodel */, + CEFBFAE621FB929900E1ECB2 /* QMModel2.xcdatamodel */, + CEFBFAE721FB929900E1ECB2 /* QMModel7.xcdatamodel */, + CEFBFAE821FB929900E1ECB2 /* QMModel.xcdatamodel */, + ); + currentVersion = CEFBFAE721FB929900E1ECB2 /* QMModel7.xcdatamodel */; + path = QMChatServiceModel.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; + CEFBFB1121FB929A00E1ECB2 /* QMUsersModel.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + CEFBFB1221FB929A00E1ECB2 /* QMUsersModel.xcdatamodel */, + CEFBFB1321FB929A00E1ECB2 /* QMUsersModel2.xcdatamodel */, + ); + currentVersion = CEFBFB1321FB929A00E1ECB2 /* QMUsersModel2.xcdatamodel */; + path = QMUsersModel.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; + CEFBFB2621FB929A00E1ECB2 /* QMContactListModel.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + CEFBFB2721FB929A00E1ECB2 /* QMModel.xcdatamodel */, + ); + currentVersion = CEFBFB2721FB929A00E1ECB2 /* QMModel.xcdatamodel */; + path = QMContactListModel.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ }; rootObject = 69D57E4A18ACC11C00A9900A /* Project object */; } diff --git a/Q-municate.xcodeproj/xcshareddata/xcschemes/Q-municate.xcscheme b/Q-municate.xcodeproj/xcshareddata/xcschemes/Q-municate.xcscheme index 19eac73d2..13de764df 100644 --- a/Q-municate.xcodeproj/xcshareddata/xcschemes/Q-municate.xcscheme +++ b/Q-municate.xcodeproj/xcshareddata/xcschemes/Q-municate.xcscheme @@ -1,6 +1,6 @@ @@ -46,8 +45,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - disableMainThreadChecker = "YES" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" @@ -67,13 +64,8 @@ - - + value = "disable" + isEnabled = "NO"> diff --git a/Q-municate.xcodeproj/xcshareddata/xcschemes/QMShareExtension.xcscheme b/Q-municate.xcodeproj/xcshareddata/xcschemes/QMShareExtension.xcscheme new file mode 100644 index 000000000..712aa180f --- /dev/null +++ b/Q-municate.xcodeproj/xcshareddata/xcschemes/QMShareExtension.xcscheme @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Q-municate.xcodeproj/xcshareddata/xcschemes/QMSiriExtension.xcscheme b/Q-municate.xcodeproj/xcshareddata/xcschemes/QMSiriExtension.xcscheme new file mode 100644 index 000000000..fde8e4f4a --- /dev/null +++ b/Q-municate.xcodeproj/xcshareddata/xcschemes/QMSiriExtension.xcscheme @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Q-municate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Q-municate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/Q-municate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Q-municate.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Q-municate.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/Q-municate.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/Q-municate/Categories/Common/NSString+QMSiriUtils.h b/Q-municate/Categories/Common/NSString+QMSiriUtils.h index 3470f3c51..c1aebc2cd 100644 --- a/Q-municate/Categories/Common/NSString+QMSiriUtils.h +++ b/Q-municate/Categories/Common/NSString+QMSiriUtils.h @@ -2,8 +2,8 @@ // NSString+QMSiriUtils.h // Q-municate // -// Created by Vitaliy Gurkovsky on 1/5/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 1/5/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Categories/Common/NSString+QMSiriUtils.m b/Q-municate/Categories/Common/NSString+QMSiriUtils.m index 6d1d7951b..c8dd5b918 100644 --- a/Q-municate/Categories/Common/NSString+QMSiriUtils.m +++ b/Q-municate/Categories/Common/NSString+QMSiriUtils.m @@ -2,8 +2,8 @@ // NSString+QMSiriUtils.m // Q-municate // -// Created by Vitaliy Gurkovsky on 1/5/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 1/5/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import "NSString+QMSiriUtils.h" diff --git a/Q-municate/Categories/Common/NSString+QMTransliterating.h b/Q-municate/Categories/Common/NSString+QMTransliterating.h index fca514c23..9c796b2a4 100644 --- a/Q-municate/Categories/Common/NSString+QMTransliterating.h +++ b/Q-municate/Categories/Common/NSString+QMTransliterating.h @@ -2,8 +2,8 @@ // NSString+QMTransliterating.h // Q-municate // -// Created by Vitaliy Gurkovsky on 1/4/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 1/4/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Categories/Common/NSString+QMTransliterating.m b/Q-municate/Categories/Common/NSString+QMTransliterating.m index d32b83d33..6a6a17d0b 100644 --- a/Q-municate/Categories/Common/NSString+QMTransliterating.m +++ b/Q-municate/Categories/Common/NSString+QMTransliterating.m @@ -2,8 +2,8 @@ // NSString+QMTransliterating.h // Q-municate // -// Created by Vitaliy Gurkovsky on 1/4/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 1/4/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import "NSString+QMTransliterating.h" diff --git a/Q-municate/Categories/NSArray/NSArray+Intersection.h b/Q-municate/Categories/NSArray/NSArray+Intersection.h index 34bfd8fef..b6000f04f 100644 --- a/Q-municate/Categories/NSArray/NSArray+Intersection.h +++ b/Q-municate/Categories/NSArray/NSArray+Intersection.h @@ -2,8 +2,8 @@ // NSArray+Intersection.h // Q-municate // -// Created by Vitaliy Gorbachov on 4/7/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 4/7/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Categories/NSArray/NSArray+Intersection.m b/Q-municate/Categories/NSArray/NSArray+Intersection.m index d8f0e4ce6..d7cc25987 100644 --- a/Q-municate/Categories/NSArray/NSArray+Intersection.m +++ b/Q-municate/Categories/NSArray/NSArray+Intersection.m @@ -2,8 +2,8 @@ // NSArray+Intersection.m // Q-municate // -// Created by Vitaliy Gorbachov on 4/7/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 4/7/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "NSArray+Intersection.h" diff --git a/Q-municate/Categories/NSString/NSString+QMValidation.h b/Q-municate/Categories/NSString/NSString+QMValidation.h index 5fae3aa31..cbca18f68 100644 --- a/Q-municate/Categories/NSString/NSString+QMValidation.h +++ b/Q-municate/Categories/NSString/NSString+QMValidation.h @@ -2,8 +2,8 @@ // NSString+QMValidation.h // Q-municate // -// Created by Vitaliy Gurkovsky on 8/25/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 8/25/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Categories/NSString/NSString+QMValidation.m b/Q-municate/Categories/NSString/NSString+QMValidation.m index 060e61a71..0f6d86d0d 100644 --- a/Q-municate/Categories/NSString/NSString+QMValidation.m +++ b/Q-municate/Categories/NSString/NSString+QMValidation.m @@ -2,8 +2,8 @@ // NSString+QMValidation.m // Q-municate // -// Created by Vitaliy Gurkovsky on 8/25/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 8/25/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import "NSString+QMValidation.h" diff --git a/Q-municate/Categories/QBChatDialog/QBChatDialog+OpponentID.h b/Q-municate/Categories/QBChatDialog/QBChatDialog+OpponentID.h index 46f980216..5c42fcf5a 100644 --- a/Q-municate/Categories/QBChatDialog/QBChatDialog+OpponentID.h +++ b/Q-municate/Categories/QBChatDialog/QBChatDialog+OpponentID.h @@ -2,10 +2,12 @@ // QBChatDialog+OpponentID.h // Q-municate // -// Created by Vitaliy Gorbachov on 5/25/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 5/25/16. +// Copyright © 2016 QuickBlox. All rights reserved. // +#import + @interface QBChatDialog (OpponentID) /** diff --git a/Q-municate/Categories/QBChatDialog/QBChatDialog+OpponentID.m b/Q-municate/Categories/QBChatDialog/QBChatDialog+OpponentID.m index 1d8f45f53..9d1558d2a 100644 --- a/Q-municate/Categories/QBChatDialog/QBChatDialog+OpponentID.m +++ b/Q-municate/Categories/QBChatDialog/QBChatDialog+OpponentID.m @@ -2,8 +2,8 @@ // QBChatDialog+OpponentID.m // Q-municate // -// Created by Vitaliy Gorbachov on 5/25/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 5/25/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QBChatDialog+OpponentID.h" diff --git a/Q-municate/Categories/QBChatMessage/QBChatMessage+QMCallNotifications.h b/Q-municate/Categories/QBChatMessage/QBChatMessage+QMCallNotifications.h index 2e20544c8..891cd56b8 100644 --- a/Q-municate/Categories/QBChatMessage/QBChatMessage+QMCallNotifications.h +++ b/Q-municate/Categories/QBChatMessage/QBChatMessage+QMCallNotifications.h @@ -2,11 +2,12 @@ // QBChatMessage+QMCallNotifications.h // Q-municate // -// Created by Vitaliy Gorbachov on 7/13/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 7/13/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import +#import typedef NS_ENUM(NSUInteger, QMCallNotificationType) { diff --git a/Q-municate/Categories/QBChatMessage/QBChatMessage+QMCallNotifications.m b/Q-municate/Categories/QBChatMessage/QBChatMessage+QMCallNotifications.m index 154019742..89d3eb250 100644 --- a/Q-municate/Categories/QBChatMessage/QBChatMessage+QMCallNotifications.m +++ b/Q-municate/Categories/QBChatMessage/QBChatMessage+QMCallNotifications.m @@ -2,8 +2,8 @@ // QBChatMessage+QMCallNotifications.m // Q-municate // -// Created by Vitaliy Gorbachov on 7/13/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 7/13/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QBChatMessage+QMCallNotifications.h" @@ -86,7 +86,7 @@ - (void)setCalleeUserIDs:(NSIndexSet *)calleeUserIDs { NSMutableString *mutableString = [[NSMutableString alloc] init]; - [calleeUserIDs enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull __unused stop) { + [calleeUserIDs enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) { [mutableString appendFormat:@"%tu,", idx]; }]; diff --git a/Q-municate/Categories/QBSettings/QBSettings+Qmunicate.h b/Q-municate/Categories/QBSettings/QBSettings+Qmunicate.h index 28f9d89df..a8b42c20e 100644 --- a/Q-municate/Categories/QBSettings/QBSettings+Qmunicate.h +++ b/Q-municate/Categories/QBSettings/QBSettings+Qmunicate.h @@ -2,17 +2,16 @@ // QBSettings+Qmunicate.h // Q-municate // -// Created by Vitaliy Gurkovsky on 11/3/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 11/3/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import typedef NS_ENUM(NSUInteger, QMApplicationZone) { QMApplicationZoneDevelopment, - QMApplicationZoneDevelopment1, QMApplicationZoneProduction, - QMApplicationZoneQA, + QMApplicationZoneQA }; static const QMApplicationZone QMCurrentApplicationZone = QMApplicationZoneProduction; diff --git a/Q-municate/Categories/QBSettings/QBSettings+Qmunicate.m b/Q-municate/Categories/QBSettings/QBSettings+Qmunicate.m index 26d27f5c6..2b02e28f3 100644 --- a/Q-municate/Categories/QBSettings/QBSettings+Qmunicate.m +++ b/Q-municate/Categories/QBSettings/QBSettings+Qmunicate.m @@ -2,65 +2,61 @@ // QBSettings+Qmunicate.m // Q-municate // -// Created by Vitaliy Gurkovsky on 11/3/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 11/3/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import "QBSettings+Qmunicate.h" @implementation QBSettings (Qmunicate) -+ (void)configure{ ++ (void)configure { switch (QMCurrentApplicationZone) { - case QMApplicationZoneDevelopment: - - QBSettings.applicationID = 36125; - QBSettings.authKey = @"gOGVNO4L9cBwkPE"; - QBSettings.authSecret = @"JdqsMHCjHVYkVxV"; - QBSettings.accountKey = @"6Qyiz3pZfNsex1Enqnp7"; - - break; - - case QMApplicationZoneDevelopment1: - - QBSettings.applicationID = 63068; - QBSettings.authKey = @"BkWsMWL3XUqJdNr"; - QBSettings.authSecret = @"bG8PFjwAx3JKFfS"; - QBSettings.accountKey = @"6Qyiz3pZfNsex1Enqnp7"; - - break; - - case QMApplicationZoneProduction: - - QBSettings.applicationID = 13318; - QBSettings.authKey = @"WzrAY7vrGmbgFfP"; - QBSettings.authSecret = @"xS2uerEveGHmEun"; - QBSettings.accountKey = @"6Qyiz3pZfNsex1Enqnp7"; - - break; - - case QMApplicationZoneQA: - - QBSettings.applicationID = 47; - QBSettings.authKey = @"7JE5cmpMwLd2S22"; - QBSettings.authSecret = @"cB4kZeJE7Cbhvg-"; - QBSettings.accountKey = @"QmXcTtxj8tTc9y3dJxRo"; - QBSettings.apiEndpoint = @"https://apistage1.quickblox.com"; - QBSettings.chatEndpoint = @"chatstage1.quickblox.com"; - - break; + case QMApplicationZoneDevelopment: { + self.applicationID = 0; + self.authKey = @""; + self.authSecret = @""; + self.accountKey = @""; + self.apiEndpoint = @""; + self.chatEndpoint = @""; + + break; + } + + case QMApplicationZoneProduction: { + + self.applicationID = 0; + self.authKey = @""; + self.authSecret = @""; + self.accountKey = @""; + self.apiEndpoint = @""; + self.chatEndpoint = @""; + + break; + } + + case QMApplicationZoneQA: { + self.applicationID = 0; + self.authKey = @""; + self.authSecret = @""; + self.accountKey = @""; + self.apiEndpoint = @""; + self.chatEndpoint = @""; + + break; + } default: break; } - QBSettings.applicationGroupIdentifier = @"group.com.quickblox.qmunicate"; - QBSettings.autoReconnectEnabled = YES; - QBSettings.carbonsEnabled = YES; + self.applicationGroupIdentifier = @"group.com.quickblox.qmunicate"; + self.autoReconnectEnabled = YES; + self.carbonsEnabled = YES; - QBSettings.logLevel = + self.logLevel = QMCurrentApplicationZone == QMApplicationZoneProduction ? QBLogLevelNothing : QBLogLevelDebug; } diff --git a/Q-municate/Categories/QBUpdateUserParameters/QBUpdateUserParameters+CustomData.h b/Q-municate/Categories/QBUpdateUserParameters/QBUpdateUserParameters+CustomData.h index a8f69b38c..d18d7bf61 100644 --- a/Q-municate/Categories/QBUpdateUserParameters/QBUpdateUserParameters+CustomData.h +++ b/Q-municate/Categories/QBUpdateUserParameters/QBUpdateUserParameters+CustomData.h @@ -2,8 +2,8 @@ // QBUpdateUserParameters+CustomData.h // Q-municate // -// Created by Vitaliy Gorbachov on 9/28/15. -// Copyright © 2015 Quickblox. All rights reserved. +// Created by Injoit on 9/28/15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Categories/QBUpdateUserParameters/QBUpdateUserParameters+CustomData.m b/Q-municate/Categories/QBUpdateUserParameters/QBUpdateUserParameters+CustomData.m index 90f286f6a..9103ff45e 100644 --- a/Q-municate/Categories/QBUpdateUserParameters/QBUpdateUserParameters+CustomData.m +++ b/Q-municate/Categories/QBUpdateUserParameters/QBUpdateUserParameters+CustomData.m @@ -2,11 +2,12 @@ // QBUpdateUserParameters+CustomData.m // Q-municate // -// Created by Vitaliy Gorbachov on 9/28/15. -// Copyright © 2015 Quickblox. All rights reserved. +// Created by Injoit on 9/28/15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import +#import NSString *const kQMAvatarUrlUpdateKey = @"avatar_url"; NSString *const kQMStatusUpdateKey = @"status"; @@ -73,9 +74,6 @@ - (void)synchronize { @implementation QBUpdateUserParameters (CustomData) -@dynamic avatarUrl; -@dynamic status; -@dynamic isImport; //MARK: - Is import diff --git a/Q-municate/Categories/UIAlertViewController/UIAlertController+QM.h b/Q-municate/Categories/UIAlertViewController/UIAlertController+QM.h index 62c048a4a..f4ac1b28a 100644 --- a/Q-municate/Categories/UIAlertViewController/UIAlertController+QM.h +++ b/Q-municate/Categories/UIAlertViewController/UIAlertController+QM.h @@ -2,8 +2,8 @@ // UIAlertController+QM.h // Q-municate // -// Created by Vitaliy Gurkovsky on 11/20/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 11/20/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Categories/UIAlertViewController/UIAlertController+QM.m b/Q-municate/Categories/UIAlertViewController/UIAlertController+QM.m index ef6d11074..850576ca5 100644 --- a/Q-municate/Categories/UIAlertViewController/UIAlertController+QM.m +++ b/Q-municate/Categories/UIAlertViewController/UIAlertController+QM.m @@ -2,8 +2,8 @@ // UIAlertController+QM.m // Q-municate // -// Created by Vitaliy Gurkovsky on 11/20/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 11/20/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import "UIAlertController+QM.h" @@ -78,7 +78,7 @@ + (instancetype)qm_alertControllerWithType:(QMAlertControllerType)type [alertController addAction:[UIAlertAction actionWithTitle:buttonTitle style:style - handler:^(UIAlertAction * _Nonnull __unused action) + handler:^(UIAlertAction * _Nonnull action) { buttonTapBlock ? buttonTapBlock() : nil; }]]; diff --git a/Q-municate/Categories/UIImage/UIImage+fixOrientation.h b/Q-municate/Categories/UIImage/UIImage+fixOrientation.h index 77ebffa30..7eb892338 100644 --- a/Q-municate/Categories/UIImage/UIImage+fixOrientation.h +++ b/Q-municate/Categories/UIImage/UIImage+fixOrientation.h @@ -3,7 +3,7 @@ // Qmunicate // // Created by Injoit on 7/2/15. -// Copyright (c) 2015 quickblox. All rights reserved. +// Copyright © 2015 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Categories/UIImage/UIImage+fixOrientation.m b/Q-municate/Categories/UIImage/UIImage+fixOrientation.m index 83a6d9df8..c5c62bece 100644 --- a/Q-municate/Categories/UIImage/UIImage+fixOrientation.m +++ b/Q-municate/Categories/UIImage/UIImage+fixOrientation.m @@ -3,7 +3,7 @@ // Qmunicate // // Created by Injoit on 7/2/15. -// Copyright (c) 2015 quickblox. All rights reserved. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "UIImage+fixOrientation.h" diff --git a/Q-municate/Categories/UIScreen/UIScreen+QMLock.h b/Q-municate/Categories/UIScreen/UIScreen+QMLock.h index ebf616d19..1888f6d08 100644 --- a/Q-municate/Categories/UIScreen/UIScreen+QMLock.h +++ b/Q-municate/Categories/UIScreen/UIScreen+QMLock.h @@ -2,8 +2,8 @@ // UIScreen+QMLock.h // Q-municate // -// Created by Vitaliy Gurkovsky on 3/22/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 3/22/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Categories/UIScreen/UIScreen+QMLock.m b/Q-municate/Categories/UIScreen/UIScreen+QMLock.m index 1ca39b4c4..1d06f4e0b 100644 --- a/Q-municate/Categories/UIScreen/UIScreen+QMLock.m +++ b/Q-municate/Categories/UIScreen/UIScreen+QMLock.m @@ -2,8 +2,8 @@ // UIScreen+QMLock.m // Q-municate // -// Created by Vitaliy Gurkovsky on 3/22/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 3/22/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import "UIScreen+QMLock.h" @@ -33,7 +33,7 @@ - (void)setQm_lockedInterfaceOrientation:(UIInterfaceOrientation)qm_lockedInterf - (void)qm_lockCurrentOrientation { - self.qm_lockedInterfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; + self.qm_lockedInterfaceOrientation = UIApplication.sharedApplication.statusBarOrientation; } - (void)qm_unlockCurrentOrientation { diff --git a/Q-municate/Categories/UIViewController/UIViewController+SmartDeselection.h b/Q-municate/Categories/UIViewController/UIViewController+SmartDeselection.h index 61d66a2a7..36569480b 100644 --- a/Q-municate/Categories/UIViewController/UIViewController+SmartDeselection.h +++ b/Q-municate/Categories/UIViewController/UIViewController+SmartDeselection.h @@ -2,8 +2,8 @@ // UIViewController+SmartDeselection.h // Q-municate // -// Created by Vitaliy Gorbachov on 5/31/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 5/31/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Categories/UIViewController/UIViewController+SmartDeselection.m b/Q-municate/Categories/UIViewController/UIViewController+SmartDeselection.m index 54276e15a..38b19713b 100644 --- a/Q-municate/Categories/UIViewController/UIViewController+SmartDeselection.m +++ b/Q-municate/Categories/UIViewController/UIViewController+SmartDeselection.m @@ -2,8 +2,8 @@ // UIViewController+SmartDeselection.m // Q-municate // -// Created by Vitaliy Gorbachov on 5/31/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 5/31/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "UIViewController+SmartDeselection.h" diff --git a/Q-municate/Classes/Common/QMActivityItem/QMActivityItem.h b/Q-municate/Classes/Common/QMActivityItem/QMActivityItem.h index 4a6bb1bee..0b946fd6f 100644 --- a/Q-municate/Classes/Common/QMActivityItem/QMActivityItem.h +++ b/Q-municate/Classes/Common/QMActivityItem/QMActivityItem.h @@ -2,8 +2,8 @@ // QMActivityItem.h // Q-municate // -// Created by Vitaliy Gurkovsky on 10/18/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 10/18/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Classes/Common/QMActivityItem/QMActivityItem.m b/Q-municate/Classes/Common/QMActivityItem/QMActivityItem.m index 371d36d70..83e32bfd5 100644 --- a/Q-municate/Classes/Common/QMActivityItem/QMActivityItem.m +++ b/Q-municate/Classes/Common/QMActivityItem/QMActivityItem.m @@ -2,13 +2,13 @@ // QMActivityItem.m // Q-municate // -// Created by Vitaliy Gurkovsky on 10/18/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 10/18/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import "QMActivityItem.h" #import -#import "QMConstants.h" +#import "QMSLog.h" @interface QMActivityItem() @@ -83,12 +83,12 @@ - (void)addItemWithTypeIdentifier:(NSString *)typeIdentifier //MARK: - UIActivityItemSource -- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)__unused activityViewController { +- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { return self.placeholderItem; } -- (nullable id)activityViewController:(UIActivityViewController *)__unused activityViewController - itemForActivityType:(nullable UIActivityType)__unused activityType { +- (nullable id)activityViewController:(UIActivityViewController *)activityViewController + itemForActivityType:(nullable UIActivityType) activityType { NSExtensionItem *item = [[NSExtensionItem alloc] init]; @@ -101,8 +101,8 @@ - (nullable id)activityViewController:(UIActivityViewController *)__unused activ [itemProvider registerItemForTypeIdentifier:typeIdentifier loadHandler:^(NSItemProviderCompletionHandler _Null_unspecified completionHandler, - Class __unused _Null_unspecified __unsafe_unretained expectedValueClass, - NSDictionary * __unused _Null_unspecified options) { + Class _Null_unspecified __unsafe_unretained expectedValueClass, + NSDictionary * _Null_unspecified options) { if (self.loadHandlerBlock) { self.loadHandlerBlock(completionHandler, activityType); } @@ -113,12 +113,12 @@ - (nullable id)activityViewController:(UIActivityViewController *)__unused activ [self.additionalTypeIdentifiers enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, QMActivityItemResultBlock _Nonnull obj, - BOOL * __unused _Nonnull stop) { + BOOL * _Nonnull stop) { [itemProvider registerItemForTypeIdentifier:key loadHandler:^(NSItemProviderCompletionHandler _Null_unspecified completionHandler, - Class __unused _Null_unspecified __unsafe_unretained expectedValueClass, - NSDictionary * __unused _Null_unspecified options) { + Class _Null_unspecified __unsafe_unretained expectedValueClass, + NSDictionary * _Null_unspecified options) { obj(completionHandler,activityType); }]; }]; @@ -128,8 +128,8 @@ - (nullable id)activityViewController:(UIActivityViewController *)__unused activ return item; } -- (NSString *)activityViewController:(UIActivityViewController *)__unused activityViewController - dataTypeIdentifierForActivityType:(NSString *)__unused activityType { +- (NSString *)activityViewController:(UIActivityViewController *)activityViewController + dataTypeIdentifierForActivityType:(NSString *)activityType { return self.typeIdentifier; } @@ -164,7 +164,7 @@ - (NSString *)activityViewController:(UIActivityViewController *)__unused activi } - (void)dealloc { - ILog(@"%@ - %@", NSStringFromSelector(_cmd), self); + QMSLog(@"%@ - %@", NSStringFromSelector(_cmd), self); } @end diff --git a/Q-municate/Classes/Common/QMExtensionCache/QMExtensionCache.h b/Q-municate/Classes/Common/QMExtensionCache/QMExtensionCache.h index 4c24b75a1..58114ca8d 100644 --- a/Q-municate/Classes/Common/QMExtensionCache/QMExtensionCache.h +++ b/Q-municate/Classes/Common/QMExtensionCache/QMExtensionCache.h @@ -2,13 +2,17 @@ // QMExtensionCache.h // QMShareExtension // -// Created by Vitaliy Gurkovsky on 10/5/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 10/5/17. +// Copyright © 2017 QuickBlox. All rights reserved. // -#import "QMServices.h" +//#import "QMServices.h" #import +#import +#import "QMContactListCache.h" +#import "QMChatCache.h" +#import "QMUsersCache.h" @interface QMExtensionCache : NSObject diff --git a/Q-municate/Classes/Common/QMExtensionCache/QMExtensionCache.m b/Q-municate/Classes/Common/QMExtensionCache/QMExtensionCache.m index bdf352770..e97914e32 100644 --- a/Q-municate/Classes/Common/QMExtensionCache/QMExtensionCache.m +++ b/Q-municate/Classes/Common/QMExtensionCache/QMExtensionCache.m @@ -2,8 +2,8 @@ // QMExtensionCache.m // QMShareExtension // -// Created by Vitaliy Gurkovsky on 10/5/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 10/5/17. +// Copyright © 2017 QuickBlox. All rights reserved. // diff --git a/Q-municate/Classes/Common/QMINPersonProtocol.h b/Q-municate/Classes/Common/QMINPersonProtocol.h index ef05fe5cc..80bc98f79 100644 --- a/Q-municate/Classes/Common/QMINPersonProtocol.h +++ b/Q-municate/Classes/Common/QMINPersonProtocol.h @@ -2,8 +2,8 @@ // QMINPersonProtocol.h // Q-municate // -// Created by Vitaliy Gurkovsky on 1/4/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 1/4/17. +// Copyright © 2017 QuickBlox. All rights reserved. // @class INPerson; diff --git a/Q-municate/Classes/Core/QMCallManager/QMCallManager.h b/Q-municate/Classes/Core/QMCallManager/QMCallManager.h index 4831e9945..1bc26f47c 100644 --- a/Q-municate/Classes/Core/QMCallManager/QMCallManager.h +++ b/Q-municate/Classes/Core/QMCallManager/QMCallManager.h @@ -2,8 +2,8 @@ // QMCallManager.h // Q-municate // -// Created by Vitaliy Gorbachov on 5/10/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 5/10/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMBaseService.h" diff --git a/Q-municate/Classes/Core/QMCallManager/QMCallManager.m b/Q-municate/Classes/Core/QMCallManager/QMCallManager.m index b8f6a814e..13540eb72 100644 --- a/Q-municate/Classes/Core/QMCallManager/QMCallManager.m +++ b/Q-municate/Classes/Core/QMCallManager/QMCallManager.m @@ -2,8 +2,8 @@ // QMCallManager.m // Q-municate // -// Created by Vitaliy Gorbachov on 5/10/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 5/10/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMCallManager.h" @@ -141,7 +141,7 @@ - (void)callToUserWithID:(NSUInteger)userID conferenceType:(QBRTCConferenceType) [self prepareCallWindow]; - self.callWindow.rootViewController = [QMCallViewController callControllerWithState:callState]; + self.callWindow.rootViewController = [QMCallViewController callControllerWithState:callState roleState:callState]; [self.session startCall:nil]; self.hasActiveCall = YES; @@ -155,7 +155,7 @@ - (void)callToUserWithID:(NSUInteger)userID conferenceType:(QBRTCConferenceType) - (void)prepareCallWindow { // hiding keyboard - [[UIApplication sharedApplication].keyWindow endEditing:YES]; + [UIApplication.sharedApplication.keyWindow endEditing:YES]; self.callWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; @@ -212,8 +212,9 @@ - (QBUUser *)opponentUser { // MARK: - Methods - (void)performCallKitPreparations { - UIApplication *application = [UIApplication sharedApplication]; - if (application.applicationState == UIApplicationStateBackground) { + UIApplication *application = UIApplication.sharedApplication; + if (UIApplication.sharedApplication.applicationState == UIApplicationStateBackground || + UIApplication.sharedApplication.applicationState == UIApplicationStateInactive) { if (_backgroundTask == UIBackgroundTaskInvalid) { _backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{ [application endBackgroundTask:self.backgroundTask]; @@ -296,7 +297,7 @@ - (void)chatDidConnect { } } -- (void)chatDidNotConnectWithError:(NSError *)__unused error { +- (void)chatDidNotConnectWithError:(NSError *)error { if (self.onChatConnectedAction != nil) { self.onChatConnectedAction = nil; } @@ -304,7 +305,7 @@ - (void)chatDidNotConnectWithError:(NSError *)__unused error { // MARK: - QBRTCClientDelegate -- (void)didReceiveNewSession:(QBRTCSession *)session userInfo:(NSDictionary *)__unused userInfo { +- (void)didReceiveNewSession:(QBRTCSession *)session userInfo:(NSDictionary *)userInfo { if (self.session != nil) { // session in progress @@ -337,9 +338,10 @@ - (void)didReceiveNewSession:(QBRTCSession *)session userInfo:(NSDictionary *)__ @strongify(self); // initializing controller QMCallState callState = session.conferenceType == QBRTCConferenceTypeVideo ? QMCallStateActiveVideoCall : QMCallStateActiveAudioCall; + QMCallState roleState = session.conferenceType == QBRTCConferenceTypeVideo ? QMCallStateIncomingVideoCall : QMCallStateIncomingAudioCall; [self prepareCallWindow]; - self.callWindow.rootViewController = [QMCallViewController callControllerWithState:callState]; + self.callWindow.rootViewController = [QMCallViewController callControllerWithState:callState roleState:roleState]; } completion:nil]; } @@ -350,16 +352,16 @@ - (void)didReceiveNewSession:(QBRTCSession *)session userInfo:(NSDictionary *)__ QMCallState callState = session.conferenceType == QBRTCConferenceTypeVideo ? QMCallStateIncomingVideoCall : QMCallStateIncomingAudioCall; [self prepareCallWindow]; - self.callWindow.rootViewController = [QMCallViewController callControllerWithState:callState]; + self.callWindow.rootViewController = [QMCallViewController callControllerWithState:callState roleState:callState]; } } -- (void)session:(QBRTCSession *)__unused session updatedStatsReport:(QBRTCStatsReport *)report forUserID:(NSNumber *)userID { +- (void)session:(QBRTCSession *)session updatedStatsReport:(QBRTCStatsReport *)report forUserID:(NSNumber *)userID { - ILog(@"Stats report for userID: %@\n%@", userID, [report statsString]); + QMSLog(@"Stats report for userID: %@\n%@", userID, [report statsString]); } -- (void)session:(QBRTCSession *)session connectedToUser:(NSNumber *)__unused userID { +- (void)session:(QBRTCSession *)session connectedToUser:(NSNumber *)userID { if (self.session == session) { // stopping calling sounds @@ -389,7 +391,7 @@ - (void)sessionDidClose:(QBRTCSession *)session { } if (_backgroundTask != UIBackgroundTaskInvalid) { - [[UIApplication sharedApplication] endBackgroundTask:_backgroundTask]; + [UIApplication.sharedApplication endBackgroundTask:_backgroundTask]; _backgroundTask = UIBackgroundTaskInvalid; } @@ -400,8 +402,9 @@ - (void)sessionDidClose:(QBRTCSession *)session { } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground - && self.backgroundTask == UIBackgroundTaskInvalid) { + if ((UIApplication.sharedApplication.applicationState == UIApplicationStateBackground || + UIApplication.sharedApplication.applicationState == UIApplicationStateInactive) && + self.backgroundTask == UIBackgroundTaskInvalid) { // dispatching chat disconnect in 1.5 second so message about call end // from webrtc does not cut mid sending (ideally webrtc should wait // untill message about hangup did send, which is not the case now) @@ -609,28 +612,29 @@ - (void)showAlertWithTitle:(NSString *)title message:(NSString *)message { [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"QM_STR_CANCEL", nil) style:UIAlertActionStyleCancel - handler:^(UIAlertAction * _Nonnull __unused action) { + handler:^(UIAlertAction * _Nonnull action) { }]]; [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"QM_STR_SETTINGS", nil) style:UIAlertActionStyleDefault - handler:^(UIAlertAction * _Nonnull __unused action) { + handler:^(UIAlertAction * _Nonnull action) { - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; + [UIApplication.sharedApplication openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; }]]; - UIViewController *viewController = [[[(UISplitViewController *)[UIApplication sharedApplication].keyWindow.rootViewController viewControllers] firstObject] selectedViewController]; + UIViewController *viewController = [[[(UISplitViewController *)UIApplication.sharedApplication.keyWindow.rootViewController viewControllers] firstObject] selectedViewController]; [viewController presentViewController:alertController animated:YES completion:nil]; } - (void)checkBackgroundActiveCall { - BOOL isBackground = [UIApplication sharedApplication].applicationState == UIApplicationStateBackground; + BOOL isBackground = (UIApplication.sharedApplication.applicationState == UIApplicationStateBackground || + UIApplication.sharedApplication.applicationState == UIApplicationStateInactive); if (isBackground && !self.hasActiveCall) { if (_backgroundTask != UIBackgroundTaskInvalid) { - [[UIApplication sharedApplication] endBackgroundTask:_backgroundTask]; + [UIApplication.sharedApplication endBackgroundTask:_backgroundTask]; _backgroundTask = UIBackgroundTaskInvalid; } diff --git a/Q-municate/Classes/Core/QMCallManager/QMCallViewDelegate.h b/Q-municate/Classes/Core/QMCallManager/QMCallViewDelegate.h index a0350d4a0..48578ce25 100644 --- a/Q-municate/Classes/Core/QMCallManager/QMCallViewDelegate.h +++ b/Q-municate/Classes/Core/QMCallManager/QMCallViewDelegate.h @@ -2,8 +2,8 @@ // QMCallViewDelegate.h // Q-municate // -// Created by Vitaliy Gurkovsky on 2/25/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 2/25/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Classes/Core/QMCallManager/QMCallWindow.h b/Q-municate/Classes/Core/QMCallManager/QMCallWindow.h index 29d82e6c5..e6a5d4daf 100644 --- a/Q-municate/Classes/Core/QMCallManager/QMCallWindow.h +++ b/Q-municate/Classes/Core/QMCallManager/QMCallWindow.h @@ -2,8 +2,8 @@ // QMCallWindow.h // Q-municate // -// Created by Vitaliy Gurkovsky on 2/25/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 2/25/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Classes/Core/QMCallManager/QMCallWindow.m b/Q-municate/Classes/Core/QMCallManager/QMCallWindow.m index 1a33124d3..64f645e82 100644 --- a/Q-municate/Classes/Core/QMCallManager/QMCallWindow.m +++ b/Q-municate/Classes/Core/QMCallManager/QMCallWindow.m @@ -2,8 +2,8 @@ // QMCallWindow.m // Q-municate // -// Created by Vitaliy Gurkovsky on 2/25/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 2/25/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import "QMCallWindow.h" @@ -57,7 +57,7 @@ @implementation QMCallWindow // break; // } //} -//- (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event { +//- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // // // See if the hit is anywhere in our view hierarchy // UIView *hitTestResult = [super hitTest:point withEvent:event]; diff --git a/Q-municate/Classes/Core/QMChatManager/QMChatManager.h b/Q-municate/Classes/Core/QMChatManager/QMChatManager.h index c8b70e32a..76c0bee56 100644 --- a/Q-municate/Classes/Core/QMChatManager/QMChatManager.h +++ b/Q-municate/Classes/Core/QMChatManager/QMChatManager.h @@ -2,8 +2,8 @@ // QMChatManager.h // Q-municate // -// Created by Vitaliy Gorbachov on 4/8/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 4/8/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMBaseService.h" diff --git a/Q-municate/Classes/Core/QMChatManager/QMChatManager.m b/Q-municate/Classes/Core/QMChatManager/QMChatManager.m index 3324627b3..76707a060 100644 --- a/Q-municate/Classes/Core/QMChatManager/QMChatManager.m +++ b/Q-municate/Classes/Core/QMChatManager/QMChatManager.m @@ -2,8 +2,8 @@ // QMChatManager.m // Q-municate // -// Created by Vitaliy Gorbachov on 4/8/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 4/8/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMChatManager.h" @@ -25,7 +25,7 @@ @implementation QMChatManager - (BFTask *)disconnectFromChat { - return [[self.serviceManager.chatService disconnect] continueWithSuccessBlock:^id _Nullable(BFTask * _Nonnull __unused task) { + return [[self.serviceManager.chatService disconnect] continueWithSuccessBlock:^id _Nullable(BFTask * _Nonnull task) { if (self.serviceManager.currentProfile.userData != nil) { @@ -40,7 +40,9 @@ - (BFTask *)disconnectFromChat { - (BFTask *)disconnectFromChatIfNeeded { BOOL chatNeedDisconnect = [[QBChat instance] isConnected] || [[QBChat instance] isConnecting]; - if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground && !self.serviceManager.callManager.hasActiveCall && chatNeedDisconnect) { + if ((UIApplication.sharedApplication.applicationState == UIApplicationStateBackground || + UIApplication.sharedApplication.applicationState == UIApplicationStateInactive) && + !self.serviceManager.callManager.hasActiveCall && chatNeedDisconnect) { return [self disconnectFromChat]; } @@ -108,7 +110,7 @@ - (BFTask *)leaveChatDialog:(QBChatDialog *)chatDialog { return [[self.serviceManager.chatService sendNotificationMessageAboutLeavingDialog:chatDialog withNotificationText:kQMDialogsUpdateNotificationMessage] - continueWithBlock:^id(BFTask *__unused task) { + continueWithBlock:^id(BFTask * task) { return [self.serviceManager.chatService deleteDialogWithID:chatDialog.ID]; }]; } @@ -124,7 +126,7 @@ - (BFTask *)sendBackgroundMessageWithText:(NSString *)text toDialogWithID:(NSStr BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - [QBRequest sendMessage:message successBlock:^(QBResponse * __unused response, QBChatMessage *createdMessage) { + [QBRequest sendMessage:message successBlock:^(QBResponse * response, QBChatMessage *createdMessage) { [source setResult:createdMessage]; diff --git a/Q-municate/Classes/Core/QMContactManager/QMContactManager.h b/Q-municate/Classes/Core/QMContactManager/QMContactManager.h index 65443daf8..7f9991d83 100644 --- a/Q-municate/Classes/Core/QMContactManager/QMContactManager.h +++ b/Q-municate/Classes/Core/QMContactManager/QMContactManager.h @@ -2,8 +2,8 @@ // QMContactsManager.h // Q-municate // -// Created by Vitaliy Gorbachov on 3/25/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 3/25/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMBaseService.h" diff --git a/Q-municate/Classes/Core/QMContactManager/QMContactManager.m b/Q-municate/Classes/Core/QMContactManager/QMContactManager.m index 4a4ef89ce..770443342 100644 --- a/Q-municate/Classes/Core/QMContactManager/QMContactManager.m +++ b/Q-municate/Classes/Core/QMContactManager/QMContactManager.m @@ -2,15 +2,15 @@ // QMContactManager.m // Q-municate // -// Created by Vitaliy Gorbachov on 3/25/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 3/25/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMContactManager.h" #import "QMCore.h" #import "QMNotification.h" #import "QMMessagesHelper.h" -#import +#import "QMDateUtils.h" @interface QMContactManager () @@ -41,7 +41,7 @@ - (BFTask *)addUserToContactList:(QBUUser *)user { else { return [[[self.serviceManager.contactListService addUserToContactListRequest:user] - continueWithSuccessBlock:^id _Nullable(BFTask * _Nonnull __unused task) { + continueWithSuccessBlock:^id _Nullable(BFTask * _Nonnull task) { return [self.serviceManager.chatService createPrivateChatDialogWithOpponent:user]; @@ -62,7 +62,7 @@ - (BFTask *)addUserToContactList:(QBUUser *)user { - (BFTask *)confirmAddContactRequest:(QBUUser *)user { return [[self.serviceManager.contactListService acceptContactRequest:user.ID] - continueWithSuccessBlock:^id(BFTask *__unused task) { + continueWithSuccessBlock:^id(BFTask * task) { return [self.serviceManager.chatService sendMessageAboutAcceptingContactRequest:YES toOpponentID:user.ID]; }]; @@ -71,7 +71,7 @@ - (BFTask *)confirmAddContactRequest:(QBUUser *)user { - (BFTask *)rejectAddContactRequest:(QBUUser *)user { return [[self.serviceManager.contactListService rejectContactRequest:user.ID] - continueWithSuccessBlock:^id(BFTask *__unused task) { + continueWithSuccessBlock:^id(BFTask * task) { return [self.serviceManager.chatService sendMessageAboutAcceptingContactRequest:NO toOpponentID:user.ID]; }]; @@ -82,7 +82,7 @@ - (BFTask *)removeUserFromContactList:(QBUUser *)user { __block QBChatDialog *chatDialog = nil; return [[[[self.serviceManager.contactListService removeUserFromContactListWithUserID:user.ID] - continueWithSuccessBlock:^id(BFTask *__unused task) { + continueWithSuccessBlock:^id(BFTask * task) { return [self.serviceManager.chatService createPrivateChatDialogWithOpponent:user]; @@ -97,7 +97,7 @@ - (BFTask *)removeUserFromContactList:(QBUUser *)user { saveToHistory:YES saveToStorage:NO]; - }] continueWithBlock:^id _Nullable(BFTask * __unused t) { + }] continueWithBlock:^id _Nullable(BFTask * t) { return [self.serviceManager.chatService deleteDialogWithID:chatDialog.ID]; }]; diff --git a/Q-municate/Classes/Core/QMCore/QMCore.h b/Q-municate/Classes/Core/QMCore/QMCore.h index b86502181..216991bfa 100644 --- a/Q-municate/Classes/Core/QMCore/QMCore.h +++ b/Q-municate/Classes/Core/QMCore/QMCore.h @@ -2,11 +2,12 @@ // QMCore.h // Q-municate // -// Created by Vitaliy Gorbachov on 1/8/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 1/8/16. +// Copyright © 2016 QuickBlox. All rights reserved. // -#import "QMServicesManager.h" +#import +#import "QMServices.h" #import "QMProfile.h" diff --git a/Q-municate/Classes/Core/QMCore/QMCore.m b/Q-municate/Classes/Core/QMCore/QMCore.m index 06b2c75a8..59f477af9 100644 --- a/Q-municate/Classes/Core/QMCore/QMCore.m +++ b/Q-municate/Classes/Core/QMCore/QMCore.m @@ -2,23 +2,25 @@ // QMCore.m // Q-municate // -// Created by Vitaliy Gorbachov on 1/8/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 1/8/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMCore.h" -#import #import "QMFacebook.h" #import "QMNotification.h" #import "QMTasks.h" -#import +#import "SVProgressHUD.h" #import "QMImageLoader.h" #import "QMCallManager.h" -#import #import "NSString+QMTransliterating.h" -#import +#import #import +#import +#import + + static NSString *const kQMLastActivityDateKey = @"last_activity_date"; static NSString *const kQMErrorKey = @"errors"; @@ -96,7 +98,7 @@ - (void)configureReachability { // setting reachable block @weakify(self); - [_internetConnection setReachableBlock:^(Reachability __unused *reachability) { + [_internetConnection setReachableBlock:^(Reachability *reachability) { @strongify(self); dispatch_async(dispatch_get_main_queue(), ^{ @@ -106,7 +108,7 @@ - (void)configureReachability { }]; // setting unreachable block - [_internetConnection setUnreachableBlock:^(Reachability __unused *reachability) { + [_internetConnection setUnreachableBlock:^(Reachability *reachability) { dispatch_async(dispatch_get_main_queue(), ^{ // reachability block could possibly be called in background thread @@ -159,7 +161,7 @@ - (void)handleErrorResponse:(QBResponse *)response { NSString *errorMessage = nil; - if (![self isInternetConnected]) { + if (![self isInternetConnected] || response.status == NSURLErrorTimedOut) { errorMessage = NSLocalizedString(@"QM_STR_CHECK_INTERNET_CONNECTION", nil); } @@ -233,13 +235,13 @@ - (BFTask *)logout { [[FIRAuth auth] signOut:nil]; } [self.currentProfile clearProfile]; - - [[QMImageLoader instance].imageCache clearDiskOnCompletion:^{ - [[QMImageLoader instance].imageCache clearMemory]; + SDImageCache *qmCache = (SDImageCache *)[QMImageLoader instance].imageCache; + [qmCache clearDiskOnCompletion:^{ + [qmCache clearMemory]; }]; - [[self.pushNotificationManager unregisterFromPushNotificationsAndUnsubscribe:YES] - continueWithBlock:^id(BFTask * __unused t) + [[self.pushNotificationManager unregisterFromAllNotificationsAndUnsubscribe] + continueWithBlock:^id(BFTask * t) { [super logoutWithCompletion:^{ [source setResult:nil]; @@ -260,11 +262,11 @@ - (void)cachedContactListItems:(QMCacheCollection)block { //MARK: - QMChatServiceDelegate -- (void)chatService:(QMChatService *)__unused chatService didAddChatDialogsToMemoryStorage:(NSArray *)chatDialogs { +- (void)chatService:(QMChatService *)chatService didAddChatDialogsToMemoryStorage:(NSArray *)chatDialogs { [super chatService:chatService didAddChatDialogsToMemoryStorage:chatDialogs]; - NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatDialog *_Nullable dialog, NSDictionary *__unused _Nullable bindings) { + NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatDialog *_Nullable dialog, NSDictionary * _Nullable bindings) { return dialog.type == QBChatDialogTypeGroup && dialog.name.length; }]; @@ -299,7 +301,7 @@ - (void)chatService:(QMChatService *)chatService didDeleteChatDialogWithIDFromMe //MARK: - QMContactListServiceDelegate -- (void)contactListService:(QMContactListService *)__unused contactListService +- (void)contactListService:(QMContactListService *)contactListService contactListDidChange:(QBContactList *)contactList { [[QMContactListCache instance] insertOrUpdateContactListItemsWithContactList:contactList completion:nil]; @@ -309,12 +311,12 @@ - (void)contactListService:(QMContactListService *)__unused contactListService return; } - [[self.usersService getUsersWithIDs:IDs] continueWithSuccessBlock:^id _Nullable(BFTask *> * _Nonnull t) { + [[self.usersService getUsersWithIDs:IDs] continueWithSuccessBlock:^id(BFTask *> *t) { NSParameterAssert(IDs.count == t.result.count); NSPredicate *predicate = - [NSPredicate predicateWithBlock:^BOOL(QBUUser *user, NSDictionary *__unused bindings) { + [NSPredicate predicateWithBlock:^BOOL(QBUUser *user, NSDictionary * bindings) { return user.fullName.length > 0; }]; @@ -338,14 +340,14 @@ - (nullable QMOpenGraphItem *)cachedOpenGraphItemWithID:(NSString *)ID { //MARK:QMOpenGraphServiceDelegate -- (void)openGraphSerivce:(QMOpenGraphService *) __unused openGraphSerivce +- (void)openGraphSerivce:(QMOpenGraphService *)openGraphSerivce didAddOpenGraphItemToMemoryStorage:(QMOpenGraphItem *)openGraphItem { [QMOpenGraphCache.instance insertOrUpdateOpenGraphItem:openGraphItem completion:nil]; } -- (void)openGraphSerivce:(QMOpenGraphService *) __unused openGraphSerivce +- (void)openGraphSerivce:(QMOpenGraphService *)openGraphSerivce hasFaviconURL:(NSURL *)url completion:(dispatch_block_t)completion { @@ -353,17 +355,17 @@ - (void)openGraphSerivce:(QMOpenGraphService *) __unused openGraphSerivce transform:nil options:SDWebImageHighPriority progress:nil - completed:^(UIImage * __unused image, - UIImage * __unused transfomedImage, - NSError * __unused error, - SDImageCacheType __unused cacheType, - BOOL __unused finished, - NSURL * __unused imageURL) { + completed:^(UIImage * image, + UIImage * transfomedImage, + NSError * error, + SDImageCacheType cacheType, + BOOL finished, + NSURL * imageURL) { completion(); }]; } -- (void)openGraphSerivce:(QMOpenGraphService *)__unused openGraphSerivce +- (void)openGraphSerivce:(QMOpenGraphService *)openGraphSerivce hasImageURL:(NSURL *)url completion:(dispatch_block_t)completion { @@ -371,12 +373,12 @@ - (void)openGraphSerivce:(QMOpenGraphService *)__unused openGraphSerivce transform:nil options:SDWebImageHighPriority progress:nil - completed:^(UIImage * __unused image, - UIImage * __unused transfomedImage, - NSError * __unused error, - SDImageCacheType __unused cacheType, - BOOL __unused finished, - NSURL * __unused imageURL) { + completed:^(UIImage * image, + UIImage * transfomedImage, + NSError * error, + SDImageCacheType cacheType, + BOOL finished, + NSURL * imageURL) { completion(); }]; } @@ -397,7 +399,7 @@ - (void)updateVocabulary { if (self.cachedVocabularyStrings.count > 0) { - NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(NSString * _Nullable string, NSDictionary *__unused _Nullable bindings) { + NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(NSString * _Nullable string, NSDictionary * _Nullable bindings) { return ![string canBeConvertedToEncoding:NSISOLatin1StringEncoding]; }]; @@ -416,17 +418,17 @@ - (void)updateVocabulary { } } -- (void)authServiceDidLogOut:(QMAuthService *)__unused authService { +- (void)authServiceDidLogOut:(QMAuthService *)authService { NSParameterAssert(QBSession.currentSession.tokenHasExpired == YES); NSParameterAssert(QBSession.currentSession.sessionDetails.token == nil); } -- (void)authService:(QMAuthService *)__unused authService - didLoginWithUser:(QBUUser *)__unused user { +- (void)authService:(QMAuthService *)authService + didLoginWithUser:(QBUUser *)user { if (iosMajorVersion() > 9) { - [INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus __unused status) { + [INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) { }]; } diff --git a/Q-municate/Classes/Core/QMCore/QMLog.h b/Q-municate/Classes/Core/QMCore/QMLog.h deleted file mode 100644 index adec00909..000000000 --- a/Q-municate/Classes/Core/QMCore/QMLog.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// QMLog.h -// Q-municate -// -// Created by Vitaliy Gurkovsky on 8/10/17. -// Copyright © 2017 Quickblox. All rights reserved. -// - -#import - -#ifdef __cplusplus -extern "C" { -#endif - - void QMLogSetEnabled(BOOL enabled); - BOOL QMLogEnabled(void); - void QMLog(NSString *format, ...); - -#ifdef __cplusplus -} -#endif diff --git a/Q-municate/Classes/Core/QMCore/QMLog.m b/Q-municate/Classes/Core/QMCore/QMLog.m deleted file mode 100644 index b54a158e6..000000000 --- a/Q-municate/Classes/Core/QMCore/QMLog.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// QMLog.m -// Q-municate -// -// Created by Vitaliy Gurkovsky on 8/10/17. -// Copyright © 2017 Quickblox. All rights reserved. -// - -#import "QMLog.h" - -static BOOL logEnabled = YES; - -void QMLogSetEnabled(BOOL enabled) -{ - logEnabled = enabled; -} - -BOOL QMLogEnabled() -{ - return logEnabled; -} - -void QMLog(NSString *format, ...) -{ - if (logEnabled) - { - va_list L; - va_start(L, format); - @autoreleasepool { - NSLogv(format, L); - } - va_end(L); - } -} - diff --git a/Q-municate/Classes/Core/QMPushNotificationManager/QMPushNotificationManager.h b/Q-municate/Classes/Core/QMPushNotificationManager/QMPushNotificationManager.h index 512e46941..4e96b0e02 100644 --- a/Q-municate/Classes/Core/QMPushNotificationManager/QMPushNotificationManager.h +++ b/Q-municate/Classes/Core/QMPushNotificationManager/QMPushNotificationManager.h @@ -2,8 +2,8 @@ // QMPushNotificationManager.h // Q-municate // -// Created by Vitaliy Gorbachov on 5/10/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 5/10/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMBaseService.h" @@ -91,11 +91,18 @@ NS_ASSUME_NONNULL_BEGIN - (nullable BFTask *)subscribeForPushNotifications; /** - * Unsubscribe from push notifications. + * Unregister from push notifications. * * @return BFTask with result */ -- (BFTask *)unSubscribeFromPushNotifications; +- (BFTask *)unregisterFromPushNotificationsAndUnsubscribe; + +/** + * Unregister and unsubscribe from push and voip notifications. + * + * @return BFTask with result + */ +- (BFTask *)unregisterFromAllNotificationsAndUnsubscribe; /** * Handle push notification with delegate. @@ -107,7 +114,6 @@ NS_ASSUME_NONNULL_BEGIN - (BFTask *)registerAndSubscribeForPushNotifications; -- (BFTask *)unregisterFromPushNotificationsAndUnsubscribe:(BOOL)shouldUnsubscribe; - (void)handleActionWithIdentifier:(NSString *)identifier remoteNotification:(NSDictionary *)userInfo diff --git a/Q-municate/Classes/Core/QMPushNotificationManager/QMPushNotificationManager.m b/Q-municate/Classes/Core/QMPushNotificationManager/QMPushNotificationManager.m index 254faeee1..94ecc7e87 100644 --- a/Q-municate/Classes/Core/QMPushNotificationManager/QMPushNotificationManager.m +++ b/Q-municate/Classes/Core/QMPushNotificationManager/QMPushNotificationManager.m @@ -2,8 +2,8 @@ // QMPushNotificationManager.m // Q-municate // -// Created by Vitaliy Gorbachov on 5/10/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 5/10/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMPushNotificationManager.h" @@ -22,32 +22,110 @@ @interface QMPushNotificationManager () @property (weak, nonatomic) QMCore *serviceManager; @property (copy, nonatomic) QBTokenCompletionBlock tokenCompletionBlock; @property (copy, nonatomic, nullable, readwrite) NSData *deviceToken; +@property (nonatomic, strong) NSMutableSet*subscriptions; @property (strong, nonatomic) PKPushRegistry *voipRegistry; -@property (assign, nonatomic) NSUInteger voipSubscriptionID; @end @implementation QMPushNotificationManager - @dynamic serviceManager; -- (BFTask *)unregisterFromPushNotificationsAndUnsubscribe:(BOOL)shouldUnsubscribe { - +- (NSMutableSet *)subscriptions { + if (!_subscriptions) { + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSData *data = [defaults objectForKey:@"_subscriptions"]; + NSMutableSet *subscriptions = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + _subscriptions = subscriptions ?: [NSMutableSet set]; + } + return _subscriptions; +} + +- (void)synchronizeSubscriptions { + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.subscriptions]; + [defaults setObject:data forKey:@"_subscriptions"]; + [defaults synchronize]; +} + +- (BFTask *)unregisterFromAllNotificationsAndUnsubscribe { BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - [[UIApplication sharedApplication] unregisterForRemoteNotifications]; + [UIApplication.sharedApplication unregisterForRemoteNotifications]; + + self.voipRegistry = nil; + + dispatch_group_t serviceGroup = dispatch_group_create(); + NSSet*subscriptions = self.subscriptions.copy; + for (QBMSubscription *subscription in subscriptions) { + dispatch_group_enter(serviceGroup); + NSString *chanel = subscription.notificationChannel == + QBMNotificationChannelAPNSVOIP ? @"VOIP" : @"PUSH"; + [NSString stringWithFormat:@"Unregister %@ Subscription request", chanel]; + [QBRequest deleteSubscriptionWithID:subscription.ID + successBlock:^(QBResponse * response) { + QMSLog([chanel stringByAppendingString:@" - Success"]); + dispatch_group_leave(serviceGroup); + } errorBlock:^(QBResponse *response) { + NSString *errorMessage = [NSString stringWithFormat:@" - Error: %@", + [response.error reasons]]; + QMSLog([chanel stringByAppendingString:errorMessage]); + dispatch_group_leave(serviceGroup); + }]; + + } + @weakify(self); + dispatch_group_notify(serviceGroup,dispatch_get_main_queue(),^{ + @strongify(self); + [self.subscriptions removeAllObjects]; + [self synchronizeSubscriptions]; + [source setResult:nil]; + }); + + return source.task; +} + +- (BFTask *)unregisterFromPushNotificationsAndUnsubscribe { - if (shouldUnsubscribe) { - self.voipRegistry = nil; - [[self unSubscribeFromPushNotifications] continueWithBlock:^id _Nullable(BFTask * __unused _Nonnull t) { - [source setResult:nil]; - return nil; - }]; + BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; + + dispatch_group_t serviceGroup = dispatch_group_create(); + NSSet*subscriptions = self.subscriptions.copy; + NSString *deviceIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; + NSMutableArray *toDelete = @[].mutableCopy; + for (QBMSubscription *subscription in subscriptions) { + if (subscription.notificationChannel != QBMNotificationChannelAPNS || + ![subscription.deviceUDID isEqualToString:deviceIdentifier]) { + continue; + } + dispatch_group_enter(serviceGroup); + NSString *chanel = @"PUSH"; + [NSString stringWithFormat:@"Unregister %@ Subscription request", chanel]; + [QBRequest deleteSubscriptionWithID:subscription.ID + successBlock:^(QBResponse * response) { + [UIApplication.sharedApplication unregisterForRemoteNotifications]; + QMSLog([chanel stringByAppendingString:@" - Success"]); + [toDelete addObject:subscription]; + dispatch_group_leave(serviceGroup); + } errorBlock:^(QBResponse *response) { + [UIApplication.sharedApplication unregisterForRemoteNotifications]; + NSString *errorMessage = [NSString stringWithFormat:@" - Error: %@", + [response.error reasons]]; + QMSLog([chanel stringByAppendingString:errorMessage]); + [toDelete addObject:subscription]; + dispatch_group_leave(serviceGroup); + }]; + } - else { + @weakify(self); + dispatch_group_notify(serviceGroup,dispatch_get_main_queue(),^{ + @strongify(self); + for (QBMSubscription *subscription in toDelete) { + [self.subscriptions removeObject:subscription]; + } + [self synchronizeSubscriptions]; [source setResult:nil]; - } + }); return source.task; } @@ -97,30 +175,21 @@ - (BFTask *)subscribeForPushNotifications { subscription.deviceUDID = deviceIdentifier; subscription.deviceToken = self.deviceToken; - [QBRequest createSubscription:subscription successBlock:^(QBResponse * _Nonnull __unused response, NSArray * _Nullable __unused objects) { - - subscription.deviceToken = self.deviceToken; - [source setResult:subscription]; - - } errorBlock:^(QBResponse * _Nonnull response) { - [source setError:response.error.error]; - }]; - - return source.task; -} - -- (BFTask *)unSubscribeFromPushNotifications { - - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - NSString *deviceIdentifier = [UIDevice currentDevice].identifierForVendor.UUIDString; - [QBRequest unregisterSubscriptionForUniqueDeviceIdentifier:deviceIdentifier - successBlock:^(QBResponse * _Nonnull __unused response) - { - [source setResult:nil]; - } errorBlock:^(QBError * _Nullable error) { - [source setError:error.error]; - }]; + @weakify(self); + [QBRequest createSubscription:subscription + successBlock:^(QBResponse * _Nonnull response, + NSArray * _Nullable objects) { + @strongify(self); + for (QBMSubscription *subscription in objects) { + if ([subscription.deviceUDID isEqualToString:deviceIdentifier]) { + [self.subscriptions addObject:subscription]; + } + } + [self synchronizeSubscriptions]; + [source setResult:subscription]; + } errorBlock:^(QBResponse * _Nonnull response) { + [source setError:response.error.error]; + }]; return source.task; } @@ -149,52 +218,50 @@ - (void)handlePushNotificationWithDelegate:(id * _Nonnull task) { - - if (task.result != nil) { - - chatDialog = task.result; - - return [self.serviceManager.usersService getUsersWithIDs:task.result.occupantIDs]; - } - - if ([delegate respondsToSelector:@selector(pushNotificationManagerDidStartLoadingDialogFromServer:)]) { - [delegate pushNotificationManagerDidStartLoadingDialogFromServer:self]; - } - - return [self.serviceManager.chatService loadDialogWithID:dialogID]; - - }] continueWithBlock:^id _Nullable(BFTask * _Nonnull task) { - - if (task.isFaulted) { - - if ([delegate respondsToSelector:@selector(pushNotificationManager:didFailFetchingDialogWithError:)]) { - [delegate pushNotificationManager:self didFailFetchingDialogWithError:task.error]; - } - } - else { - - if ([task.result isKindOfClass:[QBChatDialog class]]) { - - if ([delegate respondsToSelector:@selector(pushNotificationManagerDidFinishLoadingDialogFromServer:)]) { - [delegate pushNotificationManagerDidFinishLoadingDialogFromServer:self]; - } - - chatDialog = (QBChatDialog *)task.result; - - return [self.serviceManager.usersService getUsersWithIDs:chatDialog.occupantIDs]; - } - } - - return nil; - - }] continueWithBlock:^id _Nullable(BFTask * _Nonnull __unused task) { - - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate pushNotificationManager:self didSucceedFetchingDialog:chatDialog]; - }); - - return nil; - }]; + if (task.result != nil) { + + chatDialog = task.result; + + return [self.serviceManager.usersService getUsersWithIDs:task.result.occupantIDs]; + } + + if ([delegate respondsToSelector:@selector(pushNotificationManagerDidStartLoadingDialogFromServer:)]) { + [delegate pushNotificationManagerDidStartLoadingDialogFromServer:self]; + } + + return [self.serviceManager.chatService loadDialogWithID:dialogID]; + }] continueWithBlock:^id _Nullable(BFTask * _Nonnull task) { + + if (task.isFaulted) { + + if ([delegate respondsToSelector:@selector(pushNotificationManager:didFailFetchingDialogWithError:)]) { + [delegate pushNotificationManager:self didFailFetchingDialogWithError:task.error]; + } + } + else { + + if ([task.result isKindOfClass:[QBChatDialog class]]) { + + if ([delegate respondsToSelector:@selector(pushNotificationManagerDidFinishLoadingDialogFromServer:)]) { + [delegate pushNotificationManagerDidFinishLoadingDialogFromServer:self]; + } + + chatDialog = (QBChatDialog *)task.result; + + return [self.serviceManager.usersService getUsersWithIDs:chatDialog.occupantIDs]; + } + } + + return nil; + + }] continueWithBlock:^id _Nullable(BFTask * _Nonnull task) { + + dispatch_async(dispatch_get_main_queue(), ^{ + [delegate pushNotificationManager:self didSucceedFetchingDialog:chatDialog]; + }); + + return nil; + }]; } - (void)registerForPushNotifications { @@ -222,7 +289,7 @@ - (void)registerForPushNotifications { settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:categories]; - [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings]; + [UIApplication.sharedApplication registerUserNotificationSettings:notificationSettings]; // subscribing for PKPushRegistry // only if call kit supported @@ -241,7 +308,7 @@ - (void)handleActionWithIdentifier:(NSString *)identifier completionHandler:(dispatch_block_t)completionHandler { if ([identifier isEqualToString:kQMNotificationActionTextAction]) { - + NSString *text = responseInfo[UIUserNotificationActionResponseTypedTextKey]; NSCharacterSet *whiteSpaceSet = [NSCharacterSet whitespaceCharacterSet]; @@ -256,7 +323,7 @@ - (void)handleActionWithIdentifier:(NSString *)identifier NSString *dialogID = userInfo[kQMPushNotificationDialogIDKey]; - UIApplication *application = [UIApplication sharedApplication]; + UIApplication *application = UIApplication.sharedApplication; __block UIBackgroundTaskIdentifier task = [application beginBackgroundTaskWithExpirationHandler:^{ @@ -265,7 +332,7 @@ - (void)handleActionWithIdentifier:(NSString *)identifier }]; // Do the work associated with the task. - QMLog(@"Started background task timeremaining = %f", [application backgroundTimeRemaining]); + QMSLog(@"Started background task timeremaining = %f", [application backgroundTimeRemaining]); [[[QMCore instance].chatService fetchDialogWithID:dialogID] continueWithBlock:^id _Nullable(BFTask * _Nonnull t) { @@ -278,7 +345,6 @@ - (void)handleActionWithIdentifier:(NSString *)identifier && ![[QMCore instance].contactManager isFriendWithUserID:opponentUserID]) { if (completionHandler) { - completionHandler(); } @@ -330,8 +396,8 @@ - (void)handleError:(NSError *)error { // MARK: - PKPushRegistryDelegate protocol -- (void)pushRegistry:(PKPushRegistry *)__unused registry didUpdatePushCredentials:(PKPushCredentials *)pushCredentials forType:(PKPushType)__unused type { - QMLog(@"Created VOIP push token."); +- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)pushCredentials forType:(PKPushType) type { + QMSLog(@"Created VOIP push token."); NSString *deviceIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; QBMSubscription *subscription = [QBMSubscription subscription]; @@ -340,30 +406,59 @@ - (void)pushRegistry:(PKPushRegistry *)__unused registry didUpdatePushCredential subscription.deviceToken = pushCredentials.token; @weakify(self); - [QBRequest createSubscription:subscription successBlock:^(QBResponse * __unused response, NSArray * __unused objects) { + [QBRequest createSubscription:subscription successBlock:^(QBResponse * response, NSArray * objects) { @strongify(self); - QMLog(@"Create VOIP Subscription request - Success"); - QBMSubscription *voipSubscription = objects.firstObject; - self.voipSubscriptionID = voipSubscription.ID; + QMSLog(@"Create VOIP Subscription request - Success"); + for (QBMSubscription *subscription in objects) { + if ([subscription.deviceUDID isEqualToString:deviceIdentifier]) { + [self.subscriptions addObject:subscription]; + } + } + [self synchronizeSubscriptions]; } errorBlock:^(QBResponse *response) { - QMLog(@"Create VOIP Subscription request - Error: %@", [response.error reasons]); + QMSLog(@"Create VOIP Subscription request - Error: %@", [response.error reasons]); }]; } -- (void)pushRegistry:(PKPushRegistry *)__unused registry didInvalidatePushTokenForType:(PKPushType)__unused type { - QMLog(@"Invalidated VOIP push token."); +- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(PKPushType) type { + QMSLog(@"Invalidated VOIP push token."); + dispatch_group_t serviceGroup = dispatch_group_create(); + NSSet*subscriptions = self.subscriptions.copy; + NSString *deviceIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; + NSMutableArray *toDelete = @[].mutableCopy; + for (QBMSubscription *subscription in subscriptions) { + if (subscription.notificationChannel != QBMNotificationChannelAPNSVOIP || + ![subscription.deviceUDID isEqualToString:deviceIdentifier]) { + continue; + } + dispatch_group_enter(serviceGroup); + NSString *chanel = @"VOIP"; + [NSString stringWithFormat:@"Unregister %@ Subscription request", chanel]; + [QBRequest deleteSubscriptionWithID:subscription.ID + successBlock:^(QBResponse * response) { + QMSLog([chanel stringByAppendingString:@" - Success"]); + [toDelete addObject:subscription]; + dispatch_group_leave(serviceGroup); + } errorBlock:^(QBResponse *response) { + NSString *errorMessage = [NSString stringWithFormat:@" - Error: %@", + [response.error reasons]]; + QMSLog([chanel stringByAppendingString:errorMessage]); + [toDelete addObject:subscription]; + dispatch_group_leave(serviceGroup); + }]; + + } @weakify(self); - [QBRequest deleteSubscriptionWithID:_voipSubscriptionID - successBlock:^(QBResponse * __unused response) { - QMLog(@"Unregister VOIP Subscription request - Success"); - @strongify(self); - self.voipSubscriptionID = 0; - } errorBlock:^(QBResponse *response) { - QMLog(@"Unregister VOIP Subscription request - Error: %@", [response.error reasons]); - }]; + dispatch_group_notify(serviceGroup,dispatch_get_main_queue(),^{ + @strongify(self); + for (QBMSubscription *subscription in toDelete) { + [self.subscriptions removeObject:subscription]; + } + [self synchronizeSubscriptions]; + }); } -- (void)pushRegistry:(PKPushRegistry *)__unused registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)__unused type { +- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType) type { if (QMCallManager.isCallKitAvailable && [payload.dictionaryPayload objectForKey:QMVoipCallEventKey] != nil) { [self.serviceManager.callManager performCallKitPreparations]; diff --git a/Q-municate/Classes/CustomSegues/QMRootViewControllerSegue.h b/Q-municate/Classes/CustomSegues/QMRootViewControllerSegue.h index a3cb4b77f..41727db20 100644 --- a/Q-municate/Classes/CustomSegues/QMRootViewControllerSegue.h +++ b/Q-municate/Classes/CustomSegues/QMRootViewControllerSegue.h @@ -2,8 +2,8 @@ // QMRootViewControllerSegue.h // Q-municate // -// Created by Igor Alefirenko on 13/02/2014. -// Copyright (c) 2014 Quickblox. All rights reserved. +// Created by Injoit on 13/02/2014. +// Copyright © 2014 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Classes/CustomSegues/QMRootViewControllerSegue.m b/Q-municate/Classes/CustomSegues/QMRootViewControllerSegue.m index b7aff256a..0ed175c79 100644 --- a/Q-municate/Classes/CustomSegues/QMRootViewControllerSegue.m +++ b/Q-municate/Classes/CustomSegues/QMRootViewControllerSegue.m @@ -2,8 +2,8 @@ // QMRootViewControllerSegue.m // Q-municate // -// Created by Igor Alefirenko on 13/02/2014. -// Copyright (c) 2014 Quickblox. All rights reserved. +// Created by Injoit on 13/02/2014. +// Copyright © 2014 QuickBlox. All rights reserved. // #import "QMRootViewControllerSegue.h" @@ -13,7 +13,7 @@ @implementation QMRootViewControllerSegue - (void)perform { - QMAppDelegate *delegate = (QMAppDelegate *)[UIApplication sharedApplication].delegate; + QMAppDelegate *delegate = (QMAppDelegate *)UIApplication.sharedApplication.delegate; delegate.window.rootViewController = self.destinationViewController; } diff --git a/Q-municate/Classes/Factories/QMCallButtonsFactory/QMCallButtonsFactory.h b/Q-municate/Classes/Factories/QMCallButtonsFactory/QMCallButtonsFactory.h index c59305c43..01c23e62e 100644 --- a/Q-municate/Classes/Factories/QMCallButtonsFactory/QMCallButtonsFactory.h +++ b/Q-municate/Classes/Factories/QMCallButtonsFactory/QMCallButtonsFactory.h @@ -2,8 +2,8 @@ // QMCallButtonsFactory.h // Q-municate // -// Created by Vitaliy Gorbachov on 5/10/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 5/10/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Classes/Factories/QMCallButtonsFactory/QMCallButtonsFactory.m b/Q-municate/Classes/Factories/QMCallButtonsFactory/QMCallButtonsFactory.m index 3c1224e5c..8a5c33866 100644 --- a/Q-municate/Classes/Factories/QMCallButtonsFactory/QMCallButtonsFactory.m +++ b/Q-municate/Classes/Factories/QMCallButtonsFactory/QMCallButtonsFactory.m @@ -2,8 +2,8 @@ // QMCallButtonsFactory.m // Q-municate // -// Created by Vitaliy Gorbachov on 5/10/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 5/10/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMCallButtonsFactory.h" diff --git a/Q-municate/Classes/Factories/QMErrorsFactory/QMErrorsFactory.h b/Q-municate/Classes/Factories/QMErrorsFactory/QMErrorsFactory.h index e960dd4ac..d1878bf7b 100644 --- a/Q-municate/Classes/Factories/QMErrorsFactory/QMErrorsFactory.h +++ b/Q-municate/Classes/Factories/QMErrorsFactory/QMErrorsFactory.h @@ -2,8 +2,8 @@ // QMErrorsFactory.h // Q-municate // -// Created by Vitaliy Gorbachov on 1/13/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 1/13/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Classes/Factories/QMErrorsFactory/QMErrorsFactory.m b/Q-municate/Classes/Factories/QMErrorsFactory/QMErrorsFactory.m index ba3c000b3..79496bb6c 100644 --- a/Q-municate/Classes/Factories/QMErrorsFactory/QMErrorsFactory.m +++ b/Q-municate/Classes/Factories/QMErrorsFactory/QMErrorsFactory.m @@ -2,8 +2,8 @@ // QMErrorsFactory.m // Q-municate // -// Created by Vitaliy Gorbachov on 1/13/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 1/13/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMErrorsFactory.h" diff --git a/Q-municate/Classes/Factories/QMMessagesFactory/QMMessagesHelper.h b/Q-municate/Classes/Factories/QMMessagesFactory/QMMessagesHelper.h index 48d3e18f3..cb8a8fe1f 100644 --- a/Q-municate/Classes/Factories/QMMessagesFactory/QMMessagesHelper.h +++ b/Q-municate/Classes/Factories/QMMessagesFactory/QMMessagesHelper.h @@ -2,11 +2,12 @@ // QMMessagesHelper.h // Q-municate // -// Created by Vitaliy Gorbachov on 4/18/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 4/18/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/Q-municate/Classes/Factories/QMMessagesFactory/QMMessagesHelper.m b/Q-municate/Classes/Factories/QMMessagesFactory/QMMessagesHelper.m index 43cbeb685..6145e0c9c 100644 --- a/Q-municate/Classes/Factories/QMMessagesFactory/QMMessagesHelper.m +++ b/Q-municate/Classes/Factories/QMMessagesFactory/QMMessagesHelper.m @@ -2,11 +2,13 @@ // QMMessagesHelper.m // Q-municate // -// Created by Vitaliy Gorbachov on 4/18/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 4/18/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMMessagesHelper.h" +#import +#import "QBChatMessage+QMCustomParameters.h" @implementation QMMessagesHelper diff --git a/Q-municate/Classes/QMAlphabetizer/QMAlphabetizer.h b/Q-municate/Classes/QMAlphabetizer/QMAlphabetizer.h index f1cba0f07..6fefcbed7 100644 --- a/Q-municate/Classes/QMAlphabetizer/QMAlphabetizer.h +++ b/Q-municate/Classes/QMAlphabetizer/QMAlphabetizer.h @@ -2,8 +2,8 @@ // QMAlphabetizer.h // Q-municate // -// Created by Andrey Ivanov on 23.04.15. -// Copyright (c) 2015 Quickblox. All rights reserved. +// Created by Injoit on 23.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Classes/QMAlphabetizer/QMAlphabetizer.m b/Q-municate/Classes/QMAlphabetizer/QMAlphabetizer.m index 11e4fb182..11aa79fe6 100644 --- a/Q-municate/Classes/QMAlphabetizer/QMAlphabetizer.m +++ b/Q-municate/Classes/QMAlphabetizer/QMAlphabetizer.m @@ -2,8 +2,8 @@ // QMAlphabetizer.m // Q-municate // -// Created by Andrey Ivanov on 23.04.15. -// Copyright (c) 2015 Quickblox. All rights reserved. +// Created by Injoit on 23.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "QMAlphabetizer.h" diff --git a/Q-municate/Classes/QMCallKitAdapter/QMCallKitAdapter.h b/Q-municate/Classes/QMCallKitAdapter/QMCallKitAdapter.h index d198832fc..7b8851c92 100644 --- a/Q-municate/Classes/QMCallKitAdapter/QMCallKitAdapter.h +++ b/Q-municate/Classes/QMCallKitAdapter/QMCallKitAdapter.h @@ -2,11 +2,12 @@ // QMCallKitAdapter.h // Q-municate // -// Created by Vitaliy Gorbachov on 11/30/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 11/30/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/Q-municate/Classes/QMCallKitAdapter/QMCallKitAdapter.m b/Q-municate/Classes/QMCallKitAdapter/QMCallKitAdapter.m index e87461d4d..9595e7fa6 100644 --- a/Q-municate/Classes/QMCallKitAdapter/QMCallKitAdapter.m +++ b/Q-municate/Classes/QMCallKitAdapter/QMCallKitAdapter.m @@ -2,8 +2,8 @@ // QMCallKitAdapter.m // Q-municate // -// Created by Vitaliy Gorbachov on 11/30/17. -// Copyright © 2017 Quickblox. All rights reserved. +// Created by Injoit on 11/30/17. +// Copyright © 2017 QuickBlox. All rights reserved. // #import "QMCallKitAdapter.h" @@ -11,7 +11,7 @@ #import #import "QMHelpers.h" -#import "QMLog.h" +#import "QMSLog.h" static const NSInteger QMDefaultMaximumCallsPerCallGroup = 1; static const NSInteger QMDefaultMaximumCallGroups = 1; @@ -96,7 +96,7 @@ - (void)startCallWithUserID:(NSNumber *)userID session:(QBRTCSession *)session u action.contactIdentifier = contactIdentifier; CXTransaction *transaction = [[CXTransaction alloc] initWithAction:action]; - [self requestTransaction:transaction completion:^(__unused BOOL succeed) { + [self requestTransaction:transaction completion:^( BOOL succeed) { CXCallUpdate *update = [[CXCallUpdate alloc] init]; update.remoteHandle = handle; update.localizedCallerName = contactIdentifier; @@ -129,7 +129,7 @@ - (void)endCallWithUUID:(NSUUID *)uuid completion:(dispatch_block_t)completion { } - (void)reportIncomingCallWithUserID:(NSNumber *)userID session:(QBRTCSession *)session uuid:(NSUUID *)uuid onAcceptAction:(dispatch_block_t)onAcceptAction completion:(void (^)(BOOL))completion { - QMLog(@"[QMCallKitAdapter] Report incoming call %@", uuid); + QMSLog(@"[QMCallKitAdapter] Report incoming call %@", uuid); if (_session != nil) { // session in progress @@ -155,7 +155,7 @@ - (void)reportIncomingCallWithUserID:(NSNumber *)userID session:(QBRTCSession *) update.supportsDTMF = NO; update.hasVideo = session.conferenceType == QBRTCConferenceTypeVideo; - QMLog(@"[QMCallKitAdapter] Activating audio session."); + QMSLog(@"[QMCallKitAdapter] Activating audio session."); QBRTCAudioSession *audioSession = [QBRTCAudioSession instance]; audioSession.useManualAudio = YES; if (!audioSession.isInitialized) { @@ -190,10 +190,10 @@ - (void)updateCallWithUUID:(NSUUID *)uuid connectedAtDate:(NSDate *)date { // MARK: - CXProviderDelegate protocol -- (void)providerDidReset:(CXProvider *)__unused provider { +- (void)providerDidReset:(CXProvider *)provider { } -- (void)provider:(CXProvider *)__unused provider performStartCallAction:(CXStartCallAction *)action { +- (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action { if (_session == nil) { [action fail]; return; @@ -207,7 +207,7 @@ - (void)provider:(CXProvider *)__unused provider performStartCallAction:(CXStart }); } -- (void)provider:(CXProvider *)__unused provider performAnswerCallAction:(CXAnswerCallAction *)action { +- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action { if (_session == nil) { [action fail]; return; @@ -219,7 +219,7 @@ - (void)provider:(CXProvider *)__unused provider performAnswerCallAction:(CXAnsw // webrtc need AVAudioSessionCategoryPlayAndRecord NSError *err = nil; if (![[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&err]) { - QMLog(@"[QMCallKitAdapter] Error setting category for webrtc workaround."); + QMSLog(@"[QMCallKitAdapter] Error setting category for webrtc workaround."); } } @@ -236,7 +236,7 @@ - (void)provider:(CXProvider *)__unused provider performAnswerCallAction:(CXAnsw }); } -- (void)provider:(CXProvider *)__unused provider performEndCallAction:(CXEndCallAction *)action { +- (void)provider:(CXProvider *)provider performEndCallAction:(CXEndCallAction *)action { if (_session == nil) { [action fail]; return; @@ -275,7 +275,7 @@ - (void)provider:(CXProvider *)__unused provider performEndCallAction:(CXEndCall }); } -- (void)provider:(CXProvider *)__unused provider performSetMutedCallAction:(CXSetMutedCallAction *)action { +- (void)provider:(CXProvider *)provider performSetMutedCallAction:(CXSetMutedCallAction *)action { if (_session == nil) { [action fail]; return; @@ -292,21 +292,21 @@ - (void)provider:(CXProvider *)__unused provider performSetMutedCallAction:(CXSe }); } -- (void)provider:(CXProvider *)__unused provider didActivateAudioSession:(AVAudioSession *)audioSession { - QMLog(@"[QMCallKitAdapter] Activated audio session."); +- (void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession { + QMSLog(@"[QMCallKitAdapter] Activated audio session."); QBRTCAudioSession *rtcAudioSession = [QBRTCAudioSession instance]; [rtcAudioSession audioSessionDidActivate:audioSession]; // enabling audio now rtcAudioSession.audioEnabled = YES; } -- (void)provider:(CXProvider *)__unused provider didDeactivateAudioSession:(AVAudioSession *)audioSession { - QMLog(@"[QMCallKitAdapter] Dectivated audio session."); +- (void)provider:(CXProvider *)provider didDeactivateAudioSession:(AVAudioSession *)audioSession { + QMSLog(@"[QMCallKitAdapter] Dectivated audio session."); [[QBRTCAudioSession instance] audioSessionDidDeactivate:audioSession]; // deinitializing audio session after iOS deactivated it for us QBRTCAudioSession *session = [QBRTCAudioSession instance]; if (session.isInitialized) { - QMLog(@"[QMCallKitAdapter] Deinitializing session in CallKit callback."); + QMSLog(@"[QMCallKitAdapter] Deinitializing session in CallKit callback."); [session deinitialize]; } } @@ -329,7 +329,7 @@ static inline void dispatchOnMainThread(dispatch_block_t block) { - (void)requestTransaction:(CXTransaction *)transaction completion:(void (^)(BOOL))completion { [_callController requestTransaction:transaction completion:^(NSError *error) { if (error != nil) { - QMLog(@"[QMCallKitAdapter] Error: %@", error); + QMSLog(@"[QMCallKitAdapter] Error: %@", error); } if (completion != nil) { completion(error == nil); diff --git a/Q-municate/Classes/QMCallNotificationItem/QMCallNotificationItem.h b/Q-municate/Classes/QMCallNotificationItem/QMCallNotificationItem.h index 54d64f149..b1f41dd46 100644 --- a/Q-municate/Classes/QMCallNotificationItem/QMCallNotificationItem.h +++ b/Q-municate/Classes/QMCallNotificationItem/QMCallNotificationItem.h @@ -2,11 +2,12 @@ // QMCallNotificationItem.h // Q-municate // -// Created by Vitaliy Gorbachov on 7/14/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 7/14/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import +#import @interface QMCallNotificationItem : NSObject diff --git a/Q-municate/Classes/QMCallNotificationItem/QMCallNotificationItem.m b/Q-municate/Classes/QMCallNotificationItem/QMCallNotificationItem.m index 66d140015..0349d0dd0 100644 --- a/Q-municate/Classes/QMCallNotificationItem/QMCallNotificationItem.m +++ b/Q-municate/Classes/QMCallNotificationItem/QMCallNotificationItem.m @@ -2,8 +2,8 @@ // QMCallNotificationItem.m // Q-municate // -// Created by Vitaliy Gorbachov on 7/14/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 7/14/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMCallNotificationItem.h" @@ -93,7 +93,7 @@ @implementation QMCallNotificationItem - (instancetype)initWithCallNotificationMessage:(QBChatMessage *)message { self = [super init]; - if (self != nil) { + if (self) { switch (message.callNotificationState) { diff --git a/Q-municate/Classes/QMChatButtonsFactory/QMChatButtonsFactory.h b/Q-municate/Classes/QMChatButtonsFactory/QMChatButtonsFactory.h index a4a8520df..2e52058a0 100644 --- a/Q-municate/Classes/QMChatButtonsFactory/QMChatButtonsFactory.h +++ b/Q-municate/Classes/QMChatButtonsFactory/QMChatButtonsFactory.h @@ -2,8 +2,8 @@ // QMChatButtonsFactory.h // Q-municate // -// Created by Vitaliy Gorbachov on 9/25/15. -// Copyright © 2015 Quickblox. All rights reserved. +// Created by Injoit on 9/25/15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import diff --git a/Q-municate/Classes/QMChatButtonsFactory/QMChatButtonsFactory.m b/Q-municate/Classes/QMChatButtonsFactory/QMChatButtonsFactory.m index 222f2ba20..443a37349 100644 --- a/Q-municate/Classes/QMChatButtonsFactory/QMChatButtonsFactory.m +++ b/Q-municate/Classes/QMChatButtonsFactory/QMChatButtonsFactory.m @@ -2,8 +2,8 @@ // QMChatButtonsFactory.m // Q-municate // -// Created by Vitaliy Gorbachov on 9/25/15. -// Copyright © 2015 Quickblox. All rights reserved. +// Created by Injoit on 9/25/15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "QMChatButtonsFactory.h" diff --git a/Q-municate/Classes/QMChatViewController/Categories/NSString+QM.h b/Q-municate/Classes/QMChatViewController/Categories/NSString+QM.h new file mode 100644 index 000000000..4c2be607d --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Categories/NSString+QM.h @@ -0,0 +1,20 @@ +// +// NSString+QM.h +// QMChatViewController +// +// Created by Injoit on 21.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import + +@interface NSString (QM) + +/** + * Removes [ ]+ symbols and trim whitespaces and new line characters + * + * @return clean string + */ +- (NSString *)stringByTrimingWhitespace; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Categories/NSString+QM.m b/Q-municate/Classes/QMChatViewController/Categories/NSString+QM.m similarity index 83% rename from Pods/QMCVDevelopment/QMChatViewController/Categories/NSString+QM.m rename to Q-municate/Classes/QMChatViewController/Categories/NSString+QM.m index a59856d38..c402ecbe9 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/Categories/NSString+QM.m +++ b/Q-municate/Classes/QMChatViewController/Categories/NSString+QM.m @@ -2,8 +2,8 @@ // NSString+QM.m // QMChatViewController // -// Created by Andrey Ivanov on 21.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. +// Created by Injoit on 21.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "NSString+QM.h" diff --git a/Q-municate/Classes/QMChatViewController/Categories/UIColor+QM.h b/Q-municate/Classes/QMChatViewController/Categories/UIColor+QM.h new file mode 100644 index 000000000..0838d624e --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Categories/UIColor+QM.h @@ -0,0 +1,45 @@ +// +// UIColor+q_municate.h +// QMChatViewController +// +// Created by Injoit on 20.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import + +@interface UIColor (QM) + +//MARK: - Message bubble colors + +/** + * @return A color object containing HSB values similar to the iOS 7 messages app green bubble color. + */ ++ (UIColor *)messageBubbleGreenColor; + +/** + * @return A color object containing HSB values similar to the iOS 7 messages app blue bubble color. + */ ++ (UIColor *)messageBubbleBlueColor; + +/** + * @return A color object containing HSB values similar to the iOS 7 red color. + */ ++ (UIColor *)messageBubbleRedColor; +/** + * @return A color object containing HSB values similar to the iOS 7 messages app light gray bubble color. + */ ++ (UIColor *)messageBubbleLightGrayColor; + +#pragma mark - Utilities + +/** + * Creates and returns a new color object whose brightness component is decreased by the given value, using the initial color values of the receiver. + * + * @param value A floating point value describing the amount by which to decrease the brightness of the receiver. + * + * @return A new color object whose brightness is decreased by the given values. The other color values remain the same as the receiver. + */ +- (UIColor *)colorByDarkeningColorWithValue:(CGFloat)value; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIColor+QM.m b/Q-municate/Classes/QMChatViewController/Categories/UIColor+QM.m similarity index 95% rename from Pods/QMCVDevelopment/QMChatViewController/Categories/UIColor+QM.m rename to Q-municate/Classes/QMChatViewController/Categories/UIColor+QM.m index c263ecb32..01f95ee20 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIColor+QM.m +++ b/Q-municate/Classes/QMChatViewController/Categories/UIColor+QM.m @@ -2,8 +2,8 @@ // UIColor+q_municate.m // QMChatViewController // -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. +// Created by Injoit on 20.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "UIColor+QM.h" diff --git a/Q-municate/Classes/QMChatViewController/Categories/UIImage+Cropper.h b/Q-municate/Classes/QMChatViewController/Categories/UIImage+Cropper.h new file mode 100644 index 000000000..78974bb9a --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Categories/UIImage+Cropper.h @@ -0,0 +1,18 @@ +// +// UIImage+Cropper.h +// QMChatViewController +// +// Created by Igor Alefirenko on 29/11/2013. +// Copyright © 2013 Stefano Antonelli. All rights reserved. +// + +#import + +@interface UIImage (Cropper) + +- (UIImage *)imageWithCornerRadius:(CGFloat)cornerRadius + targetSize:(CGSize)targetSize; +- (UIImage *)imageByScaleAndCrop:(CGSize)targetSize; +- (UIImage *)imageByCircularScaleAndCrop:(CGSize)targetSize; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+Cropper.m b/Q-municate/Classes/QMChatViewController/Categories/UIImage+Cropper.m similarity index 98% rename from Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+Cropper.m rename to Q-municate/Classes/QMChatViewController/Categories/UIImage+Cropper.m index 8ffc04354..d9115931a 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+Cropper.m +++ b/Q-municate/Classes/QMChatViewController/Categories/UIImage+Cropper.m @@ -3,7 +3,7 @@ // QMChatViewController // // Created by Igor Alefirenko on 29/11/2013. -// Copyright (c) 2013 Stefano Antonelli. All rights reserved. +// Copyright © 2013 Stefano Antonelli. All rights reserved. // #import "UIImage+Cropper.h" diff --git a/Q-municate/Classes/QMChatViewController/Categories/UIImage+QM.h b/Q-municate/Classes/QMChatViewController/Categories/UIImage+QM.h new file mode 100644 index 000000000..9b83c2d9e --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Categories/UIImage+QM.h @@ -0,0 +1,34 @@ +// +// UIImage+QM.h +// QMChatViewController +// +// Created by Injoit on 20.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import + +@interface UIImage (QM) + +/** + * Adds color mask to image + * + * @param maskColor color for mask + * + * @return masked image + */ +- (UIImage *)imageMaskedWithColor:(UIColor *)maskColor; + +/** + * Creates a resizable image with specified color and corner radius + * + * @param color color for mask + * + * @return masked image + */ ++ (UIImage *)resizableImageWithColor:(UIColor *)color + cornerRadius:(CGFloat)cornerRadius; + +@property (nonatomic, strong, readonly) NSData *dataRepresentation; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+QM.m b/Q-municate/Classes/QMChatViewController/Categories/UIImage+QM.m similarity index 96% rename from Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+QM.m rename to Q-municate/Classes/QMChatViewController/Categories/UIImage+QM.m index 79eccdb1a..8cd603baf 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIImage+QM.m +++ b/Q-municate/Classes/QMChatViewController/Categories/UIImage+QM.m @@ -2,8 +2,8 @@ // UIImage+QM.m // QMChatViewController // -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. +// Created by Injoit on 20.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "UIImage+QM.h" diff --git a/Q-municate/Classes/QMChatViewController/Categories/UIView+QM.h b/Q-municate/Classes/QMChatViewController/Categories/UIView+QM.h new file mode 100644 index 000000000..bb5c33eb0 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Categories/UIView+QM.h @@ -0,0 +1,28 @@ +// +// UIView+QM.h +// QMChatViewController +// +// Created by Injoit on 20.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import + +@interface UIView (QM) + +/** + * Pins the subview of the receiver to the edge of its frame, as specified by the given attribute, by adding a layout constraint. + * + * @param subview The subview to which the receiver will be pinned. + * @param attribute The layout constraint attribute specifying one of `NSLayoutAttributeBottom`, `NSLayoutAttributeTop`, `NSLayoutAttributeLeading`, `NSLayoutAttributeTrailing`. + */ +- (void)pinSubview:(UIView *)subview toEdge:(NSLayoutAttribute)attribute; + +/** + * Pins all edges of the specified subview to the receiver. + * + * @param subview The subview to which the receiver will be pinned. + */ +- (void)pinAllEdgesOfSubview:(UIView *)subview; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIView+QM.m b/Q-municate/Classes/QMChatViewController/Categories/UIView+QM.m similarity index 90% rename from Pods/QMCVDevelopment/QMChatViewController/Categories/UIView+QM.m rename to Q-municate/Classes/QMChatViewController/Categories/UIView+QM.m index 2ecad5ee0..bcb830d75 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/Categories/UIView+QM.m +++ b/Q-municate/Classes/QMChatViewController/Categories/UIView+QM.m @@ -2,8 +2,8 @@ // UIView+QM.m // QMChatViewController // -// Created by Andrey Ivanov on 20.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. +// Created by Injoit on 20.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "UIView+QM.h" diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/Contents.json similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/Contents.json rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/Contents.json diff --git a/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/attachment_ic.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/attachment_ic.imageset/Contents.json new file mode 100644 index 000000000..989502468 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/attachment_ic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "attachment_ic.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "attachment_ic@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "attachment_ic@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/attachment_ic.png b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/attachment_ic.imageset/attachment_ic.png similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/attachment_ic.png rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/attachment_ic.imageset/attachment_ic.png diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/attachment_ic@2x.png b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/attachment_ic.imageset/attachment_ic@2x.png similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/attachment_ic@2x.png rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/attachment_ic.imageset/attachment_ic@2x.png diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/attachment_ic@3x.png b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/attachment_ic.imageset/attachment_ic@3x.png similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/attachment_ic@3x.png rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/attachment_ic.imageset/attachment_ic@3x.png diff --git a/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_audio.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_audio.imageset/Contents.json new file mode 100644 index 000000000..9e878bd7c --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_audio.imageset/Contents.json @@ -0,0 +1,17 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_audio.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "compression-type" : "automatic", + "template-rendering-intent" : "original", + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_audio.imageset/ic_audio.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_audio.imageset/ic_audio.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_audio.imageset/ic_audio.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_audio.imageset/ic_audio.pdf diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_cancel-video.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_cancel-video.imageset/Contents.json similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_cancel-video.imageset/Contents.json rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_cancel-video.imageset/Contents.json diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_cancel-video.imageset/ic_progress-video.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_cancel-video.imageset/ic_progress-video.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_cancel-video.imageset/ic_progress-video.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_cancel-video.imageset/ic_progress-video.pdf diff --git a/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_cancel.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_cancel.imageset/Contents.json new file mode 100644 index 000000000..4eb64d106 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_cancel.imageset/Contents.json @@ -0,0 +1,17 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_progress-grey.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "compression-type" : "automatic", + "template-rendering-intent" : "template", + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_cancel.imageset/ic_progress-grey.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_cancel.imageset/ic_progress-grey.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_cancel.imageset/ic_progress-grey.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_cancel.imageset/ic_progress-grey.pdf diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_download-video.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_download-video.imageset/Contents.json similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_download-video.imageset/Contents.json rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_download-video.imageset/Contents.json diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_download-video.imageset/ic_download-video.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_download-video.imageset/ic_download-video.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_download-video.imageset/ic_download-video.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_download-video.imageset/ic_download-video.pdf diff --git a/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_download.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_download.imageset/Contents.json new file mode 100644 index 000000000..adf03f096 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_download.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_download_grey.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "original", + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_download.imageset/ic_download_grey.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_download.imageset/ic_download_grey.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_download.imageset/ic_download_grey.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_download.imageset/ic_download_grey.pdf diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_pause-video.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_pause-video.imageset/Contents.json similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_pause-video.imageset/Contents.json rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_pause-video.imageset/Contents.json diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_pause-video.imageset/ic_pause-video.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_pause-video.imageset/ic_pause-video.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_pause-video.imageset/ic_pause-video.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_pause-video.imageset/ic_pause-video.pdf diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_pause.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_pause.imageset/Contents.json similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_pause.imageset/Contents.json rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_pause.imageset/Contents.json diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_pause.imageset/ic_pause_grey.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_pause.imageset/ic_pause_grey.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_pause.imageset/ic_pause_grey.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_pause.imageset/ic_pause_grey.pdf diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_play-video.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_play-video.imageset/Contents.json similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_play-video.imageset/Contents.json rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_play-video.imageset/Contents.json diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_play-video.imageset/ic_play-video.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_play-video.imageset/ic_play-video.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_play-video.imageset/ic_play-video.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_play-video.imageset/ic_play-video.pdf diff --git a/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_play.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_play.imageset/Contents.json new file mode 100644 index 000000000..7f6cf9db8 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_play.imageset/Contents.json @@ -0,0 +1,17 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_play_grey.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "compression-type" : "automatic", + "template-rendering-intent" : "original", + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_play.imageset/ic_play_grey.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_play.imageset/ic_play_grey.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_play.imageset/ic_play_grey.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_play.imageset/ic_play_grey.pdf diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_retry-video.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_retry-video.imageset/Contents.json similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_retry-video.imageset/Contents.json rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_retry-video.imageset/Contents.json diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_retry-video.imageset/ic_retry-video.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_retry-video.imageset/ic_retry-video.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_retry-video.imageset/ic_retry-video.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_retry-video.imageset/ic_retry-video.pdf diff --git a/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_retry.imageset/Contents.json b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_retry.imageset/Contents.json new file mode 100644 index 000000000..80aa1b247 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_retry.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_retry-grey.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "original", + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_retry.imageset/ic_retry-grey.pdf b/Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_retry.imageset/ic_retry-grey.pdf similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Icons/Media.xcassets/ic_retry.imageset/ic_retry-grey.pdf rename to Q-municate/Classes/QMChatViewController/Icons/Media.xcassets/ic_retry.imageset/ic_retry-grey.pdf diff --git a/Q-municate/Classes/QMChatViewController/Protocols/QMChatCollectionViewDataSource.h b/Q-municate/Classes/QMChatViewController/Protocols/QMChatCollectionViewDataSource.h new file mode 100644 index 000000000..d4412ebe5 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Protocols/QMChatCollectionViewDataSource.h @@ -0,0 +1,53 @@ +// +// QMChatCollectionViewDataSource.h +// QMChatViewController +// +// Created by Injoit on 20.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import +#import + +@class QMChatCollectionView; + +/** + * An object that adopts the `QMChatCollectionViewDataSource` protocol is responsible for providing the data and views + * required by a `QMChatCollectionView`. The data source object represents your app’s messaging data model + * and vends information to the collection view as needed. + */ +@protocol QMChatCollectionViewDataSource + +@required + +/** + * Asks the data source for the current sender's display name, that is, the current user who is sending messages. + * + * @return An initialized string describing the current sender to display in a `QMChatCollectionViewCell`. + * + * @warning You must not return `nil` from this method. This value does not need to be unique. + */ +- (NSString *)senderDisplayName; + +/** + * Asks the data source for the current sender's unique identifier, that is, the current user who is sending messages. + * + * @return An initialized string identifier that uniquely identifies the current sender. + * + * @warning You must not return `0` from this method. This value must be unique. + */ +- (NSUInteger)senderID; + +/** + * Asks the data source for the message data that corresponds to the specified item at indexPath in the collectionView. + * + * @param collectionView The object representing the collection view requesting this information. + * @param indexPath The index path that specifies the location of the item. + * + * @return An initialized object that conforms to the `QMChatMessageData` protocol. You must not return `nil` from this method. + */ +//- (id)collectionView:(QMChatCollectionView *)collectionView messageDataForItemAtIndexPath:(NSIndexPath *)indexPath; + +- (NSString *)collectionView:(QMChatCollectionView *)collectionView itemIdAtIndexPath:(NSIndexPath *)indexPath; + +@end diff --git a/Q-municate/Classes/QMChatViewController/Protocols/QMChatCollectionViewDelegateFlowLayout.h b/Q-municate/Classes/QMChatViewController/Protocols/QMChatCollectionViewDelegateFlowLayout.h new file mode 100644 index 000000000..ec1a92479 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Protocols/QMChatCollectionViewDelegateFlowLayout.h @@ -0,0 +1,32 @@ +// +// QMChatCollectionViewDelegateFlowLayout.h +// QMChatViewController +// +// Created by Injoit on 20.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import +#import + +@class QMChatCollectionView; +@class QMChatCollectionViewFlowLayout; +@class QMChatCellLayoutAttributes; + +typedef struct QMChatLayoutModel QMChatCellLayoutModel; + +/** + * The `QMChatCollectionViewDelegateFlowLayout` protocol defines methods that allow you to + * manage additional layout information for the collection view and respond to additional actions on its items. + * The methods of this protocol are all optional. + */ +@protocol QMChatCollectionViewDelegateFlowLayout + +@optional + +- (QMChatCellLayoutModel)collectionView:(QMChatCollectionView *)collectionView layoutModelAtIndexPath:(NSIndexPath *)indexPath; + +- (CGSize)collectionView:(QMChatCollectionView *)collectionView dynamicSizeAtIndexPath:(NSIndexPath *)indexPath maxWidth:(CGFloat)maxWidth; +- (CGFloat)collectionView:(QMChatCollectionView *)collectionView minWidthAtIndexPath:(NSIndexPath *)indexPath; + +@end diff --git a/Q-municate/Classes/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.h b/Q-municate/Classes/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.h new file mode 100644 index 000000000..a118d0924 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.h @@ -0,0 +1,20 @@ +// +// NSDate+ChatDataSource.h +// QMChatViewController +// +// Created by Injoit on 8/23/16. +// Copyright © 2016 QuickBlox. All rights reserved. +// + +#import + +@interface NSDate (ChatDataSource) + +- (NSComparisonResult)compareWithDate:(NSDate*)dateToCompareWith; + +- (NSDate *)dateAtStartOfDay; +- (NSDate *)dateAtEndOfDay; + +- (BOOL)isBetweenStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate respectOrderedSame:(BOOL)respectOrderedSame; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.m b/Q-municate/Classes/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.m similarity index 94% rename from Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.m rename to Q-municate/Classes/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.m index dd0601f05..f05af8637 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.m +++ b/Q-municate/Classes/QMChatViewController/QMChatDataSource/NSDate+ChatDataSource.m @@ -2,8 +2,8 @@ // NSDate+ChatDataSource.m // QMChatViewController // -// Created by Vitaliy Gurkovsky on 8/23/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 8/23/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "NSDate+ChatDataSource.h" diff --git a/Q-municate/Classes/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.h b/Q-municate/Classes/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.h new file mode 100644 index 000000000..6945b28b4 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.h @@ -0,0 +1,15 @@ +// +// QBChatMessage+QBDateDivider.h +// QMChatViewController +// +// Created by Injoit on 8/16/16. +// Copyright © 2016 QuickBlox. All rights reserved. +// + +#import + +@interface QBChatMessage (QBDateDivider) + +@property (assign, nonatomic) BOOL isDateDividerMessage; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.m b/Q-municate/Classes/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.m similarity index 89% rename from Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.m rename to Q-municate/Classes/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.m index 30132c676..0f5f50e75 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.m +++ b/Q-municate/Classes/QMChatViewController/QMChatDataSource/QBChatMessage+QBDateDivider.m @@ -2,8 +2,8 @@ // QBChatMessage+QBDateDivider.m // QMChatViewController // -// Created by Vitaliy Gurkovsky on 8/16/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 8/16/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QBChatMessage+QBDateDivider.h" diff --git a/Q-municate/Classes/QMChatViewController/QMChatDataSource/QMChatDataSource.h b/Q-municate/Classes/QMChatViewController/QMChatDataSource/QMChatDataSource.h new file mode 100644 index 000000000..1261254ad --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/QMChatDataSource/QMChatDataSource.h @@ -0,0 +1,99 @@ +// +// QMChatDataSource.h +// QMChatViewController +// +// Created by Injoit on 8/10/16. +// Copyright © 2016 QuickBlox. All rights reserved. +// + +#import +#import + +#import "QBChatMessage+QBDateDivider.h" + +typedef NS_ENUM(NSInteger, QMDataSourceActionType) { + + QMDataSourceActionTypeAdd = 0, + QMDataSourceActionTypeUpdate, + QMDataSourceActionTypeRemove +}; + +@class QBChatMessage; + +@protocol QMChatDataSourceDelegate; + +@interface QMChatDataSource : NSObject + +@property(nonatomic, weak) id delegate; + +/** + * Custom messages date divider interval. + * + * @discussion By default date divider divides messages by days (e.g. Today, Yesterday, etc.). + * Set custom time interval (in seconds) here to make date divider divide messages every N seconds. + * + * @note Should be changed before adding any data do data source, otherwise will require reload of data. + * + * @remark Default value: 0. + */ +@property (nonatomic, assign) NSTimeInterval customDividerInterval; + +- (NSArray *)allMessages; + +- (void)addMessage:(QBChatMessage *)message; +- (void)addMessages:(NSArray *)messages; + +- (void)deleteMessage:(QBChatMessage *)message; +- (void)deleteMessages:(NSArray *)messages; + +- (void)updateMessage:(QBChatMessage *)message; +- (void)updateMessages:(NSArray *)messages; + +- (NSArray *)performChangesWithMessages:(NSArray *)messages updateType:(QMDataSourceActionType)updateType; + +/** + * Messages count. + * + * @return The number of messages in the data source + */ +- (NSInteger)messagesCount; + +/** + * Message for index path. + * + * @param indexPath index path to find message + * + * @return QBChatMessage instance that conforms to indexPath + */ +- (QBChatMessage *)messageForIndexPath:(NSIndexPath *)indexPath; + +/** + * Index path for message. + * + * @param message message to return index path + * + * @return NSIndexPath instance that conforms message or nil if not found + */ +- (NSIndexPath *)indexPathForMessage:(QBChatMessage *)message; + +/** + * Returns a Boolean value that indicates whether a message is present in the data source. + * + * @param message message to check + * + * @return YES if message is present in the data source, otherwise NO. + */ +- (BOOL)messageExists:(QBChatMessage *)message; + +@end + +@protocol QMChatDataSourceDelegate + +- (void)chatDataSource:(QMChatDataSource *)chatDataSource +willBeChangedWithMessageIDs:(NSArray *)messagesIDs; + +- (void)changeDataSource:(QMChatDataSource *)dataSource + withMessages:(NSArray *)messages + updateType:(QMDataSourceActionType)updateType; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QMChatDataSource.m b/Q-municate/Classes/QMChatViewController/QMChatDataSource/QMChatDataSource.m similarity index 92% rename from Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QMChatDataSource.m rename to Q-municate/Classes/QMChatViewController/QMChatDataSource/QMChatDataSource.m index 355aab16f..5aeca6866 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatDataSource/QMChatDataSource.m +++ b/Q-municate/Classes/QMChatViewController/QMChatDataSource/QMChatDataSource.m @@ -2,8 +2,8 @@ // QMChatDataSource.m // QMChatViewController // -// Created by Vitaliy Gurkovsky on 8/10/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 8/10/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMChatDataSource.h" @@ -103,19 +103,25 @@ - (void)changeDataSourceWithMessages:(NSArray *)messages forUpdateType:(QMDataSo NSMutableArray *messageIDs = [NSMutableArray arrayWithCapacity:messages.count]; NSMutableArray *messagesArray = [NSMutableArray arrayWithCapacity:messages.count]; NSEnumerator *enumerator = [messages objectEnumerator]; - if (_customDividerInterval > 0 - && updateType == QMDataSourceActionTypeAdd) { - NSSortDescriptor *dateSentDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateSent" - ascending:YES]; - NSSortDescriptor *idDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"ID" - ascending:YES]; + + if (self.customDividerInterval > 0 && updateType == QMDataSourceActionTypeAdd) { + + NSSortDescriptor *dateSentDescriptor = + [NSSortDescriptor sortDescriptorWithKey:@"dateSent" ascending:YES]; + + NSSortDescriptor *idDescriptor = + [NSSortDescriptor sortDescriptorWithKey:@"ID" ascending:YES]; + enumerator = [[messages sortedArrayUsingDescriptors:@[dateSentDescriptor, idDescriptor]] objectEnumerator]; } + for (QBChatMessage *message in enumerator) { NSAssert(message.dateSent != nil, @"Message must have dateSent!"); - if ([self shouldSkipMessage:message forDataSourceUpdateType:updateType]) { + BOOL messageExists = [self messageExists:message]; + BOOL skip = (updateType == QMDataSourceActionTypeAdd ? messageExists : !messageExists); + if (skip) { continue; } @@ -140,13 +146,22 @@ - (void)changeDataSourceWithMessages:(NSArray *)messages forUpdateType:(QMDataSo QBChatMessage *dividerMessage = nil; NSDate *removedDivider = nil; - [self handleMessage:message forUpdateType:updateType dividerMessage:÷rMessage removedDivider:&removedDivider]; + + [self handleMessage:message + forUpdateType:updateType + dividerMessage:÷rMessage + removedDivider:&removedDivider]; + if (dividerMessage != nil) { [messagesArray addObject:dividerMessage]; [messageIDs addObject:dividerMessage.ID]; } + if (removedDivider != nil) { - NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatMessage *chatMessage, NSDictionary *bindings) { + + NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatMessage *chatMessage, + NSDictionary * bindings) { + return chatMessage.isDateDividerMessage && [chatMessage.dateSent isEqualToDate:removedDivider]; }]; @@ -223,13 +238,6 @@ - (NSArray *)indexPathsForMessages:(NSArray *)messages { return [NSArray arrayWithArray:indexPaths]; } -- (BOOL)shouldSkipMessage:(QBChatMessage *)message forDataSourceUpdateType:(QMDataSourceActionType)updateType { - - BOOL messageExists = [self messageExists:message]; - - return (updateType == QMDataSourceActionTypeAdd ? messageExists : !messageExists); -} - // MARK: - Helpers - (NSArray *)allMessages { @@ -339,12 +347,12 @@ - (BOOL)hasMessages:(QBChatMessage *)messageToUpdate forUpdateType:(QMDataSource NSPredicate *predicate = nil; if (updateType == QMDataSourceActionTypeRemove) { - predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatMessage * _Nonnull message, NSDictionary * _Nullable bindings) { + predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatMessage * _Nonnull message, NSDictionary * _Nullable bindings) { return !message.isDateDividerMessage && [message.dateSent isBetweenStartDate:startDate andEndDate:endDate respectOrderedSame:YES] && message.ID != messageToUpdate.ID; }]; } else { - predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatMessage * _Nonnull message, NSDictionary * _Nullable bindings) { + predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatMessage * _Nonnull message, NSDictionary * _Nullable bindings) { return !message.isDateDividerMessage && [message.dateSent isBetweenStartDate:startDate andEndDate:endDate respectOrderedSame:YES]; }]; } @@ -392,7 +400,7 @@ - (void)handleMessage:(QBChatMessage *)message forUpdateType:(QMDataSourceAction if (removeDate != nil) { [self.dateDividers removeObject:removeDate]; - NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatMessage *chatMessage, NSDictionary *bindings) { + NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatMessage *chatMessage, NSDictionary * bindings) { return chatMessage.isDateDividerMessage && [chatMessage.dateSent isEqualToDate:removeDate]; }]; QBChatMessage *msg = [[self.allMessages filteredArrayUsingPredicate:predicate] firstObject]; @@ -427,7 +435,7 @@ - (void)handleMessage:(QBChatMessage *)message forUpdateType:(QMDataSourceAction NSDate *divideDate = _customDividerInterval > 0 ? [self appropriateDividerForMessageDate:message.dateSent] : [message.dateSent dateAtStartOfDay]; - NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatMessage *chatMessage, NSDictionary *bindings) { + NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(QBChatMessage *chatMessage, NSDictionary * bindings) { return chatMessage.isDateDividerMessage && [chatMessage.dateSent isEqualToDate:divideDate]; }]; diff --git a/Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.h b/Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.h new file mode 100644 index 000000000..6e966e167 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.h @@ -0,0 +1,23 @@ +// +// QMChatLocationSnapshotter.h +// QMChatViewController +// +// Created by Injoit on 7/6/16. +// Copyright © 2016 QuickBlox. All rights reserved. +// + +#import +#import + +typedef void(^QMChatLocationSnapshotBlock)(UIImage *snapshot); + +@interface QMChatLocationSnapshotter : NSObject + ++ (void)snapshotForLocationCoordinate:(CLLocationCoordinate2D)locationCoordinate + withSize:(CGSize)size + key:(NSString *)key + completion:(QMChatLocationSnapshotBlock)completion; + ++ (void)cancelSnapshotCreationForKey:(NSString *)key; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.m b/Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.m similarity index 86% rename from Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.m rename to Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.m index 8968c33dc..140238483 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.m +++ b/Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/QMChatLocationSnapshotter.m @@ -2,8 +2,8 @@ // QMChatLocationSnapshotter.m // QMChatViewController // -// Created by Vitaliy Gorbachov on 7/6/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 7/6/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMChatLocationSnapshotter.h" @@ -19,8 +19,8 @@ @implementation QMChatLocationSnapshotter + (void)snapshotForLocationCoordinate:(CLLocationCoordinate2D)locationCoordinate withSize:(CGSize)size key:(NSString *)key completion:(QMChatLocationSnapshotBlock)completion { NSParameterAssert(key); - - UIImage *locationSnapshot = [QMImageLoader.instance.imageCache imageFromCacheForKey:key]; + SDImageCache *qmCache = (SDImageCache *)[QMImageLoader instance].imageCache; + UIImage *locationSnapshot = [qmCache imageFromCacheForKey:key]; if (locationSnapshot) { completion(locationSnapshot); @@ -38,7 +38,7 @@ + (void)snapshotForLocationCoordinate:(CLLocationCoordinate2D)locationCoordinate [[[self class] _snapshotOperations] setObject:snapShotter forKey:key]; [snapShotter startWithQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) - completionHandler:^(MKMapSnapshot *snapshot, NSError *error) { + completionHandler:^(MKMapSnapshot *snapshot, NSError * error) { if (snapshot == nil) { @@ -62,11 +62,10 @@ + (void)snapshotForLocationCoordinate:(CLLocationCoordinate2D)locationCoordinate finalImage = UIGraphicsGetImageFromCurrentImageContext(); } UIGraphicsEndImageContext(); - - [QMImageLoader.instance.imageCache storeImage:finalImage - forKey:key - toDisk:YES - completion:nil]; + [qmCache storeImage:finalImage + forKey:key + toDisk:YES + completion:nil]; dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.h b/Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.h new file mode 100644 index 000000000..a3f715476 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.h @@ -0,0 +1,16 @@ +// +// UIImageView+QMLocationSnapshot.h +// QMChatViewController +// +// Created by Injoit on 7/7/16. +// Copyright © 2016 QuickBlox. All rights reserved. +// + +#import +#import + +@interface UIImageView (QMLocationSnapshot) + +- (void)setSnapshotWithLocationCoordinate:(CLLocationCoordinate2D)locationCoordinate; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.m b/Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.m similarity index 95% rename from Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.m rename to Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.m index a8c38e5ad..78e127f11 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.m +++ b/Q-municate/Classes/QMChatViewController/QMChatLocationSnapshotter/UIImageView+QMLocationSnapshot.m @@ -2,8 +2,8 @@ // UIImageView+QMLocationSnapshot.m // QMChatViewController // -// Created by Vitaliy Gorbachov on 7/7/16. -// Copyright © 2016 Quickblox. All rights reserved. +// Created by Injoit on 7/7/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "UIImageView+QMLocationSnapshot.h" diff --git a/Q-municate/Classes/QMChatViewController/QMChatViewController.h b/Q-municate/Classes/QMChatViewController/QMChatViewController.h new file mode 100644 index 000000000..797e1a183 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/QMChatViewController.h @@ -0,0 +1,290 @@ +// +// QMChatViewController.h +// QMChatViewController +// +// Created by Injoit on 06.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import + +#import "QMChatCollectionView.h" +#import "QMChatCollectionViewDelegateFlowLayout.h" +#import "QMChatCollectionViewFlowLayout.h" +#import "QMChatActionsHandler.h" +#import "QMInputToolbar.h" +#import + +#import "QMChatContactRequestCell.h" +#import "QMChatIncomingCell.h" +#import "QMChatOutgoingCell.h" +#import "QMChatNotificationCell.h" +#import "QMChatAttachmentIncomingCell.h" +#import "QMChatAttachmentOutgoingCell.h" +#import "QMChatLocationIncomingCell.h" +#import "QMChatLocationOutgoingCell.h" +#import "QMChatDataSource.h" + +#import "QMVideoIncomingCell.h" +#import "QMAudioIncomingCell.h" +#import "QMImageIncomingCell.h" + +#import "QMVideoOutgoingCell.h" +#import "QMImageOutgoingCell.h" +#import "QMAudioOutgoingCell.h" + +#import "QMMediaViewDelegate.h" +#import "QMChatBaseLinkPreviewCell.h" +#import "QMChatIncomingLinkPreviewCell.h" +#import "QMChatOutgoingLinkPreviewCell.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface QMChatViewController : UIViewController + +@property (strong, nonatomic) QMChatDataSource *chatDataSource; +/** + * Cell's contact request delegate. + */ +@property (weak, nonatomic) id actionsHandler; + +/** + * Returns the collection view object managed by this view controller. + * This view controller is the collection view's data source and delegate. + */ +@property (weak, nonatomic, readonly) QMChatCollectionView *collectionView; + +/** + * Returns the input toolbar view object managed by this view controller. + * This view controller is the toolbar's delegate. + */ +@property (weak, nonatomic, readonly) QMInputToolbar *inputToolbar; + +/** + Progress view. Is hiden by default. + */ +@property (weak, nonatomic) IBOutlet FFCircularProgressView *progressView; + +/** + * The display name of the current user who is sending messages. + * + * @discussion This value does not have to be unique. This value must not be `nil`. + */ +@property (copy, nonatomic) NSString *senderDisplayName; + +/** + * The string identifier that uniquely identifies the current user sending messages. + * + * @discussion This property is used to determine if a message is incoming or outgoing. + * All message data objects returned by `collectionView:messageDataForItemAtIndexPath:` are + * checked against this identifier. This value must not be `nil`. + */ +@property (assign, nonatomic) NSUInteger senderID; + +/** + * Specifies whether or not the view controller should automatically scroll to the most recent message + * when the view appears and when sending, receiving, and composing a new message. + * + * @discussion The default value is `YES`, which allows the view controller to scroll automatically to the most recent message. + * Set to `NO` if you want to manage scrolling yourself. + */ +@property (assign, nonatomic) BOOL automaticallyScrollsToMostRecentMessage; + +/** + * Specifies an additional inset amount to be added to the collectionView's contentInsets.top value. + * + * @discussion Use this property to adjust the top content inset to account for a custom subview at the top of your view controller. + */ +@property (assign, nonatomic) CGFloat topContentAdditionalInset; + +/** + * Enable text checking types for cells. Must be set in view did load. + */ +@property (assign, nonatomic) NSTextCheckingTypes enableTextCheckingTypes; + +/** + * Method to create chat message text attributed string. Have to be overriden in subclasses. + * + * @param messageItem Chat message instance. + * + * @return Configured attributed string. + */ +- (nullable NSAttributedString *)attributedStringForItem:(QBChatMessage *)messageItem; + +/** + * Method to create chat message top label attributed string (Usually - chat message owner name). Have to be overriden in subclasses. + * + * @param messageItem Chat message instance. + * + * @return Configured attributed string. + */ +- (nullable NSAttributedString *)topLabelAttributedStringForItem:(QBChatMessage *)messageItem; + +/** + * Method to create chat message bottom label attributed string (Usually - chat message date sent). Have to be overriden in subclasses. + * + * @param messageItem Chat message instance. + * + * @return Configured attributed string. + */ +- (nullable NSAttributedString *)bottomLabelAttributedStringForItem:(QBChatMessage *)messageItem; + +/** + * Collection Cell View class for specific message. Have to be overriden in subclasses. Defaults cells are supplied with QMChatViewController. + * + * @param item Chat message instance. + * + * @return Collection Cell View Class + */ +- (Class)viewClassForItem:(QBChatMessage *)item; + +- (void)collectionView:(QMChatCollectionView *)collectionView configureCell:(UICollectionViewCell *)cell forIndexPath:(NSIndexPath *)indexPath; + +#pragma mark - Class methods + +/** + * Returns the `UINib` object initialized for a `QMChatViewController`. + * + * @return The initialized `UINib` object or `nil` if there were errors during initialization + * or the nib file could not be located. + * + * @discussion You may override this method to provide a customized nib. If you do, + * you should also override `messagesViewController` to return your + * view controller loaded from your custom nib. + */ ++ (UINib *)nib; + +/** + * Creates and returns a new `QMChatViewController` object. + * + * @discussion This is the designated initializer for programmatic instantiation. + * + * @return An initialized `QMChatViewController` object if successful, `nil` otherwise. + */ ++ (instancetype)messagesViewController; + +#pragma mark - Messages view controller + +/** + * This method is called when the user taps the send button on the inputToolbar + * after composing a message with the specified data. + * + * @param button The send button that was pressed by the user. + * @param text The message text. + * @param senderId The message sender identifier. + * @param senderDisplayName The message sender display name. + * @param date The message date. + */ +- (void)didPressSendButton:(UIButton *)button + withMessageText:(NSString *)text + senderId:(NSUInteger)senderId + senderDisplayName:(NSString *)senderDisplayName + date:(NSDate *)date; + +/** + * This method is called when the user taps the send button on the inputToolbar + * after composing a message with the specified data. + * + * @param button The send button that was pressed by the user. + * @param textAttachments Array of NSTextAttachment. + * @param senderId The message sender identifier. + * @param senderDisplayName The message sender display name. + * @param date The message date. + */ +- (void)didPressSendButton:(UIButton *)button + withTextAttachments:(NSArray *)textAttachments + senderId:(NSUInteger)senderId + senderDisplayName:(NSString *)senderDisplayName + date:(NSDate *)date; +/** + * This method is called when the user taps the accessory button on the `inputToolbar`. + * + * @param sender The accessory button that was pressed by the user. + */ +- (void)didPressAccessoryButton:(UIButton *)sender; + +/** + * This method is called when the user finishes picking attachment image. + * + * @param image image that was picked by user + */ +- (void)didPickAttachmentImage:(UIImage *)image; + +/** + * Animates the sending of a new message. See `finishSendingMessageAnimated:` for more details. + * + * @see `finishSendingMessageAnimated:`. + */ +- (void)finishSendingMessage; + +/** + * Completes the "sending" of a new message by resetting the `inputToolbar`, adding a new collection view cell in the collection view, + * reloading the collection view, and scrolling to the newly sent message as specified by `automaticallyScrollsToMostRecentMessage`. + * Scrolling to the new message can be animated as specified by the animated parameter. + * + * @param animated Specifies whether the sending of a message should be animated or not. Pass `YES` to animate changes, `NO` otherwise. + * + * @discussion You should call this method at the end of `didPressSendButton: withMessageText: senderId: senderDisplayName: date` + * after adding the new message to your data source and performing any related tasks. + * + * @see `automaticallyScrollsToMostRecentMessage`. + */ +- (void)finishSendingMessageAnimated:(BOOL)animated; + +/** + * Animates the receiving of a new message. See `finishReceivingMessageAnimated:` for more details. + * + * @see `finishReceivingMessageAnimated:`. + */ +- (void)finishReceivingMessage; + +/** + * Completes the "receiving" of a new message by adding a new collection view cell in the collection view, + * reloading the collection view, and scrolling to the newly sent message as specified by `automaticallyScrollsToMostRecentMessage`. + * Scrolling to the new message can be animated as specified by the animated parameter. + * + * @param animated Specifies whether the receiving of a message should be animated or not. Pass `YES` to animate changes, `NO` otherwise. + * + * @discussion You should call this method after adding a new "received" message to your data source and performing any related tasks. + * + * @see `automaticallyScrollsToMostRecentMessage`. + */ +- (void)finishReceivingMessageAnimated:(BOOL)animated; + +/** + Input bar start pos + */ +- (NSUInteger)inputToolBarStartPos; + +/** + * Scrolls the collection view such that the bottom most cell is completely visible, above the `inputToolbar`. + * + * @param animated Pass `YES` if you want to animate scrolling, `NO` if it should be immediate. + */ +- (void)scrollToBottomAnimated:(BOOL)animated; + +/** + * Hides keyboard + * + * @param animated Pass `YES` if you want to animate hiding, `NO` if it should be immediate. + */ +- (void)hideKeyboard:(BOOL)animated; + +/** + Make the background layer to spin around its center. This should be called in the main thread. + */ +- (void)startSpinProgress; + +/** + Stop the spinning of the background layer. This should be called in the main thread. + */ +- (void)stopSpinProgress; + +#pragma mark - Methods requiring super + +- (void)viewDidLoad NS_REQUIRES_SUPER; +- (void)viewWillAppear:(BOOL)animated NS_REQUIRES_SUPER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/QMCVDevelopment/QMChatViewController/QMChatViewController.m b/Q-municate/Classes/QMChatViewController/QMChatViewController.m similarity index 92% rename from Pods/QMCVDevelopment/QMChatViewController/QMChatViewController.m rename to Q-municate/Classes/QMChatViewController/QMChatViewController.m index b51ada289..7a021b710 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/QMChatViewController.m +++ b/Q-municate/Classes/QMChatViewController/QMChatViewController.m @@ -2,8 +2,8 @@ // QMChatViewController.m // QMChatViewController // -// Created by Andrey Ivanov on 06.04.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. +// Created by Injoit on 06.04.15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "QMChatViewController.h" @@ -25,11 +25,9 @@ const NSUInteger kQMSystemInputToolbarDebugHeight = 0; -@interface QMChatViewController () - - +QMChatDataSourceDelegate, QMAudioRecordToolbarDelegate> @property (weak, nonatomic) IBOutlet QMChatCollectionView *collectionView; @property (weak, nonatomic) IBOutlet QMInputToolbar *inputToolbar; @@ -70,8 +68,7 @@ - (void)dealloc { self.inputToolbar.contentView.textView.delegate = nil; self.inputToolbar.contentView.textView.qm_placeholderTextViewPasteDelegate = nil; self.inputToolbar.delegate = nil; - - self.senderDisplayName = nil; + } - (void)viewDidLoad { @@ -87,7 +84,6 @@ - (void)viewDidLoad { //Customize your toolbar buttons self.inputToolbar.contentView.leftBarButtonItem = [self accessoryButtonItem]; self.inputToolbar.contentView.rightBarButtonItem = [self sendButtonItem]; - self.inputToolbar.audioRecordingEnabled = YES; __weak __typeof(self) weakSelf = self; self.systemInputToolbar = [[QMKVOView alloc] init]; @@ -96,18 +92,17 @@ - (void)viewDidLoad { self.systemInputToolbar.frame = CGRectMake(0, 0, 0, kQMSystemInputToolbarDebugHeight); self.systemInputToolbar.hostViewFrameChangeBlock = ^(UIView *view, BOOL animated) { - CGFloat pos = view.superview.frame.size.height - view.frame.origin.y ; + CGFloat pos = weakSelf.view.frame.size.height - [weakSelf.view.superview convertPoint:view.frame.origin toView:weakSelf.view].y; if (weakSelf.inputToolbar.contentView.textView.isFirstResponder) { - - if (view.superview.frame.origin.y > 0 && pos == 0) { + if (view.superview.frame.origin.y > 0 && pos <= 0) { return; } } - + const CGFloat v = [weakSelf inputToolBarStartPos]; - if (pos < v ) { + if (pos < v || !view) { pos = v; } @@ -170,6 +165,7 @@ - (void)configureMessagesViewController { self.chatDataSource.delegate = self; self.inputToolbar.delegate = self; + self.inputToolbar.audioRecordDelegate = self; self.inputToolbar.contentView.textView.delegate = self; self.automaticallyScrollsToMostRecentMessage = YES; @@ -236,8 +232,8 @@ - (UIImagePickerController *)pickerController return _pickerController; } -#pragma mark - -#pragma mark QMChatDataSourceDelegate +#pragma mark - mark - +#pragma mark - mark QMChatDataSourceDelegate - (void)changeDataSource:(QMChatDataSource *)dataSource withMessages:(NSArray *)messages updateType:(QMDataSourceActionType)updateType { @@ -256,18 +252,18 @@ - (void)changeDataSource:(QMChatDataSource *)dataSource } switch (updateType) { - + case QMDataSourceActionTypeAdd: - [self.collectionView insertItemsAtIndexPaths:indexPaths]; - break; - + [self.collectionView insertItemsAtIndexPaths:indexPaths]; + break; + case QMDataSourceActionTypeUpdate: - [self.collectionView reloadItemsAtIndexPaths:indexPaths]; - break; - + [self.collectionView reloadItemsAtIndexPaths:indexPaths]; + break; + case QMDataSourceActionTypeRemove: - [self.collectionView deleteItemsAtIndexPaths:indexPaths]; - break; + [self.collectionView deleteItemsAtIndexPaths:indexPaths]; + break; } }; @@ -285,10 +281,6 @@ - (void)chatDataSource:(QMChatDataSource *)chatDataSource willBeChangedWithMessa - (NSUInteger)inputToolBarStartPos { - if (self.tabBarItem) { - return self.tabBarController.tabBar.frame.size.height; - } - return 0; } @@ -371,18 +363,18 @@ - (void)didPressSendButton:(UIButton *)button { - (void)didPressSendButton:(UIButton *)button withMessageText:(NSString *)text - senderId:(NSUInteger)senderId + senderId:(NSUInteger) senderId senderDisplayName:(NSString *)senderDisplayName date:(NSDate *)date { NSAssert(NO, @"Error! required method not implemented in subclass. Need to implement %s", __PRETTY_FUNCTION__); } -- (void)didPressSendButton:(UIButton *)__unused button - withTextAttachments:(NSArray *)__unused textAttachments - senderId:(NSUInteger)__unused senderId - senderDisplayName:(NSString *)__unused senderDisplayName - date:(NSDate *)__unused date { +- (void)didPressSendButton:(UIButton *)button + withTextAttachments:(NSArray *)textAttachments + senderId:(NSUInteger) senderId + senderDisplayName:(NSString *)senderDisplayName + date:(NSDate *)date { NSAssert(NO, @"Error! required method not implemented in subclass. Need to implement %s", __PRETTY_FUNCTION__); } @@ -416,7 +408,7 @@ - (void)didPressAccessoryButton:(UIButton *)sender { [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Camera", nil) style:UIAlertActionStyleDefault - handler:^(UIAlertAction * _Nonnull __unused action) { + handler:^(UIAlertAction * _Nonnull action) { self.pickerController.sourceType = UIImagePickerControllerSourceTypeCamera; handler(); @@ -424,7 +416,7 @@ - (void)didPressAccessoryButton:(UIButton *)sender { [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Photo Library", nil) style:UIAlertActionStyleDefault - handler:^(UIAlertAction * _Nonnull __unused action) { + handler:^(UIAlertAction * _Nonnull action) { self.pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; handler(); @@ -506,7 +498,7 @@ - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView { #pragma mark - Collection view data source -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger) section { return [self.chatDataSource messagesCount]; } @@ -588,12 +580,12 @@ - (BOOL)collectionView:(QMChatCollectionView *)collectionView shouldShowMenuForI return YES; } -- (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender { +- (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id) sender { return action == @selector(copy:); } -- (void)collectionView:(QMChatCollectionView *)collectionView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender { +- (void)collectionView:(QMChatCollectionView *)collectionView performAction:(SEL) action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id) sender { NSAssert(NO, @"Have to be overridden in subclasses."); } @@ -676,7 +668,7 @@ - (NSArray *)currentlyComposedMessageTextAttachments { [attributedText enumerateAttribute:NSAttachmentAttributeName inRange:NSMakeRange(0, [attributedText length]) options:0 - usingBlock:^(id value, NSRange range, BOOL *stop) + usingBlock:^(id value, NSRange range, BOOL * stop) { if ([value isKindOfClass:[NSTextAttachment class]]) { @@ -717,14 +709,6 @@ - (void)textViewDidEndEditing:(UITextView *)textView { } } -#pragma mark - UIAlertViewDelegate - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - if (buttonIndex == 1) { - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; - } -} - #pragma mark - UIImagePickerControllerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info @@ -800,13 +784,6 @@ - (void)setToolbarBottomConstraintValue:(CGFloat)constraintValue animated:(BOOL) self.toolbarBottomLayoutGuide.constant = constraintValue; if (animated) { - - self.navigationController.interactivePopGestureRecognizer.enabled = NO; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - - self.navigationController.interactivePopGestureRecognizer.enabled = YES; - }); - [self.view layoutIfNeeded]; } } @@ -957,10 +934,10 @@ - (void)checkAuthorizationStatusWithCompletion:(void (^)(BOOL granted))completio switch (status) { case PHAuthorizationStatusAuthorized: - if (completion) { - completion(YES); - } - break; + if (completion) { + completion(YES); + } + break; case PHAuthorizationStatusNotDetermined: { [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus authorizationStatus) @@ -974,10 +951,10 @@ - (void)checkAuthorizationStatusWithCompletion:(void (^)(BOOL granted))completio break; } default: - if (completion) { - completion(NO); - } - break; + if (completion) { + completion(NO); + } + break; } } } @@ -996,20 +973,30 @@ - (void)showAlertForAccess { message = NSLocalizedString(@"You can allow access to Photos in Settings", nil); } - UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title - message:message - delegate:self - cancelButtonTitle:NSLocalizedString(@"Cancel", nil) - otherButtonTitles:NSLocalizedString(@"Open Settings", nil),nil]; + UIAlertController *alertController = [UIAlertController + alertControllerWithTitle:title + message:message + preferredStyle:UIAlertControllerStyleAlert]; + + [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Open Settings", nil) + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * _Nonnull action) + { + [UIApplication.sharedApplication openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; + }]]; + + [alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) + style:UIAlertActionStyleCancel + handler:nil]]; - [alert show]; + [self presentViewController:alertController animated:YES completion:nil]; } - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; [coordinator animateAlongsideTransition:nil - completion:^(id _Nonnull context) { + completion:^(id _Nonnull context) { [self updateCollectionViewInsets]; }]; diff --git a/Q-municate/Classes/QMChatViewController/Utils/QMChatResources/QMChatResources.h b/Q-municate/Classes/QMChatViewController/Utils/QMChatResources/QMChatResources.h new file mode 100644 index 000000000..3e7f1dbae --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Utils/QMChatResources/QMChatResources.h @@ -0,0 +1,18 @@ +// +// QMChatResources.h +// QMChatViewController +// +// Created by Injoit on 8/10/16. +// Copyright © 2016 QuickBlox. All rights reserved. +// + +#import + +@interface QMChatResources : NSObject + ++ (NSBundle *)resourceBundle; + ++ (UIImage *)imageNamed:(NSString *)name; ++ (UINib *)nibWithNibName:(NSString *)name; + +@end diff --git a/Q-municate/Classes/QMChatViewController/Utils/QMChatResources/QMChatResources.m b/Q-municate/Classes/QMChatViewController/Utils/QMChatResources/QMChatResources.m new file mode 100644 index 000000000..71b2b1881 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Utils/QMChatResources/QMChatResources.m @@ -0,0 +1,49 @@ +// +// QMChatResources.m +// QMChatViewController +// +// Created by Injoit on 8/10/16. +// Copyright © 2016 QuickBlox. All rights reserved. +// + +#import "QMChatResources.h" + +@implementation QMChatResources + ++ (NSBundle *)resourceBundle { + + static NSBundle *_bundle = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + + _bundle = [NSBundle bundleForClass:[QMChatResources class]]; + NSURL *url = [_bundle URLForResource:@"QMChatViewController" withExtension:@"bundle"]; + if (url != nil) { + _bundle = [NSBundle bundleWithURL:url]; + } + + if (_bundle == nil) { + // if bundle with path is not existent that means that chat controller + // was installed as a source from github, using main bundle instead + _bundle = [NSBundle mainBundle]; + } + }); + + return _bundle; +} + ++ (UIImage *)imageNamed:(NSString *)name { + + UIImage *image = [UIImage imageNamed:name + inBundle:[self resourceBundle] + compatibleWithTraitCollection:nil]; + + return image; +} + ++ (UINib *)nibWithNibName:(NSString *)name { + + return [UINib nibWithNibName:name bundle:[self resourceBundle]]; +} + +@end diff --git a/Q-municate/Classes/QMChatViewController/Utils/QMDateUtils/QMDateUtils.h b/Q-municate/Classes/QMChatViewController/Utils/QMDateUtils/QMDateUtils.h new file mode 100644 index 000000000..c669a05d0 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Utils/QMDateUtils/QMDateUtils.h @@ -0,0 +1,97 @@ +// +// QMDateUtils.h +// QMChatViewController +// +// Created by Injoit on 11/19/15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import + +@interface QMDateUtils : NSObject + +/** + * Formatted string for date. + * + * @param date date to make formatted string from + * + * @return string with formatted full date (used in chat sections names) + */ ++ (NSString *)formattedStringFromDate:(NSDate *)date; + +/** + * Formatted last seen string. + * + * @param date date to make formatted string from + * @param timePrefix time prefix between date and time + * + * @return string with formatted full date (used for last seen) + */ ++ (NSString *)formattedLastSeenString:(NSDate *)date withTimePrefix:(NSString *)timePrefix; + +/** + * Formatted short date string. + * + * @param date date to make formatted string from + * + * @return string with short date format (e.g. time for today, Yesterday, week day name or full date) + */ ++ (NSString *)formattedShortDateString:(NSDate *)date; + +#pragma mark - custom formatting + +/** + * Formatted string for time of date. + * + * @param date date to make formatted string from + * + * @return string with basic time localized format (e.g. 11:10 AM) + */ ++ (NSString *)formatDateForTimeRange:(NSDate *)date; + +/** + * Formatted string for day of date. + * + * @param date date to make formatted string from + * + * @return string with basic day localized format (e.g. Yesterday, Today, Tomorrow) + */ ++ (NSString *)formatDateForDayRange:(NSDate *)date; + +/** + * Formatted string for week of date. + * + * @param date date to make formatted string from + * + * @return string with basic week localized format (e.g. Monday, Tuesday, Wednesday) + */ ++ (NSString *)formatDateForWeekRange:(NSDate *)date; + +/** + * Formatted string for month of date. + * + * @param date date to make formatted string from + * + * @return string with basic month localized format (e.g. September, October, November) + */ ++ (NSString *)formatDateForMonthRange:(NSDate *)date; + +/** + * Formatted string for year of date. + * + * @param date date to make formatted string from + * + * @return string with basic year format (e.g. 2016) + */ ++ (NSString *)formatDateForYearRange:(NSDate *)date; + +/** + * Formatted string for date. + * + * @param date date to make formatted string from + * + * @return string with base date format (e.g. 11/08/2011) + */ ++ (NSString *)formatDateForString:(NSDate *)date; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMDateUtils/QMDateUtils.m b/Q-municate/Classes/QMChatViewController/Utils/QMDateUtils/QMDateUtils.m similarity index 98% rename from Pods/QMCVDevelopment/QMChatViewController/Utils/QMDateUtils/QMDateUtils.m rename to Q-municate/Classes/QMChatViewController/Utils/QMDateUtils/QMDateUtils.m index f40b0016f..4950435a7 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMDateUtils/QMDateUtils.m +++ b/Q-municate/Classes/QMChatViewController/Utils/QMDateUtils/QMDateUtils.m @@ -2,8 +2,8 @@ // QMDateUtils.m // QMChatViewController // -// Created by Vitaliy Gorbachov on 11/19/15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. +// Created by Injoit on 11/19/15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "QMDateUtils.h" diff --git a/Q-municate/Classes/QMChatViewController/Utils/QMImageLoader/QMImageLoader.h b/Q-municate/Classes/QMChatViewController/Utils/QMImageLoader/QMImageLoader.h new file mode 100644 index 000000000..f7dabb142 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Utils/QMImageLoader/QMImageLoader.h @@ -0,0 +1,75 @@ +// +// QMImageLoader.h +// QMChatViewController +// +// Created by Injoit on 9/12/16. +// Copyright © 2016 QuickBlox. All rights reserved. +// + +#import +#import "UIImage+Cropper.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef UIImage * _Nullable (^QMCustomTransformBlock)(NSURL *imageURL, UIImage *originalImage); + +typedef NS_ENUM(NSInteger, QMImageTransformType) { + + QMImageTransformTypeScaleAndCrop = 0, + QMImageTransformTypeCircle, + QMImageTransformTypeRounding, + QMImageTransformTypeCustom +}; + + +@interface QMImageTransform : NSObject + ++ (instancetype)transformWithType:(QMImageTransformType)transformType + size:(CGSize)size; + ++ (instancetype)transformWithSize:(CGSize)size customTransformBlock:(QMCustomTransformBlock)customTransformBlock; ++ (instancetype)transformWithSize:(CGSize)size isCircle:(BOOL)isCircle; //deprecate??? +- (void)applyTransformForImage:(UIImage *)image completionBlock:(void(^)(UIImage *transformedImage))transformCompletionBlock; +- (NSString *)keyWithURL:(NSURL *)url; + +@end + +typedef void(^QMWebImageCompletionWithFinishedBlock)(UIImage *_Nullable image, UIImage *_Nullable transfomedImage, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL); + +/** + * QMImageLoader class interface. + * This class is responsible for image caching, loading and size handling using + * SDWebImage component. + */ +@interface QMImageLoader : SDWebImageManager + +@property (nonatomic, readonly, class) QMImageLoader *instance; + + ++ (SDWebImageManager *)sharedManager NS_UNAVAILABLE; + +- (UIImage *)originalImageWithURL:(NSURL *)url; +- (BOOL)hasOriginalImageWithURL:(NSURL *)url; +- (NSString *)pathForOriginalImageWithURL:(NSURL *)url; + + +- (BOOL)hasImageOperationWithURL:(NSURL *)url; +- (id)operationWithURL:(NSURL *)url; +- (void)cancelOperationWithURL:(NSURL *)url; + +- (id)downloadImageWithURL:(NSURL *)url + transform:(nullable QMImageTransform *)transform + options:(SDWebImageOptions)options + progress:(_Nullable SDImageLoaderProgressBlock)progressBlock + completed:(QMWebImageCompletionWithFinishedBlock)completedBlock; + +- (id)downloadImageWithURL:(NSURL *)url + token:(nullable NSString *)token + transform:(QMImageTransform *)transform + options:(SDWebImageOptions)options + progress:(_Nullable SDImageLoaderProgressBlock)progressBlock + completed:(QMWebImageCompletionWithFinishedBlock)completedBlock; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMImageLoader/QMImageLoader.m b/Q-municate/Classes/QMChatViewController/Utils/QMImageLoader/QMImageLoader.m similarity index 91% rename from Pods/QMCVDevelopment/QMChatViewController/Utils/QMImageLoader/QMImageLoader.m rename to Q-municate/Classes/QMChatViewController/Utils/QMImageLoader/QMImageLoader.m index 7db99bd3d..7b25adf10 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/Utils/QMImageLoader/QMImageLoader.m +++ b/Q-municate/Classes/QMChatViewController/Utils/QMImageLoader/QMImageLoader.m @@ -2,8 +2,8 @@ // QMImageLoader.m // QMChatViewController // -// Created by Vitaliy Gorbachov on 9/12/16. -// Copyright (c) 2016 Quickblox. All rights reserved. +// Created by Injoit on 9/12/16. +// Copyright © 2016 QuickBlox. All rights reserved. // #import "QMImageLoader.h" @@ -194,7 +194,7 @@ + (instancetype)instance { qmCache = [[SDImageCache alloc] initWithNamespace:@"default"]; } - qmCache.maxMemoryCost = 15 * 1024 * 1024; + qmCache.config.maxMemoryCost = 15 * 1024 * 1024; SDWebImageDownloader *qmDownloader = [SDWebImageDownloader sharedDownloader]; @@ -206,8 +206,7 @@ + (instancetype)instance { - (instancetype)initWithCache:(SDImageCache *)cache downloader:(SDWebImageDownloader *)downloader { - - self = [super initWithCache:cache downloader:downloader]; + self = [super initWithCache:cache loader:downloader]; if (self) { _runningOperations = [NSMutableDictionary dictionary]; } @@ -226,7 +225,7 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * - (id )downloadImageWithURL:(NSURL *)url transform:(QMImageTransform *)transform options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock + progress:(SDImageLoaderProgressBlock)progressBlock completed:(QMWebImageCompletionWithFinishedBlock)completedBlock { return [self downloadImageWithURL:url @@ -241,7 +240,7 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * token:(NSString *)token transform:(QMImageTransform *)transform options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock + progress:(SDImageLoaderProgressBlock)progressBlock completed:(QMWebImageCompletionWithFinishedBlock)completedBlock { // Invoking this method without a completedBlock is pointless @@ -291,10 +290,9 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * typedef NSOperation *(^qm_cache_operation)(void); qm_cache_operation cacheOp = ^() { - - return [weakSelf.imageCache queryCacheOperationForKey:key done:^(UIImage * _Nullable image, - NSData * _Nullable data, - SDImageCacheType cacheType) { + return [SDImageCache.sharedImageCache queryCacheOperationForKey:key done:^(UIImage * _Nullable image, + NSData * _Nullable data, + SDImageCacheType cacheType) { if (weakOperation.isCancelled) { [weakSelf safelyRemoveOperationFromRunning:weakOperation]; @@ -317,7 +315,7 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * // download if no image or requested to refresh anyway, and download allowed by delegate SDWebImageDownloaderOptions downloaderOptions = 0; if (options & SDWebImageLowPriority) downloaderOptions |= SDWebImageDownloaderLowPriority; - if (options & SDWebImageProgressiveDownload) downloaderOptions |= SDWebImageDownloaderProgressiveDownload; + if (options & SDWebImageProgressiveLoad) downloaderOptions |= SDWebImageDownloaderProgressiveLoad; if (options & SDWebImageRefreshCached) downloaderOptions |= SDWebImageDownloaderUseNSURLCache; if (options & SDWebImageContinueInBackground) downloaderOptions |= SDWebImageDownloaderContinueInBackground; if (options & SDWebImageHandleCookies) downloaderOptions |= SDWebImageDownloaderHandleCookies; @@ -325,7 +323,7 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * if (options & SDWebImageHighPriority) downloaderOptions |= SDWebImageDownloaderHighPriority; if (image && options & SDWebImageRefreshCached) { // force progressive off if image already cached but forced refreshing - downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload; + downloaderOptions &= ~SDWebImageDownloaderProgressiveLoad; // ignore image read from NSURLCache if image if cached but force refreshing downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse; } @@ -342,14 +340,15 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * urlToDownload = [components URL]; } + SDWebImageDownloadToken * subOperation = - [weakSelf.imageDownloader downloadImageWithURL:urlToDownload - options:downloaderOptions - progress:progressBlock - completed:^(UIImage *downloadedImage, - NSData *data, - NSError *error, - BOOL finished) + [SDWebImageDownloader.sharedDownloader downloadImageWithURL:urlToDownload + options:downloaderOptions + progress:progressBlock + completed:^(UIImage *downloadedImage, + NSData *data, + NSError *error, + BOOL finished) { __strong __typeof(weakOperation) strongOperation = weakOperation; if (!strongOperation || strongOperation.isCancelled) { @@ -388,8 +387,6 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * } } - BOOL cacheOnDisk = !(options & SDWebImageCacheMemoryOnly); - if (options & SDWebImageRefreshCached && image && !downloadedImage) { // Image refresh hit the NSURLCache cache, do not call the completion block } @@ -414,7 +411,7 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * [weakSelf.imageCache storeImage:downloadedImage imageData:(imageWasTransformed ? nil : data) forKey:key - toDisk:cacheOnDisk + cacheType:SDImageCacheTypeDisk completion:nil]; } @@ -439,7 +436,8 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * [weakSelf.imageCache storeImage:downloadedImage imageData:data - forKey:key toDisk:cacheOnDisk + forKey:key + cacheType:cacheType completion:nil]; } @@ -467,7 +465,7 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * __weak __typeof(subOperation)weakSuboperation = subOperation; weakOperation.cancelBlock = ^{ - [weakSelf.imageDownloader cancel:weakSuboperation]; + [weakSuboperation cancel]; __strong __typeof(weakOperation) strongOperation = weakOperation; [weakSelf safelyRemoveOperationFromRunning:strongOperation]; }; @@ -480,8 +478,8 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * if (transform) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ - - UIImage *transformedImage = [weakSelf.imageCache imageFromDiskCacheForKey:transformKey]; + SDImageCache *qmCache = (SDImageCache *)weakSelf.imageCache; + UIImage *transformedImage = [qmCache imageFromDiskCacheForKey:transformKey]; if (!transformedImage) { @@ -542,11 +540,11 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * }; if (transform) { - - [self.imageCache queryCacheOperationForKey:transformKey - done:^(UIImage * _Nullable tranformedImageFromCache, - NSData * _Nullable data, - SDImageCacheType cacheType) + SDImageCache *qmCache = (SDImageCache *)weakSelf.imageCache; + [qmCache queryCacheOperationForKey:transformKey + done:^(UIImage * _Nullable tranformedImageFromCache, + NSData * _Nullable data, + SDImageCacheType cacheType) { if (tranformedImageFromCache) { @@ -574,8 +572,8 @@ - (void)safelyRemoveOperationFromRunning:(nullable QMWebImageCombinedOperation * } - (UIImage *)originalImageWithURL:(NSURL *)url { - - return [self.imageCache imageFromDiskCacheForKey:url.absoluteString]; + SDImageCache *qmCache = (SDImageCache *)self.imageCache; + return [qmCache imageFromDiskCacheForKey:url.absoluteString]; } - (UIImage *)imageManager:(SDWebImageManager *)imageManager @@ -589,11 +587,12 @@ - (UIImage *)imageManager:(SDWebImageManager *)imageManager UIImage *transformedImage = [transform imageManager:imageManager transformDownloadedImage:image withURL:imageURL]; - [self.imageCache storeImage:transformedImage - imageData:nil - forKey:transformKey - toDisk:YES - completion:nil]; + SDImageCache *qmCache = (SDImageCache *)self.imageCache; + [qmCache storeImage:transformedImage + imageData:nil + forKey:transformKey + toDisk:YES + completion:nil]; return transformedImage; } @@ -627,7 +626,8 @@ - (BOOL)hasOriginalImageWithURL:(NSURL *)url { BOOL exists = NO; NSString *key = [self cacheKeyForURL:url]; - NSString *path = [self.imageCache defaultCachePathForKey:key]; + SDImageCache *qmCache = (SDImageCache *)self.imageCache; + NSString *path = [qmCache cachePathForKey:key]; if (path) { exists = [[NSFileManager defaultManager] fileExistsAtPath:path]; } @@ -638,7 +638,8 @@ - (BOOL)hasOriginalImageWithURL:(NSURL *)url { - (NSString *)pathForOriginalImageWithURL:(NSURL *)url { NSString *key = [self cacheKeyForURL:url]; - NSString *path = [self.imageCache defaultCachePathForKey:key]; + SDImageCache *qmCache = (SDImageCache *)self.imageCache; + NSString *path = [qmCache cachePathForKey:key]; if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { return path; diff --git a/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentCell/QMChatAttachmentCell.h b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentCell/QMChatAttachmentCell.h new file mode 100755 index 000000000..9ffbc4dcf --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentCell/QMChatAttachmentCell.h @@ -0,0 +1,33 @@ +// +// QMChatAttachmentCell.h +// QMChatViewController +// +// Created by Injoit on 7/2/15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +/** + * Protocol which describes required methods and properties for attachment cells. + */ +@protocol QMChatAttachmentCell + +/** + * Unique attachment identifier + */ +@property (nonatomic, strong) NSString *attachmentID; + +/** + * Sets attachment image to cell + * + * @param attachmentImage UIImage object + */ +- (void)setAttachmentImage:(UIImage *)attachmentImage; + +/** + * Updates progress label text + * + * @param progress CGFloat value to set + */ +- (void)updateLoadingProgress:(CGFloat)progress; + +@end diff --git a/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.h b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.h new file mode 100755 index 000000000..0a313b710 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.h @@ -0,0 +1,22 @@ +// +// QMChatAttachmentIncomingCell.h +// QMChatViewController +// +// Created by Injoit on 7/1/15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import "QMChatCell.h" +#import "QMChatAttachmentCell.h" + +/** + * Incoming attachment message cell class. + */ +@interface QMChatAttachmentIncomingCell : QMChatCell + +/** + * Attachment image view. + */ +@property (nonatomic, weak) IBOutlet UIImageView *attachmentImageView; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.m b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.m similarity index 95% rename from Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.m rename to Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.m index 3fcc59d59..cf5efa65f 100755 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.m +++ b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.m @@ -3,7 +3,7 @@ // QMChatViewController // // Created by Injoit on 7/1/15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "QMChatAttachmentIncomingCell.h" diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.xib b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.xib similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.xib rename to Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentIncomingCell/QMChatAttachmentIncomingCell.xib diff --git a/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.h b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.h new file mode 100755 index 000000000..dd4558e73 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.h @@ -0,0 +1,22 @@ +// +// QMChatAttachmentOutgoingCell.h +// QMChatViewController +// +// Created by Injoit on 7/1/15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import "QMChatCell.h" +#import "QMChatAttachmentCell.h" + +/** + * Outgoing attachment message cell class. + */ +@interface QMChatAttachmentOutgoingCell : QMChatCell + +/** + * Attachment image view. + */ +@property (nonatomic, weak) IBOutlet UIImageView *attachmentImageView; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.m b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.m similarity index 95% rename from Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.m rename to Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.m index 9ad89f396..a94e343aa 100755 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.m +++ b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.m @@ -3,7 +3,7 @@ // QMChatViewController // // Created by Injoit on 7/1/15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "QMChatAttachmentOutgoingCell.h" diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.xib b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.xib similarity index 100% rename from Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.xib rename to Q-municate/Classes/QMChatViewController/Views/Cells/QMChatAttachmentOutgoingCell/QMChatAttachmentOutgoingCell.xib diff --git a/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.h b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.h new file mode 100644 index 000000000..786b06281 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.h @@ -0,0 +1,211 @@ +// +// QMChatCell.h +// QMChatViewController +// +// Created by Injoit on 14.05.15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import +#import "QMChatContainerView.h" +#import +#import "QMChatCellLayoutAttributes.h" +#import "QMImageView.h" + +struct QMChatLayoutModel { + + CGSize avatarSize; + CGSize containerSize; + UIEdgeInsets containerInsets; + CGFloat topLabelHeight; + CGFloat bottomLabelHeight; + CGSize staticContainerSize; + CGFloat spaceBetweenTopLabelAndTextView; + CGFloat spaceBetweenTextViewAndBottomLabel; + CGFloat maxWidthMarginSpace; + CGFloat maxWidth; +}; + +typedef struct QMChatLayoutModel QMChatCellLayoutModel; + +@class QMChatCell; +@class QMImageView; + +/** + * The `QMChatCellDelegate` protocol defines methods that allow you to manage + * additional interactions within the collection view cell. + */ +@protocol QMChatCellDelegate + +/** + * Protocol methods down below are required to be implemented + */ +@required + +/** + * Tells the delegate that the avatarImageView of the cell has been tapped. + * + * @param cell The cell that received the tap touch event. + */ +- (void)chatCellDidTapAvatar:(QMChatCell *)cell; + +/** + * Tells the delegate that the message container of the cell has been tapped. + * + * @param cell The cell that received the tap touch event. + */ +- (void)chatCellDidTapContainer:(QMChatCell *)cell; + +/** + * Protocol methods down below are optional and can be ignored + */ +@optional + +/** + * Tells the delegate that the cell has been tapped at the point specified by position. + * + * @param cell The cell that received the tap touch event. + * @param position The location of the received touch in the cell's coordinate system. + */ +- (void)chatCell:(QMChatCell *)cell didTapAtPosition:(CGPoint)position; + +/** + * Tells the delegate that an actions has been selected from the menu of this cell. + * This method is automatically called for any registered actions. + * + * @param cell The cell that displayed the menu. + * @param action The action that has been performed. + * @param sender The object that initiated the action. + * + * @see `QMChatCell` + */ +- (void)chatCell:(QMChatCell *)cell didPerformAction:(SEL)action withSender:(id)sender; + +/** + * Tells the delegate that cell receive a tap action on text with a specific checking result. + * + * @param cell cell that received action + * @param textCheckingResult text checking result + */ +- (void)chatCell:(QMChatCell *)cell didTapOnTextCheckingResult:(NSTextCheckingResult *)textCheckingResult; + +@end + +/** + * Base chat cell class. + */ +@interface QMChatCell : UICollectionViewCell + +/** + * Returns the message container view of the cell. This view is the superview of + * the cell's textView, image view or other + * + * @discussion You may customize the cell by adding custom views to this container view. + * To do so, override `collectionView:cellForItemAtIndexPath:` + * + * @warning You should not try to manipulate any properties of this view, for example adjusting + * its frame, nor should you remove this view from the cell or remove any of its subviews. + * Doing so could result in unexpected behavior. + */ +@property (weak, nonatomic, readonly) QMChatContainerView *containerView; +@property (weak, nonatomic, readonly) UIView *messageContainer; + +/** + * Returns the avatar container view of the cell. This view is the superview of the cell's avatarImageView. + * + * @discussion You may customize the cell by adding custom views to this container view. + * To do so, override `collectionView:cellForItemAtIndexPath:` + * + * @warning You should not try to manipulate any properties of this view, for example adjusting + * its frame, nor should you remove this view from the cell or remove any of its subviews. + * Doing so could result in unexpected behavior. + */ +@property (weak, nonatomic, readonly) UIView *avatarContainerView; + +/** + * Property to set avatar view + */ +@property (weak, nonatomic, readonly) QMImageView *avatarView; + +/** + * Returns chat message attributed label. + * + * @warning You should not try to manipulate any properties of this view, for example adjusting + * its frame, nor should you remove this view from the cell or remove any of its subviews. + * Doing so could result in unexpected behavior. + */ +@property (weak, nonatomic, readonly) TTTAttributedLabel *textView; + +/** + * Returns top chat message attributed label. + * + * @warning You should not try to manipulate any properties of this view, for example adjusting + * its frame, nor should you remove this view from the cell or remove any of its subviews. + * Doing so could result in unexpected behavior. + */ +@property (weak, nonatomic, readonly) TTTAttributedLabel *topLabel; + +/** + * Returns bottom chat message attributed label. + * + * @warning You should not try to manipulate any properties of this view, for example adjusting + * its frame, nor should you remove this view from the cell or remove any of its subviews. + * Doing so could result in unexpected behavior. + */ +@property (weak, nonatomic, readonly) TTTAttributedLabel *bottomLabel; + +/** + * Returns the underlying gesture recognizer for tap gestures in the avatarContainerView of the cell. + * This gesture handles the tap event for the avatarContainerView and notifies the cell's delegate. + */ +@property (weak, nonatomic, readonly) UITapGestureRecognizer *tapGestureRecognizer; + +/** + * The object that acts as the delegate for the cell. + */ +@property (weak, nonatomic) id delegate; + +//MARK: - Class methods + +/** + * Returns the `UINib` object initialized for the cell. + * + * @return The initialized `UINib` object or `nil` if there were errors during + * initialization or the nib file could not be located. + */ ++ (UINib *)nib; + +/** + * Returns the default string used to identify a reusable cell for text message items. + * + * @return The string used to identify a reusable cell. + */ ++ (NSString *)cellReuseIdentifier; + +/** + * Registers an action to be available in the cell's menu. + * + * @param action The selector to register with the cell. + * + * @discussion Non-standard or non-system actions must be added to the `UIMenuController` manually. + * You can do this by creating a new `UIMenuItem` and adding it via the controller's `menuItems` property. + * + * @warning Note that all message cells share the all actions registered here. + */ ++ (void)registerMenuAction:(SEL)action; + +/** + * Model that allows modifying layout without changing constraints directly. + * + * @return QMChatCellLayoutModel struct + */ ++ (QMChatCellLayoutModel)layoutModel; + +/** + Registers cell for data view + + @param dataView data view. UITableView or UICollectionView + */ ++ (void)registerForReuseInView:(id)dataView; + +@end diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.m b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.m similarity index 99% rename from Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.m rename to Q-municate/Classes/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.m index 25200675d..493779f4d 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.m +++ b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatCell/QMChatCell.m @@ -2,8 +2,8 @@ // QMChatCell.m // QMChatViewController // -// Created by Andrey Ivanov on 14.05.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. +// Created by Injoit on 14.05.15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "QMChatCell.h" diff --git a/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.h b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.h new file mode 100644 index 000000000..f62b09696 --- /dev/null +++ b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.h @@ -0,0 +1,22 @@ +// +// QMChatContactRequestCell.h +// QMChatViewController +// +// Created by Injoit on 14.05.15. +// Copyright © 2015 QuickBlox. All rights reserved. +// + +#import "QMChatCell.h" +#import "QMChatActionsHandler.h" + +@protocol QMChatContactRequestCellActions; + +/** + * Contact request cell, includes accept/reject actions delegate. + */ +@interface QMChatContactRequestCell : QMChatCell + +@property (weak, nonatomic) id actionsHandler; + +@end + diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.m b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.m similarity index 81% rename from Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.m rename to Q-municate/Classes/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.m index 45fbd5d52..d3ab9ae4d 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.m +++ b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.m @@ -2,8 +2,8 @@ // QMChatContactRequestCell.m // QMChatViewController // -// Created by Andrey Ivanov on 14.05.15. -// Copyright (c) 2015 QuickBlox Team. All rights reserved. +// Created by Injoit on 14.05.15. +// Copyright © 2015 QuickBlox. All rights reserved. // #import "QMChatContactRequestCell.h" @@ -13,12 +13,12 @@ @implementation QMChatContactRequestCell #pragma mark - Actions -- (IBAction)pressRejectRequestBtn:(id)sender { +- (IBAction)pressRejectRequestBtn:(id) sender { [self.actionsHandler chatContactRequestDidAccept:NO sender:self]; } -- (IBAction)pressAcceptBtn:(id)sender { +- (IBAction)pressAcceptBtn:(id) sender { [self.actionsHandler chatContactRequestDidAccept:YES sender:self]; } diff --git a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.xib b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.xib similarity index 96% rename from Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.xib rename to Q-municate/Classes/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.xib index 6c40ad2e1..99fc1f649 100644 --- a/Pods/QMCVDevelopment/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.xib +++ b/Q-municate/Classes/QMChatViewController/Views/Cells/QMChatContactRequestCell/QMChatContactRequestCell.xib @@ -1,11 +1,11 @@ - + - - + + @@ -25,10 +25,10 @@ - +