<|start_filename|>Pods/FirebaseUI/FirebaseUI/Core/API/FirebaseDataSource.h<|end_filename|>
// clang-format off

/*
 * Firebase UI Bindings iOS Library
 *
 * Copyright © 2015 Firebase - All Rights Reserved
 * https://www.firebase.com
 *
 * 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 binaryform 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 FIREBASE 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 FIREBASE 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.
 */

// clang-format on

#import <Foundation/Foundation.h>

#import "FirebaseArray.h"

@class Firebase;

/**
 * A FirebaseDataSource is a generic superclass for all Firebase datasources,
 * like
 * FirebaseTableViewDataSource and FirebaseCollectionViewDataSource. It provides
 * properties that all
 * subclasses need as well as several methods that pass through to the instance
 * of FirebaseArray.
 */
@interface FirebaseDataSource : NSObject<FirebaseArrayDelegate>

/**
 * The FirebaseArray which backs the instance of the datasource.
 */
@property(strong, nonatomic) FirebaseArray *array;

- (instancetype)initWithArray:(FirebaseArray *)array;

/**
 * Pass through of [FirebaseArray count].
 */
- (NSUInteger)count;

/**
 * Pass through of [FirebaseArray objectAtIndex:].
 */
- (id)objectAtIndex:(NSUInteger)index;

/**
 * Pass through of [FirebaseArray refForIndex:].
 */
- (Firebase *)refForIndex:(NSUInteger)index;

@end


<|start_filename|>Pods/FirebaseUI/FirebaseUI/Auth/API/FirebaseLoginViewController.h<|end_filename|>
// clang-format off

/*
 * Firebase UI Bindings iOS Library
 *
 * Copyright © 2015 Firebase - All Rights Reserved
 * https://www.firebase.com
 *
 * 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 binaryform 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 FIREBASE 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 FIREBASE 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.
 */

// clang-format on

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

#import <Firebase/Firebase.h>

#if LOCAL_BUILD
#import <GoogleSignIn/GoogleSignIn.h>
#else
#import <Google/SignIn.h>
#endif

#import "FirebaseAuthDelegate.h"
#import "FirebaseTwitterAuthProvider.h"
#import "FirebaseFacebookAuthProvider.h"
#import "FirebaseGoogleAuthProvider.h"
#import "FirebasePasswordAuthProvider.h"
#import "FirebaseLoginButton.h"

/**
 * FirebaseLoginViewController is a subclass of UIViewController that provides a
 * set of helper methods for Firebase authentication providers. FirebaseLoginViewController
 * also provides a premade UI which handles login and logout with arbitrary providers, as well as
 * error handling.
 * This also serves as a template for developers interested in developing custom login UI.
 */
@interface FirebaseLoginViewController
    : UIViewController<FirebaseAuthDelegate, TwitterAuthDelegate, GIDSignInUIDelegate>

/**
 * Container view for login activity which wraps the header text and cancel button.
 */
@property(weak, nonatomic) IBOutlet UIView *headerView;

/**
 * Header text, defaults to "Please Sign In"
 */
@property(weak, nonatomic) IBOutlet UILabel *headerText;

/**
 * Cancel button, defaults to Grey 500 material cancel image.
 */
@property(weak, nonatomic) IBOutlet UIButton *cancelButton;

/**
 * Container view for email and password textfields as well as the email/password login button.
 */
@property(weak, nonatomic) IBOutlet UIView *emailPasswordView;

/**
 * Email text field.
 */
@property(weak, nonatomic) IBOutlet UITextField *emailTextField;

/**
 * Password text field.
 */
@property(weak, nonatomic) IBOutlet UITextField *passwordTextField;

/**
 *Container for ------or------ line.
 */
@property(weak, nonatomic) IBOutlet UIView *separatorView;

/**
 * Container view for social provider login button.
 */
@property(weak, nonatomic) IBOutlet UIView *socialView;

/**
 * Container view for full login UI.
 */
@property(weak, nonatomic) IBOutlet UIView *loginView;

