From a148c216c06950d5c879a9847aff63702e3b6e19 Mon Sep 17 00:00:00 2001 From: ganchau Date: Sat, 15 Aug 2015 10:08:53 -0400 Subject: [PATCH 01/63] Corrected a typo in README.md in the PFQueryCollectionViewController section --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6d6bc5f..7cb8a41 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ PFQueryTableViewController *controller = [[PFQueryTableViewController alloc] ini ``` #### PFQueryCollectionViewController -A lot of advanced use cases usually include displaying data in a custom dynamic layout that is a different from simple list. +A lot of advanced use cases usually include displaying data in a custom dynamic layout that is different from a simple list. `PFQueryTableViewController` is a sub-class of `UICollectionViewController` that provides a layer of abstraction that lets you easily display data from one of your Parse classes in any dynamic and custom layout you might think of To display data in a simple grid layout you can use the default `UICollectionViewFlowLayout`: From 7e4cede17d4d9c1d1d7fc68639428c53624dfeaf Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Tue, 25 Aug 2015 11:24:04 -0700 Subject: [PATCH 02/63] Trim email of whitespace when signing up. --- ParseUI/Classes/SignUpViewController/PFSignUpViewController.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m index 2ab8603..51461a1 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m @@ -248,6 +248,8 @@ - (void)_signUpAction { NSString *username = _signUpView.usernameField.text ?: @""; NSString *password = _signUpView.passwordField.text ?: @""; NSString *email = (self.emailAsUsername ? username : _signUpView.emailField.text); + email = [email stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + NSString *additional = _signUpView.additionalField.text; NSMutableDictionary *dictionary = [@{ PFSignUpViewControllerDelegateInfoUsernameKey : username, From d48428be79c74cd87d4cb8fa0e22327b505047bc Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Mon, 24 Aug 2015 20:19:53 -0700 Subject: [PATCH 03/63] Fixed not set fields when emailAsUsername is set before fields are set. --- ParseUI.xcodeproj/project.pbxproj | 4 + .../Classes/LogInViewController/PFLogInView.m | 160 ++++++++++++------ .../PFLogInViewController.m | 105 +++++++----- .../LogInViewController/PFLogInView_Private.h | 28 +++ 4 files changed, 200 insertions(+), 97 deletions(-) create mode 100644 ParseUI/Classes/LogInViewController/PFLogInView_Private.h diff --git a/ParseUI.xcodeproj/project.pbxproj b/ParseUI.xcodeproj/project.pbxproj index 5015c44..be803fb 100644 --- a/ParseUI.xcodeproj/project.pbxproj +++ b/ParseUI.xcodeproj/project.pbxproj @@ -34,6 +34,7 @@ 810D6C3119F7F379005B3DB2 /* PFProductTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C2F19F7F379005B3DB2 /* PFProductTableViewController.m */; }; 810D6C3419F7F38B005B3DB2 /* PFPurchaseTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C3219F7F38B005B3DB2 /* PFPurchaseTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; 810D6C3519F7F38B005B3DB2 /* PFPurchaseTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C3319F7F38B005B3DB2 /* PFPurchaseTableViewCell.m */; }; + 811EE7A31B8C17550058B3BE /* PFLogInView_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 811EE7A21B8C17550058B3BE /* PFLogInView_Private.h */; }; 8129E5F21A9CB067006752BC /* ParseUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2AAC07E0554694100DB518D /* ParseUI.framework */; }; 8129E5F31A9CB067006752BC /* (null) in Frameworks */ = {isa = PBXBuildFile; }; 8129E5F51A9CB067006752BC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA71A1AB37500FD6EED /* Images.xcassets */; }; @@ -151,6 +152,7 @@ 810D6C3219F7F38B005B3DB2 /* PFPurchaseTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFPurchaseTableViewCell.h; sourceTree = ""; }; 810D6C3319F7F38B005B3DB2 /* PFPurchaseTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFPurchaseTableViewCell.m; sourceTree = ""; }; 811B095A1A0843B9008B3393 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = ParseUI/Resources/Info.plist; sourceTree = SOURCE_ROOT; }; + 811EE7A21B8C17550058B3BE /* PFLogInView_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFLogInView_Private.h; sourceTree = ""; }; 8129E6001A9CB067006752BC /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8129E6081A9CB1BE006752BC /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8129E6391A9CB320006752BC /* UIDemoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIDemoViewController.swift; sourceTree = ""; }; @@ -630,6 +632,7 @@ 81ED075319F68028009745F4 /* PFLogInViewController.h */, 81ED075419F68028009745F4 /* PFLogInViewController.m */, 81ED075119F68028009745F4 /* PFLogInView.h */, + 811EE7A21B8C17550058B3BE /* PFLogInView_Private.h */, 81ED075219F68028009745F4 /* PFLogInView.m */, ); path = LogInViewController; @@ -751,6 +754,7 @@ 81E9CD1419F56D6B00487B0F /* ParseUIConstants.h in Headers */, 8185BA7C1A642A8B002815C0 /* PFCollectionViewCell.h in Headers */, 810D6C1F19F7F006005B3DB2 /* PFImageCache.h in Headers */, + 811EE7A31B8C17550058B3BE /* PFLogInView_Private.h in Headers */, 81E9CD1319F56D6B00487B0F /* ParseUI.h in Headers */, 810D6C3419F7F38B005B3DB2 /* PFPurchaseTableViewCell.h in Headers */, 81ED079619F6809F009745F4 /* PFImageView.h in Headers */, diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.m b/ParseUI/Classes/LogInViewController/PFLogInView.m index 56440cb..3abfe74 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.m +++ b/ParseUI/Classes/LogInViewController/PFLogInView.m @@ -37,8 +37,9 @@ @implementation PFLogInView -#pragma mark - -#pragma mark Class +///-------------------------------------- +#pragma mark - Class +///-------------------------------------- + (PFActionButtonConfiguration *)_defaultSignUpButtonConfiguration { PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor signupButtonBackgroundColor] @@ -76,8 +77,9 @@ + (PFActionButtonConfiguration *)_defaultTwitterButtonConfiguration { return configuration; } -#pragma mark - -#pragma mark Init +///-------------------------------------- +#pragma mark - Init +///-------------------------------------- - (instancetype)initWithFields:(PFLogInFields)otherFields { self = [super initWithFrame:CGRectZero]; @@ -94,67 +96,116 @@ - (instancetype)initWithFields:(PFLogInFields)otherFields { _logo.contentMode = UIViewContentModeScaleAspectFit; [self addSubview:_logo]; + [self _updateAllFields]; + + return self; +} + +///-------------------------------------- +#pragma mark - Fields +///-------------------------------------- + +- (void)_updateAllFields { if (_fields & PFLogInFieldsDismissButton) { - _dismissButton = [[PFDismissButton alloc] initWithFrame:CGRectZero]; - [self addSubview:_dismissButton]; + if (!_dismissButton) { + _dismissButton = [[PFDismissButton alloc] initWithFrame:CGRectZero]; + [self addSubview:_dismissButton]; + } + } else { + [_dismissButton removeFromSuperview]; + _dismissButton = nil; } if (_fields & PFLogInFieldsUsernameAndPassword) { - _usernameField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:(PFTextFieldSeparatorStyleTop | - PFTextFieldSeparatorStyleBottom)]; - _usernameField.autocorrectionType = UITextAutocorrectionTypeNo; - _usernameField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _usernameField.returnKeyType = UIReturnKeyNext; - [self addSubview:_usernameField]; - [self _updateUsernameFieldStyle]; + if (!_usernameField) { + _usernameField = [[PFTextField alloc] initWithFrame:CGRectZero + separatorStyle:(PFTextFieldSeparatorStyleTop | + PFTextFieldSeparatorStyleBottom)]; + _usernameField.autocorrectionType = UITextAutocorrectionTypeNo; + _usernameField.autocapitalizationType = UITextAutocapitalizationTypeNone; + _usernameField.returnKeyType = UIReturnKeyNext; + [self addSubview:_usernameField]; + [self _updateUsernameFieldStyle]; + } - _passwordField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:PFTextFieldSeparatorStyleBottom]; - _passwordField.placeholder = NSLocalizedString(@"Password", @"Password"); - _passwordField.secureTextEntry = YES; - _passwordField.autocorrectionType = UITextAutocorrectionTypeNo; - _passwordField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _passwordField.returnKeyType = UIReturnKeyDone; - [self addSubview:_passwordField]; + if (!_passwordField) { + _passwordField = [[PFTextField alloc] initWithFrame:CGRectZero + separatorStyle:PFTextFieldSeparatorStyleBottom]; + _passwordField.placeholder = NSLocalizedString(@"Password", @"Password"); + _passwordField.secureTextEntry = YES; + _passwordField.autocorrectionType = UITextAutocorrectionTypeNo; + _passwordField.autocapitalizationType = UITextAutocapitalizationTypeNone; + _passwordField.returnKeyType = UIReturnKeyDone; + [self addSubview:_passwordField]; + } + } else { + [_usernameField removeFromSuperview]; + _usernameField = nil; + + [_passwordField removeFromSuperview]; + _passwordField = nil; } if (_fields & PFLogInFieldsSignUpButton) { - _signUpButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultSignUpButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - [self addSubview:_signUpButton]; + if (!_signUpButton) { + _signUpButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultSignUpButtonConfiguration] + buttonStyle:PFActionButtonStyleNormal]; + [self addSubview:_signUpButton]; + } + } else { + [_signUpButton removeFromSuperview]; + _signUpButton = nil; } if (_fields & PFLogInFieldsPasswordForgotten) { - _passwordForgottenButton = [[PFTextButton alloc] initWithFrame:CGRectZero]; - [_passwordForgottenButton setTitle:NSLocalizedString(@"Forgot Password?", "Forgot Password?") - forState:UIControlStateNormal]; - [self addSubview:_passwordForgottenButton]; + if (_passwordForgottenButton) { + _passwordForgottenButton = [[PFTextButton alloc] initWithFrame:CGRectZero]; + [_passwordForgottenButton setTitle:NSLocalizedString(@"Forgot Password?", "Forgot Password?") + forState:UIControlStateNormal]; + [self addSubview:_passwordForgottenButton]; + } + } else { + [_passwordForgottenButton removeFromSuperview]; + _passwordForgottenButton = nil; } if (_fields & PFLogInFieldsLogInButton) { - _logInButton = [[PFPrimaryButton alloc] initWithBackgroundImageColor:[PFColor loginButtonBackgroundColor]]; - [_logInButton setTitle:NSLocalizedString(@"Log In", @"Log In") forState:UIControlStateNormal]; - [self addSubview:_logInButton]; + if (!_logInButton) { + _logInButton = [[PFPrimaryButton alloc] initWithBackgroundImageColor:[PFColor loginButtonBackgroundColor]]; + [_logInButton setTitle:NSLocalizedString(@"Log In", @"Log In") forState:UIControlStateNormal]; + [self addSubview:_logInButton]; + } + } else { + [_logInButton removeFromSuperview]; + _logInButton = nil; } if (_fields & PFLogInFieldsFacebook) { - _facebookButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultFacebookButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - [self addSubview:_facebookButton]; + if (!_facebookButton) { + _facebookButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultFacebookButtonConfiguration] + buttonStyle:PFActionButtonStyleNormal]; + [self addSubview:_facebookButton]; + } + } else { + [_facebookButton removeFromSuperview]; + _facebookButton = nil; } if (_fields & PFLogInFieldsTwitter) { - _twitterButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultTwitterButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - [self addSubview:_twitterButton]; + if (_twitterButton) { + _twitterButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultTwitterButtonConfiguration] + buttonStyle:PFActionButtonStyleNormal]; + [self addSubview:_twitterButton]; + } + } else { + [_twitterButton removeFromSuperview]; + _twitterButton = nil; } - - return self; } -#pragma mark - -#pragma mark UIView +///-------------------------------------- +#pragma mark - UIView +///-------------------------------------- - (void)layoutSubviews { [super layoutSubviews]; @@ -285,8 +336,7 @@ - (void)layoutSubviews { if (_logInButton) { CGFloat loginButtonTopInset = floorf(24.0f * contentSizeScale.height); - CGRect frame = PFRectMakeWithSizeCenteredInRect([_logInButton sizeThatFits:loginContentSize], - loginContentRect);; + CGRect frame = PFRectMakeWithSizeCenteredInRect([_logInButton sizeThatFits:loginContentSize], loginContentRect); frame.origin.y = currentY + loginButtonTopInset; _logInButton.frame = frame; @@ -350,9 +400,7 @@ - (CGSize)_loginContentSizeThatFits:(CGSize)boundingSize withContentSizeScale:(C } - (CGSize)_maxContentSize { - return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? - CGSizeMake(420.0f, 550.0f) : - CGSizeMake(500.0f, 800.0f)); + return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? CGSizeMake(420.0f, 550.0f) : CGSizeMake(500.0f, 800.0f)); } - (CGSize)_contentSizeScaleForContentSize:(CGSize)contentSize { @@ -367,8 +415,17 @@ - (CGSize)_contentSizeScaleForContentSize:(CGSize)contentSize { return contentSizeScale; } -#pragma mark - -#pragma mark Accessors +///-------------------------------------- +#pragma mark - Accessors +///-------------------------------------- + +- (void)setFields:(PFLogInFields)fields { + if (_fields != fields) { + _fields = fields; + [self _updateAllFields]; + [self setNeedsLayout]; + } +} - (void)setLogo:(UIView *)logo { if (self.logo != logo) { @@ -388,8 +445,9 @@ - (void)setEmailAsUsername:(BOOL)otherEmailAsUsername { } } -#pragma mark - -#pragma mark Private +///-------------------------------------- +#pragma mark - Private +///-------------------------------------- + (void)_validateFields:(PFLogInFields)fields { if (fields == PFLogInFieldsNone) { diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.m b/ParseUI/Classes/LogInViewController/PFLogInViewController.m index 7e0590e..a4a9956 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.m +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.m @@ -29,6 +29,7 @@ #import "PFPrimaryButton.h" #import "PFSignUpViewController.h" #import "PFTextField.h" +#import "PFLogInView_Private.h" NSString *const PFLogInSuccessNotification = @"com.parse.ui.login.success"; NSString *const PFLogInFailureNotification = @"com.parse.ui.login.failure"; @@ -72,8 +73,9 @@ @interface PFLogInViewController () { @implementation PFLogInViewController -#pragma mark - -#pragma mark NSObject +///-------------------------------------- +#pragma mark - Init +///-------------------------------------- - (instancetype)init { if (self = [super init]) { @@ -106,17 +108,18 @@ - (void)_commonInit { } } -#pragma mark - -#pragma mark Dealloc +///-------------------------------------- +#pragma mark - Dealloc +///-------------------------------------- - (void)dealloc { // Unregister from all notifications [[NSNotificationCenter defaultCenter] removeObserver:self]; } - -#pragma mark - -#pragma mark UIViewController +///-------------------------------------- +#pragma mark - UIViewController +///-------------------------------------- - (void)loadView { _logInView = [[PFLogInView alloc] initWithFields:_fields]; @@ -143,9 +146,6 @@ - (void)viewWillAppear:(BOOL)animated { } } -#pragma mark - -#pragma mark Rotation - - (NSUInteger)supportedInterfaceOrientations { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { return UIInterfaceOrientationMaskAll; @@ -154,8 +154,9 @@ - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } -#pragma mark - -#pragma mark PFLogInViewController +///-------------------------------------- +#pragma mark - PFLogInViewController +///-------------------------------------- - (PFLogInView *)logInView { return (PFLogInView *)self.view; // self.view will call loadView if the view is nil @@ -169,6 +170,17 @@ - (BOOL)emailAsUsername { return self.logInView.emailAsUsername; } +- (void)setFields:(PFLogInFields)fields { + if (_fields != fields) { + _fields = fields; + + // Avoid force loading logInView + if (_logInView) { + _logInView.fields = fields; + } + } +} + - (void)setDelegate:(id)delegate { if (self.delegate != delegate) { _delegate = delegate; @@ -185,8 +197,29 @@ - (void)setDelegate:(id)delegate { } } -#pragma mark - -#pragma mark UITextFieldDelegate +- (PFSignUpViewController *)signUpController { + if (!_signUpController) { + _signUpController = [[PFSignUpViewController alloc] init]; + _signUpController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; + _signUpController.emailAsUsername = self.emailAsUsername; + } + return _signUpController; +} + +- (void)setLoading:(BOOL)loading { + if (self.loading != loading) { + _loading = loading; + + _logInView.usernameField.enabled = !self.loading; + _logInView.passwordField.enabled = !self.loading; + _logInView.passwordForgottenButton.enabled = !self.loading; + _logInView.dismissButton.enabled = !self.loading; + } +} + +///-------------------------------------- +#pragma mark - UITextFieldDelegate +///-------------------------------------- - (BOOL)textFieldShouldReturn:(UITextField *)textField { if (textField == _logInView.usernameField) { @@ -200,8 +233,9 @@ - (BOOL)textFieldShouldReturn:(UITextField *)textField { return YES; } -#pragma mark - -#pragma mark UIAlertViewDelegate +///-------------------------------------- +#pragma mark - UIAlertViewDelegate +///-------------------------------------- - (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex { if (buttonIndex != [alertView cancelButtonIndex]) { @@ -210,8 +244,9 @@ - (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger } } -#pragma mark - -#pragma mark Private +///-------------------------------------- +#pragma mark - Private +///-------------------------------------- - (void)setupHandlers { [_logInView.dismissButton addTarget:self @@ -455,31 +490,9 @@ - (void)cancelLogIn { [[NSNotificationCenter defaultCenter] postNotificationName:PFLogInCancelNotification object:self]; } -#pragma mark - -#pragma mark Accessors - -- (PFSignUpViewController *)signUpController { - if (!_signUpController) { - _signUpController = [[PFSignUpViewController alloc] init]; - _signUpController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - _signUpController.emailAsUsername = self.emailAsUsername; - } - return _signUpController; -} - -- (void)setLoading:(BOOL)loading { - if (self.loading != loading) { - _loading = loading; - - _logInView.usernameField.enabled = !self.loading; - _logInView.passwordField.enabled = !self.loading; - _logInView.passwordForgottenButton.enabled = !self.loading; - _logInView.dismissButton.enabled = !self.loading; - } -} - -#pragma mark - -#pragma mark Keyboard +///-------------------------------------- +#pragma mark - Keyboard +///-------------------------------------- - (UIView *)currentFirstResponder { if ([_logInView.usernameField isFirstResponder]) { @@ -502,7 +515,8 @@ - (void)_registerForKeyboardNotifications { object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_keyboardWillHide:) - name:UIKeyboardWillHideNotification object:nil]; + name:UIKeyboardWillHideNotification + object:nil]; } - (void)_keyboardWillShow:(NSNotification *)notification { @@ -578,8 +592,7 @@ - (void)_updateViewContentOffsetAnimated:(BOOL)animated { return; // No scrolling required } - contentOffset = CGPointMake(0.0f, MIN(offsetForScrollingTextFieldToTop, - offsetForScrollingLowestViewToBottom)); + contentOffset = CGPointMake(0.0f, MIN(offsetForScrollingTextFieldToTop, offsetForScrollingLowestViewToBottom)); } [_logInView setContentOffset:contentOffset animated:animated]; diff --git a/ParseUI/Classes/LogInViewController/PFLogInView_Private.h b/ParseUI/Classes/LogInViewController/PFLogInView_Private.h new file mode 100644 index 0000000..7069832 --- /dev/null +++ b/ParseUI/Classes/LogInViewController/PFLogInView_Private.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014, Parse, LLC. All rights reserved. + * + * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, + * copy, modify, and distribute this software in source code or binary form for use + * in connection with the web services and APIs provided by Parse. + * + * As with any software that integrates with the Parse platform, your use of + * this software is subject to the Parse Terms of Service + * [https://www.parse.com/about/terms]. This copyright notice shall be + * included in all copies or substantial portions of the software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF 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 PFLogInView (Private) + +@property (nonatomic, assign, readwrite) PFLogInFields fields; + +@end From 0c472b1aa1518c25c81fbe5ff261d263079ae7c2 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Tue, 25 Aug 2015 21:01:43 -0700 Subject: [PATCH 04/63] Fix potentially missing PasswordForgottenButton, TwitterButton. --- ParseUI/Classes/LogInViewController/PFLogInView.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.m b/ParseUI/Classes/LogInViewController/PFLogInView.m index 3abfe74..4aed98d 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.m +++ b/ParseUI/Classes/LogInViewController/PFLogInView.m @@ -158,7 +158,7 @@ - (void)_updateAllFields { } if (_fields & PFLogInFieldsPasswordForgotten) { - if (_passwordForgottenButton) { + if (!_passwordForgottenButton) { _passwordForgottenButton = [[PFTextButton alloc] initWithFrame:CGRectZero]; [_passwordForgottenButton setTitle:NSLocalizedString(@"Forgot Password?", "Forgot Password?") forState:UIControlStateNormal]; @@ -192,7 +192,7 @@ - (void)_updateAllFields { } if (_fields & PFLogInFieldsTwitter) { - if (_twitterButton) { + if (!_twitterButton) { _twitterButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultTwitterButtonConfiguration] buttonStyle:PFActionButtonStyleNormal]; [self addSubview:_twitterButton]; @@ -480,7 +480,7 @@ - (void)_updateUsernameFieldStyle { keyboardType = UIKeyboardTypeEmailAddress; usernamePlaceholder = NSLocalizedString(@"Email", @"Email"); } - + _usernameField.placeholder = usernamePlaceholder; _usernameField.keyboardType = keyboardType; } From 6f3aef951ada7e2c11361ac9ba28c5d8bc993211 Mon Sep 17 00:00:00 2001 From: Jeroen Leenarts Date: Fri, 4 Sep 2015 20:51:09 +0200 Subject: [PATCH 05/63] When comparing the size of the image and the imageview's size. The origin of the image view should not be considered. I have noticed that when positioning a imageView in a cell on another location unintended behavior occurs due to the fact that even though the image could be contained within the bounds of the imageview, the CGContainsRect call "fails" because the origin places one or more corners of the imageview frame outside of the generated imageView rect. --- ParseUI/Classes/Cells/PFCollectionViewCell.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ParseUI/Classes/Cells/PFCollectionViewCell.m b/ParseUI/Classes/Cells/PFCollectionViewCell.m index 6207b11..6fb1f46 100644 --- a/ParseUI/Classes/Cells/PFCollectionViewCell.m +++ b/ParseUI/Classes/Cells/PFCollectionViewCell.m @@ -56,7 +56,7 @@ - (void)layoutSubviews { // Adapt content mode of _imageView to fit the image in bounds if the layout frame is smaller or center if it's bigger. if (!CGRectIsEmpty(imageViewFrame)) { - if (CGRectContainsRect(PFRectMakeWithSize(_imageView.image.size), imageViewFrame)) { + if (CGRectContainsRect(PFRectMakeWithSize(_imageView.image.size), PFRectMakeWithSize(imageViewFrame.size))) { _imageView.contentMode = UIViewContentModeScaleAspectFit; } else { _imageView.contentMode = UIViewContentModeCenter; From bcf8dadd3858de46734487b9d7a330536bf26104 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Mon, 7 Sep 2015 17:53:09 -0700 Subject: [PATCH 06/63] Fixed localization not working when installed as a dynamic framework. --- ParseUI/Classes/Internal/PFLocalization.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ParseUI/Classes/Internal/PFLocalization.h b/ParseUI/Classes/Internal/PFLocalization.h index b17310c..8477d8f 100644 --- a/ParseUI/Classes/Internal/PFLocalization.h +++ b/ParseUI/Classes/Internal/PFLocalization.h @@ -24,6 +24,6 @@ #undef NSLocalizedString #define NSLocalizedString(key, comment) \ -[[NSBundle mainBundle] localizedStringForKey:key value:nil table:@"ParseUI"] +[[NSBundle bundleForClass:[self class]] localizedStringForKey:key value:nil table:@"ParseUI"] #endif From 5e054b49d001d4510b7c935c1a2db872112437dc Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Mon, 7 Sep 2015 22:18:33 -0700 Subject: [PATCH 07/63] Make ParseUI fully compile from source for app extensions. --- .../LogInViewController/PFLogInViewController.m | 2 +- .../PFQueryCollectionViewController.m | 12 +++++++----- .../PFQueryTableViewController.m | 14 ++++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.m b/ParseUI/Classes/LogInViewController/PFLogInViewController.m index a4a9956..2543d65 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.m +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.m @@ -288,7 +288,7 @@ - (void)_dismissAction { [self dismissViewControllerAnimated:YES completion:nil]; } -- (void)_forgotPasswordAction { +- (void)_forgotPasswordAction PF_EXTENSION_UNAVAILABLE("") { NSString *title = NSLocalizedString(@"Reset Password", @"Forgot password request title in PFLogInViewController"); NSString *message = NSLocalizedString(@"Please enter the email address for your account.", @"Email request message in PFLogInViewController"); diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m index d20b2c9..bef5421 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m @@ -399,11 +399,13 @@ - (void)_handleDeletionError:(NSError *)error { [self presentViewController:errorController animated:YES completion:nil]; } else { - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"Error") - message:errorMessage - delegate:nil - cancelButtonTitle:NSLocalizedString(@"OK", @"OK") - otherButtonTitles:nil]; + // Cast to `id` is required for building succesfully for app extensions, + // this code actually never runs in App Extensions, since they are iOS 8.0+, so we are good with just a hack + UIAlertView *alertView = [(id)[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"Error") + message:errorMessage + delegate:nil + cancelButtonTitle:NSLocalizedString(@"OK", @"OK") + otherButtonTitles:nil]; [alertView show]; } diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m index bc96e5d..f9fad49 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m @@ -398,7 +398,7 @@ - (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths animated:(BOOL)animated } [[BFTask taskForCompletionOfAllTasks:allDeletionTasks] - continueWithBlock:deletionHandlerBlock]; + continueWithBlock:deletionHandlerBlock]; } - (PFTableViewCell *)tableView:(UITableView *)otherTableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath { @@ -531,11 +531,13 @@ - (void)_handleDeletionError:(NSError *)error { [self presentViewController:errorController animated:YES completion:nil]; } else { - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"Error") - message:errorMessage - delegate:nil - cancelButtonTitle:NSLocalizedString(@"OK", @"OK") - otherButtonTitles:nil]; + // Cast to `id` is required for building succesfully for app extensions, + // this code actually never runs in App Extensions, since they are iOS 8.0+, so we are good with just a hack + UIAlertView *alertView = [(id)[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"Error") + message:errorMessage + delegate:nil + cancelButtonTitle:NSLocalizedString(@"OK", @"OK") + otherButtonTitles:nil]; [alertView show]; } From 0ccdbfedd01e9d9a3a48b80da3c3cab42788bf8d Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Wed, 9 Sep 2015 19:43:36 -0700 Subject: [PATCH 08/63] Add bitcode support for pre-compiled frameworks. --- ParseUI.xcodeproj/project.pbxproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ParseUI.xcodeproj/project.pbxproj b/ParseUI.xcodeproj/project.pbxproj index be803fb..e0624f8 100644 --- a/ParseUI.xcodeproj/project.pbxproj +++ b/ParseUI.xcodeproj/project.pbxproj @@ -1196,6 +1196,10 @@ INFOPLIST_FILE = "$(SRCROOT)/ParseUI/Resources/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; + "OTHER_CFLAGS[sdk=iphoneos9.0]" = ( + "$(inherited)", + "-fembed-bitcode", + ); PRODUCT_NAME = ParseUI; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1211,6 +1215,10 @@ INFOPLIST_FILE = "$(SRCROOT)/ParseUI/Resources/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; + "OTHER_CFLAGS[sdk=iphoneos9.0]" = ( + "$(inherited)", + "-fembed-bitcode", + ); PRODUCT_NAME = ParseUI; TARGETED_DEVICE_FAMILY = "1,2"; }; From 9cdd1a10b9daaff099fa4b2e5b59221a455cb383 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Thu, 10 Sep 2015 00:13:01 -0700 Subject: [PATCH 09/63] Fix gitignore for .DS_Store files. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 10f254e..fa6d2a4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -DS_Store +.DS_Store *.pbxuser *.perspective From dcc82427b095320ed98de3113c68fbe2bb684e92 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Thu, 10 Sep 2015 00:27:30 -0700 Subject: [PATCH 10/63] Fix all warning on Xcode 7. --- .../Internal/Views/Buttons/PFActionButton.m | 15 +++++++++++++++ .../Internal/Views/Buttons/PFPrimaryButton.m | 11 +++++++++++ .../LogInViewController/PFLogInViewController.m | 2 +- .../PFQueryCollectionViewController.m | 4 ++++ .../SignUpViewController/PFSignUpViewController.m | 2 +- 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/ParseUI/Classes/Internal/Views/Buttons/PFActionButton.m b/ParseUI/Classes/Internal/Views/Buttons/PFActionButton.m index 6f04429..f741d35 100644 --- a/ParseUI/Classes/Internal/Views/Buttons/PFActionButton.m +++ b/ParseUI/Classes/Internal/Views/Buttons/PFActionButton.m @@ -33,6 +33,9 @@ @interface PFActionButton () @property (nonatomic, strong) PFActionButtonConfiguration *configuration; +- (instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER; + @end @implementation PFActionButton @@ -40,6 +43,14 @@ @implementation PFActionButton #pragma mark - #pragma mark Init +- (instancetype)initWithFrame:(CGRect)frame { + return [super initWithFrame:frame]; +} + +- (instancetype)initWithCoder:(nonnull NSCoder *)decoder { + return [super initWithCoder:decoder]; +} + - (instancetype)initWithConfiguration:(PFActionButtonConfiguration *)configuration buttonStyle:(PFActionButtonStyle)buttonStyle { self = [super initWithFrame:CGRectZero]; @@ -159,6 +170,10 @@ @implementation PFActionButtonConfiguration #pragma mark - #pragma mark Init +- (instancetype)init { + return [self initWithBackgroundImageColor:nil image:nil]; +} + - (instancetype)initWithBackgroundImageColor:(UIColor *)backgroundImageColor image:(UIImage *)image { self = [super init]; diff --git a/ParseUI/Classes/Internal/Views/Buttons/PFPrimaryButton.m b/ParseUI/Classes/Internal/Views/Buttons/PFPrimaryButton.m index 037758b..5c5a076 100644 --- a/ParseUI/Classes/Internal/Views/Buttons/PFPrimaryButton.m +++ b/ParseUI/Classes/Internal/Views/Buttons/PFPrimaryButton.m @@ -29,6 +29,9 @@ @interface PFPrimaryButton () UIActivityIndicatorView *_activityIndicatorView; } +- (instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER; + @end @implementation PFPrimaryButton @@ -36,6 +39,14 @@ @implementation PFPrimaryButton #pragma mark - #pragma mark Init +- (instancetype)initWithFrame:(CGRect)frame { + return [super initWithFrame:frame]; +} + +- (instancetype)initWithCoder:(nonnull NSCoder *)decoder { + return [super initWithCoder:decoder]; +} + - (instancetype)initWithBackgroundImageColor:(UIColor *)color { self = [super initWithFrame:CGRectZero]; if (!self) return nil; diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.m b/ParseUI/Classes/LogInViewController/PFLogInViewController.m index 2543d65..a6dceae 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.m +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.m @@ -146,7 +146,7 @@ - (void)viewWillAppear:(BOOL)animated { } } -- (NSUInteger)supportedInterfaceOrientations { +- (UIInterfaceOrientationMask)supportedInterfaceOrientations { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { return UIInterfaceOrientationMaskAll; } diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m index bef5421..af1a52a 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m @@ -80,6 +80,10 @@ - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibB return self; } +- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout { + return[self initWithCollectionViewLayout:layout className:nil]; +} + - (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout className:(NSString *)className { self = [super initWithCollectionViewLayout:layout]; if (!self) return nil; diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m index 51461a1..257b5fb 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m @@ -130,7 +130,7 @@ - (void)viewWillAppear:(BOOL)animated { #pragma mark - #pragma mark Rotation -- (NSUInteger)supportedInterfaceOrientations { +- (UIInterfaceOrientationMask)supportedInterfaceOrientations { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { return UIInterfaceOrientationMaskAll; } From e0a35287a42da9e3c7e530333e72c3bbec072b8a Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Thu, 10 Sep 2015 00:33:43 -0700 Subject: [PATCH 11/63] Fix ObjC ParseUIDemo for iOS 9. --- .../DeletionCollectionViewController.m | 2 +- ParseUIDemo/Classes/PFUIDemoViewController.m | 84 ++++++++++--------- 2 files changed, 47 insertions(+), 39 deletions(-) diff --git a/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m b/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m index b311fb3..1f94e98 100644 --- a/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m +++ b/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m @@ -37,7 +37,7 @@ @implementation DeletionCollectionViewController - (instancetype)initWithClassName:(NSString *)className { self = [super initWithClassName:className]; if (self) { - self.title = @"Deletion Table"; + self.title = @"Deletion Collection"; self.pullToRefreshEnabled = YES; self.objectsPerPage = 10; self.paginationEnabled = YES; diff --git a/ParseUIDemo/Classes/PFUIDemoViewController.m b/ParseUIDemo/Classes/PFUIDemoViewController.m index ede818e..c325a9e 100644 --- a/ParseUIDemo/Classes/PFUIDemoViewController.m +++ b/ParseUIDemo/Classes/PFUIDemoViewController.m @@ -97,50 +97,58 @@ - (instancetype)initWithStyle:(UITableViewStyle)style { } - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (!self) return nil; - - self.title = @"ParseUI Demo"; - _descriptions = @[ @"Simple Table", - @"Paginated Table", - @"Sectioned Table", - @"Simple Storyboard Table", - @"Deletion Table", - @"Simple Collection", - @"Paginated Collection", - @"Sectioned Collection", - @"Simple Storyboard Collection", - @"Deletion Collection", - @"Log In Default", - @"Log In Username and Password", - @"Log In Password Forgotten", - @"Log In Done Button", - @"Log In Email as Username", - @"Log In Facebook", - @"Log In Facebook and Twitter", - @"Log In All", - @"Log In All as Navigation", - @"Log In Customized Background", - @"Sign Up Default", - @"Sign Up Username and Password", - @"Sign Up Email", - @"Sign Up Email And SignUp", - @"Sign Up All", - @"Sign Up Email as Username", - @"Sign Up Minimum Password Length", - @"Remote Image Table Default Style", - @"Remote Image Table Subtitle Style", - @"Remote Image Collection", - @"Purchase", - @"Custom Purchase" ]; - - return self; + return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; } - (instancetype)initWithCoder:(NSCoder *)decoder { return [self init]; } +#pragma mark - +#pragma mark View + +- (void)viewDidLoad { + [super viewDidLoad]; + + if (!self.title) { + self.title = @"ParseUI Demo"; + } + if (!_descriptions) { + _descriptions = @[ @"Simple Table", + @"Paginated Table", + @"Sectioned Table", + @"Simple Storyboard Table", + @"Deletion Table", + @"Simple Collection", + @"Paginated Collection", + @"Sectioned Collection", + @"Simple Storyboard Collection", + @"Deletion Collection", + @"Log In Default", + @"Log In Username and Password", + @"Log In Password Forgotten", + @"Log In Done Button", + @"Log In Email as Username", + @"Log In Facebook", + @"Log In Facebook and Twitter", + @"Log In All", + @"Log In All as Navigation", + @"Log In Customized Background", + @"Sign Up Default", + @"Sign Up Username and Password", + @"Sign Up Email", + @"Sign Up Email And SignUp", + @"Sign Up All", + @"Sign Up Email as Username", + @"Sign Up Minimum Password Length", + @"Remote Image Table Default Style", + @"Remote Image Table Subtitle Style", + @"Remote Image Collection", + @"Purchase", + @"Custom Purchase" ]; + } +} + #pragma mark - #pragma mark UITableViewDataSource From 9830ad28596f64a9c8352c5dbb72762eb87b13db Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Thu, 10 Sep 2015 10:50:13 -0700 Subject: [PATCH 12/63] Use Xcode 7 for Travis-CI. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9e154c0..e266283 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ branches: only: - master language: objective-c -osx_image: xcode6.4 +osx_image: xcode7 before_install: - gem install xcpretty --no-document -N - gem install cocoapods --no-document --pre --quiet From 26ebbf69a4d496b303d97b1664b1496a527f31f3 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Thu, 10 Sep 2015 13:35:41 -0700 Subject: [PATCH 13/63] ParseUI 1.1.6 --- ParseUI.podspec | 2 +- ParseUI/Resources/Info.plist | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ParseUI.podspec b/ParseUI.podspec index 8599e0d..75754c7 100644 --- a/ParseUI.podspec +++ b/ParseUI.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ParseUI' - s.version = '1.1.5' + s.version = '1.1.6' s.license = { :type => 'SDK', :file => 'LICENSE'} s.homepage = 'https://www.parse.com/' s.summary = 'ParseUI is a library of useful User Interface components for the Parse iOS SDK.' diff --git a/ParseUI/Resources/Info.plist b/ParseUI/Resources/Info.plist index 9c4a3bb..b4d9d06 100644 --- a/ParseUI/Resources/Info.plist +++ b/ParseUI/Resources/Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.1.5 + 1.1.6 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -22,7 +22,7 @@ iPhoneOS CFBundleVersion - 1.1.5 + 1.1.6 MinimumOSVersion 6.0 From b63dc71d58933f9aba54a3644fc7713caa373e30 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Sat, 12 Sep 2015 04:19:26 -0400 Subject: [PATCH 14/63] Update ParseUIDemo-Swift to Swift 2. --- .travis.yml | 1 + ParseUI.xcodeproj/project.pbxproj | 1 + ParseUIDemo/Swift/AppDelegate.swift | 28 ++++++------ .../DeletionCollectionViewController.swift | 34 +++++++------- .../PaginatedCollectionViewController.swift | 2 +- .../SectionedCollectionViewController.swift | 6 +-- .../SimpleCollectionViewController.swift | 2 +- .../StoryboardCollectionViewController.swift | 2 +- .../DeletionTableViewController.swift | 29 ++++++------ .../SectionedTableViewController.swift | 4 +- ParseUIDemo/Swift/UIDemoViewController.swift | 44 +++++++++---------- 11 files changed, 81 insertions(+), 72 deletions(-) diff --git a/.travis.yml b/.travis.yml index e266283..44e687d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,3 +13,4 @@ script: - set -o pipefail - xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUI' -sdk iphonesimulator build | xcpretty -c - xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUIDemo' -sdk iphonesimulator build | xcpretty -c + - xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUIDemo-Swift' -sdk iphonesimulator build | xcpretty -c diff --git a/ParseUI.xcodeproj/project.pbxproj b/ParseUI.xcodeproj/project.pbxproj index e0624f8..be135af 100644 --- a/ParseUI.xcodeproj/project.pbxproj +++ b/ParseUI.xcodeproj/project.pbxproj @@ -855,6 +855,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = PF; + LastSwiftUpdateCheck = 0700; LastUpgradeCheck = 0620; ORGANIZATIONNAME = "Parse Inc."; TargetAttributes = { diff --git a/ParseUIDemo/Swift/AppDelegate.swift b/ParseUIDemo/Swift/AppDelegate.swift index 34d92bb..fb5d3ee 100644 --- a/ParseUIDemo/Swift/AppDelegate.swift +++ b/ParseUIDemo/Swift/AppDelegate.swift @@ -47,7 +47,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } - func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { + func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) } @@ -71,27 +71,27 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var objects: [PFObject] = Array() - let query = PFQuery(className: "Todo") - if let todos = query.findObjects() as? [PFObject] { + do { + let todos = try PFQuery(className: "Todo").findObjects() if todos.count == 0 { - for (index, title) in enumerate(todoTitles) { + for (index, title) in todoTitles.enumerate() { let todo = PFObject(className: "Todo") todo["title"] = title todo["priority"] = index % 3 objects.append(todo) } } - } + } catch {} let appNames = [ "Anypic", "Anywall", "f8" ] - let appsQuery = PFQuery(className: "App") - if let apps = appsQuery.findObjects() as? [PFObject] { + do { + let apps = try PFQuery(className: "App").findObjects() if apps.count == 0 { - for (index, appName) in enumerate(appNames) { + for (index, appName) in appNames.enumerate() { let bundle = NSBundle.mainBundle() - if let filePath = bundle.pathForResource(String(index), ofType: "png") { - if let data = NSData(contentsOfFile: filePath) { - let file = PFFile(name: filePath.lastPathComponent, data: data) + if let fileURL = bundle.URLForResource(String(index), withExtension: "png") { + if let data = NSData(contentsOfURL: fileURL) { + let file = PFFile(name: fileURL.lastPathComponent, data: data) let object = PFObject(className: "App") object["icon"] = file object["name"] = appName @@ -100,10 +100,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } } } - } + } catch {} if objects.count != 0 { - PFObject.saveAll(objects) + do { + try PFObject.saveAll(objects) + } catch {} } } diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift index d84dffd..6f1acd0 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift @@ -60,20 +60,22 @@ class DeletionCollectionViewController: PFQueryCollectionViewController, UIAlert @objc func addTodo() { - if NSClassFromString("UIAlertController") != nil { + if #available(iOS 8.0, *) { let alertDialog = UIAlertController(title: "Add Todo", message: nil, preferredStyle: .Alert) - var titleTextField : UITextField! = nil + var titleTextField : UITextField? = nil alertDialog.addTextFieldWithConfigurationHandler() { titleTextField = $0 } alertDialog.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) alertDialog.addAction(UIAlertAction(title: "Save", style: .Default) { (action) -> Void in - let object = PFObject(className: self.parseClassName!, dictionary: [ "title": titleTextField.text ]) - object.saveEventually().continueWithSuccessBlock({ (_) -> AnyObject! in - return self.loadObjects() - }) + if let title = titleTextField?.text { + let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) + object.saveEventually().continueWithSuccessBlock { (_) -> AnyObject! in + return self.loadObjects() + } + } }) presentViewController(alertDialog, animated: true, completion: nil) @@ -88,7 +90,7 @@ class DeletionCollectionViewController: PFQueryCollectionViewController, UIAlert alertView.alertViewStyle = .PlainTextInput alertView.textFieldAtIndex(0)?.placeholder = "Name" - + alertView.show() } } @@ -119,13 +121,15 @@ class DeletionCollectionViewController: PFQueryCollectionViewController, UIAlert return } - let object = PFObject( - className: self.parseClassName!, - dictionary: [ "title": alertView.textFieldAtIndex(0)!.text ] - ) - - object.saveEventually().continueWithSuccessBlock({ (_) -> AnyObject! in - return self.loadObjects() - }) + if let title = alertView.textFieldAtIndex(0)?.text { + let object = PFObject( + className: self.parseClassName!, + dictionary: [ "title": title ] + ) + + object.saveEventually().continueWithSuccessBlock({ (_) -> AnyObject! in + return self.loadObjects() + }) + } } } diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift index 0c50170..a6827d3 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift @@ -66,7 +66,7 @@ class PaginatedCollectionViewController: PFQueryCollectionViewController { if let title = object?["title"] as? String { let attributedTitle = NSMutableAttributedString(string: title) - if var priority = object?["priority"] as? Int { + if let priority = object?["priority"] as? Int { let attributes = [NSFontAttributeName : UIFont.systemFontOfSize(13.0), NSForegroundColorAttributeName : UIColor.grayColor()] let string = NSAttributedString(string: "\nPriority: \(priority)", attributes: attributes) attributedTitle.appendAttributedString(string) diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift index 4de398f..26660f1 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift @@ -34,7 +34,7 @@ class SimpleCollectionReusableView : UICollectionReusableView { addSubview(label) } - required init(coder decoder: NSCoder) { + required init?(coder decoder: NSCoder) { super.init(coder: decoder) label.textAlignment = .Center @@ -97,7 +97,7 @@ class SectionedCollectionViewController: PFQueryCollectionViewController { sections[priority] = array } } - sectionKeys = sections.keys.array.sorted(<) + sectionKeys = sections.keys.sort(<) collectionView?.reloadData() } @@ -112,7 +112,7 @@ class SectionedCollectionViewController: PFQueryCollectionViewController { } -extension SectionedCollectionViewController : UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { +extension SectionedCollectionViewController { override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return sections.count diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift index 2b0128a..e36153b 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift @@ -65,7 +65,7 @@ class SimpleCollectionViewController: PFQueryCollectionViewController { if let title = object?["title"] as? String { let attributedTitle = NSMutableAttributedString(string: title) - if var priority = object?["priority"] as? Int { + if let priority = object?["priority"] as? Int { let attributes = [NSFontAttributeName : UIFont.systemFontOfSize(13.0), NSForegroundColorAttributeName : UIColor.grayColor()] let string = NSAttributedString(string: "\nPriority: \(priority)", attributes: attributes) attributedTitle.appendAttributedString(string) diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift index 5586cd5..a291bda 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift @@ -61,7 +61,7 @@ class StoryboardCollectionViewController: PFQueryCollectionViewController { if let title = object?["title"] as? String { let attributedTitle = NSMutableAttributedString(string: title) - if var priority = object?["priority"] as? Int { + if let priority = object?["priority"] as? Int { let attributes = [NSFontAttributeName : UIFont.systemFontOfSize(13.0), NSForegroundColorAttributeName : UIColor.grayColor()] let string = NSAttributedString(string: "\nPriority: \(priority)", attributes: attributes) attributedTitle.appendAttributedString(string) diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift index 4863cc4..694d90a 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift @@ -59,7 +59,8 @@ class DeletionTableViewController: PFQueryTableViewController, UIAlertViewDelega @objc func addTodo() { - if NSClassFromString("UIAlertController") != nil { + + if #available(iOS 8.0, *) { let alertDialog = UIAlertController(title: "Add Todo", message: nil, preferredStyle: .Alert) var titleTextField : UITextField! = nil @@ -69,10 +70,12 @@ class DeletionTableViewController: PFQueryTableViewController, UIAlertViewDelega alertDialog.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) alertDialog.addAction(UIAlertAction(title: "Save", style: .Default) { (action) -> Void in - let object = PFObject(className: self.parseClassName!, dictionary: [ "title": titleTextField.text ]) - object.saveInBackground().continueWithSuccessBlock({ (_) -> AnyObject! in - return self.loadObjects() - }) + if let title = titleTextField.text { + let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) + object.saveInBackground().continueWithSuccessBlock({ (_) -> AnyObject! in + return self.loadObjects() + }) + } }) presentViewController(alertDialog, animated: true, completion: nil) @@ -94,7 +97,7 @@ class DeletionTableViewController: PFQueryTableViewController, UIAlertViewDelega @objc func deleteSelectedItems() { - removeObjectsAtIndexPaths(tableView.indexPathsForSelectedRows()) + removeObjectsAtIndexPaths(tableView.indexPathsForSelectedRows) } // MARK - UIAlertViewDelegate @@ -105,13 +108,11 @@ class DeletionTableViewController: PFQueryTableViewController, UIAlertViewDelega return } - let object = PFObject( - className: self.parseClassName!, - dictionary: [ "title": alertView.textFieldAtIndex(0)!.text ] - ) - - object.saveEventually().continueWithSuccessBlock({ (_) -> AnyObject! in - return self.loadObjects() - }) + if let title = alertView.textFieldAtIndex(0)?.text { + let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) + object.saveEventually().continueWithSuccessBlock({ (_) -> AnyObject! in + return self.loadObjects() + }) + } } } diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift index 259fddd..e90fcb0 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift @@ -52,7 +52,7 @@ class SectionedTableViewController: PFQueryTableViewController { sections[priority] = array } } - sectionKeys = sections.keys.array.sorted(<) + sectionKeys = sections.keys.sort(<) tableView.reloadData() } @@ -66,7 +66,7 @@ class SectionedTableViewController: PFQueryTableViewController { } } -extension SectionedTableViewController : UITableViewDataSource { +extension SectionedTableViewController { override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return sections.count diff --git a/ParseUIDemo/Swift/UIDemoViewController.swift b/ParseUIDemo/Swift/UIDemoViewController.swift index 76752fc..40fd807 100644 --- a/ParseUIDemo/Swift/UIDemoViewController.swift +++ b/ParseUIDemo/Swift/UIDemoViewController.swift @@ -60,12 +60,12 @@ enum UIDemoType : Int { static var count: Int { var count = 0 - while let _ = self(rawValue: ++count) { } + while let _ = self.init(rawValue: ++count) { } return count } } -extension UIDemoType : Printable { +extension UIDemoType : CustomStringConvertible { var description: String { switch (self) { @@ -149,7 +149,7 @@ class UIDemoViewController: UITableViewController { } -extension UIDemoViewController : UITableViewDataSource { +extension UIDemoViewController { override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 @@ -160,13 +160,13 @@ extension UIDemoViewController : UITableViewDataSource { } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath:indexPath) as! UITableViewCell + let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath:indexPath) cell.textLabel?.text = UIDemoType(rawValue: indexPath.row)?.description return cell } } -extension UIDemoViewController : UITableViewDelegate { +extension UIDemoViewController { override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { if let demoType = UIDemoType(rawValue: indexPath.row) { @@ -181,56 +181,56 @@ extension UIDemoViewController : UITableViewDelegate { case .LogInUsernamePassword: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = .UsernameAndPassword | .DismissButton + logInViewController.fields = [.UsernameAndPassword, .DismissButton] presentViewController(logInViewController, animated: true, completion: nil) case .LogInPasswordForgotten: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = .UsernameAndPassword | .PasswordForgotten | .DismissButton + logInViewController.fields = [.UsernameAndPassword, .PasswordForgotten, .DismissButton] presentViewController(logInViewController, animated: true, completion: nil) case .LogInDone: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = .UsernameAndPassword | .LogInButton | .DismissButton + logInViewController.fields = [.UsernameAndPassword, .LogInButton, .DismissButton] presentViewController(logInViewController, animated: true, completion: nil) case .LogInEmailAsUsername: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = .UsernameAndPassword | .LogInButton | .SignUpButton | .DismissButton + logInViewController.fields = [.UsernameAndPassword, .LogInButton, .SignUpButton, .DismissButton] logInViewController.emailAsUsername = true presentViewController(logInViewController, animated: true, completion: nil) case .LogInFacebook: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = .UsernameAndPassword | .Facebook | .DismissButton + logInViewController.fields = [.UsernameAndPassword, .Facebook, .DismissButton] presentViewController(logInViewController, animated: true, completion: nil) case .LogInFacebookAndTwitter: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = .Facebook | .Twitter | .DismissButton + logInViewController.fields = [.Facebook, .Twitter, .DismissButton] presentViewController(logInViewController, animated: true, completion: nil) case .LogInAll: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = .UsernameAndPassword | .PasswordForgotten | .LogInButton | .Facebook | .Twitter | .SignUpButton | .DismissButton + logInViewController.fields = [.UsernameAndPassword, .PasswordForgotten, .LogInButton, .Facebook, .Twitter, .SignUpButton, .DismissButton] if let signUpController = logInViewController.signUpController { signUpController.delegate = self - signUpController.fields = .UsernameAndPassword | .Email | .Additional | .SignUpButton | .DismissButton + signUpController.fields = [.UsernameAndPassword, .Email, .Additional, .SignUpButton, .DismissButton] } presentViewController(logInViewController, animated: true, completion: nil) case .LogInAllNavigation: let logInViewController = PFLogInViewController() logInViewController.delegate = self - logInViewController.fields = .UsernameAndPassword | .PasswordForgotten | .LogInButton | .Facebook | .Twitter | .SignUpButton | .DismissButton + logInViewController.fields = [.UsernameAndPassword, .PasswordForgotten, .LogInButton, .Facebook, .Twitter, .SignUpButton, .DismissButton] if let signUpViewController = logInViewController.signUpController { signUpViewController.delegate = self - signUpViewController.fields = .UsernameAndPassword | .Email | .Additional | .SignUpButton | .DismissButton + signUpViewController.fields = [.UsernameAndPassword, .Email, .Additional, .SignUpButton, .DismissButton] } navigationController?.pushViewController(logInViewController, animated: true) case .LogInCustomizedLogoAndBackground: let logInViewController = CustomLogInViewController() logInViewController.delegate = self - logInViewController.fields = .Default | .Facebook | .Twitter + logInViewController.fields = [.Default, .Facebook, .Twitter] let signUpViewController = CustomSignUpViewController() signUpViewController.delegate = self @@ -248,33 +248,33 @@ extension UIDemoViewController : UITableViewDelegate { case .SignUpUsernamePassword: let signUpViewController = PFSignUpViewController() signUpViewController.delegate = self - signUpViewController.fields = .UsernameAndPassword | .DismissButton + signUpViewController.fields = [.UsernameAndPassword, .DismissButton] presentViewController(signUpViewController, animated: true, completion: nil) case .SignUpUsernamePasswordEmail: let signUpViewController = PFSignUpViewController() signUpViewController.delegate = self - signUpViewController.fields = .UsernameAndPassword | .Email | .DismissButton + signUpViewController.fields = [.UsernameAndPassword, .Email, .DismissButton] presentViewController(signUpViewController, animated: true, completion: nil) case .SignUpUsernamePasswordEmailSignUp: let signUpViewController = PFSignUpViewController() signUpViewController.delegate = self - signUpViewController.fields = .UsernameAndPassword | .Email | .SignUpButton | .DismissButton + signUpViewController.fields = [.UsernameAndPassword, .Email, .SignUpButton, .DismissButton] presentViewController(signUpViewController, animated: true, completion: nil) case .SignUpAll: let signUpViewController = PFSignUpViewController() signUpViewController.delegate = self - signUpViewController.fields = .UsernameAndPassword | .Email | .Additional | .SignUpButton | .DismissButton + signUpViewController.fields = [.UsernameAndPassword, .Email, .Additional, .SignUpButton, .DismissButton] presentViewController(signUpViewController, animated: true, completion: nil) case .SignUpEmailAsUsername: let signUpViewController = PFSignUpViewController() signUpViewController.delegate = self - signUpViewController.fields = .UsernameAndPassword | .SignUpButton | .DismissButton + signUpViewController.fields = [.UsernameAndPassword, .SignUpButton, .DismissButton] signUpViewController.emailAsUsername = true presentViewController(signUpViewController, animated: true, completion: nil) case .SignUpMinPasswordLength: let signUpViewController = PFSignUpViewController() signUpViewController.delegate = self - signUpViewController.fields = .UsernameAndPassword | .SignUpButton | .DismissButton + signUpViewController.fields = [.UsernameAndPassword, .SignUpButton, .DismissButton] signUpViewController.minPasswordLength = 6 presentViewController(signUpViewController, animated: true, completion: nil) // ----- From c5115ed7c8a7ca8c1033d3b750e9d8641fe1a660 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Mon, 21 Sep 2015 17:06:06 -0700 Subject: [PATCH 15/63] Fix ParseUIDemo authentication with Facebook. --- ParseUIDemo/Other/Info.plist | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/ParseUIDemo/Other/Info.plist b/ParseUIDemo/Other/Info.plist index 014761d..a7b987b 100644 --- a/ParseUIDemo/Other/Info.plist +++ b/ParseUIDemo/Other/Info.plist @@ -58,5 +58,39 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + NSAppTransportSecurity + + NSExceptionDomains + + facebook.com + + NSIncludesSubdomains + + NSExceptionRequiresForwardSecrecy + + + fbcdn.net + + NSIncludesSubdomains + + NSExceptionRequiresForwardSecrecy + + + akamaihd.net + + NSIncludesSubdomains + + NSExceptionRequiresForwardSecrecy + + + + + LSApplicationQueriesSchemes + + fbapi + fb-messenger-api + fbauth2 + fbshareextension + From a5c497a880d29ecde5b39368edfe37f32d9a77c5 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Mon, 21 Sep 2015 17:52:22 -0700 Subject: [PATCH 16/63] Use ParseUI directly from a local Pod. --- ParseUI.xcodeproj/project.pbxproj | 653 ++---------------- .../xcshareddata/xcschemes/ParseUI.xcscheme | 77 --- .../xcschemes/ParseUIDemo-Swift.xcscheme | 13 +- .../xcschemes/ParseUIDemo.xcscheme | 13 +- Podfile | 22 +- 5 files changed, 76 insertions(+), 702 deletions(-) delete mode 100644 ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme diff --git a/ParseUI.xcodeproj/project.pbxproj b/ParseUI.xcodeproj/project.pbxproj index be135af..a28b13b 100644 --- a/ParseUI.xcodeproj/project.pbxproj +++ b/ParseUI.xcodeproj/project.pbxproj @@ -7,36 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - 3A105F8401D6777BE50537C7 /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B91892E5A1364B4A9F064902 /* Pods.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 810D6C1519F7F006005B3DB2 /* PFActivityIndicatorTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6BFA19F7F005005B3DB2 /* PFActivityIndicatorTableViewCell.h */; }; - 810D6C1619F7F006005B3DB2 /* PFActivityIndicatorTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6BFB19F7F005005B3DB2 /* PFActivityIndicatorTableViewCell.m */; }; - 810D6C1719F7F006005B3DB2 /* PFUIAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6BFD19F7F005005B3DB2 /* PFUIAlertView.h */; }; - 810D6C1819F7F006005B3DB2 /* PFUIAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6BFE19F7F005005B3DB2 /* PFUIAlertView.m */; }; - 810D6C1919F7F006005B3DB2 /* PFColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6BFF19F7F005005B3DB2 /* PFColor.h */; }; - 810D6C1A19F7F006005B3DB2 /* PFColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C0019F7F005005B3DB2 /* PFColor.m */; }; - 810D6C1B19F7F006005B3DB2 /* PFImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C0119F7F005005B3DB2 /* PFImage.h */; }; - 810D6C1C19F7F006005B3DB2 /* PFImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C0219F7F005005B3DB2 /* PFImage.m */; }; - 810D6C1D19F7F006005B3DB2 /* PFRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C0319F7F005005B3DB2 /* PFRect.h */; }; - 810D6C1E19F7F006005B3DB2 /* PFRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C0419F7F005005B3DB2 /* PFRect.m */; }; - 810D6C1F19F7F006005B3DB2 /* PFImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C0519F7F005005B3DB2 /* PFImageCache.h */; }; - 810D6C2019F7F006005B3DB2 /* PFImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C0619F7F006005B3DB2 /* PFImageCache.m */; }; - 810D6C2119F7F006005B3DB2 /* PFActionButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C0919F7F006005B3DB2 /* PFActionButton.h */; }; - 810D6C2219F7F006005B3DB2 /* PFActionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C0A19F7F006005B3DB2 /* PFActionButton.m */; }; - 810D6C2319F7F006005B3DB2 /* PFDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C0B19F7F006005B3DB2 /* PFDismissButton.h */; }; - 810D6C2419F7F006005B3DB2 /* PFDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C0C19F7F006005B3DB2 /* PFDismissButton.m */; }; - 810D6C2519F7F006005B3DB2 /* PFPrimaryButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C0D19F7F006005B3DB2 /* PFPrimaryButton.h */; }; - 810D6C2619F7F006005B3DB2 /* PFPrimaryButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C0E19F7F006005B3DB2 /* PFPrimaryButton.m */; }; - 810D6C2719F7F006005B3DB2 /* PFTextButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C0F19F7F006005B3DB2 /* PFTextButton.h */; }; - 810D6C2819F7F006005B3DB2 /* PFTextButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C1019F7F006005B3DB2 /* PFTextButton.m */; }; - 810D6C2919F7F006005B3DB2 /* PFLoadingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C1119F7F006005B3DB2 /* PFLoadingView.h */; }; - 810D6C2A19F7F006005B3DB2 /* PFLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C1219F7F006005B3DB2 /* PFLoadingView.m */; }; - 810D6C3019F7F379005B3DB2 /* PFProductTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C2E19F7F379005B3DB2 /* PFProductTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 810D6C3119F7F379005B3DB2 /* PFProductTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C2F19F7F379005B3DB2 /* PFProductTableViewController.m */; }; - 810D6C3419F7F38B005B3DB2 /* PFPurchaseTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 810D6C3219F7F38B005B3DB2 /* PFPurchaseTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 810D6C3519F7F38B005B3DB2 /* PFPurchaseTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 810D6C3319F7F38B005B3DB2 /* PFPurchaseTableViewCell.m */; }; - 811EE7A31B8C17550058B3BE /* PFLogInView_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 811EE7A21B8C17550058B3BE /* PFLogInView_Private.h */; }; - 8129E5F21A9CB067006752BC /* ParseUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2AAC07E0554694100DB518D /* ParseUI.framework */; }; - 8129E5F31A9CB067006752BC /* (null) in Frameworks */ = {isa = PBXBuildFile; }; + 0F487952B83BF80EF1A5C4C4 /* Pods_ParseUIDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B11BDB9C48788D891789AC4D /* Pods_ParseUIDemo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 3082A3CE396F45707D6A7F38 /* Pods_ParseUIDemo_Swift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A00130E2D30BC9B48B6FC033 /* Pods_ParseUIDemo_Swift.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 8129E5F51A9CB067006752BC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA71A1AB37500FD6EED /* Images.xcassets */; }; 8129E5F71A9CB067006752BC /* 0.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA91A1AB37500FD6EED /* 0.png */; }; 8129E5F81A9CB067006752BC /* 1.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAA1A1AB37500FD6EED /* 1.png */; }; @@ -63,40 +35,11 @@ 81472FBE1A1AB37500FD6EED /* 0.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA91A1AB37500FD6EED /* 0.png */; }; 81472FBF1A1AB37500FD6EED /* 1.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAA1A1AB37500FD6EED /* 1.png */; }; 81472FC01A1AB37500FD6EED /* 2.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAB1A1AB37500FD6EED /* 2.png */; }; - 81472FC41A1AB51600FD6EED /* ParseUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2AAC07E0554694100DB518D /* ParseUI.framework */; }; - 816A5CCF1A641D1900427332 /* PFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 816A5CCD1A641D1900427332 /* PFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 816A5CD01A641D1900427332 /* PFTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 816A5CCE1A641D1900427332 /* PFTextField.m */; }; - 8185BA781A64241B002815C0 /* PFQueryCollectionViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8185BA761A64241B002815C0 /* PFQueryCollectionViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8185BA791A64241B002815C0 /* PFQueryCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8185BA771A64241B002815C0 /* PFQueryCollectionViewController.m */; }; - 8185BA7C1A642A8B002815C0 /* PFCollectionViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 8185BA7A1A642A8B002815C0 /* PFCollectionViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8185BA7D1A642A8B002815C0 /* PFCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8185BA7B1A642A8B002815C0 /* PFCollectionViewCell.m */; }; 819A4B3A1A6808EA00D01241 /* SubtitleImageCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 819A4B391A6808EA00D01241 /* SubtitleImageCollectionViewController.m */; }; - 81B3F26C1AC9EDE000A92677 /* ParseUI.strings in Resources */ = {isa = PBXBuildFile; fileRef = 81B3F26A1AC9EDE000A92677 /* ParseUI.strings */; }; - 81B3F26E1AC9EE0000A92677 /* PFLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 81B3F26D1AC9EE0000A92677 /* PFLocalization.h */; }; 81C5993F1A64346000F574E8 /* SimpleCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C5993E1A64346000F574E8 /* SimpleCollectionViewController.m */; }; 81C599421A6454C900F574E8 /* PaginatedCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C599411A6454C900F574E8 /* PaginatedCollectionViewController.m */; }; - 81C599451A645A9100F574E8 /* PFActivityIndicatorCollectionReusableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 81C599431A645A9100F574E8 /* PFActivityIndicatorCollectionReusableView.h */; }; - 81C599461A645A9100F574E8 /* PFActivityIndicatorCollectionReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C599441A645A9100F574E8 /* PFActivityIndicatorCollectionReusableView.m */; }; 81C599491A64636200F574E8 /* SectionedCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C599481A64636200F574E8 /* SectionedCollectionViewController.m */; }; 81C8D9BD1A890BCA007B8DCF /* StoryboardTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C8D9BC1A890BCA007B8DCF /* StoryboardTableViewController.m */; }; - 81E9CCFF19F56D3100487B0F /* PFSignUpView.h in Headers */ = {isa = PBXBuildFile; fileRef = 81E9CCD319F56D3000487B0F /* PFSignUpView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81E9CD0019F56D3100487B0F /* PFSignUpView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81E9CCD419F56D3000487B0F /* PFSignUpView.m */; }; - 81E9CD0119F56D3100487B0F /* PFSignUpViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 81E9CCD519F56D3000487B0F /* PFSignUpViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81E9CD0219F56D3100487B0F /* PFSignUpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81E9CCD619F56D3000487B0F /* PFSignUpViewController.m */; }; - 81E9CD1319F56D6B00487B0F /* ParseUI.h in Headers */ = {isa = PBXBuildFile; fileRef = 81E9CD1119F56D6B00487B0F /* ParseUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81E9CD1419F56D6B00487B0F /* ParseUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 81E9CD1219F56D6B00487B0F /* ParseUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81E9CD4119F57AC500487B0F /* PFResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 81E9CD3F19F57AC500487B0F /* PFResources.h */; }; - 81E9CD4219F57AC500487B0F /* PFResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 81E9CD4019F57AC500487B0F /* PFResources.m */; }; - 81ED075519F68028009745F4 /* PFLogInView.h in Headers */ = {isa = PBXBuildFile; fileRef = 81ED075119F68028009745F4 /* PFLogInView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81ED075619F68028009745F4 /* PFLogInView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81ED075219F68028009745F4 /* PFLogInView.m */; }; - 81ED075719F68028009745F4 /* PFLogInViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 81ED075319F68028009745F4 /* PFLogInViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81ED075819F68028009745F4 /* PFLogInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81ED075419F68028009745F4 /* PFLogInViewController.m */; }; - 81ED077C19F6809F009745F4 /* PFTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 81ED075A19F6809F009745F4 /* PFTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81ED077D19F6809F009745F4 /* PFTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81ED075B19F6809F009745F4 /* PFTableViewCell.m */; }; - 81ED079619F6809F009745F4 /* PFImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 81ED077A19F6809F009745F4 /* PFImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81ED079719F6809F009745F4 /* PFImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81ED077B19F6809F009745F4 /* PFImageView.m */; }; - 81ED079B19F680B9009745F4 /* PFQueryTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 81ED079919F680B9009745F4 /* PFQueryTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81ED079C19F680B9009745F4 /* PFQueryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81ED079A19F680B9009745F4 /* PFQueryTableViewController.m */; }; 81FC6B4A1A9D1ADB00104E45 /* CustomLogInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B3A1A9D1ADB00104E45 /* CustomLogInViewController.swift */; }; 81FC6B561A9D1ADB00104E45 /* CustomSignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B491A9D1ADB00104E45 /* CustomSignUpViewController.swift */; }; 81FC6B5F1A9D1BFC00104E45 /* PaginatedTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B591A9D1BFC00104E45 /* PaginatedTableViewController.swift */; }; @@ -112,11 +55,6 @@ 81FC6B701A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B6B1A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift */; }; 81FC6B721A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81FC6B711A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard */; }; 81FC6B751A9D1D4700104E45 /* CustomProductTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B741A9D1D4700104E45 /* CustomProductTableViewController.swift */; }; - 83CD55F24C8F16B87F23B594 /* (null) in Frameworks */ = {isa = PBXBuildFile; settings = {ATTRIBUTES = (Weak, ); }; }; - 8BE170C01ED5C8F0A6A06998 /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B91892E5A1364B4A9F064902 /* Pods.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - A5375DF534FF03442906BCAC /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B91892E5A1364B4A9F064902 /* Pods.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; - BD1FB4C4DFB833BFFD3E209A /* (null) in Frameworks */ = {isa = PBXBuildFile; }; F57F3D231B0C03D40087F60B /* DeletionCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F57F3D201B0C03C90087F60B /* DeletionCollectionViewController.m */; }; F57F3D241B0C03DB0087F60B /* DeletionTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F57F3D1C1B0C03BA0087F60B /* DeletionTableViewController.m */; }; F57F3D271B0C050C0087F60B /* DeletionTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F57F3D251B0C04EF0087F60B /* DeletionTableViewController.swift */; }; @@ -124,43 +62,17 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 2C9AC93D6C1063CD6DCC1F9A /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; - 810D6BFA19F7F005005B3DB2 /* PFActivityIndicatorTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFActivityIndicatorTableViewCell.h; sourceTree = ""; }; - 810D6BFB19F7F005005B3DB2 /* PFActivityIndicatorTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFActivityIndicatorTableViewCell.m; sourceTree = ""; }; - 810D6BFD19F7F005005B3DB2 /* PFUIAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFUIAlertView.h; sourceTree = ""; }; - 810D6BFE19F7F005005B3DB2 /* PFUIAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFUIAlertView.m; sourceTree = ""; }; - 810D6BFF19F7F005005B3DB2 /* PFColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFColor.h; sourceTree = ""; }; - 810D6C0019F7F005005B3DB2 /* PFColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFColor.m; sourceTree = ""; }; - 810D6C0119F7F005005B3DB2 /* PFImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFImage.h; sourceTree = ""; }; - 810D6C0219F7F005005B3DB2 /* PFImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFImage.m; sourceTree = ""; }; - 810D6C0319F7F005005B3DB2 /* PFRect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFRect.h; sourceTree = ""; }; - 810D6C0419F7F005005B3DB2 /* PFRect.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFRect.m; sourceTree = ""; }; - 810D6C0519F7F005005B3DB2 /* PFImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFImageCache.h; sourceTree = ""; }; - 810D6C0619F7F006005B3DB2 /* PFImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFImageCache.m; sourceTree = ""; }; - 810D6C0919F7F006005B3DB2 /* PFActionButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFActionButton.h; sourceTree = ""; }; - 810D6C0A19F7F006005B3DB2 /* PFActionButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFActionButton.m; sourceTree = ""; }; - 810D6C0B19F7F006005B3DB2 /* PFDismissButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFDismissButton.h; sourceTree = ""; }; - 810D6C0C19F7F006005B3DB2 /* PFDismissButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFDismissButton.m; sourceTree = ""; }; - 810D6C0D19F7F006005B3DB2 /* PFPrimaryButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFPrimaryButton.h; sourceTree = ""; }; - 810D6C0E19F7F006005B3DB2 /* PFPrimaryButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFPrimaryButton.m; sourceTree = ""; }; - 810D6C0F19F7F006005B3DB2 /* PFTextButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTextButton.h; sourceTree = ""; }; - 810D6C1019F7F006005B3DB2 /* PFTextButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTextButton.m; sourceTree = ""; }; - 810D6C1119F7F006005B3DB2 /* PFLoadingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFLoadingView.h; sourceTree = ""; }; - 810D6C1219F7F006005B3DB2 /* PFLoadingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFLoadingView.m; sourceTree = ""; }; - 810D6C2E19F7F379005B3DB2 /* PFProductTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFProductTableViewController.h; sourceTree = ""; }; - 810D6C2F19F7F379005B3DB2 /* PFProductTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFProductTableViewController.m; sourceTree = ""; }; - 810D6C3219F7F38B005B3DB2 /* PFPurchaseTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFPurchaseTableViewCell.h; sourceTree = ""; }; - 810D6C3319F7F38B005B3DB2 /* PFPurchaseTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFPurchaseTableViewCell.m; sourceTree = ""; }; - 811B095A1A0843B9008B3393 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = ParseUI/Resources/Info.plist; sourceTree = SOURCE_ROOT; }; - 811EE7A21B8C17550058B3BE /* PFLogInView_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFLogInView_Private.h; sourceTree = ""; }; - 8129E6001A9CB067006752BC /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 323E48C3F5A6E337CF362B8F /* Pods-ParseUIDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo.release.xcconfig"; sourceTree = ""; }; + 3583C464D666C3687E5AAD0E /* Pods-ParseUIDemo-Swift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo-Swift.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift.debug.xcconfig"; sourceTree = ""; }; + 71B8D6C92C9693FC9DA8F19B /* Pods-ParseUIDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo.debug.xcconfig"; sourceTree = ""; }; + 8129E6001A9CB067006752BC /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = ParseUIDemo.app; path = "/Users/nlutsenko/src/parse/ios-client/ParseUI/src/build/Debug-iphoneos/ParseUIDemo.app"; sourceTree = ""; }; 8129E6081A9CB1BE006752BC /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8129E6391A9CB320006752BC /* UIDemoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIDemoViewController.swift; sourceTree = ""; }; 812E5C001A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SimpleQueryCollectionStoryboard.storyboard; path = ../../../Resources/SimpleQueryCollectionStoryboard.storyboard; sourceTree = ""; }; 812E5C021A7A8EFB000FBDE1 /* StoryboardCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StoryboardCollectionViewController.h; sourceTree = ""; }; 812E5C031A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StoryboardCollectionViewController.m; sourceTree = ""; }; 814155B01A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SimpleQueryTableStoryboard.storyboard; path = ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard; sourceTree = SOURCE_ROOT; }; - 81472F671A1AB33800FD6EED /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 81472F671A1AB33800FD6EED /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = ParseUIDemo.app; path = "/Users/nlutsenko/src/parse/ios-client/ParseUI/src/build/Debug-iphoneos/ParseUIDemo.app"; sourceTree = ""; }; 81472F8D1A1AB37500FD6EED /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 81472F8E1A1AB37500FD6EED /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 81472F8F1A1AB37500FD6EED /* PFUIDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFUIDemoViewController.h; sourceTree = ""; }; @@ -188,44 +100,16 @@ 81472FAB1A1AB37500FD6EED /* 2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 2.png; sourceTree = ""; }; 81472FAE1A1AB37500FD6EED /* libPods-ParseUIDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libPods-ParseUIDemo.a"; sourceTree = SOURCE_ROOT; }; 81472FB01A1AB37500FD6EED /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; path = ParseUIDemo.app; sourceTree = SOURCE_ROOT; }; - 816A5CCD1A641D1900427332 /* PFTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTextField.h; sourceTree = ""; }; - 816A5CCE1A641D1900427332 /* PFTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTextField.m; sourceTree = ""; }; - 8185BA761A64241B002815C0 /* PFQueryCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFQueryCollectionViewController.h; sourceTree = ""; }; - 8185BA771A64241B002815C0 /* PFQueryCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFQueryCollectionViewController.m; sourceTree = ""; }; - 8185BA7A1A642A8B002815C0 /* PFCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFCollectionViewCell.h; sourceTree = ""; }; - 8185BA7B1A642A8B002815C0 /* PFCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFCollectionViewCell.m; sourceTree = ""; }; 819A4B381A6808EA00D01241 /* SubtitleImageCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubtitleImageCollectionViewController.h; sourceTree = ""; }; 819A4B391A6808EA00D01241 /* SubtitleImageCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SubtitleImageCollectionViewController.m; sourceTree = ""; }; - 81B3F26B1AC9EDE000A92677 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/ParseUI.strings; sourceTree = ""; }; - 81B3F26D1AC9EE0000A92677 /* PFLocalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFLocalization.h; sourceTree = ""; }; 81C5993D1A64346000F574E8 /* SimpleCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleCollectionViewController.h; sourceTree = ""; }; 81C5993E1A64346000F574E8 /* SimpleCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleCollectionViewController.m; sourceTree = ""; }; 81C599401A6454C900F574E8 /* PaginatedCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PaginatedCollectionViewController.h; sourceTree = ""; }; 81C599411A6454C900F574E8 /* PaginatedCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PaginatedCollectionViewController.m; sourceTree = ""; }; - 81C599431A645A9100F574E8 /* PFActivityIndicatorCollectionReusableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFActivityIndicatorCollectionReusableView.h; sourceTree = ""; }; - 81C599441A645A9100F574E8 /* PFActivityIndicatorCollectionReusableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFActivityIndicatorCollectionReusableView.m; sourceTree = ""; }; 81C599471A64636200F574E8 /* SectionedCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SectionedCollectionViewController.h; sourceTree = ""; }; 81C599481A64636200F574E8 /* SectionedCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SectionedCollectionViewController.m; sourceTree = ""; }; 81C8D9BB1A890BCA007B8DCF /* StoryboardTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StoryboardTableViewController.h; sourceTree = ""; }; 81C8D9BC1A890BCA007B8DCF /* StoryboardTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StoryboardTableViewController.m; sourceTree = ""; }; - 81E9CCD319F56D3000487B0F /* PFSignUpView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFSignUpView.h; sourceTree = ""; }; - 81E9CCD419F56D3000487B0F /* PFSignUpView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFSignUpView.m; sourceTree = ""; }; - 81E9CCD519F56D3000487B0F /* PFSignUpViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFSignUpViewController.h; sourceTree = ""; }; - 81E9CCD619F56D3000487B0F /* PFSignUpViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFSignUpViewController.m; sourceTree = ""; }; - 81E9CD1119F56D6B00487B0F /* ParseUI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ParseUI.h; path = ParseUI/Other/ParseUI.h; sourceTree = ""; }; - 81E9CD1219F56D6B00487B0F /* ParseUIConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ParseUIConstants.h; path = ParseUI/Other/ParseUIConstants.h; sourceTree = ""; }; - 81E9CD3F19F57AC500487B0F /* PFResources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFResources.h; sourceTree = ""; }; - 81E9CD4019F57AC500487B0F /* PFResources.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFResources.m; sourceTree = ""; }; - 81ED075119F68028009745F4 /* PFLogInView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFLogInView.h; sourceTree = ""; }; - 81ED075219F68028009745F4 /* PFLogInView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFLogInView.m; sourceTree = ""; }; - 81ED075319F68028009745F4 /* PFLogInViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFLogInViewController.h; sourceTree = ""; }; - 81ED075419F68028009745F4 /* PFLogInViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFLogInViewController.m; sourceTree = ""; }; - 81ED075A19F6809F009745F4 /* PFTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFTableViewCell.h; sourceTree = ""; }; - 81ED075B19F6809F009745F4 /* PFTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFTableViewCell.m; sourceTree = ""; }; - 81ED077A19F6809F009745F4 /* PFImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFImageView.h; sourceTree = ""; }; - 81ED077B19F6809F009745F4 /* PFImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFImageView.m; sourceTree = ""; }; - 81ED079919F680B9009745F4 /* PFQueryTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFQueryTableViewController.h; sourceTree = ""; }; - 81ED079A19F680B9009745F4 /* PFQueryTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFQueryTableViewController.m; sourceTree = ""; }; 81FC6B3A1A9D1ADB00104E45 /* CustomLogInViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomLogInViewController.swift; sourceTree = ""; }; 81FC6B491A9D1ADB00104E45 /* CustomSignUpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomSignUpViewController.swift; sourceTree = ""; }; 81FC6B591A9D1BFC00104E45 /* PaginatedTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaginatedTableViewController.swift; sourceTree = ""; }; @@ -241,11 +125,10 @@ 81FC6B6B1A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubtitleImageCollectionViewController.swift; sourceTree = ""; }; 81FC6B711A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = "SimpleQueryCollectionStoryboard-Swift.storyboard"; path = "ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard"; sourceTree = SOURCE_ROOT; }; 81FC6B741A9D1D4700104E45 /* CustomProductTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomProductTableViewController.swift; sourceTree = ""; }; - 8CBD5368A83B8B99AC0AE128 /* libPods-ParseUI.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ParseUI.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - B774A7483212431D2C034600 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + A00130E2D30BC9B48B6FC033 /* Pods_ParseUIDemo_Swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ParseUIDemo_Swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B01F654B200E4F6A9AAF2E14 /* Pods-ParseUIDemo-Swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo-Swift.release.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift.release.xcconfig"; sourceTree = ""; }; + B11BDB9C48788D891789AC4D /* Pods_ParseUIDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ParseUIDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B91892E5A1364B4A9F064902 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D2AAC07E0554694100DB518D /* ParseUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F57F3D1B1B0C03BA0087F60B /* DeletionTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeletionTableViewController.h; sourceTree = ""; }; F57F3D1C1B0C03BA0087F60B /* DeletionTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeletionTableViewController.m; sourceTree = ""; }; F57F3D1F1B0C03C90087F60B /* DeletionCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeletionCollectionViewController.h; sourceTree = ""; }; @@ -259,9 +142,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8129E5F21A9CB067006752BC /* ParseUI.framework in Frameworks */, - 8129E5F31A9CB067006752BC /* (null) in Frameworks */, - 8BE170C01ED5C8F0A6A06998 /* Pods.framework in Frameworks */, + 3082A3CE396F45707D6A7F38 /* Pods_ParseUIDemo_Swift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -269,146 +150,44 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 81472FC41A1AB51600FD6EED /* ParseUI.framework in Frameworks */, - 83CD55F24C8F16B87F23B594 /* (null) in Frameworks */, - BD1FB4C4DFB833BFFD3E209A /* (null) in Frameworks */, - A5375DF534FF03442906BCAC /* Pods.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */, - 3A105F8401D6777BE50537C7 /* Pods.framework in Frameworks */, + 0F487952B83BF80EF1A5C4C4 /* Pods_ParseUIDemo.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { + 07A8DE7A188BFADCF65DF735 /* Pods */ = { isa = PBXGroup; children = ( - D2AAC07E0554694100DB518D /* ParseUI.framework */, - 81472F671A1AB33800FD6EED /* ParseUIDemo.app */, - 8129E6001A9CB067006752BC /* ParseUIDemo.app */, + 71B8D6C92C9693FC9DA8F19B /* Pods-ParseUIDemo.debug.xcconfig */, + 323E48C3F5A6E337CF362B8F /* Pods-ParseUIDemo.release.xcconfig */, + 3583C464D666C3687E5AAD0E /* Pods-ParseUIDemo-Swift.debug.xcconfig */, + B01F654B200E4F6A9AAF2E14 /* Pods-ParseUIDemo-Swift.release.xcconfig */, ); - name = Products; + name = Pods; sourceTree = ""; }; 0867D691FE84028FC02AAC07 /* Breakpad */ = { isa = PBXGroup; children = ( - 81472F611A1AB31300FD6EED /* ParseUI */, 81472F621A1AB31F00FD6EED /* ParseUIDemo */, - B9A7CC75B8E97A83D7340201 /* Pods */, 3F5307328F84566C90FBCF25 /* Frameworks */, + 07A8DE7A188BFADCF65DF735 /* Pods */, ); name = Breakpad; sourceTree = ""; }; - 0867D69AFE84028FC02AAC07 /* Frameworks */ = { - isa = PBXGroup; - children = ( - AACBBE490F95108600F1A2B1 /* Foundation.framework */, - 8CBD5368A83B8B99AC0AE128 /* libPods-ParseUI.a */, - ); - name = Frameworks; - sourceTree = ""; - }; 3F5307328F84566C90FBCF25 /* Frameworks */ = { isa = PBXGroup; children = ( B91892E5A1364B4A9F064902 /* Pods.framework */, + B11BDB9C48788D891789AC4D /* Pods_ParseUIDemo.framework */, + A00130E2D30BC9B48B6FC033 /* Pods_ParseUIDemo_Swift.framework */, ); name = Frameworks; sourceTree = ""; }; - 810D6BF819F7F005005B3DB2 /* Internal */ = { - isa = PBXGroup; - children = ( - 810D6BF919F7F005005B3DB2 /* Cells */, - 810D6BFC19F7F005005B3DB2 /* Extensions */, - 810D6C0519F7F005005B3DB2 /* PFImageCache.h */, - 810D6C0619F7F006005B3DB2 /* PFImageCache.m */, - 81B3F26D1AC9EE0000A92677 /* PFLocalization.h */, - 810D6C0719F7F006005B3DB2 /* Views */, - ); - path = Internal; - sourceTree = ""; - }; - 810D6BF919F7F005005B3DB2 /* Cells */ = { - isa = PBXGroup; - children = ( - 810D6BFA19F7F005005B3DB2 /* PFActivityIndicatorTableViewCell.h */, - 810D6BFB19F7F005005B3DB2 /* PFActivityIndicatorTableViewCell.m */, - 81C599431A645A9100F574E8 /* PFActivityIndicatorCollectionReusableView.h */, - 81C599441A645A9100F574E8 /* PFActivityIndicatorCollectionReusableView.m */, - ); - path = Cells; - sourceTree = ""; - }; - 810D6BFC19F7F005005B3DB2 /* Extensions */ = { - isa = PBXGroup; - children = ( - 810D6BFD19F7F005005B3DB2 /* PFUIAlertView.h */, - 810D6BFE19F7F005005B3DB2 /* PFUIAlertView.m */, - 810D6BFF19F7F005005B3DB2 /* PFColor.h */, - 810D6C0019F7F005005B3DB2 /* PFColor.m */, - 810D6C0119F7F005005B3DB2 /* PFImage.h */, - 810D6C0219F7F005005B3DB2 /* PFImage.m */, - 810D6C0319F7F005005B3DB2 /* PFRect.h */, - 810D6C0419F7F005005B3DB2 /* PFRect.m */, - ); - path = Extensions; - sourceTree = ""; - }; - 810D6C0719F7F006005B3DB2 /* Views */ = { - isa = PBXGroup; - children = ( - 810D6C0819F7F006005B3DB2 /* Buttons */, - 810D6C1119F7F006005B3DB2 /* PFLoadingView.h */, - 810D6C1219F7F006005B3DB2 /* PFLoadingView.m */, - ); - path = Views; - sourceTree = ""; - }; - 810D6C0819F7F006005B3DB2 /* Buttons */ = { - isa = PBXGroup; - children = ( - 810D6C0919F7F006005B3DB2 /* PFActionButton.h */, - 810D6C0A19F7F006005B3DB2 /* PFActionButton.m */, - 810D6C0B19F7F006005B3DB2 /* PFDismissButton.h */, - 810D6C0C19F7F006005B3DB2 /* PFDismissButton.m */, - 810D6C0D19F7F006005B3DB2 /* PFPrimaryButton.h */, - 810D6C0E19F7F006005B3DB2 /* PFPrimaryButton.m */, - 810D6C0F19F7F006005B3DB2 /* PFTextButton.h */, - 810D6C1019F7F006005B3DB2 /* PFTextButton.m */, - ); - path = Buttons; - sourceTree = ""; - }; - 810D6C2D19F7F379005B3DB2 /* ProductTableViewController */ = { - isa = PBXGroup; - children = ( - 810D6C2E19F7F379005B3DB2 /* PFProductTableViewController.h */, - 810D6C2F19F7F379005B3DB2 /* PFProductTableViewController.m */, - ); - path = ProductTableViewController; - sourceTree = ""; - }; - 811B09591A0843AD008B3393 /* Resources */ = { - isa = PBXGroup; - children = ( - 811B095A1A0843B9008B3393 /* Info.plist */, - 81B3F2691AC9EDE000A92677 /* Localization */, - ); - name = Resources; - path = ParseUI/Generated; - sourceTree = ""; - }; 8129E5DD1A9CB052006752BC /* Obj-C */ = { isa = PBXGroup; children = ( @@ -432,20 +211,6 @@ path = ParseUIDemo/Swift; sourceTree = SOURCE_ROOT; }; - 81472F611A1AB31300FD6EED /* ParseUI */ = { - isa = PBXGroup; - children = ( - 81E9CD1119F56D6B00487B0F /* ParseUI.h */, - 81E9CD1219F56D6B00487B0F /* ParseUIConstants.h */, - 81E9CCB419F56D3000487B0F /* Classes */, - 81E9CD3E19F57AC500487B0F /* Generated */, - 811B09591A0843AD008B3393 /* Resources */, - 0867D69AFE84028FC02AAC07 /* Frameworks */, - 034768DFFF38A50411DB9C8B /* Products */, - ); - name = ParseUI; - sourceTree = ""; - }; 81472F621A1AB31F00FD6EED /* ParseUIDemo */ = { isa = PBXGroup; children = ( @@ -551,24 +316,6 @@ path = ParseUIDemo/Resources; sourceTree = ""; }; - 8185BA751A64241B002815C0 /* QueryCollectionViewController */ = { - isa = PBXGroup; - children = ( - 8185BA761A64241B002815C0 /* PFQueryCollectionViewController.h */, - 8185BA771A64241B002815C0 /* PFQueryCollectionViewController.m */, - ); - path = QueryCollectionViewController; - sourceTree = ""; - }; - 81B3F2691AC9EDE000A92677 /* Localization */ = { - isa = PBXGroup; - children = ( - 81B3F26A1AC9EDE000A92677 /* ParseUI.strings */, - ); - name = Localization; - path = ParseUI/Resources/Localization; - sourceTree = SOURCE_ROOT; - }; 81C5993C1A64344800F574E8 /* QueryCollectionViewController */ = { isa = PBXGroup; children = ( @@ -589,88 +336,6 @@ path = QueryCollectionViewController; sourceTree = ""; }; - 81E9CCB419F56D3000487B0F /* Classes */ = { - isa = PBXGroup; - children = ( - 81E9CCD219F56D3000487B0F /* SignUpViewController */, - 81ED075019F68028009745F4 /* LogInViewController */, - 81ED079819F680B9009745F4 /* QueryTableViewController */, - 8185BA751A64241B002815C0 /* QueryCollectionViewController */, - 810D6C2D19F7F379005B3DB2 /* ProductTableViewController */, - 81ED075919F6809F009745F4 /* Cells */, - 81ED077919F6809F009745F4 /* Views */, - 810D6BF819F7F005005B3DB2 /* Internal */, - ); - name = Classes; - path = ParseUI/Classes; - sourceTree = ""; - }; - 81E9CCD219F56D3000487B0F /* SignUpViewController */ = { - isa = PBXGroup; - children = ( - 81E9CCD519F56D3000487B0F /* PFSignUpViewController.h */, - 81E9CCD619F56D3000487B0F /* PFSignUpViewController.m */, - 81E9CCD319F56D3000487B0F /* PFSignUpView.h */, - 81E9CCD419F56D3000487B0F /* PFSignUpView.m */, - ); - path = SignUpViewController; - sourceTree = ""; - }; - 81E9CD3E19F57AC500487B0F /* Generated */ = { - isa = PBXGroup; - children = ( - 81E9CD3F19F57AC500487B0F /* PFResources.h */, - 81E9CD4019F57AC500487B0F /* PFResources.m */, - ); - name = Generated; - path = ParseUI/Generated; - sourceTree = ""; - }; - 81ED075019F68028009745F4 /* LogInViewController */ = { - isa = PBXGroup; - children = ( - 81ED075319F68028009745F4 /* PFLogInViewController.h */, - 81ED075419F68028009745F4 /* PFLogInViewController.m */, - 81ED075119F68028009745F4 /* PFLogInView.h */, - 811EE7A21B8C17550058B3BE /* PFLogInView_Private.h */, - 81ED075219F68028009745F4 /* PFLogInView.m */, - ); - path = LogInViewController; - sourceTree = ""; - }; - 81ED075919F6809F009745F4 /* Cells */ = { - isa = PBXGroup; - children = ( - 81ED075A19F6809F009745F4 /* PFTableViewCell.h */, - 81ED075B19F6809F009745F4 /* PFTableViewCell.m */, - 810D6C3219F7F38B005B3DB2 /* PFPurchaseTableViewCell.h */, - 810D6C3319F7F38B005B3DB2 /* PFPurchaseTableViewCell.m */, - 8185BA7A1A642A8B002815C0 /* PFCollectionViewCell.h */, - 8185BA7B1A642A8B002815C0 /* PFCollectionViewCell.m */, - ); - path = Cells; - sourceTree = ""; - }; - 81ED077919F6809F009745F4 /* Views */ = { - isa = PBXGroup; - children = ( - 81ED077A19F6809F009745F4 /* PFImageView.h */, - 81ED077B19F6809F009745F4 /* PFImageView.m */, - 816A5CCD1A641D1900427332 /* PFTextField.h */, - 816A5CCE1A641D1900427332 /* PFTextField.m */, - ); - path = Views; - sourceTree = ""; - }; - 81ED079819F680B9009745F4 /* QueryTableViewController */ = { - isa = PBXGroup; - children = ( - 81ED079919F680B9009745F4 /* PFQueryTableViewController.h */, - 81ED079A19F680B9009745F4 /* PFQueryTableViewController.m */, - ); - path = QueryTableViewController; - sourceTree = ""; - }; 81FC6B381A9D1ADB00104E45 /* CustomViewControllers */ = { isa = PBXGroup; children = ( @@ -735,67 +400,19 @@ path = ProductTableViewController; sourceTree = ""; }; - B9A7CC75B8E97A83D7340201 /* Pods */ = { - isa = PBXGroup; - children = ( - 2C9AC93D6C1063CD6DCC1F9A /* Pods.debug.xcconfig */, - B774A7483212431D2C034600 /* Pods.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ -/* Begin PBXHeadersBuildPhase section */ - D2AAC07A0554694100DB518D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 81E9CD1419F56D6B00487B0F /* ParseUIConstants.h in Headers */, - 8185BA7C1A642A8B002815C0 /* PFCollectionViewCell.h in Headers */, - 810D6C1F19F7F006005B3DB2 /* PFImageCache.h in Headers */, - 811EE7A31B8C17550058B3BE /* PFLogInView_Private.h in Headers */, - 81E9CD1319F56D6B00487B0F /* ParseUI.h in Headers */, - 810D6C3419F7F38B005B3DB2 /* PFPurchaseTableViewCell.h in Headers */, - 81ED079619F6809F009745F4 /* PFImageView.h in Headers */, - 81ED079B19F680B9009745F4 /* PFQueryTableViewController.h in Headers */, - 810D6C1719F7F006005B3DB2 /* PFUIAlertView.h in Headers */, - 81E9CCFF19F56D3100487B0F /* PFSignUpView.h in Headers */, - 810D6C2119F7F006005B3DB2 /* PFActionButton.h in Headers */, - 81E9CD4119F57AC500487B0F /* PFResources.h in Headers */, - 810D6C3019F7F379005B3DB2 /* PFProductTableViewController.h in Headers */, - 816A5CCF1A641D1900427332 /* PFTextField.h in Headers */, - 81ED075519F68028009745F4 /* PFLogInView.h in Headers */, - 810D6C1D19F7F006005B3DB2 /* PFRect.h in Headers */, - 810D6C2919F7F006005B3DB2 /* PFLoadingView.h in Headers */, - 81C599451A645A9100F574E8 /* PFActivityIndicatorCollectionReusableView.h in Headers */, - 810D6C1B19F7F006005B3DB2 /* PFImage.h in Headers */, - 81ED075719F68028009745F4 /* PFLogInViewController.h in Headers */, - 810D6C2519F7F006005B3DB2 /* PFPrimaryButton.h in Headers */, - 810D6C2319F7F006005B3DB2 /* PFDismissButton.h in Headers */, - 81B3F26E1AC9EE0000A92677 /* PFLocalization.h in Headers */, - 810D6C2719F7F006005B3DB2 /* PFTextButton.h in Headers */, - 81ED077C19F6809F009745F4 /* PFTableViewCell.h in Headers */, - 8185BA781A64241B002815C0 /* PFQueryCollectionViewController.h in Headers */, - 810D6C1519F7F006005B3DB2 /* PFActivityIndicatorTableViewCell.h in Headers */, - 810D6C1919F7F006005B3DB2 /* PFColor.h in Headers */, - 81E9CD0119F56D3100487B0F /* PFSignUpViewController.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - /* Begin PBXNativeTarget section */ 8129E5DE1A9CB067006752BC /* ParseUIDemo-Swift */ = { isa = PBXNativeTarget; buildConfigurationList = 8129E5FD1A9CB067006752BC /* Build configuration list for PBXNativeTarget "ParseUIDemo-Swift" */; buildPhases = ( - 8129E5DF1A9CB067006752BC /* Check Pods Manifest.lock */, + 14C1838C6EF1AEC5161015C4 /* Check Pods Manifest.lock */, 8129E5E01A9CB067006752BC /* Sources */, 8129E5F11A9CB067006752BC /* Frameworks */, 8129E5F41A9CB067006752BC /* Resources */, - 8129E5FC1A9CB067006752BC /* Copy Pods Resources */, - E358E33E21528193A8AA2A22 /* Embed Pods Frameworks */, + 1909B29935849BBB561D082F /* Embed Pods Frameworks */, + 089B112A89F5DA6189057DFB /* Copy Pods Resources */, ); buildRules = ( ); @@ -810,12 +427,12 @@ isa = PBXNativeTarget; buildConfigurationList = 81472F871A1AB33800FD6EED /* Build configuration list for PBXNativeTarget "ParseUIDemo" */; buildPhases = ( - 187FEA82704A6CD996AB6F31 /* Check Pods Manifest.lock */, + 8E4BF9D3844D49A5ED985E2B /* Check Pods Manifest.lock */, 81472F631A1AB33800FD6EED /* Sources */, 81472F641A1AB33800FD6EED /* Frameworks */, 81472F651A1AB33800FD6EED /* Resources */, - E28DED44BCA92CE98F9AFD72 /* Copy Pods Resources */, - F5BCDB8F4C83BC6849F9F586 /* Embed Pods Frameworks */, + CC766631A47FC46D977E3D35 /* Embed Pods Frameworks */, + 35D6DE00035D0D5461A7B833 /* Copy Pods Resources */, ); buildRules = ( ); @@ -826,28 +443,6 @@ productReference = 81472F671A1AB33800FD6EED /* ParseUIDemo.app */; productType = "com.apple.product-type.application"; }; - D2AAC07D0554694100DB518D /* ParseUI */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseUI" */; - buildPhases = ( - B5E02076377DC0D54803CF5C /* Check Pods Manifest.lock */, - 81B3F2561AC9E70F00A92677 /* Generate Localizable Strings */, - 81E9CD3D19F5781700487B0F /* Convert Images to Code */, - D2AAC07A0554694100DB518D /* Headers */, - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - 81B3F25B1AC9E85D00A92677 /* Resources */, - 7ED0401C9755252386DF99CC /* Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ParseUI; - productName = Breakpad; - productReference = D2AAC07E0554694100DB518D /* ParseUI.framework */; - productType = "com.apple.product-type.framework"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -888,11 +483,10 @@ Base, ); mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; + productRefGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; projectDirPath = ""; projectRoot = ""; targets = ( - D2AAC07D0554694100DB518D /* ParseUI */, 81472F661A1AB33800FD6EED /* ParseUIDemo */, 8129E5DE1A9CB067006752BC /* ParseUIDemo-Swift */, ); @@ -929,33 +523,10 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 81B3F25B1AC9E85D00A92677 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81B3F26C1AC9EDE000A92677 /* ParseUI.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 187FEA82704A6CD996AB6F31 /* Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - 7ED0401C9755252386DF99CC /* Copy Pods Resources */ = { + 089B112A89F5DA6189057DFB /* Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -967,10 +538,10 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 8129E5DF1A9CB067006752BC /* Check Pods Manifest.lock */ = { + 14C1838C6EF1AEC5161015C4 /* Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -985,65 +556,22 @@ shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; - 8129E5FC1A9CB067006752BC /* Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 81B3F2561AC9E70F00A92677 /* Generate Localizable Strings */ = { + 1909B29935849BBB561D082F /* Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Generate Localizable Strings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "// Extract all strings\nfind $PROJECT_DIR/ParseUI/Classes -name '*.m' -print0 | xargs -0 genstrings -q -o $PROJECT_DIR/ParseUI/Resources/Localization/en.lproj\nmv $PROJECT_DIR/ParseUI/Resources/Localization/en.lproj/Localizable.strings $PROJECT_DIR/ParseUI/Resources/Localization/en.lproj/ParseUI.strings"; - }; - 81E9CD3D19F5781700487B0F /* Convert Images to Code */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Convert Images to Code"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "ruby $SRCROOT/ParseUI/Scripts/convert_images.rb \\\n $SRCROOT/ParseUI/Resources/Images/ \\\n $SRCROOT/ParseUI/Generated/PFResources"; - }; - B5E02076377DC0D54803CF5C /* Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Check Pods Manifest.lock"; + name = "Embed Pods Frameworks"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - E28DED44BCA92CE98F9AFD72 /* Copy Pods Resources */ = { + 35D6DE00035D0D5461A7B833 /* Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1055,25 +583,25 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo-resources.sh\"\n"; showEnvVarsInLog = 0; }; - E358E33E21528193A8AA2A22 /* Embed Pods Frameworks */ = { + 8E4BF9D3844D49A5ED985E2B /* Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Embed Pods Frameworks"; + name = "Check Pods Manifest.lock"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; - F5BCDB8F4C83BC6849F9F586 /* Embed Pods Frameworks */ = { + CC766631A47FC46D977E3D35 /* Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1085,7 +613,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -1140,91 +668,9 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81ED075819F68028009745F4 /* PFLogInViewController.m in Sources */, - 8185BA791A64241B002815C0 /* PFQueryCollectionViewController.m in Sources */, - 810D6C1C19F7F006005B3DB2 /* PFImage.m in Sources */, - 810D6C1819F7F006005B3DB2 /* PFUIAlertView.m in Sources */, - 81E9CD0219F56D3100487B0F /* PFSignUpViewController.m in Sources */, - 81ED075619F68028009745F4 /* PFLogInView.m in Sources */, - 810D6C2619F7F006005B3DB2 /* PFPrimaryButton.m in Sources */, - 816A5CD01A641D1900427332 /* PFTextField.m in Sources */, - 810D6C3519F7F38B005B3DB2 /* PFPurchaseTableViewCell.m in Sources */, - 81ED079C19F680B9009745F4 /* PFQueryTableViewController.m in Sources */, - 81C599461A645A9100F574E8 /* PFActivityIndicatorCollectionReusableView.m in Sources */, - 81E9CD4219F57AC500487B0F /* PFResources.m in Sources */, - 81ED077D19F6809F009745F4 /* PFTableViewCell.m in Sources */, - 810D6C2219F7F006005B3DB2 /* PFActionButton.m in Sources */, - 810D6C2819F7F006005B3DB2 /* PFTextButton.m in Sources */, - 8185BA7D1A642A8B002815C0 /* PFCollectionViewCell.m in Sources */, - 810D6C1619F7F006005B3DB2 /* PFActivityIndicatorTableViewCell.m in Sources */, - 810D6C2419F7F006005B3DB2 /* PFDismissButton.m in Sources */, - 810D6C1E19F7F006005B3DB2 /* PFRect.m in Sources */, - 81E9CD0019F56D3100487B0F /* PFSignUpView.m in Sources */, - 810D6C1A19F7F006005B3DB2 /* PFColor.m in Sources */, - 810D6C3119F7F379005B3DB2 /* PFProductTableViewController.m in Sources */, - 810D6C2019F7F006005B3DB2 /* PFImageCache.m in Sources */, - 81ED079719F6809F009745F4 /* PFImageView.m in Sources */, - 810D6C2A19F7F006005B3DB2 /* PFLoadingView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXVariantGroup section */ - 81B3F26A1AC9EDE000A92677 /* ParseUI.strings */ = { - isa = PBXVariantGroup; - children = ( - 81B3F26B1AC9EDE000A92677 /* en */, - ); - name = ParseUI.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2C9AC93D6C1063CD6DCC1F9A /* Pods.debug.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - CODE_SIGNING_REQUIRED = NO; - DEFINES_MODULE = YES; - GCC_OPTIMIZATION_LEVEL = 0; - INFOPLIST_FILE = "$(SRCROOT)/ParseUI/Resources/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - MACH_O_TYPE = staticlib; - "OTHER_CFLAGS[sdk=iphoneos9.0]" = ( - "$(inherited)", - "-fembed-bitcode", - ); - PRODUCT_NAME = ParseUI; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B774A7483212431D2C034600 /* Pods.release.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_ARC = YES; - CODE_SIGNING_REQUIRED = NO; - DEFINES_MODULE = YES; - INFOPLIST_FILE = "$(SRCROOT)/ParseUI/Resources/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - MACH_O_TYPE = staticlib; - "OTHER_CFLAGS[sdk=iphoneos9.0]" = ( - "$(inherited)", - "-fembed-bitcode", - ); - PRODUCT_NAME = ParseUI; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; 1DEB922308733DC00010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1264,7 +710,7 @@ }; 8129E5FE1A9CB067006752BC /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2C9AC93D6C1063CD6DCC1F9A /* Pods.debug.xcconfig */; + baseConfigurationReference = 3583C464D666C3687E5AAD0E /* Pods-ParseUIDemo-Swift.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; @@ -1304,7 +750,7 @@ }; 8129E5FF1A9CB067006752BC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B774A7483212431D2C034600 /* Pods.release.xcconfig */; + baseConfigurationReference = B01F654B200E4F6A9AAF2E14 /* Pods-ParseUIDemo-Swift.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; @@ -1338,7 +784,7 @@ }; 81472F881A1AB33800FD6EED /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2C9AC93D6C1063CD6DCC1F9A /* Pods.debug.xcconfig */; + baseConfigurationReference = 71B8D6C92C9693FC9DA8F19B /* Pods-ParseUIDemo.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; @@ -1376,7 +822,7 @@ }; 81472F891A1AB33800FD6EED /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B774A7483212431D2C034600 /* Pods.release.xcconfig */; + baseConfigurationReference = 323E48C3F5A6E337CF362B8F /* Pods-ParseUIDemo.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; @@ -1410,15 +856,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "ParseUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseUI" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme b/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme deleted file mode 100644 index 68ebf4f..0000000 --- a/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme b/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme index 0fc7a3b..2d83b0b 100644 --- a/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme +++ b/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -38,15 +38,18 @@ ReferencedContainer = "container:ParseUI.xcodeproj"> + + @@ -62,10 +65,10 @@ diff --git a/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme b/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme index f84b96b..ee27b8b 100644 --- a/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme +++ b/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -38,15 +38,18 @@ ReferencedContainer = "container:ParseUI.xcodeproj"> + + @@ -62,10 +65,10 @@ diff --git a/Podfile b/Podfile index aca5beb..dfe7172 100644 --- a/Podfile +++ b/Podfile @@ -1,11 +1,19 @@ source 'https://github.com/CocoaPods/Specs.git' - use_frameworks! -workspace 'ParseUI' -xcodeproj 'ParseUI.xcodeproj' -link_with 'ParseUIDemo', 'ParseUIDemo-Swift', 'ParseUI' platform :ios, '7.0' -pod 'Parse', '~> 1.8' -pod 'ParseFacebookUtilsV4', '~> 1.8' -pod 'ParseTwitterUtils', '~> 1.8' +workspace 'ParseUI' +# xcodeproj 'ParseUI.xcodeproj' + +target 'ParseUIDemo', :exclusive => true do + pod 'ParseFacebookUtilsV4' + pod 'ParseTwitterUtils' + pod 'ParseUI', :path => '.' +end + +target 'ParseUIDemo-Swift', :exclusive => true do + pod 'ParseFacebookUtilsV4' + pod 'ParseTwitterUtils' + pod 'ParseUI', :path => '.' +end + From 9ccede04899b673a71125c327dc2a41d6b12cc64 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Sat, 26 Sep 2015 00:01:32 -0700 Subject: [PATCH 17/63] Update ParseUIDemo project for Xcode 7. --- ParseUI.xcodeproj/project.pbxproj | 25 ++++++----- ParseUIDemo/Other/Info.plist | 70 +++++++++++++++---------------- 2 files changed, 47 insertions(+), 48 deletions(-) diff --git a/ParseUI.xcodeproj/project.pbxproj b/ParseUI.xcodeproj/project.pbxproj index a28b13b..4d16c41 100644 --- a/ParseUI.xcodeproj/project.pbxproj +++ b/ParseUI.xcodeproj/project.pbxproj @@ -62,17 +62,17 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 06A1EF631BB6799700BA55EC /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 06A1EF641BB6799700BA55EC /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 323E48C3F5A6E337CF362B8F /* Pods-ParseUIDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo.release.xcconfig"; sourceTree = ""; }; 3583C464D666C3687E5AAD0E /* Pods-ParseUIDemo-Swift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo-Swift.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift.debug.xcconfig"; sourceTree = ""; }; 71B8D6C92C9693FC9DA8F19B /* Pods-ParseUIDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo.debug.xcconfig"; sourceTree = ""; }; - 8129E6001A9CB067006752BC /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = ParseUIDemo.app; path = "/Users/nlutsenko/src/parse/ios-client/ParseUI/src/build/Debug-iphoneos/ParseUIDemo.app"; sourceTree = ""; }; 8129E6081A9CB1BE006752BC /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8129E6391A9CB320006752BC /* UIDemoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIDemoViewController.swift; sourceTree = ""; }; 812E5C001A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SimpleQueryCollectionStoryboard.storyboard; path = ../../../Resources/SimpleQueryCollectionStoryboard.storyboard; sourceTree = ""; }; 812E5C021A7A8EFB000FBDE1 /* StoryboardCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StoryboardCollectionViewController.h; sourceTree = ""; }; 812E5C031A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StoryboardCollectionViewController.m; sourceTree = ""; }; 814155B01A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SimpleQueryTableStoryboard.storyboard; path = ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard; sourceTree = SOURCE_ROOT; }; - 81472F671A1AB33800FD6EED /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = ParseUIDemo.app; path = "/Users/nlutsenko/src/parse/ios-client/ParseUI/src/build/Debug-iphoneos/ParseUIDemo.app"; sourceTree = ""; }; 81472F8D1A1AB37500FD6EED /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 81472F8E1A1AB37500FD6EED /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 81472F8F1A1AB37500FD6EED /* PFUIDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFUIDemoViewController.h; sourceTree = ""; }; @@ -174,6 +174,8 @@ 81472F621A1AB31F00FD6EED /* ParseUIDemo */, 3F5307328F84566C90FBCF25 /* Frameworks */, 07A8DE7A188BFADCF65DF735 /* Pods */, + 06A1EF631BB6799700BA55EC /* ParseUIDemo.app */, + 06A1EF641BB6799700BA55EC /* ParseUIDemo.app */, ); name = Breakpad; sourceTree = ""; @@ -420,7 +422,7 @@ ); name = "ParseUIDemo-Swift"; productName = ParseUIDemo; - productReference = 8129E6001A9CB067006752BC /* ParseUIDemo.app */; + productReference = 06A1EF641BB6799700BA55EC /* ParseUIDemo.app */; productType = "com.apple.product-type.application"; }; 81472F661A1AB33800FD6EED /* ParseUIDemo */ = { @@ -440,7 +442,7 @@ ); name = ParseUIDemo; productName = ParseUIDemo; - productReference = 81472F671A1AB33800FD6EED /* ParseUIDemo.app */; + productReference = 06A1EF631BB6799700BA55EC /* ParseUIDemo.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -451,7 +453,7 @@ attributes = { CLASSPREFIX = PF; LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0620; + LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Parse Inc."; TargetAttributes = { 81472F661A1AB33800FD6EED = { @@ -674,10 +676,7 @@ 1DEB922308733DC00010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - "$(ARCHS_STANDARD)", - armv7s, - ); + ENABLE_TESTABILITY = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_SHADOW = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; @@ -693,10 +692,6 @@ 1DEB922408733DC00010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - "$(ARCHS_STANDARD)", - armv7s, - ); GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_SHADOW = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; @@ -741,6 +736,7 @@ INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = ParseUIDemo; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -775,6 +771,7 @@ INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = ParseUIDemo; SWIFT_INSTALL_OBJC_HEADER = NO; TARGETED_DEVICE_FAMILY = "1,2"; @@ -815,6 +812,7 @@ INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -847,6 +845,7 @@ INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; diff --git a/ParseUIDemo/Other/Info.plist b/ParseUIDemo/Other/Info.plist index a7b987b..28445b9 100644 --- a/ParseUIDemo/Other/Info.plist +++ b/ParseUIDemo/Other/Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile Icon.png CFBundleIdentifier - com.parse.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -35,8 +35,42 @@ 1.1.1 FacebookAppID 838719136190681 + LSApplicationQueriesSchemes + + fbapi + fb-messenger-api + fbauth2 + fbshareextension + LSRequiresIPhoneOS + NSAppTransportSecurity + + NSExceptionDomains + + akamaihd.net + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + + facebook.com + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + + fbcdn.net + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + + + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -58,39 +92,5 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - NSAppTransportSecurity - - NSExceptionDomains - - facebook.com - - NSIncludesSubdomains - - NSExceptionRequiresForwardSecrecy - - - fbcdn.net - - NSIncludesSubdomains - - NSExceptionRequiresForwardSecrecy - - - akamaihd.net - - NSIncludesSubdomains - - NSExceptionRequiresForwardSecrecy - - - - - LSApplicationQueriesSchemes - - fbapi - fb-messenger-api - fbauth2 - fbshareextension - From 66b21616d32e97f4c67a2875e224ca5da0e40328 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Mon, 28 Sep 2015 04:26:43 -0700 Subject: [PATCH 18/63] Cleanup ParseUIDemo in Swift. --- .../CustomProductTableViewController.swift | 12 +++++------- .../DeletionCollectionViewController.swift | 8 ++++---- .../SectionedCollectionViewController.swift | 4 ++-- .../DeletionTableViewController.swift | 10 +++++----- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift index d9b2d2f..30944cc 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift @@ -28,15 +28,13 @@ class CustomProductTableViewController: PFProductTableViewController { override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let product = objects?[indexPath.row] as? PFObject - if let identifier = product?["productIdentifier"] as? String { - if identifier == "Cooper" { - PFPurchase.buyProduct(identifier) { error in - if error == nil { - UIAlertView(title: "Success!", message: "Yes!", delegate: nil, cancelButtonTitle: "OK").show() - } + if let identifier = product?["productIdentifier"] as? String where identifier == "Cooper" { + PFPurchase.buyProduct(identifier) { error in + if error == nil { + UIAlertView(title: "Success!", message: "Yes!", delegate: nil, cancelButtonTitle: "OK").show() } - return } + return } super.tableView(tableView, didSelectRowAtIndexPath: indexPath) } diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift index 6f1acd0..844bbc9 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift @@ -69,10 +69,10 @@ class DeletionCollectionViewController: PFQueryCollectionViewController, UIAlert } alertDialog.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) - alertDialog.addAction(UIAlertAction(title: "Save", style: .Default) { (action) -> Void in + alertDialog.addAction(UIAlertAction(title: "Save", style: .Default) { action in if let title = titleTextField?.text { let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) - object.saveEventually().continueWithSuccessBlock { (_) -> AnyObject! in + object.saveEventually().continueWithSuccessBlock { _ -> AnyObject! in return self.loadObjects() } } @@ -127,9 +127,9 @@ class DeletionCollectionViewController: PFQueryCollectionViewController, UIAlert dictionary: [ "title": title ] ) - object.saveEventually().continueWithSuccessBlock({ (_) -> AnyObject! in + object.saveEventually().continueWithSuccessBlock { _ -> AnyObject! in return self.loadObjects() - }) + } } } } diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift index 26660f1..0c9aa71 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift @@ -138,8 +138,8 @@ extension SectionedCollectionViewController { override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { if kind == UICollectionElementKindSectionHeader, let view = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "header", forIndexPath: indexPath) as? SimpleCollectionReusableView { - view.label.text = "Priority \(sectionKeys[indexPath.section])" - return view + view.label.text = "Priority \(sectionKeys[indexPath.section])" + return view } return super.collectionView(collectionView, viewForSupplementaryElementOfKind: kind, atIndexPath: indexPath) } diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift index 694d90a..cd3990f 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift @@ -69,12 +69,12 @@ class DeletionTableViewController: PFQueryTableViewController, UIAlertViewDelega } alertDialog.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) - alertDialog.addAction(UIAlertAction(title: "Save", style: .Default) { (action) -> Void in + alertDialog.addAction(UIAlertAction(title: "Save", style: .Default) { _ in if let title = titleTextField.text { let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) - object.saveInBackground().continueWithSuccessBlock({ (_) -> AnyObject! in + object.saveInBackground().continueWithSuccessBlock { _ -> AnyObject! in return self.loadObjects() - }) + } } }) @@ -110,9 +110,9 @@ class DeletionTableViewController: PFQueryTableViewController, UIAlertViewDelega if let title = alertView.textFieldAtIndex(0)?.text { let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) - object.saveEventually().continueWithSuccessBlock({ (_) -> AnyObject! in + object.saveEventually().continueWithSuccessBlock { _ -> AnyObject! in return self.loadObjects() - }) + } } } } From 453974751392bbdea9907e54921ad00460e2e5b9 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Wed, 21 Oct 2015 00:13:05 -0700 Subject: [PATCH 19/63] Parallelize Travis-CI builds. --- .travis.yml | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 44e687d..a6af77d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,15 +2,31 @@ branches: only: - master language: objective-c +os: osx osx_image: xcode7 +env: + global: + - LC_CTYPE=en_US.UTF-8 + - LANG=en_US.UTF-8 + matrix: + - TEST_TYPE=ParseUI + - TEST_TYPE=ParseUIDemo-ObjC + - TEST_TYPE=ParseUIDemo-Swift + - TEST_TYPE=CocoaPods before_install: - gem install xcpretty --no-document -N - gem install cocoapods --no-document --pre --quiet script: - - pod install - - pod lib lint ParseUI.podspec - - pod lib lint --use-libraries ParseUI.podspec - - set -o pipefail - - xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUI' -sdk iphonesimulator build | xcpretty -c - - xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUIDemo' -sdk iphonesimulator build | xcpretty -c - - xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUIDemo-Swift' -sdk iphonesimulator build | xcpretty -c +- | + set -o pipefail + pod install + if [ "$TEST_TYPE" = ParseUI ]; then + xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUI' -sdk iphonesimulator build | xcpretty -c + elif [ "$TEST_TYPE" = ParseUIDemo-ObjC ]; then + xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUIDemo' -sdk iphonesimulator build | xcpretty -c + elif [ "$TEST_TYPE" = ParseUIDemo-Swift ]; then + xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUIDemo-Swift' -sdk iphonesimulator build | xcpretty -c + elif [ "$TEST_TYPE" = CocoaPods ]; then + pod lib lint ParseUI.podspec + pod lib lint --use-libraries ParseUI.podspec + fi \ No newline at end of file From 597ce89e6b8e8a2d13ff3798caf3e8a009e9464e Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Tue, 20 Oct 2015 23:57:13 -0700 Subject: [PATCH 20/63] Unignore Podfile.lock and update Cocoapods. --- .gitignore | 2 - ParseUI.xcodeproj/project.pbxproj | 4 +- ParseUI/Generated/PFResources.h | 13 ++++++ ParseUI/Generated/PFResources.m | 76 +++++++++++++++++++++++++++++++ Podfile.lock | 51 +++++++++++++++++++++ 5 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 ParseUI/Generated/PFResources.h create mode 100644 ParseUI/Generated/PFResources.m create mode 100644 Podfile.lock diff --git a/.gitignore b/.gitignore index fa6d2a4..e65e22a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,10 +13,8 @@ *.xcuserdatad Pods -Podfile.lock DerivedData build -PFResources.* ParseUI.xcworkspace diff --git a/ParseUI.xcodeproj/project.pbxproj b/ParseUI.xcodeproj/project.pbxproj index 4d16c41..11d20db 100644 --- a/ParseUI.xcodeproj/project.pbxproj +++ b/ParseUI.xcodeproj/project.pbxproj @@ -7,8 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - 0F487952B83BF80EF1A5C4C4 /* Pods_ParseUIDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B11BDB9C48788D891789AC4D /* Pods_ParseUIDemo.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 3082A3CE396F45707D6A7F38 /* Pods_ParseUIDemo_Swift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A00130E2D30BC9B48B6FC033 /* Pods_ParseUIDemo_Swift.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 0F487952B83BF80EF1A5C4C4 /* Pods_ParseUIDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B11BDB9C48788D891789AC4D /* Pods_ParseUIDemo.framework */; }; + 3082A3CE396F45707D6A7F38 /* Pods_ParseUIDemo_Swift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A00130E2D30BC9B48B6FC033 /* Pods_ParseUIDemo_Swift.framework */; }; 8129E5F51A9CB067006752BC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA71A1AB37500FD6EED /* Images.xcassets */; }; 8129E5F71A9CB067006752BC /* 0.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA91A1AB37500FD6EED /* 0.png */; }; 8129E5F81A9CB067006752BC /* 1.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAA1A1AB37500FD6EED /* 1.png */; }; diff --git a/ParseUI/Generated/PFResources.h b/ParseUI/Generated/PFResources.h new file mode 100644 index 0000000..c510253 --- /dev/null +++ b/ParseUI/Generated/PFResources.h @@ -0,0 +1,13 @@ +// This is an auto-generated file. +#import +@interface PFResources : NSObject ++ (NSData *)facebook_icon_png;//modified:2015-10-08 12:36:36 -0700 ++ (NSData *)facebook_icon2x_png;//modified:2015-10-08 12:36:36 -0700 ++ (NSData *)facebook_icon3x_png;//modified:2015-10-08 12:36:36 -0700 ++ (NSData *)parse_logo_png;//modified:2015-10-08 12:36:36 -0700 ++ (NSData *)parse_logo2x_png;//modified:2015-10-08 12:36:36 -0700 ++ (NSData *)parse_logo3x_png;//modified:2015-10-08 12:36:36 -0700 ++ (NSData *)twitter_icon_png;//modified:2015-10-08 12:36:36 -0700 ++ (NSData *)twitter_icon2x_png;//modified:2015-10-08 12:36:36 -0700 ++ (NSData *)twitter_icon3x_png;//modified:2015-10-08 12:36:36 -0700 +@end diff --git a/ParseUI/Generated/PFResources.m b/ParseUI/Generated/PFResources.m new file mode 100644 index 0000000..5475765 --- /dev/null +++ b/ParseUI/Generated/PFResources.m @@ -0,0 +1,76 @@ +// This is an auto-generated file. +#import "PFResources.h" +@implementation PFResources + const unsigned char facebook_icon_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x16, 0x8, 0x6, 0x0, 0x0, 0x0, 0xc4, 0xb4, 0x6c, 0x3b, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x46, 0x34, 0x42, 0x46, 0x44, 0x38, 0x36, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x46, 0x34, 0x42, 0x46, 0x44, 0x38, 0x37, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x46, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x38, 0x30, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x98, 0x50, 0xa6, 0xc2, 0x0, 0x0, 0x1, 0x78, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x62, 0xd8, 0xbc, 0x79, 0xf3, 0x9a, 0xbf, 0x7f, 0xff, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xf, 0x6a, 0xe0, 0x7f, 0xff, 0xfe, 0x7d, 0xdf, 0xb5, 0x6b, 0xd7, 0x26, 0x46, 0x20, 0xe7, 0x2f, 0x3, 0x3, 0x3, 0x13, 0x3, 0x95, 0x1, 0xc8, 0xc0, 0x3f, 0xc, 0xd4, 0x7, 0x7f, 0x59, 0xc8, 0xd1, 0xf5, 0xf9, 0xf3, 0xe7, 0xf, 0x6b, 0xd7, 0xae, 0x5d, 0x75, 0xf6, 0xec, 0xd9, 0x73, 0xbf, 0x7f, 0xff, 0xfe, 0xc9, 0xc1, 0xc1, 0xc1, 0xe5, 0xe1, 0xe1, 0xe1, 0xe, 0xc4, 0x7e, 0x70, 0x45, 0xc0, 0xa0, 0xf8, 0xf9, 0x9f, 0x4, 0x70, 0xef, 0xde, 0xbd, 0x5b, 0x3a, 0x3a, 0x3a, 0x1a, 0xe8, 0x96, 0x65, 0x65, 0x65, 0x25, 0x21, 0x29, 0xfb, 0x43, 0x72, 0xd8, 0xe6, 0xe4, 0xe4, 0x64, 0x5d, 0xb9, 0x72, 0xe5, 0x6, 0x16, 0x29, 0x46, 0x64, 0xe, 0x49, 0x41, 0xf1, 0xe8, 0xd1, 0xa3, 0x7b, 0x7b, 0xf6, 0xec, 0x39, 0x0, 0xe3, 0xeb, 0xeb, 0xeb, 0x6b, 0x45, 0x46, 0x46, 0x46, 0x70, 0x73, 0x73, 0x73, 0x18, 0x1a, 0x1a, 0x1a, 0xa1, 0x28, 0x26, 0x25, 0x28, 0x4e, 0x9e, 0x3c, 0x79, 0x18, 0x59, 0xef, 0x91, 0x23, 0x47, 0xf6, 0xe1, 0x50, 0x4a, 0x5a, 0x50, 0x30, 0x32, 0xa2, 0xf8, 0x96, 0x41, 0x0, 0x8, 0xf0, 0x25, 0x37, 0xa2, 0x1, 0x33, 0x33, 0x33, 0xba, 0xfa, 0xff, 0xb8, 0xd4, 0x12, 0xc, 0xe3, 0x97, 0x2f, 0x5f, 0x3e, 0xf, 0xb, 0xb, 0xb, 0xf9, 0xf9, 0xf3, 0xe7, 0xef, 0x2f, 0x5f, 0xbe, 0x7c, 0x46, 0x96, 0x3, 0x86, 0x6f, 0x2c, 0x17, 0x17, 0x17, 0x37, 0x88, 0x5d, 0x55, 0x55, 0x55, 0xee, 0xe7, 0xe7, 0x17, 0x4c, 0xb4, 0xc1, 0x40, 0x3, 0x7f, 0x1c, 0x3a, 0x74, 0xe8, 0x18, 0x36, 0xb9, 0xcb, 0x97, 0x2f, 0x5f, 0xc3, 0xe5, 0x1b, 0x82, 0x41, 0x1, 0x8a, 0x9, 0x62, 0x82, 0x49, 0x5e, 0x5e, 0x5e, 0x81, 0xa4, 0xa0, 0x10, 0x14, 0x14, 0x14, 0xea, 0xe8, 0xe8, 0x68, 0xfd, 0x3, 0x4, 0x4f, 0x9e, 0x3c, 0x79, 0x38, 0x63, 0xc6, 0x8c, 0x79, 0x48, 0x69, 0x3a, 0x4d, 0x42, 0x42, 0x42, 0x9a, 0x8d, 0x8d, 0x8d, 0x55, 0x51, 0x51, 0x51, 0x99, 0xec, 0xe4, 0x76, 0xed, 0xda, 0xb5, 0x73, 0xc8, 0x7a, 0xef, 0xde, 0xbd, 0x7b, 0x9d, 0x2a, 0xc9, 0xd, 0x18, 0x79, 0x5f, 0xd1, 0xf8, 0x5f, 0xa8, 0x92, 0xdc, 0x48, 0x2d, 0x36, 0x47, 0xd, 0x86, 0x1b, 0x4c, 0x74, 0x9, 0x47, 0x64, 0x92, 0x6, 0xe7, 0x17, 0xa6, 0xdd, 0xbb, 0x77, 0x6f, 0x5, 0x6a, 0xf8, 0x5, 0xad, 0xa2, 0x88, 0xc1, 0xc8, 0x16, 0x61, 0xc8, 0x3, 0xc5, 0x7e, 0x1f, 0x3c, 0x78, 0x70, 0x17, 0x40, 0x80, 0x1, 0x0, 0x86, 0x7f, 0xa9, 0xd0, 0x39, 0x35, 0xd1, 0x78, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; + + + + + (NSData *)facebook_icon_png { + return [NSData dataWithBytes:facebook_icon_png length:sizeof(facebook_icon_png)]; + } + + const unsigned char facebook_icon2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x2c, 0x8, 0x6, 0x0, 0x0, 0x0, 0x1e, 0x84, 0x5a, 0x1, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x44, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x45, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x42, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x43, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x64, 0xec, 0x39, 0x7f, 0x0, 0x0, 0x2, 0x9a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x97, 0xcf, 0x8f, 0xd2, 0x40, 0x14, 0xc7, 0x99, 0x96, 0xd2, 0xf2, 0x63, 0xbb, 0x18, 0x10, 0x83, 0x42, 0x14, 0x12, 0x4f, 0x12, 0xaf, 0x60, 0xbc, 0x60, 0xf8, 0x2f, 0x8c, 0x81, 0x4, 0x88, 0x5c, 0xbc, 0x7a, 0xf2, 0x60, 0xb8, 0xb0, 0x7f, 0x0, 0xc6, 0x13, 0x7, 0xc2, 0xdd, 0x83, 0x37, 0xc2, 0xca, 0x9, 0x3, 0x44, 0x8d, 0x82, 0x31, 0x21, 0x1c, 0x48, 0x5c, 0x12, 0x48, 0x38, 0xd8, 0x8, 0xba, 0x14, 0x97, 0xa5, 0xf8, 0x6a, 0x62, 0xb2, 0x36, 0x9d, 0x2e, 0x34, 0xed, 0xb2, 0x8d, 0x7d, 0xc9, 0x24, 0x4d, 0xdf, 0xcc, 0x9b, 0x4f, 0xa7, 0x6f, 0xde, 0x7c, 0x7, 0x5, 0x2, 0x1, 0x5f, 0xa9, 0x54, 0x7a, 0x19, 0x8f, 0xc7, 0x1f, 0xd0, 0x34, 0x4d, 0x5a, 0x2e, 0xa1, 0x2d, 0x97, 0x4b, 0xe1, 0x1d, 0x58, 0x36, 0x9b, 0xcd, 0x59, 0xaa, 0xd5, 0xea, 0xab, 0xb5, 0x41, 0xac, 0xdd, 0x6e, 0x1f, 0x22, 0x41, 0x10, 0x7e, 0x20, 0x84, 0x5c, 0x16, 0x63, 0xd8, 0x9, 0x2, 0xf0, 0x29, 0x3c, 0xb0, 0x6, 0x1, 0x5e, 0x88, 0xc0, 0xdf, 0xe1, 0x61, 0xdf, 0x20, 0xc0, 0xbc, 0x9, 0xbc, 0xd1, 0x7f, 0x5d, 0x2c, 0x66, 0xc3, 0xe1, 0xf0, 0x2b, 0xc7, 0x71, 0xdf, 0x4e, 0xc1, 0xec, 0x76, 0x3b, 0x45, 0x92, 0x24, 0xe3, 0x72, 0xb9, 0x9c, 0x2c, 0xcb, 0xee, 0x7b, 0xbd, 0xde, 0xeb, 0x4, 0x41, 0x58, 0xe5, 0x80, 0x2d, 0x22, 0xf0, 0x45, 0xed, 0xf2, 0x6e, 0xb7, 0xdb, 0xcc, 0xe5, 0x72, 0x8f, 0xc2, 0xe1, 0xf0, 0xd, 0x8a, 0xa2, 0x90, 0x94, 0xc6, 0x66, 0xb3, 0x21, 0x8f, 0xc7, 0xe3, 0x18, 0xc, 0x6, 0x9f, 0x31, 0x21, 0xe6, 0x17, 0x6, 0x5c, 0x28, 0x14, 0x9e, 0x31, 0xc, 0x43, 0x6c, 0xf2, 0x7, 0xfa, 0xfd, 0xfe, 0xa7, 0x9d, 0x2, 0xe7, 0xf3, 0xf9, 0xa7, 0x9b, 0xa6, 0x8b, 0xd5, 0x6a, 0xdd, 0x2d, 0x30, 0x14, 0xfb, 0x37, 0xdb, 0xe4, 0xf7, 0x79, 0xc0, 0x84, 0xde, 0x1b, 0xec, 0x0, 0x6c, 0x9b, 0xfe, 0xb0, 0x7, 0xc5, 0x45, 0x5c, 0x63, 0x3f, 0x48, 0x4f, 0xd8, 0xc9, 0x64, 0x72, 0x54, 0xaf, 0xd7, 0xdf, 0x2a, 0xf5, 0xf1, 0xf9, 0x7c, 0x62, 0x55, 0x70, 0x43, 0x95, 0x40, 0x7f, 0x57, 0x18, 0x72, 0x9d, 0xc6, 0xe, 0xd0, 0x33, 0x25, 0x6a, 0xb5, 0xda, 0x6b, 0xdc, 0xbc, 0x4e, 0xa7, 0x93, 0x2e, 0x97, 0xcb, 0x45, 0x28, 0x6d, 0xe3, 0xd5, 0x6a, 0x35, 0x87, 0xee, 0xfc, 0x99, 0x26, 0xe0, 0x52, 0x42, 0xd7, 0x15, 0x1e, 0x8d, 0x46, 0x43, 0x9c, 0x2f, 0x93, 0xc9, 0x3c, 0x4c, 0xa5, 0x52, 0x4f, 0xb6, 0x8d, 0xa9, 0x6b, 0xe, 0x43, 0x3e, 0x2e, 0x70, 0xbe, 0x58, 0x2c, 0x76, 0x4f, 0x4d, 0x4c, 0x5d, 0x81, 0x41, 0x5, 0x62, 0x7d, 0xa0, 0xbd, 0x6d, 0x97, 0xe, 0x58, 0xc9, 0x40, 0xd6, 0xae, 0xd, 0x5, 0xac, 0xd6, 0x74, 0x5, 0x6, 0x51, 0xc3, 0xe0, 0x7c, 0xe, 0x87, 0xc3, 0xae, 0x2a, 0xcd, 0xb4, 0x50, 0x6b, 0xe3, 0xf1, 0xf8, 0xe8, 0x39, 0x98, 0x34, 0x36, 0x9c, 0x58, 0x5f, 0x1a, 0x8d, 0xc6, 0x7, 0xb9, 0x31, 0x89, 0x44, 0xe2, 0x7e, 0x28, 0x14, 0xba, 0x2d, 0x56, 0xd6, 0xb3, 0xef, 0xe1, 0x8e, 0x79, 0xd, 0x42, 0x1d, 0x60, 0x16, 0x53, 0x1b, 0xb5, 0x6, 0x2a, 0xec, 0xbd, 0x56, 0x7f, 0x25, 0x1a, 0x8d, 0xde, 0x55, 0x98, 0x4a, 0x9b, 0xa3, 0x19, 0xb4, 0x2b, 0xa1, 0x54, 0x11, 0xb6, 0xb1, 0x48, 0x24, 0x72, 0xc7, 0x50, 0x9b, 0xe, 0xd2, 0xe4, 0x96, 0x9, 0x2c, 0xa3, 0x47, 0x94, 0x4, 0xd6, 0x56, 0x16, 0xc, 0x6, 0x6f, 0x2a, 0xca, 0x4f, 0x2d, 0x26, 0x81, 0xab, 0xd, 0xe5, 0xf7, 0xfb, 0xaf, 0x4a, 0xa1, 0x79, 0x9e, 0x9f, 0x4f, 0xa7, 0xd3, 0x63, 0xb9, 0x31, 0x6e, 0xb7, 0x7b, 0xf, 0x54, 0xd9, 0x3f, 0x65, 0x4f, 0xbc, 0x36, 0x9d, 0x7, 0xac, 0x49, 0x95, 0x0, 0xb5, 0x75, 0xa, 0x60, 0x9c, 0xb4, 0x15, 0x8b, 0xc5, 0x3c, 0x6e, 0xde, 0x4a, 0xa5, 0xf2, 0x42, 0xda, 0x7f, 0x36, 0x9b, 0x71, 0xa, 0x4a, 0x4d, 0x3b, 0xb5, 0x6, 0x45, 0x82, 0x84, 0xdb, 0xee, 0x15, 0xe9, 0x7b, 0xb8, 0x5, 0xef, 0xe1, 0xc6, 0x80, 0x8f, 0x95, 0x1b, 0xb3, 0xd3, 0x93, 0xe, 0x56, 0x7e, 0xa5, 0xc6, 0x67, 0x6a, 0x9, 0x13, 0xd8, 0x4, 0x36, 0x81, 0x4d, 0x60, 0x13, 0xf8, 0xff, 0x6, 0x46, 0x6, 0xe2, 0x45, 0x22, 0x30, 0x69, 0x20, 0x60, 0x92, 0x68, 0xb5, 0x5a, 0x4d, 0x3d, 0x57, 0x44, 0xa5, 0x4f, 0xd6, 0x7a, 0xbd, 0xde, 0x47, 0x22, 0x9d, 0x4e, 0x3f, 0x6, 0xe8, 0x43, 0x10, 0x4f, 0x3f, 0xff, 0x5c, 0xa3, 0xb5, 0x6d, 0x27, 0xa, 0xf3, 0xff, 0xda, 0x34, 0x8e, 0x20, 0x8, 0xc7, 0x9d, 0x4e, 0xa7, 0x99, 0x4c, 0x26, 0xd3, 0xbf, 0x5, 0x18, 0x0, 0x98, 0xef, 0x3, 0xa7, 0xc, 0x73, 0xce, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; + + + + + (NSData *)facebook_icon2x_png { + return [NSData dataWithBytes:facebook_icon2x_png length:sizeof(facebook_icon2x_png)]; + } + + const unsigned char facebook_icon3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x42, 0x8, 0x6, 0x0, 0x0, 0x0, 0xe3, 0x54, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x39, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x41, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x37, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x32, 0x42, 0x32, 0x44, 0x31, 0x37, 0x38, 0x33, 0x44, 0x43, 0x39, 0x31, 0x31, 0x45, 0x34, 0x38, 0x33, 0x35, 0x43, 0x42, 0x42, 0x36, 0x30, 0x39, 0x42, 0x42, 0x31, 0x39, 0x35, 0x32, 0x44, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x90, 0x6f, 0x2b, 0x47, 0x0, 0x0, 0x3, 0x4d, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x9c, 0xdf, 0x4b, 0x53, 0x61, 0x18, 0xc7, 0xcf, 0x39, 0x9b, 0x4e, 0xdc, 0x28, 0x6d, 0xb3, 0xd4, 0xd9, 0x36, 0x1c, 0x4a, 0x2c, 0x49, 0xa2, 0x1b, 0x17, 0x24, 0xde, 0xc8, 0x48, 0x85, 0xa3, 0x5e, 0xf4, 0x17, 0x94, 0xd2, 0xa5, 0x5e, 0x8c, 0x6, 0x42, 0x41, 0x46, 0x30, 0x6, 0x61, 0x74, 0x57, 0xd7, 0x43, 0x2f, 0x92, 0xae, 0x84, 0x89, 0x45, 0x9b, 0x3f, 0x82, 0x5, 0xf9, 0xa3, 0x99, 0x76, 0xe3, 0x61, 0x3, 0x65, 0x84, 0xc2, 0xf4, 0xa0, 0xec, 0x6c, 0x3b, 0x3b, 0x3d, 0xcb, 0x6e, 0xba, 0x48, 0x5f, 0x73, 0x9c, 0xce, 0xf6, 0x3e, 0xf, 0x1c, 0x36, 0xb6, 0x67, 0xe7, 0x3d, 0xfb, 0xec, 0xf9, 0xf1, 0x7d, 0xde, 0x3, 0x63, 0x19, 0x30, 0x97, 0xcb, 0x65, 0xb, 0x4, 0x2, 0xcf, 0xdc, 0x6e, 0xf7, 0x9d, 0x9a, 0x9a, 0x1a, 0x3, 0xbc, 0xa4, 0x30, 0xe5, 0x6d, 0xec, 0xe1, 0xe1, 0x61, 0xf6, 0xb, 0xd8, 0xd8, 0xd8, 0xd8, 0xe3, 0x48, 0x24, 0xb2, 0x5a, 0x80, 0x60, 0xdf, 0xda, 0xda, 0x8a, 0x29, 0x94, 0x5a, 0x2a, 0x95, 0xda, 0xe9, 0xea, 0xea, 0xba, 0xc9, 0x84, 0x42, 0xa1, 0xa0, 0x42, 0xb9, 0xad, 0xac, 0xac, 0x7c, 0x60, 0x45, 0x51, 0xdc, 0x36, 0x99, 0x4c, 0x8d, 0xc, 0xc5, 0x96, 0xcf, 0xe7, 0xf, 0x38, 0x80, 0xc0, 0x31, 0x94, 0x1b, 0xc7, 0x71, 0x2c, 0x47, 0x41, 0x61, 0x24, 0x31, 0x85, 0x43, 0x6, 0xbf, 0xa3, 0x2, 0x11, 0x20, 0x88, 0xb2, 0x2, 0x91, 0x83, 0xee, 0x97, 0x85, 0x47, 0xf9, 0xbc, 0x27, 0xd2, 0x97, 0xd0, 0x97, 0xce, 0x80, 0x10, 0x5c, 0x9c, 0x9f, 0x9f, 0xff, 0xb8, 0xbc, 0xbc, 0xbc, 0x9a, 0x48, 0x24, 0xb6, 0x41, 0x1d, 0x8a, 0x70, 0xe4, 0xcd, 0x66, 0xb3, 0xe, 0xde, 0xaf, 0x80, 0xc3, 0x0, 0xcf, 0x8d, 0xd5, 0xd5, 0xd5, 0x17, 0xea, 0xea, 0xea, 0xcc, 0x9d, 0x9d, 0x9d, 0xb7, 0x7, 0x6, 0x6, 0x1e, 0x90, 0x95, 0x4b, 0x45, 0xd9, 0xd1, 0xb8, 0xde, 0x91, 0x82, 0xc1, 0xe0, 0xcb, 0x8e, 0x8e, 0xe, 0xd7, 0x59, 0xc9, 0xf5, 0xf5, 0xf5, 0xb9, 0x9, 0xd7, 0xd8, 0xd7, 0x74, 0x44, 0x8, 0x82, 0xf0, 0x75, 0x68, 0x68, 0xe8, 0xfe, 0xdc, 0xdc, 0x5c, 0xf4, 0x5f, 0x3e, 0xf, 0x91, 0x61, 0x2c, 0xf9, 0xd4, 0x88, 0xc5, 0x62, 0x8b, 0xf0, 0x8b, 0xf2, 0xf1, 0x78, 0x7c, 0x8f, 0xda, 0x62, 0x99, 0x4c, 0x26, 0x5, 0x9e, 0xe7, 0x7, 0xd5, 0x82, 0xa0, 0x59, 0x10, 0xa3, 0xa3, 0xa3, 0xf, 0x61, 0x22, 0xfe, 0x41, 0x75, 0xfb, 0x8c, 0x46, 0xa3, 0x33, 0x93, 0x93, 0x93, 0x21, 0xea, 0x75, 0xc4, 0xc4, 0xc4, 0xc4, 0x2b, 0xa8, 0xe2, 0x74, 0xb, 0xaa, 0x54, 0x2a, 0xb5, 0x3d, 0x3b, 0x3b, 0x1b, 0x2e, 0x9a, 0xf0, 0xc8, 0x64, 0x8e, 0x4a, 0xb2, 0x6b, 0x80, 0x60, 0xfa, 0xbc, 0xbb, 0xbb, 0x4b, 0x7c, 0xf1, 0x6d, 0x6d, 0x6d, 0xf6, 0xfe, 0xfe, 0xfe, 0xbb, 0x2d, 0x2d, 0x2d, 0x2e, 0x10, 0x50, 0x26, 0x96, 0x65, 0xff, 0x90, 0x48, 0xf5, 0xf5, 0xf5, 0xd6, 0x92, 0x4, 0xb1, 0xbe, 0xbe, 0xbe, 0x46, 0xea, 0x3b, 0x3c, 0x3c, 0x3c, 0x8, 0x69, 0xf4, 0xc6, 0x60, 0x30, 0xd4, 0x96, 0x5d, 0x6a, 0x80, 0x6c, 0x4e, 0x90, 0xf8, 0xd9, 0xed, 0x76, 0xb, 0x40, 0x78, 0x5d, 0x2c, 0x8, 0x9a, 0x3, 0x1, 0x73, 0xc3, 0x3e, 0x89, 0x1f, 0xcc, 0x10, 0x6e, 0x80, 0x70, 0xa9, 0x6c, 0x8b, 0x25, 0xe4, 0x38, 0xd1, 0x14, 0xd9, 0xdc, 0xdc, 0x6c, 0xc3, 0x31, 0xbc, 0x50, 0xd8, 0xf4, 0xfa, 0xa, 0x4, 0x71, 0x3c, 0x31, 0x2b, 0x8, 0x82, 0xa6, 0x59, 0x3, 0x41, 0x20, 0x88, 0x63, 0xab, 0xac, 0xac, 0x24, 0x2a, 0x82, 0x55, 0x55, 0x55, 0x86, 0xa2, 0x17, 0x60, 0x15, 0xf7, 0x18, 0xe2, 0xd3, 0xd3, 0xd3, 0x6f, 0x4f, 0xea, 0x9e, 0x20, 0xb1, 0x37, 0x48, 0xce, 0x15, 0x89, 0x44, 0x3e, 0x19, 0x8d, 0xc6, 0x17, 0xcc, 0x29, 0x37, 0xa7, 0x7a, 0x7a, 0x7a, 0x3c, 0xe, 0x87, 0xe3, 0x3a, 0x69, 0x5, 0x56, 0x65, 0xcf, 0x32, 0x1c, 0xe, 0xcf, 0xa8, 0x1d, 0x61, 0xb0, 0xe6, 0x3b, 0xd2, 0x3d, 0x4b, 0xd5, 0x52, 0x43, 0xa7, 0xd3, 0xa9, 0x3a, 0xd7, 0x80, 0xf2, 0x64, 0x6d, 0x36, 0x9b, 0x93, 0xfa, 0x62, 0x69, 0xb1, 0x58, 0x2e, 0xc2, 0x44, 0x7a, 0x85, 0x7a, 0x10, 0xd, 0xd, 0xd, 0x97, 0xa1, 0x8e, 0xd4, 0x52, 0xf, 0xc2, 0x6a, 0xb5, 0x36, 0x9e, 0xa5, 0x19, 0x94, 0x2d, 0x8, 0xe8, 0x16, 0x76, 0x14, 0x54, 0xc7, 0x13, 0xaa, 0x3, 0x41, 0x30, 0xbf, 0x36, 0x6f, 0xb4, 0x9, 0x42, 0x96, 0xe5, 0x9c, 0x9a, 0x20, 0x9a, 0x9a, 0x9a, 0xae, 0x6a, 0x52, 0x59, 0x3a, 0x9d, 0xce, 0x6b, 0x81, 0x40, 0xe0, 0xe9, 0x49, 0xca, 0x12, 0x94, 0x67, 0x70, 0x69, 0x69, 0xe9, 0xdb, 0x69, 0xe7, 0xf2, 0x78, 0x3c, 0xee, 0xee, 0xee, 0xee, 0xde, 0xbf, 0x29, 0x4b, 0xd0, 0x2c, 0x6c, 0x6b, 0x6b, 0xeb, 0x8d, 0xb3, 0xce, 0xf6, 0x9a, 0xb9, 0x1b, 0x3e, 0x32, 0x32, 0x72, 0x8f, 0xe4, 0x9a, 0xfd, 0x7e, 0xbf, 0xb7, 0xc8, 0x4b, 0xef, 0x6b, 0xaa, 0x46, 0x48, 0x92, 0x94, 0x25, 0xf1, 0x4b, 0xa7, 0xd3, 0x12, 0x8e, 0xe1, 0xb8, 0x1f, 0x81, 0x20, 0x10, 0x4, 0x82, 0x40, 0x10, 0x8, 0x2, 0x41, 0x20, 0x8, 0x4, 0x81, 0x20, 0x10, 0x4, 0x82, 0x40, 0x10, 0x8, 0x2, 0x41, 0x20, 0x8, 0x4, 0x51, 0x7e, 0x20, 0x58, 0xc4, 0xc0, 0xb0, 0x9c, 0x24, 0x49, 0x88, 0xa1, 0x10, 0x11, 0x85, 0xbf, 0xe, 0xa0, 0x1d, 0x82, 0x20, 0x8, 0xdf, 0x39, 0xaf, 0xd7, 0xeb, 0x13, 0x45, 0x31, 0xa9, 0x95, 0x10, 0x2d, 0xb2, 0xdf, 0xa9, 0x26, 0xcb, 0xf2, 0x91, 0xcf, 0xe7, 0x7b, 0xa4, 0x5f, 0x58, 0x58, 0x58, 0xe3, 0x79, 0xbe, 0xd7, 0xef, 0xf7, 0x3f, 0x6f, 0x6f, 0x6f, 0xbf, 0x55, 0x1, 0xf6, 0x1f, 0x41, 0x64, 0x9, 0xfd, 0xa, 0xf9, 0x7c, 0x70, 0x9e, 0x85, 0x72, 0xb9, 0x9c, 0xbc, 0xb9, 0xb9, 0xb9, 0x31, 0x3e, 0x3e, 0xfe, 0x64, 0x6a, 0x6a, 0xea, 0xfd, 0x4f, 0x1, 0x6, 0x0, 0xec, 0x28, 0x31, 0x86, 0x11, 0x87, 0xbb, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; + + + + + (NSData *)facebook_icon3x_png { + return [NSData dataWithBytes:facebook_icon3x_png length:sizeof(facebook_icon3x_png)]; + } + + const unsigned char parse_logo_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0xde, 0x0, 0x0, 0x0, 0x44, 0x8, 0x6, 0x0, 0x0, 0x0, 0xee, 0x9a, 0x8b, 0x92, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x35, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x36, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x31, 0x30, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x34, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xf6, 0xc4, 0x10, 0x9d, 0x0, 0x0, 0x11, 0x8e, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x5d, 0x9, 0x98, 0x54, 0xc5, 0x11, 0xae, 0xdd, 0x9d, 0x5, 0x59, 0x90, 0x9b, 0x5, 0xb9, 0x5, 0x11, 0xf0, 0x2, 0x14, 0x54, 0x54, 0x22, 0x6e, 0x44, 0x3c, 0x50, 0xbc, 0x95, 0xc3, 0x88, 0x9, 0x41, 0x3c, 0x21, 0x1e, 0x68, 0x30, 0x11, 0x8f, 0x18, 0x3c, 0x51, 0x14, 0x13, 0x94, 0x28, 0x26, 0x9e, 0x78, 0x44, 0x12, 0x15, 0x25, 0xe0, 0x89, 0x8a, 0x28, 0x88, 0xa0, 0xe2, 0xe2, 0x2, 0x72, 0xca, 0xd, 0xcb, 0xd, 0x7b, 0xb0, 0xe9, 0xdf, 0xf7, 0xf7, 0x37, 0x9d, 0x9, 0xc8, 0xcc, 0xce, 0x3b, 0xe6, 0x3d, 0xba, 0xbe, 0xaf, 0xbe, 0xe9, 0xd9, 0x9d, 0x79, 0xd3, 0xaf, 0xbb, 0xff, 0xea, 0xaa, 0xea, 0xaa, 0x7a, 0x59, 0xfd, 0xae, 0xbd, 0xe5, 0x55, 0x11, 0x69, 0xa3, 0xb8, 0x5c, 0xfc, 0xa1, 0x2c, 0xc5, 0x6b, 0x15, 0x17, 0x2a, 0xfe, 0x54, 0xf1, 0xc7, 0x8a, 0x97, 0x8b, 0x25, 0x4b, 0x11, 0xa5, 0x8a, 0x8a, 0xa, 0xc5, 0x22, 0xf7, 0xe, 0x1f, 0x2a, 0xcd, 0x9b, 0x1c, 0xf4, 0xd3, 0xdf, 0x62, 0x8a, 0x4f, 0x52, 0xdc, 0x30, 0x80, 0xfe, 0xf4, 0x50, 0x7c, 0x9d, 0xe2, 0x95, 0x8a, 0xa7, 0x29, 0xfe, 0x87, 0xe2, 0xc9, 0x8a, 0xcb, 0xec, 0x54, 0x59, 0x8a, 0x3a, 0x1, 0x78, 0xbb, 0xd9, 0xde, 0xaa, 0x78, 0x1, 0x77, 0x24, 0xcf, 0xc0, 0xaf, 0xb8, 0x8a, 0xe2, 0x3a, 0x8a, 0x1b, 0xf0, 0xf7, 0x21, 0x2, 0x2e, 0x26, 0xcf, 0x54, 0x7c, 0xa7, 0xe2, 0x37, 0xed, 0xd4, 0x58, 0x8a, 0x3a, 0xf0, 0x34, 0xcd, 0x50, 0x7c, 0xaa, 0x4f, 0xbf, 0x59, 0x53, 0x71, 0x63, 0xc5, 0xc7, 0x2a, 0x3e, 0x9b, 0xbb, 0x5f, 0x75, 0xc5, 0x9d, 0x15, 0xbf, 0xa1, 0x78, 0x82, 0xe2, 0x6b, 0x15, 0xaf, 0xb3, 0x53, 0x64, 0x29, 0x8a, 0x94, 0x9d, 0x60, 0x7b, 0xf9, 0x41, 0x50, 0x25, 0x37, 0x28, 0xfe, 0x46, 0xf1, 0xd3, 0x8a, 0xcf, 0x53, 0xdc, 0x41, 0xf1, 0x63, 0x8a, 0x77, 0xf2, 0x33, 0x97, 0xd0, 0xfe, 0xeb, 0x64, 0xa7, 0xc8, 0x52, 0xd4, 0x81, 0x17, 0x24, 0x2d, 0x54, 0x7c, 0xbd, 0xe2, 0xe3, 0x15, 0x4f, 0xe7, 0xdf, 0xe0, 0xf0, 0x79, 0x57, 0x71, 0x81, 0x9d, 0x26, 0x4b, 0x16, 0x78, 0xde, 0xd2, 0x1c, 0xc5, 0xa7, 0x28, 0xfe, 0x2b, 0xdf, 0xc3, 0x16, 0x7c, 0x4d, 0xf1, 0x71, 0x76, 0xaa, 0x2c, 0x59, 0xe0, 0x79, 0x4b, 0xbb, 0x14, 0x5f, 0xad, 0xf8, 0x76, 0xbe, 0xaf, 0xad, 0xf8, 0x45, 0xc5, 0xcd, 0xec, 0x74, 0x59, 0xb2, 0xc0, 0xf3, 0x9e, 0xee, 0x56, 0xfc, 0x0, 0xdb, 0x7, 0x2b, 0xfe, 0x8b, 0x8f, 0x76, 0xa8, 0x25, 0x4b, 0xfb, 0x2d, 0xf0, 0x40, 0xb7, 0x88, 0xe3, 0xe5, 0x4, 0xf5, 0x52, 0x7c, 0xa5, 0x9d, 0x32, 0x4b, 0x16, 0x78, 0xde, 0x13, 0xce, 0xfd, 0xe0, 0x74, 0x59, 0xc5, 0xf7, 0xb7, 0x29, 0xce, 0xb7, 0xd3, 0x66, 0xc9, 0x2, 0xcf, 0x7b, 0x5a, 0xac, 0x78, 0x4, 0xdb, 0x4d, 0xc5, 0x89, 0x76, 0xb1, 0x64, 0xc9, 0x2, 0xcf, 0x7, 0x7a, 0x46, 0xf1, 0x6c, 0xb6, 0x2f, 0x57, 0x5c, 0xd7, 0x4e, 0x9d, 0x25, 0xb, 0x3c, 0xef, 0xa9, 0x44, 0xf1, 0xe3, 0x6c, 0xc3, 0xbb, 0xd9, 0xdb, 0x4e, 0x9d, 0x25, 0xb, 0x3c, 0x7f, 0x68, 0xa2, 0x38, 0x1, 0xd5, 0xa0, 0xf3, 0xec, 0xd4, 0x59, 0xb2, 0xc0, 0xf3, 0x87, 0xd6, 0x2b, 0x7e, 0x8f, 0x6d, 0x44, 0xb8, 0x34, 0xb0, 0xd3, 0x67, 0xc9, 0x2, 0xcf, 0x1f, 0xd2, 0xc0, 0x3, 0xe8, 0xe, 0xb7, 0xd3, 0x67, 0x29, 0xac, 0x14, 0xb, 0x59, 0x7f, 0xbf, 0x34, 0xda, 0x0, 0xde, 0x7, 0x2e, 0x5f, 0x1f, 0x7, 0xf4, 0x4d, 0x79, 0xed, 0x76, 0x8a, 0x9b, 0x28, 0xce, 0x13, 0xe7, 0x58, 0x3, 0xb4, 0x51, 0xf1, 0xf, 0x8a, 0xe7, 0x8b, 0x93, 0xc8, 0xbb, 0xde, 0xa7, 0xfb, 0x46, 0xbf, 0xaa, 0x89, 0x93, 0xac, 0xbc, 0xcb, 0xa5, 0x6b, 0xe6, 0x48, 0xfa, 0xc9, 0xcf, 0xb8, 0x46, 0x73, 0xc5, 0x6d, 0xc5, 0x9, 0x72, 0x40, 0xc6, 0x49, 0x9d, 0x84, 0xcf, 0x14, 0x8b, 0x73, 0x1c, 0xb4, 0x48, 0x9c, 0xb4, 0xb3, 0x25, 0x2e, 0xde, 0x83, 0x9b, 0x73, 0xde, 0x8e, 0xf7, 0x1, 0x1f, 0x42, 0xd, 0xce, 0x39, 0xfe, 0xb7, 0x59, 0x9c, 0x44, 0xed, 0x22, 0xc5, 0xf3, 0x14, 0xaf, 0x30, 0xd6, 0xc3, 0x7e, 0x3, 0xbc, 0x95, 0x5c, 0xec, 0xf5, 0x14, 0xb7, 0x76, 0x71, 0xd7, 0xef, 0x48, 0xbb, 0xb1, 0xa7, 0xe2, 0xf6, 0x1c, 0xf8, 0x7d, 0x11, 0xb2, 0xe8, 0x91, 0x41, 0xf1, 0x8a, 0x38, 0x87, 0xfc, 0x9b, 0x3d, 0xbc, 0xef, 0x2b, 0x14, 0xdf, 0x27, 0xce, 0xd1, 0xca, 0x99, 0xfc, 0xed, 0x64, 0xa9, 0x85, 0xe2, 0x13, 0x15, 0x1f, 0xa3, 0xb8, 0x15, 0xb5, 0x85, 0xfa, 0x4, 0xc1, 0xf9, 0xe2, 0x38, 0xae, 0x52, 0x5, 0xdb, 0x9, 0x8a, 0x2f, 0x54, 0xdc, 0x5d, 0x9c, 0x60, 0xf6, 0x6a, 0x49, 0x7e, 0xb7, 0x84, 0xc0, 0xfb, 0x94, 0x36, 0xfb, 0x54, 0x71, 0xf2, 0x40, 0x83, 0xa0, 0xc3, 0x14, 0x5f, 0xa4, 0xf8, 0x74, 0xc5, 0x47, 0x24, 0x39, 0xe7, 0x5b, 0x8, 0xbe, 0x77, 0x14, 0xa3, 0x72, 0xc3, 0x37, 0xfb, 0xb, 0xf0, 0x70, 0xe3, 0x1b, 0x8, 0xbc, 0xfa, 0x69, 0x5e, 0xb, 0x3, 0x8d, 0xe4, 0xdb, 0xdf, 0x8a, 0x13, 0x84, 0x9d, 0x18, 0x8e, 0xb6, 0x9b, 0xd2, 0x7a, 0x13, 0x77, 0x6, 0xec, 0x7c, 0xb5, 0xf9, 0xaa, 0xd5, 0xdd, 0xde, 0x64, 0x2c, 0xa6, 0x87, 0x14, 0x8f, 0x93, 0x78, 0x6a, 0x93, 0x9b, 0xd4, 0x8a, 0xf7, 0x8b, 0x9c, 0xc5, 0x9a, 0x49, 0x0, 0xf, 0xf3, 0x8a, 0x3c, 0xc7, 0x41, 0x8a, 0xbb, 0xf1, 0x7b, 0x89, 0x54, 0x93, 0x80, 0x29, 0x49, 0x41, 0x40, 0x61, 0xbc, 0x6e, 0x56, 0x7c, 0xf4, 0x1e, 0xfe, 0x5f, 0xc6, 0xb1, 0xda, 0xc6, 0x6b, 0x66, 0xf1, 0x77, 0x6b, 0x19, 0xc0, 0xac, 0x42, 0xa0, 0x82, 0x2f, 0xe7, 0xb8, 0x3d, 0x25, 0x4e, 0x38, 0xa0, 0x5f, 0xda, 0x43, 0x77, 0xde, 0xc3, 0xa9, 0xec, 0x8f, 0x49, 0x15, 0x9c, 0x73, 0x8, 0xd1, 0x52, 0xc5, 0xb9, 0x8a, 0xf, 0xe4, 0x3d, 0xe4, 0xb0, 0x7d, 0x1c, 0xf9, 0x36, 0x9a, 0x3e, 0xf, 0x13, 0x88, 0x91, 0x6, 0xde, 0xe, 0x4e, 0xac, 0x96, 0xbc, 0x95, 0x5, 0xdc, 0x60, 0x71, 0x12, 0x6d, 0x5b, 0x24, 0x0, 0xed, 0x3b, 0xc5, 0x1f, 0x2a, 0xfe, 0x84, 0xd2, 0x6c, 0xd, 0x25, 0x72, 0x39, 0x17, 0x4f, 0x4d, 0xaa, 0x56, 0x5d, 0xc4, 0x49, 0xde, 0xfd, 0x5, 0xff, 0x8e, 0xeb, 0x3c, 0xca, 0x9d, 0x69, 0x60, 0x82, 0x4a, 0xec, 0x6, 0x95, 0x1b, 0xb, 0x63, 0x5f, 0x6a, 0xe, 0x42, 0xeb, 0xee, 0x92, 0x3d, 0xe7, 0x32, 0x6e, 0xa5, 0xd6, 0xa0, 0xf3, 0x21, 0x93, 0x15, 0x12, 0x87, 0x2a, 0x1e, 0x2b, 0x4e, 0xe6, 0x88, 0x79, 0xad, 0x4f, 0xa9, 0xee, 0xcf, 0xe6, 0x6e, 0xac, 0x81, 0x57, 0x4a, 0xe0, 0xe5, 0x71, 0xb1, 0xe6, 0x73, 0x87, 0x41, 0xa2, 0xf3, 0x49, 0x6c, 0xc7, 0x38, 0x6e, 0xe8, 0x2b, 0x42, 0x1, 0x6f, 0x55, 0xfc, 0x9c, 0x87, 0x6b, 0x7, 0xf7, 0x70, 0xbf, 0xfc, 0xff, 0x51, 0xd4, 0x7c, 0x2, 0x8, 0x73, 0xfe, 0xad, 0x31, 0xe7, 0xa5, 0xec, 0x63, 0xd, 0xa, 0x7a, 0x7c, 0xbf, 0xab, 0x38, 0x69, 0x6a, 0x1d, 0xf8, 0xbf, 0xd3, 0xc8, 0x28, 0x59, 0x82, 0xf0, 0xc6, 0x39, 0x51, 0x5, 0x5e, 0x2e, 0x59, 0x24, 0xf5, 0x80, 0x69, 0x48, 0xec, 0x3e, 0xe2, 0x94, 0x96, 0x30, 0xd5, 0xd4, 0xd5, 0x8a, 0x5f, 0xe6, 0xa4, 0x7f, 0x29, 0x7b, 0xaf, 0xf9, 0xb2, 0x83, 0xb, 0x16, 0xb, 0xec, 0x23, 0xee, 0x70, 0x87, 0x28, 0xbe, 0x8a, 0xbb, 0xe6, 0x81, 0x5c, 0xec, 0xd3, 0x8, 0xbe, 0x17, 0x7d, 0x1e, 0x9b, 0x7c, 0x4a, 0xdf, 0xbe, 0x9, 0x7f, 0x2f, 0xa2, 0x2a, 0x3c, 0x85, 0x6a, 0xd2, 0xaa, 0x14, 0xd5, 0xcb, 0xd3, 0x39, 0x36, 0xf5, 0xf8, 0x7e, 0xa9, 0xe2, 0x31, 0x8a, 0x5f, 0x52, 0xbc, 0x6c, 0x1f, 0xdf, 0xdd, 0x2e, 0x4e, 0x15, 0x1, 0xd8, 0xc5, 0xa8, 0x70, 0x30, 0x9e, 0x2, 0xf3, 0x8, 0xf6, 0x73, 0x0, 0xfb, 0xd, 0x5b, 0xfa, 0x59, 0xaa, 0xb0, 0x43, 0xb8, 0xe8, 0xdd, 0xa4, 0x6b, 0x14, 0x8f, 0xe4, 0x1c, 0x9, 0x6d, 0xcc, 0x7f, 0x29, 0x7e, 0x42, 0x9c, 0x62, 0x5b, 0x25, 0xfb, 0xd0, 0xb2, 0x56, 0x52, 0x50, 0xfd, 0x93, 0xeb, 0xa8, 0x13, 0x85, 0x6c, 0x7f, 0xee, 0x86, 0x3d, 0xb9, 0x93, 0xde, 0x45, 0x93, 0xa0, 0x3c, 0x99, 0xc5, 0x18, 0x26, 0xca, 0xe3, 0xae, 0x23, 0x29, 0xda, 0x6, 0x47, 0x71, 0xe1, 0x3d, 0x67, 0x80, 0xe, 0x8b, 0x61, 0x28, 0xa5, 0x2f, 0xe2, 0x41, 0x3f, 0x97, 0xd4, 0xb, 0x2d, 0xc1, 0x4e, 0xba, 0x91, 0x92, 0x7c, 0xaa, 0xd1, 0x47, 0x2c, 0xa2, 0x5f, 0xf9, 0x38, 0x2e, 0x28, 0xa1, 0x31, 0x3d, 0x1, 0x74, 0xef, 0x2b, 0x3e, 0x47, 0xf1, 0x91, 0xec, 0xe3, 0x3b, 0x4, 0x4d, 0x2a, 0xa0, 0xc3, 0xae, 0xfe, 0xba, 0x1, 0xba, 0xd1, 0x1c, 0xcb, 0x7, 0x92, 0x0, 0xdd, 0xcf, 0xed, 0xde, 0x73, 0xb8, 0x43, 0x1c, 0xce, 0x5d, 0x48, 0xef, 0xbc, 0x57, 0x11, 0x9c, 0x6e, 0xd1, 0x1, 0xbc, 0xde, 0x18, 0x3, 0x74, 0x93, 0x38, 0x5e, 0x97, 0x70, 0xa7, 0x4b, 0xd5, 0xc6, 0x85, 0x66, 0x34, 0x8b, 0x1a, 0x13, 0xc6, 0xe2, 0x6f, 0xbc, 0xa7, 0xaa, 0x8a, 0xef, 0x21, 0xa0, 0xeb, 0x45, 0xd, 0x78, 0xb5, 0xc, 0xdb, 0x6e, 0x65, 0x92, 0xdf, 0x19, 0x46, 0x69, 0x5b, 0x60, 0x78, 0x26, 0x87, 0x53, 0x5d, 0x18, 0xcd, 0x5d, 0x2c, 0x5d, 0xfa, 0x9e, 0x52, 0xef, 0x21, 0x43, 0xd, 0x1e, 0xc7, 0x85, 0xeb, 0x35, 0x9d, 0x45, 0xd0, 0xb7, 0xe2, 0xfb, 0xc5, 0x74, 0x1a, 0x14, 0x70, 0xa7, 0xab, 0xac, 0x7, 0xb1, 0xa5, 0x38, 0xa1, 0x7a, 0x7, 0x70, 0x61, 0x5d, 0x41, 0x41, 0xb5, 0xc9, 0xc5, 0xbe, 0xaf, 0x23, 0x0, 0x7b, 0x48, 0xbc, 0xc4, 0x63, 0x3f, 0x89, 0xe7, 0x62, 0xa6, 0x43, 0x75, 0x79, 0xff, 0x3, 0xf8, 0xbe, 0x98, 0xf7, 0x80, 0xf1, 0x9a, 0xeb, 0x52, 0xff, 0x97, 0x52, 0xdb, 0x39, 0x8d, 0x42, 0x58, 0xcf, 0x7, 0x2a, 0x27, 0x34, 0x8b, 0x12, 0xf0, 0xe, 0x31, 0xc, 0xf5, 0xc2, 0x24, 0xbf, 0x53, 0xc0, 0xc5, 0x23, 0x54, 0x8f, 0x3a, 0x50, 0xed, 0xd8, 0xe2, 0x72, 0xdf, 0x20, 0x9, 0x6f, 0x12, 0x27, 0x8f, 0x50, 0x3b, 0x12, 0x9e, 0x10, 0x6f, 0xb3, 0x29, 0xe0, 0xe1, 0x7c, 0xcd, 0x90, 0xe6, 0x13, 0xe8, 0xbd, 0x7c, 0xd5, 0x85, 0x6b, 0x63, 0x8c, 0x1a, 0x1b, 0x3b, 0xd1, 0x33, 0x1e, 0xde, 0xc7, 0xc7, 0x54, 0x69, 0x7f, 0xe4, 0xfb, 0x6b, 0xd3, 0x1c, 0xb7, 0xea, 0x1c, 0x17, 0x5d, 0xbc, 0xeb, 0x3b, 0xda, 0xe3, 0x5e, 0xdd, 0x3, 0x76, 0xce, 0xe3, 0xd, 0x27, 0x4b, 0x7, 0xee, 0xac, 0xcd, 0xa2, 0x2, 0xbc, 0x2e, 0x86, 0x93, 0x21, 0x59, 0xe0, 0x5d, 0x47, 0xd5, 0xa0, 0x2f, 0x6d, 0xbc, 0x65, 0x1e, 0xf7, 0x11, 0xd2, 0xfa, 0x79, 0xb6, 0xf, 0xa6, 0xde, 0xef, 0x5, 0x75, 0xa5, 0x1d, 0x59, 0x95, 0xef, 0x1, 0xf8, 0x4b, 0x5d, 0xda, 0xc1, 0xbb, 0xf2, 0x5a, 0xa0, 0x17, 0xb8, 0x7b, 0x7b, 0x4d, 0xdf, 0xd2, 0x16, 0x9b, 0xc4, 0xdf, 0x5e, 0x53, 0xc9, 0xeb, 0xc0, 0xf6, 0xff, 0x3b, 0x6d, 0x2e, 0xe1, 0xdc, 0x43, 0xf8, 0x7e, 0xed, 0x71, 0xff, 0xd7, 0xd3, 0x71, 0xf3, 0x2c, 0xdf, 0x1f, 0x41, 0xb5, 0xb3, 0x6e, 0x14, 0x80, 0x57, 0x60, 0xa8, 0x53, 0xf3, 0x93, 0xfc, 0x4e, 0x11, 0x8d, 0x76, 0x3f, 0x9d, 0x1d, 0x37, 0xb0, 0x8f, 0x42, 0xf5, 0xe6, 0x28, 0x17, 0xaf, 0xd, 0x9b, 0xa4, 0xe, 0x17, 0x97, 0xb6, 0x77, 0x87, 0xbb, 0xa4, 0x9e, 0x69, 0xea, 0x6f, 0x38, 0x21, 0xee, 0xf5, 0x71, 0xdc, 0x26, 0x52, 0x55, 0x7b, 0x2f, 0x8d, 0x6b, 0xdc, 0xa1, 0xf8, 0x2, 0xb6, 0xe1, 0x10, 0xe9, 0x25, 0xf1, 0x7c, 0x4e, 0xaf, 0x9, 0x73, 0xf3, 0x6b, 0xee, 0xb6, 0x42, 0x27, 0xcc, 0x38, 0xd9, 0x83, 0x23, 0x30, 0x4c, 0xc0, 0x6b, 0xc5, 0xed, 0x5c, 0xab, 0x26, 0xdb, 0x53, 0x1c, 0x10, 0x3f, 0x69, 0x4d, 0x82, 0xca, 0x39, 0xd8, 0x45, 0x75, 0x16, 0x93, 0x88, 0xa3, 0x8b, 0x36, 0xfc, 0xdb, 0xa3, 0x54, 0xb, 0xdd, 0xa2, 0xaa, 0x86, 0x8a, 0xf6, 0xae, 0xf, 0x3b, 0x85, 0x9b, 0x84, 0x7e, 0xff, 0x91, 0xed, 0xb5, 0xdc, 0x39, 0x57, 0xf9, 0xdc, 0x87, 0x32, 0xa, 0xdb, 0xcf, 0xf9, 0xfe, 0x7c, 0x9a, 0x20, 0xa1, 0x5, 0xde, 0x25, 0x86, 0x2d, 0xf3, 0x6a, 0x8, 0xfa, 0xfb, 0x3c, 0xd5, 0x27, 0x10, 0xa2, 0x62, 0xdc, 0x8, 0xea, 0xde, 0x4e, 0x67, 0x41, 0x7f, 0x3, 0x18, 0x37, 0xb9, 0xdc, 0xef, 0x36, 0x74, 0xac, 0x80, 0xa6, 0x84, 0x68, 0x7d, 0xc0, 0xae, 0x7b, 0xd0, 0xd8, 0x5d, 0xae, 0x37, 0xc6, 0xdf, 0x6f, 0xda, 0x42, 0xa7, 0x4b, 0x31, 0xdf, 0x23, 0x91, 0xfb, 0xc8, 0x30, 0x2, 0xaf, 0x16, 0x6f, 0x44, 0x1b, 0xca, 0x53, 0x43, 0xd0, 0x67, 0xa8, 0x69, 0xfa, 0x40, 0xb8, 0x11, 0x8d, 0xfb, 0x74, 0xa9, 0xb6, 0x1, 0xb4, 0x62, 0xda, 0xaf, 0x6e, 0x9f, 0x79, 0x35, 0x93, 0x78, 0x44, 0x47, 0x61, 0x88, 0x80, 0x77, 0x3d, 0x9d, 0x1a, 0x42, 0x35, 0xfc, 0xa5, 0x80, 0xfb, 0x33, 0x57, 0xe2, 0x95, 0x13, 0xaa, 0x1b, 0x1a, 0x50, 0xa8, 0x80, 0x37, 0x88, 0x8e, 0xa, 0xa1, 0xce, 0xbc, 0x3d, 0x24, 0xfd, 0x7e, 0xc3, 0x0, 0x86, 0x1b, 0xe5, 0xf1, 0xab, 0x18, 0x76, 0xdd, 0x83, 0x14, 0x42, 0x6e, 0x53, 0xbe, 0xa1, 0xd6, 0xae, 0x9, 0xc9, 0x38, 0xe7, 0xd3, 0x31, 0x3, 0xc2, 0x11, 0xc5, 0x9d, 0x19, 0xd2, 0x2f, 0xd4, 0x87, 0x9d, 0x9e, 0x95, 0x95, 0x25, 0x25, 0xa5, 0x25, 0xbd, 0x67, 0xcd, 0x9d, 0xd7, 0x23, 0x4c, 0xc0, 0x83, 0xea, 0x73, 0x2b, 0xdb, 0x70, 0xa8, 0x3c, 0x1d, 0x22, 0x29, 0x5c, 0x28, 0xf1, 0x40, 0x5a, 0x37, 0xcb, 0xd1, 0xc3, 0x61, 0x34, 0xc6, 0xa3, 0x3e, 0xe7, 0x26, 0xd8, 0x94, 0x61, 0x20, 0xa8, 0xdf, 0x4d, 0xd8, 0x7e, 0x52, 0x9c, 0xe0, 0x88, 0x4c, 0x20, 0x8, 0xdd, 0x3f, 0xa1, 0x11, 0x8b, 0xc5, 0x64, 0xf2, 0x87, 0x9f, 0xdc, 0xb0, 0x79, 0xeb, 0xb6, 0x50, 0x0, 0x2f, 0xc6, 0x5, 0xa6, 0x5d, 0xb2, 0x77, 0x88, 0xbb, 0x7, 0xb8, 0x5e, 0x53, 0xb9, 0x1, 0x3c, 0x44, 0xcc, 0xd4, 0x71, 0xe9, 0xba, 0xe3, 0x3c, 0x1c, 0x87, 0x5d, 0x86, 0x50, 0xae, 0x1f, 0x82, 0x31, 0xc6, 0x19, 0xad, 0x8e, 0x12, 0x82, 0x4b, 0x7f, 0x6c, 0x86, 0xf5, 0xef, 0x6d, 0xc5, 0x1f, 0xc7, 0x72, 0x72, 0x64, 0xed, 0xfa, 0x8d, 0xa7, 0x7d, 0x53, 0x58, 0x74, 0x6c, 0x18, 0x80, 0x37, 0x4a, 0x9c, 0xa8, 0x0, 0xd0, 0xb, 0x19, 0xa0, 0xb7, 0x57, 0x86, 0xb4, 0x81, 0xf, 0xc7, 0x90, 0x1b, 0xcf, 0x21, 0x5c, 0xc7, 0xb1, 0xf0, 0x8a, 0x4c, 0x2f, 0x60, 0xdb, 0x10, 0x8c, 0x2f, 0x82, 0xae, 0x75, 0x52, 0x34, 0xdc, 0xf8, 0xcb, 0x32, 0xac, 0x7f, 0x38, 0x73, 0x46, 0x58, 0x99, 0x28, 0x95, 0x33, 0x7b, 0xea, 0xb4, 0xe9, 0x7d, 0x32, 0x1d, 0x78, 0xa3, 0x24, 0x5e, 0xca, 0xf, 0xbb, 0xc6, 0x10, 0x9, 0x27, 0xad, 0xe0, 0x2b, 0xdc, 0xf4, 0xf5, 0x5c, 0xb8, 0xde, 0x5b, 0xc6, 0x35, 0xbd, 0x20, 0x84, 0xbf, 0xe9, 0x38, 0xd8, 0x30, 0x14, 0x95, 0x3a, 0xc7, 0x68, 0x4f, 0xc8, 0xd0, 0x3e, 0x22, 0x28, 0x60, 0x75, 0x95, 0xdc, 0x5c, 0x59, 0xb8, 0x64, 0xf9, 0x99, 0xab, 0xd6, 0xac, 0xab, 0x96, 0x89, 0xc0, 0x83, 0xf3, 0x0, 0xae, 0xf8, 0xdf, 0xf1, 0x3d, 0x62, 0x32, 0x2f, 0x95, 0xf0, 0x3e, 0x2b, 0xaf, 0x38, 0xc1, 0x39, 0x92, 0x2e, 0xbd, 0xee, 0x71, 0x7f, 0x91, 0x23, 0x37, 0x83, 0x6d, 0x38, 0x3, 0x2e, 0xc8, 0xe0, 0xb1, 0xc5, 0xfa, 0x3d, 0x99, 0x6d, 0xc4, 0x4a, 0x7e, 0x96, 0xa1, 0xfd, 0xc4, 0x99, 0xe2, 0xfb, 0xd9, 0xd9, 0x59, 0xb2, 0x7d, 0xc7, 0xce, 0x43, 0x7f, 0x58, 0xbe, 0xa2, 0x63, 0xa6, 0x1, 0xf, 0x51, 0xb, 0x38, 0x78, 0xec, 0x6b, 0x2c, 0x82, 0xb3, 0x24, 0xb8, 0xf3, 0x18, 0xb7, 0x54, 0xd, 0x31, 0xd4, 0xcd, 0x74, 0x68, 0x87, 0xa4, 0x91, 0xf5, 0x9c, 0x2, 0x99, 0x8e, 0x1b, 0xa8, 0x49, 0xa7, 0x66, 0xe8, 0xd8, 0x1e, 0x4a, 0x6, 0x21, 0x9f, 0x2e, 0x93, 0xbd, 0xdd, 0x3f, 0x1d, 0x81, 0xed, 0x2e, 0x2f, 0x97, 0xa2, 0x45, 0x4b, 0x4e, 0x34, 0x81, 0x17, 0x94, 0x7, 0xb, 0x6, 0x3c, 0xe, 0xc7, 0x91, 0xc6, 0xf2, 0xa6, 0x61, 0x57, 0x20, 0xaf, 0xd, 0x67, 0x5f, 0xb3, 0x25, 0xdc, 0x94, 0xe5, 0x32, 0x88, 0xfd, 0x98, 0xa7, 0x89, 0xda, 0x2e, 0x11, 0xe7, 0xec, 0x10, 0xf3, 0x32, 0x52, 0x32, 0xcf, 0xd9, 0xd2, 0x56, 0xe2, 0x1, 0xf0, 0x9f, 0x64, 0xf8, 0x3a, 0xc0, 0x6e, 0x5c, 0x1e, 0xcb, 0x8d, 0xc9, 0xf7, 0xb, 0x17, 0x77, 0x36, 0x13, 0x61, 0x71, 0x70, 0x8a, 0x4c, 0xe0, 0x1c, 0xf1, 0xfe, 0x39, 0xe8, 0x31, 0xfe, 0x1e, 0xe, 0x3c, 0x3b, 0x25, 0x4c, 0x28, 0xec, 0x8b, 0xfb, 0xc9, 0x41, 0x14, 0xc5, 0xc1, 0xfd, 0xd7, 0xa2, 0xca, 0x8b, 0x7e, 0x9a, 0x45, 0x86, 0xf0, 0xa, 0x7f, 0x30, 0x22, 0x13, 0x76, 0x46, 0x0, 0xc8, 0x3f, 0x47, 0xd7, 0xf1, 0xde, 0xfb, 0xd1, 0x3e, 0xc5, 0x91, 0xe, 0x12, 0x7c, 0x91, 0x34, 0x8c, 0xb8, 0xd7, 0x2f, 0x24, 0xf8, 0xa2, 0x45, 0x87, 0x19, 0xed, 0x4c, 0xf, 0x6d, 0x5b, 0xac, 0x78, 0x69, 0x4e, 0x76, 0xf6, 0xc1, 0xc5, 0x9b, 0xb7, 0xb4, 0x8f, 0x25, 0x48, 0x8f, 0x20, 0x5d, 0xb1, 0xc8, 0x93, 0x7b, 0x89, 0x4e, 0x95, 0x5, 0x3e, 0xfe, 0x2e, 0x4a, 0x39, 0x20, 0x6, 0x14, 0xe9, 0x34, 0x8, 0xeb, 0x69, 0x41, 0x29, 0xaf, 0x81, 0x57, 0x95, 0xbb, 0x4c, 0x49, 0x2, 0xf0, 0x60, 0xbb, 0x21, 0x87, 0xc, 0x67, 0x46, 0x85, 0x64, 0x9c, 0xaf, 0xad, 0x12, 0x17, 0xaa, 0x50, 0x65, 0x0, 0x41, 0xb0, 0xf4, 0xa7, 0x26, 0x82, 0xb3, 0xa8, 0x46, 0x14, 0x90, 0x57, 0x93, 0x8b, 0xf8, 0xbf, 0xa9, 0x4, 0xe1, 0xd2, 0x0, 0xb4, 0xa6, 0xa6, 0x7c, 0x45, 0x8d, 0x94, 0x65, 0x19, 0x3e, 0x9e, 0x58, 0x37, 0x4b, 0xb3, 0x15, 0xf0, 0x36, 0x14, 0x6f, 0x6a, 0x10, 0x54, 0xe9, 0x87, 0x32, 0xe, 0x16, 0xca, 0x2e, 0x7c, 0x25, 0x4e, 0x1e, 0xd3, 0x64, 0xbe, 0xf7, 0x83, 0xb0, 0x88, 0x2e, 0xa4, 0xe3, 0x0, 0xe7, 0x2a, 0x79, 0x49, 0xec, 0x82, 0x3a, 0xf, 0x10, 0x35, 0x38, 0xf4, 0xb1, 0x40, 0xe7, 0x84, 0xcf, 0x6d, 0xe2, 0x82, 0x9c, 0xce, 0x45, 0xf9, 0x1f, 0x9, 0xcf, 0x21, 0xf4, 0xde, 0xe8, 0x29, 0xaa, 0x9e, 0x38, 0x2b, 0x1b, 0x40, 0xe1, 0x84, 0x5d, 0x57, 0x17, 0x2d, 0x1a, 0x44, 0xdb, 0xea, 0x3b, 0xaa, 0x53, 0xa8, 0xc3, 0x32, 0x93, 0x2, 0xa9, 0xd4, 0xe3, 0xbe, 0x69, 0x2f, 0xb1, 0xae, 0x3e, 0x97, 0xe9, 0x84, 0x0, 0x90, 0x93, 0x15, 0xf8, 0x6a, 0x99, 0xc0, 0x83, 0x53, 0xe3, 0xa, 0x4a, 0x79, 0x2f, 0xd5, 0x99, 0x2c, 0x4a, 0x53, 0xec, 0x18, 0xeb, 0x24, 0xf5, 0x72, 0xb, 0xe9, 0x4a, 0xc8, 0x61, 0x94, 0xe4, 0x7b, 0xaa, 0xff, 0x8, 0x75, 0x60, 0x11, 0xa5, 0xe7, 0x7a, 0xee, 0xc2, 0x15, 0x46, 0xbf, 0xb5, 0xa, 0xa, 0xc9, 0x7f, 0x10, 0xd5, 0xe5, 0x46, 0x5c, 0x0, 0xfa, 0xff, 0x9d, 0xc9, 0x50, 0xd5, 0x10, 0x72, 0xf5, 0x63, 0x4, 0x76, 0x3f, 0x8c, 0x5, 0xea, 0xb9, 0x3c, 0x46, 0xcd, 0x0, 0xa9, 0x36, 0x3d, 0x8, 0xc2, 0x3c, 0xf2, 0x31, 0xe4, 0x6b, 0xa8, 0x1d, 0x2c, 0x22, 0x0, 0x3f, 0xa2, 0x20, 0x2a, 0xf2, 0x40, 0x35, 0xad, 0xcd, 0x57, 0x8c, 0xfb, 0xef, 0x25, 0x9e, 0xbd, 0x91, 0xa9, 0x1a, 0x84, 0x3e, 0x6f, 0xcc, 0x33, 0x81, 0xa7, 0x6b, 0x6, 0x46, 0x91, 0x30, 0x19, 0x57, 0x51, 0x65, 0x32, 0x1, 0x57, 0x48, 0xc7, 0xc1, 0x14, 0xda, 0x8, 0xab, 0x53, 0xdc, 0xa1, 0x72, 0x8, 0xba, 0xe6, 0x5c, 0x84, 0xd8, 0x3d, 0x91, 0xfb, 0x87, 0xe2, 0xa8, 0x38, 0x3a, 0xc8, 0x97, 0x68, 0x3d, 0xcf, 0xf, 0x42, 0x72, 0x6, 0x79, 0x4, 0x5, 0xf, 0x92, 0x66, 0x4f, 0xa4, 0xba, 0xde, 0x8e, 0x1a, 0x41, 0x15, 0xb6, 0xdb, 0x51, 0xc8, 0xe1, 0x7b, 0xb, 0xe9, 0x0, 0x41, 0x24, 0x7, 0x2a, 0xb9, 0xad, 0x75, 0xb1, 0x5f, 0x10, 0x7e, 0xb7, 0x67, 0xfa, 0xe0, 0x55, 0x54, 0xc4, 0x2d, 0x90, 0x58, 0x0, 0x46, 0xbb, 0xdf, 0x4, 0xa9, 0x88, 0xf8, 0x4e, 0xf3, 0x41, 0x27, 0x38, 0xd0, 0x1c, 0x4d, 0x75, 0x30, 0x1d, 0x75, 0xa8, 0x9c, 0xbb, 0xda, 0x1a, 0x4a, 0x77, 0x5d, 0x45, 0xb, 0x2a, 0x18, 0x5c, 0xf0, 0xe7, 0x8a, 0x13, 0x59, 0x51, 0x35, 0x82, 0xe3, 0xa, 0x1, 0xb5, 0x84, 0xc, 0xdb, 0x1c, 0x1e, 0x72, 0xc4, 0x4b, 0x76, 0x24, 0x18, 0x1, 0xc4, 0xa3, 0x28, 0x98, 0x62, 0xf4, 0x21, 0x80, 0x91, 0x28, 0xba, 0x81, 0x63, 0xff, 0x22, 0x81, 0xb8, 0x3d, 0x8d, 0xf1, 0x17, 0xc3, 0xf9, 0x95, 0x15, 0x2, 0xe0, 0xa1, 0x8f, 0xa5, 0x31, 0x89, 0x36, 0x21, 0x7, 0xe, 0x19, 0x2, 0xc7, 0xf1, 0x3d, 0xd4, 0x9d, 0x21, 0x9c, 0x6c, 0xaf, 0xa8, 0xdc, 0x70, 0xb6, 0x8c, 0xa1, 0x5d, 0x34, 0x5e, 0xa2, 0x4f, 0xbb, 0xa9, 0xa2, 0x2f, 0x93, 0xf8, 0xe3, 0xb3, 0xeb, 0x13, 0x88, 0xa8, 0xc7, 0xd9, 0x9d, 0x6d, 0xa8, 0xa5, 0x75, 0x69, 0x5f, 0x5f, 0x40, 0x95, 0x14, 0x51, 0xfc, 0x4f, 0x48, 0xea, 0x75, 0x70, 0x36, 0xf2, 0x15, 0x26, 0x2, 0xa, 0xf8, 0xee, 0x90, 0xca, 0xd7, 0x5b, 0xf5, 0x7c, 0xa7, 0x1b, 0x3a, 0xf0, 0x32, 0x69, 0xd6, 0xb8, 0x51, 0x56, 0x69, 0x59, 0x59, 0xa4, 0x81, 0x57, 0x95, 0x12, 0x55, 0x83, 0xe, 0x35, 0x11, 0x7f, 0x23, 0xff, 0x1b, 0x49, 0xe2, 0x7, 0xad, 0x95, 0xfd, 0x97, 0x60, 0xc3, 0x4f, 0x95, 0x78, 0xfe, 0x24, 0x52, 0xbb, 0x7a, 0x12, 0x70, 0xdd, 0x38, 0x47, 0xa8, 0x2c, 0x80, 0x72, 0x81, 0x57, 0x52, 0x28, 0x4e, 0xaa, 0xc4, 0xd8, 0xd6, 0xe2, 0x2e, 0xba, 0x3a, 0x53, 0x7, 0x2, 0xd8, 0x6b, 0x94, 0x5f, 0x5f, 0xe, 0x6a, 0xe8, 0xe4, 0x43, 0x67, 0x47, 0x78, 0xd2, 0x61, 0x83, 0xfc, 0x92, 0x6d, 0xa8, 0x42, 0x17, 0x5, 0x0, 0xba, 0x28, 0xab, 0xf0, 0x95, 0x21, 0x78, 0x3a, 0xc7, 0xd2, 0x31, 0x83, 0x33, 0xdc, 0x51, 0xc6, 0x9c, 0xa0, 0x82, 0x1c, 0xe2, 0x50, 0xff, 0x90, 0xe2, 0xf5, 0xf4, 0xce, 0xda, 0x38, 0x4c, 0x3, 0x11, 0x55, 0xe0, 0xc1, 0xb6, 0x18, 0xca, 0x36, 0xce, 0x98, 0x6, 0x4a, 0xf8, 0xdd, 0xfa, 0x51, 0x23, 0xb8, 0xd6, 0x6f, 0xe4, 0x5c, 0x99, 0xa5, 0xdb, 0x91, 0xa9, 0x3d, 0x2c, 0xc9, 0x6b, 0x98, 0x89, 0xc0, 0x9d, 0x2c, 0xf0, 0x82, 0x27, 0xd4, 0x65, 0xc4, 0xb9, 0x5b, 0x5, 0x27, 0x71, 0x9b, 0x5d, 0xe7, 0x19, 0x4b, 0xb0, 0x9, 0x2f, 0x93, 0x78, 0x26, 0x8a, 0x6, 0xdf, 0xb1, 0x49, 0x7c, 0xb7, 0xd0, 0xd8, 0x31, 0x4f, 0xb2, 0xc0, 0xb, 0x96, 0x60, 0xb8, 0x9f, 0xc5, 0x36, 0xe, 0xe5, 0x3f, 0xb0, 0x6b, 0x3b, 0x14, 0x4, 0x47, 0x94, 0xae, 0x34, 0x80, 0xe3, 0x88, 0x5b, 0x92, 0x4, 0xed, 0x3c, 0x3, 0x78, 0x79, 0x16, 0x78, 0xc1, 0xaa, 0x99, 0x5a, 0xdf, 0x9f, 0x68, 0xd7, 0x73, 0xa8, 0x8, 0x25, 0xf0, 0x75, 0x59, 0x3c, 0xd8, 0x81, 0x2d, 0x93, 0xf8, 0xce, 0xbb, 0x7c, 0xc5, 0x11, 0x4e, 0x57, 0xb, 0xbc, 0xe0, 0xc8, 0xcc, 0x9a, 0x9e, 0x69, 0xd7, 0x72, 0xa8, 0x8, 0x7, 0xed, 0xcf, 0xb0, 0x8d, 0x14, 0xaa, 0x2e, 0x49, 0x7c, 0xe7, 0xd, 0x89, 0x47, 0x17, 0xf5, 0xb1, 0xc0, 0xb, 0x8e, 0x74, 0x1c, 0x25, 0xb2, 0x1c, 0x36, 0xda, 0xb5, 0x1c, 0x3a, 0x9a, 0x61, 0x0, 0xa9, 0x55, 0x12, 0x9f, 0x87, 0xf3, 0x4c, 0xa7, 0x4, 0x21, 0x48, 0xa2, 0xb9, 0x5, 0x5e, 0x30, 0x94, 0x69, 0xee, 0xfb, 0xa, 0x8b, 0xa5, 0x94, 0x68, 0xa5, 0x21, 0x30, 0x93, 0xb5, 0xd9, 0xc6, 0x1b, 0xf6, 0xfd, 0x95, 0x16, 0x78, 0xc1, 0x90, 0x2e, 0x11, 0x51, 0x4d, 0xd2, 0xcf, 0xf8, 0x76, 0x83, 0x1a, 0x5b, 0x2c, 0xa5, 0x44, 0x8, 0xe1, 0x2b, 0x4f, 0xf1, 0x3b, 0xc8, 0x11, 0xd4, 0x4e, 0x16, 0xc4, 0xe4, 0xb6, 0xb6, 0xc0, 0xf3, 0x9f, 0x16, 0xf3, 0x35, 0x27, 0x49, 0x55, 0xc5, 0x6b, 0xea, 0x65, 0xb1, 0x94, 0x12, 0x21, 0xb6, 0xb6, 0xba, 0x61, 0x2e, 0x24, 0x43, 0xf8, 0xdc, 0x68, 0xb6, 0x11, 0x4, 0x7f, 0x77, 0x86, 0xdc, 0x4b, 0x4d, 0x89, 0x3f, 0xc5, 0xa9, 0x6e, 0xd4, 0x81, 0x87, 0x43, 0xd5, 0x1d, 0x6c, 0x17, 0x4, 0xdc, 0x97, 0x6e, 0x16, 0x78, 0x29, 0x53, 0x2b, 0x43, 0xc5, 0x4c, 0x25, 0x21, 0x7a, 0xbc, 0x61, 0xeb, 0xc1, 0xc9, 0xd2, 0x2f, 0x3, 0xee, 0x5, 0xd1, 0x52, 0x88, 0xc4, 0x41, 0xe8, 0xe2, 0xc5, 0x51, 0x7, 0x1e, 0x82, 0x6e, 0x75, 0x9d, 0x96, 0x33, 0x2, 0x54, 0x37, 0x21, 0xb5, 0x1f, 0x92, 0x68, 0x87, 0xe5, 0x79, 0x41, 0xba, 0xb0, 0x12, 0x84, 0xe7, 0x9c, 0x14, 0x55, 0x54, 0x4, 0x4b, 0xe8, 0x27, 0x43, 0x3d, 0x22, 0xf1, 0xfc, 0xb7, 0xa0, 0x4c, 0xc, 0xfd, 0xe4, 0x22, 0xe4, 0x33, 0x4e, 0x8a, 0x3a, 0xf0, 0x40, 0xfa, 0xf9, 0x64, 0xad, 0x29, 0x75, 0x82, 0x20, 0x80, 0xae, 0x4b, 0xc8, 0xc6, 0xd, 0xc5, 0x83, 0x7, 0x5, 0xf8, 0xfb, 0x8, 0x76, 0xd6, 0xe5, 0x4, 0xbf, 0xa0, 0x10, 0x4d, 0x85, 0x90, 0xfd, 0xae, 0x1f, 0x14, 0x82, 0xf8, 0x4d, 0x14, 0xfe, 0x6d, 0x18, 0xd0, 0xbd, 0xe0, 0xf1, 0x69, 0x2d, 0xd8, 0xc6, 0x73, 0x2e, 0x96, 0xee, 0xf, 0xc0, 0xc3, 0x80, 0xeb, 0x8a, 0xc8, 0xb7, 0xca, 0x5e, 0x9e, 0xca, 0xe9, 0x21, 0x41, 0xaf, 0xd7, 0xde, 0x35, 0x84, 0xab, 0x85, 0x21, 0x4e, 0x14, 0xc5, 0x6b, 0x91, 0x14, 0x8c, 0xf4, 0x9c, 0x9b, 0x2, 0xea, 0xc3, 0x10, 0xc3, 0x2e, 0xaf, 0x6c, 0x2a, 0x15, 0x1e, 0xa4, 0xa9, 0x2b, 0x8e, 0x23, 0x98, 0x62, 0x2, 0x1, 0xed, 0xb7, 0xd0, 0xd5, 0x2, 0x4, 0xcf, 0x72, 0x1c, 0x95, 0xf8, 0x81, 0xa8, 0x2, 0xf, 0xa0, 0x7b, 0x98, 0xed, 0x36, 0x46, 0xdb, 0x6b, 0x42, 0x9a, 0xcb, 0x38, 0x89, 0x47, 0xd8, 0x7f, 0xc5, 0x76, 0x18, 0xc6, 0x19, 0x65, 0xf2, 0xf4, 0x3, 0x4b, 0x90, 0xa6, 0x83, 0x10, 0xae, 0x2a, 0x3e, 0xfe, 0x7e, 0x77, 0x71, 0xca, 0x37, 0x80, 0xbe, 0x94, 0xf4, 0x9e, 0xe0, 0x8b, 0x47, 0xba, 0x7d, 0xc8, 0x36, 0xa, 0xde, 0xa2, 0xc2, 0x80, 0x5f, 0xe7, 0x7b, 0x0, 0xd9, 0xd, 0x6c, 0xa3, 0xec, 0xc7, 0x40, 0xd9, 0xc3, 0x83, 0x51, 0xa3, 0x6c, 0x7f, 0x3c, 0x42, 0x69, 0x3, 0x42, 0xa1, 0x9e, 0xfb, 0x3c, 0xfe, 0x3d, 0x44, 0xc7, 0x4f, 0xe3, 0x40, 0x83, 0xe0, 0xe4, 0x39, 0x53, 0xc2, 0x53, 0x8c, 0x17, 0x3b, 0xc3, 0x0, 0x89, 0x67, 0xe4, 0xa3, 0x76, 0xa, 0xc2, 0xb1, 0xda, 0xfb, 0xf0, 0xdb, 0x28, 0x1d, 0xf1, 0xa, 0xc1, 0x5f, 0x46, 0x5b, 0x2d, 0x9d, 0xfa, 0x2c, 0x5b, 0xb9, 0xe3, 0xe8, 0xf9, 0xef, 0xc2, 0xb9, 0x39, 0xc5, 0xc3, 0x7b, 0x40, 0xa2, 0x1d, 0xaa, 0x7c, 0xeb, 0xa, 0xe8, 0xa8, 0x4a, 0x80, 0xa7, 0xc1, 0xee, 0xf1, 0x91, 0xe1, 0x51, 0x6, 0x1e, 0xa4, 0xc, 0x12, 0x5f, 0xf5, 0x73, 0x6, 0x30, 0x99, 0x8f, 0x8b, 0xfb, 0x65, 0x18, 0x1a, 0x11, 0xe4, 0xd3, 0xd, 0x9b, 0x6e, 0x32, 0x25, 0xf8, 0x4a, 0x89, 0x17, 0x5c, 0xd, 0x3, 0xe1, 0x81, 0x8e, 0x88, 0xfe, 0xd0, 0x7, 0xd8, 0x8, 0x3c, 0xfe, 0x8c, 0xea, 0x7a, 0x35, 0x8f, 0x7e, 0x13, 0xa5, 0x20, 0xde, 0x96, 0x78, 0x6d, 0xd5, 0x9b, 0x25, 0x1e, 0x7f, 0x99, 0xe, 0xc1, 0xa1, 0xd1, 0x8b, 0xea, 0xb3, 0x70, 0xc7, 0x9b, 0xc2, 0xdd, 0xdc, 0x6d, 0xd5, 0xf3, 0x22, 0xda, 0xa4, 0xe7, 0xf2, 0x3d, 0xd6, 0x1c, 0x32, 0xe2, 0x67, 0xec, 0xed, 0xb, 0x51, 0xf7, 0xb8, 0xe1, 0x1, 0x1c, 0x28, 0xe3, 0xa7, 0x33, 0x95, 0x51, 0xf, 0x12, 0x2e, 0xe7, 0x13, 0xd2, 0xbc, 0x2e, 0xa2, 0x63, 0x8e, 0x16, 0xa7, 0xea, 0xd6, 0x3c, 0xda, 0x26, 0x0, 0x34, 0x2a, 0x49, 0xd, 0xe7, 0x84, 0xeb, 0x87, 0x3a, 0x9a, 0x55, 0xd4, 0xaa, 0x84, 0x60, 0xcc, 0xde, 0x22, 0xe0, 0x74, 0xb0, 0x32, 0xce, 0xa2, 0x46, 0x52, 0x6d, 0x86, 0xdd, 0x5a, 0xdb, 0x85, 0xdf, 0xc0, 0xf8, 0xa1, 0x4a, 0x38, 0x32, 0xd3, 0x51, 0x3e, 0xf0, 0x40, 0x43, 0x38, 0x3e, 0xe2, 0xe2, 0xbd, 0x6c, 0x22, 0x18, 0xa0, 0xed, 0x20, 0x82, 0x28, 0x87, 0xf6, 0x2b, 0xee, 0x65, 0xb0, 0xc4, 0x1f, 0xf2, 0x59, 0x19, 0xc2, 0xb5, 0x90, 0x4d, 0x8f, 0xda, 0x31, 0x2f, 0x1b, 0x8e, 0x94, 0xf7, 0xb9, 0xbe, 0x3e, 0xff, 0xb9, 0x2f, 0xef, 0xf, 0xae, 0x6e, 0x48, 0x6c, 0x64, 0xa2, 0xeb, 0x67, 0xe, 0x1c, 0x43, 0xfd, 0x7f, 0x22, 0x55, 0xc1, 0x1a, 0x29, 0xa8, 0x12, 0x50, 0x55, 0xee, 0xa0, 0x24, 0xc3, 0xc0, 0x22, 0xef, 0x4f, 0x57, 0x2d, 0x7b, 0x93, 0x3b, 0xde, 0xc8, 0x4, 0xb0, 0xa1, 0xce, 0x8b, 0x3e, 0x57, 0xbc, 0x91, 0xbf, 0x9f, 0xe9, 0x34, 0x8f, 0xc0, 0x18, 0x21, 0xf1, 0x43, 0x6c, 0x3c, 0xa3, 0x60, 0x2c, 0x55, 0x68, 0xd4, 0x48, 0x41, 0xea, 0x55, 0x43, 0x49, 0x3e, 0x44, 0x2f, 0x8f, 0xea, 0xf8, 0x30, 0x8e, 0xdf, 0x7, 0x12, 0xaf, 0x10, 0xb0, 0x96, 0x2, 0xf2, 0x1, 0xf, 0xee, 0xa5, 0x9c, 0x3b, 0xf6, 0x19, 0x9c, 0xb, 0x50, 0x4b, 0xde, 0xc3, 0xb7, 0xb4, 0xff, 0xbb, 0x25, 0xb9, 0xe, 0xe, 0xe0, 0x3d, 0xc0, 0x16, 0x9d, 0x25, 0x4e, 0x3d, 0xd8, 0xee, 0xfc, 0xdf, 0x66, 0xee, 0xd6, 0x0, 0xe3, 0xd2, 0x7d, 0x5d, 0xc8, 0xeb, 0x1a, 0x9a, 0x99, 0x42, 0x5f, 0x53, 0x8a, 0xff, 0x59, 0x1c, 0x77, 0x39, 0xee, 0xbb, 0x37, 0x79, 0x5, 0x8d, 0xf9, 0x79, 0x34, 0x86, 0x35, 0x68, 0x70, 0xe, 0x87, 0xd2, 0x7c, 0x28, 0x61, 0xd7, 0x9a, 0x93, 0x95, 0xf8, 0xec, 0x80, 0x52, 0xaa, 0x95, 0xf, 0x1a, 0xc6, 0x7c, 0x22, 0x2d, 0x20, 0x28, 0xa1, 0x8e, 0xa0, 0xf2, 0xd6, 0x5d, 0x12, 0xcf, 0x17, 0x4c, 0x65, 0x87, 0xf0, 0x9b, 0x76, 0xb1, 0xaf, 0x78, 0x72, 0x13, 0x72, 0xe3, 0xfa, 0x72, 0x4c, 0x1a, 0x71, 0xb7, 0x18, 0x4c, 0x95, 0x74, 0x21, 0xed, 0x98, 0x65, 0x4, 0xd0, 0x4e, 0xf6, 0x17, 0x42, 0xbd, 0x2e, 0x3f, 0xdf, 0x9a, 0xc0, 0x6d, 0x96, 0x20, 0xec, 0xf1, 0x1b, 0xcf, 0x52, 0x98, 0xad, 0xf0, 0xf8, 0x7e, 0x26, 0x4b, 0xbc, 0xee, 0xe7, 0x50, 0xa, 0x8d, 0xa6, 0x6c, 0x83, 0x97, 0x13, 0x88, 0xf3, 0xd9, 0xd6, 0xc9, 0xd3, 0x50, 0xb1, 0x51, 0x3d, 0xd, 0x4e, 0xba, 0xc3, 0xb8, 0xb3, 0x99, 0x5, 0x95, 0xb6, 0x73, 0x8c, 0xee, 0x11, 0xa7, 0xe2, 0x5a, 0x52, 0x14, 0x33, 0x16, 0x5a, 0x79, 0xc4, 0xc1, 0xb7, 0x89, 0x83, 0x3e, 0x8e, 0x52, 0xf7, 0x1c, 0x2e, 0xa4, 0x26, 0xe4, 0xb3, 0x53, 0x58, 0x90, 0xd8, 0x3d, 0xff, 0x4d, 0x87, 0x40, 0x32, 0xcf, 0x21, 0x47, 0x76, 0x35, 0xca, 0xdc, 0x15, 0x48, 0xe5, 0x82, 0xa6, 0x4b, 0x8c, 0x39, 0x2a, 0xf3, 0x79, 0xdc, 0x16, 0x52, 0x58, 0x41, 0x68, 0xf5, 0xe1, 0xce, 0x84, 0x1a, 0xa2, 0xb9, 0xdc, 0xed, 0x75, 0x1, 0xdf, 0x54, 0x68, 0x1, 0x1d, 0x11, 0x4f, 0xed, 0xcd, 0xf9, 0xe0, 0x11, 0xa1, 0x8a, 0xd9, 0xbd, 0x5c, 0x3, 0xfd, 0xe8, 0x74, 0xeb, 0x48, 0x20, 0x35, 0x25, 0xf7, 0x4c, 0xe2, 0x3a, 0x15, 0x14, 0xd4, 0x13, 0x28, 0x38, 0x16, 0xa7, 0xda, 0x91, 0x18, 0x75, 0xe0, 0x6, 0xc9, 0x6c, 0x8f, 0x11, 0xa1, 0xaf, 0x28, 0xbd, 0x5b, 0x52, 0xfd, 0x0, 0x18, 0xe, 0xe7, 0xee, 0x56, 0x9d, 0xea, 0x44, 0x29, 0x25, 0xf7, 0x36, 0x2, 0x56, 0x67, 0x3a, 0xcf, 0xa4, 0x9a, 0x84, 0x85, 0x93, 0xca, 0xd9, 0xdc, 0x6a, 0xaa, 0xb5, 0x9d, 0xa5, 0x72, 0xa9, 0x4a, 0x4f, 0xd2, 0x78, 0xdf, 0x44, 0x69, 0x1c, 0x4, 0x2d, 0xa6, 0x1a, 0x7d, 0x3f, 0x77, 0xaf, 0x6e, 0xdc, 0x41, 0xda, 0x53, 0x70, 0xd5, 0xe4, 0xee, 0x50, 0x8d, 0xbb, 0xda, 0x4e, 0xa, 0x29, 0xf4, 0x79, 0x1d, 0xed, 0xed, 0xd9, 0xb4, 0xb1, 0x67, 0x49, 0x70, 0xf, 0x7d, 0xd1, 0x8e, 0x97, 0x47, 0xe9, 0x6c, 0x3b, 0x92, 0x26, 0x4, 0xec, 0xb2, 0xb6, 0xc4, 0x42, 0xd, 0xae, 0x85, 0xdd, 0xdc, 0xd1, 0xb6, 0x72, 0x37, 0x9f, 0xcf, 0xf9, 0x87, 0x76, 0x33, 0x57, 0xf6, 0x70, 0x4c, 0x90, 0x2c, 0xfd, 0x57, 0x80, 0x1, 0x0, 0xc5, 0xb1, 0xf0, 0x59, 0xcd, 0x2e, 0xe2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; + + + + + (NSData *)parse_logo_png { + return [NSData dataWithBytes:parse_logo_png length:sizeof(parse_logo_png)]; + } + + const unsigned char parse_logo2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x1, 0xbb, 0x0, 0x0, 0x0, 0x88, 0x8, 0x6, 0x0, 0x0, 0x0, 0x7e, 0xf0, 0x45, 0xa9, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x45, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x46, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x43, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x44, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xe8, 0x51, 0xff, 0x90, 0x0, 0x0, 0x26, 0xd1, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x5d, 0x7, 0x98, 0x14, 0x55, 0xd6, 0xbd, 0xd, 0x33, 0xcc, 0x90, 0x54, 0x24, 0x88, 0xa2, 0x2, 0x8a, 0x28, 0x20, 0x62, 0x40, 0x51, 0x5c, 0x57, 0x10, 0x51, 0x44, 0xd7, 0x35, 0xff, 0xbb, 0x46, 0x5c, 0x31, 0xc3, 0x9a, 0x45, 0xd4, 0x55, 0x74, 0xd7, 0xac, 0xb0, 0x86, 0x5d, 0x73, 0x5e, 0x75, 0x4d, 0x6b, 0x56, 0x14, 0x11, 0xcc, 0x1, 0x41, 0xc9, 0x51, 0x82, 0x8, 0x8, 0x22, 0x82, 0x48, 0x9a, 0xf8, 0xbf, 0x63, 0x9d, 0x96, 0xa6, 0xe6, 0x55, 0x4f, 0xcf, 0x4c, 0x55, 0x77, 0x55, 0xf5, 0x3d, 0xdf, 0x77, 0x3f, 0xe0, 0x55, 0x33, 0x53, 0xfd, 0xea, 0xd5, 0x3b, 0x37, 0xbf, 0xc4, 0x49, 0x83, 0x86, 0xb4, 0x13, 0x91, 0x53, 0x8c, 0x34, 0x96, 0xf8, 0xa2, 0xbe, 0x91, 0xa9, 0x46, 0x66, 0x19, 0x99, 0x61, 0x64, 0xb5, 0x91, 0x52, 0x51, 0x28, 0x14, 0xa, 0x45, 0x6c, 0xb0, 0x66, 0xed, 0x3a, 0x19, 0x3a, 0x68, 0xa0, 0xec, 0xb3, 0x47, 0xd7, 0x2a, 0xd7, 0xa, 0x8c, 0xdc, 0x62, 0xa4, 0xb7, 0x91, 0xe2, 0x18, 0xcf, 0x41, 0x82, 0xe4, 0x56, 0x66, 0xa4, 0xc4, 0xc8, 0x14, 0x92, 0xdf, 0x24, 0xfe, 0x1d, 0xb2, 0x41, 0x97, 0x8a, 0x42, 0xa1, 0x50, 0xc4, 0x13, 0x20, 0xbb, 0xed, 0x8c, 0x34, 0xe3, 0xdf, 0xf3, 0x5, 0x6d, 0x8c, 0x1c, 0xca, 0xbf, 0xff, 0x42, 0xd2, 0xfb, 0xd0, 0xc8, 0x33, 0xfc, 0x7b, 0xa5, 0x2e, 0xd, 0x85, 0x42, 0xa1, 0x88, 0xf, 0xea, 0x19, 0x29, 0x37, 0x52, 0x91, 0xc7, 0x73, 0xd0, 0xc4, 0x48, 0x4f, 0x23, 0x43, 0x8c, 0x8c, 0x33, 0x32, 0xd2, 0xc8, 0x31, 0x46, 0xa, 0x75, 0x79, 0x28, 0x14, 0xa, 0x45, 0x7c, 0xc8, 0x4e, 0xb1, 0x11, 0x20, 0xb8, 0x43, 0x8c, 0xbc, 0x68, 0x64, 0xb4, 0x91, 0x63, 0x75, 0x8e, 0x14, 0xa, 0x85, 0x22, 0xfa, 0xf0, 0x72, 0x5d, 0x22, 0x89, 0x63, 0x6a, 0x8c, 0x8, 0xbd, 0x95, 0x91, 0x46, 0xfc, 0x73, 0xeb, 0xc, 0x9, 0xec, 0x0, 0xca, 0x28, 0x23, 0x7f, 0x17, 0xc7, 0xcd, 0xa9, 0x50, 0x28, 0x14, 0x8a, 0x18, 0x91, 0xdd, 0x93, 0x46, 0x6e, 0x8c, 0xd1, 0xf7, 0x6c, 0x40, 0xb2, 0xdb, 0xca, 0x48, 0x6b, 0x23, 0x9d, 0x53, 0xc8, 0xc, 0xf1, 0xbb, 0x44, 0x9a, 0xff, 0xdb, 0x97, 0x9f, 0xbb, 0xd7, 0xc8, 0x75, 0x46, 0x56, 0xe9, 0xb2, 0x51, 0x28, 0x14, 0x8a, 0xe8, 0x59, 0x3d, 0x36, 0x34, 0x8c, 0xd9, 0xf7, 0x44, 0x6, 0xe6, 0x4a, 0x23, 0x33, 0x8d, 0xbc, 0x4f, 0xe2, 0x3a, 0xd1, 0x48, 0x27, 0x23, 0xfd, 0x8d, 0x3c, 0x6a, 0xe4, 0xbb, 0x34, 0xff, 0x1f, 0x99, 0xaa, 0x17, 0x19, 0x79, 0xdb, 0x48, 0x77, 0x5d, 0x36, 0xa, 0x85, 0x42, 0x11, 0xf, 0xb2, 0xcb, 0x17, 0x20, 0x13, 0x13, 0x9, 0x29, 0x7f, 0x31, 0x72, 0x90, 0x91, 0x2b, 0x8d, 0xcc, 0x4d, 0xf3, 0xf9, 0x1e, 0x46, 0xde, 0x32, 0x32, 0x40, 0x97, 0x8e, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0x45, 0x11, 0xb3, 0x8d, 0xdc, 0x64, 0x64, 0x2f, 0x71, 0xdc, 0x95, 0xcb, 0x3c, 0x3e, 0xd7, 0x82, 0x96, 0x20, 0xdc, 0xbc, 0x9, 0x9d, 0x36, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x22, 0xe0, 0xee, 0x1c, 0x66, 0xa4, 0x8f, 0x91, 0x17, 0xd2, 0x7c, 0x6e, 0xa8, 0x38, 0xee, 0xd0, 0x22, 0x9d, 0x32, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x2a, 0xd0, 0x55, 0xe5, 0x78, 0x23, 0x3, 0x8d, 0xac, 0xf0, 0xf8, 0xcc, 0xd9, 0x46, 0x1e, 0x96, 0xf8, 0xc5, 0x38, 0x15, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xcf, 0x0, 0x32, 0x43, 0xed, 0xdd, 0xd7, 0x1e, 0xd7, 0x4f, 0xa2, 0x85, 0xa7, 0x45, 0xe8, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x69, 0x8c, 0x17, 0xa7, 0x4, 0xe1, 0x4d, 0x8f, 0xeb, 0xa7, 0x89, 0xe3, 0xfa, 0x54, 0x28, 0x14, 0xa, 0x85, 0x92, 0x5d, 0xa4, 0xb1, 0xdc, 0xc8, 0x9f, 0xc4, 0x49, 0x4e, 0xb1, 0x1, 0x99, 0x9c, 0x67, 0xea, 0x34, 0x29, 0x14, 0xa, 0x85, 0x92, 0x5d, 0xd4, 0x81, 0xa3, 0x81, 0x10, 0xc3, 0x7b, 0xc8, 0xe3, 0xfa, 0x8, 0x23, 0xbd, 0x74, 0x9a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xea, 0x40, 0xd3, 0xec, 0xc1, 0xe2, 0xf4, 0xcf, 0x74, 0x3, 0x67, 0x2, 0x22, 0x7e, 0xd7, 0x42, 0xa7, 0x49, 0xa1, 0x50, 0x28, 0x94, 0xec, 0xa2, 0x8e, 0xf5, 0xb4, 0xf0, 0x3e, 0xb6, 0x5c, 0xdb, 0x45, 0x9c, 0x33, 0x2, 0xb, 0x74, 0x9a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xea, 0x40, 0x3d, 0xde, 0x0, 0x23, 0xdf, 0x5a, 0xae, 0x9d, 0x6a, 0xe4, 0x70, 0x9d, 0x22, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x3, 0xe6, 0x18, 0x19, 0x24, 0xce, 0x29, 0xe8, 0xa9, 0x48, 0x9e, 0x0, 0xbf, 0x85, 0x4e, 0x91, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x1, 0xaf, 0x19, 0xb9, 0xdb, 0x32, 0xbe, 0xb3, 0x91, 0x8b, 0x75, 0x7a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0x2e, 0xb8, 0xd9, 0xc8, 0x44, 0xcb, 0xf8, 0x19, 0x46, 0x76, 0xd2, 0xe9, 0x51, 0x28, 0x14, 0xa, 0x25, 0xbb, 0x38, 0xe0, 0x7, 0x23, 0x97, 0x59, 0xc6, 0xb7, 0x11, 0xe7, 0x68, 0x20, 0x85, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x2, 0x38, 0xd1, 0xfc, 0x19, 0xcb, 0x38, 0x92, 0x55, 0xda, 0xeb, 0xf4, 0x28, 0x14, 0xa, 0x85, 0x92, 0x5d, 0x5c, 0x80, 0xa2, 0xf2, 0x9f, 0x5d, 0x63, 0xa8, 0xbd, 0xfb, 0x8b, 0x4e, 0x8d, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x5, 0xe3, 0x8c, 0xbc, 0x6a, 0x19, 0x3f, 0xc1, 0x48, 0x4b, 0x9d, 0x1e, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x93, 0x75, 0xe7, 0x46, 0x47, 0xd1, 0x36, 0x62, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x23, 0x7c, 0x65, 0xe4, 0xd, 0xcb, 0xf8, 0x19, 0x3a, 0x35, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x17, 0x54, 0x1a, 0x79, 0xce, 0x32, 0xde, 0xd3, 0x48, 0x3b, 0x9d, 0x1e, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0xb, 0xde, 0x36, 0x32, 0xd7, 0x35, 0xd6, 0x54, 0x9c, 0x33, 0xf1, 0x14, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0xb, 0x2c, 0x35, 0xf2, 0xa5, 0x65, 0xfc, 0x77, 0x3a, 0x35, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x27, 0xd8, 0xb2, 0x32, 0xf7, 0x36, 0xd2, 0x5a, 0xa7, 0x46, 0xa1, 0x50, 0x28, 0x94, 0xec, 0xe2, 0x82, 0xb1, 0x46, 0x4a, 0x5c, 0x63, 0x68, 0x1d, 0xb6, 0x9d, 0x4e, 0x8d, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x5, 0x3f, 0x1a, 0x99, 0xea, 0x1a, 0x2b, 0x10, 0xed, 0x95, 0xa9, 0x50, 0x28, 0x14, 0x59, 0x87, 0x1e, 0x30, 0x1a, 0x1c, 0x70, 0xc0, 0xeb, 0x27, 0x46, 0xf6, 0x70, 0x8d, 0xef, 0x66, 0xe4, 0xe9, 0x8, 0x7f, 0xaf, 0x42, 0x23, 0xd, 0x8c, 0x34, 0xf1, 0xb0, 0x52, 0x13, 0x46, 0xd6, 0x19, 0x59, 0x48, 0xcb, 0x76, 0x83, 0x38, 0xa7, 0xbb, 0x2b, 0x14, 0x99, 0xee, 0x49, 0xc9, 0x35, 0x86, 0xf5, 0xd5, 0x50, 0x9c, 0xc, 0x67, 0x9b, 0xa2, 0xe, 0x85, 0xf2, 0x7b, 0xae, 0x2f, 0xac, 0xb5, 0x72, 0x9d, 0x3e, 0x5f, 0x90, 0xe0, 0xfc, 0xe3, 0x59, 0x6c, 0x6d, 0x64, 0x4b, 0xcb, 0x3b, 0x8c, 0xf9, 0xc7, 0x99, 0x9e, 0x8b, 0x8c, 0x94, 0x89, 0x73, 0xcc, 0x59, 0x45, 0xd8, 0x17, 0x96, 0x22, 0x38, 0xcc, 0xb0, 0x8c, 0xed, 0x1c, 0xb1, 0x8d, 0x7, 0x27, 0xaf, 0x77, 0x30, 0xd2, 0xc9, 0xc8, 0x5e, 0x46, 0xda, 0xf2, 0xdf, 0x45, 0xdc, 0x94, 0x2a, 0x2d, 0x2f, 0x4a, 0x5, 0x17, 0xff, 0x4f, 0xe2, 0x9c, 0xf9, 0x87, 0x79, 0x98, 0x69, 0x64, 0x16, 0xff, 0xfc, 0x26, 0xa6, 0xcf, 0xbb, 0x1e, 0x37, 0x9, 0xe1, 0xc6, 0x5b, 0xaa, 0xaf, 0x40, 0x5a, 0x6c, 0x6b, 0x64, 0x47, 0xa, 0xd6, 0x19, 0x9a, 0x2f, 0xa0, 0x79, 0xfa, 0xf6, 0x54, 0xa6, 0xa, 0x39, 0xa7, 0x95, 0x1e, 0x1b, 0x72, 0x39, 0x37, 0x5a, 0x6c, 0xba, 0xf3, 0xc5, 0x39, 0x48, 0x79, 0x26, 0xff, 0x3e, 0xdb, 0xc8, 0x2, 0x6e, 0xc6, 0x8a, 0xf4, 0x68, 0xcd, 0xf7, 0xbb, 0x3, 0xf7, 0xa7, 0x2e, 0x46, 0x76, 0x30, 0xd2, 0x86, 0x7b, 0x40, 0x7d, 0x8f, 0xf7, 0x3c, 0x39, 0xff, 0xdf, 0x73, 0xee, 0x67, 0xf0, 0x1d, 0x9f, 0xc2, 0x77, 0x7c, 0x9e, 0x92, 0x5d, 0xfe, 0x60, 0x11, 0x17, 0x49, 0x22, 0x65, 0xac, 0x63, 0xc8, 0xef, 0x19, 0xbd, 0x3c, 0xf, 0x31, 0x72, 0xb0, 0x91, 0xae, 0x5c, 0xfc, 0xad, 0x6a, 0xf1, 0x73, 0x1a, 0xf0, 0x67, 0x61, 0x43, 0xeb, 0x95, 0x32, 0x8e, 0xd, 0x68, 0xba, 0x91, 0x31, 0x46, 0xfe, 0x27, 0x4e, 0x89, 0x46, 0x1c, 0x2c, 0x3f, 0x28, 0x2, 0xb7, 0x53, 0x9, 0x10, 0x6e, 0x2, 0x77, 0x18, 0x79, 0x25, 0x8b, 0xf7, 0xd0, 0x90, 0xd6, 0xd0, 0xce, 0x54, 0x4a, 0x5a, 0xf3, 0x7e, 0x92, 0x8d, 0xc8, 0x8b, 0x68, 0x1, 0x5d, 0x60, 0xe4, 0xbb, 0x1c, 0xcc, 0x11, 0x7e, 0x7f, 0x37, 0x23, 0x87, 0x89, 0x93, 0xac, 0xb5, 0x13, 0x89, 0xae, 0x7e, 0x1d, 0xf6, 0xaf, 0x22, 0xae, 0x33, 0x6c, 0xcc, 0xfb, 0xbb, 0x3c, 0x2b, 0xdf, 0x52, 0xd9, 0x1a, 0x2f, 0xce, 0xb9, 0x93, 0x93, 0xe8, 0x69, 0xc8, 0x77, 0xd4, 0xe7, 0x3e, 0x84, 0xf7, 0xbc, 0x37, 0x9f, 0x43, 0xe7, 0x3a, 0xcc, 0x7f, 0x52, 0x61, 0xe9, 0x9d, 0x72, 0x6d, 0x1e, 0x15, 0x8e, 0x64, 0xb, 0xc5, 0xaf, 0xa5, 0x6a, 0xe, 0x83, 0x92, 0x5d, 0x8c, 0xb0, 0xd8, 0xc8, 0x2f, 0xe2, 0xd4, 0xd8, 0x25, 0xd1, 0x82, 0xda, 0x6a, 0x98, 0x36, 0x78, 0xb8, 0x29, 0x50, 0xf4, 0x7e, 0x84, 0x91, 0xc3, 0x49, 0x50, 0x41, 0xa1, 0x2d, 0xa5, 0x9f, 0x91, 0xeb, 0x8d, 0x7c, 0x64, 0xe4, 0x29, 0x23, 0x6f, 0x8a, 0x53, 0xb2, 0x11, 0x55, 0x1c, 0x21, 0x55, 0x5b, 0xc2, 0x2d, 0xa, 0x98, 0xec, 0xb0, 0x69, 0x75, 0x37, 0xb2, 0x9f, 0x91, 0x3, 0x8c, 0xec, 0x23, 0x4e, 0xf, 0xd6, 0xa2, 0x6a, 0xfe, 0xdf, 0xf3, 0x46, 0xfe, 0x9b, 0xc5, 0xb9, 0x1, 0xb1, 0xf5, 0x31, 0x72, 0x1a, 0xad, 0x87, 0x6c, 0xec, 0x3b, 0xc5, 0xdc, 0xd0, 0x21, 0xfd, 0x8d, 0xc, 0xe5, 0x6, 0x8c, 0x86, 0xf, 0x23, 0xb9, 0xee, 0xf2, 0xd, 0xed, 0xa9, 0xc4, 0x9e, 0xc8, 0xf7, 0xbd, 0x41, 0xc0, 0xbf, 0xab, 0x3d, 0x9, 0x75, 0x8, 0x95, 0x8e, 0xff, 0x70, 0xee, 0xc7, 0x2b, 0xd9, 0xc5, 0xf, 0x38, 0x1, 0x61, 0x8d, 0x8b, 0xec, 0x8a, 0xa8, 0x7d, 0x2f, 0x8, 0xc1, 0xfd, 0x61, 0x23, 0x38, 0x95, 0x1b, 0x75, 0xb7, 0x1c, 0x69, 0xfa, 0x7d, 0x28, 0xd3, 0x8c, 0x3c, 0x6e, 0xe4, 0x3e, 0xa9, 0x7a, 0x72, 0x44, 0x14, 0x60, 0x73, 0xb5, 0x95, 0x7, 0xb8, 0x91, 0x9c, 0xcc, 0x79, 0xeb, 0x4e, 0xcb, 0xa6, 0x26, 0x48, 0x64, 0x61, 0x3e, 0x12, 0x24, 0x19, 0x9c, 0xf8, 0xd1, 0xd7, 0xf5, 0xe, 0xe4, 0x6a, 0xaf, 0x83, 0x5, 0x73, 0x95, 0x38, 0x67, 0x4f, 0xc2, 0xb3, 0x80, 0x23, 0xb9, 0x9e, 0xa5, 0x15, 0x18, 0x67, 0xec, 0x6e, 0xe4, 0x1c, 0x23, 0x87, 0x4a, 0x6e, 0xba, 0x38, 0x25, 0xc3, 0x21, 0xff, 0xe0, 0xdc, 0x7f, 0xc0, 0xf7, 0xfc, 0x1d, 0x7a, 0x40, 0x94, 0xec, 0x62, 0x80, 0xd5, 0x46, 0xd6, 0x5a, 0xb4, 0xf1, 0x46, 0x39, 0xbe, 0xaf, 0x83, 0xb8, 0x9, 0x1d, 0x23, 0x8e, 0xeb, 0xab, 0xa6, 0xc0, 0x26, 0xe, 0x3f, 0x3d, 0x12, 0x51, 0x56, 0x88, 0x13, 0x9b, 0x4a, 0x70, 0xc3, 0x87, 0x65, 0x81, 0x58, 0x4b, 0x73, 0x23, 0x9b, 0xd5, 0xe0, 0x67, 0xc2, 0x8d, 0x72, 0x8b, 0x91, 0xb3, 0xc4, 0x39, 0xf9, 0xfd, 0x71, 0x89, 0x56, 0xcc, 0xab, 0x32, 0xc3, 0xb1, 0xba, 0xa0, 0x27, 0x37, 0xad, 0xa3, 0x42, 0x40, 0x1e, 0xe9, 0x80, 0xe6, 0x9, 0x57, 0x53, 0xab, 0xaf, 0xd, 0xb1, 0xae, 0xa4, 0x60, 0xfe, 0x96, 0x71, 0x43, 0x4c, 0xfe, 0x1c, 0x78, 0x44, 0xb6, 0x20, 0xc1, 0x37, 0xa2, 0x57, 0xa2, 0xb0, 0x86, 0x3f, 0xbf, 0x1, 0x37, 0x7e, 0xc8, 0xa5, 0x46, 0x6e, 0x23, 0xe9, 0xc5, 0xcd, 0xc5, 0x9, 0x4b, 0xff, 0x5c, 0x5a, 0x72, 0xb5, 0xb1, 0xe2, 0xa0, 0x74, 0x22, 0xee, 0xe, 0xf7, 0xe3, 0xf2, 0x94, 0xf5, 0x5c, 0xc9, 0xf5, 0xd7, 0x94, 0xcf, 0x21, 0xe9, 0xad, 0xca, 0x4, 0x9b, 0x1b, 0xf9, 0x3, 0x15, 0x6c, 0x58, 0x78, 0x77, 0xd0, 0xd3, 0x10, 0x78, 0x72, 0x91, 0x92, 0x5d, 0xb0, 0xc0, 0x42, 0xf9, 0xc5, 0xb2, 0x1, 0xe6, 0xc2, 0x85, 0x59, 0x9f, 0x9b, 0xe4, 0x59, 0xb4, 0x8, 0x32, 0x8d, 0x93, 0x94, 0x93, 0xd0, 0x3e, 0x17, 0xa7, 0xc9, 0x35, 0x82, 0xcf, 0x70, 0x37, 0x2e, 0xa1, 0x46, 0x9c, 0x4a, 0x76, 0x15, 0x29, 0x64, 0x87, 0x17, 0xa0, 0x15, 0xad, 0x10, 0x4, 0xbc, 0x7f, 0x4f, 0xcd, 0xba, 0xba, 0x97, 0xe, 0xbe, 0xff, 0x7, 0x8d, 0xfc, 0xd9, 0xc8, 0xe5, 0xb9, 0x72, 0x79, 0x84, 0xc, 0x3d, 0x8c, 0x5c, 0xc8, 0xe7, 0x57, 0x1c, 0xe2, 0xfb, 0x44, 0x72, 0xc9, 0x35, 0x46, 0x4e, 0xcf, 0x70, 0x73, 0xc5, 0xba, 0x41, 0xec, 0x10, 0xb1, 0x34, 0xc4, 0x76, 0xe6, 0x51, 0x89, 0x5a, 0xc9, 0x77, 0x47, 0xaa, 0x21, 0xbb, 0x86, 0x54, 0xaa, 0x40, 0x78, 0xad, 0xb9, 0xce, 0xba, 0xd3, 0x8a, 0xd8, 0x3c, 0xc3, 0xd, 0x78, 0x57, 0x2a, 0x56, 0x3, 0x68, 0x79, 0xbc, 0x17, 0x83, 0xf5, 0x2, 0xeb, 0xed, 0x62, 0x2a, 0xb4, 0x99, 0x5a, 0xfd, 0x78, 0x97, 0x67, 0xf1, 0x3d, 0x1f, 0xc7, 0xe7, 0xb0, 0x84, 0xef, 0x77, 0x2a, 0xd9, 0x25, 0x95, 0xda, 0x26, 0x54, 0x66, 0x93, 0x64, 0xb7, 0xd, 0xdf, 0xef, 0xae, 0x54, 0x76, 0x9a, 0x57, 0xc3, 0x2f, 0x9, 0x3e, 0x2b, 0x58, 0xd7, 0x3, 0x8d, 0xdc, 0x4a, 0x4b, 0x4f, 0xc9, 0x2e, 0xa2, 0xa8, 0x97, 0x25, 0x97, 0x51, 0x75, 0xe8, 0x4f, 0xf7, 0x41, 0xaf, 0x1a, 0x68, 0xd6, 0xe3, 0xb9, 0xf0, 0xb1, 0x0, 0x27, 0xd0, 0x4a, 0xcd, 0x4, 0xc9, 0xec, 0xb7, 0xf9, 0x16, 0x6d, 0x1a, 0x19, 0x5e, 0x87, 0x51, 0xa3, 0x3e, 0xa0, 0x1a, 0xb, 0x17, 0xd6, 0xe7, 0x28, 0x5a, 0x8, 0xff, 0xce, 0xd3, 0xf5, 0x83, 0xac, 0xc4, 0x21, 0x54, 0x50, 0x6a, 0xfa, 0xae, 0x42, 0x2b, 0x5f, 0x98, 0x42, 0x1e, 0x73, 0xb9, 0x69, 0x81, 0x5c, 0x3e, 0xe, 0xe0, 0x5e, 0xf1, 0x5c, 0xef, 0x12, 0x27, 0x26, 0x97, 0xe, 0x3f, 0x70, 0x33, 0x7d, 0x5f, 0x9c, 0xf8, 0xcd, 0x2c, 0xa9, 0xb9, 0x1b, 0x71, 0x59, 0x35, 0x7b, 0x1a, 0x48, 0x10, 0x9, 0x43, 0x7, 0x8a, 0x93, 0xb4, 0xd2, 0x85, 0x9b, 0x71, 0x3a, 0xf4, 0xe6, 0x9a, 0xbc, 0xdb, 0xc8, 0x30, 0x89, 0xa6, 0x2b, 0x1d, 0xdf, 0xfd, 0x4c, 0x2a, 0x1c, 0x99, 0x74, 0x6a, 0x42, 0x1c, 0xed, 0xb, 0x71, 0x7a, 0xf9, 0x7e, 0xc8, 0x77, 0x37, 0xd3, 0x24, 0x12, 0x58, 0xc1, 0x3f, 0x7a, 0x5c, 0xc3, 0xfc, 0xef, 0xce, 0xf7, 0x1c, 0x4a, 0xee, 0xde, 0x24, 0x47, 0x2f, 0xf4, 0xe1, 0xfb, 0xfe, 0xb0, 0x91, 0x9b, 0xa4, 0x6a, 0x5f, 0x61, 0x25, 0x3b, 0x45, 0xb5, 0xc0, 0xb, 0x7f, 0xa5, 0x91, 0x23, 0x33, 0x78, 0xd6, 0x15, 0xd4, 0xb0, 0x9f, 0xe0, 0x46, 0x34, 0xc1, 0xe7, 0x7b, 0xc1, 0x4b, 0x34, 0x83, 0x82, 0x33, 0xff, 0xf6, 0x35, 0x72, 0x34, 0x37, 0xf2, 0x2d, 0x3c, 0xfe, 0x4f, 0x33, 0x23, 0xff, 0xa2, 0xa6, 0x8e, 0x4d, 0x7f, 0x5d, 0x1e, 0x3d, 0xbb, 0x53, 0xb8, 0x69, 0x75, 0xc8, 0xf0, 0xf3, 0x20, 0x8c, 0x89, 0xdc, 0xb8, 0xbe, 0x22, 0xa9, 0x2d, 0x94, 0xec, 0x24, 0xfd, 0xc0, 0xea, 0x84, 0xeb, 0x39, 0x5d, 0x62, 0xc, 0xb2, 0xf1, 0x1e, 0xa5, 0xe5, 0x34, 0x25, 0xc0, 0x7b, 0x29, 0xa3, 0x62, 0x36, 0x96, 0x22, 0x5c, 0x3f, 0x70, 0x1, 0xff, 0x89, 0xa, 0x5f, 0x61, 0x9a, 0xfd, 0xf0, 0x22, 0xbe, 0x37, 0x58, 0x97, 0x33, 0x23, 0xb4, 0x5e, 0x92, 0x61, 0x80, 0x23, 0x32, 0x98, 0x9f, 0xd1, 0xe2, 0x24, 0x8b, 0x20, 0x76, 0xf6, 0x6d, 0x0, 0xf7, 0x82, 0xf7, 0xf4, 0x53, 0x4a, 0x82, 0x64, 0x77, 0x38, 0xd7, 0x74, 0xfb, 0x34, 0x96, 0x1e, 0x2c, 0xbc, 0xbe, 0x5c, 0xf7, 0x4f, 0x28, 0xd9, 0x45, 0xb, 0x30, 0xe5, 0x9b, 0x7a, 0x3c, 0xd8, 0xa0, 0x2d, 0x2, 0xb8, 0x31, 0xce, 0x91, 0xea, 0x33, 0xf3, 0x16, 0xd3, 0x82, 0x7a, 0x82, 0xda, 0x5d, 0xb6, 0xe2, 0x64, 0x9f, 0x51, 0x86, 0xf3, 0x5e, 0xe1, 0xfa, 0xf2, 0x3a, 0xcd, 0x7d, 0x30, 0x5d, 0x24, 0x27, 0xd1, 0xad, 0x12, 0x67, 0x40, 0x23, 0xbf, 0x9d, 0xdf, 0x35, 0x13, 0x5, 0x2, 0x1b, 0xfa, 0x5b, 0x46, 0x5e, 0x26, 0xc1, 0x95, 0x65, 0xf1, 0x5e, 0xb, 0xf9, 0xfc, 0x6, 0xa5, 0xf9, 0xcc, 0x47, 0xb4, 0x96, 0x5e, 0x92, 0xdc, 0xc5, 0x60, 0x93, 0x4a, 0xd6, 0x63, 0xb4, 0x38, 0xce, 0x33, 0x72, 0x6c, 0x1a, 0x25, 0xb, 0xd6, 0x8, 0xd2, 0xe5, 0x7, 0x70, 0xc3, 0x8e, 0x82, 0x62, 0x84, 0xe7, 0xd0, 0x22, 0xcd, 0x67, 0xf0, 0xde, 0xa0, 0xd4, 0xe7, 0x11, 0xbe, 0x77, 0x95, 0x59, 0xba, 0xb7, 0x4a, 0x5a, 0x8f, 0x10, 0xb8, 0x2a, 0x8f, 0xe1, 0xbe, 0xd4, 0xd3, 0xe3, 0xf3, 0xc8, 0xd4, 0x7e, 0x9c, 0x4a, 0xc9, 0x10, 0x7a, 0x2, 0x7c, 0x81, 0xb6, 0xb, 0xb, 0x16, 0x70, 0xd3, 0x15, 0x5b, 0x2c, 0xa8, 0xa0, 0xb2, 0xbf, 0xea, 0x91, 0x34, 0xa0, 0x3d, 0x5f, 0x50, 0xd, 0xd1, 0x2d, 0xa4, 0xbb, 0xe6, 0x20, 0xbe, 0xd4, 0xef, 0xe5, 0x68, 0x33, 0x5a, 0xca, 0x45, 0xdd, 0x87, 0x1b, 0xa2, 0x17, 0xfa, 0x51, 0x1b, 0x6d, 0x16, 0xe3, 0xf5, 0x82, 0xd, 0xe0, 0x9d, 0xc, 0x88, 0x6e, 0x39, 0xad, 0x63, 0x3c, 0x3b, 0xb8, 0x8a, 0xfe, 0x29, 0x8e, 0xdb, 0xb8, 0x2c, 0xcb, 0xf7, 0x3b, 0x22, 0xd, 0xd1, 0x2d, 0xe2, 0xa6, 0x86, 0x24, 0x95, 0xe7, 0x24, 0x1c, 0xc9, 0x46, 0x15, 0xf4, 0x58, 0xc, 0xe4, 0x7a, 0x43, 0x46, 0xa0, 0x57, 0x62, 0x44, 0x47, 0x12, 0xde, 0x81, 0x21, 0x5e, 0x2f, 0x5, 0x24, 0x90, 0xc7, 0xd3, 0x10, 0x5d, 0x5, 0x49, 0x1e, 0xdf, 0xf7, 0x4c, 0x92, 0x77, 0x65, 0x8e, 0xee, 0x17, 0x99, 0xe9, 0x4f, 0xf2, 0x5e, 0xb0, 0xc6, 0xa7, 0xa6, 0xf9, 0xec, 0xe9, 0x54, 0xe2, 0x7a, 0x28, 0xd9, 0x45, 0x3, 0x4d, 0xa5, 0x6a, 0x5c, 0x6a, 0x43, 0x40, 0xae, 0x3, 0x68, 0xac, 0x23, 0xa9, 0xb9, 0xed, 0x98, 0xe6, 0x73, 0x88, 0x91, 0xc0, 0xb5, 0x89, 0xb6, 0x65, 0xd7, 0x85, 0xc8, 0x55, 0x33, 0x99, 0x5a, 0xdf, 0x5f, 0x65, 0x63, 0x72, 0x82, 0x1b, 0x88, 0xb, 0x3d, 0x95, 0x46, 0x23, 0x8f, 0x32, 0x4e, 0xe4, 0xf3, 0xeb, 0x9a, 0xe6, 0x33, 0x8b, 0xa8, 0xa0, 0xec, 0x46, 0x6b, 0xf8, 0xe3, 0x1c, 0xde, 0x2f, 0xea, 0xd6, 0xce, 0xf7, 0xb8, 0xf6, 0x16, 0x35, 0xf3, 0xfb, 0x25, 0xbc, 0xae, 0x67, 0x90, 0xde, 0xb9, 0x54, 0x16, 0x3e, 0xf4, 0xf8, 0x4c, 0xb, 0x2a, 0x58, 0x5d, 0x42, 0x78, 0xff, 0xf0, 0x82, 0x20, 0x83, 0x14, 0xb1, 0x78, 0x2f, 0x4f, 0xd1, 0xe7, 0xfc, 0x7e, 0x20, 0x8e, 0xaf, 0x43, 0x74, 0xef, 0x50, 0xf6, 0x9f, 0x26, 0x91, 0xd, 0x4d, 0x63, 0xbd, 0xc1, 0x9d, 0xfc, 0x6, 0xf7, 0x5, 0x25, 0xbb, 0x90, 0x3, 0xd9, 0x88, 0xee, 0xf4, 0xfb, 0x1f, 0xc4, 0xdf, 0x6c, 0x4c, 0x68, 0x77, 0x97, 0x88, 0xe3, 0x8a, 0xec, 0x5b, 0x8d, 0x1b, 0xe3, 0x6, 0x5a, 0x3, 0x8, 0x2, 0xaf, 0xc, 0xe9, 0x9c, 0xc1, 0xe5, 0x75, 0x38, 0x49, 0xd9, 0x8b, 0xf0, 0x86, 0x4b, 0x38, 0x12, 0x7f, 0xfc, 0xc2, 0x60, 0x6a, 0xdf, 0x4d, 0xd3, 0x68, 0xe7, 0xf, 0x50, 0x23, 0x86, 0x82, 0xb2, 0x24, 0xc7, 0xf7, 0x8b, 0x58, 0xeb, 0xdf, 0x3d, 0xae, 0xdd, 0xc1, 0xeb, 0x73, 0x22, 0x32, 0xf7, 0x88, 0x5f, 0xf5, 0xa7, 0x75, 0x6c, 0xc3, 0xb6, 0xb4, 0x9c, 0xb6, 0xc, 0xd1, 0x3d, 0xb7, 0xa5, 0x17, 0xc4, 0x8b, 0x4, 0xa0, 0x50, 0x27, 0x4b, 0x3f, 0xde, 0xd, 0xf1, 0xdc, 0xc3, 0xd2, 0xbb, 0x99, 0x7b, 0xd2, 0x48, 0x8f, 0xcf, 0x34, 0xe7, 0xfc, 0x5f, 0xa0, 0x64, 0x17, 0x6e, 0x6c, 0x6f, 0x19, 0x9b, 0xef, 0xb3, 0xe5, 0x8, 0x17, 0xd1, 0xed, 0x69, 0xdc, 0x18, 0x58, 0xf8, 0x88, 0xc7, 0xed, 0xc3, 0x17, 0x20, 0xa, 0xbd, 0x2, 0x3f, 0xe5, 0x6, 0xf4, 0x59, 0x1a, 0x17, 0xc7, 0xc5, 0x31, 0x58, 0x1f, 0x50, 0x54, 0xae, 0x15, 0x27, 0x8b, 0xd1, 0x2b, 0x69, 0x2, 0xc9, 0x26, 0x70, 0xe1, 0x9e, 0x1d, 0x12, 0x2b, 0x1c, 0xb1, 0xd3, 0x3b, 0xc5, 0x5e, 0xba, 0x72, 0xa3, 0x38, 0x75, 0x6b, 0x51, 0xab, 0x57, 0x43, 0x79, 0x10, 0x12, 0x53, 0x4e, 0x13, 0x7b, 0x88, 0x61, 0x2f, 0x3e, 0xa7, 0x30, 0x0, 0x56, 0x26, 0xba, 0xd, 0xed, 0xef, 0x71, 0x7d, 0x1a, 0xdf, 0x1d, 0x28, 0xb6, 0x51, 0xc9, 0x28, 0x9d, 0x42, 0x5, 0x17, 0x56, 0x9e, 0x2d, 0xeb, 0xbb, 0x9, 0x95, 0x91, 0xcb, 0x94, 0xec, 0xc2, 0xb, 0x5b, 0x26, 0x9d, 0x9f, 0x1a, 0x2f, 0x5c, 0x19, 0x7, 0xa4, 0xb9, 0xfe, 0x39, 0x17, 0x11, 0x5e, 0xe2, 0xa8, 0x35, 0x5f, 0xfe, 0x86, 0x16, 0xc2, 0x27, 0x1e, 0xd7, 0x61, 0x59, 0xfc, 0x3e, 0xe2, 0xeb, 0x3, 0x75, 0x5d, 0xc3, 0xaa, 0xb1, 0x72, 0xfb, 0xd2, 0x6a, 0xf, 0xb, 0xb0, 0xe9, 0xdb, 0x4e, 0xbb, 0xb8, 0x85, 0xca, 0x54, 0x94, 0x1, 0xa5, 0x10, 0xc9, 0x2b, 0xb6, 0xf8, 0xe2, 0xb9, 0x54, 0x3a, 0x72, 0x89, 0x4e, 0xb4, 0xe8, 0xbc, 0xfa, 0x58, 0xbe, 0x40, 0x6b, 0x2e, 0x8a, 0xb5, 0x82, 0x15, 0xb4, 0xf2, 0x8e, 0x13, 0xef, 0xee, 0x52, 0x37, 0x53, 0x29, 0x51, 0xb2, 0xb, 0x19, 0xa0, 0xa9, 0xef, 0x6a, 0x19, 0x9f, 0xec, 0xe3, 0xef, 0x98, 0x27, 0x76, 0x77, 0x12, 0x12, 0x18, 0xae, 0x20, 0x19, 0x8c, 0x8e, 0xf0, 0x1c, 0x7e, 0xcf, 0xc5, 0x6f, 0x4b, 0x55, 0x47, 0x2d, 0xcf, 0x8, 0x9, 0x77, 0x27, 0x91, 0x74, 0x80, 0x5b, 0x66, 0x88, 0xc7, 0x35, 0x3c, 0x3f, 0xb4, 0x3, 0x43, 0xfc, 0xf2, 0xc7, 0x10, 0xdd, 0x33, 0x14, 0xa7, 0x13, 0x2c, 0xe3, 0x2f, 0x92, 0xe8, 0x2a, 0x63, 0xf0, 0xde, 0xa2, 0x3c, 0xe2, 0x7c, 0xcb, 0x77, 0xc1, 0xfb, 0xdc, 0x26, 0x87, 0xf7, 0x5, 0xc5, 0xf6, 0x71, 0xf1, 0x3e, 0xf, 0x13, 0xef, 0x2, 0x4a, 0x2b, 0xa2, 0x7e, 0xca, 0xc3, 0x3b, 0x5c, 0x67, 0x5f, 0x7a, 0xf0, 0xd5, 0x70, 0x7a, 0xf, 0x94, 0xec, 0x42, 0x4, 0xc4, 0xea, 0xf6, 0xb3, 0x8c, 0xcf, 0xf2, 0xf1, 0x77, 0xe0, 0x85, 0xbc, 0x47, 0x36, 0x3d, 0x1f, 0x6f, 0x24, 0xad, 0x1, 0x68, 0xda, 0x25, 0x31, 0x98, 0xc7, 0x25, 0xb4, 0x4c, 0x6d, 0x41, 0xec, 0x3d, 0xeb, 0xea, 0xda, 0xc8, 0x11, 0x50, 0xc3, 0x75, 0x87, 0xc7, 0x35, 0x14, 0xd4, 0xa2, 0x9d, 0xd2, 0x53, 0x21, 0xbb, 0x67, 0x64, 0x15, 0x5f, 0x2c, 0x55, 0xdd, 0xad, 0x8b, 0x39, 0x5e, 0x16, 0xa3, 0x77, 0x17, 0x1d, 0x7c, 0x1e, 0x4a, 0xf9, 0x37, 0xdc, 0xe9, 0xe8, 0x21, 0xfb, 0x4c, 0x8e, 0xee, 0x7, 0xa, 0x1d, 0x5a, 0x6a, 0xed, 0xed, 0x71, 0xfd, 0x1a, 0x3e, 0x83, 0xb8, 0x9c, 0xe7, 0x87, 0x2c, 0xcd, 0x3f, 0xca, 0xc6, 0x3a, 0x49, 0x9b, 0x17, 0xe1, 0x7c, 0x25, 0xbb, 0xf0, 0x0, 0x8d, 0x95, 0xdd, 0xad, 0x7a, 0x16, 0x5, 0xa0, 0x79, 0x55, 0x70, 0xa1, 0x63, 0x61, 0xdc, 0xc4, 0x45, 0xf2, 0x75, 0xcc, 0xe6, 0x72, 0x2, 0xdd, 0x17, 0xb6, 0xc4, 0x1e, 0x8c, 0xef, 0x16, 0xa1, 0xef, 0x2, 0x57, 0x98, 0x57, 0xcc, 0xb, 0x5d, 0x6b, 0xe, 0x16, 0xef, 0x58, 0x65, 0x2e, 0x81, 0x98, 0x6f, 0x6f, 0xcb, 0xf8, 0xdf, 0x24, 0x98, 0xec, 0xe2, 0x5c, 0x3, 0x1e, 0x13, 0x64, 0x36, 0xa3, 0x1e, 0xf, 0xa1, 0x2, 0xa4, 0xcc, 0xaf, 0xcd, 0xc1, 0x7d, 0x60, 0x9d, 0x20, 0xa6, 0xeb, 0x55, 0x2, 0x71, 0x95, 0x78, 0x27, 0xb, 0x45, 0x19, 0x8b, 0xa9, 0xf4, 0xbd, 0xe2, 0xc1, 0x5b, 0xe8, 0x67, 0xda, 0x5f, 0xc9, 0x2e, 0x1c, 0x38, 0xd2, 0x43, 0x63, 0x59, 0x18, 0xc0, 0xef, 0x5a, 0xca, 0xdf, 0x77, 0x65, 0x4c, 0xac, 0x39, 0x1b, 0x60, 0xe9, 0x3c, 0x6a, 0x19, 0x47, 0xf0, 0x7a, 0x50, 0x44, 0xbe, 0x3, 0x6a, 0xb7, 0xee, 0x13, 0x7b, 0x7f, 0xcb, 0x2f, 0xf9, 0xc, 0xe7, 0x85, 0xf4, 0xde, 0x61, 0xd9, 0xb8, 0x33, 0x60, 0xe1, 0x92, 0x7f, 0x2e, 0xa6, 0xeb, 0xd, 0xef, 0xe9, 0x19, 0xe2, 0x14, 0x62, 0xe7, 0xd2, 0x6a, 0x1d, 0x4c, 0xcf, 0x86, 0x97, 0x45, 0x77, 0x63, 0x8c, 0xf7, 0x50, 0x24, 0xe, 0xd, 0xf0, 0x50, 0xfe, 0x10, 0xc6, 0x40, 0x86, 0x72, 0xa6, 0x1d, 0x86, 0x94, 0xec, 0x2, 0x2, 0xfa, 0x40, 0xda, 0x3a, 0x4, 0xa0, 0x8b, 0x40, 0x50, 0xc5, 0xb5, 0xab, 0xf3, 0x60, 0x5e, 0x87, 0x79, 0x90, 0x1, 0x62, 0x15, 0x5d, 0x43, 0x7e, 0xef, 0x28, 0xf0, 0x47, 0xdd, 0x59, 0x5b, 0xcb, 0xb5, 0xc9, 0xb4, 0x20, 0x16, 0x87, 0xf4, 0xde, 0xe1, 0x92, 0x3f, 0xd4, 0xe2, 0x51, 0xb8, 0x47, 0xaa, 0x36, 0x3a, 0x57, 0xf8, 0x7, 0xa4, 0xe4, 0xdf, 0x22, 0xf6, 0x32, 0x9b, 0xbb, 0x62, 0x6a, 0xd1, 0xb9, 0x81, 0x12, 0x29, 0xc4, 0xed, 0x6d, 0xde, 0xaa, 0x36, 0xb4, 0xb8, 0x33, 0x3a, 0x5d, 0x45, 0xc9, 0x2e, 0x18, 0xa0, 0xc0, 0x7b, 0x67, 0xd7, 0x18, 0xfc, 0xe9, 0x63, 0x74, 0x6a, 0xea, 0x84, 0xef, 0xf8, 0xf2, 0xbb, 0x81, 0x98, 0xc6, 0xd9, 0x21, 0xbf, 0x77, 0xd4, 0xc7, 0xf5, 0xf2, 0xb0, 0x20, 0x50, 0x50, 0x1e, 0x66, 0x57, 0x20, 0x36, 0xdd, 0xad, 0x5d, 0x63, 0x70, 0xc7, 0xbf, 0xac, 0x4b, 0x32, 0x30, 0xa0, 0x6d, 0xdc, 0xdd, 0x62, 0x3f, 0x3d, 0x2, 0x9d, 0x5d, 0x2e, 0xcb, 0xa3, 0xb9, 0xc0, 0x5a, 0x3b, 0xd9, 0xe3, 0x1d, 0x41, 0x8f, 0xdd, 0x8c, 0xca, 0x42, 0x94, 0xec, 0x82, 0xc1, 0x11, 0x16, 0x6d, 0x3, 0xe9, 0xb4, 0x1f, 0xeb, 0xd4, 0xd4, 0x19, 0xe8, 0x68, 0x31, 0xc9, 0x32, 0x7e, 0xbc, 0x64, 0xd6, 0xe9, 0x3d, 0x17, 0x40, 0x31, 0xf8, 0x85, 0x96, 0x71, 0xc4, 0x80, 0x90, 0xac, 0x32, 0x25, 0xe4, 0x73, 0xe, 0x2f, 0x85, 0x3b, 0xc6, 0x88, 0x92, 0x90, 0x65, 0xba, 0x1c, 0x3, 0x3, 0x36, 0x70, 0x5b, 0x89, 0x1, 0x9a, 0x7d, 0xa3, 0xc, 0xa2, 0x24, 0xcf, 0xe6, 0x63, 0x2a, 0xdf, 0x21, 0x9b, 0x67, 0xc, 0x39, 0xb, 0x47, 0x29, 0xd9, 0x65, 0x1f, 0x68, 0xf, 0xf6, 0x7f, 0x96, 0x71, 0xd4, 0xc7, 0x6c, 0xd0, 0xe9, 0xa9, 0x33, 0xd0, 0x75, 0xe1, 0x1e, 0xcb, 0x78, 0xcb, 0x4c, 0x16, 0x7c, 0x96, 0x51, 0x42, 0xab, 0x13, 0xd6, 0xa8, 0xad, 0x4f, 0x29, 0xd2, 0xf5, 0x47, 0x86, 0x7c, 0xbe, 0x11, 0x5f, 0xb4, 0x9d, 0x62, 0xff, 0xb6, 0x2e, 0xc5, 0xc0, 0xd0, 0x97, 0x4a, 0x90, 0x1b, 0xd8, 0x3f, 0xd0, 0x6f, 0x74, 0x71, 0x9e, 0xce, 0xb, 0xf6, 0x50, 0xaf, 0x2c, 0x66, 0xd4, 0xac, 0xb6, 0x50, 0xb2, 0xcb, 0x2e, 0x50, 0x8, 0xdd, 0xd1, 0x35, 0x6, 0x6d, 0xe4, 0x39, 0x9d, 0x1a, 0xdf, 0x80, 0x14, 0xf0, 0x19, 0xae, 0xb1, 0x4, 0xc9, 0xae, 0x28, 0x44, 0xf7, 0x9, 0xb2, 0x43, 0x3d, 0xdd, 0x5e, 0x96, 0x6b, 0x48, 0x7c, 0x18, 0x11, 0x81, 0xb9, 0x46, 0x1f, 0x52, 0xdb, 0xb1, 0x2c, 0x9f, 0xeb, 0x32, 0xc, 0x4, 0x50, 0x8e, 0x6e, 0xb7, 0xec, 0xcd, 0x28, 0x33, 0x42, 0xe6, 0xe5, 0x67, 0x79, 0x3e, 0x3f, 0xc8, 0x38, 0xff, 0xc0, 0x32, 0x8e, 0xce, 0x32, 0x43, 0x94, 0xec, 0xb2, 0x87, 0x22, 0xba, 0x18, 0xdc, 0x80, 0xcb, 0x67, 0x92, 0x4e, 0x8f, 0x6f, 0x40, 0x52, 0xc4, 0xf3, 0x96, 0x71, 0x9c, 0x90, 0xbc, 0x7d, 0x88, 0xee, 0x13, 0x75, 0x51, 0x36, 0xf7, 0xe5, 0x3c, 0x8f, 0xf1, 0xb0, 0x92, 0x9d, 0x7b, 0x4e, 0xe1, 0xbe, 0x5c, 0xa1, 0xcb, 0x30, 0x10, 0x60, 0xff, 0xb0, 0x95, 0xd2, 0x8c, 0x15, 0xe7, 0x6c, 0xc7, 0x7c, 0x7, 0x5a, 0xa0, 0x9d, 0x27, 0xf6, 0xc4, 0xa8, 0xf3, 0x3c, 0x14, 0x4b, 0x25, 0xbb, 0x0, 0x80, 0xd4, 0x71, 0x5b, 0xcf, 0x3a, 0xa4, 0xcd, 0xaf, 0xd7, 0xe9, 0xf1, 0x15, 0xb0, 0x94, 0xdd, 0x1d, 0xf5, 0x51, 0xd7, 0xd8, 0x33, 0x44, 0xf7, 0x88, 0x17, 0xaf, 0xb9, 0x6b, 0xc, 0x59, 0x8c, 0xc3, 0x24, 0x98, 0x12, 0x94, 0x20, 0xd0, 0xc4, 0x62, 0x2d, 0xa3, 0x31, 0xc2, 0x6a, 0x5d, 0x82, 0xbe, 0x3, 0xa7, 0xa9, 0xdb, 0xba, 0x83, 0x60, 0x9d, 0x5f, 0xa4, 0x7b, 0xc8, 0x6f, 0x98, 0x4a, 0xeb, 0xd7, 0x8d, 0x46, 0x95, 0x95, 0x95, 0xd7, 0x16, 0x35, 0x68, 0xd0, 0x40, 0xc9, 0x2e, 0x58, 0xa0, 0xb3, 0x84, 0xad, 0x33, 0xf7, 0x7c, 0x51, 0x17, 0x66, 0x10, 0x80, 0x1b, 0xd3, 0x76, 0x34, 0x4b, 0xbf, 0x90, 0xdf, 0x37, 0xda, 0xb7, 0x3d, 0x1d, 0xa1, 0x79, 0xb6, 0x95, 0x4a, 0x20, 0x76, 0x54, 0xa6, 0x4b, 0xd0, 0x77, 0xa0, 0x2b, 0x88, 0xed, 0x0, 0x63, 0xc4, 0xa8, 0x27, 0xea, 0xf4, 0x6c, 0x2, 0x34, 0x86, 0x9e, 0xe6, 0x1e, 0x34, 0x44, 0xd7, 0xef, 0x8d, 0xd1, 0x1f, 0xf4, 0x56, 0xb2, 0xb, 0x16, 0xa7, 0x79, 0x58, 0x75, 0x88, 0xcb, 0xac, 0xd2, 0xe9, 0xf1, 0x1d, 0x65, 0x1e, 0x64, 0xb7, 0xaf, 0x84, 0x2b, 0x6e, 0xe7, 0x26, 0x89, 0x2b, 0x23, 0x46, 0x14, 0x4d, 0x2c, 0x63, 0x68, 0xdd, 0x56, 0xaa, 0x4b, 0xd0, 0x57, 0x20, 0x2e, 0x3a, 0xc0, 0x32, 0x3e, 0x4f, 0xa2, 0x11, 0xdb, 0xcd, 0x36, 0xb0, 0xa7, 0x5e, 0xef, 0x1e, 0x2c, 0x28, 0x28, 0x28, 0x9c, 0x38, 0x6d, 0xe6, 0x25, 0xd3, 0x67, 0xcf, 0x4d, 0x28, 0xd9, 0x5, 0x3, 0xd4, 0x20, 0x5d, 0x61, 0x19, 0x9f, 0x2d, 0xb9, 0xeb, 0xa7, 0x97, 0xf, 0x40, 0x92, 0x84, 0xdb, 0xb5, 0x83, 0x73, 0xc7, 0x3a, 0x87, 0xf4, 0x7e, 0xd1, 0xc8, 0x77, 0x42, 0xc4, 0xe6, 0xd8, 0xd6, 0xa2, 0x6d, 0xb5, 0xf8, 0x7b, 0x26, 0xa3, 0xc2, 0x51, 0x96, 0xb7, 0xb1, 0x8c, 0xa3, 0x65, 0xd9, 0x12, 0x9d, 0x1e, 0x2b, 0x70, 0xca, 0xc3, 0x26, 0x8d, 0xee, 0x13, 0x86, 0xe2, 0x4a, 0x4a, 0x4b, 0xfb, 0xbe, 0xfc, 0xf6, 0x7b, 0x87, 0x54, 0x54, 0x54, 0x28, 0xd9, 0xf9, 0xc, 0x68, 0x10, 0xe8, 0x64, 0x60, 0x3b, 0x1d, 0xfc, 0x1f, 0xe2, 0x7d, 0xa, 0xaf, 0xa2, 0xee, 0x98, 0x60, 0xd9, 0x8, 0x90, 0xcd, 0xb6, 0x4b, 0x8, 0xef, 0x15, 0xa7, 0x17, 0xdc, 0x11, 0x13, 0x92, 0x80, 0x15, 0x52, 0xac, 0xcb, 0xcf, 0x37, 0x6c, 0xee, 0x61, 0xd5, 0xa1, 0x98, 0xfa, 0x5e, 0x9d, 0x1e, 0x4f, 0xa0, 0x51, 0xc7, 0xad, 0x6e, 0x2f, 0x43, 0xe3, 0x46, 0xd, 0x65, 0xfc, 0xa4, 0xa9, 0x83, 0xbf, 0x9e, 0x3a, 0xa3, 0xbe, 0x92, 0x9d, 0xbf, 0x40, 0xab, 0xaa, 0xd3, 0x2d, 0xe3, 0xef, 0x1b, 0x79, 0x56, 0xa7, 0x27, 0x70, 0x2, 0x59, 0x60, 0x51, 0x3e, 0xc2, 0x48, 0x76, 0x6f, 0x89, 0xbf, 0x27, 0x5e, 0x64, 0x53, 0x99, 0x73, 0xa3, 0xbe, 0x2e, 0x3d, 0x5f, 0x81, 0x63, 0x93, 0x6c, 0xb1, 0xd1, 0x7f, 0x4b, 0xb8, 0x8e, 0x78, 0xa, 0x23, 0x50, 0x86, 0x30, 0xae, 0xa, 0xb, 0x96, 0x57, 0xf4, 0x5a, 0xb7, 0x7e, 0x43, 0x77, 0x25, 0x3b, 0xff, 0x80, 0xb6, 0x60, 0x23, 0x2c, 0xf3, 0x88, 0xf4, 0xd8, 0x28, 0x9e, 0xd8, 0x1c, 0x45, 0x4c, 0xb3, 0x8c, 0x6d, 0x1b, 0xb2, 0x7b, 0x44, 0xbd, 0xdd, 0xdd, 0x11, 0x9d, 0x5f, 0x9b, 0x67, 0x2, 0x87, 0xb7, 0x36, 0xd6, 0xa5, 0xe7, 0xb, 0x10, 0x5f, 0x3e, 0xd6, 0x32, 0x8e, 0xc2, 0xf1, 0xa7, 0x74, 0x7a, 0xaa, 0x5, 0xc2, 0x18, 0x55, 0x4a, 0x32, 0x8a, 0x8b, 0x8b, 0x1a, 0xff, 0xe7, 0xc5, 0xd7, 0x8f, 0x57, 0xb2, 0xf3, 0x7, 0x88, 0xd, 0x3d, 0x6c, 0x64, 0x2b, 0xcb, 0x35, 0xb8, 0xab, 0xbe, 0xd4, 0x29, 0xca, 0xa, 0x6c, 0xf5, 0x8b, 0x88, 0xa1, 0x16, 0x86, 0xe8, 0x1e, 0xdf, 0x95, 0xe8, 0xc5, 0xea, 0x92, 0xb0, 0xc5, 0x8b, 0x60, 0x85, 0x34, 0xd5, 0xa5, 0xe7, 0xb, 0xe0, 0x85, 0xe8, 0x65, 0x19, 0x7f, 0x43, 0xbc, 0x4f, 0xec, 0x56, 0x6c, 0x8a, 0x57, 0xdc, 0x73, 0x55, 0x2f, 0x91, 0x90, 0x1f, 0x57, 0xae, 0x3a, 0xe9, 0xb5, 0x51, 0x63, 0x37, 0x53, 0xb2, 0xab, 0x1b, 0x50, 0x3b, 0x5, 0x17, 0xe5, 0x9e, 0x96, 0x6b, 0x1f, 0x89, 0x73, 0x7c, 0xbc, 0x22, 0x3b, 0xb0, 0x6d, 0x8, 0xcd, 0xc4, 0x69, 0xdb, 0x16, 0x6, 0x20, 0xae, 0xf0, 0x5f, 0x89, 0x6e, 0xaa, 0x3e, 0xba, 0xce, 0x2f, 0x75, 0x8d, 0x41, 0x91, 0xe8, 0xa9, 0x4b, 0xcf, 0x17, 0xf4, 0x11, 0x7b, 0xf6, 0xf0, 0x23, 0x3a, 0x35, 0x19, 0x3, 0x2d, 0x4, 0x1f, 0x4b, 0x1d, 0x48, 0x18, 0xb2, 0x2b, 0x29, 0x29, 0x6d, 0x3d, 0x67, 0xfe, 0xb7, 0x7d, 0x95, 0xec, 0x6a, 0x8f, 0x2d, 0xb8, 0x79, 0x1d, 0x6c, 0xb9, 0x86, 0xae, 0xfc, 0xe8, 0xbe, 0x5f, 0xa2, 0xd3, 0x94, 0x35, 0xd8, 0x3a, 0xa1, 0xb7, 0xe, 0x91, 0xe5, 0x1, 0xcb, 0xe8, 0xf5, 0x8, 0xcf, 0xef, 0x4f, 0x1e, 0x73, 0xfc, 0x47, 0x5d, 0x7a, 0xbe, 0xe0, 0x78, 0xcb, 0xd8, 0x78, 0x8a, 0x22, 0x73, 0xe0, 0x1d, 0xdb, 0xa4, 0xd1, 0x41, 0xc3, 0xe2, 0x6, 0x32, 0x7d, 0xf6, 0xdc, 0xa3, 0xd, 0xe1, 0x29, 0xd9, 0xd5, 0x2, 0xb0, 0x18, 0x9e, 0xf7, 0x20, 0x3a, 0x10, 0xdc, 0x99, 0x62, 0x8f, 0x21, 0x29, 0x82, 0xc3, 0x5a, 0x8b, 0x72, 0x1, 0xa2, 0x6b, 0x10, 0x92, 0xfb, 0x1b, 0x49, 0xc2, 0x88, 0x2a, 0x56, 0x79, 0x6c, 0xbc, 0xb0, 0x48, 0x3a, 0xea, 0xf2, 0xab, 0x13, 0x76, 0x12, 0xfb, 0x39, 0x8c, 0x50, 0xa6, 0xb5, 0x8e, 0xb1, 0x66, 0xc0, 0xc9, 0x21, 0x9b, 0x84, 0xa, 0xa, 0xa, 0xa, 0x64, 0xc9, 0xd2, 0xe5, 0xfb, 0x2d, 0x5f, 0xf1, 0x53, 0x1b, 0x25, 0xbb, 0x9a, 0x1, 0xbe, 0xf5, 0xb7, 0x3c, 0x88, 0xe, 0x18, 0x2c, 0xe1, 0xef, 0x60, 0x1f, 0x47, 0xa0, 0x95, 0x92, 0x3b, 0x89, 0x2, 0xae, 0xc3, 0xb0, 0xa4, 0xf8, 0xc7, 0x21, 0x23, 0x77, 0xb4, 0x65, 0x3e, 0xe1, 0xca, 0xbf, 0x5c, 0x97, 0x5f, 0x9d, 0x80, 0x73, 0x2, 0xdd, 0xee, 0x76, 0xf4, 0x7c, 0xd4, 0xa3, 0xc0, 0x6a, 0xe, 0x24, 0xaa, 0x8c, 0x4a, 0x1d, 0xa8, 0xac, 0xac, 0x34, 0x84, 0x57, 0xbf, 0x5d, 0x79, 0x45, 0xc5, 0xee, 0x4a, 0x76, 0x35, 0x73, 0x35, 0xe0, 0x85, 0xef, 0xe1, 0x71, 0x1d, 0x7, 0x73, 0x3e, 0xa0, 0xd3, 0x94, 0x33, 0x94, 0xbb, 0xfe, 0x8d, 0x1a, 0xb0, 0x30, 0x74, 0x51, 0x81, 0xff, 0x64, 0x72, 0xc, 0xe6, 0xf7, 0x1d, 0x23, 0x73, 0x2d, 0xe3, 0x67, 0x88, 0x93, 0x36, 0xaf, 0xa8, 0x1d, 0xd0, 0x71, 0xc9, 0x5d, 0xda, 0x31, 0x4f, 0xc2, 0x7f, 0xbe, 0x61, 0x58, 0xf1, 0x86, 0x5b, 0x29, 0x6b, 0x58, 0x5c, 0x54, 0xef, 0xc9, 0x17, 0x5e, 0xdb, 0x7f, 0x43, 0x49, 0x89, 0x92, 0x5d, 0x35, 0xc0, 0xf9, 0x48, 0x48, 0x19, 0x47, 0x2f, 0xc3, 0x6d, 0x3c, 0x3e, 0x73, 0x83, 0x38, 0x8d, 0x7d, 0x15, 0xb9, 0x83, 0x7b, 0xc3, 0x40, 0x6, 0x56, 0x93, 0x10, 0xdc, 0xd7, 0xa7, 0x12, 0x8f, 0x3, 0x4e, 0x51, 0x4a, 0x73, 0xbf, 0xc7, 0xb5, 0xfb, 0x8c, 0x1c, 0xa6, 0x4b, 0xb0, 0xc6, 0x40, 0x48, 0xa4, 0x8b, 0x65, 0x1c, 0x56, 0x9d, 0x36, 0xd9, 0xae, 0x1d, 0x10, 0x42, 0x9a, 0xed, 0x1e, 0x2c, 0x2d, 0x2b, 0x3b, 0xa0, 0x41, 0x61, 0x61, 0x42, 0xc9, 0xce, 0xe, 0x6c, 0x94, 0x28, 0x14, 0x47, 0x3b, 0xaa, 0x41, 0x46, 0xa, 0x2c, 0x9f, 0x41, 0x76, 0x1d, 0x8e, 0xe3, 0xb8, 0x5a, 0xa7, 0x2b, 0x94, 0xa8, 0xc, 0xc1, 0x3d, 0x6c, 0x8, 0xc9, 0x7d, 0xf8, 0x81, 0xc7, 0xc4, 0x1e, 0x8f, 0xc6, 0xa6, 0x8d, 0x18, 0xd3, 0xa9, 0xba, 0xe4, 0x6a, 0x84, 0x76, 0x46, 0x3a, 0x59, 0xc6, 0xc7, 0xe8, 0xd4, 0xd4, 0x1a, 0x25, 0xee, 0xf9, 0xfb, 0x35, 0x2b, 0xb3, 0xb4, 0xb4, 0xfb, 0xec, 0x79, 0xb, 0x5a, 0x28, 0xd9, 0x6d, 0x8a, 0x86, 0xe2, 0xb4, 0xed, 0x81, 0xcb, 0x12, 0xa9, 0xbf, 0x3b, 0x78, 0x7c, 0xe, 0xda, 0xfa, 0x49, 0xd4, 0x6a, 0x15, 0xa, 0x2f, 0xc4, 0xe9, 0xfd, 0x5a, 0x2e, 0xce, 0xe1, 0x98, 0xb6, 0x12, 0x8a, 0xcd, 0xf8, 0xbe, 0xa0, 0x13, 0x7d, 0x2b, 0x7d, 0xec, 0x19, 0x61, 0x3b, 0xee, 0x37, 0x6e, 0x5, 0x4d, 0xeb, 0x73, 0xeb, 0x86, 0x8f, 0xdd, 0x64, 0xf7, 0xcb, 0x2f, 0x6b, 0x8b, 0x47, 0x8e, 0xf9, 0x68, 0x8f, 0x7a, 0x21, 0xd6, 0x8a, 0xb3, 0x5, 0xbc, 0xa8, 0xbd, 0xc4, 0xe9, 0x63, 0x9, 0x5f, 0xf9, 0xa3, 0x46, 0xf6, 0x49, 0xf3, 0xf9, 0x2f, 0x8c, 0x1c, 0x22, 0x7a, 0x6c, 0x8f, 0x22, 0xff, 0x80, 0xf4, 0xee, 0x6b, 0x3d, 0xae, 0xa1, 0x85, 0xd8, 0x5, 0xdc, 0xac, 0x71, 0x54, 0x4d, 0x6b, 0x9d, 0xae, 0xb4, 0xb0, 0x35, 0x2b, 0x47, 0x7c, 0x57, 0x9b, 0x3e, 0xd7, 0xd, 0xd3, 0xc5, 0x75, 0xb0, 0x2b, 0x8, 0xaf, 0xb8, 0xa8, 0xa8, 0x73, 0x41, 0x9a, 0x85, 0x8b, 0x6b, 0x89, 0x18, 0x4d, 0x42, 0x25, 0xbf, 0x53, 0x63, 0xba, 0xf, 0xba, 0x89, 0x73, 0x1c, 0xc, 0xfe, 0xbe, 0x67, 0x6, 0xdf, 0x15, 0x49, 0x10, 0x77, 0x8a, 0xd3, 0xf4, 0x79, 0xa5, 0xae, 0x29, 0x45, 0x9e, 0x2, 0xd, 0x13, 0xd0, 0x35, 0xe8, 0xaf, 0x69, 0x2c, 0x96, 0x7b, 0x48, 0x78, 0xaf, 0x89, 0xe3, 0xfe, 0x9c, 0x91, 0x67, 0xa, 0x74, 0x26, 0xb0, 0x95, 0x1c, 0xe0, 0x50, 0x52, 0x3d, 0xa0, 0xb5, 0x6e, 0x40, 0xad, 0xf3, 0x42, 0x71, 0xb9, 0x88, 0xcb, 0xca, 0xcb, 0x3d, 0xc9, 0xe, 0xf1, 0x2a, 0xa4, 0xd8, 0xc7, 0xc9, 0xd, 0x53, 0xc9, 0x97, 0x14, 0x49, 0x27, 0x45, 0x52, 0xb3, 0x66, 0xb6, 0x63, 0xc5, 0xc9, 0xb8, 0x1c, 0x9b, 0xa7, 0xb, 0x8, 0xf3, 0x85, 0x62, 0xfa, 0x86, 0x29, 0xf3, 0x57, 0xc9, 0xf5, 0xd1, 0x82, 0x73, 0x89, 0xf8, 0xd4, 0xa, 0xd7, 0x7c, 0xe3, 0xdf, 0xf0, 0xa3, 0xaf, 0xa1, 0x82, 0xa0, 0xc5, 0xf6, 0xd1, 0x47, 0x5, 0x2d, 0xb8, 0xf9, 0x7c, 0x27, 0xbc, 0x8a, 0xf7, 0x3b, 0x51, 0x40, 0x8a, 0xef, 0x19, 0x79, 0xc9, 0xc8, 0x67, 0xa2, 0x99, 0x86, 0x49, 0xd8, 0x1a, 0x3f, 0xcf, 0x54, 0xa5, 0xa0, 0xce, 0x58, 0x4a, 0xc2, 0xfb, 0x8d, 0xec, 0x1a, 0x35, 0x2c, 0x96, 0xcf, 0x27, 0x4c, 0xda, 0xda, 0x8b, 0xec, 0xb6, 0xa6, 0xe4, 0x3b, 0x92, 0xc7, 0xbf, 0x3f, 0x9d, 0x27, 0x1b, 0x35, 0xda, 0x40, 0xc1, 0xad, 0xbb, 0x87, 0x38, 0x6e, 0x96, 0x5d, 0xb8, 0xe, 0x70, 0x7a, 0x72, 0x33, 0x17, 0xd9, 0x55, 0x90, 0xec, 0x52, 0x8b, 0xb7, 0x93, 0x5a, 0x69, 0xc2, 0x45, 0x76, 0x70, 0x2b, 0xa0, 0x38, 0x19, 0x59, 0x7d, 0xc8, 0x34, 0x43, 0x8b, 0xaf, 0x6f, 0x29, 0xd8, 0x34, 0xe7, 0xf0, 0x73, 0x7a, 0xfa, 0x75, 0x74, 0x80, 0x6, 0xe8, 0xe3, 0xf8, 0x7e, 0xf4, 0x48, 0xf3, 0x39, 0x94, 0x81, 0xf4, 0xa7, 0x2c, 0xe3, 0xff, 0x41, 0x5c, 0xe5, 0x4d, 0x5a, 0x7c, 0xf9, 0xda, 0x2c, 0x7d, 0x7b, 0xf, 0xb2, 0x53, 0xd4, 0x1d, 0xdf, 0x18, 0xe9, 0xeb, 0xb2, 0xec, 0x5a, 0x16, 0xe8, 0xbc, 0x54, 0x1, 0x36, 0x5d, 0xf4, 0xb7, 0x7c, 0x88, 0xda, 0x68, 0xdc, 0xdd, 0xa, 0x70, 0xa7, 0xec, 0x26, 0x4e, 0xaf, 0x43, 0xd4, 0xfd, 0x20, 0x29, 0xa7, 0x71, 0x2d, 0xad, 0x7a, 0xf7, 0x19, 0x67, 0xdb, 0x64, 0xf0, 0x7f, 0x4a, 0x49, 0x80, 0x58, 0xa0, 0x13, 0xc5, 0xa9, 0xe7, 0x9a, 0x4c, 0x57, 0xc4, 0x7c, 0xd1, 0x53, 0xde, 0xc3, 0xc, 0xbc, 0x27, 0xbd, 0x8d, 0x5c, 0x22, 0x4e, 0xf7, 0xa0, 0xed, 0xab, 0xf9, 0x3c, 0x92, 0x57, 0xe, 0xa7, 0x5c, 0xc7, 0xe7, 0x8b, 0x42, 0xe0, 0x4f, 0x48, 0x7c, 0x33, 0xe8, 0x5, 0x88, 0x3b, 0xa0, 0x30, 0x36, 0xb1, 0xec, 0x3b, 0x7a, 0xf6, 0xa5, 0x3f, 0xa8, 0x52, 0x13, 0x9a, 0x48, 0x24, 0x36, 0x57, 0xb2, 0xdb, 0xb8, 0xd0, 0x90, 0x56, 0x8d, 0x93, 0x6f, 0xdf, 0xa7, 0xe6, 0x19, 0x57, 0x77, 0x2, 0x48, 0xac, 0x83, 0x91, 0xa3, 0x8d, 0x1c, 0x6a, 0x64, 0x57, 0x5a, 0x6e, 0xb9, 0xb4, 0x26, 0xb7, 0xa4, 0xec, 0x9d, 0x32, 0xe, 0xab, 0x70, 0x1e, 0x5, 0xee, 0xaf, 0xb1, 0x7c, 0x46, 0xeb, 0x74, 0xb9, 0x86, 0xa, 0x78, 0x1e, 0x48, 0xee, 0x42, 0xf9, 0x1, 0xce, 0x76, 0x1c, 0x28, 0x76, 0x17, 0x9d, 0xed, 0xb9, 0xef, 0x44, 0x39, 0x8f, 0x4a, 0xcd, 0xc, 0x3e, 0x63, 0xbc, 0x7f, 0x1f, 0x50, 0xe1, 0x89, 0xa3, 0xb2, 0x89, 0xee, 0x33, 0xee, 0xbd, 0x17, 0xdf, 0x7f, 0xb9, 0x2e, 0x27, 0x5f, 0x30, 0xdf, 0x32, 0xb6, 0x59, 0xbe, 0x91, 0x1d, 0x5c, 0x26, 0x70, 0xa5, 0xe1, 0x40, 0xc4, 0xa5, 0xdc, 0x48, 0x91, 0x3d, 0x86, 0xda, 0x8c, 0xd9, 0x12, 0xef, 0x7e, 0x74, 0xdb, 0xd0, 0xb4, 0x3f, 0xc5, 0xc8, 0xef, 0x24, 0x1c, 0x1d, 0x46, 0xd2, 0x21, 0x49, 0x80, 0x7b, 0x19, 0x39, 0x8e, 0xcf, 0x6, 0x9a, 0xef, 0x48, 0x12, 0xdf, 0x24, 0x5a, 0x82, 0x3f, 0x8b, 0xc6, 0x39, 0xc2, 0x80, 0x39, 0x24, 0xbd, 0xbb, 0x8c, 0x1c, 0x43, 0xe2, 0x43, 0x56, 0x73, 0xb3, 0xc, 0xff, 0x3f, 0x4e, 0xeb, 0xee, 0x41, 0x39, 0x9d, 0xef, 0xea, 0x12, 0x3e, 0xeb, 0xf, 0x69, 0xf9, 0xcf, 0x90, 0xaa, 0x27, 0x30, 0x44, 0x11, 0xb0, 0xea, 0xdc, 0x39, 0x3, 0x3f, 0xc7, 0xe4, 0xbb, 0x85, 0x1, 0xf3, 0xb8, 0x5f, 0xa4, 0x1e, 0xf3, 0xd5, 0xc8, 0x8b, 0xec, 0x5e, 0xa0, 0xa6, 0x16, 0x27, 0xac, 0xe5, 0x82, 0x4a, 0x92, 0xdd, 0xf7, 0x12, 0x9e, 0xfe, 0x89, 0x41, 0x2, 0xae, 0xa5, 0xb3, 0xb9, 0x1, 0xd5, 0xe5, 0x4, 0xef, 0x52, 0x4a, 0x32, 0x16, 0xb7, 0x58, 0xec, 0x49, 0x3e, 0xb8, 0x8e, 0x7e, 0x7f, 0xdb, 0x52, 0x7b, 0xad, 0xc7, 0x3f, 0xeb, 0x4b, 0xdd, 0x12, 0x9e, 0xa, 0x49, 0xd8, 0x7f, 0xa1, 0xac, 0xa0, 0xc5, 0x87, 0x26, 0xc5, 0xd, 0xf5, 0xfd, 0xe, 0xd, 0xf0, 0x7e, 0x3d, 0x46, 0x41, 0xec, 0xb7, 0x27, 0xd7, 0xde, 0x7e, 0x35, 0x7c, 0x4e, 0x50, 0xc6, 0xda, 0x89, 0x53, 0xf7, 0xa, 0x41, 0x36, 0xf4, 0x4c, 0x92, 0xea, 0x44, 0x92, 0xe0, 0x4, 0x5a, 0x44, 0x51, 0x53, 0x76, 0x90, 0xb1, 0x5a, 0x6c, 0xb1, 0x90, 0xb1, 0x1f, 0xe9, 0xa1, 0xb8, 0x75, 0xc7, 0x1a, 0xae, 0x97, 0x54, 0xb2, 0xdb, 0xc2, 0x8b, 0xec, 0xbe, 0x36, 0xf2, 0xa2, 0xce, 0x59, 0xa4, 0x81, 0xc4, 0x12, 0xc4, 0x51, 0x2e, 0x12, 0x27, 0x93, 0x32, 0x53, 0x20, 0x6b, 0x72, 0x1, 0x5d, 0x1, 0xb, 0x68, 0xf1, 0x22, 0x91, 0x64, 0x91, 0x38, 0x6e, 0xa5, 0xe4, 0x42, 0x42, 0x32, 0x49, 0xc2, 0x83, 0xec, 0xea, 0xa5, 0x2c, 0xb4, 0x26, 0x24, 0x3e, 0x64, 0xed, 0xa1, 0xfb, 0xf8, 0x56, 0xdc, 0xc4, 0xf0, 0xc2, 0xa3, 0x16, 0xab, 0x25, 0xc7, 0x8b, 0x6b, 0x61, 0xf9, 0x25, 0x13, 0x1f, 0x14, 0xe1, 0xc4, 0x57, 0x94, 0x7b, 0xb9, 0x1e, 0xf1, 0xac, 0x10, 0xe3, 0xeb, 0x4a, 0xc5, 0xab, 0x26, 0x9e, 0x25, 0x28, 0x4b, 0x9d, 0x29, 0x47, 0x1a, 0xb9, 0x4a, 0x9c, 0xd3, 0x24, 0xd0, 0xe5, 0xe8, 0x7d, 0x12, 0xdf, 0x2c, 0xb1, 0x1f, 0x47, 0x14, 0x36, 0x94, 0x5b, 0x8, 0x1a, 0xdf, 0x6b, 0xae, 0x2e, 0x19, 0x5f, 0x50, 0x29, 0x16, 0xcf, 0x95, 0xd7, 0x62, 0x2b, 0xd6, 0xf9, 0x8a, 0x34, 0xe0, 0xaa, 0x1c, 0x2a, 0xf6, 0x76, 0x44, 0x36, 0x8b, 0xd, 0xee, 0x21, 0xb8, 0x72, 0x3f, 0xe0, 0xb, 0xb7, 0x40, 0x36, 0x2d, 0x23, 0xa8, 0xd, 0x4a, 0x52, 0xb4, 0x2c, 0x2f, 0xf7, 0x4c, 0xa3, 0x14, 0xb2, 0x83, 0xd5, 0x86, 0x44, 0x19, 0x74, 0x28, 0xef, 0x2e, 0x4e, 0x10, 0xbf, 0x50, 0x1f, 0x65, 0x2c, 0x50, 0x41, 0x65, 0xe9, 0x41, 0x4a, 0x4b, 0xae, 0x4d, 0x3c, 0x6f, 0x34, 0x68, 0x40, 0xbd, 0x6b, 0xb3, 0x1a, 0x92, 0x1f, 0x14, 0xaa, 0xe6, 0x2e, 0x85, 0x7, 0xae, 0x4e, 0x14, 0x15, 0x23, 0xe6, 0x87, 0xd3, 0xe1, 0x91, 0xe8, 0x14, 0x95, 0x6c, 0xcf, 0x7a, 0x6a, 0xd5, 0x5, 0xb, 0x4d, 0x50, 0x89, 0x17, 0x60, 0x2d, 0xdd, 0x40, 0xb2, 0xab, 0x6e, 0xf3, 0x41, 0x6, 0x1c, 0x62, 0x21, 0x38, 0x9f, 0x6f, 0xaa, 0xe4, 0xa6, 0xb4, 0x62, 0x2d, 0x89, 0x35, 0x79, 0xda, 0xf8, 0xb, 0xfc, 0x13, 0xee, 0x2e, 0x24, 0x2e, 0xf4, 0x12, 0xc7, 0xd, 0x6, 0xad, 0xb7, 0x8b, 0xe8, 0x29, 0x1d, 0x71, 0xc1, 0xf, 0x14, 0x28, 0x57, 0xf7, 0xd0, 0xea, 0x7, 0xf9, 0xfd, 0x5e, 0x1c, 0x77, 0x27, 0xce, 0xc9, 0xdb, 0x41, 0x6a, 0x7e, 0xda, 0xfc, 0x8e, 0x94, 0x23, 0x8c, 0x5c, 0x2f, 0x4e, 0xec, 0xe6, 0x15, 0x92, 0xdf, 0x67, 0xa2, 0x31, 0x31, 0x25, 0x3b, 0x45, 0x2c, 0x80, 0xce, 0xf3, 0x48, 0xe, 0xe8, 0x50, 0xd, 0xb9, 0x3c, 0x45, 0xf9, 0x44, 0xc2, 0x9b, 0x90, 0x83, 0xf8, 0xc5, 0x24, 0xca, 0x5d, 0xb4, 0x4, 0x40, 0x76, 0xfb, 0xf3, 0x7b, 0x22, 0x6b, 0xb3, 0x81, 0x3e, 0xf2, 0xd8, 0x0, 0xa5, 0x27, 0x5f, 0x50, 0x80, 0x56, 0x24, 0xbb, 0xce, 0xb4, 0xfa, 0x90, 0xe8, 0x2, 0xb7, 0x67, 0x4d, 0x92, 0xaa, 0xa, 0x49, 0x9a, 0x97, 0x51, 0x90, 0xe5, 0x39, 0x8e, 0xa, 0xd5, 0x58, 0x71, 0xb5, 0x94, 0xca, 0x81, 0x15, 0x97, 0xd0, 0xc7, 0xae, 0x64, 0xa7, 0xa8, 0x39, 0xd0, 0xa5, 0xe2, 0x16, 0xf1, 0x76, 0x3f, 0x23, 0xa5, 0x19, 0x8d, 0x7a, 0x11, 0x3b, 0x99, 0x1f, 0x51, 0x4b, 0x60, 0x2c, 0xe5, 0x66, 0x6e, 0x62, 0x28, 0x9d, 0xe8, 0xc7, 0xcd, 0x50, 0xdd, 0x9d, 0xf1, 0xc2, 0x32, 0xca, 0x67, 0x5c, 0xb7, 0x78, 0xbe, 0x6d, 0xa9, 0xe4, 0xe0, 0x79, 0xef, 0x46, 0x4b, 0x70, 0xab, 0x1a, 0xfc, 0xcc, 0x64, 0xbc, 0xef, 0x34, 0x7a, 0x12, 0x90, 0x80, 0xf7, 0x32, 0x7f, 0x47, 0x2e, 0x3c, 0x1a, 0xe5, 0x2e, 0x4f, 0x5, 0xe2, 0x4c, 0x1b, 0xf4, 0xd1, 0xd7, 0xd, 0xe8, 0x83, 0xb9, 0x6e, 0xfd, 0x6, 0x29, 0x2f, 0xdf, 0xe4, 0x88, 0x4b, 0xc4, 0x7b, 0x57, 0x2a, 0xd9, 0x45, 0x1f, 0x68, 0xcc, 0x3b, 0x2c, 0xcd, 0x75, 0x58, 0x71, 0xb7, 0xd2, 0x4a, 0x8a, 0x3, 0xb0, 0x8a, 0xa7, 0x53, 0xf0, 0xbd, 0x10, 0xaf, 0x79, 0x58, 0x9c, 0x18, 0x9f, 0x22, 0x9e, 0x80, 0x7, 0x62, 0xe, 0xe5, 0x19, 0x92, 0xc4, 0x2e, 0x54, 0x7a, 0x50, 0xaa, 0x70, 0x8, 0x2d, 0xff, 0x4c, 0x2d, 0x3f, 0x10, 0x27, 0x4e, 0x70, 0x18, 0x2c, 0x4e, 0x6c, 0xf, 0xeb, 0xe7, 0xd, 0xa9, 0x7a, 0x8, 0x70, 0x50, 0x40, 0xfc, 0x72, 0xbd, 0x4b, 0x49, 0x83, 0xcb, 0xf5, 0x6c, 0x12, 0xa1, 0xa2, 0x96, 0x58, 0x6f, 0x88, 0xee, 0x98, 0xc3, 0xfa, 0x48, 0x87, 0xf6, 0x6d, 0xdd, 0x96, 0xb4, 0x92, 0x5d, 0xc4, 0x81, 0xb8, 0xc4, 0xdf, 0x3c, 0xae, 0xc1, 0x82, 0xbb, 0x9a, 0x64, 0x17, 0x57, 0x20, 0x23, 0x14, 0x7d, 0x17, 0xd7, 0x28, 0xd9, 0xe5, 0x15, 0x10, 0x73, 0x9e, 0x46, 0x81, 0x75, 0x76, 0x8d, 0x38, 0x25, 0x36, 0x7, 0x18, 0xe9, 0x43, 0xcb, 0x6f, 0xb7, 0xc, 0x7e, 0xe, 0x62, 0x82, 0x47, 0x52, 0xe0, 0x35, 0x18, 0x2e, 0x4e, 0xf3, 0xea, 0xc0, 0xf7, 0x64, 0xa9, 0x9a, 0x8d, 0x9, 0xeb, 0x3, 0x9, 0x35, 0x1a, 0x57, 0xac, 0x8b, 0x56, 0x54, 0x56, 0x26, 0x5d, 0x3a, 0x76, 0x90, 0x6e, 0x5d, 0x76, 0xae, 0x72, 0x4d, 0x3, 0xfe, 0xd1, 0xc5, 0xe0, 0x34, 0x44, 0x7, 0x2d, 0xf5, 0xa0, 0x98, 0x13, 0x5d, 0x12, 0x8d, 0x75, 0x1d, 0xeb, 0x1e, 0x27, 0x4e, 0x26, 0xe6, 0x63, 0xe2, 0x24, 0x67, 0x61, 0xed, 0xa3, 0x81, 0x2, 0x8a, 0xdc, 0x67, 0x65, 0x68, 0xb1, 0xf5, 0x12, 0x27, 0x99, 0xe5, 0x79, 0x5a, 0x8c, 0x41, 0x2, 0x8d, 0x8a, 0xdd, 0x2e, 0x4b, 0x94, 0xd2, 0xb4, 0xd7, 0x47, 0x59, 0x37, 0xc0, 0x8d, 0xb9, 0xa1, 0xc4, 0x9e, 0x6b, 0xa7, 0x9b, 0x44, 0x34, 0x81, 0x6c, 0xb3, 0x5b, 0x3c, 0xae, 0xa1, 0xa7, 0xe7, 0x51, 0xe2, 0xb8, 0x45, 0x14, 0x8a, 0x7c, 0x4, 0x9a, 0x46, 0xbc, 0x4b, 0x65, 0x10, 0x47, 0x79, 0x1d, 0x28, 0x4e, 0xa2, 0xd3, 0xe4, 0xea, 0xf6, 0x4a, 0x71, 0xba, 0xf5, 0x20, 0x4b, 0xf9, 0x1c, 0x9, 0x2e, 0x89, 0x4, 0xbb, 0xf1, 0x32, 0xd7, 0x18, 0xea, 0x51, 0xf5, 0xc, 0xc0, 0x0, 0xa1, 0x64, 0x17, 0x3d, 0x20, 0x28, 0x8f, 0x74, 0x6d, 0x5b, 0x37, 0xa, 0x74, 0xa0, 0x3f, 0x57, 0xf4, 0xf4, 0x0, 0x85, 0x22, 0x9, 0xb8, 0xc, 0x51, 0x7a, 0x70, 0x1, 0x2d, 0x3e, 0xb4, 0x31, 0x7b, 0xb3, 0x1a, 0x6b, 0xf, 0xd9, 0xa0, 0xf7, 0x52, 0x82, 0x6a, 0xab, 0xb7, 0xc0, 0x42, 0xb4, 0x3b, 0xe8, 0xe3, 0x52, 0xb2, 0x53, 0x6c, 0x7c, 0x5e, 0xb0, 0xe8, 0x6c, 0x8d, 0x76, 0x9f, 0x14, 0x27, 0xc5, 0x5a, 0x89, 0x4e, 0xa1, 0xb0, 0x3, 0x59, 0xc9, 0xcf, 0x8a, 0xe3, 0x19, 0x41, 0x6c, 0xef, 0x25, 0x49, 0x5f, 0x5f, 0x7a, 0x36, 0x3f, 0x13, 0x44, 0xa3, 0xf4, 0x19, 0x96, 0xb1, 0x1d, 0xf5, 0x11, 0x29, 0xd9, 0x29, 0x1c, 0xa0, 0xd5, 0xd2, 0x9f, 0x2d, 0xe3, 0x68, 0x97, 0x74, 0x8e, 0x4e, 0x8f, 0x42, 0x91, 0x11, 0x2a, 0xf9, 0xce, 0xa0, 0x67, 0x27, 0xea, 0x36, 0xdf, 0x4b, 0xf3, 0x59, 0x5c, 0x7f, 0x24, 0x0, 0xb, 0xcf, 0x46, 0x76, 0x28, 0xa8, 0xd7, 0xee, 0x55, 0x4a, 0x76, 0x79, 0xf, 0xb8, 0x39, 0x2e, 0x97, 0xaa, 0xc5, 0xd4, 0x88, 0x4f, 0xe0, 0x88, 0x14, 0x4d, 0x59, 0x56, 0x28, 0x6a, 0xe, 0x10, 0x1d, 0x8e, 0xba, 0xba, 0x50, 0x9c, 0x5e, 0x9b, 0x36, 0xc0, 0x12, 0xbc, 0x55, 0xfc, 0x8d, 0xe1, 0x81, 0xec, 0xdc, 0xae, 0x54, 0x94, 0x4f, 0x68, 0x56, 0xb1, 0x92, 0x5d, 0xde, 0x3, 0xf1, 0x86, 0x43, 0x2c, 0xe3, 0xc8, 0x38, 0x9b, 0xa6, 0xd3, 0xa3, 0x50, 0xd4, 0x1a, 0x70, 0xfd, 0xdf, 0x69, 0xe4, 0xf, 0xe2, 0x7d, 0x5a, 0x38, 0x14, 0xca, 0xa3, 0x7c, 0xfc, 0x9d, 0x68, 0xaa, 0xbe, 0xd8, 0x35, 0x6, 0x45, 0xb6, 0x87, 0x3e, 0xe, 0x25, 0xbb, 0x7c, 0xc7, 0xf9, 0x96, 0x31, 0xf4, 0xb4, 0x7c, 0x5c, 0xa7, 0x46, 0xa1, 0xf0, 0x5, 0x48, 0x64, 0x39, 0xc6, 0x83, 0xf0, 0xa, 0xa8, 0x58, 0x36, 0xf5, 0xe9, 0x77, 0x2d, 0xf2, 0x50, 0x52, 0x7b, 0xeb, 0x63, 0x50, 0xb2, 0xcb, 0x67, 0xa0, 0x29, 0xf2, 0xfe, 0x96, 0x71, 0x94, 0x19, 0xfc, 0xa4, 0xd3, 0xa3, 0x50, 0xf8, 0x6, 0x10, 0x10, 0x8a, 0xcc, 0x97, 0x58, 0xae, 0xa1, 0xdd, 0xd8, 0xa9, 0x3e, 0xfd, 0x1e, 0xd4, 0x6, 0x7e, 0x65, 0x19, 0x47, 0x1f, 0x50, 0x8d, 0xdb, 0x29, 0xd9, 0xe5, 0x2d, 0x10, 0xb8, 0x6e, 0xe5, 0x1a, 0x43, 0xbf, 0xc8, 0x67, 0x74, 0x6a, 0x14, 0xa, 0xdf, 0x81, 0x42, 0xf4, 0x81, 0x62, 0x8f, 0x83, 0x23, 0x11, 0xcc, 0xaf, 0xc3, 0x82, 0xd1, 0x8c, 0xdd, 0x7d, 0x80, 0x34, 0x7a, 0x7e, 0xee, 0xae, 0x8f, 0x40, 0xc9, 0x2e, 0x5f, 0xb1, 0x97, 0x65, 0xc, 0xd9, 0x64, 0xda, 0x5a, 0x48, 0xa1, 0x8, 0x6, 0xa8, 0xc5, 0x7b, 0xc9, 0x32, 0x8e, 0xee, 0x2a, 0x7, 0xf8, 0xf4, 0x3b, 0xf0, 0xe, 0xbb, 0x3d, 0x33, 0x4d, 0x7c, 0xfc, 0xf9, 0xa, 0x25, 0xbb, 0x48, 0x1, 0x2e, 0x8d, 0xee, 0x96, 0xf1, 0x51, 0x3a, 0x35, 0xa, 0x45, 0xa0, 0xb8, 0x4d, 0x9c, 0xbe, 0xab, 0xa9, 0x40, 0x12, 0x49, 0x2f, 0x9f, 0x7e, 0xfe, 0xcf, 0x46, 0x46, 0x5b, 0xc6, 0x4f, 0x11, 0x3d, 0xc2, 0x4a, 0xc9, 0x2e, 0xf, 0x81, 0xde, 0x8f, 0xee, 0x33, 0xea, 0x90, 0xb2, 0xfc, 0xb5, 0x4e, 0x8d, 0x42, 0x11, 0x28, 0x26, 0x8a, 0xd3, 0x3a, 0xcc, 0x8d, 0x1e, 0x3e, 0x92, 0xd1, 0x2b, 0x96, 0xb1, 0xae, 0xe2, 0x1c, 0x5a, 0xac, 0x50, 0xb2, 0xcb, 0x3b, 0xcb, 0xce, 0x1d, 0xaf, 0x43, 0x5f, 0xbd, 0xe5, 0x3a, 0x35, 0xa, 0x45, 0xe0, 0x78, 0xce, 0x32, 0x86, 0x98, 0xda, 0x66, 0x3e, 0xfd, 0xfc, 0x31, 0x46, 0xe6, 0x5a, 0xc6, 0x4f, 0xd7, 0xa9, 0x57, 0xb2, 0xcb, 0x37, 0xd8, 0x5a, 0x83, 0x81, 0xec, 0x56, 0xeb, 0xd4, 0x28, 0x14, 0x81, 0x3, 0x19, 0x93, 0xa5, 0xae, 0x31, 0x9c, 0x50, 0xb0, 0xb9, 0x4f, 0x3f, 0x1f, 0x59, 0x9f, 0xef, 0x58, 0xc6, 0x51, 0xe8, 0xae, 0xed, 0xc3, 0x94, 0xec, 0xf2, 0xa, 0x8d, 0x3d, 0x9e, 0x5b, 0x42, 0xa7, 0x46, 0xa1, 0x8, 0x1c, 0xe8, 0x50, 0xb4, 0xd0, 0x32, 0xde, 0xce, 0xc7, 0xdf, 0x81, 0xa3, 0xb8, 0xdc, 0x59, 0x99, 0x68, 0xf8, 0xfe, 0x27, 0x9d, 0x7e, 0x25, 0xbb, 0x7c, 0x42, 0xa5, 0x4e, 0x81, 0x42, 0x91, 0x33, 0xac, 0x12, 0x7b, 0xd6, 0xb3, 0x9f, 0xca, 0x26, 0x4a, 0x10, 0x6c, 0xb1, 0x41, 0x9c, 0x60, 0xd2, 0x5c, 0x1f, 0x81, 0x92, 0x5d, 0xbe, 0xa0, 0xc4, 0x83, 0x0, 0x95, 0x4, 0x37, 0xce, 0x45, 0x85, 0x4e, 0x83, 0x22, 0x20, 0xfc, 0x62, 0x64, 0x45, 0xc0, 0xbf, 0x3, 0xeb, 0xf7, 0x7e, 0xcb, 0x78, 0x1b, 0x12, 0x9e, 0x42, 0xc9, 0x2e, 0x2f, 0xb0, 0xc0, 0x32, 0x6, 0xd7, 0x66, 0x91, 0x4e, 0xcd, 0xaf, 0x40, 0x81, 0x6f, 0x2b, 0x9d, 0x6, 0x45, 0xc0, 0xa, 0x55, 0xd0, 0x78, 0xd5, 0xc8, 0x78, 0xcb, 0xf8, 0x59, 0x46, 0xb6, 0xd7, 0x47, 0xa0, 0x64, 0x97, 0xf, 0x40, 0x17, 0x7, 0x77, 0xad, 0xcf, 0xd6, 0xe2, 0x4, 0xc9, 0x15, 0x4e, 0x9a, 0x76, 0x43, 0x9d, 0x6, 0x45, 0x40, 0x48, 0x64, 0x69, 0x9f, 0xc4, 0x3b, 0x7e, 0xa7, 0x65, 0x7c, 0x3b, 0x23, 0x97, 0xea, 0x63, 0x50, 0xb2, 0xcb, 0x7, 0xac, 0x33, 0xf2, 0x8d, 0x6b, 0xac, 0x91, 0x5a, 0x33, 0xbf, 0xe1, 0x8f, 0x3a, 0x5, 0x8a, 0x0, 0x81, 0xc6, 0xcf, 0xb6, 0xb8, 0x59, 0x10, 0xae, 0x73, 0x94, 0x39, 0x4c, 0xb4, 0x8c, 0xe3, 0x10, 0x59, 0x3d, 0xd, 0xa1, 0x2a, 0xba, 0x89, 0x93, 0xad, 0x9e, 0x11, 0x8f, 0x29, 0xd9, 0x45, 0x83, 0xec, 0xe6, 0x58, 0xc6, 0xf7, 0xd4, 0xa9, 0x91, 0xd6, 0xe2, 0x1c, 0xae, 0xa9, 0x50, 0x4, 0x85, 0x26, 0x16, 0xb2, 0x83, 0x5b, 0x73, 0x56, 0x0, 0xbf, 0x6b, 0x83, 0x91, 0x9b, 0xa5, 0xea, 0x39, 0x77, 0x28, 0x60, 0xbf, 0x4b, 0xfc, 0xab, 0xed, 0x8b, 0xcb, 0xbb, 0xff, 0x82, 0x38, 0xe7, 0x2, 0xbe, 0x6b, 0xe4, 0xa, 0xb1, 0x77, 0x9a, 0x52, 0xb2, 0x8b, 0x10, 0xb0, 0xf0, 0xa7, 0x5a, 0xc6, 0xf, 0xd5, 0xa9, 0xf9, 0x35, 0x9e, 0xd1, 0x46, 0xa7, 0x41, 0x11, 0xf0, 0xa6, 0xda, 0xde, 0x35, 0x86, 0xe3, 0x79, 0xd6, 0x4, 0xf4, 0xfb, 0x5e, 0x34, 0x32, 0xd2, 0x32, 0x8e, 0xd3, 0x10, 0x2e, 0xd6, 0xc7, 0xf1, 0x1b, 0xfe, 0x4f, 0x9c, 0xce, 0x52, 0x68, 0xba, 0x81, 0x63, 0x91, 0x6e, 0xe2, 0xbc, 0x15, 0x2b, 0xd9, 0x45, 0x1b, 0x68, 0xd, 0x56, 0x61, 0xb1, 0xec, 0xb6, 0xcd, 0xe3, 0x39, 0xc1, 0xa9, 0xce, 0x7f, 0xd5, 0xa5, 0xa1, 0x8, 0x18, 0xbb, 0x18, 0xa9, 0xef, 0x1a, 0x9b, 0x2c, 0x4e, 0x96, 0x66, 0x10, 0x40, 0x1, 0xfb, 0x95, 0x62, 0x6f, 0x1a, 0x31, 0xd4, 0xc8, 0xef, 0xf4, 0x91, 0xfc, 0x5a, 0x83, 0x78, 0xa5, 0x65, 0x1c, 0x46, 0x41, 0x99, 0x92, 0x5d, 0xb4, 0x31, 0x9e, 0xda, 0x64, 0x2a, 0xd0, 0xc1, 0xe1, 0xc8, 0x3c, 0x9d, 0xf, 0x24, 0xd, 0xdc, 0x2a, 0x5a, 0x83, 0xa4, 0x8, 0x1e, 0xfd, 0x3c, 0x94, 0xcf, 0xd2, 0x0, 0x7f, 0xe7, 0x24, 0x23, 0x77, 0x58, 0xc6, 0xe1, 0xce, 0xbc, 0xcf, 0xc8, 0x36, 0x79, 0xfe, 0x4c, 0xae, 0x15, 0x7b, 0xce, 0xc2, 0xbf, 0x94, 0xec, 0xa2, 0xf, 0x94, 0x1f, 0x7c, 0x62, 0xd9, 0xf0, 0x8f, 0x95, 0xfc, 0xec, 0x8e, 0x7e, 0x89, 0x91, 0xfe, 0xba, 0x2c, 0x14, 0x1, 0x63, 0x4b, 0xb, 0xd9, 0xc1, 0xc3, 0xf2, 0x65, 0x16, 0x7e, 0xf7, 0x70, 0xb1, 0x17, 0x9a, 0xc3, 0xa3, 0x71, 0xaf, 0xe4, 0x6f, 0xe9, 0x11, 0x14, 0xfc, 0xb3, 0x2c, 0xe3, 0x98, 0xab, 0x37, 0xd3, 0xfd, 0x47, 0x25, 0xbb, 0xe8, 0xc0, 0xd6, 0x1d, 0x1d, 0x2e, 0x8d, 0xdf, 0xe7, 0xd9, 0x3c, 0xc0, 0x3f, 0xff, 0x37, 0x5d, 0xe, 0x59, 0xc1, 0xbe, 0x92, 0xdf, 0x49, 0x11, 0xc7, 0x19, 0x69, 0xe6, 0x1a, 0x83, 0x87, 0x65, 0x42, 0x16, 0x7e, 0x37, 0xdc, 0x98, 0x70, 0xd3, 0xff, 0xe4, 0xb1, 0xe1, 0xff, 0x23, 0xf, 0x9f, 0x7, 0x2c, 0x5a, 0x94, 0x67, 0xd4, 0xb7, 0x5c, 0xbb, 0x41, 0xaa, 0x71, 0x2d, 0x2b, 0xd9, 0x45, 0x7, 0xaf, 0x4b, 0xd5, 0xee, 0xe8, 0xb0, 0xea, 0x2e, 0xcf, 0xa3, 0x39, 0xc0, 0x29, 0xce, 0xf, 0x8b, 0x66, 0xa5, 0x65, 0x3, 0x97, 0x51, 0x5b, 0x7e, 0x44, 0x9c, 0x8c, 0xc4, 0x7c, 0x3, 0x12, 0x1d, 0x4e, 0xb7, 0xec, 0x91, 0xef, 0x19, 0x99, 0x9f, 0xa5, 0x7b, 0x80, 0xbb, 0x14, 0x59, 0x86, 0x36, 0xd7, 0x1c, 0x6a, 0xef, 0x86, 0xe6, 0xd1, 0xf3, 0x68, 0xcc, 0xb5, 0xd8, 0xce, 0x72, 0xed, 0x49, 0x23, 0x6f, 0x57, 0xf7, 0x3, 0x94, 0xec, 0xa2, 0x83, 0xd5, 0xdc, 0xe8, 0xdd, 0x38, 0x58, 0x1c, 0x77, 0x66, 0x3e, 0x68, 0x75, 0xcf, 0x48, 0xd5, 0xcc, 0x38, 0x85, 0xbf, 0x80, 0x7b, 0xc, 0x87, 0x96, 0x22, 0x26, 0x5a, 0xc0, 0xb5, 0x95, 0x8f, 0x84, 0x77, 0x2a, 0x2d, 0x5b, 0x37, 0x1e, 0xcf, 0xf2, 0x7d, 0x3c, 0x64, 0xe4, 0x41, 0x8f, 0x6b, 0xd7, 0x1b, 0x39, 0x39, 0x4f, 0x9e, 0x7, 0xd6, 0xa4, 0x2d, 0x3, 0x1d, 0x8a, 0x47, 0x46, 0x9e, 0x1e, 0x25, 0xbb, 0x68, 0xe1, 0x9, 0xa9, 0xda, 0x81, 0x1d, 0xb1, 0xbb, 0x1b, 0xc5, 0x49, 0x91, 0x8e, 0x2b, 0x90, 0x62, 0x8c, 0x9a, 0x9a, 0x6e, 0x96, 0x6b, 0x3f, 0x48, 0xf0, 0xbd, 0xb, 0xf3, 0x9, 0x37, 0x4a, 0xd5, 0x8e, 0x1d, 0xc7, 0x8b, 0xe3, 0x46, 0xdf, 0x2a, 0x4f, 0xe6, 0xa0, 0x2d, 0x89, 0xc4, 0x8d, 0xb7, 0xc4, 0x1e, 0x47, 0xb, 0x12, 0x88, 0x11, 0x5e, 0xe8, 0x61, 0xb9, 0x14, 0x90, 0x8, 0x4f, 0x8d, 0xf1, 0xb3, 0xc0, 0x77, 0x1c, 0x21, 0xf6, 0x1e, 0xa1, 0x65, 0xf4, 0x40, 0x2c, 0x50, 0xb2, 0x8b, 0x1f, 0xbe, 0x13, 0x27, 0x1b, 0xcb, 0x8d, 0x8e, 0x62, 0xcf, 0xde, 0x8a, 0x3, 0xd0, 0x39, 0x2, 0x45, 0xa3, 0xfb, 0x59, 0xae, 0x7d, 0x6b, 0x64, 0xa0, 0xe8, 0x41, 0xb6, 0x7e, 0xc2, 0x6b, 0x4f, 0x38, 0x88, 0xcf, 0x61, 0xf7, 0x98, 0x7f, 0x7f, 0xc4, 0x83, 0x86, 0x5b, 0x88, 0x1d, 0xd9, 0x97, 0x77, 0x49, 0x9a, 0x6c, 0xbf, 0x0, 0x81, 0x66, 0xf0, 0x3, 0xc4, 0x39, 0x5b, 0xcf, 0x8d, 0x62, 0xee, 0x9, 0x43, 0x62, 0xfa, 0x3c, 0x6e, 0x25, 0xd9, 0xdb, 0x30, 0x82, 0x4a, 0x70, 0x9d, 0x16, 0xb6, 0x22, 0xbc, 0xf8, 0xa7, 0xd8, 0x5b, 0xa, 0x9d, 0x98, 0x66, 0x51, 0x44, 0x15, 0x28, 0x1c, 0x7d, 0x5d, 0xec, 0x7, 0xd8, 0x7e, 0x6f, 0xe4, 0x4, 0x23, 0xa3, 0x44, 0x7b, 0x63, 0xfa, 0x9, 0x58, 0x34, 0x5e, 0x59, 0x6d, 0xbb, 0xf2, 0x79, 0x1c, 0x17, 0xe3, 0xef, 0x7f, 0x9d, 0x91, 0x63, 0x2c, 0xe3, 0x2f, 0x89, 0xbd, 0xd8, 0x3b, 0x5b, 0xc0, 0x7a, 0x87, 0xcb, 0x72, 0xb6, 0xe5, 0x1a, 0xd6, 0x3f, 0x3a, 0xaf, 0xdc, 0x46, 0x4b, 0x28, 0xe, 0x80, 0xdb, 0xfc, 0x1, 0x23, 0x17, 0x79, 0x5c, 0x47, 0x48, 0xa3, 0x46, 0x31, 0x4b, 0x25, 0xbb, 0xe8, 0x61, 0x2d, 0x1f, 0xf2, 0x7a, 0xcb, 0x35, 0x64, 0x68, 0x9d, 0x12, 0x93, 0x85, 0xe, 0x52, 0xc7, 0xa1, 0x96, 0x2d, 0x2c, 0xd7, 0x91, 0x11, 0x7, 0xd7, 0xda, 0xe7, 0xa2, 0xc9, 0x2a, 0x7e, 0xe3, 0x27, 0x6e, 0xaa, 0x5e, 0x1b, 0x3b, 0x3a, 0xd6, 0xfc, 0x87, 0xa4, 0x10, 0xb7, 0xb2, 0x97, 0xab, 0x8d, 0x5c, 0xe5, 0x31, 0x27, 0x57, 0x87, 0xe0, 0xfe, 0xa6, 0x19, 0x39, 0xda, 0xc8, 0x4c, 0x8f, 0xeb, 0x97, 0xf2, 0xd9, 0xb4, 0x8c, 0xf8, 0x73, 0xc0, 0x29, 0xf, 0xe8, 0x13, 0x7a, 0xa6, 0xc7, 0x75, 0x9c, 0x10, 0x1, 0xb7, 0x66, 0xb9, 0x92, 0x5d, 0xfc, 0x81, 0xd8, 0xc1, 0x70, 0xcb, 0x38, 0x32, 0x96, 0x90, 0xc4, 0x12, 0x65, 0x1f, 0x3e, 0xdc, 0x65, 0x63, 0x8c, 0x5c, 0x20, 0xf6, 0x14, 0xe3, 0xe9, 0xd4, 0xbc, 0x3f, 0xd2, 0x65, 0x10, 0x28, 0xe1, 0xc1, 0x53, 0xe0, 0xe5, 0x22, 0x42, 0x12, 0xcb, 0x35, 0x46, 0xde, 0x31, 0xb2, 0x47, 0xc, 0xbe, 0x2f, 0xd6, 0xd9, 0x30, 0x23, 0x7f, 0xb7, 0x5c, 0xc3, 0x86, 0x3a, 0xd8, 0xc3, 0xa2, 0xca, 0x5, 0xa6, 0xd2, 0xb2, 0x9e, 0x93, 0xc6, 0x1b, 0x32, 0x8a, 0xef, 0x51, 0x14, 0x81, 0xfa, 0xd9, 0xb1, 0xe2, 0xdd, 0xf3, 0xf6, 0x25, 0x2a, 0x63, 0xab, 0x6a, 0xfa, 0x83, 0x95, 0xec, 0xa2, 0xb, 0xd4, 0x95, 0xd8, 0xdc, 0x4d, 0x85, 0xe2, 0x14, 0x9d, 0xe, 0x8c, 0xd8, 0xf7, 0xd9, 0x41, 0x9c, 0x60, 0x3b, 0x2c, 0xa, 0xaf, 0x86, 0xae, 0x78, 0x89, 0xf, 0x31, 0xf2, 0x85, 0x3e, 0xfe, 0xac, 0x59, 0x78, 0xf7, 0xa6, 0xf9, 0xcc, 0x81, 0xe2, 0x24, 0x4e, 0xa0, 0x75, 0x53, 0x71, 0x44, 0xbf, 0x27, 0xa, 0xc7, 0x91, 0x6d, 0x7a, 0xad, 0xc7, 0xf5, 0x11, 0xf4, 0x30, 0x84, 0x9, 0x53, 0x8c, 0x1c, 0x2e, 0x55, 0x1b, 0x4d, 0x24, 0xd1, 0x8d, 0xd6, 0xcf, 0xb5, 0x12, 0x9d, 0x2c, 0x5a, 0x3c, 0x87, 0xdb, 0xa9, 0x60, 0xb5, 0x4f, 0x63, 0xd1, 0xd, 0x10, 0x7b, 0x2b, 0x35, 0x25, 0xbb, 0x18, 0x63, 0x2d, 0x9, 0xcd, 0x16, 0xb4, 0x6e, 0x44, 0xe2, 0x80, 0xf5, 0xd7, 0x34, 0xe4, 0xdf, 0x63, 0x3b, 0x5a, 0x9, 0xe3, 0xf9, 0x7d, 0xa, 0x3d, 0x3e, 0x87, 0x56, 0x40, 0x28, 0xa6, 0xfd, 0x4e, 0x1f, 0x7d, 0xd6, 0x80, 0x2e, 0xfc, 0xe7, 0x89, 0x13, 0xb, 0x5e, 0xef, 0xf1, 0x99, 0x96, 0x54, 0xbc, 0x90, 0xa5, 0xf8, 0x87, 0x88, 0x7d, 0x3f, 0x28, 0x4e, 0xef, 0xa6, 0xf1, 0x84, 0x20, 0xfb, 0x39, 0xac, 0xb5, 0x6c, 0x38, 0x75, 0x1, 0x2e, 0xcd, 0xb7, 0x3c, 0xae, 0x37, 0xa6, 0xb5, 0x8a, 0xba, 0xc0, 0x7e, 0x21, 0x7e, 0x6, 0xc8, 0x26, 0x47, 0x48, 0x2, 0x9e, 0x1a, 0x74, 0x46, 0xf2, 0x8a, 0xbf, 0xa3, 0x4, 0x3, 0x21, 0x9a, 0x9f, 0x6b, 0xfb, 0x8b, 0x94, 0xec, 0xa2, 0x8d, 0x25, 0xd4, 0xbe, 0x67, 0x78, 0x5c, 0x47, 0x70, 0x17, 0xae, 0xa6, 0x7d, 0x43, 0x78, 0xef, 0xd0, 0xde, 0x90, 0x41, 0x3a, 0x5a, 0x9c, 0xf8, 0xcf, 0x16, 0x69, 0xbe, 0xe3, 0x69, 0x46, 0x6, 0xa5, 0xd9, 0x70, 0x13, 0x96, 0xb1, 0x72, 0x5d, 0x1e, 0xbe, 0x1, 0x5d, 0x2b, 0xe0, 0xd6, 0xfc, 0x36, 0xcd, 0x67, 0x60, 0x8d, 0xc3, 0xc5, 0xf4, 0x9a, 0x84, 0xdf, 0x85, 0xb6, 0x13, 0xad, 0x39, 0x24, 0xdb, 0x78, 0xb9, 0x61, 0x51, 0xa8, 0x7c, 0x8e, 0xe4, 0x26, 0xfb, 0x32, 0x53, 0x2c, 0x13, 0xa7, 0xe, 0xf2, 0x9f, 0x69, 0x3e, 0xb3, 0x37, 0xbf, 0xe7, 0xb3, 0x46, 0x76, 0xb, 0x19, 0xc9, 0xf5, 0x25, 0x59, 0x23, 0x3e, 0xd7, 0xc9, 0xe3, 0x73, 0xc8, 0x44, 0x45, 0x1c, 0xf5, 0xec, 0xba, 0x10, 0x9d, 0x92, 0x5d, 0x3c, 0x80, 0xa0, 0x35, 0x7c, 0xf8, 0x5e, 0x41, 0xeb, 0x7d, 0x49, 0x28, 0xc8, 0xd4, 0xca, 0xf5, 0x29, 0x9, 0x2d, 0x68, 0x9d, 0xe1, 0xc5, 0x43, 0xb3, 0xdb, 0x8b, 0xb9, 0xf1, 0x78, 0xe1, 0x79, 0x71, 0x5a, 0xa2, 0x3d, 0x91, 0xe6, 0x33, 0x78, 0x19, 0x56, 0x5a, 0xc6, 0x5b, 0xeb, 0xd2, 0xf0, 0x15, 0x20, 0x32, 0x34, 0x30, 0x78, 0x35, 0xcd, 0x67, 0x10, 0xfb, 0x3a, 0x42, 0x1c, 0x77, 0x33, 0x48, 0xef, 0xa8, 0x34, 0x4a, 0x4c, 0x2e, 0xb0, 0x97, 0x38, 0x47, 0xc1, 0x7c, 0x26, 0x4e, 0x77, 0x14, 0x2f, 0x2f, 0xc2, 0xfd, 0x46, 0xce, 0x10, 0xe7, 0x2c, 0xc9, 0xb0, 0x63, 0x1d, 0x95, 0x5a, 0x28, 0xbd, 0xdf, 0xa7, 0x79, 0x2e, 0x27, 0xf0, 0x7b, 0xa3, 0x4c, 0x21, 0x97, 0x2d, 0x6, 0x1b, 0x73, 0xf, 0x0, 0x1, 0x23, 0x64, 0x71, 0x68, 0x35, 0xd6, 0x2b, 0xbc, 0x5, 0xa8, 0xfd, 0xac, 0xf3, 0x61, 0xb9, 0x4a, 0x76, 0xf1, 0x0, 0x82, 0xd6, 0x8, 0xec, 0xbe, 0xeb, 0x71, 0x1d, 0x6e, 0xcd, 0x4b, 0xe9, 0xd2, 0x80, 0x6b, 0x63, 0xfb, 0x2c, 0xde, 0x5b, 0x23, 0x2e, 0xe8, 0xbb, 0x49, 0xba, 0xaf, 0xf0, 0xc5, 0x6b, 0x52, 0xcd, 0x22, 0x3f, 0x85, 0x9f, 0x9b, 0x5b, 0xcd, 0xcf, 0x5f, 0xe5, 0x61, 0xd9, 0x9e, 0x2f, 0xd1, 0x8d, 0x23, 0x85, 0x15, 0x48, 0xd2, 0x80, 0xcb, 0x9, 0x6e, 0xcd, 0xe5, 0xd5, 0xec, 0x2b, 0x47, 0x90, 0x20, 0xf1, 0xcc, 0x6f, 0xa1, 0xe6, 0x5e, 0x98, 0x83, 0x7b, 0xde, 0x92, 0x44, 0xf0, 0x3c, 0xd7, 0xff, 0x15, 0x1c, 0xb3, 0x1, 0xb5, 0x74, 0x70, 0xa5, 0x9d, 0x2b, 0xc1, 0x9e, 0x6a, 0x10, 0x4, 0x10, 0x57, 0xec, 0x43, 0x12, 0xf1, 0x42, 0x43, 0x5a, 0x48, 0xa3, 0x68, 0x51, 0xd, 0xc8, 0x92, 0x32, 0x2, 0x2b, 0x6e, 0x47, 0x71, 0xc2, 0x15, 0xc9, 0x3d, 0xa0, 0x7f, 0x35, 0xfc, 0xf3, 0x0, 0x3d, 0x4, 0xef, 0xf8, 0x75, 0x13, 0x5, 0xfa, 0xfe, 0xc6, 0x6, 0x20, 0x85, 0xa3, 0xb9, 0xb1, 0x9c, 0xe7, 0xf1, 0x19, 0x58, 0x51, 0x8, 0x5a, 0x23, 0xd3, 0xf1, 0x65, 0x71, 0x82, 0xc1, 0xe8, 0xbf, 0xb7, 0xc8, 0xc7, 0xfb, 0xd8, 0x8e, 0xb, 0xbb, 0x2b, 0x35, 0xc8, 0x9e, 0x46, 0xb6, 0x16, 0xbb, 0xab, 0xd1, 0xd, 0xb8, 0xc9, 0x1e, 0x13, 0xc7, 0xbd, 0x99, 0xa9, 0xcb, 0xa2, 0x82, 0x1a, 0xab, 0xbb, 0xf6, 0xb, 0x1a, 0xe1, 0x4, 0x6e, 0x2, 0xb7, 0xd1, 0x2, 0x54, 0xd4, 0x1d, 0x98, 0xc7, 0x3b, 0xb9, 0x9, 0x5d, 0x4d, 0x85, 0x24, 0xdd, 0x3e, 0xb2, 0x27, 0x5, 0x4d, 0x8d, 0x91, 0x58, 0x81, 0xa4, 0xaa, 0x4f, 0xc5, 0xc9, 0xaa, 0x5d, 0xe8, 0x87, 0xc6, 0xee, 0x2, 0x36, 0xef, 0x9d, 0x8d, 0x74, 0xe6, 0xe6, 0x7f, 0xa8, 0xd8, 0xcb, 0x57, 0xdc, 0x98, 0x44, 0x12, 0x1f, 0x13, 0x71, 0x2f, 0xcf, 0x91, 0x24, 0xeb, 0x2b, 0xf8, 0x2e, 0xda, 0x80, 0x92, 0x91, 0x7e, 0x94, 0xdb, 0x68, 0x85, 0xc3, 0xca, 0x9a, 0x4c, 0xc5, 0xb1, 0xd2, 0x87, 0x7b, 0x69, 0xce, 0xe7, 0x0, 0xcf, 0x12, 0x62, 0xa3, 0x7, 0x66, 0xa8, 0x7c, 0x8e, 0x13, 0x27, 0x6, 0xfc, 0x8a, 0xdf, 0x93, 0xa3, 0x64, 0x17, 0x2f, 0xfc, 0x42, 0x8b, 0x6, 0xc9, 0x1e, 0x28, 0x32, 0x6d, 0x99, 0x66, 0x43, 0x18, 0x40, 0x99, 0xc5, 0x17, 0x7d, 0xa, 0x17, 0xda, 0x54, 0x6a, 0xed, 0xa5, 0xdc, 0x88, 0x52, 0x49, 0xaa, 0x92, 0x6b, 0xa6, 0x3e, 0xb5, 0x63, 0xf4, 0xab, 0x44, 0xc1, 0x37, 0x32, 0x29, 0xd1, 0xc5, 0x5, 0x35, 0x58, 0xed, 0x49, 0x76, 0x35, 0xf1, 0x1a, 0xfc, 0x40, 0x4d, 0xe, 0x44, 0x37, 0xa7, 0x16, 0xdf, 0x1b, 0xc4, 0x3d, 0x54, 0xaa, 0x9e, 0x6f, 0x7, 0x6b, 0x62, 0x8, 0x7f, 0xee, 0x22, 0x5d, 0x1e, 0xbe, 0x2, 0x64, 0x75, 0x12, 0xe7, 0x16, 0x73, 0xdf, 0xbb, 0x9a, 0xcf, 0x63, 0xa3, 0xeb, 0x2e, 0x1b, 0x33, 0x6d, 0xe7, 0x92, 0xec, 0xe6, 0x71, 0xed, 0xc1, 0xd, 0xbf, 0x98, 0xe3, 0xa5, 0x24, 0xd5, 0x4a, 0xcb, 0xfa, 0x4b, 0x70, 0xd, 0xd6, 0xe3, 0xfa, 0x83, 0x22, 0xd5, 0x81, 0x8a, 0x5c, 0x27, 0x7a, 0x2d, 0x76, 0xa6, 0x47, 0x21, 0x13, 0xac, 0xa6, 0x72, 0xf5, 0x6f, 0xae, 0xc3, 0xa8, 0xa3, 0x92, 0xdf, 0x5, 0xd6, 0xdb, 0x20, 0x12, 0x5f, 0x3a, 0x8b, 0x1a, 0x8a, 0xc0, 0xe9, 0x94, 0xef, 0xf9, 0x5c, 0xe7, 0x90, 0xf8, 0xb0, 0x17, 0x7c, 0x93, 0x66, 0x3f, 0x10, 0xfe, 0xec, 0x62, 0xce, 0x3f, 0xf6, 0x82, 0x3d, 0x38, 0xff, 0x3b, 0x72, 0x4f, 0xc8, 0xd4, 0xbb, 0xf2, 0x1d, 0x15, 0xf5, 0x27, 0xa5, 0x16, 0x65, 0x5, 0x4a, 0x76, 0xf9, 0x8b, 0x47, 0xe8, 0xb2, 0xb9, 0x96, 0x1b, 0x52, 0xba, 0xc5, 0xde, 0x91, 0x72, 0x1c, 0x5f, 0x94, 0xd, 0xdc, 0x68, 0xd0, 0x6f, 0x6e, 0xbd, 0x6b, 0x71, 0x57, 0x90, 0x40, 0x5b, 0x91, 0xf0, 0xa, 0xea, 0xb8, 0x86, 0xd0, 0x9, 0xe6, 0x7f, 0xe2, 0xd4, 0x6, 0xd6, 0x85, 0x8c, 0xf0, 0x42, 0xc2, 0x4d, 0x3a, 0xcc, 0x72, 0x6d, 0xad, 0xd8, 0xeb, 0xf5, 0x14, 0xfe, 0x0, 0x9b, 0xea, 0x68, 0x5a, 0xd2, 0x83, 0xa8, 0xc1, 0x67, 0xe2, 0xae, 0xdc, 0x81, 0x72, 0x60, 0xca, 0x58, 0x69, 0x8a, 0x5, 0x3e, 0x87, 0x7f, 0xb7, 0x79, 0x4, 0x10, 0x7b, 0x6e, 0x9a, 0xb2, 0xfe, 0x6a, 0xf3, 0x7c, 0x57, 0x71, 0xed, 0xdd, 0x29, 0xf6, 0x8e, 0x44, 0x51, 0xc7, 0x6c, 0x7a, 0x70, 0x1e, 0x15, 0x27, 0x36, 0x7e, 0x94, 0x54, 0x9f, 0x99, 0xdd, 0x9a, 0xd2, 0x3b, 0xe5, 0x7d, 0xc7, 0x33, 0x28, 0xe7, 0x7e, 0xb0, 0xc6, 0xf2, 0x3c, 0xda, 0x51, 0xb1, 0x68, 0x50, 0xcb, 0xbd, 0x60, 0x3a, 0x9f, 0x3, 0xde, 0xdf, 0xa5, 0x41, 0x4e, 0x88, 0xd7, 0x42, 0xd1, 0x58, 0x5e, 0xf4, 0x31, 0x9f, 0xda, 0x1a, 0x88, 0xef, 0x12, 0x6e, 0x46, 0xd5, 0x3d, 0xd7, 0x4, 0x35, 0x31, 0x48, 0xd7, 0x80, 0xee, 0xb, 0x2f, 0xc, 0xe2, 0xa, 0x88, 0xa1, 0x8c, 0x35, 0xf2, 0xa3, 0x4f, 0x3f, 0x17, 0x41, 0xec, 0x5d, 0xa5, 0xaa, 0x3b, 0x33, 0x91, 0xa5, 0xf9, 0xae, 0x9f, 0xe1, 0x58, 0x1c, 0x81, 0x4d, 0x11, 0x6e, 0x27, 0x24, 0xaf, 0x1c, 0x60, 0xe4, 0xcf, 0xe2, 0xc4, 0xf6, 0x6a, 0x7a, 0x92, 0x7c, 0x61, 0xa, 0x51, 0x76, 0xb, 0xe8, 0x5e, 0x57, 0x90, 0x0, 0x9e, 0xa1, 0x7, 0x24, 0xee, 0x40, 0x98, 0x2, 0xa5, 0x15, 0x7b, 0xf3, 0xb9, 0x9c, 0x26, 0xde, 0x31, 0x4b, 0x1b, 0xf, 0x24, 0x2d, 0xb3, 0xce, 0x3e, 0xde, 0x13, 0xc8, 0xf3, 0xb, 0x7a, 0x5, 0x5e, 0x15, 0xef, 0xc4, 0x1a, 0xdf, 0xc9, 0x6e, 0x83, 0x54, 0x6d, 0xfb, 0x53, 0x2a, 0x8a, 0xb8, 0xe0, 0x43, 0xa, 0xb4, 0xb5, 0xf3, 0xb8, 0x19, 0x65, 0xbb, 0x7b, 0x3d, 0x5c, 0x53, 0x53, 0x48, 0x72, 0x6f, 0x4a, 0x30, 0x2e, 0x45, 0xac, 0xd9, 0x93, 0xa9, 0x29, 0x9e, 0x23, 0x1b, 0x5d, 0xb8, 0xd, 0x24, 0x3b, 0xf1, 0x3a, 0x5b, 0x46, 0xe8, 0xea, 0x3c, 0x5b, 0x6b, 0xf0, 0xc, 0x7c, 0x40, 0x41, 0x3c, 0xf, 0x9d, 0x6e, 0x8e, 0xa4, 0xe2, 0xd4, 0x36, 0x87, 0xf7, 0x5, 0x8b, 0xe1, 0x4b, 0xae, 0x3d, 0xa4, 0xb9, 0xe7, 0x63, 0xe3, 0xf0, 0x71, 0x94, 0x9b, 0xf9, 0x9e, 0x20, 0x81, 0xa8, 0xbb, 0x64, 0xb7, 0xe, 0x17, 0x7b, 0xc0, 0xc7, 0x46, 0x9e, 0x16, 0xa7, 0x20, 0x3e, 0xab, 0x65, 0x1d, 0x5, 0x34, 0x71, 0xfb, 0xa4, 0x30, 0x78, 0x5, 0x6f, 0x46, 0x11, 0x2f, 0x8c, 0xa1, 0x40, 0x43, 0xeb, 0xcb, 0x4d, 0x68, 0x1f, 0xf1, 0xbf, 0xc3, 0x42, 0x19, 0x37, 0xf9, 0x9, 0xb4, 0xdc, 0xf0, 0xe7, 0x34, 0xc9, 0xce, 0x81, 0x97, 0x50, 0xdc, 0xae, 0xe1, 0x86, 0x96, 0x4c, 0x8c, 0x81, 0x3b, 0x67, 0x59, 0x16, 0x7e, 0xf7, 0x53, 0xd4, 0x84, 0x1b, 0xf3, 0xdf, 0x20, 0xd8, 0x17, 0xf3, 0x78, 0xbd, 0xc1, 0x62, 0x7f, 0x90, 0x82, 0xf8, 0x4d, 0x17, 0x71, 0x12, 0x96, 0xb0, 0xd7, 0x20, 0xbe, 0xd3, 0x28, 0x40, 0xab, 0x7b, 0x3d, 0x15, 0x2a, 0x28, 0x79, 0xa3, 0x53, 0xd6, 0xa0, 0xc2, 0x79, 0x17, 0x86, 0x53, 0x60, 0xed, 0xe1, 0x34, 0x11, 0x94, 0x94, 0xa0, 0xc4, 0x67, 0x73, 0xf1, 0xd7, 0xab, 0xb7, 0x8e, 0x96, 0x25, 0xba, 0xec, 0x7c, 0xca, 0xbf, 0x2f, 0xcb, 0xd5, 0x17, 0x4f, 0x9c, 0x34, 0x68, 0x88, 0x3e, 0xfe, 0xfc, 0x44, 0x3d, 0x5a, 0x3f, 0xfb, 0x8b, 0x73, 0x8c, 0xe, 0x12, 0x4b, 0x5a, 0xd3, 0xc5, 0xd1, 0x9c, 0x1b, 0x11, 0x12, 0x59, 0x8a, 0x52, 0x88, 0xe4, 0x27, 0x8e, 0x63, 0x33, 0x41, 0xcc, 0x63, 0xd, 0xc7, 0x20, 0xf3, 0x68, 0xc1, 0x21, 0xb0, 0x3d, 0x93, 0xd7, 0x2a, 0x74, 0x9a, 0x15, 0x2e, 0x14, 0x72, 0x7d, 0x81, 0xfc, 0x76, 0x11, 0x27, 0x99, 0xa1, 0xd, 0xd7, 0x5d, 0x33, 0x71, 0xd2, 0xe3, 0x37, 0xe7, 0xda, 0x81, 0xe2, 0x90, 0xda, 0xe8, 0xbb, 0x84, 0x6b, 0x2d, 0xf9, 0xf7, 0x1f, 0xb9, 0xce, 0xf0, 0xe7, 0xf, 0x5c, 0x7f, 0xd3, 0x69, 0xc5, 0x2d, 0xe3, 0x9a, 0x55, 0x64, 0x6, 0xcc, 0x39, 0x92, 0x4b, 0xe0, 0x3e, 0xee, 0x44, 0x45, 0xb1, 0x15, 0xc7, 0x93, 0xe5, 0x9, 0x5b, 0xc8, 0xc6, 0xe, 0x27, 0x6b, 0x52, 0x3c, 0x17, 0x2b, 0xb9, 0x1f, 0x2c, 0xa3, 0x15, 0x8d, 0x78, 0x2b, 0xe2, 0xa0, 0x70, 0x13, 0xc3, 0x6d, 0x9c, 0xb5, 0x6, 0xf, 0x6b, 0xd6, 0xae, 0x93, 0xa1, 0x83, 0x6, 0xca, 0x3e, 0x7b, 0x54, 0x8d, 0xc2, 0xfc, 0xbf, 0x0, 0x3, 0x0, 0x73, 0x78, 0xf7, 0xf2, 0x7e, 0x74, 0x3a, 0x48, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; + + + + + (NSData *)parse_logo2x_png { + return [NSData dataWithBytes:parse_logo2x_png length:sizeof(parse_logo2x_png)]; + } + + const unsigned char parse_logo3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x2, 0x99, 0x0, 0x0, 0x0, 0xcc, 0x8, 0x6, 0x0, 0x0, 0x0, 0x38, 0x73, 0xb8, 0x3f, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x41, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x42, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x38, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x39, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0x66, 0x5f, 0x10, 0x71, 0x0, 0x0, 0x22, 0xe8, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x9d, 0x4d, 0x72, 0x1b, 0xbd, 0x11, 0x86, 0x3b, 0x29, 0xef, 0xa3, 0xef, 0x4, 0xdf, 0xf8, 0x4, 0xa6, 0x4f, 0xa0, 0xd1, 0x9, 0x4c, 0xaf, 0x93, 0x2a, 0x53, 0xfb, 0xa4, 0x2c, 0xad, 0x92, 0x9d, 0xc8, 0x5d, 0x76, 0x92, 0x2b, 0x7, 0x10, 0x5d, 0x95, 0xbd, 0xe8, 0x13, 0x68, 0x74, 0x2, 0x53, 0x27, 0xf0, 0xf8, 0x4, 0x56, 0x6e, 0x10, 0x21, 0x2, 0x22, 0x98, 0xa6, 0x8, 0x60, 0x7e, 0x31, 0xc0, 0xf3, 0x54, 0x4d, 0x49, 0x32, 0x29, 0x99, 0x83, 0x1, 0xba, 0xdf, 0x6e, 0x0, 0x8d, 0x3f, 0xfc, 0xf9, 0xaf, 0x7f, 0x3f, 0x12, 0x91, 0x8f, 0x2, 0x7d, 0x70, 0xa7, 0xbf, 0x6e, 0x1f, 0xaf, 0x7, 0x9a, 0x3, 0x0, 0x0, 0x0, 0x52, 0xe0, 0xdf, 0xff, 0xfa, 0xa7, 0xf3, 0x3d, 0xaf, 0x1e, 0xaf, 0xeb, 0xc7, 0x6b, 0x4e, 0x73, 0xd, 0x42, 0xa5, 0x5, 0xe7, 0xbd, 0xfe, 0xba, 0xa5, 0x49, 0x0, 0x0, 0x0, 0x20, 0x45, 0x94, 0xc8, 0x3c, 0xa2, 0x19, 0x6, 0xa3, 0xd4, 0x97, 0x41, 0x65, 0x37, 0x37, 0xf2, 0x94, 0xf1, 0xdc, 0x8, 0xd9, 0x4e, 0x0, 0x0, 0x0, 0x48, 0x84, 0x3f, 0xd2, 0x4, 0xa3, 0xa2, 0x4, 0xfe, 0x42, 0x9e, 0xb2, 0xc9, 0x3f, 0x1e, 0xaf, 0x1b, 0xfd, 0x33, 0x0, 0x0, 0x0, 0x0, 0x22, 0x13, 0x3a, 0x63, 0x6e, 0x9, 0xce, 0xcb, 0xc7, 0xab, 0xa0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x91, 0x9, 0x5d, 0xa1, 0x32, 0x9c, 0x67, 0x8f, 0xd7, 0x37, 0x2d, 0x3a, 0x11, 0x9b, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x4e, 0x59, 0x20, 0x36, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0x7d, 0x8b, 0x4d, 0x35, 0x8d, 0xce, 0x66, 0x2d, 0x0, 0x0, 0x0, 0x88, 0x9a, 0x57, 0x8e, 0xd7, 0xab, 0xc7, 0xeb, 0x84, 0x66, 0xa, 0xa6, 0xd4, 0x5f, 0x8b, 0xc7, 0xeb, 0xf7, 0xc7, 0x6b, 0xa6, 0xbf, 0x9f, 0x75, 0xf0, 0xb7, 0xcf, 0xb4, 0xe0, 0x3c, 0x7f, 0xbc, 0xd6, 0x34, 0x35, 0x0, 0x0, 0x0, 0x4c, 0x51, 0x64, 0x42, 0x33, 0xaa, 0x17, 0xfe, 0xfd, 0x48, 0xb, 0xd0, 0x63, 0xfd, 0xb5, 0xa9, 0xe8, 0x54, 0x7f, 0x47, 0x4d, 0x9f, 0x7f, 0x78, 0xbc, 0x4e, 0x1f, 0xaf, 0x9a, 0x26, 0x7, 0x0, 0x0, 0x80, 0x98, 0x60, 0xba, 0x7c, 0x58, 0x4c, 0x5d, 0x4c, 0x95, 0x85, 0x7c, 0xfb, 0x78, 0xbd, 0xd6, 0xdf, 0x37, 0x2d, 0xca, 0xae, 0x84, 0xea, 0x57, 0xa1, 0x98, 0x3e, 0x0, 0x0, 0x0, 0x20, 0x32, 0xc1, 0xa2, 0x7e, 0xbc, 0xae, 0xb4, 0xe0, 0x54, 0xd7, 0xba, 0xc1, 0xdf, 0x50, 0x59, 0x4d, 0x55, 0x5f, 0xf3, 0x92, 0xe6, 0x4, 0x0, 0x0, 0x0, 0x44, 0x26, 0xec, 0xa2, 0xb2, 0x99, 0x6a, 0xea, 0x5b, 0x65, 0x37, 0x97, 0x12, 0x7e, 0xfa, 0x8f, 0x5a, 0xab, 0xf9, 0x55, 0xd8, 0x14, 0x4, 0x0, 0x0, 0x0, 0x88, 0x4c, 0xd8, 0x43, 0xfd, 0x78, 0xad, 0xb4, 0xd8, 0xbc, 0xa, 0xfc, 0x5d, 0xb5, 0xc6, 0xf3, 0x9b, 0x74, 0xb3, 0xc1, 0x8, 0x0, 0x0, 0x0, 0x0, 0x91, 0x99, 0x20, 0x2a, 0x93, 0x79, 0xae, 0xc5, 0x66, 0x15, 0xf0, 0x7b, 0x2a, 0x93, 0x79, 0x2b, 0x3f, 0x9f, 0x91, 0xe, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x9f, 0xa8, 0xe5, 0xa9, 0x8c, 0xd4, 0x7b, 0xf1, 0x9f, 0x42, 0x37, 0x42, 0x73, 0x41, 0xf3, 0x1, 0x0, 0x0, 0x0, 0x22, 0x13, 0xe, 0xa1, 0x76, 0xa5, 0xbf, 0xd6, 0x5f, 0x7d, 0xb9, 0x46, 0x68, 0x2, 0x0, 0x0, 0x0, 0x22, 0x13, 0x5c, 0xa8, 0x4c, 0xa6, 0xca, 0x68, 0x9e, 0x23, 0x34, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0x5d, 0x63, 0xca, 0x1e, 0xf9, 0x4e, 0x9f, 0x23, 0x34, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0x5e, 0xa8, 0x92, 0x47, 0xaf, 0xc5, 0xbf, 0x90, 0xbb, 0xaa, 0xa3, 0xc9, 0xae, 0x73, 0x0, 0x0, 0x0, 0x40, 0x64, 0x82, 0x13, 0x95, 0xc9, 0x54, 0x9b, 0x82, 0x7c, 0xd6, 0x69, 0x9a, 0xcd, 0x40, 0x5, 0xcd, 0x6, 0x0, 0x0, 0x0, 0x88, 0x4c, 0xf0, 0x11, 0x9a, 0x6a, 0x9d, 0xe6, 0xda, 0x53, 0x68, 0xde, 0x8, 0x5, 0xdb, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0x9e, 0x9c, 0x7a, 0xa, 0x4d, 0x35, 0x65, 0x7e, 0x4d, 0x73, 0x1, 0x0, 0x0, 0x0, 0x22, 0x13, 0xba, 0x16, 0x9a, 0x73, 0x79, 0x3a, 0x86, 0x12, 0x0, 0x0, 0x0, 0x0, 0x91, 0x9, 0xde, 0x42, 0xb3, 0xf2, 0x78, 0x1f, 0x1b, 0x81, 0x0, 0x0, 0x0, 0x0, 0x91, 0x9, 0x41, 0xa8, 0x35, 0x9a, 0x3e, 0xbb, 0xce, 0xd5, 0xb4, 0x39, 0xeb, 0x33, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0x5e, 0x98, 0xcd, 0x40, 0xae, 0x3a, 0x9a, 0x2a, 0x93, 0x79, 0x41, 0x73, 0x1, 0x0, 0x0, 0x0, 0x22, 0x13, 0x7c, 0xa9, 0xb5, 0xd0, 0x74, 0x71, 0x26, 0x4c, 0x9b, 0x3, 0x0, 0x0, 0x0, 0x22, 0x13, 0x2, 0xa8, 0x1e, 0xaf, 0xa5, 0xc7, 0xfb, 0xd8, 0x6d, 0xe, 0x0, 0x0, 0x0, 0x88, 0x4c, 0x8, 0x62, 0x25, 0xee, 0x8d, 0x40, 0x2a, 0x93, 0xc9, 0x6e, 0x73, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0x10, 0x6a, 0xc7, 0xb9, 0x6b, 0x7d, 0xa6, 0x5a, 0x9b, 0xc9, 0x26, 0x20, 0x0, 0x0, 0x0, 0x40, 0x64, 0x82, 0x37, 0xb5, 0x3c, 0x65, 0x34, 0xf, 0xa1, 0x4, 0xe6, 0x47, 0x9a, 0xa, 0x0, 0x0, 0x0, 0x10, 0x99, 0x10, 0xc2, 0x95, 0xb8, 0xa7, 0xcd, 0x97, 0xc2, 0xd9, 0xe6, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x40, 0x4e, 0x3d, 0xde, 0x43, 0x49, 0x23, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0x10, 0xb5, 0x3c, 0x65, 0x34, 0xf, 0xb1, 0x10, 0xb2, 0x99, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x40, 0xd4, 0xda, 0x4c, 0xd7, 0x26, 0xa0, 0xf, 0x34, 0x13, 0x0, 0x0, 0x0, 0x20, 0x32, 0x21, 0x4, 0x25, 0x30, 0x5d, 0xd9, 0x4c, 0x55, 0xce, 0x88, 0x9d, 0xe6, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x20, 0x3e, 0xc9, 0xe1, 0x6c, 0xa6, 0x12, 0x98, 0x73, 0x9a, 0x9, 0x0, 0x0, 0x0, 0x10, 0x99, 0x10, 0x82, 0x4f, 0x36, 0x93, 0x72, 0x46, 0x0, 0x0, 0x0, 0x80, 0xc8, 0x84, 0x60, 0x3e, 0x39, 0x5e, 0x9f, 0x9, 0x67, 0x9a, 0x3, 0x0, 0x0, 0x0, 0x22, 0x13, 0x2, 0x51, 0xd9, 0xcc, 0xb5, 0xe3, 0x3d, 0x64, 0x33, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0xc1, 0xb8, 0xb2, 0x99, 0xac, 0xcb, 0x4, 0x0, 0x0, 0x0, 0x44, 0x26, 0x4, 0xb3, 0x95, 0xa7, 0xda, 0x99, 0x2f, 0xc1, 0x6, 0x20, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0x23, 0x5c, 0xd9, 0xcc, 0x63, 0x9a, 0x8, 0x0, 0x0, 0x0, 0x10, 0x99, 0x10, 0xca, 0xc6, 0xf1, 0x3a, 0x99, 0x4c, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0x30, 0xb5, 0x3c, 0x4d, 0x9b, 0xbf, 0x44, 0x21, 0x1c, 0x33, 0x9, 0x0, 0x0, 0x0, 0x88, 0x4c, 0x68, 0x0, 0xd9, 0x4c, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0xe7, 0x7c, 0x71, 0xbc, 0xce, 0xba, 0x4c, 0x0, 0x0, 0x0, 0x40, 0x64, 0x42, 0x30, 0x6a, 0xba, 0xfc, 0xd0, 0x31, 0x93, 0x14, 0x65, 0x7, 0x0, 0x0, 0x0, 0x44, 0x26, 0x34, 0x16, 0x9a, 0x2f, 0x51, 0x8, 0xeb, 0x32, 0x1, 0x0, 0x0, 0x0, 0x91, 0x9, 0xd, 0xa8, 0x1c, 0xaf, 0x23, 0x32, 0x1, 0x0, 0x0, 0xc0, 0x9b, 0x57, 0x34, 0x1, 0x68, 0xee, 0x1c, 0xaf, 0x1f, 0x7b, 0x8, 0x51, 0x78, 0x42, 0x15, 0xb1, 0xf7, 0x5d, 0x62, 0x50, 0xcb, 0xe1, 0x82, 0xf8, 0x0, 0xd0, 0x9e, 0xa2, 0x41, 0xa0, 0xec, 0x5a, 0x46, 0x4, 0xf4, 0x23, 0x6c, 0x3b, 0x22, 0x13, 0x2, 0xc, 0xaa, 0x6b, 0x70, 0xc1, 0xaf, 0x42, 0xf2, 0xd8, 0x32, 0x3c, 0x33, 0xfd, 0xef, 0x4d, 0xa9, 0xb4, 0x53, 0x53, 0xcf, 0xe2, 0x5e, 0xdc, 0xe5, 0xa5, 0x0, 0xe0, 0x89, 0x99, 0x1e, 0x83, 0x6f, 0xac, 0xf1, 0x18, 0x12, 0xec, 0xf9, 0xa, 0x4e, 0xf3, 0xf5, 0xce, 0xfa, 0x19, 0xd2, 0xed, 0x4b, 0xc6, 0xa6, 0x97, 0x2d, 0xff, 0x66, 0x65, 0x7d, 0xfd, 0xae, 0x6d, 0x7b, 0x85, 0xc8, 0x84, 0x9c, 0x70, 0x45, 0xec, 0xb9, 0x8b, 0xcc, 0x42, 0x1b, 0x9a, 0x63, 0xfd, 0xb5, 0x8f, 0xf6, 0x30, 0x86, 0x6c, 0xbe, 0xc7, 0x40, 0x55, 0xda, 0xb1, 0x55, 0x74, 0xd5, 0x5e, 0x32, 0x11, 0x29, 0x67, 0xad, 0x8c, 0xe0, 0x4a, 0x45, 0x10, 0x1d, 0x59, 0x63, 0x71, 0xd6, 0x81, 0x0, 0xf0, 0x15, 0x1e, 0xf2, 0xc2, 0xff, 0x55, 0x59, 0x81, 0x61, 0x25, 0x64, 0xaf, 0xa6, 0x86, 0x6d, 0xd7, 0xcb, 0x1e, 0xff, 0x8f, 0x7d, 0xfd, 0xc7, 0xf4, 0x9d, 0x3b, 0x2b, 0xc9, 0x80, 0xc8, 0x84, 0x64, 0xa9, 0xe, 0xc, 0xb2, 0x1c, 0x77, 0x98, 0x2b, 0xb1, 0xf7, 0xae, 0x47, 0x51, 0x19, 0x62, 0xa0, 0x4a, 0x2b, 0x18, 0x50, 0x75, 0x4d, 0xbf, 0x88, 0xbb, 0xbe, 0x29, 0xfc, 0xda, 0x87, 0x6f, 0x65, 0x7f, 0xb6, 0x59, 0x19, 0xfa, 0x93, 0x9, 0x19, 0x79, 0x3b, 0xdb, 0xb2, 0x9b, 0xb1, 0x7b, 0x69, 0xc, 0x9f, 0x3e, 0x5e, 0xeb, 0x9, 0xb, 0x1, 0x33, 0x16, 0x67, 0x11, 0x7e, 0x36, 0xbb, 0xcd, 0x6b, 0x6d, 0x4b, 0x19, 0xa3, 0xf1, 0x6, 0x5d, 0x73, 0x2d, 0x2c, 0xe7, 0x91, 0xf4, 0x9d, 0x33, 0xcb, 0xe, 0x19, 0xfb, 0x9e, 0x44, 0x50, 0x88, 0xc8, 0x4, 0x9b, 0x7, 0x47, 0xf6, 0x20, 0x27, 0x61, 0x39, 0x8f, 0xf4, 0x9e, 0xd5, 0x67, 0x5a, 0xe8, 0xcb, 0x8, 0xce, 0xcf, 0x42, 0x86, 0xd3, 0x87, 0x77, 0x7, 0x9e, 0xe9, 0x4c, 0x5f, 0x55, 0xa4, 0xcf, 0xbc, 0x94, 0xf6, 0x99, 0xbb, 0xf, 0x13, 0x13, 0x99, 0xea, 0x5e, 0x3f, 0x46, 0x3c, 0x16, 0xf, 0x89, 0x18, 0x33, 0x46, 0xc5, 0x12, 0xd, 0x6b, 0x86, 0xe0, 0xa8, 0x63, 0x68, 0xae, 0xfb, 0xd3, 0x2c, 0xf2, 0x3e, 0xaf, 0xae, 0xa5, 0xe, 0x56, 0x54, 0xdf, 0xf9, 0x24, 0x13, 0xce, 0x8e, 0xb3, 0xbb, 0x1c, 0x6c, 0xb6, 0x1e, 0x3, 0x35, 0x45, 0xd4, 0xa0, 0xbe, 0x7e, 0xbc, 0x7e, 0x3c, 0x5e, 0x37, 0xda, 0x39, 0x4c, 0xe1, 0x5e, 0x8d, 0xe0, 0x54, 0xd9, 0xb9, 0xaf, 0x96, 0x53, 0x83, 0x34, 0x9c, 0xe2, 0x42, 0xf7, 0x47, 0xd3, 0x2f, 0xcf, 0x64, 0x98, 0xa9, 0xe1, 0xb1, 0xef, 0x5b, 0xdd, 0xe7, 0x37, 0xab, 0x4f, 0x4f, 0xdd, 0xee, 0xcc, 0x2d, 0xfb, 0x72, 0x2d, 0xd4, 0x1d, 0x1e, 0x92, 0x72, 0xc2, 0x6d, 0x5f, 0x58, 0x63, 0xe1, 0x76, 0xaa, 0xf6, 0x1d, 0x91, 0x9, 0xa1, 0x62, 0x2c, 0x35, 0x27, 0xfe, 0x35, 0x11, 0x67, 0x66, 0x84, 0xf2, 0x37, 0xc4, 0xe6, 0xe4, 0x5, 0xc9, 0x8d, 0xe5, 0x14, 0x73, 0x39, 0xd2, 0xb5, 0xb0, 0xfa, 0xef, 0xa5, 0xa4, 0xb9, 0x6, 0xdc, 0xb6, 0x39, 0xb7, 0x8c, 0xd3, 0x5e, 0x49, 0xad, 0x9d, 0x6d, 0xb1, 0x7c, 0x31, 0x25, 0x5f, 0x85, 0xc8, 0x4, 0x9b, 0xff, 0x64, 0xe2, 0xcc, 0x2e, 0xb5, 0x33, 0x4b, 0x31, 0xab, 0x60, 0x3b, 0x6b, 0xce, 0x9c, 0x9f, 0x8e, 0xf8, 0xb8, 0xd0, 0xcf, 0xec, 0x26, 0xb3, 0xe7, 0x76, 0xb4, 0x13, 0x1c, 0xe5, 0xb2, 0x2c, 0xa7, 0x24, 0x28, 0xec, 0x4d, 0x5c, 0xa6, 0x6a, 0xdb, 0xcd, 0x78, 0x59, 0x5a, 0x41, 0x68, 0xf4, 0xc1, 0x18, 0x6b, 0x32, 0xc1, 0x26, 0xe5, 0x72, 0x1c, 0x66, 0x7d, 0xd7, 0xa2, 0xe7, 0xf6, 0x53, 0xeb, 0x24, 0x2b, 0x4b, 0xb4, 0xbf, 0xd4, 0xa6, 0xc7, 0x3b, 0xe, 0xa7, 0xcb, 0x72, 0x2b, 0x46, 0x6c, 0xde, 0xe8, 0xcf, 0xa2, 0x36, 0x7c, 0xd4, 0x74, 0xef, 0x28, 0x1d, 0x86, 0xea, 0x93, 0x67, 0x19, 0x89, 0x2b, 0x9b, 0x8b, 0x1e, 0xef, 0xdd, 0x8c, 0xc5, 0x7a, 0xa7, 0xef, 0xfb, 0xd4, 0x3, 0xb6, 0x6d, 0xc6, 0x91, 0xf4, 0x7b, 0xe2, 0x99, 0x9, 0xa, 0x55, 0x3f, 0x38, 0x17, 0xd6, 0x56, 0xb7, 0x11, 0x97, 0x17, 0x3d, 0x3e, 0xa7, 0x4a, 0x7e, 0x2e, 0x59, 0x75, 0xc8, 0xb6, 0xab, 0x3e, 0xf3, 0xc6, 0xfa, 0x7e, 0xd6, 0x83, 0x7d, 0x37, 0xf7, 0xac, 0xae, 0xab, 0xc7, 0x6b, 0x25, 0x91, 0x6e, 0x5a, 0x44, 0x64, 0x42, 0xe, 0x19, 0x83, 0xb, 0xe9, 0x7e, 0x2d, 0xdb, 0x56, 0x1b, 0x9e, 0x7b, 0xfd, 0x7d, 0xa8, 0x40, 0xb7, 0x9d, 0xc9, 0x6a, 0xc7, 0xb1, 0x15, 0xf2, 0x5c, 0x52, 0x63, 0xd6, 0xc1, 0xfd, 0x7f, 0xd3, 0xd1, 0xef, 0x8a, 0xee, 0x80, 0xb8, 0x8c, 0x64, 0x4c, 0x76, 0x95, 0x85, 0xa9, 0xad, 0xf1, 0x77, 0x27, 0xed, 0xb, 0x60, 0x57, 0xe, 0x41, 0x68, 0xc6, 0xe6, 0xcc, 0x1a, 0xab, 0x5d, 0x5, 0xc1, 0x6a, 0x6a, 0x77, 0xa3, 0xc5, 0x26, 0x41, 0xe1, 0x38, 0xf6, 0xdd, 0x24, 0x9, 0x4c, 0x7f, 0x6a, 0x5a, 0xda, 0x6c, 0x73, 0xe0, 0x39, 0x17, 0x5a, 0x84, 0x96, 0x1d, 0x7d, 0xee, 0xb3, 0x1d, 0xb1, 0x89, 0xc8, 0x4, 0x98, 0xa0, 0xf1, 0xa9, 0xb5, 0xe1, 0xe8, 0xbb, 0x9e, 0x99, 0x71, 0x98, 0x1b, 0x4b, 0x90, 0xd8, 0xe5, 0x36, 0x9a, 0x8a, 0x92, 0xa5, 0x6e, 0xb, 0xb2, 0x9a, 0xe3, 0xa2, 0x9c, 0xc1, 0xe5, 0x40, 0xe2, 0xb2, 0xda, 0xe9, 0x57, 0xf7, 0x11, 0xdc, 0xff, 0xa5, 0x3c, 0x97, 0x6b, 0x69, 0x23, 0x2, 0xbe, 0xc8, 0xf0, 0x35, 0x29, 0x8d, 0x80, 0xad, 0x76, 0x2, 0x86, 0xb2, 0xc3, 0xa0, 0x70, 0xae, 0xff, 0xce, 0x4a, 0x8b, 0x6, 0x78, 0x39, 0x50, 0xbb, 0x94, 0x6e, 0x66, 0xa6, 0x6c, 0xbb, 0xde, 0xf7, 0x6c, 0x9e, 0x6d, 0xdf, 0x57, 0x96, 0xaf, 0x32, 0xf6, 0x7d, 0xd6, 0xa2, 0x3d, 0x96, 0xba, 0x3d, 0x4e, 0x25, 0xa2, 0x8c, 0x38, 0x22, 0x13, 0x52, 0xa3, 0xd0, 0xe2, 0x72, 0xd1, 0x91, 0x41, 0xf8, 0xac, 0xd, 0xc2, 0x58, 0xc2, 0x4c, 0x39, 0xd5, 0xb5, 0xbe, 0x4e, 0xf5, 0x7d, 0x7d, 0x68, 0x28, 0x9e, 0xd5, 0xef, 0xa8, 0xc5, 0xf0, 0xef, 0x85, 0x69, 0xb9, 0xa1, 0x99, 0x69, 0xa7, 0x58, 0x76, 0xfc, 0x77, 0x6b, 0xcb, 0x71, 0xc5, 0x7c, 0x4a, 0x94, 0x1a, 0x97, 0x37, 0xd, 0x9d, 0x68, 0xcc, 0xb5, 0x61, 0xcd, 0x67, 0xdb, 0x58, 0xf7, 0xa9, 0x9e, 0xb1, 0x29, 0x83, 0xd6, 0x46, 0x40, 0x1d, 0xeb, 0x31, 0xcf, 0xd1, 0x96, 0xbf, 0xa, 0xf1, 0xeb, 0x96, 0x81, 0x9a, 0xdd, 0x9f, 0xc6, 0x6e, 0xdf, 0x4a, 0x5f, 0x2b, 0x79, 0xae, 0xe1, 0xf9, 0xa1, 0xe1, 0x58, 0x51, 0xbf, 0x6f, 0x32, 0xe2, 0x51, 0xf4, 0x1d, 0x36, 0xfe, 0x40, 0x6a, 0x91, 0x6d, 0xdb, 0x85, 0xf4, 0xb5, 0xce, 0x20, 0xbc, 0x7e, 0xbc, 0xde, 0xea, 0xef, 0xeb, 0x88, 0xee, 0x53, 0x89, 0xcd, 0x13, 0xfd, 0xf9, 0xd6, 0xd, 0xdb, 0x49, 0x19, 0xa1, 0x33, 0xba, 0xcc, 0x60, 0x5c, 0x68, 0x71, 0xdf, 0x85, 0xc0, 0x34, 0xfd, 0x53, 0x5, 0xa, 0xbf, 0xe9, 0x7e, 0xf0, 0x5e, 0x3b, 0xa8, 0x4d, 0xa4, 0x2, 0x73, 0xa6, 0xef, 0x3f, 0xd4, 0x69, 0x6e, 0xb5, 0xa3, 0x7c, 0xad, 0xbf, 0x4e, 0xa1, 0xb0, 0x79, 0xad, 0xc7, 0xa5, 0x79, 0x3e, 0xa7, 0x2d, 0x9e, 0xc9, 0xbc, 0x61, 0xbb, 0xa5, 0x6c, 0xe3, 0x6f, 0xf4, 0x75, 0xd4, 0xf0, 0xd9, 0x2c, 0xad, 0x31, 0xb3, 0x8e, 0x50, 0xc0, 0x9b, 0xf1, 0xfd, 0x56, 0x5f, 0x4d, 0x3f, 0xe3, 0x5c, 0x22, 0xd9, 0xfc, 0x89, 0xc8, 0x84, 0xdd, 0x28, 0x68, 0x8a, 0x98, 0x5a, 0x62, 0x6d, 0x84, 0xd3, 0x46, 0x1b, 0x1e, 0x65, 0x80, 0xa6, 0xb0, 0x26, 0xaa, 0xd6, 0xe, 0xec, 0x37, 0x69, 0x36, 0xad, 0x76, 0xa9, 0xb3, 0x1, 0xd0, 0xbf, 0xb8, 0x5a, 0xb6, 0xfc, 0x3b, 0x5b, 0xdd, 0x27, 0x5f, 0x5b, 0xfd, 0x33, 0x86, 0xc, 0x8c, 0xf, 0xb, 0x79, 0xf9, 0x94, 0xa5, 0x97, 0xa8, 0x74, 0x20, 0xd5, 0xc6, 0xc9, 0xc6, 0x80, 0x99, 0x85, 0xb0, 0x5, 0x43, 0x13, 0x9b, 0x7c, 0x2b, 0xe9, 0xd7, 0x47, 0x75, 0x51, 0xb6, 0x10, 0x4d, 0x95, 0x15, 0xac, 0xac, 0x64, 0x3a, 0xcb, 0x85, 0x76, 0x83, 0xac, 0xd0, 0xcf, 0x6d, 0x44, 0x79, 0xdb, 0xac, 0x2f, 0x22, 0x13, 0x3a, 0xe3, 0xf7, 0x9, 0x1a, 0x9e, 0xaf, 0xd2, 0x7c, 0x8d, 0xdb, 0xc3, 0x4e, 0x64, 0x3b, 0xc5, 0x23, 0xe0, 0x1e, 0x2c, 0x1, 0x12, 0xfa, 0xf9, 0x17, 0x8, 0xcd, 0xde, 0xc5, 0xd5, 0xac, 0xc5, 0x73, 0x8d, 0x39, 0xa3, 0x1e, 0xd2, 0xbf, 0x7c, 0xc7, 0xa6, 0x39, 0xda, 0xf3, 0x44, 0xd2, 0x5b, 0xce, 0x61, 0xb, 0x86, 0x50, 0xb1, 0x69, 0x66, 0x1f, 0x16, 0x99, 0x8e, 0xa5, 0x8b, 0x6, 0x81, 0x8a, 0x1d, 0xac, 0x9c, 0xc8, 0xb4, 0x4f, 0x5b, 0x32, 0xc1, 0x4a, 0x53, 0xb1, 0xd9, 0xd6, 0x16, 0x21, 0x32, 0x61, 0xd0, 0xce, 0x1e, 0x3, 0xa6, 0xb6, 0x5e, 0xd3, 0x81, 0x53, 0x5b, 0xc2, 0x6c, 0x4a, 0x91, 0xad, 0xeb, 0x9e, 0xde, 0xeb, 0x2b, 0xe4, 0x7e, 0x10, 0x9a, 0xdd, 0x73, 0xdd, 0x22, 0x7b, 0x60, 0xc4, 0xc8, 0x6f, 0x32, 0xed, 0x5d, 0xc6, 0x21, 0xfd, 0xca, 0x4, 0x4a, 0x6f, 0x25, 0xfd, 0xb5, 0xc2, 0x75, 0xb, 0xb1, 0x79, 0x9d, 0x99, 0xd0, 0x34, 0x99, 0xb8, 0x65, 0x83, 0x36, 0x4e, 0x35, 0x58, 0x31, 0x62, 0xf3, 0x3c, 0xd0, 0x1f, 0xcf, 0xc6, 0xa, 0x54, 0x10, 0x99, 0xb0, 0x3b, 0xa8, 0x5d, 0xe, 0x70, 0x6c, 0xcc, 0xd4, 0x78, 0x93, 0xc1, 0x62, 0x1b, 0xf8, 0x2b, 0x49, 0x73, 0x41, 0xfd, 0x46, 0x3b, 0xeb, 0x90, 0xac, 0x26, 0x42, 0xb3, 0xbb, 0xf1, 0xd3, 0xf4, 0x78, 0xcf, 0x4a, 0x7e, 0x9e, 0x22, 0x9e, 0x32, 0xb3, 0x80, 0xfe, 0xb4, 0x95, 0xe7, 0x4c, 0x6d, 0x4e, 0x18, 0x5b, 0x74, 0x12, 0x68, 0x57, 0x55, 0xbb, 0x96, 0x19, 0xb4, 0x4f, 0xa1, 0x45, 0x51, 0xc8, 0xf4, 0xb8, 0x3d, 0xab, 0x93, 0x7a, 0xb0, 0x72, 0x65, 0xf9, 0xb1, 0x10, 0xfb, 0xa4, 0xfa, 0xcf, 0x25, 0x22, 0x13, 0xc6, 0x74, 0xe, 0xb1, 0x1b, 0x9d, 0x26, 0x53, 0xe3, 0x6d, 0xb2, 0x7, 0x53, 0x44, 0x19, 0xdb, 0xf7, 0xfa, 0x9e, 0x43, 0x84, 0xe6, 0x25, 0x43, 0xa0, 0xd5, 0xd8, 0x69, 0xb2, 0x49, 0xa3, 0x96, 0xb4, 0xb2, 0x2e, 0x66, 0x9c, 0xfa, 0x3a, 0xca, 0xb7, 0x92, 0x77, 0x49, 0xad, 0x4a, 0xb7, 0xc1, 0x32, 0xe0, 0x77, 0x9a, 0xee, 0xd2, 0x4f, 0x79, 0x2c, 0x6d, 0x32, 0xc, 0x56, 0xec, 0x19, 0x80, 0x90, 0x40, 0xe5, 0x4c, 0x6, 0x5c, 0xa7, 0x89, 0xc8, 0x84, 0xdd, 0x48, 0xe7, 0x50, 0xc6, 0x61, 0x2c, 0xce, 0xa4, 0xd9, 0xee, 0x5c, 0xb3, 0xe6, 0x32, 0x85, 0xec, 0x50, 0x13, 0xd6, 0xfa, 0xde, 0x1f, 0x2, 0xda, 0x79, 0xc1, 0x30, 0x68, 0xe4, 0x14, 0x6f, 0x25, 0x6c, 0xe3, 0x5c, 0xaa, 0x59, 0x17, 0xdf, 0x9d, 0xbf, 0xa7, 0xfa, 0xfe, 0xe1, 0x89, 0x95, 0xe, 0x34, 0x7c, 0xc6, 0xea, 0x91, 0x8c, 0xbc, 0x99, 0xa3, 0x47, 0x4a, 0x9, 0x5b, 0x7f, 0x69, 0x2, 0xea, 0xd0, 0x65, 0x42, 0x29, 0xb1, 0x6d, 0x10, 0xa8, 0x2c, 0xa4, 0xd9, 0x3a, 0x57, 0x44, 0x26, 0xb4, 0x76, 0x96, 0x87, 0x6, 0xf3, 0x18, 0xa2, 0xb7, 0x69, 0xf6, 0x72, 0x2d, 0xcf, 0x6b, 0x2e, 0x73, 0xae, 0x33, 0xb7, 0xd, 0x8c, 0x74, 0x53, 0x3d, 0xf3, 0x37, 0x16, 0xa7, 0xa8, 0xd8, 0x48, 0xf8, 0x54, 0xd7, 0x14, 0xb8, 0xf4, 0xec, 0x3b, 0xa7, 0x99, 0x6, 0x7d, 0x2e, 0x2a, 0xdd, 0x2f, 0x7c, 0xc6, 0xaa, 0x6a, 0xe7, 0x8b, 0xc4, 0xee, 0x3f, 0x54, 0xf8, 0x54, 0x12, 0xbe, 0x34, 0x28, 0xf5, 0x40, 0x25, 0x64, 0x66, 0x60, 0x36, 0x84, 0xd0, 0x44, 0x64, 0x82, 0x8f, 0xc0, 0x14, 0x19, 0x27, 0x93, 0xb9, 0x90, 0xf0, 0xec, 0xa5, 0x31, 0x3c, 0x14, 0x31, 0x7e, 0x46, 0x19, 0x9d, 0x90, 0xb5, 0x5f, 0x4d, 0xeb, 0xd0, 0xe5, 0x46, 0xa8, 0x53, 0xb4, 0xb3, 0x2e, 0xa9, 0xf5, 0x4d, 0x35, 0x4e, 0x7d, 0x4a, 0x88, 0x21, 0x30, 0xdd, 0x7d, 0xc4, 0x77, 0xac, 0x9e, 0x49, 0x3a, 0xeb, 0x33, 0x17, 0x12, 0xb6, 0x2e, 0xfc, 0x4a, 0xb7, 0x53, 0x4d, 0x97, 0xd9, 0x9b, 0x54, 0xf0, 0x1d, 0x63, 0xbd, 0xb, 0x4d, 0x44, 0x26, 0x18, 0xa, 0xc7, 0xeb, 0xdf, 0x47, 0x32, 0xb8, 0x21, 0xef, 0x6d, 0xb2, 0x90, 0x1e, 0xe7, 0xb5, 0xbf, 0x2f, 0xb0, 0x11, 0xe8, 0x30, 0xf3, 0xc0, 0x36, 0x52, 0xc1, 0x4f, 0x93, 0x32, 0x53, 0x53, 0xc1, 0x67, 0x3d, 0x2f, 0x2, 0xb3, 0xfb, 0xb1, 0x9a, 0xc2, 0x38, 0xd, 0x11, 0x98, 0x26, 0x50, 0x63, 0xa9, 0x85, 0xdb, 0x17, 0xfa, 0xb6, 0x51, 0xaf, 0x42, 0x13, 0x91, 0x9, 0x86, 0x37, 0x1e, 0x11, 0xd2, 0xd0, 0xac, 0x3d, 0x9d, 0xf2, 0x5a, 0xf2, 0xd9, 0xd4, 0x33, 0x94, 0xf3, 0x9a, 0x4b, 0x4, 0xa7, 0x45, 0x44, 0x4a, 0xc8, 0xee, 0x69, 0xc5, 0x52, 0xfc, 0xd7, 0xdb, 0x4d, 0x91, 0x33, 0x71, 0xcf, 0x84, 0x5c, 0x31, 0x3e, 0x7b, 0x19, 0xab, 0x85, 0x4c, 0x7b, 0xd6, 0x21, 0x64, 0x2c, 0x99, 0x36, 0x61, 0x7a, 0xdc, 0xf, 0x73, 0x32, 0xd8, 0x83, 0xe7, 0x73, 0xe8, 0x45, 0x68, 0x22, 0x32, 0xc1, 0x50, 0x46, 0x28, 0x32, 0x45, 0xe, 0x17, 0x9f, 0xad, 0xb5, 0xd1, 0x61, 0x6a, 0x3c, 0x3c, 0xca, 0xf5, 0x69, 0xaf, 0x54, 0x37, 0x17, 0xb4, 0x75, 0x8a, 0xbe, 0xc6, 0xd8, 0x64, 0x5d, 0x56, 0x9, 0xb7, 0x87, 0x6a, 0x7, 0xd7, 0xda, 0x40, 0x73, 0x62, 0x11, 0x74, 0x3f, 0x56, 0x97, 0x13, 0xb6, 0x7d, 0x66, 0x2c, 0xf9, 0xb0, 0x15, 0xff, 0xf5, 0xaa, 0xf0, 0xcc, 0x26, 0x20, 0xc0, 0xed, 0x45, 0x68, 0x22, 0x32, 0xc1, 0x47, 0x64, 0xd6, 0x23, 0x1a, 0x32, 0xe3, 0xa8, 0xf7, 0x45, 0x69, 0x39, 0x14, 0x6f, 0xee, 0x83, 0xed, 0xb, 0x6d, 0xba, 0x4f, 0x40, 0x50, 0xd6, 0xe8, 0x99, 0x22, 0x50, 0x60, 0xe6, 0x90, 0x75, 0xf9, 0xe8, 0xd1, 0x1e, 0xa7, 0x74, 0x9d, 0x56, 0x63, 0xf5, 0x7c, 0x4f, 0xdf, 0x32, 0x75, 0x12, 0x57, 0x19, 0x8c, 0xa5, 0xad, 0xa4, 0x3d, 0x13, 0x30, 0x44, 0x1f, 0xf2, 0x5d, 0xbf, 0x1a, 0x22, 0xfc, 0x11, 0x99, 0x10, 0x14, 0x51, 0xba, 0x3a, 0x69, 0x2c, 0x86, 0xd6, 0x5e, 0x93, 0x83, 0xd1, 0x69, 0x8e, 0x12, 0xe7, 0x4b, 0x8f, 0xf7, 0x2d, 0x84, 0x73, 0x93, 0x8d, 0xe0, 0xf6, 0xdd, 0x10, 0x95, 0x53, 0xd6, 0x65, 0xe1, 0x78, 0x7d, 0x29, 0x64, 0x9f, 0xda, 0xb2, 0xd6, 0xe3, 0xb5, 0x96, 0xe7, 0x63, 0x70, 0xa7, 0x7c, 0x1a, 0x54, 0xe8, 0x58, 0x42, 0x60, 0x76, 0xe3, 0x43, 0x7d, 0xab, 0x8c, 0x84, 0x2e, 0x7, 0x3a, 0xc8, 0x2b, 0xda, 0x1e, 0x1e, 0x79, 0xe7, 0x78, 0xfd, 0x2e, 0x82, 0xcf, 0x78, 0x65, 0x19, 0x5c, 0xc, 0x4e, 0x37, 0xac, 0xb4, 0x80, 0x74, 0x89, 0xc8, 0xb, 0x21, 0x63, 0xec, 0x5b, 0xda, 0x29, 0x27, 0xa7, 0xa8, 0x4, 0x66, 0x71, 0xe0, 0x75, 0xd5, 0x6, 0x9f, 0x18, 0x66, 0x9d, 0x90, 0x52, 0x45, 0x82, 0x4b, 0xc6, 0xd2, 0x28, 0x98, 0xd9, 0x95, 0xaf, 0xe2, 0xde, 0xe8, 0xab, 0xc6, 0xf6, 0xbd, 0x74, 0x50, 0x66, 0x8d, 0x4c, 0x26, 0x28, 0x5c, 0x1b, 0x3c, 0x62, 0x11, 0x18, 0xa9, 0x1e, 0x5, 0x39, 0x26, 0x3e, 0xeb, 0x33, 0x7d, 0x84, 0x68, 0xca, 0x5c, 0x88, 0xdf, 0x26, 0xa8, 0xdc, 0x9c, 0xe2, 0x3b, 0xc6, 0xeb, 0xa0, 0x2, 0x21, 0x5, 0x7c, 0xf, 0x7c, 0x40, 0x60, 0xf6, 0xd7, 0x8f, 0x7c, 0x3, 0x96, 0xcb, 0x2e, 0xec, 0x3e, 0x22, 0x13, 0x8e, 0xc4, 0x5d, 0x84, 0x9d, 0xe9, 0xae, 0x74, 0xa9, 0xc5, 0x6f, 0x5d, 0xd7, 0x45, 0xa6, 0xed, 0xa3, 0x8c, 0xec, 0x12, 0xa7, 0xb8, 0xd7, 0x6e, 0xcc, 0x1d, 0x76, 0x83, 0x2c, 0x26, 0xec, 0x8e, 0x25, 0x9f, 0x35, 0xde, 0xf, 0x8, 0xcc, 0x5e, 0x9, 0xb1, 0x55, 0x6a, 0x59, 0x43, 0x81, 0xc8, 0x84, 0x36, 0xb8, 0x32, 0x34, 0x94, 0x8b, 0x48, 0x9f, 0x2b, 0x8f, 0x40, 0xa2, 0x94, 0xfc, 0xb2, 0x99, 0x66, 0xed, 0x18, 0x4e, 0x31, 0xdc, 0x6e, 0xac, 0x11, 0x9, 0xb0, 0x33, 0x96, 0xae, 0x19, 0x4b, 0x51, 0x9, 0x4d, 0xdf, 0xcd, 0x9f, 0x37, 0x6d, 0xfe, 0x23, 0x44, 0x26, 0x4c, 0x61, 0x3d, 0x26, 0xf4, 0x8f, 0x4f, 0x89, 0x99, 0x8f, 0x99, 0xb5, 0x89, 0xcf, 0xe6, 0x84, 0x5c, 0x9d, 0xa2, 0xcb, 0x6e, 0x7c, 0x66, 0x48, 0x81, 0x85, 0x12, 0x98, 0x85, 0xc7, 0xfb, 0x4e, 0x85, 0x99, 0xb3, 0xa1, 0xa8, 0xc4, 0xaf, 0xf2, 0x43, 0xab, 0x23, 0x4c, 0x11, 0x99, 0x79, 0xa3, 0x6, 0x3d, 0x99, 0x4c, 0x30, 0x6, 0xa7, 0x72, 0xbc, 0x67, 0x2e, 0x2d, 0xa7, 0x4e, 0x26, 0x84, 0xef, 0x91, 0x7d, 0xb9, 0x3a, 0xc5, 0x43, 0x6d, 0x53, 0x23, 0x14, 0x60, 0xc7, 0x6e, 0xf8, 0xac, 0x69, 0x5e, 0xe2, 0x6f, 0x6, 0x67, 0x2d, 0x7e, 0x87, 0x24, 0x2c, 0xa5, 0xe1, 0x4c, 0x16, 0x22, 0x93, 0xc1, 0xef, 0x12, 0x98, 0x4c, 0x5b, 0xe4, 0x83, 0xcf, 0xda, 0xcc, 0xf, 0x99, 0x4, 0x5f, 0x3e, 0x91, 0x7b, 0xae, 0x4e, 0x51, 0x65, 0x36, 0x8e, 0x8, 0x4c, 0xc1, 0x3, 0xdf, 0x69, 0xf2, 0x8d, 0xa4, 0x7d, 0x68, 0x41, 0xcc, 0x9c, 0x8b, 0xff, 0x11, 0xa6, 0xc1, 0x85, 0xda, 0x11, 0x99, 0x79, 0xe3, 0x9a, 0xfe, 0xfc, 0x42, 0x13, 0x65, 0x45, 0x25, 0xee, 0x6c, 0xe6, 0x22, 0x83, 0x76, 0xf0, 0x31, 0xa6, 0x39, 0x3b, 0xc5, 0xd2, 0xf1, 0x3a, 0x4b, 0x6c, 0xc0, 0x70, 0x29, 0x7e, 0x4b, 0x4e, 0x28, 0xd8, 0x3f, 0x1e, 0xbe, 0xa7, 0xc0, 0x15, 0xd2, 0x60, 0xc9, 0x14, 0x22, 0x33, 0x5f, 0x5c, 0x53, 0x9f, 0xaa, 0xc3, 0xad, 0x69, 0xa6, 0xec, 0x70, 0x9, 0xa7, 0x42, 0xd2, 0xde, 0x0, 0x34, 0xf7, 0xb8, 0xbf, 0xdc, 0x9d, 0xe2, 0xef, 0x1e, 0xc1, 0xa, 0x40, 0xe9, 0x19, 0x94, 0xa6, 0x54, 0x3, 0x74, 0xaa, 0x6c, 0x3d, 0x83, 0xe6, 0xa5, 0xf8, 0xd5, 0x38, 0x45, 0x64, 0x82, 0x33, 0x22, 0x61, 0xca, 0x2b, 0x4f, 0x94, 0x40, 0xa8, 0x1d, 0xef, 0x49, 0x75, 0xca, 0xdc, 0x77, 0x6a, 0x2f, 0x77, 0xa7, 0xe8, 0x2a, 0x79, 0x86, 0x60, 0x0, 0xf1, 0x1c, 0x4b, 0x57, 0x4, 0x25, 0xd1, 0x70, 0xe5, 0xe9, 0xf7, 0x83, 0x8e, 0x1a, 0x46, 0x64, 0xe6, 0x1b, 0x61, 0x96, 0x8e, 0xf7, 0x50, 0xe3, 0x2e, 0x5f, 0x3e, 0x79, 0xf4, 0x9f, 0x54, 0x3, 0x2f, 0xd7, 0xd4, 0x1e, 0x4e, 0xf1, 0xf0, 0xc, 0x8, 0x1b, 0x7e, 0x40, 0x71, 0x26, 0xee, 0x4d, 0x82, 0x2a, 0x98, 0x65, 0x1d, 0x66, 0x5c, 0xf8, 0x1e, 0xce, 0xb1, 0x40, 0x64, 0xc2, 0x21, 0x5c, 0x9b, 0x1a, 0x2a, 0x9c, 0x45, 0xd6, 0xb8, 0xa2, 0x59, 0xe5, 0x3c, 0x66, 0x9, 0xde, 0xb7, 0x4b, 0x3c, 0xe3, 0x14, 0x11, 0x99, 0xe0, 0xe6, 0x48, 0xfc, 0x36, 0xce, 0xf9, 0x8, 0x1a, 0x18, 0x96, 0x7, 0xf1, 0x3f, 0x9c, 0xc3, 0x6b, 0x13, 0x10, 0x22, 0x33, 0x3f, 0x4a, 0xf, 0x67, 0x4a, 0x8d, 0xbb, 0xbc, 0xa9, 0x3d, 0x84, 0xe6, 0xbb, 0xc, 0xdb, 0xe5, 0x1c, 0xa7, 0xe8, 0xb5, 0x89, 0x3, 0xf2, 0xc6, 0x67, 0x46, 0x40, 0xd9, 0x97, 0x8a, 0xa6, 0x8a, 0x12, 0x9f, 0xd9, 0x9a, 0x42, 0x3c, 0x37, 0x1, 0x21, 0x32, 0xf3, 0xc3, 0x15, 0x61, 0x2a, 0x81, 0xb1, 0xa6, 0x99, 0xb2, 0xc7, 0x55, 0x59, 0xa0, 0xcc, 0xac, 0x3d, 0x2a, 0x61, 0x9d, 0xb2, 0x62, 0x46, 0x13, 0x80, 0x23, 0x8, 0x39, 0xf3, 0x8, 0x44, 0xce, 0x69, 0xaa, 0xa8, 0xf1, 0xc9, 0x66, 0x9e, 0xfd, 0xe5, 0x6f, 0xff, 0x70, 0x66, 0x33, 0x11, 0x99, 0x79, 0xe1, 0xb3, 0x73, 0x96, 0xe9, 0x40, 0x10, 0x8f, 0x48, 0x36, 0x37, 0x91, 0x49, 0x89, 0x15, 0x3f, 0xbe, 0xd3, 0x4, 0x59, 0xe3, 0xbb, 0xae, 0xb9, 0xa6, 0xa9, 0xa2, 0xb7, 0xff, 0x6b, 0x8f, 0x80, 0xc2, 0x99, 0xcd, 0x44, 0x64, 0xe6, 0x15, 0x61, 0xba, 0x76, 0x85, 0xd5, 0x42, 0x16, 0x13, 0x9e, 0xfb, 0x82, 0xcf, 0x79, 0xe6, 0x39, 0xb0, 0xc6, 0x29, 0x6, 0xf5, 0x1b, 0xc8, 0xd7, 0xc7, 0xf8, 0x64, 0x31, 0xd9, 0x54, 0x3a, 0xd, 0x3a, 0xc9, 0x66, 0x22, 0x32, 0xf3, 0x8a, 0x30, 0x8b, 0xe, 0x3a, 0x15, 0xe4, 0x15, 0xcd, 0x1e, 0x22, 0x87, 0xa9, 0x53, 0xa6, 0xf6, 0x0, 0xfc, 0x7d, 0x8c, 0x4f, 0x16, 0x93, 0x75, 0xbb, 0xd3, 0x9, 0x18, 0x97, 0x1e, 0x81, 0xc5, 0x47, 0x44, 0x26, 0xcc, 0x3c, 0x3a, 0x8b, 0x12, 0x14, 0x6b, 0x9a, 0xa, 0x2c, 0x5c, 0x27, 0xb7, 0xbc, 0xc9, 0xa0, 0xd, 0x70, 0x8a, 0x61, 0x1c, 0xd3, 0x4, 0xd9, 0xb2, 0xf0, 0x8, 0xd8, 0xc8, 0x62, 0x4e, 0x8b, 0x4f, 0x1e, 0xf6, 0xef, 0x60, 0x36, 0x13, 0x91, 0x99, 0x3e, 0xbe, 0x5, 0xa6, 0xc9, 0x62, 0xc2, 0xbe, 0xc0, 0xc3, 0x15, 0xbc, 0xa4, 0xc, 0x4e, 0x11, 0xc0, 0x5f, 0x60, 0x16, 0x4, 0x6c, 0x49, 0xda, 0xc0, 0xb5, 0x87, 0xc6, 0x98, 0x23, 0x32, 0xf3, 0xe5, 0xc2, 0x43, 0xc, 0xac, 0x85, 0x72, 0x12, 0xb0, 0xdf, 0xc0, 0xd4, 0x19, 0x8b, 0xcc, 0xd, 0x4e, 0x11, 0xc0, 0xb, 0xd7, 0x29, 0x60, 0x4, 0x6c, 0xd3, 0xc5, 0xe7, 0xb9, 0x5d, 0x20, 0x32, 0xf3, 0x8d, 0x2e, 0x29, 0x27, 0x1, 0x6d, 0xa8, 0x1d, 0xaf, 0x17, 0x9, 0xdf, 0x3b, 0xd9, 0xfd, 0xfd, 0xf6, 0x42, 0x32, 0xe, 0x3c, 0x60, 0xbf, 0xd, 0x28, 0x1d, 0xef, 0x59, 0x13, 0xb0, 0x4d, 0xda, 0x7, 0xac, 0x5d, 0x7d, 0xe0, 0x2f, 0x7f, 0xfb, 0x47, 0x89, 0xc8, 0xcc, 0xb, 0x65, 0xec, 0x7d, 0xce, 0x18, 0xe5, 0xd4, 0x5, 0x38, 0x44, 0x95, 0xa9, 0xc8, 0xdc, 0x8, 0x3b, 0xa5, 0xf7, 0xb1, 0xcd, 0xb4, 0x3f, 0xc0, 0xcb, 0xf8, 0x14, 0xe5, 0x26, 0x8b, 0x39, 0x6d, 0x7c, 0x9e, 0xdf, 0x7, 0x44, 0x66, 0x3e, 0xa8, 0x35, 0x12, 0x37, 0xe2, 0x77, 0xea, 0x2, 0x5, 0xa6, 0xe1, 0x10, 0xae, 0xba, 0x87, 0xa9, 0x8a, 0xa, 0x9c, 0x62, 0xf3, 0xe0, 0x16, 0xf2, 0x62, 0x4e, 0xc0, 0x96, 0x45, 0x70, 0xe9, 0xa, 0x30, 0x17, 0xfb, 0x36, 0x0, 0x21, 0x32, 0xd3, 0x14, 0x98, 0xb7, 0x1e, 0xce, 0x5f, 0x65, 0x2f, 0x29, 0x30, 0xd, 0x2e, 0x5c, 0xce, 0xe1, 0xf7, 0x44, 0xef, 0xb9, 0xe2, 0xd1, 0xbf, 0x88, 0xab, 0x6d, 0x4a, 0x9a, 0x28, 0xab, 0xa0, 0xc2, 0xe5, 0x6b, 0x38, 0xa6, 0x38, 0x9f, 0xc0, 0x7b, 0x8e, 0xc8, 0xcc, 0x43, 0x60, 0xfa, 0x64, 0x13, 0xde, 0xb, 0xd3, 0xe4, 0xd0, 0x5e, 0x64, 0xe6, 0x6a, 0x4c, 0xe9, 0x13, 0x2f, 0xf3, 0x8e, 0x26, 0xca, 0x6, 0x9f, 0xd, 0x3f, 0xcc, 0x96, 0xa5, 0x81, 0xcf, 0x46, 0xc8, 0x77, 0x88, 0x4c, 0x4, 0xa6, 0x62, 0x29, 0x64, 0x6a, 0xa0, 0x1b, 0x41, 0x51, 0x26, 0x6a, 0x4c, 0xe1, 0x65, 0xee, 0x1d, 0xaf, 0xcf, 0x69, 0xa2, 0x6c, 0x70, 0x3d, 0xeb, 0x35, 0x4d, 0x94, 0xc, 0x3e, 0x1, 0xc3, 0x7c, 0x77, 0xca, 0x1c, 0x91, 0x99, 0x9f, 0xc0, 0x54, 0x83, 0x9e, 0x5d, 0xb3, 0x0, 0xfb, 0xa9, 0x84, 0xf5, 0x63, 0x3e, 0x6d, 0x74, 0x88, 0x2, 0xa1, 0x99, 0x5, 0x4c, 0x95, 0xe7, 0xc7, 0x97, 0xd0, 0xc0, 0x3, 0x91, 0x99, 0x97, 0xc0, 0x54, 0xb, 0x77, 0x29, 0x57, 0x4, 0xa1, 0x6c, 0x33, 0xba, 0x57, 0x9c, 0xa2, 0x5f, 0x7f, 0x70, 0x9, 0xf1, 0x8f, 0x34, 0x53, 0xf2, 0x94, 0x8e, 0xd7, 0xeb, 0xcc, 0x6c, 0x47, 0xe, 0x4, 0x4f, 0x99, 0x23, 0x32, 0xa7, 0x1f, 0x49, 0x7e, 0xb, 0x10, 0x98, 0x27, 0xc2, 0x3a, 0x4c, 0x8, 0x27, 0xa7, 0x3e, 0xc3, 0x54, 0x79, 0x37, 0xed, 0xa4, 0x4, 0xc8, 0x19, 0xcd, 0x94, 0x34, 0xef, 0x18, 0x4b, 0x8c, 0xfd, 0x3d, 0x90, 0xc9, 0x4c, 0x4, 0x65, 0xc0, 0xbf, 0x8a, 0xbb, 0x4c, 0x91, 0x11, 0x9, 0xd4, 0xc3, 0x4, 0x70, 0x7, 0x62, 0x8c, 0x11, 0x3f, 0x7c, 0x32, 0xbe, 0xea, 0x14, 0x90, 0x82, 0xa6, 0x4a, 0x96, 0xd2, 0xf1, 0xfa, 0x1d, 0x4d, 0x94, 0x24, 0xce, 0x29, 0x73, 0xbb, 0x30, 0x3b, 0x22, 0x73, 0x7a, 0x98, 0x1a, 0x98, 0x97, 0x9e, 0xef, 0x57, 0x4e, 0xf3, 0x44, 0x98, 0xb6, 0x80, 0x71, 0x1c, 0x4d, 0x6a, 0xc2, 0x9, 0x9e, 0x5, 0x79, 0xe5, 0x69, 0xab, 0x8e, 0x68, 0xae, 0x2c, 0xc7, 0x3d, 0x99, 0xcc, 0x34, 0xa9, 0x3c, 0xde, 0x73, 0x8c, 0xc8, 0x9c, 0x26, 0x2a, 0xd, 0xfd, 0x4d, 0xfc, 0x17, 0xd5, 0x23, 0x30, 0x1, 0xc2, 0x84, 0x13, 0xf8, 0xe3, 0xb3, 0x81, 0x50, 0x2d, 0xe5, 0xb9, 0x45, 0x68, 0x26, 0xc7, 0x31, 0x2, 0x33, 0x5b, 0x1e, 0x24, 0xa0, 0x56, 0x2e, 0x22, 0x73, 0x1a, 0x14, 0xda, 0x50, 0x87, 0x64, 0x5, 0x94, 0xc3, 0x7c, 0x8b, 0xe3, 0x4, 0x80, 0x9e, 0xa8, 0xc4, 0x2f, 0xab, 0x61, 0x84, 0x66, 0x41, 0x93, 0x25, 0x43, 0xe9, 0x78, 0x9d, 0xa9, 0xf2, 0xf4, 0xc7, 0x3e, 0x22, 0x33, 0x11, 0x71, 0x79, 0x2d, 0x4f, 0xd9, 0xcb, 0x32, 0xe0, 0xf7, 0xcc, 0x26, 0x9f, 0x9a, 0x26, 0x4, 0x80, 0x1e, 0xf1, 0x5d, 0xeb, 0xad, 0x84, 0xe6, 0x57, 0xe1, 0x34, 0xa0, 0x54, 0x70, 0x6d, 0x36, 0x25, 0xb9, 0x91, 0x36, 0xce, 0x20, 0xc2, 0xac, 0xcb, 0x44, 0x64, 0xc6, 0x2f, 0x2e, 0x17, 0x81, 0xbf, 0xbb, 0x96, 0xa7, 0xc, 0x26, 0x1b, 0x18, 0x0, 0xa0, 0x6f, 0x54, 0x20, 0xeb, 0x5b, 0x77, 0xd7, 0x94, 0x5b, 0xbb, 0x14, 0xa6, 0xcf, 0xa7, 0xee, 0x9f, 0x5c, 0xcf, 0xaf, 0xa2, 0x99, 0x92, 0xc6, 0xe7, 0xf9, 0xce, 0x10, 0x99, 0x71, 0x71, 0xa4, 0x5, 0xe5, 0x6d, 0x43, 0x71, 0x69, 0xb2, 0xa, 0x9c, 0x47, 0xe, 0x0, 0x43, 0x72, 0x25, 0x61, 0x27, 0xbb, 0x9c, 0x69, 0x1b, 0x47, 0x89, 0xa3, 0xe9, 0x8a, 0x4c, 0x4, 0x26, 0xb8, 0x9e, 0xf3, 0x1b, 0x44, 0x66, 0x1c, 0x83, 0x55, 0x89, 0x49, 0xb5, 0xd6, 0xf2, 0x87, 0x3c, 0x65, 0x2f, 0xcb, 0x6, 0x7f, 0xc7, 0xac, 0xbf, 0x5c, 0xd3, 0xa4, 0x0, 0x30, 0x2, 0xa7, 0x81, 0xe2, 0x42, 0x5, 0xd5, 0x97, 0x96, 0xd8, 0x24, 0xb3, 0x39, 0x1d, 0x5c, 0x9b, 0x7e, 0x98, 0x2a, 0xcf, 0x3, 0xd7, 0x73, 0x26, 0x93, 0x39, 0x30, 0x47, 0xf2, 0x5c, 0xa0, 0xd8, 0x4c, 0x85, 0x7f, 0xd3, 0xdf, 0xb7, 0x39, 0x82, 0x4d, 0x65, 0x11, 0xd8, 0x41, 0xe, 0x0, 0x63, 0xf3, 0x5e, 0xc2, 0xb3, 0x58, 0x85, 0x25, 0x36, 0xaf, 0xc5, 0xef, 0x60, 0x9, 0x18, 0x97, 0xc2, 0xf1, 0xfa, 0x3d, 0x4d, 0x94, 0x5, 0xae, 0xe7, 0xfc, 0xbf, 0xb1, 0xfc, 0xca, 0xe3, 0x4d, 0xb7, 0xb4, 0x65, 0x6b, 0x71, 0xd9, 0x87, 0xe1, 0xdc, 0xea, 0xec, 0x1, 0xe2, 0x12, 0x0, 0x62, 0xc0, 0x94, 0x4c, 0x53, 0x62, 0x71, 0xd1, 0xc0, 0x4e, 0x2e, 0xf4, 0xa5, 0x6c, 0x9a, 0xaa, 0x59, 0xaa, 0xca, 0xe0, 0xd4, 0x34, 0xeb, 0xe4, 0x44, 0x26, 0xcf, 0x2c, 0xf, 0x9c, 0xda, 0xe3, 0x2f, 0x7f, 0xfb, 0xc7, 0xec, 0x95, 0xc7, 0xc0, 0x2f, 0x69, 0xcb, 0xa8, 0x50, 0x3, 0x58, 0x2d, 0xb4, 0x5f, 0xd3, 0x14, 0xa3, 0x51, 0x5a, 0x41, 0xd8, 0x9f, 0x76, 0xfe, 0xed, 0x50, 0x80, 0xf1, 0x70, 0x60, 0x60, 0xd6, 0x3b, 0xc6, 0xf9, 0xce, 0xe3, 0x77, 0x0, 0x62, 0xe4, 0x54, 0xf7, 0xdf, 0xa6, 0x1b, 0x7c, 0x66, 0xfa, 0xba, 0x44, 0x70, 0x4e, 0x52, 0x64, 0x56, 0x34, 0x11, 0x22, 0xd3, 0xf8, 0xc0, 0x57, 0xb4, 0xd3, 0xa4, 0xb2, 0x4, 0x6a, 0x6a, 0xfc, 0x93, 0xb0, 0x73, 0x7c, 0x8, 0x8c, 0x40, 0x3c, 0xd6, 0x46, 0xb5, 0xe8, 0x20, 0xe0, 0x6a, 0x1b, 0xb4, 0x6d, 0x2d, 0xd1, 0xa9, 0xbe, 0xde, 0x8b, 0x5f, 0x61, 0x5c, 0x80, 0xa1, 0x59, 0xeb, 0x7e, 0x79, 0xdd, 0xb2, 0xcf, 0xef, 0xa, 0x4e, 0xf5, 0x37, 0xbf, 0xd0, 0xe7, 0xa3, 0x15, 0x99, 0x4, 0x2, 0xf9, 0x9, 0xcd, 0x43, 0x33, 0xb5, 0xc7, 0x88, 0xcc, 0xf8, 0x51, 0x83, 0x76, 0xa5, 0x23, 0x79, 0xc4, 0x65, 0x7f, 0xcc, 0xb4, 0x33, 0x3c, 0xd6, 0xdf, 0x17, 0x91, 0x7e, 0x46, 0x79, 0xc1, 0x69, 0xd7, 0xfa, 0x52, 0xce, 0xf7, 0xbb, 0xf5, 0x3d, 0xc0, 0x98, 0xb6, 0x4b, 0x4d, 0x9f, 0x2f, 0xa4, 0x9b, 0xb2, 0x45, 0x46, 0x70, 0x9a, 0x5d, 0xe9, 0xca, 0x26, 0xde, 0xe9, 0x7e, 0x4e, 0xb6, 0x7f, 0xb8, 0xe0, 0xdb, 0xf5, 0xcc, 0x21, 0x1f, 0x9c, 0x9a, 0x4, 0x91, 0x19, 0x2f, 0xca, 0x80, 0x9a, 0x69, 0x22, 0xe8, 0xc7, 0x58, 0xce, 0xb5, 0xa8, 0x9c, 0xcb, 0xf4, 0x77, 0xb7, 0x16, 0xb2, 0x3f, 0xdb, 0xba, 0xd5, 0xd7, 0x3d, 0xce, 0x18, 0x46, 0x62, 0xad, 0xed, 0xd8, 0x47, 0xe9, 0x76, 0x27, 0xf9, 0x5c, 0x9e, 0x37, 0x4d, 0x9a, 0x8c, 0x3e, 0xa2, 0x73, 0x98, 0x40, 0x17, 0x91, 0x9, 0xa2, 0xc7, 0x5a, 0x79, 0xa8, 0xbf, 0x20, 0x32, 0xe3, 0x13, 0x96, 0x5f, 0x84, 0xac, 0x65, 0xdf, 0xc2, 0xf2, 0x9d, 0xb4, 0xdb, 0xd1, 0x3f, 0x35, 0xa7, 0x30, 0xdb, 0x63, 0x18, 0x6c, 0x87, 0xc, 0xd0, 0x37, 0xca, 0x9e, 0xa9, 0x19, 0x19, 0xb5, 0xdc, 0x67, 0xa1, 0x5, 0x67, 0xd1, 0xc3, 0xd8, 0x46, 0x74, 0x8e, 0xb, 0x22, 0x13, 0x7e, 0x1a, 0x97, 0x88, 0xcc, 0xf1, 0xa3, 0x80, 0xad, 0x36, 0x84, 0x64, 0x2c, 0xfb, 0x43, 0x39, 0x9e, 0xf, 0x19, 0x9, 0x4b, 0x17, 0xe5, 0x4e, 0xf4, 0x59, 0xc9, 0xf3, 0x3a, 0x37, 0x9c, 0x31, 0xf4, 0x2d, 0x36, 0xaf, 0xf4, 0xd5, 0xe7, 0xb8, 0xdc, 0x15, 0x9d, 0x4, 0x57, 0xc3, 0xf0, 0x1f, 0x9a, 0x20, 0x2b, 0x9c, 0xc7, 0x4b, 0x22, 0x32, 0xfb, 0x8f, 0xea, 0x4c, 0x64, 0x67, 0x6f, 0xd6, 0xa8, 0x71, 0xe6, 0xfd, 0x47, 0x50, 0xf2, 0x94, 0x2d, 0x59, 0x48, 0x9c, 0xeb, 0x2b, 0x63, 0x15, 0x9d, 0xb5, 0x25, 0x3a, 0x9, 0x7c, 0xa0, 0x4f, 0x36, 0xfa, 0x2a, 0x2c, 0xc1, 0x39, 0x1b, 0xa8, 0x9f, 0x1b, 0x9b, 0x6c, 0x8b, 0x4e, 0x66, 0x8f, 0xdc, 0x50, 0x88, 0x1d, 0x82, 0xc6, 0x9c, 0x4b, 0x64, 0xaa, 0x81, 0x77, 0x42, 0x3b, 0xc1, 0x84, 0x50, 0xe, 0xeb, 0x42, 0xc6, 0x5b, 0x67, 0x59, 0x35, 0xf8, 0xbc, 0x45, 0x64, 0xed, 0xb7, 0xd0, 0xd7, 0x83, 0x25, 0x2, 0x0, 0xfa, 0xc, 0xc6, 0x4d, 0x76, 0x73, 0x28, 0xc1, 0x29, 0xf2, 0xeb, 0x46, 0xa2, 0x7a, 0x47, 0x74, 0xd6, 0x3c, 0x1a, 0x80, 0x76, 0x41, 0x5, 0x99, 0x4c, 0x48, 0x5, 0x73, 0x4c, 0xdd, 0xa2, 0x47, 0x47, 0x58, 0xcb, 0xaf, 0xe5, 0x83, 0xea, 0x8e, 0x9d, 0x91, 0x5d, 0x5b, 0x53, 0x7d, 0xff, 0xc6, 0x72, 0x88, 0x47, 0xd6, 0xd7, 0xa1, 0xda, 0x74, 0x41, 0xd7, 0x82, 0x91, 0x4, 0xa7, 0xbd, 0x86, 0xba, 0x1c, 0xa0, 0xdf, 0xdb, 0x1, 0x16, 0xa2, 0xb3, 0x19, 0x1c, 0xde, 0x2, 0x88, 0x4c, 0x48, 0xe, 0x95, 0xb9, 0xec, 0x72, 0xd7, 0xaa, 0x71, 0x2e, 0xf7, 0xf2, 0x3c, 0xa5, 0x36, 0x14, 0xbb, 0x75, 0x2f, 0x5f, 0x9a, 0xb2, 0x2e, 0x2d, 0x11, 0x6a, 0x4a, 0x2e, 0x71, 0x24, 0x1f, 0xa4, 0x84, 0x1a, 0xb, 0x6b, 0x79, 0x3e, 0x78, 0x42, 0xf5, 0xf9, 0x63, 0xf9, 0x75, 0xda, 0x1b, 0xd1, 0x9, 0x80, 0xc8, 0x4, 0xe8, 0x1c, 0xe5, 0x68, 0xae, 0xa5, 0xfd, 0x74, 0xae, 0xed, 0x3c, 0xa6, 0xb2, 0xb3, 0xbf, 0x7a, 0x41, 0x84, 0x96, 0xba, 0x3d, 0x4c, 0xbd, 0x4f, 0x84, 0x27, 0xa4, 0x42, 0xa5, 0xaf, 0x95, 0xfe, 0x79, 0x6e, 0x89, 0xce, 0x21, 0xfa, 0xf9, 0xae, 0xe8, 0xdc, 0xee, 0xd8, 0xd, 0x0, 0x40, 0x64, 0x42, 0x2, 0xa8, 0xc, 0x9e, 0xc9, 0x5e, 0xb6, 0x11, 0x96, 0xa6, 0x16, 0x69, 0x4a, 0x8b, 0xd5, 0x8d, 0xf8, 0x5c, 0xef, 0x8, 0xcf, 0x21, 0x33, 0x40, 0x0, 0x43, 0xb0, 0xb1, 0xc4, 0x9d, 0x7d, 0x42, 0xd7, 0x50, 0xfd, 0x7c, 0x5f, 0x71, 0x78, 0x53, 0xa5, 0xa1, 0xe6, 0xf1, 0x0, 0x20, 0x32, 0x61, 0x7a, 0x28, 0xa3, 0x7e, 0x23, 0xcd, 0xb2, 0x97, 0x66, 0xfa, 0x2d, 0x35, 0x61, 0xe9, 0x23, 0x3c, 0xd5, 0xb5, 0xb2, 0x44, 0xa7, 0x59, 0xe7, 0x46, 0xa6, 0x13, 0x52, 0xe0, 0xe1, 0x85, 0x7e, 0x6e, 0x32, 0xfa, 0xa5, 0xf4, 0xbf, 0xa6, 0xd3, 0x2e, 0x99, 0xc4, 0x99, 0xeb, 0x0, 0x88, 0x4c, 0x98, 0x18, 0x2a, 0x63, 0x70, 0xd9, 0xe0, 0xf7, 0x6a, 0xed, 0x78, 0xd6, 0x34, 0xe1, 0x4f, 0xa2, 0x53, 0xe4, 0x79, 0x37, 0xef, 0xb1, 0x50, 0x47, 0x14, 0xd2, 0xed, 0xe7, 0x62, 0x89, 0xcd, 0x37, 0xf2, 0xbc, 0xac, 0xa4, 0xcf, 0x60, 0xd8, 0x3e, 0x73, 0x1d, 0xc1, 0x9, 0x88, 0x4c, 0x80, 0x88, 0x51, 0x6b, 0x2f, 0x17, 0xd, 0x9c, 0xcc, 0x4a, 0x28, 0xbc, 0xec, 0x12, 0xe0, 0xfb, 0x76, 0xf3, 0x22, 0x38, 0x21, 0x35, 0xcc, 0x11, 0xab, 0x62, 0x5, 0x58, 0xb6, 0xe8, 0xec, 0x2b, 0xab, 0x6f, 0xb, 0xce, 0xca, 0x12, 0x9c, 0xd4, 0xe5, 0x4, 0x44, 0x26, 0xc0, 0xc8, 0x28, 0xe1, 0x73, 0x1b, 0xe8, 0x0, 0x94, 0x70, 0x3a, 0x45, 0x5c, 0x6, 0x63, 0xef, 0xe6, 0x35, 0xe5, 0x8b, 0x86, 0xa8, 0x57, 0x8, 0x30, 0x56, 0x80, 0xb5, 0xde, 0xb1, 0x35, 0x4a, 0x6c, 0xf6, 0xb9, 0x99, 0xa8, 0xd4, 0xd7, 0xa5, 0xfe, 0xbf, 0x3f, 0xc9, 0xb4, 0xb2, 0x9b, 0xf7, 0x1e, 0x42, 0x1e, 0xf1, 0xc, 0x86, 0xcf, 0x88, 0x4c, 0x48, 0x49, 0x60, 0x9a, 0xf3, 0x91, 0xaf, 0x68, 0xba, 0x4e, 0x4, 0xa7, 0xc9, 0x70, 0xde, 0xa, 0x1b, 0x86, 0x20, 0x8f, 0x3e, 0xbf, 0xbb, 0x99, 0xc8, 0x88, 0x4e, 0x95, 0xd9, 0x2f, 0x3a, 0xb6, 0x6d, 0x67, 0xfa, 0xda, 0x68, 0xb1, 0x59, 0x4d, 0xa4, 0x8d, 0xe, 0x71, 0x4e, 0x70, 0x9f, 0xf, 0xff, 0xfe, 0xd7, 0x3f, 0x9d, 0xef, 0xf9, 0x23, 0xcd, 0x4, 0x89, 0x8, 0x4c, 0x65, 0xd8, 0xde, 0x22, 0x30, 0x1, 0xa0, 0x63, 0xd1, 0xa9, 0x84, 0xd3, 0x6b, 0x7d, 0xa9, 0x19, 0x92, 0xb5, 0x74, 0x9b, 0xad, 0x9b, 0x6b, 0x5b, 0x97, 0x42, 0x30, 0xc7, 0xac, 0x7, 0x20, 0x32, 0x21, 0x29, 0x81, 0xf9, 0xa0, 0x9d, 0x80, 0x3a, 0xfe, 0xb4, 0xa6, 0xe9, 0x0, 0xa0, 0x27, 0x6a, 0x2d, 0x30, 0x95, 0xd0, 0xfc, 0x4d, 0x7, 0xb5, 0x4b, 0xe9, 0xae, 0x52, 0x45, 0xa9, 0xed, 0x5e, 0xd3, 0xea, 0x19, 0x43, 0xb5, 0xc1, 0x21, 0xfe, 0x44, 0x37, 0x1, 0x44, 0x26, 0xc4, 0xce, 0xb5, 0xa7, 0xc0, 0xac, 0xb5, 0xb8, 0x24, 0x7b, 0x9, 0x0, 0x43, 0xa3, 0xc4, 0xe5, 0x4a, 0x8b, 0xcd, 0xd7, 0x3a, 0xd8, 0xed, 0x42, 0x70, 0xaa, 0xcc, 0xe6, 0x37, 0x79, 0xaa, 0x5, 0x3c, 0x35, 0x91, 0x49, 0x26, 0x13, 0x10, 0x99, 0x10, 0x35, 0x97, 0xe2, 0xb7, 0xb3, 0x79, 0xab, 0x8d, 0xfb, 0x96, 0x26, 0x3, 0x80, 0x8, 0xc4, 0xd7, 0x55, 0xc7, 0x82, 0x73, 0xf9, 0x78, 0x7d, 0x8d, 0x50, 0xb8, 0x1d, 0x5a, 0x2a, 0x70, 0x44, 0x57, 0x0, 0x44, 0x26, 0xc4, 0x8a, 0x12, 0x97, 0x3e, 0xa7, 0xf8, 0xa8, 0x75, 0x52, 0x27, 0xc2, 0x2e, 0x46, 0x0, 0x88, 0x5f, 0x70, 0x5e, 0xb5, 0xb0, 0x55, 0x33, 0x2d, 0x34, 0xcf, 0x22, 0xba, 0xbf, 0x43, 0xe2, 0xb9, 0xe4, 0xf1, 0x3, 0x22, 0x13, 0x62, 0x44, 0x45, 0xc0, 0xd7, 0x9e, 0x2, 0xf3, 0x3d, 0x2, 0x13, 0x0, 0x26, 0x22, 0x38, 0x55, 0x56, 0x53, 0xad, 0xe1, 0x6c, 0x53, 0x56, 0xed, 0xd2, 0xd3, 0x3e, 0xe, 0x81, 0xcb, 0xf6, 0x16, 0x3c, 0x76, 0x40, 0x64, 0x42, 0x6c, 0x5c, 0x8b, 0x7b, 0xaa, 0x65, 0xab, 0xd, 0x35, 0x0, 0xc0, 0xd4, 0x58, 0xcb, 0xd3, 0xc, 0xcc, 0x49, 0x43, 0xb1, 0xb9, 0x90, 0xa7, 0x8d, 0x41, 0x63, 0x4f, 0x49, 0xbb, 0x96, 0x1, 0x20, 0x32, 0x1, 0x91, 0x9, 0x51, 0x61, 0x9f, 0xf9, 0x7b, 0x28, 0x23, 0xc0, 0x14, 0x39, 0x0, 0x4c, 0x9d, 0xaa, 0x85, 0xd8, 0x2c, 0x23, 0x10, 0x9a, 0xae, 0x82, 0xec, 0xc7, 0x3c, 0x62, 0x40, 0x64, 0x42, 0x4c, 0xb8, 0xce, 0x23, 0x57, 0xc2, 0x92, 0x29, 0x72, 0x0, 0x48, 0x51, 0x6c, 0xbe, 0x97, 0xb0, 0xf2, 0x6b, 0x6a, 0x9d, 0xe6, 0x98, 0x53, 0xe7, 0xae, 0xcf, 0x5a, 0xf2, 0x68, 0x1, 0x91, 0x9, 0xb1, 0xb0, 0x10, 0xf7, 0xf4, 0x8a, 0x2a, 0x13, 0xc2, 0x2e, 0x72, 0x0, 0x48, 0x11, 0xb5, 0xce, 0x3c, 0xf4, 0x20, 0x89, 0xb9, 0x47, 0x70, 0xde, 0x17, 0x2e, 0x5b, 0x4c, 0x19, 0x23, 0x40, 0x64, 0x42, 0x34, 0xb8, 0x6a, 0xc1, 0x55, 0x42, 0x1d, 0x4c, 0x0, 0x48, 0x1b, 0xfb, 0x50, 0x9, 0xdf, 0x19, 0x9b, 0x33, 0xf1, 0x2b, 0xf7, 0xd6, 0x7, 0xd5, 0x81, 0xd7, 0x8e, 0x10, 0x9a, 0x80, 0xc8, 0x84, 0x18, 0x58, 0x88, 0x3b, 0x8b, 0xc9, 0x46, 0x1f, 0x0, 0xc8, 0x5, 0x25, 0xde, 0x42, 0xea, 0xff, 0xfa, 0x6c, 0x98, 0xec, 0x3, 0xd7, 0xe7, 0x2b, 0x79, 0x94, 0x80, 0xc8, 0x84, 0xb1, 0xf9, 0xe8, 0x78, 0x7d, 0x2d, 0x1c, 0x15, 0x9, 0x0, 0x79, 0xa1, 0x6c, 0xde, 0x89, 0xa7, 0xd0, 0x54, 0x2, 0x73, 0x8c, 0x93, 0x81, 0xee, 0x1c, 0xaf, 0xb3, 0xf9, 0x7, 0x10, 0x99, 0x30, 0x2a, 0x33, 0x71, 0x4f, 0xa9, 0xac, 0x68, 0x26, 0x0, 0xc8, 0x90, 0x87, 0x0, 0xa1, 0xa9, 0xa6, 0xcd, 0x8b, 0x81, 0x3f, 0x5f, 0xe5, 0x78, 0xbd, 0xe4, 0x11, 0x2, 0x22, 0x13, 0xc6, 0xe4, 0x83, 0xe3, 0xf5, 0xb5, 0x90, 0xc5, 0x4, 0x0, 0x84, 0xa6, 0xcf, 0x1a, 0xcd, 0x8b, 0x11, 0x3e, 0xdb, 0x21, 0x1, 0x7c, 0x84, 0xd0, 0x4, 0x44, 0x26, 0x8c, 0x89, 0xcb, 0x0, 0x7d, 0xa6, 0x89, 0x0, 0x0, 0xa1, 0xf9, 0x3f, 0xa1, 0xe9, 0x62, 0x21, 0xf1, 0x65, 0x33, 0xdf, 0xf1, 0xf8, 0x0, 0x91, 0x9, 0x63, 0xa0, 0x8c, 0xe1, 0xa1, 0xa9, 0xf2, 0x5a, 0x9a, 0x1f, 0xbf, 0x6, 0x0, 0x90, 0x12, 0x2a, 0x63, 0xb8, 0xf4, 0x78, 0xdf, 0xd0, 0x3b, 0xcd, 0xef, 0x22, 0xfb, 0x3c, 0x80, 0xc8, 0x4, 0xf8, 0x1f, 0xae, 0xb5, 0x98, 0x1b, 0x9a, 0x8, 0x0, 0xe0, 0xff, 0x7c, 0x12, 0xf7, 0xb4, 0xf9, 0x87, 0x81, 0x3f, 0x93, 0xcb, 0x4e, 0x17, 0x42, 0x29, 0x23, 0x44, 0x26, 0x4d, 0x0, 0x23, 0xe0, 0xda, 0x79, 0x78, 0x47, 0x13, 0x1, 0x0, 0xfc, 0x1f, 0x25, 0x30, 0x5d, 0x1b, 0x21, 0x67, 0x32, 0xfc, 0x94, 0xb9, 0x4b, 0x68, 0x7e, 0xe4, 0xd1, 0x21, 0x32, 0x1, 0x86, 0xc6, 0x15, 0xdd, 0x56, 0x34, 0x11, 0x0, 0xc0, 0x4f, 0xac, 0xc5, 0x9d, 0xcd, 0x2c, 0x7, 0xfe, 0x4c, 0x5f, 0x1c, 0xaf, 0x33, 0x65, 0x8e, 0xc8, 0x4, 0x18, 0x9c, 0x43, 0xd1, 0xf6, 0x56, 0x38, 0xa3, 0x1c, 0x0, 0x60, 0x17, 0x65, 0x17, 0x5d, 0x99, 0xc3, 0xa1, 0xeb, 0x53, 0xba, 0x3e, 0x8f, 0xda, 0x65, 0xbe, 0xe0, 0xd1, 0x21, 0x32, 0x1, 0x62, 0x11, 0x99, 0x8, 0x4c, 0x0, 0x80, 0xfd, 0xb8, 0x32, 0x87, 0x43, 0xaf, 0x81, 0x54, 0xf6, 0x7a, 0xed, 0x78, 0xcf, 0x7, 0x1e, 0x1b, 0x22, 0x13, 0x60, 0x28, 0x5c, 0x47, 0xa0, 0x55, 0x34, 0x11, 0x0, 0xc0, 0x5e, 0x5c, 0x99, 0xc3, 0x31, 0x36, 0xda, 0xb8, 0x84, 0x6f, 0x29, 0xc3, 0xaf, 0x15, 0x5, 0x44, 0x26, 0x64, 0xa, 0xbb, 0xd, 0x1, 0x0, 0x9a, 0xe3, 0x3a, 0x5, 0x68, 0xe8, 0xb3, 0xcc, 0x95, 0xf0, 0xad, 0x1d, 0xef, 0xb9, 0xe0, 0xb1, 0x21, 0x32, 0x1, 0x0, 0x0, 0x60, 0xda, 0x22, 0x73, 0x8c, 0x40, 0x7e, 0xed, 0x78, 0x7d, 0x3e, 0x82, 0xf8, 0x5, 0x44, 0x26, 0x0, 0x0, 0x0, 0x4, 0x50, 0x47, 0xf8, 0x99, 0x5c, 0x27, 0xb4, 0x29, 0x81, 0x49, 0x39, 0x23, 0x44, 0x26, 0x0, 0x0, 0x0, 0x44, 0xcc, 0xf7, 0x48, 0x85, 0xef, 0xda, 0xf1, 0x9e, 0x33, 0x21, 0x9b, 0x89, 0xc8, 0x4, 0x0, 0x0, 0x80, 0x68, 0xa9, 0x23, 0xfd, 0x5c, 0x64, 0x33, 0x1, 0x91, 0x9, 0x18, 0x48, 0x0, 0x0, 0xe8, 0x9c, 0x4a, 0xdc, 0xd5, 0x41, 0xc8, 0x66, 0x22, 0x32, 0x1, 0x46, 0x15, 0x99, 0x5, 0x4d, 0x14, 0x1d, 0x25, 0x4d, 0x0, 0x0, 0x1e, 0xb8, 0x8e, 0xbe, 0x54, 0x2, 0x93, 0x9d, 0xe6, 0x88, 0x4c, 0x80, 0xd1, 0x40, 0x64, 0xc6, 0x5, 0x25, 0xa7, 0x0, 0xc0, 0x97, 0x4a, 0xfc, 0xb2, 0x99, 0xd8, 0x79, 0x44, 0x26, 0x40, 0xaf, 0x86, 0x8, 0x51, 0x33, 0xd, 0x4a, 0x9a, 0x0, 0x20, 0x2a, 0x62, 0x9f, 0x6e, 0x5e, 0x79, 0xbc, 0xe7, 0x9a, 0xc7, 0x88, 0xc8, 0x4, 0xe8, 0x8b, 0x7, 0x87, 0x1, 0x65, 0xcd, 0x4e, 0x3c, 0x70, 0x24, 0x1c, 0x40, 0x5c, 0xbc, 0x89, 0xfc, 0xf3, 0x55, 0xe2, 0xce, 0x66, 0xaa, 0xe0, 0x75, 0xce, 0xa3, 0x8c, 0x9a, 0x85, 0x74, 0x90, 0x71, 0x46, 0x64, 0xc2, 0x18, 0xc4, 0x58, 0x4c, 0x18, 0xf6, 0x3f, 0x7, 0x9e, 0x5, 0xc0, 0xb4, 0xa8, 0x22, 0xf8, 0xc, 0xbe, 0xd9, 0x4c, 0x12, 0xa, 0xf1, 0xa, 0x4c, 0xf5, 0x7c, 0xbe, 0xe9, 0xeb, 0x52, 0x1a, 0x16, 0xd4, 0x47, 0x64, 0xc2, 0x18, 0xdc, 0x3b, 0x5e, 0x7f, 0x47, 0x13, 0x45, 0x1, 0xe5, 0x46, 0x0, 0xe2, 0xa3, 0x3c, 0xf0, 0xda, 0x43, 0x44, 0x42, 0x77, 0xed, 0x78, 0xcf, 0x91, 0x30, 0x6d, 0x1e, 0x2b, 0xf6, 0xc, 0x56, 0x21, 0x4f, 0xeb, 0x68, 0x6f, 0x1e, 0xaf, 0x1f, 0x5a, 0x70, 0x22, 0x32, 0x21, 0x6a, 0x5c, 0x99, 0xcc, 0x92, 0x26, 0x1a, 0x9d, 0x99, 0x8e, 0x66, 0x1, 0x20, 0xbe, 0xb1, 0xd9, 0xd4, 0xb6, 0xe, 0xc9, 0xca, 0x43, 0xf4, 0xce, 0x85, 0x69, 0xf3, 0xd8, 0x98, 0x3b, 0x7c, 0xf0, 0x19, 0x22, 0x13, 0x62, 0xa7, 0x96, 0xc3, 0xa5, 0x8c, 0x66, 0xc2, 0xee, 0xc3, 0xb1, 0xb9, 0xa4, 0x9, 0x0, 0xa2, 0x43, 0xd9, 0xc5, 0xa3, 0x89, 0x88, 0xcc, 0x5a, 0x98, 0x36, 0x4f, 0xd1, 0xf6, 0x57, 0x88, 0x4c, 0x98, 0x2, 0xae, 0x8e, 0x4a, 0x74, 0x3b, 0x1e, 0x67, 0x42, 0x36, 0x19, 0x20, 0x46, 0x5c, 0xe3, 0xf2, 0x3e, 0xb2, 0xcf, 0x7b, 0xe5, 0x21, 0x7c, 0x95, 0xc0, 0xbc, 0xe1, 0xd1, 0x46, 0x63, 0xfb, 0xb, 0xc7, 0x7b, 0x3e, 0x21, 0x32, 0x61, 0xa, 0x7c, 0x71, 0xbc, 0xce, 0xae, 0xe6, 0x71, 0x50, 0x6, 0x86, 0x62, 0xc9, 0x0, 0x71, 0xe2, 0x5a, 0xaf, 0x5e, 0x45, 0xf8, 0x99, 0x4f, 0x3d, 0xc5, 0x33, 0x76, 0x27, 0x7e, 0xdb, 0x5f, 0x3f, 0x5e, 0x1b, 0x44, 0x26, 0x4c, 0x1, 0xd5, 0x51, 0xf, 0xad, 0xd7, 0x61, 0x67, 0xf3, 0x38, 0xa8, 0x8c, 0x2, 0x53, 0x57, 0x0, 0xf1, 0xa1, 0xc6, 0xe5, 0xdc, 0x21, 0x0, 0xea, 0x8, 0x3f, 0xb7, 0xca, 0x64, 0x2e, 0x3d, 0xde, 0xb7, 0x14, 0x66, 0xb0, 0xc6, 0xc4, 0x67, 0xd9, 0xc2, 0x2a, 0xf4, 0x8f, 0x22, 0x32, 0x61, 0x6c, 0xa1, 0x79, 0x8, 0x76, 0x37, 0xf, 0xcb, 0x5, 0xc2, 0x1e, 0x20, 0x5a, 0x5c, 0x2, 0xac, 0x8a, 0xf8, 0xb3, 0xaf, 0xc4, 0x6f, 0xbd, 0xe8, 0x35, 0x36, 0x68, 0x14, 0x7c, 0x96, 0x48, 0xa9, 0xfe, 0xb5, 0x46, 0x64, 0xc2, 0x94, 0x70, 0x4d, 0x99, 0x2f, 0x84, 0xd, 0x40, 0x43, 0x3a, 0xb0, 0x25, 0xcd, 0x0, 0x2f, 0x70, 0x24, 0x81, 0xbb, 0x4a, 0xa1, 0x73, 0x5c, 0x41, 0xf7, 0x97, 0xc8, 0x3f, 0xff, 0x7b, 0x71, 0xef, 0x36, 0x37, 0xeb, 0x33, 0x99, 0x4d, 0x19, 0xe, 0x25, 0xea, 0x7d, 0x36, 0x7a, 0xae, 0x9a, 0xfc, 0x71, 0x44, 0x26, 0x8c, 0x89, 0xca, 0x64, 0xd6, 0x8e, 0xf7, 0xb0, 0x4e, 0x67, 0x18, 0x23, 0x43, 0xbd, 0x3a, 0x38, 0xd4, 0x3f, 0xbe, 0x6a, 0x47, 0x44, 0x3f, 0x19, 0x87, 0x52, 0xe, 0x67, 0xf8, 0x6a, 0x9, 0x5c, 0x2b, 0x37, 0x2, 0xea, 0x33, 0x9e, 0x7b, 0xbc, 0xaf, 0x78, 0xbc, 0x6e, 0x11, 0x9a, 0x83, 0x5, 0x8f, 0x3e, 0x9b, 0xae, 0xd6, 0xd2, 0x30, 0x53, 0x8e, 0xc8, 0x84, 0xb1, 0x71, 0xed, 0x54, 0x5b, 0x8, 0xd9, 0xcc, 0x3e, 0xc1, 0xa0, 0x83, 0x4b, 0xdc, 0xdc, 0x5a, 0x63, 0x70, 0x81, 0xd0, 0x1c, 0x5, 0x57, 0xb0, 0xbd, 0x99, 0xc8, 0x7d, 0x28, 0xb1, 0x72, 0xe5, 0x19, 0xd8, 0xb0, 0xe3, 0xbc, 0x7f, 0x6e, 0x3d, 0xfc, 0xeb, 0x83, 0x67, 0x70, 0x80, 0xc8, 0x84, 0x68, 0x8d, 0x8e, 0x6b, 0xa, 0x5, 0xa7, 0xd6, 0x6f, 0x14, 0x8b, 0xc0, 0x84, 0x97, 0x2, 0xbc, 0x7d, 0x1, 0x8, 0x42, 0x73, 0xf8, 0xe7, 0x50, 0xb6, 0xc, 0xd6, 0x63, 0x42, 0x9, 0x16, 0x9f, 0xf5, 0x99, 0x25, 0xfd, 0xac, 0x57, 0x7c, 0xd7, 0xbf, 0x9e, 0x4a, 0x8b, 0x93, 0xa4, 0x10, 0x99, 0x30, 0x36, 0xf, 0x1e, 0x91, 0x6d, 0x29, 0x9c, 0x3e, 0xd3, 0x87, 0xc0, 0xbc, 0xf5, 0x34, 0x32, 0xf, 0x34, 0x57, 0x76, 0x9c, 0x39, 0x1c, 0xfc, 0x4b, 0x2, 0x14, 0xba, 0x1f, 0xa7, 0xae, 0xf5, 0x72, 0x2a, 0x50, 0xaf, 0x27, 0x76, 0x5f, 0x27, 0x9e, 0x9f, 0x99, 0x80, 0xa6, 0x3f, 0x81, 0xe9, 0xe3, 0x53, 0x55, 0xdf, 0x6a, 0x95, 0x25, 0x47, 0x64, 0x42, 0xc, 0x7c, 0xf2, 0x10, 0x32, 0xca, 0xd0, 0x16, 0x34, 0x55, 0x27, 0x28, 0x61, 0xf9, 0xcd, 0x53, 0x60, 0xfa, 0x14, 0x53, 0x86, 0xf4, 0x78, 0xe7, 0xf1, 0x9e, 0x12, 0xa1, 0x39, 0x88, 0x18, 0xe8, 0xbc, 0xac, 0x4c, 0x24, 0xc9, 0x5, 0x9f, 0x8d, 0x40, 0xb6, 0xd0, 0xa4, 0x9f, 0xd, 0x2b, 0x30, 0x95, 0xdd, 0x3f, 0x6f, 0xfb, 0x9f, 0x21, 0x32, 0x21, 0x16, 0x83, 0xe3, 0x32, 0x94, 0x9c, 0xa, 0xd1, 0xd, 0x21, 0xc2, 0x60, 0xdd, 0x85, 0x91, 0x81, 0x49, 0xe2, 0xbb, 0x53, 0x39, 0x24, 0x60, 0x81, 0x30, 0x94, 0x10, 0x98, 0x7b, 0x8c, 0xd1, 0x7a, 0xa2, 0xf7, 0xb7, 0xd5, 0x42, 0xd3, 0xb7, 0x2d, 0x8, 0x68, 0x86, 0x13, 0x98, 0xca, 0x27, 0xb7, 0x9a, 0x26, 0x47, 0x64, 0x42, 0x6c, 0xf8, 0x64, 0xcc, 0x7c, 0x4b, 0x2d, 0x40, 0x7b, 0x43, 0xbd, 0x16, 0xbf, 0x93, 0x3a, 0x20, 0xdd, 0xf1, 0xb8, 0xf6, 0x7c, 0xaf, 0x59, 0x7a, 0xb1, 0xa0, 0xd9, 0x3a, 0xc3, 0xa7, 0xe2, 0x83, 0x4f, 0x70, 0x1e, 0x3b, 0x55, 0x80, 0x9d, 0x99, 0x89, 0xdf, 0x46, 0x15, 0xd8, 0x3f, 0x46, 0xaf, 0x3, 0xc6, 0xe8, 0x7b, 0xe9, 0x68, 0x6, 0xb, 0x91, 0x9, 0x31, 0xe1, 0x93, 0x35, 0x3b, 0xc3, 0x99, 0x35, 0x36, 0x30, 0xbe, 0x6b, 0x9b, 0x10, 0x98, 0x20, 0xba, 0xf, 0xac, 0x3, 0xfb, 0x18, 0x41, 0x60, 0x37, 0x2, 0xf3, 0xd6, 0xe3, 0x7d, 0x4a, 0x60, 0xd6, 0x9, 0xdc, 0x6f, 0x88, 0xbd, 0x31, 0xe5, 0xb4, 0xc8, 0x9c, 0x87, 0xd9, 0xff, 0x90, 0x20, 0xf0, 0x54, 0x3a, 0x2c, 0xec, 0x8f, 0xc8, 0x84, 0xd8, 0xa2, 0x5a, 0x9f, 0xf2, 0x16, 0x21, 0x11, 0x19, 0xe, 0xeb, 0xc9, 0x28, 0xfb, 0xb6, 0x17, 0x2, 0x13, 0x9a, 0xa, 0x4d, 0x13, 0x4, 0xaa, 0xfe, 0x56, 0xd0, 0x74, 0xad, 0x4, 0xa6, 0x6b, 0xb6, 0x61, 0xeb, 0x69, 0x2b, 0x53, 0x14, 0x9a, 0x47, 0x81, 0x36, 0xd, 0xfb, 0xef, 0x2f, 0xca, 0x43, 0xc7, 0x3b, 0x22, 0x13, 0x26, 0x87, 0x6f, 0x79, 0xb, 0x84, 0xa6, 0x9b, 0x8b, 0x40, 0x87, 0x7f, 0x85, 0xc0, 0x84, 0xe, 0x1c, 0x8f, 0x71, 0x6c, 0x9c, 0x10, 0xd4, 0x8f, 0xc0, 0x34, 0x9b, 0x66, 0x52, 0x23, 0x34, 0xc0, 0x35, 0xb3, 0x33, 0xac, 0xd3, 0xec, 0x26, 0xe0, 0xeb, 0x5c, 0x60, 0x22, 0x32, 0x21, 0x66, 0xa7, 0xe6, 0xb3, 0xe0, 0x18, 0xa1, 0xb9, 0x9f, 0x52, 0x9e, 0x36, 0x63, 0x2c, 0x3, 0xdb, 0x9c, 0x4d, 0x3e, 0xd0, 0x55, 0xff, 0x30, 0xa5, 0x77, 0x6e, 0x84, 0xac, 0xa6, 0xf, 0x73, 0xf1, 0x5f, 0x2f, 0xad, 0x9e, 0x45, 0x9d, 0x68, 0x3b, 0x84, 0xa, 0xcd, 0x85, 0x16, 0x52, 0x25, 0x5d, 0xe8, 0xa7, 0xb1, 0x77, 0x23, 0x61, 0x4b, 0x57, 0x7a, 0x11, 0x98, 0x88, 0x4c, 0x88, 0x95, 0x6d, 0x80, 0xa1, 0xb9, 0x16, 0x32, 0x26, 0x86, 0x42, 0x1b, 0x97, 0x90, 0xc5, 0xf1, 0x4a, 0xcc, 0x9f, 0xf4, 0x65, 0x60, 0x20, 0x29, 0x9a, 0x64, 0xba, 0xe7, 0x42, 0x56, 0xd3, 0xc5, 0x85, 0xf8, 0x1f, 0x8a, 0xa0, 0x2, 0xc7, 0x4d, 0xe2, 0xed, 0xb1, 0xd6, 0x36, 0xc9, 0x77, 0x67, 0x73, 0xa1, 0x6d, 0xde, 0x85, 0x90, 0xd5, 0x5c, 0xe8, 0x4, 0xc3, 0x3c, 0xe0, 0x77, 0x7a, 0x13, 0x98, 0x88, 0x4c, 0x88, 0x19, 0x65, 0x48, 0x7d, 0x33, 0x27, 0xe6, 0x4c, 0xe5, 0x5c, 0xd, 0x8c, 0xc9, 0x1a, 0x85, 0x1a, 0x17, 0x25, 0xe6, 0xdf, 0x4a, 0x87, 0x8b, 0xbc, 0x21, 0x79, 0xd6, 0xba, 0xcf, 0x3c, 0x34, 0xe8, 0x9f, 0x64, 0x9c, 0xf6, 0x8b, 0xa3, 0x65, 0x40, 0xdb, 0xaf, 0x32, 0x69, 0x9b, 0x2a, 0x50, 0x68, 0x1a, 0x1, 0x9e, 0x6b, 0x1f, 0x33, 0x7d, 0x29, 0xc4, 0xf, 0x3e, 0xf4, 0x2d, 0x30, 0x11, 0x99, 0x10, 0x3b, 0x21, 0x65, 0x54, 0x16, 0xe2, 0x7f, 0x82, 0x4d, 0x4a, 0xe2, 0xf2, 0x42, 0x8b, 0xcb, 0xd0, 0x4c, 0x91, 0xc9, 0x16, 0xd4, 0x74, 0x33, 0x8, 0xc4, 0x4, 0x27, 0xa1, 0x25, 0x4e, 0x66, 0x96, 0x23, 0x2c, 0x32, 0x6f, 0xc3, 0x8b, 0x40, 0x41, 0xb4, 0x96, 0xfc, 0xd6, 0x4b, 0xab, 0xfe, 0xf5, 0x3a, 0xb0, 0x9f, 0x19, 0xb1, 0x95, 0xcb, 0x32, 0xd, 0x3b, 0xc1, 0x10, 0x22, 0xae, 0x7, 0x9b, 0xc1, 0x42, 0x64, 0x42, 0xec, 0x84, 0x44, 0x5a, 0x66, 0xc3, 0xc1, 0x45, 0x6, 0x51, 0xab, 0x72, 0xd4, 0x3f, 0x74, 0xf4, 0x1e, 0x92, 0xc1, 0x35, 0x9b, 0x6, 0x3a, 0x29, 0xb4, 0xb, 0xd9, 0x52, 0xb7, 0x70, 0x52, 0xb, 0xed, 0x14, 0x73, 0x14, 0x9b, 0x73, 0x79, 0x5e, 0x2f, 0xed, 0x3b, 0x6e, 0x73, 0x14, 0x98, 0xb6, 0xbd, 0x7a, 0xdb, 0xa0, 0x9f, 0x99, 0x76, 0xbe, 0x94, 0x34, 0x67, 0xb8, 0xda, 0x24, 0x18, 0xaa, 0x6, 0xe2, 0x1d, 0x91, 0x9, 0x8, 0x4d, 0x8b, 0xa5, 0xa4, 0x39, 0x6d, 0xb2, 0xd0, 0x51, 0xfa, 0x37, 0x69, 0xb6, 0xe1, 0x69, 0xa3, 0x8d, 0x4b, 0xe8, 0x9a, 0x2e, 0x97, 0x18, 0x65, 0x77, 0x67, 0xbe, 0x2, 0xe0, 0xb4, 0x45, 0xc0, 0x62, 0x8b, 0xcd, 0xd4, 0x67, 0x20, 0x4a, 0x69, 0x96, 0x61, 0xcb, 0x59, 0x60, 0xee, 0xfa, 0x80, 0x26, 0xfd, 0xec, 0x4c, 0xf7, 0xb1, 0x8b, 0x44, 0x2, 0x1a, 0x5b, 0x5c, 0x86, 0x26, 0x18, 0x8c, 0x6f, 0x3c, 0x91, 0x1, 0x13, 0xc, 0x88, 0x4c, 0x48, 0x55, 0x68, 0xce, 0x24, 0x8d, 0x69, 0x13, 0x73, 0xf2, 0xc7, 0xf, 0xfd, 0xb5, 0x89, 0x70, 0x36, 0xd9, 0x4b, 0xdf, 0xb3, 0x82, 0x77, 0x71, 0x45, 0xbc, 0x73, 0xba, 0x67, 0xd6, 0xa8, 0x71, 0xd9, 0x66, 0x6d, 0xef, 0x42, 0x7, 0x85, 0xa9, 0x9d, 0x1a, 0x74, 0x64, 0x9, 0xe9, 0xdb, 0x6, 0x63, 0xf7, 0x1c, 0x81, 0xf9, 0x4b, 0x3f, 0x3b, 0x91, 0xf0, 0xc, 0xdc, 0x91, 0x16, 0x57, 0x53, 0xe, 0x68, 0x6c, 0x3f, 0xd0, 0x44, 0x5c, 0xd6, 0xba, 0xed, 0x6, 0x5f, 0xd3, 0x8b, 0xc8, 0x84, 0x29, 0x46, 0xb3, 0x21, 0x98, 0x69, 0x93, 0x1b, 0x99, 0x4e, 0x66, 0x53, 0x7d, 0x4e, 0xb3, 0xce, 0xc6, 0x14, 0x1d, 0x6e, 0x9a, 0x2d, 0x54, 0xeb, 0x5a, 0x9b, 0x64, 0x2f, 0x6d, 0xee, 0x1d, 0xaf, 0xb3, 0xab, 0x13, 0x8c, 0x13, 0x3b, 0x97, 0xe6, 0x59, 0x92, 0x72, 0x27, 0xa0, 0x9a, 0x6a, 0x76, 0x73, 0xae, 0x3f, 0x7f, 0xd3, 0x25, 0x1, 0x66, 0xbd, 0xdc, 0x15, 0xdd, 0x6a, 0x6f, 0xc0, 0xfb, 0x56, 0xc2, 0xca, 0xb3, 0xed, 0xb, 0x68, 0xda, 0xda, 0xd5, 0xa1, 0x82, 0x94, 0xb3, 0x9d, 0xcf, 0xdb, 0xd4, 0x7, 0x8c, 0xb6, 0xc1, 0x13, 0x91, 0x9, 0x53, 0x8d, 0x66, 0x43, 0x1d, 0x99, 0xa9, 0x43, 0x67, 0xca, 0xa9, 0xc4, 0x64, 0x5c, 0x66, 0xfa, 0x33, 0xdd, 0x68, 0x7, 0x7b, 0xab, 0x7f, 0x2e, 0x5a, 0xfc, 0xcd, 0x4a, 0x8b, 0xcb, 0x36, 0x4e, 0xdf, 0xfe, 0x5b, 0x87, 0x28, 0x2c, 0x87, 0x4a, 0x56, 0x33, 0x6f, 0x8c, 0x43, 0x6b, 0x13, 0xd4, 0x1c, 0x59, 0x62, 0xc0, 0xee, 0x57, 0xb1, 0xa, 0x82, 0x23, 0x4b, 0x58, 0xfe, 0xd0, 0xe3, 0xb8, 0xa9, 0x80, 0x31, 0xe3, 0xb6, 0xa2, 0x2b, 0x1d, 0x64, 0x25, 0xcd, 0x36, 0x9f, 0xd9, 0x36, 0xb7, 0x8b, 0xe7, 0xd5, 0x35, 0xc5, 0x8e, 0x2f, 0xb8, 0x6c, 0x11, 0x6c, 0x6d, 0x3b, 0x8, 0xfc, 0x5a, 0xf3, 0x8a, 0xbe, 0xa, 0x13, 0xc4, 0x18, 0xe2, 0x26, 0xd9, 0xc9, 0x99, 0xbe, 0x2e, 0xb5, 0x23, 0xbc, 0xd3, 0x5f, 0xeb, 0x1, 0x1d, 0x92, 0xfa, 0xff, 0x8f, 0xf5, 0xd7, 0xb2, 0x63, 0xe3, 0x56, 0x69, 0x3, 0xdc, 0xa5, 0x93, 0x7a, 0xd0, 0x6d, 0x34, 0xf7, 0x10, 0x6, 0x8b, 0x96, 0xc6, 0x1f, 0xa6, 0x8f, 0x1a, 0x4b, 0xef, 0xe5, 0x39, 0x23, 0xdf, 0x26, 0x23, 0x59, 0x58, 0xfd, 0xca, 0xf4, 0x6f, 0x75, 0xdd, 0xeb, 0x3e, 0x56, 0x8f, 0x70, 0x7f, 0x85, 0x35, 0x86, 0x4b, 0xe9, 0x26, 0xe3, 0xfa, 0xa0, 0xc7, 0x2d, 0xd9, 0xcb, 0x30, 0x11, 0xf5, 0x56, 0x8b, 0xb2, 0x36, 0xb3, 0x29, 0x73, 0x2b, 0x48, 0x30, 0xfd, 0xeb, 0x6e, 0x20, 0xa1, 0x9f, 0x7c, 0x5f, 0x42, 0x64, 0xc2, 0x54, 0x31, 0x53, 0x4a, 0xca, 0xb8, 0x2c, 0x5b, 0x1a, 0x97, 0x4b, 0xed, 0xac, 0xb6, 0xfa, 0xba, 0xd3, 0x3f, 0xd7, 0x2d, 0xc, 0x47, 0xa1, 0x8d, 0xde, 0x1b, 0xeb, 0xe7, 0x59, 0x8f, 0xd1, 0x72, 0x1f, 0xe2, 0xd2, 0xe6, 0x93, 0xf8, 0x67, 0x29, 0x99, 0x3a, 0x7, 0xd3, 0x27, 0xdf, 0x6a, 0x81, 0xd8, 0xd5, 0xc6, 0x8b, 0x72, 0x27, 0xb0, 0x7c, 0xb0, 0xc6, 0xed, 0x77, 0x2b, 0xb8, 0x69, 0x3b, 0xe, 0x8e, 0x2c, 0x87, 0x7f, 0x6c, 0xfd, 0xdc, 0xc7, 0x18, 0x5e, 0xcb, 0xc8, 0xd9, 0xa6, 0x89, 0x63, 0x4a, 0xdd, 0x5d, 0x48, 0xfb, 0xa2, 0xff, 0xbb, 0xfd, 0x6b, 0x6b, 0x5, 0x33, 0x77, 0x56, 0x7f, 0x6b, 0xda, 0x9f, 0xd4, 0x18, 0xf8, 0x5d, 0xff, 0x1f, 0x85, 0x74, 0xbf, 0x5f, 0x60, 0xa9, 0x6d, 0x75, 0x34, 0x7d, 0x9, 0x91, 0x9, 0x53, 0x47, 0x9, 0xab, 0xcf, 0xd2, 0x7c, 0x53, 0xcc, 0xae, 0x30, 0x9c, 0xef, 0x11, 0xb3, 0xdb, 0x80, 0xdf, 0x1f, 0x9a, 0x8d, 0x36, 0x2a, 0x7d, 0x47, 0xdd, 0x26, 0xc2, 0x2f, 0xe9, 0x72, 0xd0, 0x40, 0x44, 0xad, 0x3b, 0x16, 0x9b, 0xb6, 0xf3, 0x2e, 0x1d, 0xfd, 0xb2, 0xa, 0xf8, 0x5b, 0x43, 0xae, 0x3, 0xed, 0x3b, 0x30, 0xcc, 0x2d, 0xe9, 0x70, 0xae, 0x6d, 0xe1, 0x85, 0x74, 0xb7, 0x81, 0x6c, 0x76, 0xa0, 0x4f, 0x6c, 0x3d, 0xc4, 0x5c, 0x9f, 0x89, 0x85, 0xdd, 0x31, 0xb6, 0x92, 0x8, 0xeb, 0x1e, 0x23, 0x32, 0x21, 0x5, 0xd4, 0xc0, 0x3a, 0x91, 0xe7, 0xac, 0x64, 0x1f, 0x4e, 0x2c, 0x36, 0x83, 0xba, 0xd6, 0x6, 0x75, 0x48, 0xa3, 0xa2, 0xa6, 0x40, 0xbf, 0x9, 0x99, 0x4a, 0x68, 0x2f, 0x36, 0x3f, 0xc, 0x38, 0xae, 0x62, 0x1b, 0xbf, 0x88, 0xcb, 0x7e, 0x7d, 0xc1, 0xa9, 0x6e, 0xdf, 0x2e, 0xc5, 0xe6, 0x4b, 0x2, 0x72, 0x6c, 0x3f, 0xa0, 0xb2, 0xb8, 0x9f, 0x25, 0xe2, 0x43, 0x35, 0xd8, 0xf8, 0x3, 0x29, 0x61, 0xea, 0x40, 0x9e, 0x4a, 0x9a, 0x27, 0xd9, 0x6c, 0xb4, 0xd0, 0xfb, 0x4d, 0x47, 0xed, 0x43, 0xdf, 0xa3, 0x59, 0xa2, 0xc0, 0xb4, 0x1e, 0xb4, 0x15, 0x9b, 0xaa, 0x1f, 0x99, 0x22, 0xdb, 0xf, 0x19, 0xdd, 0xf7, 0x5b, 0x7d, 0xef, 0x8, 0xcc, 0x61, 0xc4, 0xa6, 0xf2, 0x7, 0xcb, 0xc4, 0xfa, 0xd8, 0xd6, 0xba, 0xb7, 0x28, 0xb3, 0x97, 0x88, 0x4c, 0xc8, 0xc1, 0x98, 0xa7, 0x22, 0x36, 0x37, 0xfa, 0x3e, 0x7e, 0xd3, 0x2, 0x73, 0x33, 0xf2, 0xe7, 0x31, 0x3b, 0x16, 0xd9, 0xd8, 0x3, 0x5d, 0x39, 0xcb, 0xdf, 0xf4, 0xd7, 0x4d, 0xa2, 0xf7, 0x78, 0x6e, 0xdd, 0x23, 0xe3, 0x66, 0x78, 0xb1, 0xb9, 0xb2, 0xda, 0x7f, 0xaa, 0xe2, 0xfe, 0xc1, 0xa, 0x52, 0x26, 0x15, 0x9c, 0xfd, 0xd1, 0xd1, 0xe9, 0x19, 0x10, 0x90, 0x82, 0xd8, 0x1c, 0xe4, 0x8c, 0xd6, 0xe, 0x8d, 0xe2, 0x5a, 0x9e, 0x33, 0x96, 0xef, 0x23, 0x34, 0x28, 0x66, 0x57, 0xe7, 0x3e, 0x11, 0xff, 0x10, 0xb1, 0xb0, 0xff, 0x72, 0xa0, 0x1d, 0xb7, 0xd8, 0xbb, 0xd1, 0xc7, 0xea, 0x7b, 0x4b, 0xc, 0x4c, 0xc6, 0x89, 0x1e, 0x10, 0x96, 0xaf, 0xf5, 0x38, 0xb9, 0x12, 0xb2, 0xff, 0xb1, 0xf4, 0xb1, 0x13, 0x79, 0x2e, 0xed, 0x16, 0xfb, 0x78, 0x7f, 0xd8, 0x33, 0x2e, 0x26, 0x67, 0xa3, 0xfe, 0xf0, 0xe7, 0xbf, 0xfe, 0x5d, 0x7d, 0x2d, 0x5f, 0x78, 0xbd, 0xa2, 0x5f, 0x42, 0x42, 0x98, 0x7a, 0x76, 0xef, 0xa4, 0xfb, 0xd2, 0x41, 0x6d, 0x44, 0xa5, 0x1a, 0x67, 0xa6, 0x64, 0x46, 0x3d, 0xc1, 0x76, 0x2d, 0xe4, 0x79, 0x1d, 0x6c, 0x1d, 0xf9, 0x3d, 0xd8, 0x9f, 0x75, 0x57, 0x18, 0x20, 0x4, 0xe2, 0x63, 0x66, 0x8d, 0xd7, 0x99, 0xc4, 0xb9, 0x1e, 0xd8, 0x1e, 0xc3, 0x1b, 0xfa, 0xd1, 0xe4, 0x6c, 0x57, 0x19, 0x91, 0x4f, 0xa8, 0xf4, 0xf5, 0x65, 0xa, 0x82, 0xf2, 0xdf, 0xff, 0xfa, 0xa7, 0xb7, 0xc8, 0x4, 0xc8, 0x11, 0x65, 0x54, 0x8e, 0x7, 0x74, 0x60, 0x95, 0x25, 0xc2, 0xee, 0x10, 0x36, 0x0, 0x8d, 0x44, 0xa7, 0xba, 0xfa, 0x2c, 0x3, 0x73, 0x8, 0x53, 0xce, 0x66, 0xcb, 0x18, 0x4e, 0xb6, 0x7f, 0xa9, 0x7e, 0xf5, 0x46, 0xe, 0xef, 0x2c, 0xef, 0xb2, 0x2f, 0x99, 0x7e, 0x54, 0x4d, 0xad, 0xb1, 0x7c, 0x44, 0x26, 0xbb, 0xcb, 0x21, 0x67, 0x4c, 0xd4, 0xb8, 0xb2, 0xa2, 0xda, 0x42, 0xb, 0x4f, 0x23, 0x42, 0x65, 0xe7, 0x35, 0x9b, 0x7d, 0xe5, 0x8d, 0x6c, 0xa7, 0x73, 0xb7, 0xe7, 0xdf, 0x0, 0xa0, 0x9d, 0x63, 0x36, 0x63, 0x6e, 0xb5, 0x13, 0x30, 0x8a, 0x35, 0x76, 0xf7, 0x95, 0x23, 0x7a, 0x29, 0x90, 0x34, 0x81, 0xdf, 0xae, 0x6d, 0x50, 0x7c, 0xb7, 0x5e, 0xaf, 0x69, 0xfe, 0xac, 0xfa, 0xd7, 0x6e, 0xbf, 0x39, 0x7e, 0xa1, 0x1f, 0x95, 0xe, 0xbf, 0x60, 0xff, 0xdc, 0xa6, 0xd6, 0xe6, 0x24, 0xf9, 0xaf, 0x0, 0x3, 0x0, 0x58, 0xbf, 0x46, 0x22, 0x7, 0x65, 0x51, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; + + + + + (NSData *)parse_logo3x_png { + return [NSData dataWithBytes:parse_logo3x_png length:sizeof(parse_logo3x_png)]; + } + + const unsigned char twitter_icon_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x12, 0x8, 0x6, 0x0, 0x0, 0x0, 0x5f, 0x25, 0x2e, 0x2d, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0x2e, 0x23, 0x0, 0x0, 0x2e, 0x23, 0x1, 0x78, 0xa5, 0x3f, 0x76, 0x0, 0x0, 0x1, 0xcb, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x3c, 0x2f, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0xa, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0xa, 0x29, 0x2e, 0xcd, 0x3d, 0x0, 0x0, 0x2, 0x34, 0x49, 0x44, 0x41, 0x54, 0x38, 0x11, 0x8d, 0x93, 0xbd, 0x6b, 0x54, 0x41, 0x14, 0x47, 0xdf, 0x6e, 0x36, 0x51, 0x8b, 0xa0, 0x9d, 0x44, 0x8b, 0x10, 0xb4, 0x10, 0xac, 0x4, 0xb1, 0x52, 0x50, 0x10, 0x8b, 0x80, 0x76, 0x36, 0x16, 0xfe, 0x7, 0xda, 0x5a, 0x58, 0x8b, 0xad, 0x88, 0x20, 0x16, 0x82, 0x36, 0x36, 0x12, 0x10, 0x24, 0xda, 0x89, 0x48, 0x10, 0x92, 0x42, 0xc1, 0x2e, 0x5a, 0xaa, 0x85, 0x22, 0x2a, 0x4a, 0xd4, 0xe8, 0xee, 0xbe, 0x9c, 0x33, 0x6f, 0xee, 0x63, 0xb2, 0x1b, 0xd4, 0xb, 0xe7, 0xdd, 0x3b, 0x77, 0x66, 0x7e, 0xef, 0xce, 0x57, 0x55, 0x61, 0x75, 0x5d, 0x77, 0xb3, 0x9f, 0xd0, 0x6f, 0x65, 0x8c, 0x49, 0x7d, 0xf8, 0x39, 0xb8, 0xb, 0xef, 0xe0, 0x3b, 0x2c, 0xc3, 0xf9, 0x98, 0x43, 0x7c, 0x6, 0xe, 0xa4, 0x36, 0xc1, 0x7d, 0x38, 0x6e, 0x3, 0x3f, 0x5, 0xe9, 0x47, 0xa9, 0xb3, 0xc9, 0x85, 0xe8, 0x41, 0xfa, 0xbe, 0xc0, 0x56, 0xf6, 0x80, 0xe4, 0x4b, 0x58, 0x84, 0x6d, 0xa, 0xed, 0x86, 0x3e, 0xfc, 0x84, 0x13, 0x85, 0xd8, 0x24, 0xed, 0x2e, 0x74, 0x8a, 0xdc, 0x12, 0x6d, 0x6d, 0xd, 0xfa, 0x43, 0xc, 0xff, 0x1b, 0xfe, 0x80, 0xe6, 0xa, 0xae, 0xc2, 0x39, 0x85, 0x67, 0x21, 0x55, 0xd1, 0x8c, 0xab, 0x2f, 0xd3, 0xee, 0x15, 0x62, 0x29, 0x26, 0x77, 0x18, 0x14, 0x1a, 0x64, 0x41, 0xe3, 0x1c, 0xa6, 0xfc, 0x2f, 0xda, 0xda, 0x2b, 0x98, 0x4b, 0xf3, 0x9, 0x56, 0xcd, 0x60, 0x56, 0xae, 0xbd, 0x81, 0x8b, 0xb0, 0xb7, 0xf8, 0xc1, 0x31, 0x3b, 0xb0, 0x41, 0x26, 0x9, 0x13, 0xeb, 0xa3, 0x62, 0x75, 0xb6, 0xc7, 0x1c, 0xab, 0x3e, 0xb, 0x9a, 0x3, 0x5c, 0x5a, 0xd8, 0x57, 0x82, 0x27, 0x70, 0x5, 0x6e, 0xe4, 0x64, 0x2b, 0x98, 0x57, 0x68, 0x3a, 0xe6, 0x3c, 0x56, 0x94, 0x76, 0xaf, 0xc7, 0xc7, 0xaa, 0x76, 0xc0, 0x23, 0x98, 0x87, 0x1, 0xf4, 0xa1, 0x86, 0x9d, 0xe0, 0xbe, 0xa7, 0xbd, 0x57, 0xa1, 0xd3, 0x69, 0xb7, 0xbc, 0x22, 0x76, 0x4c, 0x69, 0x6b, 0xb9, 0x31, 0x74, 0xff, 0xd6, 0xe1, 0x16, 0x78, 0x13, 0xdc, 0x8a, 0x5e, 0x31, 0x61, 0x48, 0xce, 0x1f, 0x69, 0x5d, 0xf2, 0x9b, 0x6e, 0x8b, 0xc9, 0xe6, 0x5f, 0xed, 0xf, 0x56, 0xcd, 0x61, 0x13, 0xe, 0xfe, 0x44, 0x70, 0x1b, 0xa6, 0x60, 0x58, 0x88, 0xd2, 0xac, 0x3a, 0x4c, 0x9c, 0xc4, 0x5b, 0xc0, 0x98, 0x68, 0x1a, 0xd0, 0x54, 0x1d, 0x7d, 0xcb, 0xe6, 0xb0, 0x66, 0x25, 0x4c, 0x9e, 0x86, 0xa7, 0x10, 0xe6, 0x1, 0xb5, 0x7b, 0xf9, 0x8f, 0x38, 0xe, 0xfc, 0x3d, 0xe3, 0x76, 0x25, 0x55, 0xdf, 0x1, 0x8d, 0xb8, 0xfc, 0x33, 0xc4, 0x37, 0xc1, 0x3b, 0xaa, 0xfd, 0xaf, 0xf8, 0x7a, 0x33, 0xbc, 0xbe, 0x96, 0x45, 0x9b, 0xd7, 0x4b, 0x32, 0x84, 0x4f, 0x12, 0x7f, 0x0, 0x85, 0xbd, 0x1d, 0x9b, 0x84, 0xf3, 0xd, 0x18, 0x5d, 0x45, 0x54, 0xfb, 0x8d, 0xf1, 0xb3, 0x6d, 0xb5, 0x6, 0x1a, 0xc9, 0x74, 0xd4, 0xf8, 0x3b, 0xd0, 0x5a, 0xf9, 0x10, 0x48, 0x8e, 0x8a, 0xda, 0x8e, 0x6a, 0x2f, 0x64, 0x9d, 0xf6, 0x61, 0x25, 0x51, 0x6, 0xb4, 0x9, 0xe2, 0x4b, 0xf0, 0x2, 0x3e, 0x43, 0x3c, 0xad, 0x52, 0xd4, 0xb4, 0xab, 0x89, 0x97, 0xb6, 0x90, 0xaa, 0x2b, 0xa, 0x8c, 0xf6, 0x98, 0x67, 0x92, 0xcf, 0xf7, 0x35, 0x68, 0xb1, 0x5c, 0xc5, 0x15, 0xf4, 0x31, 0x44, 0xee, 0x21, 0x71, 0x6c, 0x65, 0xdc, 0x8c, 0x46, 0x8f, 0x8e, 0x3d, 0xb0, 0xf, 0xf6, 0xc3, 0x69, 0xb8, 0x7, 0x3f, 0x40, 0x73, 0xaf, 0x15, 0x51, 0x4c, 0x14, 0xf, 0xbb, 0x1e, 0x15, 0x91, 0x68, 0xe, 0x2c, 0x12, 0x7a, 0x92, 0x87, 0x60, 0x1, 0xa2, 0xa, 0xc2, 0xbf, 0xda, 0x33, 0x7a, 0x4f, 0x85, 0x6, 0xf1, 0xb8, 0x28, 0x9d, 0x71, 0x68, 0xfa, 0xa3, 0xe0, 0x84, 0x23, 0xe0, 0x9, 0xcf, 0x80, 0xaf, 0xee, 0x23, 0xbc, 0x85, 0x15, 0x58, 0xe4, 0x1, 0x3d, 0xc7, 0x5b, 0x90, 0x4b, 0xf7, 0x89, 0x8f, 0x3e, 0x6b, 0xbb, 0xab, 0xd, 0x23, 0x5c, 0xa6, 0xb2, 0xce, 0x6d, 0xd4, 0xea, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; + + + + + (NSData *)twitter_icon_png { + return [NSData dataWithBytes:twitter_icon_png length:sizeof(twitter_icon_png)]; + } + + const unsigned char twitter_icon2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x24, 0x8, 0x6, 0x0, 0x0, 0x0, 0xf2, 0xd7, 0xd8, 0x6c, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0x2e, 0x23, 0x0, 0x0, 0x2e, 0x23, 0x1, 0x78, 0xa5, 0x3f, 0x76, 0x0, 0x0, 0x1, 0xcb, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x3c, 0x2f, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0xa, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0xa, 0x29, 0x2e, 0xcd, 0x3d, 0x0, 0x0, 0x5, 0xbd, 0x49, 0x44, 0x41, 0x54, 0x58, 0x9, 0xc5, 0x98, 0x5b, 0xa8, 0x95, 0x45, 0x14, 0xc7, 0xdd, 0x9e, 0xa3, 0x42, 0x56, 0x50, 0x91, 0x5, 0x86, 0x9c, 0xae, 0x44, 0x50, 0x68, 0x46, 0xd1, 0x85, 0x12, 0x7a, 0x28, 0x22, 0x88, 0xa0, 0x22, 0x2, 0xe9, 0x25, 0x90, 0x82, 0xea, 0x21, 0xe8, 0xf6, 0x90, 0xd1, 0x4b, 0x29, 0xbd, 0x56, 0x4, 0x81, 0x51, 0x50, 0xd4, 0x93, 0x2f, 0x85, 0x74, 0x21, 0x3a, 0xa6, 0x60, 0x54, 0x90, 0x12, 0x89, 0x91, 0xfa, 0x90, 0x5d, 0xf5, 0xa1, 0x9b, 0x78, 0x3d, 0xbb, 0xdf, 0x6f, 0xed, 0x59, 0xdf, 0xf9, 0xbe, 0x7d, 0xf6, 0xf6, 0xec, 0xbd, 0xf, 0xda, 0x82, 0xff, 0x59, 0x6b, 0xd6, 0xcc, 0xac, 0xf9, 0xcf, 0xcc, 0x9a, 0xd9, 0xf3, 0x9d, 0x79, 0xf3, 0x90, 0x76, 0xbb, 0xdd, 0x52, 0x2b, 0xd8, 0xf3, 0x3b, 0xd6, 0xdc, 0xff, 0xd6, 0x63, 0x61, 0x4f, 0x80, 0xe7, 0xc1, 0x24, 0xf8, 0x19, 0x1c, 0x7, 0x3f, 0x81, 0xcf, 0xc0, 0x33, 0xe0, 0x82, 0x1c, 0x11, 0x7b, 0x1, 0x18, 0xcf, 0xb2, 0x9a, 0xf2, 0x32, 0xd0, 0xd2, 0x8, 0xb2, 0xe8, 0xd3, 0xc0, 0xe9, 0xa5, 0x72, 0xac, 0xde, 0x78, 0x14, 0x9b, 0x58, 0x55, 0xc, 0x6c, 0x89, 0x1e, 0x4, 0x75, 0x99, 0xaa, 0x17, 0xb0, 0xff, 0x6, 0x4f, 0x74, 0x8f, 0x85, 0x6f, 0x5, 0xf8, 0x10, 0x3c, 0x1b, 0x75, 0x18, 0x31, 0x13, 0xf4, 0x23, 0x60, 0x5b, 0x76, 0x48, 0x7f, 0x96, 0x87, 0xd1, 0xf4, 0x8d, 0x5d, 0x42, 0xb7, 0xc0, 0x46, 0x90, 0x72, 0x4, 0x43, 0x1c, 0x3, 0x12, 0x56, 0xa7, 0xf, 0x33, 0xe4, 0x2d, 0xfe, 0xde, 0x8, 0xd6, 0x82, 0xcd, 0x40, 0x39, 0x4, 0xce, 0x4b, 0xc2, 0xb9, 0xc2, 0x9b, 0xa2, 0xaa, 0xdd, 0x7e, 0x27, 0xc9, 0x51, 0x6e, 0x6c, 0x4b, 0xfa, 0x67, 0xd3, 0xf4, 0xcb, 0x98, 0x6f, 0x96, 0x98, 0xe, 0x98, 0x24, 0x25, 0xda, 0xb, 0xd6, 0x8b, 0x5e, 0x72, 0x7b, 0x63, 0x4c, 0x5a, 0x2c, 0x1, 0x7f, 0xd4, 0x5a, 0x7e, 0x80, 0xbd, 0xc0, 0x46, 0xe8, 0x85, 0x8d, 0xc6, 0xb3, 0x14, 0x68, 0x9f, 0x3b, 0x76, 0x7f, 0x89, 0xe7, 0xa, 0xf6, 0x22, 0xd8, 0xcf, 0x97, 0xc4, 0xd5, 0x7f, 0x82, 0x7b, 0xa, 0x8f, 0x55, 0xd8, 0xf, 0xe4, 0x1, 0x73, 0xb9, 0xcf, 0x2e, 0x5c, 0x8e, 0xa0, 0xef, 0x0, 0x5b, 0x69, 0xb0, 0xb4, 0xd5, 0x6a, 0x39, 0xe0, 0x98, 0x28, 0xf5, 0x7d, 0x15, 0x6d, 0x68, 0xde, 0x3a, 0x56, 0x1a, 0x3c, 0xd9, 0xb7, 0xe1, 0x9, 0x2a, 0x88, 0x21, 0x27, 0x77, 0xc8, 0xf1, 0x3e, 0x5, 0x57, 0xe2, 0xdb, 0x89, 0xfe, 0x8, 0xec, 0x5, 0xb1, 0x8a, 0x57, 0xe3, 0xc, 0x99, 0x42, 0x30, 0xe, 0x97, 0xe2, 0x7e, 0xf4, 0xbd, 0xd1, 0xa8, 0xd3, 0x6e, 0x9c, 0x72, 0x5f, 0xe2, 0x59, 0x87, 0xbe, 0x16, 0x28, 0xc6, 0xf2, 0x36, 0xe8, 0xb7, 0x9a, 0x3d, 0xfd, 0x1d, 0xa, 0x55, 0x3f, 0xe3, 0x28, 0x77, 0x26, 0xf, 0xb7, 0xfd, 0x22, 0xf0, 0xaf, 0x5e, 0xc4, 0x1, 0x14, 0x57, 0x36, 0xe5, 0x5d, 0x8c, 0x89, 0xec, 0x80, 0xed, 0x8a, 0x4b, 0x3e, 0x72, 0xb5, 0xe6, 0xcf, 0x74, 0x78, 0x94, 0x3a, 0xe5, 0x28, 0xe8, 0x49, 0xaa, 0xdb, 0x5f, 0x48, 0xd6, 0xdb, 0x66, 0x3e, 0xbb, 0x78, 0x91, 0xc3, 0xe8, 0xce, 0x99, 0xc2, 0xf0, 0xde, 0xfb, 0x1e, 0x28, 0x39, 0x48, 0xda, 0xd9, 0xd1, 0x6b, 0xe7, 0x45, 0xb0, 0x34, 0x9, 0xaa, 0x29, 0xcf, 0x7, 0xb1, 0xf2, 0xe8, 0xc8, 0x77, 0xf4, 0x3a, 0xa0, 0xc, 0x9c, 0xbf, 0x5d, 0x84, 0x73, 0xd1, 0xf6, 0x11, 0xe3, 0xa6, 0x32, 0x4e, 0x90, 0x75, 0xb0, 0x31, 0xf2, 0xee, 0x28, 0xce, 0x4d, 0x56, 0x20, 0x53, 0x1d, 0x25, 0x97, 0x98, 0x91, 0x39, 0x65, 0xbd, 0x77, 0xf4, 0xd3, 0xc0, 0x89, 0x79, 0xf5, 0xdc, 0x6, 0x16, 0xd3, 0x77, 0xca, 0xbc, 0x5, 0xc7, 0x81, 0xf9, 0xaf, 0xe4, 0xd9, 0x30, 0x48, 0x63, 0x17, 0x3a, 0xd5, 0x33, 0xff, 0xd2, 0xb7, 0x5d, 0xf3, 0x1e, 0x2f, 0xf6, 0x1b, 0xf8, 0xbf, 0x20, 0xc6, 0x22, 0x74, 0x9c, 0xd, 0x3, 0x67, 0xc3, 0xd7, 0xb1, 0x1d, 0xd0, 0x55, 0xa, 0xd2, 0x19, 0x84, 0xe, 0xde, 0x18, 0xfa, 0x24, 0x7e, 0x6, 0x58, 0xd, 0x9c, 0xe0, 0xe, 0xea, 0xde, 0x6, 0x6b, 0xc0, 0xd, 0x60, 0x2, 0x9f, 0xf2, 0x4b, 0x47, 0xcd, 0x23, 0x44, 0x83, 0x48, 0x71, 0xf, 0xac, 0xf2, 0x86, 0xca, 0x83, 0x1c, 0x5b, 0x5a, 0xad, 0x0, 0x3, 0x3e, 0x7, 0x94, 0x13, 0x1d, 0x14, 0xeb, 0xdc, 0xea, 0x4c, 0x15, 0xdb, 0xa7, 0x78, 0xd, 0xed, 0x2, 0x7b, 0x8b, 0xa3, 0x9e, 0x93, 0xc3, 0xd8, 0xa6, 0xa5, 0xb2, 0xd6, 0xa9, 0xa1, 0x3b, 0xb9, 0x8b, 0x3d, 0xee, 0xa, 0x20, 0x4b, 0x8a, 0xfd, 0x2, 0xb6, 0xd7, 0xdb, 0xe3, 0xc0, 0x6d, 0xa9, 0xb6, 0x16, 0x3b, 0xc5, 0xe, 0xb, 0xca, 0xca, 0xd9, 0xc6, 0x95, 0xd7, 0x67, 0xac, 0x33, 0xb1, 0x45, 0xe4, 0x13, 0x65, 0xcd, 0xb9, 0xc8, 0xfe, 0xee, 0xce, 0x49, 0xe8, 0xa, 0x2a, 0xbe, 0x63, 0xd0, 0x57, 0xd0, 0x5b, 0xc1, 0x16, 0xe0, 0xf5, 0x15, 0xa9, 0x81, 0xbf, 0x31, 0x72, 0x21, 0x4b, 0x75, 0x4c, 0xc8, 0xd9, 0x7b, 0xe, 0x6c, 0x2b, 0x9c, 0x84, 0xf9, 0x8c, 0x1a, 0x5c, 0xba, 0xc6, 0xc8, 0xce, 0xfb, 0xba, 0x23, 0x44, 0x5, 0x8d, 0x2f, 0xa4, 0x62, 0x17, 0xc8, 0xa5, 0x3f, 0x8c, 0x9d, 0xf9, 0xd3, 0xdd, 0xe7, 0x64, 0x97, 0x3d, 0x53, 0x2e, 0xa4, 0x79, 0xbb, 0x92, 0x89, 0x6f, 0x87, 0x9f, 0xb, 0xe2, 0x42, 0x74, 0xb6, 0x9c, 0xc2, 0x1e, 0xec, 0x6f, 0x74, 0x20, 0x1e, 0xac, 0x45, 0x61, 0xfd, 0x3f, 0x7f, 0xf2, 0x12, 0x70, 0x75, 0xe5, 0xa5, 0xc4, 0x4e, 0x6b, 0xc4, 0x1d, 0xaa, 0x81, 0xbc, 0xdf, 0x51, 0x71, 0x6b, 0x64, 0xa7, 0xe2, 0x3a, 0x35, 0xaa, 0xa4, 0x45, 0x92, 0xfb, 0x96, 0x85, 0xf4, 0xee, 0x9f, 0x8f, 0xae, 0xf8, 0xb8, 0xf4, 0xb1, 0xd4, 0x68, 0xf3, 0xd7, 0xb4, 0x30, 0x15, 0x5c, 0xe5, 0xcc, 0x23, 0xcc, 0x69, 0x29, 0x41, 0xc3, 0x51, 0xb7, 0xa7, 0x5b, 0x8c, 0x6e, 0xd5, 0x89, 0x11, 0xe5, 0x93, 0x12, 0x29, 0xcf, 0x59, 0x14, 0x83, 0x3d, 0x3, 0x7b, 0xc2, 0xf, 0xe1, 0x79, 0xa8, 0x34, 0x92, 0xb4, 0x79, 0x3c, 0x43, 0xba, 0x82, 0xce, 0xa8, 0x9f, 0xa3, 0xc3, 0x95, 0xf4, 0xce, 0x77, 0x11, 0x3f, 0x2e, 0xb1, 0xaa, 0xd5, 0xb5, 0x1c, 0xec, 0x21, 0xe1, 0x9d, 0x2a, 0xe9, 0xcd, 0xf8, 0xee, 0x6, 0x76, 0xc8, 0x3c, 0x6e, 0x74, 0xc0, 0x5f, 0xc9, 0x49, 0x20, 0x9f, 0xbb, 0xfd, 0x39, 0xb1, 0x77, 0x96, 0x1d, 0xcc, 0x14, 0x89, 0x71, 0xab, 0xe5, 0xa6, 0x41, 0x92, 0xde, 0x48, 0xcd, 0x25, 0xc0, 0x5f, 0x32, 0xd3, 0xc2, 0x3c, 0x47, 0x9d, 0x52, 0xd9, 0x50, 0x46, 0xf3, 0x76, 0x68, 0xc, 0x3e, 0x23, 0x4f, 0x21, 0xe7, 0x9b, 0x61, 0x31, 0x30, 0x45, 0xee, 0x2, 0x8f, 0x81, 0x95, 0xc0, 0x99, 0xfa, 0x3, 0x41, 0x8c, 0x4e, 0x90, 0xba, 0x4d, 0xdd, 0x5c, 0xc5, 0xd5, 0xf5, 0x5a, 0xfd, 0x1, 0x5c, 0xc5, 0x18, 0x7e, 0xa5, 0x54, 0x63, 0x65, 0xf0, 0xbc, 0x77, 0xe3, 0x91, 0x52, 0x88, 0x1c, 0xa4, 0xd2, 0xfc, 0x59, 0xe, 0x7e, 0x5, 0xe7, 0x0, 0x25, 0x26, 0x97, 0x64, 0xc3, 0xd1, 0x35, 0xfb, 0x68, 0x35, 0xf7, 0x3f, 0xeb, 0xa, 0x59, 0x53, 0x74, 0xfa, 0xd, 0xd1, 0x2b, 0x2e, 0x33, 0x8a, 0x9, 0xa0, 0x57, 0x83, 0xba, 0xf4, 0x7c, 0x7, 0x74, 0x3d, 0x9, 0x7b, 0xb6, 0x21, 0xc8, 0x6c, 0x7e, 0xc7, 0xf1, 0x6d, 0xa2, 0x7c, 0x9d, 0xbc, 0xb0, 0x67, 0xec, 0x7e, 0xd6, 0xd5, 0x75, 0x6c, 0xb9, 0xe, 0x3a, 0xbc, 0x67, 0x4, 0xc4, 0xcf, 0xf3, 0x7c, 0x9f, 0xce, 0x36, 0xf8, 0x28, 0xf5, 0xc6, 0xce, 0xf8, 0x37, 0x97, 0xb1, 0xab, 0x9d, 0xaf, 0x93, 0xeb, 0x69, 0xd3, 0x39, 0xe, 0x22, 0x7a, 0x11, 0x98, 0x4, 0x6d, 0x56, 0x52, 0x22, 0xbe, 0xfc, 0x3d, 0x98, 0x6, 0x1f, 0x85, 0x58, 0xbf, 0x3e, 0xf9, 0x39, 0xb6, 0x7e, 0x68, 0xb2, 0x39, 0x3, 0x8, 0xc5, 0x77, 0x1b, 0x7a, 0x21, 0x78, 0xd, 0xf4, 0x92, 0x7e, 0x4, 0x6, 0xf5, 0x1b, 0x33, 0xc9, 0x4e, 0xd6, 0xc6, 0x1e, 0x28, 0x15, 0xb2, 0x7d, 0xa5, 0x9, 0x56, 0x7d, 0x6c, 0x62, 0x5f, 0x7, 0x36, 0x80, 0xdd, 0xe0, 0x77, 0x90, 0x3, 0xd, 0x4a, 0xae, 0xbb, 0x1d, 0x21, 0xe2, 0x9f, 0x23, 0xea, 0x3d, 0x20, 0xbe, 0xd8, 0xd1, 0xd5, 0x98, 0x15, 0x91, 0x61, 0xc, 0x2, 0x78, 0x7, 0x37, 0x5e, 0x6d, 0x94, 0x1f, 0x6, 0xe6, 0xb5, 0x32, 0x6a, 0x7a, 0x78, 0x65, 0x29, 0x7e, 0x95, 0x5f, 0x26, 0x27, 0xb4, 0xbf, 0x70, 0xb3, 0xb, 0xd, 0x25, 0x55, 0x47, 0x7e, 0x11, 0x37, 0xbe, 0x8a, 0x69, 0x73, 0x3e, 0x78, 0x19, 0xe4, 0xea, 0xe, 0x4b, 0x96, 0xae, 0x31, 0xc1, 0xec, 0xbf, 0x87, 0xf2, 0xa5, 0x32, 0x44, 0xf, 0x46, 0x76, 0xf6, 0xe9, 0x44, 0xb0, 0xcb, 0x9, 0xf8, 0x12, 0x38, 0x0, 0x52, 0x86, 0x25, 0x6b, 0x4a, 0x78, 0x75, 0xa9, 0x95, 0xcd, 0x20, 0xee, 0x77, 0xf4, 0x50, 0x64, 0xbd, 0xc6, 0x96, 0x41, 0xdc, 0x44, 0x3f, 0x0, 0xdc, 0x7e, 0x3f, 0x97, 0x26, 0xc0, 0x35, 0xe0, 0x56, 0x70, 0x3d, 0xc8, 0x77, 0x85, 0xaf, 0x38, 0xf3, 0x6c, 0x90, 0x83, 0x61, 0x1b, 0x7f, 0x56, 0xf3, 0x7d, 0x90, 0x57, 0xd5, 0x7a, 0x7e, 0x10, 0x9e, 0xc2, 0x1f, 0x2b, 0x8b, 0x6d, 0xcc, 0xc1, 0x5, 0xc2, 0xcb, 0x81, 0xff, 0x61, 0xfc, 0x7, 0xb8, 0x5d, 0xb9, 0x65, 0x98, 0x95, 0xb8, 0x3a, 0xae, 0xaa, 0xd2, 0x38, 0x40, 0xde, 0x78, 0x89, 0x52, 0x67, 0x3b, 0xaf, 0x3f, 0xe3, 0x64, 0x1f, 0xcc, 0xf6, 0x16, 0xe0, 0xe4, 0x43, 0xb0, 0x47, 0x3f, 0x60, 0x74, 0x36, 0x5f, 0x1f, 0x4, 0x5f, 0x81, 0xba, 0xf8, 0xf5, 0x2a, 0x59, 0xa1, 0x2d, 0x24, 0xe3, 0xd5, 0x2c, 0x71, 0xed, 0xee, 0x36, 0xb8, 0x1a, 0xb2, 0x8d, 0xd2, 0x7d, 0x35, 0xa2, 0x8d, 0xb3, 0x91, 0xfe, 0x81, 0x35, 0xc1, 0xaa, 0x17, 0x9b, 0x9d, 0x28, 0xdf, 0x2, 0x5e, 0x5, 0x3f, 0x82, 0x51, 0xc5, 0xbe, 0xde, 0xdf, 0xab, 0xea, 0x44, 0x28, 0x67, 0x5a, 0xd4, 0xdd, 0x43, 0xd9, 0x91, 0x8b, 0x4, 0x52, 0xfb, 0x94, 0xab, 0x1e, 0x1b, 0xf8, 0xcc, 0xdb, 0x15, 0xc0, 0x5c, 0xf6, 0x21, 0x74, 0x31, 0x38, 0x17, 0x9c, 0x5, 0xbc, 0x37, 0x6d, 0x6b, 0xde, 0xff, 0x5, 0x7e, 0x3, 0xbb, 0xc1, 0x76, 0xf0, 0x25, 0xd8, 0x41, 0x2c, 0x5f, 0x7b, 0x21, 0x85, 0xa8, 0x5f, 0xd2, 0x8d, 0xa7, 0x62, 0xd6, 0xf, 0xa3, 0xff, 0x3, 0xf7, 0x93, 0x7f, 0xd4, 0xd5, 0x86, 0x9a, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; + + + + + (NSData *)twitter_icon2x_png { + return [NSData dataWithBytes:twitter_icon2x_png length:sizeof(twitter_icon2x_png)]; + } + + const unsigned char twitter_icon3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x36, 0x8, 0x6, 0x0, 0x0, 0x0, 0x73, 0xe7, 0x4f, 0x3f, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x0, 0x9, 0x70, 0x48, 0x59, 0x73, 0x0, 0x0, 0x2e, 0x23, 0x0, 0x0, 0x2e, 0x23, 0x1, 0x78, 0xa5, 0x3f, 0x76, 0x0, 0x0, 0x1, 0xcb, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74, 0x69, 0x66, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x3c, 0x2f, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0xa, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0xa, 0x29, 0x2e, 0xcd, 0x3d, 0x0, 0x0, 0xb, 0x9, 0x49, 0x44, 0x41, 0x54, 0x68, 0x5, 0xd5, 0x9a, 0x7b, 0xa8, 0xe5, 0x55, 0x15, 0xc7, 0xe7, 0xce, 0x1d, 0xc7, 0xd1, 0x44, 0xcd, 0xde, 0x33, 0x15, 0xa9, 0x94, 0x56, 0x14, 0x64, 0x30, 0x44, 0xa1, 0x5d, 0x1a, 0x2c, 0x6d, 0xe8, 0x61, 0x94, 0x45, 0x30, 0x4a, 0x49, 0x52, 0x50, 0x4a, 0x18, 0x18, 0x64, 0xd0, 0x3, 0x26, 0x8, 0x89, 0xe8, 0x41, 0xfd, 0xa3, 0x21, 0x15, 0xa5, 0xff, 0x68, 0x62, 0x89, 0x77, 0xd4, 0x92, 0xc9, 0xc7, 0x58, 0x8, 0x9a, 0x64, 0xce, 0x4c, 0x83, 0x36, 0x39, 0x5a, 0x96, 0x8f, 0xd1, 0xd2, 0x79, 0xdc, 0xb9, 0x7d, 0x3e, 0xfb, 0xec, 0xf5, 0x73, 0xff, 0x7e, 0xe7, 0xf7, 0x3b, 0xf7, 0x9e, 0x39, 0xe7, 0xdc, 0x99, 0x16, 0x7c, 0xcf, 0x5a, 0x7b, 0xed, 0xb5, 0xd7, 0xde, 0x7b, 0xed, 0xb5, 0xf7, 0x6f, 0x9f, 0x73, 0x7e, 0x53, 0xcb, 0x1a, 0x34, 0x3f, 0x3f, 0x3f, 0x8d, 0x6a, 0x7e, 0x6a, 0x6a, 0xea, 0x40, 0xa3, 0x6a, 0x49, 0x8a, 0xf4, 0xbf, 0xdc, 0x8e, 0xa2, 0x7f, 0xca, 0xab, 0x29, 0xce, 0x80, 0x33, 0xc0, 0xa9, 0xe0, 0x64, 0xf0, 0x6a, 0xb0, 0x1b, 0x6c, 0x7, 0x3b, 0xc0, 0xdd, 0xe0, 0x16, 0xda, 0xdc, 0x3, 0x4f, 0x44, 0xbb, 0x15, 0x94, 0xf7, 0x17, 0xe5, 0x29, 0x64, 0xe7, 0xa6, 0xef, 0x52, 0x7f, 0x24, 0xe5, 0x3d, 0x61, 0xb7, 0x8c, 0x86, 0x1a, 0x56, 0x44, 0x39, 0x35, 0xaa, 0x14, 0x4b, 0x20, 0x94, 0x7d, 0x22, 0xbf, 0x1c, 0x5c, 0x6, 0xb6, 0x82, 0x1a, 0x1d, 0x80, 0x6a, 0x8a, 0x5e, 0xe1, 0x19, 0xd8, 0x2f, 0xc0, 0xbb, 0x62, 0xa8, 0xc8, 0x2b, 0xc1, 0x11, 0x22, 0x74, 0xc1, 0xd1, 0xad, 0x5, 0x5f, 0x7, 0x6b, 0x42, 0x67, 0x10, 0xd2, 0x2a, 0xc0, 0xa7, 0xc1, 0x9b, 0xc0, 0x31, 0x56, 0xc2, 0xfb, 0x1c, 0x54, 0x8d, 0xc6, 0x2c, 0xd8, 0x77, 0xb8, 0x44, 0x7e, 0x1f, 0xb8, 0x17, 0x24, 0xca, 0xf3, 0xde, 0x47, 0x61, 0x2f, 0xd8, 0xf, 0xc, 0xc4, 0x1c, 0x28, 0x75, 0x14, 0x13, 0x3d, 0xc7, 0xa7, 0x13, 0x5c, 0x15, 0xfe, 0x82, 0xab, 0x3, 0xa7, 0x83, 0xef, 0x2, 0xdb, 0x5f, 0x13, 0x75, 0x89, 0xa3, 0x48, 0x13, 0x86, 0xaf, 0x1, 0xf7, 0x81, 0x8d, 0x61, 0x80, 0xbc, 0x22, 0xe4, 0x49, 0x71, 0xfa, 0x48, 0xb, 0xa1, 0x7f, 0xe4, 0xb, 0xc1, 0x1e, 0x20, 0xc5, 0x44, 0x1d, 0xb4, 0x93, 0x6f, 0x45, 0xce, 0x10, 0x6d, 0x9f, 0x7, 0x41, 0xd7, 0x20, 0xbc, 0x12, 0x1c, 0xb, 0xce, 0x0, 0x97, 0x80, 0x9b, 0xc0, 0x6e, 0x20, 0x19, 0xd4, 0x37, 0xe7, 0x3e, 0xa7, 0xd3, 0x96, 0x40, 0x91, 0xb6, 0x5, 0x7c, 0x3, 0x8, 0xba, 0x20, 0x26, 0x8e, 0x62, 0x62, 0xc1, 0xc0, 0xf7, 0x94, 0xc8, 0x3, 0xba, 0x20, 0x3a, 0x87, 0xbb, 0xb2, 0x73, 0x39, 0x1b, 0x5a, 0x3, 0x40, 0x7d, 0x4d, 0x9f, 0x6d, 0x23, 0x88, 0xba, 0xba, 0x7, 0x6c, 0x6, 0xcf, 0x5a, 0x68, 0xd0, 0xa5, 0xb9, 0x4f, 0xb7, 0x4e, 0xa, 0x44, 0x35, 0x49, 0x14, 0xee, 0xb1, 0x20, 0x23, 0x76, 0xde, 0xa4, 0x83, 0x41, 0x1f, 0xa9, 0x7f, 0xf8, 0xbb, 0x41, 0xc, 0xf8, 0xf9, 0x61, 0x2, 0x40, 0xbb, 0x32, 0x20, 0x14, 0xd3, 0xf6, 0x71, 0xb, 0x95, 0xe4, 0x7c, 0xc, 0xae, 0x74, 0x3d, 0x38, 0x3a, 0xe6, 0x96, 0x38, 0x8a, 0x18, 0x88, 0x69, 0xf4, 0x0, 0x90, 0xfe, 0xd3, 0x63, 0x29, 0x7d, 0x2e, 0x8c, 0x6, 0xe8, 0xc6, 0x7a, 0x66, 0xe0, 0x2f, 0xfa, 0x3e, 0x6, 0xf9, 0x8e, 0xdc, 0xa7, 0x2b, 0x5a, 0x4e, 0x6c, 0x68, 0xb9, 0x8, 0xa2, 0xbe, 0xdc, 0x2e, 0xe5, 0x96, 0xf9, 0x15, 0xe5, 0xf2, 0x3c, 0x7a, 0xb, 0xe5, 0xf5, 0x6e, 0x8d, 0xa4, 0x84, 0x9f, 0x6, 0x9e, 0x6, 0x92, 0xd1, 0x2c, 0x53, 0xec, 0xb2, 0x32, 0x18, 0xd4, 0xd5, 0x9e, 0x30, 0x51, 0x37, 0x2c, 0xc7, 0x4f, 0xf4, 0x7d, 0x11, 0x72, 0x90, 0x7b, 0x5d, 0x1a, 0x3a, 0x0, 0x2d, 0x6d, 0xc2, 0x8f, 0xdc, 0x6c, 0xf8, 0x11, 0x58, 0xd, 0x5e, 0x7, 0xce, 0x7, 0xee, 0x80, 0xad, 0xe0, 0x23, 0x6, 0x22, 0x9e, 0x18, 0xeb, 0x90, 0x3d, 0x94, 0xa4, 0x48, 0xab, 0x2a, 0x18, 0x73, 0x73, 0x73, 0x3f, 0x41, 0x7f, 0x9c, 0x93, 0x85, 0x2f, 0x7, 0x55, 0x54, 0x87, 0xd, 0x40, 0xf6, 0x11, 0xd9, 0xe0, 0x61, 0x76, 0x27, 0x90, 0xa2, 0xbf, 0x71, 0x4, 0x21, 0x7c, 0xc4, 0x9c, 0x1e, 0xc6, 0xff, 0xcf, 0xc0, 0x2c, 0x78, 0x14, 0x4, 0xf5, 0x1e, 0xc, 0x94, 0x22, 0x10, 0x67, 0x45, 0xd, 0x3c, 0x1e, 0x51, 0xaa, 0xf6, 0x16, 0xfa, 0x2d, 0xc8, 0xef, 0x8c, 0x89, 0x23, 0xaf, 0x0, 0x6, 0x65, 0xe8, 0xc, 0xa1, 0xcd, 0xca, 0x1c, 0x90, 0xb3, 0x91, 0x63, 0xef, 0x46, 0x5f, 0x31, 0x89, 0x81, 0xbc, 0xd8, 0x2, 0x3, 0xed, 0xf0, 0x6f, 0x7d, 0x2c, 0x2e, 0x62, 0x45, 0xdf, 0x8f, 0xb9, 0x18, 0x84, 0x98, 0xc4, 0x73, 0xc8, 0xfb, 0xa2, 0x22, 0xf3, 0x79, 0xb8, 0xe7, 0x82, 0x37, 0x31, 0x6f, 0x9a, 0x6b, 0xc1, 0x8d, 0xb8, 0xf9, 0xa, 0x58, 0xe5, 0xd, 0xd, 0xa8, 0x37, 0x18, 0x8b, 0xe, 0x8, 0xb6, 0xf6, 0x19, 0xb7, 0x3b, 0x7d, 0xfa, 0xcc, 0xb7, 0x2f, 0xb3, 0x4c, 0x5e, 0xa3, 0x6c, 0x5f, 0xd3, 0x75, 0x15, 0x6, 0xd8, 0xea, 0x7b, 0x2e, 0xc3, 0xe6, 0x57, 0x80, 0x8b, 0x15, 0x68, 0xb3, 0xa2, 0xf7, 0xd1, 0x2b, 0x78, 0x91, 0x7a, 0x1c, 0x48, 0xee, 0xd3, 0x32, 0xca, 0xea, 0x8c, 0x68, 0xec, 0x5f, 0xcb, 0xb7, 0x83, 0xf7, 0xeb, 0x28, 0x88, 0x72, 0xda, 0x32, 0xf2, 0xd0, 0xb5, 0x71, 0xea, 0xab, 0x6d, 0x85, 0xfc, 0x73, 0x20, 0x99, 0xd, 0x65, 0x9f, 0x63, 0x93, 0x73, 0xe6, 0x94, 0x63, 0xff, 0x31, 0x7d, 0xc5, 0xd6, 0x4c, 0xbc, 0xc, 0xc4, 0xf1, 0x54, 0xfe, 0x1, 0x48, 0xee, 0xd5, 0xda, 0x40, 0x8a, 0x34, 0x2c, 0x1d, 0xba, 0xff, 0xae, 0x6, 0xd5, 0xb5, 0x36, 0x26, 0x8e, 0xce, 0x5b, 0xaa, 0x5b, 0x47, 0x1e, 0x59, 0x97, 0xaa, 0xd5, 0x2b, 0xc0, 0x8f, 0x2, 0x9b, 0x80, 0x34, 0x89, 0xf3, 0x21, 0xe6, 0x10, 0xe7, 0x84, 0xc1, 0xfe, 0x6a, 0x31, 0xc6, 0x5e, 0x10, 0x50, 0xb8, 0x72, 0x29, 0x15, 0x49, 0xf1, 0xa7, 0x90, 0xef, 0xca, 0x46, 0xb5, 0x81, 0xab, 0xa3, 0x3e, 0x52, 0x36, 0x52, 0xcc, 0xd4, 0xb6, 0xfd, 0xb9, 0xe0, 0x16, 0x3a, 0xf0, 0x26, 0xb7, 0x1e, 0xbc, 0x88, 0xb2, 0xf6, 0x73, 0xc0, 0xad, 0x63, 0x3a, 0x7a, 0x69, 0x32, 0x28, 0xbd, 0xcb, 0x4b, 0xfe, 0xf2, 0x83, 0xde, 0x73, 0xa2, 0xef, 0x2a, 0x8c, 0x6e, 0x9c, 0xe4, 0xb8, 0x23, 0x43, 0xbf, 0xcc, 0x78, 0xbe, 0xa9, 0x73, 0xc7, 0xe3, 0xf8, 0xa2, 0xa3, 0xe5, 0xe, 0x14, 0x65, 0xa4, 0xea, 0x6f, 0x72, 0x85, 0xe7, 0x82, 0x7b, 0xbf, 0x95, 0xb4, 0xcf, 0x6d, 0x62, 0xcf, 0x1d, 0x89, 0xe1, 0xc7, 0xc0, 0xd, 0xe0, 0x66, 0xea, 0x2e, 0x5, 0x6f, 0x7, 0x47, 0xe9, 0x80, 0x3e, 0xe, 0xd8, 0x29, 0xd8, 0x67, 0x7f, 0xa8, 0xe2, 0x2c, 0xb2, 0xf, 0xcb, 0x93, 0xa4, 0x58, 0x40, 0xfb, 0x78, 0xc0, 0xf, 0xc6, 0x75, 0x84, 0xe3, 0x51, 0xe, 0x8a, 0xd4, 0x88, 0xc, 0xb8, 0x95, 0x8a, 0x59, 0xf0, 0x5e, 0xa0, 0xa1, 0x13, 0x2c, 0x1d, 0x51, 0xac, 0x65, 0x87, 0x67, 0x42, 0x5a, 0xfd, 0x6c, 0xa7, 0xbf, 0x77, 0x64, 0x3c, 0xb, 0xff, 0x23, 0xf5, 0xbf, 0x97, 0x83, 0x7, 0xc1, 0x2e, 0x6, 0xb0, 0x1b, 0xa4, 0x20, 0xc3, 0xfd, 0xc6, 0xf8, 0x77, 0xf4, 0x92, 0x63, 0xe8, 0xeb, 0x2b, 0xd5, 0x8c, 0xef, 0x23, 0x7d, 0x99, 0xc4, 0x5d, 0x5f, 0xf0, 0x53, 0x20, 0x8c, 0x4e, 0x8e, 0x92, 0xfb, 0xf4, 0x3b, 0x18, 0xae, 0x3, 0x6, 0x61, 0x2f, 0x30, 0x7d, 0x3b, 0x7, 0x48, 0x5b, 0xaa, 0xab, 0xd4, 0x73, 0x82, 0x42, 0xa5, 0x9d, 0xce, 0x64, 0xc0, 0x96, 0x3d, 0x6, 0x76, 0xe0, 0x7f, 0x7, 0x7c, 0x27, 0x78, 0x34, 0xe3, 0x78, 0xb8, 0x14, 0x59, 0x99, 0xa, 0xd8, 0xe1, 0xba, 0xb7, 0x1d, 0x4b, 0x39, 0x55, 0xe6, 0x8f, 0x36, 0x7d, 0xa9, 0xcb, 0x72, 0xd9, 0xc4, 0xf9, 0x48, 0xb1, 0xf0, 0xbd, 0x52, 0x9b, 0xc2, 0x1a, 0x1c, 0x5c, 0xe, 0xbb, 0x44, 0x11, 0x98, 0x19, 0x6e, 0x95, 0xce, 0x60, 0x50, 0xd7, 0x24, 0x6d, 0x45, 0x4, 0x25, 0x5, 0xbc, 0x69, 0x94, 0xcb, 0x74, 0x97, 0xb2, 0xaa, 0xa3, 0x7a, 0x24, 0xb5, 0x13, 0x76, 0xf5, 0xd, 0xb2, 0xf3, 0x58, 0x4f, 0x70, 0x67, 0xe9, 0xaf, 0x76, 0x3e, 0xa0, 0xaf, 0x56, 0xd2, 0xc9, 0x9b, 0x1, 0x89, 0x30, 0xfe, 0x12, 0x82, 0xdf, 0xd5, 0x75, 0x64, 0x10, 0x3c, 0x47, 0xfa, 0xa2, 0x88, 0xbe, 0x8b, 0xb4, 0xf5, 0x80, 0x32, 0x0, 0xe, 0xc2, 0x80, 0x78, 0x2e, 0xb8, 0x22, 0xc2, 0x41, 0xa9, 0x93, 0x5c, 0xf9, 0x9e, 0x54, 0x7c, 0x96, 0xfd, 0x95, 0x72, 0x61, 0xe2, 0x98, 0xfb, 0x1a, 0x96, 0x3a, 0x64, 0xcd, 0x63, 0x1, 0xbd, 0x27, 0x3d, 0x53, 0xb6, 0x2f, 0xe5, 0x38, 0x4d, 0xd5, 0x9d, 0x49, 0xc3, 0x2b, 0xc0, 0xba, 0x6c, 0xf0, 0x49, 0xf8, 0xf, 0x80, 0x13, 0x98, 0x66, 0xb0, 0x31, 0xf0, 0x5c, 0x3d, 0x14, 0xf3, 0xa9, 0x61, 0x40, 0xdd, 0x66, 0xf2, 0xd8, 0x6, 0xfa, 0x6c, 0xf5, 0x4b, 0x7f, 0x31, 0x1, 0x23, 0x55, 0xc9, 0xd8, 0x57, 0xd4, 0xa6, 0x2f, 0x75, 0xc8, 0xda, 0x46, 0x5b, 0x7f, 0xda, 0x7b, 0x32, 0x37, 0xee, 0xb, 0x60, 0xba, 0x22, 0xd3, 0xc0, 0xc1, 0xb8, 0xa7, 0x3f, 0xd, 0xce, 0x65, 0xd0, 0xf7, 0xc2, 0x37, 0x83, 0x47, 0xc0, 0x76, 0xf0, 0x46, 0x30, 0x12, 0x95, 0x3, 0xcc, 0x8e, 0xd2, 0xef, 0x10, 0x2d, 0xfa, 0x91, 0xfa, 0x69, 0x69, 0x1c, 0x81, 0x78, 0x9c, 0xba, 0x27, 0x5a, 0xea, 0x93, 0xca, 0xd4, 0x8d, 0xe8, 0xfc, 0x15, 0xd9, 0x93, 0xde, 0x80, 0x78, 0x41, 0x12, 0x92, 0x29, 0x45, 0x6c, 0xe6, 0x7d, 0xd4, 0x86, 0xd3, 0x94, 0x96, 0x51, 0xa6, 0xe, 0xf1, 0x85, 0x83, 0xcd, 0x46, 0x51, 0x56, 0xee, 0xa2, 0x41, 0x36, 0x4d, 0x9f, 0x6d, 0xb6, 0xa5, 0x4d, 0x57, 0x1f, 0x85, 0x7e, 0x27, 0x72, 0x64, 0x44, 0x35, 0x8f, 0xa8, 0x77, 0x6b, 0x44, 0x20, 0x34, 0x14, 0xd2, 0x7f, 0x41, 0x3c, 0x62, 0xe2, 0x2e, 0x50, 0x6b, 0x5c, 0xe, 0xac, 0x29, 0x97, 0xe5, 0xe4, 0xed, 0x20, 0x3e, 0x4a, 0x1f, 0xa5, 0x5c, 0xba, 0xea, 0xd2, 0x17, 0x36, 0x8e, 0x39, 0xb6, 0xff, 0x36, 0xec, 0xdd, 0xe6, 0x52, 0xdf, 0x76, 0xd4, 0x28, 0x4d, 0x10, 0x23, 0x1f, 0x6f, 0x77, 0x6a, 0x5, 0xb9, 0x8f, 0xad, 0xf3, 0x50, 0x8b, 0x80, 0x20, 0xfe, 0xdf, 0x91, 0x13, 0x8e, 0x27, 0xd6, 0x9f, 0x1d, 0xbd, 0x99, 0x2d, 0x53, 0x2e, 0x49, 0xa5, 0xf7, 0x71, 0xb9, 0x74, 0x7d, 0x8f, 0xa5, 0x40, 0x84, 0x93, 0xa8, 0xcb, 0x55, 0x3d, 0x66, 0x5a, 0x86, 0x62, 0x31, 0x72, 0xd8, 0x6, 0xb7, 0x4d, 0xd9, 0xae, 0xd4, 0x2b, 0x97, 0x75, 0xa5, 0x1c, 0x76, 0x4d, 0x9b, 0x52, 0x9f, 0x65, 0xc7, 0x17, 0x2b, 0xef, 0x96, 0xb8, 0x3f, 0xeb, 0x3d, 0xf8, 0xfb, 0x3, 0x91, 0x95, 0x31, 0xd9, 0x59, 0x8c, 0x6f, 0xce, 0xd, 0x22, 0x8d, 0x72, 0xb1, 0xce, 0x4a, 0x67, 0x8b, 0x91, 0xeb, 0xad, 0x7b, 0x67, 0x48, 0xd9, 0x2e, 0xea, 0x43, 0x17, 0x5c, 0x7d, 0x29, 0x87, 0xdd, 0x20, 0x7d, 0x61, 0x13, 0x81, 0xf8, 0xb, 0xba, 0xad, 0x85, 0xbe, 0x4f, 0x4c, 0x1, 0xa0, 0x23, 0x6f, 0x96, 0x46, 0xca, 0x83, 0xd1, 0xcb, 0x94, 0x5b, 0xc2, 0x2f, 0x43, 0x3e, 0xf3, 0xab, 0x95, 0x47, 0xee, 0xa3, 0xae, 0xd5, 0xea, 0x33, 0x5c, 0x7a, 0x85, 0xab, 0x3e, 0x9d, 0xbb, 0xdd, 0xc2, 0xdc, 0xe2, 0xa0, 0x6c, 0xdd, 0xea, 0x91, 0x9, 0xda, 0xc7, 0x59, 0x71, 0x13, 0xf2, 0xc6, 0xec, 0xc0, 0xe7, 0x7e, 0x4, 0xa3, 0x35, 0x20, 0x5d, 0xab, 0x95, 0xdb, 0x1f, 0x2a, 0xe6, 0x58, 0x9d, 0xb0, 0xe7, 0x83, 0xfc, 0x36, 0xe0, 0x76, 0xf3, 0xcb, 0x56, 0x64, 0x89, 0xaa, 0x8a, 0xaa, 0x40, 0x68, 0x80, 0x61, 0x1c, 0x2c, 0xdf, 0xc0, 0xe2, 0xca, 0x6c, 0x65, 0x30, 0xfc, 0x6f, 0x50, 0x7, 0x76, 0xd0, 0x1a, 0x10, 0xf4, 0x87, 0x1b, 0xc5, 0xca, 0xdf, 0xc7, 0xc0, 0xee, 0x58, 0x68, 0x70, 0x55, 0x20, 0x34, 0x24, 0x18, 0x6e, 0x11, 0xef, 0xe1, 0x3a, 0xf9, 0x2c, 0xf8, 0xa1, 0x7a, 0x28, 0xae, 0xdf, 0x6, 0x64, 0xe0, 0xd9, 0x91, 0xac, 0xf, 0xfd, 0x87, 0x8b, 0xe6, 0x93, 0x4f, 0x9a, 0x65, 0x3e, 0xff, 0xec, 0x89, 0x69, 0xcb, 0x67, 0xb1, 0xce, 0x6a, 0x81, 0xb0, 0xaa, 0x8, 0x86, 0xbf, 0x1d, 0x7c, 0x1e, 0xd5, 0x45, 0x60, 0x17, 0xd0, 0xd6, 0x80, 0xd8, 0x41, 0x67, 0x56, 0x94, 0x67, 0x46, 0x29, 0xd3, 0xa6, 0x46, 0xd6, 0xb5, 0xd5, 0x87, 0x2e, 0xb8, 0x8d, 0x4a, 0xb9, 0x74, 0xd2, 0xa1, 0x77, 0x6c, 0x9e, 0x71, 0x8e, 0xd7, 0x73, 0xe1, 0x3a, 0xa0, 0x8f, 0x95, 0xcc, 0xa7, 0xef, 0x69, 0x61, 0x9d, 0x34, 0x68, 0x42, 0xee, 0xa7, 0xb4, 0xfa, 0x38, 0x79, 0x29, 0xb6, 0x9f, 0x1, 0xeb, 0xc1, 0x29, 0xe0, 0xc5, 0xa0, 0x2f, 0x88, 0xe8, 0xe, 0x17, 0x8a, 0xf3, 0xe1, 0x6a, 0xe6, 0xf0, 0x9, 0x7, 0xc5, 0x1c, 0xbc, 0x19, 0xb7, 0x9e, 0xf, 0xd6, 0x77, 0x6, 0x22, 0x37, 0xf6, 0x3b, 0x86, 0x93, 0xde, 0x9e, 0x6d, 0xd7, 0xc2, 0x75, 0xfc, 0x41, 0xe0, 0x55, 0x3c, 0xce, 0xd, 0xc4, 0xc3, 0x82, 0x9c, 0x8f, 0x8b, 0x67, 0xd6, 0xba, 0x8d, 0xcf, 0x61, 0xf2, 0xfe, 0xea, 0x5e, 0x2d, 0x2a, 0xba, 0x56, 0x8a, 0xc3, 0xb1, 0x56, 0x49, 0xc3, 0xf8, 0xbe, 0xee, 0xc4, 0xfd, 0xa1, 0x46, 0xa7, 0x5e, 0xbb, 0x25, 0x3, 0xe0, 0xa3, 0x55, 0x1a, 0x18, 0xc8, 0x9e, 0xc9, 0xd2, 0x7d, 0x32, 0xee, 0xf4, 0xa5, 0x27, 0xf7, 0x78, 0xa3, 0x41, 0xc8, 0x72, 0x1c, 0x9c, 0x9d, 0x83, 0x69, 0xd, 0x44, 0x61, 0xbd, 0x9, 0xf9, 0x69, 0x70, 0x62, 0xa1, 0xb, 0xb1, 0x75, 0xbf, 0xe5, 0xb1, 0xb4, 0xd6, 0x45, 0xc3, 0x9, 0x71, 0xe6, 0x9d, 0xb6, 0xb2, 0xd9, 0xe0, 0x7d, 0xe8, 0x7b, 0xf6, 0xc3, 0x78, 0x16, 0xcc, 0x6, 0xed, 0x5a, 0xf7, 0x39, 0xe, 0xe3, 0xe9, 0xe1, 0x21, 0xb9, 0x51, 0x43, 0xc8, 0xa8, 0x9a, 0x15, 0xd6, 0x75, 0x4e, 0x94, 0xb6, 0x9d, 0x75, 0x3a, 0x99, 0x4, 0x19, 0x7c, 0xfc, 0xba, 0x4d, 0xe3, 0x2, 0xf5, 0x53, 0xc6, 0xf1, 0xdb, 0xdc, 0x97, 0x7, 0xe7, 0x82, 0xd4, 0x99, 0xda, 0x38, 0xf7, 0xa6, 0x19, 0xbf, 0x4c, 0x5d, 0x8b, 0xa7, 0xf, 0x81, 0x48, 0x31, 0x3b, 0x5c, 0xf2, 0x9, 0x2f, 0x30, 0x1b, 0x27, 0x6c, 0x36, 0x3c, 0x4, 0x66, 0x18, 0xfb, 0xc3, 0xcc, 0x21, 0xb6, 0x38, 0xaa, 0xc1, 0xd4, 0x9a, 0x11, 0x36, 0xc9, 0x41, 0xd0, 0x91, 0x13, 0xfe, 0x2, 0xf8, 0x13, 0x30, 0x0, 0x46, 0x3e, 0x45, 0x39, 0xaf, 0x4, 0xc5, 0x43, 0x4a, 0x2e, 0xa6, 0xb, 0x64, 0x10, 0xa4, 0xaf, 0xe5, 0x20, 0xb8, 0x90, 0x8b, 0xca, 0x6, 0x1b, 0x75, 0x6, 0xc2, 0x4a, 0x1d, 0xe5, 0xa8, 0xee, 0xa4, 0xf8, 0x71, 0x60, 0x30, 0xec, 0x30, 0x5d, 0x5d, 0xa9, 0x77, 0x0, 0x91, 0x19, 0x9d, 0xd9, 0x85, 0xcd, 0x24, 0xa9, 0x7c, 0x72, 0x5d, 0xc9, 0x98, 0xae, 0xca, 0x9d, 0xc5, 0xb8, 0xc6, 0xd3, 0xb7, 0xab, 0xe, 0xd2, 0xde, 0x83, 0xbf, 0x6, 0x5c, 0xb, 0x4a, 0x72, 0xfb, 0xf8, 0x37, 0xa0, 0x7f, 0xa7, 0x19, 0xb8, 0xf8, 0x9b, 0x6d, 0xa9, 0xb8, 0xfd, 0x4a, 0xfe, 0x87, 0xf2, 0x12, 0x67, 0xd, 0x5f, 0xe8, 0x21, 0x70, 0x70, 0xc1, 0xc1, 0x71, 0x19, 0xc, 0xff, 0xd4, 0xf1, 0x85, 0xaf, 0xfb, 0x41, 0x1b, 0x2d, 0x55, 0x0, 0xec, 0x27, 0xfe, 0x2f, 0xfd, 0x7, 0xf2, 0x69, 0xa3, 0x4, 0x61, 0xa8, 0x74, 0xa6, 0xb3, 0x74, 0x80, 0xe6, 0xe, 0xbd, 0x68, 0x7d, 0x20, 0xe3, 0x6d, 0x70, 0xef, 0x17, 0x2b, 0xc1, 0x71, 0xc0, 0x2d, 0x57, 0x4b, 0x4d, 0xda, 0x92, 0xb5, 0x2f, 0x3c, 0x51, 0x2c, 0x63, 0xe3, 0xf6, 0x1b, 0x68, 0xa7, 0x4d, 0x7, 0x79, 0x71, 0xb2, 0x3f, 0xef, 0x38, 0x1f, 0xc5, 0xcf, 0xd, 0xf8, 0x4c, 0xfd, 0x36, 0x7d, 0x76, 0xb4, 0x1f, 0x4d, 0x6d, 0x67, 0x31, 0x89, 0xf0, 0x44, 0xd9, 0x3f, 0x77, 0x7d, 0x17, 0xe9, 0x97, 0x20, 0xc8, 0x2d, 0x33, 0xd6, 0xec, 0x28, 0xfe, 0x91, 0x8f, 0x4c, 0xd0, 0xff, 0x86, 0x62, 0x1c, 0x3, 0xcf, 0xbc, 0xb0, 0x1b, 0xb, 0xa7, 0x63, 0x3, 0xe1, 0x1b, 0xad, 0xd5, 0x3e, 0x44, 0x7e, 0x15, 0xf0, 0x25, 0xce, 0x78, 0x2b, 0xae, 0x2f, 0x8, 0xc5, 0x24, 0x52, 0x70, 0x2c, 0x37, 0x75, 0xb4, 0x1f, 0x14, 0x38, 0xaa, 0xd3, 0xab, 0x4d, 0xf1, 0x62, 0x98, 0xe7, 0xd1, 0xa7, 0x62, 0x52, 0xc8, 0xe9, 0x1c, 0x8b, 0xf2, 0xd8, 0x39, 0x1d, 0xa4, 0xf3, 0x1, 0xee, 0xaa, 0xc7, 0x23, 0x2a, 0xf5, 0x43, 0xf9, 0x4, 0xe0, 0x8b, 0x60, 0x7f, 0x3, 0x41, 0xfb, 0x87, 0x9c, 0xe0, 0xa0, 0xc9, 0x47, 0x9d, 0xbe, 0x9d, 0x78, 0x1c, 0x8c, 0xbe, 0xf4, 0xe6, 0x53, 0x2c, 0xc6, 0x31, 0x7a, 0x10, 0x70, 0x18, 0x2b, 0x9c, 0x26, 0x4a, 0x59, 0xee, 0x8a, 0xb, 0xe5, 0xbe, 0x74, 0x43, 0xf7, 0x5a, 0xf0, 0x39, 0xb0, 0x5, 0x4, 0xf9, 0xe4, 0x18, 0x6b, 0x10, 0x72, 0x40, 0xf5, 0xbf, 0xa7, 0x90, 0xb7, 0x51, 0x7e, 0xcf, 0x58, 0x83, 0x80, 0xb3, 0x45, 0x1f, 0x96, 0x74, 0xbe, 0x6, 0x7b, 0xf, 0xc5, 0x75, 0xe0, 0x2c, 0x70, 0x2a, 0x90, 0x3c, 0xec, 0xe2, 0x1b, 0x5f, 0x52, 0x8c, 0xe9, 0xc3, 0xb1, 0x79, 0x4f, 0xf1, 0x52, 0x14, 0x3f, 0xc, 0xfd, 0x1a, 0xf9, 0x8b, 0x1c, 0x86, 0x6, 0x23, 0x2d, 0x10, 0xb2, 0xf7, 0x88, 0x91, 0xc9, 0xb4, 0x7f, 0x3d, 0x5e, 0x7c, 0xfe, 0x3e, 0x6, 0xfc, 0x2e, 0xe1, 0x1f, 0x3a, 0x3e, 0x1, 0x7c, 0x2a, 0xac, 0x6, 0x27, 0x3, 0xdf, 0x59, 0x7e, 0x2b, 0x70, 0xf2, 0xe5, 0xf6, 0xf0, 0xf7, 0x4c, 0xcf, 0xa, 0x7, 0x55, 0x3b, 0xfd, 0x29, 0x1f, 0x14, 0x31, 0x1e, 0xe6, 0x96, 0x26, 0x67, 0x70, 0x23, 0x0, 0xbb, 0x91, 0xbf, 0xd, 0x2e, 0xa7, 0xce, 0x83, 0x32, 0x2e, 0x74, 0x63, 0xe9, 0xd3, 0x81, 0xea, 0xd0, 0xce, 0xce, 0x3, 0x67, 0x83, 0x55, 0xc0, 0x4e, 0xd5, 0xfb, 0xde, 0x82, 0x68, 0x6e, 0xd, 0x57, 0xc8, 0x55, 0xd0, 0xc6, 0xc7, 0x97, 0x83, 0x19, 0xd7, 0x80, 0x7c, 0xb3, 0x26, 0xae, 0xcb, 0x11, 0x4, 0xb3, 0xe0, 0x5b, 0xe8, 0x6f, 0x87, 0x2f, 0xfa, 0xdb, 0xa4, 0xb6, 0x43, 0x13, 0x11, 0x7e, 0x5, 0xb8, 0x18, 0x3c, 0x8, 0x9a, 0xe4, 0x21, 0xe5, 0x2a, 0x78, 0x5a, 0x7b, 0x58, 0x79, 0x80, 0x55, 0x27, 0xfe, 0x28, 0x7, 0x23, 0x6d, 0xf5, 0x55, 0xde, 0x4c, 0x75, 0x1d, 0x74, 0x17, 0xc2, 0x6, 0x60, 0xb0, 0x13, 0x21, 0x1b, 0xfc, 0x89, 0x50, 0xed, 0x8c, 0xa0, 0x23, 0x5f, 0x4, 0xfb, 0x30, 0x38, 0x1f, 0xcc, 0x80, 0x72, 0x1b, 0xb8, 0x52, 0x41, 0x55, 0x3b, 0xda, 0xb0, 0x58, 0x55, 0x31, 0xea, 0x9b, 0xbc, 0x99, 0x31, 0x65, 0x16, 0x35, 0x27, 0xf7, 0x3b, 0x1a, 0x5f, 0x5, 0xae, 0xc3, 0xef, 0x53, 0x3a, 0xa2, 0xf, 0xc7, 0xe1, 0xcb, 0x69, 0x63, 0x39, 0xf, 0xf4, 0xd9, 0x24, 0xcf, 0x8, 0x67, 0xe1, 0x60, 0xaa, 0x8e, 0xd0, 0x1d, 0x4d, 0xf9, 0x74, 0x70, 0xe, 0x38, 0x13, 0x9c, 0x4, 0x9a, 0xe4, 0xa0, 0x9a, 0x13, 0xd4, 0x97, 0x3e, 0xbd, 0x31, 0xb6, 0xd, 0xda, 0x6d, 0xd6, 0x16, 0xb5, 0x1d, 0xe8, 0x37, 0x1, 0xbf, 0xee, 0x6f, 0xa6, 0x6d, 0xfa, 0x35, 0xc, 0x3f, 0xda, 0xfb, 0x5b, 0xe3, 0xa2, 0xbf, 0x45, 0x62, 0x7f, 0x50, 0x54, 0xd, 0x2a, 0x7, 0xc4, 0xe7, 0xb1, 0x1, 0xa9, 0x26, 0x88, 0xde, 0xa7, 0x85, 0x2f, 0x88, 0xcd, 0x80, 0xb5, 0xe0, 0xd, 0xc0, 0xb3, 0x63, 0x14, 0xfa, 0x37, 0x8d, 0xb7, 0x81, 0xbb, 0xc1, 0x6d, 0xc0, 0x7f, 0xa2, 0x1e, 0x81, 0x27, 0xea, 0x1a, 0x4b, 0xd4, 0x4f, 0x82, 0x57, 0x81, 0x8, 0xe7, 0xc5, 0x20, 0x3c, 0xb8, 0x6a, 0xab, 0x4a, 0x9d, 0x5b, 0xe7, 0x44, 0x70, 0x4a, 0x86, 0x99, 0xe2, 0x93, 0xe5, 0x4, 0x70, 0x2c, 0x78, 0x19, 0xd0, 0xc6, 0x76, 0x4f, 0x82, 0x27, 0x80, 0xef, 0x5c, 0xfc, 0xb, 0xec, 0x2, 0xae, 0xbc, 0x1, 0xd8, 0xa, 0x1e, 0xc2, 0x7f, 0x5a, 0x79, 0xe4, 0x44, 0xf8, 0x4f, 0x19, 0x40, 0xa1, 0xb6, 0x18, 0xb9, 0x7a, 0xa2, 0xec, 0x7f, 0x27, 0x77, 0xca, 0xf8, 0x2b, 0x28, 0xe6, 0x63, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; + + + + + (NSData *)twitter_icon3x_png { + return [NSData dataWithBytes:twitter_icon3x_png length:sizeof(twitter_icon3x_png)]; + } + +@end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..c24ae50 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,51 @@ +PODS: + - Bolts (1.3.0): + - Bolts/AppLinks (= 1.3.0) + - Bolts/Tasks (= 1.3.0) + - Bolts/AppLinks (1.3.0): + - Bolts/Tasks + - Bolts/Tasks (1.3.0) + - FBSDKCoreKit (4.7.0): + - Bolts (~> 1.1) + - FBSDKCoreKit/arc (= 4.7.0) + - FBSDKCoreKit/no-arc (= 4.7.0) + - FBSDKCoreKit/arc (4.7.0): + - Bolts (~> 1.1) + - FBSDKCoreKit/no-arc (4.7.0): + - Bolts (~> 1.1) + - FBSDKCoreKit/arc + - FBSDKLoginKit (4.7.0.1): + - FBSDKCoreKit + - Parse (1.9.0): + - Bolts/Tasks (>= 1.3.0) + - ParseFacebookUtilsV4 (1.9.0): + - Bolts/Tasks (>= 1.3.0) + - FBSDKCoreKit (~> 4.7) + - FBSDKLoginKit (~> 4.7) + - Parse (~> 1.9) + - ParseTwitterUtils (1.9.0): + - Bolts/Tasks (>= 1.3.0) + - Parse (~> 1.9) + - ParseUI (1.1.6): + - Bolts/Tasks (~> 1.2) + - Parse (~> 1.8) + +DEPENDENCIES: + - ParseFacebookUtilsV4 + - ParseTwitterUtils + - ParseUI (from `.`) + +EXTERNAL SOURCES: + ParseUI: + :path: "." + +SPEC CHECKSUMS: + Bolts: 805a4a87413e49d4a0c2b7d469084cbc46b09342 + FBSDKCoreKit: eb580bfc2040ad44f4c0b4f4d0befb1d35bce59c + FBSDKLoginKit: 028c5a205990441123764609fe795e65027c447f + Parse: 712efbc476d4f47b0f96b70db7e53101575753aa + ParseFacebookUtilsV4: aadebfaaaf4a45bf0a0992863bf48c8fc49189e3 + ParseTwitterUtils: 0155d1a4e388690aa5d80405a586474e66606968 + ParseUI: 8a22e448c03f825203d8c379c80523517f68baa3 + +COCOAPODS: 0.39.0 From 1be59a698fe62813c1ef3a31f3f3d399134d12b6 Mon Sep 17 00:00:00 2001 From: Hakon Hanesand Date: Thu, 22 Oct 2015 18:00:26 -0500 Subject: [PATCH 21/63] Spelling Defualt -> Default --- .../PFQueryCollectionViewController.h | 2 +- .../QueryTableViewController/PFQueryTableViewController.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h index e658269..8d34273 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h @@ -58,7 +58,7 @@ PFUI_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) IBInspectable BOOL loadingViewEnabled; /*! - @abstract Whether the collection should use the built-in pull-to-refresh feature. Defualt - `YES`. + @abstract Whether the collection should use the built-in pull-to-refresh feature. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL pullToRefreshEnabled; diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h index 4f73344..4eb1d8b 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h @@ -105,7 +105,7 @@ PFUI_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) IBInspectable BOOL loadingViewEnabled; /*! - @abstract Whether the table should use the built-in pull-to-refresh feature. Defualt - `YES`. + @abstract Whether the table should use the built-in pull-to-refresh feature. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL pullToRefreshEnabled; From 87b2e88a8f14c5e57f939013d7e38d89bdb33ae7 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Mon, 26 Oct 2015 12:55:07 -0700 Subject: [PATCH 22/63] Update Travis-CI for Xcode 7.1. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a6af77d..fa55320 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ branches: - master language: objective-c os: osx -osx_image: xcode7 +osx_image: xcode7.1 env: global: - LC_CTYPE=en_US.UTF-8 From 2ebebe0c8d530b1cf714f357884bb15785ae3e9e Mon Sep 17 00:00:00 2001 From: Hugues Bernet-Rollande Date: Wed, 4 Nov 2015 14:22:57 +0100 Subject: [PATCH 23/63] Define PFLocalizedString, avoiding re-mapping NSLocalizedString macro. --- .../Classes/Cells/PFPurchaseTableViewCell.m | 4 ++-- .../Internal/Extensions/PFUIAlertView.m | 2 +- ParseUI/Classes/Internal/PFLocalization.h | 3 +-- .../Classes/Internal/Views/PFLoadingView.m | 2 +- .../Classes/LogInViewController/PFLogInView.m | 20 ++++++++-------- .../PFLogInViewController.m | 24 +++++++++---------- .../PFProductTableViewController.m | 4 ++-- .../PFQueryCollectionViewController.m | 12 +++++----- .../PFQueryTableViewController.m | 12 +++++----- .../SignUpViewController/PFSignUpView.m | 12 +++++----- .../PFSignUpViewController.m | 16 ++++++------- 11 files changed, 55 insertions(+), 56 deletions(-) diff --git a/ParseUI/Classes/Cells/PFPurchaseTableViewCell.m b/ParseUI/Classes/Cells/PFPurchaseTableViewCell.m index 4a7968b..6ff164c 100644 --- a/ParseUI/Classes/Cells/PFPurchaseTableViewCell.m +++ b/ParseUI/Classes/Cells/PFPurchaseTableViewCell.m @@ -125,7 +125,7 @@ - (void)setState:(PFPurchaseTableViewCellState)state { { self.detailTextLabel.numberOfLines = 1; self.priceLabel.backgroundColor = [UIColor colorWithRed:132.0f/255.0f green:175.0f/255.0f blue:230.0f/255.0f alpha:1.0f]; - NSString *downloadingText = NSLocalizedString(@"DOWNLOADING", @"DOWNLOADING"); + NSString *downloadingText = PFLocalizedString(@"DOWNLOADING", @"DOWNLOADING"); self.priceLabel.text = [NSString stringWithFormat:@" %@ ", downloadingText]; self.priceLabel.textColor = [UIColor whiteColor]; self.priceLabel.shadowColor = [UIColor blackColor]; @@ -136,7 +136,7 @@ - (void)setState:(PFPurchaseTableViewCellState)state { case PFPurchaseTableViewCellStateDownloaded: { self.detailTextLabel.numberOfLines = 2; - NSString *installedText = NSLocalizedString(@"INSTALLED", @"INSTALLED"); + NSString *installedText = PFLocalizedString(@"INSTALLED", @"INSTALLED"); self.priceLabel.text = [NSString stringWithFormat:@" %@ ", installedText]; self.priceLabel.textColor = [UIColor whiteColor]; self.priceLabel.shadowColor = [UIColor blackColor]; diff --git a/ParseUI/Classes/Internal/Extensions/PFUIAlertView.m b/ParseUI/Classes/Internal/Extensions/PFUIAlertView.m index e958829..b65b02e 100644 --- a/ParseUI/Classes/Internal/Extensions/PFUIAlertView.m +++ b/ParseUI/Classes/Internal/Extensions/PFUIAlertView.m @@ -39,7 +39,7 @@ + (void)showAlertViewWithTitle:(NSString *)title error:(NSError *)error { + (void)showAlertViewWithTitle:(NSString *)title message:(NSString *)message { [self showAlertViewWithTitle:title message:message - cancelButtonTitle:NSLocalizedString(@"OK", @"OK")]; + cancelButtonTitle:PFLocalizedString(@"OK", @"OK")]; } + (void)showAlertViewWithTitle:(NSString *)title diff --git a/ParseUI/Classes/Internal/PFLocalization.h b/ParseUI/Classes/Internal/PFLocalization.h index 8477d8f..7c0258b 100644 --- a/ParseUI/Classes/Internal/PFLocalization.h +++ b/ParseUI/Classes/Internal/PFLocalization.h @@ -22,8 +22,7 @@ #ifndef ParseUI_PFLocalization_h #define ParseUI_PFLocalization_h -#undef NSLocalizedString -#define NSLocalizedString(key, comment) \ +#define PFLocalizedString(key, comment) \ [[NSBundle bundleForClass:[self class]] localizedStringForKey:key value:nil table:@"ParseUI"] #endif diff --git a/ParseUI/Classes/Internal/Views/PFLoadingView.m b/ParseUI/Classes/Internal/Views/PFLoadingView.m index a9b7688..0e511e3 100644 --- a/ParseUI/Classes/Internal/Views/PFLoadingView.m +++ b/ParseUI/Classes/Internal/Views/PFLoadingView.m @@ -43,7 +43,7 @@ - (instancetype)initWithFrame:(CGRect)frame { [self addSubview:_activityIndicator]; _loadingLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _loadingLabel.text = NSLocalizedString(@"Loading...", @"Loading message of PFQueryTableViewController"); + _loadingLabel.text = PFLocalizedString(@"Loading...", @"Loading message of PFQueryTableViewController"); _loadingLabel.backgroundColor = [UIColor clearColor]; _loadingLabel.shadowOffset = CGSizeMake(0.0f, 1.0f); _loadingLabel.shadowColor = [UIColor whiteColor]; diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.m b/ParseUI/Classes/LogInViewController/PFLogInView.m index 4aed98d..4298a44 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.m +++ b/ParseUI/Classes/LogInViewController/PFLogInView.m @@ -44,7 +44,7 @@ @implementation PFLogInView + (PFActionButtonConfiguration *)_defaultSignUpButtonConfiguration { PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor signupButtonBackgroundColor] image:nil]; - NSString *title = NSLocalizedString(@"Sign Up", @"Sign Up"); + NSString *title = PFLocalizedString(@"Sign Up", @"Sign Up"); [configuration setTitle:title forButtonStyle:PFActionButtonStyleNormal]; [configuration setTitle:title forButtonStyle:PFActionButtonStyleWide]; @@ -55,9 +55,9 @@ + (PFActionButtonConfiguration *)_defaultFacebookButtonConfiguration { PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor facebookButtonBackgroundColor] image:[PFImage imageNamed:PFLogInViewDefaultFacebookButtonImageName]]; - [configuration setTitle:NSLocalizedString(@"Facebook", @"Facebook") + [configuration setTitle:PFLocalizedString(@"Facebook", @"Facebook") forButtonStyle:PFActionButtonStyleNormal]; - [configuration setTitle:NSLocalizedString(@"Log In with Facebook", @"Log In with Facebook") + [configuration setTitle:PFLocalizedString(@"Log In with Facebook", @"Log In with Facebook") forButtonStyle:PFActionButtonStyleWide]; @@ -68,9 +68,9 @@ + (PFActionButtonConfiguration *)_defaultTwitterButtonConfiguration { PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor twitterButtonBackgroundColor] image:[PFImage imageNamed:PFLogInViewDefaultTwitterButtonImageName]]; - [configuration setTitle:NSLocalizedString(@"Twitter", @"Twitter") + [configuration setTitle:PFLocalizedString(@"Twitter", @"Twitter") forButtonStyle:PFActionButtonStyleNormal]; - [configuration setTitle:NSLocalizedString(@"Log In with Twitter", @"Log In with Twitter") + [configuration setTitle:PFLocalizedString(@"Log In with Twitter", @"Log In with Twitter") forButtonStyle:PFActionButtonStyleWide]; @@ -131,7 +131,7 @@ - (void)_updateAllFields { if (!_passwordField) { _passwordField = [[PFTextField alloc] initWithFrame:CGRectZero separatorStyle:PFTextFieldSeparatorStyleBottom]; - _passwordField.placeholder = NSLocalizedString(@"Password", @"Password"); + _passwordField.placeholder = PFLocalizedString(@"Password", @"Password"); _passwordField.secureTextEntry = YES; _passwordField.autocorrectionType = UITextAutocorrectionTypeNo; _passwordField.autocapitalizationType = UITextAutocapitalizationTypeNone; @@ -160,7 +160,7 @@ - (void)_updateAllFields { if (_fields & PFLogInFieldsPasswordForgotten) { if (!_passwordForgottenButton) { _passwordForgottenButton = [[PFTextButton alloc] initWithFrame:CGRectZero]; - [_passwordForgottenButton setTitle:NSLocalizedString(@"Forgot Password?", "Forgot Password?") + [_passwordForgottenButton setTitle:PFLocalizedString(@"Forgot Password?", "Forgot Password?") forState:UIControlStateNormal]; [self addSubview:_passwordForgottenButton]; } @@ -172,7 +172,7 @@ - (void)_updateAllFields { if (_fields & PFLogInFieldsLogInButton) { if (!_logInButton) { _logInButton = [[PFPrimaryButton alloc] initWithBackgroundImageColor:[PFColor loginButtonBackgroundColor]]; - [_logInButton setTitle:NSLocalizedString(@"Log In", @"Log In") forState:UIControlStateNormal]; + [_logInButton setTitle:PFLocalizedString(@"Log In", @"Log In") forState:UIControlStateNormal]; [self addSubview:_logInButton]; } } else { @@ -475,10 +475,10 @@ - (void)_updateUsernameFieldStyle { NSString *usernamePlaceholder = nil; if (!_emailAsUsername) { keyboardType = UIKeyboardTypeDefault; - usernamePlaceholder = NSLocalizedString(@"Username", @"Username"); + usernamePlaceholder = PFLocalizedString(@"Username", @"Username"); } else { keyboardType = UIKeyboardTypeEmailAddress; - usernamePlaceholder = NSLocalizedString(@"Email", @"Email"); + usernamePlaceholder = PFLocalizedString(@"Email", @"Email"); } _usernameField.placeholder = usernamePlaceholder; diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.m b/ParseUI/Classes/LogInViewController/PFLogInViewController.m index a6dceae..58035c9 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.m +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.m @@ -289,18 +289,18 @@ - (void)_dismissAction { } - (void)_forgotPasswordAction PF_EXTENSION_UNAVAILABLE("") { - NSString *title = NSLocalizedString(@"Reset Password", @"Forgot password request title in PFLogInViewController"); - NSString *message = NSLocalizedString(@"Please enter the email address for your account.", + NSString *title = PFLocalizedString(@"Reset Password", @"Forgot password request title in PFLogInViewController"); + NSString *message = PFLocalizedString(@"Please enter the email address for your account.", @"Email request message in PFLogInViewController"); UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:self - cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel") - otherButtonTitles:NSLocalizedString(@"OK", @"OK"), nil]; + cancelButtonTitle:PFLocalizedString(@"Cancel", @"Cancel") + otherButtonTitles:PFLocalizedString(@"OK", @"OK"), nil]; alertView.alertViewStyle = UIAlertViewStylePlainTextInput; UITextField *textField = [alertView textFieldAtIndex:0]; - textField.placeholder = NSLocalizedString(@"Email", @"Email"); + textField.placeholder = PFLocalizedString(@"Email", @"Email"); textField.keyboardType = UIKeyboardTypeEmailAddress; textField.returnKeyType = UIReturnKeyDone; @@ -310,15 +310,15 @@ - (void)_forgotPasswordAction PF_EXTENSION_UNAVAILABLE("") { - (void)_requestPasswordResetWithEmail:(NSString *)email { [PFUser requestPasswordResetForEmailInBackground:email block:^(BOOL success, NSError *error) { if (success) { - NSString *title = NSLocalizedString(@"Password Reset", + NSString *title = PFLocalizedString(@"Password Reset", @"Password reset success alert title in PFLogInViewController."); - NSString *message = [NSString stringWithFormat:NSLocalizedString(@"An email with reset instructions has been sent to '%@'.", + NSString *message = [NSString stringWithFormat:PFLocalizedString(@"An email with reset instructions has been sent to '%@'.", @"Password reset message in PFLogInViewController"), email]; [PFUIAlertView showAlertViewWithTitle:title message:message - cancelButtonTitle:NSLocalizedString(@"OK", @"OK")]; + cancelButtonTitle:PFLocalizedString(@"OK", @"OK")]; } else { - NSString *title = NSLocalizedString(@"Password Reset Failed", + NSString *title = PFLocalizedString(@"Password Reset Failed", @"Password reset error alert title in PFLogInViewController."); [PFUIAlertView showAlertViewWithTitle:title error:error]; } @@ -471,12 +471,12 @@ - (void)_loginDidFailWithError:(NSError *)error { if (_delegateExistingMethods.didFailToLogIn) { [_delegate logInViewController:self didFailToLogInWithError:error]; } else { - NSString *title = NSLocalizedString(@"Login Failed", @"Login failed alert title in PFLogInViewController"); + NSString *title = PFLocalizedString(@"Login Failed", @"Login failed alert title in PFLogInViewController"); NSString *message = nil; if (error.code == kPFErrorObjectNotFound) { - message = NSLocalizedString(@"The username and password you entered don't match", @"Invalid login credentials alert message in PFLogInViewController"); + message = PFLocalizedString(@"The username and password you entered don't match", @"Invalid login credentials alert message in PFLogInViewController"); } else { - message = NSLocalizedString(@"Please try again", @"Generic login failed alert message in PFLogInViewController"); + message = PFLocalizedString(@"Please try again", @"Generic login failed alert message in PFLogInViewController"); } [PFUIAlertView showAlertViewWithTitle:title message:message]; } diff --git a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.m b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.m index 34da3ca..6b9b37a 100644 --- a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.m +++ b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.m @@ -94,7 +94,7 @@ - (void)objectsDidLoad:(NSError *)error { } else { cell.state = PFPurchaseTableViewCellStateNormal; - NSString *title = NSLocalizedString(@"Download Error", + NSString *title = PFLocalizedString(@"Download Error", @"Download Error"); [PFUIAlertView showAlertViewWithTitle:title error:downloadError]; } @@ -174,7 +174,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath PFProduct *product = self.objects[indexPath.row]; [PFPurchase buyProduct:product.productIdentifier block:^(NSError *error) { if (error) { - NSString *title = NSLocalizedString(@"Purchase Error", @"Purchase Error"); + NSString *title = PFLocalizedString(@"Purchase Error", @"Purchase Error"); [PFUIAlertView showAlertViewWithTitle:title error:error]; } }]; diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m index af1a52a..2ca9442 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m @@ -330,7 +330,7 @@ - (UICollectionReusableView *)collectionViewReusableViewForNextPageAction:(UICol _currentNextPageView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:PFQueryCollectionViewNextPageReusableViewIdentifier forIndexPath:[self _indexPathForPaginationReusableView]]; - _currentNextPageView.textLabel.text = NSLocalizedString(@"Load more...", @"Load more..."); + _currentNextPageView.textLabel.text = PFLocalizedString(@"Load more...", @"Load more..."); [_currentNextPageView addTarget:self action:@selector(loadNextPage) forControlEvents:UIControlEventTouchUpInside]; _currentNextPageView.animating = self.loading; return _currentNextPageView; @@ -389,15 +389,15 @@ - (void)_handleDeletionError:(NSError *)error { [self loadObjects]; NSString *errorMessage = [NSString stringWithFormat:@"%@: \"%@\"", - NSLocalizedString(@"Error occurred during deletion", @"Error occurred during deletion"), + PFLocalizedString(@"Error occurred during deletion", @"Error occurred during deletion"), error.localizedDescription]; if ([UIAlertController class]) { - UIAlertController *errorController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Error", @"Error") + UIAlertController *errorController = [UIAlertController alertControllerWithTitle:PFLocalizedString(@"Error", @"Error") message:errorMessage preferredStyle:UIAlertControllerStyleAlert]; - [errorController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", @"OK") + [errorController addAction:[UIAlertAction actionWithTitle:PFLocalizedString(@"OK", @"OK") style:UIAlertActionStyleCancel handler:nil]]; @@ -405,10 +405,10 @@ - (void)_handleDeletionError:(NSError *)error { } else { // Cast to `id` is required for building succesfully for app extensions, // this code actually never runs in App Extensions, since they are iOS 8.0+, so we are good with just a hack - UIAlertView *alertView = [(id)[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"Error") + UIAlertView *alertView = [(id)[UIAlertView alloc] initWithTitle:PFLocalizedString(@"Error", @"Error") message:errorMessage delegate:nil - cancelButtonTitle:NSLocalizedString(@"OK", @"OK") + cancelButtonTitle:PFLocalizedString(@"OK", @"OK") otherButtonTitles:nil]; [alertView show]; diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m index f9fad49..ee17366 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m @@ -408,7 +408,7 @@ - (PFTableViewCell *)tableView:(UITableView *)otherTableView cellForNextPageAtIn if (cell == nil) { cell = [[PFActivityIndicatorTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; - cell.textLabel.text = NSLocalizedString(@"Load more...", @"Load more..."); + cell.textLabel.text = PFLocalizedString(@"Load more...", @"Load more..."); } cell.animating = self.loading; @@ -517,15 +517,15 @@ - (void)_handleDeletionError:(NSError *)error { [self loadObjects]; NSString *errorMessage = [NSString stringWithFormat:@"%@: \"%@\"", - NSLocalizedString(@"Error occurred during deletion", @"Error occurred during deletion"), + PFLocalizedString(@"Error occurred during deletion", @"Error occurred during deletion"), error.localizedDescription]; if ([UIAlertController class]) { - UIAlertController *errorController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Error", @"Error") + UIAlertController *errorController = [UIAlertController alertControllerWithTitle:PFLocalizedString(@"Error", @"Error") message:errorMessage preferredStyle:UIAlertControllerStyleAlert]; - [errorController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", @"OK") + [errorController addAction:[UIAlertAction actionWithTitle:PFLocalizedString(@"OK", @"OK") style:UIAlertActionStyleCancel handler:nil]]; @@ -533,10 +533,10 @@ - (void)_handleDeletionError:(NSError *)error { } else { // Cast to `id` is required for building succesfully for app extensions, // this code actually never runs in App Extensions, since they are iOS 8.0+, so we are good with just a hack - UIAlertView *alertView = [(id)[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"Error") + UIAlertView *alertView = [(id)[UIAlertView alloc] initWithTitle:PFLocalizedString(@"Error", @"Error") message:errorMessage delegate:nil - cancelButtonTitle:NSLocalizedString(@"OK", @"OK") + cancelButtonTitle:PFLocalizedString(@"OK", @"OK") otherButtonTitles:nil]; [alertView show]; diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpView.m b/ParseUI/Classes/SignUpViewController/PFSignUpView.m index b171404..c3f8c8e 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpView.m +++ b/ParseUI/Classes/SignUpViewController/PFSignUpView.m @@ -66,7 +66,7 @@ - (instancetype)initWithFields:(PFSignUpFields)otherFields { _passwordField = [[PFTextField alloc] initWithFrame:CGRectZero separatorStyle:PFTextFieldSeparatorStyleBottom]; - _passwordField.placeholder = NSLocalizedString(@"Password", @"Password"); + _passwordField.placeholder = PFLocalizedString(@"Password", @"Password"); _passwordField.secureTextEntry = YES; _passwordField.autocorrectionType = UITextAutocorrectionTypeNo; _passwordField.autocapitalizationType = UITextAutocapitalizationTypeNone; @@ -83,7 +83,7 @@ - (instancetype)initWithFields:(PFSignUpFields)otherFields { _emailField.autocorrectionType = UITextAutocorrectionTypeNo; _emailField.autocapitalizationType = UITextAutocapitalizationTypeNone; _emailField.keyboardType = UIKeyboardTypeEmailAddress; - _emailField.placeholder = NSLocalizedString(@"Email", @"Email"); + _emailField.placeholder = PFLocalizedString(@"Email", @"Email"); if (!(_fields & PFSignUpFieldsAdditional)) { _emailField.returnKeyType = UIReturnKeyDone; } else { @@ -97,14 +97,14 @@ - (instancetype)initWithFields:(PFSignUpFields)otherFields { separatorStyle:PFTextFieldSeparatorStyleBottom]; _additionalField.autocorrectionType = UITextAutocorrectionTypeNo; _additionalField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _additionalField.placeholder = NSLocalizedString(@"Additional", @"Additional"); + _additionalField.placeholder = PFLocalizedString(@"Additional", @"Additional"); _additionalField.returnKeyType = UIReturnKeyDone; [self addSubview:_additionalField]; } if (_fields & PFSignUpFieldsSignUpButton) { _signUpButton = [[PFPrimaryButton alloc] initWithBackgroundImageColor:[PFColor signupButtonBackgroundColor]]; - [_signUpButton setTitle:NSLocalizedString(@"Sign Up", @"Sign Up") forState:UIControlStateNormal]; + [_signUpButton setTitle:PFLocalizedString(@"Sign Up", @"Sign Up") forState:UIControlStateNormal]; [self addSubview:_signUpButton]; } @@ -305,10 +305,10 @@ - (void)_updateUsernameFieldStyle { UIKeyboardType keyboardType = UIKeyboardTypeDefault; NSString *placeholder = nil; if (!_emailAsUsername) { - placeholder = NSLocalizedString(@"Username", @"Username"); + placeholder = PFLocalizedString(@"Username", @"Username"); keyboardType = UIKeyboardTypeDefault; } else { - placeholder = NSLocalizedString(@"Email", @"Email"); + placeholder = PFLocalizedString(@"Email", @"Email"); keyboardType = UIKeyboardTypeEmailAddress; } diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m index 257b5fb..053583a 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m @@ -269,7 +269,7 @@ - (void)_signUpAction { } if ([password length] < _minPasswordLength) { - NSString *errorMessage = NSLocalizedString(@"Password must be at least %d characters.", + NSString *errorMessage = PFLocalizedString(@"Password must be at least %d characters.", @"Password too short error message in PFSignUpViewController"); errorMessage = [NSString stringWithFormat:errorMessage, (unsigned long)_minPasswordLength]; NSError *error = [NSError errorWithDomain:PFParseErrorDomain @@ -324,7 +324,7 @@ - (void)_signUpDidFailWithError:(NSError *)error { } [[NSNotificationCenter defaultCenter] postNotificationName:PFSignUpFailureNotification object:self]; - NSString *title = NSLocalizedString(@"Sign Up Error", @"Sign Up Error"); + NSString *title = PFLocalizedString(@"Sign Up Error", @"Sign Up Error"); if ([[error domain] isEqualToString:PFParseErrorDomain]) { NSInteger errorCode = [error code]; @@ -332,31 +332,31 @@ - (void)_signUpDidFailWithError:(NSError *)error { UIResponder *responder = nil; if (errorCode == kPFErrorInvalidEmailAddress) { - message = NSLocalizedString(@"The email address is invalid. Please enter a valid email.", + message = PFLocalizedString(@"The email address is invalid. Please enter a valid email.", @"Invalid email address error message in PFSignUpViewControllers"); responder = _signUpView.emailField ?: _signUpView.usernameField; } else if (errorCode == kPFErrorUsernameMissing) { - message = NSLocalizedString(@"Please enter a username.", + message = PFLocalizedString(@"Please enter a username.", @"Username missing error message in PFSignUpViewController"); responder = _signUpView.usernameField; } else if (errorCode == kPFErrorUserPasswordMissing) { - message = NSLocalizedString(@"Please enter a password.", + message = PFLocalizedString(@"Please enter a password.", @"Password missing error message in PFSignUpViewController"); responder = _signUpView.passwordField; } else if (errorCode == kPFErrorUsernameTaken) { - NSString *format = NSLocalizedString(@"The username '%@' is taken. Please try choosing a different username.", + NSString *format = PFLocalizedString(@"The username '%@' is taken. Please try choosing a different username.", @"Username taken error format in PFSignUpViewController"); message = [NSString stringWithFormat:format, _signUpView.usernameField.text]; responder = _signUpView.usernameField; } else if (error.code == kPFErrorUserEmailTaken) { - NSString *format = NSLocalizedString(@"The email '%@' is taken. Please try using a different email.", + NSString *format = PFLocalizedString(@"The email '%@' is taken. Please try using a different email.", @"Email is taken error format in PFSignUpViewController."); UITextField *textField = self.emailAsUsername ? _signUpView.usernameField : _signUpView.emailField; message = [NSString stringWithFormat:format, textField.text]; responder = textField; } else if (error.code == kPFErrorUserEmailMissing) { - message = NSLocalizedString(@"Please enter an email.", + message = PFLocalizedString(@"Please enter an email.", @"Email missing error message in PFSignUpViewController"); responder = _signUpView.emailField; } From e0fd6532591b84c678fb342b471239351bdce051 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Wed, 4 Nov 2015 16:12:50 +0200 Subject: [PATCH 24/63] Replace nullability macros with generic annotations. --- ParseUI/Classes/Cells/PFCollectionViewCell.h | 6 ++-- .../Classes/Cells/PFPurchaseTableViewCell.h | 8 ++--- ParseUI/Classes/Cells/PFTableViewCell.h | 6 ++-- .../Classes/LogInViewController/PFLogInView.h | 28 +++++++-------- .../PFLogInViewController.h | 14 ++++---- .../PFProductTableViewController.h | 4 +-- .../PFQueryCollectionViewController.h | 24 ++++++------- .../PFQueryTableViewController.h | 36 +++++++++---------- .../SignUpViewController/PFSignUpView.h | 20 +++++------ .../PFSignUpViewController.h | 10 +++--- ParseUI/Classes/Views/PFImageView.h | 14 ++++---- ParseUI/Classes/Views/PFTextField.h | 6 ++-- ParseUI/Other/ParseUIConstants.h | 32 ----------------- 13 files changed, 88 insertions(+), 120 deletions(-) diff --git a/ParseUI/Classes/Cells/PFCollectionViewCell.h b/ParseUI/Classes/Cells/PFCollectionViewCell.h index 71b3642..13d7570 100644 --- a/ParseUI/Classes/Cells/PFCollectionViewCell.h +++ b/ParseUI/Classes/Cells/PFCollectionViewCell.h @@ -23,7 +23,7 @@ #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN @class PFImageView; @class PFObject; @@ -54,8 +54,8 @@ PFUI_ASSUME_NONNULL_BEGIN @param object An instance of `PFObject` to update from. */ -- (void)updateFromObject:(PFUI_NULLABLE PFObject *)object; +- (void)updateFromObject:(nullable PFObject *)object; @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h b/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h index eb80487..f954dda 100644 --- a/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h +++ b/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h @@ -24,7 +24,7 @@ #import #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN /*! An enum that represents states of the PFPurchaseTableViewCell. @@ -56,13 +56,13 @@ typedef NS_ENUM(uint8_t, PFPurchaseTableViewCellState) { /*! @abstract Label where price of the product is displayed. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UILabel *priceLabel; +@property (nullable, nonatomic, strong, readonly) UILabel *priceLabel; /*! @abstract Progress view that is shown, when the product is downloading. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UIProgressView *progressView; +@property (nullable, nonatomic, strong, readonly) UIProgressView *progressView; @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/Cells/PFTableViewCell.h b/ParseUI/Classes/Cells/PFTableViewCell.h index 9238d99..173df06 100644 --- a/ParseUI/Classes/Cells/PFTableViewCell.h +++ b/ParseUI/Classes/Cells/PFTableViewCell.h @@ -24,7 +24,7 @@ #import #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN /*! The `PFTableViewCell` class represents a table view cell which can download and display remote images stored on Parse. @@ -39,8 +39,8 @@ PFUI_ASSUME_NONNULL_BEGIN @see PFImageView */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) PFImageView *imageView; +@property (nullable, nonatomic, strong, readonly) PFImageView *imageView; @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.h b/ParseUI/Classes/LogInViewController/PFLogInView.h index ee71b02..6f8feec 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.h +++ b/ParseUI/Classes/LogInViewController/PFLogInView.h @@ -23,7 +23,7 @@ #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN /*! `PFLogInFields` bitmask specifies the log in elements which are enabled in the view. @@ -84,14 +84,14 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { @discussion Used to lay out elements correctly when the presenting view controller has translucent elements. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, weak) UIViewController *presentingViewController; +@property (nullable, nonatomic, weak) UIViewController *presentingViewController; ///-------------------------------------- /// @name Customizing the Logo ///-------------------------------------- /// The logo. By default, it is the Parse logo. -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong) UIView *logo; +@property (nullable, nonatomic, strong) UIView *logo; ///-------------------------------------- /// @name Configure Username Behaviour @@ -116,57 +116,57 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { /*! @abstract The username text field. It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) PFTextField *usernameField; +@property (nullable, nonatomic, strong, readonly) PFTextField *usernameField; /*! @abstract The password text field. It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) PFTextField *passwordField; +@property (nullable, nonatomic, strong, readonly) PFTextField *passwordField; /*! @abstract The password forgotten button. It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UIButton *passwordForgottenButton; +@property (nullable, nonatomic, strong, readonly) UIButton *passwordForgottenButton; /*! @abstract The log in button. It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UIButton *logInButton; +@property (nullable, nonatomic, strong, readonly) UIButton *logInButton; /*! @abstract The Facebook button. It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UIButton *facebookButton; +@property (nullable, nonatomic, strong, readonly) UIButton *facebookButton; /*! @abstract The Twitter button. It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UIButton *twitterButton; +@property (nullable, nonatomic, strong, readonly) UIButton *twitterButton; /*! @abstract The sign up button. It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UIButton *signUpButton; +@property (nullable, nonatomic, strong, readonly) UIButton *signUpButton; /*! @abstract It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UIButton *dismissButton; +@property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; /*! @abstract The facebook/twitter login label. @deprecated This property is deprecated and will always be nil. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UILabel *externalLogInLabel __attribute__(PARSE_UI_DEPRECATED("This property is deprecated and will always be nil.")); +@property (nullable, nonatomic, strong, readonly) UILabel *externalLogInLabel __attribute__(PARSE_UI_DEPRECATED("This property is deprecated and will always be nil.")); /*! @abstract The sign up label. @deprecated This property is deprecated and will always be nil. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UILabel *signUpLabel __attribute__(PARSE_UI_DEPRECATED("This property is deprecated and will always be nil.")); +@property (nullable, nonatomic, strong, readonly) UILabel *signUpLabel __attribute__(PARSE_UI_DEPRECATED("This property is deprecated and will always be nil.")); @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.h b/ParseUI/Classes/LogInViewController/PFLogInViewController.h index 9df9112..e21a737 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.h +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.h @@ -24,7 +24,7 @@ #import #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN @class PFSignUpViewController; @class PFUser; @@ -52,7 +52,7 @@ PFUI_ASSUME_NONNULL_BEGIN @see PFLogInView */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) PFLogInView *logInView; +@property (nullable, nonatomic, strong, readonly) PFLogInView *logInView; ///-------------------------------------- /// @name Configuring Log In Behaviors @@ -63,14 +63,14 @@ PFUI_ASSUME_NONNULL_BEGIN @see PFLogInViewControllerDelegate */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, weak) id delegate; +@property (nullable, nonatomic, weak) id delegate; /*! @abstract The facebook permissions that Facebook log in requests for. @discussion If unspecified, the default is basic facebook permissions. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, copy) NSArray *facebookPermissions; +@property (nullable, nonatomic, copy) NSArray *facebookPermissions; /*! @abstract The sign up controller if sign up is enabled. @@ -78,7 +78,7 @@ PFUI_ASSUME_NONNULL_BEGIN @discussion Use this to configure the sign up view, and the transition animation to the sign up view. The default is a sign up view with a username, a password, a dismiss button and a sign up button. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong) PFSignUpViewController *signUpController; +@property (nullable, nonatomic, strong) PFSignUpViewController *signUpController; /*! @abstract Whether to prompt for the email as username on the login view. @@ -162,7 +162,7 @@ shouldBeginLogInWithUsername:(NSString *)username @param error `NSError` object representing the error that occured. */ - (void)logInViewController:(PFLogInViewController *)logInController - didFailToLogInWithError:(PFUI_NULLABLE NSError *)error; + didFailToLogInWithError:(nullable NSError *)error; /*! @abstract Sent to the delegate when the log in screen is cancelled. @@ -173,4 +173,4 @@ shouldBeginLogInWithUsername:(NSString *)username @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h index fa5ce55..0cc9654 100644 --- a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h +++ b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h @@ -24,7 +24,7 @@ #import #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN /*! `PFProductTableViewController` displays in-app purchase products stored on Parse. @@ -44,4 +44,4 @@ PFUI_ASSUME_NONNULL_BEGIN @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h index 8d34273..b8b7ce9 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h @@ -23,7 +23,7 @@ #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN @class BFTask; @class PFCollectionViewCell; @@ -50,7 +50,7 @@ PFUI_ASSUME_NONNULL_BEGIN /*! @abstract The class name of the this collection will use as a datasource. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, copy) IBInspectable NSString *parseClassName; +@property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; /*! @abstract Whether the collection should use the default loading view. Default - `YES`. @@ -89,7 +89,7 @@ PFUI_ASSUME_NONNULL_BEGIN @returns An initialized `PFQueryCollectionViewController` object or `nil` if the object couldn't be created. */ -- (instancetype)initWithClassName:(PFUI_NULLABLE NSString *)className; +- (instancetype)initWithClassName:(nullable NSString *)className; /*! @abstract Initializes a view controller with a class name of that will be associated with this collection. @@ -100,7 +100,7 @@ PFUI_ASSUME_NONNULL_BEGIN @returns An initialized `PFQueryCollectionViewController` object or `nil` if the object couldn't be created. */ - (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout - className:(PFUI_NULLABLE NSString *)className NS_DESIGNATED_INITIALIZER; + className:(nullable NSString *)className NS_DESIGNATED_INITIALIZER; ///-------------------------------------- /// @name Responding to Events @@ -117,7 +117,7 @@ PFUI_ASSUME_NONNULL_BEGIN call [super objectsDidLoad:] in your implementation. @param error The Parse error from running the PFQuery, if there was any. */ -- (void)objectsDidLoad:(PFUI_NULLABLE NSError *)error NS_REQUIRES_SUPER; +- (void)objectsDidLoad:(nullable NSError *)error NS_REQUIRES_SUPER; ///-------------------------------------- /// @name Accessing Results @@ -138,17 +138,17 @@ PFUI_ASSUME_NONNULL_BEGIN @returns The object at the specified indexPath. */ -- (PFUI_NULLABLE PFObject *)objectAtIndexPath:(PFUI_NULLABLE NSIndexPath *)indexPath; +- (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; /*! @abstract Removes an object at the specified index path, animated. */ -- (void)removeObjectAtIndexPath:(PFUI_NULLABLE NSIndexPath *)indexPath; +- (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath; /*! @abstract Removes all objects at the specified index paths, animated. */ -- (void)removeObjectsAtIndexPaths:(PFUI_NULLABLE NSArray *)indexes; +- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; ///-------------------------------------- /// @name Loading Data @@ -208,9 +208,9 @@ PFUI_ASSUME_NONNULL_BEGIN @returns The cell that represents this object. */ -- (PFUI_NULLABLE PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView +- (nullable PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFUI_NULLABLE PFObject *)object; + object:(nullable PFObject *)object; /*! @discussion Override this method to customize the view that allows the user to load the @@ -220,8 +220,8 @@ PFUI_ASSUME_NONNULL_BEGIN @returns The view that allows the user to paginate. */ -- (PFUI_NULLABLE UICollectionReusableView *)collectionViewReusableViewForNextPageAction:(UICollectionView *)collectionView; +- (nullable UICollectionReusableView *)collectionViewReusableViewForNextPageAction:(UICollectionView *)collectionView; @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h index 4eb1d8b..8bb56a3 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h @@ -23,7 +23,7 @@ #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN @class BFTask; @class PFObject; @@ -58,7 +58,7 @@ PFUI_ASSUME_NONNULL_BEGIN @returns An initialized `PFQueryTableViewController` object or `nil` if the object couldn't be created. */ - (instancetype)initWithStyle:(UITableViewStyle)style - className:(PFUI_NULLABLE NSString *)className NS_DESIGNATED_INITIALIZER; + className:(nullable NSString *)className NS_DESIGNATED_INITIALIZER; /*! @abstract Initializes with a class name of the PFObjects that will be associated with this table. @@ -67,7 +67,7 @@ PFUI_ASSUME_NONNULL_BEGIN @returns An initialized `PFQueryTableViewController` object or `nil` if the object couldn't be created. */ -- (instancetype)initWithClassName:(PFUI_NULLABLE NSString *)className; +- (instancetype)initWithClassName:(nullable NSString *)className; ///-------------------------------------- /// @name Configuring Behavior @@ -76,28 +76,28 @@ PFUI_ASSUME_NONNULL_BEGIN /*! @abstract The class name of the this table will use as a datasource. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, copy) IBInspectable NSString *parseClassName; +@property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; /*! @abstract The key to use to display for the cell text label. @discussion This won't apply if you override */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, copy) IBInspectable NSString *textKey; +@property (nullable, nonatomic, copy) IBInspectable NSString *textKey; /*! @abstract The key to use to display for the cell image view. @discussion This won't apply if you override */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, copy) IBInspectable NSString *imageKey; +@property (nullable, nonatomic, copy) IBInspectable NSString *imageKey; /*! @abstract The image to use as a placeholder for the cell images. @discussion This won't apply if you override */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong) IBInspectable UIImage *placeholderImage; +@property (nullable, nonatomic, strong) IBInspectable UIImage *placeholderImage; /*! @abstract Whether the table should use the default loading view. Default - `YES`. @@ -139,7 +139,7 @@ PFUI_ASSUME_NONNULL_BEGIN call [super objectsDidLoad:] in your implementation. @param error The Parse error from running the PFQuery, if there was any. */ -- (void)objectsDidLoad:(PFUI_NULLABLE NSError *)error; +- (void)objectsDidLoad:(nullable NSError *)error; ///-------------------------------------- /// @name Accessing Results @@ -148,7 +148,7 @@ PFUI_ASSUME_NONNULL_BEGIN /*! @abstract The array of instances of that is used as a data source. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, copy, readonly) NSArray *objects; +@property (nullable, nonatomic, copy, readonly) NSArray *objects; /*! @abstract Returns an object at a particular indexPath. @@ -160,27 +160,27 @@ PFUI_ASSUME_NONNULL_BEGIN @returns The object at the specified index */ -- (PFUI_NULLABLE PFObject *)objectAtIndexPath:(PFUI_NULLABLE NSIndexPath *)indexPath; +- (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; /*! @abstract Removes an object at the specified index path, animated. */ -- (void)removeObjectAtIndexPath:(PFUI_NULLABLE NSIndexPath *)indexPath; +- (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath; /*! @abstract Removes an object at the specified index path, with or without animation. */ -- (void)removeObjectAtIndexPath:(PFUI_NULLABLE NSIndexPath *)indexPath animated:(BOOL)animated; +- (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated; /*! @abstract Removes all objects at the specified index paths, animated. */ -- (void)removeObjectsAtIndexPaths:(PFUI_NULLABLE NSArray *)indexes; +- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; /*! @abstract Removes all objects at the specified index paths, with or without animation. */ -- (void)removeObjectsAtIndexPaths:(PFUI_NULLABLE NSArray *)indexes animated:(BOOL)animated; +- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes animated:(BOOL)animated; /*! @abstract Clears the table of all objects. @@ -238,9 +238,9 @@ PFUI_ASSUME_NONNULL_BEGIN @returns The cell that represents this object. */ -- (PFUI_NULLABLE PFTableViewCell *)tableView:(UITableView *)tableView +- (nullable PFTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFUI_NULLABLE PFObject *)object; + object:(nullable PFObject *)object; /*! @discussion Override this method to customize the cell that allows the user to load the @@ -251,9 +251,9 @@ PFUI_ASSUME_NONNULL_BEGIN @returns The cell that allows the user to paginate. */ -- (PFUI_NULLABLE PFTableViewCell *)tableView:(UITableView *)tableView +- (nullable PFTableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath; @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpView.h b/ParseUI/Classes/SignUpViewController/PFSignUpView.h index d6a8795..db9d641 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpView.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpView.h @@ -23,7 +23,7 @@ #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN /*! `PFSignUpFields` bitmask specifies the sign up elements which are enabled in the view. @@ -76,7 +76,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { @discussion Used to lay out elements correctly when the presenting view controller has translucent elements. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, weak) UIViewController *presentingViewController; +@property (nullable, nonatomic, weak) UIViewController *presentingViewController; ///-------------------------------------- /// @name Customizing the Logo @@ -85,7 +85,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { /*! @abstract The logo. By default, it is the Parse logo. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong) UIView *logo; +@property (nullable, nonatomic, strong) UIView *logo; ///-------------------------------------- /// @name Configure Username Behaviour @@ -110,35 +110,35 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { /*! @abstract The username text field. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) PFTextField *usernameField; +@property (nullable, nonatomic, strong, readonly) PFTextField *usernameField; /*! @abstract The password text field. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) PFTextField *passwordField; +@property (nullable, nonatomic, strong, readonly) PFTextField *passwordField; /*! @abstract The email text field. It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) PFTextField *emailField; +@property (nullable, nonatomic, strong, readonly) PFTextField *emailField; /*! @abstract The additional text field. It is `nil` if the element is not enabled. @discussion This field is intended to be customized. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) PFTextField *additionalField; +@property (nullable, nonatomic, strong, readonly) PFTextField *additionalField; /*! @abstract The sign up button. It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UIButton *signUpButton; +@property (nullable, nonatomic, strong, readonly) UIButton *signUpButton; /*! @abstract The dismiss button. It is `nil` if the element is not enabled. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) UIButton *dismissButton; +@property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h index 88b2332..5e13f4c 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h @@ -27,7 +27,7 @@ @class PFUser; @protocol PFSignUpViewControllerDelegate; -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN /*! The `PFSignUpViewController` class that presents and manages @@ -51,7 +51,7 @@ PFUI_ASSUME_NONNULL_BEGIN @see PFSignUpView */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong, readonly) PFSignUpView *signUpView; +@property (nullable, nonatomic, strong, readonly) PFSignUpView *signUpView; ///-------------------------------------- /// @name Configuring Sign Up Behaviors @@ -62,7 +62,7 @@ PFUI_ASSUME_NONNULL_BEGIN @see PFSignUpViewControllerDelegate */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, weak) id delegate; +@property (nullable, nonatomic, weak) id delegate; /*! @abstract Minimum required password length for user signups, defaults to `0`. @@ -146,7 +146,7 @@ extern NSString *const PFSignUpCancelNotification; @param error `NSError` object representing the error that occured. */ - (void)signUpViewController:(PFSignUpViewController *)signUpController - didFailToSignUpWithError:(PFUI_NULLABLE NSError *)error; + didFailToSignUpWithError:(nullable NSError *)error; /*! @abstract Sent to the delegate when the sign up screen is cancelled. @@ -157,4 +157,4 @@ extern NSString *const PFSignUpCancelNotification; @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/Views/PFImageView.h b/ParseUI/Classes/Views/PFImageView.h index 368b3d6..67c5909 100644 --- a/ParseUI/Classes/Views/PFImageView.h +++ b/ParseUI/Classes/Views/PFImageView.h @@ -23,9 +23,9 @@ #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN -typedef void(^PFImageViewImageResultBlock)(UIImage *PFUI_NULLABLE_S image, NSError *PFUI_NULLABLE_S error); +typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError *__nullable error); @class BFTask; @class PFFile; @@ -40,7 +40,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *PFUI_NULLABLE_S image, NSEr @warning Note that the download does not start until is called. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong) PFFile *file; +@property (nullable, nonatomic, strong) PFFile *file; /*! @abstract Initiate downloading of the remote image. @@ -58,7 +58,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *PFUI_NULLABLE_S image, NSEr @param completion the completion block. */ -- (void)loadInBackground:(PFUI_NULLABLE PFImageViewImageResultBlock)completion; +- (void)loadInBackground:(nullable PFImageViewImageResultBlock)completion; /*! @abstract Initiate downloading of the remote image. @@ -69,9 +69,9 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *PFUI_NULLABLE_S image, NSEr @param progressBlock called with the download progress as the image is being downloaded. Will be called with a value of 100 before the completion block is called. */ -- (void)loadInBackground:(PFUI_NULLABLE PFImageViewImageResultBlock)completion - progressBlock:(PFUI_NULLABLE void (^)(int percentDone))progressBlock; +- (void)loadInBackground:(nullable PFImageViewImageResultBlock)completion + progressBlock:(nullable void (^)(int percentDone))progressBlock; @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/Views/PFTextField.h b/ParseUI/Classes/Views/PFTextField.h index 5bfb168..c50781e 100644 --- a/ParseUI/Classes/Views/PFTextField.h +++ b/ParseUI/Classes/Views/PFTextField.h @@ -23,7 +23,7 @@ #import -PFUI_ASSUME_NONNULL_BEGIN +NS_ASSUME_NONNULL_BEGIN /*! `PFTextFieldSeparatorStyle` bitmask specifies the style of the separators, @@ -60,7 +60,7 @@ typedef NS_OPTIONS(uint8_t, PFTextFieldSeparatorStyle){ @discussion Default: `227,227,227,1.0`. */ -@property (PFUI_NULLABLE_PROPERTY nonatomic, strong) UIColor *separatorColor UI_APPEARANCE_SELECTOR; +@property (nullable, nonatomic, strong) UIColor *separatorColor UI_APPEARANCE_SELECTOR; /*! This method is a convenience initializer that sets both `frame` and `separatorStyle` for an instance of `PFTextField.` @@ -74,4 +74,4 @@ typedef NS_OPTIONS(uint8_t, PFTextFieldSeparatorStyle){ @end -PFUI_ASSUME_NONNULL_END +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Other/ParseUIConstants.h b/ParseUI/Other/ParseUIConstants.h index 19cfa1d..edd970a 100644 --- a/ParseUI/Other/ParseUIConstants.h +++ b/ParseUI/Other/ParseUIConstants.h @@ -41,36 +41,4 @@ # endif #endif -///-------------------------------------- -/// @name Nullability Support -///-------------------------------------- - -#if __has_feature(nullability) -# define PFUI_NULLABLE nullable -# define PFUI_NULLABLE_S __nullable -# define PFUI_NULL_UNSPECIFIED null_unspecified -# define PFUI_NULLABLE_PROPERTY nullable, -#else -# define PFUI_NULLABLE -# define PFUI_NULLABLE_S -# define PFUI_NULL_UNSPECIFIED -# define PFUI_NULLABLE_PROPERTY -#endif - -#if __has_feature(assume_nonnull) -# ifdef NS_ASSUME_NONNULL_BEGIN -# define PFUI_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN -# else -# define PFUI_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin") -# endif -# ifdef NS_ASSUME_NONNULL_END -# define PFUI_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END -# else -# define PFUI_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end") -# endif -#else -# define PFUI_ASSUME_NONNULL_BEGIN -# define PFUI_ASSUME_NONNULL_END -#endif - #endif From 3090a2552ef9cbe8fa59806e57e4b6defc5eab47 Mon Sep 17 00:00:00 2001 From: Hugues Bernet-Rollande Date: Wed, 4 Nov 2015 15:14:24 +0100 Subject: [PATCH 25/63] Add french localization --- .../Localization/fr.lproj/ParseUI.strings | Bin 0 -> 7026 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ParseUI/Resources/Localization/fr.lproj/ParseUI.strings diff --git a/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings b/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings new file mode 100644 index 0000000000000000000000000000000000000000..5e1918b67b619f87510915d1c547f0a39b02522d GIT binary patch literal 7026 zcmd6r>26y^7>4I}ui_|D6{%9w3qYtuS*nO^kOY1^j_bI13AWP^?vT6SC*dN1_nFVr zSgY?bvOD9++5#@8@rAh>g_A{#=US`jjLN)|61R+ z)vt8&h0a6$T=Zu8Jc#yGd@B9z>32{3DmU`aGwtc?sgeX^f9B8~Yk%Jz>GuzM+tc|y zFWp?{Cz5cecT??+a&odKiXH7og9rVeyIVb_9N{q2`>DHk-A_8twCmPOTDfac>3KPj za_r@ti)ZDw-Anh4{_aTgfWVdCney$pk2=@Y4rGLKJI@>KF!@H>1;5JuuJ5nz$?I83 zrb^FqebH_#+7tKaf3Yu>C`Elw=f;wu=aC2)rEjAKyV^Mx8iweWOX=*3+k;kz`rq-^ zJCIyhAjN*!uE@tu_QZ*^ra5{I_3e7}r``+j2~aO3Idea{Q~AZ2+jaZ$j8pecbb@aC zdS73U+%K1KGGr@BG4ayP3f>2aR|S6YUF4CzOHpjXEWS(6gRLQyYae%4lCi4~D6*G` zy79m8vi<^DY#HJ?V)Qvwnx(|Y@ddoxEIRZaJCj6r`dH-6-l?!7((A%Cm$MB<$| z-HWTyYUUVxtIXFE(E{m1_nl}!?@?NJJTAR8Gk1{Lcmydze%))x3}H`dd#K?3AeiG3 z-bM^Als5<7U&%8Aj|Z~Xbq{CLYEt@OGq+_YR!c(O4^^b(x1N-ji~2WTSUKda9H&?# z^ZlDiSe~uh1>07_*=n<8Eqol*iB+sH_rE`<2Qb}?7pTz(z$rD zbwt1S{E#4`)8-p#|Co1=tGp)FGxe5#TgOU%*c7b?-eW>9-PC8GL0jicS7ct%WnWJa06GIKi7O55dbi|2yH5PETpHoM`t{2o1E?Vud-1DPrKy-}{`~7EMq} zqu@&CpvU}&ejo>}{~7^0lT@zF5g02kj66o$KHF0j(2OkA+-t`f^8bKAKG$xpKM`Wl zRoXnxE0#lk7Cz)T;-%fkt;!zBQ`W5)Z60ow7q1Tz;`Q7{SY{&MzL)ighDZIk$&u<| zlN#OICU^{0@pE4IH}e!dyyZ^j>rh+ZGE!Z{PfG0G>D^f0sm^wFcBs95JumNbz7(oR z{3t27N5R(PtZtNfVk&K4OLnyH=p5^LHaPcKTfMev=RkWxHxcU=7HQrU>z17ib3Zuc z^CDfC(I{vBe4ZG4r#sfqOHd49}uG5UoZ z(4NVHSFM^TKs#iTCd-tS!0ZF=QQo?Z41Xjw+r+)8ZmCW7q%*#iY96X!&W$S2WRIr4 zE2S1?sMnEt-}R*;p^kRhTgCh2O`?I^&GflCCQ5#(6>Rof-K(WCZW1#lB|emP$LsJ5 z(anv#c^7goi=ng^AUARcVJ8PZ((wFr#%hnHO?#~nMGaI`WCbJq6=)F$13q+otiH Yx%2(GCF{``GE}(|>77c-_2!Fz0NiqmAOHXW literal 0 HcmV?d00001 From 1401d043261ba0a4bd6d5811180268ba3180a46d Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Wed, 18 Nov 2015 13:48:28 -0800 Subject: [PATCH 26/63] ParseUI 1.1.7 --- ParseUI.podspec | 10 +++++----- ParseUI/Resources/Info.plist | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ParseUI.podspec b/ParseUI.podspec index 75754c7..38020f4 100644 --- a/ParseUI.podspec +++ b/ParseUI.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ParseUI' - s.version = '1.1.6' + s.version = '1.1.7' s.license = { :type => 'SDK', :file => 'LICENSE'} s.homepage = 'https://www.parse.com/' s.summary = 'ParseUI is a library of useful User Interface components for the Parse iOS SDK.' @@ -8,11 +8,11 @@ Pod::Spec.new do |s| s.social_media_url = 'https://twitter.com/ParseIt' s.source = { :git => "https://github.com/ParsePlatform/ParseUI-iOS.git", :tag => s.version.to_s } - + s.platform = :ios s.requires_arc = true s.ios.deployment_target = '7.0' - + s.prepare_command = <<-CMD ruby ParseUI/Scripts/convert_images.rb \ ParseUI/Resources/Images/ \ @@ -33,6 +33,6 @@ Pod::Spec.new do |s| 'CoreGraphics', 'QuartzCore' - s.dependency 'Bolts/Tasks', '~> 1.2' - s.dependency 'Parse', '~> 1.8' + s.dependency 'Bolts/Tasks', '~> 1.3' + s.dependency 'Parse', '~> 1.9' end diff --git a/ParseUI/Resources/Info.plist b/ParseUI/Resources/Info.plist index b4d9d06..dde99e2 100644 --- a/ParseUI/Resources/Info.plist +++ b/ParseUI/Resources/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion English CFBundleExecutable - Parse + ParseUI CFBundleIdentifier com.parse.parseui CFBundleInfoDictionaryVersion @@ -13,7 +13,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.1.6 + 1.1.7 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -22,7 +22,7 @@ iPhoneOS CFBundleVersion - 1.1.6 + 1.1.7 MinimumOSVersion 6.0 From 286e74ab22760af3cfde3b424b3365bf63e1342d Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Thu, 19 Nov 2015 14:05:29 -0800 Subject: [PATCH 27/63] Use non-nil facebook permissions by default in PFLogInViewController. --- ParseUI/Classes/LogInViewController/PFLogInViewController.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.m b/ParseUI/Classes/LogInViewController/PFLogInViewController.m index 58035c9..7b7d14f 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.m +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.m @@ -103,6 +103,8 @@ - (void)_commonInit { self.modalPresentationStyle = UIModalPresentationFormSheet; _fields = PFLogInFieldsDefault; + _facebookPermissions = @[ @"public_profile" ]; + if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) { self.automaticallyAdjustsScrollViewInsets = NO; } From 4bb510eee201ce9ec7da6e5577c51816befd3a0d Mon Sep 17 00:00:00 2001 From: Natan Rolnik Date: Thu, 5 Nov 2015 15:34:54 +0200 Subject: [PATCH 28/63] Adds Portuguese (BR) translation --- .../Localization/pt-BR.lproj/ParseUI.strings | Bin 0 -> 6024 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings diff --git a/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings b/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings new file mode 100644 index 0000000000000000000000000000000000000000..f148d0c99adec54760f5039280c588cadf83eaf9 GIT binary patch literal 6024 zcmd5=TW%XS6y>*9K^O=M1ZcB>qDTcx3XB?-8`}-gKYE6er1gZ7tqfj zA6ihh&~r$U!{O**qfQYhRx})v_ug~QeUP6&ef<3C<16t}NHGvOK80xTXGAHKm}B&% zcqNX+@z%G;c>e?bjt6;>6{b}4WAQy^A7Kr5yucncKKIzK!rl_!8qXRsq*&PBHRjCl zOG0XC*Nnv(=Fh|_o`1op#`+VhQG@jcTFo(5VQ#A%S8D92FrQlAxI+{Rm^2(7E;x+DC?$L zX6t`+E$>vNWTkUGEy|*jO4ho(RdQ+ysmoQNa^t3SHjcqNfl4LR)Ezg(qpc#*sH&h~ zyw4Eo-(#ma{#VusBLF}kV+i-n3UWqOWn^jO(A<}Eqw-YHM7$H{@ZLlW#1Q^F7jJ-- z_tFsK{r6$>@!;3d`EVj9ayWT+el{5lyW5W<_xdf{v9OJZ$6_3|S>2As>m53&^cFJ% zuVkPQN3=yWw@;+k3Gz4OV+_dyRhc6>ei^tOeI8zDEYFLMw7Gl0<^ebO4`Y-)b4S6Vh2O@NULU79*t zudpaAXK%#*Vn4!hM^i&nmJzOGAM;#nij!dHX?TH|80P@ znPhi}c#GJY1C6{v;X@M^ooufskT2pu}z z{kA0&N+?U{@%R}Mn?Ts5_sU83(X z(9SWJxr|Rdc}2#H9%&6uQMs=4`Y%KGx?@-lDlZipgtAeoqu)SoiN6XY&H(Zpa%MJ4 z_f_OCg%!`BAD{)#zO2w?n@L+!8(lUU3|=WzjYfBgdtoti6^H>L(H*z-(I1fZ%?i2O z9qW`lF^jt@$=uzZKTRv{cpa1Ld0LpZ!1T`_VR2^~81kYD`rua~Ae}}R)rA;jvMMa|o_UAUF*P zUbmQKgR`%V`!v* Date: Mon, 23 Nov 2015 10:53:08 -0800 Subject: [PATCH 29/63] Update all pods. --- Podfile.lock | 58 ++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index c24ae50..c420710 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,34 +1,34 @@ PODS: - - Bolts (1.3.0): - - Bolts/AppLinks (= 1.3.0) - - Bolts/Tasks (= 1.3.0) - - Bolts/AppLinks (1.3.0): + - Bolts (1.5.0): + - Bolts/AppLinks (= 1.5.0) + - Bolts/Tasks (= 1.5.0) + - Bolts/AppLinks (1.5.0): - Bolts/Tasks - - Bolts/Tasks (1.3.0) - - FBSDKCoreKit (4.7.0): + - Bolts/Tasks (1.5.0) + - FBSDKCoreKit (4.8.0): - Bolts (~> 1.1) - - FBSDKCoreKit/arc (= 4.7.0) - - FBSDKCoreKit/no-arc (= 4.7.0) - - FBSDKCoreKit/arc (4.7.0): + - FBSDKCoreKit/arc (= 4.8.0) + - FBSDKCoreKit/no-arc (= 4.8.0) + - FBSDKCoreKit/arc (4.8.0): - Bolts (~> 1.1) - - FBSDKCoreKit/no-arc (4.7.0): + - FBSDKCoreKit/no-arc (4.8.0): - Bolts (~> 1.1) - FBSDKCoreKit/arc - - FBSDKLoginKit (4.7.0.1): + - FBSDKLoginKit (4.8.0): - FBSDKCoreKit - - Parse (1.9.0): - - Bolts/Tasks (>= 1.3.0) - - ParseFacebookUtilsV4 (1.9.0): - - Bolts/Tasks (>= 1.3.0) - - FBSDKCoreKit (~> 4.7) - - FBSDKLoginKit (~> 4.7) + - Parse (1.10.0): + - Bolts/Tasks (~> 1.5) + - ParseFacebookUtilsV4 (1.9.1): + - Bolts/Tasks (>= 1.5) + - FBSDKCoreKit (~> 4.8) + - FBSDKLoginKit (~> 4.8) - Parse (~> 1.9) - - ParseTwitterUtils (1.9.0): - - Bolts/Tasks (>= 1.3.0) + - ParseTwitterUtils (1.9.1): + - Bolts/Tasks (~> 1.5) + - Parse (~> 1.9) + - ParseUI (1.1.7): + - Bolts/Tasks (~> 1.3) - Parse (~> 1.9) - - ParseUI (1.1.6): - - Bolts/Tasks (~> 1.2) - - Parse (~> 1.8) DEPENDENCIES: - ParseFacebookUtilsV4 @@ -40,12 +40,12 @@ EXTERNAL SOURCES: :path: "." SPEC CHECKSUMS: - Bolts: 805a4a87413e49d4a0c2b7d469084cbc46b09342 - FBSDKCoreKit: eb580bfc2040ad44f4c0b4f4d0befb1d35bce59c - FBSDKLoginKit: 028c5a205990441123764609fe795e65027c447f - Parse: 712efbc476d4f47b0f96b70db7e53101575753aa - ParseFacebookUtilsV4: aadebfaaaf4a45bf0a0992863bf48c8fc49189e3 - ParseTwitterUtils: 0155d1a4e388690aa5d80405a586474e66606968 - ParseUI: 8a22e448c03f825203d8c379c80523517f68baa3 + Bolts: 722ab9a4f8b50fc4ed1b9998a5a7a2b3f16d80b4 + FBSDKCoreKit: 66a935d17b6e00b6b64e604f2eb9b72c9ab7deb8 + FBSDKLoginKit: d893fcbb98d854496925e9ff73c67b896982d3c4 + Parse: 90b2544822200f84b18bfacc4e8b0a3a6c3584a2 + ParseFacebookUtilsV4: eab9b4ade12f0800b4d30f6b808bca55ce17a0e9 + ParseTwitterUtils: 41e8849e37db471e874c6e515190ded19e043dc8 + ParseUI: c2bcdfbb00330e464b5b773266ae221697a3bb7b COCOAPODS: 0.39.0 From 5ad6bf46dc89eb39f1dba290f470886fab146956 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Mon, 30 Nov 2015 12:33:30 -0800 Subject: [PATCH 30/63] Fix potential crash when calling UI code from background thread. --- .../QueryTableViewController/PFQueryTableViewController.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m index ee17366..bfb5d83 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m @@ -21,6 +21,7 @@ #import "PFQueryTableViewController.h" +#import #import #import @@ -397,8 +398,8 @@ - (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths animated:(BOOL)animated [allDeletionTasks addObject:[obj deleteInBackground]]; } - [[BFTask taskForCompletionOfAllTasks:allDeletionTasks] - continueWithBlock:deletionHandlerBlock]; + [[BFTask taskForCompletionOfAllTasks:allDeletionTasks] continueWithExecutor:[BFExecutor mainThreadExecutor] + withBlock:deletionHandlerBlock]; } - (PFTableViewCell *)tableView:(UITableView *)otherTableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath { From 23efddb2184d76f76a01667077b1883c74e4d435 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Tue, 1 Dec 2015 21:36:26 -0800 Subject: [PATCH 31/63] Replace /*! with /** for new doc generation. --- ParseUI/Classes/Cells/PFCollectionViewCell.h | 8 +-- .../Classes/Cells/PFPurchaseTableViewCell.h | 16 +++--- ParseUI/Classes/Cells/PFTableViewCell.h | 4 +- ...FActivityIndicatorCollectionReusableView.h | 2 +- .../Cells/PFActivityIndicatorTableViewCell.h | 2 +- ParseUI/Classes/Internal/PFImageCache.h | 2 +- .../Classes/Internal/Views/PFLoadingView.h | 2 +- .../Classes/LogInViewController/PFLogInView.h | 50 ++++++++--------- .../PFLogInViewController.h | 30 +++++------ .../PFLogInViewController.m | 2 +- .../PFProductTableViewController.h | 4 +- .../PFQueryCollectionViewController.h | 44 +++++++-------- .../PFQueryTableViewController.h | 54 +++++++++---------- .../SignUpViewController/PFSignUpView.h | 38 ++++++------- .../PFSignUpViewController.h | 28 +++++----- ParseUI/Classes/Views/PFImageView.h | 10 ++-- ParseUI/Classes/Views/PFTextField.h | 16 +++--- 17 files changed, 156 insertions(+), 156 deletions(-) diff --git a/ParseUI/Classes/Cells/PFCollectionViewCell.h b/ParseUI/Classes/Cells/PFCollectionViewCell.h index 13d7570..490d087 100644 --- a/ParseUI/Classes/Cells/PFCollectionViewCell.h +++ b/ParseUI/Classes/Cells/PFCollectionViewCell.h @@ -28,25 +28,25 @@ NS_ASSUME_NONNULL_BEGIN @class PFImageView; @class PFObject; -/*! +/** The `PFCollectionViewCell` class represents a collection view cell which can download and display remote images stored on Parse as well as has a default simple text label. */ @interface PFCollectionViewCell : UICollectionViewCell -/*! +/** @abstract A simple lazy-loaded label for the collection view cell. */ @property (nonatomic, strong, readonly) UILabel *textLabel; -/*! +/** @abstract The lazy-loaded imageView of the collection view cell. @see PFImageView */ @property (nonatomic, strong, readonly) PFImageView *imageView; -/*! +/** @abstract This method should update all the relevant information inside a subclass of `PFCollectionViewCell`. @discussion This method is automatically called by whenever the cell diff --git a/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h b/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h index f954dda..a82af71 100644 --- a/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h +++ b/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h @@ -26,20 +26,20 @@ NS_ASSUME_NONNULL_BEGIN -/*! +/** An enum that represents states of the PFPurchaseTableViewCell. @see PFPurchaseTableViewCell */ typedef NS_ENUM(uint8_t, PFPurchaseTableViewCellState) { - /*! Normal state of the cell. */ + /** Normal state of the cell. */ PFPurchaseTableViewCellStateNormal = 0, - /*! Downloading state of the cell. */ + /** Downloading state of the cell. */ PFPurchaseTableViewCellStateDownloading, - /*! State of the cell, when the product was downloaded. */ + /** State of the cell, when the product was downloaded. */ PFPurchaseTableViewCellStateDownloaded }; -/*! +/** `PFPurchaseTableViewCell` is a subclass that is used to show products in a . @@ -47,18 +47,18 @@ typedef NS_ENUM(uint8_t, PFPurchaseTableViewCellState) { */ @interface PFPurchaseTableViewCell : PFTableViewCell -/*! +/** @abstract State of the cell. @see PFPurchaseTableViewCellState */ @property (nonatomic, assign) PFPurchaseTableViewCellState state; -/*! +/** @abstract Label where price of the product is displayed. */ @property (nullable, nonatomic, strong, readonly) UILabel *priceLabel; -/*! +/** @abstract Progress view that is shown, when the product is downloading. */ @property (nullable, nonatomic, strong, readonly) UIProgressView *progressView; diff --git a/ParseUI/Classes/Cells/PFTableViewCell.h b/ParseUI/Classes/Cells/PFTableViewCell.h index 173df06..c636d5b 100644 --- a/ParseUI/Classes/Cells/PFTableViewCell.h +++ b/ParseUI/Classes/Cells/PFTableViewCell.h @@ -26,7 +26,7 @@ NS_ASSUME_NONNULL_BEGIN -/*! +/** The `PFTableViewCell` class represents a table view cell which can download and display remote images stored on Parse. When used in a - downloading and displaying of the remote images @@ -34,7 +34,7 @@ NS_ASSUME_NONNULL_BEGIN */ @interface PFTableViewCell : UITableViewCell -/*! +/** @abstract The imageView of the table view cell. @see PFImageView diff --git a/ParseUI/Classes/Internal/Cells/PFActivityIndicatorCollectionReusableView.h b/ParseUI/Classes/Internal/Cells/PFActivityIndicatorCollectionReusableView.h index 91f15fa..4400449 100644 --- a/ParseUI/Classes/Internal/Cells/PFActivityIndicatorCollectionReusableView.h +++ b/ParseUI/Classes/Internal/Cells/PFActivityIndicatorCollectionReusableView.h @@ -21,7 +21,7 @@ #import -/*! +/** The `PFActivityIndicatorCollectionReusableView` class represents a collection footer that has a simple text label and displays UIActivityIndicatorView if property is set to `YES`. An instance of this class is used as a default next page button inside . diff --git a/ParseUI/Classes/Internal/Cells/PFActivityIndicatorTableViewCell.h b/ParseUI/Classes/Internal/Cells/PFActivityIndicatorTableViewCell.h index fea50a7..e1cd474 100644 --- a/ParseUI/Classes/Internal/Cells/PFActivityIndicatorTableViewCell.h +++ b/ParseUI/Classes/Internal/Cells/PFActivityIndicatorTableViewCell.h @@ -23,7 +23,7 @@ #import -/*! +/** The `PFActivityIndicatorTableViewCell` class represents a table view cell that displays UIActivityIndicatorView as the accessory view. */ diff --git a/ParseUI/Classes/Internal/PFImageCache.h b/ParseUI/Classes/Internal/PFImageCache.h index 36c2337..38c184e 100644 --- a/ParseUI/Classes/Internal/PFImageCache.h +++ b/ParseUI/Classes/Internal/PFImageCache.h @@ -21,7 +21,7 @@ #import -/*! +/** A memory cache for UIImage, based on NSCache */ @interface PFImageCache : NSCache diff --git a/ParseUI/Classes/Internal/Views/PFLoadingView.h b/ParseUI/Classes/Internal/Views/PFLoadingView.h index 02b2a90..2663181 100644 --- a/ParseUI/Classes/Internal/Views/PFLoadingView.h +++ b/ParseUI/Classes/Internal/Views/PFLoadingView.h @@ -21,7 +21,7 @@ #import -/*! +/** A loading view that is used to show users that data is being loaded before any data is available. */ @interface PFLoadingView : UIView diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.h b/ParseUI/Classes/LogInViewController/PFLogInView.h index 6f8feec..e39fb3d 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.h +++ b/ParseUI/Classes/LogInViewController/PFLogInView.h @@ -25,31 +25,31 @@ NS_ASSUME_NONNULL_BEGIN -/*! +/** `PFLogInFields` bitmask specifies the log in elements which are enabled in the view. @see PFLogInViewController @see PFLogInView */ typedef NS_OPTIONS(NSInteger, PFLogInFields) { - /*! No fields. */ + /** No fields. */ PFLogInFieldsNone = 0, - /*! Username and password fields. */ + /** Username and password fields. */ PFLogInFieldsUsernameAndPassword = 1 << 0, - /*! Forgot password button. */ + /** Forgot password button. */ PFLogInFieldsPasswordForgotten = 1 << 1, - /*! Login button. */ + /** Login button. */ PFLogInFieldsLogInButton = 1 << 2, - /*! Button to login with Facebook. */ + /** Button to login with Facebook. */ PFLogInFieldsFacebook = 1 << 3, - /*! Button to login with Twitter. */ + /** Button to login with Twitter. */ PFLogInFieldsTwitter = 1 << 4, - /*! Signup Button. */ + /** Signup Button. */ PFLogInFieldsSignUpButton = 1 << 5, - /*! Dismiss Button. */ + /** Dismiss Button. */ PFLogInFieldsDismissButton = 1 << 6, - /*! Default value. Combines Username, Password, Login, Signup, Forgot Password and Dismiss buttons. */ + /** Default value. Combines Username, Password, Login, Signup, Forgot Password and Dismiss buttons. */ PFLogInFieldsDefault = (PFLogInFieldsUsernameAndPassword | PFLogInFieldsLogInButton | PFLogInFieldsSignUpButton | @@ -59,7 +59,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { @class PFTextField; -/*! +/** The `PFLogInView` class provides a standard log in interface for authenticating a . */ @interface PFLogInView : UIScrollView @@ -68,7 +68,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { /// @name Creating Log In View ///-------------------------------------- -/*! +/** @abstract Initializes the view with the specified log in elements. @param fields A bitmask specifying the log in elements which are enabled in the view @@ -79,7 +79,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { */ - (instancetype)initWithFields:(PFLogInFields)fields; -/*! +/** @abstract The view controller that will present this view. @discussion Used to lay out elements correctly when the presenting view controller has translucent elements. @@ -97,7 +97,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { /// @name Configure Username Behaviour ///-------------------------------------- -/*! +/** @abstract If email should be used to log in, instead of username @discussion By default, this is set to `NO`. @@ -108,59 +108,59 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { /// @name Log In Elements ///-------------------------------------- -/*! +/** @abstract The bitmask which specifies the enabled log in elements in the view. */ @property (nonatomic, assign, readonly) PFLogInFields fields; -/*! +/** @abstract The username text field. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) PFTextField *usernameField; -/*! +/** @abstract The password text field. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) PFTextField *passwordField; -/*! +/** @abstract The password forgotten button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *passwordForgottenButton; -/*! +/** @abstract The log in button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *logInButton; -/*! +/** @abstract The Facebook button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *facebookButton; -/*! +/** @abstract The Twitter button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *twitterButton; -/*! +/** @abstract The sign up button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *signUpButton; -/*! +/** @abstract It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; -/*! +/** @abstract The facebook/twitter login label. @deprecated This property is deprecated and will always be nil. */ @property (nullable, nonatomic, strong, readonly) UILabel *externalLogInLabel __attribute__(PARSE_UI_DEPRECATED("This property is deprecated and will always be nil.")); -/*! +/** @abstract The sign up label. @deprecated This property is deprecated and will always be nil. diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.h b/ParseUI/Classes/LogInViewController/PFLogInViewController.h index e21a737..1002e77 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.h +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.h @@ -30,7 +30,7 @@ NS_ASSUME_NONNULL_BEGIN @class PFUser; @protocol PFLogInViewControllerDelegate; -/*! +/** The `PFLogInViewController` class presents and manages a standard authentication interface for logging in a . */ @interface PFLogInViewController : UIViewController @@ -39,7 +39,7 @@ NS_ASSUME_NONNULL_BEGIN /// @name Configuring Log In Elements ///-------------------------------------- -/*! +/** @abstract A bitmask specifying the log in elements which are enabled in the view. @see PFLogInFields @@ -47,7 +47,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) PFLogInFields fields; -/*! +/** @abstract The log in view. It contains all the enabled log in elements. @see PFLogInView @@ -58,21 +58,21 @@ NS_ASSUME_NONNULL_BEGIN /// @name Configuring Log In Behaviors ///-------------------------------------- -/*! +/** @abstract The delegate that responds to the control events of `PFLogInViewController`. @see PFLogInViewControllerDelegate */ @property (nullable, nonatomic, weak) id delegate; -/*! +/** @abstract The facebook permissions that Facebook log in requests for. @discussion If unspecified, the default is basic facebook permissions. */ @property (nullable, nonatomic, copy) NSArray *facebookPermissions; -/*! +/** @abstract The sign up controller if sign up is enabled. @discussion Use this to configure the sign up view, and the transition animation to the sign up view. @@ -80,7 +80,7 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nullable, nonatomic, strong) PFSignUpViewController *signUpController; -/*! +/** @abstract Whether to prompt for the email as username on the login view. @discussion If set to `YES`, we'll prompt for the email in the username field. @@ -95,18 +95,18 @@ NS_ASSUME_NONNULL_BEGIN /// @name Notifications ///-------------------------------------- -/*! +/** @abstract The notification is posted immediately after the log in succeeds. */ extern NSString *const PFLogInSuccessNotification; -/*! +/** @abstract The notification is posted immediately after the log in fails. @discussion If the delegate prevents the log in from starting, the notification is not sent. */ extern NSString *const PFLogInFailureNotification; -/*! +/** @abstract The notification is posted immediately after the log in is cancelled. */ extern NSString *const PFLogInCancelNotification; @@ -115,7 +115,7 @@ extern NSString *const PFLogInCancelNotification; /// @name PFLogInViewControllerDelegate ///-------------------------------------- -/*! +/** The `PFLogInViewControllerDelegate` protocol defines methods a delegate of a should implement. All methods of this protocol are optional. */ @@ -127,7 +127,7 @@ extern NSString *const PFLogInCancelNotification; /// @name Customizing Behavior ///-------------------------------------- -/*! +/** @abstract Sent to the delegate to determine whether the log in request should be submitted to the server. @param logInController The login view controller that is requesting the data. @@ -144,7 +144,7 @@ shouldBeginLogInWithUsername:(NSString *)username /// @name Responding to Actions ///-------------------------------------- -/*! +/** @abstract Sent to the delegate when a is logged in. @param logInController The login view controller where login finished. @@ -152,7 +152,7 @@ shouldBeginLogInWithUsername:(NSString *)username */ - (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user; -/*! +/** @abstract Sent to the delegate when the log in attempt fails. @discussion If you implement this method, PFLoginViewController will not automatically show its default @@ -164,7 +164,7 @@ shouldBeginLogInWithUsername:(NSString *)username - (void)logInViewController:(PFLogInViewController *)logInController didFailToLogInWithError:(nullable NSError *)error; -/*! +/** @abstract Sent to the delegate when the log in screen is cancelled. @param logInController The login view controller where login was cancelled. diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.m b/ParseUI/Classes/LogInViewController/PFLogInViewController.m index 7b7d14f..6bf6a64 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.m +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.m @@ -35,7 +35,7 @@ NSString *const PFLogInFailureNotification = @"com.parse.ui.login.failure"; NSString *const PFLogInCancelNotification = @"com.parse.ui.login.cancel"; -/*! +/** This protocol exists so that we can weakly refer to messages to pass to PFFacebookUtils without actually taking a dependency on the symbols. */ diff --git a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h index 0cc9654..6e7457f 100644 --- a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h +++ b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h @@ -26,14 +26,14 @@ NS_ASSUME_NONNULL_BEGIN -/*! +/** `PFProductTableViewController` displays in-app purchase products stored on Parse. In addition to setting up in-app purchases in iTunes Connect, the app developer needs to register product information on Parse, in the Product class. */ @interface PFProductTableViewController : PFQueryTableViewController -/*! +/** @abstract Initializes a product table view controller. @param style The UITableViewStyle for the table diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h index b8b7ce9..0648d8d 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h @@ -30,7 +30,7 @@ NS_ASSUME_NONNULL_BEGIN @class PFObject; @class PFQuery; -/*! +/** This class allows you to think about a one-to-one mapping between a and a `UICollectionViewCell`, rather than having to juggle index paths. @@ -47,32 +47,32 @@ NS_ASSUME_NONNULL_BEGIN */ @interface PFQueryCollectionViewController : UICollectionViewController -/*! +/** @abstract The class name of the this collection will use as a datasource. */ @property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; -/*! +/** @abstract Whether the collection should use the default loading view. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL loadingViewEnabled; -/*! +/** @abstract Whether the collection should use the built-in pull-to-refresh feature. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL pullToRefreshEnabled; -/*! +/** @abstract Whether the collection should use the built-in pagination feature. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL paginationEnabled; -/*! +/** @abstract The number of objects to show per page. Default - `25`. */ @property (nonatomic, assign) IBInspectable NSUInteger objectsPerPage; -/*! +/** @abstract Whether the collection is actively loading new data from the server. */ @property (nonatomic, assign, getter=isLoading) BOOL loading; @@ -81,7 +81,7 @@ NS_ASSUME_NONNULL_BEGIN /// @name Creating a PFQueryCollectionViewController ///-------------------------------------- -/*! +/** @abstract Initializes a view controller with a `UICollectionViewFlowLayout` and a class name of that will be associated with this collection. @@ -91,7 +91,7 @@ NS_ASSUME_NONNULL_BEGIN */ - (instancetype)initWithClassName:(nullable NSString *)className; -/*! +/** @abstract Initializes a view controller with a class name of that will be associated with this collection. @param layout Layout for collection view to use. @@ -106,13 +106,13 @@ NS_ASSUME_NONNULL_BEGIN /// @name Responding to Events ///-------------------------------------- -/*! +/** Called when objects will be loaded from Parse. If you override this method, you must call [super objectsWillLoad] in your implementation. */ - (void)objectsWillLoad NS_REQUIRES_SUPER; -/*! +/** Called when objects have loaded from Parse. If you override this method, you must call [super objectsDidLoad:] in your implementation. @param error The Parse error from running the PFQuery, if there was any. @@ -123,12 +123,12 @@ NS_ASSUME_NONNULL_BEGIN /// @name Accessing Results ///-------------------------------------- -/*! +/** @abstract The array of instances of that is used as a data source. */ @property (nonatomic, copy, readonly) NSArray *objects; -/*! +/** @abstract Returns an object at a particular indexPath. @discussion The default impementation returns the object at `indexPath.item`. @@ -140,12 +140,12 @@ NS_ASSUME_NONNULL_BEGIN */ - (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; -/*! +/** @abstract Removes an object at the specified index path, animated. */ - (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath; -/*! +/** @abstract Removes all objects at the specified index paths, animated. */ - (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; @@ -154,14 +154,14 @@ NS_ASSUME_NONNULL_BEGIN /// @name Loading Data ///-------------------------------------- -/*! +/** @abstract Clears the collection view and loads the first page of objects. @returns An awaitable task that completes when the reload succeeds */ - (BFTask *)loadObjects; -/*! +/** @abstract Loads the objects of the at the specified page and appends it to the objects already loaded and refreshes the collection. @@ -172,12 +172,12 @@ NS_ASSUME_NONNULL_BEGIN */ - (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear; -/*! +/** @abstract Loads the next page of objects, appends to table, and refreshes. */ - (void)loadNextPage; -/*! +/** @abstract Clears the collection view of all objects. */ - (void)clear; @@ -186,7 +186,7 @@ NS_ASSUME_NONNULL_BEGIN /// @name Querying ///-------------------------------------- -/*! +/** @abstract Override to construct your own custom to get the objects. @returns An instance of that method will use to the objects for this collection. @@ -197,7 +197,7 @@ NS_ASSUME_NONNULL_BEGIN /// @name Data Source Methods ///-------------------------------------- -/*! +/** @abstract Override this method to customize each cell given a that is loaded. @warning The cell should inherit from which is a subclass of `UICollectionViewCell`. @@ -212,7 +212,7 @@ NS_ASSUME_NONNULL_BEGIN cellForItemAtIndexPath:(NSIndexPath *)indexPath object:(nullable PFObject *)object; -/*! +/** @discussion Override this method to customize the view that allows the user to load the next page when pagination is turned on. diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h index 8bb56a3..300c59f 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h @@ -30,7 +30,7 @@ NS_ASSUME_NONNULL_BEGIN @class PFQuery; @class PFTableViewCell; -/*! +/** This class allows you to think about a one-to-one mapping between a and a `UITableViewCell`, rather than having to juggle index paths. @@ -49,7 +49,7 @@ NS_ASSUME_NONNULL_BEGIN /// @name Creating a PFQueryTableViewController ///-------------------------------------- -/*! +/** @abstract Initializes with a class name of the that will be associated with this table. @param style The UITableViewStyle for the table @@ -60,7 +60,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithStyle:(UITableViewStyle)style className:(nullable NSString *)className NS_DESIGNATED_INITIALIZER; -/*! +/** @abstract Initializes with a class name of the PFObjects that will be associated with this table. @param className The class name of the instances of that this table will display. @@ -73,53 +73,53 @@ NS_ASSUME_NONNULL_BEGIN /// @name Configuring Behavior ///-------------------------------------- -/*! +/** @abstract The class name of the this table will use as a datasource. */ @property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; -/*! +/** @abstract The key to use to display for the cell text label. @discussion This won't apply if you override */ @property (nullable, nonatomic, copy) IBInspectable NSString *textKey; -/*! +/** @abstract The key to use to display for the cell image view. @discussion This won't apply if you override */ @property (nullable, nonatomic, copy) IBInspectable NSString *imageKey; -/*! +/** @abstract The image to use as a placeholder for the cell images. @discussion This won't apply if you override */ @property (nullable, nonatomic, strong) IBInspectable UIImage *placeholderImage; -/*! +/** @abstract Whether the table should use the default loading view. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL loadingViewEnabled; -/*! +/** @abstract Whether the table should use the built-in pull-to-refresh feature. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL pullToRefreshEnabled; -/*! +/** @abstract Whether the table should use the built-in pagination feature. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL paginationEnabled; -/*! +/** @abstract The number of objects to show per page. Default - `25`. */ @property (nonatomic, assign) IBInspectable NSUInteger objectsPerPage; -/*! +/** @abstract Whether the table is actively loading new data from the server. */ @property (nonatomic, assign, getter=isLoading) BOOL loading; @@ -128,13 +128,13 @@ NS_ASSUME_NONNULL_BEGIN /// @name Responding to Events ///-------------------------------------- -/*! +/** Called when objects will loaded from Parse. If you override this method, you must call [super objectsWillLoad] in your implementation. */ - (void)objectsWillLoad; -/*! +/** Called when objects have loaded from Parse. If you override this method, you must call [super objectsDidLoad:] in your implementation. @param error The Parse error from running the PFQuery, if there was any. @@ -145,12 +145,12 @@ NS_ASSUME_NONNULL_BEGIN /// @name Accessing Results ///-------------------------------------- -/*! +/** @abstract The array of instances of that is used as a data source. */ @property (nullable, nonatomic, copy, readonly) NSArray *objects; -/*! +/** @abstract Returns an object at a particular indexPath. @discussion The default impementation returns the object at `indexPath.row`. @@ -162,39 +162,39 @@ NS_ASSUME_NONNULL_BEGIN */ - (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; -/*! +/** @abstract Removes an object at the specified index path, animated. */ - (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath; -/*! +/** @abstract Removes an object at the specified index path, with or without animation. */ - (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated; -/*! +/** @abstract Removes all objects at the specified index paths, animated. */ - (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; -/*! +/** @abstract Removes all objects at the specified index paths, with or without animation. */ - (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes animated:(BOOL)animated; -/*! +/** @abstract Clears the table of all objects. */ - (void)clear; -/*! +/** @abstract Clears the table and loads the first page of objects. @returns An awaitable task that completes when the reload succeeds */ - (BFTask *)loadObjects; -/*! +/** @abstract Loads the objects of the className at the specified page and appends it to the objects already loaded and refreshes the table. @@ -205,7 +205,7 @@ NS_ASSUME_NONNULL_BEGIN */ - (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear; -/*! +/** @abstract Loads the next page of objects, appends to table, and refreshes. */ - (void)loadNextPage; @@ -214,7 +214,7 @@ NS_ASSUME_NONNULL_BEGIN /// @name Querying ///-------------------------------------- -/*! +/** Override to construct your own custom PFQuery to get the objects. @result PFQuery that loadObjects will use to the objects for this table. */ @@ -224,7 +224,7 @@ NS_ASSUME_NONNULL_BEGIN /// @name Data Source Methods ///-------------------------------------- -/*! +/** @abstract Override this method to customize each cell given a PFObject that is loaded. @discussion If you don't override this method, it will use a default style cell and display either @@ -242,7 +242,7 @@ NS_ASSUME_NONNULL_BEGIN cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(nullable PFObject *)object; -/*! +/** @discussion Override this method to customize the cell that allows the user to load the next page when pagination is turned on. diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpView.h b/ParseUI/Classes/SignUpViewController/PFSignUpView.h index db9d641..cb53358 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpView.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpView.h @@ -25,24 +25,24 @@ NS_ASSUME_NONNULL_BEGIN -/*! +/** `PFSignUpFields` bitmask specifies the sign up elements which are enabled in the view. @see PFSignUpViewController @see PFSignUpView */ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { - /*! Username and password fields. */ + /** Username and password fields. */ PFSignUpFieldsUsernameAndPassword = 0, - /*! Email field. */ + /** Email field. */ PFSignUpFieldsEmail = 1 << 0, - /*! This field can be used for something else. */ + /** This field can be used for something else. */ PFSignUpFieldsAdditional = 1 << 1, - /*! Sign Up Button */ + /** Sign Up Button */ PFSignUpFieldsSignUpButton = 1 << 2, - /*! Dismiss Button */ + /** Dismiss Button */ PFSignUpFieldsDismissButton = 1 << 3, - /*! Default value. Combines Username, Password, Email, Sign Up and Dismiss Buttons. */ + /** Default value. Combines Username, Password, Email, Sign Up and Dismiss Buttons. */ PFSignUpFieldsDefault = (PFSignUpFieldsUsernameAndPassword | PFSignUpFieldsEmail | PFSignUpFieldsSignUpButton | @@ -51,7 +51,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { @class PFTextField; -/*! +/** The `PFSignUpView` class provides a standard sign up interface for authenticating a . */ @interface PFSignUpView : UIScrollView @@ -60,7 +60,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { /// @name Creating SignUp View ///-------------------------------------- -/*! +/** @abstract Initializes the view with the specified sign up elements. @param fields A bitmask specifying the sign up elements which are enabled in the view @@ -71,7 +71,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { */ - (instancetype)initWithFields:(PFSignUpFields)fields; -/*! +/** @abstract The view controller that will present this view. @discussion Used to lay out elements correctly when the presenting view controller has translucent elements. @@ -82,7 +82,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { /// @name Customizing the Logo ///-------------------------------------- -/*! +/** @abstract The logo. By default, it is the Parse logo. */ @property (nullable, nonatomic, strong) UIView *logo; @@ -91,7 +91,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { /// @name Configure Username Behaviour ///-------------------------------------- -/*! +/** @abstract If email should be used to log in, instead of username @discussion By default, this is set to `NO`. @@ -102,39 +102,39 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { /// @name Sign Up Elements ///-------------------------------------- -/*! +/** @abstract The bitmask which specifies the enabled sign up elements in the view */ @property (nonatomic, assign, readonly) PFSignUpFields fields; -/*! +/** @abstract The username text field. */ @property (nullable, nonatomic, strong, readonly) PFTextField *usernameField; -/*! +/** @abstract The password text field. */ @property (nullable, nonatomic, strong, readonly) PFTextField *passwordField; -/*! +/** @abstract The email text field. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) PFTextField *emailField; -/*! +/** @abstract The additional text field. It is `nil` if the element is not enabled. @discussion This field is intended to be customized. */ @property (nullable, nonatomic, strong, readonly) PFTextField *additionalField; -/*! +/** @abstract The sign up button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *signUpButton; -/*! +/** @abstract The dismiss button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h index 5e13f4c..2e81225 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h @@ -29,7 +29,7 @@ NS_ASSUME_NONNULL_BEGIN -/*! +/** The `PFSignUpViewController` class that presents and manages a standard authentication interface for signing up a . */ @@ -39,14 +39,14 @@ NS_ASSUME_NONNULL_BEGIN /// @name Configuring Sign Up Elements ///-------------------------------------- -/*! +/** @abstract A bitmask specifying the log in elements which are enabled in the view. @see PFSignUpFields */ @property (nonatomic, assign) PFSignUpFields fields; -/*! +/** @abstract The sign up view. It contains all the enabled log in elements. @see PFSignUpView @@ -57,19 +57,19 @@ NS_ASSUME_NONNULL_BEGIN /// @name Configuring Sign Up Behaviors ///-------------------------------------- -/*! +/** @abstract The delegate that responds to the control events of `PFSignUpViewController`. @see PFSignUpViewControllerDelegate */ @property (nullable, nonatomic, weak) id delegate; -/*! +/** @abstract Minimum required password length for user signups, defaults to `0`. */ @property (nonatomic, assign) NSUInteger minPasswordLength; -/*! +/** @abstract Whether to use the email as username on the attached . @discussion If set to `YES`, we'll hide the email field, prompt for the email in @@ -84,19 +84,19 @@ NS_ASSUME_NONNULL_BEGIN /// @name Notifications ///-------------------------------------- -/*! +/** @abstract The notification is posted immediately after the sign up succeeds. */ extern NSString *const PFSignUpSuccessNotification; -/*! +/** @abstract The notification is posted immediately after the sign up fails. @discussion If the delegate prevents the sign up to start, the notification is not sent. */ extern NSString *const PFSignUpFailureNotification; -/*! +/** @abstract The notification is posted immediately after the user cancels sign up. */ extern NSString *const PFSignUpCancelNotification; @@ -105,7 +105,7 @@ extern NSString *const PFSignUpCancelNotification; /// @name PFSignUpViewControllerDelegate ///-------------------------------------- -/*! +/** The `PFLogInViewControllerDelegate` protocol defines methods a delegate of a should implement. All methods of this protocol are optional. */ @@ -117,7 +117,7 @@ extern NSString *const PFSignUpCancelNotification; /// @name Customizing Behavior ///-------------------------------------- -/*! +/** @abstract Sent to the delegate to determine whether the sign up request should be submitted to the server. @param signUpController The signup view controller that is requesting the data. @@ -131,7 +131,7 @@ extern NSString *const PFSignUpCancelNotification; /// @name Responding to Actions ///-------------------------------------- -/*! +/** @abstract Sent to the delegate when a is signed up. @param signUpController The signup view controller where signup finished. @@ -139,7 +139,7 @@ extern NSString *const PFSignUpCancelNotification; */ - (void)signUpViewController:(PFSignUpViewController *)signUpController didSignUpUser:(PFUser *)user; -/*! +/** @abstract Sent to the delegate when the sign up attempt fails. @param signUpController The signup view controller where signup failed. @@ -148,7 +148,7 @@ extern NSString *const PFSignUpCancelNotification; - (void)signUpViewController:(PFSignUpViewController *)signUpController didFailToSignUpWithError:(nullable NSError *)error; -/*! +/** @abstract Sent to the delegate when the sign up screen is cancelled. @param signUpController The signup view controller where signup was cancelled. diff --git a/ParseUI/Classes/Views/PFImageView.h b/ParseUI/Classes/Views/PFImageView.h index 67c5909..fe208fc 100644 --- a/ParseUI/Classes/Views/PFImageView.h +++ b/ParseUI/Classes/Views/PFImageView.h @@ -30,19 +30,19 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * @class BFTask; @class PFFile; -/*! +/** An image view that downloads and displays remote image stored on Parse's server. */ @interface PFImageView : UIImageView -/*! +/** @abstract The remote file on Parse's server that stores the image. @warning Note that the download does not start until is called. */ @property (nullable, nonatomic, strong) PFFile *file; -/*! +/** @abstract Initiate downloading of the remote image. @discussion Once the download completes, the remote image will be displayed. @@ -51,7 +51,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * */ - (BFTask *)loadInBackground; -/*! +/** @abstract Initiate downloading of the remote image. @discussion Once the download completes, the remote image will be displayed. @@ -60,7 +60,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * */ - (void)loadInBackground:(nullable PFImageViewImageResultBlock)completion; -/*! +/** @abstract Initiate downloading of the remote image. @discussion Once the download completes, the remote image will be displayed. diff --git a/ParseUI/Classes/Views/PFTextField.h b/ParseUI/Classes/Views/PFTextField.h index c50781e..39912ff 100644 --- a/ParseUI/Classes/Views/PFTextField.h +++ b/ParseUI/Classes/Views/PFTextField.h @@ -25,28 +25,28 @@ NS_ASSUME_NONNULL_BEGIN -/*! +/** `PFTextFieldSeparatorStyle` bitmask specifies the style of the separators, that should be used for a given `PFTextField`. @see PFTextField */ typedef NS_OPTIONS(uint8_t, PFTextFieldSeparatorStyle){ - /*! No separators are visible. */ + /** No separators are visible. */ PFTextFieldSeparatorStyleNone = 0, - /*! Separator on top of the text field. */ + /** Separator on top of the text field. */ PFTextFieldSeparatorStyleTop = 1 << 0, - /*! Separator at the bottom of the text field. */ + /** Separator at the bottom of the text field. */ PFTextFieldSeparatorStyleBottom = 1 << 1 }; -/*! +/** `PFTextField` class serves as a stylable subclass of `UITextField`. It includes styles that are specific to `ParseUI` framework and allows advanced customization. */ @interface PFTextField : UITextField -/*! +/** @abstract Separator style bitmask that should be applied to this textfield. @discussion Default: @@ -55,14 +55,14 @@ typedef NS_OPTIONS(uint8_t, PFTextFieldSeparatorStyle){ */ @property (nonatomic, assign) PFTextFieldSeparatorStyle separatorStyle; -/*! +/** @abstract Color that should be used for the separators, if they are visible. @discussion Default: `227,227,227,1.0`. */ @property (nullable, nonatomic, strong) UIColor *separatorColor UI_APPEARANCE_SELECTOR; -/*! +/** This method is a convenience initializer that sets both `frame` and `separatorStyle` for an instance of `PFTextField.` @param frame The frame rectangle for the view, measured in points. From e7c91126502d47abde740331405e950eb5c33a13 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Tue, 1 Dec 2015 21:37:17 -0800 Subject: [PATCH 32/63] Remove abstract keyword from method documentation. --- ParseUI/Classes/Cells/PFCollectionViewCell.h | 6 +-- .../Classes/Cells/PFPurchaseTableViewCell.h | 6 +-- ParseUI/Classes/Cells/PFTableViewCell.h | 2 +- .../Classes/LogInViewController/PFLogInView.h | 28 ++++++------ .../PFLogInViewController.h | 26 +++++------ .../PFProductTableViewController.h | 2 +- .../PFQueryCollectionViewController.h | 36 +++++++-------- .../PFQueryTableViewController.h | 44 +++++++++---------- .../SignUpViewController/PFSignUpView.h | 22 +++++----- .../PFSignUpViewController.h | 24 +++++----- ParseUI/Classes/Views/PFImageView.h | 8 ++-- ParseUI/Classes/Views/PFTextField.h | 4 +- 12 files changed, 104 insertions(+), 104 deletions(-) diff --git a/ParseUI/Classes/Cells/PFCollectionViewCell.h b/ParseUI/Classes/Cells/PFCollectionViewCell.h index 490d087..ae5e5bb 100644 --- a/ParseUI/Classes/Cells/PFCollectionViewCell.h +++ b/ParseUI/Classes/Cells/PFCollectionViewCell.h @@ -35,19 +35,19 @@ NS_ASSUME_NONNULL_BEGIN @interface PFCollectionViewCell : UICollectionViewCell /** - @abstract A simple lazy-loaded label for the collection view cell. + A simple lazy-loaded label for the collection view cell. */ @property (nonatomic, strong, readonly) UILabel *textLabel; /** - @abstract The lazy-loaded imageView of the collection view cell. + The lazy-loaded imageView of the collection view cell. @see PFImageView */ @property (nonatomic, strong, readonly) PFImageView *imageView; /** - @abstract This method should update all the relevant information inside a subclass of `PFCollectionViewCell`. + This method should update all the relevant information inside a subclass of `PFCollectionViewCell`. @discussion This method is automatically called by whenever the cell should display new information. By default this method does nothing. diff --git a/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h b/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h index a82af71..b82d522 100644 --- a/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h +++ b/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h @@ -48,18 +48,18 @@ typedef NS_ENUM(uint8_t, PFPurchaseTableViewCellState) { @interface PFPurchaseTableViewCell : PFTableViewCell /** - @abstract State of the cell. + State of the cell. @see PFPurchaseTableViewCellState */ @property (nonatomic, assign) PFPurchaseTableViewCellState state; /** - @abstract Label where price of the product is displayed. + Label where price of the product is displayed. */ @property (nullable, nonatomic, strong, readonly) UILabel *priceLabel; /** - @abstract Progress view that is shown, when the product is downloading. + Progress view that is shown, when the product is downloading. */ @property (nullable, nonatomic, strong, readonly) UIProgressView *progressView; diff --git a/ParseUI/Classes/Cells/PFTableViewCell.h b/ParseUI/Classes/Cells/PFTableViewCell.h index c636d5b..9714162 100644 --- a/ParseUI/Classes/Cells/PFTableViewCell.h +++ b/ParseUI/Classes/Cells/PFTableViewCell.h @@ -35,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN @interface PFTableViewCell : UITableViewCell /** - @abstract The imageView of the table view cell. + The imageView of the table view cell. @see PFImageView */ diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.h b/ParseUI/Classes/LogInViewController/PFLogInView.h index e39fb3d..be80724 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.h +++ b/ParseUI/Classes/LogInViewController/PFLogInView.h @@ -69,7 +69,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { ///-------------------------------------- /** - @abstract Initializes the view with the specified log in elements. + Initializes the view with the specified log in elements. @param fields A bitmask specifying the log in elements which are enabled in the view @@ -80,7 +80,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { - (instancetype)initWithFields:(PFLogInFields)fields; /** - @abstract The view controller that will present this view. + The view controller that will present this view. @discussion Used to lay out elements correctly when the presenting view controller has translucent elements. */ @@ -98,7 +98,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { ///-------------------------------------- /** - @abstract If email should be used to log in, instead of username + If email should be used to log in, instead of username @discussion By default, this is set to `NO`. */ @@ -109,59 +109,59 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { ///-------------------------------------- /** - @abstract The bitmask which specifies the enabled log in elements in the view. + The bitmask which specifies the enabled log in elements in the view. */ @property (nonatomic, assign, readonly) PFLogInFields fields; /** - @abstract The username text field. It is `nil` if the element is not enabled. + The username text field. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) PFTextField *usernameField; /** - @abstract The password text field. It is `nil` if the element is not enabled. + The password text field. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) PFTextField *passwordField; /** - @abstract The password forgotten button. It is `nil` if the element is not enabled. + The password forgotten button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *passwordForgottenButton; /** - @abstract The log in button. It is `nil` if the element is not enabled. + The log in button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *logInButton; /** - @abstract The Facebook button. It is `nil` if the element is not enabled. + The Facebook button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *facebookButton; /** - @abstract The Twitter button. It is `nil` if the element is not enabled. + The Twitter button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *twitterButton; /** - @abstract The sign up button. It is `nil` if the element is not enabled. + The sign up button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *signUpButton; /** - @abstract It is `nil` if the element is not enabled. + It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; /** - @abstract The facebook/twitter login label. + The facebook/twitter login label. @deprecated This property is deprecated and will always be nil. */ @property (nullable, nonatomic, strong, readonly) UILabel *externalLogInLabel __attribute__(PARSE_UI_DEPRECATED("This property is deprecated and will always be nil.")); /** - @abstract The sign up label. + The sign up label. @deprecated This property is deprecated and will always be nil. */ diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.h b/ParseUI/Classes/LogInViewController/PFLogInViewController.h index 1002e77..dc731c5 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.h +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.h @@ -40,7 +40,7 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract A bitmask specifying the log in elements which are enabled in the view. + A bitmask specifying the log in elements which are enabled in the view. @see PFLogInFields */ @@ -48,7 +48,7 @@ NS_ASSUME_NONNULL_BEGIN /** - @abstract The log in view. It contains all the enabled log in elements. + The log in view. It contains all the enabled log in elements. @see PFLogInView */ @@ -59,21 +59,21 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract The delegate that responds to the control events of `PFLogInViewController`. + The delegate that responds to the control events of `PFLogInViewController`. @see PFLogInViewControllerDelegate */ @property (nullable, nonatomic, weak) id delegate; /** - @abstract The facebook permissions that Facebook log in requests for. + The facebook permissions that Facebook log in requests for. @discussion If unspecified, the default is basic facebook permissions. */ @property (nullable, nonatomic, copy) NSArray *facebookPermissions; /** - @abstract The sign up controller if sign up is enabled. + The sign up controller if sign up is enabled. @discussion Use this to configure the sign up view, and the transition animation to the sign up view. The default is a sign up view with a username, a password, a dismiss button and a sign up button. @@ -81,7 +81,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nullable, nonatomic, strong) PFSignUpViewController *signUpController; /** - @abstract Whether to prompt for the email as username on the login view. + Whether to prompt for the email as username on the login view. @discussion If set to `YES`, we'll prompt for the email in the username field. This property value propagates to the attached . @@ -96,18 +96,18 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract The notification is posted immediately after the log in succeeds. + The notification is posted immediately after the log in succeeds. */ extern NSString *const PFLogInSuccessNotification; /** - @abstract The notification is posted immediately after the log in fails. + The notification is posted immediately after the log in fails. @discussion If the delegate prevents the log in from starting, the notification is not sent. */ extern NSString *const PFLogInFailureNotification; /** - @abstract The notification is posted immediately after the log in is cancelled. + The notification is posted immediately after the log in is cancelled. */ extern NSString *const PFLogInCancelNotification; @@ -128,7 +128,7 @@ extern NSString *const PFLogInCancelNotification; ///-------------------------------------- /** - @abstract Sent to the delegate to determine whether the log in request should be submitted to the server. + Sent to the delegate to determine whether the log in request should be submitted to the server. @param logInController The login view controller that is requesting the data. @param username the username the user tries to log in with. @@ -145,7 +145,7 @@ shouldBeginLogInWithUsername:(NSString *)username ///-------------------------------------- /** - @abstract Sent to the delegate when a is logged in. + Sent to the delegate when a is logged in. @param logInController The login view controller where login finished. @param user object that is a result of the login. @@ -153,7 +153,7 @@ shouldBeginLogInWithUsername:(NSString *)username - (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user; /** - @abstract Sent to the delegate when the log in attempt fails. + Sent to the delegate when the log in attempt fails. @discussion If you implement this method, PFLoginViewController will not automatically show its default login failure alert view. Instead, you should show your custom alert view in your implementation. @@ -165,7 +165,7 @@ shouldBeginLogInWithUsername:(NSString *)username didFailToLogInWithError:(nullable NSError *)error; /** - @abstract Sent to the delegate when the log in screen is cancelled. + Sent to the delegate when the log in screen is cancelled. @param logInController The login view controller where login was cancelled. */ diff --git a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h index 6e7457f..02d65ef 100644 --- a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h +++ b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h @@ -34,7 +34,7 @@ NS_ASSUME_NONNULL_BEGIN @interface PFProductTableViewController : PFQueryTableViewController /** - @abstract Initializes a product table view controller. + Initializes a product table view controller. @param style The UITableViewStyle for the table diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h index 0648d8d..0f24fd6 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h @@ -48,32 +48,32 @@ NS_ASSUME_NONNULL_BEGIN @interface PFQueryCollectionViewController : UICollectionViewController /** - @abstract The class name of the this collection will use as a datasource. + The class name of the this collection will use as a datasource. */ @property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; /** - @abstract Whether the collection should use the default loading view. Default - `YES`. + Whether the collection should use the default loading view. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL loadingViewEnabled; /** - @abstract Whether the collection should use the built-in pull-to-refresh feature. Default - `YES`. + Whether the collection should use the built-in pull-to-refresh feature. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL pullToRefreshEnabled; /** - @abstract Whether the collection should use the built-in pagination feature. Default - `YES`. + Whether the collection should use the built-in pagination feature. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL paginationEnabled; /** - @abstract The number of objects to show per page. Default - `25`. + The number of objects to show per page. Default - `25`. */ @property (nonatomic, assign) IBInspectable NSUInteger objectsPerPage; /** - @abstract Whether the collection is actively loading new data from the server. + Whether the collection is actively loading new data from the server. */ @property (nonatomic, assign, getter=isLoading) BOOL loading; @@ -82,7 +82,7 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract Initializes a view controller with a `UICollectionViewFlowLayout` and a class name + Initializes a view controller with a `UICollectionViewFlowLayout` and a class name of that will be associated with this collection. @param className The class name of the instances of that this table will display. @@ -92,7 +92,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithClassName:(nullable NSString *)className; /** - @abstract Initializes a view controller with a class name of that will be associated with this collection. + Initializes a view controller with a class name of that will be associated with this collection. @param layout Layout for collection view to use. @param className The class name of the instances of that this table will display. @@ -124,12 +124,12 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract The array of instances of that is used as a data source. + The array of instances of that is used as a data source. */ @property (nonatomic, copy, readonly) NSArray *objects; /** - @abstract Returns an object at a particular indexPath. + Returns an object at a particular indexPath. @discussion The default impementation returns the object at `indexPath.item`. If you want to return objects in a different indexPath order, like for sections, override this method. @@ -141,12 +141,12 @@ NS_ASSUME_NONNULL_BEGIN - (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; /** - @abstract Removes an object at the specified index path, animated. + Removes an object at the specified index path, animated. */ - (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath; /** - @abstract Removes all objects at the specified index paths, animated. + Removes all objects at the specified index paths, animated. */ - (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; @@ -155,14 +155,14 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract Clears the collection view and loads the first page of objects. + Clears the collection view and loads the first page of objects. @returns An awaitable task that completes when the reload succeeds */ - (BFTask *)loadObjects; /** - @abstract Loads the objects of the at the specified page and appends it to the + Loads the objects of the at the specified page and appends it to the objects already loaded and refreshes the collection. @param page The page of objects to load. @@ -173,12 +173,12 @@ NS_ASSUME_NONNULL_BEGIN - (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear; /** - @abstract Loads the next page of objects, appends to table, and refreshes. + Loads the next page of objects, appends to table, and refreshes. */ - (void)loadNextPage; /** - @abstract Clears the collection view of all objects. + Clears the collection view of all objects. */ - (void)clear; @@ -187,7 +187,7 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract Override to construct your own custom to get the objects. + Override to construct your own custom to get the objects. @returns An instance of that method will use to the objects for this collection. */ @@ -198,7 +198,7 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract Override this method to customize each cell given a that is loaded. + Override this method to customize each cell given a that is loaded. @warning The cell should inherit from which is a subclass of `UICollectionViewCell`. diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h index 300c59f..09bac77 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h @@ -50,7 +50,7 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract Initializes with a class name of the that will be associated with this table. + Initializes with a class name of the that will be associated with this table. @param style The UITableViewStyle for the table @param className The class name of the instances of that this table will display. @@ -61,7 +61,7 @@ NS_ASSUME_NONNULL_BEGIN className:(nullable NSString *)className NS_DESIGNATED_INITIALIZER; /** - @abstract Initializes with a class name of the PFObjects that will be associated with this table. + Initializes with a class name of the PFObjects that will be associated with this table. @param className The class name of the instances of that this table will display. @@ -74,53 +74,53 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract The class name of the this table will use as a datasource. + The class name of the this table will use as a datasource. */ @property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; /** - @abstract The key to use to display for the cell text label. + The key to use to display for the cell text label. @discussion This won't apply if you override */ @property (nullable, nonatomic, copy) IBInspectable NSString *textKey; /** - @abstract The key to use to display for the cell image view. + The key to use to display for the cell image view. @discussion This won't apply if you override */ @property (nullable, nonatomic, copy) IBInspectable NSString *imageKey; /** - @abstract The image to use as a placeholder for the cell images. + The image to use as a placeholder for the cell images. @discussion This won't apply if you override */ @property (nullable, nonatomic, strong) IBInspectable UIImage *placeholderImage; /** - @abstract Whether the table should use the default loading view. Default - `YES`. + Whether the table should use the default loading view. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL loadingViewEnabled; /** - @abstract Whether the table should use the built-in pull-to-refresh feature. Default - `YES`. + Whether the table should use the built-in pull-to-refresh feature. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL pullToRefreshEnabled; /** - @abstract Whether the table should use the built-in pagination feature. Default - `YES`. + Whether the table should use the built-in pagination feature. Default - `YES`. */ @property (nonatomic, assign) IBInspectable BOOL paginationEnabled; /** - @abstract The number of objects to show per page. Default - `25`. + The number of objects to show per page. Default - `25`. */ @property (nonatomic, assign) IBInspectable NSUInteger objectsPerPage; /** - @abstract Whether the table is actively loading new data from the server. + Whether the table is actively loading new data from the server. */ @property (nonatomic, assign, getter=isLoading) BOOL loading; @@ -146,12 +146,12 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract The array of instances of that is used as a data source. + The array of instances of that is used as a data source. */ @property (nullable, nonatomic, copy, readonly) NSArray *objects; /** - @abstract Returns an object at a particular indexPath. + Returns an object at a particular indexPath. @discussion The default impementation returns the object at `indexPath.row`. If you want to return objects in a different indexPath order, like for sections, override this method. @@ -163,39 +163,39 @@ NS_ASSUME_NONNULL_BEGIN - (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; /** - @abstract Removes an object at the specified index path, animated. + Removes an object at the specified index path, animated. */ - (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath; /** - @abstract Removes an object at the specified index path, with or without animation. + Removes an object at the specified index path, with or without animation. */ - (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated; /** - @abstract Removes all objects at the specified index paths, animated. + Removes all objects at the specified index paths, animated. */ - (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; /** - @abstract Removes all objects at the specified index paths, with or without animation. + Removes all objects at the specified index paths, with or without animation. */ - (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes animated:(BOOL)animated; /** - @abstract Clears the table of all objects. + Clears the table of all objects. */ - (void)clear; /** - @abstract Clears the table and loads the first page of objects. + Clears the table and loads the first page of objects. @returns An awaitable task that completes when the reload succeeds */ - (BFTask *)loadObjects; /** - @abstract Loads the objects of the className at the specified page and appends it to the + Loads the objects of the className at the specified page and appends it to the objects already loaded and refreshes the table. @param page The page of objects to load. @@ -206,7 +206,7 @@ NS_ASSUME_NONNULL_BEGIN - (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear; /** - @abstract Loads the next page of objects, appends to table, and refreshes. + Loads the next page of objects, appends to table, and refreshes. */ - (void)loadNextPage; @@ -225,7 +225,7 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract Override this method to customize each cell given a PFObject that is loaded. + Override this method to customize each cell given a PFObject that is loaded. @discussion If you don't override this method, it will use a default style cell and display either the first data key from the object, or it will display the key as specified with `textKey`, `imageKey`. diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpView.h b/ParseUI/Classes/SignUpViewController/PFSignUpView.h index cb53358..a69ea61 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpView.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpView.h @@ -61,7 +61,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { ///-------------------------------------- /** - @abstract Initializes the view with the specified sign up elements. + Initializes the view with the specified sign up elements. @param fields A bitmask specifying the sign up elements which are enabled in the view @@ -72,7 +72,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { - (instancetype)initWithFields:(PFSignUpFields)fields; /** - @abstract The view controller that will present this view. + The view controller that will present this view. @discussion Used to lay out elements correctly when the presenting view controller has translucent elements. */ @@ -83,7 +83,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { ///-------------------------------------- /** - @abstract The logo. By default, it is the Parse logo. + The logo. By default, it is the Parse logo. */ @property (nullable, nonatomic, strong) UIView *logo; @@ -92,7 +92,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { ///-------------------------------------- /** - @abstract If email should be used to log in, instead of username + If email should be used to log in, instead of username @discussion By default, this is set to `NO`. */ @@ -103,39 +103,39 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { ///-------------------------------------- /** - @abstract The bitmask which specifies the enabled sign up elements in the view + The bitmask which specifies the enabled sign up elements in the view */ @property (nonatomic, assign, readonly) PFSignUpFields fields; /** - @abstract The username text field. + The username text field. */ @property (nullable, nonatomic, strong, readonly) PFTextField *usernameField; /** - @abstract The password text field. + The password text field. */ @property (nullable, nonatomic, strong, readonly) PFTextField *passwordField; /** - @abstract The email text field. It is `nil` if the element is not enabled. + The email text field. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) PFTextField *emailField; /** - @abstract The additional text field. It is `nil` if the element is not enabled. + The additional text field. It is `nil` if the element is not enabled. @discussion This field is intended to be customized. */ @property (nullable, nonatomic, strong, readonly) PFTextField *additionalField; /** - @abstract The sign up button. It is `nil` if the element is not enabled. + The sign up button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *signUpButton; /** - @abstract The dismiss button. It is `nil` if the element is not enabled. + The dismiss button. It is `nil` if the element is not enabled. */ @property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h index 2e81225..dd33d2e 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h @@ -40,14 +40,14 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract A bitmask specifying the log in elements which are enabled in the view. + A bitmask specifying the log in elements which are enabled in the view. @see PFSignUpFields */ @property (nonatomic, assign) PFSignUpFields fields; /** - @abstract The sign up view. It contains all the enabled log in elements. + The sign up view. It contains all the enabled log in elements. @see PFSignUpView */ @@ -58,19 +58,19 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract The delegate that responds to the control events of `PFSignUpViewController`. + The delegate that responds to the control events of `PFSignUpViewController`. @see PFSignUpViewControllerDelegate */ @property (nullable, nonatomic, weak) id delegate; /** - @abstract Minimum required password length for user signups, defaults to `0`. + Minimum required password length for user signups, defaults to `0`. */ @property (nonatomic, assign) NSUInteger minPasswordLength; /** - @abstract Whether to use the email as username on the attached . + Whether to use the email as username on the attached . @discussion If set to `YES`, we'll hide the email field, prompt for the email in the username field, and save the email into both username and email @@ -85,19 +85,19 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - @abstract The notification is posted immediately after the sign up succeeds. + The notification is posted immediately after the sign up succeeds. */ extern NSString *const PFSignUpSuccessNotification; /** - @abstract The notification is posted immediately after the sign up fails. + The notification is posted immediately after the sign up fails. @discussion If the delegate prevents the sign up to start, the notification is not sent. */ extern NSString *const PFSignUpFailureNotification; /** - @abstract The notification is posted immediately after the user cancels sign up. + The notification is posted immediately after the user cancels sign up. */ extern NSString *const PFSignUpCancelNotification; @@ -118,7 +118,7 @@ extern NSString *const PFSignUpCancelNotification; ///-------------------------------------- /** - @abstract Sent to the delegate to determine whether the sign up request should be submitted to the server. + Sent to the delegate to determine whether the sign up request should be submitted to the server. @param signUpController The signup view controller that is requesting the data. @param info An `NSDictionary` instance which contains all sign up information that the user entered. @@ -132,7 +132,7 @@ extern NSString *const PFSignUpCancelNotification; ///-------------------------------------- /** - @abstract Sent to the delegate when a is signed up. + Sent to the delegate when a is signed up. @param signUpController The signup view controller where signup finished. @param user object that is a result of the sign up. @@ -140,7 +140,7 @@ extern NSString *const PFSignUpCancelNotification; - (void)signUpViewController:(PFSignUpViewController *)signUpController didSignUpUser:(PFUser *)user; /** - @abstract Sent to the delegate when the sign up attempt fails. + Sent to the delegate when the sign up attempt fails. @param signUpController The signup view controller where signup failed. @param error `NSError` object representing the error that occured. @@ -149,7 +149,7 @@ extern NSString *const PFSignUpCancelNotification; didFailToSignUpWithError:(nullable NSError *)error; /** - @abstract Sent to the delegate when the sign up screen is cancelled. + Sent to the delegate when the sign up screen is cancelled. @param signUpController The signup view controller where signup was cancelled. */ diff --git a/ParseUI/Classes/Views/PFImageView.h b/ParseUI/Classes/Views/PFImageView.h index fe208fc..bf37bf3 100644 --- a/ParseUI/Classes/Views/PFImageView.h +++ b/ParseUI/Classes/Views/PFImageView.h @@ -36,14 +36,14 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * @interface PFImageView : UIImageView /** - @abstract The remote file on Parse's server that stores the image. + The remote file on Parse's server that stores the image. @warning Note that the download does not start until is called. */ @property (nullable, nonatomic, strong) PFFile *file; /** - @abstract Initiate downloading of the remote image. + Initiate downloading of the remote image. @discussion Once the download completes, the remote image will be displayed. @@ -52,7 +52,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * - (BFTask *)loadInBackground; /** - @abstract Initiate downloading of the remote image. + Initiate downloading of the remote image. @discussion Once the download completes, the remote image will be displayed. @@ -61,7 +61,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * - (void)loadInBackground:(nullable PFImageViewImageResultBlock)completion; /** - @abstract Initiate downloading of the remote image. + Initiate downloading of the remote image. @discussion Once the download completes, the remote image will be displayed. diff --git a/ParseUI/Classes/Views/PFTextField.h b/ParseUI/Classes/Views/PFTextField.h index 39912ff..ab71943 100644 --- a/ParseUI/Classes/Views/PFTextField.h +++ b/ParseUI/Classes/Views/PFTextField.h @@ -47,7 +47,7 @@ typedef NS_OPTIONS(uint8_t, PFTextFieldSeparatorStyle){ @interface PFTextField : UITextField /** - @abstract Separator style bitmask that should be applied to this textfield. + Separator style bitmask that should be applied to this textfield. @discussion Default: @@ -56,7 +56,7 @@ typedef NS_OPTIONS(uint8_t, PFTextFieldSeparatorStyle){ @property (nonatomic, assign) PFTextFieldSeparatorStyle separatorStyle; /** - @abstract Color that should be used for the separators, if they are visible. + Color that should be used for the separators, if they are visible. @discussion Default: `227,227,227,1.0`. */ From 6d65439698f91b059d5525da9192019a74e1ed0a Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Tue, 1 Dec 2015 21:37:40 -0800 Subject: [PATCH 33/63] Remove discussion keyword from method documentation. --- ParseUI/Classes/Cells/PFCollectionViewCell.h | 2 +- ParseUI/Classes/LogInViewController/PFLogInView.h | 4 ++-- .../LogInViewController/PFLogInViewController.h | 10 +++++----- .../PFQueryCollectionViewController.h | 4 ++-- .../PFQueryTableViewController.h | 12 ++++++------ ParseUI/Classes/SignUpViewController/PFSignUpView.h | 6 +++--- .../SignUpViewController/PFSignUpViewController.h | 4 ++-- ParseUI/Classes/Views/PFImageView.h | 6 +++--- ParseUI/Classes/Views/PFTextField.h | 4 ++-- 9 files changed, 26 insertions(+), 26 deletions(-) diff --git a/ParseUI/Classes/Cells/PFCollectionViewCell.h b/ParseUI/Classes/Cells/PFCollectionViewCell.h index ae5e5bb..19c4dda 100644 --- a/ParseUI/Classes/Cells/PFCollectionViewCell.h +++ b/ParseUI/Classes/Cells/PFCollectionViewCell.h @@ -49,7 +49,7 @@ NS_ASSUME_NONNULL_BEGIN /** This method should update all the relevant information inside a subclass of `PFCollectionViewCell`. - @discussion This method is automatically called by whenever the cell + This method is automatically called by whenever the cell should display new information. By default this method does nothing. @param object An instance of `PFObject` to update from. diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.h b/ParseUI/Classes/LogInViewController/PFLogInView.h index be80724..2d0dc88 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.h +++ b/ParseUI/Classes/LogInViewController/PFLogInView.h @@ -82,7 +82,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { /** The view controller that will present this view. - @discussion Used to lay out elements correctly when the presenting view controller has translucent elements. + Used to lay out elements correctly when the presenting view controller has translucent elements. */ @property (nullable, nonatomic, weak) UIViewController *presentingViewController; @@ -100,7 +100,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { /** If email should be used to log in, instead of username - @discussion By default, this is set to `NO`. + By default, this is set to `NO`. */ @property (nonatomic, assign) BOOL emailAsUsername; diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.h b/ParseUI/Classes/LogInViewController/PFLogInViewController.h index dc731c5..8541581 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.h +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.h @@ -68,14 +68,14 @@ NS_ASSUME_NONNULL_BEGIN /** The facebook permissions that Facebook log in requests for. - @discussion If unspecified, the default is basic facebook permissions. + If unspecified, the default is basic facebook permissions. */ @property (nullable, nonatomic, copy) NSArray *facebookPermissions; /** The sign up controller if sign up is enabled. - @discussion Use this to configure the sign up view, and the transition animation to the sign up view. + Use this to configure the sign up view, and the transition animation to the sign up view. The default is a sign up view with a username, a password, a dismiss button and a sign up button. */ @property (nullable, nonatomic, strong) PFSignUpViewController *signUpController; @@ -83,7 +83,7 @@ NS_ASSUME_NONNULL_BEGIN /** Whether to prompt for the email as username on the login view. - @discussion If set to `YES`, we'll prompt for the email in the username field. + If set to `YES`, we'll prompt for the email in the username field. This property value propagates to the attached . By default, this is set to `NO`. */ @@ -102,7 +102,7 @@ extern NSString *const PFLogInSuccessNotification; /** The notification is posted immediately after the log in fails. - @discussion If the delegate prevents the log in from starting, the notification is not sent. + If the delegate prevents the log in from starting, the notification is not sent. */ extern NSString *const PFLogInFailureNotification; @@ -155,7 +155,7 @@ shouldBeginLogInWithUsername:(NSString *)username /** Sent to the delegate when the log in attempt fails. - @discussion If you implement this method, PFLoginViewController will not automatically show its default + If you implement this method, PFLoginViewController will not automatically show its default login failure alert view. Instead, you should show your custom alert view in your implementation. @param logInController The login view controller where login failed. diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h index 0f24fd6..892bff9 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h @@ -131,7 +131,7 @@ NS_ASSUME_NONNULL_BEGIN /** Returns an object at a particular indexPath. - @discussion The default impementation returns the object at `indexPath.item`. + The default impementation returns the object at `indexPath.item`. If you want to return objects in a different indexPath order, like for sections, override this method. @param indexPath An instance of `NSIndexPath`. @@ -213,7 +213,7 @@ NS_ASSUME_NONNULL_BEGIN object:(nullable PFObject *)object; /** - @discussion Override this method to customize the view that allows the user to load the + Override this method to customize the view that allows the user to load the next page when pagination is turned on. @param collectionView The collection view object associated with this controller. diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h index 09bac77..885479a 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h @@ -81,21 +81,21 @@ NS_ASSUME_NONNULL_BEGIN /** The key to use to display for the cell text label. - @discussion This won't apply if you override + This won't apply if you override */ @property (nullable, nonatomic, copy) IBInspectable NSString *textKey; /** The key to use to display for the cell image view. - @discussion This won't apply if you override + This won't apply if you override */ @property (nullable, nonatomic, copy) IBInspectable NSString *imageKey; /** The image to use as a placeholder for the cell images. - @discussion This won't apply if you override + This won't apply if you override */ @property (nullable, nonatomic, strong) IBInspectable UIImage *placeholderImage; @@ -153,7 +153,7 @@ NS_ASSUME_NONNULL_BEGIN /** Returns an object at a particular indexPath. - @discussion The default impementation returns the object at `indexPath.row`. + The default impementation returns the object at `indexPath.row`. If you want to return objects in a different indexPath order, like for sections, override this method. @param indexPath The indexPath. @@ -227,7 +227,7 @@ NS_ASSUME_NONNULL_BEGIN /** Override this method to customize each cell given a PFObject that is loaded. - @discussion If you don't override this method, it will use a default style cell and display either + If you don't override this method, it will use a default style cell and display either the first data key from the object, or it will display the key as specified with `textKey`, `imageKey`. @warning The cell should inherit from which is a subclass of `UITableViewCell`. @@ -243,7 +243,7 @@ NS_ASSUME_NONNULL_BEGIN object:(nullable PFObject *)object; /** - @discussion Override this method to customize the cell that allows the user to load the + Override this method to customize the cell that allows the user to load the next page when pagination is turned on. @param tableView The table view object associated with this controller. diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpView.h b/ParseUI/Classes/SignUpViewController/PFSignUpView.h index a69ea61..a50fb4b 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpView.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpView.h @@ -74,7 +74,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { /** The view controller that will present this view. - @discussion Used to lay out elements correctly when the presenting view controller has translucent elements. + Used to lay out elements correctly when the presenting view controller has translucent elements. */ @property (nullable, nonatomic, weak) UIViewController *presentingViewController; @@ -94,7 +94,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { /** If email should be used to log in, instead of username - @discussion By default, this is set to `NO`. + By default, this is set to `NO`. */ @property (nonatomic, assign) BOOL emailAsUsername; @@ -125,7 +125,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { /** The additional text field. It is `nil` if the element is not enabled. - @discussion This field is intended to be customized. + This field is intended to be customized. */ @property (nullable, nonatomic, strong, readonly) PFTextField *additionalField; diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h index dd33d2e..7f455e1 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h @@ -72,7 +72,7 @@ NS_ASSUME_NONNULL_BEGIN /** Whether to use the email as username on the attached . - @discussion If set to `YES`, we'll hide the email field, prompt for the email in + If set to `YES`, we'll hide the email field, prompt for the email in the username field, and save the email into both username and email fields on the new object. By default, this is set to `NO`. */ @@ -92,7 +92,7 @@ extern NSString *const PFSignUpSuccessNotification; /** The notification is posted immediately after the sign up fails. - @discussion If the delegate prevents the sign up to start, the notification is not sent. + If the delegate prevents the sign up to start, the notification is not sent. */ extern NSString *const PFSignUpFailureNotification; diff --git a/ParseUI/Classes/Views/PFImageView.h b/ParseUI/Classes/Views/PFImageView.h index bf37bf3..f03d526 100644 --- a/ParseUI/Classes/Views/PFImageView.h +++ b/ParseUI/Classes/Views/PFImageView.h @@ -45,7 +45,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * /** Initiate downloading of the remote image. - @discussion Once the download completes, the remote image will be displayed. + Once the download completes, the remote image will be displayed. @returns The task, that encapsulates the work being done. */ @@ -54,7 +54,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * /** Initiate downloading of the remote image. - @discussion Once the download completes, the remote image will be displayed. + Once the download completes, the remote image will be displayed. @param completion the completion block. */ @@ -63,7 +63,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * /** Initiate downloading of the remote image. - @discussion Once the download completes, the remote image will be displayed. + Once the download completes, the remote image will be displayed. @param completion the completion block. @param progressBlock called with the download progress as the image is being downloaded. diff --git a/ParseUI/Classes/Views/PFTextField.h b/ParseUI/Classes/Views/PFTextField.h index ab71943..f77e8dc 100644 --- a/ParseUI/Classes/Views/PFTextField.h +++ b/ParseUI/Classes/Views/PFTextField.h @@ -49,7 +49,7 @@ typedef NS_OPTIONS(uint8_t, PFTextFieldSeparatorStyle){ /** Separator style bitmask that should be applied to this textfield. - @discussion Default: + Default: @see PFTextFieldSeparatorStyle */ @@ -58,7 +58,7 @@ typedef NS_OPTIONS(uint8_t, PFTextFieldSeparatorStyle){ /** Color that should be used for the separators, if they are visible. - @discussion Default: `227,227,227,1.0`. + Default: `227,227,227,1.0`. */ @property (nullable, nonatomic, strong) UIColor *separatorColor UI_APPEARANCE_SELECTOR; From da4baf9a9e676182ec8e9cba257f26968329398d Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Tue, 1 Dec 2015 21:44:11 -0800 Subject: [PATCH 34/63] Replace returns with return keyword for method documentation. --- .../Classes/LogInViewController/PFLogInView.h | 2 +- .../LogInViewController/PFLogInViewController.h | 2 +- .../PFProductTableViewController.h | 2 +- .../PFQueryCollectionViewController.h | 16 ++++++++-------- .../PFQueryTableViewController.h | 14 +++++++------- .../Classes/SignUpViewController/PFSignUpView.h | 2 +- .../PFSignUpViewController.h | 2 +- ParseUI/Classes/Views/PFImageView.h | 2 +- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.h b/ParseUI/Classes/LogInViewController/PFLogInView.h index 2d0dc88..cd4ad25 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.h +++ b/ParseUI/Classes/LogInViewController/PFLogInView.h @@ -73,7 +73,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { @param fields A bitmask specifying the log in elements which are enabled in the view - @returns An initialized `PFLogInView` object or `nil` if the object couldn't be created. + @return An initialized `PFLogInView` object or `nil` if the object couldn't be created. @see PFLogInFields */ diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.h b/ParseUI/Classes/LogInViewController/PFLogInViewController.h index 8541581..d31ec32 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.h +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.h @@ -134,7 +134,7 @@ extern NSString *const PFLogInCancelNotification; @param username the username the user tries to log in with. @param password the password the user tries to log in with. - @returns A `BOOL` indicating whether the log in should proceed. + @return A `BOOL` indicating whether the log in should proceed. */ - (BOOL)logInViewController:(PFLogInViewController *)logInController shouldBeginLogInWithUsername:(NSString *)username diff --git a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h index 02d65ef..6ee0849 100644 --- a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h +++ b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h @@ -38,7 +38,7 @@ NS_ASSUME_NONNULL_BEGIN @param style The UITableViewStyle for the table - @returns An initialized `PFProductTableViewController` object or `nil` if the object couldn't be created. + @return An initialized `PFProductTableViewController` object or `nil` if the object couldn't be created. */ - (instancetype)initWithStyle:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER; diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h index 892bff9..74e1a19 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h @@ -87,7 +87,7 @@ NS_ASSUME_NONNULL_BEGIN @param className The class name of the instances of that this table will display. - @returns An initialized `PFQueryCollectionViewController` object or `nil` if the object couldn't be created. + @return An initialized `PFQueryCollectionViewController` object or `nil` if the object couldn't be created. */ - (instancetype)initWithClassName:(nullable NSString *)className; @@ -97,7 +97,7 @@ NS_ASSUME_NONNULL_BEGIN @param layout Layout for collection view to use. @param className The class name of the instances of that this table will display. - @returns An initialized `PFQueryCollectionViewController` object or `nil` if the object couldn't be created. + @return An initialized `PFQueryCollectionViewController` object or `nil` if the object couldn't be created. */ - (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout className:(nullable NSString *)className NS_DESIGNATED_INITIALIZER; @@ -136,7 +136,7 @@ NS_ASSUME_NONNULL_BEGIN @param indexPath An instance of `NSIndexPath`. - @returns The object at the specified indexPath. + @return The object at the specified indexPath. */ - (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; @@ -157,7 +157,7 @@ NS_ASSUME_NONNULL_BEGIN /** Clears the collection view and loads the first page of objects. - @returns An awaitable task that completes when the reload succeeds + @return An awaitable task that completes when the reload succeeds */ - (BFTask *)loadObjects; @@ -168,7 +168,7 @@ NS_ASSUME_NONNULL_BEGIN @param page The page of objects to load. @param clear Whether to clear the collection view after receiving the objects. - @returns An awaitable task that completes when the reload succeeds + @return An awaitable task that completes when the reload succeeds */ - (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear; @@ -189,7 +189,7 @@ NS_ASSUME_NONNULL_BEGIN /** Override to construct your own custom to get the objects. - @returns An instance of that method will use to the objects for this collection. + @return An instance of `PFQuery` that `-loadObjects` method will use to the objects for this collection. */ - (PFQuery *)queryForCollection; @@ -206,7 +206,7 @@ NS_ASSUME_NONNULL_BEGIN @param indexPath The indexPath of the cell. @param object The that is associated with the cell. - @returns The cell that represents this object. + @return The cell that represents this object. */ - (nullable PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath @@ -218,7 +218,7 @@ NS_ASSUME_NONNULL_BEGIN @param collectionView The collection view object associated with this controller. - @returns The view that allows the user to paginate. + @return The view that allows the user to paginate. */ - (nullable UICollectionReusableView *)collectionViewReusableViewForNextPageAction:(UICollectionView *)collectionView; diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h index 885479a..9205759 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h @@ -55,7 +55,7 @@ NS_ASSUME_NONNULL_BEGIN @param style The UITableViewStyle for the table @param className The class name of the instances of that this table will display. - @returns An initialized `PFQueryTableViewController` object or `nil` if the object couldn't be created. + @return An initialized `PFQueryTableViewController` object or `nil` if the object couldn't be created. */ - (instancetype)initWithStyle:(UITableViewStyle)style className:(nullable NSString *)className NS_DESIGNATED_INITIALIZER; @@ -65,7 +65,7 @@ NS_ASSUME_NONNULL_BEGIN @param className The class name of the instances of that this table will display. - @returns An initialized `PFQueryTableViewController` object or `nil` if the object couldn't be created. + @return An initialized `PFQueryTableViewController` object or `nil` if the object couldn't be created. */ - (instancetype)initWithClassName:(nullable NSString *)className; @@ -158,7 +158,7 @@ NS_ASSUME_NONNULL_BEGIN @param indexPath The indexPath. - @returns The object at the specified index + @return The object at the specified index */ - (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; @@ -190,7 +190,7 @@ NS_ASSUME_NONNULL_BEGIN /** Clears the table and loads the first page of objects. - @returns An awaitable task that completes when the reload succeeds + @return An awaitable task that completes when the reload succeeds */ - (BFTask *)loadObjects; @@ -201,7 +201,7 @@ NS_ASSUME_NONNULL_BEGIN @param page The page of objects to load. @param clear Whether to clear the table after receiving the objects - @returns An awaitable task that completes when the reload succeeds + @return An awaitable task that completes when the reload succeeds */ - (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear; @@ -236,7 +236,7 @@ NS_ASSUME_NONNULL_BEGIN @param indexPath The indexPath of the cell. @param object The PFObject that is associated with the cell. - @returns The cell that represents this object. + @return The cell that represents this object. */ - (nullable PFTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath @@ -249,7 +249,7 @@ NS_ASSUME_NONNULL_BEGIN @param tableView The table view object associated with this controller. @param indexPath The indexPath of the cell. - @returns The cell that allows the user to paginate. + @return The cell that allows the user to paginate. */ - (nullable PFTableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath; diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpView.h b/ParseUI/Classes/SignUpViewController/PFSignUpView.h index a50fb4b..891472a 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpView.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpView.h @@ -65,7 +65,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { @param fields A bitmask specifying the sign up elements which are enabled in the view - @returns An initialized `PFSignUpView` object or `nil` if the object couldn't be created. + @return An initialized `PFSignUpView` object or `nil` if the object couldn't be created. @see PFSignUpFields */ diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h index 7f455e1..0b34d83 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h @@ -123,7 +123,7 @@ extern NSString *const PFSignUpCancelNotification; @param signUpController The signup view controller that is requesting the data. @param info An `NSDictionary` instance which contains all sign up information that the user entered. - @returns A `BOOL` indicating whether the sign up should proceed. + @return A `BOOL` indicating whether the sign up should proceed. */ - (BOOL)signUpViewController:(PFSignUpViewController *)signUpController shouldBeginSignUp:(NSDictionary *)info; diff --git a/ParseUI/Classes/Views/PFImageView.h b/ParseUI/Classes/Views/PFImageView.h index f03d526..19f58c9 100644 --- a/ParseUI/Classes/Views/PFImageView.h +++ b/ParseUI/Classes/Views/PFImageView.h @@ -47,7 +47,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * Once the download completes, the remote image will be displayed. - @returns The task, that encapsulates the work being done. + @return The task, that encapsulates the work being done. */ - (BFTask *)loadInBackground; From d4ecd79f9497c5589592475dbfd30d46c742f5b4 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Tue, 1 Dec 2015 21:43:44 -0800 Subject: [PATCH 35/63] Update style of cross link annotations in all of the documentation. --- ParseUI/Classes/Cells/PFCollectionViewCell.h | 2 +- .../Classes/Cells/PFPurchaseTableViewCell.h | 12 ++++----- ParseUI/Classes/Cells/PFTableViewCell.h | 6 ++--- .../Classes/LogInViewController/PFLogInView.h | 2 +- .../PFLogInViewController.h | 10 +++---- .../PFQueryCollectionViewController.h | 26 +++++++++---------- .../PFQueryTableViewController.h | 20 +++++++------- .../SignUpViewController/PFSignUpView.h | 2 +- .../PFSignUpViewController.h | 12 ++++----- ParseUI/Classes/Views/PFImageView.h | 2 +- ParseUI/Classes/Views/PFTextField.h | 2 +- 11 files changed, 48 insertions(+), 48 deletions(-) diff --git a/ParseUI/Classes/Cells/PFCollectionViewCell.h b/ParseUI/Classes/Cells/PFCollectionViewCell.h index 19c4dda..9abb31e 100644 --- a/ParseUI/Classes/Cells/PFCollectionViewCell.h +++ b/ParseUI/Classes/Cells/PFCollectionViewCell.h @@ -49,7 +49,7 @@ NS_ASSUME_NONNULL_BEGIN /** This method should update all the relevant information inside a subclass of `PFCollectionViewCell`. - This method is automatically called by whenever the cell + This method is automatically called by `PFQueryCollectionViewController` whenever the cell should display new information. By default this method does nothing. @param object An instance of `PFObject` to update from. diff --git a/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h b/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h index b82d522..88e0e85 100644 --- a/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h +++ b/ParseUI/Classes/Cells/PFPurchaseTableViewCell.h @@ -27,8 +27,8 @@ NS_ASSUME_NONNULL_BEGIN /** - An enum that represents states of the PFPurchaseTableViewCell. - @see PFPurchaseTableViewCell + An enum that represents states of the `PFPurchaseTableViewCell`. + @see `PFPurchaseTableViewCell` */ typedef NS_ENUM(uint8_t, PFPurchaseTableViewCellState) { /** Normal state of the cell. */ @@ -40,16 +40,16 @@ typedef NS_ENUM(uint8_t, PFPurchaseTableViewCellState) { }; /** - `PFPurchaseTableViewCell` is a subclass that is used to show - products in a . + `PFPurchaseTableViewCell` is a subclass `PFTableViewCell` that is used to show + products in a `PFProductTableViewController`. - @see PFProductTableViewController + @see `PFProductTableViewController` */ @interface PFPurchaseTableViewCell : PFTableViewCell /** State of the cell. - @see PFPurchaseTableViewCellState + @see `PFPurchaseTableViewCellState` */ @property (nonatomic, assign) PFPurchaseTableViewCellState state; diff --git a/ParseUI/Classes/Cells/PFTableViewCell.h b/ParseUI/Classes/Cells/PFTableViewCell.h index 9714162..fe62c78 100644 --- a/ParseUI/Classes/Cells/PFTableViewCell.h +++ b/ParseUI/Classes/Cells/PFTableViewCell.h @@ -29,15 +29,15 @@ NS_ASSUME_NONNULL_BEGIN /** The `PFTableViewCell` class represents a table view cell which can download and display remote images stored on Parse. - When used in a - downloading and displaying of the remote images - are automatically managed by the . + When used in a `PFQueryTableViewController` - downloading and + displaying of the remote images are automatically managed by the controller. */ @interface PFTableViewCell : UITableViewCell /** The imageView of the table view cell. - @see PFImageView + @see `PFImageView` */ @property (nullable, nonatomic, strong, readonly) PFImageView *imageView; diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.h b/ParseUI/Classes/LogInViewController/PFLogInView.h index cd4ad25..624fa7d 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.h +++ b/ParseUI/Classes/LogInViewController/PFLogInView.h @@ -60,7 +60,7 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { @class PFTextField; /** - The `PFLogInView` class provides a standard log in interface for authenticating a . + The `PFLogInView` class provides a standard log in interface for authenticating a `PFUser`. */ @interface PFLogInView : UIScrollView diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.h b/ParseUI/Classes/LogInViewController/PFLogInViewController.h index d31ec32..e952f8d 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.h +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.h @@ -31,7 +31,7 @@ NS_ASSUME_NONNULL_BEGIN @protocol PFLogInViewControllerDelegate; /** - The `PFLogInViewController` class presents and manages a standard authentication interface for logging in a . + The `PFLogInViewController` class presents and manages a standard authentication interface for logging in a `PFUser`. */ @interface PFLogInViewController : UIViewController @@ -84,7 +84,7 @@ NS_ASSUME_NONNULL_BEGIN Whether to prompt for the email as username on the login view. If set to `YES`, we'll prompt for the email in the username field. - This property value propagates to the attached . + This property value propagates to the attached `signUpController`. By default, this is set to `NO`. */ @property (nonatomic, assign) BOOL emailAsUsername; @@ -116,7 +116,7 @@ extern NSString *const PFLogInCancelNotification; ///-------------------------------------- /** - The `PFLogInViewControllerDelegate` protocol defines methods a delegate of a should implement. + The `PFLogInViewControllerDelegate` protocol defines methods a delegate of a `PFLogInViewController` should implement. All methods of this protocol are optional. */ @protocol PFLogInViewControllerDelegate @@ -145,10 +145,10 @@ shouldBeginLogInWithUsername:(NSString *)username ///-------------------------------------- /** - Sent to the delegate when a is logged in. + Sent to the delegate when a `PFUser` is logged in. @param logInController The login view controller where login finished. - @param user object that is a result of the login. + @param user `PFUser` object that is a result of the login. */ - (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user; diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h index 74e1a19..e7ac8aa 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h @@ -31,7 +31,7 @@ NS_ASSUME_NONNULL_BEGIN @class PFQuery; /** - This class allows you to think about a one-to-one mapping between a and a `UICollectionViewCell`, + This class allows you to think about a one-to-one mapping between a `PFObject` and a `UICollectionViewCell`, rather than having to juggle index paths. You also get the following features out of the box: @@ -43,12 +43,12 @@ NS_ASSUME_NONNULL_BEGIN - Automatic loading and management of the objects array. - Various methods that can be overridden to customize behavior at major events in the data cycle. - @see PFCollectionViewCell + @see `PFCollectionViewCell` */ @interface PFQueryCollectionViewController : UICollectionViewController /** - The class name of the this collection will use as a datasource. + The class name of the `PFObject` this collection will use as a datasource. */ @property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; @@ -83,19 +83,19 @@ NS_ASSUME_NONNULL_BEGIN /** Initializes a view controller with a `UICollectionViewFlowLayout` and a class name - of that will be associated with this collection. + of `PFObject` that will be associated with this collection. - @param className The class name of the instances of that this table will display. + @param className The class name of the instances of `PFObject` that this table will display. @return An initialized `PFQueryCollectionViewController` object or `nil` if the object couldn't be created. */ - (instancetype)initWithClassName:(nullable NSString *)className; /** - Initializes a view controller with a class name of that will be associated with this collection. + Initializes a view controller with a class name of `PFObject` that will be associated with this collection. @param layout Layout for collection view to use. - @param className The class name of the instances of that this table will display. + @param className The class name of the instances of `PFObject` that this table will display. @return An initialized `PFQueryCollectionViewController` object or `nil` if the object couldn't be created. */ @@ -124,7 +124,7 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - The array of instances of that is used as a data source. + The array of instances of `PFObject` that is used as a data source. */ @property (nonatomic, copy, readonly) NSArray *objects; @@ -162,7 +162,7 @@ NS_ASSUME_NONNULL_BEGIN - (BFTask *)loadObjects; /** - Loads the objects of the at the specified page and appends it to the + Loads the objects of the `PFObject.parseClassName` at the specified page and appends it to the objects already loaded and refreshes the collection. @param page The page of objects to load. @@ -187,7 +187,7 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - Override to construct your own custom to get the objects. + Override to construct your own custom `PFQuery` to get the objects. @return An instance of `PFQuery` that `-loadObjects` method will use to the objects for this collection. */ @@ -198,13 +198,13 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - Override this method to customize each cell given a that is loaded. + Override this method to customize each cell given a `PFObject` that is loaded. - @warning The cell should inherit from which is a subclass of `UICollectionViewCell`. + @warning The cell should inherit from `PFCollectionViewCell` which is a subclass of `UICollectionViewCell`. @param collectionView The collection view object associated with this controller. @param indexPath The indexPath of the cell. - @param object The that is associated with the cell. + @param object The `PFObject` that is associated with the cell. @return The cell that represents this object. */ diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h index 9205759..e8b3e0d 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h @@ -31,7 +31,7 @@ NS_ASSUME_NONNULL_BEGIN @class PFTableViewCell; /** - This class allows you to think about a one-to-one mapping between a and a `UITableViewCell`, + This class allows you to think about a one-to-one mapping between a `PFObject` and a `UITableViewCell`, rather than having to juggle index paths. You also get the following features out of the box: @@ -50,10 +50,10 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - Initializes with a class name of the that will be associated with this table. + Initializes with a class name of the `PFObject` that will be associated with this table. @param style The UITableViewStyle for the table - @param className The class name of the instances of that this table will display. + @param className The class name of the instances of `PFObject` that this table will display. @return An initialized `PFQueryTableViewController` object or `nil` if the object couldn't be created. */ @@ -63,7 +63,7 @@ NS_ASSUME_NONNULL_BEGIN /** Initializes with a class name of the PFObjects that will be associated with this table. - @param className The class name of the instances of that this table will display. + @param className The class name of the instances of `PFObject` that this table will display. @return An initialized `PFQueryTableViewController` object or `nil` if the object couldn't be created. */ @@ -74,28 +74,28 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - The class name of the this table will use as a datasource. + The class name of the `PFObject` this table will use as a datasource. */ @property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; /** The key to use to display for the cell text label. - This won't apply if you override + This won't apply if you override `-tableView:cellForRowAtIndexPath:object:` */ @property (nullable, nonatomic, copy) IBInspectable NSString *textKey; /** The key to use to display for the cell image view. - This won't apply if you override + This won't apply if you override `-tableView:cellForRowAtIndexPath:object:` */ @property (nullable, nonatomic, copy) IBInspectable NSString *imageKey; /** The image to use as a placeholder for the cell images. - This won't apply if you override + This won't apply if you override `-tableView:cellForRowAtIndexPath:object:` */ @property (nullable, nonatomic, strong) IBInspectable UIImage *placeholderImage; @@ -146,7 +146,7 @@ NS_ASSUME_NONNULL_BEGIN ///-------------------------------------- /** - The array of instances of that is used as a data source. + The array of instances of `PFObject` that is used as a data source. */ @property (nullable, nonatomic, copy, readonly) NSArray *objects; @@ -230,7 +230,7 @@ NS_ASSUME_NONNULL_BEGIN If you don't override this method, it will use a default style cell and display either the first data key from the object, or it will display the key as specified with `textKey`, `imageKey`. - @warning The cell should inherit from which is a subclass of `UITableViewCell`. + @warning The cell should inherit from `PFTableViewCell` which is a subclass of `UITableViewCell`. @param tableView The table view object associated with this controller. @param indexPath The indexPath of the cell. diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpView.h b/ParseUI/Classes/SignUpViewController/PFSignUpView.h index 891472a..e638327 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpView.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpView.h @@ -52,7 +52,7 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { @class PFTextField; /** - The `PFSignUpView` class provides a standard sign up interface for authenticating a . + The `PFSignUpView` class provides a standard sign up interface for authenticating a `PFUser`. */ @interface PFSignUpView : UIScrollView diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h index 0b34d83..2d9c7e9 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h @@ -31,7 +31,7 @@ NS_ASSUME_NONNULL_BEGIN /** The `PFSignUpViewController` class that presents and manages - a standard authentication interface for signing up a . + a standard authentication interface for signing up a `PFUser`. */ @interface PFSignUpViewController : UIViewController @@ -70,11 +70,11 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) NSUInteger minPasswordLength; /** - Whether to use the email as username on the attached . + Whether to use the email as username on the attached `signUpView`. If set to `YES`, we'll hide the email field, prompt for the email in the username field, and save the email into both username and email - fields on the new object. By default, this is set to `NO`. + fields on the new `PFUser` object. By default, this is set to `NO`. */ @property (nonatomic, assign) BOOL emailAsUsername; @@ -106,7 +106,7 @@ extern NSString *const PFSignUpCancelNotification; ///-------------------------------------- /** - The `PFLogInViewControllerDelegate` protocol defines methods a delegate of a should implement. + The `PFLogInViewControllerDelegate` protocol defines methods a delegate of a `PFSignUpViewController` should implement. All methods of this protocol are optional. */ @protocol PFSignUpViewControllerDelegate @@ -132,10 +132,10 @@ extern NSString *const PFSignUpCancelNotification; ///-------------------------------------- /** - Sent to the delegate when a is signed up. + Sent to the delegate when a `PFUser` is signed up. @param signUpController The signup view controller where signup finished. - @param user object that is a result of the sign up. + @param user `PFUser` object that is a result of the sign up. */ - (void)signUpViewController:(PFSignUpViewController *)signUpController didSignUpUser:(PFUser *)user; diff --git a/ParseUI/Classes/Views/PFImageView.h b/ParseUI/Classes/Views/PFImageView.h index 19f58c9..e5eea45 100644 --- a/ParseUI/Classes/Views/PFImageView.h +++ b/ParseUI/Classes/Views/PFImageView.h @@ -38,7 +38,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * /** The remote file on Parse's server that stores the image. - @warning Note that the download does not start until is called. + @warning Note that the download does not start until `-loadInBackground:` is called. */ @property (nullable, nonatomic, strong) PFFile *file; diff --git a/ParseUI/Classes/Views/PFTextField.h b/ParseUI/Classes/Views/PFTextField.h index f77e8dc..4e6f878 100644 --- a/ParseUI/Classes/Views/PFTextField.h +++ b/ParseUI/Classes/Views/PFTextField.h @@ -49,7 +49,7 @@ typedef NS_OPTIONS(uint8_t, PFTextFieldSeparatorStyle){ /** Separator style bitmask that should be applied to this textfield. - Default: + Default: `PFTextFieldSeparatorStyleNone` @see PFTextFieldSeparatorStyle */ From 197d64b406c1fe56a0be9c338da6ca1f5d5b8f7c Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Fri, 4 Dec 2015 18:12:46 -0800 Subject: [PATCH 36/63] Add generic types to PFImageView. --- ParseUI/Classes/Views/PFImageView.h | 6 ++++-- ParseUI/Classes/Views/PFImageView.m | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ParseUI/Classes/Views/PFImageView.h b/ParseUI/Classes/Views/PFImageView.h index e5eea45..adabf56 100644 --- a/ParseUI/Classes/Views/PFImageView.h +++ b/ParseUI/Classes/Views/PFImageView.h @@ -21,13 +21,15 @@ #import +#import + #import NS_ASSUME_NONNULL_BEGIN typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError *__nullable error); -@class BFTask; +@class BFTask PF_GENERIC(__covariant BFGenericType); @class PFFile; /** @@ -49,7 +51,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * @return The task, that encapsulates the work being done. */ -- (BFTask *)loadInBackground; +- (BFTask PF_GENERIC(UIImage *)*)loadInBackground; /** Initiate downloading of the remote image. diff --git a/ParseUI/Classes/Views/PFImageView.m b/ParseUI/Classes/Views/PFImageView.m index fe44076..ea8d2eb 100644 --- a/ParseUI/Classes/Views/PFImageView.m +++ b/ParseUI/Classes/Views/PFImageView.m @@ -47,8 +47,8 @@ - (void)setFile:(PFFile *)otherFile { #pragma mark - #pragma mark Load -- (BFTask *)loadInBackground { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; +- (BFTask PF_GENERIC(UIImage *)*)loadInBackground { + BFTaskCompletionSource PF_GENERIC(UIImage *)*source = [BFTaskCompletionSource taskCompletionSource]; [self loadInBackground:^(UIImage *image, NSError *error) { if (error) { [source trySetError:error]; From cec121a69eacbd11352ec82536b93bce621cdb85 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Fri, 4 Dec 2015 18:14:43 -0800 Subject: [PATCH 37/63] Add generic types to public API of PFLogInViewController. --- .../Classes/LogInViewController/PFLogInViewController.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.h b/ParseUI/Classes/LogInViewController/PFLogInViewController.h index e952f8d..0c63fcb 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.h +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.h @@ -21,6 +21,8 @@ #import +#import + #import #import @@ -70,7 +72,7 @@ NS_ASSUME_NONNULL_BEGIN If unspecified, the default is basic facebook permissions. */ -@property (nullable, nonatomic, copy) NSArray *facebookPermissions; +@property (nullable, nonatomic, copy) NSArray PF_GENERIC(NSString *)*facebookPermissions; /** The sign up controller if sign up is enabled. @@ -161,8 +163,7 @@ shouldBeginLogInWithUsername:(NSString *)username @param logInController The login view controller where login failed. @param error `NSError` object representing the error that occured. */ -- (void)logInViewController:(PFLogInViewController *)logInController - didFailToLogInWithError:(nullable NSError *)error; +- (void)logInViewController:(PFLogInViewController *)logInController didFailToLogInWithError:(nullable NSError *)error; /** Sent to the delegate when the log in screen is cancelled. From b7d6ee1c7ce3872af1050935a93e9eee7101e3bc Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Fri, 4 Dec 2015 18:14:51 -0800 Subject: [PATCH 38/63] Add generic types to public API of PFSignUpViewController. --- .../Classes/SignUpViewController/PFSignUpViewController.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h index 2d9c7e9..e9baf62 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h @@ -21,6 +21,8 @@ #import +#import + #import #import @@ -125,7 +127,7 @@ extern NSString *const PFSignUpCancelNotification; @return A `BOOL` indicating whether the sign up should proceed. */ -- (BOOL)signUpViewController:(PFSignUpViewController *)signUpController shouldBeginSignUp:(NSDictionary *)info; +- (BOOL)signUpViewController:(PFSignUpViewController *)signUpController shouldBeginSignUp:(NSDictionary PF_GENERIC(NSString *,NSString *)*)info; ///-------------------------------------- /// @name Responding to Actions @@ -145,8 +147,7 @@ extern NSString *const PFSignUpCancelNotification; @param signUpController The signup view controller where signup failed. @param error `NSError` object representing the error that occured. */ -- (void)signUpViewController:(PFSignUpViewController *)signUpController - didFailToSignUpWithError:(nullable NSError *)error; +- (void)signUpViewController:(PFSignUpViewController *)signUpController didFailToSignUpWithError:(nullable NSError *)error; /** Sent to the delegate when the sign up screen is cancelled. From d60791e57d21330c18b64e2639ee7a3ad92ce9f3 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Fri, 4 Dec 2015 18:15:30 -0800 Subject: [PATCH 39/63] Add generic types to public API of PFQueryTableViewController. --- .../PFQueryTableViewController.h | 20 +++++++++---------- .../PFQueryTableViewController.m | 8 ++++---- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h index e8b3e0d..917b102 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h @@ -21,11 +21,12 @@ #import +#import #import NS_ASSUME_NONNULL_BEGIN -@class BFTask; +@class BFTask PF_GENERIC(__covariant BFGenericType); @class PFObject; @class PFQuery; @class PFTableViewCell; @@ -148,7 +149,7 @@ NS_ASSUME_NONNULL_BEGIN /** The array of instances of `PFObject` that is used as a data source. */ -@property (nullable, nonatomic, copy, readonly) NSArray *objects; +@property (nullable, nonatomic, copy, readonly) NSArray PF_GENERIC(__kindof PFObject *)*objects; /** Returns an object at a particular indexPath. @@ -175,12 +176,12 @@ NS_ASSUME_NONNULL_BEGIN /** Removes all objects at the specified index paths, animated. */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; +- (void)removeObjectsAtIndexPaths:(nullable NSArray PF_GENERIC(NSIndexPath *)*)indexPaths; /** Removes all objects at the specified index paths, with or without animation. */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes animated:(BOOL)animated; +- (void)removeObjectsAtIndexPaths:(nullable NSArray PF_GENERIC(NSIndexPath *)*)indexPaths animated:(BOOL)animated; /** Clears the table of all objects. @@ -192,7 +193,7 @@ NS_ASSUME_NONNULL_BEGIN @return An awaitable task that completes when the reload succeeds */ -- (BFTask *)loadObjects; +- (BFTask PF_GENERIC(NSArray<__kindof PFObject *> *)*)loadObjects; /** Loads the objects of the className at the specified page and appends it to the @@ -203,7 +204,7 @@ NS_ASSUME_NONNULL_BEGIN @return An awaitable task that completes when the reload succeeds */ -- (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear; +- (BFTask PF_GENERIC(NSArray<__kindof PFObject *> *)*)loadObjects:(NSInteger)page clear:(BOOL)clear; /** Loads the next page of objects, appends to table, and refreshes. @@ -239,8 +240,8 @@ NS_ASSUME_NONNULL_BEGIN @return The cell that represents this object. */ - (nullable PFTableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(nullable PFObject *)object; + cellForRowAtIndexPath:(NSIndexPath *)indexPath + object:(nullable PFObject *)object; /** Override this method to customize the cell that allows the user to load the @@ -251,8 +252,7 @@ NS_ASSUME_NONNULL_BEGIN @return The cell that allows the user to paginate. */ -- (nullable PFTableViewCell *)tableView:(UITableView *)tableView - cellForNextPageAtIndexPath:(NSIndexPath *)indexPath; +- (nullable PFTableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath; @end diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m index bfb5d83..d07a461 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m @@ -45,7 +45,7 @@ - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibB @end @interface PFQueryTableViewController () { - NSMutableArray *_mutableObjects; + NSMutableArray PF_GENERIC(PFObject *)*_mutableObjects; BOOL _firstLoad; // Whether we have loaded the first set of objects NSInteger _currentPage; // The last page that was loaded @@ -212,11 +212,11 @@ - (void)clear { _currentPage = 0; } -- (BFTask *)loadObjects { +- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects { return [self loadObjects:0 clear:YES]; } -- (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear { +- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects:(NSInteger)page clear:(BOOL)clear { self.loading = YES; [self objectsWillLoad]; @@ -554,7 +554,7 @@ - (void)_refreshControlValueChanged:(UIRefreshControl *)refreshControl { #pragma mark - #pragma mark Accessors -- (NSArray *)objects { +- (NSArray PF_GENERIC(__kindof PFObject *)*)objects { return _mutableObjects; } From 29bb9fd21785c173b5cc0d56f7c15bd8922d1cd0 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Fri, 4 Dec 2015 18:15:44 -0800 Subject: [PATCH 40/63] Add generic types to public API of PFQueryCollectionViewController. --- .../PFQueryCollectionViewController.h | 15 ++++++++------- .../PFQueryCollectionViewController.m | 6 +++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h index e7ac8aa..1c0b73a 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h @@ -21,11 +21,12 @@ #import +#import #import NS_ASSUME_NONNULL_BEGIN -@class BFTask; +@class BFTask PF_GENERIC(__covariant BFGenericType); @class PFCollectionViewCell; @class PFObject; @class PFQuery; @@ -126,7 +127,7 @@ NS_ASSUME_NONNULL_BEGIN /** The array of instances of `PFObject` that is used as a data source. */ -@property (nonatomic, copy, readonly) NSArray *objects; +@property (nonatomic, copy, readonly) NSArray PF_GENERIC(__kindof PFObject *)*objects; /** Returns an object at a particular indexPath. @@ -148,7 +149,7 @@ NS_ASSUME_NONNULL_BEGIN /** Removes all objects at the specified index paths, animated. */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; +- (void)removeObjectsAtIndexPaths:(nullable NSArray PF_GENERIC(NSIndexPath *)*)indexes; ///-------------------------------------- /// @name Loading Data @@ -159,7 +160,7 @@ NS_ASSUME_NONNULL_BEGIN @return An awaitable task that completes when the reload succeeds */ -- (BFTask *)loadObjects; +- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects; /** Loads the objects of the `PFObject.parseClassName` at the specified page and appends it to the @@ -170,7 +171,7 @@ NS_ASSUME_NONNULL_BEGIN @return An awaitable task that completes when the reload succeeds */ -- (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear; +- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects:(NSInteger)page clear:(BOOL)clear; /** Loads the next page of objects, appends to table, and refreshes. @@ -209,8 +210,8 @@ NS_ASSUME_NONNULL_BEGIN @return The cell that represents this object. */ - (nullable PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(nullable PFObject *)object; + cellForItemAtIndexPath:(NSIndexPath *)indexPath + object:(nullable PFObject *)object; /** Override this method to customize the view that allows the user to load the diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m index 2ca9442..429887b 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m @@ -36,7 +36,7 @@ static NSString *const PFQueryCollectionViewNextPageReusableViewIdentifier = @"nextPageView"; @interface PFQueryCollectionViewController () { - NSMutableArray *_mutableObjects; + NSMutableArray PF_GENERIC(PFObject *)*_mutableObjects; BOOL _firstLoad; // Whether we have loaded the first set of objects NSInteger _currentPage; // The last page that was loaded @@ -226,11 +226,11 @@ - (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths { #pragma mark - #pragma mark Loading Data -- (BFTask *)loadObjects { +- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects { return [self loadObjects:0 clear:YES]; } -- (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear { +- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects:(NSInteger)page clear:(BOOL)clear { self.loading = YES; [self objectsWillLoad]; From f653e1f8c26316add9e931dda88e1f2c02a048dd Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Fri, 4 Dec 2015 18:18:32 -0800 Subject: [PATCH 41/63] Fix never succesfully completed task of -loadObjects in Query/Collection View Controllers. --- .../PFQueryCollectionViewController.m | 11 +++++++---- .../PFQueryTableViewController.m | 10 +++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m index 2ca9442..6b87638 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m @@ -234,10 +234,10 @@ - (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear { self.loading = YES; [self objectsWillLoad]; - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - PFQuery *query = [self queryForCollection]; [self _alterQuery:query forLoadingPage:page]; + + BFTaskCompletionSource PF_GENERIC(NSArray<__kindof PFObject *>*)*source = [BFTaskCompletionSource taskCompletionSource]; [query findObjectsInBackgroundWithBlock:^(NSArray *foundObjects, NSError *error) { if (![Parse isLocalDatastoreEnabled] && query.cachePolicy != kPFCachePolicyCacheOnly && @@ -266,9 +266,12 @@ - (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear { [self objectsDidLoad:error]; [self.refreshControl endRefreshing]; - [source setError:error]; + if (error) { + [source trySetError:error]; + } else { + [source trySetResult:foundObjects]; + } }]; - return source.task; } diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m index bfb5d83..d8b58d2 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m @@ -220,10 +220,10 @@ - (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear { self.loading = YES; [self objectsWillLoad]; - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - PFQuery *query = [self queryForTable]; [self _alterQuery:query forLoadingPage:page]; + + BFTaskCompletionSource PF_GENERIC(NSArray<__kindof PFObject *>*)*source = [BFTaskCompletionSource taskCompletionSource]; [query findObjectsInBackgroundWithBlock:^(NSArray *foundObjects, NSError *error) { if (![Parse isLocalDatastoreEnabled] && query.cachePolicy != kPFCachePolicyCacheOnly && @@ -252,7 +252,11 @@ - (BFTask *)loadObjects:(NSInteger)page clear:(BOOL)clear { [self objectsDidLoad:error]; [self.refreshControl endRefreshing]; - [source setError:error]; + if (error) { + [source trySetError:error]; + } else { + [source trySetResult:foundObjects]; + } }]; return source.task; From 8e7f14f91ea798bce34bfc13c4a2799510172c0a Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Mon, 7 Dec 2015 10:28:28 -0800 Subject: [PATCH 42/63] Update demo project optional unwrap. --- .../CustomProductTableViewController.swift | 3 +-- .../SectionedTableViewController.swift | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift index 30944cc..ed42217 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift @@ -27,14 +27,13 @@ import ParseUI class CustomProductTableViewController: PFProductTableViewController { override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { - let product = objects?[indexPath.row] as? PFObject + let product = objects?[indexPath.row] if let identifier = product?["productIdentifier"] as? String where identifier == "Cooper" { PFPurchase.buyProduct(identifier) { error in if error == nil { UIAlertView(title: "Success!", message: "Yes!", delegate: nil, cancelButtonTitle: "OK").show() } } - return } super.tableView(tableView, didSelectRowAtIndexPath: indexPath) } diff --git a/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift b/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift index e90fcb0..ea20558 100644 --- a/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift +++ b/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift @@ -44,7 +44,7 @@ class SectionedTableViewController: PFQueryTableViewController { super.objectsDidLoad(error) sections.removeAll(keepCapacity: false) - if let objects = objects as? [PFObject] { + if let objects = objects { for object in objects { let priority = (object["priority"] as? Int) ?? 0 var array = sections[priority] ?? Array() From e387bae4ba62f8a4636fa6a15d625ab15c16eae2 Mon Sep 17 00:00:00 2001 From: Hugues Bernet-Rollande Date: Thu, 10 Dec 2015 09:09:14 +0100 Subject: [PATCH 43/63] Adding accessibility identifiers to PFLogInView and PFSignUpView --- .../Classes/LogInViewController/PFLogInView.h | 14 +++++++++++++ .../Classes/LogInViewController/PFLogInView.m | 21 +++++++++++++++++++ .../SignUpViewController/PFSignUpView.h | 12 +++++++++++ .../SignUpViewController/PFSignUpView.m | 17 +++++++++++++++ 4 files changed, 64 insertions(+) diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.h b/ParseUI/Classes/LogInViewController/PFLogInView.h index 624fa7d..a2bce3d 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.h +++ b/ParseUI/Classes/LogInViewController/PFLogInView.h @@ -57,6 +57,20 @@ typedef NS_OPTIONS(NSInteger, PFLogInFields) { PFLogInFieldsDismissButton) }; +/** + `PFLoginFields`'s accessibility label identifiers + + @see PFLogInView + */ +extern NSString *const PFLogInViewUsernameFieldAccessibilityIdentifier; +extern NSString *const PFLogInViewPasswordFieldAccessibilityIdentifier; +extern NSString *const PFLogInViewLogInButtonAccessibilityIdentifier; +extern NSString *const PFLogInViewSignUpButtonAccessibilityIdentifier; +extern NSString *const PFLogInViewPasswordForgottenButtonAccessibilityIdentifier; +extern NSString *const PFLogInViewTwitterButtonAccessibilityIdentifier; +extern NSString *const PFLogInViewFacebookButtonAccessibilityIdentifier; +extern NSString *const PFLogInViewDismissButtonAccessibilityIdentifier; + @class PFTextField; /** diff --git a/ParseUI/Classes/LogInViewController/PFLogInView.m b/ParseUI/Classes/LogInViewController/PFLogInView.m index 4298a44..4dfbc5c 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInView.m +++ b/ParseUI/Classes/LogInViewController/PFLogInView.m @@ -35,6 +35,19 @@ static NSString *const PFLogInViewDefaultFacebookButtonImageName = @"facebook_icon.png"; static NSString *const PFLogInViewDefaultTwitterButtonImageName = @"twitter_icon.png"; +///-------------------------------------- +#pragma mark - Accessibility Identifiers +///-------------------------------------- + +NSString *const PFLogInViewUsernameFieldAccessibilityIdentifier = @"PFLogInViewUsernameFieldAccessibilityIdentifier"; +NSString *const PFLogInViewPasswordFieldAccessibilityIdentifier = @"PFLogInViewPasswordFieldAccessibilityIdentifier"; +NSString *const PFLogInViewLogInButtonAccessibilityIdentifier = @"PFLogInViewLogInButtonAccessibilityIdentifier"; +NSString *const PFLogInViewSignUpButtonAccessibilityIdentifier = @"PFLogInViewSignUpButtonAccessibilityIdentifier"; +NSString *const PFLogInViewPasswordForgottenButtonAccessibilityIdentifier = @"PFLogInViewPasswordForgottenButtonAccessibilityIdentifier"; +NSString *const PFLogInViewTwitterButtonAccessibilityIdentifier = @"PFLogInViewTwitterButtonAccessibilityIdentifier"; +NSString *const PFLogInViewFacebookButtonAccessibilityIdentifier = @"PFLogInViewFacebookButtonAccessibilityIdentifier"; +NSString *const PFLogInViewDismissButtonAccessibilityIdentifier = @"PFLogInViewDismissButtonAccessibilityIdentifier"; + @implementation PFLogInView ///-------------------------------------- @@ -109,6 +122,7 @@ - (void)_updateAllFields { if (_fields & PFLogInFieldsDismissButton) { if (!_dismissButton) { _dismissButton = [[PFDismissButton alloc] initWithFrame:CGRectZero]; + _dismissButton.accessibilityIdentifier = PFLogInViewDismissButtonAccessibilityIdentifier; [self addSubview:_dismissButton]; } } else { @@ -121,6 +135,7 @@ - (void)_updateAllFields { _usernameField = [[PFTextField alloc] initWithFrame:CGRectZero separatorStyle:(PFTextFieldSeparatorStyleTop | PFTextFieldSeparatorStyleBottom)]; + _usernameField.accessibilityIdentifier = PFLogInViewUsernameFieldAccessibilityIdentifier; _usernameField.autocorrectionType = UITextAutocorrectionTypeNo; _usernameField.autocapitalizationType = UITextAutocapitalizationTypeNone; _usernameField.returnKeyType = UIReturnKeyNext; @@ -131,6 +146,7 @@ - (void)_updateAllFields { if (!_passwordField) { _passwordField = [[PFTextField alloc] initWithFrame:CGRectZero separatorStyle:PFTextFieldSeparatorStyleBottom]; + _passwordField.accessibilityIdentifier = PFLogInViewPasswordFieldAccessibilityIdentifier; _passwordField.placeholder = PFLocalizedString(@"Password", @"Password"); _passwordField.secureTextEntry = YES; _passwordField.autocorrectionType = UITextAutocorrectionTypeNo; @@ -150,6 +166,7 @@ - (void)_updateAllFields { if (!_signUpButton) { _signUpButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultSignUpButtonConfiguration] buttonStyle:PFActionButtonStyleNormal]; + _signUpButton.accessibilityIdentifier = PFLogInViewSignUpButtonAccessibilityIdentifier; [self addSubview:_signUpButton]; } } else { @@ -160,6 +177,7 @@ - (void)_updateAllFields { if (_fields & PFLogInFieldsPasswordForgotten) { if (!_passwordForgottenButton) { _passwordForgottenButton = [[PFTextButton alloc] initWithFrame:CGRectZero]; + _passwordForgottenButton.accessibilityIdentifier = PFLogInViewPasswordForgottenButtonAccessibilityIdentifier; [_passwordForgottenButton setTitle:PFLocalizedString(@"Forgot Password?", "Forgot Password?") forState:UIControlStateNormal]; [self addSubview:_passwordForgottenButton]; @@ -172,6 +190,7 @@ - (void)_updateAllFields { if (_fields & PFLogInFieldsLogInButton) { if (!_logInButton) { _logInButton = [[PFPrimaryButton alloc] initWithBackgroundImageColor:[PFColor loginButtonBackgroundColor]]; + _logInButton.accessibilityIdentifier = PFLogInViewLogInButtonAccessibilityIdentifier; [_logInButton setTitle:PFLocalizedString(@"Log In", @"Log In") forState:UIControlStateNormal]; [self addSubview:_logInButton]; } @@ -184,6 +203,7 @@ - (void)_updateAllFields { if (!_facebookButton) { _facebookButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultFacebookButtonConfiguration] buttonStyle:PFActionButtonStyleNormal]; + _facebookButton.accessibilityIdentifier = PFLogInViewFacebookButtonAccessibilityIdentifier; [self addSubview:_facebookButton]; } } else { @@ -195,6 +215,7 @@ - (void)_updateAllFields { if (!_twitterButton) { _twitterButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultTwitterButtonConfiguration] buttonStyle:PFActionButtonStyleNormal]; + _twitterButton.accessibilityIdentifier = PFLogInViewTwitterButtonAccessibilityIdentifier; [self addSubview:_twitterButton]; } } else { diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpView.h b/ParseUI/Classes/SignUpViewController/PFSignUpView.h index e638327..e203515 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpView.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpView.h @@ -49,6 +49,18 @@ typedef NS_OPTIONS(NSInteger, PFSignUpFields) { PFSignUpFieldsDismissButton) }; +/** + `PFSignUpFields`'s accessibity identifiers + + @see PFSignUpView + */ +extern NSString *const PFSignUpViewUsernameFieldAccessibilityIdentifier; +extern NSString *const PFSignUpViewEmailFieldAccessibilityIdentifier; +extern NSString *const PFSignUpViewPasswordFieldAccessibilityIdentifier; +extern NSString *const PFSignUpViewAdditionalFieldAccessibilityIdentifier; +extern NSString *const PFSignUpViewSignUpButtonAccessibilityIdentifier; +extern NSString *const PFSignUpViewDismissButtonAccessibilityIdentifier; + @class PFTextField; /** diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpView.m b/ParseUI/Classes/SignUpViewController/PFSignUpView.m index c3f8c8e..5a35639 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpView.m +++ b/ParseUI/Classes/SignUpViewController/PFSignUpView.m @@ -32,6 +32,17 @@ static NSString *const PFSignUpViewDefaultLogoImageName = @"parse_logo.png"; +///-------------------------------------- +#pragma mark - Accessibility Identifiers +///-------------------------------------- + +NSString *const PFSignUpViewUsernameFieldAccessibilityIdentifier = @"PFSignUpViewUsernameFieldAccessibilityIdentifier"; +NSString *const PFSignUpViewEmailFieldAccessibilityIdentifier = @"PFSignUpViewEmailFieldAccessibilityIdentifier"; +NSString *const PFSignUpViewPasswordFieldAccessibilityIdentifier = @"PFSignUpViewPasswordFieldAccessibilityIdentifier"; +NSString *const PFSignUpViewAdditionalFieldAccessibilityIdentifier = @"PFSignUpViewAdditionalFieldAccessibilityIdentifier"; +NSString *const PFSignUpViewSignUpButtonAccessibilityIdentifier = @"PFSignUpViewSignUpButtonAccessibilityIdentifier"; +NSString *const PFSignUpViewDismissButtonAccessibilityIdentifier = @"PFSignUpViewDismissButtonAccessibilityIdentifier"; + @implementation PFSignUpView #pragma mark - @@ -52,12 +63,14 @@ - (instancetype)initWithFields:(PFSignUpFields)otherFields { if (_fields & PFSignUpFieldsDismissButton) { _dismissButton = [[PFDismissButton alloc] initWithFrame:CGRectZero]; + _dismissButton.accessibilityIdentifier = PFSignUpViewDismissButtonAccessibilityIdentifier; [self addSubview:_dismissButton]; } _usernameField = [[PFTextField alloc] initWithFrame:CGRectZero separatorStyle:(PFTextFieldSeparatorStyleTop | PFTextFieldSeparatorStyleBottom)]; + _usernameField.accessibilityIdentifier = PFSignUpViewUsernameFieldAccessibilityIdentifier; _usernameField.autocorrectionType = UITextAutocorrectionTypeNo; _usernameField.autocapitalizationType = UITextAutocapitalizationTypeNone; _usernameField.returnKeyType = UIReturnKeyNext; @@ -66,6 +79,7 @@ - (instancetype)initWithFields:(PFSignUpFields)otherFields { _passwordField = [[PFTextField alloc] initWithFrame:CGRectZero separatorStyle:PFTextFieldSeparatorStyleBottom]; + _passwordField.accessibilityIdentifier = PFSignUpViewPasswordFieldAccessibilityIdentifier; _passwordField.placeholder = PFLocalizedString(@"Password", @"Password"); _passwordField.secureTextEntry = YES; _passwordField.autocorrectionType = UITextAutocorrectionTypeNo; @@ -80,6 +94,7 @@ - (instancetype)initWithFields:(PFSignUpFields)otherFields { if (_fields & PFSignUpFieldsEmail) { _emailField = [[PFTextField alloc] initWithFrame:CGRectZero separatorStyle:PFTextFieldSeparatorStyleBottom]; + _emailField.accessibilityIdentifier = PFSignUpViewEmailFieldAccessibilityIdentifier; _emailField.autocorrectionType = UITextAutocorrectionTypeNo; _emailField.autocapitalizationType = UITextAutocapitalizationTypeNone; _emailField.keyboardType = UIKeyboardTypeEmailAddress; @@ -95,6 +110,7 @@ - (instancetype)initWithFields:(PFSignUpFields)otherFields { if (_fields & PFSignUpFieldsAdditional) { _additionalField = [[PFTextField alloc] initWithFrame:CGRectZero separatorStyle:PFTextFieldSeparatorStyleBottom]; + _additionalField.accessibilityIdentifier = PFSignUpViewAdditionalFieldAccessibilityIdentifier; _additionalField.autocorrectionType = UITextAutocorrectionTypeNo; _additionalField.autocapitalizationType = UITextAutocapitalizationTypeNone; _additionalField.placeholder = PFLocalizedString(@"Additional", @"Additional"); @@ -104,6 +120,7 @@ - (instancetype)initWithFields:(PFSignUpFields)otherFields { if (_fields & PFSignUpFieldsSignUpButton) { _signUpButton = [[PFPrimaryButton alloc] initWithBackgroundImageColor:[PFColor signupButtonBackgroundColor]]; + _signUpButton.accessibilityIdentifier = PFSignUpViewSignUpButtonAccessibilityIdentifier; [_signUpButton setTitle:PFLocalizedString(@"Sign Up", @"Sign Up") forState:UIControlStateNormal]; [self addSubview:_signUpButton]; } From e9c9997011c8ed8d6b0ff1736d0ee87b4a134412 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Wed, 6 Jan 2016 20:32:14 -0800 Subject: [PATCH 44/63] Use only production version of CocoaPods for Travis-CI. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fa55320..e6f49f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ env: - TEST_TYPE=CocoaPods before_install: - gem install xcpretty --no-document -N - - gem install cocoapods --no-document --pre --quiet + - gem install cocoapods --no-document --quiet script: - | set -o pipefail From a33b671df9008f8a9fab33d5772ed7ba580b48c6 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Wed, 6 Jan 2016 18:15:06 -0800 Subject: [PATCH 45/63] Remove all usages of PF_GENERIC macro. --- .../LogInViewController/PFLogInViewController.h | 2 +- .../PFQueryCollectionViewController.h | 10 +++++----- .../PFQueryCollectionViewController.m | 8 ++++---- .../PFQueryTableViewController.h | 12 ++++++------ .../PFQueryTableViewController.m | 10 +++++----- .../SignUpViewController/PFSignUpViewController.h | 2 +- ParseUI/Classes/Views/PFImageView.h | 4 ++-- ParseUI/Classes/Views/PFImageView.m | 4 ++-- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.h b/ParseUI/Classes/LogInViewController/PFLogInViewController.h index 0c63fcb..72d4ff3 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.h +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.h @@ -72,7 +72,7 @@ NS_ASSUME_NONNULL_BEGIN If unspecified, the default is basic facebook permissions. */ -@property (nullable, nonatomic, copy) NSArray PF_GENERIC(NSString *)*facebookPermissions; +@property (nullable, nonatomic, copy) NSArray *facebookPermissions; /** The sign up controller if sign up is enabled. diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h index 1c0b73a..a09589c 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h @@ -26,7 +26,7 @@ NS_ASSUME_NONNULL_BEGIN -@class BFTask PF_GENERIC(__covariant BFGenericType); +@class BFTask<__covariant BFGenericType>; @class PFCollectionViewCell; @class PFObject; @class PFQuery; @@ -127,7 +127,7 @@ NS_ASSUME_NONNULL_BEGIN /** The array of instances of `PFObject` that is used as a data source. */ -@property (nonatomic, copy, readonly) NSArray PF_GENERIC(__kindof PFObject *)*objects; +@property (nonatomic, copy, readonly) NSArray<__kindof PFObject *> *objects; /** Returns an object at a particular indexPath. @@ -149,7 +149,7 @@ NS_ASSUME_NONNULL_BEGIN /** Removes all objects at the specified index paths, animated. */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray PF_GENERIC(NSIndexPath *)*)indexes; +- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; ///-------------------------------------- /// @name Loading Data @@ -160,7 +160,7 @@ NS_ASSUME_NONNULL_BEGIN @return An awaitable task that completes when the reload succeeds */ -- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects; +- (BFTask *> *)loadObjects; /** Loads the objects of the `PFObject.parseClassName` at the specified page and appends it to the @@ -171,7 +171,7 @@ NS_ASSUME_NONNULL_BEGIN @return An awaitable task that completes when the reload succeeds */ -- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects:(NSInteger)page clear:(BOOL)clear; +- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear; /** Loads the next page of objects, appends to table, and refreshes. diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m index 41a9c23..9716289 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m @@ -36,7 +36,7 @@ static NSString *const PFQueryCollectionViewNextPageReusableViewIdentifier = @"nextPageView"; @interface PFQueryCollectionViewController () { - NSMutableArray PF_GENERIC(PFObject *)*_mutableObjects; + NSMutableArray *_mutableObjects; BOOL _firstLoad; // Whether we have loaded the first set of objects NSInteger _currentPage; // The last page that was loaded @@ -226,18 +226,18 @@ - (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths { #pragma mark - #pragma mark Loading Data -- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects { +- (BFTask *> *)loadObjects { return [self loadObjects:0 clear:YES]; } -- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects:(NSInteger)page clear:(BOOL)clear { +- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear { self.loading = YES; [self objectsWillLoad]; PFQuery *query = [self queryForCollection]; [self _alterQuery:query forLoadingPage:page]; - BFTaskCompletionSource PF_GENERIC(NSArray<__kindof PFObject *>*)*source = [BFTaskCompletionSource taskCompletionSource]; + BFTaskCompletionSource *> *source = [BFTaskCompletionSource taskCompletionSource]; [query findObjectsInBackgroundWithBlock:^(NSArray *foundObjects, NSError *error) { if (![Parse isLocalDatastoreEnabled] && query.cachePolicy != kPFCachePolicyCacheOnly && diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h index 917b102..62d4a01 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h @@ -26,7 +26,7 @@ NS_ASSUME_NONNULL_BEGIN -@class BFTask PF_GENERIC(__covariant BFGenericType); +@class BFTask<__covariant BFGenericType>; @class PFObject; @class PFQuery; @class PFTableViewCell; @@ -149,7 +149,7 @@ NS_ASSUME_NONNULL_BEGIN /** The array of instances of `PFObject` that is used as a data source. */ -@property (nullable, nonatomic, copy, readonly) NSArray PF_GENERIC(__kindof PFObject *)*objects; +@property (nullable, nonatomic, copy, readonly) NSArray<__kindof PFObject *> *objects; /** Returns an object at a particular indexPath. @@ -176,12 +176,12 @@ NS_ASSUME_NONNULL_BEGIN /** Removes all objects at the specified index paths, animated. */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray PF_GENERIC(NSIndexPath *)*)indexPaths; +- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexPaths; /** Removes all objects at the specified index paths, with or without animation. */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray PF_GENERIC(NSIndexPath *)*)indexPaths animated:(BOOL)animated; +- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexPaths animated:(BOOL)animated; /** Clears the table of all objects. @@ -193,7 +193,7 @@ NS_ASSUME_NONNULL_BEGIN @return An awaitable task that completes when the reload succeeds */ -- (BFTask PF_GENERIC(NSArray<__kindof PFObject *> *)*)loadObjects; +- (BFTask *> *)loadObjects; /** Loads the objects of the className at the specified page and appends it to the @@ -204,7 +204,7 @@ NS_ASSUME_NONNULL_BEGIN @return An awaitable task that completes when the reload succeeds */ -- (BFTask PF_GENERIC(NSArray<__kindof PFObject *> *)*)loadObjects:(NSInteger)page clear:(BOOL)clear; +- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear; /** Loads the next page of objects, appends to table, and refreshes. diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m index a64cf9a..e5bbf46 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m @@ -45,7 +45,7 @@ - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibB @end @interface PFQueryTableViewController () { - NSMutableArray PF_GENERIC(PFObject *)*_mutableObjects; + NSMutableArray *_mutableObjects; BOOL _firstLoad; // Whether we have loaded the first set of objects NSInteger _currentPage; // The last page that was loaded @@ -212,18 +212,18 @@ - (void)clear { _currentPage = 0; } -- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects { +- (BFTask *> *)loadObjects { return [self loadObjects:0 clear:YES]; } -- (BFTask PF_GENERIC(NSArray<__kindof PFObject *>*)*)loadObjects:(NSInteger)page clear:(BOOL)clear { +- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear { self.loading = YES; [self objectsWillLoad]; PFQuery *query = [self queryForTable]; [self _alterQuery:query forLoadingPage:page]; - BFTaskCompletionSource PF_GENERIC(NSArray<__kindof PFObject *>*)*source = [BFTaskCompletionSource taskCompletionSource]; + BFTaskCompletionSource *> *source = [BFTaskCompletionSource taskCompletionSource]; [query findObjectsInBackgroundWithBlock:^(NSArray *foundObjects, NSError *error) { if (![Parse isLocalDatastoreEnabled] && query.cachePolicy != kPFCachePolicyCacheOnly && @@ -558,7 +558,7 @@ - (void)_refreshControlValueChanged:(UIRefreshControl *)refreshControl { #pragma mark - #pragma mark Accessors -- (NSArray PF_GENERIC(__kindof PFObject *)*)objects { +- (NSArray<__kindof PFObject *> *)objects { return _mutableObjects; } diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h index e9baf62..23c7779 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h @@ -127,7 +127,7 @@ extern NSString *const PFSignUpCancelNotification; @return A `BOOL` indicating whether the sign up should proceed. */ -- (BOOL)signUpViewController:(PFSignUpViewController *)signUpController shouldBeginSignUp:(NSDictionary PF_GENERIC(NSString *,NSString *)*)info; +- (BOOL)signUpViewController:(PFSignUpViewController *)signUpController shouldBeginSignUp:(NSDictionary *)info; ///-------------------------------------- /// @name Responding to Actions diff --git a/ParseUI/Classes/Views/PFImageView.h b/ParseUI/Classes/Views/PFImageView.h index adabf56..d8d4845 100644 --- a/ParseUI/Classes/Views/PFImageView.h +++ b/ParseUI/Classes/Views/PFImageView.h @@ -29,7 +29,7 @@ NS_ASSUME_NONNULL_BEGIN typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError *__nullable error); -@class BFTask PF_GENERIC(__covariant BFGenericType); +@class BFTask<__covariant BFGenericType>; @class PFFile; /** @@ -51,7 +51,7 @@ typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError * @return The task, that encapsulates the work being done. */ -- (BFTask PF_GENERIC(UIImage *)*)loadInBackground; +- (BFTask *)loadInBackground; /** Initiate downloading of the remote image. diff --git a/ParseUI/Classes/Views/PFImageView.m b/ParseUI/Classes/Views/PFImageView.m index ea8d2eb..f10a9aa 100644 --- a/ParseUI/Classes/Views/PFImageView.m +++ b/ParseUI/Classes/Views/PFImageView.m @@ -47,8 +47,8 @@ - (void)setFile:(PFFile *)otherFile { #pragma mark - #pragma mark Load -- (BFTask PF_GENERIC(UIImage *)*)loadInBackground { - BFTaskCompletionSource PF_GENERIC(UIImage *)*source = [BFTaskCompletionSource taskCompletionSource]; +- (BFTask *)loadInBackground { + BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; [self loadInBackground:^(UIImage *image, NSError *error) { if (error) { [source trySetError:error]; From 13ffa98e60e4ed7bef2ef7d3367654cb8e7fa862 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Wed, 6 Jan 2016 18:16:20 -0800 Subject: [PATCH 46/63] Update pod dependencies. --- Podfile.lock | 48 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index c420710..410c182 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,28 +1,22 @@ PODS: - - Bolts (1.5.0): - - Bolts/AppLinks (= 1.5.0) - - Bolts/Tasks (= 1.5.0) - - Bolts/AppLinks (1.5.0): + - Bolts (1.5.1): + - Bolts/AppLinks (= 1.5.1) + - Bolts/Tasks (= 1.5.1) + - Bolts/AppLinks (1.5.1): - Bolts/Tasks - - Bolts/Tasks (1.5.0) - - FBSDKCoreKit (4.8.0): - - Bolts (~> 1.1) - - FBSDKCoreKit/arc (= 4.8.0) - - FBSDKCoreKit/no-arc (= 4.8.0) - - FBSDKCoreKit/arc (4.8.0): - - Bolts (~> 1.1) - - FBSDKCoreKit/no-arc (4.8.0): - - Bolts (~> 1.1) - - FBSDKCoreKit/arc - - FBSDKLoginKit (4.8.0): - - FBSDKCoreKit - - Parse (1.10.0): + - Bolts/Tasks (1.5.1) + - FBSDKCoreKit (4.9.0-beta2): + - Bolts (~> 1.5) + - FBSDKLoginKit (4.9.0-beta2): + - FBSDKCoreKit (~> 4.9.0-beta) + - Parse (1.11.0): - Bolts/Tasks (~> 1.5) - - ParseFacebookUtilsV4 (1.9.1): + - ParseFacebookUtilsV4 (1.10.0): - Bolts/Tasks (>= 1.5) - - FBSDKCoreKit (~> 4.8) - - FBSDKLoginKit (~> 4.8) - - Parse (~> 1.9) + - FBSDKCoreKit (~> 4.9.0-beta) + - FBSDKLoginKit (~> 4.9.0-beta) + - FBSDKTVOSKit (~> 4.9.0-beta) + - Parse (~> 1.11) - ParseTwitterUtils (1.9.1): - Bolts/Tasks (~> 1.5) - Parse (~> 1.9) @@ -37,14 +31,14 @@ DEPENDENCIES: EXTERNAL SOURCES: ParseUI: - :path: "." + :path: . SPEC CHECKSUMS: - Bolts: 722ab9a4f8b50fc4ed1b9998a5a7a2b3f16d80b4 - FBSDKCoreKit: 66a935d17b6e00b6b64e604f2eb9b72c9ab7deb8 - FBSDKLoginKit: d893fcbb98d854496925e9ff73c67b896982d3c4 - Parse: 90b2544822200f84b18bfacc4e8b0a3a6c3584a2 - ParseFacebookUtilsV4: eab9b4ade12f0800b4d30f6b808bca55ce17a0e9 + Bolts: a12663244b1d3351c738882e71902fc74db54f64 + FBSDKCoreKit: d49cbf69741e3c5732166ec9ff4cbd9b288dd53e + FBSDKLoginKit: d32e83c0d2d39ef74a942543cacae2dc4de7d088 + Parse: 886af46a0a677402f6374bb97ac212e795f70afe + ParseFacebookUtilsV4: 3cd2d2d69653bad40c8c58131b935c353a0f3f15 ParseTwitterUtils: 41e8849e37db471e874c6e515190ded19e043dc8 ParseUI: c2bcdfbb00330e464b5b773266ae221697a3bb7b From 463746244e68d04fc43c9c058acc5d420633b47e Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Thu, 7 Jan 2016 14:21:21 -0800 Subject: [PATCH 47/63] Use UIAlertController to present alerts if it's available. --- .../Internal/Extensions/PFUIAlertView.h | 46 ++++- .../Internal/Extensions/PFUIAlertView.m | 191 ++++++++++++++++-- .../PFLogInViewController.m | 48 ++--- .../PFProductTableViewController.m | 8 +- .../PFQueryCollectionViewController.m | 26 +-- .../PFQueryTableViewController.m | 30 +-- .../PFSignUpViewController.m | 4 +- 7 files changed, 245 insertions(+), 108 deletions(-) diff --git a/ParseUI/Classes/Internal/Extensions/PFUIAlertView.h b/ParseUI/Classes/Internal/Extensions/PFUIAlertView.h index 3478c95..f6742b3 100644 --- a/ParseUI/Classes/Internal/Extensions/PFUIAlertView.h +++ b/ParseUI/Classes/Internal/Extensions/PFUIAlertView.h @@ -21,14 +21,44 @@ #import -@interface PFUIAlertView : UIAlertView +NS_ASSUME_NONNULL_BEGIN -+ (void)showAlertViewWithTitle:(NSString *)title - error:(NSError *)error; -+ (void)showAlertViewWithTitle:(NSString *)title - message:(NSString *)message; -+ (void)showAlertViewWithTitle:(NSString *)title - message:(NSString *)message - cancelButtonTitle:(NSString *)cancelButtonTitle; +typedef void(^PFUIAlertViewCompletion)(NSUInteger selectedOtherButtonIndex); +typedef void(^PFUIAlertViewTextFieldCompletion)(UITextField *textField, NSUInteger selectedOtherButtonIndex); +typedef void(^PFUIAlertViewTextFieldCustomizationHandler)(UITextField *textField); + +@interface PFUIAlertView : NSObject + +///-------------------------------------- +#pragma mark - Present +///-------------------------------------- + ++ (void)presentAlertInViewController:(UIViewController *)viewController + withTitle:(NSString *)title + message:(nullable NSString *)message + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(nullable NSArray *)otherButtonTitles + completion:(nullable PFUIAlertViewCompletion)completion; + ++ (void)presentAlertInViewController:(UIViewController *)viewController + withTitle:(NSString *)title + message:(nullable NSString *)message + textFieldCustomizationHandler:(PFUIAlertViewTextFieldCustomizationHandler)textFieldCustomizationHandler + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(nullable NSArray *)otherButtonTitles + completion:(nullable PFUIAlertViewTextFieldCompletion)completion; + +///-------------------------------------- +#pragma mark - Convenience +///-------------------------------------- + ++ (void)presentAlertInViewController:(UIViewController *)viewController + withTitle:(NSString *)title + error:(NSError *)error; ++ (void)presentAlertInViewController:(UIViewController *)viewController + withTitle:(NSString *)title + message:(nullable NSString *)message; @end + +NS_ASSUME_NONNULL_END diff --git a/ParseUI/Classes/Internal/Extensions/PFUIAlertView.m b/ParseUI/Classes/Internal/Extensions/PFUIAlertView.m index b65b02e..155f70d 100644 --- a/ParseUI/Classes/Internal/Extensions/PFUIAlertView.m +++ b/ParseUI/Classes/Internal/Extensions/PFUIAlertView.m @@ -23,34 +23,191 @@ #import "PFLocalization.h" +@interface PFUIAlertView () + +@property (nonatomic, copy) PFUIAlertViewCompletion completion; + +@end + @implementation PFUIAlertView -+ (void)showAlertViewWithTitle:(NSString *)title error:(NSError *)error { +///-------------------------------------- +#pragma mark - Present +///-------------------------------------- + ++ (void)presentAlertInViewController:(UIViewController *)viewController + withTitle:(NSString *)title + message:(nullable NSString *)message + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(nullable NSArray *)otherButtonTitles + completion:(nullable PFUIAlertViewCompletion)completion { + if ([UIAlertController class] != nil) { + __block UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title + message:message + preferredStyle:UIAlertControllerStyleAlert]; + + void (^alertActionHandler)(UIAlertAction *) = [^(UIAlertAction *action) { + if (completion) { + // This block intentionally retains alertController, and releases it afterwards. + if (action.style == UIAlertActionStyleCancel) { + completion(NSNotFound); + } else { + NSUInteger index = [alertController.actions indexOfObject:action]; + completion(index - 1); + } + } + alertController = nil; + } copy]; + + [alertController addAction:[UIAlertAction actionWithTitle:cancelButtonTitle + style:UIAlertActionStyleCancel + handler:alertActionHandler]]; + + for (NSString *buttonTitle in otherButtonTitles) { + [alertController addAction:[UIAlertAction actionWithTitle:buttonTitle + style:UIAlertActionStyleDefault + handler:alertActionHandler]]; + } + + [viewController presentViewController:alertController animated:YES completion:nil]; + } else { +#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 + __block PFUIAlertView *pfAlertView = [[self alloc] init]; + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title + message:message + delegate:nil + cancelButtonTitle:cancelButtonTitle + otherButtonTitles:nil]; + + for (NSString *buttonTitle in otherButtonTitles) { + [alertView addButtonWithTitle:buttonTitle]; + } + + pfAlertView.completion = ^(NSUInteger index) { + if (completion) { + completion(index); + } + + pfAlertView = nil; + }; + + alertView.delegate = pfAlertView; + [alertView show]; +#endif + } +} + ++ (void)presentAlertInViewController:(UIViewController *)viewController + withTitle:(NSString *)title + message:(nullable NSString *)message + textFieldCustomizationHandler:(PFUIAlertViewTextFieldCustomizationHandler)textFieldCustomizationHandler + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(nullable NSArray *)otherButtonTitles + completion:(nullable PFUIAlertViewTextFieldCompletion)completion { + if ([UIAlertController class] != nil) { + __block UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title + message:message + preferredStyle:UIAlertControllerStyleAlert]; + [alertController addTextFieldWithConfigurationHandler:textFieldCustomizationHandler]; + void (^alertActionHandler)(UIAlertAction *) = [^(UIAlertAction *action) { + if (completion) { + UITextField *textField = alertController.textFields.firstObject; + // This block intentionally retains alertController, and releases it afterwards. + if (action.style == UIAlertActionStyleCancel) { + completion(textField, NSNotFound); + } else { + NSUInteger index = [alertController.actions indexOfObject:action]; + completion(textField, index - 1); + } + } + alertController = nil; + } copy]; + + [alertController addAction:[UIAlertAction actionWithTitle:cancelButtonTitle + style:UIAlertActionStyleCancel + handler:alertActionHandler]]; + + for (NSString *buttonTitle in otherButtonTitles) { + [alertController addAction:[UIAlertAction actionWithTitle:buttonTitle + style:UIAlertActionStyleDefault + handler:alertActionHandler]]; + } + + [viewController presentViewController:alertController animated:YES completion:nil]; + } else { +#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 + __block PFUIAlertView *pfAlertView = [[self alloc] init]; + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title + message:message + delegate:nil + cancelButtonTitle:cancelButtonTitle + otherButtonTitles:nil]; + alertView.alertViewStyle = UIAlertViewStylePlainTextInput; + for (NSString *buttonTitle in otherButtonTitles) { + [alertView addButtonWithTitle:buttonTitle]; + } + textFieldCustomizationHandler([alertView textFieldAtIndex:0]); + + __weak UIAlertView *walertView = alertView; + pfAlertView.completion = ^(NSUInteger index) { + if (completion) { + UITextField *textField = [walertView textFieldAtIndex:0]; + completion(textField, index); + } + + pfAlertView = nil; + }; + + alertView.delegate = pfAlertView; + [alertView show]; +#endif + } +} + +///-------------------------------------- +#pragma mark - Convenience +///-------------------------------------- + ++ (void)presentAlertInViewController:(UIViewController *)viewController + withTitle:(NSString *)title + error:(NSError *)error { NSString *message = error.userInfo[@"error"]; if (!message) { - message = [error.userInfo[@"originalError"] localizedDescription]; + message = [error.userInfo[@"originalError"] localizedDescription]; } if (!message) { - message = [error localizedDescription]; + message = [error localizedDescription]; } - [self showAlertViewWithTitle:title message:message]; + [self presentAlertInViewController:viewController withTitle:title message:message]; } -+ (void)showAlertViewWithTitle:(NSString *)title message:(NSString *)message { - [self showAlertViewWithTitle:title - message:message - cancelButtonTitle:PFLocalizedString(@"OK", @"OK")]; ++ (void)presentAlertInViewController:(UIViewController *)viewController + withTitle:(NSString *)title + message:(nullable NSString *)message { + [self presentAlertInViewController:viewController + withTitle:title + message:message + cancelButtonTitle:PFLocalizedString(@"OK", @"OK") + otherButtonTitles:nil + completion:nil]; } -+ (void)showAlertViewWithTitle:(NSString *)title - message:(NSString *)message - cancelButtonTitle:(NSString *)cancelButtonTitle { - UIAlertView *alertView = [[self alloc] initWithTitle:title - message:message - delegate:nil - cancelButtonTitle:cancelButtonTitle - otherButtonTitles:nil]; - [alertView show]; +#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 + +///-------------------------------------- +#pragma mark - UIAlertViewDelegate +///-------------------------------------- + +- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { + if (self.completion) { + if (buttonIndex == alertView.cancelButtonIndex) { + self.completion(NSNotFound); + } else { + self.completion(buttonIndex - 1); + } + } } +#endif + @end diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.m b/ParseUI/Classes/LogInViewController/PFLogInViewController.m index 6bf6a64..34e9d8b 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.m +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.m @@ -235,17 +235,6 @@ - (BOOL)textFieldShouldReturn:(UITextField *)textField { return YES; } -///-------------------------------------- -#pragma mark - UIAlertViewDelegate -///-------------------------------------- - -- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex { - if (buttonIndex != [alertView cancelButtonIndex]) { - NSString *email = [alertView textFieldAtIndex:0].text; - [self _requestPasswordResetWithEmail:email]; - } -} - ///-------------------------------------- #pragma mark - Private ///-------------------------------------- @@ -294,19 +283,22 @@ - (void)_forgotPasswordAction PF_EXTENSION_UNAVAILABLE("") { NSString *title = PFLocalizedString(@"Reset Password", @"Forgot password request title in PFLogInViewController"); NSString *message = PFLocalizedString(@"Please enter the email address for your account.", @"Email request message in PFLogInViewController"); - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title - message:message - delegate:self - cancelButtonTitle:PFLocalizedString(@"Cancel", @"Cancel") - otherButtonTitles:PFLocalizedString(@"OK", @"OK"), nil]; - alertView.alertViewStyle = UIAlertViewStylePlainTextInput; - - UITextField *textField = [alertView textFieldAtIndex:0]; - textField.placeholder = PFLocalizedString(@"Email", @"Email"); - textField.keyboardType = UIKeyboardTypeEmailAddress; - textField.returnKeyType = UIReturnKeyDone; - - [alertView show]; + [PFUIAlertView presentAlertInViewController:self + withTitle:title + message:message + textFieldCustomizationHandler:^(UITextField * _Nonnull textField) { + textField.placeholder = PFLocalizedString(@"Email", @"Email"); + textField.keyboardType = UIKeyboardTypeEmailAddress; + textField.returnKeyType = UIReturnKeyDone; + } + cancelButtonTitle:PFLocalizedString(@"Cancel", @"Cancel") + otherButtonTitles:@[ PFLocalizedString(@"OK", @"OK")] + completion:^(UITextField * _Nonnull textField, NSUInteger selectedOtherButtonIndex) { + if (selectedOtherButtonIndex != NSNotFound) { + NSString *email = textField.text; + [self _requestPasswordResetWithEmail:email]; + } + }]; } - (void)_requestPasswordResetWithEmail:(NSString *)email { @@ -316,13 +308,11 @@ - (void)_requestPasswordResetWithEmail:(NSString *)email { @"Password reset success alert title in PFLogInViewController."); NSString *message = [NSString stringWithFormat:PFLocalizedString(@"An email with reset instructions has been sent to '%@'.", @"Password reset message in PFLogInViewController"), email]; - [PFUIAlertView showAlertViewWithTitle:title - message:message - cancelButtonTitle:PFLocalizedString(@"OK", @"OK")]; + [PFUIAlertView presentAlertInViewController:self withTitle:title message:message]; } else { NSString *title = PFLocalizedString(@"Password Reset Failed", @"Password reset error alert title in PFLogInViewController."); - [PFUIAlertView showAlertViewWithTitle:title error:error]; + [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; } }]; } @@ -480,7 +470,7 @@ - (void)_loginDidFailWithError:(NSError *)error { } else { message = PFLocalizedString(@"Please try again", @"Generic login failed alert message in PFLogInViewController"); } - [PFUIAlertView showAlertViewWithTitle:title message:message]; + [PFUIAlertView presentAlertInViewController:self withTitle:title message:message]; } [[NSNotificationCenter defaultCenter] postNotificationName:PFLogInFailureNotification object:self]; } diff --git a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.m b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.m index 6b9b37a..544a38d 100644 --- a/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.m +++ b/ParseUI/Classes/ProductTableViewController/PFProductTableViewController.m @@ -88,15 +88,15 @@ - (void)objectsDidLoad:(NSError *)error { cell.state = PFPurchaseTableViewCellStateDownloading; [PFPurchase downloadAssetForTransaction:transaction - completion:^(NSString *filePath, NSError *downloadError) { - if (!downloadError) { + completion:^(NSString *filePath, NSError *error) { + if (!error) { cell.state = PFPurchaseTableViewCellStateDownloaded; } else { cell.state = PFPurchaseTableViewCellStateNormal; NSString *title = PFLocalizedString(@"Download Error", @"Download Error"); - [PFUIAlertView showAlertViewWithTitle:title error:downloadError]; + [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; } } progress:^(int percentDone) { @@ -175,7 +175,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath [PFPurchase buyProduct:product.productIdentifier block:^(NSError *error) { if (error) { NSString *title = PFLocalizedString(@"Purchase Error", @"Purchase Error"); - [PFUIAlertView showAlertViewWithTitle:title error:error]; + [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; } }]; } diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m index 9716289..6df7599 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m @@ -31,6 +31,7 @@ #import "PFImageView.h" #import "PFLoadingView.h" #import "PFLocalization.h" +#import "PFUIAlertView.h" static NSString *const PFQueryCollectionViewCellIdentifier = @"cell"; static NSString *const PFQueryCollectionViewNextPageReusableViewIdentifier = @"nextPageView"; @@ -391,31 +392,10 @@ - (void)_handleDeletionError:(NSError *)error { // Fully reload on error. [self loadObjects]; - NSString *errorMessage = [NSString stringWithFormat:@"%@: \"%@\"", + NSString *message = [NSString stringWithFormat:@"%@: \"%@\"", PFLocalizedString(@"Error occurred during deletion", @"Error occurred during deletion"), error.localizedDescription]; - - if ([UIAlertController class]) { - UIAlertController *errorController = [UIAlertController alertControllerWithTitle:PFLocalizedString(@"Error", @"Error") - message:errorMessage - preferredStyle:UIAlertControllerStyleAlert]; - - [errorController addAction:[UIAlertAction actionWithTitle:PFLocalizedString(@"OK", @"OK") - style:UIAlertActionStyleCancel - handler:nil]]; - - [self presentViewController:errorController animated:YES completion:nil]; - } else { - // Cast to `id` is required for building succesfully for app extensions, - // this code actually never runs in App Extensions, since they are iOS 8.0+, so we are good with just a hack - UIAlertView *alertView = [(id)[UIAlertView alloc] initWithTitle:PFLocalizedString(@"Error", @"Error") - message:errorMessage - delegate:nil - cancelButtonTitle:PFLocalizedString(@"OK", @"OK") - otherButtonTitles:nil]; - - [alertView show]; - } + [PFUIAlertView presentAlertInViewController:self withTitle:PFLocalizedString(@"Delete Error", @"Delete Error") message:message]; } #pragma mark - diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m index e5bbf46..bf7a0d0 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m @@ -32,6 +32,7 @@ #import "PFLoadingView.h" #import "PFLocalization.h" #import "PFTableViewCell.h" +#import "PFUIAlertView.h" // Add headers to kill any warnings. // `initWithStyle:` is a UITableViewController method. @@ -521,31 +522,10 @@ - (void)_handleDeletionError:(NSError *)error { // Fully reload on error. [self loadObjects]; - NSString *errorMessage = [NSString stringWithFormat:@"%@: \"%@\"", - PFLocalizedString(@"Error occurred during deletion", @"Error occurred during deletion"), - error.localizedDescription]; - - if ([UIAlertController class]) { - UIAlertController *errorController = [UIAlertController alertControllerWithTitle:PFLocalizedString(@"Error", @"Error") - message:errorMessage - preferredStyle:UIAlertControllerStyleAlert]; - - [errorController addAction:[UIAlertAction actionWithTitle:PFLocalizedString(@"OK", @"OK") - style:UIAlertActionStyleCancel - handler:nil]]; - - [self presentViewController:errorController animated:YES completion:nil]; - } else { - // Cast to `id` is required for building succesfully for app extensions, - // this code actually never runs in App Extensions, since they are iOS 8.0+, so we are good with just a hack - UIAlertView *alertView = [(id)[UIAlertView alloc] initWithTitle:PFLocalizedString(@"Error", @"Error") - message:errorMessage - delegate:nil - cancelButtonTitle:PFLocalizedString(@"OK", @"OK") - otherButtonTitles:nil]; - - [alertView show]; - } + NSString *message = [NSString stringWithFormat:@"%@: \"%@\"", + PFLocalizedString(@"Error occurred during deletion", @"Error occurred during deletion"), + error.localizedDescription]; + [PFUIAlertView presentAlertInViewController:self withTitle:PFLocalizedString(@"Delete Error", @"Delete Error") message:message]; } #pragma mark - diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m index 053583a..34c77e0 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m @@ -362,7 +362,7 @@ - (void)_signUpDidFailWithError:(NSError *)error { } if (message != nil) { - [PFUIAlertView showAlertViewWithTitle:title message:message]; + [PFUIAlertView presentAlertInViewController:self withTitle:title message:message]; [responder becomeFirstResponder]; return; @@ -370,7 +370,7 @@ - (void)_signUpDidFailWithError:(NSError *)error { } // Show the generic error alert, as no custom cases matched before - [PFUIAlertView showAlertViewWithTitle:title error:error]; + [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; } - (void)_cancelSignUp { From 656b0cf0d9d5561384f0655b14f9fd49c543e0dc Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Thu, 7 Jan 2016 17:30:42 -0800 Subject: [PATCH 48/63] ParseUI 1.2.0 --- ParseUI.podspec | 2 +- ParseUI/Resources/Info.plist | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ParseUI.podspec b/ParseUI.podspec index 38020f4..52d21c8 100644 --- a/ParseUI.podspec +++ b/ParseUI.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ParseUI' - s.version = '1.1.7' + s.version = '1.2.0' s.license = { :type => 'SDK', :file => 'LICENSE'} s.homepage = 'https://www.parse.com/' s.summary = 'ParseUI is a library of useful User Interface components for the Parse iOS SDK.' diff --git a/ParseUI/Resources/Info.plist b/ParseUI/Resources/Info.plist index dde99e2..7cead45 100644 --- a/ParseUI/Resources/Info.plist +++ b/ParseUI/Resources/Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.1.7 + 1.2.0 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -22,8 +22,8 @@ iPhoneOS CFBundleVersion - 1.1.7 + 1.2.0 MinimumOSVersion - 6.0 + 7.0 From d5d0c32742e95e9bdf27debbf49009930fde67f7 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Tue, 12 Jan 2016 15:25:00 -0800 Subject: [PATCH 49/63] Fixed potential issue where no targets where registered for actions of buttons in LogInViewController. --- .../PFLogInViewController.m | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/ParseUI/Classes/LogInViewController/PFLogInViewController.m b/ParseUI/Classes/LogInViewController/PFLogInViewController.m index 34e9d8b..7799968 100644 --- a/ParseUI/Classes/LogInViewController/PFLogInViewController.m +++ b/ParseUI/Classes/LogInViewController/PFLogInViewController.m @@ -126,13 +126,18 @@ - (void)dealloc { - (void)loadView { _logInView = [[PFLogInView alloc] initWithFields:_fields]; [_logInView setPresentingViewController:self]; + + UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_dismissKeyboard)]; + [_logInView addGestureRecognizer:gestureRecognizer]; + gestureRecognizer.cancelsTouchesInView = NO; + self.view = _logInView; } - (void)viewDidLoad { [super viewDidLoad]; - [self setupHandlers]; + [self _setupLogInViewActions]; } - (void)viewWillAppear:(BOOL)animated { @@ -179,6 +184,7 @@ - (void)setFields:(PFLogInFields)fields { // Avoid force loading logInView if (_logInView) { _logInView.fields = fields; + [self _setupLogInViewActions]; } } } @@ -239,33 +245,27 @@ - (BOOL)textFieldShouldReturn:(UITextField *)textField { #pragma mark - Private ///-------------------------------------- -- (void)setupHandlers { - [_logInView.dismissButton addTarget:self - action:@selector(_dismissAction) - forControlEvents:UIControlEventTouchUpInside]; +- (void)_setupLogInViewActions { + [_logInView.dismissButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; + [_logInView.dismissButton addTarget:self action:@selector(_dismissAction) forControlEvents:UIControlEventTouchUpInside]; _logInView.usernameField.delegate = self; _logInView.passwordField.delegate = self; + + [_logInView.logInButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; [_logInView.logInButton addTarget:self action:@selector(_loginAction) forControlEvents:UIControlEventTouchUpInside]; - [_logInView.passwordForgottenButton addTarget:self - action:@selector(_forgotPasswordAction) - forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.facebookButton addTarget:self - action:@selector(_loginWithFacebook) - forControlEvents:UIControlEventTouchUpInside]; - [_logInView.twitterButton addTarget:self - action:@selector(_loginWithTwitter) - forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.signUpButton addTarget:self - action:@selector(_signupAction) - forControlEvents:UIControlEventTouchUpInside]; - - UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self - action:@selector(_dismissKeyboard)]; - [_logInView addGestureRecognizer:gestureRecognizer]; - gestureRecognizer.cancelsTouchesInView = NO; + + [_logInView.passwordForgottenButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; + [_logInView.passwordForgottenButton addTarget:self action:@selector(_forgotPasswordAction) forControlEvents:UIControlEventTouchUpInside]; + + [_logInView.facebookButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; + [_logInView.facebookButton addTarget:self action:@selector(_loginWithFacebook) forControlEvents:UIControlEventTouchUpInside]; + + [_logInView.twitterButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; + [_logInView.twitterButton addTarget:self action:@selector(_loginWithTwitter) forControlEvents:UIControlEventTouchUpInside]; + + [_logInView.signUpButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; + [_logInView.signUpButton addTarget:self action:@selector(_signupAction) forControlEvents:UIControlEventTouchUpInside]; } - (void)_dismissAction { From 034ea4775125fad43bfad5c4e7bbe19403f98650 Mon Sep 17 00:00:00 2001 From: Thiago Ghisi Date: Mon, 20 Jun 2016 15:55:39 -0400 Subject: [PATCH 50/63] Fix Podfile for CocoaPods-1.0 (#240) * Fix Podfile for CocoaPods-1.0 exclusive=>true flag for targets was deprecated on cocoapods version 1.0 * Update pods and change iOS target version to 8.0 - 'embedded dylibs/frameworks are only supported on iOS 8.0 and later (@rpath/Bolts.framework/Bolts) for architecture i386' * Update pod repo on every Travis-CI run. * Isolate setup (install) from actually running the tests (script) for Travis-CI --- .travis.yml | 14 ++-- ParseUI.xcodeproj/project.pbxproj | 119 ++++++++++++++---------------- ParseUI/Generated/PFResources.h | 18 ++--- Podfile | 14 ++-- Podfile.lock | 58 ++++++++------- 5 files changed, 110 insertions(+), 113 deletions(-) diff --git a/.travis.yml b/.travis.yml index e6f49f2..b1eaf48 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,18 +13,22 @@ env: - TEST_TYPE=ParseUIDemo-ObjC - TEST_TYPE=ParseUIDemo-Swift - TEST_TYPE=CocoaPods -before_install: - - gem install xcpretty --no-document -N - - gem install cocoapods --no-document --quiet -script: +install: - | - set -o pipefail + gem install xcpretty --no-document -N + gem install cocoapods --no-document --quiet + pod repo update pod install +script: +- | if [ "$TEST_TYPE" = ParseUI ]; then + set -o pipefail xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUI' -sdk iphonesimulator build | xcpretty -c elif [ "$TEST_TYPE" = ParseUIDemo-ObjC ]; then + set -o pipefail xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUIDemo' -sdk iphonesimulator build | xcpretty -c elif [ "$TEST_TYPE" = ParseUIDemo-Swift ]; then + set -o pipefail xcodebuild -workspace ParseUI.xcworkspace -scheme 'ParseUIDemo-Swift' -sdk iphonesimulator build | xcpretty -c elif [ "$TEST_TYPE" = CocoaPods ]; then pod lib lint ParseUI.podspec diff --git a/ParseUI.xcodeproj/project.pbxproj b/ParseUI.xcodeproj/project.pbxproj index 11d20db..5920d70 100644 --- a/ParseUI.xcodeproj/project.pbxproj +++ b/ParseUI.xcodeproj/project.pbxproj @@ -7,8 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - 0F487952B83BF80EF1A5C4C4 /* Pods_ParseUIDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B11BDB9C48788D891789AC4D /* Pods_ParseUIDemo.framework */; }; - 3082A3CE396F45707D6A7F38 /* Pods_ParseUIDemo_Swift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A00130E2D30BC9B48B6FC033 /* Pods_ParseUIDemo_Swift.framework */; }; + 18F60EB63C11534D4DA92305 /* Pods_ParseUIDemo_Swift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8B60E7098474B437486F70 /* Pods_ParseUIDemo_Swift.framework */; }; + 379FCDB92DFA7C8CADE823A6 /* Pods_ParseUIDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 720149E3A3C18665E2F10DC8 /* Pods_ParseUIDemo.framework */; }; 8129E5F51A9CB067006752BC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA71A1AB37500FD6EED /* Images.xcassets */; }; 8129E5F71A9CB067006752BC /* 0.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA91A1AB37500FD6EED /* 0.png */; }; 8129E5F81A9CB067006752BC /* 1.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAA1A1AB37500FD6EED /* 1.png */; }; @@ -64,9 +64,8 @@ /* Begin PBXFileReference section */ 06A1EF631BB6799700BA55EC /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 06A1EF641BB6799700BA55EC /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 323E48C3F5A6E337CF362B8F /* Pods-ParseUIDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo.release.xcconfig"; sourceTree = ""; }; - 3583C464D666C3687E5AAD0E /* Pods-ParseUIDemo-Swift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo-Swift.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift.debug.xcconfig"; sourceTree = ""; }; - 71B8D6C92C9693FC9DA8F19B /* Pods-ParseUIDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo.debug.xcconfig"; sourceTree = ""; }; + 720149E3A3C18665E2F10DC8 /* Pods_ParseUIDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ParseUIDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7C1041A7E103153B26236744 /* Pods-ParseUIDemo-Swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo-Swift.release.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift.release.xcconfig"; sourceTree = ""; }; 8129E6081A9CB1BE006752BC /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8129E6391A9CB320006752BC /* UIDemoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIDemoViewController.swift; sourceTree = ""; }; 812E5C001A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SimpleQueryCollectionStoryboard.storyboard; path = ../../../Resources/SimpleQueryCollectionStoryboard.storyboard; sourceTree = ""; }; @@ -98,7 +97,6 @@ 81472FA91A1AB37500FD6EED /* 0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 0.png; sourceTree = ""; }; 81472FAA1A1AB37500FD6EED /* 1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 1.png; sourceTree = ""; }; 81472FAB1A1AB37500FD6EED /* 2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 2.png; sourceTree = ""; }; - 81472FAE1A1AB37500FD6EED /* libPods-ParseUIDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libPods-ParseUIDemo.a"; sourceTree = SOURCE_ROOT; }; 81472FB01A1AB37500FD6EED /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; path = ParseUIDemo.app; sourceTree = SOURCE_ROOT; }; 819A4B381A6808EA00D01241 /* SubtitleImageCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubtitleImageCollectionViewController.h; sourceTree = ""; }; 819A4B391A6808EA00D01241 /* SubtitleImageCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SubtitleImageCollectionViewController.m; sourceTree = ""; }; @@ -125,10 +123,11 @@ 81FC6B6B1A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubtitleImageCollectionViewController.swift; sourceTree = ""; }; 81FC6B711A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = "SimpleQueryCollectionStoryboard-Swift.storyboard"; path = "ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard"; sourceTree = SOURCE_ROOT; }; 81FC6B741A9D1D4700104E45 /* CustomProductTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomProductTableViewController.swift; sourceTree = ""; }; - A00130E2D30BC9B48B6FC033 /* Pods_ParseUIDemo_Swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ParseUIDemo_Swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B01F654B200E4F6A9AAF2E14 /* Pods-ParseUIDemo-Swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo-Swift.release.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift.release.xcconfig"; sourceTree = ""; }; - B11BDB9C48788D891789AC4D /* Pods_ParseUIDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ParseUIDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AB8B60E7098474B437486F70 /* Pods_ParseUIDemo_Swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ParseUIDemo_Swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B91892E5A1364B4A9F064902 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CCDBBFB547B75B4BD95F39F3 /* Pods-ParseUIDemo-Swift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo-Swift.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift.debug.xcconfig"; sourceTree = ""; }; + D665FA86F98330E6614E174A /* Pods-ParseUIDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo.debug.xcconfig"; sourceTree = ""; }; + D6B620324851E8A17694D8AC /* Pods-ParseUIDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ParseUIDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo.release.xcconfig"; sourceTree = ""; }; F57F3D1B1B0C03BA0087F60B /* DeletionTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeletionTableViewController.h; sourceTree = ""; }; F57F3D1C1B0C03BA0087F60B /* DeletionTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeletionTableViewController.m; sourceTree = ""; }; F57F3D1F1B0C03C90087F60B /* DeletionCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeletionCollectionViewController.h; sourceTree = ""; }; @@ -142,7 +141,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3082A3CE396F45707D6A7F38 /* Pods_ParseUIDemo_Swift.framework in Frameworks */, + 18F60EB63C11534D4DA92305 /* Pods_ParseUIDemo_Swift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -150,32 +149,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0F487952B83BF80EF1A5C4C4 /* Pods_ParseUIDemo.framework in Frameworks */, + 379FCDB92DFA7C8CADE823A6 /* Pods_ParseUIDemo.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 07A8DE7A188BFADCF65DF735 /* Pods */ = { - isa = PBXGroup; - children = ( - 71B8D6C92C9693FC9DA8F19B /* Pods-ParseUIDemo.debug.xcconfig */, - 323E48C3F5A6E337CF362B8F /* Pods-ParseUIDemo.release.xcconfig */, - 3583C464D666C3687E5AAD0E /* Pods-ParseUIDemo-Swift.debug.xcconfig */, - B01F654B200E4F6A9AAF2E14 /* Pods-ParseUIDemo-Swift.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; 0867D691FE84028FC02AAC07 /* Breakpad */ = { isa = PBXGroup; children = ( 81472F621A1AB31F00FD6EED /* ParseUIDemo */, 3F5307328F84566C90FBCF25 /* Frameworks */, - 07A8DE7A188BFADCF65DF735 /* Pods */, 06A1EF631BB6799700BA55EC /* ParseUIDemo.app */, 06A1EF641BB6799700BA55EC /* ParseUIDemo.app */, + DC15AC42FDE929B85D4188E3 /* Pods */, ); name = Breakpad; sourceTree = ""; @@ -184,8 +172,8 @@ isa = PBXGroup; children = ( B91892E5A1364B4A9F064902 /* Pods.framework */, - B11BDB9C48788D891789AC4D /* Pods_ParseUIDemo.framework */, - A00130E2D30BC9B48B6FC033 /* Pods_ParseUIDemo_Swift.framework */, + 720149E3A3C18665E2F10DC8 /* Pods_ParseUIDemo.framework */, + AB8B60E7098474B437486F70 /* Pods_ParseUIDemo_Swift.framework */, ); name = Frameworks; sourceTree = ""; @@ -219,7 +207,6 @@ 81472FA31A1AB37500FD6EED /* Classes */, 81472FA61A1AB37500FD6EED /* Other */, 81472FAC1A1AB37500FD6EED /* Resources */, - 81472FAF1A1AB37500FD6EED /* Frameworks */, 81472FB01A1AB37500FD6EED /* ParseUIDemo.app */, ); name = ParseUIDemo; @@ -309,15 +296,6 @@ path = ParseUIDemo/Resources; sourceTree = ""; }; - 81472FAF1A1AB37500FD6EED /* Frameworks */ = { - isa = PBXGroup; - children = ( - 81472FAE1A1AB37500FD6EED /* libPods-ParseUIDemo.a */, - ); - name = Frameworks; - path = ParseUIDemo/Resources; - sourceTree = ""; - }; 81C5993C1A64344800F574E8 /* QueryCollectionViewController */ = { isa = PBXGroup; children = ( @@ -402,6 +380,17 @@ path = ProductTableViewController; sourceTree = ""; }; + DC15AC42FDE929B85D4188E3 /* Pods */ = { + isa = PBXGroup; + children = ( + D665FA86F98330E6614E174A /* Pods-ParseUIDemo.debug.xcconfig */, + D6B620324851E8A17694D8AC /* Pods-ParseUIDemo.release.xcconfig */, + CCDBBFB547B75B4BD95F39F3 /* Pods-ParseUIDemo-Swift.debug.xcconfig */, + 7C1041A7E103153B26236744 /* Pods-ParseUIDemo-Swift.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -409,12 +398,12 @@ isa = PBXNativeTarget; buildConfigurationList = 8129E5FD1A9CB067006752BC /* Build configuration list for PBXNativeTarget "ParseUIDemo-Swift" */; buildPhases = ( - 14C1838C6EF1AEC5161015C4 /* Check Pods Manifest.lock */, + 9F926C5B882F550DF775AB46 /* 📦 Check Pods Manifest.lock */, 8129E5E01A9CB067006752BC /* Sources */, 8129E5F11A9CB067006752BC /* Frameworks */, 8129E5F41A9CB067006752BC /* Resources */, - 1909B29935849BBB561D082F /* Embed Pods Frameworks */, - 089B112A89F5DA6189057DFB /* Copy Pods Resources */, + 4F153429FDD67BC33AEBC34B /* 📦 Embed Pods Frameworks */, + AF901D5622604FDF69F8F587 /* 📦 Copy Pods Resources */, ); buildRules = ( ); @@ -429,12 +418,12 @@ isa = PBXNativeTarget; buildConfigurationList = 81472F871A1AB33800FD6EED /* Build configuration list for PBXNativeTarget "ParseUIDemo" */; buildPhases = ( - 8E4BF9D3844D49A5ED985E2B /* Check Pods Manifest.lock */, + 92D3F6290D8B385988E08819 /* 📦 Check Pods Manifest.lock */, 81472F631A1AB33800FD6EED /* Sources */, 81472F641A1AB33800FD6EED /* Frameworks */, 81472F651A1AB33800FD6EED /* Resources */, - CC766631A47FC46D977E3D35 /* Embed Pods Frameworks */, - 35D6DE00035D0D5461A7B833 /* Copy Pods Resources */, + 3B78FAEB2D0CC3169A0625BD /* 📦 Embed Pods Frameworks */, + 0B3CECF02CFE4339F15E091E /* 📦 Copy Pods Resources */, ); buildRules = ( ); @@ -528,44 +517,44 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 089B112A89F5DA6189057DFB /* Copy Pods Resources */ = { + 0B3CECF02CFE4339F15E091E /* 📦 Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Copy Pods Resources"; + name = "📦 Copy Pods Resources"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift-resources.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 14C1838C6EF1AEC5161015C4 /* Check Pods Manifest.lock */ = { + 3B78FAEB2D0CC3169A0625BD /* 📦 Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Check Pods Manifest.lock"; + name = "📦 Embed Pods Frameworks"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 1909B29935849BBB561D082F /* Embed Pods Frameworks */ = { + 4F153429FDD67BC33AEBC34B /* 📦 Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Embed Pods Frameworks"; + name = "📦 Embed Pods Frameworks"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -573,29 +562,29 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 35D6DE00035D0D5461A7B833 /* Copy Pods Resources */ = { + 92D3F6290D8B385988E08819 /* 📦 Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Copy Pods Resources"; + name = "📦 Check Pods Manifest.lock"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo-resources.sh\"\n"; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; - 8E4BF9D3844D49A5ED985E2B /* Check Pods Manifest.lock */ = { + 9F926C5B882F550DF775AB46 /* 📦 Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Check Pods Manifest.lock"; + name = "📦 Check Pods Manifest.lock"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -603,19 +592,19 @@ shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; - CC766631A47FC46D977E3D35 /* Embed Pods Frameworks */ = { + AF901D5622604FDF69F8F587 /* 📦 Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Embed Pods Frameworks"; + name = "📦 Copy Pods Resources"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo/Pods-ParseUIDemo-frameworks.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ParseUIDemo-Swift/Pods-ParseUIDemo-Swift-resources.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -705,7 +694,7 @@ }; 8129E5FE1A9CB067006752BC /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3583C464D666C3687E5AAD0E /* Pods-ParseUIDemo-Swift.debug.xcconfig */; + baseConfigurationReference = CCDBBFB547B75B4BD95F39F3 /* Pods-ParseUIDemo-Swift.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; @@ -734,7 +723,7 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = ParseUIDemo; @@ -746,7 +735,7 @@ }; 8129E5FF1A9CB067006752BC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B01F654B200E4F6A9AAF2E14 /* Pods-ParseUIDemo-Swift.release.xcconfig */; + baseConfigurationReference = 7C1041A7E103153B26236744 /* Pods-ParseUIDemo-Swift.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; @@ -769,7 +758,7 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = ParseUIDemo; @@ -781,7 +770,7 @@ }; 81472F881A1AB33800FD6EED /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 71B8D6C92C9693FC9DA8F19B /* Pods-ParseUIDemo.debug.xcconfig */; + baseConfigurationReference = D665FA86F98330E6614E174A /* Pods-ParseUIDemo.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; @@ -810,7 +799,7 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -820,7 +809,7 @@ }; 81472F891A1AB33800FD6EED /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 323E48C3F5A6E337CF362B8F /* Pods-ParseUIDemo.release.xcconfig */; + baseConfigurationReference = D6B620324851E8A17694D8AC /* Pods-ParseUIDemo.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; @@ -843,7 +832,7 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ParseUI/Generated/PFResources.h b/ParseUI/Generated/PFResources.h index c510253..906135c 100644 --- a/ParseUI/Generated/PFResources.h +++ b/ParseUI/Generated/PFResources.h @@ -1,13 +1,13 @@ // This is an auto-generated file. #import @interface PFResources : NSObject -+ (NSData *)facebook_icon_png;//modified:2015-10-08 12:36:36 -0700 -+ (NSData *)facebook_icon2x_png;//modified:2015-10-08 12:36:36 -0700 -+ (NSData *)facebook_icon3x_png;//modified:2015-10-08 12:36:36 -0700 -+ (NSData *)parse_logo_png;//modified:2015-10-08 12:36:36 -0700 -+ (NSData *)parse_logo2x_png;//modified:2015-10-08 12:36:36 -0700 -+ (NSData *)parse_logo3x_png;//modified:2015-10-08 12:36:36 -0700 -+ (NSData *)twitter_icon_png;//modified:2015-10-08 12:36:36 -0700 -+ (NSData *)twitter_icon2x_png;//modified:2015-10-08 12:36:36 -0700 -+ (NSData *)twitter_icon3x_png;//modified:2015-10-08 12:36:36 -0700 ++ (NSData *)facebook_icon_png;//modified:2016-05-19 23:03:59 -0400 ++ (NSData *)facebook_icon2x_png;//modified:2016-05-19 23:03:59 -0400 ++ (NSData *)facebook_icon3x_png;//modified:2016-05-19 23:03:59 -0400 ++ (NSData *)parse_logo_png;//modified:2016-05-19 23:03:59 -0400 ++ (NSData *)parse_logo2x_png;//modified:2016-05-19 23:03:59 -0400 ++ (NSData *)parse_logo3x_png;//modified:2016-05-19 23:03:59 -0400 ++ (NSData *)twitter_icon_png;//modified:2016-05-19 23:03:59 -0400 ++ (NSData *)twitter_icon2x_png;//modified:2016-05-19 23:03:59 -0400 ++ (NSData *)twitter_icon3x_png;//modified:2016-05-19 23:03:59 -0400 @end diff --git a/Podfile b/Podfile index dfe7172..0f75f32 100644 --- a/Podfile +++ b/Podfile @@ -1,19 +1,21 @@ source 'https://github.com/CocoaPods/Specs.git' + +platform :ios, '8.0' use_frameworks! -platform :ios, '7.0' workspace 'ParseUI' # xcodeproj 'ParseUI.xcodeproj' -target 'ParseUIDemo', :exclusive => true do +def shared_pods pod 'ParseFacebookUtilsV4' pod 'ParseTwitterUtils' pod 'ParseUI', :path => '.' end -target 'ParseUIDemo-Swift', :exclusive => true do - pod 'ParseFacebookUtilsV4' - pod 'ParseTwitterUtils' - pod 'ParseUI', :path => '.' +target 'ParseUIDemo' do + shared_pods end +target 'ParseUIDemo-Swift' do + shared_pods +end diff --git a/Podfile.lock b/Podfile.lock index 410c182..edf1e43 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,26 +1,26 @@ PODS: - - Bolts (1.5.1): - - Bolts/AppLinks (= 1.5.1) - - Bolts/Tasks (= 1.5.1) - - Bolts/AppLinks (1.5.1): + - Bolts (1.7.0): + - Bolts/AppLinks (= 1.7.0) + - Bolts/Tasks (= 1.7.0) + - Bolts/AppLinks (1.7.0): - Bolts/Tasks - - Bolts/Tasks (1.5.1) - - FBSDKCoreKit (4.9.0-beta2): - - Bolts (~> 1.5) - - FBSDKLoginKit (4.9.0-beta2): - - FBSDKCoreKit (~> 4.9.0-beta) - - Parse (1.11.0): - - Bolts/Tasks (~> 1.5) - - ParseFacebookUtilsV4 (1.10.0): - - Bolts/Tasks (>= 1.5) - - FBSDKCoreKit (~> 4.9.0-beta) - - FBSDKLoginKit (~> 4.9.0-beta) - - FBSDKTVOSKit (~> 4.9.0-beta) - - Parse (~> 1.11) - - ParseTwitterUtils (1.9.1): + - Bolts/Tasks (1.7.0) + - FBSDKCoreKit (4.12.0): + - Bolts (~> 1.7) + - FBSDKLoginKit (4.12.0): + - FBSDKCoreKit + - Parse (1.13.0): + - Bolts/Tasks (~> 1.6) + - ParseFacebookUtilsV4 (1.11.1): + - Bolts/Tasks (>= 1.6) + - FBSDKCoreKit (~> 4.10) + - FBSDKLoginKit (~> 4.10) + - FBSDKTVOSKit (~> 4.10) + - Parse (~> 1.12) + - ParseTwitterUtils (1.10.0): - Bolts/Tasks (~> 1.5) - Parse (~> 1.9) - - ParseUI (1.1.7): + - ParseUI (1.2.0): - Bolts/Tasks (~> 1.3) - Parse (~> 1.9) @@ -31,15 +31,17 @@ DEPENDENCIES: EXTERNAL SOURCES: ParseUI: - :path: . + :path: "." SPEC CHECKSUMS: - Bolts: a12663244b1d3351c738882e71902fc74db54f64 - FBSDKCoreKit: d49cbf69741e3c5732166ec9ff4cbd9b288dd53e - FBSDKLoginKit: d32e83c0d2d39ef74a942543cacae2dc4de7d088 - Parse: 886af46a0a677402f6374bb97ac212e795f70afe - ParseFacebookUtilsV4: 3cd2d2d69653bad40c8c58131b935c353a0f3f15 - ParseTwitterUtils: 41e8849e37db471e874c6e515190ded19e043dc8 - ParseUI: c2bcdfbb00330e464b5b773266ae221697a3bb7b + Bolts: a0058fa3b331c5a1e4402d534f2dae36dbff31e4 + FBSDKCoreKit: 6e56d5a2a64a755ad4efb5dbeee8f82fb1b99775 + FBSDKLoginKit: 03f68a8d48c2c8bb81d7eb8097973d483543e1f6 + Parse: f51c24d2feb412e4b2d6cc73d37cb24e8d0089bc + ParseFacebookUtilsV4: 2f30c2b7021c8005d3042781da7ef87d06589421 + ParseTwitterUtils: 8856ac80da50bbb0f0bcf251def20b62e1ae6bc4 + ParseUI: af2eba584799da4a9fbdac0e178662d7438b502e + +PODFILE CHECKSUM: f111f239f329836dbd986f3b172a33749d5a6d30 -COCOAPODS: 0.39.0 +COCOAPODS: 1.0.0 From 88981faf539501a5a6e30795a53736c8f713b0c5 Mon Sep 17 00:00:00 2001 From: Duncan Cunningham Date: Fri, 24 Jun 2016 19:23:39 +0200 Subject: [PATCH 51/63] Made `signUpViewController:shouldBeginSignUp` info dictionary keys public (#243) --- .../PFSignUpViewController.h | 24 +++++++++++++++++++ .../PFSignUpViewController.m | 8 +++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h index 23c7779..2b9070b 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.h @@ -103,6 +103,30 @@ extern NSString *const PFSignUpFailureNotification; */ extern NSString *const PFSignUpCancelNotification; +///-------------------------------------- +// @name Keys for info dictionary on `signUpViewController:shouldBeginSignUp` delegate method. +///-------------------------------------- + +/** + Username supplied during sign up. + */ +extern NSString *const PFSignUpViewControllerDelegateInfoUsernameKey; + +/** + Password supplied during sign up. + */ +extern NSString *const PFSignUpViewControllerDelegateInfoPasswordKey; + +/** + Email address supplied during sign up. + */ +extern NSString *const PFSignUpViewControllerDelegateInfoEmailKey; + +/** + Additional info supplied during sign up. + */ +extern NSString *const PFSignUpViewControllerDelegateInfoAdditionalKey; + ///-------------------------------------- /// @name PFSignUpViewControllerDelegate ///-------------------------------------- diff --git a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m index 34c77e0..52dae14 100644 --- a/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m +++ b/ParseUI/Classes/SignUpViewController/PFSignUpViewController.m @@ -34,10 +34,10 @@ NSString *const PFSignUpCancelNotification = @"com.parse.ui.signup.cancel"; // Keys that are used to pass information to the delegate on `signUpViewController:shouldBeginSignUp`. -static NSString *const PFSignUpViewControllerDelegateInfoUsernameKey = @"username"; -static NSString *const PFSignUpViewControllerDelegateInfoPasswordKey = @"password"; -static NSString *const PFSignUpViewControllerDelegateInfoEmailKey = @"email"; -static NSString *const PFSignUpViewControllerDelegateInfoAdditionalKey = @"additional"; +NSString *const PFSignUpViewControllerDelegateInfoUsernameKey = @"username"; +NSString *const PFSignUpViewControllerDelegateInfoPasswordKey = @"password"; +NSString *const PFSignUpViewControllerDelegateInfoEmailKey = @"email"; +NSString *const PFSignUpViewControllerDelegateInfoAdditionalKey = @"additional"; @interface PFSignUpViewController () { struct { From b0b3a00367eca4b2796c824949d372810faf6741 Mon Sep 17 00:00:00 2001 From: Jake Torrence Date: Thu, 15 Dec 2016 11:40:44 -0500 Subject: [PATCH 52/63] Updated link to iOS Guide --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7cb8a41..9408aba 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ imageView.file = (PFFile *)someObject[@"picture"]; // remote image ## Learn More - Check out [ParseUIDemo](https://github.com/ParsePlatform/ParseUI-iOS/tree/master/ParseUIDemo) project -- Read the [iOS Guides](https://parse.com/docs/ios_guide#ui/iOS) +- Read the [iOS Guides](http://parseplatform.github.io/docs/ios/guide/) - Browse official [API Reference](https://parse.com/docs/ios/api/) - Follow few [tutorials](https://parse.com/tutorials/) From 3186c1c70ea10ca2c9327c7fa98457e7b29392b3 Mon Sep 17 00:00:00 2001 From: Jake Torrence Date: Thu, 15 Dec 2016 14:11:01 -0500 Subject: [PATCH 53/63] http => https --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9408aba..9921782 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ imageView.file = (PFFile *)someObject[@"picture"]; // remote image ## Learn More - Check out [ParseUIDemo](https://github.com/ParsePlatform/ParseUI-iOS/tree/master/ParseUIDemo) project -- Read the [iOS Guides](http://parseplatform.github.io/docs/ios/guide/) +- Read the [iOS Guides](https://parseplatform.github.io/docs/ios/guide/) - Browse official [API Reference](https://parse.com/docs/ios/api/) - Follow few [tutorials](https://parse.com/tutorials/) From e31b50c1100358f210a8e8c9d915f7d43d353e4f Mon Sep 17 00:00:00 2001 From: Kevin Lacker Date: Wed, 5 Apr 2017 13:51:26 -0700 Subject: [PATCH 54/63] transfer code --- LICENSE | 4 ++++ README.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/LICENSE b/LICENSE index 31425ea..1c4cf48 100644 --- a/LICENSE +++ b/LICENSE @@ -15,3 +15,7 @@ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----- + +As of April 5, 2017, Parse, LLC has transferred this code to the parse-community organization, and will no longer be contributing to or distributing this code. diff --git a/README.md b/README.md index 9921782..992658b 100644 --- a/README.md +++ b/README.md @@ -113,3 +113,7 @@ imageView.file = (PFFile *)someObject[@"picture"]; // remote image ## Contributing See the CONTRIBUTING file for how to help out. + +----- + +As of April 5, 2017, Parse, LLC has transferred this code to the parse-community organization, and will no longer be contributing to or distributing this code. From c7f4919337681d3a40d880b516230fee9862eb64 Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Sun, 26 Nov 2017 17:12:40 -0500 Subject: [PATCH 55/63] Update authors and social media --- ParseUI.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ParseUI.podspec b/ParseUI.podspec index 52d21c8..0e7b588 100644 --- a/ParseUI.podspec +++ b/ParseUI.podspec @@ -4,8 +4,8 @@ Pod::Spec.new do |s| s.license = { :type => 'SDK', :file => 'LICENSE'} s.homepage = 'https://www.parse.com/' s.summary = 'ParseUI is a library of useful User Interface components for the Parse iOS SDK.' - s.authors = 'Parse' - s.social_media_url = 'https://twitter.com/ParseIt' + s.authors = 'Parse Community' + s.social_media_url = 'https://twitter.com/ParsePlatform' s.source = { :git => "https://github.com/ParsePlatform/ParseUI-iOS.git", :tag => s.version.to_s } From 7ad7a1d0e4dcdf9073217e103167b0a4478a22aa Mon Sep 17 00:00:00 2001 From: Daniel Borges Date: Mon, 15 Jan 2018 12:15:27 -0300 Subject: [PATCH 56/63] pt-BR corrected strings. (#252) The characters were in an unknown codification. --- .../Localization/pt-BR.lproj/ParseUI.strings | Bin 6024 -> 3435 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings b/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings index f148d0c99adec54760f5039280c588cadf83eaf9..9fb6f02bc334f431fb017f7624b06183effdfe64 100644 GIT binary patch literal 3435 zcmb_fT}~u75Ps(rC8QM+Qs4klv>7oo2rXjB0*RD2)9smYw%aDQ8$@n{^03MQa)P!2gGIs~=QWGr1zFWut8{%rKqnX}QmrqNzZTGFjD4LzB-%!S#3J{b#gVHQF))$CY+~K2R_LS>0SBWd&7S99&CJeRn>WBI8%rVaS$>ZAT>}- zc`9IbbAb7$PW$Iub>HYch)$NFkxZl}$#!k+hDH~3At^^+;3z&@v=ch*27R;o)AbIp zEVoC=XO3X^!@!O&b|`g+qoTXV>@AGP+>hdqbYp)14@QfG^gndb>vJFy_)_R_^s9-@ zzc7GkO<9YtnyLnk3SdpZ6g{wJpE&B-CzipVEzU`OQ3!}dZc@K*OGW1>EFC;c=tZ%I z9Cc$B_U>U%NsC=-yAZ)fq#`w1;ryYdY6+&PkiQ@WA7!Sg^`oYgRz%Wj>jDdBSq z0E9F{S5@%oP3aRP_s)Gzth)}KK40Q}Rsn%d^P9|7eri^6!8bzF|NBjo+8&G~GiIU#CpuJVCrvKsQF57zLW=GcHBJh0| zy48y}t~epg{og&vv+~vZd6I5k>NUs{K-~a3T5j(!z8+>eE|GH{IjXLKn1I>o>DhHC zZdJL?#@GF@wf1`Tm4~0$s8N?rfs1TZ#lv%LwKo+tyS(upccXtMOdw+!i)%o{gc#K1 z5#`6J^jqiAvB1-$AD7n~uh>fZNLJCAYae{+pFFY(0N+Ax+>`x~W7F#%8FonG9=dyA zj>~73K2tS##_R7w37|->{oi;qaNkkZF0({%XaYs`1sjz#A*$Mf&v;8qmbMvCn*X*( zLt2=q*f^n#nN)<1TU$|W=5y2^>skh6nuD_pCRYD#^+G_U1|TFptYa|M_p+3Z2Umw} zQB-pQFYKdgOudCoiDd|za|E;84uXh2?1c+OY$b`8TZRtN%iza+V+nclQ$_k(G>% zwC_551R7MaT5^lbcHP5V@Bd5iR#yhCM;5CX-K(hEjKATwRQ8_)@N(X&W!g(hVfo^# Jts#-jegi&AX4C)x literal 6024 zcmd5=TW%XS6y>*9K^O=M1ZcB>qDTcx3XB?-8`}-gKYE6er1gZ7tqfj zA6ihh&~r$U!{O**qfQYhRx})v_ug~QeUP6&ef<3C<16t}NHGvOK80xTXGAHKm}B&% zcqNX+@z%G;c>e?bjt6;>6{b}4WAQy^A7Kr5yucncKKIzK!rl_!8qXRsq*&PBHRjCl zOG0XC*Nnv(=Fh|_o`1op#`+VhQG@jcTFo(5VQ#A%S8D92FrQlAxI+{Rm^2(7E;x+DC?$L zX6t`+E$>vNWTkUGEy|*jO4ho(RdQ+ysmoQNa^t3SHjcqNfl4LR)Ezg(qpc#*sH&h~ zyw4Eo-(#ma{#VusBLF}kV+i-n3UWqOWn^jO(A<}Eqw-YHM7$H{@ZLlW#1Q^F7jJ-- z_tFsK{r6$>@!;3d`EVj9ayWT+el{5lyW5W<_xdf{v9OJZ$6_3|S>2As>m53&^cFJ% zuVkPQN3=yWw@;+k3Gz4OV+_dyRhc6>ei^tOeI8zDEYFLMw7Gl0<^ebO4`Y-)b4S6Vh2O@NULU79*t zudpaAXK%#*Vn4!hM^i&nmJzOGAM;#nij!dHX?TH|80P@ znPhi}c#GJY1C6{v;X@M^ooufskT2pu}z z{kA0&N+?U{@%R}Mn?Ts5_sU83(X z(9SWJxr|Rdc}2#H9%&6uQMs=4`Y%KGx?@-lDlZipgtAeoqu)SoiN6XY&H(Zpa%MJ4 z_f_OCg%!`BAD{)#zO2w?n@L+!8(lUU3|=WzjYfBgdtoti6^H>L(H*z-(I1fZ%?i2O z9qW`lF^jt@$=uzZKTRv{cpa1Ld0LpZ!1T`_VR2^~81kYD`rua~Ae}}R)rA;jvMMa|o_UAUF*P zUbmQKgR`%V`!v* Date: Mon, 15 Jan 2018 17:15:50 +0200 Subject: [PATCH 57/63] Added hebrew translations (#230) --- .../Localization/he.lproj/ParseUI.strings | Bin 0 -> 6118 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ParseUI/Resources/Localization/he.lproj/ParseUI.strings diff --git a/ParseUI/Resources/Localization/he.lproj/ParseUI.strings b/ParseUI/Resources/Localization/he.lproj/ParseUI.strings new file mode 100644 index 0000000000000000000000000000000000000000..a3e85e3aa2e69d676b232dfb799c52426d52bfba GIT binary patch literal 6118 zcmd5=T~Av_5S^F%l3%exiXug7^4_XSQNU5uDA1O)&%_vm3U-U#qWnwTngWGVLy;Ww zBif!b%QCxr@3pZ?s>rf^KXzy5rZK$_75$(#N+e9a)zhJbf%r<$)|z zzFolk&+%Q5QE^yY6n_;9@)<@yz#K|kg^V6P`;fN>*$%%g+_$iXlU=>;VN4rW4y$%_ zPD5T{d|O`P{#!h4Vg7T~sE_$wXtjf9dl+lFab^n=*D;=2@8iEOTeyl>+D&7~z zc*5(mf+McfH%=~aeSz^qycrb}%sJ9ApCqzl|2>CR9cbE0A`w3|T?UYTjFrx^7%V~i zeMs5C|GLIt8TQkUu?MG(vNa~fFIeS3Eg0bU5Vrn`|1|1LvLfHfYeaEH7G()>d@V2F zvkIjh;mtxUC%!!}3Sg9-DM^VV%nB*%+B2ov4!#ImU zLvho_FEcpL?`Mg8BCLL-tv4x7q5U;-!7}6-vMkO7V(1%LlSQEFl`I2Q=FjpwlTD0X z!-_vMJ6K_SHtecJE#x&nCbe#a$v!SFA(wf72(0?~sn$V8z(ij0y0WQWY{*x@4r|&w z*tm{pvBKT0_N8kCEkcE2MWB}9dF)fpBvM&tQ@g`cv-PwXDJJq-~S}h2D0*7JVAls@Hym{9`xDW4j_>M!4Xe$zYA0z}no>yds#7^EW2T zvOe`%K7$@&6?5p}Tbi}>8od{~S)O0s3#-yV?brs^JMu<;xMNk1cVW|8F}S5LA^()mD++`HY%n-!4$e$PlNj zxv`D+i{*e)@@&s*xfT)OkP#_Mj~VV08N!wk*g)K!Q@h^40!rhKfm)Nu!}v!b~@EIox+wwbWC!pm<>;}jdkNkWg)(n)#J~1 zn3st6-5AR1ZH>&)#~qq~W;-{svJIdq)T~Xd^bX9Z3++5+S<`sO{aLjK4%GJ84@2FH z*=~&;@Ap!)Utrx1zI#A$6Q16|IG7s_&o$cgUUWbD`p=F$ z$hgO
GF=7R%!wvHM0QPW0Q6}Np6_Z(yGVkafuknR!k>f(3gG1Bgb_gL2{?@P>r z1MJ49)v~}7oH7MtFX?lWHv|Kk=$<~U8tM3IpVyBu`Kib2R*P#CD=(SSI(B>hB!g%U z49RB`vyFUZetr~p{! zdj}$Ra>Ke<<#~UE=sAg{#MROX^JxTp=XH~{?`QaM2b%I!%d}&zru8fKetn$?SeV66 z>C=$2RsPRc_fepCP2X}Paz!Cp_1-b6X;GbhB&o=%k0!+Mk{p#0c`|BYsb4Yu29| RlyM$%KYwG=ay}b$`xjP-uv`ED literal 0 HcmV?d00001 From c23041cd958434c63c0a4a6b522930d864c76f77 Mon Sep 17 00:00:00 2001 From: Christian Hedin Date: Mon, 15 Jan 2018 16:16:05 +0100 Subject: [PATCH 58/63] Adds Swedish localization. (#159) --- .../Localization/sv.lproj/ParseUI.strings | Bin 0 -> 6690 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ParseUI/Resources/Localization/sv.lproj/ParseUI.strings diff --git a/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings b/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings new file mode 100644 index 0000000000000000000000000000000000000000..2ab3c1b9b9b7dc9eac5cf1f2cecc31c89780c254 GIT binary patch literal 6690 zcmd6s+fExt7{}*2Pq9LZD&?YifT~JSun{T>6iBLGZt!AU45nTO!~^zCl2^!O+y8Gq zrgK_zXh;=Vc)h#xo&Mi(hQI%M>0Y?TZMum*Gq=*;!deOr6xc6G!c|D-H@OrK!vvJ?K=k6zce=i#Y1|z-4l2kHQVQDJs>|a@?_lf)L z^>1(KKk3RFbo=P-YsF!%Ri=fZXQ-hmw)gH#GLH2P7i_>Du*r2z{qb6BFGSP%RRO*9 zX|!$AT?vh)yAj{qt6Re3T72fZw%*o}*5R4dCwHxiQpUHsTuFCOyYT4EJ>QA$Kyg~h z-*dmZH;R%yx9PSNCvV)gXoEdldS1VeGIu@Imc9=P&Z8uP0=M`qa!8-0_zvL^pGA7J zI!86GYlP&nJ|8@)7EKd>XJ|A+3J($w7QxZ>FX0mP3vqpN>mB5hH6PuHKKPt`4L*DC zJx?Z($-_Py>m6~&+J#~^YFxgFTGVe+tjAvJRNrJ^S!rHn5{S(8E2G41q54@d0LL=> zUKO!I)E&Abx2ZVXbtA=Lw5fgv~syck4gmo*ToL$dhqVGmN zvx;e4^0*6}LTr^)c_C`6%D*TEJ0W=^eOq}Fo)4?fxs0GisG?ER<*l8yhEwUVqu9z3 z2v1Y1=^S(;tH5`0ianx?v|%Y}S1BphYhZnj+E&w~@eD@6o>bD&Z7;J9aldBy`iJOM zQq)=z8$^+HSF1?O3Pc0BLLFN9`!DI@hJeWeE4mr7q76jA+~XAM4EWB}|9ZW-QH`M= zQlI)Fr}o^>(lk_c?jm2iOYJV}Nu(^_L@v8Uzs_T?qysf-A)WkGS3?p+LnkdW(U4(2 zI+VpA@YY>EFavAp=gMa04V!ryp=MRD(=U7eTsSsD)Fuw&&zMihO?+mvSfjZLIq=4NOkME5+Z*Xr*UJ+6rA?Dq@-&f|*4rAt11}G2*GE7v zivwn1vK#J?HUHGYG%EgY>#T0ox%g*g8MCEL2CZg;x`RG6Q)?_jh7&W?$P|yK%@QJq z_$O{{{zn!u)hO5U-AtMV@AQs!SDKNiQRF97=xe-er%+B6Wu(9LvX`Q3l_OAo8@5v` zKqBb%Uu*{r!-uIP@T#*tPS@Xt_4K|@ez1=8ILmWdI+NvfU)8wOYS#SWr!A|*>toz{ zCVlZ?li0qmjYAR6ZrLI=SW5hIJ`gl!0BghN1d0~1H;nzBzt=arpQ-AEWdIWs zHG;Ky&jVrWzE+P$x(~BKm}B<6ABI<@vTes7c5G+T;=!FTX@iS7K-ty;B!l9oVu{w>myLk@zBj?{}Ul@EAWtC?hF}gX^ zX?>ruPMXV4D+CiSGgB)HVkhs3mZ#(wxLP(mW^PO;pQC}g5YEEjo$CQ*USmQ|&_U3| z`XXl-Gu0DL7|47(X&bJxBO$U7HP*&zWL8H_$frixaH)@-M6d#V^2{UmnKzA|oi(ev-8esESzySW6k{G5Qa3#LUg3eQ Date: Mon, 15 Jan 2018 16:18:27 +0100 Subject: [PATCH 59/63] fix crashes by dispatching critical operations to main queue (#260) * fix crashes by dispatching critical operations to main queue * dispatch to main queue to fix crashes * refresh control is supported in collection view since ios 10 * actually use collection view refresh control property * explicit reference to collectionView required * remove refresh pagination cell, it is not required --- .../PFQueryCollectionViewController.m | 63 +++++++++-------- .../PFQueryTableViewController.m | 69 +++++++++---------- 2 files changed, 62 insertions(+), 70 deletions(-) diff --git a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m index 6df7599..8efcf00 100644 --- a/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m +++ b/ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m @@ -44,8 +44,6 @@ @interface PFQueryCollectionViewController () { NSInteger _lastLoadCount; // The count of objects from the last load. } -@property (nonatomic, strong) UIRefreshControl *refreshControl; - @property (nonatomic, strong) PFLoadingView *loadingView; @property (nonatomic, strong) PFActivityIndicatorCollectionReusableView *currentNextPageView; @@ -128,11 +126,10 @@ - (void)loadView { withReuseIdentifier:PFQueryCollectionViewNextPageReusableViewIdentifier]; if (self.pullToRefreshEnabled) { - self.refreshControl = [[UIRefreshControl alloc] init]; - [self.refreshControl addTarget:self + self.collectionView.refreshControl = [[UIRefreshControl alloc] init]; + [self.collectionView.refreshControl addTarget:self action:@selector(_refreshControlValueChanged:) forControlEvents:UIControlEventValueChanged]; - [self.collectionView addSubview:self.refreshControl]; self.collectionView.alwaysBounceVertical = YES; } } @@ -200,7 +197,7 @@ - (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths { } BFContinuationBlock deletionHandlerBlock = ^id (BFTask *task) { - self.refreshControl.enabled = YES; + self.collectionView.refreshControl.enabled = YES; if (task.error) { [self _handleDeletionError:task.error]; @@ -240,38 +237,40 @@ - (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths { BFTaskCompletionSource *> *source = [BFTaskCompletionSource taskCompletionSource]; [query findObjectsInBackgroundWithBlock:^(NSArray *foundObjects, NSError *error) { - if (![Parse isLocalDatastoreEnabled] && - query.cachePolicy != kPFCachePolicyCacheOnly && - error.code == kPFErrorCacheMiss) { - // no-op on cache miss - return; - } + dispatch_async(dispatch_get_main_queue(), ^{ + if (![Parse isLocalDatastoreEnabled] && + query.cachePolicy != kPFCachePolicyCacheOnly && + error.code == kPFErrorCacheMiss) { + // no-op on cache miss + return; + } - self.loading = NO; + self.loading = NO; - if (error) { - _lastLoadCount = -1; - _currentNextPageView.animating = NO; - } else { - _currentPage = page; - _lastLoadCount = [foundObjects count]; + if (error) { + _lastLoadCount = -1; + _currentNextPageView.animating = NO; + } else { + _currentPage = page; + _lastLoadCount = [foundObjects count]; - if (clear) { - [_mutableObjects removeAllObjects]; - } + if (clear) { + [_mutableObjects removeAllObjects]; + } - [_mutableObjects addObjectsFromArray:foundObjects]; - [self.collectionView reloadData]; - } + [_mutableObjects addObjectsFromArray:foundObjects]; + [self.collectionView reloadData]; + } - [self objectsDidLoad:error]; - [self.refreshControl endRefreshing]; + [self objectsDidLoad:error]; + [self.collectionView.refreshControl endRefreshing]; - if (error) { - [source trySetError:error]; - } else { - [source trySetResult:foundObjects]; - } + if (error) { + [source trySetError:error]; + } else { + [source trySetResult:foundObjects]; + } + }); }]; return source.task; } diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m index bf7a0d0..230bc3c 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m @@ -208,9 +208,11 @@ - (void)_alterQuery:(PFQuery *)query forLoadingPage:(NSInteger)page { } - (void)clear { - [_mutableObjects removeAllObjects]; - [self.tableView reloadData]; - _currentPage = 0; + dispatch_async(dispatch_get_main_queue(), ^{ + [_mutableObjects removeAllObjects]; + [self.tableView reloadData]; + _currentPage = 0; + }); } - (BFTask *> *)loadObjects { @@ -226,38 +228,38 @@ - (void)clear { BFTaskCompletionSource *> *source = [BFTaskCompletionSource taskCompletionSource]; [query findObjectsInBackgroundWithBlock:^(NSArray *foundObjects, NSError *error) { - if (![Parse isLocalDatastoreEnabled] && - query.cachePolicy != kPFCachePolicyCacheOnly && - error.code == kPFErrorCacheMiss) { - // no-op on cache miss - return; - } + dispatch_async(dispatch_get_main_queue(), ^{ + if (![Parse isLocalDatastoreEnabled] && + query.cachePolicy != kPFCachePolicyCacheOnly && + error.code == kPFErrorCacheMiss) { + // no-op on cache miss + return; + } - self.loading = NO; + self.loading = NO; - if (error) { - _lastLoadCount = -1; - [self _refreshPaginationCell]; - } else { - _currentPage = page; - _lastLoadCount = [foundObjects count]; + if (error) { + _lastLoadCount = -1; + } else { + _currentPage = page; + _lastLoadCount = [foundObjects count]; - if (clear) { - [_mutableObjects removeAllObjects]; - } + if (clear) { + [_mutableObjects removeAllObjects]; + } - [_mutableObjects addObjectsFromArray:foundObjects]; + [_mutableObjects addObjectsFromArray:foundObjects]; + } [self.tableView reloadData]; - } - - [self objectsDidLoad:error]; - [self.refreshControl endRefreshing]; + [self objectsDidLoad:error]; + [self.refreshControl endRefreshing]; - if (error) { - [source trySetError:error]; - } else { - [source trySetResult:foundObjects]; - } + if (error) { + [source trySetError:error]; + } else { + [source trySetResult:foundObjects]; + } + }); }]; return source.task; @@ -266,7 +268,6 @@ - (void)clear { - (void)loadNextPage { if (!self.loading) { [self loadObjects:(_currentPage + 1) clear:NO]; - [self _refreshPaginationCell]; } } @@ -486,14 +487,6 @@ - (BOOL)_shouldShowPaginationCell { (_lastLoadCount == -1 || _lastLoadCount >= (NSInteger)self.objectsPerPage)); } -// Selectively refresh pagination cell -- (void)_refreshPaginationCell { - if ([self _shouldShowPaginationCell]) { - [self.tableView reloadRowsAtIndexPaths:@[ [self _indexPathForPaginationCell] ] - withRowAnimation:UITableViewRowAnimationNone]; - } -} - // The row of the pagination cell - (NSIndexPath *)_indexPathForPaginationCell { return [NSIndexPath indexPathForRow:[self.objects count] inSection:0]; From e88004f104507350a87cf86cfa1535adc90d91f6 Mon Sep 17 00:00:00 2001 From: Duncan Cunningham Date: Mon, 15 Jan 2018 16:20:19 +0100 Subject: [PATCH 60/63] Put localizations in resource bundle (#246) --- ParseUI.podspec | 2 +- ParseUI/Classes/Internal/PFLocalization.h | 14 +++++-- ParseUI/Classes/Internal/PFLocalization.m | 46 +++++++++++++++++++++++ 3 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 ParseUI/Classes/Internal/PFLocalization.m diff --git a/ParseUI.podspec b/ParseUI.podspec index 0e7b588..1b460fb 100644 --- a/ParseUI.podspec +++ b/ParseUI.podspec @@ -27,7 +27,7 @@ Pod::Spec.new do |s| 'ParseUI/Classes/Views/*.h', 'ParseUI/Classes/Cells/*.h', 'ParseUI/Other/*.h' - s.resources = ['ParseUI/Resources/Localization/*.lproj'] + s.resource_bundles = { 'ParseUI' => ['ParseUI/Resources/Localization/*.lproj'] } s.frameworks = 'Foundation', 'UIKit', 'CoreGraphics', diff --git a/ParseUI/Classes/Internal/PFLocalization.h b/ParseUI/Classes/Internal/PFLocalization.h index 7c0258b..a328dfb 100644 --- a/ParseUI/Classes/Internal/PFLocalization.h +++ b/ParseUI/Classes/Internal/PFLocalization.h @@ -19,10 +19,16 @@ * */ -#ifndef ParseUI_PFLocalization_h -#define ParseUI_PFLocalization_h +#import #define PFLocalizedString(key, comment) \ -[[NSBundle bundleForClass:[self class]] localizedStringForKey:key value:nil table:@"ParseUI"] +[PFLocalization localizedStringForKey:key] -#endif +/** + Used by the above macro to fetch a localized string + */ +@interface PFLocalization : NSObject + ++ (NSString *)localizedStringForKey:key; + +@end diff --git a/ParseUI/Classes/Internal/PFLocalization.m b/ParseUI/Classes/Internal/PFLocalization.m new file mode 100644 index 0000000..162b958 --- /dev/null +++ b/ParseUI/Classes/Internal/PFLocalization.m @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2014, Parse, LLC. All rights reserved. + * + * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, + * copy, modify, and distribute this software in source code or binary form for use + * in connection with the web services and APIs provided by Parse. + * + * As with any software that integrates with the Parse platform, your use of + * this software is subject to the Parse Terms of Service + * [https://www.parse.com/about/terms]. This copyright notice shall be + * included in all copies or substantial portions of the software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#import "PFLocalization.h" + +@implementation PFLocalization + ++ (NSString *)localizedStringForKey:key { + return [[self resourcesBundle] localizedStringForKey:key value:nil table:@"ParseUI"]; +} + ++ (NSBundle *)resourcesBundle { + static NSBundle *bundle; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSBundle *classBundle = [NSBundle bundleForClass:[self class]]; + NSURL *bundleURL = [classBundle URLForResource:@"ParseUI" withExtension:@"bundle"]; + + if (bundleURL) { + bundle = [NSBundle bundleWithURL:bundleURL]; + } else { + bundle = [NSBundle mainBundle]; + } + }); + return bundle; +} + +@end From 8668fa44fc30b9f90f752a4f439abf638772892e Mon Sep 17 00:00:00 2001 From: Stephan Tomforde Date: Mon, 15 Jan 2018 16:20:43 +0100 Subject: [PATCH 61/63] Add German translation (#244) * Add German translation * Typo --- .../Localization/de.lproj/ParseUI.strings | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 ParseUI/Resources/Localization/de.lproj/ParseUI.strings diff --git a/ParseUI/Resources/Localization/de.lproj/ParseUI.strings b/ParseUI/Resources/Localization/de.lproj/ParseUI.strings new file mode 100644 index 0000000..88587dc --- /dev/null +++ b/ParseUI/Resources/Localization/de.lproj/ParseUI.strings @@ -0,0 +1,110 @@ +/* Additional */ +"Additional" = "Zusätzlich"; + +/* Password reset message in PFLogInViewController */ +"An email with reset instructions has been sent to '%@'." = "Eine E-Mail mit Anweisungen zum Zurücksetzen wurde gesendet an '%@' gesendet."; + +/* Cancel */ +"Cancel" = "Abbrechen"; + +/* Download Error */ +"Download Error" = "Download-Fehler"; + +/* DOWNLOADING */ +"DOWNLOADING" = "DOWNLOADING"; + +/* Email */ +"Email" = "E-Mail"; + +/* Error */ +"Error" = "Fehler"; + +/* Error occurred during deletion */ +"Error occurred during deletion" = "Fehler beim Löschen"; + +/* Facebook */ +"Facebook" = "Facebook"; + +/* Forgot Password? */ +"Forgot Password?" = "Passwort vergessen?"; + +/* INSTALLED */ +"INSTALLED" = "INSTALLED"; + +/* Load more... */ +"Load more..." = "Laden Sie mehr ..."; + +/* Loading message of PFQueryTableViewController */ +"Loading..." = "Laden..."; + +/* Log In */ +"Log In" = "Einloggen"; + +/* Log In with Facebook */ +"Log In with Facebook" = "Einloggen mit Facebook"; + +/* Log In with Twitter */ +"Log In with Twitter" = "Einloggen mit Twitter"; + +/* Login failed alert title in PFLogInViewController */ +"Login Failed" = "Anmeldung fehlgeschlagen"; + +/* OK */ +"OK" = "OK"; + +/* Password */ +"Password" = "Passwort"; + +/* Password too short error message in PFSignUpViewController */ +"Password must be at least %d characters." = "Das Passwort muss mindestens %d Zeichen lang sein."; + +/* Password reset success alert title in PFLogInViewController. */ +"Password Reset" = "Passwort zurücksetzen"; + +/* Password reset error alert title in PFLogInViewController. */ +"Password Reset Failed" = "Passwort rücksetzen gescheitert"; + +/* Password missing error message in PFSignUpViewController */ +"Please enter a password." = "Bitte ein Passwort eingeben."; + +/* Username missing error message in PFSignUpViewController */ +"Please enter a username." = "Bitte einen Benutzernamen eingeben."; + +/* Email missing error message in PFSignUpViewController */ +"Please enter an email." = "Bitte eine E-Mail Adresse eingeben."; + +/* Email request message in PFLogInViewController */ +"Please enter the email address for your account." = "Bitte geben Sie die E-Mail -Adresse für Ihr Konto ein."; + +/* Generic login failed alert message in PFLogInViewController */ +"Please try again" = "Bitte versuche es erneut"; + +/* Purchase Error */ +"Purchase Error" = "Kauf Fehler"; + +/* Forgot password request title in PFLogInViewController */ +"Reset Password" = "Passwort zurücksetzen"; + +/* Sign Up */ +"Sign Up" = "Anmelden"; + +/* Sign Up Error */ +"Sign Up Error" = "Fehler bei der Registrierung"; + +/* Email is taken error format in PFSignUpViewController. */ +"The email '%@' is taken. Please try using a different email." = "Die E-Mail-Adresse '%@' wird bereits benutzt. Bitte versuchen Sie eine andere E-Mail-Adresse."; + +/* Invalid email address error message in PFSignUpViewControllers */ +"The email address is invalid. Please enter a valid email." = "Die E-Mail Adresse ist ungültig. Bitte geben Sie eine gültige E-Mail-Adresse ein."; + +/* Username taken error format in PFSignUpViewController */ +"The username '%@' is taken. Please try choosing a different username." = "Der Benutzername '%@' wird bereits benutzt. Bitte versuchen Sie einen anderen Benutzernamen."; + +/* Invalid login credentials alert message in PFLogInViewController */ +"The username and password you entered don't match" = "Der Benutzername und das eingegebene Passwort stimmen nicht überein"; + +/* Twitter */ +"Twitter" = "Twitter"; + +/* Username */ +"Username" = "Benutzername"; From 3276f7f19156840cb37942b0148de78184031dcb Mon Sep 17 00:00:00 2001 From: Perjan Duro Date: Mon, 15 Jan 2018 16:21:32 +0100 Subject: [PATCH 62/63] Adds ability to remove cells without deleting PFObjects (#236) * Adds ability to remove cells without deleting PFObjects * Fixes the removeCellsAtIndexPaths method --- .../PFQueryTableViewController.h | 12 ++++++++++++ .../PFQueryTableViewController.m | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h index 62d4a01..a0aa27b 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h @@ -183,6 +183,18 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexPaths animated:(BOOL)animated; +/** + Removes the cell at the specified indexPath, with or without animation. + Important: This method only removes the cell. It does not delete any PFObject on the backend. + */ +- (void)removeCellAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated; + +/** + Removes the cells at the specified indexPaths, with or without animation. + Important: This method only removes the cells. It does not delete any PFObject on the backend. + */ +- (void)removeCellsAtIndexPaths:(NSArray *)indexPaths animated:(BOOL)animated; + /** Clears the table of all objects. */ diff --git a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m index 230bc3c..60cde62 100644 --- a/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m +++ b/ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m @@ -363,6 +363,23 @@ - (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths { [self removeObjectsAtIndexPaths:indexPaths animated:YES]; } +- (void)removeCellAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated { + [self removeCellsAtIndexPaths:@[indexPath] animated: animated]; +} + +- (void)removeCellsAtIndexPaths:(NSArray *)indexPaths animated:(BOOL)animated { + NSMutableIndexSet *mutableIndexSet = [[NSMutableIndexSet alloc]init]; + + for (NSIndexPath *indexPath in indexPaths) { + [mutableIndexSet addIndex:indexPath.row]; + } + + [_mutableObjects removeObjectsAtIndexes:mutableIndexSet]; + + [self.tableView deleteRowsAtIndexPaths:indexPaths + withRowAnimation:animated ? UITableViewRowAnimationAutomatic : UITableViewRowAnimationNone]; +} + - (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths animated:(BOOL)animated { if (indexPaths.count == 0) { return; From aae7d1475f71b6c9695f57bc007909fcd12ac722 Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Sat, 20 Jan 2018 19:57:11 -0500 Subject: [PATCH 63/63] Archival notice (#267) --- README.md | 117 +++++------------------------------------------------- 1 file changed, 9 insertions(+), 108 deletions(-) diff --git a/README.md b/README.md index 992658b..bea8637 100644 --- a/README.md +++ b/README.md @@ -1,119 +1,20 @@ -# ParseUI +# [ARCHIVE] ParseUI -[![Build Status](http://img.shields.io/travis/ParsePlatform/ParseUI-iOS/master.svg?style=flat)](https://travis-ci.org/ParsePlatform/ParseUI-iOS) -[![Pod Version](http://img.shields.io/cocoapods/v/ParseUI.svg?style=flat)](http://cocoadocs.org/docsets/ParseUI/) -[![Pod Platform](http://img.shields.io/cocoapods/p/ParseUI.svg?style=flat)](http://cocoadocs.org/docsets/ParseUI/) -[![Pod License](http://img.shields.io/cocoapods/l/ParseUI.svg?style=flat)](https://github.com/ParsePlatform/ParseUI-iOS/blob/master/LICENSE) - -## Overview - -`ParseUI` is a collection of a handy user interface components to be used with Parse iOS SDK, -which streamline and simplify logging in / signing up `PFUser`s and displaying a list of `PFObject`s. +# ParseUI has moved to [Parse-SDK-iOS-OSX](https://github.com/parse-community/Parse-SDK-iOS-OSX) -## Getting Started +## Migration -#### CocoaPods +### CocoaPods -`ParseUI` is available on CocoaPods. -Add the following to your `Podfile`: +Update your `Podfile`: ```ruby -pod 'ParseUI' +pod 'Parse/UI' ``` +### Carthage -#### Packaged Releases - -You can download the latest release in a form of `ParseUI.framework` from our [Releases](https://github.com/ParsePlatform/ParseUI-iOS/releases) page. - -Add `ParseUI.framework` to your Xcode project by dragging it into your project folder target, then add the following to any files that use `ParseUI` components: - - #import - -#### Build from Source +Update your `Cartfile`: -`ParseUI` can also be built from source and supports Xcode subproject referencing. -Follow these steps to build and run via source code: -- Download the source code via `git clone` or in an archive -- Run `pod install` in the repo root to download all the dependencies -- Open `ParseUI.xcworkspace` -- Build and Run `ParseUIDemo` target - -## Components - -#### PFLogInViewController -If you are using Parse to manage users in your mobile app, you are already familiar with the `PFUser` class. -At some point in your app, you might want to present a screen to log in your `PFUser`. -`ParseUI` provides a view controller that does exactly this: -```objective-c -PFLogInViewController *logInViewController = [[PFLogInViewController alloc] init]; -logInViewController.delegate = self; -[self presentViewController:logInViewController animated:YES completion:nil]; -``` - -#### PFSignUpViewController -If you are using `PFLogInViewController` with the `PFLogInFieldsSignUpButton` option enabled, -you do not need to do any additional work to enable the sign up functionality. -When your user taps on the sign up button on the log in screen - a sign up screen will appear. -However, there are occasions where you might want to use the sign up screen independently of the log in screen. -This is when the `PFSignUpViewController` comes in handy. -```objective-c -PFSignUpViewController *controller = [[PFSignUpViewController alloc] init]; -controller.delegate = self; -[self presentViewController:controller animated:YES completion:nil]; ``` - -#### PFQueryTableViewController -Data oriented iOS applications are mostly a collection of `UITableViewController`s and corresponding `UITableView`s. -When using Parse, each cell of a `UITableView` typically represents data from a `PFObject`. -`PFQueryTableViewController` is a sub-class of `UITableViewController` that provides a layer of abstraction that lets you easily display data from one of your Parse classes. -```objective-c -PFQueryTableViewController *controller = [[PFQueryTableViewController alloc] initWithStyle:UITableViewStylePlain className:@"Todo"]; -[self presentViewController:controller animated:YES completion:nil]; +github "ParsePlatform/Parse-SDK-iOS-OSX" ``` - -#### PFQueryCollectionViewController -A lot of advanced use cases usually include displaying data in a custom dynamic layout that is different from a simple list. -`PFQueryTableViewController` is a sub-class of `UICollectionViewController` that provides a layer of abstraction that lets you easily display data from one of your Parse classes in any dynamic and custom layout you might think of - -To display data in a simple grid layout you can use the default `UICollectionViewFlowLayout`: -```objective-c -PFQueryCollectionViewController *controller = [[PFQueryCollectionViewController alloc] initWithClassName:@"Todo"]; -UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout *)controller.collectionViewLayout; -flowLayout.itemSize = CGSizeMake(100.0f, 100.0f); -[self presentViewController:controller animated:YES completion:nil]; -``` - -And, for example, to display data in a circular layout - you can pass an instance of `UICollectionViewLayout` at initialization time: -```objective-c -UICollectionViewLayout *customCircularLayout = ...; -PFQueryCollectionViewController *controller = [[PFQueryCollectionViewController alloc] initWithCollectionViewLayout:customCircularLayout - className:@"Todo"]; -[self presentViewController:controller animated:YES completion:nil]; -``` - -#### PFImageView -Many apps need to display images stored in the Parse Cloud as `PFFile`s. -However, to load remote images with the built-in `UIImageView` involves writing many lines of boilerplate code. -`PFImageView` simplifies this task by abstracting away these parts. -```objective-c -PFImageView *imageView = [[PFImageView alloc] init]; -imageView.image = [UIImage imageNamed:@"..."]; // placeholder image -imageView.file = (PFFile *)someObject[@"picture"]; // remote image -[imageView loadInBackground]; -``` - -#### PFProductTableViewController -`PFProductTableViewController` is a subclass of `PFQueryTableViewController` that displays all IAP products in a table view. Some content apps, such as an app that sells comic books or video tutorials, may find it handy to use `PFProductTableViewController` to sell the products. By default, each cell is a product, and tapping on a cell initiates the purchase for the product. If the product has associated downloadable content, the download will start when the cell is selected and a progress bar is displayed to indicate the progress of the download. - -## Learn More -- Check out [ParseUIDemo](https://github.com/ParsePlatform/ParseUI-iOS/tree/master/ParseUIDemo) project -- Read the [iOS Guides](https://parseplatform.github.io/docs/ios/guide/) -- Browse official [API Reference](https://parse.com/docs/ios/api/) -- Follow few [tutorials](https://parse.com/tutorials/) - -## Contributing -See the CONTRIBUTING file for how to help out. - ------ - -As of April 5, 2017, Parse, LLC has transferred this code to the parse-community organization, and will no longer be contributing to or distributing this code.