/**
 * Height constraint for social view.
 */
@property(weak, nonatomic) IBOutlet NSLayoutConstraint *socialHeightConstraint;

/**
 * Height constraint for login view view.
 */
@property(weak, nonatomic) IBOutlet NSLayoutConstraint *totalHeightConstraint;

/**
 * Dismissal callback on success or failure.
 */
@property (nonatomic, copy) void (^dismissCallback)(FAuthData *user, NSError *error);

/**
 * The Firebase database reference which to authenticate against.
 */
@property(strong, nonatomic) Firebase *ref;

/**
 * The provider object for Twitter Authentication. This object handles the
 * requests against the Twitter API and uses the response to authenticate
 * against the Firebase database.
 */
@property(strong, nonatomic) FirebaseTwitterAuthProvider *twitterAuthProvider;

/**
 * The provider object for Facebook Authentication. This object handles the
 * requests against the Facebook SDK and uses the response to authenticate
 * against the Firebase database.
 */
@property(strong, nonatomic) FirebaseFacebookAuthProvider *facebookAuthProvider;

/**
 * The provider object for Google Authentication. This object handles the
 * requests against the Google SDK and uses the response to authenticate
 * against the Firebase database.
 */
@property(strong, nonatomic) FirebaseGoogleAuthProvider *googleAuthProvider;

/**
 * The provider object for Email/Password Authentication. This object handles the
 * requests to the Firebase user authentication system to authenticate users to
 * the Firebase database.
 */
@property(strong, nonatomic) FirebasePasswordAuthProvider *passwordAuthProvider;

/**
 * Create an instance of FirebaseLoginViewController, which allows for easy authentication to
 * Firebase
 * via a number of identity providers such as Email/Password, Google, Facebook, and Twitter.
 * @param ref The Firebase reference to use for authentication
 * @return FirebaseLoginViewController
 */
- (instancetype)initWithRef:(Firebase *)ref;

/**
 * Enables a given identity provider and allows for login and logout actions against it.
 * @param provider An enum representing the desired identity provider to log in with
 * @return FirebaseLoginViewController
 */
- (instancetype)enableProvider:(FAuthProvider)provider;

/**
 * Callback that fires when after the controller is dismissed (either on success or on failure).
 * If successful, the user field will be populated; if an error occurred the error field will be populated.
 * @param callback A block that returns a user on success or an error on failure.
 * @return void
 */
- (void)didDismissWithBlock:(void (^)(FAuthData *user, NSError *error))callback;

/**
 * Logs the currently authenticated user out of both Firebase and the currently logged in identity
 * provider (if any).
 * @return void
 */
- (void)logout;

/**
 * Returns the currently authenticated user or nil if no user is authenticated.
 * @return FAuthData
 */
- (FAuthData *)currentUser;

@end


<|start_filename|>Pods/Target Support Files/Pods-Chaty/Pods-Chaty-umbrella.h<|end_filename|>
#import <UIKit/UIKit.h>


FOUNDATION_EXPORT double Pods_ChatyVersionNumber;
FOUNDATION_EXPORT const unsigned char Pods_ChatyVersionString[];



<|start_filename|>Pods/FirebaseUI/FirebaseUI/Auth/API/FirebaseLoginButton.h<|end_filename|>
// clang-format off

/*
 * Firebase UI Bindings iOS Library
 *
 * Copyright © 2015 Firebase - All Rights Reserved
 * https://www.firebase.com
 *
 * 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 binaryform 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 FIREBASE 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 FIREBASE 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.
 */

// clang-format on

#import <UIKit/UIKit.h>

#import "FirebaseAuthConstants.h"

/**
 * A UIButton factory that produces appropriately skinned identity provider buttons with a provider
 * field
 * that is used by FirebaseLoginViewController as well as potentially by other custom login UI.
 */
@interface FirebaseLoginButton : UIButton

/**
 * An enum representing a valid identity provider (see FirebaseAuthConstants.h for a full list).
 */
@property(nonatomic) FAuthProvider provider;

/**
 * Creates a button styled for the appropriate provider.
 * @param provider An enum representing the desired identity provider to log in with
 * @return FirebaseLoginButton
 */
- (instancetype)initWithProvider:(FAuthProvider)provider;

@end


<|start_filename|>Pods/FirebaseUI/FirebaseUI/Core/API/FirebaseCollectionViewDataSource.h<|end_filename|>
// clang-format off

/*
 * Firebase UI Bindings iOS Library
 *
 * Copyright © 2015 Firebase - All Rights Reserved
 * https://www.firebase.com
 *
 * 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 binaryform 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 FIREBASE 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 FIREBASE 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.
 */

// clang-format on

#import <UIKit/UIKit.h>
#import <FirebaseUI/XCodeMacros.h>

#import "FirebaseDataSource.h"

@class Firebase;

/**
 * FirebaseCollectionViewDataSource provides an class that conforms to the
 * UICollcetionViewDataSource protocol which allows UICollectionViews to
 * implement
 * FirebaseCollectionViewDataSource in order to provide a UICollectionView
 * synchronized to a
 * Firebase reference or query. In addition to handling all Firebase child
 * events (added, changed,
 * removed, moved), FirebaseCollectionViewDataSource handles UITableViewCell
 * creation, either with
 * the default UICollectionViewCell, prototype cells, custom
 * UICollectionViewCell subclasses, or
 * custom XIBs, and provides a simple [FirebaseCollectionViewDataSource
 * populateCellWithBlock:]
 * method which allows developers to populate the cells created for them with
 * desired data from
 * Firebase.
 */
@interface FirebaseCollectionViewDataSource : FirebaseDataSource<UICollectionViewDataSource>

/**
 * The model class to coerce FDataSnapshots to (if desired). For instance, if
 * the modelClass is set
 * to [Message class] in Obj-C or Message.self in Swift, then objects of type
 * Message will be
 * returned instead of type FDataSnapshot.
 */
@property(strong, nonatomic, __NON_NULL) Class modelClass;

/**
 * The cell class to coerce UICollectionViewCells to (if desired). For instance,
 * if the cellClass is
 * set to [CustomCollectionViewCell class] in Obj-C or CustomCollectionViewCell
 * in Swift, then
 * objects of type CustomCollectionViewCell will be returned instead of type
 * UICollectionViewCell.
 */
@property(strong, nonatomic, __NON_NULL) Class cellClass;

/**
 * The reuse identifier for cells in the UICollectionView.
 */
@property(strong, nonatomic, __NON_NULL) NSString *reuseIdentifier;

/**
 * The UICollectionView instance that operations (inserts, removals, moves,
 * etc.) are performed
 * against.
 */
@property(strong, nonatomic, __NON_NULL) UICollectionView *collectionView;

/**
 * Property to keep track of prototype cell use, to not register a class for the
 * UICollectionView or
 * do similar book keeping.
 */
@property BOOL hasPrototypeCell;

/**
 * The callback to populate a subclass of UICollectionViewCell with an object
 * provided by the
 * datasource.
 */
@property(strong, nonatomic, __NON_NULL) void (^populateCell)
    (__KINDOF(UICollectionViewCell) __NON_NULL_PTR cell, __KINDOF(NSObject) __NON_NULL_PTR object);

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells
 * with FDataSnapshots.
 * @param ref A Firebase reference to bind the datasource to
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells with
 * FDataSnapshots
 */
- (__NON_NULL instancetype)initWithRef:(__NON_NULL Firebase *)ref
                   cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                  view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells
 * with FDataSnapshots. Note that this method is used when using prototype
 * cells, where the cells
 * don't need to be registered in the class.
 * @param ref A Firebase reference to bind the datasource to
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells with
 * FDataSnapshots
 */
- (__NON_NULL instancetype)initWithRef:(__NON_NULL Firebase *)ref
              prototypeReuseIdentifier:(__NON_NULL NSString *)identifier
                                  view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates a
 * custom subclass of
 * UICollectionViewCell with FDataSnapshots.
 * @param ref A Firebase reference to bind the datasource to
 * @param cell A subclass of UICollectionViewCell used to populate the
 * UICollectionView, defaults to
 * UICollectionViewCell if nil
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates a
 * custom subclass of
 * UICollectionViewCell with FDataSnapshots
 */
- (__NON_NULL instancetype)initWithRef:(__NON_NULL Firebase *)ref
                             cellClass:(__NULLABLE Class)cell
                   cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                  view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates a
 * custom xib with
 * FDataSnapshots.
 * @param ref A Firebase reference to bind the datasource to
 * @param nibName The name of a xib file to create the layout for a
 * UICollectionViewCell
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates a
 * custom xib with
 * FDataSnapshots
 */
- (__NON_NULL instancetype)initWithRef:(__NON_NULL Firebase *)ref
                              nibNamed:(__NON_NULL NSString *)nibName
                   cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                  view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells
 * with a custom model class.
 * @param ref A Firebase reference to bind the datasource to
 * @param model A custom class that FDataSnapshots are coerced to, defaults to
 * FDataSnapshot if nil
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells with
 * a custom model class
 */
- (__NON_NULL instancetype)initWithRef:(__NON_NULL Firebase *)ref
                            modelClass:(__NULLABLE Class)model
                   cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                  view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells
 * with a custom model class. Note that this method is used when using prototype
 * cells, where the
 * cells don't need to be registered in the class.
 * @param ref A Firebase reference to bind the datasource to
 * @param model A custom class that FDataSnapshots are coerced to, defaults to
 * FDataSnapshot if nil
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells with
 * a custom model class
 */
- (__NON_NULL instancetype)initWithRef:(__NON_NULL Firebase *)ref
                            modelClass:(__NULLABLE Class)model
              prototypeReuseIdentifier:(__NON_NULL NSString *)identifier
                                  view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates a
 * custom subclass of
 * UICollectionViewCell with a custom model class.
 * @param ref A Firebase reference to bind the datasource to
 * @param model A custom class that FDataSnapshots are coerced to, defaults to
 * FDataSnapshot if nil
 * @param cell A subclass of UICollectionViewCell used to populate the
 * UICollectionView, defaults to
 * UICollectionViewCell if nil
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates a
 * custom subclass of
 * UICollectionViewCell with a custom model class
 */
- (__NON_NULL instancetype)initWithRef:(__NON_NULL Firebase *)ref
                            modelClass:(__NULLABLE Class)model
                             cellClass:(__NULLABLE Class)cell
                   cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                  view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates a
 * custom xib with a
 * custom model class.
 * @param ref A Firebase reference to bind the datasource to
 * @param model A custom class that FDataSnapshots are coerced to, defaults to
 * FDataSnapshot if nil
 * @param nibName The name of a xib file to create the layout for a
 * UICollectionViewCell
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates a
 * custom xib with a custom
 * model class
 */
- (__NON_NULL instancetype)initWithRef:(__NON_NULL Firebase *)ref
                            modelClass:(__NULLABLE Class)model
                              nibNamed:(__NON_NULL NSString *)nibName
                   cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                  view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells
 * with FDataSnapshots.
 * @param query A Firebase query to bind the datasource to
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells with
 * FDataSnapshots
 */
- (__NON_NULL instancetype)initWithQuery:(__NON_NULL FQuery *)query
                     cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                    view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells
 * with FDataSnapshots. Note that this method is used when using prototype
 * cells, where the cells
 * don't need to be registered in the class.
 * @param query A Firebase query to bind the datasource to
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells with
 * FDataSnapshots
 */
- (__NON_NULL instancetype)initWithQuery:(__NON_NULL FQuery *)query
                prototypeReuseIdentifier:(__NON_NULL NSString *)identifier
                                    view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates a
 * custom subclass of
 * UICollectionViewCell with FDataSnapshots.
 * @param query A Firebase query to bind the datasource to
 * @param cell A subclass of UICollectionViewCell used to populate the
 * UICollectionView, defaults to
 * UICollectionViewCell if nil
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates a
 * custom subclass of
 * UICollectionViewCell with FDataSnapshots
 */
- (__NON_NULL instancetype)initWithQuery:(__NON_NULL FQuery *)query
                               cellClass:(__NULLABLE Class)cell
                     cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                    view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates a
 * custom xib with
 * FDataSnapshots.
 * @param query A Firebase query to bind the datasource to
 * @param nibName The name of a xib file to create the layout for a
 * UICollectionViewCell
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates a
 * custom xib with
 * FDataSnapshots
 */
- (__NON_NULL instancetype)initWithQuery:(__NON_NULL FQuery *)query
                                nibNamed:(__NON_NULL NSString *)nibName
                     cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                    view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells
 * with a custom model class.
 * @param query A Firebase query to bind the datasource to
 * @param model A custom class that FDataSnapshots are coerced to, defaults to
 * FDataSnapshot if nil
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells with
 * a custom model class
 */
- (__NON_NULL instancetype)initWithQuery:(__NON_NULL FQuery *)query
                              modelClass:(__NULLABLE Class)model
                     cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                    view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells
 * with a custom model class. Note that this method is used when using prototype
 * cells, where the
 * cells don't need to be registered in the class.
 * @param query A Firebase query to bind the datasource to
 * @param model A custom class that FDataSnapshots are coerced to, defaults to
 * FDataSnapshot if nil
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates
 * UICollectionViewCells with
 * a custom model class
 */
- (__NON_NULL instancetype)initWithQuery:(__NON_NULL FQuery *)query
                              modelClass:(__NULLABLE Class)model
                prototypeReuseIdentifier:(__NON_NULL NSString *)identifier
                                    view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates a
 * custom subclass of
 * UICollectionViewCell with a custom model class.
 * @param query A Firebase query to bind the datasource to
 * @param model A custom class that FDataSnapshots are coerced to, defaults to
 * FDataSnapshot if nil
 * @param cell A subclass of UICollectionViewCell used to populate the
 * UICollectionView, defaults to
 * UICollectionViewCell if nil
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates a
 * custom subclass of
 * UICollectionViewCell with a custom model class
 */
- (__NON_NULL instancetype)initWithQuery:(__NON_NULL FQuery *)query
                              modelClass:(__NULLABLE Class)model
                               cellClass:(__NULLABLE Class)cell
                     cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                    view:(__NON_NULL UICollectionView *)collectionView;

/**
 * Initialize an instance of FirebaseCollectionViewDataSource that populates a
 * custom xib with a
 * custom model class.
 * @param query A Firebase query to bind the datasource to
 * @param model A custom class that FDataSnapshots are coerced to, defaults to
 * FDataSnapshot if nil
 * @param nibName The name of a xib file to create the layout for a
 * UICollectionViewCell
 * @param identifier A string to use as a CellReuseIdentifier
 * @param collectionView An instance of a UICollectionView to bind to
 * @return An instance of FirebaseCollectionViewDataSource that populates a
 * custom xib with a custom
 * model class
 */
- (__NON_NULL instancetype)initWithQuery:(__NON_NULL FQuery *)query
                              modelClass:(__NULLABLE Class)model
                                nibNamed:(__NON_NULL NSString *)nibName
                     cellReuseIdentifier:(__NON_NULL NSString *)identifier
                                    view:(__NON_NULL UICollectionView *)collectionView;

/**
 * This method populates the fields of a UICollectionViewCell or subclass given
 * an FDataSnapshot (or
 * custom model object).
 * @param callback A block which returns an initialized UICollectionViewCell (or
 * subclass) and the
 * corresponding object to populate the cell with.
 */
- (void)populateCellWithBlock:
    (__NON_NULL void (^)(__KINDOF(UICollectionViewCell)__NON_NULL_PTR cell,
                         __KINDOF(NSObject)__NON_NULL_PTR object))callback;

@end
