From 139eca7f2423bf92c5b6d821eaf4cda16816dd6f Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sun, 28 Apr 2024 09:39:16 -0500 Subject: [PATCH 01/24] feat: Remove `ParseUI` (#1783) BREAKING CHANGE: This release removes `ParseUI`. --- .github/workflows/ci.yml | 1 - .gitignore | 1 - Package.swift | 12 - Parse.xcworkspace/contents.xcworkspacedata | 3 - .../ParseStarterProject/AppDelegate.swift | 3 - .../ParseStarterProjectAppDelegate.m | 3 - .../ParseStarterProject/AppDelegate.swift | 3 - ParseUI/.gitignore | 1 - .../ParseUI-iOS-Dynamic.xcconfig | 16 - ParseUI/Configurations/ParseUI-iOS.xcconfig | 16 - ParseUI/Configurations/Shared | 1 - ParseUI/ParseUI.xcodeproj/project.pbxproj | 2111 ----------------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcschemes/ParseUI-Dynamic.xcscheme | 76 - .../xcshareddata/xcschemes/ParseUI.xcscheme | 104 - .../xcschemes/ParseUIDemo-Swift.xcscheme | 87 - .../xcschemes/ParseUIDemo.xcscheme | 87 - ...FActivityIndicatorCollectionReusableView.h | 38 - ...FActivityIndicatorCollectionReusableView.m | 115 - .../Cells/PFActivityIndicatorTableViewCell.h | 38 - .../Cells/PFActivityIndicatorTableViewCell.m | 64 - ParseUI/ParseUI/Internal/Extensions/PFColor.h | 49 - ParseUI/ParseUI/Internal/Extensions/PFColor.m | 76 - ParseUI/ParseUI/Internal/Extensions/PFImage.h | 31 - ParseUI/ParseUI/Internal/Extensions/PFImage.m | 111 - ParseUI/ParseUI/Internal/Extensions/PFRect.h | 30 - ParseUI/ParseUI/Internal/Extensions/PFRect.m | 48 - .../Internal/Extensions/PFUIAlertView.h | 64 - .../Internal/Extensions/PFUIAlertView.m | 213 -- ParseUI/ParseUI/Internal/PFImageCache.h | 34 - ParseUI/ParseUI/Internal/PFImageCache.m | 47 - ParseUI/ParseUI/Internal/PFLocalization.h | 34 - ParseUI/ParseUI/Internal/PFLocalization.m | 52 - .../PFAppleAuthenticationProvider.h | 19 - .../PFAppleAuthenticationProvider.m | 17 - .../Sign In With Apple/PFAppleUtils.h | 32 - .../Sign In With Apple/PFAppleUtils.m | 125 - .../Internal/Views/Buttons/PFActionButton.h | 65 - .../Internal/Views/Buttons/PFActionButton.m | 202 -- .../Internal/Views/Buttons/PFDismissButton.h | 26 - .../Internal/Views/Buttons/PFDismissButton.m | 84 - .../Internal/Views/Buttons/PFPrimaryButton.h | 31 - .../Internal/Views/Buttons/PFPrimaryButton.m | 110 - .../Internal/Views/Buttons/PFTextButton.h | 26 - .../Internal/Views/Buttons/PFTextButton.m | 53 - .../ParseUI/Internal/Views/PFLoadingView.h | 29 - .../ParseUI/Internal/Views/PFLoadingView.m | 81 - .../ParseUI/Resources/Images/apple_icon.png | Bin 410 -> 0 bytes .../Resources/Images/apple_icon@2x.png | Bin 844 -> 0 bytes .../Resources/Images/apple_icon@3x.png | Bin 1296 -> 0 bytes .../Resources/Images/facebook_icon.png | Bin 1285 -> 0 bytes .../Resources/Images/facebook_icon@2x.png | Bin 1575 -> 0 bytes .../Resources/Images/facebook_icon@3x.png | Bin 1754 -> 0 bytes .../ParseUI/Resources/Images/parse_logo.png | Bin 5403 -> 0 bytes .../Resources/Images/parse_logo@2x.png | Bin 10846 -> 0 bytes .../Resources/Images/parse_logo@3x.png | Bin 9845 -> 0 bytes .../ParseUI/Resources/Images/twitter_icon.png | Bin 1126 -> 0 bytes .../Resources/Images/twitter_icon@2x.png | Bin 2031 -> 0 bytes .../Resources/Images/twitter_icon@3x.png | Bin 3387 -> 0 bytes ParseUI/ParseUI/Resources/Info-iOS.plist | 28 - .../Localization/de.lproj/ParseUI.strings | 98 - .../Localization/en.lproj/ParseUI.strings | Bin 6068 -> 0 bytes .../Localization/fr.lproj/ParseUI.strings | Bin 6542 -> 0 bytes .../Localization/he.lproj/ParseUI.strings | Bin 5670 -> 0 bytes .../Localization/pt-BR.lproj/ParseUI.strings | 99 - .../Localization/sv.lproj/ParseUI.strings | Bin 6226 -> 0 bytes ParseUI/ParseUI/Source/PFCollectionViewCell.h | 61 - ParseUI/ParseUI/Source/PFCollectionViewCell.m | 97 - ParseUI/ParseUI/Source/PFImageView.h | 78 - ParseUI/ParseUI/Source/PFImageView.m | 153 -- ParseUI/ParseUI/Source/PFLogInView.h | 163 -- ParseUI/ParseUI/Source/PFLogInView.m | 455 ---- .../ParseUI/Source/PFLogInViewController.h | 180 -- .../ParseUI/Source/PFLogInViewController.m | 521 ---- ParseUI/ParseUI/Source/PFLogInView_Private.h | 28 - .../Source/PFProductTableViewController.h | 47 - .../Source/PFProductTableViewController.m | 248 -- .../ParseUI/Source/PFPurchaseTableViewCell.h | 68 - .../ParseUI/Source/PFPurchaseTableViewCell.m | 155 -- .../Source/PFQueryCollectionViewController.h | 228 -- .../Source/PFQueryCollectionViewController.m | 445 ---- .../Source/PFQueryTableViewController.h | 271 --- .../Source/PFQueryTableViewController.m | 589 ----- ParseUI/ParseUI/Source/PFResources.h | 10 - ParseUI/ParseUI/Source/PFResources.m | 50 - ParseUI/ParseUI/Source/PFSignUpView.h | 156 -- ParseUI/ParseUI/Source/PFSignUpView.m | 337 --- .../ParseUI/Source/PFSignUpViewController.h | 184 -- .../ParseUI/Source/PFSignUpViewController.m | 514 ---- ParseUI/ParseUI/Source/PFTableViewCell.h | 46 - ParseUI/ParseUI/Source/PFTableViewCell.m | 122 - ParseUI/ParseUI/Source/PFTextField.h | 77 - ParseUI/ParseUI/Source/PFTextField.m | 120 - ParseUI/ParseUI/Source/ParseUI.h | 34 - ParseUI/ParseUI/Source/ParseUIConstants.h | 44 - ParseUI/ParseUIDemo/Classes/AppDelegate.h | 28 - ParseUI/ParseUIDemo/Classes/AppDelegate.m | 108 - .../CustomLogInViewController.h | 26 - .../CustomLogInViewController.m | 38 - .../DeletionCollectionViewController.h | 26 - .../DeletionCollectionViewController.m | 170 -- .../PaginatedCollectionViewController.h | 26 - .../PaginatedCollectionViewController.m | 97 - .../SectionedCollectionViewController.h | 26 - .../SectionedCollectionViewController.m | 179 -- .../SimpleCollectionViewController.h | 26 - .../SimpleCollectionViewController.m | 96 - .../StoryboardCollectionViewController.h | 26 - .../StoryboardCollectionViewController.m | 83 - .../SubtitleImageCollectionViewController.h | 26 - .../SubtitleImageCollectionViewController.m | 90 - .../CustomProductTableViewController.h | 26 - .../CustomProductTableViewController.m | 46 - .../DeletionTableViewController.h | 26 - .../DeletionTableViewController.m | 142 -- .../PaginatedTableViewController.h | 28 - .../PaginatedTableViewController.m | 71 - .../SectionedTableViewController.h | 28 - .../SectionedTableViewController.m | 109 - .../SimpleTableViewController.h | 28 - .../SimpleTableViewController.m | 70 - .../StoryboardTableViewController.h | 26 - .../StoryboardTableViewController.m | 57 - .../SubtitleImageTableViewController.h | 26 - .../SubtitleImageTableViewController.m | 48 - .../CustomSignUpViewController.h | 26 - .../CustomSignUpViewController.m | 37 - .../Classes/PFUIDemoViewController.h | 28 - .../Classes/PFUIDemoViewController.m | 442 ---- .../LaunchImage.launchimage/Contents.json | 89 - ParseUI/ParseUIDemo/Other/Info.plist | 73 - ParseUI/ParseUIDemo/Other/main.m | 30 - ParseUI/ParseUIDemo/ParseUIDemo.entitlements | 10 - ParseUI/ParseUIDemo/Resources/0.png | Bin 21533 -> 0 bytes ParseUI/ParseUIDemo/Resources/1.png | Bin 23750 -> 0 bytes ParseUI/ParseUIDemo/Resources/2.png | Bin 20857 -> 0 bytes ParseUI/ParseUIDemo/Resources/Icon.png | Bin 31613 -> 0 bytes ...SimpleQueryCollectionStoryboard.storyboard | 37 - .../SimpleQueryTableStoryboard.storyboard | 32 - ParseUI/ParseUIDemo/Swift/AppDelegate.swift | 103 - .../CustomLogInViewController.swift | 41 - .../CustomProductTableViewController.swift | 42 - .../DeletionCollectionViewController.swift | 140 -- .../PaginatedCollectionViewController.swift | 89 - .../SectionedCollectionViewController.swift | 159 -- .../SimpleCollectionViewController.swift | 88 - .../StoryboardCollectionViewController.swift | 79 - ...ubtitleImageCollectionViewController.swift | 78 - .../DeletionTableViewController.swift | 118 - .../PaginatedTableViewController.swift | 69 - .../SectionedTableViewController.swift | 97 - .../SimpleTableViewController.swift | 68 - .../StoryboardTableViewController.swift | 63 - .../SubtitleImageTableViewController.swift | 46 - .../CustomSignUpViewController.swift | 41 - ...QueryCollectionStoryboard-Swift.storyboard | 38 - ...impleQueryTableStoryboard-Swift.storyboard | 31 - .../Swift/UIDemoViewController.swift | 350 --- ParseUI/Scripts/convert_images.rb | 166 -- ParseUI/SignInWithAppleTests/Info.plist | 22 - .../SignInWithAppleTests.m | 149 -- Rakefile | 60 - 163 files changed, 14933 deletions(-) delete mode 100644 ParseUI/.gitignore delete mode 100644 ParseUI/Configurations/ParseUI-iOS-Dynamic.xcconfig delete mode 100644 ParseUI/Configurations/ParseUI-iOS.xcconfig delete mode 120000 ParseUI/Configurations/Shared delete mode 100644 ParseUI/ParseUI.xcodeproj/project.pbxproj delete mode 100644 ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 ParseUI/ParseUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI-Dynamic.xcscheme delete mode 100644 ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme delete mode 100644 ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme delete mode 100644 ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme delete mode 100644 ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.h delete mode 100644 ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.m delete mode 100644 ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.h delete mode 100644 ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.m delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFColor.h delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFColor.m delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFImage.h delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFImage.m delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFRect.h delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFRect.m delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.h delete mode 100644 ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.m delete mode 100644 ParseUI/ParseUI/Internal/PFImageCache.h delete mode 100644 ParseUI/ParseUI/Internal/PFImageCache.m delete mode 100644 ParseUI/ParseUI/Internal/PFLocalization.h delete mode 100644 ParseUI/ParseUI/Internal/PFLocalization.m delete mode 100644 ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h delete mode 100644 ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.m delete mode 100644 ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h delete mode 100644 ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.m delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.h delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.m delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.h delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.m delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.h delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.m delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.h delete mode 100644 ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.m delete mode 100644 ParseUI/ParseUI/Internal/Views/PFLoadingView.h delete mode 100644 ParseUI/ParseUI/Internal/Views/PFLoadingView.m delete mode 100644 ParseUI/ParseUI/Resources/Images/apple_icon.png delete mode 100644 ParseUI/ParseUI/Resources/Images/apple_icon@2x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/apple_icon@3x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/facebook_icon.png delete mode 100644 ParseUI/ParseUI/Resources/Images/facebook_icon@2x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/facebook_icon@3x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/parse_logo.png delete mode 100644 ParseUI/ParseUI/Resources/Images/parse_logo@2x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/parse_logo@3x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/twitter_icon.png delete mode 100644 ParseUI/ParseUI/Resources/Images/twitter_icon@2x.png delete mode 100644 ParseUI/ParseUI/Resources/Images/twitter_icon@3x.png delete mode 100644 ParseUI/ParseUI/Resources/Info-iOS.plist delete mode 100644 ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings delete mode 100644 ParseUI/ParseUI/Source/PFCollectionViewCell.h delete mode 100644 ParseUI/ParseUI/Source/PFCollectionViewCell.m delete mode 100644 ParseUI/ParseUI/Source/PFImageView.h delete mode 100644 ParseUI/ParseUI/Source/PFImageView.m delete mode 100644 ParseUI/ParseUI/Source/PFLogInView.h delete mode 100644 ParseUI/ParseUI/Source/PFLogInView.m delete mode 100644 ParseUI/ParseUI/Source/PFLogInViewController.h delete mode 100644 ParseUI/ParseUI/Source/PFLogInViewController.m delete mode 100644 ParseUI/ParseUI/Source/PFLogInView_Private.h delete mode 100644 ParseUI/ParseUI/Source/PFProductTableViewController.h delete mode 100644 ParseUI/ParseUI/Source/PFProductTableViewController.m delete mode 100644 ParseUI/ParseUI/Source/PFPurchaseTableViewCell.h delete mode 100644 ParseUI/ParseUI/Source/PFPurchaseTableViewCell.m delete mode 100644 ParseUI/ParseUI/Source/PFQueryCollectionViewController.h delete mode 100644 ParseUI/ParseUI/Source/PFQueryCollectionViewController.m delete mode 100644 ParseUI/ParseUI/Source/PFQueryTableViewController.h delete mode 100644 ParseUI/ParseUI/Source/PFQueryTableViewController.m delete mode 100644 ParseUI/ParseUI/Source/PFResources.h delete mode 100644 ParseUI/ParseUI/Source/PFResources.m delete mode 100644 ParseUI/ParseUI/Source/PFSignUpView.h delete mode 100644 ParseUI/ParseUI/Source/PFSignUpView.m delete mode 100644 ParseUI/ParseUI/Source/PFSignUpViewController.h delete mode 100644 ParseUI/ParseUI/Source/PFSignUpViewController.m delete mode 100644 ParseUI/ParseUI/Source/PFTableViewCell.h delete mode 100644 ParseUI/ParseUI/Source/PFTableViewCell.m delete mode 100644 ParseUI/ParseUI/Source/PFTextField.h delete mode 100644 ParseUI/ParseUI/Source/PFTextField.m delete mode 100644 ParseUI/ParseUI/Source/ParseUI.h delete mode 100644 ParseUI/ParseUI/Source/ParseUIConstants.h delete mode 100644 ParseUI/ParseUIDemo/Classes/AppDelegate.h delete mode 100644 ParseUI/ParseUIDemo/Classes/AppDelegate.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.m delete mode 100644 ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.h delete mode 100644 ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m delete mode 100644 ParseUI/ParseUIDemo/Images.xcassets/LaunchImage.launchimage/Contents.json delete mode 100644 ParseUI/ParseUIDemo/Other/Info.plist delete mode 100644 ParseUI/ParseUIDemo/Other/main.m delete mode 100644 ParseUI/ParseUIDemo/ParseUIDemo.entitlements delete mode 100644 ParseUI/ParseUIDemo/Resources/0.png delete mode 100644 ParseUI/ParseUIDemo/Resources/1.png delete mode 100644 ParseUI/ParseUIDemo/Resources/2.png delete mode 100644 ParseUI/ParseUIDemo/Resources/Icon.png delete mode 100644 ParseUI/ParseUIDemo/Resources/SimpleQueryCollectionStoryboard.storyboard delete mode 100644 ParseUI/ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard delete mode 100644 ParseUI/ParseUIDemo/Swift/AppDelegate.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift delete mode 100644 ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard delete mode 100644 ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryTableStoryboard-Swift.storyboard delete mode 100644 ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift delete mode 100755 ParseUI/Scripts/convert_images.rb delete mode 100644 ParseUI/SignInWithAppleTests/Info.plist delete mode 100644 ParseUI/SignInWithAppleTests/SignInWithAppleTests.m diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2bb8fda31..795226514 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,6 @@ jobs: script: - test:ios - test:macos - - test:parseui:all - test:parse_live_query:all - build:starters - xcode15 # runs build:starters on XCode 15 diff --git a/.gitignore b/.gitignore index c21100b94..c0e10a65a 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,6 @@ docs/ ## AppCode .idea/ -ParseUI/Vendor # VSC .project diff --git a/Package.swift b/Package.swift index 517395cc4..a90168d5b 100644 --- a/Package.swift +++ b/Package.swift @@ -13,7 +13,6 @@ let package = Package( ], products: [ .library(name: "ParseObjC", targets: ["ParseCore"]), - .library(name: "ParseUI", targets: ["ParseUI"]), .library(name: "ParseLiveQuery", targets: ["ParseLiveQuery"]) ], dependencies: [ @@ -32,17 +31,6 @@ let package = Package( publicHeadersPath: "Source", cSettings: [.headerSearchPath("Internal/**")] ), - .target( - name: "ParseUI", - dependencies: [ - "ParseCore" - ], - path: "ParseUI/ParseUI", - exclude: ["Resources/Info-iOS.plist"], - resources: [.process("Resources")], - publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")] - ), .target( name: "ParseLiveQuery", dependencies: [ diff --git a/Parse.xcworkspace/contents.xcworkspacedata b/Parse.xcworkspace/contents.xcworkspacedata index b8be39c51..7ac2a7e28 100644 --- a/Parse.xcworkspace/contents.xcworkspacedata +++ b/Parse.xcworkspace/contents.xcworkspacedata @@ -7,9 +7,6 @@ - - diff --git a/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift b/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift index 5ffabbe1b..041502135 100644 --- a/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift +++ b/ParseStarterProject/iOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift @@ -12,9 +12,6 @@ import UserNotifications import ParseCore -// If you want to use any of the UI components, uncomment this line -// import ParseUI - @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { diff --git a/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m b/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m index f3bb506a7..2c4eeee6e 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m +++ b/ParseStarterProject/iOS/ParseStarterProject/ParseStarterProject/ParseStarterProjectAppDelegate.m @@ -9,9 +9,6 @@ @import ParseCore; -// If you want to use any of the UI components, uncomment this line -// #import - #import "ParseStarterProjectAppDelegate.h" #import "ParseStarterProjectViewController.h" diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift index a3c01de2c..d05431cf9 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarterProject/AppDelegate.swift @@ -11,9 +11,6 @@ import UIKit import ParseCore -// If you want to use any of the UI components, uncomment this line -// import ParseUI - @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { diff --git a/ParseUI/.gitignore b/ParseUI/.gitignore deleted file mode 100644 index f4096fee4..000000000 --- a/ParseUI/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Package.resolved diff --git a/ParseUI/Configurations/ParseUI-iOS-Dynamic.xcconfig b/ParseUI/Configurations/ParseUI-iOS-Dynamic.xcconfig deleted file mode 100644 index 751d6532b..000000000 --- a/ParseUI/Configurations/ParseUI-iOS-Dynamic.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/DynamicFramework.xcconfig" - -PRODUCT_NAME = ParseUI -PRODUCT_BUNDLE_IDENTIFIER = com.parse.parseui - -INFOPLIST_FILE = $(SRCROOT)/ParseUI/Resources/Info-iOS.plist diff --git a/ParseUI/Configurations/ParseUI-iOS.xcconfig b/ParseUI/Configurations/ParseUI-iOS.xcconfig deleted file mode 100644 index 2bfaced2e..000000000 --- a/ParseUI/Configurations/ParseUI-iOS.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) 2015-present, Parse, LLC. -// All rights reserved. -// -// This source code is licensed under the BSD-style license found in the -// LICENSE file in the root directory of this source tree. An additional grant -// of patent rights can be found in the PATENTS file in the same directory. -// - -#include "Shared/Platform/iOS.xcconfig" -#include "Shared/Product/StaticFramework.xcconfig" - -PRODUCT_NAME = ParseUI -PRODUCT_BUNDLE_IDENTIFIER = com.parse.parseui - -INFOPLIST_FILE = $(SRCROOT)/ParseUI/Resources/Info-iOS.plist diff --git a/ParseUI/Configurations/Shared b/ParseUI/Configurations/Shared deleted file mode 120000 index 657caabf0..000000000 --- a/ParseUI/Configurations/Shared +++ /dev/null @@ -1 +0,0 @@ -../../Vendor/xctoolchain/Configurations \ No newline at end of file diff --git a/ParseUI/ParseUI.xcodeproj/project.pbxproj b/ParseUI/ParseUI.xcodeproj/project.pbxproj deleted file mode 100644 index 95eaad508..000000000 --- a/ParseUI/ParseUI.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2111 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 39452DEC2AD8FC110066C2AE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DEB2AD8FC110066C2AE /* ParseObjC */; }; - 39452DF82AD9121D0066C2AE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DF72AD9121D0066C2AE /* ParseObjC */; }; - 39452DFA2AD9121D0066C2AE /* ParseUI in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DF92AD9121D0066C2AE /* ParseUI */; }; - 39452DFD2AD914110066C2AE /* BoltsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 39452DFC2AD914110066C2AE /* BoltsSwift */; }; - 39E22AD72AD0676700D9AE5C /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = 39E22AD62AD0676700D9AE5C /* OCMock */; }; - 39E249A52AD1DD2E0014357C /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 39E249A42AD1DD2E0014357C /* ParseObjC */; }; - 6B63F1602BC34E4A00F89DEE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F15F2BC34E4A00F89DEE /* ParseObjC */; }; - 6B63F1662BC3508200F89DEE /* ParseObjC in Frameworks */ = {isa = PBXBuildFile; productRef = 6B63F1652BC3508200F89DEE /* ParseObjC */; }; - 7C77D109292A509000C4D90E /* PFPurchaseTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0C9292A507500C4D90E /* PFPurchaseTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D10A292A509000C4D90E /* PFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CB292A507500C4D90E /* PFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D10B292A509000C4D90E /* PFQueryTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CD292A507500C4D90E /* PFQueryTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D10C292A509000C4D90E /* PFAppleUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D0292A507500C4D90E /* PFAppleUtils.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 7C77D10D292A509000C4D90E /* PFSignUpView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D3292A507500C4D90E /* PFSignUpView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D10E292A509000C4D90E /* PFTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D6292A507500C4D90E /* PFTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D10F292A509000C4D90E /* ParseUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D8292A507500C4D90E /* ParseUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D110292A509000C4D90E /* PFLogInView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D9292A507500C4D90E /* PFLogInView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D111292A509000C4D90E /* PFResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DB292A507500C4D90E /* PFResources.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D112292A509000C4D90E /* PFLogInViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DD292A507500C4D90E /* PFLogInViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D113292A509000C4D90E /* ParseUI.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DE292A507500C4D90E /* ParseUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D114292A509000C4D90E /* PFProductTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E1292A507500C4D90E /* PFProductTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D115292A509000C4D90E /* PFCollectionViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E2292A507500C4D90E /* PFCollectionViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D116292A509000C4D90E /* PFAppleAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E4292A507500C4D90E /* PFAppleAuthenticationProvider.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 7C77D117292A509000C4D90E /* PFImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E6292A507500C4D90E /* PFImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D118292A509000C4D90E /* PFSignUpViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E7292A507500C4D90E /* PFSignUpViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D119292A509000C4D90E /* PFLogInView_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E8292A507500C4D90E /* PFLogInView_Private.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D11A292A509000C4D90E /* PFQueryCollectionViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E9292A507500C4D90E /* PFQueryCollectionViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D11C292A509D00C4D90E /* PFActivityIndicatorCollectionReusableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0ED292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.h */; }; - 7C77D11D292A509D00C4D90E /* PFActivityIndicatorTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0EE292A507500C4D90E /* PFActivityIndicatorTableViewCell.h */; }; - 7C77D11E292A509D00C4D90E /* PFImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F0292A507500C4D90E /* PFImageCache.h */; }; - 7C77D11F292A509D00C4D90E /* PFColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F3292A507500C4D90E /* PFColor.h */; }; - 7C77D120292A509D00C4D90E /* PFUIAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F5292A507500C4D90E /* PFUIAlertView.h */; }; - 7C77D121292A509D00C4D90E /* PFRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F6292A507500C4D90E /* PFRect.h */; }; - 7C77D122292A509D00C4D90E /* PFImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F8292A507500C4D90E /* PFImage.h */; }; - 7C77D123292A509D00C4D90E /* PFLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0FB292A507500C4D90E /* PFLocalization.h */; }; - 7C77D124292A509D00C4D90E /* PFDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0FF292A507500C4D90E /* PFDismissButton.h */; }; - 7C77D125292A509D00C4D90E /* PFTextButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D103292A507500C4D90E /* PFTextButton.h */; }; - 7C77D126292A509D00C4D90E /* PFPrimaryButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D105292A507500C4D90E /* PFPrimaryButton.h */; }; - 7C77D127292A509D00C4D90E /* PFActionButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D106292A507500C4D90E /* PFActionButton.h */; }; - 7C77D128292A509D00C4D90E /* PFLoadingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D107292A507500C4D90E /* PFLoadingView.h */; }; - 7C77D150292A510400C4D90E /* PFPurchaseTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0C9292A507500C4D90E /* PFPurchaseTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D151292A510400C4D90E /* PFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CB292A507500C4D90E /* PFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D152292A510400C4D90E /* PFQueryTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0CD292A507500C4D90E /* PFQueryTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D153292A510400C4D90E /* PFAppleUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D0292A507500C4D90E /* PFAppleUtils.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 7C77D154292A510400C4D90E /* PFSignUpView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D3292A507500C4D90E /* PFSignUpView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D155292A510400C4D90E /* PFTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D6292A507500C4D90E /* PFTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D156292A510400C4D90E /* ParseUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D8292A507500C4D90E /* ParseUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D157292A510400C4D90E /* PFLogInView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0D9292A507500C4D90E /* PFLogInView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D158292A510400C4D90E /* PFResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DB292A507500C4D90E /* PFResources.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D159292A510400C4D90E /* PFLogInViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DD292A507500C4D90E /* PFLogInViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D15A292A510400C4D90E /* ParseUI.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0DE292A507500C4D90E /* ParseUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D15B292A510400C4D90E /* PFProductTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E1292A507500C4D90E /* PFProductTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D15C292A510400C4D90E /* PFCollectionViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E2292A507500C4D90E /* PFCollectionViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D15D292A510400C4D90E /* PFAppleAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E4292A507500C4D90E /* PFAppleAuthenticationProvider.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 7C77D15E292A510400C4D90E /* PFImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E6292A507500C4D90E /* PFImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D15F292A510400C4D90E /* PFSignUpViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E7292A507500C4D90E /* PFSignUpViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D160292A510400C4D90E /* PFLogInView_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E8292A507500C4D90E /* PFLogInView_Private.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D161292A510400C4D90E /* PFQueryCollectionViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0E9292A507500C4D90E /* PFQueryCollectionViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C77D163292A511000C4D90E /* PFActivityIndicatorCollectionReusableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0ED292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.h */; }; - 7C77D164292A511000C4D90E /* PFActivityIndicatorTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0EE292A507500C4D90E /* PFActivityIndicatorTableViewCell.h */; }; - 7C77D165292A511000C4D90E /* PFImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F0292A507500C4D90E /* PFImageCache.h */; }; - 7C77D166292A511000C4D90E /* PFColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F3292A507500C4D90E /* PFColor.h */; }; - 7C77D167292A511000C4D90E /* PFUIAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F5292A507500C4D90E /* PFUIAlertView.h */; }; - 7C77D168292A511000C4D90E /* PFRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F6292A507500C4D90E /* PFRect.h */; }; - 7C77D169292A511000C4D90E /* PFImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0F8292A507500C4D90E /* PFImage.h */; }; - 7C77D16A292A511000C4D90E /* PFLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0FB292A507500C4D90E /* PFLocalization.h */; }; - 7C77D16B292A511000C4D90E /* PFDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D0FF292A507500C4D90E /* PFDismissButton.h */; }; - 7C77D16C292A511000C4D90E /* PFTextButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D103292A507500C4D90E /* PFTextButton.h */; }; - 7C77D16D292A511000C4D90E /* PFPrimaryButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D105292A507500C4D90E /* PFPrimaryButton.h */; }; - 7C77D16E292A511000C4D90E /* PFActionButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D106292A507500C4D90E /* PFActionButton.h */; }; - 7C77D16F292A511000C4D90E /* PFLoadingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C77D107292A507500C4D90E /* PFLoadingView.h */; }; - 7C77D170292A511C00C4D90E /* PFLogInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CA292A507500C4D90E /* PFLogInViewController.m */; }; - 7C77D171292A511C00C4D90E /* PFResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CC292A507500C4D90E /* PFResources.m */; }; - 7C77D172292A511C00C4D90E /* PFLogInView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CE292A507500C4D90E /* PFLogInView.m */; }; - 7C77D173292A511C00C4D90E /* PFProductTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CF292A507500C4D90E /* PFProductTableViewController.m */; }; - 7C77D174292A511C00C4D90E /* PFSignUpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D1292A507500C4D90E /* PFSignUpViewController.m */; }; - 7C77D175292A511C00C4D90E /* PFImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D2292A507500C4D90E /* PFImageView.m */; }; - 7C77D176292A511C00C4D90E /* PFAppleAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D4292A507500C4D90E /* PFAppleAuthenticationProvider.m */; }; - 7C77D177292A511C00C4D90E /* PFCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D5292A507500C4D90E /* PFCollectionViewCell.m */; }; - 7C77D178292A511C00C4D90E /* PFQueryCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D7292A507500C4D90E /* PFQueryCollectionViewController.m */; }; - 7C77D179292A511C00C4D90E /* PFQueryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DA292A507500C4D90E /* PFQueryTableViewController.m */; }; - 7C77D17A292A511C00C4D90E /* PFTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DC292A507500C4D90E /* PFTextField.m */; }; - 7C77D17B292A511C00C4D90E /* PFPurchaseTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DF292A507500C4D90E /* PFPurchaseTableViewCell.m */; }; - 7C77D17C292A511C00C4D90E /* PFAppleUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E0292A507500C4D90E /* PFAppleUtils.m */; }; - 7C77D17D292A511C00C4D90E /* PFTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E3292A507500C4D90E /* PFTableViewCell.m */; }; - 7C77D17E292A511C00C4D90E /* PFSignUpView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E5292A507500C4D90E /* PFSignUpView.m */; }; - 7C77D17F292A511C00C4D90E /* PFActivityIndicatorTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0EC292A507500C4D90E /* PFActivityIndicatorTableViewCell.m */; }; - 7C77D180292A511C00C4D90E /* PFActivityIndicatorCollectionReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0EF292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.m */; }; - 7C77D181292A511C00C4D90E /* PFLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F1292A507500C4D90E /* PFLocalization.m */; }; - 7C77D182292A511C00C4D90E /* PFImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F4292A507500C4D90E /* PFImage.m */; }; - 7C77D183292A511C00C4D90E /* PFUIAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F7292A507500C4D90E /* PFUIAlertView.m */; }; - 7C77D184292A511C00C4D90E /* PFColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F9292A507500C4D90E /* PFColor.m */; }; - 7C77D185292A511C00C4D90E /* PFRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0FA292A507500C4D90E /* PFRect.m */; }; - 7C77D186292A511C00C4D90E /* PFImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0FC292A507500C4D90E /* PFImageCache.m */; }; - 7C77D187292A511C00C4D90E /* PFTextButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D100292A507500C4D90E /* PFTextButton.m */; }; - 7C77D188292A511C00C4D90E /* PFPrimaryButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D101292A507500C4D90E /* PFPrimaryButton.m */; }; - 7C77D189292A511C00C4D90E /* PFActionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D102292A507500C4D90E /* PFActionButton.m */; }; - 7C77D18A292A511C00C4D90E /* PFDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D104292A507500C4D90E /* PFDismissButton.m */; }; - 7C77D18B292A511C00C4D90E /* PFLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D108292A507500C4D90E /* PFLoadingView.m */; }; - 7C77D18C292A512300C4D90E /* PFLogInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CA292A507500C4D90E /* PFLogInViewController.m */; }; - 7C77D18D292A512300C4D90E /* PFResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CC292A507500C4D90E /* PFResources.m */; }; - 7C77D18E292A512300C4D90E /* PFLogInView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CE292A507500C4D90E /* PFLogInView.m */; }; - 7C77D18F292A512300C4D90E /* PFProductTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0CF292A507500C4D90E /* PFProductTableViewController.m */; }; - 7C77D190292A512300C4D90E /* PFSignUpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D1292A507500C4D90E /* PFSignUpViewController.m */; }; - 7C77D191292A512300C4D90E /* PFImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D2292A507500C4D90E /* PFImageView.m */; }; - 7C77D192292A512300C4D90E /* PFAppleAuthenticationProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D4292A507500C4D90E /* PFAppleAuthenticationProvider.m */; }; - 7C77D193292A512300C4D90E /* PFCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D5292A507500C4D90E /* PFCollectionViewCell.m */; }; - 7C77D194292A512300C4D90E /* PFQueryCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0D7292A507500C4D90E /* PFQueryCollectionViewController.m */; }; - 7C77D195292A512300C4D90E /* PFQueryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DA292A507500C4D90E /* PFQueryTableViewController.m */; }; - 7C77D196292A512300C4D90E /* PFTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DC292A507500C4D90E /* PFTextField.m */; }; - 7C77D197292A512300C4D90E /* PFPurchaseTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0DF292A507500C4D90E /* PFPurchaseTableViewCell.m */; }; - 7C77D198292A512300C4D90E /* PFAppleUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E0292A507500C4D90E /* PFAppleUtils.m */; }; - 7C77D199292A512300C4D90E /* PFTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E3292A507500C4D90E /* PFTableViewCell.m */; }; - 7C77D19A292A512300C4D90E /* PFSignUpView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0E5292A507500C4D90E /* PFSignUpView.m */; }; - 7C77D19B292A512300C4D90E /* PFActivityIndicatorTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0EC292A507500C4D90E /* PFActivityIndicatorTableViewCell.m */; }; - 7C77D19C292A512300C4D90E /* PFActivityIndicatorCollectionReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0EF292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.m */; }; - 7C77D19D292A512300C4D90E /* PFLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F1292A507500C4D90E /* PFLocalization.m */; }; - 7C77D19E292A512300C4D90E /* PFImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F4292A507500C4D90E /* PFImage.m */; }; - 7C77D19F292A512300C4D90E /* PFUIAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F7292A507500C4D90E /* PFUIAlertView.m */; }; - 7C77D1A0292A512300C4D90E /* PFColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0F9292A507500C4D90E /* PFColor.m */; }; - 7C77D1A1292A512300C4D90E /* PFRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0FA292A507500C4D90E /* PFRect.m */; }; - 7C77D1A2292A512300C4D90E /* PFImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D0FC292A507500C4D90E /* PFImageCache.m */; }; - 7C77D1A3292A512300C4D90E /* PFTextButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D100292A507500C4D90E /* PFTextButton.m */; }; - 7C77D1A4292A512300C4D90E /* PFPrimaryButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D101292A507500C4D90E /* PFPrimaryButton.m */; }; - 7C77D1A5292A512300C4D90E /* PFActionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D102292A507500C4D90E /* PFActionButton.m */; }; - 7C77D1A6292A512300C4D90E /* PFDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D104292A507500C4D90E /* PFDismissButton.m */; }; - 7C77D1A7292A512300C4D90E /* PFLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C77D108292A507500C4D90E /* PFLoadingView.m */; }; - 7C77D221292A575B00C4D90E /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D220292A575B00C4D90E /* Social.framework */; }; - 7C77D222292A580800C4D90E /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C77D220292A575B00C4D90E /* Social.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 */; }; - 8129E5F91A9CB067006752BC /* 2.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FAB1A1AB37500FD6EED /* 2.png */; }; - 8129E5FA1A9CB067006752BC /* SimpleQueryCollectionStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 812E5C001A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard */; }; - 8129E5FB1A9CB067006752BC /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA81A1AB37500FD6EED /* Icon.png */; }; - 8129E6091A9CB1BE006752BC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8129E6081A9CB1BE006752BC /* AppDelegate.swift */; }; - 8129E63A1A9CB320006752BC /* UIDemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8129E6391A9CB320006752BC /* UIDemoViewController.swift */; }; - 812E5C011A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 812E5C001A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard */; }; - 812E5C041A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 812E5C031A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m */; }; - 814155B11A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 814155B01A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard */; }; - 81472FB11A1AB37500FD6EED /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F8E1A1AB37500FD6EED /* AppDelegate.m */; }; - 81472FB21A1AB37500FD6EED /* PFUIDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F901A1AB37500FD6EED /* PFUIDemoViewController.m */; }; - 81472FB31A1AB37500FD6EED /* CustomSignUpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F921A1AB37500FD6EED /* CustomSignUpViewController.m */; }; - 81472FB41A1AB37500FD6EED /* CustomLogInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F951A1AB37500FD6EED /* CustomLogInViewController.m */; }; - 81472FB51A1AB37500FD6EED /* SimpleTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F981A1AB37500FD6EED /* SimpleTableViewController.m */; }; - 81472FB61A1AB37500FD6EED /* PaginatedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F9A1A1AB37500FD6EED /* PaginatedTableViewController.m */; }; - 81472FB71A1AB37500FD6EED /* SectionedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F9C1A1AB37500FD6EED /* SectionedTableViewController.m */; }; - 81472FB81A1AB37500FD6EED /* SubtitleImageTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472F9E1A1AB37500FD6EED /* SubtitleImageTableViewController.m */; }; - 81472FB91A1AB37500FD6EED /* CustomProductTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472FA01A1AB37500FD6EED /* CustomProductTableViewController.m */; }; - 81472FBB1A1AB37500FD6EED /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 81472FA51A1AB37500FD6EED /* main.m */; }; - 81472FBC1A1AB37500FD6EED /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA71A1AB37500FD6EED /* Images.xcassets */; }; - 81472FBD1A1AB37500FD6EED /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 81472FA81A1AB37500FD6EED /* Icon.png */; }; - 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 */; }; - 819A4B3A1A6808EA00D01241 /* SubtitleImageCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 819A4B391A6808EA00D01241 /* SubtitleImageCollectionViewController.m */; }; - 81C5993F1A64346000F574E8 /* SimpleCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C5993E1A64346000F574E8 /* SimpleCollectionViewController.m */; }; - 81C599421A6454C900F574E8 /* PaginatedCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C599411A6454C900F574E8 /* PaginatedCollectionViewController.m */; }; - 81C599491A64636200F574E8 /* SectionedCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C599481A64636200F574E8 /* SectionedCollectionViewController.m */; }; - 81C8D9BD1A890BCA007B8DCF /* StoryboardTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C8D9BC1A890BCA007B8DCF /* StoryboardTableViewController.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 */; }; - 81FC6B601A9D1BFC00104E45 /* SectionedTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B5A1A9D1BFC00104E45 /* SectionedTableViewController.swift */; }; - 81FC6B611A9D1BFC00104E45 /* SimpleTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B5B1A9D1BFC00104E45 /* SimpleTableViewController.swift */; }; - 81FC6B621A9D1BFC00104E45 /* StoryboardTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B5C1A9D1BFC00104E45 /* StoryboardTableViewController.swift */; }; - 81FC6B631A9D1BFC00104E45 /* SubtitleImageTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B5D1A9D1BFC00104E45 /* SubtitleImageTableViewController.swift */; }; - 81FC6B651A9D1C2000104E45 /* SimpleQueryTableStoryboard-Swift.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81FC6B641A9D1C2000104E45 /* SimpleQueryTableStoryboard-Swift.storyboard */; }; - 81FC6B6C1A9D1CE900104E45 /* PaginatedCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B671A9D1CE900104E45 /* PaginatedCollectionViewController.swift */; }; - 81FC6B6D1A9D1CE900104E45 /* SectionedCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B681A9D1CE900104E45 /* SectionedCollectionViewController.swift */; }; - 81FC6B6E1A9D1CE900104E45 /* SimpleCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B691A9D1CE900104E45 /* SimpleCollectionViewController.swift */; }; - 81FC6B6F1A9D1CE900104E45 /* StoryboardCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FC6B6A1A9D1CE900104E45 /* StoryboardCollectionViewController.swift */; }; - 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 */; }; - BCA5CC8523BFCFB8003BC0A0 /* SignInWithAppleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BCCBE8CB23BFB89D0044A79C /* SignInWithAppleTests.m */; }; - 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 */; }; - F57F3D291B0C05280087F60B /* DeletionCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F57F3D281B0C05280087F60B /* DeletionCollectionViewController.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 39452DF12AD910490066C2AE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 81472F661A1AB33800FD6EED; - remoteInfo = ParseUIDemo; - }; - 39452DF52AD911740066C2AE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4A9A9496200D0329005D8F4B; - remoteInfo = ParseUI; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 39E2499F2AD1DD160014357C /* Parse-SDK-iOS-OSX */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "Parse-SDK-iOS-OSX"; path = ..; sourceTree = ""; }; - 4A9A947E200D0226005D8F4B /* convert_images.rb */ = {isa = PBXFileReference; lastKnownFileType = text.script.ruby; path = convert_images.rb; sourceTree = ""; }; - 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseUI-iOS.xcconfig"; sourceTree = ""; }; - 4A9A9482200D02CE005D8F4B /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; - 4A9A9484200D02CE005D8F4B /* macOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = macOS.xcconfig; sourceTree = ""; }; - 4A9A9485200D02CE005D8F4B /* tvOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = tvOS.xcconfig; sourceTree = ""; }; - 4A9A9486200D02CE005D8F4B /* iOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = iOS.xcconfig; sourceTree = ""; }; - 4A9A9487200D02CE005D8F4B /* watchOS.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = watchOS.xcconfig; sourceTree = ""; }; - 4A9A9489200D02CE005D8F4B /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; - 4A9A948A200D02CE005D8F4B /* DynamicFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DynamicFramework.xcconfig; sourceTree = ""; }; - 4A9A948B200D02CE005D8F4B /* StaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticFramework.xcconfig; sourceTree = ""; }; - 4A9A948C200D02CE005D8F4B /* LogicTests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = LogicTests.xcconfig; sourceTree = ""; }; - 4A9A948E200D02CE005D8F4B /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 4A9A948F200D02CE005D8F4B /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 4A9A9490200D02CE005D8F4B /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 4A9A9491200D02CE005D8F4B /* ParseUI-iOS-Dynamic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "ParseUI-iOS-Dynamic.xcconfig"; sourceTree = ""; }; - 7C77D0B4292A507500C4D90E /* apple_icon@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apple_icon@3x.png"; sourceTree = ""; }; - 7C77D0B6292A507500C4D90E /* parse_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = parse_logo.png; sourceTree = ""; }; - 7C77D0B8292A507500C4D90E /* apple_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apple_icon@2x.png"; sourceTree = ""; }; - 7C77D0BA292A507500C4D90E /* parse_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "parse_logo@2x.png"; sourceTree = ""; }; - 7C77D0BB292A507500C4D90E /* parse_logo@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "parse_logo@3x.png"; sourceTree = ""; }; - 7C77D0BC292A507500C4D90E /* apple_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = apple_icon.png; sourceTree = ""; }; - 7C77D0BF292A507500C4D90E /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; - 7C77D0C2292A507500C4D90E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/ParseUI.strings; sourceTree = ""; }; - 7C77D0C3292A507500C4D90E /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/ParseUI.strings; sourceTree = ""; }; - 7C77D0C4292A507500C4D90E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/ParseUI.strings; sourceTree = ""; }; - 7C77D0C5292A507500C4D90E /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/ParseUI.strings; sourceTree = ""; }; - 7C77D0C6292A507500C4D90E /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/ParseUI.strings"; sourceTree = ""; }; - 7C77D0C7292A507500C4D90E /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ParseUI.strings; sourceTree = ""; }; - 7C77D0C9292A507500C4D90E /* PFPurchaseTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFPurchaseTableViewCell.h; sourceTree = ""; }; - 7C77D0CA292A507500C4D90E /* PFLogInViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFLogInViewController.m; sourceTree = ""; }; - 7C77D0CB292A507500C4D90E /* PFTextField.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFTextField.h; sourceTree = ""; }; - 7C77D0CC292A507500C4D90E /* PFResources.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFResources.m; sourceTree = ""; }; - 7C77D0CD292A507500C4D90E /* PFQueryTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFQueryTableViewController.h; sourceTree = ""; }; - 7C77D0CE292A507500C4D90E /* PFLogInView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFLogInView.m; sourceTree = ""; }; - 7C77D0CF292A507500C4D90E /* PFProductTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFProductTableViewController.m; sourceTree = ""; }; - 7C77D0D0292A507500C4D90E /* PFAppleUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFAppleUtils.h; sourceTree = ""; }; - 7C77D0D1292A507500C4D90E /* PFSignUpViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFSignUpViewController.m; sourceTree = ""; }; - 7C77D0D2292A507500C4D90E /* PFImageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFImageView.m; sourceTree = ""; }; - 7C77D0D3292A507500C4D90E /* PFSignUpView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFSignUpView.h; sourceTree = ""; }; - 7C77D0D4292A507500C4D90E /* PFAppleAuthenticationProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFAppleAuthenticationProvider.m; sourceTree = ""; }; - 7C77D0D5292A507500C4D90E /* PFCollectionViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFCollectionViewCell.m; sourceTree = ""; }; - 7C77D0D6292A507500C4D90E /* PFTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFTableViewCell.h; sourceTree = ""; }; - 7C77D0D7292A507500C4D90E /* PFQueryCollectionViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFQueryCollectionViewController.m; sourceTree = ""; }; - 7C77D0D8292A507500C4D90E /* ParseUIConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseUIConstants.h; sourceTree = ""; }; - 7C77D0D9292A507500C4D90E /* PFLogInView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLogInView.h; sourceTree = ""; }; - 7C77D0DA292A507500C4D90E /* PFQueryTableViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFQueryTableViewController.m; sourceTree = ""; }; - 7C77D0DB292A507500C4D90E /* PFResources.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFResources.h; sourceTree = ""; }; - 7C77D0DC292A507500C4D90E /* PFTextField.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFTextField.m; sourceTree = ""; }; - 7C77D0DD292A507500C4D90E /* PFLogInViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLogInViewController.h; sourceTree = ""; }; - 7C77D0DE292A507500C4D90E /* ParseUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseUI.h; sourceTree = ""; }; - 7C77D0DF292A507500C4D90E /* PFPurchaseTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFPurchaseTableViewCell.m; sourceTree = ""; }; - 7C77D0E0292A507500C4D90E /* PFAppleUtils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFAppleUtils.m; sourceTree = ""; }; - 7C77D0E1292A507500C4D90E /* PFProductTableViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFProductTableViewController.h; sourceTree = ""; }; - 7C77D0E2292A507500C4D90E /* PFCollectionViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFCollectionViewCell.h; sourceTree = ""; }; - 7C77D0E3292A507500C4D90E /* PFTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFTableViewCell.m; sourceTree = ""; }; - 7C77D0E4292A507500C4D90E /* PFAppleAuthenticationProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFAppleAuthenticationProvider.h; sourceTree = ""; }; - 7C77D0E5292A507500C4D90E /* PFSignUpView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFSignUpView.m; sourceTree = ""; }; - 7C77D0E6292A507500C4D90E /* PFImageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFImageView.h; sourceTree = ""; }; - 7C77D0E7292A507500C4D90E /* PFSignUpViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFSignUpViewController.h; sourceTree = ""; }; - 7C77D0E8292A507500C4D90E /* PFLogInView_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLogInView_Private.h; sourceTree = ""; }; - 7C77D0E9292A507500C4D90E /* PFQueryCollectionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFQueryCollectionViewController.h; sourceTree = ""; }; - 7C77D0EC292A507500C4D90E /* PFActivityIndicatorTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFActivityIndicatorTableViewCell.m; sourceTree = ""; }; - 7C77D0ED292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFActivityIndicatorCollectionReusableView.h; sourceTree = ""; }; - 7C77D0EE292A507500C4D90E /* PFActivityIndicatorTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFActivityIndicatorTableViewCell.h; sourceTree = ""; }; - 7C77D0EF292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFActivityIndicatorCollectionReusableView.m; sourceTree = ""; }; - 7C77D0F0292A507500C4D90E /* PFImageCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFImageCache.h; sourceTree = ""; }; - 7C77D0F1292A507500C4D90E /* PFLocalization.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFLocalization.m; sourceTree = ""; }; - 7C77D0F3292A507500C4D90E /* PFColor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFColor.h; sourceTree = ""; }; - 7C77D0F4292A507500C4D90E /* PFImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFImage.m; sourceTree = ""; }; - 7C77D0F5292A507500C4D90E /* PFUIAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFUIAlertView.h; sourceTree = ""; }; - 7C77D0F6292A507500C4D90E /* PFRect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFRect.h; sourceTree = ""; }; - 7C77D0F7292A507500C4D90E /* PFUIAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFUIAlertView.m; sourceTree = ""; }; - 7C77D0F8292A507500C4D90E /* PFImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFImage.h; sourceTree = ""; }; - 7C77D0F9292A507500C4D90E /* PFColor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFColor.m; sourceTree = ""; }; - 7C77D0FA292A507500C4D90E /* PFRect.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFRect.m; sourceTree = ""; }; - 7C77D0FB292A507500C4D90E /* PFLocalization.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLocalization.h; sourceTree = ""; }; - 7C77D0FC292A507500C4D90E /* PFImageCache.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFImageCache.m; sourceTree = ""; }; - 7C77D0FF292A507500C4D90E /* PFDismissButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFDismissButton.h; sourceTree = ""; }; - 7C77D100292A507500C4D90E /* PFTextButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFTextButton.m; sourceTree = ""; }; - 7C77D101292A507500C4D90E /* PFPrimaryButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFPrimaryButton.m; sourceTree = ""; }; - 7C77D102292A507500C4D90E /* PFActionButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFActionButton.m; sourceTree = ""; }; - 7C77D103292A507500C4D90E /* PFTextButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFTextButton.h; sourceTree = ""; }; - 7C77D104292A507500C4D90E /* PFDismissButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFDismissButton.m; sourceTree = ""; }; - 7C77D105292A507500C4D90E /* PFPrimaryButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFPrimaryButton.h; sourceTree = ""; }; - 7C77D106292A507500C4D90E /* PFActionButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFActionButton.h; sourceTree = ""; }; - 7C77D107292A507500C4D90E /* PFLoadingView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PFLoadingView.h; sourceTree = ""; }; - 7C77D108292A507500C4D90E /* PFLoadingView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PFLoadingView.m; sourceTree = ""; }; - 7C77D162292A510400C4D90E /* ParseUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C77D21F292A56F600C4D90E /* ParseUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ParseUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C77D220292A575B00C4D90E /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; }; - 7C77D22D292A604700C4D90E /* ParseUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C77D22F292A604700C4D90E /* ParseUIDemo-Swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ParseUIDemo-Swift.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 7C77D230292A604700C4D90E /* SignInWithAppleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SignInWithAppleTests.xctest; 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 = ""; }; - 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; }; - 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 = ""; }; - 81472F901A1AB37500FD6EED /* PFUIDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFUIDemoViewController.m; sourceTree = ""; }; - 81472F911A1AB37500FD6EED /* CustomSignUpViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomSignUpViewController.h; sourceTree = ""; }; - 81472F921A1AB37500FD6EED /* CustomSignUpViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomSignUpViewController.m; sourceTree = ""; }; - 81472F941A1AB37500FD6EED /* CustomLogInViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomLogInViewController.h; sourceTree = ""; }; - 81472F951A1AB37500FD6EED /* CustomLogInViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomLogInViewController.m; sourceTree = ""; }; - 81472F971A1AB37500FD6EED /* SimpleTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleTableViewController.h; sourceTree = ""; }; - 81472F981A1AB37500FD6EED /* SimpleTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleTableViewController.m; sourceTree = ""; }; - 81472F991A1AB37500FD6EED /* PaginatedTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PaginatedTableViewController.h; sourceTree = ""; }; - 81472F9A1A1AB37500FD6EED /* PaginatedTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PaginatedTableViewController.m; sourceTree = ""; }; - 81472F9B1A1AB37500FD6EED /* SectionedTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SectionedTableViewController.h; sourceTree = ""; }; - 81472F9C1A1AB37500FD6EED /* SectionedTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SectionedTableViewController.m; sourceTree = ""; }; - 81472F9D1A1AB37500FD6EED /* SubtitleImageTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubtitleImageTableViewController.h; sourceTree = ""; }; - 81472F9E1A1AB37500FD6EED /* SubtitleImageTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SubtitleImageTableViewController.m; sourceTree = ""; }; - 81472F9F1A1AB37500FD6EED /* CustomProductTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomProductTableViewController.h; sourceTree = ""; }; - 81472FA01A1AB37500FD6EED /* CustomProductTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomProductTableViewController.m; sourceTree = ""; }; - 81472FA41A1AB37500FD6EED /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 81472FA51A1AB37500FD6EED /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 81472FA71A1AB37500FD6EED /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ../Images.xcassets; sourceTree = ""; }; - 81472FA81A1AB37500FD6EED /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; - 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 = ""; }; - 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 = ""; }; - 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 = ""; }; - 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 = ""; }; - 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 = ""; }; - 81FC6B5A1A9D1BFC00104E45 /* SectionedTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionedTableViewController.swift; sourceTree = ""; }; - 81FC6B5B1A9D1BFC00104E45 /* SimpleTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimpleTableViewController.swift; sourceTree = ""; }; - 81FC6B5C1A9D1BFC00104E45 /* StoryboardTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardTableViewController.swift; sourceTree = ""; }; - 81FC6B5D1A9D1BFC00104E45 /* SubtitleImageTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubtitleImageTableViewController.swift; sourceTree = ""; }; - 81FC6B641A9D1C2000104E45 /* SimpleQueryTableStoryboard-Swift.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = "SimpleQueryTableStoryboard-Swift.storyboard"; path = "ParseUIDemo/Swift/Resources/SimpleQueryTableStoryboard-Swift.storyboard"; sourceTree = SOURCE_ROOT; }; - 81FC6B671A9D1CE900104E45 /* PaginatedCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaginatedCollectionViewController.swift; sourceTree = ""; }; - 81FC6B681A9D1CE900104E45 /* SectionedCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionedCollectionViewController.swift; sourceTree = ""; }; - 81FC6B691A9D1CE900104E45 /* SimpleCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimpleCollectionViewController.swift; sourceTree = ""; }; - 81FC6B6A1A9D1CE900104E45 /* StoryboardCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardCollectionViewController.swift; sourceTree = ""; }; - 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 = ""; }; - BC32E14523ABAE04009BDFCD /* ParseUIDemo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = ParseUIDemo.entitlements; path = ParseUIDemo/ParseUIDemo.entitlements; sourceTree = ""; }; - BCCBE8CB23BFB89D0044A79C /* SignInWithAppleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SignInWithAppleTests.m; sourceTree = ""; }; - BCCBE8CD23BFB89D0044A79C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; 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 = ""; }; - F57F3D201B0C03C90087F60B /* DeletionCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeletionCollectionViewController.m; sourceTree = ""; }; - F57F3D251B0C04EF0087F60B /* DeletionTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeletionTableViewController.swift; sourceTree = ""; }; - F57F3D281B0C05280087F60B /* DeletionCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeletionCollectionViewController.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4A0ECC00200D8C0200BA84A3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6B63F1602BC34E4A00F89DEE /* ParseObjC in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4A9A9493200D0329005D8F4B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39E249A52AD1DD2E0014357C /* ParseObjC in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8129E5F11A9CB067006752BC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39452DFA2AD9121D0066C2AE /* ParseUI in Frameworks */, - 39452DF82AD9121D0066C2AE /* ParseObjC in Frameworks */, - 7C77D221292A575B00C4D90E /* Social.framework in Frameworks */, - 39452DFD2AD914110066C2AE /* BoltsSwift in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81472F641A1AB33800FD6EED /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6B63F1662BC3508200F89DEE /* ParseObjC in Frameworks */, - 7C77D222292A580800C4D90E /* Social.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - BCCBE8C623BFB89D0044A79C /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 39452DEC2AD8FC110066C2AE /* ParseObjC in Frameworks */, - 39E22AD72AD0676700D9AE5C /* OCMock in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0867D691FE84028FC02AAC07 /* Breakpad */ = { - isa = PBXGroup; - children = ( - 39E2499E2AD1DD160014357C /* Packages */, - 4A9A9422200D0226005D8F4B /* ParseUI */, - 81472F621A1AB31F00FD6EED /* ParseUIDemo */, - BCCBE8CA23BFB89D0044A79C /* SignInWithAppleTests */, - 3F5307328F84566C90FBCF25 /* Frameworks */, - 7C77D162292A510400C4D90E /* ParseUI.framework */, - 7C77D21F292A56F600C4D90E /* ParseUIDemo.app */, - 7C77D22D292A604700C4D90E /* ParseUI.framework */, - 7C77D22F292A604700C4D90E /* ParseUIDemo-Swift.app */, - 7C77D230292A604700C4D90E /* SignInWithAppleTests.xctest */, - ); - name = Breakpad; - sourceTree = ""; - }; - 39E2499E2AD1DD160014357C /* Packages */ = { - isa = PBXGroup; - children = ( - 39E2499F2AD1DD160014357C /* Parse-SDK-iOS-OSX */, - ); - name = Packages; - sourceTree = ""; - }; - 3F5307328F84566C90FBCF25 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7C77D220292A575B00C4D90E /* Social.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4A9A9422200D0226005D8F4B /* ParseUI */ = { - isa = PBXGroup; - children = ( - 7C77D0B0292A507500C4D90E /* ParseUI */, - 4A9A947F200D02CE005D8F4B /* Configurations */, - 4A9A947D200D0226005D8F4B /* Scripts */, - ); - name = ParseUI; - sourceTree = ""; - }; - 4A9A947D200D0226005D8F4B /* Scripts */ = { - isa = PBXGroup; - children = ( - 4A9A947E200D0226005D8F4B /* convert_images.rb */, - ); - path = Scripts; - sourceTree = ""; - }; - 4A9A947F200D02CE005D8F4B /* Configurations */ = { - isa = PBXGroup; - children = ( - 4A9A9491200D02CE005D8F4B /* ParseUI-iOS-Dynamic.xcconfig */, - 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */, - 4A9A9481200D02CE005D8F4B /* Shared */, - ); - path = Configurations; - sourceTree = ""; - }; - 4A9A9481200D02CE005D8F4B /* Shared */ = { - isa = PBXGroup; - children = ( - 4A9A9482200D02CE005D8F4B /* Common.xcconfig */, - 4A9A9483200D02CE005D8F4B /* Platform */, - 4A9A9488200D02CE005D8F4B /* Product */, - 4A9A948D200D02CE005D8F4B /* Project */, - 4A9A9490200D02CE005D8F4B /* Warnings.xcconfig */, - ); - path = Shared; - sourceTree = ""; - }; - 4A9A9483200D02CE005D8F4B /* Platform */ = { - isa = PBXGroup; - children = ( - 4A9A9484200D02CE005D8F4B /* macOS.xcconfig */, - 4A9A9485200D02CE005D8F4B /* tvOS.xcconfig */, - 4A9A9486200D02CE005D8F4B /* iOS.xcconfig */, - 4A9A9487200D02CE005D8F4B /* watchOS.xcconfig */, - ); - path = Platform; - sourceTree = ""; - }; - 4A9A9488200D02CE005D8F4B /* Product */ = { - isa = PBXGroup; - children = ( - 4A9A9489200D02CE005D8F4B /* Application.xcconfig */, - 4A9A948A200D02CE005D8F4B /* DynamicFramework.xcconfig */, - 4A9A948B200D02CE005D8F4B /* StaticFramework.xcconfig */, - 4A9A948C200D02CE005D8F4B /* LogicTests.xcconfig */, - ); - path = Product; - sourceTree = ""; - }; - 4A9A948D200D02CE005D8F4B /* Project */ = { - isa = PBXGroup; - children = ( - 4A9A948E200D02CE005D8F4B /* Debug.xcconfig */, - 4A9A948F200D02CE005D8F4B /* Release.xcconfig */, - ); - path = Project; - sourceTree = ""; - }; - 7C77D0B0292A507500C4D90E /* ParseUI */ = { - isa = PBXGroup; - children = ( - 7C77D0B1292A507500C4D90E /* Resources */, - 7C77D0C8292A507500C4D90E /* Source */, - 7C77D0EA292A507500C4D90E /* Internal */, - ); - path = ParseUI; - sourceTree = ""; - }; - 7C77D0B1292A507500C4D90E /* Resources */ = { - isa = PBXGroup; - children = ( - 7C77D0B2292A507500C4D90E /* Images */, - 7C77D0BF292A507500C4D90E /* Info-iOS.plist */, - 7C77D0C0292A507500C4D90E /* Localization */, - ); - path = Resources; - sourceTree = ""; - }; - 7C77D0B2292A507500C4D90E /* Images */ = { - isa = PBXGroup; - children = ( - 7C77D0B4292A507500C4D90E /* apple_icon@3x.png */, - 7C77D0B6292A507500C4D90E /* parse_logo.png */, - 7C77D0B8292A507500C4D90E /* apple_icon@2x.png */, - 7C77D0BA292A507500C4D90E /* parse_logo@2x.png */, - 7C77D0BB292A507500C4D90E /* parse_logo@3x.png */, - 7C77D0BC292A507500C4D90E /* apple_icon.png */, - ); - path = Images; - sourceTree = ""; - }; - 7C77D0C0292A507500C4D90E /* Localization */ = { - isa = PBXGroup; - children = ( - 7C77D0C1292A507500C4D90E /* ParseUI.strings */, - ); - path = Localization; - sourceTree = ""; - }; - 7C77D0C8292A507500C4D90E /* Source */ = { - isa = PBXGroup; - children = ( - 7C77D0C9292A507500C4D90E /* PFPurchaseTableViewCell.h */, - 7C77D0CA292A507500C4D90E /* PFLogInViewController.m */, - 7C77D0CB292A507500C4D90E /* PFTextField.h */, - 7C77D0CC292A507500C4D90E /* PFResources.m */, - 7C77D0CD292A507500C4D90E /* PFQueryTableViewController.h */, - 7C77D0CE292A507500C4D90E /* PFLogInView.m */, - 7C77D0CF292A507500C4D90E /* PFProductTableViewController.m */, - 7C77D0D1292A507500C4D90E /* PFSignUpViewController.m */, - 7C77D0D2292A507500C4D90E /* PFImageView.m */, - 7C77D0D3292A507500C4D90E /* PFSignUpView.h */, - 7C77D0D5292A507500C4D90E /* PFCollectionViewCell.m */, - 7C77D0D6292A507500C4D90E /* PFTableViewCell.h */, - 7C77D0D7292A507500C4D90E /* PFQueryCollectionViewController.m */, - 7C77D0D8292A507500C4D90E /* ParseUIConstants.h */, - 7C77D0D9292A507500C4D90E /* PFLogInView.h */, - 7C77D0DA292A507500C4D90E /* PFQueryTableViewController.m */, - 7C77D0DB292A507500C4D90E /* PFResources.h */, - 7C77D0DC292A507500C4D90E /* PFTextField.m */, - 7C77D0DD292A507500C4D90E /* PFLogInViewController.h */, - 7C77D0DE292A507500C4D90E /* ParseUI.h */, - 7C77D0DF292A507500C4D90E /* PFPurchaseTableViewCell.m */, - 7C77D0E1292A507500C4D90E /* PFProductTableViewController.h */, - 7C77D0E2292A507500C4D90E /* PFCollectionViewCell.h */, - 7C77D0E3292A507500C4D90E /* PFTableViewCell.m */, - 7C77D0E5292A507500C4D90E /* PFSignUpView.m */, - 7C77D0E6292A507500C4D90E /* PFImageView.h */, - 7C77D0E7292A507500C4D90E /* PFSignUpViewController.h */, - 7C77D0E8292A507500C4D90E /* PFLogInView_Private.h */, - 7C77D0E9292A507500C4D90E /* PFQueryCollectionViewController.h */, - ); - path = Source; - sourceTree = ""; - }; - 7C77D0EA292A507500C4D90E /* Internal */ = { - isa = PBXGroup; - children = ( - 7C77D246292A606800C4D90E /* Sign In With Apple */, - 7C77D0EB292A507500C4D90E /* Cells */, - 7C77D0F0292A507500C4D90E /* PFImageCache.h */, - 7C77D0F1292A507500C4D90E /* PFLocalization.m */, - 7C77D0F2292A507500C4D90E /* Extensions */, - 7C77D0FB292A507500C4D90E /* PFLocalization.h */, - 7C77D0FC292A507500C4D90E /* PFImageCache.m */, - 7C77D0FD292A507500C4D90E /* Views */, - ); - path = Internal; - sourceTree = ""; - }; - 7C77D0EB292A507500C4D90E /* Cells */ = { - isa = PBXGroup; - children = ( - 7C77D0EC292A507500C4D90E /* PFActivityIndicatorTableViewCell.m */, - 7C77D0ED292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.h */, - 7C77D0EE292A507500C4D90E /* PFActivityIndicatorTableViewCell.h */, - 7C77D0EF292A507500C4D90E /* PFActivityIndicatorCollectionReusableView.m */, - ); - path = Cells; - sourceTree = ""; - }; - 7C77D0F2292A507500C4D90E /* Extensions */ = { - isa = PBXGroup; - children = ( - 7C77D0F3292A507500C4D90E /* PFColor.h */, - 7C77D0F4292A507500C4D90E /* PFImage.m */, - 7C77D0F5292A507500C4D90E /* PFUIAlertView.h */, - 7C77D0F6292A507500C4D90E /* PFRect.h */, - 7C77D0F7292A507500C4D90E /* PFUIAlertView.m */, - 7C77D0F8292A507500C4D90E /* PFImage.h */, - 7C77D0F9292A507500C4D90E /* PFColor.m */, - 7C77D0FA292A507500C4D90E /* PFRect.m */, - ); - path = Extensions; - sourceTree = ""; - }; - 7C77D0FD292A507500C4D90E /* Views */ = { - isa = PBXGroup; - children = ( - 7C77D0FE292A507500C4D90E /* Buttons */, - 7C77D107292A507500C4D90E /* PFLoadingView.h */, - 7C77D108292A507500C4D90E /* PFLoadingView.m */, - ); - path = Views; - sourceTree = ""; - }; - 7C77D0FE292A507500C4D90E /* Buttons */ = { - isa = PBXGroup; - children = ( - 7C77D0FF292A507500C4D90E /* PFDismissButton.h */, - 7C77D100292A507500C4D90E /* PFTextButton.m */, - 7C77D101292A507500C4D90E /* PFPrimaryButton.m */, - 7C77D102292A507500C4D90E /* PFActionButton.m */, - 7C77D103292A507500C4D90E /* PFTextButton.h */, - 7C77D104292A507500C4D90E /* PFDismissButton.m */, - 7C77D105292A507500C4D90E /* PFPrimaryButton.h */, - 7C77D106292A507500C4D90E /* PFActionButton.h */, - ); - path = Buttons; - sourceTree = ""; - }; - 7C77D246292A606800C4D90E /* Sign In With Apple */ = { - isa = PBXGroup; - children = ( - 7C77D0D0292A507500C4D90E /* PFAppleUtils.h */, - 7C77D0D4292A507500C4D90E /* PFAppleAuthenticationProvider.m */, - 7C77D0E0292A507500C4D90E /* PFAppleUtils.m */, - 7C77D0E4292A507500C4D90E /* PFAppleAuthenticationProvider.h */, - ); - path = "Sign In With Apple"; - sourceTree = ""; - }; - 8129E5DD1A9CB052006752BC /* Obj-C */ = { - isa = PBXGroup; - children = ( - 81472F8D1A1AB37500FD6EED /* AppDelegate.h */, - 81472F8E1A1AB37500FD6EED /* AppDelegate.m */, - 81472F8F1A1AB37500FD6EED /* PFUIDemoViewController.h */, - 81472F901A1AB37500FD6EED /* PFUIDemoViewController.m */, - 81472FA21A1AB37500FD6EED /* CustomViewControllers */, - ); - name = "Obj-C"; - sourceTree = ""; - }; - 8129E6021A9CB14E006752BC /* Swift */ = { - isa = PBXGroup; - children = ( - 8129E6081A9CB1BE006752BC /* AppDelegate.swift */, - 8129E6391A9CB320006752BC /* UIDemoViewController.swift */, - 81FC6B381A9D1ADB00104E45 /* CustomViewControllers */, - ); - name = Swift; - path = ParseUIDemo/Swift; - sourceTree = SOURCE_ROOT; - }; - 81472F621A1AB31F00FD6EED /* ParseUIDemo */ = { - isa = PBXGroup; - children = ( - BC32E14523ABAE04009BDFCD /* ParseUIDemo.entitlements */, - 81472FA31A1AB37500FD6EED /* Classes */, - 81472FA61A1AB37500FD6EED /* Other */, - 81472FAC1A1AB37500FD6EED /* Resources */, - ); - name = ParseUIDemo; - sourceTree = ""; - }; - 81472F931A1AB37500FD6EED /* SignUpViewController */ = { - isa = PBXGroup; - children = ( - 81472F911A1AB37500FD6EED /* CustomSignUpViewController.h */, - 81472F921A1AB37500FD6EED /* CustomSignUpViewController.m */, - ); - path = SignUpViewController; - sourceTree = ""; - }; - 81472F961A1AB37500FD6EED /* LogInViewController */ = { - isa = PBXGroup; - children = ( - 81472F941A1AB37500FD6EED /* CustomLogInViewController.h */, - 81472F951A1AB37500FD6EED /* CustomLogInViewController.m */, - ); - path = LogInViewController; - sourceTree = ""; - }; - 81472FA11A1AB37500FD6EED /* QueryTableViewController */ = { - isa = PBXGroup; - children = ( - F57F3D1B1B0C03BA0087F60B /* DeletionTableViewController.h */, - F57F3D1C1B0C03BA0087F60B /* DeletionTableViewController.m */, - 81472F971A1AB37500FD6EED /* SimpleTableViewController.h */, - 81472F981A1AB37500FD6EED /* SimpleTableViewController.m */, - 81472F991A1AB37500FD6EED /* PaginatedTableViewController.h */, - 81472F9A1A1AB37500FD6EED /* PaginatedTableViewController.m */, - 81472F9B1A1AB37500FD6EED /* SectionedTableViewController.h */, - 81472F9C1A1AB37500FD6EED /* SectionedTableViewController.m */, - 81472F9D1A1AB37500FD6EED /* SubtitleImageTableViewController.h */, - 81472F9E1A1AB37500FD6EED /* SubtitleImageTableViewController.m */, - 81472F9F1A1AB37500FD6EED /* CustomProductTableViewController.h */, - 81472FA01A1AB37500FD6EED /* CustomProductTableViewController.m */, - 81C8D9BB1A890BCA007B8DCF /* StoryboardTableViewController.h */, - 81C8D9BC1A890BCA007B8DCF /* StoryboardTableViewController.m */, - 814155B01A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard */, - ); - path = QueryTableViewController; - sourceTree = ""; - }; - 81472FA21A1AB37500FD6EED /* CustomViewControllers */ = { - isa = PBXGroup; - children = ( - 81472F931A1AB37500FD6EED /* SignUpViewController */, - 81472F961A1AB37500FD6EED /* LogInViewController */, - 81472FA11A1AB37500FD6EED /* QueryTableViewController */, - 81C5993C1A64344800F574E8 /* QueryCollectionViewController */, - ); - path = CustomViewControllers; - sourceTree = ""; - }; - 81472FA31A1AB37500FD6EED /* Classes */ = { - isa = PBXGroup; - children = ( - 8129E6021A9CB14E006752BC /* Swift */, - 8129E5DD1A9CB052006752BC /* Obj-C */, - ); - name = Classes; - path = ParseUIDemo/Classes; - sourceTree = ""; - }; - 81472FA61A1AB37500FD6EED /* Other */ = { - isa = PBXGroup; - children = ( - 81472FA41A1AB37500FD6EED /* Info.plist */, - 81472FA51A1AB37500FD6EED /* main.m */, - ); - name = Other; - path = ParseUIDemo/Other; - sourceTree = ""; - }; - 81472FAC1A1AB37500FD6EED /* Resources */ = { - isa = PBXGroup; - children = ( - 81472FA71A1AB37500FD6EED /* Images.xcassets */, - 81472FA81A1AB37500FD6EED /* Icon.png */, - 81472FA91A1AB37500FD6EED /* 0.png */, - 81472FAA1A1AB37500FD6EED /* 1.png */, - 81472FAB1A1AB37500FD6EED /* 2.png */, - ); - name = Resources; - path = ParseUIDemo/Resources; - sourceTree = ""; - }; - 81C5993C1A64344800F574E8 /* QueryCollectionViewController */ = { - isa = PBXGroup; - children = ( - F57F3D1F1B0C03C90087F60B /* DeletionCollectionViewController.h */, - F57F3D201B0C03C90087F60B /* DeletionCollectionViewController.m */, - 81C5993D1A64346000F574E8 /* SimpleCollectionViewController.h */, - 81C5993E1A64346000F574E8 /* SimpleCollectionViewController.m */, - 81C599401A6454C900F574E8 /* PaginatedCollectionViewController.h */, - 81C599411A6454C900F574E8 /* PaginatedCollectionViewController.m */, - 81C599471A64636200F574E8 /* SectionedCollectionViewController.h */, - 81C599481A64636200F574E8 /* SectionedCollectionViewController.m */, - 819A4B381A6808EA00D01241 /* SubtitleImageCollectionViewController.h */, - 819A4B391A6808EA00D01241 /* SubtitleImageCollectionViewController.m */, - 812E5C021A7A8EFB000FBDE1 /* StoryboardCollectionViewController.h */, - 812E5C031A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m */, - 812E5C001A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard */, - ); - path = QueryCollectionViewController; - sourceTree = ""; - }; - 81FC6B381A9D1ADB00104E45 /* CustomViewControllers */ = { - isa = PBXGroup; - children = ( - 81FC6B391A9D1ADB00104E45 /* LogInViewController */, - 81FC6B481A9D1ADB00104E45 /* SignUpViewController */, - 81FC6B571A9D1BFC00104E45 /* QueryTableViewController */, - 81FC6B661A9D1CE900104E45 /* QueryCollectionViewController */, - 81FC6B731A9D1D4700104E45 /* ProductTableViewController */, - ); - path = CustomViewControllers; - sourceTree = ""; - }; - 81FC6B391A9D1ADB00104E45 /* LogInViewController */ = { - isa = PBXGroup; - children = ( - 81FC6B3A1A9D1ADB00104E45 /* CustomLogInViewController.swift */, - ); - path = LogInViewController; - sourceTree = ""; - }; - 81FC6B481A9D1ADB00104E45 /* SignUpViewController */ = { - isa = PBXGroup; - children = ( - 81FC6B491A9D1ADB00104E45 /* CustomSignUpViewController.swift */, - ); - path = SignUpViewController; - sourceTree = ""; - }; - 81FC6B571A9D1BFC00104E45 /* QueryTableViewController */ = { - isa = PBXGroup; - children = ( - F57F3D251B0C04EF0087F60B /* DeletionTableViewController.swift */, - 81FC6B5B1A9D1BFC00104E45 /* SimpleTableViewController.swift */, - 81FC6B591A9D1BFC00104E45 /* PaginatedTableViewController.swift */, - 81FC6B5A1A9D1BFC00104E45 /* SectionedTableViewController.swift */, - 81FC6B5C1A9D1BFC00104E45 /* StoryboardTableViewController.swift */, - 81FC6B5D1A9D1BFC00104E45 /* SubtitleImageTableViewController.swift */, - 81FC6B641A9D1C2000104E45 /* SimpleQueryTableStoryboard-Swift.storyboard */, - ); - path = QueryTableViewController; - sourceTree = ""; - }; - 81FC6B661A9D1CE900104E45 /* QueryCollectionViewController */ = { - isa = PBXGroup; - children = ( - F57F3D281B0C05280087F60B /* DeletionCollectionViewController.swift */, - 81FC6B691A9D1CE900104E45 /* SimpleCollectionViewController.swift */, - 81FC6B671A9D1CE900104E45 /* PaginatedCollectionViewController.swift */, - 81FC6B681A9D1CE900104E45 /* SectionedCollectionViewController.swift */, - 81FC6B6A1A9D1CE900104E45 /* StoryboardCollectionViewController.swift */, - 81FC6B6B1A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift */, - 81FC6B711A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard */, - ); - path = QueryCollectionViewController; - sourceTree = ""; - }; - 81FC6B731A9D1D4700104E45 /* ProductTableViewController */ = { - isa = PBXGroup; - children = ( - 81FC6B741A9D1D4700104E45 /* CustomProductTableViewController.swift */, - ); - path = ProductTableViewController; - sourceTree = ""; - }; - BCCBE8CA23BFB89D0044A79C /* SignInWithAppleTests */ = { - isa = PBXGroup; - children = ( - BCCBE8CB23BFB89D0044A79C /* SignInWithAppleTests.m */, - BCCBE8CD23BFB89D0044A79C /* Info.plist */, - ); - path = SignInWithAppleTests; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 4A0ECC02200D8C0200BA84A3 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D150292A510400C4D90E /* PFPurchaseTableViewCell.h in Headers */, - 7C77D151292A510400C4D90E /* PFTextField.h in Headers */, - 7C77D152292A510400C4D90E /* PFQueryTableViewController.h in Headers */, - 7C77D153292A510400C4D90E /* PFAppleUtils.h in Headers */, - 7C77D154292A510400C4D90E /* PFSignUpView.h in Headers */, - 7C77D155292A510400C4D90E /* PFTableViewCell.h in Headers */, - 7C77D156292A510400C4D90E /* ParseUIConstants.h in Headers */, - 7C77D157292A510400C4D90E /* PFLogInView.h in Headers */, - 7C77D158292A510400C4D90E /* PFResources.h in Headers */, - 7C77D159292A510400C4D90E /* PFLogInViewController.h in Headers */, - 7C77D15A292A510400C4D90E /* ParseUI.h in Headers */, - 7C77D15B292A510400C4D90E /* PFProductTableViewController.h in Headers */, - 7C77D15C292A510400C4D90E /* PFCollectionViewCell.h in Headers */, - 7C77D15D292A510400C4D90E /* PFAppleAuthenticationProvider.h in Headers */, - 7C77D15E292A510400C4D90E /* PFImageView.h in Headers */, - 7C77D15F292A510400C4D90E /* PFSignUpViewController.h in Headers */, - 7C77D160292A510400C4D90E /* PFLogInView_Private.h in Headers */, - 7C77D161292A510400C4D90E /* PFQueryCollectionViewController.h in Headers */, - 7C77D163292A511000C4D90E /* PFActivityIndicatorCollectionReusableView.h in Headers */, - 7C77D164292A511000C4D90E /* PFActivityIndicatorTableViewCell.h in Headers */, - 7C77D165292A511000C4D90E /* PFImageCache.h in Headers */, - 7C77D166292A511000C4D90E /* PFColor.h in Headers */, - 7C77D167292A511000C4D90E /* PFUIAlertView.h in Headers */, - 7C77D168292A511000C4D90E /* PFRect.h in Headers */, - 7C77D169292A511000C4D90E /* PFImage.h in Headers */, - 7C77D16A292A511000C4D90E /* PFLocalization.h in Headers */, - 7C77D16B292A511000C4D90E /* PFDismissButton.h in Headers */, - 7C77D16C292A511000C4D90E /* PFTextButton.h in Headers */, - 7C77D16D292A511000C4D90E /* PFPrimaryButton.h in Headers */, - 7C77D16E292A511000C4D90E /* PFActionButton.h in Headers */, - 7C77D16F292A511000C4D90E /* PFLoadingView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4A9A9494200D0329005D8F4B /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D109292A509000C4D90E /* PFPurchaseTableViewCell.h in Headers */, - 7C77D10A292A509000C4D90E /* PFTextField.h in Headers */, - 7C77D10B292A509000C4D90E /* PFQueryTableViewController.h in Headers */, - 7C77D10C292A509000C4D90E /* PFAppleUtils.h in Headers */, - 7C77D10D292A509000C4D90E /* PFSignUpView.h in Headers */, - 7C77D10E292A509000C4D90E /* PFTableViewCell.h in Headers */, - 7C77D10F292A509000C4D90E /* ParseUIConstants.h in Headers */, - 7C77D110292A509000C4D90E /* PFLogInView.h in Headers */, - 7C77D111292A509000C4D90E /* PFResources.h in Headers */, - 7C77D112292A509000C4D90E /* PFLogInViewController.h in Headers */, - 7C77D113292A509000C4D90E /* ParseUI.h in Headers */, - 7C77D114292A509000C4D90E /* PFProductTableViewController.h in Headers */, - 7C77D115292A509000C4D90E /* PFCollectionViewCell.h in Headers */, - 7C77D116292A509000C4D90E /* PFAppleAuthenticationProvider.h in Headers */, - 7C77D117292A509000C4D90E /* PFImageView.h in Headers */, - 7C77D118292A509000C4D90E /* PFSignUpViewController.h in Headers */, - 7C77D119292A509000C4D90E /* PFLogInView_Private.h in Headers */, - 7C77D11A292A509000C4D90E /* PFQueryCollectionViewController.h in Headers */, - 7C77D11C292A509D00C4D90E /* PFActivityIndicatorCollectionReusableView.h in Headers */, - 7C77D11D292A509D00C4D90E /* PFActivityIndicatorTableViewCell.h in Headers */, - 7C77D11E292A509D00C4D90E /* PFImageCache.h in Headers */, - 7C77D11F292A509D00C4D90E /* PFColor.h in Headers */, - 7C77D120292A509D00C4D90E /* PFUIAlertView.h in Headers */, - 7C77D121292A509D00C4D90E /* PFRect.h in Headers */, - 7C77D122292A509D00C4D90E /* PFImage.h in Headers */, - 7C77D123292A509D00C4D90E /* PFLocalization.h in Headers */, - 7C77D124292A509D00C4D90E /* PFDismissButton.h in Headers */, - 7C77D125292A509D00C4D90E /* PFTextButton.h in Headers */, - 7C77D126292A509D00C4D90E /* PFPrimaryButton.h in Headers */, - 7C77D127292A509D00C4D90E /* PFActionButton.h in Headers */, - 7C77D128292A509D00C4D90E /* PFLoadingView.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 4A0ECBE4200D8C0200BA84A3 /* ParseUI-Dynamic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4A0ECC21200D8C0200BA84A3 /* Build configuration list for PBXNativeTarget "ParseUI-Dynamic" */; - buildPhases = ( - 4A0ECBE5200D8C0200BA84A3 /* Sources */, - 4A0ECC00200D8C0200BA84A3 /* Frameworks */, - 4A0ECC02200D8C0200BA84A3 /* Headers */, - 4A0ECC20200D8C0200BA84A3 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseUI-Dynamic"; - packageProductDependencies = ( - 6B63F15F2BC34E4A00F89DEE /* ParseObjC */, - ); - productName = ParseUI; - productReference = 7C77D162292A510400C4D90E /* ParseUI.framework */; - productType = "com.apple.product-type.framework"; - }; - 4A9A9496200D0329005D8F4B /* ParseUI */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4A9A949C200D0329005D8F4B /* Build configuration list for PBXNativeTarget "ParseUI" */; - buildPhases = ( - 4A9A9492200D0329005D8F4B /* Sources */, - 4A9A9493200D0329005D8F4B /* Frameworks */, - 4A9A9494200D0329005D8F4B /* Headers */, - 4A9A9495200D0329005D8F4B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ParseUI; - packageProductDependencies = ( - 39E249A42AD1DD2E0014357C /* ParseObjC */, - ); - productName = ParseUI; - productReference = 7C77D22D292A604700C4D90E /* ParseUI.framework */; - productType = "com.apple.product-type.framework"; - }; - 8129E5DE1A9CB067006752BC /* ParseUIDemo-Swift */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8129E5FD1A9CB067006752BC /* Build configuration list for PBXNativeTarget "ParseUIDemo-Swift" */; - buildPhases = ( - 8129E5E01A9CB067006752BC /* Sources */, - 8129E5F11A9CB067006752BC /* Frameworks */, - 8129E5F41A9CB067006752BC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ParseUIDemo-Swift"; - packageProductDependencies = ( - 39452DF72AD9121D0066C2AE /* ParseObjC */, - 39452DF92AD9121D0066C2AE /* ParseUI */, - 39452DFC2AD914110066C2AE /* BoltsSwift */, - ); - productName = ParseUIDemo; - productReference = 7C77D22F292A604700C4D90E /* ParseUIDemo-Swift.app */; - productType = "com.apple.product-type.application"; - }; - 81472F661A1AB33800FD6EED /* ParseUIDemo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 81472F871A1AB33800FD6EED /* Build configuration list for PBXNativeTarget "ParseUIDemo" */; - buildPhases = ( - 81472F631A1AB33800FD6EED /* Sources */, - 81472F641A1AB33800FD6EED /* Frameworks */, - 81472F651A1AB33800FD6EED /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 39452DF62AD911740066C2AE /* PBXTargetDependency */, - ); - name = ParseUIDemo; - packageProductDependencies = ( - 6B63F1652BC3508200F89DEE /* ParseObjC */, - ); - productName = ParseUIDemo; - productReference = 7C77D21F292A56F600C4D90E /* ParseUIDemo.app */; - productType = "com.apple.product-type.application"; - }; - BCCBE8C823BFB89D0044A79C /* SignInWithAppleTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = BCCBE8D123BFB89D0044A79C /* Build configuration list for PBXNativeTarget "SignInWithAppleTests" */; - buildPhases = ( - BCCBE8C523BFB89D0044A79C /* Sources */, - BCCBE8C623BFB89D0044A79C /* Frameworks */, - BCCBE8C723BFB89D0044A79C /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 39452DF22AD910490066C2AE /* PBXTargetDependency */, - ); - name = SignInWithAppleTests; - packageProductDependencies = ( - 39E22AD62AD0676700D9AE5C /* OCMock */, - 39452DEB2AD8FC110066C2AE /* ParseObjC */, - ); - productName = SignInWithAppleTests; - productReference = 7C77D230292A604700C4D90E /* SignInWithAppleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - CLASSPREFIX = PF; - DefaultBuildSystemTypeForWorkspace = Original; - LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 1130; - ORGANIZATIONNAME = "Parse Inc."; - TargetAttributes = { - 4A0ECBE4200D8C0200BA84A3 = { - ProvisioningStyle = Automatic; - }; - 4A9A9496200D0329005D8F4B = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Automatic; - }; - 81472F661A1AB33800FD6EED = { - CreatedOnToolsVersion = 6.1; - }; - BCCBE8C823BFB89D0044A79C = { - CreatedOnToolsVersion = 11.3; - ProvisioningStyle = Automatic; - TestTargetID = 81472F661A1AB33800FD6EED; - }; - }; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseUI" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 1; - knownRegions = ( - da, - de, - es, - fr, - it, - ja, - nl, - no, - sl, - sv, - tr, - en, - Base, - he, - "pt-BR", - ); - mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - packageReferences = ( - 39E22AD52AD0676700D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */, - 39452DFB2AD914110066C2AE /* XCRemoteSwiftPackageReference "Bolts-Swift" */, - ); - productRefGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 81472F661A1AB33800FD6EED /* ParseUIDemo */, - 8129E5DE1A9CB067006752BC /* ParseUIDemo-Swift */, - 4A9A9496200D0329005D8F4B /* ParseUI */, - 4A0ECBE4200D8C0200BA84A3 /* ParseUI-Dynamic */, - BCCBE8C823BFB89D0044A79C /* SignInWithAppleTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 4A0ECC20200D8C0200BA84A3 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4A9A9495200D0329005D8F4B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8129E5F41A9CB067006752BC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8129E5F51A9CB067006752BC /* Images.xcassets in Resources */, - 8129E5F71A9CB067006752BC /* 0.png in Resources */, - 81FC6B651A9D1C2000104E45 /* SimpleQueryTableStoryboard-Swift.storyboard in Resources */, - 8129E5F81A9CB067006752BC /* 1.png in Resources */, - 8129E5F91A9CB067006752BC /* 2.png in Resources */, - 8129E5FA1A9CB067006752BC /* SimpleQueryCollectionStoryboard.storyboard in Resources */, - 81FC6B721A9D1CFD00104E45 /* SimpleQueryCollectionStoryboard-Swift.storyboard in Resources */, - 8129E5FB1A9CB067006752BC /* Icon.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81472F651A1AB33800FD6EED /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81472FBC1A1AB37500FD6EED /* Images.xcassets in Resources */, - 814155B11A9CD9CA002D9683 /* SimpleQueryTableStoryboard.storyboard in Resources */, - 81472FBE1A1AB37500FD6EED /* 0.png in Resources */, - 81472FBF1A1AB37500FD6EED /* 1.png in Resources */, - 81472FC01A1AB37500FD6EED /* 2.png in Resources */, - 812E5C011A7A8EB4000FBDE1 /* SimpleQueryCollectionStoryboard.storyboard in Resources */, - 81472FBD1A1AB37500FD6EED /* Icon.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - BCCBE8C723BFB89D0044A79C /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 4A0ECBE5200D8C0200BA84A3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D170292A511C00C4D90E /* PFLogInViewController.m in Sources */, - 7C77D171292A511C00C4D90E /* PFResources.m in Sources */, - 7C77D172292A511C00C4D90E /* PFLogInView.m in Sources */, - 7C77D173292A511C00C4D90E /* PFProductTableViewController.m in Sources */, - 7C77D174292A511C00C4D90E /* PFSignUpViewController.m in Sources */, - 7C77D175292A511C00C4D90E /* PFImageView.m in Sources */, - 7C77D176292A511C00C4D90E /* PFAppleAuthenticationProvider.m in Sources */, - 7C77D177292A511C00C4D90E /* PFCollectionViewCell.m in Sources */, - 7C77D178292A511C00C4D90E /* PFQueryCollectionViewController.m in Sources */, - 7C77D179292A511C00C4D90E /* PFQueryTableViewController.m in Sources */, - 7C77D17A292A511C00C4D90E /* PFTextField.m in Sources */, - 7C77D17B292A511C00C4D90E /* PFPurchaseTableViewCell.m in Sources */, - 7C77D17C292A511C00C4D90E /* PFAppleUtils.m in Sources */, - 7C77D17D292A511C00C4D90E /* PFTableViewCell.m in Sources */, - 7C77D17E292A511C00C4D90E /* PFSignUpView.m in Sources */, - 7C77D17F292A511C00C4D90E /* PFActivityIndicatorTableViewCell.m in Sources */, - 7C77D180292A511C00C4D90E /* PFActivityIndicatorCollectionReusableView.m in Sources */, - 7C77D181292A511C00C4D90E /* PFLocalization.m in Sources */, - 7C77D182292A511C00C4D90E /* PFImage.m in Sources */, - 7C77D183292A511C00C4D90E /* PFUIAlertView.m in Sources */, - 7C77D184292A511C00C4D90E /* PFColor.m in Sources */, - 7C77D185292A511C00C4D90E /* PFRect.m in Sources */, - 7C77D186292A511C00C4D90E /* PFImageCache.m in Sources */, - 7C77D187292A511C00C4D90E /* PFTextButton.m in Sources */, - 7C77D188292A511C00C4D90E /* PFPrimaryButton.m in Sources */, - 7C77D189292A511C00C4D90E /* PFActionButton.m in Sources */, - 7C77D18A292A511C00C4D90E /* PFDismissButton.m in Sources */, - 7C77D18B292A511C00C4D90E /* PFLoadingView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4A9A9492200D0329005D8F4B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C77D18C292A512300C4D90E /* PFLogInViewController.m in Sources */, - 7C77D18D292A512300C4D90E /* PFResources.m in Sources */, - 7C77D18E292A512300C4D90E /* PFLogInView.m in Sources */, - 7C77D18F292A512300C4D90E /* PFProductTableViewController.m in Sources */, - 7C77D190292A512300C4D90E /* PFSignUpViewController.m in Sources */, - 7C77D191292A512300C4D90E /* PFImageView.m in Sources */, - 7C77D192292A512300C4D90E /* PFAppleAuthenticationProvider.m in Sources */, - 7C77D193292A512300C4D90E /* PFCollectionViewCell.m in Sources */, - 7C77D194292A512300C4D90E /* PFQueryCollectionViewController.m in Sources */, - 7C77D195292A512300C4D90E /* PFQueryTableViewController.m in Sources */, - 7C77D196292A512300C4D90E /* PFTextField.m in Sources */, - 7C77D197292A512300C4D90E /* PFPurchaseTableViewCell.m in Sources */, - 7C77D198292A512300C4D90E /* PFAppleUtils.m in Sources */, - 7C77D199292A512300C4D90E /* PFTableViewCell.m in Sources */, - 7C77D19A292A512300C4D90E /* PFSignUpView.m in Sources */, - 7C77D19B292A512300C4D90E /* PFActivityIndicatorTableViewCell.m in Sources */, - 7C77D19C292A512300C4D90E /* PFActivityIndicatorCollectionReusableView.m in Sources */, - 7C77D19D292A512300C4D90E /* PFLocalization.m in Sources */, - 7C77D19E292A512300C4D90E /* PFImage.m in Sources */, - 7C77D19F292A512300C4D90E /* PFUIAlertView.m in Sources */, - 7C77D1A0292A512300C4D90E /* PFColor.m in Sources */, - 7C77D1A1292A512300C4D90E /* PFRect.m in Sources */, - 7C77D1A2292A512300C4D90E /* PFImageCache.m in Sources */, - 7C77D1A3292A512300C4D90E /* PFTextButton.m in Sources */, - 7C77D1A4292A512300C4D90E /* PFPrimaryButton.m in Sources */, - 7C77D1A5292A512300C4D90E /* PFActionButton.m in Sources */, - 7C77D1A6292A512300C4D90E /* PFDismissButton.m in Sources */, - 7C77D1A7292A512300C4D90E /* PFLoadingView.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8129E5E01A9CB067006752BC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81FC6B4A1A9D1ADB00104E45 /* CustomLogInViewController.swift in Sources */, - 81FC6B601A9D1BFC00104E45 /* SectionedTableViewController.swift in Sources */, - 81FC6B5F1A9D1BFC00104E45 /* PaginatedTableViewController.swift in Sources */, - 81FC6B611A9D1BFC00104E45 /* SimpleTableViewController.swift in Sources */, - F57F3D291B0C05280087F60B /* DeletionCollectionViewController.swift in Sources */, - 81FC6B6E1A9D1CE900104E45 /* SimpleCollectionViewController.swift in Sources */, - F57F3D271B0C050C0087F60B /* DeletionTableViewController.swift in Sources */, - 81FC6B6D1A9D1CE900104E45 /* SectionedCollectionViewController.swift in Sources */, - 81FC6B561A9D1ADB00104E45 /* CustomSignUpViewController.swift in Sources */, - 81FC6B621A9D1BFC00104E45 /* StoryboardTableViewController.swift in Sources */, - 81FC6B751A9D1D4700104E45 /* CustomProductTableViewController.swift in Sources */, - 81FC6B6C1A9D1CE900104E45 /* PaginatedCollectionViewController.swift in Sources */, - 81FC6B6F1A9D1CE900104E45 /* StoryboardCollectionViewController.swift in Sources */, - 81FC6B701A9D1CE900104E45 /* SubtitleImageCollectionViewController.swift in Sources */, - 8129E6091A9CB1BE006752BC /* AppDelegate.swift in Sources */, - 8129E63A1A9CB320006752BC /* UIDemoViewController.swift in Sources */, - 81FC6B631A9D1BFC00104E45 /* SubtitleImageTableViewController.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 81472F631A1AB33800FD6EED /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81C5993F1A64346000F574E8 /* SimpleCollectionViewController.m in Sources */, - 81472FBB1A1AB37500FD6EED /* main.m in Sources */, - 81C599421A6454C900F574E8 /* PaginatedCollectionViewController.m in Sources */, - 81472FB31A1AB37500FD6EED /* CustomSignUpViewController.m in Sources */, - 81472FB41A1AB37500FD6EED /* CustomLogInViewController.m in Sources */, - 81472FB91A1AB37500FD6EED /* CustomProductTableViewController.m in Sources */, - 819A4B3A1A6808EA00D01241 /* SubtitleImageCollectionViewController.m in Sources */, - F57F3D241B0C03DB0087F60B /* DeletionTableViewController.m in Sources */, - 812E5C041A7A8EFB000FBDE1 /* StoryboardCollectionViewController.m in Sources */, - 81472FB51A1AB37500FD6EED /* SimpleTableViewController.m in Sources */, - F57F3D231B0C03D40087F60B /* DeletionCollectionViewController.m in Sources */, - 81472FB61A1AB37500FD6EED /* PaginatedTableViewController.m in Sources */, - 81C8D9BD1A890BCA007B8DCF /* StoryboardTableViewController.m in Sources */, - 81472FB71A1AB37500FD6EED /* SectionedTableViewController.m in Sources */, - 81472FB11A1AB37500FD6EED /* AppDelegate.m in Sources */, - 81472FB21A1AB37500FD6EED /* PFUIDemoViewController.m in Sources */, - 81C599491A64636200F574E8 /* SectionedCollectionViewController.m in Sources */, - 81472FB81A1AB37500FD6EED /* SubtitleImageTableViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - BCCBE8C523BFB89D0044A79C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BCA5CC8523BFCFB8003BC0A0 /* SignInWithAppleTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 39452DF22AD910490066C2AE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 81472F661A1AB33800FD6EED /* ParseUIDemo */; - targetProxy = 39452DF12AD910490066C2AE /* PBXContainerItemProxy */; - }; - 39452DF62AD911740066C2AE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4A9A9496200D0329005D8F4B /* ParseUI */; - targetProxy = 39452DF52AD911740066C2AE /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 7C77D0C1292A507500C4D90E /* ParseUI.strings */ = { - isa = PBXVariantGroup; - children = ( - 7C77D0C2292A507500C4D90E /* de */, - 7C77D0C3292A507500C4D90E /* he */, - 7C77D0C4292A507500C4D90E /* en */, - 7C77D0C5292A507500C4D90E /* sv */, - 7C77D0C6292A507500C4D90E /* pt-BR */, - 7C77D0C7292A507500C4D90E /* fr */, - ); - name = ParseUI.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A948E200D02CE005D8F4B /* Debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNKNOWN_PRAGMAS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ( - "$(value)", - "$(SANITIZE_FLAGS)", - "-Wl,-undefined,dynamic_lookup", - ); - SDKROOT = iphoneos; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A948F200D02CE005D8F4B /* Release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_CODE_COVERAGE = NO; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNKNOWN_PRAGMAS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 4A0ECC22200D8C0200BA84A3 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A9491200D02CE005D8F4B /* ParseUI-iOS-Dynamic.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = YES; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 4A0ECC23200D8C0200BA84A3 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A9491200D02CE005D8F4B /* ParseUI-iOS-Dynamic.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_MODULES_AUTOLINK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = NO; - ONLY_ACTIVE_ARCH = YES; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 4A9A949D200D0329005D8F4B /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = YES; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 4A9A949E200D0329005D8F4B /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4A9A9480200D02CE005D8F4B /* ParseUI-iOS.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = NO; - ONLY_ACTIVE_ARCH = YES; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 8129E5FE1A9CB067006752BC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "ParseUIDemo-Swift"; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 8129E5FF1A9CB067006752BC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.parse.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "ParseUIDemo-Swift"; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 81472F881A1AB33800FD6EED /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = ParseUIDemo/ParseUIDemo.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = ""; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - /usr/lib/swift, - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.parse.ParseUIDemo; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 81472F891A1AB33800FD6EED /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = ParseUIDemo/ParseUIDemo.entitlements; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)", - "$(PROJECT_DIR)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = ParseUIDemo/Other/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - /usr/lib/swift, - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.parse.ParseUIDemo; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - BCCBE8D223BFB89D0044A79C /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = SignInWithAppleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.parseplatform.SignInWithAppleTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ParseUIDemo.app/ParseUIDemo"; - }; - name = Debug; - }; - BCCBE8D323BFB89D0044A79C /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - INFOPLIST_FILE = SignInWithAppleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.parseplatform.SignInWithAppleTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ParseUIDemo.app/ParseUIDemo"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "ParseUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4A0ECC21200D8C0200BA84A3 /* Build configuration list for PBXNativeTarget "ParseUI-Dynamic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4A0ECC22200D8C0200BA84A3 /* Debug */, - 4A0ECC23200D8C0200BA84A3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4A9A949C200D0329005D8F4B /* Build configuration list for PBXNativeTarget "ParseUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4A9A949D200D0329005D8F4B /* Debug */, - 4A9A949E200D0329005D8F4B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8129E5FD1A9CB067006752BC /* Build configuration list for PBXNativeTarget "ParseUIDemo-Swift" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8129E5FE1A9CB067006752BC /* Debug */, - 8129E5FF1A9CB067006752BC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 81472F871A1AB33800FD6EED /* Build configuration list for PBXNativeTarget "ParseUIDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 81472F881A1AB33800FD6EED /* Debug */, - 81472F891A1AB33800FD6EED /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - BCCBE8D123BFB89D0044A79C /* Build configuration list for PBXNativeTarget "SignInWithAppleTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BCCBE8D223BFB89D0044A79C /* Debug */, - BCCBE8D323BFB89D0044A79C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCRemoteSwiftPackageReference section */ - 39452DFB2AD914110066C2AE /* XCRemoteSwiftPackageReference "Bolts-Swift" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/BoltsFramework/Bolts-Swift.git"; - requirement = { - kind = exactVersion; - version = 1.5.0; - }; - }; - 39E22AD52AD0676700D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/erikdoe/ocmock"; - requirement = { - kind = revision; - revision = 67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 39452DEB2AD8FC110066C2AE /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 39452DF72AD9121D0066C2AE /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 39452DF92AD9121D0066C2AE /* ParseUI */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseUI; - }; - 39452DFC2AD914110066C2AE /* BoltsSwift */ = { - isa = XCSwiftPackageProductDependency; - package = 39452DFB2AD914110066C2AE /* XCRemoteSwiftPackageReference "Bolts-Swift" */; - productName = BoltsSwift; - }; - 39E22AD62AD0676700D9AE5C /* OCMock */ = { - isa = XCSwiftPackageProductDependency; - package = 39E22AD52AD0676700D9AE5C /* XCRemoteSwiftPackageReference "ocmock" */; - productName = OCMock; - }; - 39E249A42AD1DD2E0014357C /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 6B63F15F2BC34E4A00F89DEE /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; - 6B63F1652BC3508200F89DEE /* ParseObjC */ = { - isa = XCSwiftPackageProductDependency; - productName = ParseObjC; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/ParseUI/ParseUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ParseUI/ParseUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ParseUI/ParseUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/ParseUI/ParseUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI-Dynamic.xcscheme b/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI-Dynamic.xcscheme deleted file mode 100644 index c75f54261..000000000 --- a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI-Dynamic.xcscheme +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme b/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme deleted file mode 100644 index a3eb8e73b..000000000 --- a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUI.xcscheme +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme b/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme deleted file mode 100644 index 0daea4b72..000000000 --- a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo-Swift.xcscheme +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme b/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme deleted file mode 100644 index bbbccb69b..000000000 --- a/ParseUI/ParseUI.xcodeproj/xcshareddata/xcschemes/ParseUIDemo.xcscheme +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.h b/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.h deleted file mode 100644 index 44004498b..000000000 --- a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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 - -/** - 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 . - */ -@interface PFActivityIndicatorCollectionReusableView : UICollectionReusableView - -@property (nonatomic, strong, readonly) UILabel *textLabel; - -@property (nonatomic, assign, getter=isAnimating) BOOL animating; - -- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; -- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; - -@end diff --git a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.m b/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.m deleted file mode 100644 index 3385edd81..000000000 --- a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorCollectionReusableView.m +++ /dev/null @@ -1,115 +0,0 @@ -/* - * 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 "PFActivityIndicatorCollectionReusableView.h" - -#import "PFRect.h" - -@interface PFActivityIndicatorCollectionReusableView () { - UIActivityIndicatorView *_activityIndicator; - UIButton *_actionButton; -} - -@end - -@implementation PFActivityIndicatorCollectionReusableView - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) return nil; - - _actionButton = [UIButton buttonWithType:UIButtonTypeCustom]; - _actionButton.backgroundColor = self.backgroundColor; - [self addSubview:_actionButton]; - - _textLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _textLabel.numberOfLines = 0; - _textLabel.textAlignment = NSTextAlignmentCenter; - [self addSubview:_textLabel]; - - _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - _activityIndicator.hidesWhenStopped = YES; - [self addSubview:_activityIndicator]; - - return self; -} - -#pragma mark - -#pragma mark Dealloc - -- (void)dealloc { - [self removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; -} - -#pragma mark - -#pragma mark UIView - -- (void)setBackgroundColor:(UIColor *)backgroundColor { - [super setBackgroundColor:backgroundColor]; - _actionButton.backgroundColor = backgroundColor; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = self.bounds; - - _actionButton.frame = bounds; - - _textLabel.frame = PFRectMakeWithSizeCenteredInRect([_textLabel sizeThatFits:bounds.size], bounds); - _activityIndicator.frame = PFRectMakeWithSizeCenteredInRect([_activityIndicator sizeThatFits:bounds.size], bounds); -} - -#pragma mark - -#pragma mark Accessors - -- (void)setAnimating:(BOOL)animating { - if (self.animating != animating) { - - if (animating) { - [_activityIndicator startAnimating]; - _textLabel.alpha = 0.0f; - } else { - [_activityIndicator stopAnimating]; - _textLabel.alpha = 1.0f; - } - } -} - -- (BOOL)isAnimating { - return [_activityIndicator isAnimating]; -} - -#pragma mark - -#pragma mark Actions - -- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents { - [_actionButton addTarget:target action:action forControlEvents:controlEvents]; -} - -- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents { - [_actionButton removeTarget:target action:action forControlEvents:controlEvents]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.h b/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.h deleted file mode 100644 index 5d7890642..000000000 --- a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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 - -#if __has_include() -#import -#else -#import "PFTableViewCell.h" -#endif - -/** - The `PFActivityIndicatorTableViewCell` class represents a table view cell - that displays UIActivityIndicatorView as the accessory view. - */ -@interface PFActivityIndicatorTableViewCell : PFTableViewCell - -@property (nonatomic, assign, getter=isAnimating) BOOL animating; - -@end diff --git a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.m b/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.m deleted file mode 100644 index b825bd15c..000000000 --- a/ParseUI/ParseUI/Internal/Cells/PFActivityIndicatorTableViewCell.m +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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 "PFActivityIndicatorTableViewCell.h" - -@interface PFActivityIndicatorTableViewCell () - -@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator; - -@end - -@implementation PFActivityIndicatorTableViewCell - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier -{ - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - _activityIndicator.hidesWhenStopped = YES; - self.accessoryView = _activityIndicator; - } - return self; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setAnimating:(BOOL)animating { - if (self.animating != animating) { - - if (animating) { - [_activityIndicator startAnimating]; - } else { - [_activityIndicator stopAnimating]; - } - } -} - -- (BOOL)isAnimating { - return [_activityIndicator isAnimating]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFColor.h b/ParseUI/ParseUI/Internal/Extensions/PFColor.h deleted file mode 100644 index 7e03aa06b..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFColor.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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 PFColor : UIColor - -///-------------------------------------- -/// @name Common -///-------------------------------------- - -+ (UIColor *)commonBackgroundColor; - -///-------------------------------------- -/// @name TextFields -///-------------------------------------- - -+ (UIColor *)textFieldBackgroundColor; -+ (UIColor *)textFieldTextColor; -+ (UIColor *)textFieldPlaceholderColor; -+ (UIColor *)textFieldSeparatorColor; - -///-------------------------------------- -/// @name Buttons -///-------------------------------------- - -+ (UIColor *)loginButtonBackgroundColor; -+ (UIColor *)signupButtonBackgroundColor; -+ (UIColor *)appleButtonBackgroundColor; - -@end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFColor.m b/ParseUI/ParseUI/Internal/Extensions/PFColor.m deleted file mode 100644 index 59b6c9bc7..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFColor.m +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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 "PFColor.h" - -@implementation PFColor - -#pragma mark - -#pragma mark Common - -+ (UIColor *)commonBackgroundColor { - return [UIColor colorWithRed:249/255.0f - green:251.0f/255.0f - blue:1.0f - alpha:1.0f]; -} - -#pragma mark - -#pragma mark TextField - -+ (UIColor *)textFieldBackgroundColor { - return [UIColor whiteColor]; -} - -+ (UIColor *)textFieldTextColor { - return [UIColor blackColor]; -} - -+ (UIColor *)textFieldPlaceholderColor { - return [UIColor colorWithWhite:194.0f/255.0f alpha:1.0f]; -} - -+ (UIColor *)textFieldSeparatorColor { - return [UIColor colorWithWhite:227.0f/255.0f alpha:1.0f]; -} - -#pragma mark - -#pragma mark Buttons - -+ (UIColor *)loginButtonBackgroundColor { - return [UIColor colorWithRed:97.0f/255.0f - green:106.f/255.0f - blue:116.0f/255.0f - alpha:1.0f]; -} - -+ (UIColor *)signupButtonBackgroundColor { - return [UIColor colorWithRed:108.0f/255.0f - green:150.0f/255.0f - blue:249.0f/255.0f - alpha:1.0f]; -} - -+ (UIColor *)appleButtonBackgroundColor { - return [UIColor blackColor]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFImage.h b/ParseUI/ParseUI/Internal/Extensions/PFImage.h deleted file mode 100644 index b7d522253..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFImage.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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 PFImage : UIImage - -+ (UIImage *)imageWithColor:(UIColor *)color; -+ (UIImage *)imageWithColor:(UIColor *)color cornerRadius:(CGFloat)cornerRadius; - -+ (UIImage *)imageNamed:(NSString *)name; - -@end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFImage.m b/ParseUI/ParseUI/Internal/Extensions/PFImage.m deleted file mode 100644 index 87e81210f..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFImage.m +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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 "PFImage.h" - -#import "PFColor.h" -#import "PFRect.h" -#import "PFResources.h" - -@implementation PFImage - -+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size -{ - UIGraphicsBeginImageContext(size); - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGContextSetFillColorWithColor(context, color.CGColor); - CGContextFillRect(context, (CGRect){.size = size}); - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return image; -} - -+ (UIImage *)imageWithColor:(UIColor *)color cornerRadius:(CGFloat)cornerRadius { - CGSize size = CGSizeMake(cornerRadius * 2.0f + 1.0f, cornerRadius * 2.0f + 1.0f); - - UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); - - [color setFill]; - UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:PFRectMakeWithSize(size) cornerRadius:cornerRadius]; - [path fill]; - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(cornerRadius, - cornerRadius, - cornerRadius, - cornerRadius) - resizingMode:UIImageResizingModeStretch]; - - return image; -} - -+ (UIImage *)imageWithColor:(UIColor *)color { - return [self imageWithColor:color size:CGSizeMake(1.0f, 1.0f)]; -} - -+ (UIImage *)imageNamed:(NSString *)imageName { - UIImage *image = [UIImage imageNamed:imageName]; - if (image) { - // If there is an external override for the image at the given path, use it. - return image; - } - - NSString *fileExtension = [imageName pathExtension]; - NSMutableString *filenameWithoutExtension = [[imageName stringByDeletingPathExtension] mutableCopy]; - [filenameWithoutExtension replaceOccurrencesOfString:@"-\\." - withString:@"_" - options:NSRegularExpressionSearch - range:NSMakeRange(0, [filenameWithoutExtension length])]; - - NSData *data = nil; - - int imageScale = (int)ceil([UIScreen mainScreen].scale); - while (data == nil && imageScale > 1) { - NSString *selectorName = [filenameWithoutExtension stringByAppendingFormat:@"%dx_%@", - imageScale, - fileExtension]; - SEL selector = NSSelectorFromString(selectorName); - if ([PFResources respondsToSelector:selector]) { - data = (NSData *)[PFResources performSelector:selector]; - } - if (data == nil) { - imageScale--; - } - } - if (!data) { - NSString *selectorName = [filenameWithoutExtension stringByAppendingFormat:@"_%@", fileExtension]; - SEL selector = NSSelectorFromString(selectorName); - data = (NSData *)[PFResources performSelector:selector]; - } - image = [[UIImage alloc] initWithData:data]; - - // we need to indicate to the framework that the data is already a 2x image, otherwise the framework - // stretches the image by 2x again. To do that, we drop down to CGImage layer to take advantage of - // +[UIImage imageWithCGImage:scale:orientation] - return [UIImage imageWithCGImage:image.CGImage scale:imageScale orientation:image.imageOrientation]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Extensions/PFRect.h b/ParseUI/ParseUI/Internal/Extensions/PFRect.h deleted file mode 100644 index e6c1f0503..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFRect.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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 -#import - -extern CGRect PFRectMakeWithOriginSize(CGPoint origin, CGSize size); -extern CGRect PFRectMakeWithOrigin(CGPoint origin); -extern CGRect PFRectMakeWithSize(CGSize size); - -extern CGRect PFRectMakeWithSizeCenteredInRect(CGSize size, CGRect rect); -extern CGSize PFSizeMin(CGSize size1, CGSize size2); diff --git a/ParseUI/ParseUI/Internal/Extensions/PFRect.m b/ParseUI/ParseUI/Internal/Extensions/PFRect.m deleted file mode 100644 index 7ca81f920..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFRect.m +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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 "PFRect.h" - -CGRect PFRectMakeWithOriginSize(CGPoint origin, CGSize size) { - return CGRectMake(origin.x, origin.y, size.width, size.height); -} - -CGRect PFRectMakeWithOrigin(CGPoint origin) { - return PFRectMakeWithOriginSize(origin, CGSizeZero); -} - -CGRect PFRectMakeWithSize(CGSize size) { - return PFRectMakeWithOriginSize(CGPointZero, size); -} - -CGRect PFRectMakeWithSizeCenteredInRect(CGSize size, CGRect rect) { - CGPoint center = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect)); - CGPoint origin = CGPointMake(floor(center.x - size.width / 2.0f), - floor(center.y - size.height / 2.0f)); - return PFRectMakeWithOriginSize(origin, size); -} - -CGSize PFSizeMin(CGSize size1, CGSize size2) { - CGSize size = CGSizeZero; - size.width = MIN(size1.width, size2.width); - size.height = MIN(size1.height, size2.height); - return size; -} diff --git a/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.h b/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.h deleted file mode 100644 index f6742b310..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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 - -NS_ASSUME_NONNULL_BEGIN - -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/ParseUI/Internal/Extensions/PFUIAlertView.m b/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.m deleted file mode 100644 index 155f70d62..000000000 --- a/ParseUI/ParseUI/Internal/Extensions/PFUIAlertView.m +++ /dev/null @@ -1,213 +0,0 @@ -/* - * 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 "PFUIAlertView.h" - -#import "PFLocalization.h" - -@interface PFUIAlertView () - -@property (nonatomic, copy) PFUIAlertViewCompletion completion; - -@end - -@implementation PFUIAlertView - -///-------------------------------------- -#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]; - } - if (!message) { - message = [error localizedDescription]; - } - [self presentAlertInViewController:viewController withTitle:title message:message]; -} - -+ (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]; -} - -#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/ParseUI/Internal/PFImageCache.h b/ParseUI/ParseUI/Internal/PFImageCache.h deleted file mode 100644 index 38c184e28..000000000 --- a/ParseUI/ParseUI/Internal/PFImageCache.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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 - -/** - A memory cache for UIImage, based on NSCache - */ -@interface PFImageCache : NSCache - -+ (instancetype)sharedCache; - -- (void)setImage:(UIImage *)image forURL:(NSURL *)url; -- (UIImage *)imageForURL:(NSURL *)url; - -@end diff --git a/ParseUI/ParseUI/Internal/PFImageCache.m b/ParseUI/ParseUI/Internal/PFImageCache.m deleted file mode 100644 index 260cd50e7..000000000 --- a/ParseUI/ParseUI/Internal/PFImageCache.m +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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 "PFImageCache.h" - -static NSString *PFImageCacheKeyFromURL(NSURL *url) { - return [url absoluteString]; -} - -@implementation PFImageCache - -+ (instancetype)sharedCache { - static dispatch_once_t onceToken; - static PFImageCache *sharedCache; - dispatch_once(&onceToken, ^{ - sharedCache = [[self alloc] init]; - }); - return sharedCache; -} - -- (void)setImage:(UIImage *)image forURL:(NSURL *)url { - [self setObject:image forKey:PFImageCacheKeyFromURL(url)]; -} - -- (UIImage *)imageForURL:(NSURL *)url { - return [self objectForKey:PFImageCacheKeyFromURL(url)]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/PFLocalization.h b/ParseUI/ParseUI/Internal/PFLocalization.h deleted file mode 100644 index a328dfb83..000000000 --- a/ParseUI/ParseUI/Internal/PFLocalization.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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 - -#define PFLocalizedString(key, comment) \ -[PFLocalization localizedStringForKey:key] - -/** - Used by the above macro to fetch a localized string - */ -@interface PFLocalization : NSObject - -+ (NSString *)localizedStringForKey:key; - -@end diff --git a/ParseUI/ParseUI/Internal/PFLocalization.m b/ParseUI/ParseUI/Internal/PFLocalization.m deleted file mode 100644 index 947665dd9..000000000 --- a/ParseUI/ParseUI/Internal/PFLocalization.m +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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 { - bundleURL = [classBundle URLForResource:@"ParseObjC_ParseUI" withExtension:@"bundle"]; - if (bundleURL) { - bundle = [NSBundle bundleWithURL:bundleURL]; - } - else { - bundle = [NSBundle mainBundle]; - } - } - }); - return bundle; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h deleted file mode 100644 index a7b79552c..000000000 --- a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// PFAppleAuthenticationProvider.h -// ParseUIDemo -// -// Created by Darren Black on 20/12/2019. -// Copyright © 2019 Parse Inc. All rights reserved. -// - -#import - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -@interface PFAppleAuthenticationProvider : NSObject - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.m b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.m deleted file mode 100644 index 033f1ebc5..000000000 --- a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleAuthenticationProvider.m +++ /dev/null @@ -1,17 +0,0 @@ -// -// PFAppleAuthenticationProvider.m -// ParseUIDemo -// -// Created by Darren Black on 20/12/2019. -// Copyright © 2019 Parse Inc. All rights reserved. -// - -#import "PFAppleAuthenticationProvider.h" - -@implementation PFAppleAuthenticationProvider - -- (BOOL)restoreAuthenticationWithAuthData:(nullable NSDictionary *)authData { - return authData[@"id"] != nil; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h deleted file mode 100644 index ff92b4f5c..000000000 --- a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// PFAppleUtils.h -// ParseUIDemo -// -// Created by Darren Black on 20/12/2019. -// Copyright © 2019 Parse Inc. All rights reserved. -// - -#import - -@import ParseCore; -@import AuthenticationServices; - -NS_ASSUME_NONNULL_BEGIN - -extern NSString *const PFAppleUserAuthenticationType; -extern NSString *const PFAppleAuthUserKey; -extern NSString *const PFAppleAuthCredentialKey; - -API_AVAILABLE(ios(13.0)) -@interface PFAppleLoginManager : NSObject - -@end - -API_AVAILABLE(ios(13.0)) -@interface PFAppleUtils : NSObject - -+ (BFTask *)logInInBackground; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.m b/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.m deleted file mode 100644 index 1e32d097b..000000000 --- a/ParseUI/ParseUI/Internal/Sign In With Apple/PFAppleUtils.m +++ /dev/null @@ -1,125 +0,0 @@ -// -// PFAppleUtils.m -// ParseUIDemo -// -// Created by Darren Black on 20/12/2019. -// Copyright © 2019 Parse Inc. All rights reserved. -// - -#import "PFAppleUtils.h" -#import "PFAppleAuthenticationProvider.h" -#import - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -NSString *const PFAppleUserAuthenticationType = @"apple"; -NSString *const PFAppleAuthUserKey = @"user"; -NSString *const PFAppleAuthCredentialKey = @"credential"; - -API_AVAILABLE(ios(13.0)) -@interface PFAppleLoginManager () - -@property (strong, nonatomic) BFTask *userTask; -@property (strong, nonatomic) BFTaskCompletionSource *completionSource; -@property (strong, nonatomic) PFAppleLoginManager *strongSelf; - -@property (weak, nonatomic) ASAuthorizationController *controller; - -@end - -@implementation PFAppleLoginManager - --(BFTask *) loginTaskWithController:(ASAuthorizationController *)controller { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - - self.userTask = source.task; - controller.delegate = self; - controller.presentationContextProvider = self; - self.completionSource = source; - self.strongSelf = self; - self.controller = controller; - - return source.task; -} - -- (nonnull ASPresentationAnchor)presentationAnchorForAuthorizationController:(nonnull ASAuthorizationController *)controller { - return UIApplication.sharedApplication.keyWindow; -} - -- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization { - ASAuthorizationAppleIDCredential *cred = authorization.credential; - NSString *userId = cred.user; - NSData *token = cred.identityToken; - NSString *tokenString = [[NSString alloc] initWithData:token encoding:NSUTF8StringEncoding]; - - __weak typeof(self) wself = self; - - [[[PFUser logInWithAuthTypeInBackground:PFAppleUserAuthenticationType - authData:@{@"token" : tokenString, @"id" : userId}] continueWithSuccessBlock:^id _Nullable(BFTask<__kindof PFUser *> * _Nonnull t) { - __strong typeof(wself) sself = wself; - [sself.completionSource setResult:@{PFAppleAuthUserKey : t.result, - PFAppleAuthCredentialKey : cred}]; - sself.strongSelf = nil; - return t; - }] continueWithBlock:^id _Nullable(BFTask * _Nonnull t) { - __strong typeof(wself) sself = wself; - if (t.error) { - [sself.completionSource setError:t.error]; - sself.strongSelf = nil; - } - return nil; - }]; -} - -- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error { - [self.completionSource setError:error]; -} - -@end - -@interface PFAppleUtils () - -@property (strong, nonatomic) PFAppleUtils *strongSelf; - -@end - -@implementation PFAppleUtils - -static PFAppleAuthenticationProvider *_authenticationProvider; - -- (instancetype)init -{ - self = [super init]; - if (self) { - if (!_authenticationProvider) { - _authenticationProvider = [[PFAppleAuthenticationProvider alloc] init]; - [PFUser registerAuthenticationDelegate:_authenticationProvider forAuthType:PFAppleUserAuthenticationType]; - } - } - return self; -} - -+ (BFTask *)logInInBackground { - PFAppleLoginManager *manager = [PFAppleLoginManager new]; - return [PFAppleUtils logInInBackgroundWithManager:manager]; -} - -+ (BFTask *)logInInBackgroundWithManager:(PFAppleLoginManager *)manager { - if (!_authenticationProvider) { - [PFAppleUtils new]; - } - - ASAuthorizationAppleIDProvider *provider = [ASAuthorizationAppleIDProvider new]; - ASAuthorizationAppleIDRequest *request = [provider createRequest]; - request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail]; - - ASAuthorizationController *controller = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]]; - [controller performRequests]; - return [manager loginTaskWithController:controller]; -} -@end - diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.h b/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.h deleted file mode 100644 index c9772ef62..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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 - -typedef NS_ENUM(uint8_t, PFActionButtonStyle) -{ - PFActionButtonStyleNormal, - PFActionButtonStyleWide -}; - -@class PFActionButtonConfiguration; - -@interface PFActionButton : UIButton - -@property (nonatomic, assign, getter=isLoading) BOOL loading; - -@property (nonatomic, assign) PFActionButtonStyle buttonStyle; - -///-------------------------------------- -/// @name Class -///-------------------------------------- - -+ (NSString *)titleForButtonStyle:(PFActionButtonStyle)buttonStyle; - -///-------------------------------------- -/// @name Init -///-------------------------------------- - -- (instancetype)initWithConfiguration:(PFActionButtonConfiguration *)configuration - buttonStyle:(PFActionButtonStyle)buttonStyle NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; - -@end - -@interface PFActionButtonConfiguration : NSObject - -@property (nonatomic, strong, readonly) UIColor *backgroundImageColor; -@property (nonatomic, strong, readonly) UIImage *image; - -- (instancetype)initWithBackgroundImageColor:(UIColor *)backgroundImageColor - image:(UIImage *)image NS_DESIGNATED_INITIALIZER; - -- (void)setTitle:(NSString *)title forButtonStyle:(PFActionButtonStyle)style; -- (NSString *)titleForButtonStyle:(PFActionButtonStyle)style; - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.m b/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.m deleted file mode 100644 index b40278896..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFActionButton.m +++ /dev/null @@ -1,202 +0,0 @@ -/* - * 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 "PFActionButton.h" - -#import "PFImage.h" -#import "PFRect.h" - -static const UIEdgeInsets PFActionButtonContentEdgeInsets = { .top = 0.0f, .left = 12.0f, .bottom = 0.0f, .right = 0.0f }; - -@interface PFActionButton () -{ - UIActivityIndicatorView *_activityIndicatorView; -} - -@property (nonatomic, strong) PFActionButtonConfiguration *pfActionButtonConfiguration; - -- (instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER; - -@end - -@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]; - if (!self) return nil; - - self.buttonStyle = buttonStyle; - self.pfActionButtonConfiguration = configuration; - - self.backgroundColor = [UIColor clearColor]; - self.titleLabel.font = [UIFont systemFontOfSize:16.0f]; - - self.contentEdgeInsets = UIEdgeInsetsZero; - self.imageEdgeInsets = UIEdgeInsetsZero; - - UIImage *backgroundImage = [PFImage imageWithColor:configuration.backgroundImageColor cornerRadius:4.0f]; - [self setBackgroundImage:backgroundImage forState:UIControlStateNormal]; - - [self setImage:configuration.image forState:UIControlStateNormal]; - - [self setTitle:[configuration titleForButtonStyle:buttonStyle] - forState:UIControlStateNormal]; - - return self; -} - -#pragma mark - -#pragma mark Layout - -- (void)layoutSubviews { - [super layoutSubviews]; - - _activityIndicatorView.center = self.imageView.center; - self.imageView.alpha = (self.loading ? 0.0f : 1.0f); -} - -- (CGSize)sizeThatFits:(CGSize)boundingSize { - CGSize size = CGSizeZero; - size.width = MAX([super sizeThatFits:boundingSize].width, boundingSize.width); - size.height = MIN(44.0f, boundingSize.height); - return size; -} - -- (CGRect)imageRectForContentRect:(CGRect)contentRect { - CGRect imageRect = PFRectMakeWithSize([self imageForState:UIControlStateNormal].size); - imageRect.origin.x = PFActionButtonContentEdgeInsets.left; - imageRect.origin.y = CGRectGetMidY(contentRect) - CGRectGetMidY(imageRect); - return imageRect; -} - -- (CGRect)titleRectForContentRect:(CGRect)contentRect { - contentRect.origin.x = CGRectGetMaxX([self imageRectForContentRect:contentRect]); - contentRect.size.width = CGRectGetWidth(self.bounds) - CGRectGetMaxX([self imageRectForContentRect:contentRect]); - - CGSize size = [super titleRectForContentRect:contentRect].size; - CGRect rect = PFRectMakeWithSizeCenteredInRect(size, contentRect); - return rect; -} - -#pragma mark - -#pragma mark Configuration - -+ (UIColor *)backgroundImageColor { - return [UIColor clearColor]; -} - -+ (NSString *)titleForButtonStyle:(PFActionButtonStyle)buttonStyle { - return nil; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setLoading:(BOOL)loading { - if (self.loading != loading) { - if (loading) { - if (!_activityIndicatorView) { - _activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; - } - - [_activityIndicatorView startAnimating]; - [self addSubview:_activityIndicatorView]; - [self setNeedsLayout]; - } else { - [_activityIndicatorView stopAnimating]; - [_activityIndicatorView removeFromSuperview]; - } - - self.imageView.alpha = (loading ? 0.0f : 1.0f); - } -} - -- (BOOL)isLoading { - return [_activityIndicatorView isAnimating]; -} - -- (void)setButtonStyle:(PFActionButtonStyle)buttonStyle { - if (self.buttonStyle != buttonStyle) { - _buttonStyle = buttonStyle; - - [self setTitle:[self.pfActionButtonConfiguration titleForButtonStyle:self.buttonStyle] forState:UIControlStateNormal]; - } -} - -@end - -@interface PFActionButtonConfiguration () { - NSMutableDictionary *_titlesDictionary; -} - -@property (nonatomic, strong, readwrite) UIColor *backgroundImageColor; -@property (nonatomic, strong, readwrite) UIImage *image; - -@end - -@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]; - if (!self) return nil; - - _backgroundImageColor = backgroundImageColor; - _image = image; - - return self; -} - -#pragma mark - -#pragma mark Title - -- (void)setTitle:(NSString *)title forButtonStyle:(PFActionButtonStyle)style { - if (!_titlesDictionary) { - _titlesDictionary = [NSMutableDictionary dictionaryWithCapacity:style]; - } - _titlesDictionary[@(style)] = title; -} - -- (NSString *)titleForButtonStyle:(PFActionButtonStyle)style { - return _titlesDictionary[@(style)]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.h b/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.h deleted file mode 100644 index c34e4db00..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 PFDismissButton : UIButton - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.m b/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.m deleted file mode 100644 index ba40367d4..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFDismissButton.m +++ /dev/null @@ -1,84 +0,0 @@ -/* - * 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 "PFDismissButton.h" - -#import "PFRect.h" - -@implementation PFDismissButton - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) return nil; - - [self setImage:[self _defaultImage] forState:UIControlStateNormal]; - - return self; -} - -#pragma mark - -#pragma mark Init - -- (UIImage *)_defaultImage { - CGRect imageRect = PFRectMakeWithSize(CGSizeMake(22.0f, 22.0f)); - - UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0.0f); - - [[UIColor colorWithRed:91.0f/255.0f green:107.0f/255.0f blue:118.0f/255.0f alpha:1.0f] setStroke]; - - UIBezierPath *path = [UIBezierPath bezierPath]; - - [path moveToPoint:CGPointZero]; - [path addLineToPoint:CGPointMake(CGRectGetMaxX(imageRect), CGRectGetMaxY(imageRect))]; - - [path moveToPoint:CGPointMake(CGRectGetMaxX(imageRect), CGRectGetMinY(imageRect))]; - [path addLineToPoint:CGPointMake(CGRectGetMinX(imageRect), CGRectGetMaxY(imageRect))]; - - path.lineWidth = 2.0f; - - [path stroke]; - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return image; -} - -#pragma mark - -#pragma mark UIView - -- (CGSize)sizeThatFits:(CGSize)boundingSize { - CGSize size = CGSizeZero; - size.width = MIN(22.0f, boundingSize.width); - size.height = MIN(22.0f, boundingSize.height); - return size; -} - -- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event -{ - CGRect bigBounds = CGRectInset(self.bounds, -22.0f, -22.0f); - return CGRectContainsPoint(bigBounds, point); -} - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.h b/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.h deleted file mode 100644 index 85171806d..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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 PFPrimaryButton : UIButton - -@property (nonatomic, assign, getter=isLoading) BOOL loading; - -- (instancetype)initWithBackgroundImageColor:(UIColor *)color NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.m b/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.m deleted file mode 100644 index 5c5a076a5..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFPrimaryButton.m +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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 "PFPrimaryButton.h" - -#import "PFImage.h" -#import "PFRect.h" - -@interface PFPrimaryButton () -{ - UIActivityIndicatorView *_activityIndicatorView; -} - -- (instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER; - -@end - -@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; - - [self setBackgroundImage:[PFImage imageWithColor:color] forState:UIControlStateNormal]; - - self.titleLabel.font = [UIFont systemFontOfSize:20.0f]; - self.contentVerticalAlignment = UIControlContentHorizontalAlignmentCenter; - self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; - - return self; -} - -#pragma mark - -#pragma mark Layout - -- (void)layoutSubviews { - [super layoutSubviews]; - - CGFloat activityIndicatorRightInset = 12.0f; - - CGRect activityIndicatorFrame = PFRectMakeWithSizeCenteredInRect(_activityIndicatorView.bounds.size, self.bounds); - activityIndicatorFrame.origin.x = (CGRectGetMinX(self.titleLabel.frame) - - CGRectGetWidth(activityIndicatorFrame) - - activityIndicatorRightInset); - _activityIndicatorView.frame = activityIndicatorFrame; -} - -- (CGSize)sizeThatFits:(CGSize)boundingSize { - CGSize size = CGSizeZero; - size.width = boundingSize.width; - size.height = MIN(56.0f, boundingSize.height); - return size; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setLoading:(BOOL)loading { - if (self.loading != loading) { - if (loading) { - if (!_activityIndicatorView) { - _activityIndicatorView = [[UIActivityIndicatorView alloc] - initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; - } - - [_activityIndicatorView startAnimating]; - [self addSubview:_activityIndicatorView]; - [self setNeedsLayout]; - } else { - [_activityIndicatorView stopAnimating]; - [_activityIndicatorView removeFromSuperview]; - } - } -} - -- (BOOL)isLoading { - return [_activityIndicatorView isAnimating]; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.h b/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.h deleted file mode 100644 index 75db8f251..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 PFTextButton : UIButton - -@end diff --git a/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.m b/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.m deleted file mode 100644 index 9ada72677..000000000 --- a/ParseUI/ParseUI/Internal/Views/Buttons/PFTextButton.m +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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 "PFTextButton.h" - -@implementation PFTextButton - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) return nil; - - self.titleLabel.font = [UIFont systemFontOfSize:16.0f]; - [self setTitleColor:[UIColor colorWithRed:82.0f/255.0f - green:152.0f/255.0f - blue:252.0f/255.0f - alpha:1.0f] - forState:UIControlStateNormal]; - - return self; -} - -#pragma mark - -#pragma mark UIView - -- (CGSize)sizeThatFits:(CGSize)boundingSize { - CGSize size = [super sizeThatFits:boundingSize]; - size.width = MAX(32.0f, boundingSize.width); - size.height = MIN(32.0f, boundingSize.height); - return size; -} - -@end diff --git a/ParseUI/ParseUI/Internal/Views/PFLoadingView.h b/ParseUI/ParseUI/Internal/Views/PFLoadingView.h deleted file mode 100644 index 2663181d1..000000000 --- a/ParseUI/ParseUI/Internal/Views/PFLoadingView.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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 - -/** - A loading view that is used to show users that data is being loaded before any data is available. - */ -@interface PFLoadingView : UIView - -@end diff --git a/ParseUI/ParseUI/Internal/Views/PFLoadingView.m b/ParseUI/ParseUI/Internal/Views/PFLoadingView.m deleted file mode 100644 index 1b36ec024..000000000 --- a/ParseUI/ParseUI/Internal/Views/PFLoadingView.m +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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 "PFLoadingView.h" - -#import "PFRect.h" -#import "PFLocalization.h" - -@interface PFLoadingView () - -@property (nonatomic, strong) UILabel *loadingLabel; -@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator; - -@end - -@implementation PFLoadingView - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - [_activityIndicator startAnimating]; - [self addSubview:_activityIndicator]; - - _loadingLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _loadingLabel.text = PFLocalizedString(@"Loading...", @"Loading message of PFQueryTableViewController"); - _loadingLabel.backgroundColor = [UIColor clearColor]; - _loadingLabel.shadowOffset = CGSizeMake(0.0f, 1.0f); - _loadingLabel.shadowColor = [UIColor whiteColor]; - [_loadingLabel sizeToFit]; - [self addSubview:_loadingLabel]; - } - return self; -} - -#pragma mark - -#pragma mark UIView - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = self.bounds; - - CGFloat viewsInset = 4.0f; - CGFloat startX = floor((CGRectGetMaxX(bounds) - - CGRectGetWidth(_loadingLabel.frame) - - CGRectGetWidth(_activityIndicator.frame) - - viewsInset) - / 2.0f); - - CGRect activityIndicatorFrame = PFRectMakeWithSizeCenteredInRect(_activityIndicator.frame.size, bounds); - activityIndicatorFrame.origin.x = startX; - _activityIndicator.frame = activityIndicatorFrame; - - CGRect loadingLabelFrame = PFRectMakeWithSizeCenteredInRect(_loadingLabel.frame.size, bounds); - loadingLabelFrame.origin.x = CGRectGetMaxX(activityIndicatorFrame) + viewsInset; - _loadingLabel.frame = loadingLabelFrame; -} - -@end diff --git a/ParseUI/ParseUI/Resources/Images/apple_icon.png b/ParseUI/ParseUI/Resources/Images/apple_icon.png deleted file mode 100644 index 7ff6bcc5d6231531047fe001a2e61f5ff40b8b18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)Px$R7pfZR5%f(lQArVK@`Wo`%=_~r4x~gL?Q+TgP0^@vvjjcx-uFK7KzbnXkwJG z*)SMvNLU&y2C)!>kXHKnz3RJbg~UBC`Q^QL_x}G}zuqNDL}Xc3hHF@ikcCl%DeQvA zXxNRYP_L*1`3ziyJd7f|Z5ch0C&Nxeg|HtQa0Da2Njr|n;248*Fb?;y4^`-a0Vu%~ zbi*Z7oO6%lufQM&>+k{Jt5;@uWhB1RY57_wZOKGBKM zvB5wkLllRY4a&zZ(8zP>(p^J7Nn3Aa&meA>>@*urRfKo2#1*2Pccob~xX44E@g`ER zAm8gC(rmTEL>o-E+3!@%c_(733ES)E8;CTBme*a07*qoM6N<$ Eg4-Xi+W-In diff --git a/ParseUI/ParseUI/Resources/Images/apple_icon@2x.png b/ParseUI/ParseUI/Resources/Images/apple_icon@2x.png deleted file mode 100644 index c826f381f1f39271998329bd2548c49354a8a903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 844 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 diff --git a/ParseUI/ParseUI/Resources/Images/facebook_icon@3x.png b/ParseUI/ParseUI/Resources/Images/facebook_icon@3x.png deleted file mode 100644 index 287456bb8ebf3a41d6c42715e007af97b9acc728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1754 zcmaJ?2~ZPf6pnxxp+LNfh}LaHD@u+HawH^Z4j>VOh@l3@gC$vD37d_{0)bK|rlO#N zAP8dwMA0gidSE>e2CTQmf(jI&45(<)NL3ibq9b;LfbC4_o7w&U_s{#j_r3SOoy`ah z339NTWk({B93)~<7_ka0580M@cgaXkiNysEkmIYdXgmqh!X&;Di-G|O3dO)-Fr-Z0 zbPMK^NY?WZnH-l(S8x;fPQ3esL zQ)m$lj$mrQ!U#oS2{?~RDE(Lhsu`nI>qgo{G>oB#Gz^f=w3IX&D3$(yD2k3n>+mr6 zlivR%*2$7JFe41sVF_9VadFY}EU7dcp%#X4Oe@2%_|Yzg#$q_8i^Vj6PzWrPLJCA} z@!f|3QYlBG*5Qy^0ZT+YDnUU<5GBWlC18m_AGW7R$OgfHCBB|sLV>`W$rcDewiin@ ziWOms1Qb@|qgdr9EPq_AWfo8kky!+5kwjP-sKroVxMmJAz80Tx`9`qH@wNDli)9dE z7?zv;$4!qO5#wXoj?FFMj7>hQCdOS$%yl-lIEeUMq!JNdrf=&h>>OFh8hvbl}vs=eaaa!qye&@Vg!T74QR@wh+FiMabB5Vrxdg{-wr=gQfct zyC7?L>*fBEo_Ie$UY+`)c%!bce!$;pw)eT1Zr;0|!QO8>tQ9WIf;!mV#;T!R{ieud znq^&mnE3?ldH4_-u)j}Om)Nahts%0rt!;;U-r7Zb+n$-t7jJD994rx3{#ag~8X2&v z-Fx4P%+IdnH*`Ds8ZLo(t~WM$1o0s^FimJ%TWU20NUyNU`R+wQTF_wiSN96;6x16i z>k1DX_;8`Ry4oamJI9~1L-Y98=rfKTCk2UwYRV9-{|j@19=QKrC*EM`D$lh zuRe8mThzW43nmtKPii)nL{LggOPwI<5I^DFuE0{y+}zwR%?VctTYT&hZhu_1=q%6A z&y{X^byJzOyh3G&d|O>r6`b0OqUgZT&`=ePMx#?g7v#eqvc-gg-}cy?uBoXBH2ZP6 zTr$#sJ(Ag!zdp_oACmo7>z|4C%k=9#$R_Ivx-0$}b8l1B22EM~&iRjh?@n)RZ;!tM zR)^m2e`{y6i3=_!8^4dR<^$=9AIi(!78%3C!?zuBj-2sk=A*{OMr@_I7&z@CuAh-1 z@^{I+?tI(b=V(ew3fFOa7YCX6HQd0O?bvW^4s_}dzk9sk<}l&W#xhQep-+i=@6UZ3 zg`AetFN;#rQYa1%4h09Zn!=ne$DQ>qKH`!`BR~B-ak}irwBy!%X012&(_}&ZlR^_< zGMP@qg+*|R>Q!5oJ$NShWollG20@~LmGx(+Ic%XPs-u&L+qm5Iu9$uKc1)$g%mr=-8e1L58FK5+eKz{YosX{kN z`a#N+v|7iKIYxlo$v)Zgd|CilwwFSy=qy`M*O$}K{mtQxa=E-Kxu)gio23|r)rL

Ru)!QR#t-k{zJ;RIP?3J6KqL63&CwuwpW!AKO2%HAVhRR5NZ4y DVXC#_ diff --git a/ParseUI/ParseUI/Resources/Images/parse_logo.png b/ParseUI/ParseUI/Resources/Images/parse_logo.png deleted file mode 100644 index 68d8befc2f30b1e3f61519ca40cda76ac030ab13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5403 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 V5$q|d^!Fd1$_nc8wXzoB{|9T(J8l2~ diff --git a/ParseUI/ParseUI/Resources/Images/parse_logo@3x.png b/ParseUI/ParseUI/Resources/Images/parse_logo@3x.png deleted file mode 100644 index 80629f4e679b8a61d1ad22ff568bfc78a455b073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9845 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 diff --git a/ParseUI/ParseUI/Resources/Images/twitter_icon.png b/ParseUI/ParseUI/Resources/Images/twitter_icon.png deleted file mode 100644 index 386d40b5cb5cf75791c2288890d4b4a72a6d1ea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g!!3HGbRrPd%6k~CayA#8@b22Z19L@rd$YKTt zJ!KGPtXOJa22^l5GbExU!q>+tIX_n~F(p4KRj(qq0H~UQ!KT6r$jnVGNmQuF&B-ga zs<2f8tFQvHLBje<3ScEA*|tg%z5xo(`9-M;rg|oN21<5Z3JMA~MJZ`kK`w4k?LeNb zQbtKhft9{~d3m{Bxv^e;QM$gNrKP35fswwEkuFe$ZgFK^Nn(X=Ua>O75STeGsl~}f znFS@8`FRQ;a}$&DOG|8(lt3220o0wj1#pY6q)xAF#9-3GhTfTYzh5XbW&)OfBJGkFJ zu+};JbB1#b8{ZPMgS8fU%=WA=-B)ft+4{oq*S-T`-x{8HN3`T}y=}Am(<0n@L*=br zN!J~r++5yY&OHC6|1~`0T6f5@HC-|EV$W**%kM;!G}X!_M5Iz2AImKJqkrp`_6+aO zoMC4Z!q)9=?B1~b$3a8u4UTG@!mk%6m2NvOv)Yb(7IRG0jqoP*0@l1IDcUo_GpwH3 zgiR@1fBg8WvIEL9+8MtrY@7RF-}1fT3omDG-=kFKlbOBKu;l->hhi1Nce>&X6Ftt! zXU2Y-o!5QxS^Qi6u(OH6eE(buq?aW`bX;0vbP0l+XkKt)sB9 diff --git a/ParseUI/ParseUI/Resources/Images/twitter_icon@2x.png b/ParseUI/ParseUI/Resources/Images/twitter_icon@2x.png deleted file mode 100644 index a319f37bc37a45f047924be92b7eb15a66c94983..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2031 zcmZuydpy(YAD_#}ayjHuxowl0%H|Ta+2vqvM~PJ~p;;^(X4<}N$b?i=PD3sg=_aLq zLPhRFq;kn+F3FP1aY=q1#zD#1s&mfoa-P@g^E{u==XrlF@6Yqc!*z9WP=aiRfIuK6 zCr2VleC`y>mUVLCeXg%RRD4J=Ne(ukqIR7rv7r#|=*0wqkOmTwV&@Yg#ekQ=2R#AL zeS0zfbQ+QpKtD=FvT5OBGzf%cW5g3XoP@xvcT}Tr+9s-3zv5bIY7!uL`d$`!b!Gi!G9D_o!SS%#V97$&cqD;|fG|I#b zWoBk9Mi?`r!T<`}IE-oVEy zXp}%IiAo8G!lM2c@pq?KNlMIqMle;(Rl*2wibegO?>ioglFx4D0klxn&%N?zk2j+95=6R7-L!=%3^H#lY)_VOZ`%g~PZ&});BTtC$;F}L8=%~g> zZR{w$JZJW*YhCGNH-9RhabL(*zv6jFF_fz(8*!;nt9VUrKX4(54qo~Js~xe?bc4vi z&pXmFF7r&MD8<*NoNv!#$lB`2sJR!Yn2#BM5w7b^X!{W@+wR;@(QxHP;SgurbGNWi z=as;2(aUUlX0~$n7Q@%;d(RzV#Q5($yi+Q!=P>7F4c~q;DW&ONfD7IMlB)CdI7iK>GZ0?cX5p;NnMupV7nFh=o`UT96Rqz8O1E{!U^0S=csK z%WrtF$H*Y}%eonGNwUYN;w2js<*X5osHXEycUTUCJmPhxRuj=YXE|AZ8MmqnIYbym zu(qm{ufjh*IPz3V-NSO+_dIvz>>WIYuVSY*PPSia z_$d6Ohd?{N9_S32uq)oBP-xU4Uotn@!V+PwDdyDqo?><`s*c_^bKyl4o6gN5+V{Cb z59k_ZWv8O4H7rp#pBuICMozPv^`aX5EPnaH*no+nzZOPdzSdRlJFkaY)LyECHp77& zC7Hm+z7pM6hag>>PALmFu597Rc`D@$D^CmMLikF4(s^^v4s8a+M91SQ_vcQ(NYwE@ z{4bCUUjE_+UG?{GruS+L7O<5*NXMMJc{RPU|8{<9@7?QG73XlX5U6wVs&rZ3;3%JV zw@lNjNqPN?7X!^1eS!DQOYFurP}?e6zRb2eO+vQU`oHpc6>3^&>Vw zSx$rA3>|>#-M6Ex65{66!Xw7>pSpxR)h&##e(QETB%ojfV^Mg^F6~ohl4v&XLebI_ zQAtnGeBUDz4WIE=gVtap>qfWo0`K!-0fGb^#&27v z2_4%E`DC;12CPFaX~5NfJ~BuVZ?GRWafM=PVmB*&AwGkDX+_5RybG^#-;hs}VBzqp zluy$}PX0lE>c?uB~A*Kx063Th@8|}u4-0I@M8BVVtBD6voQynP#v}686Uc2QIVxhTxX?Ir1 zz1#=s?}NM1%J68_Y+0H+310gdmo2BC4NxqLICihbnb z6tVcF!jjq^5b3mG$WQEuyBTfJS(eB(pr$#~`VEl)dcz@PZRJ}GyNBaiSV<4|%!l$4 zDcW)F^RYY+K{V%ws}1@)&e2-y!3{6t*C?OmpZHc#vooGxiVC~-{3v8|Nr6@m2%`b| zt&5t&W46T(1V6x%tS?KBuUuN#?seUG%cx-I@ei|>Pd1mPbj4cSNO_q0CElXGQ0q!A z;;r-%Fd@OMsaE**-ZT*rc(`ZCb|CefEa}t5dwSYSt%DkTpG6p8x<@MqT)mqXB3uJ= wWUA^TKN|L1?YN?0dEdS)1@AS{O?i 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 - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ParseUI - CFBundleIdentifier - com.parse.parseui - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 3.0.0 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 3.0.0 - MinimumOSVersion - 12.0 - - diff --git a/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings deleted file mode 100644 index 7f8656356..000000000 --- a/ParseUI/ParseUI/Resources/Localization/de.lproj/ParseUI.strings +++ /dev/null @@ -1,98 +0,0 @@ -/* 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"; - -/* 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"; - -/* 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"; - -/* Username */ -"Username" = "Benutzername"; diff --git a/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/en.lproj/ParseUI.strings deleted file mode 100644 index d656c63c678f99ebb63d5102d1560e16e44267a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6068 zcmd5=+fExX5S?efVuge%@lZaXs#*jDp(02Nl;<>A0&3W_Nhspy+n!^~%-G&tmUg)) z3S{l^+~>@A|NP#PO(|qsCiq;*3g5X@GLjiqH)TuKWW9EG9sBR`ZQ6Z@lWRCn?nCff z;&Th$3&<((x5RS^d4*iN-%HR;@vDFal{+(#L(os<0MB2sTH^eU({6?Hb7(lj+5)ty zCr_5(I08K_xW)gKT;i9NNC``#8*?G7}qU_}{4%&w}Q@v7yr3)^nNXNLbH7ok0PhhDb+ZKF~t?NqVUV>y>2 z#Q9jZWfze?l6`nJ#B&$x`M#A@zi(yinQRDrbxnEMwfKDQ2lb6TAL!Pl>HHjV8YAaO zSvoII+!OP03cDvRimVD>h3W~FSRf{k<5H*Nzi_cu4P0hS@s|~x*7pY!!-ptUyN4;Q z2F#TcIhAc>&!Oxgd(>O`o=U0PvwVp;z5=eDjU_6bALZUep)#5&>Li8er#Lv53+LN` zd`6ZK>F!|f2-rm2>xPIy6EDMClIt1oraCe+50Ig;2f}L1O;>X+lv2PZkIg>+*=J}O zvxr&0a?k(M18DISoG5ExWTkr6QCOXi<&&|PPs+hRS?aU`)K}?_a>;kvIkNw-11-^| zh|BaDeHTzV%^z>!5MDTeKc?`=nf&OOH>qyy(l@SW`rcT;vy{*1vA6U0hC{Tm>!Ay* zva?dZWz;MC=iKf!+xM5Sf!N8}gWbNb?6c^Q+xNxEBdRyYz7R{*-69+R=eDM)zS=yH zo@uxA8hOh|F_Vcb*4lovJ>)UxPe1Qb7Bi$k&BW8Io&1LP70~shwfGFSQ4Z&A+QTY) z4HmP~tzO+Nt~+Th)+y_C*vc+Z-cN{K?aWU#*+}&H>AJVa$mXo|ed_?Z(5$$D=eI#&2DPzhs1X9k@@KX0BL zp31MhBi=y^-c32TR1t<-)TpDhb`71MeRpJa6_{DIcZZuv8Sg%oUXU=s*6H=-bSiPMoeSnS;Ql@bIu*f zcbDaHNAoqwn&mY0`033~A*VGM5Z+vncdQ3b#&{C4nRp($FMA>15nbTJ`V8+y>hbgC zG_c+$p8kSIXV9DPom5xWbc~6#slQp89u8Gq=ZjRjj|qLP`sQ&-XA`BhwpsLk3E4IR z`Hb^a`JekcoksNS-D7HiILn*Y!%1XTa}V(iC#yH_Uw(dJ?o&gLN~D}1UKQTb5=lLxGKz}c&mqft`3%`Z?R3%)*pTk1 Jj`@z~_!pRg+vxxR diff --git a/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/fr.lproj/ParseUI.strings deleted file mode 100644 index cf2015c3e07f69bf478af9b70b81bd6c8f07f5c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6542 zcmd6r>uwuG6vyXtpJElMid2d80T3!tE>%TtkOn@xj^h}73AWo1-jKK8BjF){|L>ek zXLfcsw$&8SYVF;*oXh`QXaD}|Wq1*)up2IQjlxp*EKEZ$j5YcqybRC6R_pAR=D*V2 zHT$J@KGS}vpNZZ=*R5#J#i!EmK<@+btHQ*d7g{saQzZ$ew&yS$Y5g#~(fjur9ccfa zNw?JgnIs%*Y_7FQPIeANv8VNDaI61ixYkq75e^HD&%^uB|ETjqtFBGbD!dbwfysfC zQkZm&%@XH-I3-IfeTxi^X-KX+Sk_#WQ1}z&r7Xv`6gNgzbgE$``2)9dRCID z((_U`+D%1!7Vhkgb-6@2>U-KZl?($zB4U(}CJlDAaw;?&(XEiv*%!B4&5rfoGwU5l zE-a8^|JbU;$9E3IiM_5ldX07W4gI-!0X_lhr6i}}hj1dlI1RgDU!HLiUW-oDZC~Tf z`NaM0Bb*%BN>a>Bx<$eJAoHroFO4N0`B;u(8)j)N-w(EqP+j}9x{{22U7*NXBI?rK z@Ur0pve+`lbHeCTsI*IokK+q?xm$E>9=ni4H@ZCX7V>Q}OI@c!+d0%PnV`%QuQV31 zUbQmGcKkriWx0_o9*3 z`jNprW+r+9i5j0lhnE z-7{PUYv$P~v-5C`lDvB@aU9p=5djr^6$I;e#L-0aTv={p-bGdz86L>q)P1N~=v_%C zYJf)v)?qzf#{Q+fe@d-!>7CbM#w*GE+k?gW;(00gd%~Mq83CC+(%F0{$x)bhD*Dm?NLFG>3&+f7umr6;3j%dX^+C=m_Z@vdU|6 zJ#%mQw{@)Khbc28jStLYV$arA&(NT&L! zZH~ZHd0}E0ZCkdd0-+gMs=cR6XO;g02KDpP=K2#M9$lr)Q(x>kO2&-%lu14?hvmcWi>kSQWp{3;(8Xr~CBW z$vH087Pw4Q7x9x4yVn|<>Yi(FUwg+|ySmT$T&N=PouuHrj;*J)x>4qdxwQR4vZH-Z z`$Ugk2U-)miBz|+Nc*Zhi>K35+qr};%xRQo%li4E%!N&#eVQ&Z)!ydm zCuzm1r>H!!|EjD5OFcn-Jn^OL#`A~}{LR0aG%Z-)U+MJJv|sm{#LxG|uLF2_^HkZ_ z*uAV6yXIJr^7yIySDty$feyA8elpGKovX(``GKs2XZuMh%D$>^&HJpk*6G*tP5e>= z?YbQ7Jp0(iQW0a6QIld{z;__N(s3Td3SPl;9(jg3Dl$;wJ_x^<1mqeh-iIIc#R(aX zjc#7&+v1nlkKebv^848aiArhmx=$YepuN;Ydh~jJtmk6%i#eb>ldWqR(2kj;%`#;r zaQlFJlDBE2vV%%%bKP>A>`7;QE7v?$!8$jpK$|_<`mUT>lA&2gntj*jii9TGWp9gaj-V2Z$`QG6> zM;2*#etyR4j-^d|tr$lo((s#Fd^fA8cUJg6{gmf0|9Z){!EK8T&%a=pD#Q8~^Z23* q>^_fG;>A2Q!~2DWIxi%M*zt{x(@=?iGlF7PDQA-GC!)OGncyFmGC;-v diff --git a/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/he.lproj/ParseUI.strings deleted file mode 100644 index bea566232eb09eac3f920397d8c610b774d1202f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5670 zcmd5=U2j`O5S^F%(qFNPR3TNOeFvcuHF1TgngA_4o7iz892;yy)PHG%(*+s*9my|xpPqRO&;@7~?n`8acC_WtwtBY7ZB)}?{Zz6|i~N=NF_#^?iiB==;k z^646$e}?axOpBx9qWG&=lTR`G9@bFeHe~eiIfT3(WIOyeao@xqP7d_Ck2x(|Iqcfe zH8pvL`7QYZ_upc)iS*J{863UjFH%x-rxp;jSaoGWmD6y%2ZRi~_)`GPS zjT({ev&rnY9UY=@J1JE1JG&?h&*IjKU12mSH^hDOVC%Lrji!^H~1GWEq}QT;wb0p)NiS)nrfcNUza*fmd_nc#m&O z4Oy{|D0bwf{CGpely^S>`dG(&y>jp^uNgnqTVCH+M%vN3*25^P9rf!c^^3KOI3eS* zUd{1;gnM7R%p0FvOSBoRgE2bGTE>;P4~@xmtp2RGcZIf?0m>SDt^1LKEymRq`8Kx1 zasI#Ua6ph{?JBD*qgL5>08}zEf%#$^?-t7erR?~8hsC{!2#1VF`^C7|dMIPC!xSA< zTz68tUcv%OWA93>*<*ePb}?IHy<)q}s+s29IoNEDjGUncq}Exl^I_P<8e%^bR$@ z3++5+$!WafNuk;UL$y8j!&pxRc5dKF;P+CrpJLw*zC9p#2cB+YpO)t5vdaCwe8n@< zD`>&98u_OaG3p5My#ikSx#mLuS&>JjicGKhn#6o?=nJi4hK_z)eOo=t_|7_XcE49z z#ZFgrzd5`3vtf+1yXkwZ>XbWfvtWpG;W91@eS*_Y!Mc}p+~keX0nPMunX*PYzuM=E z=a~G|$!8O@js42)`=hw>zo^LGa9*eER1dC9nINE>JRK?^ z>k;3E?Bc^L3~vLf8E;vBnFXHze*IAMU=_yWO1Pt$$#*TR!26mB`T64RYGS~7 z?g{2vNAs^-V|=$j^io65B+S$XeBOa~$bOy$8Ht#0c?z>`&M#3#D4)OY**p{ diff --git a/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings deleted file mode 100644 index 97cb0edda..000000000 --- a/ParseUI/ParseUI/Resources/Localization/pt-BR.lproj/ParseUI.strings +++ /dev/null @@ -1,99 +0,0 @@ -/* Additional */ -"Additional" = "Adicional"; - -/* Password reset message in PFLogInViewController */ -"An email with reset instructions has been sent to '%@'." = "Um email com as instruções para redefinir a senha foi enviado para '%@'"; - -/* Cancel */ -"Cancel" = "Cancelar"; - -/* Downloading Error */ -"Downloading Error" = "Erro de Download"; - -/* DOWNLOADING */ -"DOWNLOADING" = "FAZENDO DOWNLOAD"; - -/* Email */ -"Email" = "Email"; - -/* Error */ -"Error" = "Erro"; - -/* Error occurred during deletion */ -"Error occurred during deletion" = "Ocorreu um erro ao apagar"; - -/* Forgot Password? */ -"Forgot Password?" = "Esqueceu a senha?"; - -/* INSTALLED */ -"INSTALLED" = "INSTALADO"; - -/* Load more... */ -"Load more..." = "Carregar mais..."; - -/* Loading message of PFQueryTableViewController */ -"Loading..." = "Carregando..."; - -/* Log In */ -"Log In" = "Inicial Sessão"; - -/* Login failed alert title in PFLogInViewController */ -"Login Failed" = "Falha ao Entrar"; - -/* OK */ -"OK" = "OK"; - -/* Password */ -"Password" = "Senha"; - -/* Password too short error message in PFSignUpViewController */ -"Password must be at least %d characters." = "A senha deve ter ao menos %d caracteres."; - -/* Password reset success alert title in PFLogInViewController. */ -"Password Reset" = "Senha Redefinida"; - -/* Password reset error alert title in PFLogInViewController. */ -"Password Reset Failed" = "Falha ao Redefinir a Senha"; - -/* Password missing error message in PFSignUpViewController */ -"Please enter a password." = "Por favor insira a senha."; - -/* Username missing error message in PFSignUpViewController */ -"Please enter a username." = "Por favor insira o nome de usuário."; - -/* Email missing error message in PFSignUpViewController */ -"Please enter an email." = "Por favor insira o email."; - -/* Email request message in PFLogInViewController */ -"Please enter the email address for your account." = "Por favor insira o endereço de email da sua conta."; - -/* Generic login failed alert message in PFLogInViewController */ -"Please try again" = "Por favor tente novamente"; - -/* Purchase Error */ -"Purchase Error" = "Erro na Compra"; - -/* Forgot password title in PFLogInViewController */ -"Reset Password" = "Redefinir Senha"; - -/* Sign Up */ -"Sign Up" = "Cadastre-se"; - -/* Sign Up Error */ -"Sign Up Error" = "Erro no Cadastro"; - -/* Email is taken error format in PFSignUpViewController. */ -"The email '%@' is taken. Please try using a different email." = "O email '%@' já estea cadastrado. Por favor tente com outro email"; - -/* Invalid email address error message in PGSighUpViewController */ -"The email address is invalid. Please enter a valid email." = "O endereço de email é inválido. Por favor coloque um endereço válido de email."; - -/* Username taken error format in PFSignUpViewController */ -"The username '%@' is taken. Please try choosing a different username." = "O nome de usuário '%@' já está cadastrado. Por favir tente utilizando um nome de usuário diferente."; - -/* Invalid login credentials alert message in PFLogInViewController */ -"The username and password you entered don't match" = "O nome de usuário e a senha fornecidas não batem"; - -/* Username */ -"Username" = "Nome de usuário"; - diff --git a/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings b/ParseUI/ParseUI/Resources/Localization/sv.lproj/ParseUI.strings deleted file mode 100644 index ca1c83bd80d39042a905032d96e772e834d2669e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6226 zcmd6r*>2lL6o%(IPeB+63gn`BfTBo^ST>9rv1>aiddbMNtZH*b#fBcRZ<4%1F5CX! z98G5-<)v|ofY8F>nX~+79sd2-OZUQ6Zr5Gt8oQM~3paPQn`-rid+DCJo!+NAdj6w6 zJMK5_TDit8wP)-`+Pl=fZ z*Q{%g!+x_SQ`#W2kSqU<3AmO|EO|kJqA|Yfs~;0($9c zv~Abj2#uv%i*N4LJ>hXHK2!bH-qwNW@J#BHyQrd+{f#a+(jC<19=)mOd!ai}9ChR$ zyI>(*kNmDZeV-Pb2T244ZgDMgNY_$)`*4VBalcue zqZ;WdAvx6b!J}%?bm8v|jY>%2LE^z8INJUtT%vvFH$lE5iMLRmu>+HE!T7e!1X zpRJ{DtxP6f9#&0r8D>kLrrR|fNryv4LXJRKO?gr0=^a)tyS9#e1ppJP?3NAmDQv^@ zPnv}HtBWNZ!6(# zIo#-Y~lMI$TO=PCkql@3Emxs06v1ny+z${D^{k6HvKeaH8ivQcXO0!_h z`)KQ*9m|+&tSi;(OWl6(&`j-O5i*>Zp@OA&JZ+W`ImAD4YqKY^h^b1smQT`Y7QE9l z=x)@XsZr!7yU^Eo*_2xL$THI3df7|utCb_{{5EW-R)9p%>%Z6z8ivn>N6UD1vpr6B z--h*6-9~<}EO?yd`CcXz%WJElX^l&*hUO1HJ6I*&9^=+C>5C7WD^7fE?2B+tY8I)% zQsS4hY0#Jnz|I$I{W2LtLFMI+>GW~fUi)2UOw}ewa(7)X-q!N%y%lwu?{bnbwBFg?KR!*lA{+Uq{`1o zaeB+wql7bmhR5nO+V1Ar=Z~C!rBhDuS(H_tw_|kkKB4w~#yV*(Kdlf+Ajo*=SP5oKo+?|BJRCr>*k=Zjnx0d($NppI zmk{?QVrCcl*zH_4t$+X;TD^htLcW>nZ8At$t;A#ZBM+ze{=1y$InQ&}o9VKwA_I|| R*O6{~hukio+^>;w{s%~#7FqxR diff --git a/ParseUI/ParseUI/Source/PFCollectionViewCell.h b/ParseUI/ParseUI/Source/PFCollectionViewCell.h deleted file mode 100644 index 3c7104368..000000000 --- a/ParseUI/ParseUI/Source/PFCollectionViewCell.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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 - -#import "ParseUIConstants.h" - -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 - -/** - A simple lazy-loaded label for the collection view cell. - */ -@property (nonatomic, strong, readonly) UILabel *textLabel; - -/** - The lazy-loaded imageView of the collection view cell. - - @see PFImageView - */ -@property (nonatomic, strong, readonly) PFImageView *imageView; - -/** - This method should update all the relevant information inside a subclass of `PFCollectionViewCell`. - - 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. - */ -- (void)updateFromObject:(nullable PFObject *)object; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFCollectionViewCell.m b/ParseUI/ParseUI/Source/PFCollectionViewCell.m deleted file mode 100644 index 6fb1f466a..000000000 --- a/ParseUI/ParseUI/Source/PFCollectionViewCell.m +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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 "PFCollectionViewCell.h" - -#import "PFImageView.h" -#import "PFRect.h" - -@implementation PFCollectionViewCell - -@synthesize imageView = _imageView; -@synthesize textLabel = _textLabel; - -#pragma mark - -#pragma mark UIView - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = self.contentView.bounds; - - CGRect imageViewFrame = CGRectZero; - if (_imageView && _imageView.image){ - imageViewFrame = PFRectMakeWithSizeCenteredInRect(PFSizeMin(_imageView.image.size, bounds.size), - bounds); - } - CGRect textLabelFrame = CGRectZero; - if (_textLabel) { - CGSize maxImageViewSize = CGSizeMake(CGRectGetWidth(bounds), CGRectGetHeight(bounds) / 3.0f * 2.0f); - CGSize imageViewSize = PFSizeMin(imageViewFrame.size, maxImageViewSize); - - imageViewFrame = PFRectMakeWithSizeCenteredInRect(imageViewSize, PFRectMakeWithSize(maxImageViewSize)); - CGFloat textLabelTopInset = (CGRectIsEmpty(imageViewFrame) ? 0.0f : CGRectGetMaxY(imageViewFrame)); - - textLabelFrame = PFRectMakeWithOriginSize(CGPointMake(0.0f, textLabelTopInset), - CGSizeMake(CGRectGetWidth(bounds), CGRectGetHeight(bounds) - textLabelTopInset)); - } - - // 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), PFRectMakeWithSize(imageViewFrame.size))) { - _imageView.contentMode = UIViewContentModeScaleAspectFit; - } else { - _imageView.contentMode = UIViewContentModeCenter; - } - } - - _imageView.frame = CGRectIntegral(imageViewFrame); - _textLabel.frame = CGRectIntegral(textLabelFrame); -} - -#pragma mark - -#pragma mark Update - -- (void)updateFromObject:(PFObject *)object { - // Do nothing -} - -#pragma mark - -#pragma mark Accessors - -- (PFImageView *)imageView { - if (!_imageView) { - _imageView = [[PFImageView alloc] initWithFrame:CGRectZero]; - [self.contentView addSubview:_imageView]; - } - return _imageView; -} - -- (UILabel *)textLabel { - if (!_textLabel) { - _textLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - _textLabel.numberOfLines = 0; - [self.contentView addSubview:_textLabel]; - } - return _textLabel; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFImageView.h b/ParseUI/ParseUI/Source/PFImageView.h deleted file mode 100644 index 63a68466b..000000000 --- a/ParseUI/ParseUI/Source/PFImageView.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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 -#import "ParseUIConstants.h" - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -typedef void(^PFImageViewImageResultBlock)(UIImage *__nullable image, NSError *__nullable error); - -@class BFTask<__covariant BFGenericType>; -@class PFFileObject; - -/** - An image view that downloads and displays remote image stored on Parse's server. - */ -@interface PFImageView : UIImageView - -/** - The remote file on Parse's server that stores the image. - - @warning Note that the download does not start until `-loadInBackground:` is called. - */ -@property (nullable, nonatomic, strong) PFFileObject *file; - -/** - Initiate downloading of the remote image. - - Once the download completes, the remote image will be displayed. - - @return The task, that encapsulates the work being done. - */ -- (BFTask *)loadInBackground; - -/** - Initiate downloading of the remote image. - - Once the download completes, the remote image will be displayed. - - @param completion the completion block. - */ -- (void)loadInBackground:(nullable PFImageViewImageResultBlock)completion; - -/** - Initiate downloading of the remote image. - - 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. - Will be called with a value of 100 before the completion block is called. - */ -- (void)loadInBackground:(nullable PFImageViewImageResultBlock)completion - progressBlock:(nullable void (^)(int percentDone))progressBlock; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFImageView.m b/ParseUI/ParseUI/Source/PFImageView.m deleted file mode 100644 index 387b1a4d0..000000000 --- a/ParseUI/ParseUI/Source/PFImageView.m +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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 "PFImageView.h" -#import "PFImageCache.h" - -#if __has_include() -#import -#else -#import "BFTaskCompletionSource.h" -#endif - -@import ParseCore; - -@implementation PFImageView - -#pragma mark - -#pragma mark Accessors - -- (void)setFile:(PFFileObject *)otherFile { - // Here we don't check (file != otherFile) - // because self.image needs to be updated regardless. - // setFile: could have altered self.image - _file = otherFile; - NSURL *url = [NSURL URLWithString:self.file.url]; - UIImage *cachedImage = [[PFImageCache sharedCache] imageForURL:url]; - if (cachedImage) { - self.image = cachedImage; - } -} - -#pragma mark - -#pragma mark Load - -- (BFTask *)loadInBackground { - BFTaskCompletionSource *source = [BFTaskCompletionSource taskCompletionSource]; - [self loadInBackground:^(UIImage *image, NSError *error) { - if (error) { - [source trySetError:error]; - } else { - [source trySetResult:image]; - } - }]; - return source.task; -} - - -- (void)loadInBackground:(void (^)(UIImage *, NSError *))completion { - [self loadInBackground:completion progressBlock:nil]; -} - -- (void)loadInBackground:(void (^)(UIImage *, NSError *))completion progressBlock:(PFProgressBlock)progressBlock { - if (!self.file) { - // When there is nothing to load, the user just wants to display - // the placeholder image. I think the better design decision is - // to return with no error, to simplify caller logic. (arguable) - if (completion) { - completion(nil, nil); - } - return; - } - - if (!self.file.url) { - // The file has not been saved. - if (completion) { - NSError *error = [NSError errorWithDomain:PFParseErrorDomain code:kPFErrorUnsavedFile userInfo:nil]; - completion(nil, error); - } - return; - } - - NSURL *url = [NSURL URLWithString:self.file.url]; - if (url) { - UIImage *cachedImage = [[PFImageCache sharedCache] imageForURL:url]; - if (cachedImage) { - self.image = cachedImage; - - if (progressBlock) { - progressBlock(100); - } - if (completion) { - completion(cachedImage, nil); - } - return; - } - } - - - PFFileObject *file = _file; - [_file getDataInBackgroundWithBlock:^(NSData *data, NSError *error) { - if (error) { - if (completion) { - dispatch_async(dispatch_get_main_queue(), ^{ - completion(nil, error); - }); - } - return; - } - - // We dispatch to a background queue to offload the work to decode data into image - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ - UIImage *image = [UIImage imageWithData:data]; - if (!image) { - if (completion) { - NSError *invalidDataError = [NSError errorWithDomain:PFParseErrorDomain - code:kPFErrorInvalidImageData - userInfo:nil]; - dispatch_async(dispatch_get_main_queue(), ^{ - completion(nil, invalidDataError); - }); - } - return; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - // check if a latter issued loadInBackground has not replaced the file being loaded - if (file == self->_file) { - self.image = image; - } - - if (completion) { - completion(image, nil); - } - }); - - if (url) { - // We always want to store the image in the cache. - // In previous checks we've verified neither key nor value is nil. - [[PFImageCache sharedCache] setImage:image forURL:url]; - } - }); - } progressBlock:progressBlock]; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFLogInView.h b/ParseUI/ParseUI/Source/PFLogInView.h deleted file mode 100644 index 97b1b1e82..000000000 --- a/ParseUI/ParseUI/Source/PFLogInView.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * 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 - -#import "ParseUIConstants.h" - -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. */ - PFLogInFieldsNone = 0, - /** Username and password fields. */ - PFLogInFieldsUsernameAndPassword = 1 << 0, - /** Forgot password button. */ - PFLogInFieldsPasswordForgotten = 1 << 1, - /** Login button. */ - PFLogInFieldsLogInButton = 1 << 2, - /** Signup Button. */ - PFLogInFieldsSignUpButton = 1 << 5, - /** Dismiss Button. */ - PFLogInFieldsDismissButton = 1 << 6, - /** Apple button*/ - PFLogInFieldsApple = 1 << 7, - /** Default value. Combines Username, Password, Login, Signup, Forgot Password and Dismiss buttons. */ - PFLogInFieldsDefault = (PFLogInFieldsUsernameAndPassword | - PFLogInFieldsLogInButton | - PFLogInFieldsSignUpButton | - PFLogInFieldsPasswordForgotten | - 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 PFLogInViewAppleButtonAccessibilityIdentifier; -extern NSString *const PFLogInViewDismissButtonAccessibilityIdentifier; - -@class PFTextField; - -/** - The `PFLogInView` class provides a standard log in interface for authenticating a `PFUser`. - */ -@interface PFLogInView : UIScrollView - -///-------------------------------------- -/// @name Creating Log In View -///-------------------------------------- - -/** - Initializes the view with the specified log in elements. - - @param fields A bitmask specifying the log in elements which are enabled in the view - - @return An initialized `PFLogInView` object or `nil` if the object couldn't be created. - - @see PFLogInFields - */ -- (instancetype)initWithFields:(PFLogInFields)fields; - -/** - The view controller that will present this view. - - Used to lay out elements correctly when the presenting view controller has translucent elements. - */ -@property (nullable, nonatomic, weak) UIViewController *presentingViewController; - -///-------------------------------------- -/// @name Customizing the Logo -///-------------------------------------- - -/// The logo. By default, it is the Parse logo. -@property (nullable, nonatomic, strong) UIView *logo; - -///-------------------------------------- -/// @name Configure Username Behaviour -///-------------------------------------- - -/** - If email should be used to log in, instead of username - - By default, this is set to `NO`. - */ -@property (nonatomic, assign) BOOL emailAsUsername; - -///-------------------------------------- -/// @name Log In Elements -///-------------------------------------- - -/** - The bitmask which specifies the enabled log in elements in the view. - */ -@property (nonatomic, assign, readonly) PFLogInFields fields; - -/** - The username text field. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *usernameField; - -/** - The password text field. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *passwordField; - -/** - The password forgotten button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *passwordForgottenButton; - -/** - The log in button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *logInButton; - -/** - The Apple button. It is 'nil if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *appleButton; - -/** - The sign up button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *signUpButton; - -/** - It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFLogInView.m b/ParseUI/ParseUI/Source/PFLogInView.m deleted file mode 100644 index de3a9da81..000000000 --- a/ParseUI/ParseUI/Source/PFLogInView.m +++ /dev/null @@ -1,455 +0,0 @@ -/* - * 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 "PFLogInView.h" - -#import "PFActionButton.h" -#import "PFColor.h" -#import "PFDismissButton.h" -#import "PFImage.h" -#import "PFLocalization.h" -#import "PFPrimaryButton.h" -#import "PFRect.h" -#import "PFTextButton.h" -#import "PFTextField.h" - -static NSString *const PFLogInViewDefaultLogoImageName = @"parse_logo.png"; -static NSString *const PFLogInViewDefaultAppleButtonImageName = @"apple_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 PFLogInViewAppleButtonAccessibilityIdentifier = @"PFLogInViewAppleButtonAccessibilityIdentifier"; -NSString *const PFLogInViewDismissButtonAccessibilityIdentifier = @"PFLogInViewDismissButtonAccessibilityIdentifier"; - -@implementation PFLogInView - -///-------------------------------------- -#pragma mark - Class -///-------------------------------------- - -+ (PFActionButtonConfiguration *)_defaultSignUpButtonConfiguration { - PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor signupButtonBackgroundColor] - image:nil]; - NSString *title = PFLocalizedString(@"Sign Up", @"Sign Up"); - [configuration setTitle:title forButtonStyle:PFActionButtonStyleNormal]; - [configuration setTitle:title forButtonStyle:PFActionButtonStyleWide]; - - return configuration; -} - -+ (PFActionButtonConfiguration *)_defaultAppleButtonConfiguration { - PFActionButtonConfiguration *configuration = [[PFActionButtonConfiguration alloc] initWithBackgroundImageColor:[PFColor appleButtonBackgroundColor] - image:[PFImage imageNamed:PFLogInViewDefaultAppleButtonImageName]]; - - [configuration setTitle:PFLocalizedString(@"Apple", @"Apple") - forButtonStyle:PFActionButtonStyleNormal]; - [configuration setTitle:PFLocalizedString(@"Sign in with Apple", @"Sign in with Apple") - - forButtonStyle:PFActionButtonStyleWide]; - - return configuration; -} - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)initWithFields:(PFLogInFields)otherFields { - self = [super initWithFrame:CGRectZero]; - if (!self) return nil; - - [PFLogInView _validateFields:otherFields]; - - self.opaque = YES; - self.backgroundColor = [PFColor commonBackgroundColor]; - - _fields = otherFields; - - _logo = [[UIImageView alloc] initWithImage:[PFImage imageNamed:PFLogInViewDefaultLogoImageName]]; - _logo.contentMode = UIViewContentModeScaleAspectFit; - [self addSubview:_logo]; - - [self _updateAllFields]; - - return self; -} - -///-------------------------------------- -#pragma mark - Fields -///-------------------------------------- - -- (void)_updateAllFields { - if (_fields & PFLogInFieldsDismissButton) { - if (!_dismissButton) { - _dismissButton = [[PFDismissButton alloc] initWithFrame:CGRectZero]; - _dismissButton.accessibilityIdentifier = PFLogInViewDismissButtonAccessibilityIdentifier; - [self addSubview:_dismissButton]; - } - } else { - [_dismissButton removeFromSuperview]; - _dismissButton = nil; - } - - if (_fields & PFLogInFieldsUsernameAndPassword) { - if (!_usernameField) { - _usernameField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:(PFTextFieldSeparatorStyleTop | - PFTextFieldSeparatorStyleBottom)]; - _usernameField.accessibilityIdentifier = PFLogInViewUsernameFieldAccessibilityIdentifier; - _usernameField.autocorrectionType = UITextAutocorrectionTypeNo; - _usernameField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _usernameField.returnKeyType = UIReturnKeyNext; - [self addSubview:_usernameField]; - [self _updateUsernameFieldStyle]; - } - - if (!_passwordField) { - _passwordField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:PFTextFieldSeparatorStyleBottom]; - _passwordField.accessibilityIdentifier = PFLogInViewPasswordFieldAccessibilityIdentifier; - _passwordField.placeholder = PFLocalizedString(@"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) { - if (!_signUpButton) { - _signUpButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultSignUpButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - _signUpButton.accessibilityIdentifier = PFLogInViewSignUpButtonAccessibilityIdentifier; - [self addSubview:_signUpButton]; - } - } else { - [_signUpButton removeFromSuperview]; - _signUpButton = nil; - } - - 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]; - } - } else { - [_passwordForgottenButton removeFromSuperview]; - _passwordForgottenButton = nil; - } - - 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]; - } - } else { - [_logInButton removeFromSuperview]; - _logInButton = nil; - } - - if (_fields & PFLogInFieldsApple) { - if (!_appleButton) { - _appleButton = [[PFActionButton alloc] initWithConfiguration:[[self class] _defaultAppleButtonConfiguration] - buttonStyle:PFActionButtonStyleNormal]; - _appleButton.accessibilityIdentifier = PFLogInViewAppleButtonAccessibilityIdentifier; - [self addSubview:_appleButton]; - } - } else { - [_appleButton removeFromSuperview]; - _appleButton = nil; - } -} - -///-------------------------------------- -#pragma mark - UIView -///-------------------------------------- - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = PFRectMakeWithOriginSize(CGPointZero, self.bounds.size); - - if (_dismissButton) { - CGPoint origin = CGPointMake(16.0f, 16.0f); - UIViewController *presentingViewController = self.presentingViewController; - // In iOS 7+, if this view is presented fullscreen, it's top edge will be behind the status bar. - // This lets us move down the dismiss button a bit so that it's not covered by the status bar. - if ([presentingViewController respondsToSelector:@selector(topLayoutGuide)]) { - origin.y += presentingViewController.topLayoutGuide.length; - } - - CGRect frame = PFRectMakeWithOriginSize(origin, [_dismissButton sizeThatFits:bounds.size]); - _dismissButton.frame = frame; - } - - CGRect contentRect = PFRectMakeWithSizeCenteredInRect(PFSizeMin(bounds.size, [self _maxContentSize]), - bounds); - const CGSize contentSizeScale = [self _contentSizeScaleForContentSize:contentRect.size]; - - CGFloat socialButtonsDefaultInset = 16.0f; - UIEdgeInsets socialButtonsRectInsets = UIEdgeInsetsZero; - if (CGRectGetMinX(contentRect) <= CGRectGetMinX(bounds)) { - socialButtonsRectInsets = UIEdgeInsetsMake(0.0f, - socialButtonsDefaultInset, - 0.0f, - socialButtonsDefaultInset); - } - CGRect socialButtonsRect = UIEdgeInsetsInsetRect(contentRect, socialButtonsRectInsets); - - if (_signUpButton) { - CGSize buttonSize = [_signUpButton sizeThatFits:socialButtonsRect.size]; - [(PFActionButton *)_signUpButton setButtonStyle:PFActionButtonStyleWide]; - - CGRect frame = PFRectMakeWithSizeCenteredInRect(buttonSize, socialButtonsRect); - frame.origin.y = CGRectGetMaxY(socialButtonsRect) - CGRectGetHeight(frame) - socialButtonsRectInsets.left; - _signUpButton.frame = frame; - - contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); - socialButtonsRect = UIEdgeInsetsInsetRect(contentRect, socialButtonsRectInsets); - } - - if (_appleButton) { - CGSize buttonSize = [_appleButton sizeThatFits:socialButtonsRect.size]; - CGRect frame = PFRectMakeWithOriginSize(socialButtonsRect.origin, buttonSize); - frame.origin.y = CGRectGetMaxY(socialButtonsRect) - buttonSize.height * 2 - socialButtonsDefaultInset * 2; - _appleButton.frame = frame; - - [(PFActionButton *)_appleButton setButtonStyle:PFActionButtonStyleWide]; - contentRect.size.height = CGRectGetMinY(frame) - CGRectGetMinY(contentRect); - } - - if (_signUpButton || _appleButton) { - contentRect.size.height -= socialButtonsDefaultInset; - } - - const CGRect loginContentRect = PFRectMakeWithSizeCenteredInRect([self _loginContentSizeThatFits:contentRect.size - withContentSizeScale:contentSizeScale], - contentRect); - const CGSize loginContentSize = loginContentRect.size; - CGFloat currentY = CGRectGetMinY(loginContentRect); - - if (_logo) { - CGFloat logoTopInset = (CGRectGetMinX(contentRect) > 0.0f ? 36.0f : 88.0f) * contentSizeScale.height; - CGFloat logoBottomInset = floor(36.0f * contentSizeScale.height); - - CGFloat logoAvailableHeight = floor(68.0f * contentSizeScale.height); - - CGSize logoSize = [_logo sizeThatFits:CGSizeMake(loginContentSize.width, logoAvailableHeight)]; - logoSize.width = MIN(loginContentSize.width, logoSize.width); - logoSize.height = MIN(logoAvailableHeight, logoSize.height); - - CGRect frame = PFRectMakeWithSizeCenteredInRect(logoSize, loginContentRect); - frame.origin.y = CGRectGetMinY(loginContentRect) + logoTopInset; - _logo.frame = CGRectIntegral(frame); - - currentY = floor(CGRectGetMaxY(frame) + logoBottomInset); - } - - if (_usernameField) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_usernameField sizeThatFits:loginContentSize], - loginContentRect); - frame.origin.y = currentY; - _usernameField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_passwordField) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_passwordField sizeThatFits:loginContentSize], - loginContentRect); - frame.origin.y = currentY; - _passwordField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_logInButton) { - CGFloat loginButtonTopInset = floor(24.0f * contentSizeScale.height); - - CGRect frame = PFRectMakeWithSizeCenteredInRect([_logInButton sizeThatFits:loginContentSize], loginContentRect); - frame.origin.y = currentY + loginButtonTopInset; - _logInButton.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_passwordForgottenButton) { - CGFloat forgotPasswordInset = floor(12.0f * contentSizeScale.height); - - CGSize buttonSize = [_passwordForgottenButton sizeThatFits:loginContentSize]; - CGRect frame = PFRectMakeWithSizeCenteredInRect(buttonSize, loginContentRect); - frame.origin.y = currentY + forgotPasswordInset; - _passwordForgottenButton.frame = frame; - } -} - -- (CGSize)_loginContentSizeThatFits:(CGSize)boundingSize withContentSizeScale:(CGSize)contentSizeScale { - CGSize size = boundingSize; - size.height = 0.0f; - if (_logo) { - CGFloat logoTopInset = floor(36.0f * contentSizeScale.height); - CGFloat logoBottomInset = floor(36.0f * contentSizeScale.height); - - CGFloat logoAvailableHeight = floor(68.0f * contentSizeScale.height); - - CGFloat scale = MAX(contentSizeScale.width, contentSizeScale.height); - - CGSize logoSize = [_logo sizeThatFits:CGSizeMake(boundingSize.width, logoAvailableHeight)]; - logoSize.height *= scale; - logoSize.width *= scale; - - size.height += logoSize.height + logoTopInset + logoBottomInset; - } - if (_usernameField) { - CGSize fieldSize = [_usernameField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_passwordField) { - CGSize fieldSize = [_passwordField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_logInButton) { - CGFloat loginButtonTopInset = 24.0f * contentSizeScale.height; - - CGSize buttonSize = [_logInButton sizeThatFits:boundingSize]; - - size.height += buttonSize.height + loginButtonTopInset; - } - if (_passwordForgottenButton) { - CGFloat forgotPasswordInset = 12.0f * contentSizeScale.height; - - UIView *button = _signUpButton ?: _passwordForgottenButton; - CGSize buttonSize = [button sizeThatFits:boundingSize]; - - size.height += buttonSize.height + forgotPasswordInset * 2.0f; - } - size.width = floor(size.width); - size.height = floor(size.height); - - return size; -} - -- (CGSize)_maxContentSize { - return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? CGSizeMake(420.0f, 550.0f) : CGSizeMake(500.0f, 800.0f)); -} - -- (CGSize)_contentSizeScaleForContentSize:(CGSize)contentSize { - CGSize maxContentSize = [self _maxContentSize]; - if (maxContentSize.width < contentSize.width && - maxContentSize.height < contentSize.height) { - return CGSizeMake(1.0f, 1.0f); - } - - CGSize contentSizeScale = CGSizeMake(contentSize.width / maxContentSize.width, - contentSize.height / maxContentSize.height); - return contentSizeScale; -} - -///-------------------------------------- -#pragma mark - Accessors -///-------------------------------------- - -- (void)setFields:(PFLogInFields)fields { - if (_fields != fields) { - _fields = fields; - [self _updateAllFields]; - [self setNeedsLayout]; - } -} - -- (void)setLogo:(UIView *)logo { - if (self.logo != logo) { - [_logo removeFromSuperview]; - _logo = logo; - [self addSubview:_logo]; - - [self setNeedsLayout]; - } -} - -- (void)setEmailAsUsername:(BOOL)otherEmailAsUsername { - if (_emailAsUsername != otherEmailAsUsername) { - _emailAsUsername = otherEmailAsUsername; - - [self _updateUsernameFieldStyle]; - } -} - -///-------------------------------------- -#pragma mark - Private -///-------------------------------------- - -+ (void)_validateFields:(PFLogInFields)fields { - if (fields == PFLogInFieldsNone) { - [NSException raise:NSInvalidArgumentException - format:@"Fields must be set before initializing PFLogInView."]; - } - - if (fields & PFLogInFieldsLogInButton) { - if (!(fields & PFLogInFieldsUsernameAndPassword)) { - [NSException raise:NSInvalidArgumentException - format:@"Username and password must be enabled if done button is enabled."]; - } - } - - if (fields & PFLogInFieldsPasswordForgotten) { - if (!(fields & PFLogInFieldsUsernameAndPassword)) { - [NSException raise:NSInvalidArgumentException - format:@"Username and password must be enabled if password forgotten button is enabled."]; - } - } -} - -- (void)_updateUsernameFieldStyle { - UIKeyboardType keyboardType = UIKeyboardTypeDefault; - NSString *usernamePlaceholder = nil; - if (!_emailAsUsername) { - keyboardType = UIKeyboardTypeDefault; - usernamePlaceholder = PFLocalizedString(@"Username", @"Username"); - } else { - keyboardType = UIKeyboardTypeEmailAddress; - usernamePlaceholder = PFLocalizedString(@"Email", @"Email"); - } - - _usernameField.placeholder = usernamePlaceholder; - _usernameField.keyboardType = keyboardType; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFLogInViewController.h b/ParseUI/ParseUI/Source/PFLogInViewController.h deleted file mode 100644 index d38ce165d..000000000 --- a/ParseUI/ParseUI/Source/PFLogInViewController.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * 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 -#import "ParseUIConstants.h" -#import "PFLogInView.h" - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -@import AuthenticationServices; - -@class PFSignUpViewController; -@class PFUser; -@protocol PFLogInViewControllerDelegate; - -/** - The `PFLogInViewController` class presents and manages a standard authentication interface for logging in a `PFUser`. - */ -@interface PFLogInViewController : UIViewController - -///-------------------------------------- -/// @name Configuring Log In Elements -///-------------------------------------- - -/** - A bitmask specifying the log in elements which are enabled in the view. - - @see PFLogInFields - */ -@property (nonatomic, assign) PFLogInFields fields; - - -/** - The log in view. It contains all the enabled log in elements. - - @see PFLogInView - */ -@property (nullable, nonatomic, strong, readonly) PFLogInView *logInView; - -///-------------------------------------- -/// @name Configuring Log In Behaviors -///-------------------------------------- - -/** - The delegate that responds to the control events of `PFLogInViewController`. - - @see PFLogInViewControllerDelegate - */ -@property (nullable, nonatomic, weak) id delegate; - -/** - The sign up controller if sign up is enabled. - - 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; - -/** - 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 `signUpController`. - By default, this is set to `NO`. - */ -@property (nonatomic, assign) BOOL emailAsUsername; - -@end - -///-------------------------------------- -/// @name Notifications -///-------------------------------------- - -/** - The notification is posted immediately after the log in succeeds. - */ -extern NSString *const PFLogInSuccessNotification; - -/** - The notification is posted immediately after the log in fails. - If the delegate prevents the log in from starting, the notification is not sent. - */ -extern NSString *const PFLogInFailureNotification; - -/** - The notification is posted immediately after the log in is cancelled. - */ -extern NSString *const PFLogInCancelNotification; - -///-------------------------------------- -/// @name PFLogInViewControllerDelegate -///-------------------------------------- - -/** - The `PFLogInViewControllerDelegate` protocol defines methods a delegate of a `PFLogInViewController` should implement. - All methods of this protocol are optional. - */ -@protocol PFLogInViewControllerDelegate - -@optional - -///-------------------------------------- -/// @name Customizing Behavior -///-------------------------------------- - -/** - 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. - @param password the password the user tries to log in with. - - @return A `BOOL` indicating whether the log in should proceed. - */ -- (BOOL)logInViewController:(PFLogInViewController *)logInController -shouldBeginLogInWithUsername:(NSString *)username - password:(NSString *)password; - -///-------------------------------------- -/// @name Responding to Actions -///-------------------------------------- - -/** - Sent to the delegate when a `PFUser` is logged in. - - @param logInController The login view controller where login finished. - @param user `PFUser` object that is a result of the login. - */ -- (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user; - -/** - Sent to the delegate when the log in attempt fails. - - 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. - @param error `NSError` object representing the error that occured. - */ -- (void)logInViewController:(PFLogInViewController *)logInController didFailToLogInWithError:(nullable NSError *)error; - -/** - Sent to the delegate when the log in screen is cancelled. - - @param logInController The login view controller where login was cancelled. - */ -- (void)logInViewControllerDidCancelLogIn:(PFLogInViewController *)logInController; - -/** - Sent to the delegate when user data is received following successful login using Sign In With Apple. - - @param logInController The login view controller that received the credentials - @param credential The ASAuthorizationAppleIDCredential object received - */ - --(void)logInViewController:(PFLogInViewController *)logInController didReceiveAppleCredential:(ASAuthorizationAppleIDCredential *)credential forUser:(PFUser *)user API_AVAILABLE(ios(13.0)); - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFLogInViewController.m b/ParseUI/ParseUI/Source/PFLogInViewController.m deleted file mode 100644 index cb3cac51f..000000000 --- a/ParseUI/ParseUI/Source/PFLogInViewController.m +++ /dev/null @@ -1,521 +0,0 @@ -/* - * 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 "PFLogInViewController.h" -#import "PFActionButton.h" -#import "PFUIAlertView.h" -#import "PFLocalization.h" -#import "PFPrimaryButton.h" -#import "PFSignUpViewController.h" -#import "PFTextField.h" -#import "PFLogInView_Private.h" -#import "PFAppleUtils.h" - -@import ParseCore; - -NSString *const PFLogInSuccessNotification = @"com.parse.ui.login.success"; -NSString *const PFLogInFailureNotification = @"com.parse.ui.login.failure"; -NSString *const PFLogInCancelNotification = @"com.parse.ui.login.cancel"; - -@protocol WeaklyReferencedAppleUtils - -+ (BFTask *)logInInBackground; - -@end - -@interface PFLogInViewController () { - struct { - BOOL shouldBeginLogIn : YES; - BOOL didLogInUser : YES; - BOOL didFailToLogIn : YES; - BOOL didCancelLogIn : YES; - } _delegateExistingMethods; -} - -@property (nonatomic, strong, readwrite) PFLogInView *logInView; -@property (nonatomic, assign) BOOL loading; - -@property (nonatomic, assign) CGFloat visibleKeyboardHeight; - -@end - -@implementation PFLogInViewController - -///-------------------------------------- -#pragma mark - Init -///-------------------------------------- - -- (instancetype)init { - self = [super init]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (void)_commonInit { - self.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - self.modalPresentationStyle = UIModalPresentationFormSheet; - _fields = PFLogInFieldsDefault; - - if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) { - self.automaticallyAdjustsScrollViewInsets = NO; - } -} - -///-------------------------------------- -#pragma mark - Dealloc -///-------------------------------------- - -- (void)dealloc { - // Unregister from all notifications - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -///-------------------------------------- -#pragma mark - UIViewController -///-------------------------------------- - -- (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 _setupLogInViewActions]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - [self _registerForKeyboardNotifications]; - - if (self.navigationController && - self.fields & PFLogInFieldsDismissButton) { - self.fields = self.fields & ~PFLogInFieldsDismissButton; - - [_logInView.dismissButton removeFromSuperview]; - } -} - -- (UIInterfaceOrientationMask)supportedInterfaceOrientations { - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - return UIInterfaceOrientationMaskAll; - } - - return UIInterfaceOrientationMaskPortrait; -} - -///-------------------------------------- -#pragma mark - PFLogInViewController -///-------------------------------------- - -- (PFLogInView *)logInView { - return (PFLogInView *)self.view; // self.view will call loadView if the view is nil -} - -- (void)setEmailAsUsername:(BOOL)otherEmailAsUsername { - self.logInView.emailAsUsername = otherEmailAsUsername; -} - -- (BOOL)emailAsUsername { - return self.logInView.emailAsUsername; -} - -- (void)setFields:(PFLogInFields)fields { - if (_fields != fields) { - _fields = fields; - - // Avoid force loading logInView - if (_logInView) { - _logInView.fields = fields; - [self _setupLogInViewActions]; - } - } -} - -- (void)setDelegate:(id)delegate { - if (self.delegate != delegate) { - _delegate = delegate; - - _delegateExistingMethods.shouldBeginLogIn = [delegate respondsToSelector:@selector(logInViewController: - shouldBeginLogInWithUsername: - password:)]; - _delegateExistingMethods.didLogInUser = [delegate respondsToSelector:@selector(logInViewController: - didLogInUser:)]; - _delegateExistingMethods.didFailToLogIn = [delegate respondsToSelector:@selector(logInViewController: - didFailToLogInWithError:)]; - _delegateExistingMethods.didCancelLogIn = [delegate - respondsToSelector:@selector(logInViewControllerDidCancelLogIn:)]; - } -} - -- (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) { - [_logInView.passwordField becomeFirstResponder]; - } - if (textField == _logInView.passwordField) { - [self _dismissKeyboard]; - [self _loginAction]; - } - - return YES; -} - -///-------------------------------------- -#pragma mark - Private -///-------------------------------------- - -- (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 removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.passwordForgottenButton addTarget:self action:@selector(_forgotPasswordAction) forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.appleButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.appleButton addTarget:self action:@selector(_loginWithApple) forControlEvents:UIControlEventTouchUpInside]; - - [_logInView.signUpButton removeTarget:nil action:nil forControlEvents:UIControlEventAllEvents]; - [_logInView.signUpButton addTarget:self action:@selector(_signupAction) forControlEvents:UIControlEventTouchUpInside]; -} - -- (void)_dismissAction { - [self cancelLogIn]; - - // Normally the role of dismissing a modal controller lies on the presenting controller. - // Here we violate the principle so that the presenting modal log in controller is especially easy. - // Cons of this design is that it makes working with non-modally presented log in controller hard; - // but this concern is mitigated by the fact that navigationally presented controller should not have - // dismiss button. - [self dismissViewControllerAnimated:YES completion:nil]; -} - -- (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"); - [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 { - [PFUser requestPasswordResetForEmailInBackground:email block:^(BOOL success, NSError *error) { - if (success) { - NSString *title = PFLocalizedString(@"Password Reset", - @"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 presentAlertInViewController:self withTitle:title message:message]; - } else { - NSString *title = PFLocalizedString(@"Password Reset Failed", - @"Password reset error alert title in PFLogInViewController."); - [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; - } - }]; -} - - -#pragma mark Sign in with Apple --(void)_loginWithApple API_AVAILABLE(ios(13.0)){ - - if (self.loading) { - return; - } - - self.loading = YES; - if ([_logInView.appleButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)_logInView.appleButton setLoading:YES]; - } - - __weak typeof(self) wself = self; - - [[PFAppleUtils logInInBackground] continueWithBlock:^id _Nullable(BFTask * _Nonnull t) { - __strong typeof(wself) sself = wself; - dispatch_async(dispatch_get_main_queue(), ^{ - sself.loading = NO; - if ([sself.logInView.appleButton isKindOfClass:[PFActionButton class]]) { - [(PFActionButton *)sself.logInView.appleButton setLoading:NO]; - } - if (t.error) { - [sself _loginDidFailWithError:t.error]; - } - else - { - PFUser *user = t.result[PFAppleAuthUserKey]; - ASAuthorizationAppleIDCredential *cred = t.result[PFAppleAuthCredentialKey]; - [sself _loginDidSucceedWithUser:user]; - [sself.delegate logInViewController:sself didReceiveAppleCredential:cred forUser:user]; - } - }); - return nil; - }]; -} - -#pragma mark Log In - -- (void)_loginAction { - if (self.loading) { - return; - } - - NSString *username = _logInView.usernameField.text ?: @""; - NSString *password = _logInView.passwordField.text ?: @""; - - if (_delegateExistingMethods.shouldBeginLogIn) { - if (![_delegate logInViewController:self shouldBeginLogInWithUsername:username password:password]) { - return; - } - } - - self.loading = YES; - if ([_logInView.logInButton isKindOfClass:[PFPrimaryButton class]]) { - [(PFActionButton *)_logInView.logInButton setLoading:YES]; - } - - [PFUser logInWithUsernameInBackground:username password:password block:^(PFUser *user, NSError *error) { - self.loading = NO; - if ([self->_logInView.logInButton isKindOfClass:[PFPrimaryButton class]]) { - [(PFPrimaryButton *)self->_logInView.logInButton setLoading:NO]; - } - - if (user) { - [self _loginDidSucceedWithUser:user]; - } else { - [self _loginDidFailWithError:error]; - } - }]; -} - -- (void)_signupAction { - if (self.loading) { - return; - } - [self presentViewController:self.signUpController animated:YES completion:nil]; -} - -- (void)_loginDidSucceedWithUser:(PFUser *)user { - if (_delegateExistingMethods.didLogInUser) { - [_delegate logInViewController:self didLogInUser:user]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFLogInSuccessNotification object:self]; -} - -- (void)_loginDidFailWithError:(NSError *)error { - if (_delegateExistingMethods.didFailToLogIn) { - [_delegate logInViewController:self didFailToLogInWithError:error]; - } else { - NSString *title = PFLocalizedString(@"Login Failed", @"Login failed alert title in PFLogInViewController"); - NSString *message = nil; - if (error.code == kPFErrorObjectNotFound) { - message = PFLocalizedString(@"The username and password you entered don't match", @"Invalid login credentials alert message in PFLogInViewController"); - } else { - message = PFLocalizedString(@"Please try again", @"Generic login failed alert message in PFLogInViewController"); - } - [PFUIAlertView presentAlertInViewController:self withTitle:title message:message]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFLogInFailureNotification object:self]; -} - -- (void)cancelLogIn { - if (_delegateExistingMethods.didCancelLogIn) { - [_delegate logInViewControllerDidCancelLogIn:self]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFLogInCancelNotification object:self]; -} - -///-------------------------------------- -#pragma mark - Keyboard -///-------------------------------------- - -- (UIView *)currentFirstResponder { - if ([_logInView.usernameField isFirstResponder]) { - return _logInView.usernameField; - } - if ([_logInView.passwordField isFirstResponder]) { - return _logInView.passwordField; - } - return nil; -} - -- (void)_dismissKeyboard { - [self.view endEditing:YES]; -} - -- (void)_registerForKeyboardNotifications { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillHide:) - name:UIKeyboardWillHideNotification - object:nil]; -} - -- (void)_keyboardWillShow:(NSNotification *)notification { - NSDictionary *userInfo = [notification userInfo]; - CGRect endFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; - CGFloat duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; - - CGRect keyboardFrame = [self.view convertRect:endFrame fromView:self.view.window]; - CGFloat visibleKeyboardHeight = CGRectGetMaxY(self.view.bounds) - CGRectGetMinY(keyboardFrame); - - [self setVisibleKeyboardHeight:visibleKeyboardHeight - animationDuration:duration - animationOptions:curve << 16]; -} - -- (void)_keyboardWillHide:(NSNotification *)notification { - NSDictionary *userInfo = [notification userInfo]; - CGFloat duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; - [self setVisibleKeyboardHeight:0.0 - animationDuration:duration - animationOptions:curve << 16]; -} - -- (void)setVisibleKeyboardHeight:(CGFloat)visibleKeyboardHeight - animationDuration:(NSTimeInterval)animationDuration - animationOptions:(UIViewAnimationOptions)animationOptions { - - dispatch_block_t animationsBlock = ^{ - self.visibleKeyboardHeight = visibleKeyboardHeight; - }; - - if (animationDuration == 0.0) { - animationsBlock(); - } else { - [UIView animateWithDuration:animationDuration - delay:0.0 - options:animationOptions | UIViewAnimationOptionBeginFromCurrentState - animations:animationsBlock - completion:nil]; - } -} - -- (void)setVisibleKeyboardHeight:(CGFloat)visibleKeyboardHeight { - if (self.visibleKeyboardHeight != visibleKeyboardHeight) { - _visibleKeyboardHeight = visibleKeyboardHeight; - [self _updateViewContentOffsetAnimated:NO]; - } -} - -- (void)_updateViewContentOffsetAnimated:(BOOL)animated { - CGPoint contentOffset = CGPointZero; - if (self.visibleKeyboardHeight > 0.0f) { - // Scroll the view to keep fields visible - CGFloat offsetForScrollingTextFieldToTop = CGRectGetMinY([self currentFirstResponder].frame); - - UIView *lowestView; - if (_logInView.passwordForgottenButton) { - lowestView = _logInView.passwordForgottenButton; - } else if (_logInView.logInButton) { - lowestView = _logInView.logInButton; - } else { - lowestView = _logInView.passwordField; - } - - CGFloat offsetForScrollingLowestViewToBottom = 0.0f; - offsetForScrollingLowestViewToBottom += self.visibleKeyboardHeight; - offsetForScrollingLowestViewToBottom += CGRectGetMaxY(lowestView.frame); - offsetForScrollingLowestViewToBottom -= CGRectGetHeight(_logInView.bounds); - - if (offsetForScrollingLowestViewToBottom < 0) { - return; // No scrolling required - } - - contentOffset = CGPointMake(0.0f, MIN(offsetForScrollingTextFieldToTop, offsetForScrollingLowestViewToBottom)); - } - - [_logInView setContentOffset:contentOffset animated:animated]; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFLogInView_Private.h b/ParseUI/ParseUI/Source/PFLogInView_Private.h deleted file mode 100644 index 1ecb959d6..000000000 --- a/ParseUI/ParseUI/Source/PFLogInView_Private.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 "PFLogInView.h" - -@interface PFLogInView (Private) - -@property (nonatomic, assign, readwrite) PFLogInFields fields; - -@end diff --git a/ParseUI/ParseUI/Source/PFProductTableViewController.h b/ParseUI/ParseUI/Source/PFProductTableViewController.h deleted file mode 100644 index 2e2e5a805..000000000 --- a/ParseUI/ParseUI/Source/PFProductTableViewController.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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 - -#import "ParseUIConstants.h" -#import "PFQueryTableViewController.h" - -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 - -/** - Initializes a product table view controller. - - @param style The UITableViewStyle for the table - - @return An initialized `PFProductTableViewController` object or `nil` if the object couldn't be created. - */ -- (instancetype)initWithStyle:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFProductTableViewController.m b/ParseUI/ParseUI/Source/PFProductTableViewController.m deleted file mode 100644 index 47271de22..000000000 --- a/ParseUI/ParseUI/Source/PFProductTableViewController.m +++ /dev/null @@ -1,248 +0,0 @@ -/* - * 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 "PFProductTableViewController.h" -#import "PFUIAlertView.h" -#import "PFLocalization.h" -#import "PFPurchaseTableViewCell.h" - -@import ParseCore; - -static NSString *const PFProductMetadataPriceKey = @"price"; -static NSString *const PFProductMetadataPriceLocaleKey = @"priceLocale"; - -@interface PFProductTableViewController () { - NSMutableDictionary *_productMetadataDictionary; - NSMutableDictionary *_productProgressDictionary; - - SKProductsRequest *_storeProductsRequest; -} - -@end - -@implementation PFProductTableViewController - -#pragma mark - -#pragma mark NSObject - -- (instancetype)initWithStyle:(UITableViewStyle)style { - self = [super initWithStyle:UITableViewStylePlain className:[PFProduct parseClassName]]; - if (self) { - self.pullToRefreshEnabled = NO; - self.paginationEnabled = NO; - - _productMetadataDictionary = [NSMutableDictionary dictionary]; - _productProgressDictionary = [NSMutableDictionary dictionary]; - } - return self; -} - -- (instancetype)initWithStyle:(UITableViewStyle)style className:(NSString *)className { - return [self initWithStyle:style]; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.tableView.rowHeight = 84.0f; -} - -- (void)objectsDidLoad:(NSError *)error { - [super objectsDidLoad:error]; - if (error) { - return; - } - - [self.objects enumerateObjectsUsingBlock:^(PFProduct *product, NSUInteger idx, BOOL *stop) { - // No download for this product - just continue - if (!product.downloadName) { - return; - } - - [PFPurchase addObserverForProduct:product.productIdentifier block:^(SKPaymentTransaction *transaction) { - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; - PFPurchaseTableViewCell *cell = (PFPurchaseTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; - - cell.state = PFPurchaseTableViewCellStateDownloading; - [PFPurchase downloadAssetForTransaction:transaction - completion:^(NSString *filePath, NSError *downloadError) { - if (!downloadError) { - cell.state = PFPurchaseTableViewCellStateDownloaded; - } else { - cell.state = PFPurchaseTableViewCellStateNormal; - - NSString *title = PFLocalizedString(@"Download Error", - @"Download Error"); - [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; - } - } - progress:^(int percentDone) { - self->_productProgressDictionary[product.productIdentifier] = @(percentDone); - [cell.progressView setProgress:percentDone/100.0f animated:YES]; - }]; - }]; - }]; -} - -#pragma mark - -#pragma mark UITableViewDataSource - -- (PFTableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFProduct *product = (PFProduct *)object; - static NSString *cellIdentifier = @"PFPurchaseTableViewCell"; - - PFPurchaseTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (!cell) { - cell = [[PFPurchaseTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle - reuseIdentifier:cellIdentifier]; - } - - if (indexPath.row % 2 == 0) { - cell.backgroundView.backgroundColor = [UIColor colorWithWhite:242.0f/255.0f alpha:1.0f]; - cell.textLabel.shadowOffset = CGSizeZero; - cell.textLabel.shadowColor = [UIColor whiteColor]; - cell.priceLabel.shadowOffset = CGSizeZero; - cell.priceLabel.shadowColor = [UIColor whiteColor]; - - } else { - cell.backgroundView.backgroundColor = [UIColor colorWithWhite:232.0f/255.0f alpha:1.0f]; - cell.textLabel.shadowOffset = CGSizeMake(0.0f, 1.0f); - cell.textLabel.shadowColor = [UIColor whiteColor]; - cell.priceLabel.shadowOffset = CGSizeMake(0.0f, 1.0f); - cell.priceLabel.shadowColor = [UIColor whiteColor]; - } - - cell.imageView.file = product.icon; - cell.textLabel.text = product.title; - cell.detailTextLabel.text = product.subtitle; - - NSString *price = [self _priceForProduct:product]; - if (price) { - cell.priceLabel.text = [NSString stringWithFormat:@" $%@ ", price]; - } - - if (product.downloadName) { - NSString *contentPath = [PFPurchase assetContentPathForProduct:product]; - if (contentPath) { - cell.state = PFPurchaseTableViewCellStateDownloaded; - } - } else { - int progress = [self _downloadProgressForProduct:product]; - if (progress == 0) { - cell.state = PFPurchaseTableViewCellStateNormal; - } else if (progress == 100) { - cell.state = PFPurchaseTableViewCellStateDownloaded; - } else { - cell.state = PFPurchaseTableViewCellStateDownloading; - } - } - - return cell; -} - -#pragma mark - -#pragma mark UITableViewDelegate - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if (indexPath.row < self.objects.count) { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - - PFProduct *product = self.objects[indexPath.row]; - [PFPurchase buyProduct:product.productIdentifier block:^(NSError *error) { - if (error) { - NSString *title = PFLocalizedString(@"Purchase Error", @"Purchase Error"); - [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; - } - }]; - } -} - -#pragma mark - -#pragma mark Data - -- (NSString *)_priceForProduct:(PFProduct *)product { - return _productMetadataDictionary[product.productIdentifier][PFProductMetadataPriceKey]; -} - -- (int)_downloadProgressForProduct:(PFProduct *)product { - return [_productProgressDictionary[product.productIdentifier] intValue]; -} - -#pragma mark - -#pragma mark PFQueryTableViewController - -- (PFQuery *)queryForTable { - PFQuery *query = [super queryForTable]; - [query orderByAscending:@"order"]; - return query; -} - -#pragma mark - -#pragma mark Querying Store - -- (void)_queryStoreForProductsWithIdentifiers:(NSSet *)identifiers { - _storeProductsRequest.delegate = nil; - _storeProductsRequest = nil; - - _storeProductsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:identifiers]; - _storeProductsRequest.delegate = self; - [_storeProductsRequest start]; -} - -#pragma mark - -#pragma mark SKProductsRequestDelegate - -- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { - if (request != _storeProductsRequest) { - return; - } - - NSArray *validProducts = response.products; - if ([validProducts count] == 0) { - return; - } - - [validProducts enumerateObjectsUsingBlock:^(SKProduct *product, NSUInteger idx, BOOL *stop) { - NSDictionary *metadata = @{ PFProductMetadataPriceKey : product.price, - PFProductMetadataPriceLocaleKey : product.priceLocale }; - self->_productMetadataDictionary[product.productIdentifier] = metadata; - }]; - [self.tableView reloadData]; - - _storeProductsRequest.delegate = nil; -} - -- (void)requestDidFinish:(SKRequest *)request { - _storeProductsRequest.delegate = nil; - _storeProductsRequest = nil; -} - -- (void)request:(SKRequest *)request didFailWithError:(NSError *)error { - _storeProductsRequest.delegate = nil; - _storeProductsRequest = nil; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.h b/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.h deleted file mode 100644 index e7ddcc3cd..000000000 --- a/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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 - -#import "ParseUIConstants.h" -#import "PFTableViewCell.h" - -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. */ - PFPurchaseTableViewCellStateNormal = 0, - /** Downloading state of the cell. */ - PFPurchaseTableViewCellStateDownloading, - /** State of the cell, when the product was downloaded. */ - PFPurchaseTableViewCellStateDownloaded -}; - -/** - `PFPurchaseTableViewCell` is a subclass `PFTableViewCell` that is used to show - products in a `PFProductTableViewController`. - - @see `PFProductTableViewController` - */ -@interface PFPurchaseTableViewCell : PFTableViewCell - -/** - State of the cell. - @see `PFPurchaseTableViewCellState` - */ -@property (nonatomic, assign) PFPurchaseTableViewCellState state; - -/** - Label where price of the product is displayed. - */ -@property (nullable, nonatomic, strong, readonly) UILabel *priceLabel; - -/** - Progress view that is shown, when the product is downloading. - */ -@property (nullable, nonatomic, strong, readonly) UIProgressView *progressView; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.m b/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.m deleted file mode 100644 index 409a418a6..000000000 --- a/ParseUI/ParseUI/Source/PFPurchaseTableViewCell.m +++ /dev/null @@ -1,155 +0,0 @@ -/* - * 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 "PFPurchaseTableViewCell.h" - -#import "PFLocalization.h" -#import "PFRect.h" - -@interface PFPurchaseTableViewCell () - -@property (nonatomic, strong) UILabel *priceLabel; -@property (nonatomic, strong) UIProgressView *progressView; - -@end - -@implementation PFPurchaseTableViewCell - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - self.backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; - - self.imageView.layer.shadowColor = [UIColor blackColor].CGColor; - self.imageView.layer.shadowOffset = CGSizeMake(0.0f, 1.0f); - self.imageView.layer.shadowRadius = 1.0f; - self.imageView.layer.shadowOpacity = 1.0f; - - self.textLabel.backgroundColor = [UIColor clearColor]; - self.detailTextLabel.backgroundColor = [UIColor clearColor]; - self.detailTextLabel.numberOfLines = 2; - self.detailTextLabel.font = [UIFont systemFontOfSize:12.0f]; - - self.priceLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - self.priceLabel.backgroundColor = [UIColor colorWithWhite:242.0f/255.0f alpha:1.0f]; - self.priceLabel.textColor = [UIColor grayColor]; - self.priceLabel.shadowColor = [UIColor whiteColor]; - self.priceLabel.shadowOffset = CGSizeMake(0.0f, -1.0f); - self.priceLabel.font = [UIFont boldSystemFontOfSize:12.0f]; - self.priceLabel.layer.borderColor = [UIColor grayColor].CGColor; - self.priceLabel.layer.borderWidth = 1.0f; - self.priceLabel.layer.cornerRadius = 3.0f; - self.priceLabel.lineBreakMode = NSLineBreakByWordWrapping; - self.priceLabel.numberOfLines = 0; - [self.contentView addSubview:self.priceLabel]; - - self.progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; - self.state = PFPurchaseTableViewCellStateNormal; - } - return self; -} -#pragma mark - -#pragma mark UIView - -- (void)layoutSubviews { - [super layoutSubviews]; - - const CGRect bounds = self.contentView.bounds; - - CGFloat iconWidth = floor(0.8f * CGRectGetHeight(bounds)); - CGFloat iconMarginY = floor((CGRectGetHeight(bounds) - iconWidth)/2.0f); - CGFloat iconMarginX = iconMarginY; - CGFloat x = iconMarginX; - CGFloat y = iconMarginY; - self.imageView.frame = CGRectMake(x, y, iconWidth, iconWidth); - x += self.imageView.frame.size.width + iconMarginX; - - self.priceLabel.frame = CGRectZero; // this is necessary for sizeToFit to work correctly - [self.priceLabel sizeToFit]; - CGFloat priceLabelRightInset = 10.0f; - CGFloat priceLabelX = CGRectGetWidth(bounds) - CGRectGetWidth(self.priceLabel.frame) - priceLabelRightInset; - CGFloat priceLabelY = floor((CGRectGetHeight(self.textLabel.frame) - CGRectGetHeight(self.priceLabel.frame))/2.0f) + iconMarginY; - - self.priceLabel.frame = PFRectMakeWithOriginSize(CGPointMake(priceLabelX, priceLabelY), self.priceLabel.frame.size); - - CGFloat titleWidth = self.contentView.frame.size.width - self.imageView.frame.size.width - iconMarginX - 100.0f; - CGFloat titleHeight = self.textLabel.frame.size.height; - self.textLabel.frame = CGRectMake(x, y, titleWidth, titleHeight); - - CGFloat textMarginBottom = 5.0f; - y += self.textLabel.frame.size.height + textMarginBottom; - - CGFloat detailTextLabelWidth = CGRectGetWidth(bounds) - x - 50.0f; - self.detailTextLabel.frame = CGRectMake(x, y, detailTextLabelWidth, CGRectGetWidth(self.detailTextLabel.frame)); - self.progressView.frame = CGRectMake(x, CGRectGetHeight(bounds) - CGRectGetHeight(self.progressView.frame) - iconMarginY - 2.0f, - detailTextLabelWidth, CGRectGetHeight(self.progressView.frame)); -} - -#pragma mark - -#pragma mark PFPurchaseTableViewCell - -- (void)setState:(PFPurchaseTableViewCellState)state { - if (self.state == state) { - return; - } - - _state = state; - - switch (state) { - case PFPurchaseTableViewCellStateNormal: - { - self.detailTextLabel.numberOfLines = 2; - } - break; - case PFPurchaseTableViewCellStateDownloading: - { - 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 = PFLocalizedString(@"DOWNLOADING", @"DOWNLOADING"); - self.priceLabel.text = [NSString stringWithFormat:@" %@ ", downloadingText]; - self.priceLabel.textColor = [UIColor whiteColor]; - self.priceLabel.shadowColor = [UIColor blackColor]; - self.priceLabel.shadowOffset = CGSizeMake(0.0f, -1.0f); - [self.contentView addSubview:self.progressView]; - } - break; - case PFPurchaseTableViewCellStateDownloaded: - { - self.detailTextLabel.numberOfLines = 2; - NSString *installedText = PFLocalizedString(@"INSTALLED", @"INSTALLED"); - self.priceLabel.text = [NSString stringWithFormat:@" %@ ", installedText]; - self.priceLabel.textColor = [UIColor whiteColor]; - self.priceLabel.shadowColor = [UIColor blackColor]; - self.priceLabel.shadowOffset = CGSizeMake(0.0f, -1.0f); - self.priceLabel.backgroundColor = [UIColor colorWithRed:160.0f/255.0f green:200.0f/255.0f blue:120.0f/255.0f alpha:1.0f]; - [self.progressView removeFromSuperview]; - } - break; - default: - break; - } - [self setNeedsLayout]; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.h b/ParseUI/ParseUI/Source/PFQueryCollectionViewController.h deleted file mode 100644 index 48a97550a..000000000 --- a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - * 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 -#import "ParseUIConstants.h" - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -@class BFTask<__covariant BFGenericType>; -@class PFCollectionViewCell; -@class PFObject; -@class PFQuery; - -/** - 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: - - - Pagination with a cell that can be tapped to load the next page. - - Pull-to-refresh collection view header. - - Automatic downloading and displaying of remote images in cells. - - Loading screen, shown before any data is loaded. - - 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` - */ -@interface PFQueryCollectionViewController : UICollectionViewController - -/** - The class name of the `PFObject` this collection will use as a datasource. - */ -@property (nullable, nonatomic, copy) IBInspectable NSString *parseClassName; - -/** - Whether the collection should use the default loading view. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL loadingViewEnabled; - -/** - Whether the collection should use the built-in pull-to-refresh feature. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL pullToRefreshEnabled NS_AVAILABLE_IOS(10.0); - -/** - Whether the collection should use the built-in pagination feature. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL paginationEnabled; - -/** - The number of objects to show per page. Default - `25`. - */ -@property (nonatomic, assign) IBInspectable NSUInteger objectsPerPage; - -/** - Whether the collection is actively loading new data from the server. - */ -@property (nonatomic, assign, getter=isLoading) BOOL loading; - -///-------------------------------------- -/// @name Creating a PFQueryCollectionViewController -///-------------------------------------- - -/** - Initializes a view controller with a `UICollectionViewFlowLayout` and a class name - of `PFObject` that will be associated with this collection. - - @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 `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 `PFObject` that this table will display. - - @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; - -///-------------------------------------- -/// @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. - */ -- (void)objectsDidLoad:(nullable NSError *)error NS_REQUIRES_SUPER; - -///-------------------------------------- -/// @name Accessing Results -///-------------------------------------- - -/** - The array of instances of `PFObject` that is used as a data source. - */ -@property (nonatomic, copy, readonly) NSArray<__kindof PFObject *> *objects; - -/** - Returns an object at a particular indexPath. - - 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`. - - @return The object at the specified indexPath. - */ -- (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; - -/** - Removes an object at the specified index path, animated. - */ -- (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath; - -/** - Removes all objects at the specified index paths, animated. - */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexes; - -///-------------------------------------- -/// @name Loading Data -///-------------------------------------- - -/** - Clears the collection view and loads the first page of objects. - - @return An awaitable task that completes when the reload succeeds - */ -- (BFTask *> *)loadObjects; - -/** - 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. - @param clear Whether to clear the collection view after receiving the objects. - - @return An awaitable task that completes when the reload succeeds - */ -- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear; - -/** - Loads the next page of objects, appends to table, and refreshes. - */ -- (void)loadNextPage; - -/** - Clears the collection view of all objects. - */ -- (void)clear; - -///-------------------------------------- -/// @name Querying -///-------------------------------------- - -/** - 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. - */ -- (PFQuery *)queryForCollection; - -///-------------------------------------- -/// @name Data Source Methods -///-------------------------------------- - -/** - Override this method to customize each cell given a `PFObject` that is loaded. - - @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 `PFObject` that is associated with the cell. - - @return The cell that represents this object. - */ -- (nullable PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(nullable PFObject *)object; - -/** - 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. - - @return The view that allows the user to paginate. - */ -- (nullable UICollectionReusableView *)collectionViewReusableViewForNextPageAction:(UICollectionView *)collectionView; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.m b/ParseUI/ParseUI/Source/PFQueryCollectionViewController.m deleted file mode 100644 index 0f3ded0fd..000000000 --- a/ParseUI/ParseUI/Source/PFQueryCollectionViewController.m +++ /dev/null @@ -1,445 +0,0 @@ -/* - * 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 "PFQueryCollectionViewController.h" - -#if __has_include() -#import -#import -#else -#import "BFTask.h" -#import "BFTaskCompletionSource.h" -#endif - -@import ParseCore; - -#import "PFActivityIndicatorCollectionReusableView.h" -#import "PFCollectionViewCell.h" -#import "PFImageView.h" -#import "PFLoadingView.h" -#import "PFLocalization.h" -#import "PFUIAlertView.h" - -static NSString *const PFQueryCollectionViewCellIdentifier = @"cell"; -static NSString *const PFQueryCollectionViewNextPageReusableViewIdentifier = @"nextPageView"; - -@interface PFQueryCollectionViewController () { - NSMutableArray *_mutableObjects; - - BOOL _firstLoad; // Whether we have loaded the first set of objects - NSInteger _currentPage; // The last page that was loaded - NSInteger _lastLoadCount; // The count of objects from the last load. -} - -@property (nonatomic, strong) PFLoadingView *loadingView; - -@property (nonatomic, strong) PFActivityIndicatorCollectionReusableView *currentNextPageView; - -- (instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - -@end - -@implementation PFQueryCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithCoder:(NSCoder *)decoder { - // initWithCoder is usually a parallel designated initializer, as is the case here - // It's used by storyboard - self = [super initWithCoder:decoder]; - if (!self) return nil; - - [self _setupWithClassName:nil]; - - return self; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - // This is used by interface builder - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (!self) return nil; - - [self _setupWithClassName:nil]; - - 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; - - [self _setupWithClassName:className]; - - return self; -} - -- (instancetype)initWithClassName:(NSString *)className { - UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; - return [self initWithCollectionViewLayout:layout className:className]; -} - -- (void)_setupWithClassName:(NSString *)otherClassName { - _mutableObjects = [NSMutableArray array]; - _firstLoad = YES; - - // Set some reasonable defaults - _objectsPerPage = 25; - _loadingViewEnabled = YES; - _paginationEnabled = YES; - _pullToRefreshEnabled = YES; - _lastLoadCount = -1; - - _parseClassName = [otherClassName copy]; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)loadView { - [super loadView]; - - self.collectionView.backgroundColor = [UIColor whiteColor]; - - [self.collectionView registerClass:[PFCollectionViewCell class] - forCellWithReuseIdentifier:PFQueryCollectionViewCellIdentifier]; - [self.collectionView registerClass:[PFActivityIndicatorCollectionReusableView class] - forSupplementaryViewOfKind:UICollectionElementKindSectionFooter - withReuseIdentifier:PFQueryCollectionViewNextPageReusableViewIdentifier]; - - if (@available(iOS 10.0, *)) { - if (self.pullToRefreshEnabled) { - self.collectionView.refreshControl = [[UIRefreshControl alloc] init]; - [self.collectionView.refreshControl addTarget:self - action:@selector(_refreshControlValueChanged:) - forControlEvents:UIControlEventValueChanged]; - self.collectionView.alwaysBounceVertical = YES; - } - } -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self loadObjects]; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - self.loadingView.frame = self.collectionView.bounds; -} - -#pragma mark - -#pragma mark Responding to Events - -- (void)objectsWillLoad { - [self _refreshLoadingView]; -} - -- (void)objectsDidLoad:(NSError *)error { - [self _refreshLoadingView]; - _firstLoad = NO; -} - -#pragma mark - -#pragma mark Accessing Results - -- (NSArray *)objects { - return _mutableObjects; -} - -- (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath { - return self.objects[indexPath.row]; -} - -#pragma mark - -#pragma mark Removing Objects - -- (void)removeObjectAtIndexPath:(NSIndexPath *)indexPath { - [self removeObjectsAtIndexPaths:@[ indexPath ]]; -} - -- (void)removeObjectsAtIndexPaths:(NSArray *)indexPaths { - if (indexPaths.count == 0) { - return; - } - - // We need the contents as both an index set and a list of index paths. - NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; - - for (NSIndexPath *indexPath in indexPaths) { - if (indexPath.section != 0) { - [NSException raise:NSRangeException format:@"Index Path section %lu out of range!", (long)indexPath.section]; - } - - if (indexPath.row >= self.objects.count) { - [NSException raise:NSRangeException format:@"Index Path row %lu out of range!", (long)indexPath.row]; - } - - [indexes addIndex:indexPath.row]; - } - - BFContinuationBlock deletionHandlerBlock = ^id (BFTask *task) { - if (@available(iOS 10.0, *)) { - self.collectionView.refreshControl.enabled = YES; - } - - if (task.error) { - [self _handleDeletionError:task.error]; - } - - return nil; - }; - - NSMutableArray *allDeletionTasks = [NSMutableArray arrayWithCapacity:indexes.count]; - NSArray *objectsToRemove = [self.objects objectsAtIndexes:indexes]; - - // Remove the contents from our local cache so we can give the user immediate feedback. - [_mutableObjects removeObjectsInArray:objectsToRemove]; - [self.collectionView deleteItemsAtIndexPaths:indexPaths]; - - for (id obj in objectsToRemove) { - [allDeletionTasks addObject:[obj deleteInBackground]]; - } - - [[BFTask taskForCompletionOfAllTasks:allDeletionTasks] - continueWithBlock:deletionHandlerBlock]; -} - -#pragma mark - -#pragma mark Loading Data - -- (BFTask *> *)loadObjects { - return [self loadObjects:0 clear:YES]; -} - -- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear { - self.loading = YES; - [self objectsWillLoad]; - - PFQuery *query = [self queryForCollection]; - [self _alterQuery:query forLoadingPage:page]; - - BFTaskCompletionSource *> *source = [BFTaskCompletionSource taskCompletionSource]; - [query findObjectsInBackgroundWithBlock:^(NSArray *foundObjects, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (![Parse isLocalDatastoreEnabled] && - query.cachePolicy != kPFCachePolicyCacheOnly && - error.code == kPFErrorCacheMiss) { - // no-op on cache miss - return; - } - - self.loading = NO; - - if (error) { - self->_lastLoadCount = -1; - self->_currentNextPageView.animating = NO; - } else { - self->_currentPage = page; - self->_lastLoadCount = [foundObjects count]; - - if (clear) { - [self->_mutableObjects removeAllObjects]; - } - - [self->_mutableObjects addObjectsFromArray:foundObjects]; - [self.collectionView reloadData]; - } - - [self objectsDidLoad:error]; - if (@available(iOS 10.0, *)) { - [self.collectionView.refreshControl endRefreshing]; - } - - if (error) { - [source trySetError:error]; - } else { - [source trySetResult:foundObjects]; - } - }); - }]; - return source.task; -} - -- (void)loadNextPage { - if (!self.loading) { - [self loadObjects:(_currentPage + 1) clear:NO]; - _currentNextPageView.animating = YES; - } -} - -- (void)clear { - [_mutableObjects removeAllObjects]; - [self.collectionView reloadData]; - _currentPage = 0; -} - -#pragma mark - -#pragma mark Querying - -- (PFQuery *)queryForCollection { - if (!self.parseClassName) { - [NSException raise:NSInternalInconsistencyException - format:@"You need to specify a parseClassName for the PFQueryTableViewController.", nil]; - } - - PFQuery *query = [PFQuery queryWithClassName:self.parseClassName]; - - // If no objects are loaded in memory, we look to the cache first to fill the table - // and then subsequently do a query against the network. - if ([self.objects count] == 0 && ![Parse isLocalDatastoreEnabled]) { - query.cachePolicy = kPFCachePolicyCacheThenNetwork; - } - - [query orderByDescending:@"createdAt"]; - - return query; -} - -- (void)_alterQuery:(PFQuery *)query forLoadingPage:(NSInteger)page { - if (self.paginationEnabled && self.objectsPerPage) { - query.limit = self.objectsPerPage; - query.skip = page * self.objectsPerPage; - } -} - -#pragma mark - -#pragma mark Data Source Methods - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:PFQueryCollectionViewCellIdentifier - forIndexPath:indexPath]; - [cell updateFromObject:object]; - return cell; -} - -- (UICollectionReusableView *)collectionViewReusableViewForNextPageAction:(UICollectionView *)collectionView { - _currentNextPageView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter - withReuseIdentifier:PFQueryCollectionViewNextPageReusableViewIdentifier - forIndexPath:[self _indexPathForPaginationReusableView]]; - _currentNextPageView.textLabel.text = PFLocalizedString(@"Load more...", @"Load more..."); - [_currentNextPageView addTarget:self action:@selector(loadNextPage) forControlEvents:UIControlEventTouchUpInside]; - _currentNextPageView.animating = self.loading; - return _currentNextPageView; -} - -#pragma mark - -#pragma mark UICollectionViewDataSource - -- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { - return 1; -} - -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - return [self.objects count]; -} - -- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath { - return [self collectionView:collectionView cellForItemAtIndexPath:indexPath object:[self objectAtIndexPath:indexPath]]; -} - -- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView - viewForSupplementaryElementOfKind:(NSString *)kind - atIndexPath:(NSIndexPath *)indexPath { - return [self collectionViewReusableViewForNextPageAction:collectionView]; -} - -#pragma mark - -#pragma mark UICollectionViewDelegateFlowLayout - -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section { - if ([self _shouldShowPaginationView]) { - return CGSizeMake(CGRectGetWidth(collectionView.bounds), 50.0f); - } - return CGSizeZero; -} - -#pragma mark - -#pragma mark Pagination - -- (BOOL)_shouldShowPaginationView { - return (self.paginationEnabled && - [self.objects count] != 0 && - (_lastLoadCount == -1 || _lastLoadCount >= (NSInteger)self.objectsPerPage)); -} - -- (NSIndexPath *)_indexPathForPaginationReusableView { - return [NSIndexPath indexPathForItem:0 inSection:[self numberOfSectionsInCollectionView:self.collectionView] - 1]; -} - -#pragma mark - -#pragma mark Error handling - -- (void)_handleDeletionError:(NSError *)error { - // Fully reload on error. - [self loadObjects]; - - 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 - -#pragma mark Actions - -- (void)_refreshControlValueChanged:(UIRefreshControl *)refreshControl { - if (!self.loading) { - [self loadObjects]; - } -} - -#pragma mark - -#pragma mark Loading View - -- (void)_refreshLoadingView { - BOOL showLoadingView = self.loadingViewEnabled && self.loading && _firstLoad; - - if (showLoadingView) { - [self.collectionView addSubview:self.loadingView]; - [self.view setNeedsLayout]; - } else { - // Avoid loading `loadingView` - just use an ivar. - if (_loadingView) { - [self.loadingView removeFromSuperview]; - self.loadingView = nil; - } - } -} - -- (PFLoadingView *)loadingView { - if (!_loadingView) { - _loadingView = [[PFLoadingView alloc] initWithFrame:CGRectZero]; - } - return _loadingView; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFQueryTableViewController.h b/ParseUI/ParseUI/Source/PFQueryTableViewController.h deleted file mode 100644 index 3460f4caf..000000000 --- a/ParseUI/ParseUI/Source/PFQueryTableViewController.h +++ /dev/null @@ -1,271 +0,0 @@ -/* - * 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 -#import "ParseUIConstants.h" - -@import ParseCore; - -NS_ASSUME_NONNULL_BEGIN - -@class BFTask<__covariant BFGenericType>; -@class PFObject; -@class PFQuery; -@class PFTableViewCell; - -/** - 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: - - - Pagination with a cell that can be tapped to load the next page. - - Pull-to-refresh table view header. - - Automatic downloading and displaying of remote images in cells. - - Loading screen, shown before any data is loaded. - - Automatic loading and management of the objects array. - - Various methods that can be overridden to customize behavior at major events in the data cycle. - */ -@interface PFQueryTableViewController : UITableViewController - -///-------------------------------------- -/// @name Creating a PFQueryTableViewController -///-------------------------------------- - -/** - 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 `PFObject` that this table will display. - - @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; - -/** - Initializes with a class name of the PFObjects that will be associated with this table. - - @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. - */ -- (instancetype)initWithClassName:(nullable NSString *)className; - -///-------------------------------------- -/// @name Configuring Behavior -///-------------------------------------- - -/** - 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 `-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 `-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 `-tableView:cellForRowAtIndexPath:object:` - */ -@property (nullable, nonatomic, strong) IBInspectable UIImage *placeholderImage; - -/** - Whether the table should use the default loading view. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL loadingViewEnabled; - -/** - Whether the table should use the built-in pull-to-refresh feature. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL pullToRefreshEnabled; - -/** - Whether the table should use the built-in pagination feature. Default - `YES`. - */ -@property (nonatomic, assign) IBInspectable BOOL paginationEnabled; - -/** - The number of objects to show per page. Default - `25`. - */ -@property (nonatomic, assign) IBInspectable NSUInteger objectsPerPage; - -/** - Whether the table is actively loading new data from the server. - */ -@property (nonatomic, assign, getter=isLoading) BOOL loading; - -///-------------------------------------- -/// @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. - */ -- (void)objectsDidLoad:(nullable NSError *)error; - -///-------------------------------------- -/// @name Accessing Results -///-------------------------------------- - -/** - The array of instances of `PFObject` that is used as a data source. - */ -@property (nullable, nonatomic, copy, readonly) NSArray<__kindof PFObject *> *objects; - -/** - Returns an object at a particular indexPath. - - 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. - - @return The object at the specified index - */ -- (nullable PFObject *)objectAtIndexPath:(nullable NSIndexPath *)indexPath; - -/** - Removes an object at the specified index path, animated. - */ -- (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath; - -/** - Removes an object at the specified index path, with or without animation. - */ -- (void)removeObjectAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated; - -/** - Removes all objects at the specified index paths, animated. - */ -- (void)removeObjectsAtIndexPaths:(nullable NSArray *)indexPaths; - -/** - Removes all objects at the specified index paths, with or without animation. - */ -- (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. - */ -- (void)clear; - -/** - Clears the table and loads the first page of objects. - - @return An awaitable task that completes when the reload succeeds - */ -- (BFTask *> *)loadObjects; - -/** - 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. - @param clear Whether to clear the table after receiving the objects - - @return An awaitable task that completes when the reload succeeds - */ -- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear; - -/** - Loads the next page of objects, appends to table, and refreshes. - */ -- (void)loadNextPage; - -///-------------------------------------- -/// @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. - */ -- (PFQuery *)queryForTable; - -///-------------------------------------- -/// @name Data Source Methods -///-------------------------------------- - -/** - Override this method to customize each cell given a PFObject that is loaded. - - 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 `PFTableViewCell` which is a subclass of `UITableViewCell`. - - @param tableView The table view object associated with this controller. - @param indexPath The indexPath of the cell. - @param object The PFObject that is associated with the cell. - - @return The cell that represents this object. - */ -- (nullable PFTableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(nullable PFObject *)object; - -/** - 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. - @param indexPath The indexPath of the cell. - - @return The cell that allows the user to paginate. - */ -- (nullable PFTableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFQueryTableViewController.m b/ParseUI/ParseUI/Source/PFQueryTableViewController.m deleted file mode 100644 index 655e89e35..000000000 --- a/ParseUI/ParseUI/Source/PFQueryTableViewController.m +++ /dev/null @@ -1,589 +0,0 @@ -/* - * 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 "PFQueryTableViewController.h" - -#if __has_include() -#import -#import -#import -#else -#import "PFConstants.h" -#import "BFTask.h" -#import "BFTaskCompletionSource.h" -#endif - -@import ParseCore; - -#import "PFActivityIndicatorTableViewCell.h" -#import "PFImageView.h" -#import "PFLoadingView.h" -#import "PFLocalization.h" -#import "PFTableViewCell.h" -#import "PFUIAlertView.h" - -// Add headers to kill any warnings. -// `initWithStyle:` is a UITableViewController method. -// `initWithCoder:`/`initWithNibName:bundle:` are UIViewController methods and are, for sure, available. -@interface UITableViewController () - -- (instancetype)initWithStyle:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - -@end - -@interface PFQueryTableViewController () { - NSMutableArray *_mutableObjects; - - BOOL _firstLoad; // Whether we have loaded the first set of objects - NSInteger _currentPage; // The last page that was loaded - NSInteger _lastLoadCount; // The count of objects from the last load. - // Set to -1 when objects haven't loaded, or there was an error. - UITableViewCellSeparatorStyle _savedSeparatorStyle; -} - -@property (nonatomic, strong) PFLoadingView *loadingView; - -- (instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - -@end - -@implementation PFQueryTableViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithCoder:(NSCoder *)decoder { - // initWithCoder is usually a parallel designated initializer, as is the case here - // It's used by storyboard - self = [super initWithCoder:decoder]; - if (self) { - [self _setupWithClassName:nil]; - } - return self; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - // This is used by interface builder - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - [self _setupWithClassName:nil]; - } - return self; -} - -- (instancetype)initWithStyle:(UITableViewStyle)style { - return [self initWithStyle:style className:nil]; -} - -- (instancetype)initWithClassName:(NSString *)className { - return [self initWithStyle:UITableViewStylePlain className:className]; -} - -- (instancetype)initWithStyle:(UITableViewStyle)style className:(NSString *)className { - self = [super initWithStyle:style]; - if (self) { - [self _setupWithClassName:className]; - } - return self; -} - -- (void)_setupWithClassName:(NSString *)otherClassName { - _mutableObjects = [NSMutableArray array]; - _firstLoad = YES; - - // Set some reasonable defaults - _objectsPerPage = 25; - _loadingViewEnabled = YES; - _paginationEnabled = YES; - _pullToRefreshEnabled = YES; - _lastLoadCount = -1; - - _parseClassName = [otherClassName copy]; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)loadView { - [super loadView]; - - // Setup the Pull to Refresh UI if needed - if (self.pullToRefreshEnabled) { - UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; - [refreshControl addTarget:self - action:@selector(_refreshControlValueChanged:) - forControlEvents:UIControlEventValueChanged]; - self.refreshControl = refreshControl; - } -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self loadObjects]; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - self.loadingView.frame = self.tableView.bounds; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - [self.tableView beginUpdates]; - - // If we're currently showing the pagination cell, we need to hide it during editing. - if ([self paginationEnabled] && [self _shouldShowPaginationCell]) { - [self.tableView deleteRowsAtIndexPaths:@[ [self _indexPathForPaginationCell] ] - withRowAnimation:UITableViewRowAnimationAutomatic]; - } - - [super setEditing:editing animated:animated]; - - // Ensure proper re-insertion of the pagination cell. - if ([self paginationEnabled] && [self _shouldShowPaginationCell]) { - [self.tableView insertRowsAtIndexPaths:@[ [self _indexPathForPaginationCell] ] - withRowAnimation:UITableViewRowAnimationAutomatic]; - } - - [self.tableView endUpdates]; -} - -#pragma mark - -#pragma mark Data - -- (void)objectsWillLoad { - if (_firstLoad) { - _savedSeparatorStyle = self.tableView.separatorStyle; - self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - } - [self _refreshLoadingView]; -} - -- (void)objectsDidLoad:(NSError *)error { - if (_firstLoad) { - _firstLoad = NO; - self.tableView.separatorStyle = _savedSeparatorStyle; - } - [self _refreshLoadingView]; -} - -- (PFQuery *)queryForTable { - if (!self.parseClassName) { - [NSException raise:NSInternalInconsistencyException - format:@"You need to specify a parseClassName for the PFQueryTableViewController.", nil]; - } - - PFQuery *query = [PFQuery queryWithClassName:self.parseClassName]; - - // If no objects are loaded in memory, we look to the cache first to fill the table - // and then subsequently do a query against the network. - if ([self.objects count] == 0 && ![Parse isLocalDatastoreEnabled]) { - query.cachePolicy = kPFCachePolicyCacheThenNetwork; - } - - [query orderByDescending:@"createdAt"]; - - return query; -} - -// Alters a query to add functionality like pagination -- (void)_alterQuery:(PFQuery *)query forLoadingPage:(NSInteger)page { - if (self.paginationEnabled && self.objectsPerPage) { - query.limit = self.objectsPerPage; - query.skip = page * self.objectsPerPage; - } -} - -- (void)clear { - dispatch_async(dispatch_get_main_queue(), ^{ - [self->_mutableObjects removeAllObjects]; - [self.tableView reloadData]; - self->_currentPage = 0; - }); -} - -- (BFTask *> *)loadObjects { - return [self loadObjects:0 clear:YES]; -} - -- (BFTask *> *)loadObjects:(NSInteger)page clear:(BOOL)clear { - self.loading = YES; - [self objectsWillLoad]; - - PFQuery *query = [self queryForTable]; - [self _alterQuery:query forLoadingPage:page]; - - BFTaskCompletionSource *> *source = [BFTaskCompletionSource taskCompletionSource]; - [query findObjectsInBackgroundWithBlock:^(NSArray *foundObjects, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (![Parse isLocalDatastoreEnabled] && - query.cachePolicy != kPFCachePolicyCacheOnly && - error.code == kPFErrorCacheMiss) { - // no-op on cache miss - return; - } - - self.loading = NO; - - if (error) { - self->_lastLoadCount = -1; - } else { - self->_currentPage = page; - self->_lastLoadCount = [foundObjects count]; - - if (clear) { - [self->_mutableObjects removeAllObjects]; - } - - [self->_mutableObjects addObjectsFromArray:foundObjects]; - } - [self.tableView reloadData]; - [self objectsDidLoad:error]; - [self.refreshControl endRefreshing]; - - if (error) { - [source trySetError:error]; - } else { - [source trySetResult:foundObjects]; - } - }); - }]; - - return source.task; -} - -- (void)loadNextPage { - if (!self.loading) { - [self loadObjects:(_currentPage + 1) clear:NO]; - } -} - -#pragma mark - -#pragma mark UIScrollViewDelegate - -// scrollViewDidEndDragging:willDecelerate: is called when a user stops dragging the table view. -- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { - // If the user lets go and the table view has no momentum, - // scrollViewDidEndDragging:willDecelerate: is called with willDecelerate:NO. - // In this case, we trigger a load for all the PFImageViews - // in our PFTableViewCells through _loadImagesForOnscreenRows. - if (!decelerate) { - [self _loadImagesForOnscreenRows]; - } -} - -// If the user lets go and the table view has momentum, -// scrollViewDidEndDragging:willDecelerate: is called with willDecelerate:YES. -// We will defer loading of images until scrollViewDidEndDecelerating: is called. -- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { - [self _loadImagesForOnscreenRows]; -} - -#pragma mark - -#pragma mark UITableViewDataSource - -// Return the number of rows in the section. -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - NSInteger count = [self.objects count]; - - if ([self _shouldShowPaginationCell]) { - count += 1; - } - - return count; -} - -// Default implementation that displays a default style cell -- (PFTableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"PFTableViewCell"; - PFTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (!cell) { - cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; - } - - [self tableView:tableView configureCell:cell atIndexPath:indexPath object:object]; - - return cell; -} - -- (void)tableView:(UITableView *)tableView - configureCell:(PFTableViewCell *)cell - atIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - // Grab a key to display - NSString *key; - if (self.textKey) { - key = self.textKey; - } else if ([[object allKeys] count] > 0) { - key = [[object allKeys] objectAtIndex:0]; - } - - // Configure the cell - if (key) { - cell.textLabel.text = [NSString stringWithFormat:@"%@", [object objectForKey:key]]; - } - - if (self.placeholderImage) { - cell.imageView.image = self.placeholderImage; - } - - if (self.imageKey) { - cell.imageView.file = object[self.imageKey]; - } -} - -- (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath { - return self.objects[indexPath.row]; -} - -- (void)removeObjectAtIndexPath:(NSIndexPath *)indexPath { - [self removeObjectAtIndexPath:indexPath animated:YES]; -} - -- (void)removeObjectAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated { - [self removeObjectsAtIndexPaths:@[ indexPath ] animated:animated]; -} - -- (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; - } - - // We need the contents as both an index set and a list of index paths. - NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; - - for (NSIndexPath *indexPath in indexPaths) { - if (indexPath.section != 0) { - [NSException raise:NSRangeException format:@"Index Path section %lu out of range!", (long)indexPath.section]; - } - - if (indexPath.row >= self.objects.count) { - [NSException raise:NSRangeException format:@"Index Path row %lu out of range!", (long)indexPath.row]; - } - - [indexes addIndex:indexPath.row]; - } - - BFContinuationBlock deletionHandlerBlock = ^id (BFTask *task) { - self.refreshControl.enabled = YES; - if (task.error) { - [self _handleDeletionError:task.error]; - } - - return nil; - }; - - NSMutableArray *allDeletionTasks = [NSMutableArray arrayWithCapacity:indexes.count]; - NSArray *objectsToRemove = [self.objects objectsAtIndexes:indexes]; - - // Remove the contents from our local cache so we can give the user immediate feedback. - [_mutableObjects removeObjectsInArray:objectsToRemove]; - [self.tableView deleteRowsAtIndexPaths:indexPaths - withRowAnimation:animated ? UITableViewRowAnimationAutomatic : UITableViewRowAnimationNone]; - - for (id obj in objectsToRemove) { - [allDeletionTasks addObject:[obj deleteInBackground]]; - } - - [[BFTask taskForCompletionOfAllTasks:allDeletionTasks] continueWithExecutor:[BFExecutor mainThreadExecutor] - withBlock:deletionHandlerBlock]; -} - -- (PFTableViewCell *)tableView:(UITableView *)otherTableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath { - static NSString *cellIdentifier = @"PFTableViewCellNextPage"; - - PFActivityIndicatorTableViewCell *cell = [otherTableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[PFActivityIndicatorTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:cellIdentifier]; - cell.textLabel.text = PFLocalizedString(@"Load more...", @"Load more..."); - } - - cell.animating = self.loading; - - return cell; -} - -- (UITableViewCell *)tableView:(UITableView *)otherTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - PFTableViewCell *cell; - if ([self _shouldShowPaginationCell] && [indexPath isEqual:[self _indexPathForPaginationCell]]) { - // Return the pagination cell on the last cell - cell = [self tableView:otherTableView cellForNextPageAtIndexPath:indexPath]; - } else { - cell = [self tableView:otherTableView - cellForRowAtIndexPath:indexPath - object:[self objectAtIndexPath:indexPath]]; - } - - if ([cell isKindOfClass:[PFTableViewCell class]] && - !otherTableView.dragging && - !otherTableView.decelerating) { - // The reason we dispatch to the main queue is that we want to enable subclasses to override - // tableView:cellForRowAtIndexPath:object:, and we still do image loading after they assign - // the remote image file. - dispatch_async(dispatch_get_main_queue(), ^{ - [cell.imageView loadInBackground]; - }); - } - return cell; -} - -#pragma mark - -#pragma mark UITableViewDelegate - -- (void)tableView:(UITableView *)otherTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - // Handle selection of the next page row - if (!_firstLoad && - self.paginationEnabled && - [indexPath isEqual:[self _indexPathForPaginationCell]]) { - [self loadNextPage]; - } -} - -- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView - editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { - if ([indexPath isEqual:[self _indexPathForPaginationCell]]) { - return UITableViewCellEditingStyleNone; - } - - return UITableViewCellEditingStyleDelete; -} - -- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath { - if ([indexPath isEqual:[self _indexPathForPaginationCell]]) { - return NO; - } - - return YES; -} - -#pragma mark - -#pragma mark Private - -// Whether we need to show the pagination cell -- (BOOL)_shouldShowPaginationCell { - return (self.paginationEnabled && - !self.editing && - [self.objects count] != 0 && - (_lastLoadCount == -1 || _lastLoadCount >= (NSInteger)self.objectsPerPage)); -} - -// The row of the pagination cell -- (NSIndexPath *)_indexPathForPaginationCell { - return [NSIndexPath indexPathForRow:[self.objects count] inSection:0]; -} - -- (void)_loadImagesForOnscreenRows { - if (self.objects.count > 0) { - NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows]; - for (NSIndexPath *indexPath in visiblePaths) { - [self _loadImageForCellAtIndexPath:indexPath]; - } - } -} - -- (void)_loadImageForCellAtIndexPath:(NSIndexPath *)indexPath { - PFTableViewCell *cell = (PFTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; - if ([cell isKindOfClass:[PFTableViewCell class]]) { - [cell.imageView loadInBackground]; - } -} - -#pragma mark - -#pragma mark Error handling - -- (void)_handleDeletionError:(NSError *)error { - // Fully reload on error. - [self loadObjects]; - - 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 - -#pragma mark Actions - -- (void)_refreshControlValueChanged:(UIRefreshControl *)refreshControl { - [self loadObjects]; -} - -#pragma mark - -#pragma mark Accessors - -- (NSArray<__kindof PFObject *> *)objects { - return _mutableObjects; -} - -#pragma mark - -#pragma mark Loading View - -- (void)_refreshLoadingView { - BOOL showLoadingView = self.loadingViewEnabled && self.loading && _firstLoad; - - if (showLoadingView) { - [self.tableView addSubview:self.loadingView]; - [self.view setNeedsLayout]; - } else { - // Avoid loading `loadingView` - just use an ivar. - if (_loadingView) { - [self.loadingView removeFromSuperview]; - self.loadingView = nil; - } - } -} - -- (PFLoadingView *)loadingView { - if (!_loadingView) { - _loadingView = [[PFLoadingView alloc] initWithFrame:CGRectZero]; - } - return _loadingView; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFResources.h b/ParseUI/ParseUI/Source/PFResources.h deleted file mode 100644 index 3adb9f110..000000000 --- a/ParseUI/ParseUI/Source/PFResources.h +++ /dev/null @@ -1,10 +0,0 @@ -// This is an auto-generated file. -#import -@interface PFResources : NSObject -+ (NSData *)apple_icon3x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)parse_logo_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)apple_icon2x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)parse_logo2x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)parse_logo3x_png;//modified:2022-11-07 15:10:28 +0300 -+ (NSData *)apple_icon_png;//modified:2022-11-07 15:10:28 +0300 -@end diff --git a/ParseUI/ParseUI/Source/PFResources.m b/ParseUI/ParseUI/Source/PFResources.m deleted file mode 100644 index 67106e827..000000000 --- a/ParseUI/ParseUI/Source/PFResources.m +++ /dev/null @@ -1,50 +0,0 @@ -// This is an auto-generated file. -#import "PFResources.h" -@implementation PFResources - static const unsigned char apple_icon3x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x42, 0x8, 0x6, 0x0, 0x0, 0x0, 0x1c, 0xf6, 0x25, 0xa, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x4, 0xca, 0x49, 0x44, 0x41, 0x54, 0x68, 0x5, 0xdd, 0x9b, 0x5b, 0x68, 0x15, 0x47, 0x1c, 0xc6, 0x3d, 0xb1, 0xde, 0xad, 0x22, 0xde, 0x83, 0x60, 0xad, 0x18, 0x44, 0xd4, 0x34, 0x6a, 0xd1, 0x7, 0x93, 0xa7, 0x5a, 0xaa, 0x6d, 0xbc, 0xd5, 0x27, 0x9, 0xf8, 0x50, 0x21, 0xa8, 0x8, 0xa2, 0x42, 0x15, 0xbc, 0xa1, 0xc5, 0xb, 0x14, 0x44, 0x41, 0x2d, 0xe2, 0x83, 0x60, 0x29, 0x5a, 0xa8, 0x2d, 0x48, 0x20, 0x79, 0xb0, 0x8d, 0xf, 0xad, 0xd7, 0x62, 0xa9, 0x4a, 0x51, 0x50, 0xe2, 0x9d, 0x88, 0xe2, 0x2d, 0x78, 0x8d, 0xc6, 0xdf, 0x77, 0x3c, 0x7b, 0xd8, 0x73, 0x32, 0xbb, 0xb3, 0xe7, 0x44, 0xe8, 0x8c, 0x7f, 0xf8, 0x32, 0xb3, 0xf3, 0x9f, 0x99, 0xfd, 0xbe, 0xf3, 0x9f, 0xdd, 0x9d, 0x9d, 0xd9, 0xa4, 0x3a, 0x39, 0x66, 0x6d, 0x6d, 0x6d, 0x13, 0xa1, 0x54, 0x3, 0x2a, 0xc0, 0x68, 0x50, 0x9a, 0x4a, 0xa5, 0x5e, 0x93, 0xfa, 0x69, 0x8, 0x9a, 0xb, 0x4e, 0x83, 0x7c, 0xeb, 0xe9, 0xa5, 0x22, 0x54, 0x94, 0x82, 0x5f, 0xf3, 0xd5, 0x64, 0x8e, 0x1f, 0xf9, 0x2a, 0x6a, 0x12, 0x2, 0xee, 0x46, 0x88, 0x52, 0xf1, 0x7f, 0xc5, 0xa, 0x2b, 0x29, 0xb6, 0x61, 0x47, 0xdb, 0x41, 0xba, 0x92, 0x3e, 0x8e, 0x82, 0xfe, 0x31, 0x7d, 0xfd, 0x19, 0xe3, 0x73, 0xcf, 0x85, 0xa8, 0x51, 0xe0, 0x11, 0xb0, 0xd9, 0x6c, 0xf7, 0xd8, 0x47, 0x30, 0x42, 0x49, 0x37, 0xf0, 0x8f, 0x4d, 0x11, 0xfe, 0x7b, 0xc0, 0x9f, 0x1b, 0x7, 0x64, 0x57, 0x26, 0x10, 0xa5, 0x2a, 0x6b, 0x22, 0x7e, 0x1b, 0xf7, 0x8a, 0x21, 0xdb, 0x17, 0x28, 0x12, 0x36, 0xbb, 0x43, 0x85, 0xbe, 0xee, 0x29, 0x88, 0x60, 0x4, 0xd9, 0x25, 0x36, 0x45, 0x19, 0xff, 0xac, 0x88, 0x2e, 0xdc, 0x2c, 0x86, 0x74, 0x63, 0x2, 0x61, 0x3b, 0xdd, 0x64, 0x1f, 0xc1, 0xa, 0x41, 0x1a, 0x86, 0xaf, 0x2c, 0xc2, 0x76, 0xe3, 0x4f, 0x45, 0x74, 0xe1, 0x66, 0x31, 0x84, 0xcb, 0x63, 0x44, 0xbd, 0xc0, 0xb7, 0xce, 0x4d, 0xe6, 0x16, 0x56, 0x10, 0xaf, 0x8e, 0x10, 0x76, 0x86, 0xf2, 0x72, 0x4b, 0xf3, 0x82, 0xdd, 0x1f, 0x14, 0xdc, 0xa2, 0xf8, 0x6, 0xe1, 0x73, 0x3d, 0xa6, 0x9b, 0x7a, 0xb0, 0x87, 0x99, 0xfb, 0x1f, 0xc5, 0x77, 0xe9, 0x40, 0x4b, 0xa2, 0xd2, 0x3, 0x4c, 0x4, 0x43, 0x93, 0xd0, 0xa1, 0x5e, 0x57, 0xd0, 0x2b, 0x49, 0x5d, 0x53, 0x9d, 0x82, 0x2e, 0x54, 0x4e, 0xd4, 0x99, 0x4e, 0xaa, 0xc0, 0xc, 0x30, 0x2, 0x94, 0x82, 0xc1, 0xa0, 0x5, 0x34, 0x81, 0x13, 0xe0, 0x37, 0xa2, 0x50, 0xd0, 0xe4, 0x55, 0x22, 0x68, 0xf7, 0x39, 0xa8, 0x6, 0x9f, 0x82, 0x32, 0x10, 0x88, 0x7a, 0x49, 0xfe, 0x6, 0x38, 0xf, 0x1a, 0x41, 0x1d, 0xfd, 0x5f, 0x24, 0xed, 0xb8, 0x71, 0x62, 0xbd, 0x5a, 0xe8, 0x8e, 0x15, 0x37, 0x13, 0xc7, 0x9d, 0x35, 0x4d, 0x99, 0xbe, 0x5, 0x91, 0xd1, 0xc1, 0x57, 0x2, 0xa6, 0x81, 0x3, 0xe0, 0x21, 0x28, 0xc4, 0xf4, 0xd8, 0xd0, 0x8f, 0x50, 0x9c, 0xd1, 0xb8, 0x27, 0x58, 0xf, 0x5a, 0x40, 0x31, 0xd6, 0x4a, 0xa3, 0x23, 0xa0, 0x6, 0x8c, 0x0, 0xfd, 0xc0, 0x14, 0xf0, 0x1d, 0xb8, 0xa, 0x3a, 0x6a, 0xf5, 0x74, 0xf0, 0xb1, 0x49, 0x5d, 0xe4, 0x50, 0xa4, 0xc1, 0x30, 0x1a, 0xd4, 0x81, 0xf1, 0xa6, 0x86, 0xe, 0x95, 0xdd, 0x87, 0xcb, 0xd7, 0xf9, 0x37, 0x21, 0xe3, 0xfb, 0x18, 0xa2, 0x3e, 0xa1, 0xf2, 0x49, 0xe0, 0xba, 0x28, 0xfd, 0xbe, 0xfd, 0x40, 0x3, 0x9c, 0xe7, 0xea, 0x20, 0xb0, 0x76, 0x11, 0xa3, 0xc2, 0x28, 0x9c, 0x67, 0x40, 0x9f, 0xa0, 0x92, 0x27, 0xe9, 0x13, 0x78, 0x56, 0x11, 0xb9, 0xbf, 0xc5, 0x37, 0x27, 0x62, 0x88, 0xea, 0x41, 0xd9, 0x2f, 0xc0, 0x37, 0x51, 0xd2, 0xa2, 0x77, 0xb7, 0xec, 0xec, 0x25, 0x47, 0x18, 0x8e, 0xdd, 0x60, 0x1c, 0xf0, 0xd1, 0x76, 0x41, 0x7a, 0x5e, 0x40, 0x3c, 0x3b, 0x14, 0x89, 0xd6, 0x14, 0xa, 0x8f, 0x7, 0xe, 0xcf, 0xd2, 0x55, 0xc, 0xc1, 0x6d, 0x61, 0xce, 0xe1, 0x88, 0xad, 0xd, 0x3b, 0x3c, 0xca, 0x6f, 0xca, 0x17, 0x25, 0xee, 0xe9, 0x88, 0x11, 0xad, 0x9, 0xe4, 0xd3, 0x17, 0x9d, 0x47, 0x82, 0x44, 0xb5, 0x1, 0x4c, 0x47, 0x58, 0x5b, 0x3e, 0xef, 0x20, 0x62, 0x4b, 0xf3, 0x1d, 0x1e, 0x1c, 0x6b, 0x31, 0x75, 0x81, 0x49, 0x94, 0xb8, 0x7, 0xc2, 0x34, 0x4f, 0xf3, 0xcd, 0xb6, 0x23, 0xaa, 0x39, 0x8a, 0x74, 0x8a, 0x61, 0x38, 0x6, 0xe7, 0x85, 0xa8, 0xa, 0x8e, 0x96, 0xeb, 0xb5, 0x67, 0x18, 0xc2, 0x14, 0x35, 0xa3, 0x29, 0x62, 0x9f, 0x19, 0x3d, 0x6e, 0x17, 0x36, 0xc4, 0x89, 0x12, 0x75, 0x9, 0x9b, 0xec, 0xb6, 0x6, 0x23, 0xbb, 0x23, 0xc6, 0xd2, 0x50, 0xa1, 0x84, 0xd, 0xa, 0x1d, 0xfb, 0x92, 0xb5, 0x3e, 0x6f, 0x25, 0x6c, 0xa0, 0x2f, 0x6a, 0x42, 0x3c, 0x6f, 0x87, 0xf2, 0xc6, 0xac, 0x8f, 0xc2, 0x5a, 0xb8, 0xbe, 0xf4, 0xc6, 0x1e, 0x6b, 0x12, 0x36, 0x20, 0xb6, 0x86, 0x7b, 0xce, 0x44, 0xdb, 0xb6, 0x12, 0x96, 0xa8, 0xa2, 0x43, 0xfa, 0xfa, 0xf0, 0x88, 0xea, 0x6d, 0xe3, 0x23, 0x61, 0xd6, 0xb0, 0xda, 0x3a, 0xf9, 0x1f, 0xfc, 0x7a, 0xbb, 0x8f, 0x35, 0x9, 0xd3, 0xc3, 0xce, 0x37, 0xd3, 0xcb, 0x70, 0xac, 0x49, 0x98, 0x96, 0xb6, 0x7c, 0xb3, 0x9c, 0x65, 0x0, 0x13, 0x79, 0x9, 0xbb, 0x6c, 0x72, 0x38, 0x5e, 0x36, 0x87, 0xeb, 0xac, 0x6b, 0x1c, 0x47, 0x5f, 0x85, 0x69, 0x53, 0x70, 0xbe, 0x4d, 0x98, 0x56, 0x6f, 0x7d, 0xb4, 0x2d, 0x44, 0x2d, 0x72, 0x6d, 0x46, 0x11, 0xfb, 0xb, 0xbc, 0xf0, 0x50, 0xd9, 0x10, 0x38, 0x6f, 0x8d, 0xe2, 0x5d, 0xc2, 0x53, 0x5c, 0xcb, 0x56, 0x5a, 0x43, 0xf4, 0xd1, 0x16, 0x11, 0xb5, 0xc5, 0x26, 0xe2, 0x8a, 0x98, 0xac, 0x31, 0xfd, 0xd7, 0xcf, 0x3f, 0x3b, 0x11, 0xa7, 0x8f, 0xca, 0x72, 0x2c, 0x10, 0xe6, 0xf3, 0x1e, 0x95, 0x76, 0x80, 0xb4, 0xb1, 0xb1, 0x11, 0x4, 0x7a, 0xb2, 0x8b, 0x39, 0xdd, 0x71, 0xde, 0x3, 0x5a, 0x74, 0xf4, 0xd9, 0x74, 0x23, 0xac, 0xe5, 0xf2, 0xfa, 0x37, 0xbc, 0xae, 0xb8, 0x8f, 0xc2, 0x6f, 0x7c, 0x56, 0x95, 0xe1, 0xae, 0xb9, 0xef, 0xea, 0x6c, 0xe8, 0x38, 0xf8, 0xe1, 0x3d, 0x10, 0x25, 0x9, 0xd2, 0xd4, 0x94, 0x8d, 0x98, 0x4a, 0x18, 0xa3, 0xa7, 0x49, 0x26, 0x29, 0xef, 0xb1, 0x69, 0x5b, 0xa9, 0x34, 0x1c, 0x31, 0x69, 0x79, 0x1f, 0xa2, 0xb6, 0x9f, 0x6b, 0xec, 0x59, 0x7e, 0xc4, 0x74, 0xf3, 0xb8, 0x5, 0x34, 0x65, 0xf1, 0xd1, 0xb4, 0x5f, 0x3d, 0x12, 0x61, 0xd7, 0x73, 0x22, 0x96, 0x79, 0x58, 0xef, 0xf0, 0x51, 0x51, 0x86, 0xf3, 0x8f, 0x12, 0xa5, 0x7c, 0x4e, 0xc4, 0x54, 0xc0, 0x75, 0xf6, 0x21, 0x89, 0x66, 0xfc, 0xbe, 0x2d, 0xf2, 0x28, 0x5a, 0x63, 0x11, 0x76, 0x89, 0x34, 0xbb, 0xc4, 0xad, 0x7c, 0xda, 0x70, 0xe8, 0xc5, 0x73, 0xc3, 0xdb, 0x23, 0xaf, 0xfe, 0x6a, 0xc9, 0x3b, 0x2d, 0x4a, 0xac, 0xdb, 0x45, 0x4c, 0x85, 0x99, 0x27, 0xb8, 0xbe, 0xc7, 0xd5, 0x9e, 0x99, 0xf, 0x76, 0x13, 0x92, 0xa3, 0x11, 0x96, 0x5d, 0xe6, 0xc8, 0xb9, 0xc6, 0x2, 0x5, 0x54, 0xd0, 0x43, 0x6e, 0x21, 0x78, 0x1e, 0x94, 0x39, 0x9e, 0x2e, 0xf, 0x8b, 0x12, 0x57, 0xa3, 0x30, 0x39, 0xa8, 0xa8, 0x8d, 0x8a, 0x15, 0xca, 0x3b, 0x6e, 0x3f, 0xc1, 0xf5, 0xe7, 0x7c, 0x8e, 0xc6, 0xa1, 0x18, 0xae, 0xc4, 0xb0, 0x3c, 0xcc, 0xf1, 0x9c, 0x70, 0x99, 0x43, 0xf9, 0x2b, 0x70, 0xa9, 0x40, 0x58, 0xbb, 0x5d, 0x97, 0x24, 0xc2, 0xf4, 0x1d, 0xc5, 0x59, 0x30, 0xdc, 0x21, 0x41, 0xa2, 0xa2, 0x97, 0xe3, 0x4a, 0x44, 0x9d, 0x32, 0xf1, 0x8a, 0x1c, 0x8a, 0x41, 0x65, 0x1a, 0x6a, 0x8a, 0xf2, 0x25, 0x78, 0x10, 0x94, 0x39, 0x90, 0x6a, 0x6b, 0x56, 0xbb, 0x99, 0x46, 0x51, 0x5, 0xf1, 0x63, 0x48, 0x4e, 0x5, 0x4f, 0x81, 0xb, 0xb6, 0xcc, 0x46, 0xde, 0x3a, 0x14, 0xc3, 0x1d, 0xa0, 0x68, 0x26, 0xc7, 0x7, 0x81, 0x3e, 0x74, 0x49, 0x6a, 0xe7, 0xa8, 0xf8, 0x3b, 0x50, 0xaa, 0x77, 0xbe, 0x56, 0xa0, 0xe1, 0x5d, 0x6, 0xaa, 0x40, 0x25, 0x48, 0xca, 0x43, 0x91, 0x5a, 0x43, 0xa4, 0x36, 0x93, 0xbe, 0x5b, 0x43, 0x9c, 0xfe, 0xd1, 0xe6, 0xa2, 0x25, 0x6c, 0xcd, 0xf8, 0xbf, 0x7, 0xe5, 0xb6, 0xb3, 0x53, 0xe7, 0x23, 0xb0, 0x1e, 0x34, 0x81, 0x38, 0xbb, 0x86, 0xf3, 0x2b, 0x5b, 0x7f, 0x1d, 0xf2, 0x73, 0x2, 0x7d, 0xfd, 0x59, 0xb, 0x8e, 0x1, 0x7d, 0xc3, 0xf8, 0xc, 0x88, 0xd8, 0x21, 0x30, 0xf, 0x74, 0x29, 0xf4, 0x4, 0xb4, 0xd1, 0xf7, 0x8b, 0x5f, 0x80, 0xbd, 0x40, 0xdf, 0x9, 0x4b, 0x88, 0x7e, 0xc0, 0x3a, 0xb0, 0x10, 0x68, 0x82, 0x9e, 0xd8, 0xde, 0x0, 0xa1, 0x3b, 0xe4, 0xa8, 0x44, 0xd8, 0xd7, 0x91, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)apple_icon3x_png { - return [NSData dataWithBytes:apple_icon3x_png length:sizeof(apple_icon3x_png)]; - } - - static const unsigned char parse_logo_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0xde, 0x0, 0x0, 0x0, 0x44, 0x8, 0x6, 0x0, 0x0, 0x0, 0xee, 0x9a, 0x8b, 0x92, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x35, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x36, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x31, 0x30, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x37, 0x44, 0x43, 0x37, 0x45, 0x43, 0x42, 0x34, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xf6, 0xc4, 0x10, 0x9d, 0x0, 0x0, 0x11, 0x8e, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x5d, 0x9, 0x98, 0x54, 0xc5, 0x11, 0xae, 0xdd, 0x9d, 0x5, 0x59, 0x90, 0x9b, 0x5, 0xb9, 0x5, 0x11, 0xf0, 0x2, 0x14, 0x54, 0x54, 0x22, 0x6e, 0x44, 0x3c, 0x50, 0xbc, 0x95, 0xc3, 0x88, 0x9, 0x41, 0x3c, 0x21, 0x1e, 0x68, 0x30, 0x11, 0x8f, 0x18, 0x3c, 0x51, 0x14, 0x13, 0x94, 0x28, 0x26, 0x9e, 0x78, 0x44, 0x12, 0x15, 0x25, 0xe0, 0x89, 0x8a, 0x28, 0x88, 0xa0, 0xe2, 0xe2, 0x2, 0x72, 0xca, 0xd, 0xcb, 0xd, 0x7b, 0xb0, 0xe9, 0xdf, 0xf7, 0xf7, 0x37, 0x9d, 0x9, 0xc8, 0xcc, 0xce, 0x3b, 0xe6, 0x3d, 0xba, 0xbe, 0xaf, 0xbe, 0xe9, 0xd9, 0x9d, 0x79, 0xd3, 0xaf, 0xbb, 0xff, 0xea, 0xaa, 0xea, 0xaa, 0x7a, 0x59, 0xfd, 0xae, 0xbd, 0xe5, 0x55, 0x11, 0x69, 0xa3, 0xb8, 0x5c, 0xfc, 0xa1, 0x2c, 0xc5, 0x6b, 0x15, 0x17, 0x2a, 0xfe, 0x54, 0xf1, 0xc7, 0x8a, 0x97, 0x8b, 0x25, 0x4b, 0x11, 0xa5, 0x8a, 0x8a, 0xa, 0xc5, 0x22, 0xf7, 0xe, 0x1f, 0x2a, 0xcd, 0x9b, 0x1c, 0xf4, 0xd3, 0xdf, 0x62, 0x8a, 0x4f, 0x52, 0xdc, 0x30, 0x80, 0xfe, 0xf4, 0x50, 0x7c, 0x9d, 0xe2, 0x95, 0x8a, 0xa7, 0x29, 0xfe, 0x87, 0xe2, 0xc9, 0x8a, 0xcb, 0xec, 0x54, 0x59, 0x8a, 0x3a, 0x1, 0x78, 0xbb, 0xd9, 0xde, 0xaa, 0x78, 0x1, 0x77, 0x24, 0xcf, 0xc0, 0xaf, 0xb8, 0x8a, 0xe2, 0x3a, 0x8a, 0x1b, 0xf0, 0xf7, 0x21, 0x2, 0x2e, 0x26, 0xcf, 0x54, 0x7c, 0xa7, 0xe2, 0x37, 0xed, 0xd4, 0x58, 0x8a, 0x3a, 0xf0, 0x34, 0xcd, 0x50, 0x7c, 0xaa, 0x4f, 0xbf, 0x59, 0x53, 0x71, 0x63, 0xc5, 0xc7, 0x2a, 0x3e, 0x9b, 0xbb, 0x5f, 0x75, 0xc5, 0x9d, 0x15, 0xbf, 0xa1, 0x78, 0x82, 0xe2, 0x6b, 0x15, 0xaf, 0xb3, 0x53, 0x64, 0x29, 0x8a, 0x94, 0x9d, 0x60, 0x7b, 0xf9, 0x41, 0x50, 0x25, 0x37, 0x28, 0xfe, 0x46, 0xf1, 0xd3, 0x8a, 0xcf, 0x53, 0xdc, 0x41, 0xf1, 0x63, 0x8a, 0x77, 0xf2, 0x33, 0x97, 0xd0, 0xfe, 0xeb, 0x64, 0xa7, 0xc8, 0x52, 0xd4, 0x81, 0x17, 0x24, 0x2d, 0x54, 0x7c, 0xbd, 0xe2, 0xe3, 0x15, 0x4f, 0xe7, 0xdf, 0xe0, 0xf0, 0x79, 0x57, 0x71, 0x81, 0x9d, 0x26, 0x4b, 0x16, 0x78, 0xde, 0xd2, 0x1c, 0xc5, 0xa7, 0x28, 0xfe, 0x2b, 0xdf, 0xc3, 0x16, 0x7c, 0x4d, 0xf1, 0x71, 0x76, 0xaa, 0x2c, 0x59, 0xe0, 0x79, 0x4b, 0xbb, 0x14, 0x5f, 0xad, 0xf8, 0x76, 0xbe, 0xaf, 0xad, 0xf8, 0x45, 0xc5, 0xcd, 0xec, 0x74, 0x59, 0xb2, 0xc0, 0xf3, 0x9e, 0xee, 0x56, 0xfc, 0x0, 0xdb, 0x7, 0x2b, 0xfe, 0x8b, 0x8f, 0x76, 0xa8, 0x25, 0x4b, 0xfb, 0x2d, 0xf0, 0x40, 0xb7, 0x88, 0xe3, 0xe5, 0x4, 0xf5, 0x52, 0x7c, 0xa5, 0x9d, 0x32, 0x4b, 0x16, 0x78, 0xde, 0x13, 0xce, 0xfd, 0xe0, 0x74, 0x59, 0xc5, 0xf7, 0xb7, 0x29, 0xce, 0xb7, 0xd3, 0x66, 0xc9, 0x2, 0xcf, 0x7b, 0x5a, 0xac, 0x78, 0x4, 0xdb, 0x4d, 0xc5, 0x89, 0x76, 0xb1, 0x64, 0xc9, 0x2, 0xcf, 0x7, 0x7a, 0x46, 0xf1, 0x6c, 0xb6, 0x2f, 0x57, 0x5c, 0xd7, 0x4e, 0x9d, 0x25, 0xb, 0x3c, 0xef, 0xa9, 0x44, 0xf1, 0xe3, 0x6c, 0xc3, 0xbb, 0xd9, 0xdb, 0x4e, 0x9d, 0x25, 0xb, 0x3c, 0x7f, 0x68, 0xa2, 0x38, 0x1, 0xd5, 0xa0, 0xf3, 0xec, 0xd4, 0x59, 0xb2, 0xc0, 0xf3, 0x87, 0xd6, 0x2b, 0x7e, 0x8f, 0x6d, 0x44, 0xb8, 0x34, 0xb0, 0xd3, 0x67, 0xc9, 0x2, 0xcf, 0x1f, 0xd2, 0xc0, 0x3, 0xe8, 0xe, 0xb7, 0xd3, 0x67, 0x29, 0xac, 0x14, 0xb, 0x59, 0x7f, 0xbf, 0x34, 0xda, 0x0, 0xde, 0x7, 0x2e, 0x5f, 0x1f, 0x7, 0xf4, 0x4d, 0x79, 0xed, 0x76, 0x8a, 0x9b, 0x28, 0xce, 0x13, 0xe7, 0x58, 0x3, 0xb4, 0x51, 0xf1, 0xf, 0x8a, 0xe7, 0x8b, 0x93, 0xc8, 0xbb, 0xde, 0xa7, 0xfb, 0x46, 0xbf, 0xaa, 0x89, 0x93, 0xac, 0xbc, 0xcb, 0xa5, 0x6b, 0xe6, 0x48, 0xfa, 0xc9, 0xcf, 0xb8, 0x46, 0x73, 0xc5, 0x6d, 0xc5, 0x9, 0x72, 0x40, 0xc6, 0x49, 0x9d, 0x84, 0xcf, 0x14, 0x8b, 0x73, 0x1c, 0xb4, 0x48, 0x9c, 0xb4, 0xb3, 0x25, 0x2e, 0xde, 0x83, 0x9b, 0x73, 0xde, 0x8e, 0xf7, 0x1, 0x1f, 0x42, 0xd, 0xce, 0x39, 0xfe, 0xb7, 0x59, 0x9c, 0x44, 0xed, 0x22, 0xc5, 0xf3, 0x14, 0xaf, 0x30, 0xd6, 0xc3, 0x7e, 0x3, 0xbc, 0x95, 0x5c, 0xec, 0xf5, 0x14, 0xb7, 0x76, 0x71, 0xd7, 0xef, 0x48, 0xbb, 0xb1, 0xa7, 0xe2, 0xf6, 0x1c, 0xf8, 0x7d, 0x11, 0xb2, 0xe8, 0x91, 0x41, 0xf1, 0x8a, 0x38, 0x87, 0xfc, 0x9b, 0x3d, 0xbc, 0xef, 0x2b, 0x14, 0xdf, 0x27, 0xce, 0xd1, 0xca, 0x99, 0xfc, 0xed, 0x64, 0xa9, 0x85, 0xe2, 0x13, 0x15, 0x1f, 0xa3, 0xb8, 0x15, 0xb5, 0x85, 0xfa, 0x4, 0xc1, 0xf9, 0xe2, 0x38, 0xae, 0x52, 0x5, 0xdb, 0x9, 0x8a, 0x2f, 0x54, 0xdc, 0x5d, 0x9c, 0x60, 0xf6, 0x6a, 0x49, 0x7e, 0xb7, 0x84, 0xc0, 0xfb, 0x94, 0x36, 0xfb, 0x54, 0x71, 0xf2, 0x40, 0x83, 0xa0, 0xc3, 0x14, 0x5f, 0xa4, 0xf8, 0x74, 0xc5, 0x47, 0x24, 0x39, 0xe7, 0x5b, 0x8, 0xbe, 0x77, 0x14, 0xa3, 0x72, 0xc3, 0x37, 0xfb, 0xb, 0xf0, 0x70, 0xe3, 0x1b, 0x8, 0xbc, 0xfa, 0x69, 0x5e, 0xb, 0x3, 0x8d, 0xe4, 0xdb, 0xdf, 0x8a, 0x13, 0x84, 0x9d, 0x18, 0x8e, 0xb6, 0x9b, 0xd2, 0x7a, 0x13, 0x77, 0x6, 0xec, 0x7c, 0xb5, 0xf9, 0xaa, 0xd5, 0xdd, 0xde, 0x64, 0x2c, 0xa6, 0x87, 0x14, 0x8f, 0x93, 0x78, 0x6a, 0x93, 0x9b, 0xd4, 0x8a, 0xf7, 0x8b, 0x9c, 0xc5, 0x9a, 0x49, 0x0, 0xf, 0xf3, 0x8a, 0x3c, 0xc7, 0x41, 0x8a, 0xbb, 0xf1, 0x7b, 0x89, 0x54, 0x93, 0x80, 0x29, 0x49, 0x41, 0x40, 0x61, 0xbc, 0x6e, 0x56, 0x7c, 0xf4, 0x1e, 0xfe, 0x5f, 0xc6, 0xb1, 0xda, 0xc6, 0x6b, 0x66, 0xf1, 0x77, 0x6b, 0x19, 0xc0, 0xac, 0x42, 0xa0, 0x82, 0x2f, 0xe7, 0xb8, 0x3d, 0x25, 0x4e, 0x38, 0xa0, 0x5f, 0xda, 0x43, 0x77, 0xde, 0xc3, 0xa9, 0xec, 0x8f, 0x49, 0x15, 0x9c, 0x73, 0x8, 0xd1, 0x52, 0xc5, 0xb9, 0x8a, 0xf, 0xe4, 0x3d, 0xe4, 0xb0, 0x7d, 0x1c, 0xf9, 0x36, 0x9a, 0x3e, 0xf, 0x13, 0x88, 0x91, 0x6, 0xde, 0xe, 0x4e, 0xac, 0x96, 0xbc, 0x95, 0x5, 0xdc, 0x60, 0x71, 0x12, 0x6d, 0x5b, 0x24, 0x0, 0xed, 0x3b, 0xc5, 0x1f, 0x2a, 0xfe, 0x84, 0xd2, 0x6c, 0xd, 0x25, 0x72, 0x39, 0x17, 0x4f, 0x4d, 0xaa, 0x56, 0x5d, 0xc4, 0x49, 0xde, 0xfd, 0x5, 0xff, 0x8e, 0xeb, 0x3c, 0xca, 0x9d, 0x69, 0x60, 0x82, 0x4a, 0xec, 0x6, 0x95, 0x1b, 0xb, 0x63, 0x5f, 0x6a, 0xe, 0x42, 0xeb, 0xee, 0x92, 0x3d, 0xe7, 0x32, 0x6e, 0xa5, 0xd6, 0xa0, 0xf3, 0x21, 0x93, 0x15, 0x12, 0x87, 0x2a, 0x1e, 0x2b, 0x4e, 0xe6, 0x88, 0x79, 0xad, 0x4f, 0xa9, 0xee, 0xcf, 0xe6, 0x6e, 0xac, 0x81, 0x57, 0x4a, 0xe0, 0xe5, 0x71, 0xb1, 0xe6, 0x73, 0x87, 0x41, 0xa2, 0xf3, 0x49, 0x6c, 0xc7, 0x38, 0x6e, 0xe8, 0x2b, 0x42, 0x1, 0x6f, 0x55, 0xfc, 0x9c, 0x87, 0x6b, 0x7, 0xf7, 0x70, 0xbf, 0xfc, 0xff, 0x51, 0xd4, 0x7c, 0x2, 0x8, 0x73, 0xfe, 0xad, 0x31, 0xe7, 0xa5, 0xec, 0x63, 0xd, 0xa, 0x7a, 0x7c, 0xbf, 0xab, 0x38, 0x69, 0x6a, 0x1d, 0xf8, 0xbf, 0xd3, 0xc8, 0x28, 0x59, 0x82, 0xf0, 0xc6, 0x39, 0x51, 0x5, 0x5e, 0x2e, 0x59, 0x24, 0xf5, 0x80, 0x69, 0x48, 0xec, 0x3e, 0xe2, 0x94, 0x96, 0x30, 0xd5, 0xd4, 0xd5, 0x8a, 0x5f, 0xe6, 0xa4, 0x7f, 0x29, 0x7b, 0xaf, 0xf9, 0xb2, 0x83, 0xb, 0x16, 0xb, 0xec, 0x23, 0xee, 0x70, 0x87, 0x28, 0xbe, 0x8a, 0xbb, 0xe6, 0x81, 0x5c, 0xec, 0xd3, 0x8, 0xbe, 0x17, 0x7d, 0x1e, 0x9b, 0x7c, 0x4a, 0xdf, 0xbe, 0x9, 0x7f, 0x2f, 0xa2, 0x2a, 0x3c, 0x85, 0x6a, 0xd2, 0xaa, 0x14, 0xd5, 0xcb, 0xd3, 0x39, 0x36, 0xf5, 0xf8, 0x7e, 0xa9, 0xe2, 0x31, 0x8a, 0x5f, 0x52, 0xbc, 0x6c, 0x1f, 0xdf, 0xdd, 0x2e, 0x4e, 0x15, 0x1, 0xd8, 0xc5, 0xa8, 0x70, 0x30, 0x9e, 0x2, 0xf3, 0x8, 0xf6, 0x73, 0x0, 0xfb, 0xd, 0x5b, 0xfa, 0x59, 0xaa, 0xb0, 0x43, 0xb8, 0xe8, 0xdd, 0xa4, 0x6b, 0x14, 0x8f, 0xe4, 0x1c, 0x9, 0x6d, 0xcc, 0x7f, 0x29, 0x7e, 0x42, 0x9c, 0x62, 0x5b, 0x25, 0xfb, 0xd0, 0xb2, 0x56, 0x52, 0x50, 0xfd, 0x93, 0xeb, 0xa8, 0x13, 0x85, 0x6c, 0x7f, 0xee, 0x86, 0x3d, 0xb9, 0x93, 0xde, 0x45, 0x93, 0xa0, 0x3c, 0x99, 0xc5, 0x18, 0x26, 0xca, 0xe3, 0xae, 0x23, 0x29, 0xda, 0x6, 0x47, 0x71, 0xe1, 0x3d, 0x67, 0x80, 0xe, 0x8b, 0x61, 0x28, 0xa5, 0x2f, 0xe2, 0x41, 0x3f, 0x97, 0xd4, 0xb, 0x2d, 0xc1, 0x4e, 0xba, 0x91, 0x92, 0x7c, 0xaa, 0xd1, 0x47, 0x2c, 0xa2, 0x5f, 0xf9, 0x38, 0x2e, 0x28, 0xa1, 0x31, 0x3d, 0x1, 0x74, 0xef, 0x2b, 0x3e, 0x47, 0xf1, 0x91, 0xec, 0xe3, 0x3b, 0x4, 0x4d, 0x2a, 0xa0, 0xc3, 0xae, 0xfe, 0xba, 0x1, 0xba, 0xd1, 0x1c, 0xcb, 0x7, 0x92, 0x0, 0xdd, 0xcf, 0xed, 0xde, 0x73, 0xb8, 0x43, 0x1c, 0xce, 0x5d, 0x48, 0xef, 0xbc, 0x57, 0x11, 0x9c, 0x6e, 0xd1, 0x1, 0xbc, 0xde, 0x18, 0x3, 0x74, 0x93, 0x38, 0x5e, 0x97, 0x70, 0xa7, 0x4b, 0xd5, 0xc6, 0x85, 0x66, 0x34, 0x8b, 0x1a, 0x13, 0xc6, 0xe2, 0x6f, 0xbc, 0xa7, 0xaa, 0x8a, 0xef, 0x21, 0xa0, 0xeb, 0x45, 0xd, 0x78, 0xb5, 0xc, 0xdb, 0x6e, 0x65, 0x92, 0xdf, 0x19, 0x46, 0x69, 0x5b, 0x60, 0x78, 0x26, 0x87, 0x53, 0x5d, 0x18, 0xcd, 0x5d, 0x2c, 0x5d, 0xfa, 0x9e, 0x52, 0xef, 0x21, 0x43, 0xd, 0x1e, 0xc7, 0x85, 0xeb, 0x35, 0x9d, 0x45, 0xd0, 0xb7, 0xe2, 0xfb, 0xc5, 0x74, 0x1a, 0x14, 0x70, 0xa7, 0xab, 0xac, 0x7, 0xb1, 0xa5, 0x38, 0xa1, 0x7a, 0x7, 0x70, 0x61, 0x5d, 0x41, 0x41, 0xb5, 0xc9, 0xc5, 0xbe, 0xaf, 0x23, 0x0, 0x7b, 0x48, 0xbc, 0xc4, 0x63, 0x3f, 0x89, 0xe7, 0x62, 0xa6, 0x43, 0x75, 0x79, 0xff, 0x3, 0xf8, 0xbe, 0x98, 0xf7, 0x80, 0xf1, 0x9a, 0xeb, 0x52, 0xff, 0x97, 0x52, 0xdb, 0x39, 0x8d, 0x42, 0x58, 0xcf, 0x7, 0x2a, 0x27, 0x34, 0x8b, 0x12, 0xf0, 0xe, 0x31, 0xc, 0xf5, 0xc2, 0x24, 0xbf, 0x53, 0xc0, 0xc5, 0x23, 0x54, 0x8f, 0x3a, 0x50, 0xed, 0xd8, 0xe2, 0x72, 0xdf, 0x20, 0x9, 0x6f, 0x12, 0x27, 0x8f, 0x50, 0x3b, 0x12, 0x9e, 0x10, 0x6f, 0xb3, 0x29, 0xe0, 0xe1, 0x7c, 0xcd, 0x90, 0xe6, 0x13, 0xe8, 0xbd, 0x7c, 0xd5, 0x85, 0x6b, 0x63, 0x8c, 0x1a, 0x1b, 0x3b, 0xd1, 0x33, 0x1e, 0xde, 0xc7, 0xc7, 0x54, 0x69, 0x7f, 0xe4, 0xfb, 0x6b, 0xd3, 0x1c, 0xb7, 0xea, 0x1c, 0x17, 0x5d, 0xbc, 0xeb, 0x3b, 0xda, 0xe3, 0x5e, 0xdd, 0x3, 0x76, 0xce, 0xe3, 0xd, 0x27, 0x4b, 0x7, 0xee, 0xac, 0xcd, 0xa2, 0x2, 0xbc, 0x2e, 0x86, 0x93, 0x21, 0x59, 0xe0, 0x5d, 0x47, 0xd5, 0xa0, 0x2f, 0x6d, 0xbc, 0x65, 0x1e, 0xf7, 0x11, 0xd2, 0xfa, 0x79, 0xb6, 0xf, 0xa6, 0xde, 0xef, 0x5, 0x75, 0xa5, 0x1d, 0x59, 0x95, 0xef, 0x1, 0xf8, 0x4b, 0x5d, 0xda, 0xc1, 0xbb, 0xf2, 0x5a, 0xa0, 0x17, 0xb8, 0x7b, 0x7b, 0x4d, 0xdf, 0xd2, 0x16, 0x9b, 0xc4, 0xdf, 0x5e, 0x53, 0xc9, 0xeb, 0xc0, 0xf6, 0xff, 0x3b, 0x6d, 0x2e, 0xe1, 0xdc, 0x43, 0xf8, 0x7e, 0xed, 0x71, 0xff, 0xd7, 0xd3, 0x71, 0xf3, 0x2c, 0xdf, 0x1f, 0x41, 0xb5, 0xb3, 0x6e, 0x14, 0x80, 0x57, 0x60, 0xa8, 0x53, 0xf3, 0x93, 0xfc, 0x4e, 0x11, 0x8d, 0x76, 0x3f, 0x9d, 0x1d, 0x37, 0xb0, 0x8f, 0x42, 0xf5, 0xe6, 0x28, 0x17, 0xaf, 0xd, 0x9b, 0xa4, 0xe, 0x17, 0x97, 0xb6, 0x77, 0x87, 0xbb, 0xa4, 0x9e, 0x69, 0xea, 0x6f, 0x38, 0x21, 0xee, 0xf5, 0x71, 0xdc, 0x26, 0x52, 0x55, 0x7b, 0x2f, 0x8d, 0x6b, 0xdc, 0xa1, 0xf8, 0x2, 0xb6, 0xe1, 0x10, 0xe9, 0x25, 0xf1, 0x7c, 0x4e, 0xaf, 0x9, 0x73, 0xf3, 0x6b, 0xee, 0xb6, 0x42, 0x27, 0xcc, 0x38, 0xd9, 0x83, 0x23, 0x30, 0x4c, 0xc0, 0x6b, 0xc5, 0xed, 0x5c, 0xab, 0x26, 0xdb, 0x53, 0x1c, 0x10, 0x3f, 0x69, 0x4d, 0x82, 0xca, 0x39, 0xd8, 0x45, 0x75, 0x16, 0x93, 0x88, 0xa3, 0x8b, 0x36, 0xfc, 0xdb, 0xa3, 0x54, 0xb, 0xdd, 0xa2, 0xaa, 0x86, 0x8a, 0xf6, 0xae, 0xf, 0x3b, 0x85, 0x9b, 0x84, 0x7e, 0xff, 0x91, 0xed, 0xb5, 0xdc, 0x39, 0x57, 0xf9, 0xdc, 0x87, 0x32, 0xa, 0xdb, 0xcf, 0xf9, 0xfe, 0x7c, 0x9a, 0x20, 0xa1, 0x5, 0xde, 0x25, 0x86, 0x2d, 0xf3, 0x6a, 0x8, 0xfa, 0xfb, 0x3c, 0xd5, 0x27, 0x10, 0xa2, 0x62, 0xdc, 0x8, 0xea, 0xde, 0x4e, 0x67, 0x41, 0x7f, 0x3, 0x18, 0x37, 0xb9, 0xdc, 0xef, 0x36, 0x74, 0xac, 0x80, 0xa6, 0x84, 0x68, 0x7d, 0xc0, 0xae, 0x7b, 0xd0, 0xd8, 0x5d, 0xae, 0x37, 0xc6, 0xdf, 0x6f, 0xda, 0x42, 0xa7, 0x4b, 0x31, 0xdf, 0x23, 0x91, 0xfb, 0xc8, 0x30, 0x2, 0xaf, 0x16, 0x6f, 0x44, 0x1b, 0xca, 0x53, 0x43, 0xd0, 0x67, 0xa8, 0x69, 0xfa, 0x40, 0xb8, 0x11, 0x8d, 0xfb, 0x74, 0xa9, 0xb6, 0x1, 0xb4, 0x62, 0xda, 0xaf, 0x6e, 0x9f, 0x79, 0x35, 0x93, 0x78, 0x44, 0x47, 0x61, 0x88, 0x80, 0x77, 0x3d, 0x9d, 0x1a, 0x42, 0x35, 0xfc, 0xa5, 0x80, 0xfb, 0x33, 0x57, 0xe2, 0x95, 0x13, 0xaa, 0x1b, 0x1a, 0x50, 0xa8, 0x80, 0x37, 0x88, 0x8e, 0xa, 0xa1, 0xce, 0xbc, 0x3d, 0x24, 0xfd, 0x7e, 0xc3, 0x0, 0x86, 0x1b, 0xe5, 0xf1, 0xab, 0x18, 0x76, 0xdd, 0x83, 0x14, 0x42, 0x6e, 0x53, 0xbe, 0xa1, 0xd6, 0xae, 0x9, 0xc9, 0x38, 0xe7, 0xd3, 0x31, 0x3, 0xc2, 0x11, 0xc5, 0x9d, 0x19, 0xd2, 0x2f, 0xd4, 0x87, 0x9d, 0x9e, 0x95, 0x95, 0x25, 0x25, 0xa5, 0x25, 0xbd, 0x67, 0xcd, 0x9d, 0xd7, 0x23, 0x4c, 0xc0, 0x83, 0xea, 0x73, 0x2b, 0xdb, 0x70, 0xa8, 0x3c, 0x1d, 0x22, 0x29, 0x5c, 0x28, 0xf1, 0x40, 0x5a, 0x37, 0xcb, 0xd1, 0xc3, 0x61, 0x34, 0xc6, 0xa3, 0x3e, 0xe7, 0x26, 0xd8, 0x94, 0x61, 0x20, 0xa8, 0xdf, 0x4d, 0xd8, 0x7e, 0x52, 0x9c, 0xe0, 0x88, 0x4c, 0x20, 0x8, 0xdd, 0x3f, 0xa1, 0x11, 0x8b, 0xc5, 0x64, 0xf2, 0x87, 0x9f, 0xdc, 0xb0, 0x79, 0xeb, 0xb6, 0x50, 0x0, 0x2f, 0xc6, 0x5, 0xa6, 0x5d, 0xb2, 0x77, 0x88, 0xbb, 0x7, 0xb8, 0x5e, 0x53, 0xb9, 0x1, 0x3c, 0x44, 0xcc, 0xd4, 0x71, 0xe9, 0xba, 0xe3, 0x3c, 0x1c, 0x87, 0x5d, 0x86, 0x50, 0xae, 0x1f, 0x82, 0x31, 0xc6, 0x19, 0xad, 0x8e, 0x12, 0x82, 0x4b, 0x7f, 0x6c, 0x86, 0xf5, 0xef, 0x6d, 0xc5, 0x1f, 0xc7, 0x72, 0x72, 0x64, 0xed, 0xfa, 0x8d, 0xa7, 0x7d, 0x53, 0x58, 0x74, 0x6c, 0x18, 0x80, 0x37, 0x4a, 0x9c, 0xa8, 0x0, 0xd0, 0xb, 0x19, 0xa0, 0xb7, 0x57, 0x86, 0xb4, 0x81, 0xf, 0xc7, 0x90, 0x1b, 0xcf, 0x21, 0x5c, 0xc7, 0xb1, 0xf0, 0x8a, 0x4c, 0x2f, 0x60, 0xdb, 0x10, 0x8c, 0x2f, 0x82, 0xae, 0x75, 0x52, 0x34, 0xdc, 0xf8, 0xcb, 0x32, 0xac, 0x7f, 0x38, 0x73, 0x46, 0x58, 0x99, 0x28, 0x95, 0x33, 0x7b, 0xea, 0xb4, 0xe9, 0x7d, 0x32, 0x1d, 0x78, 0xa3, 0x24, 0x5e, 0xca, 0xf, 0xbb, 0xc6, 0x10, 0x9, 0x27, 0xad, 0xe0, 0x2b, 0xdc, 0xf4, 0xf5, 0x5c, 0xb8, 0xde, 0x5b, 0xc6, 0x35, 0xbd, 0x20, 0x84, 0xbf, 0xe9, 0x38, 0xd8, 0x30, 0x14, 0x95, 0x3a, 0xc7, 0x68, 0x4f, 0xc8, 0xd0, 0x3e, 0x22, 0x28, 0x60, 0x75, 0x95, 0xdc, 0x5c, 0x59, 0xb8, 0x64, 0xf9, 0x99, 0xab, 0xd6, 0xac, 0xab, 0x96, 0x89, 0xc0, 0x83, 0xf3, 0x0, 0xae, 0xf8, 0xdf, 0xf1, 0x3d, 0x62, 0x32, 0x2f, 0x95, 0xf0, 0x3e, 0x2b, 0xaf, 0x38, 0xc1, 0x39, 0x92, 0x2e, 0xbd, 0xee, 0x71, 0x7f, 0x91, 0x23, 0x37, 0x83, 0x6d, 0x38, 0x3, 0x2e, 0xc8, 0xe0, 0xb1, 0xc5, 0xfa, 0x3d, 0x99, 0x6d, 0xc4, 0x4a, 0x7e, 0x96, 0xa1, 0xfd, 0xc4, 0x99, 0xe2, 0xfb, 0xd9, 0xd9, 0x59, 0xb2, 0x7d, 0xc7, 0xce, 0x43, 0x7f, 0x58, 0xbe, 0xa2, 0x63, 0xa6, 0x1, 0xf, 0x51, 0xb, 0x38, 0x78, 0xec, 0x6b, 0x2c, 0x82, 0xb3, 0x24, 0xb8, 0xf3, 0x18, 0xb7, 0x54, 0xd, 0x31, 0xd4, 0xcd, 0x74, 0x68, 0x87, 0xa4, 0x91, 0xf5, 0x9c, 0x2, 0x99, 0x8e, 0x1b, 0xa8, 0x49, 0xa7, 0x66, 0xe8, 0xd8, 0x1e, 0x4a, 0x6, 0x21, 0x9f, 0x2e, 0x93, 0xbd, 0xdd, 0x3f, 0x1d, 0x81, 0xed, 0x2e, 0x2f, 0x97, 0xa2, 0x45, 0x4b, 0x4e, 0x34, 0x81, 0x17, 0x94, 0x7, 0xb, 0x6, 0x3c, 0xe, 0xc7, 0x91, 0xc6, 0xf2, 0xa6, 0x61, 0x57, 0x20, 0xaf, 0xd, 0x67, 0x5f, 0xb3, 0x25, 0xdc, 0x94, 0xe5, 0x32, 0x88, 0xfd, 0x98, 0xa7, 0x89, 0xda, 0x2e, 0x11, 0xe7, 0xec, 0x10, 0xf3, 0x32, 0x52, 0x32, 0xcf, 0xd9, 0xd2, 0x56, 0xe2, 0x1, 0xf0, 0x9f, 0x64, 0xf8, 0x3a, 0xc0, 0x6e, 0x5c, 0x1e, 0xcb, 0x8d, 0xc9, 0xf7, 0xb, 0x17, 0x77, 0x36, 0x13, 0x61, 0x71, 0x70, 0x8a, 0x4c, 0xe0, 0x1c, 0xf1, 0xfe, 0x39, 0xe8, 0x31, 0xfe, 0x1e, 0xe, 0x3c, 0x3b, 0x25, 0x4c, 0x28, 0xec, 0x8b, 0xfb, 0xc9, 0x41, 0x14, 0xc5, 0xc1, 0xfd, 0xd7, 0xa2, 0xca, 0x8b, 0x7e, 0x9a, 0x45, 0x86, 0xf0, 0xa, 0x7f, 0x30, 0x22, 0x13, 0x76, 0x46, 0x0, 0xc8, 0x3f, 0x47, 0xd7, 0xf1, 0xde, 0xfb, 0xd1, 0x3e, 0xc5, 0x91, 0xe, 0x12, 0x7c, 0x91, 0x34, 0x8c, 0xb8, 0xd7, 0x2f, 0x24, 0xf8, 0xa2, 0x45, 0x87, 0x19, 0xed, 0x4c, 0xf, 0x6d, 0x5b, 0xac, 0x78, 0x69, 0x4e, 0x76, 0xf6, 0xc1, 0xc5, 0x9b, 0xb7, 0xb4, 0x8f, 0x25, 0x48, 0x8f, 0x20, 0x5d, 0xb1, 0xc8, 0x93, 0x7b, 0x89, 0x4e, 0x95, 0x5, 0x3e, 0xfe, 0x2e, 0x4a, 0x39, 0x20, 0x6, 0x14, 0xe9, 0x34, 0x8, 0xeb, 0x69, 0x41, 0x29, 0xaf, 0x81, 0x57, 0x95, 0xbb, 0x4c, 0x49, 0x2, 0xf0, 0x60, 0xbb, 0x21, 0x87, 0xc, 0x67, 0x46, 0x85, 0x64, 0x9c, 0xaf, 0xad, 0x12, 0x17, 0xaa, 0x50, 0x65, 0x0, 0x41, 0xb0, 0xf4, 0xa7, 0x26, 0x82, 0xb3, 0xa8, 0x46, 0x14, 0x90, 0x57, 0x93, 0x8b, 0xf8, 0xbf, 0xa9, 0x4, 0xe1, 0xd2, 0x0, 0xb4, 0xa6, 0xa6, 0x7c, 0x45, 0x8d, 0x94, 0x65, 0x19, 0x3e, 0x9e, 0x58, 0x37, 0x4b, 0xb3, 0x15, 0xf0, 0x36, 0x14, 0x6f, 0x6a, 0x10, 0x54, 0xe9, 0x87, 0x32, 0xe, 0x16, 0xca, 0x2e, 0x7c, 0x25, 0x4e, 0x1e, 0xd3, 0x64, 0xbe, 0xf7, 0x83, 0xb0, 0x88, 0x2e, 0xa4, 0xe3, 0x0, 0xe7, 0x2a, 0x79, 0x49, 0xec, 0x82, 0x3a, 0xf, 0x10, 0x35, 0x38, 0xf4, 0xb1, 0x40, 0xe7, 0x84, 0xcf, 0x6d, 0xe2, 0x82, 0x9c, 0xce, 0x45, 0xf9, 0x1f, 0x9, 0xcf, 0x21, 0xf4, 0xde, 0xe8, 0x29, 0xaa, 0x9e, 0x38, 0x2b, 0x1b, 0x40, 0xe1, 0x84, 0x5d, 0x57, 0x17, 0x2d, 0x1a, 0x44, 0xdb, 0xea, 0x3b, 0xaa, 0x53, 0xa8, 0xc3, 0x32, 0x93, 0x2, 0xa9, 0xd4, 0xe3, 0xbe, 0x69, 0x2f, 0xb1, 0xae, 0x3e, 0x97, 0xe9, 0x84, 0x0, 0x90, 0x93, 0x15, 0xf8, 0x6a, 0x99, 0xc0, 0x83, 0x53, 0xe3, 0xa, 0x4a, 0x79, 0x2f, 0xd5, 0x99, 0x2c, 0x4a, 0x53, 0xec, 0x18, 0xeb, 0x24, 0xf5, 0x72, 0xb, 0xe9, 0x4a, 0xc8, 0x61, 0x94, 0xe4, 0x7b, 0xaa, 0xff, 0x8, 0x75, 0x60, 0x11, 0xa5, 0xe7, 0x7a, 0xee, 0xc2, 0x15, 0x46, 0xbf, 0xb5, 0xa, 0xa, 0xc9, 0x7f, 0x10, 0xd5, 0xe5, 0x46, 0x5c, 0x0, 0xfa, 0xff, 0x9d, 0xc9, 0x50, 0xd5, 0x10, 0x72, 0xf5, 0x63, 0x4, 0x76, 0x3f, 0x8c, 0x5, 0xea, 0xb9, 0x3c, 0x46, 0xcd, 0x0, 0xa9, 0x36, 0x3d, 0x8, 0xc2, 0x3c, 0xf2, 0x31, 0xe4, 0x6b, 0xa8, 0x1d, 0x2c, 0x22, 0x0, 0x3f, 0xa2, 0x20, 0x2a, 0xf2, 0x40, 0x35, 0xad, 0xcd, 0x57, 0x8c, 0xfb, 0xef, 0x25, 0x9e, 0xbd, 0x91, 0xa9, 0x1a, 0x84, 0x3e, 0x6f, 0xcc, 0x33, 0x81, 0xa7, 0x6b, 0x6, 0x46, 0x91, 0x30, 0x19, 0x57, 0x51, 0x65, 0x32, 0x1, 0x57, 0x48, 0xc7, 0xc1, 0x14, 0xda, 0x8, 0xab, 0x53, 0xdc, 0xa1, 0x72, 0x8, 0xba, 0xe6, 0x5c, 0x84, 0xd8, 0x3d, 0x91, 0xfb, 0x87, 0xe2, 0xa8, 0x38, 0x3a, 0xc8, 0x97, 0x68, 0x3d, 0xcf, 0xf, 0x42, 0x72, 0x6, 0x79, 0x4, 0x5, 0xf, 0x92, 0x66, 0x4f, 0xa4, 0xba, 0xde, 0x8e, 0x1a, 0x41, 0x15, 0xb6, 0xdb, 0x51, 0xc8, 0xe1, 0x7b, 0xb, 0xe9, 0x0, 0x41, 0x24, 0x7, 0x2a, 0xb9, 0xad, 0x75, 0xb1, 0x5f, 0x10, 0x7e, 0xb7, 0x67, 0xfa, 0xe0, 0x55, 0x54, 0xc4, 0x2d, 0x90, 0x58, 0x0, 0x46, 0xbb, 0xdf, 0x4, 0xa9, 0x88, 0xf8, 0x4e, 0xf3, 0x41, 0x27, 0x38, 0xd0, 0x1c, 0x4d, 0x75, 0x30, 0x1d, 0x75, 0xa8, 0x9c, 0xbb, 0xda, 0x1a, 0x4a, 0x77, 0x5d, 0x45, 0xb, 0x2a, 0x18, 0x5c, 0xf0, 0xe7, 0x8a, 0x13, 0x59, 0x51, 0x35, 0x82, 0xe3, 0xa, 0x1, 0xb5, 0x84, 0xc, 0xdb, 0x1c, 0x1e, 0x72, 0xc4, 0x4b, 0x76, 0x24, 0x18, 0x1, 0xc4, 0xa3, 0x28, 0x98, 0x62, 0xf4, 0x21, 0x80, 0x91, 0x28, 0xba, 0x81, 0x63, 0xff, 0x22, 0x81, 0xb8, 0x3d, 0x8d, 0xf1, 0x17, 0xc3, 0xf9, 0x95, 0x15, 0x2, 0xe0, 0xa1, 0x8f, 0xa5, 0x31, 0x89, 0x36, 0x21, 0x7, 0xe, 0x19, 0x2, 0xc7, 0xf1, 0x3d, 0xd4, 0x9d, 0x21, 0x9c, 0x6c, 0xaf, 0xa8, 0xdc, 0x70, 0xb6, 0x8c, 0xa1, 0x5d, 0x34, 0x5e, 0xa2, 0x4f, 0xbb, 0xa9, 0xa2, 0x2f, 0x93, 0xf8, 0xe3, 0xb3, 0xeb, 0x13, 0x88, 0xa8, 0xc7, 0xd9, 0x9d, 0x6d, 0xa8, 0xa5, 0x75, 0x69, 0x5f, 0x5f, 0x40, 0x95, 0x14, 0x51, 0xfc, 0x4f, 0x48, 0xea, 0x75, 0x70, 0x36, 0xf2, 0x15, 0x26, 0x2, 0xa, 0xf8, 0xee, 0x90, 0xca, 0xd7, 0x5b, 0xf5, 0x7c, 0xa7, 0x1b, 0x3a, 0xf0, 0x32, 0x69, 0xd6, 0xb8, 0x51, 0x56, 0x69, 0x59, 0x59, 0xa4, 0x81, 0x57, 0x95, 0x12, 0x55, 0x83, 0xe, 0x35, 0x11, 0x7f, 0x23, 0xff, 0x1b, 0x49, 0xe2, 0x7, 0xad, 0x95, 0xfd, 0x97, 0x60, 0xc3, 0x4f, 0x95, 0x78, 0xfe, 0x24, 0x52, 0xbb, 0x7a, 0x12, 0x70, 0xdd, 0x38, 0x47, 0xa8, 0x2c, 0x80, 0x72, 0x81, 0x57, 0x52, 0x28, 0x4e, 0xaa, 0xc4, 0xd8, 0xd6, 0xe2, 0x2e, 0xba, 0x3a, 0x53, 0x7, 0x2, 0xd8, 0x6b, 0x94, 0x5f, 0x5f, 0xe, 0x6a, 0xe8, 0xe4, 0x43, 0x67, 0x47, 0x78, 0xd2, 0x61, 0x83, 0xfc, 0x92, 0x6d, 0xa8, 0x42, 0x17, 0x5, 0x0, 0xba, 0x28, 0xab, 0xf0, 0x95, 0x21, 0x78, 0x3a, 0xc7, 0xd2, 0x31, 0x83, 0x33, 0xdc, 0x51, 0xc6, 0x9c, 0xa0, 0x82, 0x1c, 0xe2, 0x50, 0xff, 0x90, 0xe2, 0xf5, 0xf4, 0xce, 0xda, 0x38, 0x4c, 0x3, 0x11, 0x55, 0xe0, 0xc1, 0xb6, 0x18, 0xca, 0x36, 0xce, 0x98, 0x6, 0x4a, 0xf8, 0xdd, 0xfa, 0x51, 0x23, 0xb8, 0xd6, 0x6f, 0xe4, 0x5c, 0x99, 0xa5, 0xdb, 0x91, 0xa9, 0x3d, 0x2c, 0xc9, 0x6b, 0x98, 0x89, 0xc0, 0x9d, 0x2c, 0xf0, 0x82, 0x27, 0xd4, 0x65, 0xc4, 0xb9, 0x5b, 0x5, 0x27, 0x71, 0x9b, 0x5d, 0xe7, 0x19, 0x4b, 0xb0, 0x9, 0x2f, 0x93, 0x78, 0x26, 0x8a, 0x6, 0xdf, 0xb1, 0x49, 0x7c, 0xb7, 0xd0, 0xd8, 0x31, 0x4f, 0xb2, 0xc0, 0xb, 0x96, 0x60, 0xb8, 0x9f, 0xc5, 0x36, 0xe, 0xe5, 0x3f, 0xb0, 0x6b, 0x3b, 0x14, 0x4, 0x47, 0x94, 0xae, 0x34, 0x80, 0xe3, 0x88, 0x5b, 0x92, 0x4, 0xed, 0x3c, 0x3, 0x78, 0x79, 0x16, 0x78, 0xc1, 0xaa, 0x99, 0x5a, 0xdf, 0x9f, 0x68, 0xd7, 0x73, 0xa8, 0x8, 0x25, 0xf0, 0x75, 0x59, 0x3c, 0xd8, 0x81, 0x2d, 0x93, 0xf8, 0xce, 0xbb, 0x7c, 0xc5, 0x11, 0x4e, 0x57, 0xb, 0xbc, 0xe0, 0xc8, 0xcc, 0x9a, 0x9e, 0x69, 0xd7, 0x72, 0xa8, 0x8, 0x7, 0xed, 0xcf, 0xb0, 0x8d, 0x14, 0xaa, 0x2e, 0x49, 0x7c, 0xe7, 0xd, 0x89, 0x47, 0x17, 0xf5, 0xb1, 0xc0, 0xb, 0x8e, 0x74, 0x1c, 0x25, 0xb2, 0x1c, 0x36, 0xda, 0xb5, 0x1c, 0x3a, 0x9a, 0x61, 0x0, 0xa9, 0x55, 0x12, 0x9f, 0x87, 0xf3, 0x4c, 0xa7, 0x4, 0x21, 0x48, 0xa2, 0xb9, 0x5, 0x5e, 0x30, 0x94, 0x69, 0xee, 0xfb, 0xa, 0x8b, 0xa5, 0x94, 0x68, 0xa5, 0x21, 0x30, 0x93, 0xb5, 0xd9, 0xc6, 0x1b, 0xf6, 0xfd, 0x95, 0x16, 0x78, 0xc1, 0x90, 0x2e, 0x11, 0x51, 0x4d, 0xd2, 0xcf, 0xf8, 0x76, 0x83, 0x1a, 0x5b, 0x2c, 0xa5, 0x44, 0x8, 0xe1, 0x2b, 0x4f, 0xf1, 0x3b, 0xc8, 0x11, 0xd4, 0x4e, 0x16, 0xc4, 0xe4, 0xb6, 0xb6, 0xc0, 0xf3, 0x9f, 0x16, 0xf3, 0x35, 0x27, 0x49, 0x55, 0xc5, 0x6b, 0xea, 0x65, 0xb1, 0x94, 0x12, 0x21, 0xb6, 0xb6, 0xba, 0x61, 0x2e, 0x24, 0x43, 0xf8, 0xdc, 0x68, 0xb6, 0x11, 0x4, 0x7f, 0x77, 0x86, 0xdc, 0x4b, 0x4d, 0x89, 0x3f, 0xc5, 0xa9, 0x6e, 0xd4, 0x81, 0x87, 0x43, 0xd5, 0x1d, 0x6c, 0x17, 0x4, 0xdc, 0x97, 0x6e, 0x16, 0x78, 0x29, 0x53, 0x2b, 0x43, 0xc5, 0x4c, 0x25, 0x21, 0x7a, 0xbc, 0x61, 0xeb, 0xc1, 0xc9, 0xd2, 0x2f, 0x3, 0xee, 0x5, 0xd1, 0x52, 0x88, 0xc4, 0x41, 0xe8, 0xe2, 0xc5, 0x51, 0x7, 0x1e, 0x82, 0x6e, 0x75, 0x9d, 0x96, 0x33, 0x2, 0x54, 0x37, 0x21, 0xb5, 0x1f, 0x92, 0x68, 0x87, 0xe5, 0x79, 0x41, 0xba, 0xb0, 0x12, 0x84, 0xe7, 0x9c, 0x14, 0x55, 0x54, 0x4, 0x4b, 0xe8, 0x27, 0x43, 0x3d, 0x22, 0xf1, 0xfc, 0xb7, 0xa0, 0x4c, 0xc, 0xfd, 0xe4, 0x22, 0xe4, 0x33, 0x4e, 0x8a, 0x3a, 0xf0, 0x40, 0xfa, 0xf9, 0x64, 0xad, 0x29, 0x75, 0x82, 0x20, 0x80, 0xae, 0x4b, 0xc8, 0xc6, 0xd, 0xc5, 0x83, 0x7, 0x5, 0xf8, 0xfb, 0x8, 0x76, 0xd6, 0xe5, 0x4, 0xbf, 0xa0, 0x10, 0x4d, 0x85, 0x90, 0xfd, 0xae, 0x1f, 0x14, 0x82, 0xf8, 0x4d, 0x14, 0xfe, 0x6d, 0x18, 0xd0, 0xbd, 0xe0, 0xf1, 0x69, 0x2d, 0xd8, 0xc6, 0x73, 0x2e, 0x96, 0xee, 0xf, 0xc0, 0xc3, 0x80, 0xeb, 0x8a, 0xc8, 0xb7, 0xca, 0x5e, 0x9e, 0xca, 0xe9, 0x21, 0x41, 0xaf, 0xd7, 0xde, 0x35, 0x84, 0xab, 0x85, 0x21, 0x4e, 0x14, 0xc5, 0x6b, 0x91, 0x14, 0x8c, 0xf4, 0x9c, 0x9b, 0x2, 0xea, 0xc3, 0x10, 0xc3, 0x2e, 0xaf, 0x6c, 0x2a, 0x15, 0x1e, 0xa4, 0xa9, 0x2b, 0x8e, 0x23, 0x98, 0x62, 0x2, 0x1, 0xed, 0xb7, 0xd0, 0xd5, 0x2, 0x4, 0xcf, 0x72, 0x1c, 0x95, 0xf8, 0x81, 0xa8, 0x2, 0xf, 0xa0, 0x7b, 0x98, 0xed, 0x36, 0x46, 0xdb, 0x6b, 0x42, 0x9a, 0xcb, 0x38, 0x89, 0x47, 0xd8, 0x7f, 0xc5, 0x76, 0x18, 0xc6, 0x19, 0x65, 0xf2, 0xf4, 0x3, 0x4b, 0x90, 0xa6, 0x83, 0x10, 0xae, 0x2a, 0x3e, 0xfe, 0x7e, 0x77, 0x71, 0xca, 0x37, 0x80, 0xbe, 0x94, 0xf4, 0x9e, 0xe0, 0x8b, 0x47, 0xba, 0x7d, 0xc8, 0x36, 0xa, 0xde, 0xa2, 0xc2, 0x80, 0x5f, 0xe7, 0x7b, 0x0, 0xd9, 0xd, 0x6c, 0xa3, 0xec, 0xc7, 0x40, 0xd9, 0xc3, 0x83, 0x51, 0xa3, 0x6c, 0x7f, 0x3c, 0x42, 0x69, 0x3, 0x42, 0xa1, 0x9e, 0xfb, 0x3c, 0xfe, 0x3d, 0x44, 0xc7, 0x4f, 0xe3, 0x40, 0x83, 0xe0, 0xe4, 0x39, 0x53, 0xc2, 0x53, 0x8c, 0x17, 0x3b, 0xc3, 0x0, 0x89, 0x67, 0xe4, 0xa3, 0x76, 0xa, 0xc2, 0xb1, 0xda, 0xfb, 0xf0, 0xdb, 0x28, 0x1d, 0xf1, 0xa, 0xc1, 0x5f, 0x46, 0x5b, 0x2d, 0x9d, 0xfa, 0x2c, 0x5b, 0xb9, 0xe3, 0xe8, 0xf9, 0xef, 0xc2, 0xb9, 0x39, 0xc5, 0xc3, 0x7b, 0x40, 0xa2, 0x1d, 0xaa, 0x7c, 0xeb, 0xa, 0xe8, 0xa8, 0x4a, 0x80, 0xa7, 0xc1, 0xee, 0xf1, 0x91, 0xe1, 0x51, 0x6, 0x1e, 0xa4, 0xc, 0x12, 0x5f, 0xf5, 0x73, 0x6, 0x30, 0x99, 0x8f, 0x8b, 0xfb, 0x65, 0x18, 0x1a, 0x11, 0xe4, 0xd3, 0xd, 0x9b, 0x6e, 0x32, 0x25, 0xf8, 0x4a, 0x89, 0x17, 0x5c, 0xd, 0x3, 0xe1, 0x81, 0x8e, 0x88, 0xfe, 0xd0, 0x7, 0xd8, 0x8, 0x3c, 0xfe, 0x8c, 0xea, 0x7a, 0x35, 0x8f, 0x7e, 0x13, 0xa5, 0x20, 0xde, 0x96, 0x78, 0x6d, 0xd5, 0x9b, 0x25, 0x1e, 0x7f, 0x99, 0xe, 0xc1, 0xa1, 0xd1, 0x8b, 0xea, 0xb3, 0x70, 0xc7, 0x9b, 0xc2, 0xdd, 0xdc, 0x6d, 0xd5, 0xf3, 0x22, 0xda, 0xa4, 0xe7, 0xf2, 0x3d, 0xd6, 0x1c, 0x32, 0xe2, 0x67, 0xec, 0xed, 0xb, 0x51, 0xf7, 0xb8, 0xe1, 0x1, 0x1c, 0x28, 0xe3, 0xa7, 0x33, 0x95, 0x51, 0xf, 0x12, 0x2e, 0xe7, 0x13, 0xd2, 0xbc, 0x2e, 0xa2, 0x63, 0x8e, 0x16, 0xa7, 0xea, 0xd6, 0x3c, 0xda, 0x26, 0x0, 0x34, 0x2a, 0x49, 0xd, 0xe7, 0x84, 0xeb, 0x87, 0x3a, 0x9a, 0x55, 0xd4, 0xaa, 0x84, 0x60, 0xcc, 0xde, 0x22, 0xe0, 0x74, 0xb0, 0x32, 0xce, 0xa2, 0x46, 0x52, 0x6d, 0x86, 0xdd, 0x5a, 0xdb, 0x85, 0xdf, 0xc0, 0xf8, 0xa1, 0x4a, 0x38, 0x32, 0xd3, 0x51, 0x3e, 0xf0, 0x40, 0x43, 0x38, 0x3e, 0xe2, 0xe2, 0xbd, 0x6c, 0x22, 0x18, 0xa0, 0xed, 0x20, 0x82, 0x28, 0x87, 0xf6, 0x2b, 0xee, 0x65, 0xb0, 0xc4, 0x1f, 0xf2, 0x59, 0x19, 0xc2, 0xb5, 0x90, 0x4d, 0x8f, 0xda, 0x31, 0x2f, 0x1b, 0x8e, 0x94, 0xf7, 0xb9, 0xbe, 0x3e, 0xff, 0xb9, 0x2f, 0xef, 0xf, 0xae, 0x6e, 0x48, 0x6c, 0x64, 0xa2, 0xeb, 0x67, 0xe, 0x1c, 0x43, 0xfd, 0x7f, 0x22, 0x55, 0xc1, 0x1a, 0x29, 0xa8, 0x12, 0x50, 0x55, 0xee, 0xa0, 0x24, 0xc3, 0xc0, 0x22, 0xef, 0x4f, 0x57, 0x2d, 0x7b, 0x93, 0x3b, 0xde, 0xc8, 0x4, 0xb0, 0xa1, 0xce, 0x8b, 0x3e, 0x57, 0xbc, 0x91, 0xbf, 0x9f, 0xe9, 0x34, 0x8f, 0xc0, 0x18, 0x21, 0xf1, 0x43, 0x6c, 0x3c, 0xa3, 0x60, 0x2c, 0x55, 0x68, 0xd4, 0x48, 0x41, 0xea, 0x55, 0x43, 0x49, 0x3e, 0x44, 0x2f, 0x8f, 0xea, 0xf8, 0x30, 0x8e, 0xdf, 0x7, 0x12, 0xaf, 0x10, 0xb0, 0x96, 0x2, 0xf2, 0x1, 0xf, 0xee, 0xa5, 0x9c, 0x3b, 0xf6, 0x19, 0x9c, 0xb, 0x50, 0x4b, 0xde, 0xc3, 0xb7, 0xb4, 0xff, 0xbb, 0x25, 0xb9, 0xe, 0xe, 0xe0, 0x3d, 0xc0, 0x16, 0x9d, 0x25, 0x4e, 0x3d, 0xd8, 0xee, 0xfc, 0xdf, 0x66, 0xee, 0xd6, 0x0, 0xe3, 0xd2, 0x7d, 0x5d, 0xc8, 0xeb, 0x1a, 0x9a, 0x99, 0x42, 0x5f, 0x53, 0x8a, 0xff, 0x59, 0x1c, 0x77, 0x39, 0xee, 0xbb, 0x37, 0x79, 0x5, 0x8d, 0xf9, 0x79, 0x34, 0x86, 0x35, 0x68, 0x70, 0xe, 0x87, 0xd2, 0x7c, 0x28, 0x61, 0xd7, 0x9a, 0x93, 0x95, 0xf8, 0xec, 0x80, 0x52, 0xaa, 0x95, 0xf, 0x1a, 0xc6, 0x7c, 0x22, 0x2d, 0x20, 0x28, 0xa1, 0x8e, 0xa0, 0xf2, 0xd6, 0x5d, 0x12, 0xcf, 0x17, 0x4c, 0x65, 0x87, 0xf0, 0x9b, 0x76, 0xb1, 0xaf, 0x78, 0x72, 0x13, 0x72, 0xe3, 0xfa, 0x72, 0x4c, 0x1a, 0x71, 0xb7, 0x18, 0x4c, 0x95, 0x74, 0x21, 0xed, 0x98, 0x65, 0x4, 0xd0, 0x4e, 0xf6, 0x17, 0x42, 0xbd, 0x2e, 0x3f, 0xdf, 0x9a, 0xc0, 0x6d, 0x96, 0x20, 0xec, 0xf1, 0x1b, 0xcf, 0x52, 0x98, 0xad, 0xf0, 0xf8, 0x7e, 0x26, 0x4b, 0xbc, 0xee, 0xe7, 0x50, 0xa, 0x8d, 0xa6, 0x6c, 0x83, 0x97, 0x13, 0x88, 0xf3, 0xd9, 0xd6, 0xc9, 0xd3, 0x50, 0xb1, 0x51, 0x3d, 0xd, 0x4e, 0xba, 0xc3, 0xb8, 0xb3, 0x99, 0x5, 0x95, 0xb6, 0x73, 0x8c, 0xee, 0x11, 0xa7, 0xe2, 0x5a, 0x52, 0x14, 0x33, 0x16, 0x5a, 0x79, 0xc4, 0xc1, 0xb7, 0x89, 0x83, 0x3e, 0x8e, 0x52, 0xf7, 0x1c, 0x2e, 0xa4, 0x26, 0xe4, 0xb3, 0x53, 0x58, 0x90, 0xd8, 0x3d, 0xff, 0x4d, 0x87, 0x40, 0x32, 0xcf, 0x21, 0x47, 0x76, 0x35, 0xca, 0xdc, 0x15, 0x48, 0xe5, 0x82, 0xa6, 0x4b, 0x8c, 0x39, 0x2a, 0xf3, 0x79, 0xdc, 0x16, 0x52, 0x58, 0x41, 0x68, 0xf5, 0xe1, 0xce, 0x84, 0x1a, 0xa2, 0xb9, 0xdc, 0xed, 0x75, 0x1, 0xdf, 0x54, 0x68, 0x1, 0x1d, 0x11, 0x4f, 0xed, 0xcd, 0xf9, 0xe0, 0x11, 0xa1, 0x8a, 0xd9, 0xbd, 0x5c, 0x3, 0xfd, 0xe8, 0x74, 0xeb, 0x48, 0x20, 0x35, 0x25, 0xf7, 0x4c, 0xe2, 0x3a, 0x15, 0x14, 0xd4, 0x13, 0x28, 0x38, 0x16, 0xa7, 0xda, 0x91, 0x18, 0x75, 0xe0, 0x6, 0xc9, 0x6c, 0x8f, 0x11, 0xa1, 0xaf, 0x28, 0xbd, 0x5b, 0x52, 0xfd, 0x0, 0x18, 0xe, 0xe7, 0xee, 0x56, 0x9d, 0xea, 0x44, 0x29, 0x25, 0xf7, 0x36, 0x2, 0x56, 0x67, 0x3a, 0xcf, 0xa4, 0x9a, 0x84, 0x85, 0x93, 0xca, 0xd9, 0xdc, 0x6a, 0xaa, 0xb5, 0x9d, 0xa5, 0x72, 0xa9, 0x4a, 0x4f, 0xd2, 0x78, 0xdf, 0x44, 0x69, 0x1c, 0x4, 0x2d, 0xa6, 0x1a, 0x7d, 0x3f, 0x77, 0xaf, 0x6e, 0xdc, 0x41, 0xda, 0x53, 0x70, 0xd5, 0xe4, 0xee, 0x50, 0x8d, 0xbb, 0xda, 0x4e, 0xa, 0x29, 0xf4, 0x79, 0x1d, 0xed, 0xed, 0xd9, 0xb4, 0xb1, 0x67, 0x49, 0x70, 0xf, 0x7d, 0xd1, 0x8e, 0x97, 0x47, 0xe9, 0x6c, 0x3b, 0x92, 0x26, 0x4, 0xec, 0xb2, 0xb6, 0xc4, 0x42, 0xd, 0xae, 0x85, 0xdd, 0xdc, 0xd1, 0xb6, 0x72, 0x37, 0x9f, 0xcf, 0xf9, 0x87, 0x76, 0x33, 0x57, 0xf6, 0x70, 0x4c, 0x90, 0x2c, 0xfd, 0x57, 0x80, 0x1, 0x0, 0xc5, 0xb1, 0xf0, 0x59, 0xcd, 0x2e, 0xe2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)parse_logo_png { - return [NSData dataWithBytes:parse_logo_png length:sizeof(parse_logo_png)]; - } - - static const unsigned char apple_icon2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x2c, 0x8, 0x6, 0x0, 0x0, 0x0, 0xd, 0x53, 0x1a, 0xf5, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x3, 0x6, 0x49, 0x44, 0x41, 0x54, 0x58, 0x9, 0xcd, 0x98, 0xcb, 0x6b, 0xd5, 0x40, 0x14, 0xc6, 0x9b, 0xd6, 0x7, 0x6d, 0x15, 0x8a, 0x50, 0x8a, 0x6e, 0xac, 0xd7, 0xc7, 0x42, 0x41, 0xdd, 0x15, 0xc5, 0x95, 0xf, 0x5c, 0x54, 0xea, 0xc2, 0x85, 0x2b, 0xbb, 0x10, 0x51, 0xa4, 0x20, 0x8, 0xba, 0xf3, 0xf, 0xd0, 0xae, 0x4a, 0x2b, 0xae, 0xc4, 0x85, 0x28, 0x2a, 0xea, 0x4a, 0xc4, 0x85, 0xd5, 0x5a, 0x1f, 0x28, 0x28, 0x15, 0xc1, 0x6e, 0x4a, 0x11, 0x6f, 0xb5, 0xa8, 0x20, 0x22, 0x14, 0xb9, 0x95, 0xda, 0x5e, 0x7f, 0xdf, 0x35, 0x49, 0x27, 0x93, 0xe4, 0xf6, 0xa, 0x66, 0xe2, 0x81, 0x8f, 0x39, 0xe7, 0xcc, 0xc9, 0x7c, 0x1f, 0x93, 0xcc, 0x64, 0x92, 0xba, 0xba, 0xc, 0xad, 0x5c, 0x2e, 0x17, 0xc0, 0x59, 0x30, 0x2, 0xae, 0x64, 0x48, 0x55, 0x7d, 0x68, 0xc8, 0x9b, 0x41, 0x1f, 0x98, 0x5, 0x81, 0x5d, 0xad, 0x7e, 0xd5, 0x9f, 0xde, 0x45, 0xb5, 0x14, 0xfd, 0x4d, 0xd, 0xec, 0x2b, 0xa9, 0xbf, 0xf, 0x36, 0x59, 0xd7, 0x15, 0xad, 0x38, 0xfb, 0x10, 0x31, 0x2d, 0x60, 0x2c, 0x98, 0x12, 0xab, 0xdd, 0x99, 0xbd, 0x2, 0x8b, 0x1, 0x1, 0x37, 0x2d, 0x11, 0x41, 0x58, 0xc4, 0xf9, 0xe7, 0x77, 0xc3, 0xa2, 0x8f, 0x86, 0x10, 0xee, 0x8, 0xd8, 0x13, 0xda, 0x63, 0xd1, 0x6a, 0x7, 0x11, 0x22, 0xd2, 0x66, 0x67, 0x88, 0xbe, 0x7a, 0x7, 0x12, 0xe6, 0x29, 0x20, 0x5c, 0x2, 0x7e, 0x0, 0xdb, 0xde, 0x90, 0x68, 0x9d, 0xaf, 0x74, 0xe4, 0x41, 0xba, 0xce, 0x56, 0x42, 0xac, 0x19, 0x5b, 0xe1, 0x48, 0x42, 0x94, 0x6, 0xe2, 0xe, 0x5f, 0xd0, 0x4f, 0xda, 0xbb, 0x60, 0x6f, 0xb4, 0xa2, 0xf6, 0xc8, 0xab, 0xa5, 0x14, 0x2, 0xed, 0x2d, 0xab, 0xc0, 0x1c, 0x18, 0xf7, 0x3c, 0x6f, 0xca, 0xbc, 0x8e, 0x7e, 0xad, 0x20, 0xf5, 0x4f, 0xd2, 0x37, 0x1b, 0xf4, 0x91, 0x6f, 0xc2, 0x5f, 0xb, 0xa, 0xa0, 0x19, 0x7c, 0x2, 0xaf, 0xec, 0xeb, 0xc9, 0x2d, 0x6c, 0xc, 0xb6, 0x1, 0xf4, 0x83, 0x9, 0x60, 0xdb, 0x5b, 0x12, 0x67, 0x40, 0xbb, 0x3d, 0x12, 0xb9, 0x26, 0x70, 0x8, 0xdc, 0x1, 0xd3, 0xc0, 0x36, 0xed, 0xde, 0x7a, 0x95, 0x9c, 0x0, 0x8d, 0xf6, 0xf5, 0xb1, 0x19, 0xf2, 0x8b, 0xce, 0x51, 0x78, 0x1c, 0x2c, 0xb4, 0x77, 0x94, 0xa9, 0x79, 0x4, 0x86, 0xc1, 0x37, 0xd0, 0x1, 0xba, 0xc0, 0x72, 0x50, 0x8b, 0x69, 0xf7, 0x3e, 0xcc, 0x8c, 0x3d, 0x4c, 0x2c, 0x46, 0x4c, 0x2b, 0x78, 0xe, 0x5c, 0xda, 0xc, 0x64, 0xdd, 0x31, 0x41, 0x24, 0x1b, 0x81, 0x96, 0x69, 0x1e, 0x26, 0x51, 0xbb, 0x24, 0xca, 0xdc, 0xb0, 0x2e, 0x10, 0x6f, 0x8e, 0x29, 0x75, 0x93, 0x18, 0x85, 0x66, 0x22, 0xa4, 0x42, 0xdd, 0xf6, 0x3c, 0xa6, 0xc5, 0xe7, 0x7c, 0x4a, 0xbb, 0x2c, 0x14, 0x23, 0x87, 0xc4, 0xbd, 0x9c, 0x4, 0xbd, 0x87, 0xb7, 0xc5, 0x14, 0xe3, 0x91, 0x58, 0x43, 0xe2, 0x9d, 0x99, 0x74, 0xe8, 0xef, 0x66, 0x85, 0x3d, 0x30, 0xf9, 0xf4, 0xc, 0xed, 0x31, 0x13, 0xe, 0xfd, 0x61, 0x5b, 0x8c, 0xb8, 0x25, 0xa8, 0xf2, 0x74, 0x3b, 0x14, 0x12, 0x50, 0x25, 0x1e, 0x69, 0x25, 0x68, 0x7d, 0x50, 0xe1, 0xb8, 0x1d, 0x4c, 0xe2, 0x93, 0x20, 0xf7, 0xc7, 0x3, 0xd6, 0x11, 0xbc, 0x1f, 0xff, 0x27, 0x41, 0x25, 0x9e, 0x9f, 0x99, 0x34, 0x41, 0xd3, 0x49, 0x1d, 0x19, 0xe7, 0xf4, 0x2, 0x4e, 0x7c, 0xdf, 0xe9, 0x96, 0x7d, 0xc9, 0x98, 0x3c, 0x6d, 0xf8, 0xd5, 0x49, 0x1d, 0x79, 0xa, 0xda, 0x97, 0x26, 0xe8, 0x73, 0x52, 0x87, 0x83, 0x9c, 0xce, 0x4c, 0x9a, 0x90, 0x88, 0x29, 0x31, 0x12, 0xc9, 0xb8, 0xb, 0x36, 0x42, 0x75, 0xd4, 0xa6, 0x93, 0xa0, 0x21, 0x3b, 0xe9, 0x30, 0xee, 0x65, 0x96, 0xb6, 0x98, 0x7c, 0x7a, 0x97, 0xe9, 0x54, 0xa8, 0xd3, 0x5e, 0xe2, 0x53, 0x6f, 0x16, 0x67, 0xe4, 0xeb, 0x9c, 0xdd, 0xc9, 0x36, 0xf0, 0x5a, 0xe3, 0xd7, 0xe3, 0xfc, 0xa2, 0x7d, 0xac, 0x20, 0x27, 0xd3, 0x7, 0xc4, 0x13, 0x26, 0xa6, 0x7, 0x34, 0x54, 0xce, 0xd4, 0x38, 0x7, 0x49, 0x5e, 0xcf, 0x49, 0x90, 0x49, 0x7b, 0x39, 0x10, 0xb4, 0x98, 0xec, 0x7, 0xd0, 0x66, 0xf6, 0xe6, 0xe0, 0x77, 0x57, 0x96, 0x9d, 0xbf, 0x8d, 0x5f, 0xca, 0x41, 0x80, 0x49, 0xf9, 0x95, 0xe0, 0x56, 0x45, 0x90, 0x9f, 0xd5, 0x99, 0xba, 0x64, 0x56, 0x38, 0xf6, 0x7, 0x98, 0x98, 0x52, 0x28, 0x88, 0x40, 0x6f, 0xdf, 0x5e, 0xc7, 0x22, 0x2, 0x3a, 0xcd, 0x4e, 0x7f, 0x10, 0x84, 0x2d, 0xf, 0xb7, 0x3e, 0x85, 0x74, 0xce, 0x75, 0x6d, 0x47, 0x42, 0x11, 0xb6, 0x83, 0x92, 0x2e, 0xc7, 0x6a, 0x9e, 0xc1, 0x57, 0x59, 0x5c, 0xb6, 0x96, 0x30, 0xa6, 0x60, 0xc0, 0x91, 0xa8, 0xef, 0xf0, 0xb4, 0x87, 0xc4, 0x69, 0xe, 0x45, 0x4b, 0xc1, 0xcb, 0x8c, 0x45, 0xcd, 0x31, 0xfe, 0x81, 0x34, 0xd, 0xb1, 0x3c, 0xc5, 0x6d, 0x60, 0x3c, 0x43, 0x51, 0x27, 0x63, 0xa4, 0x24, 0xaa, 0xde, 0x3b, 0xc4, 0x14, 0xa8, 0xb9, 0xd, 0xb6, 0x26, 0x5d, 0x4c, 0x6e, 0xc, 0xdc, 0x0, 0xfa, 0x14, 0x2e, 0x82, 0x6, 0xa0, 0x8f, 0x86, 0xfd, 0xa0, 0x13, 0x68, 0xc3, 0xb5, 0x4d, 0x27, 0xd4, 0xd3, 0xac, 0xea, 0xf3, 0x76, 0x47, 0x4d, 0x31, 0xa2, 0xf4, 0xff, 0x50, 0xff, 0x82, 0x5e, 0x80, 0x29, 0x30, 0xa, 0x2e, 0x82, 0x6d, 0xd5, 0x6, 0xa0, 0x5f, 0x7f, 0x52, 0x4e, 0x81, 0x41, 0xa0, 0x95, 0xab, 0x5f, 0xc3, 0xd7, 0x80, 0x8e, 0x1d, 0xa9, 0xf6, 0x1b, 0xf5, 0x4e, 0xf9, 0x49, 0xea, 0xad, 0xd1, 0x32, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)apple_icon2x_png { - return [NSData dataWithBytes:apple_icon2x_png length:sizeof(apple_icon2x_png)]; - } - - static const unsigned char parse_logo2x_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x1, 0xbb, 0x0, 0x0, 0x0, 0x88, 0x8, 0x6, 0x0, 0x0, 0x0, 0x7e, 0xf0, 0x45, 0xa9, 0x0, 0x0, 0x0, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9, 0x65, 0x3c, 0x0, 0x0, 0x3, 0x23, 0x69, 0x54, 0x58, 0x74, 0x58, 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x78, 0x6d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x22, 0xef, 0xbb, 0xbf, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x22, 0x3f, 0x3e, 0x20, 0x3c, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, 0x72, 0x65, 0x20, 0x35, 0x2e, 0x35, 0x2d, 0x63, 0x30, 0x31, 0x34, 0x20, 0x37, 0x39, 0x2e, 0x31, 0x35, 0x31, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2f, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x39, 0x3a, 0x31, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x23, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3d, 0x22, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x43, 0x43, 0x20, 0x28, 0x4d, 0x61, 0x63, 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x68, 0x29, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x45, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x46, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x3e, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x69, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x43, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x20, 0x73, 0x74, 0x52, 0x65, 0x66, 0x3a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3d, 0x22, 0x78, 0x6d, 0x70, 0x2e, 0x64, 0x69, 0x64, 0x3a, 0x34, 0x31, 0x30, 0x31, 0x39, 0x34, 0x30, 0x44, 0x34, 0x30, 0x30, 0x43, 0x31, 0x31, 0x45, 0x34, 0x41, 0x33, 0x35, 0x31, 0x39, 0x31, 0x30, 0x33, 0x32, 0x36, 0x42, 0x31, 0x39, 0x32, 0x31, 0x42, 0x22, 0x2f, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x20, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x20, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x22, 0x72, 0x22, 0x3f, 0x3e, 0xe8, 0x51, 0xff, 0x90, 0x0, 0x0, 0x26, 0xd1, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x5d, 0x7, 0x98, 0x14, 0x55, 0xd6, 0xbd, 0xd, 0x33, 0xcc, 0x90, 0x54, 0x24, 0x88, 0xa2, 0x2, 0x8a, 0x28, 0x20, 0x62, 0x40, 0x51, 0x5c, 0x57, 0x10, 0x51, 0x44, 0xd7, 0x35, 0xff, 0xbb, 0x46, 0x5c, 0x31, 0xc3, 0x9a, 0x45, 0xd4, 0x55, 0x74, 0xd7, 0xac, 0xb0, 0x86, 0x5d, 0x73, 0x5e, 0x75, 0x4d, 0x6b, 0x56, 0x14, 0x11, 0xcc, 0x1, 0x41, 0xc9, 0x51, 0x82, 0x8, 0x8, 0x22, 0x82, 0x48, 0x9a, 0xf8, 0xbf, 0x63, 0x9d, 0x96, 0xa6, 0xe6, 0x55, 0x4f, 0xcf, 0x4c, 0x55, 0x77, 0x55, 0xf5, 0x3d, 0xdf, 0x77, 0x3f, 0xe0, 0x55, 0x33, 0x53, 0xfd, 0xea, 0xd5, 0x3b, 0x37, 0xbf, 0xc4, 0x49, 0x83, 0x86, 0xb4, 0x13, 0x91, 0x53, 0x8c, 0x34, 0x96, 0xf8, 0xa2, 0xbe, 0x91, 0xa9, 0x46, 0x66, 0x19, 0x99, 0x61, 0x64, 0xb5, 0x91, 0x52, 0x51, 0x28, 0x14, 0xa, 0x45, 0x6c, 0xb0, 0x66, 0xed, 0x3a, 0x19, 0x3a, 0x68, 0xa0, 0xec, 0xb3, 0x47, 0xd7, 0x2a, 0xd7, 0xa, 0x8c, 0xdc, 0x62, 0xa4, 0xb7, 0x91, 0xe2, 0x18, 0xcf, 0x41, 0x82, 0xe4, 0x56, 0x66, 0xa4, 0xc4, 0xc8, 0x14, 0x92, 0xdf, 0x24, 0xfe, 0x1d, 0xb2, 0x41, 0x97, 0x8a, 0x42, 0xa1, 0x50, 0xc4, 0x13, 0x20, 0xbb, 0xed, 0x8c, 0x34, 0xe3, 0xdf, 0xf3, 0x5, 0x6d, 0x8c, 0x1c, 0xca, 0xbf, 0xff, 0x42, 0xd2, 0xfb, 0xd0, 0xc8, 0x33, 0xfc, 0x7b, 0xa5, 0x2e, 0xd, 0x85, 0x42, 0xa1, 0x88, 0xf, 0xea, 0x19, 0x29, 0x37, 0x52, 0x91, 0xc7, 0x73, 0xd0, 0xc4, 0x48, 0x4f, 0x23, 0x43, 0x8c, 0x8c, 0x33, 0x32, 0xd2, 0xc8, 0x31, 0x46, 0xa, 0x75, 0x79, 0x28, 0x14, 0xa, 0x45, 0x7c, 0xc8, 0x4e, 0xb1, 0x11, 0x20, 0xb8, 0x43, 0x8c, 0xbc, 0x68, 0x64, 0xb4, 0x91, 0x63, 0x75, 0x8e, 0x14, 0xa, 0x85, 0x22, 0xfa, 0xf0, 0x72, 0x5d, 0x22, 0x89, 0x63, 0x6a, 0x8c, 0x8, 0xbd, 0x95, 0x91, 0x46, 0xfc, 0x73, 0xeb, 0xc, 0x9, 0xec, 0x0, 0xca, 0x28, 0x23, 0x7f, 0x17, 0xc7, 0xcd, 0xa9, 0x50, 0x28, 0x14, 0x8a, 0x18, 0x91, 0xdd, 0x93, 0x46, 0x6e, 0x8c, 0xd1, 0xf7, 0x6c, 0x40, 0xb2, 0xdb, 0xca, 0x48, 0x6b, 0x23, 0x9d, 0x53, 0xc8, 0xc, 0xf1, 0xbb, 0x44, 0x9a, 0xff, 0xdb, 0x97, 0x9f, 0xbb, 0xd7, 0xc8, 0x75, 0x46, 0x56, 0xe9, 0xb2, 0x51, 0x28, 0x14, 0x8a, 0xe8, 0x59, 0x3d, 0x36, 0x34, 0x8c, 0xd9, 0xf7, 0x44, 0x6, 0xe6, 0x4a, 0x23, 0x33, 0x8d, 0xbc, 0x4f, 0xe2, 0x3a, 0xd1, 0x48, 0x27, 0x23, 0xfd, 0x8d, 0x3c, 0x6a, 0xe4, 0xbb, 0x34, 0xff, 0x1f, 0x99, 0xaa, 0x17, 0x19, 0x79, 0xdb, 0x48, 0x77, 0x5d, 0x36, 0xa, 0x85, 0x42, 0x11, 0xf, 0xb2, 0xcb, 0x17, 0x20, 0x13, 0x13, 0x9, 0x29, 0x7f, 0x31, 0x72, 0x90, 0x91, 0x2b, 0x8d, 0xcc, 0x4d, 0xf3, 0xf9, 0x1e, 0x46, 0xde, 0x32, 0x32, 0x40, 0x97, 0x8e, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0x45, 0x11, 0xb3, 0x8d, 0xdc, 0x64, 0x64, 0x2f, 0x71, 0xdc, 0x95, 0xcb, 0x3c, 0x3e, 0xd7, 0x82, 0x96, 0x20, 0xdc, 0xbc, 0x9, 0x9d, 0x36, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x22, 0xe0, 0xee, 0x1c, 0x66, 0xa4, 0x8f, 0x91, 0x17, 0xd2, 0x7c, 0x6e, 0xa8, 0x38, 0xee, 0xd0, 0x22, 0x9d, 0x32, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x2a, 0xd0, 0x55, 0xe5, 0x78, 0x23, 0x3, 0x8d, 0xac, 0xf0, 0xf8, 0xcc, 0xd9, 0x46, 0x1e, 0x96, 0xf8, 0xc5, 0x38, 0x15, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xcf, 0x0, 0x32, 0x43, 0xed, 0xdd, 0xd7, 0x1e, 0xd7, 0x4f, 0xa2, 0x85, 0xa7, 0x45, 0xe8, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x69, 0x8c, 0x17, 0xa7, 0x4, 0xe1, 0x4d, 0x8f, 0xeb, 0xa7, 0x89, 0xe3, 0xfa, 0x54, 0x28, 0x14, 0xa, 0x85, 0x92, 0x5d, 0xa4, 0xb1, 0xdc, 0xc8, 0x9f, 0xc4, 0x49, 0x4e, 0xb1, 0x1, 0x99, 0x9c, 0x67, 0xea, 0x34, 0x29, 0x14, 0xa, 0x85, 0x92, 0x5d, 0xd4, 0x81, 0xa3, 0x81, 0x10, 0xc3, 0x7b, 0xc8, 0xe3, 0xfa, 0x8, 0x23, 0xbd, 0x74, 0x9a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xea, 0x40, 0xd3, 0xec, 0xc1, 0xe2, 0xf4, 0xcf, 0x74, 0x3, 0x67, 0x2, 0x22, 0x7e, 0xd7, 0x42, 0xa7, 0x49, 0xa1, 0x50, 0x28, 0x94, 0xec, 0xa2, 0x8e, 0xf5, 0xb4, 0xf0, 0x3e, 0xb6, 0x5c, 0xdb, 0x45, 0x9c, 0x33, 0x2, 0xb, 0x74, 0x9a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0xea, 0x40, 0x3d, 0xde, 0x0, 0x23, 0xdf, 0x5a, 0xae, 0x9d, 0x6a, 0xe4, 0x70, 0x9d, 0x22, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x3, 0xe6, 0x18, 0x19, 0x24, 0xce, 0x29, 0xe8, 0xa9, 0x48, 0x9e, 0x0, 0xbf, 0x85, 0x4e, 0x91, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x1, 0xaf, 0x19, 0xb9, 0xdb, 0x32, 0xbe, 0xb3, 0x91, 0x8b, 0x75, 0x7a, 0x14, 0xa, 0x85, 0x42, 0xc9, 0x2e, 0x2e, 0xb8, 0xd9, 0xc8, 0x44, 0xcb, 0xf8, 0x19, 0x46, 0x76, 0xd2, 0xe9, 0x51, 0x28, 0x14, 0xa, 0x25, 0xbb, 0x38, 0xe0, 0x7, 0x23, 0x97, 0x59, 0xc6, 0xb7, 0x11, 0xe7, 0x68, 0x20, 0x85, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x2, 0x38, 0xd1, 0xfc, 0x19, 0xcb, 0x38, 0x92, 0x55, 0xda, 0xeb, 0xf4, 0x28, 0x14, 0xa, 0x85, 0x92, 0x5d, 0x5c, 0x80, 0xa2, 0xf2, 0x9f, 0x5d, 0x63, 0xa8, 0xbd, 0xfb, 0x8b, 0x4e, 0x8d, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x5, 0xe3, 0x8c, 0xbc, 0x6a, 0x19, 0x3f, 0xc1, 0x48, 0x4b, 0x9d, 0x1e, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0x93, 0x75, 0xe7, 0x46, 0x47, 0xd1, 0x36, 0x62, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x23, 0x7c, 0x65, 0xe4, 0xd, 0xcb, 0xf8, 0x19, 0x3a, 0x35, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x17, 0x54, 0x1a, 0x79, 0xce, 0x32, 0xde, 0xd3, 0x48, 0x3b, 0x9d, 0x1e, 0x85, 0x42, 0xa1, 0x50, 0xb2, 0x8b, 0xb, 0xde, 0x36, 0x32, 0xd7, 0x35, 0xd6, 0x54, 0x9c, 0x33, 0xf1, 0x14, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0xb, 0x2c, 0x35, 0xf2, 0xa5, 0x65, 0xfc, 0x77, 0x3a, 0x35, 0xa, 0x85, 0x42, 0xa1, 0x64, 0x17, 0x27, 0xd8, 0xb2, 0x32, 0xf7, 0x36, 0xd2, 0x5a, 0xa7, 0x46, 0xa1, 0x50, 0x28, 0x94, 0xec, 0xe2, 0x82, 0xb1, 0x46, 0x4a, 0x5c, 0x63, 0x68, 0x1d, 0xb6, 0x9d, 0x4e, 0x8d, 0x42, 0xa1, 0x50, 0x28, 0xd9, 0xc5, 0x5, 0x3f, 0x1a, 0x99, 0xea, 0x1a, 0x2b, 0x10, 0xed, 0x95, 0xa9, 0x50, 0x28, 0x14, 0x59, 0x87, 0x1e, 0x30, 0x1a, 0x1c, 0x70, 0xc0, 0xeb, 0x27, 0x46, 0xf6, 0x70, 0x8d, 0xef, 0x66, 0xe4, 0xe9, 0x8, 0x7f, 0xaf, 0x42, 0x23, 0xd, 0x8c, 0x34, 0xf1, 0xb0, 0x52, 0x13, 0x46, 0xd6, 0x19, 0x59, 0x48, 0xcb, 0x76, 0x83, 0x38, 0xa7, 0xbb, 0x2b, 0x14, 0x99, 0xee, 0x49, 0xc9, 0x35, 0x86, 0xf5, 0xd5, 0x50, 0x9c, 0xc, 0x67, 0x9b, 0xa2, 0xe, 0x85, 0xf2, 0x7b, 0xae, 0x2f, 0xac, 0xb5, 0x72, 0x9d, 0x3e, 0x5f, 0x90, 0xe0, 0xfc, 0xe3, 0x59, 0x6c, 0x6d, 0x64, 0x4b, 0xcb, 0x3b, 0x8c, 0xf9, 0xc7, 0x99, 0x9e, 0x8b, 0x8c, 0x94, 0x89, 0x73, 0xcc, 0x59, 0x45, 0xd8, 0x17, 0x96, 0x22, 0x38, 0xcc, 0xb0, 0x8c, 0xed, 0x1c, 0xb1, 0x8d, 0x7, 0x27, 0xaf, 0x77, 0x30, 0xd2, 0xc9, 0xc8, 0x5e, 0x46, 0xda, 0xf2, 0xdf, 0x45, 0xdc, 0x94, 0x2a, 0x2d, 0x2f, 0x4a, 0x5, 0x17, 0xff, 0x4f, 0xe2, 0x9c, 0xf9, 0x87, 0x79, 0x98, 0x69, 0x64, 0x16, 0xff, 0xfc, 0x26, 0xa6, 0xcf, 0xbb, 0x1e, 0x37, 0x9, 0xe1, 0xc6, 0x5b, 0xaa, 0xaf, 0x40, 0x5a, 0x6c, 0x6b, 0x64, 0x47, 0xa, 0xd6, 0x19, 0x9a, 0x2f, 0xa0, 0x79, 0xfa, 0xf6, 0x54, 0xa6, 0xa, 0x39, 0xa7, 0x95, 0x1e, 0x1b, 0x72, 0x39, 0x37, 0x5a, 0x6c, 0xba, 0xf3, 0xc5, 0x39, 0x48, 0x79, 0x26, 0xff, 0x3e, 0xdb, 0xc8, 0x2, 0x6e, 0xc6, 0x8a, 0xf4, 0x68, 0xcd, 0xf7, 0xbb, 0x3, 0xf7, 0xa7, 0x2e, 0x46, 0x76, 0x30, 0xd2, 0x86, 0x7b, 0x40, 0x7d, 0x8f, 0xf7, 0x3c, 0x39, 0xff, 0xdf, 0x73, 0xee, 0x67, 0xf0, 0x1d, 0x9f, 0xc2, 0x77, 0x7c, 0x9e, 0x92, 0x5d, 0xfe, 0x60, 0x11, 0x17, 0x49, 0x22, 0x65, 0xac, 0x63, 0xc8, 0xef, 0x19, 0xbd, 0x3c, 0xf, 0x31, 0x72, 0xb0, 0x91, 0xae, 0x5c, 0xfc, 0xad, 0x6a, 0xf1, 0x73, 0x1a, 0xf0, 0x67, 0x61, 0x43, 0xeb, 0x95, 0x32, 0x8e, 0xd, 0x68, 0xba, 0x91, 0x31, 0x46, 0xfe, 0x27, 0x4e, 0x89, 0x46, 0x1c, 0x2c, 0x3f, 0x28, 0x2, 0xb7, 0x53, 0x9, 0x10, 0x6e, 0x2, 0x77, 0x18, 0x79, 0x25, 0x8b, 0xf7, 0xd0, 0x90, 0xd6, 0xd0, 0xce, 0x54, 0x4a, 0x5a, 0xf3, 0x7e, 0x92, 0x8d, 0xc8, 0x8b, 0x68, 0x1, 0x5d, 0x60, 0xe4, 0xbb, 0x1c, 0xcc, 0x11, 0x7e, 0x7f, 0x37, 0x23, 0x87, 0x89, 0x93, 0xac, 0xb5, 0x13, 0x89, 0xae, 0x7e, 0x1d, 0xf6, 0xaf, 0x22, 0xae, 0x33, 0x6c, 0xcc, 0xfb, 0xbb, 0x3c, 0x2b, 0xdf, 0x52, 0xd9, 0x1a, 0x2f, 0xce, 0xb9, 0x93, 0x93, 0xe8, 0x69, 0xc8, 0x77, 0xd4, 0xe7, 0x3e, 0x84, 0xf7, 0xbc, 0x37, 0x9f, 0x43, 0xe7, 0x3a, 0xcc, 0x7f, 0x52, 0x61, 0xe9, 0x9d, 0x72, 0x6d, 0x1e, 0x15, 0x8e, 0x64, 0xb, 0xc5, 0xaf, 0xa5, 0x6a, 0xe, 0x83, 0x92, 0x5d, 0x8c, 0xb0, 0xd8, 0xc8, 0x2f, 0xe2, 0xd4, 0xd8, 0x25, 0xd1, 0x82, 0xda, 0x6a, 0x98, 0x36, 0x78, 0xb8, 0x29, 0x50, 0xf4, 0x7e, 0x84, 0x91, 0xc3, 0x49, 0x50, 0x41, 0xa1, 0x2d, 0xa5, 0x9f, 0x91, 0xeb, 0x8d, 0x7c, 0x64, 0xe4, 0x29, 0x23, 0x6f, 0x8a, 0x53, 0xb2, 0x11, 0x55, 0x1c, 0x21, 0x55, 0x5b, 0xc2, 0x2d, 0xa, 0x98, 0xec, 0xb0, 0x69, 0x75, 0x37, 0xb2, 0x9f, 0x91, 0x3, 0x8c, 0xec, 0x23, 0x4e, 0xf, 0xd6, 0xa2, 0x6a, 0xfe, 0xdf, 0xf3, 0x46, 0xfe, 0x9b, 0xc5, 0xb9, 0x1, 0xb1, 0xf5, 0x31, 0x72, 0x1a, 0xad, 0x87, 0x6c, 0xec, 0x3b, 0xc5, 0xdc, 0xd0, 0x21, 0xfd, 0x8d, 0xc, 0xe5, 0x6, 0x8c, 0x86, 0xf, 0x23, 0xb9, 0xee, 0xf2, 0xd, 0xed, 0xa9, 0xc4, 0x9e, 0xc8, 0xf7, 0xbd, 0x41, 0xc0, 0xbf, 0xab, 0x3d, 0x9, 0x75, 0x8, 0x95, 0x8e, 0xff, 0x70, 0xee, 0xc7, 0x2b, 0xd9, 0xc5, 0xf, 0x38, 0x1, 0x61, 0x8d, 0x8b, 0xec, 0x8a, 0xa8, 0x7d, 0x2f, 0x8, 0xc1, 0xfd, 0x61, 0x23, 0x38, 0x95, 0x1b, 0x75, 0xb7, 0x1c, 0x69, 0xfa, 0x7d, 0x28, 0xd3, 0x8c, 0x3c, 0x6e, 0xe4, 0x3e, 0xa9, 0x7a, 0x72, 0x44, 0x14, 0x60, 0x73, 0xb5, 0x95, 0x7, 0xb8, 0x91, 0x9c, 0xcc, 0x79, 0xeb, 0x4e, 0xcb, 0xa6, 0x26, 0x48, 0x64, 0x61, 0x3e, 0x12, 0x24, 0x19, 0x9c, 0xf8, 0xd1, 0xd7, 0xf5, 0xe, 0xe4, 0x6a, 0xaf, 0x83, 0x5, 0x73, 0x95, 0x38, 0x67, 0x4f, 0xc2, 0xb3, 0x80, 0x23, 0xb9, 0x9e, 0xa5, 0x15, 0x18, 0x67, 0xec, 0x6e, 0xe4, 0x1c, 0x23, 0x87, 0x4a, 0x6e, 0xba, 0x38, 0x25, 0xc3, 0x21, 0xff, 0xe0, 0xdc, 0x7f, 0xc0, 0xf7, 0xfc, 0x1d, 0x7a, 0x40, 0x94, 0xec, 0x62, 0x80, 0xd5, 0x46, 0xd6, 0x5a, 0xb4, 0xf1, 0x46, 0x39, 0xbe, 0xaf, 0x83, 0xb8, 0x9, 0x1d, 0x23, 0x8e, 0xeb, 0xab, 0xa6, 0xc0, 0x26, 0xe, 0x3f, 0x3d, 0x12, 0x51, 0x56, 0x88, 0x13, 0x9b, 0x4a, 0x70, 0xc3, 0x87, 0x65, 0x81, 0x58, 0x4b, 0x73, 0x23, 0x9b, 0xd5, 0xe0, 0x67, 0xc2, 0x8d, 0x72, 0x8b, 0x91, 0xb3, 0xc4, 0x39, 0xf9, 0xfd, 0x71, 0x89, 0x56, 0xcc, 0xab, 0x32, 0xc3, 0xb1, 0xba, 0xa0, 0x27, 0x37, 0xad, 0xa3, 0x42, 0x40, 0x1e, 0xe9, 0x80, 0xe6, 0x9, 0x57, 0x53, 0xab, 0xaf, 0xd, 0xb1, 0xae, 0xa4, 0x60, 0xfe, 0x96, 0x71, 0x43, 0x4c, 0xfe, 0x1c, 0x78, 0x44, 0xb6, 0x20, 0xc1, 0x37, 0xa2, 0x57, 0xa2, 0xb0, 0x86, 0x3f, 0xbf, 0x1, 0x37, 0x7e, 0xc8, 0xa5, 0x46, 0x6e, 0x23, 0xe9, 0xc5, 0xcd, 0xc5, 0x9, 0x4b, 0xff, 0x5c, 0x5a, 0x72, 0xb5, 0xb1, 0xe2, 0xa0, 0x74, 0x22, 0xee, 0xe, 0xf7, 0xe3, 0xf2, 0x94, 0xf5, 0x5c, 0xc9, 0xf5, 0xd7, 0x94, 0xcf, 0x21, 0xe9, 0xad, 0xca, 0x4, 0x9b, 0x1b, 0xf9, 0x3, 0x15, 0x6c, 0x58, 0x78, 0x77, 0xd0, 0xd3, 0x10, 0x78, 0x72, 0x91, 0x92, 0x5d, 0xb0, 0xc0, 0x42, 0xf9, 0xc5, 0xb2, 0x1, 0xe6, 0xc2, 0x85, 0x59, 0x9f, 0x9b, 0xe4, 0x59, 0xb4, 0x8, 0x32, 0x8d, 0x93, 0x94, 0x93, 0xd0, 0x3e, 0x17, 0xa7, 0xc9, 0x35, 0x82, 0xcf, 0x70, 0x37, 0x2e, 0xa1, 0x46, 0x9c, 0x4a, 0x76, 0x15, 0x29, 0x64, 0x87, 0x17, 0xa0, 0x15, 0xad, 0x10, 0x4, 0xbc, 0x7f, 0x4f, 0xcd, 0xba, 0xba, 0x97, 0xe, 0xbe, 0xff, 0x7, 0x8d, 0xfc, 0xd9, 0xc8, 0xe5, 0xb9, 0x72, 0x79, 0x84, 0xc, 0x3d, 0x8c, 0x5c, 0xc8, 0xe7, 0x57, 0x1c, 0xe2, 0xfb, 0x44, 0x72, 0xc9, 0x35, 0x46, 0x4e, 0xcf, 0x70, 0x73, 0xc5, 0xba, 0x41, 0xec, 0x10, 0xb1, 0x34, 0xc4, 0x76, 0xe6, 0x51, 0x89, 0x5a, 0xc9, 0x77, 0x47, 0xaa, 0x21, 0xbb, 0x86, 0x54, 0xaa, 0x40, 0x78, 0xad, 0xb9, 0xce, 0xba, 0xd3, 0x8a, 0xd8, 0x3c, 0xc3, 0xd, 0x78, 0x57, 0x2a, 0x56, 0x3, 0x68, 0x79, 0xbc, 0x17, 0x83, 0xf5, 0x2, 0xeb, 0xed, 0x62, 0x2a, 0xb4, 0x99, 0x5a, 0xfd, 0x78, 0x97, 0x67, 0xf1, 0x3d, 0x1f, 0xc7, 0xe7, 0xb0, 0x84, 0xef, 0x77, 0x2a, 0xd9, 0x25, 0x95, 0xda, 0x26, 0x54, 0x66, 0x93, 0x64, 0xb7, 0xd, 0xdf, 0xef, 0xae, 0x54, 0x76, 0x9a, 0x57, 0xc3, 0x2f, 0x9, 0x3e, 0x2b, 0x58, 0xd7, 0x3, 0x8d, 0xdc, 0x4a, 0x4b, 0x4f, 0xc9, 0x2e, 0xa2, 0xa8, 0x97, 0x25, 0x97, 0x51, 0x75, 0xe8, 0x4f, 0xf7, 0x41, 0xaf, 0x1a, 0x68, 0xd6, 0xe3, 0xb9, 0xf0, 0xb1, 0x0, 0x27, 0xd0, 0x4a, 0xcd, 0x4, 0xc9, 0xec, 0xb7, 0xf9, 0x16, 0x6d, 0x1a, 0x19, 0x5e, 0x87, 0x51, 0xa3, 0x3e, 0xa0, 0x1a, 0xb, 0x17, 0xd6, 0xe7, 0x28, 0x5a, 0x8, 0xff, 0xce, 0xd3, 0xf5, 0x83, 0xac, 0xc4, 0x21, 0x54, 0x50, 0x6a, 0xfa, 0xae, 0x42, 0x2b, 0x5f, 0x98, 0x42, 0x1e, 0x73, 0xb9, 0x69, 0x81, 0x5c, 0x3e, 0xe, 0xe0, 0x5e, 0xf1, 0x5c, 0xef, 0x12, 0x27, 0x26, 0x97, 0xe, 0x3f, 0x70, 0x33, 0x7d, 0x5f, 0x9c, 0xf8, 0xcd, 0x2c, 0xa9, 0xb9, 0x1b, 0x71, 0x59, 0x35, 0x7b, 0x1a, 0x48, 0x10, 0x9, 0x43, 0x7, 0x8a, 0x93, 0xb4, 0xd2, 0x85, 0x9b, 0x71, 0x3a, 0xf4, 0xe6, 0x9a, 0xbc, 0xdb, 0xc8, 0x30, 0x89, 0xa6, 0x2b, 0x1d, 0xdf, 0xfd, 0x4c, 0x2a, 0x1c, 0x99, 0x74, 0x6a, 0x42, 0x1c, 0xed, 0xb, 0x71, 0x7a, 0xf9, 0x7e, 0xc8, 0x77, 0x37, 0xd3, 0x24, 0x12, 0x58, 0xc1, 0x3f, 0x7a, 0x5c, 0xc3, 0xfc, 0xef, 0xce, 0xf7, 0x1c, 0x4a, 0xee, 0xde, 0x24, 0x47, 0x2f, 0xf4, 0xe1, 0xfb, 0xfe, 0xb0, 0x91, 0x9b, 0xa4, 0x6a, 0x5f, 0x61, 0x25, 0x3b, 0x45, 0xb5, 0xc0, 0xb, 0x7f, 0xa5, 0x91, 0x23, 0x33, 0x78, 0xd6, 0x15, 0xd4, 0xb0, 0x9f, 0xe0, 0x46, 0x34, 0xc1, 0xe7, 0x7b, 0xc1, 0x4b, 0x34, 0x83, 0x82, 0x33, 0xff, 0xf6, 0x35, 0x72, 0x34, 0x37, 0xf2, 0x2d, 0x3c, 0xfe, 0x4f, 0x33, 0x23, 0xff, 0xa2, 0xa6, 0x8e, 0x4d, 0x7f, 0x5d, 0x1e, 0x3d, 0xbb, 0x53, 0xb8, 0x69, 0x75, 0xc8, 0xf0, 0xf3, 0x20, 0x8c, 0x89, 0xdc, 0xb8, 0xbe, 0x22, 0xa9, 0x2d, 0x94, 0xec, 0x24, 0xfd, 0xc0, 0xea, 0x84, 0xeb, 0x39, 0x5d, 0x62, 0xc, 0xb2, 0xf1, 0x1e, 0xa5, 0xe5, 0x34, 0x25, 0xc0, 0x7b, 0x29, 0xa3, 0x62, 0x36, 0x96, 0x22, 0x5c, 0x3f, 0x70, 0x1, 0xff, 0x89, 0xa, 0x5f, 0x61, 0x9a, 0xfd, 0xf0, 0x22, 0xbe, 0x37, 0x58, 0x97, 0x33, 0x23, 0xb4, 0x5e, 0x92, 0x61, 0x80, 0x23, 0x32, 0x98, 0x9f, 0xd1, 0xe2, 0x24, 0x8b, 0x20, 0x76, 0xf6, 0x6d, 0x0, 0xf7, 0x82, 0xf7, 0xf4, 0x53, 0x4a, 0x82, 0x64, 0x77, 0x38, 0xd7, 0x74, 0xfb, 0x34, 0x96, 0x1e, 0x2c, 0xbc, 0xbe, 0x5c, 0xf7, 0x4f, 0x28, 0xd9, 0x45, 0xb, 0x30, 0xe5, 0x9b, 0x7a, 0x3c, 0xd8, 0xa0, 0x2d, 0x2, 0xb8, 0x31, 0xce, 0x91, 0xea, 0x33, 0xf3, 0x16, 0xd3, 0x82, 0x7a, 0x82, 0xda, 0x5d, 0xb6, 0xe2, 0x64, 0x9f, 0x51, 0x86, 0xf3, 0x5e, 0xe1, 0xfa, 0xf2, 0x3a, 0xcd, 0x7d, 0x30, 0x5d, 0x24, 0x27, 0xd1, 0xad, 0x12, 0x67, 0x40, 0x23, 0xbf, 0x9d, 0xdf, 0x35, 0x13, 0x5, 0x2, 0x1b, 0xfa, 0x5b, 0x46, 0x5e, 0x26, 0xc1, 0x95, 0x65, 0xf1, 0x5e, 0xb, 0xf9, 0xfc, 0x6, 0xa5, 0xf9, 0xcc, 0x47, 0xb4, 0x96, 0x5e, 0x92, 0xdc, 0xc5, 0x60, 0x93, 0x4a, 0xd6, 0x63, 0xb4, 0x38, 0xce, 0x33, 0x72, 0x6c, 0x1a, 0x25, 0xb, 0xd6, 0x8, 0xd2, 0xe5, 0x7, 0x70, 0xc3, 0x8e, 0x82, 0x62, 0x84, 0xe7, 0xd0, 0x22, 0xcd, 0x67, 0xf0, 0xde, 0xa0, 0xd4, 0xe7, 0x11, 0xbe, 0x77, 0x95, 0x59, 0xba, 0xb7, 0x4a, 0x5a, 0x8f, 0x10, 0xb8, 0x2a, 0x8f, 0xe1, 0xbe, 0xd4, 0xd3, 0xe3, 0xf3, 0xc8, 0xd4, 0x7e, 0x9c, 0x4a, 0xc9, 0x10, 0x7a, 0x2, 0x7c, 0x81, 0xb6, 0xb, 0xb, 0x16, 0x70, 0xd3, 0x15, 0x5b, 0x2c, 0xa8, 0xa0, 0xb2, 0xbf, 0xea, 0x91, 0x34, 0xa0, 0x3d, 0x5f, 0x50, 0xd, 0xd1, 0x2d, 0xa4, 0xbb, 0xe6, 0x20, 0xbe, 0xd4, 0xef, 0xe5, 0x68, 0x33, 0x5a, 0xca, 0x45, 0xdd, 0x87, 0x1b, 0xa2, 0x17, 0xfa, 0x51, 0x1b, 0x6d, 0x16, 0xe3, 0xf5, 0x82, 0xd, 0xe0, 0x9d, 0xc, 0x88, 0x6e, 0x39, 0xad, 0x63, 0x3c, 0x3b, 0xb8, 0x8a, 0xfe, 0x29, 0x8e, 0xdb, 0xb8, 0x2c, 0xcb, 0xf7, 0x3b, 0x22, 0xd, 0xd1, 0x2d, 0xe2, 0xa6, 0x86, 0x24, 0x95, 0xe7, 0x24, 0x1c, 0xc9, 0x46, 0x15, 0xf4, 0x58, 0xc, 0xe4, 0x7a, 0x43, 0x46, 0xa0, 0x57, 0x62, 0x44, 0x47, 0x12, 0xde, 0x81, 0x21, 0x5e, 0x2f, 0x5, 0x24, 0x90, 0xc7, 0xd3, 0x10, 0x5d, 0x5, 0x49, 0x1e, 0xdf, 0xf7, 0x4c, 0x92, 0x77, 0x65, 0x8e, 0xee, 0x17, 0x99, 0xe9, 0x4f, 0xf2, 0x5e, 0xb0, 0xc6, 0xa7, 0xa6, 0xf9, 0xec, 0xe9, 0x54, 0xe2, 0x7a, 0x28, 0xd9, 0x45, 0x3, 0x4d, 0xa5, 0x6a, 0x5c, 0x6a, 0x43, 0x40, 0xae, 0x3, 0x68, 0xac, 0x23, 0xa9, 0xb9, 0xed, 0x98, 0xe6, 0x73, 0x88, 0x91, 0xc0, 0xb5, 0x89, 0xb6, 0x65, 0xd7, 0x85, 0xc8, 0x55, 0x33, 0x99, 0x5a, 0xdf, 0x5f, 0x65, 0x63, 0x72, 0x82, 0x1b, 0x88, 0xb, 0x3d, 0x95, 0x46, 0x23, 0x8f, 0x32, 0x4e, 0xe4, 0xf3, 0xeb, 0x9a, 0xe6, 0x33, 0x8b, 0xa8, 0xa0, 0xec, 0x46, 0x6b, 0xf8, 0xe3, 0x1c, 0xde, 0x2f, 0xea, 0xd6, 0xce, 0xf7, 0xb8, 0xf6, 0x16, 0x35, 0xf3, 0xfb, 0x25, 0xbc, 0xae, 0x67, 0x90, 0xde, 0xb9, 0x54, 0x16, 0x3e, 0xf4, 0xf8, 0x4c, 0xb, 0x2a, 0x58, 0x5d, 0x42, 0x78, 0xff, 0xf0, 0x82, 0x20, 0x83, 0x14, 0xb1, 0x78, 0x2f, 0x4f, 0xd1, 0xe7, 0xfc, 0x7e, 0x20, 0x8e, 0xaf, 0x43, 0x74, 0xef, 0x50, 0xf6, 0x9f, 0x26, 0x91, 0xd, 0x4d, 0x63, 0xbd, 0xc1, 0x9d, 0xfc, 0x6, 0xf7, 0x5, 0x25, 0xbb, 0x90, 0x3, 0xd9, 0x88, 0xee, 0xf4, 0xfb, 0x1f, 0xc4, 0xdf, 0x6c, 0x4c, 0x68, 0x77, 0x97, 0x88, 0xe3, 0x8a, 0xec, 0x5b, 0x8d, 0x1b, 0xe3, 0x6, 0x5a, 0x3, 0x8, 0x2, 0xaf, 0xc, 0xe9, 0x9c, 0xc1, 0xe5, 0x75, 0x38, 0x49, 0xd9, 0x8b, 0xf0, 0x86, 0x4b, 0x38, 0x12, 0x7f, 0xfc, 0xc2, 0x60, 0x6a, 0xdf, 0x4d, 0xd3, 0x68, 0xe7, 0xf, 0x50, 0x23, 0x86, 0x82, 0xb2, 0x24, 0xc7, 0xf7, 0x8b, 0x58, 0xeb, 0xdf, 0x3d, 0xae, 0xdd, 0xc1, 0xeb, 0x73, 0x22, 0x32, 0xf7, 0x88, 0x5f, 0xf5, 0xa7, 0x75, 0x6c, 0xc3, 0xb6, 0xb4, 0x9c, 0xb6, 0xc, 0xd1, 0x3d, 0xb7, 0xa5, 0x17, 0xc4, 0x8b, 0x4, 0xa0, 0x50, 0x27, 0x4b, 0x3f, 0xde, 0xd, 0xf1, 0xdc, 0xc3, 0xd2, 0xbb, 0x99, 0x7b, 0xd2, 0x48, 0x8f, 0xcf, 0x34, 0xe7, 0xfc, 0x5f, 0xa0, 0x64, 0x17, 0x6e, 0x6c, 0x6f, 0x19, 0x9b, 0xef, 0xb3, 0xe5, 0x8, 0x17, 0xd1, 0xed, 0x69, 0xdc, 0x18, 0x58, 0xf8, 0x88, 0xc7, 0xed, 0xc3, 0x17, 0x20, 0xa, 0xbd, 0x2, 0x3f, 0xe5, 0x6, 0xf4, 0x59, 0x1a, 0x17, 0xc7, 0xc5, 0x31, 0x58, 0x1f, 0x50, 0x54, 0xae, 0x15, 0x27, 0x8b, 0xd1, 0x2b, 0x69, 0x2, 0xc9, 0x26, 0x70, 0xe1, 0x9e, 0x1d, 0x12, 0x2b, 0x1c, 0xb1, 0xd3, 0x3b, 0xc5, 0x5e, 0xba, 0x72, 0xa3, 0x38, 0x75, 0x6b, 0x51, 0xab, 0x57, 0x43, 0x79, 0x10, 0x12, 0x53, 0x4e, 0x13, 0x7b, 0x88, 0x61, 0x2f, 0x3e, 0xa7, 0x30, 0x0, 0x56, 0x26, 0xba, 0xd, 0xed, 0xef, 0x71, 0x7d, 0x1a, 0xdf, 0x1d, 0x28, 0xb6, 0x51, 0xc9, 0x28, 0x9d, 0x42, 0x5, 0x17, 0x56, 0x9e, 0x2d, 0xeb, 0xbb, 0x9, 0x95, 0x91, 0xcb, 0x94, 0xec, 0xc2, 0xb, 0x5b, 0x26, 0x9d, 0x9f, 0x1a, 0x2f, 0x5c, 0x19, 0x7, 0xa4, 0xb9, 0xfe, 0x39, 0x17, 0x11, 0x5e, 0xe2, 0xa8, 0x35, 0x5f, 0xfe, 0x86, 0x16, 0xc2, 0x27, 0x1e, 0xd7, 0x61, 0x59, 0xfc, 0x3e, 0xe2, 0xeb, 0x3, 0x75, 0x5d, 0xc3, 0xaa, 0xb1, 0x72, 0xfb, 0xd2, 0x6a, 0xf, 0xb, 0xb0, 0xe9, 0xdb, 0x4e, 0xbb, 0xb8, 0x85, 0xca, 0x54, 0x94, 0x1, 0xa5, 0x10, 0xc9, 0x2b, 0xb6, 0xf8, 0xe2, 0xb9, 0x54, 0x3a, 0x72, 0x89, 0x4e, 0xb4, 0xe8, 0xbc, 0xfa, 0x58, 0xbe, 0x40, 0x6b, 0x2e, 0x8a, 0xb5, 0x82, 0x15, 0xb4, 0xf2, 0x8e, 0x13, 0xef, 0xee, 0x52, 0x37, 0x53, 0x29, 0x51, 0xb2, 0xb, 0x19, 0xa0, 0xa9, 0xef, 0x6a, 0x19, 0x9f, 0xec, 0xe3, 0xef, 0x98, 0x27, 0x76, 0x77, 0x12, 0x12, 0x18, 0xae, 0x20, 0x19, 0x8c, 0x8e, 0xf0, 0x1c, 0x7e, 0xcf, 0xc5, 0x6f, 0x4b, 0x55, 0x47, 0x2d, 0xcf, 0x8, 0x9, 0x77, 0x27, 0x91, 0x74, 0x80, 0x5b, 0x66, 0x88, 0xc7, 0x35, 0x3c, 0x3f, 0xb4, 0x3, 0x43, 0xfc, 0xf2, 0xc7, 0x10, 0xdd, 0x33, 0x14, 0xa7, 0x13, 0x2c, 0xe3, 0x2f, 0x92, 0xe8, 0x2a, 0x63, 0xf0, 0xde, 0xa2, 0x3c, 0xe2, 0x7c, 0xcb, 0x77, 0xc1, 0xfb, 0xdc, 0x26, 0x87, 0xf7, 0x5, 0xc5, 0xf6, 0x71, 0xf1, 0x3e, 0xf, 0x13, 0xef, 0x2, 0x4a, 0x2b, 0xa2, 0x7e, 0xca, 0xc3, 0x3b, 0x5c, 0x67, 0x5f, 0x7a, 0xf0, 0xd5, 0x70, 0x7a, 0xf, 0x94, 0xec, 0x42, 0x4, 0xc4, 0xea, 0xf6, 0xb3, 0x8c, 0xcf, 0xf2, 0xf1, 0x77, 0xe0, 0x85, 0xbc, 0x47, 0x36, 0x3d, 0x1f, 0x6f, 0x24, 0xad, 0x1, 0x68, 0xda, 0x25, 0x31, 0x98, 0xc7, 0x25, 0xb4, 0x4c, 0x6d, 0x41, 0xec, 0x3d, 0xeb, 0xea, 0xda, 0xc8, 0x11, 0x50, 0xc3, 0x75, 0x87, 0xc7, 0x35, 0x14, 0xd4, 0xa2, 0x9d, 0xd2, 0x53, 0x21, 0xbb, 0x67, 0x64, 0x15, 0x5f, 0x2c, 0x55, 0xdd, 0xad, 0x8b, 0x39, 0x5e, 0x16, 0xa3, 0x77, 0x17, 0x1d, 0x7c, 0x1e, 0x4a, 0xf9, 0x37, 0xdc, 0xe9, 0xe8, 0x21, 0xfb, 0x4c, 0x8e, 0xee, 0x7, 0xa, 0x1d, 0x5a, 0x6a, 0xed, 0xed, 0x71, 0xfd, 0x1a, 0x3e, 0x83, 0xb8, 0x9c, 0xe7, 0x87, 0x2c, 0xcd, 0x3f, 0xca, 0xc6, 0x3a, 0x49, 0x9b, 0x17, 0xe1, 0x7c, 0x25, 0xbb, 0xf0, 0x0, 0x8d, 0x95, 0xdd, 0xad, 0x7a, 0x16, 0x5, 0xa0, 0x79, 0x55, 0x70, 0xa1, 0x63, 0x61, 0xdc, 0xc4, 0x45, 0xf2, 0x75, 0xcc, 0xe6, 0x72, 0x2, 0xdd, 0x17, 0xb6, 0xc4, 0x1e, 0x8c, 0xef, 0x16, 0xa1, 0xef, 0x2, 0x57, 0x98, 0x57, 0xcc, 0xb, 0x5d, 0x6b, 0xe, 0x16, 0xef, 0x58, 0x65, 0x2e, 0x81, 0x98, 0x6f, 0x6f, 0xcb, 0xf8, 0xdf, 0x24, 0x98, 0xec, 0xe2, 0x5c, 0x3, 0x1e, 0x13, 0x64, 0x36, 0xa3, 0x1e, 0xf, 0xa1, 0x2, 0xa4, 0xcc, 0xaf, 0xcd, 0xc1, 0x7d, 0x60, 0x9d, 0x20, 0xa6, 0xeb, 0x55, 0x2, 0x71, 0x95, 0x78, 0x27, 0xb, 0x45, 0x19, 0x8b, 0xa9, 0xf4, 0xbd, 0xe2, 0xc1, 0x5b, 0xe8, 0x67, 0xda, 0x5f, 0xc9, 0x2e, 0x1c, 0x38, 0xd2, 0x43, 0x63, 0x59, 0x18, 0xc0, 0xef, 0x5a, 0xca, 0xdf, 0x77, 0x65, 0x4c, 0xac, 0x39, 0x1b, 0x60, 0xe9, 0x3c, 0x6a, 0x19, 0x47, 0xf0, 0x7a, 0x50, 0x44, 0xbe, 0x3, 0x6a, 0xb7, 0xee, 0x13, 0x7b, 0x7f, 0xcb, 0x2f, 0xf9, 0xc, 0xe7, 0x85, 0xf4, 0xde, 0x61, 0xd9, 0xb8, 0x33, 0x60, 0xe1, 0x92, 0x7f, 0x2e, 0xa6, 0xeb, 0xd, 0xef, 0xe9, 0x19, 0xe2, 0x14, 0x62, 0xe7, 0xd2, 0x6a, 0x1d, 0x4c, 0xcf, 0x86, 0x97, 0x45, 0x77, 0x63, 0x8c, 0xf7, 0x50, 0x24, 0xe, 0xd, 0xf0, 0x50, 0xfe, 0x10, 0xc6, 0x40, 0x86, 0x72, 0xa6, 0x1d, 0x86, 0x94, 0xec, 0x2, 0x2, 0xfa, 0x40, 0xda, 0x3a, 0x4, 0xa0, 0x8b, 0x40, 0x50, 0xc5, 0xb5, 0xab, 0xf3, 0x60, 0x5e, 0x87, 0x79, 0x90, 0x1, 0x62, 0x15, 0x5d, 0x43, 0x7e, 0xef, 0x28, 0xf0, 0x47, 0xdd, 0x59, 0x5b, 0xcb, 0xb5, 0xc9, 0xb4, 0x20, 0x16, 0x87, 0xf4, 0xde, 0xe1, 0x92, 0x3f, 0xd4, 0xe2, 0x51, 0xb8, 0x47, 0xaa, 0x36, 0x3a, 0x57, 0xf8, 0x7, 0xa4, 0xe4, 0xdf, 0x22, 0xf6, 0x32, 0x9b, 0xbb, 0x62, 0x6a, 0xd1, 0xb9, 0x81, 0x12, 0x29, 0xc4, 0xed, 0x6d, 0xde, 0xaa, 0x36, 0xb4, 0xb8, 0x33, 0x3a, 0x5d, 0x45, 0xc9, 0x2e, 0x18, 0xa0, 0xc0, 0x7b, 0x67, 0xd7, 0x18, 0xfc, 0xe9, 0x63, 0x74, 0x6a, 0xea, 0x84, 0xef, 0xf8, 0xf2, 0xbb, 0x81, 0x98, 0xc6, 0xd9, 0x21, 0xbf, 0x77, 0xd4, 0xc7, 0xf5, 0xf2, 0xb0, 0x20, 0x50, 0x50, 0x1e, 0x66, 0x57, 0x20, 0x36, 0xdd, 0xad, 0x5d, 0x63, 0x70, 0xc7, 0xbf, 0xac, 0x4b, 0x32, 0x30, 0xa0, 0x6d, 0xdc, 0xdd, 0x62, 0x3f, 0x3d, 0x2, 0x9d, 0x5d, 0x2e, 0xcb, 0xa3, 0xb9, 0xc0, 0x5a, 0x3b, 0xd9, 0xe3, 0x1d, 0x41, 0x8f, 0xdd, 0x8c, 0xca, 0x42, 0x94, 0xec, 0x82, 0xc1, 0x11, 0x16, 0x6d, 0x3, 0xe9, 0xb4, 0x1f, 0xeb, 0xd4, 0xd4, 0x19, 0xe8, 0x68, 0x31, 0xc9, 0x32, 0x7e, 0xbc, 0x64, 0xd6, 0xe9, 0x3d, 0x17, 0x40, 0x31, 0xf8, 0x85, 0x96, 0x71, 0xc4, 0x80, 0x90, 0xac, 0x32, 0x25, 0xe4, 0x73, 0xe, 0x2f, 0x85, 0x3b, 0xc6, 0x88, 0x92, 0x90, 0x65, 0xba, 0x1c, 0x3, 0x3, 0x36, 0x70, 0x5b, 0x89, 0x1, 0x9a, 0x7d, 0xa3, 0xc, 0xa2, 0x24, 0xcf, 0xe6, 0x63, 0x2a, 0xdf, 0x21, 0x9b, 0x67, 0xc, 0x39, 0xb, 0x47, 0x29, 0xd9, 0x65, 0x1f, 0x68, 0xf, 0xf6, 0x7f, 0x96, 0x71, 0xd4, 0xc7, 0x6c, 0xd0, 0xe9, 0xa9, 0x33, 0xd0, 0x75, 0xe1, 0x1e, 0xcb, 0x78, 0xcb, 0x4c, 0x16, 0x7c, 0x96, 0x51, 0x42, 0xab, 0x13, 0xd6, 0xa8, 0xad, 0x4f, 0x29, 0xd2, 0xf5, 0x47, 0x86, 0x7c, 0xbe, 0x11, 0x5f, 0xb4, 0x9d, 0x62, 0xff, 0xb6, 0x2e, 0xc5, 0xc0, 0xd0, 0x97, 0x4a, 0x90, 0x1b, 0xd8, 0x3f, 0xd0, 0x6f, 0x74, 0x71, 0x9e, 0xce, 0xb, 0xf6, 0x50, 0xaf, 0x2c, 0x66, 0xd4, 0xac, 0xb6, 0x50, 0xb2, 0xcb, 0x2e, 0x50, 0x8, 0xdd, 0xd1, 0x35, 0x6, 0x6d, 0xe4, 0x39, 0x9d, 0x1a, 0xdf, 0x80, 0x14, 0xf0, 0x19, 0xae, 0xb1, 0x4, 0xc9, 0xae, 0x28, 0x44, 0xf7, 0x9, 0xb2, 0x43, 0x3d, 0xdd, 0x5e, 0x96, 0x6b, 0x48, 0x7c, 0x18, 0x11, 0x81, 0xb9, 0x46, 0x1f, 0x52, 0xdb, 0xb1, 0x2c, 0x9f, 0xeb, 0x32, 0xc, 0x4, 0x50, 0x8e, 0x6e, 0xb7, 0xec, 0xcd, 0x28, 0x33, 0x42, 0xe6, 0xe5, 0x67, 0x79, 0x3e, 0x3f, 0xc8, 0x38, 0xff, 0xc0, 0x32, 0x8e, 0xce, 0x32, 0x43, 0x94, 0xec, 0xb2, 0x87, 0x22, 0xba, 0x18, 0xdc, 0x80, 0xcb, 0x67, 0x92, 0x4e, 0x8f, 0x6f, 0x40, 0x52, 0xc4, 0xf3, 0x96, 0x71, 0x9c, 0x90, 0xbc, 0x7d, 0x88, 0xee, 0x13, 0x75, 0x51, 0x36, 0xf7, 0xe5, 0x3c, 0x8f, 0xf1, 0xb0, 0x92, 0x9d, 0x7b, 0x4e, 0xe1, 0xbe, 0x5c, 0xa1, 0xcb, 0x30, 0x10, 0x60, 0xff, 0xb0, 0x95, 0xd2, 0x8c, 0x15, 0xe7, 0x6c, 0xc7, 0x7c, 0x7, 0x5a, 0xa0, 0x9d, 0x27, 0xf6, 0xc4, 0xa8, 0xf3, 0x3c, 0x14, 0x4b, 0x25, 0xbb, 0x0, 0x80, 0xd4, 0x71, 0x5b, 0xcf, 0x3a, 0xa4, 0xcd, 0xaf, 0xd7, 0xe9, 0xf1, 0x15, 0xb0, 0x94, 0xdd, 0x1d, 0xf5, 0x51, 0xd7, 0xd8, 0x33, 0x44, 0xf7, 0x88, 0x17, 0xaf, 0xb9, 0x6b, 0xc, 0x59, 0x8c, 0xc3, 0x24, 0x98, 0x12, 0x94, 0x20, 0xd0, 0xc4, 0x62, 0x2d, 0xa3, 0x31, 0xc2, 0x6a, 0x5d, 0x82, 0xbe, 0x3, 0xa7, 0xa9, 0xdb, 0xba, 0x83, 0x60, 0x9d, 0x5f, 0xa4, 0x7b, 0xc8, 0x6f, 0x98, 0x4a, 0xeb, 0xd7, 0x8d, 0x46, 0x95, 0x95, 0x95, 0xd7, 0x16, 0x35, 0x68, 0xd0, 0x40, 0xc9, 0x2e, 0x58, 0xa0, 0xb3, 0x84, 0xad, 0x33, 0xf7, 0x7c, 0x51, 0x17, 0x66, 0x10, 0x80, 0x1b, 0xd3, 0x76, 0x34, 0x4b, 0xbf, 0x90, 0xdf, 0x37, 0xda, 0xb7, 0x3d, 0x1d, 0xa1, 0x79, 0xb6, 0x95, 0x4a, 0x20, 0x76, 0x54, 0xa6, 0x4b, 0xd0, 0x77, 0xa0, 0x2b, 0x88, 0xed, 0x0, 0x63, 0xc4, 0xa8, 0x27, 0xea, 0xf4, 0x6c, 0x2, 0x34, 0x86, 0x9e, 0xe6, 0x1e, 0x34, 0x44, 0xd7, 0xef, 0x8d, 0xd1, 0x1f, 0xf4, 0x56, 0xb2, 0xb, 0x16, 0xa7, 0x79, 0x58, 0x75, 0x88, 0xcb, 0xac, 0xd2, 0xe9, 0xf1, 0x1d, 0x65, 0x1e, 0x64, 0xb7, 0xaf, 0x84, 0x2b, 0x6e, 0xe7, 0x26, 0x89, 0x2b, 0x23, 0x46, 0x14, 0x4d, 0x2c, 0x63, 0x68, 0xdd, 0x56, 0xaa, 0x4b, 0xd0, 0x57, 0x20, 0x2e, 0x3a, 0xc0, 0x32, 0x3e, 0x4f, 0xa2, 0x11, 0xdb, 0xcd, 0x36, 0xb0, 0xa7, 0x5e, 0xef, 0x1e, 0x2c, 0x28, 0x28, 0x28, 0x9c, 0x38, 0x6d, 0xe6, 0x25, 0xd3, 0x67, 0xcf, 0x4d, 0x28, 0xd9, 0x5, 0x3, 0xd4, 0x20, 0x5d, 0x61, 0x19, 0x9f, 0x2d, 0xb9, 0xeb, 0xa7, 0x97, 0xf, 0x40, 0x92, 0x84, 0xdb, 0xb5, 0x83, 0x73, 0xc7, 0x3a, 0x87, 0xf4, 0x7e, 0xd1, 0xc8, 0x77, 0x42, 0xc4, 0xe6, 0xd8, 0xd6, 0xa2, 0x6d, 0xb5, 0xf8, 0x7b, 0x26, 0xa3, 0xc2, 0x51, 0x96, 0xb7, 0xb1, 0x8c, 0xa3, 0x65, 0xd9, 0x12, 0x9d, 0x1e, 0x2b, 0x70, 0xca, 0xc3, 0x26, 0x8d, 0xee, 0x13, 0x86, 0xe2, 0x4a, 0x4a, 0x4b, 0xfb, 0xbe, 0xfc, 0xf6, 0x7b, 0x87, 0x54, 0x54, 0x54, 0x28, 0xd9, 0xf9, 0xc, 0x68, 0x10, 0xe8, 0x64, 0x60, 0x3b, 0x1d, 0xfc, 0x1f, 0xe2, 0x7d, 0xa, 0xaf, 0xa2, 0xee, 0x98, 0x60, 0xd9, 0x8, 0x90, 0xcd, 0xb6, 0x4b, 0x8, 0xef, 0x15, 0xa7, 0x17, 0xdc, 0x11, 0x13, 0x92, 0x80, 0x15, 0x52, 0xac, 0xcb, 0xcf, 0x37, 0x6c, 0xee, 0x61, 0xd5, 0xa1, 0x98, 0xfa, 0x5e, 0x9d, 0x1e, 0x4f, 0xa0, 0x51, 0xc7, 0xad, 0x6e, 0x2f, 0x43, 0xe3, 0x46, 0xd, 0x65, 0xfc, 0xa4, 0xa9, 0x83, 0xbf, 0x9e, 0x3a, 0xa3, 0xbe, 0x92, 0x9d, 0xbf, 0x40, 0xab, 0xaa, 0xd3, 0x2d, 0xe3, 0xef, 0x1b, 0x79, 0x56, 0xa7, 0x27, 0x70, 0x2, 0x59, 0x60, 0x51, 0x3e, 0xc2, 0x48, 0x76, 0x6f, 0x89, 0xbf, 0x27, 0x5e, 0x64, 0x53, 0x99, 0x73, 0xa3, 0xbe, 0x2e, 0x3d, 0x5f, 0x81, 0x63, 0x93, 0x6c, 0xb1, 0xd1, 0x7f, 0x4b, 0xb8, 0x8e, 0x78, 0xa, 0x23, 0x50, 0x86, 0x30, 0xae, 0xa, 0xb, 0x96, 0x57, 0xf4, 0x5a, 0xb7, 0x7e, 0x43, 0x77, 0x25, 0x3b, 0xff, 0x80, 0xb6, 0x60, 0x23, 0x2c, 0xf3, 0x88, 0xf4, 0xd8, 0x28, 0x9e, 0xd8, 0x1c, 0x45, 0x4c, 0xb3, 0x8c, 0x6d, 0x1b, 0xb2, 0x7b, 0x44, 0xbd, 0xdd, 0xdd, 0x11, 0x9d, 0x5f, 0x9b, 0x67, 0x2, 0x87, 0xb7, 0x36, 0xd6, 0xa5, 0xe7, 0xb, 0x10, 0x5f, 0x3e, 0xd6, 0x32, 0x8e, 0xc2, 0xf1, 0xa7, 0x74, 0x7a, 0xaa, 0x5, 0xc2, 0x18, 0x55, 0x4a, 0x32, 0x8a, 0x8b, 0x8b, 0x1a, 0xff, 0xe7, 0xc5, 0xd7, 0x8f, 0x57, 0xb2, 0xf3, 0x7, 0x88, 0xd, 0x3d, 0x6c, 0x64, 0x2b, 0xcb, 0x35, 0xb8, 0xab, 0xbe, 0xd4, 0x29, 0xca, 0xa, 0x6c, 0xf5, 0x8b, 0x88, 0xa1, 0x16, 0x86, 0xe8, 0x1e, 0xdf, 0x95, 0xe8, 0xc5, 0xea, 0x92, 0xb0, 0xc5, 0x8b, 0x60, 0x85, 0x34, 0xd5, 0xa5, 0xe7, 0xb, 0xe0, 0x85, 0xe8, 0x65, 0x19, 0x7f, 0x43, 0xbc, 0x4f, 0xec, 0x56, 0x6c, 0x8a, 0x57, 0xdc, 0x73, 0x55, 0x2f, 0x91, 0x90, 0x1f, 0x57, 0xae, 0x3a, 0xe9, 0xb5, 0x51, 0x63, 0x37, 0x53, 0xb2, 0xab, 0x1b, 0x50, 0x3b, 0x5, 0x17, 0xe5, 0x9e, 0x96, 0x6b, 0x1f, 0x89, 0x73, 0x7c, 0xbc, 0x22, 0x3b, 0xb0, 0x6d, 0x8, 0xcd, 0xc4, 0x69, 0xdb, 0x16, 0x6, 0x20, 0xae, 0xf0, 0x5f, 0x89, 0x6e, 0xaa, 0x3e, 0xba, 0xce, 0x2f, 0x75, 0x8d, 0x41, 0x91, 0xe8, 0xa9, 0x4b, 0xcf, 0x17, 0xf4, 0x11, 0x7b, 0xf6, 0xf0, 0x23, 0x3a, 0x35, 0x19, 0x3, 0x2d, 0x4, 0x1f, 0x4b, 0x1d, 0x48, 0x18, 0xb2, 0x2b, 0x29, 0x29, 0x6d, 0x3d, 0x67, 0xfe, 0xb7, 0x7d, 0x95, 0xec, 0x6a, 0x8f, 0x2d, 0xb8, 0x79, 0x1d, 0x6c, 0xb9, 0x86, 0xae, 0xfc, 0xe8, 0xbe, 0x5f, 0xa2, 0xd3, 0x94, 0x35, 0xd8, 0x3a, 0xa1, 0xb7, 0xe, 0x91, 0xe5, 0x1, 0xcb, 0xe8, 0xf5, 0x8, 0xcf, 0xef, 0x4f, 0x1e, 0x73, 0xfc, 0x47, 0x5d, 0x7a, 0xbe, 0xe0, 0x78, 0xcb, 0xd8, 0x78, 0x8a, 0x22, 0x73, 0xe0, 0x1d, 0xdb, 0xa4, 0xd1, 0x41, 0xc3, 0xe2, 0x6, 0x32, 0x7d, 0xf6, 0xdc, 0xa3, 0xd, 0xe1, 0x29, 0xd9, 0xd5, 0x2, 0xb0, 0x18, 0x9e, 0xf7, 0x20, 0x3a, 0x10, 0xdc, 0x99, 0x62, 0x8f, 0x21, 0x29, 0x82, 0xc3, 0x5a, 0x8b, 0x72, 0x1, 0xa2, 0x6b, 0x10, 0x92, 0xfb, 0x1b, 0x49, 0xc2, 0x88, 0x2a, 0x56, 0x79, 0x6c, 0xbc, 0xb0, 0x48, 0x3a, 0xea, 0xf2, 0xab, 0x13, 0x76, 0x12, 0xfb, 0x39, 0x8c, 0x50, 0xa6, 0xb5, 0x8e, 0xb1, 0x66, 0xc0, 0xc9, 0x21, 0x9b, 0x84, 0xa, 0xa, 0xa, 0xa, 0x64, 0xc9, 0xd2, 0xe5, 0xfb, 0x2d, 0x5f, 0xf1, 0x53, 0x1b, 0x25, 0xbb, 0x9a, 0x1, 0xbe, 0xf5, 0xb7, 0x3c, 0x88, 0xe, 0x18, 0x2c, 0xe1, 0xef, 0x60, 0x1f, 0x47, 0xa0, 0x95, 0x92, 0x3b, 0x89, 0x2, 0xae, 0xc3, 0xb0, 0xa4, 0xf8, 0xc7, 0x21, 0x23, 0x77, 0xb4, 0x65, 0x3e, 0xe1, 0xca, 0xbf, 0x5c, 0x97, 0x5f, 0x9d, 0x80, 0x73, 0x2, 0xdd, 0xee, 0x76, 0xf4, 0x7c, 0xd4, 0xa3, 0xc0, 0x6a, 0xe, 0x24, 0xaa, 0x8c, 0x4a, 0x1d, 0xa8, 0xac, 0xac, 0x34, 0x84, 0x57, 0xbf, 0x5d, 0x79, 0x45, 0xc5, 0xee, 0x4a, 0x76, 0x35, 0x73, 0x35, 0xe0, 0x85, 0xef, 0xe1, 0x71, 0x1d, 0x7, 0x73, 0x3e, 0xa0, 0xd3, 0x94, 0x33, 0x94, 0xbb, 0xfe, 0x8d, 0x1a, 0xb0, 0x30, 0x74, 0x51, 0x81, 0xff, 0x64, 0x72, 0xc, 0xe6, 0xf7, 0x1d, 0x23, 0x73, 0x2d, 0xe3, 0x67, 0x88, 0x93, 0x36, 0xaf, 0xa8, 0x1d, 0xd0, 0x71, 0xc9, 0x5d, 0xda, 0x31, 0x4f, 0xc2, 0x7f, 0xbe, 0x61, 0x58, 0xf1, 0x86, 0x5b, 0x29, 0x6b, 0x58, 0x5c, 0x54, 0xef, 0xc9, 0x17, 0x5e, 0xdb, 0x7f, 0x43, 0x49, 0x89, 0x92, 0x5d, 0x35, 0xc0, 0xf9, 0x48, 0x48, 0x19, 0x47, 0x2f, 0xc3, 0x6d, 0x3c, 0x3e, 0x73, 0x83, 0x38, 0x8d, 0x7d, 0x15, 0xb9, 0x83, 0x7b, 0xc3, 0x40, 0x6, 0x56, 0x93, 0x10, 0xdc, 0xd7, 0xa7, 0x12, 0x8f, 0x3, 0x4e, 0x51, 0x4a, 0x73, 0xbf, 0xc7, 0xb5, 0xfb, 0x8c, 0x1c, 0xa6, 0x4b, 0xb0, 0xc6, 0x40, 0x48, 0xa4, 0x8b, 0x65, 0x1c, 0x56, 0x9d, 0x36, 0xd9, 0xae, 0x1d, 0x10, 0x42, 0x9a, 0xed, 0x1e, 0x2c, 0x2d, 0x2b, 0x3b, 0xa0, 0x41, 0x61, 0x61, 0x42, 0xc9, 0xce, 0xe, 0x6c, 0x94, 0x28, 0x14, 0x47, 0x3b, 0xaa, 0x41, 0x46, 0xa, 0x2c, 0x9f, 0x41, 0x76, 0x1d, 0x8e, 0xe3, 0xb8, 0x5a, 0xa7, 0x2b, 0x94, 0xa8, 0xc, 0xc1, 0x3d, 0x6c, 0x8, 0xc9, 0x7d, 0xf8, 0x81, 0xc7, 0xc4, 0x1e, 0x8f, 0xc6, 0xa6, 0x8d, 0x18, 0xd3, 0xa9, 0xba, 0xe4, 0x6a, 0x84, 0x76, 0x46, 0x3a, 0x59, 0xc6, 0xc7, 0xe8, 0xd4, 0xd4, 0x1a, 0x25, 0xee, 0xf9, 0xfb, 0x35, 0x2b, 0xb3, 0xb4, 0xb4, 0xfb, 0xec, 0x79, 0xb, 0x5a, 0x28, 0xd9, 0x6d, 0x8a, 0x86, 0xe2, 0xb4, 0xed, 0x81, 0xcb, 0x12, 0xa9, 0xbf, 0x3b, 0x78, 0x7c, 0xe, 0xda, 0xfa, 0x49, 0xd4, 0x6a, 0x15, 0xa, 0x2f, 0xc4, 0xe9, 0xfd, 0x5a, 0x2e, 0xce, 0xe1, 0x98, 0xb6, 0x12, 0x8a, 0xcd, 0xf8, 0xbe, 0xa0, 0x13, 0x7d, 0x2b, 0x7d, 0xec, 0x19, 0x61, 0x3b, 0xee, 0x37, 0x6e, 0x5, 0x4d, 0xeb, 0x73, 0xeb, 0x86, 0x8f, 0xdd, 0x64, 0xf7, 0xcb, 0x2f, 0x6b, 0x8b, 0x47, 0x8e, 0xf9, 0x68, 0x8f, 0x7a, 0x21, 0xd6, 0x8a, 0xb3, 0x5, 0xbc, 0xa8, 0xbd, 0xc4, 0xe9, 0x63, 0x9, 0x5f, 0xf9, 0xa3, 0x46, 0xf6, 0x49, 0xf3, 0xf9, 0x2f, 0x8c, 0x1c, 0x22, 0x7a, 0x6c, 0x8f, 0x22, 0xff, 0x80, 0xf4, 0xee, 0x6b, 0x3d, 0xae, 0xa1, 0x85, 0xd8, 0x5, 0xdc, 0xac, 0x71, 0x54, 0x4d, 0x6b, 0x9d, 0xae, 0xb4, 0xb0, 0x35, 0x2b, 0x47, 0x7c, 0x57, 0x9b, 0x3e, 0xd7, 0xd, 0xd3, 0xc5, 0x75, 0xb0, 0x2b, 0x8, 0xaf, 0xb8, 0xa8, 0xa8, 0x73, 0x41, 0x9a, 0x85, 0x8b, 0x6b, 0x89, 0x18, 0x4d, 0x42, 0x25, 0xbf, 0x53, 0x63, 0xba, 0xf, 0xba, 0x89, 0x73, 0x1c, 0xc, 0xfe, 0xbe, 0x67, 0x6, 0xdf, 0x15, 0x49, 0x10, 0x77, 0x8a, 0xd3, 0xf4, 0x79, 0xa5, 0xae, 0x29, 0x45, 0x9e, 0x2, 0xd, 0x13, 0xd0, 0x35, 0xe8, 0xaf, 0x69, 0x2c, 0x96, 0x7b, 0x48, 0x78, 0xaf, 0x89, 0xe3, 0xfe, 0x9c, 0x91, 0x67, 0xa, 0x74, 0x26, 0xb0, 0x95, 0x1c, 0xe0, 0x50, 0x52, 0x3d, 0xa0, 0xb5, 0x6e, 0x40, 0xad, 0xf3, 0x42, 0x71, 0xb9, 0x88, 0xcb, 0xca, 0xcb, 0x3d, 0xc9, 0xe, 0xf1, 0x2a, 0xa4, 0xd8, 0xc7, 0xc9, 0xd, 0x53, 0xc9, 0x97, 0x14, 0x49, 0x27, 0x45, 0x52, 0xb3, 0x66, 0xb6, 0x63, 0xc5, 0xc9, 0xb8, 0x1c, 0x9b, 0xa7, 0xb, 0x8, 0xf3, 0x85, 0x62, 0xfa, 0x86, 0x29, 0xf3, 0x57, 0xc9, 0xf5, 0xd1, 0x82, 0x73, 0x89, 0xf8, 0xd4, 0xa, 0xd7, 0x7c, 0xe3, 0xdf, 0xf0, 0xa3, 0xaf, 0xa1, 0x82, 0xa0, 0xc5, 0xf6, 0xd1, 0x47, 0x5, 0x2d, 0xb8, 0xf9, 0x7c, 0x27, 0xbc, 0x8a, 0xf7, 0x3b, 0x51, 0x40, 0x8a, 0xef, 0x19, 0x79, 0xc9, 0xc8, 0x67, 0xa2, 0x99, 0x86, 0x49, 0xd8, 0x1a, 0x3f, 0xcf, 0x54, 0xa5, 0xa0, 0xce, 0x58, 0x4a, 0xc2, 0xfb, 0x8d, 0xec, 0x1a, 0x35, 0x2c, 0x96, 0xcf, 0x27, 0x4c, 0xda, 0xda, 0x8b, 0xec, 0xb6, 0xa6, 0xe4, 0x3b, 0x92, 0xc7, 0xbf, 0x3f, 0x9d, 0x27, 0x1b, 0x35, 0xda, 0x40, 0xc1, 0xad, 0xbb, 0x87, 0x38, 0x6e, 0x96, 0x5d, 0xb8, 0xe, 0x70, 0x7a, 0x72, 0x33, 0x17, 0xd9, 0x55, 0x90, 0xec, 0x52, 0x8b, 0xb7, 0x93, 0x5a, 0x69, 0xc2, 0x45, 0x76, 0x70, 0x2b, 0xa0, 0x38, 0x19, 0x59, 0x7d, 0xc8, 0x34, 0x43, 0x8b, 0xaf, 0x6f, 0x29, 0xd8, 0x34, 0xe7, 0xf0, 0x73, 0x7a, 0xfa, 0x75, 0x74, 0x80, 0x6, 0xe8, 0xe3, 0xf8, 0x7e, 0xf4, 0x48, 0xf3, 0x39, 0x94, 0x81, 0xf4, 0xa7, 0x2c, 0xe3, 0xff, 0x41, 0x5c, 0xe5, 0x4d, 0x5a, 0x7c, 0xf9, 0xda, 0x2c, 0x7d, 0x7b, 0xf, 0xb2, 0x53, 0xd4, 0x1d, 0xdf, 0x18, 0xe9, 0xeb, 0xb2, 0xec, 0x5a, 0x16, 0xe8, 0xbc, 0x54, 0x1, 0x36, 0x5d, 0xf4, 0xb7, 0x7c, 0x88, 0xda, 0x68, 0xdc, 0xdd, 0xa, 0x70, 0xa7, 0xec, 0x26, 0x4e, 0xaf, 0x43, 0xd4, 0xfd, 0x20, 0x29, 0xa7, 0x71, 0x2d, 0xad, 0x7a, 0xf7, 0x19, 0x67, 0xdb, 0x64, 0xf0, 0x7f, 0x4a, 0x49, 0x80, 0x58, 0xa0, 0x13, 0xc5, 0xa9, 0xe7, 0x9a, 0x4c, 0x57, 0xc4, 0x7c, 0xd1, 0x53, 0xde, 0xc3, 0xc, 0xbc, 0x27, 0xbd, 0x8d, 0x5c, 0x22, 0x4e, 0xf7, 0xa0, 0xed, 0xab, 0xf9, 0x3c, 0x92, 0x57, 0xe, 0xa7, 0x5c, 0xc7, 0xe7, 0x8b, 0x42, 0xe0, 0x4f, 0x48, 0x7c, 0x33, 0xe8, 0x5, 0x88, 0x3b, 0xa0, 0x30, 0x36, 0xb1, 0xec, 0x3b, 0x7a, 0xf6, 0xa5, 0x3f, 0xa8, 0x52, 0x13, 0x9a, 0x48, 0x24, 0x36, 0x57, 0xb2, 0xdb, 0xb8, 0xd0, 0x90, 0x56, 0x8d, 0x93, 0x6f, 0xdf, 0xa7, 0xe6, 0x19, 0x57, 0x77, 0x2, 0x48, 0xac, 0x83, 0x91, 0xa3, 0x8d, 0x1c, 0x6a, 0x64, 0x57, 0x5a, 0x6e, 0xb9, 0xb4, 0x26, 0xb7, 0xa4, 0xec, 0x9d, 0x32, 0xe, 0xab, 0x70, 0x1e, 0x5, 0xee, 0xaf, 0xb1, 0x7c, 0x46, 0xeb, 0x74, 0xb9, 0x86, 0xa, 0x78, 0x1e, 0x48, 0xee, 0x42, 0xf9, 0x1, 0xce, 0x76, 0x1c, 0x28, 0x76, 0x17, 0x9d, 0xed, 0xb9, 0xef, 0x44, 0x39, 0x8f, 0x4a, 0xcd, 0xc, 0x3e, 0x63, 0xbc, 0x7f, 0x1f, 0x50, 0xe1, 0x89, 0xa3, 0xb2, 0x89, 0xee, 0x33, 0xee, 0xbd, 0x17, 0xdf, 0x7f, 0xb9, 0x2e, 0x27, 0x5f, 0x30, 0xdf, 0x32, 0xb6, 0x59, 0xbe, 0x91, 0x1d, 0x5c, 0x26, 0x70, 0xa5, 0xe1, 0x40, 0xc4, 0xa5, 0xdc, 0x48, 0x91, 0x3d, 0x86, 0xda, 0x8c, 0xd9, 0x12, 0xef, 0x7e, 0x74, 0xdb, 0xd0, 0xb4, 0x3f, 0xc5, 0xc8, 0xef, 0x24, 0x1c, 0x1d, 0x46, 0xd2, 0x21, 0x49, 0x80, 0x7b, 0x19, 0x39, 0x8e, 0xcf, 0x6, 0x9a, 0xef, 0x48, 0x12, 0xdf, 0x24, 0x5a, 0x82, 0x3f, 0x8b, 0xc6, 0x39, 0xc2, 0x80, 0x39, 0x24, 0xbd, 0xbb, 0x8c, 0x1c, 0x43, 0xe2, 0x43, 0x56, 0x73, 0xb3, 0xc, 0xff, 0x3f, 0x4e, 0xeb, 0xee, 0x41, 0x39, 0x9d, 0xef, 0xea, 0x12, 0x3e, 0xeb, 0xf, 0x69, 0xf9, 0xcf, 0x90, 0xaa, 0x27, 0x30, 0x44, 0x11, 0xb0, 0xea, 0xdc, 0x39, 0x3, 0x3f, 0xc7, 0xe4, 0xbb, 0x85, 0x1, 0xf3, 0xb8, 0x5f, 0xa4, 0x1e, 0xf3, 0xd5, 0xc8, 0x8b, 0xec, 0x5e, 0xa0, 0xa6, 0x16, 0x27, 0xac, 0xe5, 0x82, 0x4a, 0x92, 0xdd, 0xf7, 0x12, 0x9e, 0xfe, 0x89, 0x41, 0x2, 0xae, 0xa5, 0xb3, 0xb9, 0x1, 0xd5, 0xe5, 0x4, 0xef, 0x52, 0x4a, 0x32, 0x16, 0xb7, 0x58, 0xec, 0x49, 0x3e, 0xb8, 0x8e, 0x7e, 0x7f, 0xdb, 0x52, 0x7b, 0xad, 0xc7, 0x3f, 0xeb, 0x4b, 0xdd, 0x12, 0x9e, 0xa, 0x49, 0xd8, 0x7f, 0xa1, 0xac, 0xa0, 0xc5, 0x87, 0x26, 0xc5, 0xd, 0xf5, 0xfd, 0xe, 0xd, 0xf0, 0x7e, 0x3d, 0x46, 0x41, 0xec, 0xb7, 0x27, 0xd7, 0xde, 0x7e, 0x35, 0x7c, 0x4e, 0x50, 0xc6, 0xda, 0x89, 0x53, 0xf7, 0xa, 0x41, 0x36, 0xf4, 0x4c, 0x92, 0xea, 0x44, 0x92, 0xe0, 0x4, 0x5a, 0x44, 0x51, 0x53, 0x76, 0x90, 0xb1, 0x5a, 0x6c, 0xb1, 0x90, 0xb1, 0x1f, 0xe9, 0xa1, 0xb8, 0x75, 0xc7, 0x1a, 0xae, 0x97, 0x54, 0xb2, 0xdb, 0xc2, 0x8b, 0xec, 0xbe, 0x36, 0xf2, 0xa2, 0xce, 0x59, 0xa4, 0x81, 0xc4, 0x12, 0xc4, 0x51, 0x2e, 0x12, 0x27, 0x93, 0x32, 0x53, 0x20, 0x6b, 0x72, 0x1, 0x5d, 0x1, 0xb, 0x68, 0xf1, 0x22, 0x91, 0x64, 0x91, 0x38, 0x6e, 0xa5, 0xe4, 0x42, 0x42, 0x32, 0x49, 0xc2, 0x83, 0xec, 0xea, 0xa5, 0x2c, 0xb4, 0x26, 0x24, 0x3e, 0x64, 0xed, 0xa1, 0xfb, 0xf8, 0x56, 0xdc, 0xc4, 0xf0, 0xc2, 0xa3, 0x16, 0xab, 0x25, 0xc7, 0x8b, 0x6b, 0x61, 0xf9, 0x25, 0x13, 0x1f, 0x14, 0xe1, 0xc4, 0x57, 0x94, 0x7b, 0xb9, 0x1e, 0xf1, 0xac, 0x10, 0xe3, 0xeb, 0x4a, 0xc5, 0xab, 0x26, 0x9e, 0x25, 0x28, 0x4b, 0x9d, 0x29, 0x47, 0x1a, 0xb9, 0x4a, 0x9c, 0xd3, 0x24, 0xd0, 0xe5, 0xe8, 0x7d, 0x12, 0xdf, 0x2c, 0xb1, 0x1f, 0x47, 0x14, 0x36, 0x94, 0x5b, 0x8, 0x1a, 0xdf, 0x6b, 0xae, 0x2e, 0x19, 0x5f, 0x50, 0x29, 0x16, 0xcf, 0x95, 0xd7, 0x62, 0x2b, 0xd6, 0xf9, 0x8a, 0x34, 0xe0, 0xaa, 0x1c, 0x2a, 0xf6, 0x76, 0x44, 0x36, 0x8b, 0xd, 0xee, 0x21, 0xb8, 0x72, 0x3f, 0xe0, 0xb, 0xb7, 0x40, 0x36, 0x2d, 0x23, 0xa8, 0xd, 0x4a, 0x52, 0xb4, 0x2c, 0x2f, 0xf7, 0x4c, 0xa3, 0x14, 0xb2, 0x83, 0xd5, 0x86, 0x44, 0x19, 0x74, 0x28, 0xef, 0x2e, 0x4e, 0x10, 0xbf, 0x50, 0x1f, 0x65, 0x2c, 0x50, 0x41, 0x65, 0xe9, 0x41, 0x4a, 0x4b, 0xae, 0x4d, 0x3c, 0x6f, 0x34, 0x68, 0x40, 0xbd, 0x6b, 0xb3, 0x1a, 0x92, 0x1f, 0x14, 0xaa, 0xe6, 0x2e, 0x85, 0x7, 0xae, 0x4e, 0x14, 0x15, 0x23, 0xe6, 0x87, 0xd3, 0xe1, 0x91, 0xe8, 0x14, 0x95, 0x6c, 0xcf, 0x7a, 0x6a, 0xd5, 0x5, 0xb, 0x4d, 0x50, 0x89, 0x17, 0x60, 0x2d, 0xdd, 0x40, 0xb2, 0xab, 0x6e, 0xf3, 0x41, 0x6, 0x1c, 0x62, 0x21, 0x38, 0x9f, 0x6f, 0xaa, 0xe4, 0xa6, 0xb4, 0x62, 0x2d, 0x89, 0x35, 0x79, 0xda, 0xf8, 0xb, 0xfc, 0x13, 0xee, 0x2e, 0x24, 0x2e, 0xf4, 0x12, 0xc7, 0xd, 0x6, 0xad, 0xb7, 0x8b, 0xe8, 0x29, 0x1d, 0x71, 0xc1, 0xf, 0x14, 0x28, 0x57, 0xf7, 0xd0, 0xea, 0x7, 0xf9, 0xfd, 0x5e, 0x1c, 0x77, 0x27, 0xce, 0xc9, 0xdb, 0x41, 0x6a, 0x7e, 0xda, 0xfc, 0x8e, 0x94, 0x23, 0x8c, 0x5c, 0x2f, 0x4e, 0xec, 0xe6, 0x15, 0x92, 0xdf, 0x67, 0xa2, 0x31, 0x31, 0x25, 0x3b, 0x45, 0x2c, 0x80, 0xce, 0xf3, 0x48, 0xe, 0xe8, 0x50, 0xd, 0xb9, 0x3c, 0x45, 0xf9, 0x44, 0xc2, 0x9b, 0x90, 0x83, 0xf8, 0xc5, 0x24, 0xca, 0x5d, 0xb4, 0x4, 0x40, 0x76, 0xfb, 0xf3, 0x7b, 0x22, 0x6b, 0xb3, 0x81, 0x3e, 0xf2, 0xd8, 0x0, 0xa5, 0x27, 0x5f, 0x50, 0x80, 0x56, 0x24, 0xbb, 0xce, 0xb4, 0xfa, 0x90, 0xe8, 0x2, 0xb7, 0x67, 0x4d, 0x92, 0xaa, 0xa, 0x49, 0x9a, 0x97, 0x51, 0x90, 0xe5, 0x39, 0x8e, 0xa, 0xd5, 0x58, 0x71, 0xb5, 0x94, 0xca, 0x81, 0x15, 0x97, 0xd0, 0xc7, 0xae, 0x64, 0xa7, 0xa8, 0x39, 0xd0, 0xa5, 0xe2, 0x16, 0xf1, 0x76, 0x3f, 0x23, 0xa5, 0x19, 0x8d, 0x7a, 0x11, 0x3b, 0x99, 0x1f, 0x51, 0x4b, 0x60, 0x2c, 0xe5, 0x66, 0x6e, 0x62, 0x28, 0x9d, 0xe8, 0xc7, 0xcd, 0x50, 0xdd, 0x9d, 0xf1, 0xc2, 0x32, 0xca, 0x67, 0x5c, 0xb7, 0x78, 0xbe, 0x6d, 0xa9, 0xe4, 0xe0, 0x79, 0xef, 0x46, 0x4b, 0x70, 0xab, 0x1a, 0xfc, 0xcc, 0x64, 0xbc, 0xef, 0x34, 0x7a, 0x12, 0x90, 0x80, 0xf7, 0x32, 0x7f, 0x47, 0x2e, 0x3c, 0x1a, 0xe5, 0x2e, 0x4f, 0x5, 0xe2, 0x4c, 0x1b, 0xf4, 0xd1, 0xd7, 0xd, 0xe8, 0x83, 0xb9, 0x6e, 0xfd, 0x6, 0x29, 0x2f, 0xdf, 0xe4, 0x88, 0x4b, 0xc4, 0x7b, 0x57, 0x2a, 0xd9, 0x45, 0x1f, 0x68, 0xcc, 0x3b, 0x2c, 0xcd, 0x75, 0x58, 0x71, 0xb7, 0xd2, 0x4a, 0x8a, 0x3, 0xb0, 0x8a, 0xa7, 0x53, 0xf0, 0xbd, 0x10, 0xaf, 0x79, 0x58, 0x9c, 0x18, 0x9f, 0x22, 0x9e, 0x80, 0x7, 0x62, 0xe, 0xe5, 0x19, 0x92, 0xc4, 0x2e, 0x54, 0x7a, 0x50, 0xaa, 0x70, 0x8, 0x2d, 0xff, 0x4c, 0x2d, 0x3f, 0x10, 0x27, 0x4e, 0x70, 0x18, 0x2c, 0x4e, 0x6c, 0xf, 0xeb, 0xe7, 0xd, 0xa9, 0x7a, 0x8, 0x70, 0x50, 0x40, 0xfc, 0x72, 0xbd, 0x4b, 0x49, 0x83, 0xcb, 0xf5, 0x6c, 0x12, 0xa1, 0xa2, 0x96, 0x58, 0x6f, 0x88, 0xee, 0x98, 0xc3, 0xfa, 0x48, 0x87, 0xf6, 0x6d, 0xdd, 0x96, 0xb4, 0x92, 0x5d, 0xc4, 0x81, 0xb8, 0xc4, 0xdf, 0x3c, 0xae, 0xc1, 0x82, 0xbb, 0x9a, 0x64, 0x17, 0x57, 0x20, 0x23, 0x14, 0x7d, 0x17, 0xd7, 0x28, 0xd9, 0xe5, 0x15, 0x10, 0x73, 0x9e, 0x46, 0x81, 0x75, 0x76, 0x8d, 0x38, 0x25, 0x36, 0x7, 0x18, 0xe9, 0x43, 0xcb, 0x6f, 0xb7, 0xc, 0x7e, 0xe, 0x62, 0x82, 0x47, 0x52, 0xe0, 0x35, 0x18, 0x2e, 0x4e, 0xf3, 0xea, 0xc0, 0xf7, 0x64, 0xa9, 0x9a, 0x8d, 0x9, 0xeb, 0x3, 0x9, 0x35, 0x1a, 0x57, 0xac, 0x8b, 0x56, 0x54, 0x56, 0x26, 0x5d, 0x3a, 0x76, 0x90, 0x6e, 0x5d, 0x76, 0xae, 0x72, 0x4d, 0x3, 0xfe, 0xd1, 0xc5, 0xe0, 0x34, 0x44, 0x7, 0x2d, 0xf5, 0xa0, 0x98, 0x13, 0x5d, 0x12, 0x8d, 0x75, 0x1d, 0xeb, 0x1e, 0x27, 0x4e, 0x26, 0xe6, 0x63, 0xe2, 0x24, 0x67, 0x61, 0xed, 0xa3, 0x81, 0x2, 0x8a, 0xdc, 0x67, 0x65, 0x68, 0xb1, 0xf5, 0x12, 0x27, 0x99, 0xe5, 0x79, 0x5a, 0x8c, 0x41, 0x2, 0x8d, 0x8a, 0xdd, 0x2e, 0x4b, 0x94, 0xd2, 0xb4, 0xd7, 0x47, 0x59, 0x37, 0xc0, 0x8d, 0xb9, 0xa1, 0xc4, 0x9e, 0x6b, 0xa7, 0x9b, 0x44, 0x34, 0x81, 0x6c, 0xb3, 0x5b, 0x3c, 0xae, 0xa1, 0xa7, 0xe7, 0x51, 0xe2, 0xb8, 0x45, 0x14, 0x8a, 0x7c, 0x4, 0x9a, 0x46, 0xbc, 0x4b, 0x65, 0x10, 0x47, 0x79, 0x1d, 0x28, 0x4e, 0xa2, 0xd3, 0xe4, 0xea, 0xf6, 0x4a, 0x71, 0xba, 0xf5, 0x20, 0x4b, 0xf9, 0x1c, 0x9, 0x2e, 0x89, 0x4, 0xbb, 0xf1, 0x32, 0xd7, 0x18, 0xea, 0x51, 0xf5, 0xc, 0xc0, 0x0, 0xa1, 0x64, 0x17, 0x3d, 0x20, 0x28, 0x8f, 0x74, 0x6d, 0x5b, 0x37, 0xa, 0x74, 0xa0, 0x3f, 0x57, 0xf4, 0xf4, 0x0, 0x85, 0x22, 0x9, 0xb8, 0xc, 0x51, 0x7a, 0x70, 0x1, 0x2d, 0x3e, 0xb4, 0x31, 0x7b, 0xb3, 0x1a, 0x6b, 0xf, 0xd9, 0xa0, 0xf7, 0x52, 0x82, 0x6a, 0xab, 0xb7, 0xc0, 0x42, 0xb4, 0x3b, 0xe8, 0xe3, 0x52, 0xb2, 0x53, 0x6c, 0x7c, 0x5e, 0xb0, 0xe8, 0x6c, 0x8d, 0x76, 0x9f, 0x14, 0x27, 0xc5, 0x5a, 0x89, 0x4e, 0xa1, 0xb0, 0x3, 0x59, 0xc9, 0xcf, 0x8a, 0xe3, 0x19, 0x41, 0x6c, 0xef, 0x25, 0x49, 0x5f, 0x5f, 0x7a, 0x36, 0x3f, 0x13, 0x44, 0xa3, 0xf4, 0x19, 0x96, 0xb1, 0x1d, 0xf5, 0x11, 0x29, 0xd9, 0x29, 0x1c, 0xa0, 0xd5, 0xd2, 0x9f, 0x2d, 0xe3, 0x68, 0x97, 0x74, 0x8e, 0x4e, 0x8f, 0x42, 0x91, 0x11, 0x2a, 0xf9, 0xce, 0xa0, 0x67, 0x27, 0xea, 0x36, 0xdf, 0x4b, 0xf3, 0x59, 0x5c, 0x7f, 0x24, 0x0, 0xb, 0xcf, 0x46, 0x76, 0x28, 0xa8, 0xd7, 0xee, 0x55, 0x4a, 0x76, 0x79, 0xf, 0xb8, 0x39, 0x2e, 0x97, 0xaa, 0xc5, 0xd4, 0x88, 0x4f, 0xe0, 0x88, 0x14, 0x4d, 0x59, 0x56, 0x28, 0x6a, 0xe, 0x10, 0x1d, 0x8e, 0xba, 0xba, 0x50, 0x9c, 0x5e, 0x9b, 0x36, 0xc0, 0x12, 0xbc, 0x55, 0xfc, 0x8d, 0xe1, 0x81, 0xec, 0xdc, 0xae, 0x54, 0x94, 0x4f, 0x68, 0x56, 0xb1, 0x92, 0x5d, 0xde, 0x3, 0xf1, 0x86, 0x43, 0x2c, 0xe3, 0xc8, 0x38, 0x9b, 0xa6, 0xd3, 0xa3, 0x50, 0xd4, 0x1a, 0x70, 0xfd, 0xdf, 0x69, 0xe4, 0xf, 0xe2, 0x7d, 0x5a, 0x38, 0x14, 0xca, 0xa3, 0x7c, 0xfc, 0x9d, 0x68, 0xaa, 0xbe, 0xd8, 0x35, 0x6, 0x45, 0xb6, 0x87, 0x3e, 0xe, 0x25, 0xbb, 0x7c, 0xc7, 0xf9, 0x96, 0x31, 0xf4, 0xb4, 0x7c, 0x5c, 0xa7, 0x46, 0xa1, 0xf0, 0x5, 0x48, 0x64, 0x39, 0xc6, 0x83, 0xf0, 0xa, 0xa8, 0x58, 0x36, 0xf5, 0xe9, 0x77, 0x2d, 0xf2, 0x50, 0x52, 0x7b, 0xeb, 0x63, 0x50, 0xb2, 0xcb, 0x67, 0xa0, 0x29, 0xf2, 0xfe, 0x96, 0x71, 0x94, 0x19, 0xfc, 0xa4, 0xd3, 0xa3, 0x50, 0xf8, 0x6, 0x10, 0x10, 0x8a, 0xcc, 0x97, 0x58, 0xae, 0xa1, 0xdd, 0xd8, 0xa9, 0x3e, 0xfd, 0x1e, 0xd4, 0x6, 0x7e, 0x65, 0x19, 0x47, 0x1f, 0x50, 0x8d, 0xdb, 0x29, 0xd9, 0xe5, 0x2d, 0x10, 0xb8, 0x6e, 0xe5, 0x1a, 0x43, 0xbf, 0xc8, 0x67, 0x74, 0x6a, 0x14, 0xa, 0xdf, 0x81, 0x42, 0xf4, 0x81, 0x62, 0x8f, 0x83, 0x23, 0x11, 0xcc, 0xaf, 0xc3, 0x82, 0xd1, 0x8c, 0xdd, 0x7d, 0x80, 0x34, 0x7a, 0x7e, 0xee, 0xae, 0x8f, 0x40, 0xc9, 0x2e, 0x5f, 0xb1, 0x97, 0x65, 0xc, 0xd9, 0x64, 0xda, 0x5a, 0x48, 0xa1, 0x8, 0x6, 0xa8, 0xc5, 0x7b, 0xc9, 0x32, 0x8e, 0xee, 0x2a, 0x7, 0xf8, 0xf4, 0x3b, 0xf0, 0xe, 0xbb, 0x3d, 0x33, 0x4d, 0x7c, 0xfc, 0xf9, 0xa, 0x25, 0xbb, 0x48, 0x1, 0x2e, 0x8d, 0xee, 0x96, 0xf1, 0x51, 0x3a, 0x35, 0xa, 0x45, 0xa0, 0xb8, 0x4d, 0x9c, 0xbe, 0xab, 0xa9, 0x40, 0x12, 0x49, 0x2f, 0x9f, 0x7e, 0xfe, 0xcf, 0x46, 0x46, 0x5b, 0xc6, 0x4f, 0x11, 0x3d, 0xc2, 0x4a, 0xc9, 0x2e, 0xf, 0x81, 0xde, 0x8f, 0xee, 0x33, 0xea, 0x90, 0xb2, 0xfc, 0xb5, 0x4e, 0x8d, 0x42, 0x11, 0x28, 0x26, 0x8a, 0xd3, 0x3a, 0xcc, 0x8d, 0x1e, 0x3e, 0x92, 0xd1, 0x2b, 0x96, 0xb1, 0xae, 0xe2, 0x1c, 0x5a, 0xac, 0x50, 0xb2, 0xcb, 0x3b, 0xcb, 0xce, 0x1d, 0xaf, 0x43, 0x5f, 0xbd, 0xe5, 0x3a, 0x35, 0xa, 0x45, 0xe0, 0x78, 0xce, 0x32, 0x86, 0x98, 0xda, 0x66, 0x3e, 0xfd, 0xfc, 0x31, 0x46, 0xe6, 0x5a, 0xc6, 0x4f, 0xd7, 0xa9, 0x57, 0xb2, 0xcb, 0x37, 0xd8, 0x5a, 0x83, 0x81, 0xec, 0x56, 0xeb, 0xd4, 0x28, 0x14, 0x81, 0x3, 0x19, 0x93, 0xa5, 0xae, 0x31, 0x9c, 0x50, 0xb0, 0xb9, 0x4f, 0x3f, 0x1f, 0x59, 0x9f, 0xef, 0x58, 0xc6, 0x51, 0xe8, 0xae, 0xed, 0xc3, 0x94, 0xec, 0xf2, 0xa, 0x8d, 0x3d, 0x9e, 0x5b, 0x42, 0xa7, 0x46, 0xa1, 0x8, 0x1c, 0xe8, 0x50, 0xb4, 0xd0, 0x32, 0xde, 0xce, 0xc7, 0xdf, 0x81, 0xa3, 0xb8, 0xdc, 0x59, 0x99, 0x68, 0xf8, 0xfe, 0x27, 0x9d, 0x7e, 0x25, 0xbb, 0x7c, 0x42, 0xa5, 0x4e, 0x81, 0x42, 0x91, 0x33, 0xac, 0x12, 0x7b, 0xd6, 0xb3, 0x9f, 0xca, 0x26, 0x4a, 0x10, 0x6c, 0xb1, 0x41, 0x9c, 0x60, 0xd2, 0x5c, 0x1f, 0x81, 0x92, 0x5d, 0xbe, 0xa0, 0xc4, 0x83, 0x0, 0x95, 0x4, 0x37, 0xce, 0x45, 0x85, 0x4e, 0x83, 0x22, 0x20, 0xfc, 0x62, 0x64, 0x45, 0xc0, 0xbf, 0x3, 0xeb, 0xf7, 0x7e, 0xcb, 0x78, 0x1b, 0x12, 0x9e, 0x42, 0xc9, 0x2e, 0x2f, 0xb0, 0xc0, 0x32, 0x6, 0xd7, 0x66, 0x91, 0x4e, 0xcd, 0xaf, 0x40, 0x81, 0x6f, 0x2b, 0x9d, 0x6, 0x45, 0xc0, 0xa, 0x55, 0xd0, 0x78, 0xd5, 0xc8, 0x78, 0xcb, 0xf8, 0x59, 0x46, 0xb6, 0xd7, 0x47, 0xa0, 0x64, 0x97, 0xf, 0x40, 0x17, 0x7, 0x77, 0xad, 0xcf, 0xd6, 0xe2, 0x4, 0xc9, 0x15, 0x4e, 0x9a, 0x76, 0x43, 0x9d, 0x6, 0x45, 0x40, 0x48, 0x64, 0x69, 0x9f, 0xc4, 0x3b, 0x7e, 0xa7, 0x65, 0x7c, 0x3b, 0x23, 0x97, 0xea, 0x63, 0x50, 0xb2, 0xcb, 0x7, 0xac, 0x33, 0xf2, 0x8d, 0x6b, 0xac, 0x91, 0x5a, 0x33, 0xbf, 0xe1, 0x8f, 0x3a, 0x5, 0x8a, 0x0, 0x81, 0xc6, 0xcf, 0xb6, 0xb8, 0x59, 0x10, 0xae, 0x73, 0x94, 0x39, 0x4c, 0xb4, 0x8c, 0xe3, 0x10, 0x59, 0x3d, 0xd, 0xa1, 0x2a, 0xba, 0x89, 0x93, 0xad, 0x9e, 0x11, 0x8f, 0x29, 0xd9, 0x45, 0x83, 0xec, 0xe6, 0x58, 0xc6, 0xf7, 0xd4, 0xa9, 0x91, 0xd6, 0xe2, 0x1c, 0xae, 0xa9, 0x50, 0x4, 0x85, 0x26, 0x16, 0xb2, 0x83, 0x5b, 0x73, 0x56, 0x0, 0xbf, 0x6b, 0x83, 0x91, 0x9b, 0xa5, 0xea, 0x39, 0x77, 0x28, 0x60, 0xbf, 0x4b, 0xfc, 0xab, 0xed, 0x8b, 0xcb, 0xbb, 0xff, 0x82, 0x38, 0xe7, 0x2, 0xbe, 0x6b, 0xe4, 0xa, 0xb1, 0x77, 0x9a, 0x52, 0xb2, 0x8b, 0x10, 0xb0, 0xf0, 0xa7, 0x5a, 0xc6, 0xf, 0xd5, 0xa9, 0xf9, 0x35, 0x9e, 0xd1, 0x46, 0xa7, 0x41, 0x11, 0xf0, 0xa6, 0xda, 0xde, 0x35, 0x86, 0xe3, 0x79, 0xd6, 0x4, 0xf4, 0xfb, 0x5e, 0x34, 0x32, 0xd2, 0x32, 0x8e, 0xd3, 0x10, 0x2e, 0xd6, 0xc7, 0xf1, 0x1b, 0xfe, 0x4f, 0x9c, 0xce, 0x52, 0x68, 0xba, 0x81, 0x63, 0x91, 0x6e, 0xe2, 0xbc, 0x15, 0x2b, 0xd9, 0x45, 0x1b, 0x68, 0xd, 0x56, 0x61, 0xb1, 0xec, 0xb6, 0xcd, 0xe3, 0x39, 0xc1, 0xa9, 0xce, 0x7f, 0xd5, 0xa5, 0xa1, 0x8, 0x18, 0xbb, 0x18, 0xa9, 0xef, 0x1a, 0x9b, 0x2c, 0x4e, 0x96, 0x66, 0x10, 0x40, 0x1, 0xfb, 0x95, 0x62, 0x6f, 0x1a, 0x31, 0xd4, 0xc8, 0xef, 0xf4, 0x91, 0xfc, 0x5a, 0x83, 0x78, 0xa5, 0x65, 0x1c, 0x46, 0x41, 0x99, 0x92, 0x5d, 0xb4, 0x31, 0x9e, 0xda, 0x64, 0x2a, 0xd0, 0xc1, 0xe1, 0xc8, 0x3c, 0x9d, 0xf, 0x24, 0xd, 0xdc, 0x2a, 0x5a, 0x83, 0xa4, 0x8, 0x1e, 0xfd, 0x3c, 0x94, 0xcf, 0xd2, 0x0, 0x7f, 0xe7, 0x24, 0x23, 0x77, 0x58, 0xc6, 0xe1, 0xce, 0xbc, 0xcf, 0xc8, 0x36, 0x79, 0xfe, 0x4c, 0xae, 0x15, 0x7b, 0xce, 0xc2, 0xbf, 0x94, 0xec, 0xa2, 0xf, 0x94, 0x1f, 0x7c, 0x62, 0xd9, 0xf0, 0x8f, 0x95, 0xfc, 0xec, 0x8e, 0x7e, 0x89, 0x91, 0xfe, 0xba, 0x2c, 0x14, 0x1, 0x63, 0x4b, 0xb, 0xd9, 0xc1, 0xc3, 0xf2, 0x65, 0x16, 0x7e, 0xf7, 0x70, 0xb1, 0x17, 0x9a, 0xc3, 0xa3, 0x71, 0xaf, 0xe4, 0x6f, 0xe9, 0x11, 0x14, 0xfc, 0xb3, 0x2c, 0xe3, 0x98, 0xab, 0x37, 0xd3, 0xfd, 0x47, 0x25, 0xbb, 0xe8, 0xc0, 0xd6, 0x1d, 0x1d, 0x2e, 0x8d, 0xdf, 0xe7, 0xd9, 0x3c, 0xc0, 0x3f, 0xff, 0x37, 0x5d, 0xe, 0x59, 0xc1, 0xbe, 0x92, 0xdf, 0x49, 0x11, 0xc7, 0x19, 0x69, 0xe6, 0x1a, 0x83, 0x87, 0x65, 0x42, 0x16, 0x7e, 0x37, 0xdc, 0x98, 0x70, 0xd3, 0xff, 0xe4, 0xb1, 0xe1, 0xff, 0x23, 0xf, 0x9f, 0x7, 0x2c, 0x5a, 0x94, 0x67, 0xd4, 0xb7, 0x5c, 0xbb, 0x41, 0xaa, 0x71, 0x2d, 0x2b, 0xd9, 0x45, 0x7, 0xaf, 0x4b, 0xd5, 0xee, 0xe8, 0xb0, 0xea, 0x2e, 0xcf, 0xa3, 0x39, 0xc0, 0x29, 0xce, 0xf, 0x8b, 0x66, 0xa5, 0x65, 0x3, 0x97, 0x51, 0x5b, 0x7e, 0x44, 0x9c, 0x8c, 0xc4, 0x7c, 0x3, 0x12, 0x1d, 0x4e, 0xb7, 0xec, 0x91, 0xef, 0x19, 0x99, 0x9f, 0xa5, 0x7b, 0x80, 0xbb, 0x14, 0x59, 0x86, 0x36, 0xd7, 0x1c, 0x6a, 0xef, 0x86, 0xe6, 0xd1, 0xf3, 0x68, 0xcc, 0xb5, 0xd8, 0xce, 0x72, 0xed, 0x49, 0x23, 0x6f, 0x57, 0xf7, 0x3, 0x94, 0xec, 0xa2, 0x83, 0xd5, 0xdc, 0xe8, 0xdd, 0x38, 0x58, 0x1c, 0x77, 0x66, 0x3e, 0x68, 0x75, 0xcf, 0x48, 0xd5, 0xcc, 0x38, 0x85, 0xbf, 0x80, 0x7b, 0xc, 0x87, 0x96, 0x22, 0x26, 0x5a, 0xc0, 0xb5, 0x95, 0x8f, 0x84, 0x77, 0x2a, 0x2d, 0x5b, 0x37, 0x1e, 0xcf, 0xf2, 0x7d, 0x3c, 0x64, 0xe4, 0x41, 0x8f, 0x6b, 0xd7, 0x1b, 0x39, 0x39, 0x4f, 0x9e, 0x7, 0xd6, 0xa4, 0x2d, 0x3, 0x1d, 0x8a, 0x47, 0x46, 0x9e, 0x1e, 0x25, 0xbb, 0x68, 0xe1, 0x9, 0xa9, 0xda, 0x81, 0x1d, 0xb1, 0xbb, 0x1b, 0xc5, 0x49, 0x91, 0x8e, 0x2b, 0x90, 0x62, 0x8c, 0x9a, 0x9a, 0x6e, 0x96, 0x6b, 0x3f, 0x48, 0xf0, 0xbd, 0xb, 0xf3, 0x9, 0x37, 0x4a, 0xd5, 0x8e, 0x1d, 0xc7, 0x8b, 0xe3, 0x46, 0xdf, 0x2a, 0x4f, 0xe6, 0xa0, 0x2d, 0x89, 0xc4, 0x8d, 0xb7, 0xc4, 0x1e, 0x47, 0xb, 0x12, 0x88, 0x11, 0x5e, 0xe8, 0x61, 0xb9, 0x14, 0x90, 0x8, 0x4f, 0x8d, 0xf1, 0xb3, 0xc0, 0x77, 0x1c, 0x21, 0xf6, 0x1e, 0xa1, 0x65, 0xf4, 0x40, 0x2c, 0x50, 0xb2, 0x8b, 0x1f, 0xbe, 0x13, 0x27, 0x1b, 0xcb, 0x8d, 0x8e, 0x62, 0xcf, 0xde, 0x8a, 0x3, 0xd0, 0x39, 0x2, 0x45, 0xa3, 0xfb, 0x59, 0xae, 0x7d, 0x6b, 0x64, 0xa0, 0xe8, 0x41, 0xb6, 0x7e, 0xc2, 0x6b, 0x4f, 0x38, 0x88, 0xcf, 0x61, 0xf7, 0x98, 0x7f, 0x7f, 0xc4, 0x83, 0x86, 0x5b, 0x88, 0x1d, 0xd9, 0x97, 0x77, 0x49, 0x9a, 0x6c, 0xbf, 0x0, 0x81, 0x66, 0xf0, 0x3, 0xc4, 0x39, 0x5b, 0xcf, 0x8d, 0x62, 0xee, 0x9, 0x43, 0x62, 0xfa, 0x3c, 0x6e, 0x25, 0xd9, 0xdb, 0x30, 0x82, 0x4a, 0x70, 0x9d, 0x16, 0xb6, 0x22, 0xbc, 0xf8, 0xa7, 0xd8, 0x5b, 0xa, 0x9d, 0x98, 0x66, 0x51, 0x44, 0x15, 0x28, 0x1c, 0x7d, 0x5d, 0xec, 0x7, 0xd8, 0x7e, 0x6f, 0xe4, 0x4, 0x23, 0xa3, 0x44, 0x7b, 0x63, 0xfa, 0x9, 0x58, 0x34, 0x5e, 0x59, 0x6d, 0xbb, 0xf2, 0x79, 0x1c, 0x17, 0xe3, 0xef, 0x7f, 0x9d, 0x91, 0x63, 0x2c, 0xe3, 0x2f, 0x89, 0xbd, 0xd8, 0x3b, 0x5b, 0xc0, 0x7a, 0x87, 0xcb, 0x72, 0xb6, 0xe5, 0x1a, 0xd6, 0x3f, 0x3a, 0xaf, 0xdc, 0x46, 0x4b, 0x28, 0xe, 0x80, 0xdb, 0xfc, 0x1, 0x23, 0x17, 0x79, 0x5c, 0x47, 0x48, 0xa3, 0x46, 0x31, 0x4b, 0x25, 0xbb, 0xe8, 0x61, 0x2d, 0x1f, 0xf2, 0x7a, 0xcb, 0x35, 0x64, 0x68, 0x9d, 0x12, 0x93, 0x85, 0xe, 0x52, 0xc7, 0xa1, 0x96, 0x2d, 0x2c, 0xd7, 0x91, 0x11, 0x7, 0xd7, 0xda, 0xe7, 0xa2, 0xc9, 0x2a, 0x7e, 0xe3, 0x27, 0x6e, 0xaa, 0x5e, 0x1b, 0x3b, 0x3a, 0xd6, 0xfc, 0x87, 0xa4, 0x10, 0xb7, 0xb2, 0x97, 0xab, 0x8d, 0x5c, 0xe5, 0x31, 0x27, 0x57, 0x87, 0xe0, 0xfe, 0xa6, 0x19, 0x39, 0xda, 0xc8, 0x4c, 0x8f, 0xeb, 0x97, 0xf2, 0xd9, 0xb4, 0x8c, 0xf8, 0x73, 0xc0, 0x29, 0xf, 0xe8, 0x13, 0x7a, 0xa6, 0xc7, 0x75, 0x9c, 0x10, 0x1, 0xb7, 0x66, 0xb9, 0x92, 0x5d, 0xfc, 0x81, 0xd8, 0xc1, 0x70, 0xcb, 0x38, 0x32, 0x96, 0x90, 0xc4, 0x12, 0x65, 0x1f, 0x3e, 0xdc, 0x65, 0x63, 0x8c, 0x5c, 0x20, 0xf6, 0x14, 0xe3, 0xe9, 0xd4, 0xbc, 0x3f, 0xd2, 0x65, 0x10, 0x28, 0xe1, 0xc1, 0x53, 0xe0, 0xe5, 0x22, 0x42, 0x12, 0xcb, 0x35, 0x46, 0xde, 0x31, 0xb2, 0x47, 0xc, 0xbe, 0x2f, 0xd6, 0xd9, 0x30, 0x23, 0x7f, 0xb7, 0x5c, 0xc3, 0x86, 0x3a, 0xd8, 0xc3, 0xa2, 0xca, 0x5, 0xa6, 0xd2, 0xb2, 0x9e, 0x93, 0xc6, 0x1b, 0x32, 0x8a, 0xef, 0x51, 0x14, 0x81, 0xfa, 0xd9, 0xb1, 0xe2, 0xdd, 0xf3, 0xf6, 0x25, 0x2a, 0x63, 0xab, 0x6a, 0xfa, 0x83, 0x95, 0xec, 0xa2, 0xb, 0xd4, 0x95, 0xd8, 0xdc, 0x4d, 0x85, 0xe2, 0x14, 0x9d, 0xe, 0x8c, 0xd8, 0xf7, 0xd9, 0x41, 0x9c, 0x60, 0x3b, 0x2c, 0xa, 0xaf, 0x86, 0xae, 0x78, 0x89, 0xf, 0x31, 0xf2, 0x85, 0x3e, 0xfe, 0xac, 0x59, 0x78, 0xf7, 0xa6, 0xf9, 0xcc, 0x81, 0xe2, 0x24, 0x4e, 0xa0, 0x75, 0x53, 0x71, 0x44, 0xbf, 0x27, 0xa, 0xc7, 0x91, 0x6d, 0x7a, 0xad, 0xc7, 0xf5, 0x11, 0xf4, 0x30, 0x84, 0x9, 0x53, 0x8c, 0x1c, 0x2e, 0x55, 0x1b, 0x4d, 0x24, 0xd1, 0x8d, 0xd6, 0xcf, 0xb5, 0x12, 0x9d, 0x2c, 0x5a, 0x3c, 0x87, 0xdb, 0xa9, 0x60, 0xb5, 0x4f, 0x63, 0xd1, 0xd, 0x10, 0x7b, 0x2b, 0x35, 0x25, 0xbb, 0x18, 0x63, 0x2d, 0x9, 0xcd, 0x16, 0xb4, 0x6e, 0x44, 0xe2, 0x80, 0xf5, 0xd7, 0x34, 0xe4, 0xdf, 0x63, 0x3b, 0x5a, 0x9, 0xe3, 0xf9, 0x7d, 0xa, 0x3d, 0x3e, 0x87, 0x56, 0x40, 0x28, 0xa6, 0xfd, 0x4e, 0x1f, 0x7d, 0xd6, 0x80, 0x2e, 0xfc, 0xe7, 0x89, 0x13, 0xb, 0x5e, 0xef, 0xf1, 0x99, 0x96, 0x54, 0xbc, 0x90, 0xa5, 0xf8, 0x87, 0x88, 0x7d, 0x3f, 0x28, 0x4e, 0xef, 0xa6, 0xf1, 0x84, 0x20, 0xfb, 0x39, 0xac, 0xb5, 0x6c, 0x38, 0x75, 0x1, 0x2e, 0xcd, 0xb7, 0x3c, 0xae, 0x37, 0xa6, 0xb5, 0x8a, 0xba, 0xc0, 0x7e, 0x21, 0x7e, 0x6, 0xc8, 0x26, 0x47, 0x48, 0x2, 0x9e, 0x1a, 0x74, 0x46, 0xf2, 0x8a, 0xbf, 0xa3, 0x4, 0x3, 0x21, 0x9a, 0x9f, 0x6b, 0xfb, 0x8b, 0x94, 0xec, 0xa2, 0x8d, 0x25, 0xd4, 0xbe, 0x67, 0x78, 0x5c, 0x47, 0x70, 0x17, 0xae, 0xa6, 0x7d, 0x43, 0x78, 0xef, 0xd0, 0xde, 0x90, 0x41, 0x3a, 0x5a, 0x9c, 0xf8, 0xcf, 0x16, 0x69, 0xbe, 0xe3, 0x69, 0x46, 0x6, 0xa5, 0xd9, 0x70, 0x13, 0x96, 0xb1, 0x72, 0x5d, 0x1e, 0xbe, 0x1, 0x5d, 0x2b, 0xe0, 0xd6, 0xfc, 0x36, 0xcd, 0x67, 0x60, 0x8d, 0xc3, 0xc5, 0xf4, 0x9a, 0x84, 0xdf, 0x85, 0xb6, 0x13, 0xad, 0x39, 0x24, 0xdb, 0x78, 0xb9, 0x61, 0x51, 0xa8, 0x7c, 0x8e, 0xe4, 0x26, 0xfb, 0x32, 0x53, 0x2c, 0x13, 0xa7, 0xe, 0xf2, 0x9f, 0x69, 0x3e, 0xb3, 0x37, 0xbf, 0xe7, 0xb3, 0x46, 0x76, 0xb, 0x19, 0xc9, 0xf5, 0x25, 0x59, 0x23, 0x3e, 0xd7, 0xc9, 0xe3, 0x73, 0xc8, 0x44, 0x45, 0x1c, 0xf5, 0xec, 0xba, 0x10, 0x9d, 0x92, 0x5d, 0x3c, 0x80, 0xa0, 0x35, 0x7c, 0xf8, 0x5e, 0x41, 0xeb, 0x7d, 0x49, 0x28, 0xc8, 0xd4, 0xca, 0xf5, 0x29, 0x9, 0x2d, 0x68, 0x9d, 0xe1, 0xc5, 0x43, 0xb3, 0xdb, 0x8b, 0xb9, 0xf1, 0x78, 0xe1, 0x79, 0x71, 0x5a, 0xa2, 0x3d, 0x91, 0xe6, 0x33, 0x78, 0x19, 0x56, 0x5a, 0xc6, 0x5b, 0xeb, 0xd2, 0xf0, 0x15, 0x20, 0x32, 0x34, 0x30, 0x78, 0x35, 0xcd, 0x67, 0x10, 0xfb, 0x3a, 0x42, 0x1c, 0x77, 0x33, 0x48, 0xef, 0xa8, 0x34, 0x4a, 0x4c, 0x2e, 0xb0, 0x97, 0x38, 0x47, 0xc1, 0x7c, 0x26, 0x4e, 0x77, 0x14, 0x2f, 0x2f, 0xc2, 0xfd, 0x46, 0xce, 0x10, 0xe7, 0x2c, 0xc9, 0xb0, 0x63, 0x1d, 0x95, 0x5a, 0x28, 0xbd, 0xdf, 0xa7, 0x79, 0x2e, 0x27, 0xf0, 0x7b, 0xa3, 0x4c, 0x21, 0x97, 0x2d, 0x6, 0x1b, 0x73, 0xf, 0x0, 0x1, 0x23, 0x64, 0x71, 0x68, 0x35, 0xd6, 0x2b, 0xbc, 0x5, 0xa8, 0xfd, 0xac, 0xf3, 0x61, 0xb9, 0x4a, 0x76, 0xf1, 0x0, 0x82, 0xd6, 0x8, 0xec, 0xbe, 0xeb, 0x71, 0x1d, 0x6e, 0xcd, 0x4b, 0xe9, 0xd2, 0x80, 0x6b, 0x63, 0xfb, 0x2c, 0xde, 0x5b, 0x23, 0x2e, 0xe8, 0xbb, 0x49, 0xba, 0xaf, 0xf0, 0xc5, 0x6b, 0x52, 0xcd, 0x22, 0x3f, 0x85, 0x9f, 0x9b, 0x5b, 0xcd, 0xcf, 0x5f, 0xe5, 0x61, 0xd9, 0x9e, 0x2f, 0xd1, 0x8d, 0x23, 0x85, 0x15, 0x48, 0xd2, 0x80, 0xcb, 0x9, 0x6e, 0xcd, 0xe5, 0xd5, 0xec, 0x2b, 0x47, 0x90, 0x20, 0xf1, 0xcc, 0x6f, 0xa1, 0xe6, 0x5e, 0x98, 0x83, 0x7b, 0xde, 0x92, 0x44, 0xf0, 0x3c, 0xd7, 0xff, 0x15, 0x1c, 0xb3, 0x1, 0xb5, 0x74, 0x70, 0xa5, 0x9d, 0x2b, 0xc1, 0x9e, 0x6a, 0x10, 0x4, 0x10, 0x57, 0xec, 0x43, 0x12, 0xf1, 0x42, 0x43, 0x5a, 0x48, 0xa3, 0x68, 0x51, 0xd, 0xc8, 0x92, 0x32, 0x2, 0x2b, 0x6e, 0x47, 0x71, 0xc2, 0x15, 0xc9, 0x3d, 0xa0, 0x7f, 0x35, 0xfc, 0xf3, 0x0, 0x3d, 0x4, 0xef, 0xf8, 0x75, 0x13, 0x5, 0xfa, 0xfe, 0xc6, 0x6, 0x20, 0x85, 0xa3, 0xb9, 0xb1, 0x9c, 0xe7, 0xf1, 0x19, 0x58, 0x51, 0x8, 0x5a, 0x23, 0xd3, 0xf1, 0x65, 0x71, 0x82, 0xc1, 0xe8, 0xbf, 0xb7, 0xc8, 0xc7, 0xfb, 0xd8, 0x8e, 0xb, 0xbb, 0x2b, 0x35, 0xc8, 0x9e, 0x46, 0xb6, 0x16, 0xbb, 0xab, 0xd1, 0xd, 0xb8, 0xc9, 0x1e, 0x13, 0xc7, 0xbd, 0x99, 0xa9, 0xcb, 0xa2, 0x82, 0x1a, 0xab, 0xbb, 0xf6, 0xb, 0x1a, 0xe1, 0x4, 0x6e, 0x2, 0xb7, 0xd1, 0x2, 0x54, 0xd4, 0x1d, 0x98, 0xc7, 0x3b, 0xb9, 0x9, 0x5d, 0x4d, 0x85, 0x24, 0xdd, 0x3e, 0xb2, 0x27, 0x5, 0x4d, 0x8d, 0x91, 0x58, 0x81, 0xa4, 0xaa, 0x4f, 0xc5, 0xc9, 0xaa, 0x5d, 0xe8, 0x87, 0xc6, 0xee, 0x2, 0x36, 0xef, 0x9d, 0x8d, 0x74, 0xe6, 0xe6, 0x7f, 0xa8, 0xd8, 0xcb, 0x57, 0xdc, 0x98, 0x44, 0x12, 0x1f, 0x13, 0x71, 0x2f, 0xcf, 0x91, 0x24, 0xeb, 0x2b, 0xf8, 0x2e, 0xda, 0x80, 0x92, 0x91, 0x7e, 0x94, 0xdb, 0x68, 0x85, 0xc3, 0xca, 0x9a, 0x4c, 0xc5, 0xb1, 0xd2, 0x87, 0x7b, 0x69, 0xce, 0xe7, 0x0, 0xcf, 0x12, 0x62, 0xa3, 0x7, 0x66, 0xa8, 0x7c, 0x8e, 0x13, 0x27, 0x6, 0xfc, 0x8a, 0xdf, 0x93, 0xa3, 0x64, 0x17, 0x2f, 0xfc, 0x42, 0x8b, 0x6, 0xc9, 0x1e, 0x28, 0x32, 0x6d, 0x99, 0x66, 0x43, 0x18, 0x40, 0x99, 0xc5, 0x17, 0x7d, 0xa, 0x17, 0xda, 0x54, 0x6a, 0xed, 0xa5, 0xdc, 0x88, 0x52, 0x49, 0xaa, 0x92, 0x6b, 0xa6, 0x3e, 0xb5, 0x63, 0xf4, 0xab, 0x44, 0xc1, 0x37, 0x32, 0x29, 0xd1, 0xc5, 0x5, 0x35, 0x58, 0xed, 0x49, 0x76, 0x35, 0xf1, 0x1a, 0xfc, 0x40, 0x4d, 0xe, 0x44, 0x37, 0xa7, 0x16, 0xdf, 0x1b, 0xc4, 0x3d, 0x54, 0xaa, 0x9e, 0x6f, 0x7, 0x6b, 0x62, 0x8, 0x7f, 0xee, 0x22, 0x5d, 0x1e, 0xbe, 0x2, 0x64, 0x75, 0x12, 0xe7, 0x16, 0x73, 0xdf, 0xbb, 0x9a, 0xcf, 0x63, 0xa3, 0xeb, 0x2e, 0x1b, 0x33, 0x6d, 0xe7, 0x92, 0xec, 0xe6, 0x71, 0xed, 0xc1, 0xd, 0xbf, 0x98, 0xe3, 0xa5, 0x24, 0xd5, 0x4a, 0xcb, 0xfa, 0x4b, 0x70, 0xd, 0xd6, 0xe3, 0xfa, 0x83, 0x22, 0xd5, 0x81, 0x8a, 0x5c, 0x27, 0x7a, 0x2d, 0x76, 0xa6, 0x47, 0x21, 0x13, 0xac, 0xa6, 0x72, 0xf5, 0x6f, 0xae, 0xc3, 0xa8, 0xa3, 0x92, 0xdf, 0x5, 0xd6, 0xdb, 0x20, 0x12, 0x5f, 0x3a, 0x8b, 0x1a, 0x8a, 0xc0, 0xe9, 0x94, 0xef, 0xf9, 0x5c, 0xe7, 0x90, 0xf8, 0xb0, 0x17, 0x7c, 0x93, 0x66, 0x3f, 0x10, 0xfe, 0xec, 0x62, 0xce, 0x3f, 0xf6, 0x82, 0x3d, 0x38, 0xff, 0x3b, 0x72, 0x4f, 0xc8, 0xd4, 0xbb, 0xf2, 0x1d, 0x15, 0xf5, 0x27, 0xa5, 0x16, 0x65, 0x5, 0x4a, 0x76, 0xf9, 0x8b, 0x47, 0xe8, 0xb2, 0xb9, 0x96, 0x1b, 0x52, 0xba, 0xc5, 0xde, 0x91, 0x72, 0x1c, 0x5f, 0x94, 0xd, 0xdc, 0x68, 0xd0, 0x6f, 0x6e, 0xbd, 0x6b, 0x71, 0x57, 0x90, 0x40, 0x5b, 0x91, 0xf0, 0xa, 0xea, 0xb8, 0x86, 0xd0, 0x9, 0xe6, 0x7f, 0xe2, 0xd4, 0x6, 0xd6, 0x85, 0x8c, 0xf0, 0x42, 0xc2, 0x4d, 0x3a, 0xcc, 0x72, 0x6d, 0xad, 0xd8, 0xeb, 0xf5, 0x14, 0xfe, 0x0, 0x9b, 0xea, 0x68, 0x5a, 0xd2, 0x83, 0xa8, 0xc1, 0x67, 0xe2, 0xae, 0xdc, 0x81, 0x72, 0x60, 0xca, 0x58, 0x69, 0x8a, 0x5, 0x3e, 0x87, 0x7f, 0xb7, 0x79, 0x4, 0x10, 0x7b, 0x6e, 0x9a, 0xb2, 0xfe, 0x6a, 0xf3, 0x7c, 0x57, 0x71, 0xed, 0xdd, 0x29, 0xf6, 0x8e, 0x44, 0x51, 0xc7, 0x6c, 0x7a, 0x70, 0x1e, 0x15, 0x27, 0x36, 0x7e, 0x94, 0x54, 0x9f, 0x99, 0xdd, 0x9a, 0xd2, 0x3b, 0xe5, 0x7d, 0xc7, 0x33, 0x28, 0xe7, 0x7e, 0xb0, 0xc6, 0xf2, 0x3c, 0xda, 0x51, 0xb1, 0x68, 0x50, 0xcb, 0xbd, 0x60, 0x3a, 0x9f, 0x3, 0xde, 0xdf, 0xa5, 0x41, 0x4e, 0x88, 0xd7, 0x42, 0xd1, 0x58, 0x5e, 0xf4, 0x31, 0x9f, 0xda, 0x1a, 0x88, 0xef, 0x12, 0x6e, 0x46, 0xd5, 0x3d, 0xd7, 0x4, 0x35, 0x31, 0x48, 0xd7, 0x80, 0xee, 0xb, 0x2f, 0xc, 0xe2, 0xa, 0x88, 0xa1, 0x8c, 0x35, 0xf2, 0xa3, 0x4f, 0x3f, 0x17, 0x41, 0xec, 0x5d, 0xa5, 0xaa, 0x3b, 0x33, 0x91, 0xa5, 0xf9, 0xae, 0x9f, 0xe1, 0x58, 0x1c, 0x81, 0x4d, 0x11, 0x6e, 0x27, 0x24, 0xaf, 0x1c, 0x60, 0xe4, 0xcf, 0xe2, 0xc4, 0xf6, 0x6a, 0x7a, 0x92, 0x7c, 0x61, 0xa, 0x51, 0x76, 0xb, 0xe8, 0x5e, 0x57, 0x90, 0x0, 0x9e, 0xa1, 0x7, 0x24, 0xee, 0x40, 0x98, 0x2, 0xa5, 0x15, 0x7b, 0xf3, 0xb9, 0x9c, 0x26, 0xde, 0x31, 0x4b, 0x1b, 0xf, 0x24, 0x2d, 0xb3, 0xce, 0x3e, 0xde, 0x13, 0xc8, 0xf3, 0xb, 0x7a, 0x5, 0x5e, 0x15, 0xef, 0xc4, 0x1a, 0xdf, 0xc9, 0x6e, 0x83, 0x54, 0x6d, 0xfb, 0x53, 0x2a, 0x8a, 0xb8, 0xe0, 0x43, 0xa, 0xb4, 0xb5, 0xf3, 0xb8, 0x19, 0x65, 0xbb, 0x7b, 0x3d, 0x5c, 0x53, 0x53, 0x48, 0x72, 0x6f, 0x4a, 0x30, 0x2e, 0x45, 0xac, 0xd9, 0x93, 0xa9, 0x29, 0x9e, 0x23, 0x1b, 0x5d, 0xb8, 0xd, 0x24, 0x3b, 0xf1, 0x3a, 0x5b, 0x46, 0xe8, 0xea, 0x3c, 0x5b, 0x6b, 0xf0, 0xc, 0x7c, 0x40, 0x41, 0x3c, 0xf, 0x9d, 0x6e, 0x8e, 0xa4, 0xe2, 0xd4, 0x36, 0x87, 0xf7, 0x5, 0x8b, 0xe1, 0x4b, 0xae, 0x3d, 0xa4, 0xb9, 0xe7, 0x63, 0xe3, 0xf0, 0x71, 0x94, 0x9b, 0xf9, 0x9e, 0x20, 0x81, 0xa8, 0xbb, 0x64, 0xb7, 0xe, 0x17, 0x7b, 0xc0, 0xc7, 0x46, 0x9e, 0x16, 0xa7, 0x20, 0x3e, 0xab, 0x65, 0x1d, 0x5, 0x34, 0x71, 0xfb, 0xa4, 0x30, 0x78, 0x5, 0x6f, 0x46, 0x11, 0x2f, 0x8c, 0xa1, 0x40, 0x43, 0xeb, 0xcb, 0x4d, 0x68, 0x1f, 0xf1, 0xbf, 0xc3, 0x42, 0x19, 0x37, 0xf9, 0x9, 0xb4, 0xdc, 0xf0, 0xe7, 0x34, 0xc9, 0xce, 0x81, 0x97, 0x50, 0xdc, 0xae, 0xe1, 0x86, 0x96, 0x4c, 0x8c, 0x81, 0x3b, 0x67, 0x59, 0x16, 0x7e, 0xf7, 0x53, 0xd4, 0x84, 0x1b, 0xf3, 0xdf, 0x20, 0xd8, 0x17, 0xf3, 0x78, 0xbd, 0xc1, 0x62, 0x7f, 0x90, 0x82, 0xf8, 0x4d, 0x17, 0x71, 0x12, 0x96, 0xb0, 0xd7, 0x20, 0xbe, 0xd3, 0x28, 0x40, 0xab, 0x7b, 0x3d, 0x15, 0x2a, 0x28, 0x79, 0xa3, 0x53, 0xd6, 0xa0, 0xc2, 0x79, 0x17, 0x86, 0x53, 0x60, 0xed, 0xe1, 0x34, 0x11, 0x94, 0x94, 0xa0, 0xc4, 0x67, 0x73, 0xf1, 0xd7, 0xab, 0xb7, 0x8e, 0x96, 0x25, 0xba, 0xec, 0x7c, 0xca, 0xbf, 0x2f, 0xcb, 0xd5, 0x17, 0x4f, 0x9c, 0x34, 0x68, 0x88, 0x3e, 0xfe, 0xfc, 0x44, 0x3d, 0x5a, 0x3f, 0xfb, 0x8b, 0x73, 0x8c, 0xe, 0x12, 0x4b, 0x5a, 0xd3, 0xc5, 0xd1, 0x9c, 0x1b, 0x11, 0x12, 0x59, 0x8a, 0x52, 0x88, 0xe4, 0x27, 0x8e, 0x63, 0x33, 0x41, 0xcc, 0x63, 0xd, 0xc7, 0x20, 0xf3, 0x68, 0xc1, 0x21, 0xb0, 0x3d, 0x93, 0xd7, 0x2a, 0x74, 0x9a, 0x15, 0x2e, 0x14, 0x72, 0x7d, 0x81, 0xfc, 0x76, 0x11, 0x27, 0x99, 0xa1, 0xd, 0xd7, 0x5d, 0x33, 0x71, 0xd2, 0xe3, 0x37, 0xe7, 0xda, 0x81, 0xe2, 0x90, 0xda, 0xe8, 0xbb, 0x84, 0x6b, 0x2d, 0xf9, 0xf7, 0x1f, 0xb9, 0xce, 0xf0, 0xe7, 0xf, 0x5c, 0x7f, 0xd3, 0x69, 0xc5, 0x2d, 0xe3, 0x9a, 0x55, 0x64, 0x6, 0xcc, 0x39, 0x92, 0x4b, 0xe0, 0x3e, 0xee, 0x44, 0x45, 0xb1, 0x15, 0xc7, 0x93, 0xe5, 0x9, 0x5b, 0xc8, 0xc6, 0xe, 0x27, 0x6b, 0x52, 0x3c, 0x17, 0x2b, 0xb9, 0x1f, 0x2c, 0xa3, 0x15, 0x8d, 0x78, 0x2b, 0xe2, 0xa0, 0x70, 0x13, 0xc3, 0x6d, 0x9c, 0xb5, 0x6, 0xf, 0x6b, 0xd6, 0xae, 0x93, 0xa1, 0x83, 0x6, 0xca, 0x3e, 0x7b, 0x54, 0x8d, 0xc2, 0xfc, 0xbf, 0x0, 0x3, 0x0, 0x73, 0x78, 0xf7, 0xf2, 0x7e, 0x74, 0x3a, 0x48, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - - - + (NSData *)parse_logo2x_png { - return [NSData dataWithBytes:parse_logo2x_png length:sizeof(parse_logo2x_png)]; - } - - static 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)]; - } - - static const unsigned char apple_icon_png[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x16, 0x8, 0x6, 0x0, 0x0, 0x0, 0xcd, 0x5f, 0xcc, 0x41, 0x0, 0x0, 0x0, 0x1, 0x73, 0x52, 0x47, 0x42, 0x0, 0xae, 0xce, 0x1c, 0xe9, 0x0, 0x0, 0x1, 0x54, 0x49, 0x44, 0x41, 0x54, 0x38, 0x11, 0xa5, 0x93, 0x31, 0x2c, 0x83, 0x41, 0x14, 0xc7, 0xbf, 0xfb, 0x52, 0xd4, 0x86, 0xa5, 0x13, 0x91, 0x8a, 0x44, 0x22, 0x6, 0x6, 0x83, 0x98, 0x24, 0x62, 0xb3, 0x74, 0xb3, 0x4a, 0xba, 0x32, 0x1a, 0xd, 0x16, 0x89, 0xd1, 0x6a, 0x68, 0x62, 0x94, 0xb0, 0xd9, 0x30, 0x18, 0x6c, 0x48, 0x58, 0x1a, 0x2c, 0x6, 0xb1, 0x10, 0x83, 0x90, 0x56, 0xfa, 0xf9, 0xbd, 0xea, 0xbb, 0x6b, 0x85, 0xc4, 0x3d, 0x2f, 0xf9, 0xe5, 0xbd, 0x77, 0xf7, 0xfe, 0xff, 0x5c, 0xbf, 0xde, 0x25, 0x49, 0x44, 0x64, 0x59, 0x56, 0x86, 0x6b, 0x58, 0x8c, 0x90, 0x85, 0x51, 0x84, 0x29, 0xec, 0x82, 0xc6, 0x68, 0xd8, 0x8d, 0xa8, 0x50, 0xaf, 0xa8, 0x3, 0xf9, 0xc, 0x5c, 0x84, 0x3c, 0x8c, 0x22, 0xbc, 0x6d, 0x19, 0x3d, 0x91, 0x27, 0xc3, 0x4e, 0x44, 0x85, 0xb0, 0x1f, 0x1a, 0x70, 0x4, 0x23, 0xbf, 0x49, 0x3b, 0x8e, 0xc8, 0xe0, 0x18, 0x83, 0x73, 0x30, 0xe, 0xf7, 0xb0, 0xf, 0x55, 0xe8, 0x81, 0x1, 0x28, 0xc1, 0x14, 0x74, 0xc3, 0x25, 0x54, 0x9c, 0x73, 0x8f, 0xe4, 0xaf, 0xc0, 0x20, 0x7, 0xeb, 0xf0, 0x1, 0xdf, 0xe3, 0x9c, 0x85, 0x53, 0xf8, 0x69, 0xef, 0x95, 0xf5, 0x25, 0xf5, 0x49, 0x68, 0xb6, 0xc0, 0x1a, 0x2f, 0x8, 0xb, 0x62, 0x32, 0x1, 0x75, 0xa3, 0x4b, 0xd, 0xdd, 0x6c, 0xf3, 0x44, 0x14, 0x15, 0xa3, 0x89, 0xc8, 0x36, 0xdb, 0x7f, 0xd6, 0xdd, 0x3f, 0x8c, 0xfc, 0x55, 0x70, 0x98, 0xbc, 0xe1, 0x9a, 0xf7, 0xce, 0x7f, 0x2f, 0x1a, 0x8c, 0xf6, 0xf2, 0xaf, 0xd5, 0x44, 0x92, 0x42, 0x5d, 0xa, 0x43, 0x88, 0xd6, 0x1f, 0x40, 0x9a, 0x70, 0xf, 0xe2, 0xdd, 0x16, 0x54, 0x22, 0x46, 0x17, 0xda, 0x18, 0xb2, 0x5c, 0x9b, 0x3e, 0xd1, 0x89, 0xd1, 0xb1, 0xc1, 0x40, 0x25, 0x43, 0x14, 0x87, 0x98, 0xd, 0xca, 0xc7, 0x2e, 0xd0, 0xc8, 0x73, 0xe8, 0xd2, 0x5d, 0x43, 0x3e, 0x49, 0x5b, 0x6f, 0x65, 0xcf, 0x20, 0x6e, 0x97, 0xec, 0x34, 0x1b, 0x4e, 0x55, 0x84, 0x77, 0xb0, 0xc4, 0x15, 0xa2, 0x9c, 0x77, 0xa5, 0x59, 0x33, 0xb8, 0xc8, 0x43, 0x9e, 0xf1, 0x26, 0x52, 0xb0, 0x20, 0xdf, 0xeb, 0x20, 0xd2, 0x6c, 0xb5, 0xc3, 0x44, 0x1b, 0x4c, 0xf2, 0xb0, 0xd, 0xcf, 0x70, 0x3, 0x1b, 0x30, 0xd, 0xc3, 0x30, 0xf, 0xf2, 0x2e, 0x1f, 0xa0, 0xa, 0xcb, 0xaa, 0x93, 0xfc, 0x9, 0x73, 0x3f, 0x88, 0x2b, 0xe2, 0x2d, 0x37, 0x24, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; - - + (NSData *)apple_icon_png { - return [NSData dataWithBytes:apple_icon_png length:sizeof(apple_icon_png)]; - } - -@end diff --git a/ParseUI/ParseUI/Source/PFSignUpView.h b/ParseUI/ParseUI/Source/PFSignUpView.h deleted file mode 100644 index 0ad10c9b8..000000000 --- a/ParseUI/ParseUI/Source/PFSignUpView.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * 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 - -#import "ParseUIConstants.h" - -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. */ - PFSignUpFieldsUsernameAndPassword = 1 << 0, - /** Email field. */ - PFSignUpFieldsEmail = 1 << 1, - /** This field can be used for something else. */ - PFSignUpFieldsAdditional = 1 << 2, - /** Sign Up Button */ - PFSignUpFieldsSignUpButton = 1 << 3, - /** Dismiss Button */ - PFSignUpFieldsDismissButton = 1 << 4, - /** Default value. Combines Username, Password, Email, Sign Up and Dismiss Buttons. */ - PFSignUpFieldsDefault = (PFSignUpFieldsUsernameAndPassword | - PFSignUpFieldsEmail | - PFSignUpFieldsSignUpButton | - 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; - -/** - The `PFSignUpView` class provides a standard sign up interface for authenticating a `PFUser`. - */ -@interface PFSignUpView : UIScrollView - -///-------------------------------------- -/// @name Creating SignUp View -///-------------------------------------- - -/** - Initializes the view with the specified sign up elements. - - @param fields A bitmask specifying the sign up elements which are enabled in the view - - @return An initialized `PFSignUpView` object or `nil` if the object couldn't be created. - - @see PFSignUpFields - */ -- (instancetype)initWithFields:(PFSignUpFields)fields; - -/** - The view controller that will present this view. - - Used to lay out elements correctly when the presenting view controller has translucent elements. - */ -@property (nullable, nonatomic, weak) UIViewController *presentingViewController; - -///-------------------------------------- -/// @name Customizing the Logo -///-------------------------------------- - -/** - The logo. By default, it is the Parse logo. - */ -@property (nullable, nonatomic, strong) UIView *logo; - -///-------------------------------------- -/// @name Configure Username Behaviour -///-------------------------------------- - -/** - If email should be used to log in, instead of username - - By default, this is set to `NO`. - */ -@property (nonatomic, assign) BOOL emailAsUsername; - -///-------------------------------------- -/// @name Sign Up Elements -///-------------------------------------- - -/** - The bitmask which specifies the enabled sign up elements in the view - */ -@property (nonatomic, assign, readonly) PFSignUpFields fields; - -/** - The username text field. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *usernameField; - -/** - The password text field. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *passwordField; - -/** - The email text field. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *emailField; - -/** - The additional text field. It is `nil` if the element is not enabled. - - This field is intended to be customized. - */ -@property (nullable, nonatomic, strong, readonly) PFTextField *additionalField; - -/** - The sign up button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *signUpButton; - -/** - The dismiss button. It is `nil` if the element is not enabled. - */ -@property (nullable, nonatomic, strong, readonly) UIButton *dismissButton; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFSignUpView.m b/ParseUI/ParseUI/Source/PFSignUpView.m deleted file mode 100644 index e75918752..000000000 --- a/ParseUI/ParseUI/Source/PFSignUpView.m +++ /dev/null @@ -1,337 +0,0 @@ -/* - * 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 "PFSignUpView.h" - -#import "PFColor.h" -#import "PFDismissButton.h" -#import "PFImage.h" -#import "PFLocalization.h" -#import "PFPrimaryButton.h" -#import "PFRect.h" -#import "PFTextButton.h" -#import "PFTextField.h" - -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 - -#pragma mark NSObject - -- (instancetype)initWithFields:(PFSignUpFields)otherFields { - self = [super init]; - if (!self) return nil; - - _fields = otherFields; - - self.opaque = YES; - self.backgroundColor = [PFColor commonBackgroundColor]; - - _logo = [[UIImageView alloc] initWithImage:[PFImage imageNamed:PFSignUpViewDefaultLogoImageName]]; - _logo.contentMode = UIViewContentModeScaleAspectFit; - [self addSubview:_logo]; - - 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; - [self addSubview:_usernameField]; - [self _updateUsernameFieldStyle]; - - _passwordField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:PFTextFieldSeparatorStyleBottom]; - _passwordField.accessibilityIdentifier = PFSignUpViewPasswordFieldAccessibilityIdentifier; - _passwordField.placeholder = PFLocalizedString(@"Password", @"Password"); - _passwordField.secureTextEntry = YES; - _passwordField.autocorrectionType = UITextAutocorrectionTypeNo; - _passwordField.autocapitalizationType = UITextAutocapitalizationTypeNone; - if (!(_fields & PFSignUpFieldsEmail) && !(_fields & PFSignUpFieldsAdditional)) { - _passwordField.returnKeyType = UIReturnKeyDone; - } else { - _passwordField.returnKeyType = UIReturnKeyNext; - } - [self addSubview:_passwordField]; - - if (_fields & PFSignUpFieldsEmail) { - _emailField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:PFTextFieldSeparatorStyleBottom]; - _emailField.accessibilityIdentifier = PFSignUpViewEmailFieldAccessibilityIdentifier; - _emailField.autocorrectionType = UITextAutocorrectionTypeNo; - _emailField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _emailField.keyboardType = UIKeyboardTypeEmailAddress; - _emailField.placeholder = PFLocalizedString(@"Email", @"Email"); - if (!(_fields & PFSignUpFieldsAdditional)) { - _emailField.returnKeyType = UIReturnKeyDone; - } else { - _emailField.returnKeyType = UIReturnKeyNext; - } - [self addSubview:_emailField]; - } - - if (_fields & PFSignUpFieldsAdditional) { - _additionalField = [[PFTextField alloc] initWithFrame:CGRectZero - separatorStyle:PFTextFieldSeparatorStyleBottom]; - _additionalField.accessibilityIdentifier = PFSignUpViewAdditionalFieldAccessibilityIdentifier; - _additionalField.autocorrectionType = UITextAutocorrectionTypeNo; - _additionalField.autocapitalizationType = UITextAutocapitalizationTypeNone; - _additionalField.placeholder = PFLocalizedString(@"Additional", @"Additional"); - _additionalField.returnKeyType = UIReturnKeyDone; - [self addSubview:_additionalField]; - } - - if (_fields & PFSignUpFieldsSignUpButton) { - _signUpButton = [[PFPrimaryButton alloc] initWithBackgroundImageColor:[PFColor signupButtonBackgroundColor]]; - _signUpButton.accessibilityIdentifier = PFSignUpViewSignUpButtonAccessibilityIdentifier; - [_signUpButton setTitle:PFLocalizedString(@"Sign Up", @"Sign Up") forState:UIControlStateNormal]; - [self addSubview:_signUpButton]; - } - - return self; -} - -#pragma mark - -#pragma mark UIView - -- (void)layoutSubviews { - [super layoutSubviews]; - - CGRect bounds = self.bounds; - - if (_dismissButton) { - CGPoint origin = CGPointMake(16.0f, 16.0f); - - // In iOS 7+, if the view controller that contains this view - // is presented modally, it's edges extend under the status bar. - // This lets us move down the dismiss button a bit so that it's not covered by the status bar. - UIViewController *presentingViewController = self.presentingViewController; - if ([presentingViewController respondsToSelector:@selector(topLayoutGuide)]) { - origin.y += presentingViewController.topLayoutGuide.length; - } - - CGRect frame = PFRectMakeWithOriginSize(origin, [_dismissButton sizeThatFits:bounds.size]); - _dismissButton.frame = frame; - } - - const CGRect contentRect = PFRectMakeWithSizeCenteredInRect([self _contentSizeThatFits:bounds.size], - PFRectMakeWithSize(bounds.size)); - const CGSize contentSize = contentRect.size; - const CGSize contentSizeScale = [self _contentSizeScaleForContentSize:bounds.size]; - - CGFloat currentY = CGRectGetMinY(contentRect); - if (_logo) { - CGFloat logoTopInset = floor(48.0f * contentSizeScale.height); - CGFloat logoBottomInset = floor(36.0f * contentSizeScale.height); - - CGFloat logoAvailableHeight = floor(68.0f * contentSizeScale.height); - - CGSize logoSize = [_logo sizeThatFits:CGSizeMake(contentSize.width, logoAvailableHeight)]; - logoSize.width = MIN(contentSize.width, logoSize.width); - logoSize.height = MIN(logoAvailableHeight, logoSize.height); - - CGRect frame = PFRectMakeWithSizeCenteredInRect(logoSize, contentRect); - frame.origin.y = CGRectGetMinY(contentRect) + logoTopInset; - _logo.frame = CGRectIntegral(frame); - - currentY = floor(CGRectGetMaxY(frame) + logoBottomInset); - } - - if (_usernameField) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_usernameField sizeThatFits:contentSize], contentRect); - frame.origin.y = currentY; - _usernameField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_passwordField) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_passwordField sizeThatFits:contentSize], contentRect); - frame.origin.y = currentY; - _passwordField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_emailField && !_emailAsUsername) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_emailField sizeThatFits:contentSize], contentRect); - frame.origin.y = currentY; - _emailField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_additionalField) { - CGRect frame = PFRectMakeWithSizeCenteredInRect([_additionalField sizeThatFits:contentSize], contentRect); - frame.origin.y = currentY; - _additionalField.frame = frame; - - currentY = CGRectGetMaxY(frame); - } - - if (_signUpButton) { - CGFloat loginButtonTopInset = floor(24.0f * contentSizeScale.height); - - CGRect frame = PFRectMakeWithSizeCenteredInRect([_signUpButton sizeThatFits:contentSize], contentRect);; - frame.origin.y = currentY + loginButtonTopInset; - _signUpButton.frame = frame; - - currentY = CGRectGetMaxY(frame); - } -} - -- (CGSize)_contentSizeThatFits:(CGSize)boundingSize { - CGSize maxContentSize = [self _maxContentSize]; - CGSize contentSizeScale = [self _contentSizeScaleForContentSize:boundingSize]; - - CGSize size = PFSizeMin(maxContentSize, boundingSize); - size.height = 0.0f; - if (_logo) { - CGFloat logoTopInset = floor(36.0f * contentSizeScale.height); - CGFloat logoBottomInset = floor(36.0f * contentSizeScale.height); - - CGFloat logoAvailableHeight = floor(68.0f * contentSizeScale.height); - - CGFloat scale = MAX(contentSizeScale.width, contentSizeScale.height); - - CGSize logoSize = [_logo sizeThatFits:CGSizeMake(boundingSize.width, logoAvailableHeight)]; - logoSize.height *= scale; - logoSize.width *= scale; - - size.height += logoSize.height + logoTopInset + logoBottomInset; - } - if (_usernameField) { - CGSize fieldSize = [_usernameField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_passwordField) { - CGSize fieldSize = [_passwordField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_emailField && !_emailAsUsername) { - CGSize fieldSize = [_emailField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_additionalField) { - CGSize fieldSize = [_additionalField sizeThatFits:boundingSize]; - size.height += fieldSize.height; - } - if (_signUpButton) { - CGFloat buttonTopInset = floor(24.0f * contentSizeScale.height); - - CGSize buttonSize = [_signUpButton sizeThatFits:boundingSize]; - - size.height += buttonSize.height + buttonTopInset; - } - - size.width = floor(size.width); - size.height = floor(size.height); - - return size; -} - -- (CGSize)_maxContentSize { - return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? - CGSizeMake(420.0f, 500.0f) : - CGSizeMake(500.0f, 800.0f)); -} - -- (CGSize)_contentSizeScaleForContentSize:(CGSize)contentSize { - CGSize maxContentSize = [self _maxContentSize]; - if (maxContentSize.width < contentSize.width && - maxContentSize.height < contentSize.height) { - return CGSizeMake(1.0f, 1.0f); - } - - CGSize contentSizeScale = CGSizeMake(contentSize.width / maxContentSize.width, - contentSize.height / maxContentSize.height); - return contentSizeScale; -} - -#pragma mark - -#pragma mark PFSignUpView - -- (void)setLogo:(UIView *)logo { - if (self.logo != logo) { - [_logo removeFromSuperview]; - _logo = logo; - [self addSubview:_logo]; - - [self setNeedsLayout]; - } -} - -- (void)setEmailAsUsername:(BOOL)otherEmailAsUsername { - if (_emailAsUsername != otherEmailAsUsername) { - _emailAsUsername = otherEmailAsUsername; - - if (_emailAsUsername) { - if (_emailField.superview) { - [_emailField removeFromSuperview]; - } - } else { - if (_emailField.superview == nil) { - [self addSubview:_emailField]; - } - [self setNeedsLayout]; - } - [self _updateUsernameFieldStyle]; - } -} - -#pragma mark - -#pragma mark Private - -- (void)_updateUsernameFieldStyle { - UIKeyboardType keyboardType = UIKeyboardTypeDefault; - NSString *placeholder = nil; - if (!_emailAsUsername) { - placeholder = PFLocalizedString(@"Username", @"Username"); - keyboardType = UIKeyboardTypeDefault; - } else { - placeholder = PFLocalizedString(@"Email", @"Email"); - keyboardType = UIKeyboardTypeEmailAddress; - } - - _usernameField.placeholder = placeholder; - _usernameField.keyboardType = keyboardType; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFSignUpViewController.h b/ParseUI/ParseUI/Source/PFSignUpViewController.h deleted file mode 100644 index 6c667d15e..000000000 --- a/ParseUI/ParseUI/Source/PFSignUpViewController.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * 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 -#import "ParseUIConstants.h" -#import "PFSignUpView.h" - -@import ParseCore; - -@class PFUser; -@protocol PFSignUpViewControllerDelegate; - -NS_ASSUME_NONNULL_BEGIN - -/** - The `PFSignUpViewController` class that presents and manages - a standard authentication interface for signing up a `PFUser`. - */ -@interface PFSignUpViewController : UIViewController - -///-------------------------------------- -/// @name Configuring Sign Up Elements -///-------------------------------------- - -/** - A bitmask specifying the log in elements which are enabled in the view. - - @see PFSignUpFields - */ -@property (nonatomic, assign) PFSignUpFields fields; - -/** - The sign up view. It contains all the enabled log in elements. - - @see PFSignUpView - */ -@property (nullable, nonatomic, strong, readonly) PFSignUpView *signUpView; - -///-------------------------------------- -/// @name Configuring Sign Up Behaviors -///-------------------------------------- - -/** - The delegate that responds to the control events of `PFSignUpViewController`. - - @see PFSignUpViewControllerDelegate - */ -@property (nullable, nonatomic, weak) id delegate; - -/** - Minimum required password length for user signups, defaults to `0`. - */ -@property (nonatomic, assign) NSUInteger minPasswordLength; - -/** - 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 `PFUser` object. By default, this is set to `NO`. - */ -@property (nonatomic, assign) BOOL emailAsUsername; - -@end - -///-------------------------------------- -/// @name Notifications -///-------------------------------------- - -/** - The notification is posted immediately after the sign up succeeds. - */ -extern NSString *const PFSignUpSuccessNotification; - -/** - The notification is posted immediately after the sign up fails. - - If the delegate prevents the sign up to start, the notification is not sent. - */ -extern NSString *const PFSignUpFailureNotification; - -/** - The notification is posted immediately after the user cancels sign up. - */ -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 -///-------------------------------------- - -/** - The `PFLogInViewControllerDelegate` protocol defines methods a delegate of a `PFSignUpViewController` should implement. - All methods of this protocol are optional. - */ -@protocol PFSignUpViewControllerDelegate - -@optional - -///-------------------------------------- -/// @name Customizing Behavior -///-------------------------------------- - -/** - 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. - - @return A `BOOL` indicating whether the sign up should proceed. - */ -- (BOOL)signUpViewController:(PFSignUpViewController *)signUpController shouldBeginSignUp:(NSDictionary *)info; - -///-------------------------------------- -/// @name Responding to Actions -///-------------------------------------- - -/** - Sent to the delegate when a `PFUser` is signed up. - - @param signUpController The signup view controller where signup finished. - @param user `PFUser` object that is a result of the sign up. - */ -- (void)signUpViewController:(PFSignUpViewController *)signUpController didSignUpUser:(PFUser *)user; - -/** - 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. - */ -- (void)signUpViewController:(PFSignUpViewController *)signUpController didFailToSignUpWithError:(nullable NSError *)error; - -/** - Sent to the delegate when the sign up screen is cancelled. - - @param signUpController The signup view controller where signup was cancelled. - */ -- (void)signUpViewControllerDidCancelSignUp:(PFSignUpViewController *)signUpController; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFSignUpViewController.m b/ParseUI/ParseUI/Source/PFSignUpViewController.m deleted file mode 100644 index 2f6431e46..000000000 --- a/ParseUI/ParseUI/Source/PFSignUpViewController.m +++ /dev/null @@ -1,514 +0,0 @@ -/* - * 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 "PFSignUpViewController.h" -#import "PFUIAlertView.h" -#import "PFLocalization.h" -#import "PFPrimaryButton.h" -#import "PFTextField.h" - -@import ParseCore; - -NSString *const PFSignUpSuccessNotification = @"com.parse.ui.signup.success"; -NSString *const PFSignUpFailureNotification = @"com.parse.ui.signup.failure"; -NSString *const PFSignUpCancelNotification = @"com.parse.ui.signup.cancel"; - -// Keys that are used to pass information to the delegate on `signUpViewController:shouldBeginSignUp`. -NSString *const PFSignUpViewControllerDelegateInfoUsernameKey = @"username"; -NSString *const PFSignUpViewControllerDelegateInfoPasswordKey = @"password"; -NSString *const PFSignUpViewControllerDelegateInfoEmailKey = @"email"; -NSString *const PFSignUpViewControllerDelegateInfoAdditionalKey = @"additional"; - -@interface PFSignUpViewController () { - struct { - BOOL shouldSignUp : YES; - BOOL didSignUp : YES; - BOOL didFailToSignUp : YES; - BOOL didCancelSignUp : YES; - } _delegateExistingMethods; -} - -@property (nonatomic, strong, readwrite) PFSignUpView *signUpView; - -@property (nonatomic, assign) BOOL loading; - -@property (nonatomic, assign) CGFloat visibleKeyboardHeight; - -@end - -@implementation PFSignUpViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)init { - self = [super init]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self _commonInit]; - } - return self; -} - -- (void)_commonInit { - self.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - self.modalPresentationStyle = UIModalPresentationFormSheet; - _fields = PFSignUpFieldsDefault; - - if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) { - self.automaticallyAdjustsScrollViewInsets = NO; - } -} - -#pragma mark - -#pragma mark Dealloc - -- (void)dealloc { - // Unregister from all notifications - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)loadView { - _signUpView = [[PFSignUpView alloc] initWithFields:_fields]; - _signUpView.presentingViewController = self; - self.view = _signUpView; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self _setupHandlers]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - [self _registerForKeyboardNotifications]; - if (self.navigationController && - self.fields & PFSignUpFieldsDismissButton) { - self.fields = self.fields & ~PFSignUpFieldsDismissButton; - - [_signUpView.dismissButton removeFromSuperview]; - } -} - -#pragma mark - -#pragma mark Rotation - -- (UIInterfaceOrientationMask)supportedInterfaceOrientations { - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - return UIInterfaceOrientationMaskAll; - } - - return UIInterfaceOrientationMaskPortrait; -} - -#pragma mark - -#pragma mark PFSignUpViewController - -- (PFSignUpView *)signUpView { - return (PFSignUpView *)self.view; // self.view will call loadView if the view is nil -} - -- (void)setDelegate:(id)delegate { - if (self.delegate != delegate) { - _delegate = delegate; - - _delegateExistingMethods.shouldSignUp = [delegate respondsToSelector:@selector(signUpViewController: - shouldBeginSignUp:)]; - _delegateExistingMethods.didSignUp = [delegate respondsToSelector:@selector(signUpViewController: - didSignUpUser:)]; - _delegateExistingMethods.didFailToSignUp = [delegate respondsToSelector:@selector(signUpViewController: - didFailToSignUpWithError:)]; - _delegateExistingMethods.didCancelSignUp = [delegate - respondsToSelector:@selector(signUpViewControllerDidCancelSignUp:)]; - } -} - -- (void)setEmailAsUsername:(BOOL)otherEmailAsUsername { - self.signUpView.emailAsUsername = otherEmailAsUsername; -} - -- (BOOL)emailAsUsername { - return self.signUpView.emailAsUsername; -} - -#pragma mark - -#pragma mark UITextFieldDelegate - -- (void)textFieldDidBeginEditing:(UITextField *)textField { - [self _updateSignUpViewContentOffsetAnimated:YES]; -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - if (textField == _signUpView.usernameField) { - [_signUpView.passwordField becomeFirstResponder]; - return YES; - } - - if (textField == _signUpView.passwordField) { - if (_signUpView.emailField) { - [_signUpView.emailField becomeFirstResponder]; - return YES; - } else if (_signUpView.additionalField) { - [_signUpView.additionalField becomeFirstResponder]; - return YES; - } - } - - if (textField == _signUpView.emailField) { - if (_signUpView.additionalField) { - [_signUpView.additionalField becomeFirstResponder]; - return YES; - } - } - - [self _signUpAction]; - - return YES; -} - -#pragma mark - -#pragma mark Private - -- (void)_setupHandlers { - _signUpView.delegate = self; // UIScrollViewDelegate - [_signUpView.dismissButton addTarget:self - action:@selector(_dismissAction) - forControlEvents:UIControlEventTouchUpInside]; - _signUpView.usernameField.delegate = self; - _signUpView.passwordField.delegate = self; - _signUpView.emailField.delegate = self; - _signUpView.additionalField.delegate = self; - [_signUpView.signUpButton addTarget:self - action:@selector(_signUpAction) - forControlEvents:UIControlEventTouchUpInside]; - - UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] - initWithTarget:self - action:@selector(_dismissKeyboard)]; - gestureRecognizer.cancelsTouchesInView = NO; - [_signUpView addGestureRecognizer:gestureRecognizer]; -} - -- (void)_dismissAction { - [self _cancelSignUp]; - - // Normally the role of dismissing a modal controller lies on the presenting controller. - // Here we violate the principle so that the presenting modal log in controller is especially easy. - // Cons of this design is that it makes working with non-modally presented log in controller hard; - // but this concern is mitigated by the fact that navigationally presented controller should not have - // dismiss button. - - [self dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)_signUpAction { - if (self.loading) { - return; - } - - [self _dismissKeyboard]; - - 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, - PFSignUpViewControllerDelegateInfoPasswordKey : password } mutableCopy]; - - if (email) { - dictionary[PFSignUpViewControllerDelegateInfoEmailKey] = email; - } - if (additional) { - dictionary[PFSignUpViewControllerDelegateInfoAdditionalKey] = additional; - } - - if (_delegateExistingMethods.shouldSignUp) { - if (![_delegate signUpViewController:self shouldBeginSignUp:dictionary]) { - return; - } - } - - if ([password length] < _minPasswordLength) { - 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 - code:0 - userInfo:@{ NSLocalizedDescriptionKey : errorMessage }]; - [self _signUpDidFailWithError:error]; - [_signUpView.passwordField becomeFirstResponder]; - - return; - } - - PFUser *user = [PFUser user]; - user.username = username; - user.password = password; - - if (email) { - user.email = email; - } - if (additional) { - user[PFSignUpViewControllerDelegateInfoAdditionalKey] = additional; - } - - self.loading = YES; - if ([_signUpView.signUpButton isKindOfClass:[PFPrimaryButton class]]) { - [(PFPrimaryButton *)_signUpView.signUpButton setLoading:YES]; - } - [user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { - self.loading = NO; - if ([self->_signUpView.signUpButton isKindOfClass:[PFPrimaryButton class]]) { - [(PFPrimaryButton *)self->_signUpView.signUpButton setLoading:NO]; - } - - if (succeeded) { - [self _signUpDidSuceedWithUser:user]; - } - else { - [self _signUpDidFailWithError:error]; - } - }]; -} - -- (void)_signUpDidSuceedWithUser:(PFUser *)user { - if (_delegateExistingMethods.didSignUp) { - [_delegate signUpViewController:self didSignUpUser:user]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFSignUpSuccessNotification object:self]; -} - -- (void)_signUpDidFailWithError:(NSError *)error { - if (_delegateExistingMethods.didFailToSignUp) { - [_delegate signUpViewController:self didFailToSignUpWithError:error]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFSignUpFailureNotification object:self]; - - NSString *title = PFLocalizedString(@"Sign Up Error", @"Sign Up Error"); - - if ([[error domain] isEqualToString:PFParseErrorDomain]) { - NSInteger errorCode = [error code]; - NSString *message = nil; - UIResponder *responder = nil; - - if (errorCode == kPFErrorInvalidEmailAddress) { - 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 = PFLocalizedString(@"Please enter a username.", - @"Username missing error message in PFSignUpViewController"); - responder = _signUpView.usernameField; - } else if (errorCode == kPFErrorUserPasswordMissing) { - message = PFLocalizedString(@"Please enter a password.", - @"Password missing error message in PFSignUpViewController"); - responder = _signUpView.passwordField; - } else if (errorCode == kPFErrorUsernameTaken) { - 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 = 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 = PFLocalizedString(@"Please enter an email.", - @"Email missing error message in PFSignUpViewController"); - responder = _signUpView.emailField; - } - - if (message != nil) { - [PFUIAlertView presentAlertInViewController:self withTitle:title message:message]; - [responder becomeFirstResponder]; - - return; - } - } - - // Show the generic error alert, as no custom cases matched before - [PFUIAlertView presentAlertInViewController:self withTitle:title error:error]; -} - -- (void)_cancelSignUp { - if (_delegateExistingMethods.didCancelSignUp) { - [_delegate signUpViewControllerDidCancelSignUp:self]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:PFSignUpCancelNotification object:self]; -} - -- (UIView *)_currentFirstResponder { - if ([_signUpView.usernameField isFirstResponder]) { - return _signUpView.usernameField; - } - if ([_signUpView.passwordField isFirstResponder]) { - return _signUpView.passwordField; - } - if ([_signUpView.emailField isFirstResponder]) { - return _signUpView.emailField; - } - if ([_signUpView.additionalField isFirstResponder]) { - return _signUpView.additionalField; - } - - return nil; -} - -#pragma mark Keyboard - -- (void)_dismissKeyboard { - [self.view endEditing:YES]; -} - -- (void)_registerForKeyboardNotifications { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillHide:) - name:UIKeyboardWillHideNotification object:nil]; -} - -- (void)_keyboardWillShow:(NSNotification *)notification { - NSDictionary *userInfo = [notification userInfo]; - CGRect endFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; - CGFloat duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; - - CGRect keyboardFrame = [self.view convertRect:endFrame fromView:self.view.window]; - CGFloat visibleKeyboardHeight = CGRectGetMaxY(self.view.bounds) - CGRectGetMinY(keyboardFrame); - - [self setVisibleKeyboardHeight:visibleKeyboardHeight - animationDuration:duration - animationOptions:curve << 16]; -} - -- (void)_keyboardWillHide:(NSNotification *)notification { - NSDictionary *userInfo = [notification userInfo]; - CGFloat duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; - UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; - [self setVisibleKeyboardHeight:0.0 - animationDuration:duration - animationOptions:curve << 16]; -} - -- (void)setVisibleKeyboardHeight:(CGFloat)visibleKeyboardHeight - animationDuration:(NSTimeInterval)animationDuration - animationOptions:(UIViewAnimationOptions)animationOptions { - - dispatch_block_t animationsBlock = ^{ - self.visibleKeyboardHeight = visibleKeyboardHeight; - }; - - if (animationDuration == 0.0) { - animationsBlock(); - } else { - [UIView animateWithDuration:animationDuration - delay:0.0 - options:animationOptions | UIViewAnimationOptionBeginFromCurrentState - animations:animationsBlock - completion:nil]; - } -} - -- (void)setVisibleKeyboardHeight:(CGFloat)visibleKeyboardHeight { - if (self.visibleKeyboardHeight != visibleKeyboardHeight) { - _visibleKeyboardHeight = visibleKeyboardHeight; - [self _updateSignUpViewContentOffsetAnimated:NO]; - } -} - -- (void)_updateSignUpViewContentOffsetAnimated:(BOOL)animated { - CGPoint contentOffset = CGPointZero; - if (self.visibleKeyboardHeight > 0.0f) { - // Scroll the view to keep fields visible - CGFloat offsetForScrollingTextFieldToTop = CGRectGetMinY([self _currentFirstResponder].frame); - - UIView *lowestView; - if (_signUpView.signUpButton) { - lowestView = _signUpView.signUpButton; - } else if (_signUpView.additionalField) { - lowestView = _signUpView.additionalField; - } else if (_signUpView.emailField) { - lowestView = _signUpView.emailField; - } else { - lowestView = _signUpView.passwordField; - } - - CGFloat offsetForScrollingLowestViewToBottom = 0.0f; - offsetForScrollingLowestViewToBottom += self.visibleKeyboardHeight; - offsetForScrollingLowestViewToBottom += CGRectGetMaxY(lowestView.frame); - offsetForScrollingLowestViewToBottom -= CGRectGetHeight(_signUpView.bounds); - - if (offsetForScrollingLowestViewToBottom < 0) { - return; // No scrolling required - } - - contentOffset = CGPointMake(0.0f, MIN(offsetForScrollingTextFieldToTop, - offsetForScrollingLowestViewToBottom)); - } - - [_signUpView setContentOffset:contentOffset animated:animated]; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setLoading:(BOOL)loading { - if (self.loading != loading) { - _loading = loading; - - _signUpView.usernameField.enabled = !self.loading; - _signUpView.passwordField.enabled = !self.loading; - _signUpView.emailField.enabled = !self.loading; - _signUpView.additionalField.enabled = !self.loading; - _signUpView.dismissButton.enabled = !self.loading; - } -} - -@end diff --git a/ParseUI/ParseUI/Source/PFTableViewCell.h b/ParseUI/ParseUI/Source/PFTableViewCell.h deleted file mode 100644 index 72396889d..000000000 --- a/ParseUI/ParseUI/Source/PFTableViewCell.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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 - -#import "ParseUIConstants.h" -#import "PFImageView.h" - -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 `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` - */ -@property (nullable, nonatomic, strong, readonly) PFImageView *imageView; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFTableViewCell.m b/ParseUI/ParseUI/Source/PFTableViewCell.m deleted file mode 100644 index a51f1f823..000000000 --- a/ParseUI/ParseUI/Source/PFTableViewCell.m +++ /dev/null @@ -1,122 +0,0 @@ -/* - * 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 "PFTableViewCell.h" - -#import "PFRect.h" - -@interface PFTableViewCell () - -@property (nonatomic, assign) UITableViewCellStyle style; -@property (nonatomic, strong) PFImageView *customImageView; - -@end - -@implementation PFTableViewCell - -#pragma mark - -#pragma mark NSObject - -- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - _style = style; - - _customImageView = [[PFImageView alloc] initWithFrame:CGRectZero]; - [self.contentView addSubview:_customImageView]; - } - return self; -} - -#pragma mark - -#pragma mark UIView - -- (void)layoutSubviews { - [super layoutSubviews]; - - // We cannot depend on the parent class to lay out things perfectly because - // UITableViewCell layoutSubviews use its internal imageView member rather than via - // its self.imageView property, so we need to lay out things manually - - // Don't relayout anything if there is no file/image - if (!self.imageView.file && !self.imageView.image) { - return; - } - - // Value2 ignores imageView entirely - if (self.style == UITableViewCellStyleValue2) { - return; - } - - const CGRect bounds = self.contentView.bounds; - - CGFloat imageHeight = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)); - CGFloat imageWidth = floor(13.0f * imageHeight / 9.0f); // Default is 13/9 aspect ratio - _customImageView.frame = PFRectMakeWithSize(CGSizeMake(imageWidth, imageHeight)); - - CGFloat imageViewRightInset = 10.0f; - CGFloat textOrigin = CGRectGetMaxX(_customImageView.frame) + imageViewRightInset; - - CGRect textLabelFrame = self.textLabel.frame; - CGRect detailTextLabelFrame = self.detailTextLabel.frame; - - switch (self.style) { - case UITableViewCellStyleDefault: - case UITableViewCellStyleSubtitle: - { - CGFloat originalTextLabelInset = CGRectGetMinX(textLabelFrame); - CGFloat originalDetailTextLabelInset = CGRectGetMinX(detailTextLabelFrame); - - CGFloat maxTextLabelWidth = CGRectGetMaxX(bounds) - textOrigin - originalTextLabelInset; - CGFloat maxDetailTextLabelWidth = CGRectGetMaxX(bounds) - textOrigin - originalDetailTextLabelInset; - - textLabelFrame.origin.x = textOrigin; - textLabelFrame.size.width = MIN(maxTextLabelWidth, CGRectGetWidth(textLabelFrame)); - - detailTextLabelFrame.origin.x = textOrigin; - detailTextLabelFrame.size.width = MIN(maxDetailTextLabelWidth, CGRectGetWidth(detailTextLabelFrame)); - } - break; - case UITableViewCellStyleValue1: - { - CGFloat maxTextLabelWidth = CGRectGetMinX(detailTextLabelFrame) - textOrigin; - - textLabelFrame.origin.x = textOrigin; - textLabelFrame.size.width = MIN(maxTextLabelWidth, CGRectGetWidth(textLabelFrame)); - } - break; - case UITableViewCellStyleValue2: - break; - default: - break; - } - self.textLabel.frame = textLabelFrame; - self.detailTextLabel.frame = detailTextLabelFrame; -} - -#pragma mark - -#pragma mark PFImageTableViewCell - -- (PFImageView *)imageView { - return _customImageView; -} - -@end diff --git a/ParseUI/ParseUI/Source/PFTextField.h b/ParseUI/ParseUI/Source/PFTextField.h deleted file mode 100644 index ed7b450a1..000000000 --- a/ParseUI/ParseUI/Source/PFTextField.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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 - -#import "ParseUIConstants.h" - -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. */ - PFTextFieldSeparatorStyleNone = 0, - /** Separator on top of the text field. */ - PFTextFieldSeparatorStyleTop = 1 << 0, - /** 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 - -/** - Separator style bitmask that should be applied to this textfield. - - Default: `PFTextFieldSeparatorStyleNone` - - @see PFTextFieldSeparatorStyle - */ -@property (nonatomic, assign) PFTextFieldSeparatorStyle separatorStyle; - -/** - Color that should be used for the separators, if they are visible. - - 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. - @param separatorStyle Initial separator style to use. - - @return An initialized instance of `PFTextField` or `nil` if it couldn't be created. - */ -- (instancetype)initWithFrame:(CGRect)frame separatorStyle:(PFTextFieldSeparatorStyle)separatorStyle; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ParseUI/ParseUI/Source/PFTextField.m b/ParseUI/ParseUI/Source/PFTextField.m deleted file mode 100644 index 7372cd5ba..000000000 --- a/ParseUI/ParseUI/Source/PFTextField.m +++ /dev/null @@ -1,120 +0,0 @@ -/* - * 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 "PFTextField.h" - -#import "PFColor.h" - -@implementation PFTextField - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) return nil; - - self.backgroundColor = [PFColor textFieldBackgroundColor]; - self.textColor = [PFColor textFieldTextColor]; - - self.font = [UIFont systemFontOfSize:17.0f]; - - self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; - - _separatorColor = [PFColor textFieldSeparatorColor]; - - return self; -} - -- (instancetype)initWithFrame:(CGRect)frame separatorStyle:(PFTextFieldSeparatorStyle)separatorStyle { - self = [self initWithFrame:frame]; - if (!self) return nil; - - _separatorStyle = separatorStyle; - - return self; -} - -#pragma mark - -#pragma mark Accessors - -- (void)setPlaceholder:(NSString *)placeholder { - NSDictionary *attributes = @{ NSForegroundColorAttributeName : [PFColor textFieldPlaceholderColor] }; - self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholder attributes:attributes]; -} - -- (void)setSeparatorStyle:(PFTextFieldSeparatorStyle)separatorStyle { - if (self.separatorStyle != separatorStyle) { - _separatorStyle = separatorStyle; - [self setNeedsDisplay]; - } -} - -#pragma mark - -#pragma mark Drawing - -- (void)drawRect:(CGRect)rect { - [super drawRect:rect]; - - const CGRect bounds = self.bounds; - CGContextRef context = UIGraphicsGetCurrentContext(); - - if (self.separatorStyle != PFTextFieldSeparatorStyleNone) { - [self.separatorColor setFill]; - } - - if (self.separatorStyle & PFTextFieldSeparatorStyleTop) { - CGRect borderRect = CGRectMake(0.0f, 0.0f, CGRectGetWidth(bounds), 1.0f); - CGContextFillRect(context, borderRect); - } - - if (self.separatorStyle & PFTextFieldSeparatorStyleBottom) { - CGRect borderRect = CGRectMake(0.0f, CGRectGetMaxY(bounds) - 1.0f, CGRectGetWidth(bounds), 1.0f); - CGContextFillRect(context, borderRect); - } -} - -#pragma mark - -#pragma mark Frame - -- (CGRect)textRectForBounds:(CGRect)bounds { - return CGRectMake(20.0f, 0.0f, CGRectGetWidth(bounds) - 30.0f, CGRectGetHeight(bounds)); -} - -- (CGRect)placeholderRectForBounds:(CGRect)bounds { - return [self textRectForBounds:bounds]; -} - -- (CGRect)editingRectForBounds:(CGRect)bounds { - return [self textRectForBounds:bounds]; -} - -#pragma mark - -#pragma mark Sizing - -- (CGSize)sizeThatFits:(CGSize)boundingSize { - CGSize size = CGSizeZero; - size.width = boundingSize.width; - size.height = MIN(44.0f, boundingSize.height); - return size; -} - -@end diff --git a/ParseUI/ParseUI/Source/ParseUI.h b/ParseUI/ParseUI/Source/ParseUI.h deleted file mode 100644 index c308bea32..000000000 --- a/ParseUI/ParseUI/Source/ParseUI.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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 "PFCollectionViewCell.h" -#import "PFImageView.h" -#import "PFLogInView.h" -#import "PFLogInViewController.h" -#import "PFProductTableViewController.h" -#import "PFPurchaseTableViewCell.h" -#import "PFQueryCollectionViewController.h" -#import "PFQueryTableViewController.h" -#import "PFSignUpView.h" -#import "PFSignUpViewController.h" -#import "PFTableViewCell.h" -#import "PFTextField.h" -#import "ParseUIConstants.h" diff --git a/ParseUI/ParseUI/Source/ParseUIConstants.h b/ParseUI/ParseUI/Source/ParseUIConstants.h deleted file mode 100644 index edd970a4f..000000000 --- a/ParseUI/ParseUI/Source/ParseUIConstants.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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 -#import - -#ifndef ParseUI_ParseUIConstants_h -#define ParseUI_ParseUIConstants_h - -///-------------------------------------- -/// @name Deprecated Macros -///-------------------------------------- - -#ifndef PARSE_UI_DEPRECATED -# ifdef __deprecated_msg -# define PARSE_UI_DEPRECATED(_MSG) (deprecated(_MSG)) -# else -# ifdef __deprecated -# define PARSE_UI_DEPRECATED(_MSG) (deprecated) -# else -# define PARSE_UI_DEPRECATED(_MSG) -# endif -# endif -#endif - -#endif diff --git a/ParseUI/ParseUIDemo/Classes/AppDelegate.h b/ParseUI/ParseUIDemo/Classes/AppDelegate.h deleted file mode 100644 index 935592be2..000000000 --- a/ParseUI/ParseUIDemo/Classes/AppDelegate.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 AppDelegate : UIResponder - -@property (nonatomic, strong) UIWindow *window; - -@end diff --git a/ParseUI/ParseUIDemo/Classes/AppDelegate.m b/ParseUI/ParseUIDemo/Classes/AppDelegate.m deleted file mode 100644 index 8ea22be75..000000000 --- a/ParseUI/ParseUIDemo/Classes/AppDelegate.m +++ /dev/null @@ -1,108 +0,0 @@ -/* - * 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 "AppDelegate.h" -#import "PFUIDemoViewController.h" - -@import ParseCore; - -@implementation AppDelegate - -#pragma mark - -#pragma mark UIApplicationDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [Parse setApplicationId:@"UdNpOP2XFoEiXLZEBDl6xONmCMH8VjETmnEsl0xJ" - clientKey:@"wNJFho0fQaQFQ2Fe1x9b67lVBakJiAtFj1Uz30A9"]; - - self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[PFUIDemoViewController alloc] init]]; - [self.window makeKeyAndVisible]; - - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [self _setupTestData]; - }); - - return YES; -} - -#pragma mark - -#pragma mark Test Data - -- (void)_setupTestData { - NSArray *todoTitles = @[ @"Build Parse", - @"Make everything awesome", - @"Go out for the longest run", - @"Do more stuff", - @"Conquer the world", - @"Build a house", - @"Grow a tree", - @"Be awesome", - @"Setup an app", - @"Do stuff", - @"Buy groceries", - @"Wash clothes" ]; - - NSMutableArray *objects = [NSMutableArray array]; - - PFQuery *query = [PFQuery queryWithClassName:@"Todo"]; - NSArray *todos = [query findObjects]; - if ([todos count] == 0) { - int count = 0; - for (NSString *title in todoTitles) { - int priority = count % 3; - - PFObject *todo = [[PFObject alloc] initWithClassName:@"Todo"]; - todo[@"title"] = title; - todo[@"priority"] = @(priority); - [objects addObject:todo]; - - count++; - } - } - - NSArray *appNames = @[ @"Anypic", - @"Anywall", - @"f8" ]; - - PFQuery *appsQuery = [PFQuery queryWithClassName:@"App"]; - NSArray *apps = [appsQuery findObjects]; - if ([apps count] == 0) { - for (NSUInteger i = 0; i < 3; i++) { - NSString *name = [NSString stringWithFormat:@"%d", (int)i]; - NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"]; - NSData *data = [NSData dataWithContentsOfFile:path]; - - PFFileObject *file = [PFFileObject fileObjectWithName:[path lastPathComponent] data:data]; - - PFObject *object = [[PFObject alloc] initWithClassName:@"App"]; - object[@"icon"] = file; - object[@"name"] = appNames[i]; - [objects addObject:object]; - } - } - - if ([objects count] != 0) { - [PFObject saveAll:objects]; - } -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.h deleted file mode 100644 index 23bacec6d..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "PFLogInViewController.h" - -@interface CustomLogInViewController : PFLogInViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.m deleted file mode 100644 index 8e3f4feb3..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/LogInViewController/CustomLogInViewController.m +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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 "CustomLogInViewController.h" - -@implementation CustomLogInViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.view.backgroundColor = [UIColor blueColor]; - - UILabel *label = [[UILabel alloc] init]; - label.textColor = [UIColor whiteColor]; - label.text = @"All Custom!"; - [label sizeToFit]; - self.logInView.logo = label; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.h deleted file mode 100644 index 4e003123e..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "ParseUI.h" - -@interface DeletionCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m deleted file mode 100644 index 3f71ce92f..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.m +++ /dev/null @@ -1,170 +0,0 @@ -/* - * 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 "DeletionCollectionViewController.h" - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -@import ParseCore; - -@interface DeletionCollectionViewController() - -@end - -@implementation DeletionCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (self) { - self.title = @"Deletion Collection"; - self.pullToRefreshEnabled = YES; - self.objectsPerPage = 10; - self.paginationEnabled = YES; - } - return self; -} - -#pragma mark - -#pragma mark View Lifecycle - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; - - self.collectionView.allowsMultipleSelection = YES; - self.navigationItem.rightBarButtonItems = @[ - self.editButtonItem, - [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd - target:self - action:@selector(addTodo:)] - ]; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 2.0f - layout.minimumInteritemSpacing; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - [super setEditing:editing animated:animated]; - - if (editing) { - self.navigationItem.leftBarButtonItem = - [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash - target:self - action:@selector(deleteSelectedItems:)]; - } else { - self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem; - } -} - -- (void)addTodo:(id)sender { - if ([UIAlertController class]) { - UIAlertController *alertDialog = [UIAlertController alertControllerWithTitle:@"Add Todo" - message:nil - preferredStyle:UIAlertControllerStyleAlert]; - - __block UITextField *titleTextField = nil; - [alertDialog addTextFieldWithConfigurationHandler:^(UITextField *textField) { - titleTextField = textField; - - titleTextField.placeholder = @"Name"; - }]; - - [alertDialog addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; - [alertDialog addAction: - [UIAlertAction actionWithTitle:@"Save" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - PFObject *object = [PFObject objectWithClassName:self.parseClassName - dictionary:@{ @"title":titleTextField.text }]; - - [[object saveInBackground] continueWithSuccessBlock:^id(BFTask *task) { - return [self loadObjects]; - }]; - }]]; - - [self presentViewController:alertDialog animated:YES completion:nil]; - } else { - UIAlertView *view = [[UIAlertView alloc] initWithTitle:@"Add Todo" - message:nil - delegate:self - cancelButtonTitle:@"Cancel" - otherButtonTitles:@"Save", nil]; - - [view setAlertViewStyle:UIAlertViewStylePlainTextInput]; - [view textFieldAtIndex:0].placeholder = @"Name"; - - [view show]; - } -} - -- (void)deleteSelectedItems:(id)sender { - [self removeObjectsAtIndexPaths:self.collectionView.indexPathsForSelectedItems]; -} - -#pragma mark - UICollectionViewDataSource - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - cell.textLabel.textAlignment = NSTextAlignmentCenter; - cell.textLabel.text = object[@"title"]; - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -#pragma mark - -#pragma mark UIAlertViewDelegate - -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { - if (buttonIndex == alertView.cancelButtonIndex) return; - - PFObject *object = [PFObject objectWithClassName:self.parseClassName - dictionary:@{ @"title": [alertView textFieldAtIndex:0].text }]; - - [[object saveEventually] continueWithSuccessBlock:^id(BFTask *task) { - return [self loadObjects]; - }]; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.h deleted file mode 100644 index 39f53eac7..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "PFQueryCollectionViewController.h" - -@interface PaginatedCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m deleted file mode 100644 index efd0d6879..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.m +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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 "PaginatedCollectionViewController.h" -#import "PFCollectionViewCell.h" - -@import ParseCore; - -@implementation PaginatedCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (!self) return nil; - - self.title = @"Paginated Collection"; - self.pullToRefreshEnabled = YES; - self.objectsPerPage = 10; - self.paginationEnabled = YES; - - return self; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 3.0f - layout.minimumInteritemSpacing * 2.0f; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - -#pragma mark - -#pragma mark Data - -- (PFQuery *)queryForCollection { - PFQuery *query = [super queryForCollection]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark CollectionView - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - cell.textLabel.textAlignment = NSTextAlignmentCenter; - - NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:object[@"title"] attributes:nil]; - NSAttributedString *priorityString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"\nPriority: %@", object[@"priority"]] - attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:13.0f], - NSForegroundColorAttributeName : [UIColor grayColor] }]; - [title appendAttributedString:priorityString]; - cell.textLabel.attributedText = title; - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.h deleted file mode 100644 index 0f25f387b..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "PFQueryCollectionViewController.h" - -@interface SectionedCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m deleted file mode 100644 index d3391f6d5..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.m +++ /dev/null @@ -1,179 +0,0 @@ -/* - * 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 "SectionedCollectionViewController.h" -#import "PFCollectionViewCell.h" - -@import ParseCore; - -#pragma mark - -#pragma mark SimpleCollectionReusableView - -@interface SimpleCollectionReusableView : UICollectionReusableView - -@property (nonatomic, strong, readonly) UILabel *label; - -@end - -@implementation SimpleCollectionReusableView - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (!self) return nil; - - _label = [[UILabel alloc] initWithFrame:CGRectZero]; - _label.textAlignment = NSTextAlignmentCenter; - [self addSubview:_label]; - - return self; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - _label.frame = self.bounds; -} - -@end - -@interface SectionedCollectionViewController () -{ - NSArray *_sectionSortedKeys; - NSMutableDictionary *_sections; -} - -@end - -#pragma mark - -#pragma mark SectionedCollectionViewController - -@implementation SectionedCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (!self) return nil; - - self.title = @"Sectioned Collection"; - self.pullToRefreshEnabled = YES; - - _sections = [NSMutableDictionary dictionary]; - - return self; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; - - [self.collectionView registerClass:[SimpleCollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"]; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 3.0f - layout.minimumInteritemSpacing * 2.0f; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - -#pragma mark - -#pragma mark Data - -- (void)objectsDidLoad:(NSError *)error { - [super objectsDidLoad:error]; - - [_sections removeAllObjects]; - for (PFObject *object in self.objects) { - NSNumber *priority = object[@"priority"]; - - NSMutableArray *array = _sections[priority]; - if (array) { - [array addObject:object]; - } else { - _sections[priority] = [NSMutableArray arrayWithObject:object]; - } - } - - _sectionSortedKeys = [[_sections allKeys] sortedArrayUsingSelector:@selector(compare:)]; - [self.collectionView reloadData]; -} - -- (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath { - NSArray *sectionAray = _sections[_sectionSortedKeys[indexPath.section]]; - return sectionAray[indexPath.row]; -} - -#pragma mark - -#pragma mark CollectionView - -- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { - return [_sections count]; -} - -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - NSArray *sectionAray = _sections[_sectionSortedKeys[section]]; - return [sectionAray count]; -} - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - - cell.textLabel.textAlignment = NSTextAlignmentCenter; - cell.textLabel.text = object[@"title"]; - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { - if ([kind isEqualToString:UICollectionElementKindSectionHeader]) { - SimpleCollectionReusableView *view = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"header" forIndexPath:indexPath]; - NSNumber *priority = _sectionSortedKeys[indexPath.section]; - view.label.text = [NSString stringWithFormat:@"Priority %@", [priority stringValue]]; - return view; - } - return [super collectionView:collectionView viewForSupplementaryElementOfKind:kind atIndexPath:indexPath]; -} - -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { - if ([_sections count]) { - return CGSizeMake(CGRectGetWidth(self.collectionView.bounds), 40.0f); - } - return CGSizeZero; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.h deleted file mode 100644 index 47c9ca650..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "PFQueryCollectionViewController.h" - -@interface SimpleCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m deleted file mode 100644 index 3f683af9f..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.m +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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 "SimpleCollectionViewController.h" -#import "PFCollectionViewCell.h" - -@import ParseCore; - -@implementation SimpleCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (!self) return nil; - - self.title = @"Simple Collection"; - self.pullToRefreshEnabled = YES; - self.paginationEnabled = NO; - - return self; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 2.0f - layout.minimumInteritemSpacing; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - -#pragma mark - -#pragma mark Data - -- (PFQuery *)queryForCollection { - PFQuery *query = [super queryForCollection]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark CollectionView - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - cell.textLabel.textAlignment = NSTextAlignmentCenter; - - NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:object[@"title"] attributes:nil]; - NSAttributedString *priorityString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"\nPriority: %@", object[@"priority"]] - attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:13.0f], - NSForegroundColorAttributeName : [UIColor grayColor] }]; - [title appendAttributedString:priorityString]; - cell.textLabel.attributedText = title; - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.h deleted file mode 100644 index d589f48c6..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "ParseUI.h" - -@interface StoryboardCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m deleted file mode 100644 index 8fd4cae08..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.m +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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 "StoryboardCollectionViewController.h" -#import "PFCollectionViewCell.h" - -@import ParseCore; - -@implementation StoryboardCollectionViewController - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 2.0f - layout.minimumInteritemSpacing; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - - -#pragma mark - -#pragma mark Query - -- (PFQuery *)queryForCollection { - PFQuery *query = [super queryForCollection]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark CollectionView - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - cell.textLabel.textAlignment = NSTextAlignmentCenter; - - NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:object[@"title"] attributes:nil]; - NSAttributedString *priorityString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"\nPriority: %@", object[@"priority"]] - attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:13.0f], - NSForegroundColorAttributeName : [UIColor grayColor] }]; - [title appendAttributedString:priorityString]; - cell.textLabel.attributedText = title; - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.h deleted file mode 100644 index 761fa4a59..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "PFQueryCollectionViewController.h" - -@interface SubtitleImageCollectionViewController : PFQueryCollectionViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m deleted file mode 100644 index 095af1ff8..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.m +++ /dev/null @@ -1,90 +0,0 @@ -/* - * 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 "SubtitleImageCollectionViewController.h" -#import "PFCollectionViewCell.h" -#import "PFImageView.h" - -@import ParseCore; - -@implementation SubtitleImageCollectionViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (!self) return nil; - - self.title = @"Image Collection"; - self.pullToRefreshEnabled = YES; - self.paginationEnabled = NO; - - return self; -} - -#pragma mark - -#pragma mark UIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - layout.sectionInset = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f); - layout.minimumInteritemSpacing = 5.0f; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionViewLayout; - - const CGRect bounds = UIEdgeInsetsInsetRect(self.view.bounds, layout.sectionInset); - CGFloat sideSize = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 2.0f - layout.minimumInteritemSpacing; - layout.itemSize = CGSizeMake(sideSize, sideSize); -} - -#pragma mark - -#pragma mark CollectionView - -- (PFCollectionViewCell *)collectionView:(UICollectionView *)collectionView - cellForItemAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - PFCollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath object:object]; - - cell.textLabel.textAlignment = NSTextAlignmentCenter; - cell.textLabel.text = object[@"name"]; - - cell.imageView.file = object[@"icon"]; - // If the image is nil - set the placeholder - if (cell.imageView.image == nil) { - cell.imageView.image = [UIImage imageNamed:@"Icon.png"]; - [cell.imageView loadInBackground]; - } - - cell.contentView.layer.borderWidth = 1.0f; - cell.contentView.layer.borderColor = [UIColor lightGrayColor].CGColor; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.h deleted file mode 100644 index 95a50b979..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "PFProductTableViewController.h" - -@interface CustomProductTableViewController : PFProductTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m deleted file mode 100644 index 535fc00b4..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/CustomProductTableViewController.m +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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 "CustomProductTableViewController.h" - -@import ParseCore; - -@implementation CustomProductTableViewController - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ - PFObject *purchase = self.objects[indexPath.row]; - NSString *productIdentifier = purchase[@"productIdentifier"]; - - if ([productIdentifier isEqualToString:@"Cooper"]) { - [PFPurchase buyProduct:@"Cooper" block:^(NSError *error) { - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Success!" - message:@"YES!" - delegate:nil - cancelButtonTitle:@"OK!" - otherButtonTitles:nil]; - [alertView show]; - }]; - } else { - [super tableView:tableView didSelectRowAtIndexPath:indexPath]; - } -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.h deleted file mode 100644 index 0022d0ee8..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "ParseUI.h" - -@interface DeletionTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m deleted file mode 100644 index 5b3f0b93c..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/DeletionTableViewController.m +++ /dev/null @@ -1,142 +0,0 @@ -/* - * 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 "DeletionTableViewController.h" - -#if __has_include() -#import -#else -#import "BFTask.h" -#endif - -@import ParseCore; - -@interface DeletionTableViewController() - -@end - -@implementation DeletionTableViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (!self) return nil; - - self.title = @"Deletion Table"; - self.pullToRefreshEnabled = YES; - - return self; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.tableView.allowsMultipleSelectionDuringEditing = YES; - self.navigationItem.rightBarButtonItems = @[ - self.editButtonItem, - [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd - target:self - action:@selector(addTodo:)] - ]; -} - -- (void)setEditing:(BOOL)editing animated:(BOOL)animated { - [super setEditing:editing animated:animated]; - - if (editing) { - self.navigationItem.leftBarButtonItem = - [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash - target:self - action:@selector(deleteSelectedItems:)]; - } else { - self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem; - } -} - -- (void)addTodo:(id)sender { - if ([UIAlertController class]) { - UIAlertController *alertDialog = [UIAlertController alertControllerWithTitle:@"Add Todo" - message:nil - preferredStyle:UIAlertControllerStyleAlert]; - - __block UITextField *titleTextField = nil; - [alertDialog addTextFieldWithConfigurationHandler:^(UITextField *textField) { - titleTextField = textField; - - titleTextField.placeholder = @"Name"; - }]; - - [alertDialog addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; - [alertDialog addAction: - [UIAlertAction actionWithTitle:@"Save" - style:UIAlertActionStyleDefault - handler:^(UIAlertAction *action) { - PFObject *object = [PFObject objectWithClassName:self.parseClassName - dictionary:@{ @"title":titleTextField.text }]; - - [[object saveInBackground] continueWithSuccessBlock:^id(BFTask *task) { - return [self loadObjects]; - }]; - }]]; - - [self presentViewController:alertDialog animated:YES completion:nil]; - } else { - UIAlertView *view = [[UIAlertView alloc] initWithTitle:@"Add Todo" - message:nil - delegate:self - cancelButtonTitle:@"Cancel" - otherButtonTitles:@"Save", nil]; - - [view setAlertViewStyle:UIAlertViewStylePlainTextInput]; - [view textFieldAtIndex:0].placeholder = @"Name"; - - [view show]; - } -} - -- (void)deleteSelectedItems:(id)sender { - [self removeObjectsAtIndexPaths:self.tableView.indexPathsForSelectedRows]; -} - -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle - forRowAtIndexPath:(NSIndexPath *)indexPath { - if (editingStyle == UITableViewCellEditingStyleDelete) { - [self removeObjectAtIndexPath:indexPath]; - } -} - -#pragma mark - -#pragma mark UIAlertViewDelegate - -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { - if (buttonIndex == alertView.cancelButtonIndex) return; - - PFObject *object = [PFObject objectWithClassName:self.parseClassName - dictionary:@{ @"title": [alertView textFieldAtIndex:0].text }]; - - [[object saveEventually] continueWithSuccessBlock:^id(BFTask *task) { - return [self loadObjects]; - }]; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.h deleted file mode 100644 index 862899362..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 - -#import "PFQueryTableViewController.h" - -@interface PaginatedTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m deleted file mode 100644 index db202d4fa..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.m +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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 "PaginatedTableViewController.h" -#import "PFTableViewCell.h" - -@import ParseCore; - -@implementation PaginatedTableViewController - -#pragma mark - -#pragma mark init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (self) { - self.title = @"Paginated Table"; - self.pullToRefreshEnabled = YES; - self.objectsPerPage = 10; - self.paginationEnabled = YES; - } - return self; -} - -#pragma mark - -#pragma mark Data - -- (PFQuery *)queryForTable { - PFQuery *query = [super queryForTable]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark TableView - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; - } - - cell.textLabel.text = object[@"title"]; - cell.detailTextLabel.text = [NSString stringWithFormat:@"Priority: %@", object[@"priority"]]; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.h deleted file mode 100644 index d8e54fb65..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 - -#import "PFQueryTableViewController.h" - -@interface SectionedTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m deleted file mode 100644 index 9ccdfac00..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SectionedTableViewController.m +++ /dev/null @@ -1,109 +0,0 @@ -/* - * 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 "SectionedTableViewController.h" -#import "PFTableViewCell.h" - -@import ParseCore; - -@interface SectionedTableViewController () -{ - NSArray *_sectionSortedKeys; - NSMutableDictionary *_sections; -} - -@end - -@implementation SectionedTableViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (self) { - self.title = @"Sectioned Table"; - self.pullToRefreshEnabled = YES; - - _sections = [NSMutableDictionary dictionary]; - } - return self; -} - -#pragma mark - -#pragma mark Data - -- (void)objectsDidLoad:(NSError *)error { - [super objectsDidLoad:error]; - - [_sections removeAllObjects]; - for (PFObject *object in self.objects) { - NSNumber *priority = object[@"priority"]; - - NSMutableArray *array = _sections[priority]; - if (array) { - [array addObject:object]; - } else { - _sections[priority] = [NSMutableArray arrayWithObject:object]; - } - } - - _sectionSortedKeys = [[_sections allKeys] sortedArrayUsingSelector:@selector(compare:)]; - [self.tableView reloadData]; -} - -- (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath { - NSArray *sectionArray = _sections[_sectionSortedKeys[indexPath.section]]; - return sectionArray[indexPath.row]; -} - -#pragma mark - -#pragma mark UITableViewDataSource - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return [_sections count]; -} - -- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - return [NSString stringWithFormat:@"Priority %@", [_sectionSortedKeys[section] stringValue]]; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - NSArray *sectionAray = _sections[_sectionSortedKeys[section]]; - return [sectionAray count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; - } - - cell.textLabel.text = object[@"title"]; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.h deleted file mode 100644 index a7bad53ab..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 - -#import "PFQueryTableViewController.h" - -@interface SimpleTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m deleted file mode 100644 index 2c2b6d56b..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SimpleTableViewController.m +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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 "SimpleTableViewController.h" -#import "PFTableViewCell.h" - -@import ParseCore; - -@implementation SimpleTableViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)initWithClassName:(NSString *)className { - self = [super initWithClassName:className]; - if (self) { - self.title = @"Simple Table"; - self.pullToRefreshEnabled = YES; - self.paginationEnabled = NO; - } - return self; -} - -#pragma mark - -#pragma mark Data - -- (PFQuery *)queryForTable { - PFQuery *query = [super queryForTable]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark TableView - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; - } - - cell.textLabel.text = object[@"title"]; - cell.detailTextLabel.text = [NSString stringWithFormat:@"Priority: %@", object[@"priority"]]; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.h deleted file mode 100644 index 88bfb32bf..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "ParseUI.h" - -@interface StoryboardTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m deleted file mode 100644 index 504c7be09..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.m +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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 "StoryboardTableViewController.h" -#import "PFTableViewCell.h" - -@import ParseCore; - -@implementation StoryboardTableViewController - -#pragma mark - -#pragma mark Data - -- (PFQuery *)queryForTable { - PFQuery *query = [super queryForTable]; - [query orderByAscending:@"priority"]; - return query; -} - -#pragma mark - -#pragma mark TableView - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; - } - - cell.textLabel.text = object[@"title"]; - cell.detailTextLabel.text = [NSString stringWithFormat:@"Priority: %@", object[@"priority"]]; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.h deleted file mode 100644 index 4cb92a2cf..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "PFQueryTableViewController.h" - -@interface SubtitleImageTableViewController : PFQueryTableViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m deleted file mode 100644 index 3998c5dc9..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.m +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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 "SubtitleImageTableViewController.h" -#import "PFTableViewCell.h" - -@import ParseCore; - -@implementation SubtitleImageTableViewController - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath - object:(PFObject *)object { - static NSString *cellIdentifier = @"cell"; - - PFTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (cell == nil) { - cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier]; - } - - cell.textLabel.text = object[@"name"]; - cell.detailTextLabel.text = @"@parseit"; - - cell.imageView.image = [UIImage imageNamed:@"Icon.png"]; - cell.imageView.file = object[@"icon"]; - - return cell; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.h b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.h deleted file mode 100644 index fab959333..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 "PFSignUpViewController.h" - -@interface CustomSignUpViewController : PFSignUpViewController - -@end diff --git a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.m b/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.m deleted file mode 100644 index b2e3530ef..000000000 --- a/ParseUI/ParseUIDemo/Classes/CustomViewControllers/SignUpViewController/CustomSignUpViewController.m +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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 "CustomSignUpViewController.h" - -@implementation CustomSignUpViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.view.backgroundColor = [UIColor blueColor]; - - UILabel *label = [[UILabel alloc] init]; - label.text = @"All Custom!"; - [label sizeToFit]; - self.signUpView.logo = label; -} - -@end diff --git a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.h b/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.h deleted file mode 100644 index 7b94f6366..000000000 --- a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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 PFUIDemoViewController : UITableViewController - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -@end diff --git a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m b/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m deleted file mode 100644 index c053dbe54..000000000 --- a/ParseUI/ParseUIDemo/Classes/PFUIDemoViewController.m +++ /dev/null @@ -1,442 +0,0 @@ -/* - * 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 "PFUIDemoViewController.h" - -#import "ParseUI.h" - -#import "CustomLogInViewController.h" -#import "CustomProductTableViewController.h" -#import "CustomSignUpViewController.h" -#import "DeletionCollectionViewController.h" -#import "DeletionTableViewController.h" -#import "PaginatedCollectionViewController.h" -#import "PaginatedTableViewController.h" -#import "SectionedCollectionViewController.h" -#import "SectionedTableViewController.h" -#import "SimpleCollectionViewController.h" -#import "SimpleTableViewController.h" -#import "StoryboardCollectionViewController.h" -#import "StoryboardTableViewController.h" -#import "SubtitleImageCollectionViewController.h" -#import "SubtitleImageTableViewController.h" - -typedef NS_ENUM(uint8_t, PFUIDemoType) { - PFUIDemoTypeSimpleTable, - PFUIDemoTypePaginatedTable, - PFUIDemoTypeSectionedTable, - PFUIDemoTypeStoryboardTable, - PFUIDemoTypeDeletionTable, - PFUIDemoTypeSimpleCollection, - PFUIDemoTypePaginatedCollection, - PFUIDemoTypeSectionedCollection, - PFUIDemoTypeStoryboardCollection, - PFUIDemoTypeDeletionCollection, - PFUIDemoTypeLogInDefault, - PFUIDemoTypeLogInUsernamePassword, - PFUIDemoTypeLogInPasswordForgotten, - PFUIDemoTypeLogInDone, - PFUIDemoTypeLogInEmailAsUsername, - PFUIDemoTypeLogInAll, - PFUIDemoTypeLogInAllNavigation, - PFUIDemoTypeLogInCustomizedLogoAndBackground, - PFUIDemoTypeSignUpDefault, - PFUIDemoTypeSignUpUsernamePassword, - PFUIDemoTypeSignUpUsernamePasswordEmail, - PFUIDemoTypeSignUpUsernamePasswordEmailSignUp, - PFUIDemoTypeSignUpAll, - PFUIDemoTypeSignUpEmailAsUsername, - PFUIDemoTypeSignUpMinPasswordLength, - PFUIDemoTypeImageTableDefaultStyle, - PFUIDemoTypeImageTableSubtitleStyle, - PFUIDemoTypeImageCollection, - PFUIDemoTypePurchase, - PFUIDemoTypeCustomizedPurchase -}; - -@interface PFUIDemoViewController () -{ - NSArray *_descriptions; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - -@end - -@implementation PFUIDemoViewController - -#pragma mark - -#pragma mark Init - -- (instancetype)init { - return [super initWithStyle:UITableViewStylePlain]; -} - -- (instancetype)initWithStyle:(UITableViewStyle)style { - return [self init]; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - 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 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 - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [_descriptions count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *identifier = @"cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; - if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - } - - cell.textLabel.text = _descriptions[indexPath.row]; - - return cell; -} - -#pragma mark - -#pragma mark UITableViewDelegate - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - switch (indexPath.row) { - case PFUIDemoTypeSimpleTable: { - PFQueryTableViewController *controller = [[SimpleTableViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypePaginatedTable: { - PFQueryTableViewController *controller = [[PaginatedTableViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeSectionedTable: { - PFQueryTableViewController *controller = [[SectionedTableViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeStoryboardTable: { - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SimpleQueryTableStoryboard" bundle:NULL]; - StoryboardTableViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"StoryboardTableViewController"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeDeletionTable: { - PFQueryTableViewController *controller = [[DeletionTableViewController alloc] initWithClassName:@"PublicTodo"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeSimpleCollection: { - SimpleCollectionViewController *controller = [[SimpleCollectionViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - } - break; - case PFUIDemoTypePaginatedCollection: { - PaginatedCollectionViewController *controller = [[PaginatedCollectionViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - } - break; - case PFUIDemoTypeSectionedCollection: { - SectionedCollectionViewController *controller = [[SectionedCollectionViewController alloc] initWithClassName:@"Todo"]; - [self.navigationController pushViewController:controller animated:YES]; - } - break; - case PFUIDemoTypeStoryboardCollection: { - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SimpleQueryCollectionStoryboard" bundle:NULL]; - StoryboardCollectionViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"StoryboardCollectionViewController"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeDeletionCollection: { - PFQueryCollectionViewController *controller = [[DeletionCollectionViewController alloc] initWithClassName:@"PublicTodo"]; - [self.navigationController pushViewController:controller animated:YES]; - break; - } - case PFUIDemoTypeLogInDefault: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInUsernamePassword: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = PFLogInFieldsUsernameAndPassword | PFLogInFieldsDismissButton; - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInPasswordForgotten: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsPasswordForgotten - | PFLogInFieldsDismissButton); - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInDone: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsLogInButton - | PFLogInFieldsDismissButton); - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInEmailAsUsername: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsLogInButton - | PFLogInFieldsDismissButton - | PFLogInFieldsSignUpButton); - logInController.emailAsUsername = YES; - logInController.delegate = self; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInAll: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsLogInButton - | PFLogInFieldsPasswordForgotten - | PFLogInFieldsApple - | PFLogInFieldsSignUpButton - | PFLogInFieldsDismissButton); - logInController.delegate = self; - - logInController.signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsEmail - | PFSignUpFieldsAdditional - | PFSignUpFieldsDismissButton - | PFSignUpFieldsSignUpButton); - logInController.signUpController.delegate = self; - - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeLogInAllNavigation: { - PFLogInViewController *logInController = [[PFLogInViewController alloc] init]; - logInController.fields = (PFLogInFieldsUsernameAndPassword - | PFLogInFieldsLogInButton - | PFLogInFieldsPasswordForgotten - | PFLogInFieldsSignUpButton - | PFLogInFieldsDismissButton); - logInController.delegate = self; - - logInController.signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsEmail - | PFSignUpFieldsAdditional - | PFSignUpFieldsDismissButton - | PFSignUpFieldsSignUpButton); - logInController.signUpController.delegate = self; - [self.navigationController pushViewController:logInController animated:YES]; - break; - } - case PFUIDemoTypeLogInCustomizedLogoAndBackground: { - PFLogInViewController *logInController = [[CustomLogInViewController alloc] init]; - logInController.fields = PFLogInFieldsDefault; - logInController.delegate= self; - - PFSignUpViewController *signUpController = [[CustomSignUpViewController alloc] init]; - signUpController.fields = PFSignUpFieldsDefault; - signUpController.delegate = self; - - logInController.signUpController = signUpController; - [self presentViewController:logInController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpDefault: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - } - break; - case PFUIDemoTypeSignUpUsernamePassword: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = PFSignUpFieldsUsernameAndPassword | PFSignUpFieldsDismissButton; - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpUsernamePasswordEmail: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsEmail - | PFSignUpFieldsDismissButton); - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpUsernamePasswordEmailSignUp: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsEmail - | PFSignUpFieldsSignUpButton - | PFSignUpFieldsDismissButton); - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpAll: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = (PFSignUpFieldsEmail - | PFSignUpFieldsAdditional - | PFSignUpFieldsSignUpButton - | PFSignUpFieldsDismissButton); - signUpController.delegate = self; - signUpController.modalPresentationStyle = UIModalPresentationFormSheet; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpEmailAsUsername: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsSignUpButton - | PFSignUpFieldsDismissButton); - signUpController.emailAsUsername = YES; - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeSignUpMinPasswordLength: { - PFSignUpViewController *signUpController = [[PFSignUpViewController alloc] init]; - signUpController.fields = (PFSignUpFieldsUsernameAndPassword - | PFSignUpFieldsSignUpButton - | PFSignUpFieldsDismissButton); - signUpController.minPasswordLength = 6; - signUpController.delegate = self; - [self presentViewController:signUpController animated:YES completion:nil]; - break; - } - case PFUIDemoTypeImageTableDefaultStyle: { - PFQueryTableViewController *tableViewController = [[PFQueryTableViewController alloc] initWithClassName:@"App"]; - tableViewController.imageKey = @"icon"; - tableViewController.textKey = @"name"; - tableViewController.paginationEnabled = NO; - tableViewController.placeholderImage = [UIImage imageNamed:@"Icon.png"]; - [self.navigationController pushViewController:tableViewController animated:YES]; - break; - } - case PFUIDemoTypeImageTableSubtitleStyle: { - SubtitleImageTableViewController *tableViewController = [[SubtitleImageTableViewController alloc] initWithClassName:@"App"]; - tableViewController.imageKey = @"icon"; - tableViewController.textKey = @"name"; - tableViewController.paginationEnabled = NO; - tableViewController.placeholderImage = [UIImage imageNamed:@"Icon.png"]; - [self.navigationController pushViewController:tableViewController animated:YES]; - break; - } - case PFUIDemoTypeImageCollection: { - SubtitleImageCollectionViewController *controller = [[SubtitleImageCollectionViewController alloc] initWithClassName:@"App"]; - [self.navigationController pushViewController:controller animated:YES]; - } - break; - case PFUIDemoTypePurchase: { - PFProductTableViewController *purchaseController = [[PFProductTableViewController alloc] init]; - [self.navigationController pushViewController:purchaseController animated:YES]; - break; - } - case PFUIDemoTypeCustomizedPurchase: { - CustomProductTableViewController *purchaseController = [[CustomProductTableViewController alloc] init]; - [self.navigationController pushViewController:purchaseController animated:YES]; - } - } -} - -#pragma mark - -#pragma mark PFLogInViewControllerDelegate - -- (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user { - [self dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)logInViewControllerDidCancelLogIn:(PFLogInViewController *)logInController { - // Do nothing, as the view controller dismisses itself -} - -#pragma mark - -#pragma mark PFSignUpViewControllerDelegate - -- (void)signUpViewController:(PFSignUpViewController *)signUpController didSignUpUser:(PFUser *)user { - [self dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)signUpViewControllerDidCancelSignUp:(PFSignUpViewController *)signUpController { - // Do nothing, as the view controller dismisses itself -} - -@end diff --git a/ParseUI/ParseUIDemo/Images.xcassets/LaunchImage.launchimage/Contents.json b/ParseUI/ParseUIDemo/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index f62085cfc..000000000 --- a/ParseUI/ParseUIDemo/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "1x", - "orientation" : "portrait" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "orientation" : "portrait" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "subtype" : "retina4", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "minimum-system-version" : "7.0", - "subtype" : "retina4", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "to-status-bar", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ParseUI/ParseUIDemo/Other/Info.plist b/ParseUI/ParseUIDemo/Other/Info.plist deleted file mode 100644 index 6bad7e063..000000000 --- a/ParseUI/ParseUIDemo/Other/Info.plist +++ /dev/null @@ -1,73 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - Icon.png - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.1.1 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - fb838719136190681 - - - - CFBundleVersion - 1.1.1 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSExceptionDomains - - local - - NSIncludesSubdomains - - NSTemporaryExceptionAllowsInsecureHTTPLoads - - - - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UIStatusBarStyle - UIStatusBarStyleLightContent - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/ParseUI/ParseUIDemo/Other/main.m b/ParseUI/ParseUIDemo/Other/main.m deleted file mode 100644 index 91134264b..000000000 --- a/ParseUI/ParseUIDemo/Other/main.m +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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 - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/ParseUI/ParseUIDemo/ParseUIDemo.entitlements b/ParseUI/ParseUIDemo/ParseUIDemo.entitlements deleted file mode 100644 index a812db506..000000000 --- a/ParseUI/ParseUIDemo/ParseUIDemo.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.developer.applesignin - - Default - - - diff --git a/ParseUI/ParseUIDemo/Resources/0.png b/ParseUI/ParseUIDemo/Resources/0.png deleted file mode 100644 index c2c9bc03b9a00c3bfdd6efe6b2350ae96c2f2a3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21533 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 diff --git a/ParseUI/ParseUIDemo/Resources/1.png b/ParseUI/ParseUIDemo/Resources/1.png deleted file mode 100644 index 57115b9a4e27ab016016e7599bc2e7805bcfb4a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23750 zcmd_S1z42Z9zIHUgMj3a0wT-|-O}ACAT10q)F9oBfOHAcB`J+`OQW=;q##|2gw#d% zc5lx-YZRUF#dxLx_r!G&Tkq1{@q5wycbV+SPB9&);Y$ zS3hl+;x(>*!P~1zi@}u)P^@3QLARCBwughmB>emh50{ie3J1p)0@cuR&{9<3H-=fW z8JWQDL)cubZLdbd!3nzXU%j-3I2Zw3tgUS9`CWu)zl`9&dj0t_J1yYL5C=;kS}jEt zfH=$!0^nlfWCPL)V*mgEK|2#uel-cH-_5Vy3DKH6IN0*DvpYLGvpI9H!R*Y~L416C z>_9L(7<}t$#4USQ8wVqoTQ>G|zkz(kk$~76+d*v|pfDT2XI!KEFh>U=TH4PO{qgmi zpAJydKWDPB|DDzqLH5sg*g-u9Rg(A>uWHZ4$iYa$$N?e@27)+lfk3yw+!`Q0eohX44&GZpUVb1@ zko}*={sl+e4swO?6$N+;1iZ4;0CDkyx%oM`Zvw%8pnNm(FBpn26R4@{SB!t@$)6+t zg7F0%W~TvzSqY1NZb5*`*LVWN)wuyoiblpzo6iAe{*BbP2H#+r81tLL?5vF(grU|( zW)OB;8#6)nKQDeW@+vZlil0Ml2DLG=l7JaIey&zo3E`_7Y$i|>eo1a|9!@bSPM{bV z$ju7^iAhR`ONxWQVjvz#AQxEbiyz;I_@`-Pp!N2X^lJA26IS{9=HTFifl!XG{V+2%`6@Y};o9h{BqAfjehWWEzgF2Emw6lDLN$)B$O zf&M$RvpK}(bE*AZk^F}CWz^q;KyBw%G%^B z#ow>~)l886vx-_l{|`xkvAL0r8N@`G{VT1n7yioY&vN*uoN@DmuUeY#Yh(YnITHo* zfjB{uq9EYk^~QgmGkYT^$p0HN_80N_jo3f-+21GNYl{AhoP7~e(3PZf^Iz#P5PTB| z`Xa{vZO*`)U@-|UpeP3r%<);zc)?&%Ngi%-ULH;kFj)L*vG{*7XTSB{KdRqXMg3>B z{JiE}Nv-TZtA_+9SW1!;#K|cs1q6X4Ie39QqGBK^DM>y~F$r#Q?ys2NnEsiq-(kNa z{=dU={X5uiO#c}cVh6n{X(>CH^$$wbWa{S*0XbS3_z`i+nU>>sawy>X?` zj*eGB;E>=0ig5!uIivLv9<)+ zf2=aUDPRqVi-UrZE95_|+#l@xt5W}5?SH!UWiBNnYlyIhIn*BD0I{~Uy4tA&oQ>=O zzwd4U_gw*s(5n>&Vg-=0GO}~D1u)$<{qlktpaOM)SlL}Y{(Q^zPtZSG__vwAGx=x6 zKRdad1KZUzCxFq&+ExG{YHJHMhS_|j^7+m`IrnAKzdHBtD&*&53{_VD>>fb&%0Ga{ z*I09~ar~2mUsCc{2mda5KMwngcyockfAYS1aQgB_{Ysx9KS%sO!2LzcuXe7S05yoi z)x+QaEfM%H@PAPxpejaJ+wSiv&kvXR_Yi&&8xR-xYg%Ps))0XDl~_V-evaP{V*V<| zoPQMZH;e&S+Hz_+mHrQy{(HDz#FO`*W%lRl_D2AJ5mzqWKbDmLNsImf-Y;VM`SFAspbm9| z{GW?~tK`p#>A%7H zMGXJd*5p6hjsGj4U&M`z=iBW4FIN5^0Q^;4|9`U{{wEK-|4{}1C&0fb%b!2}{PMvc zKoe?j4p6u{u<&!D^do@3oa>d7|0|Z?gZf4M{%1?*zXJM2+_bOGa{-KgHf?{4@{3r} zgW34_ey$R~5AlomD4UvI{iO^bYjf+f45(Zk!813qhu8ytj^Yoa{vy_2s!AMYZEIxX z`g2VGCDN~C_dS*SkCwtO%)W>6i&)7(jI12Ye=b{pgYk@^3Y=5$| zep)8~-Fbq~S^vj_0>4>&b9np9DVN`_UL6e=#<)5~^YxgyFh+_B_0_@iTjR14q8cvn zuRPJqAkwaL-t$c`15*Poe@?o9r~v#08J}B~lXwcPN(%5wRwVRz0NKTg*uoBUZuAFB zwK0B$DzZ=2Wbd>u;dPcAwYnHjSe@PUA{T|x>a`$KvC2ry zJ+p1vn}ym`(9<@5Lv>-`VLWcFOEm#m`{{D>`c2u>Db~SGJe_ zRRu3F{lylT!-z`g$e0tG>zg>$DiRk^ZmX&3Ga<+uu?7bdCVzOO2rNb1tRT>POwM^d z9RZs=YfZxuPoIJ4{xav?NsPQ3x72C(!E~|kb!GUBL<|h*tenWiTaRkDh!NRtkMALS zx1*<;lhPsQOl(iXk%=Fr-{Ujpo~%SyFqmT!LydU|jBpBsluV#g?Bdu7&I~l)nUX}U zxLYYWrQg=x+iSCKS+vRf%FTK9?htewwAZH*8v(j2KY$x-$0%;j%2-kupJ)xiM zypEV$%u^aeD@>vgd!M@VCDR)EhVo<6GW+X?sKTTHkLzz99)Ai;t%NkxS59~po_jR7 z?PchN3=&ywR-x=e#pRXB2}-=pCI)6A?NpW>8Y3)}gZ^Mej8NeZ?J=7U)G4Ji=xSl^p=A(h)alg&gey%38O{V}r46 z3{`kNjgA7>Ei3$Qfp*mE!PP3asyi^9G_TjaKx905!0a#0c0-bI5~j1m>EIWnsjN-1 zVMEr~H79rx>$Kg2e{lHV<1tOxqvDbKuqk5Ty#X5Dd2K;c@A_lM2D6W#nQ^k`{@bY| z&uupG+75>TYyo-HM(E)|;mngDsyQ>j)Xsea$E>)=yAfc<96!QokJG=D*y~O=M zdZce8VbdH{d6NX1OFVmml5qZQ#q)11SGP2r2QH>3UmfO#Xwu+GTiY2vV@ze+OG8PZ zZ*lEklnJxD2n~quVte*#x`ueSS|sV*&(m|os{tk38bN&ugMZqd;Yx&_eSApWRMQPL zs_aN5zTCe4#yZx&R(bu?PN+IL;foh)0R^mtgBo>Rn=7wR+!AG`vrgNljh#GCea^$J zVO5%nZ%m94>7Klij?$D5GV{w)Ih=}dA{(8zUKKG*Pdw*9zO;4c;YQVEZelR<9(`wS zmU+K_sdEi+FeT*E!@bgv4^ihvb#%>cr_hu8`2k3oDW>s>*bXf9*pgH9%g|*o30Bo* zv9a?H6}5ehr}_mFy~c;tTN*wEH+gPdJ8af#F%Nop2ss?lzV31zdH)4l1O?-?SNGY` zcD9-K;EtYqyFRZ=pp#XKEcv@@aQrz2Z+oH_RIz9nT;b`oUi)N9iG*Qc-8E989x_y#n^WastI0_tjGu=o$6n&Uac83Gc_w81)wNf89YZPApGS4I3j_E}1yW4E6 z?U#ldtJ^~Eb2jd%&T27)#1j>HBnzR$y(DcJx+T%5L5I_d+3XcT2@x~Snp9<;h%+m3 z&v*nMlXq|hUI4NlATvF4WFMl(*Q|yL(OwG?I(q#mPHCpgK`6sD5hr7%O<@3h0^o+ zZHT*xreFEX0XesLZRKr0I;0y)mx-~sE^{By)6OK*(Q(KC3&x))NN&*5J)uQqi(kJT zLG*BOY=k*k@5$>%WtwH9lE^r>Itz)w8`hi|*n7@+Vcw0~w+_c=VO6TE79IAcs(?q# zD8wvqTk9i7Iqi!IaY8=iGS$%e1-8?0&)w<-Y<-A`t}9Wci?r=VaCK42bhq7P>EXyq zICsBrYk;x`>n8OF1V$G>{JD@|U-EG~Uhv7DNvc=?!5AJAMWxUFGPpXY$MHk{RTI<2 zATngt*514ccOs4Qa0>_Nt#x*3SxfWjE3~dM@+3dejmo0c?ST{btq`u1%EkG3anvoz zx9nxs>qNd~c`>w1sAZvN#pk<~M(>D zF@k9W%=@0$#&Kq(vZ(1ef%_8gPpZ$X>6yHfDK~0S))t42ayqEqIHC2jbDT~SDVw=C zoU3^X?L(BiVVmrBdIFpA<~=<<6nb_mTWF`%%?Un{C%k#=V$s)mDs%C?!l+UyO2;)? zEUdOj3TJA5{-gY1{|%A*rCo|9p>$|Y%kKED!lviT#3h(J`NH?s`iljy%9|#!hnt2b zh2J~F&hSHDQmr=&|0aI7a(0{9^AOjnQshNbhd<`g%qv3nuC)|6 zp^w(HdqcDAB(Dn$ALOp6{=_&%))1dBxg$NA-{ z8~A$^N}=_GzEH|xkKpXUM3OqRbwsDO#yLHM3EIKHG`f}czAyxFcV0CQJvp$E%h*gt z3v4B)$?>>*`_7EPP8SJ&qva0OX>0GLNhvk2d64ag@lG1rUC+DwMyoC#_nsd<;N7Y; zyAVXpwy-_ygj^%Vnillq+6osiFqXC=;EA#4&iEK#-Q7KdeA@>1L3u9cIvVT~?FL(R z+$Mx|gQ+9vQ5ELx6ni`^9G9#>R9;e-wH`=w;QIne)`NbMvaSUgf0rILGgUU9>hPPJ zMb#05gF7zRI~T4;+YS^oA2vgsHrFp9maV%Muo_7U&svJ1R+PD-y@5}8GeO&ymClp< zE8VmEWBWwv3Z4^@Zxc=5-vIhiO9%N6nY3*AVDHH6npZLJeSCAWRBPjOx%38CmFZc|?|)84WW}YDt$3qORSqv>-ZJBxO^k zY2#j?i&l}6TORCfy-3x7;XK$cCy%5H~v;U)Zc4 zkF5N#^~IBtAm)Bongl=F^pSSig@QnJ?n=SzTOg8-oqF=sw(Y6wDa=hKTm0nKn$onx z0@S*KMjtFOC*5!?4px*9PIi#;b5do*QX$|>Qs#1l~C_IuqV^;R4A~;XruPN>$-{8RML^)=Tq?T zx^Cbs2{B@v@~wq9(vxL8oA>!>yb)QQI~CjJ;WPa=U=qbzy!3-sZjN1#ZNoTPwUs^M z$YteP16BP7$}0PfkBXH&{6E;)+X(6d?c!ghUsinN-(lkFQS?Esi;~=A(^sU8K+cuu zrnq<(b2_u`_i(u$7v3itV`DG2+L+!>qKh!f1hdP$435+t+1UWAwKp&}YQEEVIc}i2 z$IfO2LCL1HOgtNve(ddfyUXnG)Wc!l)oW-di0|&=zs1m6MQ?lgsc|-pyl(bI1O1I$ z@;hnm49jI78eNtGU5>d5aoQ*BT^`qf0#&?-rF(DQsKo5%c!D{?j=m%WyxI^~6f|Bp%r_? zsWAynl5Hpg|pyvUqYnO34r2~tO<6aWLQyf=qtwo2-#CyPm% zp)jhtxqFB?+fx|Tt(Rsi!ZVS{9rN`YyHnBSFP2>SrKP9X(i(SO#CE!F9j?Ln>*m^H zl87INaOIV>!MC@n*trbV;ktHe6N9~&z?_Wr`QYGoP$WG)7k$PC@LniM4g--iN~)*D z4!XOo`LGj~bu3c5oLPm!WM(xBq*0KE4as_)$ZdbpZ8YI|p=XI<|O?0S;QK2lM$!fp*Jf?&`f8iR5@j_6jMxv9< zeOfN81^bUObpZ&Jnvy;J7k(+Ie#05OjBF1*$e13V2ox*s(yF?$W+5yPh}K!0m3i*f z8`K=Jp2Y}N>?IBi;Dqf|Hf6h8tr}vOQ(r`Va9FMiq`RkMc^q{3xWGYlkx>;Y5;vV* zrzTo;T??0X@cDZv`+Pht<%-Ia_Yd*GXuJul$dPm|{?ant1!%b*G83sha|Ik+{xpC^ zydEEz`0g8SF6e}k9wpPt23E#YSc}wI9E%s>MmMz;^(xuqy9m*#87Ae-#54AAE1qpu zYb*nxR(t3OJ53D7HQY(UB;{Uxc`G6AY#t2RQif^bQqA_~2Fc(W(H-eyyjpETw8&N!g+>kh!u0Z# zZBZSUL|40$uy7;i?zDcmJJoiI=%~K>zAPJ4wYEwqW0 z-lu{P6S}r`pwNNxH|3yt$F`bH+@>N)o-(T%Zpk@Onr4L-@q{ds9NHMMwVp!F2La)W zcjF=HEP9oZ#BtBH=q+0lXM?ycE##~dl)(f$Xz5Y$*UpbrgMHw-j0)oHz_vp`u6}x1 zlfGbOM`DfTrzkalw!rjPQhl8msI(; zdC4?6!8OUZBWPhx8Dr2?wX+;Gi#>>&1ZcLP64ix0L#;*J39*U+hl0~hXi*~Ba7*%2 zoX0gv=bM@iPBUg^&DI?997fajEJ4qc7>5ZO>_1((x++M~3le+7b0=9t*;lRXkzI>h zY_qnR#Ax+|cvrEdL{t}OC87kxq(YShN{y@9VjhOS-z~vL(ed_rcYqN8Dam2D`h58d z^`NsZ{Jp5RBk7nEX|qE1rLPvL0;IVvk~AuA3Lt$nUwfKJAr8Z&np@v1dF3wTE|Ob9 z3Qy*ZjPv$xLwSZ~Nwj}KuyOoZ#;Og|5l&cQ>wf$g4zY|}9b}J`fs|&#-yS z>Wg?~&ylOI#zvdRPHVxuAuTm^g)r3(@jl3l2|UT?8?Ug`4y>*dx;S|{-`EZdw;fY1QxY(CP1YVd<|k$y3?xjNZ7 z2vg#Gy>Ihb>c+Qo3fr1!;e-j>dd-Kgw> z&AOQ8gC5Q8Bh!l@Jsy|alsz-?{909atV7|RrjREQ%(G7HokJHHk&wd3kg?(Un9$jh zY@L=ndZ)0jqmK`^LIm*zC#Rq{?lzlUZkOm-KX!iMfyy!-cZnN4tVsQC#XWboGIH(` z)bL=9k@bld?!HMy^QnpZq5>a@jb$~*MizYW*=UYgQxsuUOaXI$G?tIwP!A%N*`;V~ zIPr{v3b~f%A`RR)Wkz%|xS-O+-l@3FdBLu5Y%SW(Id1B{{ zk7{XkAkx=B)x6Q-l{}2gTu-s-G*? zEK8CPU{DyTMx=y__&zI2#H+&rm{}Z_1^QlVaC*;pnmm7TZHDLhpx5ErrUP!P{zt1c z%}(v9yoht<(^=`uf+m}d?dsr#*6fOFilS*`F#uJ2TMNAng`@{5vMDSZ<0((U49tCv z3i?eb5-S@`FUhH~1zKrwJtTxTUS5Z?xv1i#r4-%B*O_F=Eje5O?gXU6c8^C&r?zi2 z(^y^)Gc*45C|dMsdi^T5`(U~AbWyjr=&t9=M8cTOfyLqBGU9v5sYNTcb3zBmTt~bE z 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 Tq3NIhxwx#Pl0=D^q2K=n5+qe< diff --git a/ParseUI/ParseUIDemo/Resources/2.png b/ParseUI/ParseUIDemo/Resources/2.png deleted file mode 100644 index c0b0f5ea874efc1ee0fc0f76ab51f0b13ced7bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20857 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 diff --git a/ParseUI/ParseUIDemo/Resources/SimpleQueryCollectionStoryboard.storyboard b/ParseUI/ParseUIDemo/Resources/SimpleQueryCollectionStoryboard.storyboard deleted file mode 100644 index f2265e62a..000000000 --- a/ParseUI/ParseUIDemo/Resources/SimpleQueryCollectionStoryboard.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard b/ParseUI/ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard deleted file mode 100644 index 0cbb66c5d..000000000 --- a/ParseUI/ParseUIDemo/Resources/SimpleQueryTableStoryboard.storyboard +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUIDemo/Swift/AppDelegate.swift b/ParseUI/ParseUIDemo/Swift/AppDelegate.swift deleted file mode 100644 index 4d951a50c..000000000 --- a/ParseUI/ParseUIDemo/Swift/AppDelegate.swift +++ /dev/null @@ -1,103 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit -import ParseCore - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - // MARK: UIApplicationDelegate - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { - Parse.setApplicationId("UdNpOP2XFoEiXLZEBDl6xONmCMH8VjETmnEsl0xJ", clientKey: "wNJFho0fQaQFQ2Fe1x9b67lVBakJiAtFj1Uz30A9") - window = UIWindow(frame: UIScreen.main.bounds) - window?.rootViewController = UINavigationController(rootViewController: UIDemoViewController()) - window?.makeKeyAndVisible() - - DispatchQueue.global(qos: .default).async() { - self.setupTestData() - } - - return true - } - - // MARK: Test Data - - private func setupTestData() { - let todoTitles = [ - "Build Parse", - "Make everything awesome", - "Go out for the longest run", - "Do more stuff", - "Conquer the world", - "Build a house", - "Grow a tree", - "Be awesome", - "Setup an app", - "Do stuff", - "Buy groceries", - "Wash clothes" - ]; - - var objects: [PFObject] = Array() - - do { - let todos = try PFQuery(className: "Todo").findObjects() - if todos.count == 0 { - for (index, title) in todoTitles.enumerated() { - let todo = PFObject(className: "Todo") - todo["title"] = title - todo["priority"] = index % 3 - objects.append(todo) - } - } - } catch {} - - let appNames = [ "Anypic", "Anywall", "f8" ] - do { - let apps = try PFQuery(className: "App").findObjects() - if apps.count == 0 { - for (index, appName) in appNames.enumerated() { - let bundle = Bundle.main - if let fileURL = bundle.url(forResource: String(index), withExtension: "png") { - if let data = try? Data(contentsOf: fileURL) { - let file = PFFileObject(name: fileURL.lastPathComponent, data: data) - let object = PFObject(className: "App") - object["icon"] = file - object["name"] = appName - objects.append(object) - } - } - } - } - } catch {} - - if objects.count != 0 { - do { - try PFObject.saveAll(objects) - } catch {} - } - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift deleted file mode 100644 index 59ba336be..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/LogInViewController/CustomLogInViewController.swift +++ /dev/null @@ -1,41 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class CustomLogInViewController: PFLogInViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = .blue - - let label = UILabel() - label.textColor = .white - label.text = "All Custom!" - label.sizeToFit() - logInView?.logo = label - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift deleted file mode 100644 index bb6c6795d..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/ProductTableViewController/CustomProductTableViewController.swift +++ /dev/null @@ -1,42 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class CustomProductTableViewController: PFProductTableViewController { - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let product = objects?[indexPath.row] - if let identifier = product?["productIdentifier"] as? String, - identifier == "Cooper" { - PFPurchase.buyProduct(identifier) { error in - if error == nil { - UIAlertView(title: "Success!", message: "Yes!", delegate: nil, cancelButtonTitle: "OK").show() - } - } - } - super.tableView(tableView, didSelectRowAt: indexPath) - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift deleted file mode 100644 index d93fe60cf..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/DeletionCollectionViewController.swift +++ /dev/null @@ -1,140 +0,0 @@ -// -// DeletionCollectionViewController.swift -// ParseUIDemo -// -// Created by Richard Ross III on 5/14/15. -// Copyright (c) 2015 Parse Inc. All rights reserved. -// - -import UIKit - -import ParseCore -import ParseUI - -import BoltsSwift - -class DeletionCollectionViewController: PFQueryCollectionViewController, UIAlertViewDelegate { - convenience init(className: String?) { - let layout = UICollectionViewFlowLayout() - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - - self.init(collectionViewLayout: layout, className: className) - - title = "Deletion Collection" - if #available(iOS 10.0, *) { - pullToRefreshEnabled = true - } else { - // Fallback on earlier versions - } - objectsPerPage = 10 - paginationEnabled = true - - collectionView?.allowsMultipleSelection = true - - navigationItem.rightBarButtonItems = [ - editButtonItem, - UIBarButtonItem(barButtonSystemItem: .add, target: self, action:#selector(addTodo)) - ] - } - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - override func setEditing(_ editing: Bool, animated: Bool) { - super.setEditing(editing, animated: animated) - - if (editing) { - navigationItem.leftBarButtonItem = UIBarButtonItem( - barButtonSystemItem: .trash, - target: self, - action: #selector(deleteSelectedItems) - ) - } else { - navigationItem.leftBarButtonItem = navigationItem.backBarButtonItem - } - } - - @objc - func addTodo() { - if #available(iOS 8.0, *) { - let alertDialog = UIAlertController(title: "Add Todo", message: nil, preferredStyle: .alert) - - var titleTextField : UITextField? = nil - alertDialog.addTextField(configurationHandler: { - titleTextField = $0 - }) - - alertDialog.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) - 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().continueOnSuccessWith { _ -> AnyObject in - return self.loadObjects() - } - } - }) - - present(alertDialog, animated: true, completion: nil) - } else { - let alertView = UIAlertView( - title: "Add Todo", - message: "", - delegate: self, - cancelButtonTitle: "Cancel", - otherButtonTitles: "Save" - ) - - alertView.alertViewStyle = .plainTextInput - alertView.textField(at: 0)?.placeholder = "Name" - - alertView.show() - } - } - - @objc - func deleteSelectedItems() { - guard let paths = collectionView?.indexPathsForSelectedItems else { return } - removeObjects(at: paths) - } - - // MARK - UICollectionViewDataSource - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - cell?.textLabel.textAlignment = .center - cell?.textLabel.text = object?["title"] as? String - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } - - // MARK - UIAlertViewDelegate - - @objc - func alertView(_ alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int) { - if (buttonIndex == alertView.cancelButtonIndex) { - return - } - - if let title = alertView.textField(at: 0)?.text { - let object = PFObject( - className: self.parseClassName!, - dictionary: [ "title": title ] - ) - - object.saveEventually().continueOnSuccessWith { _ -> AnyObject in - return self.loadObjects() - } - } - } -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift deleted file mode 100644 index caef91883..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/PaginatedCollectionViewController.swift +++ /dev/null @@ -1,89 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class PaginatedCollectionViewController: PFQueryCollectionViewController { - - // MARK: Init - - convenience init(className: String?) { - let layout = UICollectionViewFlowLayout() - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - self.init(collectionViewLayout: layout, className: className) - - title = "Paginated Collection" - if #available(iOS 10.0, *) { - pullToRefreshEnabled = true - } else { - // Fallback on earlier versions - } - objectsPerPage = 10 - paginationEnabled = true - } - - // MARK: UIViewController - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - // MARK: Data - - override func queryForCollection() -> PFQuery { - return super.queryForCollection().order(byAscending: "priority") - } - - // MARK: CollectionView - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - cell?.textLabel.textAlignment = .center - - if let title = object?["title"] as? String { - let attributedTitle = NSMutableAttributedString(string: title) - if let priority = object?["priority"] as? Int { - let attributes = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 13.0), NSAttributedString.Key.foregroundColor : UIColor.gray] - let string = NSAttributedString(string: "\nPriority: \(priority)", attributes: attributes) - attributedTitle.append(string) - } - cell?.textLabel.attributedText = attributedTitle - } else { - cell?.textLabel.attributedText = NSAttributedString() - } - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift deleted file mode 100644 index 9e32e52c4..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SectionedCollectionViewController.swift +++ /dev/null @@ -1,159 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class SimpleCollectionReusableView : UICollectionReusableView { - let label: UILabel = UILabel(frame: .zero) - - override init(frame: CGRect) { - super.init(frame: frame) - - label.textAlignment = .center - addSubview(label) - } - - required init?(coder decoder: NSCoder) { - super.init(coder: decoder) - - label.textAlignment = .center - addSubview(label) - } - - override func layoutSubviews() { - super.layoutSubviews() - - label.frame = bounds - } -} - -class SectionedCollectionViewController: PFQueryCollectionViewController { - - var sections: [Int: [PFObject]] = Dictionary() - var sectionKeys: [Int] = Array() - - // MARK: Init - - convenience init(className: String?) { - let layout = UICollectionViewFlowLayout() - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - self.init(collectionViewLayout: layout, className: className) - - title = "Sectioned Collection" - if #available(iOS 10.0, *) { - pullToRefreshEnabled = true - } else { - // Fallback on earlier versions - } - } - - // MARK: UIViewController - - override func viewDidLoad() { - super.viewDidLoad() - - collectionView?.register(SimpleCollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header") - } - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - // MARK: Data - - override func objectsDidLoad(_ error: Error?) { - super.objectsDidLoad(error) - - sections.removeAll(keepingCapacity: false) - for object in objects { - let priority = (object["priority"] as? Int) ?? 0 - var array = sections[priority] ?? Array() - array.append(object) - sections[priority] = array - } - sectionKeys = sections.keys.sorted(by: <) - - collectionView?.reloadData() - } - - override func object(at indexPath: IndexPath?) -> PFObject? { - if let indexPath = indexPath { - let array = sections[sectionKeys[indexPath.section]] - return array?[indexPath.row] - } - return nil - } - -} - -extension SectionedCollectionViewController { - - - override func numberOfSections(in collectionView: UICollectionView) -> Int { - return sections.count - } - - override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - let array = sections[sectionKeys[section]] - return array?.count ?? 0 - } - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - - cell?.textLabel.textAlignment = .center - cell?.textLabel.text = object?["title"] as? String - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } - - override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { - if kind == UICollectionView.elementKindSectionHeader, - let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath) as? SimpleCollectionReusableView { - view.label.text = "Priority \(sectionKeys[indexPath.section])" - return view - } - return super.collectionView(collectionView, viewForSupplementaryElementOfKind: kind, at: indexPath) - } - - override func collectionView(_ collectionView: UICollectionView, - layout collectionViewLayout: UICollectionViewLayout, - referenceSizeForHeaderInSection section: Int) -> CGSize { - if sections.count > 0 { - return CGSize(width: collectionView.bounds.width, height: 40.0) - } - return .zero - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift deleted file mode 100644 index 472e0e4c6..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SimpleCollectionViewController.swift +++ /dev/null @@ -1,88 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class SimpleCollectionViewController: PFQueryCollectionViewController { - - // MARK: Init - - convenience init(className: String?) { - let layout = UICollectionViewFlowLayout() - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - self.init(collectionViewLayout: layout, className: className) - - title = "Simple Collection" - if #available(iOS 10.0, *) { - pullToRefreshEnabled = true - } else { - // Fallback on earlier versions - } - paginationEnabled = false - } - - // MARK: UIViewController - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - // MARK: Data - - override func queryForCollection() -> PFQuery { - return super.queryForCollection().order(byAscending: "priority") - } - - // MARK: CollectionView - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - cell?.textLabel.textAlignment = .center - - if let title = object?["title"] as? String { - let attributedTitle = NSMutableAttributedString(string: title) - if let priority = object?["priority"] as? Int { - let attributes = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 13.0), NSAttributedString.Key.foregroundColor : UIColor.gray] - let string = NSAttributedString(string: "\nPriority: \(priority)", attributes: attributes) - attributedTitle.append(string) - } - cell?.textLabel.attributedText = attributedTitle - } else { - cell?.textLabel.attributedText = NSAttributedString() - } - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift deleted file mode 100644 index 520551d8e..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/StoryboardCollectionViewController.swift +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class StoryboardCollectionViewController: PFQueryCollectionViewController { - - // MARK: UIViewController - - override func viewDidLoad() { - super.viewDidLoad() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - } - } - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - // MARK: Data - - override func queryForCollection() -> PFQuery { - return super.queryForCollection().order(byAscending: "priority") - } - - // MARK: CollectionView - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - cell?.textLabel.textAlignment = .center - - if let title = object?["title"] as? String { - let attributedTitle = NSMutableAttributedString(string: title) - if let priority = object?["priority"] as? Int { - let attributes = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 13.0), NSAttributedString.Key.foregroundColor : UIColor.gray] - let string = NSAttributedString(string: "\nPriority: \(priority)", attributes: attributes) - attributedTitle.append(string) - } - cell?.textLabel.attributedText = attributedTitle - } else { - cell?.textLabel.attributedText = NSAttributedString() - } - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift deleted file mode 100644 index e934bd39d..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryCollectionViewController/SubtitleImageCollectionViewController.swift +++ /dev/null @@ -1,78 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class SubtitleImageCollectionViewController: PFQueryCollectionViewController { - - // MARK: Init - - convenience init(className: String?) { - let layout = UICollectionViewFlowLayout() - layout.sectionInset = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0) - layout.minimumInteritemSpacing = 5.0 - self.init(collectionViewLayout: layout, className: className) - - title = "Image Collection" - if #available(iOS 10.0, *) { - pullToRefreshEnabled = true - } else { - // Fallback on earlier versions - } - paginationEnabled = false - } - - // MARK: UIViewController - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - - if let layout = collectionViewLayout as? UICollectionViewFlowLayout { - let bounds = view.bounds.inset(by: layout.sectionInset) - let sideLength = min(bounds.width, bounds.height) / 2.0 - layout.minimumInteritemSpacing - layout.itemSize = CGSize(width: sideLength, height: sideLength) - } - } - - // MARK: CollectionView - - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, object: PFObject?) -> PFCollectionViewCell? { - let cell = super.collectionView(collectionView, cellForItemAt: indexPath, object: object) - - cell?.textLabel.textAlignment = .center - cell?.textLabel.text = object?["name"] as? String - - cell?.imageView.file = object?["icon"] as? PFFileObject - if cell?.imageView.image == nil { - cell?.imageView.image = UIImage(named: "Icon.png") - cell?.imageView.loadInBackground() - } - - cell?.contentView.layer.borderWidth = 1.0 - cell?.contentView.layer.borderColor = UIColor.lightGray.cgColor - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift deleted file mode 100644 index 34d2d1c1f..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/DeletionTableViewController.swift +++ /dev/null @@ -1,118 +0,0 @@ -// -// DeletionTableViewController.swift -// ParseUIDemo -// -// Created by Richard Ross III on 5/13/15. -// Copyright (c) 2015 Parse Inc. All rights reserved. -// - -import UIKit - -import ParseCore -import ParseUI - -import BoltsSwift - -class DeletionTableViewController: PFQueryTableViewController, UIAlertViewDelegate { - - // MARK: Init - - convenience init(className: String?) { - self.init(style: .plain, className: className) - - title = "Deletion Table" - pullToRefreshEnabled = true - } - - override func viewDidLoad() { - super.viewDidLoad() - - tableView.allowsMultipleSelectionDuringEditing = true - - navigationItem.rightBarButtonItems = [ - editButtonItem, - UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTodo)) - ] - } - - override func setEditing(_ editing: Bool, animated: Bool) { - super.setEditing(editing, animated: animated) - - if (editing) { - navigationItem.leftBarButtonItem = UIBarButtonItem( - barButtonSystemItem: .trash, - target: self, - action: #selector(deleteSelectedItems) - ) - } else { - navigationItem.leftBarButtonItem = navigationItem.backBarButtonItem - } - } - - override func tableView(_ tableView: UITableView, - commit editingStyle: UITableViewCell.EditingStyle, - forRowAt indexPath: IndexPath) { - if (editingStyle == .delete) { - removeObject(at: indexPath) - } - } - - @objc - func addTodo() { - - if #available(iOS 8.0, *) { - let alertDialog = UIAlertController(title: "Add Todo", message: nil, preferredStyle: .alert) - - var titleTextField : UITextField! = nil - alertDialog.addTextField(configurationHandler: { - titleTextField = $0 - }) - - alertDialog.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) - alertDialog.addAction(UIAlertAction(title: "Save", style: .default) { _ in - if let title = titleTextField.text { - let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) - object.saveInBackground().continueOnSuccessWith { _ -> AnyObject in - return self.loadObjects() - } - } - }) - - present(alertDialog, animated: true, completion: nil) - } else { - let alertView = UIAlertView( - title: "Add Todo", - message: "", - delegate: self, - cancelButtonTitle: "Cancel", - otherButtonTitles: "Save" - ) - - alertView.alertViewStyle = .plainTextInput - alertView.textField(at: 0)?.placeholder = "Name" - - alertView.show() - } - } - - @objc - func deleteSelectedItems() { - removeObjects(at: tableView.indexPathsForSelectedRows) - } - - // MARK - UIAlertViewDelegate - - @objc - func alertView(_ alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int) { - if (buttonIndex == alertView.cancelButtonIndex) { - return - } - - if let title = alertView.textField(at: 0)?.text { - let object = PFObject(className: self.parseClassName!, dictionary: [ "title": title ]) - object.saveEventually().continueOnSuccessWith { _ -> AnyObject in - return self.loadObjects() - } - } - } -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift deleted file mode 100644 index f1596353e..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/PaginatedTableViewController.swift +++ /dev/null @@ -1,69 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class PaginatedTableViewController: PFQueryTableViewController { - - // MARK: Init - - convenience init(className: String?) { - self.init(style: .plain, className: className) - - title = "Paginated Table" - pullToRefreshEnabled = true - objectsPerPage = 10 - paginationEnabled = true - } - - // MARK: Data - - override func queryForTable() -> PFQuery { - return super.queryForTable().order(byAscending: "priority") - } - - // MARK: TableView - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, object: PFObject?) -> PFTableViewCell? { - let cellIdentifier = "cell" - - var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? PFTableViewCell - if cell == nil { - cell = PFTableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) - } - - cell?.textLabel?.text = object?["title"] as? String - - var subtitle: String - if let priority = object?["priority"] as? Int { - subtitle = "Priority: \(priority)" - } else { - subtitle = "No Priority" - } - cell?.detailTextLabel?.text = subtitle - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift deleted file mode 100644 index c7edab07f..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SectionedTableViewController.swift +++ /dev/null @@ -1,97 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class SectionedTableViewController: PFQueryTableViewController { - - var sections: [Int: [PFObject]] = Dictionary() - var sectionKeys: [Int] = Array() - - // MARK: Init - - convenience init(className: String?) { - self.init(style: .plain, className: className) - - title = "Sectioned Table" - pullToRefreshEnabled = true - } - - // MARK: Data - - override func objectsDidLoad(_ error: Error?) { - super.objectsDidLoad(error) - - sections.removeAll(keepingCapacity: false) - if let objects = objects { - for object in objects { - let priority = (object["priority"] as? Int) ?? 0 - var array = sections[priority] ?? Array() - array.append(object) - sections[priority] = array - } - } - sectionKeys = sections.keys.sorted(by: <) - - tableView.reloadData() - } - - override func object(at indexPath: IndexPath?) -> PFObject? { - if let indexPath = indexPath { - let array = sections[sectionKeys[indexPath.section]] - return array?[indexPath.row] - } - return nil - } -} - -extension SectionedTableViewController { - - override func numberOfSections(in tableView: UITableView) -> Int { - return sections.count - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - let array = sections[sectionKeys[section]] - return array?.count ?? 0 - } - - override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - return "Priority \(sectionKeys[section])" - } - - override func tableView(_ tableView: UITableView, cellForRowAt: IndexPath, object: PFObject?) -> PFTableViewCell? { - let cellIdentifier = "cell" - - var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? PFTableViewCell - if cell == nil { - cell = PFTableViewCell(style: .default, reuseIdentifier: cellIdentifier) - } - - cell?.textLabel?.text = object?["title"] as? String - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift deleted file mode 100644 index ac948c151..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SimpleTableViewController.swift +++ /dev/null @@ -1,68 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class SimpleTableViewController: PFQueryTableViewController { - - // MARK: Init - - convenience init(className: String?) { - self.init(style: .plain, className: className) - - title = "Simple Table" - pullToRefreshEnabled = true - paginationEnabled = false - } - - // MARK: Data - - override func queryForTable() -> PFQuery { - return super.queryForTable().order(byAscending: "priority") - } - - // MARK: TableView - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, object: PFObject?) -> PFTableViewCell? { - let cellIdentifier = "cell" - - var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? PFTableViewCell - if cell == nil { - cell = PFTableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) - } - - cell?.textLabel?.text = object?["title"] as? String - - var subtitle: String - if let priority = object?["priority"] as? Int { - subtitle = "Priority: \(priority)" - } else { - subtitle = "No Priority" - } - cell?.detailTextLabel?.text = subtitle - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift deleted file mode 100644 index 8a8ca41b4..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/StoryboardTableViewController.swift +++ /dev/null @@ -1,63 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class StoryboardTableViewController: PFQueryTableViewController { - - // MARK: Data - - override func queryForTable() -> PFQuery { - return super.queryForTable().order(byAscending: "priority") - } - - // MARK: TableView - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, object: PFObject?) -> PFTableViewCell? { - let cellIdentifier = "cell" - - var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? PFTableViewCell - if cell == nil { - cell = PFTableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) - } - - var title: String? - var subtitle: String? - - if let object = object { - title = object["title"] as? String - if let priority = object["priority"] as? Int { - subtitle = "Priority: \(priority)" - } else { - subtitle = "No Priority" - } - } - - cell?.textLabel?.text = title - cell?.detailTextLabel?.text = subtitle - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift deleted file mode 100644 index 65cabb92a..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/QueryTableViewController/SubtitleImageTableViewController.swift +++ /dev/null @@ -1,46 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class SubtitleImageTableViewController: PFQueryTableViewController { - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, object: PFObject?) -> PFTableViewCell? { - let cellIdentifier = "cell" - - var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? PFTableViewCell - if cell == nil { - cell = PFTableViewCell(style: .value1, reuseIdentifier: cellIdentifier) - } - - cell?.textLabel?.text = object?["name"] as? String - cell?.detailTextLabel?.text = "@parseit" - - cell?.imageView?.image = UIImage(named: "Icon.png") - cell?.imageView?.file = object?["icon"] as? PFFileObject - - return cell - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift b/ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift deleted file mode 100644 index d9d6fcf2e..000000000 --- a/ParseUI/ParseUIDemo/Swift/CustomViewControllers/SignUpViewController/CustomSignUpViewController.swift +++ /dev/null @@ -1,41 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -class CustomSignUpViewController: PFSignUpViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = .blue - - let label = UILabel() - label.textColor = .white - label.text = "All Custom!" - label.sizeToFit() - signUpView?.logo = label - } - -} diff --git a/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard b/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard deleted file mode 100644 index 51a145098..000000000 --- a/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryCollectionStoryboard-Swift.storyboard +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryTableStoryboard-Swift.storyboard b/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryTableStoryboard-Swift.storyboard deleted file mode 100644 index 00105a56d..000000000 --- a/ParseUI/ParseUIDemo/Swift/Resources/SimpleQueryTableStoryboard-Swift.storyboard +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift b/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift deleted file mode 100644 index 11739cfdd..000000000 --- a/ParseUI/ParseUIDemo/Swift/UIDemoViewController.swift +++ /dev/null @@ -1,350 +0,0 @@ -/* -* Copyright (c) 2015, 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 UIKit - -import ParseCore -import ParseUI - -enum UIDemoType : Int { - case LogInDefault - case LogInUsernamePassword - case LogInPasswordForgotten - case LogInDone - case LogInEmailAsUsername - case LogInAll - case LogInAllNavigation - case LogInCustomizedLogoAndBackground - case SignUpDefault - case SignUpUsernamePassword - case SignUpUsernamePasswordEmail - case SignUpUsernamePasswordEmailSignUp - case SignUpAll - case SignUpEmailAsUsername - case SignUpMinPasswordLength - case SimpleTable - case PaginatedTable - case SectionedTable - case StoryboardTable - case DeletionTable - case ImageTableDefaultStyle - case ImageTableSubtitleStyle - case SimpleCollection - case PaginatedCollection - case SectionedCollection - case StoryboardCollection - case DeletionCollection - case ImageCollection - case Product - case CustomizedProduct - - static var count: Int { - var count = 0 - while let _ = self.init(rawValue: count) { - count = count + 1 - } - return count - } -} - -extension UIDemoType : CustomStringConvertible { - - var description: String { - switch (self) { - case .LogInDefault: - return "Log In Default" - case .LogInUsernamePassword: - return "Log In Username and Password" - case .LogInPasswordForgotten: - return "Log In Password Forgotten" - case .LogInDone: - return "Log In Done Button" - case .LogInEmailAsUsername: - return "Log In Email as Username" - case .LogInAll: - return "Log In All" - case .LogInAllNavigation: - return "Log In All as Navigation" - case .LogInCustomizedLogoAndBackground: - return "Log In Customized Background" - case .SignUpDefault: - return "Sign Up Default" - case .SignUpUsernamePassword: - return "Sign Up Username and Password" - case .SignUpUsernamePasswordEmail: - return "Sign Up Email" - case .SignUpUsernamePasswordEmailSignUp: - return "Sign Up Email And SignUp" - case .SignUpAll: - return "Sign Up All" - case .SignUpEmailAsUsername: - return "Sign Up Email as Username" - case .SignUpMinPasswordLength: - return "Sign Up Minimum Password Length" - case .SimpleTable: - return "Simple Table" - case .PaginatedTable: - return "Paginated Table" - case .SectionedTable: - return "Sectioned Table" - case .StoryboardTable: - return "Simple Storyboard Table" - case .DeletionTable: - return "Deletion Table" - case .ImageTableDefaultStyle: - return "Remote Image Table Default Style" - case .ImageTableSubtitleStyle: - return "Remote Image Table Subtitle Style" - case .SimpleCollection: - return "Simple Collection" - case .PaginatedCollection: - return "Paginated Collection" - case .SectionedCollection: - return "Sectioned Collection" - case .StoryboardCollection: - return "Simple Storyboard Collection" - case .DeletionCollection: - return "Deletion Collection" - case .ImageCollection: - return "Remote Image Collection" - case .Product: - return "Product" - case .CustomizedProduct: - return "Customized Product" - } - } - -} - -class UIDemoViewController: UITableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - title = "ParseUI Demo" - tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") - } - -} - -extension UIDemoViewController { - - override func numberOfSections(in tableView: UITableView) -> Int { - return 1 - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return UIDemoType.count - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) - cell.textLabel?.text = UIDemoType(rawValue: indexPath.row)?.description - return cell - } -} - -extension UIDemoViewController { - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - if let demoType = UIDemoType(rawValue: indexPath.row) { - switch (demoType) { - // ----- - // PFLogInViewController - // ----- - case .LogInDefault: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - present(logInViewController, animated: true, completion: nil) - case .LogInUsernamePassword: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .dismissButton] - present(logInViewController, animated: true, completion: nil) - case .LogInPasswordForgotten: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .dismissButton] - present(logInViewController, animated: true, completion: nil) - case .LogInDone: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .logInButton, .dismissButton] - present(logInViewController, animated: true, completion: nil) - case .LogInEmailAsUsername: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .logInButton, .signUpButton, .dismissButton] - logInViewController.emailAsUsername = true - present(logInViewController, animated: true, completion: nil) - case .LogInAll: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .signUpButton, .dismissButton] - if let signUpController = logInViewController.signUpController { - signUpController.delegate = self - signUpController.fields = [.usernameAndPassword, .email, .additional, .signUpButton, .dismissButton] - } - present(logInViewController, animated: true, completion: nil) - case .LogInAllNavigation: - let logInViewController = PFLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.usernameAndPassword, .passwordForgotten, .logInButton, .signUpButton, .dismissButton] - if let signUpViewController = logInViewController.signUpController { - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .email, .additional, .signUpButton, .dismissButton] - } - navigationController?.pushViewController(logInViewController, animated: true) - case .LogInCustomizedLogoAndBackground: - let logInViewController = CustomLogInViewController() - logInViewController.delegate = self - logInViewController.fields = [.default] - - let signUpViewController = CustomSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = .default - - logInViewController.signUpController = signUpViewController - present(logInViewController, animated: true, completion: nil) - // ----- - // PFSignUpViewController - // ----- - case .SignUpDefault: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - present(signUpViewController, animated: true, completion: nil) - case .SignUpUsernamePassword: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .dismissButton] - present(signUpViewController, animated: true, completion: nil) - case .SignUpUsernamePasswordEmail: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .email, .dismissButton] - present(signUpViewController, animated: true, completion: nil) - case .SignUpUsernamePasswordEmailSignUp: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .email, .signUpButton, .dismissButton] - present(signUpViewController, animated: true, completion: nil) - case .SignUpAll: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .email, .additional, .signUpButton, .dismissButton] - present(signUpViewController, animated: true, completion: nil) - case .SignUpEmailAsUsername: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .signUpButton, .dismissButton] - signUpViewController.emailAsUsername = true - present(signUpViewController, animated: true, completion: nil) - case .SignUpMinPasswordLength: - let signUpViewController = PFSignUpViewController() - signUpViewController.delegate = self - signUpViewController.fields = [.usernameAndPassword, .signUpButton, .dismissButton] - signUpViewController.minPasswordLength = 6 - present(signUpViewController, animated: true, completion: nil) - // ----- - // PFQueryTableViewController - // ----- - case .SimpleTable: - let tableViewController = SimpleTableViewController(className: "Todo") - navigationController?.pushViewController(tableViewController, animated: true) - case .PaginatedTable: - let tableViewController = PaginatedTableViewController(className: "Todo") - navigationController?.pushViewController(tableViewController, animated: true) - case .SectionedTable: - let tableViewController = SectionedTableViewController(className: "Todo") - navigationController?.pushViewController(tableViewController, animated: true) - case .StoryboardTable: - let storyboard = UIStoryboard(name: "SimpleQueryTableStoryboard-Swift", bundle: nil) - let tableViewController = storyboard.instantiateViewController(withIdentifier: "StoryboardTableViewController") as? StoryboardTableViewController - navigationController?.pushViewController(tableViewController!, animated: true) - case .DeletionTable: - let tableViewController = DeletionTableViewController(className: "PublicTodo"); - navigationController?.pushViewController(tableViewController, animated: true); - case .ImageTableDefaultStyle: - let tableViewController = PFQueryTableViewController(className: "App") - tableViewController.imageKey = "icon" - tableViewController.textKey = "name" - tableViewController.paginationEnabled = false - tableViewController.placeholderImage = UIImage(named: "Icon.png") - navigationController?.pushViewController(tableViewController, animated: true) - case .ImageTableSubtitleStyle: - let tableViewController = SubtitleImageTableViewController(className: "App") - tableViewController.imageKey = "icon" - tableViewController.textKey = "name" - tableViewController.paginationEnabled = false - tableViewController.placeholderImage = UIImage(named: "Icon.png") - navigationController?.pushViewController(tableViewController, animated: true) - // ----- - // PFQueryCollectionViewController - // ----- - case .SimpleCollection: - let collectionViewController = SimpleCollectionViewController(className: "Todo") - navigationController?.pushViewController(collectionViewController, animated: true) - case .PaginatedCollection: - let collectionViewController = PaginatedCollectionViewController(className: "Todo") - navigationController?.pushViewController(collectionViewController, animated: true) - case .SectionedCollection: - let collectionViewController = SectionedCollectionViewController(className: "Todo") - navigationController?.pushViewController(collectionViewController, animated: true) - case .StoryboardCollection: - let storyboard = UIStoryboard(name: "SimpleQueryCollectionStoryboard-Swift", bundle: nil) - let collectionViewController = storyboard.instantiateViewController(withIdentifier: "StoryboardCollectionViewController") as? StoryboardCollectionViewController - navigationController?.pushViewController(collectionViewController!, animated: true) - case .DeletionCollection: - let collectionViewController = DeletionCollectionViewController(className: "PublicTodo"); - navigationController?.pushViewController(collectionViewController, animated: true) - case .ImageCollection: - let collectionViewController = SubtitleImageCollectionViewController(className: "App") - navigationController?.pushViewController(collectionViewController, animated: true) - // ----- - // PFProductTableViewController - // ----- - case .Product: - let productTableViewController = PFProductTableViewController() - navigationController?.pushViewController(productTableViewController, animated: true) - case .CustomizedProduct: - let productTableViewController = CustomProductTableViewController() - navigationController?.pushViewController(productTableViewController, animated: true) - } - } - } - -} - -extension UIDemoViewController : PFLogInViewControllerDelegate { - - func logInViewController(logInController: PFLogInViewController, didLogInUser user: PFUser) { - dismiss(animated: true, completion: nil) - } - -} - -extension UIDemoViewController : PFSignUpViewControllerDelegate { - - func signUpViewController(signUpController: PFSignUpViewController, didSignUpUser user: PFUser) { - dismiss(animated: true, completion: nil) - } - -} diff --git a/ParseUI/Scripts/convert_images.rb b/ParseUI/Scripts/convert_images.rb deleted file mode 100755 index 4c03f4057..000000000 --- a/ParseUI/Scripts/convert_images.rb +++ /dev/null @@ -1,166 +0,0 @@ -#!/usr/bin/env ruby -# -# 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. -# -# This script generates Objective-C byte arrays from the png images. - -# Usage: ./convert_images.rb [path/to/images/to/convert/] [Name_Of_Output_Class] -# Note the final slash on the path argument. It is necessary. - -require 'time' -require 'fileutils' - -PATH_PREFIX = ARGV[0] -SEARCH_PATH = "#{PATH_PREFIX}**/*.{png,jpg,jpeg,gif}" - -def make_varname(filename) - varname = filename[PATH_PREFIX.length...filename.length] - varname.gsub!("@", "") - varname.gsub!(/[.\/\-]/, "_") - varname -end - -def get_modified_time_from_header(header_filename_with_path, source_filename_with_path) - resource_modified_time = {} # maps resource filename to the file's modified time - if File.exist?(header_filename_with_path) && File.exist?(source_filename_with_path) - File.open(header_filename_with_path, "r") do |header_file| - puts "Collect timestamps of previously generated resource files" - header_file.each_line do |line| - # puts line - match = %r{NSData\s\*\)(.*);//modified:(.*)$}.match(line) - next unless match - - resource_filename = Regexp.last_match[1] - mtime = Regexp.last_match[2] - puts "resource_filename #{resource_filename}" - puts "time #{mtime}" - resource_modified_time[resource_filename] = Time.parse mtime - end - end - end - resource_modified_time -end - -def files_differ(resource_modified_time) - Dir.glob(SEARCH_PATH) do |filename| - filename_varname = make_varname(filename) - if resource_modified_time[filename_varname].nil? - puts "New file #{filename_varname} is added to resources" - return true - end - - if resource_modified_time[filename_varname] != File.mtime(filename) - puts "A resource file #{filename_varname} had been modified since the header was created" - return true - end - resource_modified_time.delete filename_varname - end - - if resource_modified_time.keys.count != 0 - puts "Some files are present in the header but are not present in resources." - puts "This indicates some resource files have been removed since last time PFResource.h was generated." - return true - end - - puts "The set of files in resources and the set of files in header are identical matches" - puts "Not generating resource files" - false -end - -output_path = File.dirname(ARGV[1]) -output_classname = File.basename(ARGV[1]) - -# We write to temp files and copy over temp files to the final files in the end. -# This way, Xcode does not pick up the intermediate result files and flag them as build errors. -# If developers see these temporary build errors, they will inevitably think the script is broken. -FileUtils.mkdir_p(output_path) - -output_header_filename = output_classname + "Temp.h" -output_source_filename = output_classname + "Temp.m" -final_output_header_filename = output_classname + ".h" -final_output_source_filename = output_classname + ".m" -header_filename_with_path = File.join(output_path, output_header_filename) -source_filename_with_path = File.join(output_path, output_source_filename) -final_output_header_filename_with_path = File.join(output_path, final_output_header_filename) -final_output_source_filename_with_path = File.join(output_path, final_output_source_filename) - -if ARGV.nil? || !(ARGV.include?("-f") || ARGV.include?("-forced")) - resource_modified_time = get_modified_time_from_header(final_output_header_filename_with_path, - final_output_source_filename_with_path) - exit if !files_differ(resource_modified_time) -end - -puts "Regenerating resource byte array files" -# generate header and source files -output_header_file = File.open(header_filename_with_path, "w") -output_source_file = File.open(source_filename_with_path, "w") - -output_header_file.write < -@interface #{output_classname} : NSObject -HEREDOC - -output_source_file.write < 0 - result << ", " - end - result << "0x#{byte.to_s(16)}" - count += 1 - end - result << " };\n\n" - - output_header_file.write < true) -FileUtils.rm(source_filename_with_path, :force => true) - -puts "Done regenerating resource byte array files" diff --git a/ParseUI/SignInWithAppleTests/Info.plist b/ParseUI/SignInWithAppleTests/Info.plist deleted file mode 100644 index 64d65ca49..000000000 --- a/ParseUI/SignInWithAppleTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/ParseUI/SignInWithAppleTests/SignInWithAppleTests.m b/ParseUI/SignInWithAppleTests/SignInWithAppleTests.m deleted file mode 100644 index b74b76ba0..000000000 --- a/ParseUI/SignInWithAppleTests/SignInWithAppleTests.m +++ /dev/null @@ -1,149 +0,0 @@ -// -// SignInWithAppleTests.m -// SignInWithAppleTests -// -// Created by Darren Black on 03/01/2020. -// Copyright © 2020 Parse Inc. All rights reserved. -// - -#import -#import "PFAppleUtils.h" -@import ParseCore; - -@import OCMock; - -@interface SignInWithAppleTests : XCTestCase - -@end - -@interface PFAppleUtils () - -+ (BFTask *)logInInBackgroundWithManager:(PFAppleLoginManager *)manager; - -@end - -@interface PFAppleLoginManager () - -@property (weak, nonatomic) ASAuthorizationController *controller; - -@end - -@interface FakeAuth : NSObject - -@property (nonatomic, strong) id provider; -@property (nonatomic, strong) id credential; - -@end - -@implementation FakeAuth - -@end - -@interface FakeCredential : NSObject - -@property (nonatomic, strong) NSString *user; -@property (nonatomic, strong) NSPersonNameComponents *fullName; -@property (nonatomic, strong) NSData *identityToken; - -@end - -@implementation FakeCredential - -@end - -@implementation SignInWithAppleTests - -- (void)setUp { - // Put setup code here. This method is called before the invocation of each test method in the class. -} - -- (void)tearDown { - // Put teardown code here. This method is called after the invocation of each test method in the class. -} - -- (void)testAppleUtilsLoginSuccess { - - // Create test ASAuthorization and ASAuthorizationAppleIDCredential - FakeAuth *fakeAuth = [FakeAuth new]; - FakeCredential *cred = [FakeCredential new]; - NSString *aString = [NSUUID UUID].UUIDString; - cred.user = aString; - NSPersonNameComponents *name = [[NSPersonNameComponents alloc] init]; - name.givenName = @"Test"; - name.familyName = @"User"; - cred.fullName = name; - NSData *token = [aString dataUsingEncoding:NSUTF8StringEncoding]; - cred.identityToken = token; - fakeAuth.credential = cred; - - // Create stub for PFUser logInWithAuthTypeInBackground - id mockUser = OCMClassMock([PFUser class]); - NSDictionary *authData = @{@"token" : aString, - @"id" : aString }; - PFUser *loggedInUser = [PFUser new]; - OCMStub(ClassMethod([mockUser logInWithAuthTypeInBackground:@"apple" authData:authData])).andReturn([BFTask taskWithResult:loggedInUser]); - - // Create the login task - PFAppleLoginManager *manager = [PFAppleLoginManager new]; - BFTask *logInTask = [PFAppleUtils logInInBackgroundWithManager:manager]; - - XCTestExpectation *expectLoginSuccess = [self expectationWithDescription:@"Login should complete."]; - [logInTask continueWithSuccessBlock:^id _Nullable(BFTask * _Nonnull t) { - XCTAssert(t.result[@"user"] == loggedInUser); - ASAuthorizationAppleIDCredential *credential = t.result[@"credential"]; - XCTAssert([credential.fullName isEqual:cred.fullName]); - XCTAssert([credential.identityToken isEqual:cred.identityToken]); - XCTAssert([credential.user isEqual:cred.user]); - [expectLoginSuccess fulfill]; - return nil; - }]; - - // Call the success callback as Apple would - [manager authorizationController:manager.controller didCompleteWithAuthorization:(ASAuthorization *)fakeAuth]; - [self waitForExpectations:@[expectLoginSuccess] timeout:2]; - - [mockUser stopMocking]; - -} - -- (void)testAppleUtilsLoginFailure { - // Create test ASAuthorization and ASAuthorizationAppleIDCredential - FakeAuth *fakeAuth = [FakeAuth new]; - FakeCredential *cred = [FakeCredential new]; - NSString *aString = [NSUUID UUID].UUIDString; - cred.user = aString; - NSPersonNameComponents *name = [[NSPersonNameComponents alloc] init]; - name.givenName = @"Test"; - name.familyName = @"User"; - cred.fullName = name; - NSData *token = [aString dataUsingEncoding:NSUTF8StringEncoding]; - cred.identityToken = token; - fakeAuth.credential = cred; - - // Create failing stub for PFUser logInWithAuthTypeInBackground - id mockUser = OCMClassMock([PFUser class]); - NSDictionary *authData = @{@"token" : aString, - @"id" : aString }; - NSError *err = [[NSError alloc] initWithDomain:@"org.parseplatform.error" code:1337 userInfo:nil]; - OCMStub(ClassMethod([mockUser logInWithAuthTypeInBackground:@"apple" authData:authData])).andReturn([BFTask taskWithError:err]); - - // Create the login task - PFAppleLoginManager *manager = [PFAppleLoginManager new]; - BFTask *logInTask = [PFAppleUtils logInInBackgroundWithManager:manager]; - - XCTestExpectation *expect = [self expectationWithDescription:@"Task should fail."]; - [logInTask continueWithBlock:^id _Nullable(BFTask * _Nonnull t) { - if (t.error) { - [expect fulfill]; - } - return nil; - }]; - - // Call the success callback as Apple would - [manager authorizationController:manager.controller didCompleteWithAuthorization:(ASAuthorization *)fakeAuth]; - [self waitForExpectations:@[expect] timeout:2]; - - [mockUser stopMocking]; -} - -@end diff --git a/Rakefile b/Rakefile index 34509b27e..a35cbe7cf 100644 --- a/Rakefile +++ b/Rakefile @@ -27,7 +27,6 @@ module Constants File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Resources', 'Parse-OSX.Info.plist'), File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Resources', 'Parse-watchOS.Info.plist'), File.join(SCRIPT_PATH, 'Parse', 'Parse', 'Resources', 'Parse-tvOS.Info.plist'), - File.join(SCRIPT_PATH, 'ParseUI', 'ParseUI', 'Resources', 'Info-iOS.plist'), File.join(SCRIPT_PATH, 'ParseLiveQuery', 'ParseLiveQuery', 'Resources', 'Info.plist'), File.join(SCRIPT_PATH, 'ParseLiveQuery', 'ParseLiveQuery-tvOS', 'Info.plist'), File.join(SCRIPT_PATH, 'ParseLiveQuery', 'ParseLiveQuery-watchOS', 'Info.plist'), @@ -257,65 +256,6 @@ namespace :test do end end - namespace :parseui do - task :all do - Rake::Task['test:parseui:framework'].invoke - Rake::Task['test:parseui:demo_objc'].invoke - Rake::Task['test:parseui:demo_swift'].invoke - end - - task :framework do - task = XCTask::BuildTask.new do |t| - t.directory = SCRIPT_PATH - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseUI' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug -enableCodeCoverage YES' - t.actions = [XCTask::BuildAction::TEST] - t.formatter = XCTask::BuildFormatter::XCPRETTY - end - unless task.execute - puts 'Failed to build ParseUI' - exit(1) - end - end - - task :demo_objc do - task = XCTask::BuildTask.new do |t| - t.directory = SCRIPT_PATH - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseUIDemo' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug' - t.actions = build_action - t.formatter = XCTask::BuildFormatter::XCPRETTY - end - unless task.execute - puts 'Failed to build ParseUI Demo.' - exit(1) - end - end - - task :demo_swift do - task = XCTask::BuildTask.new do |t| - t.directory = SCRIPT_PATH - t.workspace = 'Parse.xcworkspace' - t.scheme = 'ParseUIDemo-Swift' - t.sdk = 'iphonesimulator' - t.destinations = [ios_simulator] - t.configuration = 'Debug' - t.actions = build_action - t.formatter = XCTask::BuildFormatter::XCPRETTY - end - unless task.execute - puts 'Failed to build iOS ParseUI Swift Demo.' - exit(1) - end - end - end - namespace :parse_live_query do task :all do Rake::Task['test:parse_live_query:ios'].invoke From fb1e16487f07ff387bc79972ad23a30b9c5a1a6f Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 28 Apr 2024 14:43:36 +0000 Subject: [PATCH 02/24] chore(release): 4.0.0 [skip ci] # [4.0.0](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/3.0.0...4.0.0) (2024-04-28) ### Features * Remove `ParseUI` ([#1783](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1783)) ([139eca7](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/139eca7f2423bf92c5b6d821eaf4cda16816dd6f)) ### BREAKING CHANGES * This release removes `ParseUI`. ([139eca7](139eca7)) --- CHANGELOG.md | 12 ++++++++++++ Parse/Parse/Resources/Parse-OSX.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-iOS.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-tvOS.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-watchOS.Info.plist | 4 ++-- Parse/Parse/Source/PFConstants.h | 2 +- ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist | 4 ++-- ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist | 4 ++-- ParseLiveQuery/ParseLiveQuery/Resources/Info.plist | 4 ++-- .../Resources/Info.plist | 4 ++-- .../OSX/ParseOSXStarterProject/Resources/Info.plist | 4 ++-- .../ParseStarterProject-Swift/Resources/Info.plist | 4 ++-- .../iOS/ParseStarterProject/Resources/Info.plist | 4 ++-- .../ParseStarter/Info.plist | 4 ++-- .../ParseStarter Extension/Info.plist | 4 ++-- .../ParseStarter/Info.plist | 4 ++-- .../ParseStarterProject-Swift/Resources/Info.plist | 4 ++-- package-lock.json | 2 +- package.json | 2 +- 19 files changed, 45 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 187ce5daa..54c3c83a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [4.0.0](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/3.0.0...4.0.0) (2024-04-28) + + +### Features + +* Remove `ParseUI` ([#1783](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1783)) ([139eca7](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/139eca7f2423bf92c5b6d821eaf4cda16816dd6f)) + + +### BREAKING CHANGES + +* This release removes `ParseUI`. ([139eca7](139eca7)) + # [3.0.0](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/2.7.3...3.0.0) (2024-04-08) diff --git a/Parse/Parse/Resources/Parse-OSX.Info.plist b/Parse/Parse/Resources/Parse-OSX.Info.plist index 4b77e2b42..a1afc0a1e 100644 --- a/Parse/Parse/Resources/Parse-OSX.Info.plist +++ b/Parse/Parse/Resources/Parse-OSX.Info.plist @@ -13,10 +13,10 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 diff --git a/Parse/Parse/Resources/Parse-iOS.Info.plist b/Parse/Parse/Resources/Parse-iOS.Info.plist index 9909836c4..22cee139a 100644 --- a/Parse/Parse/Resources/Parse-iOS.Info.plist +++ b/Parse/Parse/Resources/Parse-iOS.Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -21,7 +21,7 @@ iPhoneOS CFBundleVersion - 3.0.0 + 4.0.0 MinimumOSVersion 12.0 diff --git a/Parse/Parse/Resources/Parse-tvOS.Info.plist b/Parse/Parse/Resources/Parse-tvOS.Info.plist index 216858aa9..b6d0d236e 100644 --- a/Parse/Parse/Resources/Parse-tvOS.Info.plist +++ b/Parse/Parse/Resources/Parse-tvOS.Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 NSPrincipalClass diff --git a/Parse/Parse/Resources/Parse-watchOS.Info.plist b/Parse/Parse/Resources/Parse-watchOS.Info.plist index 216858aa9..b6d0d236e 100644 --- a/Parse/Parse/Resources/Parse-watchOS.Info.plist +++ b/Parse/Parse/Resources/Parse-watchOS.Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 NSPrincipalClass diff --git a/Parse/Parse/Source/PFConstants.h b/Parse/Parse/Source/PFConstants.h index 9172bac9c..469c1926a 100644 --- a/Parse/Parse/Source/PFConstants.h +++ b/Parse/Parse/Source/PFConstants.h @@ -14,7 +14,7 @@ #pragma mark - SDK Version ///-------------------------------------- -#define PARSE_VERSION @"3.0.0" +#define PARSE_VERSION @"4.0.0" ///-------------------------------------- #pragma mark - Platform diff --git a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist index 35d77674d..9c6d8d0e1 100644 --- a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleVersion - 3.0.0 + 4.0.0 diff --git a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist index 35d77674d..9c6d8d0e1 100644 --- a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleVersion - 3.0.0 + 4.0.0 diff --git a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist index 028bd9e36..4574cf178 100644 --- a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist index 106b5ff4b..61e9dd655 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSMainNibFile diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist index 2dbe4d3b4..008a60a97 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile diff --git a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist index ecd9c9d33..6c0a78417 100644 --- a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist index cbecae0e9..f95be7e88 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 LSRequiresIPhoneOS NSMainNibFile diff --git a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist index 57a9056b7..677f1af6a 100644 --- a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist index 06b656c40..6a8963b41 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 NSExtension NSExtensionAttributes diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist index bf71d7c01..eb9562093 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist index 53cdda13e..b19f1b502 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.0.0 + 4.0.0 CFBundleSignature ???? CFBundleVersion - 3.0.0 + 4.0.0 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/package-lock.json b/package-lock.json index 66a70da49..8ba583eca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "3.0.0", + "version": "4.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1a77b5b5f..ab6e6dd4d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "3.0.0", + "version": "4.0.0", "private": true, "repository": { "type": "git", From 08211940c839b8b9896d715891795049a6378766 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sun, 28 Apr 2024 17:37:46 -0500 Subject: [PATCH 03/24] fix: LiveQuery starter project fails to build (#1784) --- .../contents.xcworkspacedata | 7 ++++ .../Examples/LiveQueryDemo-ObjC/Room.h | 2 +- Rakefile | 42 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 ParseLiveQuery/Examples/LiveQueryDemo-ObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/ParseLiveQuery/Examples/LiveQueryDemo-ObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ParseLiveQuery/Examples/LiveQueryDemo-ObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/ParseLiveQuery/Examples/LiveQueryDemo-ObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ParseLiveQuery/Examples/LiveQueryDemo-ObjC/Room.h b/ParseLiveQuery/Examples/LiveQueryDemo-ObjC/Room.h index c368ad242..722dafaad 100644 --- a/ParseLiveQuery/Examples/LiveQueryDemo-ObjC/Room.h +++ b/ParseLiveQuery/Examples/LiveQueryDemo-ObjC/Room.h @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import +@import ParseCore; NS_ASSUME_NONNULL_BEGIN diff --git a/Rakefile b/Rakefile index a35cbe7cf..7601b3812 100644 --- a/Rakefile +++ b/Rakefile @@ -211,12 +211,54 @@ namespace :build do end end + namespace :live_query_starters do + task :all do + Rake::Task['build:live_query_starters:objc'].invoke + Rake::Task['build:live_query_starters:swift'].invoke + end + + task :objc do + live_query_starter_folder = File.join(SCRIPT_PATH, 'ParseLiveQuery', 'Examples') + task = XCTask::BuildTask.new do |t| + t.directory = live_query_starter_folder + t.project = 'LiveQueryDemo-ObjC.xcodeproj' + t.scheme = 'LiveQueryDemo-ObjC' + t.configuration = 'Debug' + t.sdk = 'macosx' + t.actions = build_action + t.formatter = XCTask::BuildFormatter::XCPRETTY + end + unless task.execute + puts 'Live Query ObjC Starter Project Failed!' + exit(1) + end + end + + task :swift do + live_query_starter_folder = File.join(SCRIPT_PATH, 'ParseLiveQuery', 'Examples') + task = XCTask::BuildTask.new do |t| + t.directory = live_query_starter_folder + t.project = 'LiveQueryDemo.xcodeproj' + t.scheme = 'LiveQueryDemo' + t.configuration = 'Debug' + t.sdk = 'macosx' + t.actions = build_action + t.formatter = XCTask::BuildFormatter::XCPRETTY + end + unless task.execute + puts 'Live Query Swift Starter Project Failed!' + exit(1) + end + end + end + desc 'Build all starters' task :starters do Rake::Task['build:tvos_starters:all'].invoke Rake::Task['build:watchos_starters:all'].invoke Rake::Task['build:ios_starters:all'].invoke Rake::Task['build:macos_starters:all'].invoke + Rake::Task['build:live_query_starters:all'].invoke end end From 806da2d69797e789d135b08ca3f4a3912d600e07 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 28 Apr 2024 22:39:43 +0000 Subject: [PATCH 04/24] chore(release): 4.0.1 [skip ci] ## [4.0.1](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.0.0...4.0.1) (2024-04-28) ### Bug Fixes * LiveQuery starter project fails to build ([#1784](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1784)) ([0821194](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/08211940c839b8b9896d715891795049a6378766)) --- CHANGELOG.md | 7 +++++++ Parse/Parse/Resources/Parse-OSX.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-iOS.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-tvOS.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-watchOS.Info.plist | 4 ++-- Parse/Parse/Source/PFConstants.h | 2 +- ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist | 4 ++-- ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist | 4 ++-- ParseLiveQuery/ParseLiveQuery/Resources/Info.plist | 4 ++-- .../OSX/ParseOSXStarterProject-Swift/Resources/Info.plist | 4 ++-- .../OSX/ParseOSXStarterProject/Resources/Info.plist | 4 ++-- .../iOS/ParseStarterProject-Swift/Resources/Info.plist | 4 ++-- .../iOS/ParseStarterProject/Resources/Info.plist | 4 ++-- .../tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist | 4 ++-- .../ParseStarter Extension/Info.plist | 4 ++-- .../ParseStarterProject-Swift/ParseStarter/Info.plist | 4 ++-- .../watchOS/ParseStarterProject-Swift/Resources/Info.plist | 4 ++-- package-lock.json | 2 +- package.json | 2 +- 19 files changed, 40 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54c3c83a1..87cb6fba4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [4.0.1](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.0.0...4.0.1) (2024-04-28) + + +### Bug Fixes + +* LiveQuery starter project fails to build ([#1784](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1784)) ([0821194](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/08211940c839b8b9896d715891795049a6378766)) + # [4.0.0](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/3.0.0...4.0.0) (2024-04-28) diff --git a/Parse/Parse/Resources/Parse-OSX.Info.plist b/Parse/Parse/Resources/Parse-OSX.Info.plist index a1afc0a1e..18b99df76 100644 --- a/Parse/Parse/Resources/Parse-OSX.Info.plist +++ b/Parse/Parse/Resources/Parse-OSX.Info.plist @@ -13,10 +13,10 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 diff --git a/Parse/Parse/Resources/Parse-iOS.Info.plist b/Parse/Parse/Resources/Parse-iOS.Info.plist index 22cee139a..b46311824 100644 --- a/Parse/Parse/Resources/Parse-iOS.Info.plist +++ b/Parse/Parse/Resources/Parse-iOS.Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -21,7 +21,7 @@ iPhoneOS CFBundleVersion - 4.0.0 + 4.0.1 MinimumOSVersion 12.0 diff --git a/Parse/Parse/Resources/Parse-tvOS.Info.plist b/Parse/Parse/Resources/Parse-tvOS.Info.plist index b6d0d236e..107834219 100644 --- a/Parse/Parse/Resources/Parse-tvOS.Info.plist +++ b/Parse/Parse/Resources/Parse-tvOS.Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 NSPrincipalClass diff --git a/Parse/Parse/Resources/Parse-watchOS.Info.plist b/Parse/Parse/Resources/Parse-watchOS.Info.plist index b6d0d236e..107834219 100644 --- a/Parse/Parse/Resources/Parse-watchOS.Info.plist +++ b/Parse/Parse/Resources/Parse-watchOS.Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 NSPrincipalClass diff --git a/Parse/Parse/Source/PFConstants.h b/Parse/Parse/Source/PFConstants.h index 469c1926a..845cdd815 100644 --- a/Parse/Parse/Source/PFConstants.h +++ b/Parse/Parse/Source/PFConstants.h @@ -14,7 +14,7 @@ #pragma mark - SDK Version ///-------------------------------------- -#define PARSE_VERSION @"4.0.0" +#define PARSE_VERSION @"4.0.1" ///-------------------------------------- #pragma mark - Platform diff --git a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist index 9c6d8d0e1..0eecea5c6 100644 --- a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleVersion - 4.0.0 + 4.0.1 diff --git a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist index 9c6d8d0e1..0eecea5c6 100644 --- a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleVersion - 4.0.0 + 4.0.1 diff --git a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist index 4574cf178..969e45a76 100644 --- a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist index 61e9dd655..1845da8bf 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSMainNibFile diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist index 008a60a97..b47a53e58 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile diff --git a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist index 6c0a78417..0ddf4b4e0 100644 --- a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist index f95be7e88..9840661fe 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 LSRequiresIPhoneOS NSMainNibFile diff --git a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist index 677f1af6a..11fb67cb1 100644 --- a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist index 6a8963b41..c4b177c02 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 NSExtension NSExtensionAttributes diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist index eb9562093..9b51f5062 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist index b19f1b502..5bf6d8bea 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.0 + 4.0.1 CFBundleSignature ???? CFBundleVersion - 4.0.0 + 4.0.1 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/package-lock.json b/package-lock.json index 8ba583eca..c4f51aa76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "4.0.0", + "version": "4.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ab6e6dd4d..78c4e0d76 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "4.0.0", + "version": "4.0.1", "private": true, "repository": { "type": "git", From 34ab610186ef9a0566c30948e2675a10f8b07860 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Wed, 1 May 2024 14:43:25 -0500 Subject: [PATCH 05/24] refactor: Update Starscream to 4.0.8 (#1786) --- Package.resolved | 4 ++-- Package.swift | 2 +- Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved | 6 +++--- Parse/Parse.xcodeproj/project.pbxproj | 2 +- ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Package.resolved b/Package.resolved index abb2b5bab..a88d64030 100644 --- a/Package.resolved +++ b/Package.resolved @@ -33,8 +33,8 @@ "repositoryURL": "https://github.com/daltoniam/Starscream.git", "state": { "branch": null, - "revision": "ac6c0fc9da221873e01bd1a0d4818498a71eef33", - "version": "4.0.6" + "revision": "c6bfd1af48efcc9a9ad203665db12375ba6b145a", + "version": "4.0.8" } } ] diff --git a/Package.swift b/Package.swift index a90168d5b..6acdeac3f 100644 --- a/Package.swift +++ b/Package.swift @@ -18,7 +18,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/parse-community/Bolts-ObjC.git", from: "1.10.0"), .package(url: "https://github.com/BoltsFramework/Bolts-Swift.git", from: "1.5.0"), - .package(url: "https://github.com/daltoniam/Starscream.git", from: "4.0.6"), + .package(url: "https://github.com/daltoniam/Starscream.git", from: "4.0.8"), .package(name: "OCMock", url: "https://github.com/erikdoe/ocmock.git", .revision("67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89")) ], targets: [ diff --git a/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved index abb2b5bab..59c6170d6 100644 --- a/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Parse.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -21,7 +21,7 @@ }, { "package": "OCMock", - "repositoryURL": "https://github.com/erikdoe/ocmock.git", + "repositoryURL": "https://github.com/erikdoe/ocmock", "state": { "branch": null, "revision": "67bb9602f0a7541f24dc2d6d0d7389ca3e4c2c89", @@ -33,8 +33,8 @@ "repositoryURL": "https://github.com/daltoniam/Starscream.git", "state": { "branch": null, - "revision": "ac6c0fc9da221873e01bd1a0d4818498a71eef33", - "version": "4.0.6" + "revision": "c6bfd1af48efcc9a9ad203665db12375ba6b145a", + "version": "4.0.8" } } ] diff --git a/Parse/Parse.xcodeproj/project.pbxproj b/Parse/Parse.xcodeproj/project.pbxproj index b82eb80e6..f9be3165c 100644 --- a/Parse/Parse.xcodeproj/project.pbxproj +++ b/Parse/Parse.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ diff --git a/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj b/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj index 2e1717f2a..8060ebce9 100644 --- a/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj +++ b/ParseLiveQuery/ParseLiveQuery.xcodeproj/project.pbxproj @@ -1081,7 +1081,7 @@ repositoryURL = "https://github.com/daltoniam/Starscream.git"; requirement = { kind = exactVersion; - version = 4.0.6; + version = 4.0.8; }; }; /* End XCRemoteSwiftPackageReference section */ From bff58081201b16759690dc5f183bfcc29846a434 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 01:03:16 +0200 Subject: [PATCH 06/24] refactor: bump rexml from 3.2.6 to 3.2.8 (#1789) --- Gemfile.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1a5d38730..8bfcf857a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -89,13 +89,15 @@ GEM public_suffix (4.0.7) rake (13.0.6) redcarpet (3.6.0) - rexml (3.2.6) + rexml (3.2.8) + strscan (>= 3.0.9) rouge (2.0.7) ruby-macho (2.5.1) sassc (2.4.0) ffi (~> 1.9) sqlite3 (1.6.6) mini_portile2 (~> 2.8.0) + strscan (3.1.0) typhoeus (1.4.0) ethon (>= 0.9.0) tzinfo (2.0.6) From ceb4623ae422415d3fca558038f6bcbe23d43e21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:10:03 +0200 Subject: [PATCH 07/24] refactor: Bump braces from 3.0.2 to 3.0.3 (#1791) --- package-lock.json | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index c4f51aa76..fd0f67534 100644 --- a/package-lock.json +++ b/package-lock.json @@ -541,12 +541,23 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" + }, + "dependencies": { + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + } } }, "callsites": { @@ -1065,15 +1076,6 @@ } } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", From dcdf45743eab1126a76aba34e555fb2575f67a3b Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Mon, 17 Jun 2024 09:36:07 -0500 Subject: [PATCH 08/24] feat: Add idempotency (#1790) --- .../Commands/CommandRunner/PFCommandRunningConstants.h | 1 + .../Commands/CommandRunner/PFCommandRunningConstants.m | 1 + .../URLRequestConstructor/PFCommandURLRequestConstructor.m | 2 +- Parse/Parse/Source/PFConstants.h | 4 ++++ Parse/Tests/Unit/CommandURLRequestConstructorTests.m | 1 + 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.h b/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.h index 2ad5558bf..d4eac99da 100644 --- a/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.h +++ b/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.h @@ -27,6 +27,7 @@ extern NSString *const PFCommandHeaderNameAppBuildVersion; extern NSString *const PFCommandHeaderNameAppDisplayVersion; extern NSString *const PFCommandHeaderNameOSVersion; extern NSString *const PFCommandHeaderNameSessionToken; +extern NSString *const PFCommandHeaderNameRequestId; ///-------------------------------------- #pragma mark - HTTP Method Override diff --git a/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.m b/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.m index 3ea747f49..ff93a58c6 100644 --- a/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.m +++ b/Parse/Parse/Internal/Commands/CommandRunner/PFCommandRunningConstants.m @@ -19,5 +19,6 @@ NSString *const PFCommandHeaderNameAppDisplayVersion = @"X-Parse-App-Display-Version"; NSString *const PFCommandHeaderNameOSVersion = @"X-Parse-OS-Version"; NSString *const PFCommandHeaderNameSessionToken = @"X-Parse-Session-Token"; +NSString *const PFCommandHeaderNameRequestId = @"X-Parse-Request-Id"; NSString *const PFCommandParameterNameMethodOverride = @"_method"; diff --git a/Parse/Parse/Internal/Commands/CommandRunner/URLRequestConstructor/PFCommandURLRequestConstructor.m b/Parse/Parse/Internal/Commands/CommandRunner/URLRequestConstructor/PFCommandURLRequestConstructor.m index 157db303e..7457445e3 100644 --- a/Parse/Parse/Internal/Commands/CommandRunner/URLRequestConstructor/PFCommandURLRequestConstructor.m +++ b/Parse/Parse/Internal/Commands/CommandRunner/URLRequestConstructor/PFCommandURLRequestConstructor.m @@ -141,7 +141,7 @@ + (NSDictionary *)defaultURLRequestHeadersForApplicationId:(NSString *)applicati if (clientKey) { mutableHeaders[PFCommandHeaderNameClientKey] = clientKey; } - + mutableHeaders[PFCommandHeaderNameRequestId] = [[NSUUID UUID] UUIDString]; mutableHeaders[PFCommandHeaderNameClientVersion] = [versionPrefix stringByAppendingString:PARSE_VERSION]; mutableHeaders[PFCommandHeaderNameOSVersion] = [PFDevice currentDevice].operatingSystemFullVersion; diff --git a/Parse/Parse/Source/PFConstants.h b/Parse/Parse/Source/PFConstants.h index 845cdd815..063a4bffa 100644 --- a/Parse/Parse/Source/PFConstants.h +++ b/Parse/Parse/Source/PFConstants.h @@ -284,6 +284,10 @@ typedef NS_ENUM(NSInteger, PFErrorCode) { Application has exceeded its request limit. */ kPFErrorRequestLimitExceeded = 155, + /** + Request was a duplicate and has been discarded due to idempotency rules. + */ + kPFErrorDuplicateRequest = 159, /** Invalid event name. */ diff --git a/Parse/Tests/Unit/CommandURLRequestConstructorTests.m b/Parse/Tests/Unit/CommandURLRequestConstructorTests.m index 33040187c..7b9127bc8 100644 --- a/Parse/Tests/Unit/CommandURLRequestConstructorTests.m +++ b/Parse/Tests/Unit/CommandURLRequestConstructorTests.m @@ -155,6 +155,7 @@ - (void)testDefaultURLRequestHeaders { XCTAssertNotNil(headers[PFCommandHeaderNameOSVersion]); XCTAssertNotNil(headers[PFCommandHeaderNameAppBuildVersion]); XCTAssertNotNil(headers[PFCommandHeaderNameAppDisplayVersion]); + XCTAssertNotNil(headers[PFCommandHeaderNameRequestId]); } - (void)testBailOnEncodingError { From c301262e17951e893a76a2448e7ce5f74f49bf85 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 17 Jun 2024 14:38:14 +0000 Subject: [PATCH 09/24] chore(release): 4.1.0 [skip ci] # [4.1.0](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.0.1...4.1.0) (2024-06-17) ### Features * Add idempotency ([#1790](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1790)) ([dcdf457](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/dcdf45743eab1126a76aba34e555fb2575f67a3b)) --- CHANGELOG.md | 7 +++++++ Parse/Parse/Resources/Parse-OSX.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-iOS.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-tvOS.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-watchOS.Info.plist | 4 ++-- Parse/Parse/Source/PFConstants.h | 2 +- ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist | 4 ++-- ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist | 4 ++-- ParseLiveQuery/ParseLiveQuery/Resources/Info.plist | 4 ++-- .../OSX/ParseOSXStarterProject-Swift/Resources/Info.plist | 4 ++-- .../OSX/ParseOSXStarterProject/Resources/Info.plist | 4 ++-- .../iOS/ParseStarterProject-Swift/Resources/Info.plist | 4 ++-- .../iOS/ParseStarterProject/Resources/Info.plist | 4 ++-- .../tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist | 4 ++-- .../ParseStarter Extension/Info.plist | 4 ++-- .../ParseStarterProject-Swift/ParseStarter/Info.plist | 4 ++-- .../watchOS/ParseStarterProject-Swift/Resources/Info.plist | 4 ++-- package-lock.json | 2 +- package.json | 2 +- 19 files changed, 40 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87cb6fba4..beb5b15b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [4.1.0](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.0.1...4.1.0) (2024-06-17) + + +### Features + +* Add idempotency ([#1790](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1790)) ([dcdf457](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/dcdf45743eab1126a76aba34e555fb2575f67a3b)) + ## [4.0.1](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.0.0...4.0.1) (2024-04-28) diff --git a/Parse/Parse/Resources/Parse-OSX.Info.plist b/Parse/Parse/Resources/Parse-OSX.Info.plist index 18b99df76..ae093b325 100644 --- a/Parse/Parse/Resources/Parse-OSX.Info.plist +++ b/Parse/Parse/Resources/Parse-OSX.Info.plist @@ -13,10 +13,10 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 diff --git a/Parse/Parse/Resources/Parse-iOS.Info.plist b/Parse/Parse/Resources/Parse-iOS.Info.plist index b46311824..fde43f522 100644 --- a/Parse/Parse/Resources/Parse-iOS.Info.plist +++ b/Parse/Parse/Resources/Parse-iOS.Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -21,7 +21,7 @@ iPhoneOS CFBundleVersion - 4.0.1 + 4.1.0 MinimumOSVersion 12.0 diff --git a/Parse/Parse/Resources/Parse-tvOS.Info.plist b/Parse/Parse/Resources/Parse-tvOS.Info.plist index 107834219..0c1dcd7ac 100644 --- a/Parse/Parse/Resources/Parse-tvOS.Info.plist +++ b/Parse/Parse/Resources/Parse-tvOS.Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 NSPrincipalClass diff --git a/Parse/Parse/Resources/Parse-watchOS.Info.plist b/Parse/Parse/Resources/Parse-watchOS.Info.plist index 107834219..0c1dcd7ac 100644 --- a/Parse/Parse/Resources/Parse-watchOS.Info.plist +++ b/Parse/Parse/Resources/Parse-watchOS.Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 NSPrincipalClass diff --git a/Parse/Parse/Source/PFConstants.h b/Parse/Parse/Source/PFConstants.h index 063a4bffa..5449f757f 100644 --- a/Parse/Parse/Source/PFConstants.h +++ b/Parse/Parse/Source/PFConstants.h @@ -14,7 +14,7 @@ #pragma mark - SDK Version ///-------------------------------------- -#define PARSE_VERSION @"4.0.1" +#define PARSE_VERSION @"4.1.0" ///-------------------------------------- #pragma mark - Platform diff --git a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist index 0eecea5c6..e93d2c061 100644 --- a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleVersion - 4.0.1 + 4.1.0 diff --git a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist index 0eecea5c6..e93d2c061 100644 --- a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleVersion - 4.0.1 + 4.1.0 diff --git a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist index 969e45a76..e1920e2bc 100644 --- a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist index 1845da8bf..96d1ca252 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSMainNibFile diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist index b47a53e58..23dbfe2cb 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile diff --git a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist index 0ddf4b4e0..99d29d101 100644 --- a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist index 9840661fe..08e4bfbd5 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 LSRequiresIPhoneOS NSMainNibFile diff --git a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist index 11fb67cb1..597e82176 100644 --- a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist index c4b177c02..8a7b23d3a 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 NSExtension NSExtensionAttributes diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist index 9b51f5062..07bf208ef 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist index 5bf6d8bea..9543862ca 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.0.1 + 4.1.0 CFBundleSignature ???? CFBundleVersion - 4.0.1 + 4.1.0 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/package-lock.json b/package-lock.json index fd0f67534..79ccd446a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "4.0.1", + "version": "4.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 78c4e0d76..bde4af76a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "4.0.1", + "version": "4.1.0", "private": true, "repository": { "type": "git", From 73ddb8e9c3d84f2540cdfc323aee36af3827ceb0 Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Sun, 30 Jun 2024 18:06:24 +0200 Subject: [PATCH 10/24] docs: Add chat badge to README (#1794) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0dde4fa7e..0bd40ec68 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ [![License][license-svg]][license-link] [![Forum](https://img.shields.io/discourse/https/community.parseplatform.org/topics.svg)](https://community.parseplatform.org/c/parse-server) [![Twitter](https://img.shields.io/twitter/follow/ParsePlatform.svg?label=Follow&style=social)](https://twitter.com/intent/follow?screen_name=ParsePlatform) +[![Chat](https://img.shields.io/badge/Chat-Join!-%23fff?style=social&logo=slack)](https://chat.parseplatform.org) --- From 5381325fae622eaa5292146ea322a00c0f46e97d Mon Sep 17 00:00:00 2001 From: Russ Shanahan Date: Mon, 15 Jul 2024 16:41:52 -0400 Subject: [PATCH 11/24] fix: SPM build issues with Xcode 16 (#1795) --- Package.swift | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 6acdeac3f..b92ee40aa 100644 --- a/Package.swift +++ b/Package.swift @@ -29,7 +29,93 @@ let package = Package( exclude: ["Resources/Parse-tvOS.Info.plist", "Resources/Parse-iOS.Info.plist", "Resources/Parse-OSX.Info.plist", "Resources/Parse-watchOS.Info.plist"], resources: [.process("Resources")], publicHeadersPath: "Source", - cSettings: [.headerSearchPath("Internal/**")] + cSettings: [ + .headerSearchPath("Internal"), + .headerSearchPath("Internal/ACL"), + .headerSearchPath("Internal/ACL/DefaultACLController"), + .headerSearchPath("Internal/ACL/State"), + .headerSearchPath("Internal/Analytics"), + .headerSearchPath("Internal/Analytics/Controller"), + .headerSearchPath("Internal/Analytics/Utilities"), + .headerSearchPath("Internal/CloudCode"), + .headerSearchPath("Internal/Commands"), + .headerSearchPath("Internal/Commands/CommandRunner"), + .headerSearchPath("Internal/Commands/CommandRunner/URLRequestConstructor"), + .headerSearchPath("Internal/Commands/CommandRunner/URLSession"), + .headerSearchPath("Internal/Commands/CommandRunner/URLSession/Session"), + .headerSearchPath("Internal/Commands/CommandRunner/URLSession/Session/TaskDelegate"), + .headerSearchPath("Internal/Config"), + .headerSearchPath("Internal/Config/Controller"), + .headerSearchPath("Internal/FieldOperation"), + .headerSearchPath("Internal/File"), + .headerSearchPath("Internal/File/Controller"), + .headerSearchPath("Internal/File/FileDataStream"), + .headerSearchPath("Internal/File/State"), + .headerSearchPath("Internal/HTTPRequest"), + .headerSearchPath("Internal/Installation"), + .headerSearchPath("Internal/Installation/Constants"), + .headerSearchPath("Internal/Installation/Controller"), + .headerSearchPath("Internal/Installation/CurrentInstallationController"), + .headerSearchPath("Internal/Installation/InstallationIdentifierStore"), + .headerSearchPath("Internal/KeyValueCache"), + .headerSearchPath("Internal/LocalDataStore"), + .headerSearchPath("Internal/LocalDataStore/OfflineQueryLogic"), + .headerSearchPath("Internal/LocalDataStore/OfflineStore"), + .headerSearchPath("Internal/LocalDataStore/Pin"), + .headerSearchPath("Internal/LocalDataStore/SQLite"), + .headerSearchPath("Internal/MultiProcessLock"), + .headerSearchPath("Internal/Object"), + .headerSearchPath("Internal/Object/BatchController"), + .headerSearchPath("Internal/Object/Coder"), + .headerSearchPath("Internal/Object/Coder/File"), + .headerSearchPath("Internal/Object/Constants"), + .headerSearchPath("Internal/Object/Controller"), + .headerSearchPath("Internal/Object/Controller/OfflineController"), + .headerSearchPath("Internal/Object/CurrentController"), + .headerSearchPath("Internal/Object/EstimatedData"), + .headerSearchPath("Internal/Object/FilePersistence"), + .headerSearchPath("Internal/Object/LocalIdStore"), + .headerSearchPath("Internal/Object/OperationSet"), + .headerSearchPath("Internal/Object/PinningStore"), + .headerSearchPath("Internal/Object/State"), + .headerSearchPath("Internal/Object/Subclassing"), + .headerSearchPath("Internal/Object/Utilities"), + .headerSearchPath("Internal/Persistence"), + .headerSearchPath("Internal/Persistence/Group"), + .headerSearchPath("Internal/Product"), + .headerSearchPath("Internal/Product/ProductsRequestHandler"), + .headerSearchPath("Internal/PropertyInfo"), + .headerSearchPath("Internal/Purchase"), + .headerSearchPath("Internal/Purchase/Controller"), + .headerSearchPath("Internal/Purchase/PaymentTransactionObserver"), + .headerSearchPath("Internal/Push"), + .headerSearchPath("Internal/Push/ChannelsController"), + .headerSearchPath("Internal/Push/Controller"), + .headerSearchPath("Internal/Push/Manager"), + .headerSearchPath("Internal/Push/State"), + .headerSearchPath("Internal/Push/Utilites"), + .headerSearchPath("Internal/Query"), + .headerSearchPath("Internal/Query/Controller"), + .headerSearchPath("Internal/Query/State"), + .headerSearchPath("Internal/Query/Utilities"), + .headerSearchPath("Internal/Relation"), + .headerSearchPath("Internal/Relation/State"), + .headerSearchPath("Internal/Session"), + .headerSearchPath("Internal/Session/Controller"), + .headerSearchPath("Internal/Session/Utilities"), + .headerSearchPath("Internal/ThreadSafety"), + .headerSearchPath("Internal/User"), + .headerSearchPath("Internal/User/AuthenticationProviders"), + .headerSearchPath("Internal/User/AuthenticationProviders/Controller"), + .headerSearchPath("Internal/User/AuthenticationProviders/Providers"), + .headerSearchPath("Internal/User/AuthenticationProviders/Providers/Anonymous"), + .headerSearchPath("Internal/User/Coder"), + .headerSearchPath("Internal/User/Coder/File"), + .headerSearchPath("Internal/User/Constants"), + .headerSearchPath("Internal/User/Controller"), + .headerSearchPath("Internal/User/CurrentUserController"), + .headerSearchPath("Internal/User/State"), + ] ), .target( name: "ParseLiveQuery", From e5d072f37b9b7ca017334dddcf9f775cdcc8f52d Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 15 Jul 2024 20:46:27 +0000 Subject: [PATCH 12/24] chore(release): 4.1.1 [skip ci] ## [4.1.1](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.1.0...4.1.1) (2024-07-15) ### Bug Fixes * SPM build issues with Xcode 16 ([#1795](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1795)) ([5381325](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/5381325fae622eaa5292146ea322a00c0f46e97d)) --- CHANGELOG.md | 7 +++++++ Parse/Parse/Resources/Parse-OSX.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-iOS.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-tvOS.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-watchOS.Info.plist | 4 ++-- Parse/Parse/Source/PFConstants.h | 2 +- ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist | 4 ++-- ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist | 4 ++-- ParseLiveQuery/ParseLiveQuery/Resources/Info.plist | 4 ++-- .../OSX/ParseOSXStarterProject-Swift/Resources/Info.plist | 4 ++-- .../OSX/ParseOSXStarterProject/Resources/Info.plist | 4 ++-- .../iOS/ParseStarterProject-Swift/Resources/Info.plist | 4 ++-- .../iOS/ParseStarterProject/Resources/Info.plist | 4 ++-- .../tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist | 4 ++-- .../ParseStarter Extension/Info.plist | 4 ++-- .../ParseStarterProject-Swift/ParseStarter/Info.plist | 4 ++-- .../watchOS/ParseStarterProject-Swift/Resources/Info.plist | 4 ++-- package-lock.json | 2 +- package.json | 2 +- 19 files changed, 40 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index beb5b15b0..f34e0af72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [4.1.1](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.1.0...4.1.1) (2024-07-15) + + +### Bug Fixes + +* SPM build issues with Xcode 16 ([#1795](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1795)) ([5381325](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/5381325fae622eaa5292146ea322a00c0f46e97d)) + # [4.1.0](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.0.1...4.1.0) (2024-06-17) diff --git a/Parse/Parse/Resources/Parse-OSX.Info.plist b/Parse/Parse/Resources/Parse-OSX.Info.plist index ae093b325..9c3351592 100644 --- a/Parse/Parse/Resources/Parse-OSX.Info.plist +++ b/Parse/Parse/Resources/Parse-OSX.Info.plist @@ -13,10 +13,10 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 diff --git a/Parse/Parse/Resources/Parse-iOS.Info.plist b/Parse/Parse/Resources/Parse-iOS.Info.plist index fde43f522..f97d29109 100644 --- a/Parse/Parse/Resources/Parse-iOS.Info.plist +++ b/Parse/Parse/Resources/Parse-iOS.Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -21,7 +21,7 @@ iPhoneOS CFBundleVersion - 4.1.0 + 4.1.1 MinimumOSVersion 12.0 diff --git a/Parse/Parse/Resources/Parse-tvOS.Info.plist b/Parse/Parse/Resources/Parse-tvOS.Info.plist index 0c1dcd7ac..659b71beb 100644 --- a/Parse/Parse/Resources/Parse-tvOS.Info.plist +++ b/Parse/Parse/Resources/Parse-tvOS.Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 NSPrincipalClass diff --git a/Parse/Parse/Resources/Parse-watchOS.Info.plist b/Parse/Parse/Resources/Parse-watchOS.Info.plist index 0c1dcd7ac..659b71beb 100644 --- a/Parse/Parse/Resources/Parse-watchOS.Info.plist +++ b/Parse/Parse/Resources/Parse-watchOS.Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 NSPrincipalClass diff --git a/Parse/Parse/Source/PFConstants.h b/Parse/Parse/Source/PFConstants.h index 5449f757f..bce859f40 100644 --- a/Parse/Parse/Source/PFConstants.h +++ b/Parse/Parse/Source/PFConstants.h @@ -14,7 +14,7 @@ #pragma mark - SDK Version ///-------------------------------------- -#define PARSE_VERSION @"4.1.0" +#define PARSE_VERSION @"4.1.1" ///-------------------------------------- #pragma mark - Platform diff --git a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist index e93d2c061..c43439f9d 100644 --- a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleVersion - 4.1.0 + 4.1.1 diff --git a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist index e93d2c061..c43439f9d 100644 --- a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleVersion - 4.1.0 + 4.1.1 diff --git a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist index e1920e2bc..87dd6dbfa 100644 --- a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist index 96d1ca252..978bf98b9 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSMainNibFile diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist index 23dbfe2cb..10eea1908 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile diff --git a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist index 99d29d101..6aa75bbaf 100644 --- a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist index 08e4bfbd5..0321b3655 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 LSRequiresIPhoneOS NSMainNibFile diff --git a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist index 597e82176..471e2b499 100644 --- a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist index 8a7b23d3a..eb8517482 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 NSExtension NSExtensionAttributes diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist index 07bf208ef..c527415f8 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist index 9543862ca..d34b24c2f 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.0 + 4.1.1 CFBundleSignature ???? CFBundleVersion - 4.1.0 + 4.1.1 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/package-lock.json b/package-lock.json index 79ccd446a..99bc8617f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "4.1.0", + "version": "4.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index bde4af76a..5dc55e7e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "4.1.0", + "version": "4.1.1", "private": true, "repository": { "type": "git", From 9ef09111a97aa1d8147d177db8d6ac092278ab74 Mon Sep 17 00:00:00 2001 From: Parse Platform <90459499+parseplatformorg@users.noreply.github.com> Date: Thu, 18 Jul 2024 12:05:59 +0200 Subject: [PATCH 13/24] refactor: Security upgrade jazzy from 0.14.4 to 0.15.0 (#1796) --- Gemfile | 2 +- Gemfile.lock | 51 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/Gemfile b/Gemfile index 7beac3bbc..6970765d8 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' # Docs -gem 'jazzy', '~> 0.14.4' +gem 'jazzy', '~> 0.15.0' # Development gem 'xcpretty' diff --git a/Gemfile.lock b/Gemfile.lock index 8bfcf857a..23d5ce444 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,20 +1,28 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml - activesupport (6.1.7.7) + activesupport (7.1.3.4) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) minitest (>= 5.1) + mutex_m tzinfo (~> 2.0) - zeitwerk (~> 2.3) - addressable (2.8.5) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) + base64 (0.2.0) + bigdecimal (3.1.8) claide (1.1.0) cocoapods (1.15.2) addressable (~> 2.8) @@ -54,57 +62,61 @@ GEM netrc (~> 0.11) cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.2.2) + concurrent-ruby (1.3.3) + connection_pool (2.4.1) + drb (2.2.1) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - ffi (1.16.3) + ffi (1.17.0) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) httpclient (2.8.3) - i18n (1.14.1) + i18n (1.14.5) concurrent-ruby (~> 1.0) - jazzy (0.14.4) + jazzy (0.15.1) cocoapods (~> 1.5) mustache (~> 1.1) open4 (~> 1.3) redcarpet (~> 3.4) - rexml (~> 3.2) + rexml (>= 3.2.7, < 4.0) rouge (>= 2.0.6, < 5.0) sassc (~> 2.1) sqlite3 (~> 1.3) xcinvoke (~> 0.3.0) - json (2.6.3) + json (2.7.2) liferaft (0.0.6) - mini_portile2 (2.8.4) - minitest (5.20.0) + mini_portile2 (2.8.7) + minitest (5.24.1) molinillo (0.8.0) mustache (1.1.1) + mutex_m (0.2.0) nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) + nkf (0.2.0) open4 (1.3.4) plist (3.7.1) public_suffix (4.0.7) rake (13.0.6) redcarpet (3.6.0) - rexml (3.2.8) - strscan (>= 3.0.9) + rexml (3.2.9) + strscan rouge (2.0.7) ruby-macho (2.5.1) sassc (2.4.0) ffi (~> 1.9) - sqlite3 (1.6.6) + sqlite3 (1.7.3) mini_portile2 (~> 2.8.0) strscan (3.1.0) - typhoeus (1.4.0) + typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) xcinvoke (0.3.0) liferaft (~> 0.0.6) - xcodeproj (1.23.0) + xcodeproj (1.24.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -113,13 +125,12 @@ GEM rexml (~> 3.2.4) xcpretty (0.3.0) rouge (~> 2.0.7) - zeitwerk (2.6.13) PLATFORMS ruby DEPENDENCIES - jazzy (~> 0.14.4) + jazzy (~> 0.15.0) plist rake xcpretty From d49ec6d9746772383b859429b0f307fa1b0931b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 10 Aug 2024 02:29:20 +0200 Subject: [PATCH 14/24] refactor: Bump rexml from 3.2.9 to 3.3.3 (#1798) --- Gemfile.lock | 57 ++++++++++++++++++++++------------------------------ 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 23d5ce444..0ad2e9b9b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,16 +5,11 @@ GEM base64 nkf rexml - activesupport (7.1.3.4) - base64 - bigdecimal + activesupport (5.2.8.1) concurrent-ruby (~> 1.0, >= 1.0.2) - connection_pool (>= 2.2.5) - drb - i18n (>= 1.6, < 2) - minitest (>= 5.1) - mutex_m - tzinfo (~> 2.0) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) addressable (2.8.7) public_suffix (>= 2.0.2, < 7.0) algoliasearch (1.27.5) @@ -22,38 +17,37 @@ GEM json (>= 1.5.1) atomos (0.1.3) base64 (0.2.0) - bigdecimal (3.1.8) claide (1.1.0) - cocoapods (1.15.2) - addressable (~> 2.8) + cocoapods (1.10.2) + addressable (~> 2.6) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.15.2) + cocoapods-core (= 1.10.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 2.1, < 3.0) + cocoapods-downloader (>= 1.4.0, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.6.0, < 2.0) + cocoapods-trunk (>= 1.4.0, < 2.0) cocoapods-try (>= 1.1.0, < 2.0) colored2 (~> 3.1) escape (~> 0.0.4) fourflusher (>= 2.3.0, < 3.0) gh_inspector (~> 1.0) - molinillo (~> 0.8.0) + molinillo (~> 0.6.6) nap (~> 1.0) - ruby-macho (>= 2.3.0, < 3.0) - xcodeproj (>= 1.23.0, < 2.0) - cocoapods-core (1.15.2) - activesupport (>= 5.0, < 8) - addressable (~> 2.8) + ruby-macho (~> 1.4) + xcodeproj (>= 1.19.0, < 2.0) + cocoapods-core (1.10.2) + activesupport (> 5.0, < 6) + addressable (~> 2.6) algoliasearch (~> 1.0) concurrent-ruby (~> 1.1) fuzzy_match (~> 2.0.4) nap (~> 1.0) netrc (~> 0.11) - public_suffix (~> 4.0) + public_suffix typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) - cocoapods-downloader (2.1) + cocoapods-downloader (1.6.3) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -63,8 +57,6 @@ GEM cocoapods-try (1.2.0) colored2 (3.1.2) concurrent-ruby (1.3.3) - connection_pool (2.4.1) - drb (2.2.1) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) @@ -89,9 +81,8 @@ GEM liferaft (0.0.6) mini_portile2 (2.8.7) minitest (5.24.1) - molinillo (0.8.0) + molinillo (0.6.6) mustache (1.1.1) - mutex_m (0.2.0) nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) @@ -101,28 +92,28 @@ GEM public_suffix (4.0.7) rake (13.0.6) redcarpet (3.6.0) - rexml (3.2.9) + rexml (3.3.3) strscan rouge (2.0.7) - ruby-macho (2.5.1) + ruby-macho (1.4.0) sassc (2.4.0) ffi (~> 1.9) sqlite3 (1.7.3) mini_portile2 (~> 2.8.0) strscan (3.1.0) + thread_safe (0.3.6) typhoeus (1.4.1) ethon (>= 0.9.0) - tzinfo (2.0.6) - concurrent-ruby (~> 1.0) + tzinfo (1.2.11) + thread_safe (~> 0.1) xcinvoke (0.3.0) liferaft (~> 0.0.6) - xcodeproj (1.24.0) + xcodeproj (1.19.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) nanaimo (~> 0.3.0) - rexml (~> 3.2.4) xcpretty (0.3.0) rouge (~> 2.0.7) From 57af748990393b4412e433b428e1e646933b17f3 Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Sat, 24 Aug 2024 12:20:07 +0200 Subject: [PATCH 15/24] ci: Fix codecov and dependabot default commit prefix (#1801) --- .github/dependabot.yml | 14 ++++++++++++++ .github/workflows/ci.yml | 31 +++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..ebfc2b23c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,14 @@ +# Dependabot dependency updates +# Docs: https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "npm" + # Location of package-lock.json + directory: "/" + # Check daily for updates + schedule: + interval: "daily" + commit-message: + # Set commit message prefix + prefix: "refactor" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 795226514..56e188c31 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,11 +84,34 @@ jobs: path: | ~/Library/Developer/Xcode/DerivedData/Parse-*/Logs/Test ~/Library/Developer/Xcode/DerivedData/**/Logs/Build - - name: Upload Coverage - uses: codecov/codecov-action@v3.1.1 + - name: Install test parsing dependencies + if: matrix.script == 'test:ios' + # Workaround as codecov cannot parse xcresult files; + # https://github.com/codecov/uploader/issues/1078 + # https://github.com/codecov/codecov-action/issues/1367 + run: | + brew install a7ex/homebrew-formulae/xcresultparser + - name: Convert Xcode test results for code coverage upload + if: matrix.script == 'test:ios' + env: + COVERAGE_PATH: ${{ github.workspace }}/build/${{ matrix.script }}-coverage.xml + run: | + COVERAGE_PATH=${COVERAGE_PATH//:/-} + echo COVERAGE_PATH=$COVERAGE_PATH >> $GITHUB_ENV + echo "TEST_RESULTS: $TEST_RESULTS" + echo "COVERAGE_PATH: $COVERAGE_PATH" + set -o pipefail && \ + xcresultparser --output-format cobertura \ + "$TEST_RESULTS" >"$COVERAGE_PATH" + - name: Upload code coverage + if: matrix.script == 'test:ios' + uses: codecov/codecov-action@v4 with: - xcode: true - xcode_archive_path: ${{ env.TEST_RESULTS }} + # Set to `true` once codecov token bug is fixed; https://github.com/parse-community/parse-server/issues/9129 + fail_ci_if_error: false + token: ${{ secrets.CODECOV_TOKEN }} + plugin: xcode + file: ${{ env.COVERAGE_PATH }} docs: runs-on: macos-13 timeout-minutes: 15 From 6c88beba59e15d8236c6bc570d1231cd57ee1f62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 20:54:10 +0200 Subject: [PATCH 16/24] refactor: Bump rexml from 3.3.3 to 3.3.6 (#1800) --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0ad2e9b9b..f2a19e5ad 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -92,7 +92,7 @@ GEM public_suffix (4.0.7) rake (13.0.6) redcarpet (3.6.0) - rexml (3.3.3) + rexml (3.3.6) strscan rouge (2.0.7) ruby-macho (1.4.0) From 6a1e3924d36ca8ca37486461fca6afae391243ac Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Wed, 25 Sep 2024 02:41:47 +0200 Subject: [PATCH 17/24] ci: Fix CI timeout (#1810) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 56e188c31..ae1e5a6a7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: tests: env: GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} - timeout-minutes: 30 + timeout-minutes: 45 strategy: matrix: script: From 714ff9af34fbfe183fbe5f71138f20ae5377c4c0 Mon Sep 17 00:00:00 2001 From: Manuel <5673677+mtrezza@users.noreply.github.com> Date: Thu, 26 Sep 2024 02:46:29 +0200 Subject: [PATCH 18/24] ci: Upgrade semantic release (#1813) --- .github/workflows/release-automated.yml | 3 +- package-lock.json | 9803 +++++++++++++---------- package.json | 12 +- release.config.js | 43 +- 4 files changed, 5762 insertions(+), 4099 deletions(-) diff --git a/.github/workflows/release-automated.yml b/.github/workflows/release-automated.yml index c0e588b10..80ee5b890 100644 --- a/.github/workflows/release-automated.yml +++ b/.github/workflows/release-automated.yml @@ -16,7 +16,8 @@ jobs: persist-credentials: false - uses: actions/setup-node@v2 with: - node-version: 18 + node-version: 22 + cache: npm - name: Setup Ruby uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108 - name: Cache Gems diff --git a/package-lock.json b/package-lock.json index 99bc8617f..092205370 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,257 +1,349 @@ { "name": "parse-sdk-ios-osx", "version": "4.1.1", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "packages": { + "": { + "name": "parse-sdk-ios-osx", + "version": "4.1.1", + "devDependencies": { + "@semantic-release/changelog": "6.0.3", + "@semantic-release/commit-analyzer": "13.0.0", + "@semantic-release/exec": "6.0.3", + "@semantic-release/git": "10.0.1", + "@semantic-release/release-notes-generator": "14.0.1", + "semantic-release": "24.1.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@colors/colors": { + "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, - "optional": true + "optional": true, + "engines": { + "node": ">=0.1.90" + } }, - "@nodelib/fs.scandir": { + "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "@nodelib/fs.walk": { + "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", + "node_modules/@octokit/auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", + "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", "dev": true, - "requires": { - "@octokit/types": "^9.0.0" + "engines": { + "node": ">= 18" } }, - "@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", + "node_modules/@octokit/core": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", + "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", "dev": true, - "requires": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "dependencies": { + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.0.0", + "@octokit/request": "^9.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" } }, - "@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", + "node_modules/@octokit/endpoint": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", + "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", "dev": true, - "requires": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "dependencies": { + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" } }, - "@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", + "node_modules/@octokit/graphql": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", + "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", "dev": true, - "requires": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" + "dependencies": { + "@octokit/request": "^9.0.0", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" } }, - "@octokit/openapi-types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", - "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==", + "node_modules/@octokit/openapi-types": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", "dev": true }, - "@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.3.tgz", + "integrity": "sha512-o4WRoOJZlKqEEgj+i9CpcmnByvtzoUYC6I8PD2SA95M+BJ2x8h7oLcVOg9qcowWXBOdcTRsMZiwvM3EyLm9AfA==", "dev": true, - "requires": { - "@octokit/types": "^9.0.0" + "dependencies": { + "@octokit/types": "^13.5.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" } }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true + "node_modules/@octokit/plugin-retry": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.2.tgz", + "integrity": "sha512-XOWnPpH2kJ5VTwozsxGurw+svB2e61aWlmk5EVIYZPwFK5F9h4cyPyj9CIKRyMXMHSwpIsI3mPOdpMmrRhe7UQ==", + "dev": true, + "dependencies": { + "@octokit/request-error": "^6.0.0", + "@octokit/types": "^13.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", + "node_modules/@octokit/plugin-throttling": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.3.1.tgz", + "integrity": "sha512-Qd91H4liUBhwLB2h6jZ99bsxoQdhgPk6TdwnClPyTBSDAdviGPceViEgUwj+pcQDmB/rfAXAXK7MTochpHM3yQ==", "dev": true, - "requires": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" + "dependencies": { + "@octokit/types": "^13.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^6.0.0" } }, - "@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", + "node_modules/@octokit/request": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", + "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", "dev": true, - "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "dependencies": { + "@octokit/endpoint": "^10.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" } }, - "@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "node_modules/@octokit/request-error": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz", + "integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==", "dev": true, - "requires": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "dependencies": { + "@octokit/types": "^13.0.0" + }, + "engines": { + "node": ">= 18" } }, - "@octokit/rest": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", - "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", + "node_modules/@octokit/types": { + "version": "13.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.1.tgz", + "integrity": "sha512-F41lGiWBKPIWPBgjSvaDXTTQptBujnozENAK3S//nj7xsFdYdirImKlBB/hTjr+Vii68SM+8jG3UJWRa6DMuDA==", "dev": true, - "requires": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + "dependencies": { + "@octokit/openapi-types": "^22.2.0" } }, - "@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "dev": true, - "requires": { - "@octokit/openapi-types": "^16.0.0" + "engines": { + "node": ">=12.22.0" } }, - "@pnpm/network.ca-file": { + "node_modules/@pnpm/network.ca-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "4.2.10" }, - "dependencies": { - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - } + "engines": { + "node": ">=12.22.0" } }, - "@pnpm/npm-conf": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz", - "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==", + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", "dev": true, - "requires": { + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" } }, - "@semantic-release/changelog": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.0.tgz", - "integrity": "sha512-X01Me+QVMykvILockNGlXXl3dgr1QqpbRQsknQoOJQCXQGXoqY3DNQ3rBQuI8/SUK7RZwYLctg0NbPNArlo6eQ==", + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true + }, + "node_modules/@semantic-release/changelog": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", + "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", "dev": true, - "requires": { - "@semantic-release/error": "^2.1.0", + "dependencies": { + "@semantic-release/error": "^3.0.0", "aggregate-error": "^3.0.0", - "fs-extra": "^9.0.0", + "fs-extra": "^11.0.0", "lodash": "^4.17.4" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0" } }, - "@semantic-release/commit-analyzer": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.1.tgz", - "integrity": "sha512-ncNsnrLmiykhgNZUXNvhhAjNN0me7VGIb0X5hu3ogyi5DDPapjGAHdEffO5vi+HX1BFWLRD/Ximx5PjGAKjAqQ==", + "node_modules/@semantic-release/commit-analyzer": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.0.tgz", + "integrity": "sha512-KtXWczvTAB1ZFZ6B4O+w8HkfYm/OgQb1dUGNFZtDgQ0csggrmkq8sTxhd+lwGF8kMb59/RnG9o4Tn7M/I8dQ9Q==", "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.7", + "dependencies": { + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", + "import-from-esm": "^1.0.3", + "lodash-es": "^4.17.21", "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=20.8.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "@semantic-release/error": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", - "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", - "dev": true + "node_modules/@semantic-release/error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", + "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", + "dev": true, + "engines": { + "node": ">=14.17" + } }, - "@semantic-release/exec": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/exec/-/exec-6.0.2.tgz", - "integrity": "sha512-ciaqJTHB1TFtU6C78xrgmoNI9UyfheR9+Bk6Ico7CJ7+ADOEAvUrPBKvz64UCfoWlg+SlKGTVGbFnA509wRUVw==", + "node_modules/@semantic-release/exec": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/exec/-/exec-6.0.3.tgz", + "integrity": "sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==", "dev": true, - "requires": { + "dependencies": { "@semantic-release/error": "^3.0.0", "aggregate-error": "^3.0.0", "debug": "^4.0.0", @@ -259,22 +351,20 @@ "lodash": "^4.17.4", "parse-json": "^5.0.0" }, - "dependencies": { - "@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true - } + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0" } }, - "@semantic-release/git": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.0.tgz", - "integrity": "sha512-/BljvngXJzwbFFJouxHHvSzAhi5iaucF7l0kQPszD4m7Y79+FHyvQl5Q/HK7T/e8MIwU9hz321KjOZn9yfSpPg==", + "node_modules/@semantic-release/git": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", + "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", "dev": true, - "requires": { - "@semantic-release/error": "^2.1.0", + "dependencies": { + "@semantic-release/error": "^3.0.0", "aggregate-error": "^3.0.0", "debug": "^4.0.0", "dir-glob": "^3.0.0", @@ -282,4565 +372,6111 @@ "lodash": "^4.17.4", "micromatch": "^4.0.0", "p-reduce": "^2.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0" } }, - "@semantic-release/github": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.7.tgz", - "integrity": "sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==", + "node_modules/@semantic-release/github": { + "version": "10.3.5", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.3.5.tgz", + "integrity": "sha512-svvRglGmvqvxjmDgkXhrjf0lC88oZowFhOfifTldbgX9Dzj0inEtMLaC+3/MkDEmxmaQjWmF5Q/0CMIvPNSVdQ==", "dev": true, - "requires": { - "@octokit/rest": "^19.0.0", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" + "dependencies": { + "@octokit/core": "^6.0.0", + "@octokit/plugin-paginate-rest": "^11.0.0", + "@octokit/plugin-retry": "^7.0.0", + "@octokit/plugin-throttling": "^9.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "debug": "^4.3.4", + "dir-glob": "^3.0.1", + "globby": "^14.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "issue-parser": "^7.0.0", + "lodash-es": "^4.17.21", + "mime": "^4.0.0", + "p-filter": "^4.0.0", + "url-join": "^5.0.0" }, + "engines": { + "node": ">=20.8.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/github/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@semantic-release/github/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, "dependencies": { - "@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true - }, - "fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@semantic-release/npm": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", - "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", + "node_modules/@semantic-release/github/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.1.tgz", + "integrity": "sha512-/6nntGSUGK2aTOI0rHPwY3ZjgY9FkXmEHbW9Kr+62NVOsyqpKKeP0lrCH+tphv+EsNdJNmqqwijTEnVWUMQ2Nw==", + "dev": true, + "dependencies": { + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "execa": "^9.0.0", "fs-extra": "^11.0.0", - "lodash": "^4.17.15", + "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", + "normalize-url": "^8.0.0", + "npm": "^10.5.0", "rc": "^1.2.8", - "read-pkg": "^5.0.0", + "read-pkg": "^9.0.0", "registry-auth-token": "^5.0.0", "semver": "^7.1.2", - "tempy": "^1.0.0" + "tempy": "^3.0.0" }, - "dependencies": { - "@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true - }, - "fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } + "engines": { + "node": ">=20.8.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "@semantic-release/release-notes-generator": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.2.tgz", - "integrity": "sha512-I4eavIcDan8fNQHskZ2cbWkFMimvgxNkqR2UfuYNwYBgswEl3SJsN8XMf9gZWObt6nXDc2QfDwhjy8DjTZqS3w==", + "node_modules/@semantic-release/npm/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.0", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" + "engines": { + "node": ">=18" } }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "node_modules/@semantic-release/npm/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@semantic-release/npm/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, - "requires": { - "debug": "4" + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@semantic-release/npm/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ansi-escapes": { + "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "requires": { - "type-fest": "^1.0.2" + "engines": { + "node": ">=12" }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@semantic-release/npm/node_modules/execa": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.4.0.tgz", + "integrity": "sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==", "dev": true, - "requires": { - "color-convert": "^1.9.0" + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@semantic-release/npm/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@semantic-release/npm/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, - "requires": { - "fill-range": "^7.1.1" - }, "dependencies": { - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - } + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "node_modules/@semantic-release/npm/node_modules/human-signals": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "node_modules/@semantic-release/npm/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "node_modules/@semantic-release/npm/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@semantic-release/npm/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/@semantic-release/npm/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "node_modules/@semantic-release/npm/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/@semantic-release/npm/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@semantic-release/npm/node_modules/npm-run-path/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, - "requires": { - "color-name": "1.1.3" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "node_modules/@semantic-release/npm/node_modules/parse-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" + "dependencies": { + "@babel/code-frame": "^7.22.13", + "index-to-position": "^0.1.2", + "type-fest": "^4.7.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "node_modules/@semantic-release/npm/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "node_modules/@semantic-release/npm/node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "conventional-changelog-writer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.0.tgz", - "integrity": "sha512-HnDh9QHLNWfL6E1uHz6krZEQOgm8hN7z/m7tT16xwd802fwgMN0Wqd7AQYVkhpsjDUx/99oo+nGgvKF657XP5g==", - "dev": true, - "requires": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "node_modules/@semantic-release/npm/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "conventional-commits-parser": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.3.tgz", - "integrity": "sha512-YyRDR7On9H07ICFpRm/igcdjIqebXbvf4Cff+Pf0BrBys1i1EOzx9iFXNlAbdrLAR8jf7bkUYkDAr8pEy0q4Pw==", + "node_modules/@semantic-release/npm/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "dev": true, - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "node_modules/@semantic-release/release-notes-generator": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.0.1.tgz", + "integrity": "sha512-K0w+5220TM4HZTthE5dDpIuFrnkN1NfTGPidJFm04ULT1DEZ9WG89VNXN7F0c+6nMEpWgqmPvb7vY7JkB2jyyA==", "dev": true, - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" + "dependencies": { + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", + "debug": "^4.0.0", + "get-stream": "^7.0.0", + "import-from-esm": "^1.0.3", + "into-stream": "^7.0.0", + "lodash-es": "^4.17.21", + "read-package-up": "^11.0.0" + }, + "engines": { + "node": ">=20.8.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", + "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, - "requires": { - "ms": "2.1.2" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "engines": { + "node": ">=18" }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "dependencies": { - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - } - } - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, - "requires": { - "path-type": "^4.0.0" + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "requires": { - "is-obj": "^2.0.0" + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "env-ci": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-8.0.0.tgz", - "integrity": "sha512-W+3BqGZozFua9MPeXpmTm5eYEBtGgL76jGu/pwMVp/L8PdECSCEWaIp7d4Mw7kuUrbUldK0oV0bNd6ZZjLiMiA==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "requires": { - "execa": "^6.1.0", - "java-properties": "^1.0.2" - }, - "dependencies": { - "execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { - "is-arrayish": "^0.2.1" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", "dev": true }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "node_modules/before-after-hook": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", + "dev": true + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "node_modules/braces/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "requires": { - "reusify": "^1.0.4" + "engines": { + "node": ">=6" } }, - "figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, "dependencies": { - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "engines": { + "node": ">=10" } }, - "find-versions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", - "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, - "requires": { - "semver-regex": "^4.0.5" + "engines": { + "node": ">=6" } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" } }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", + "node_modules/cli-highlight/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "requires": { - "through2": "~2.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "engines": { + "node": ">=8" } }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "requires": { - "is-glob": "^4.0.1" + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" + "dependencies": { + "color-name": "1.1.3" } }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, - "requires": { - "function-bind": "^1.1.1" + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } }, - "hook-std": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", - "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", - "dev": true + "node_modules/conventional-changelog-angular": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.0.0.tgz", + "integrity": "sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "node_modules/conventional-changelog-writer": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.0.0.tgz", + "integrity": "sha512-TQcoYGRatlAnT2qEWDON/XSfnVG38JzA7E0wcGScu7RElQBkg9WWgZd1peCWFcWDh1xfb2CfsrcvOn1bbSzztA==", "dev": true, - "requires": { - "lru-cache": "^6.0.0" + "dependencies": { + "@types/semver": "^7.5.5", + "conventional-commits-filter": "^5.0.0", + "handlebars": "^4.7.7", + "meow": "^13.0.0", + "semver": "^7.5.2" + }, + "bin": { + "conventional-changelog-writer": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" } }, - "http-proxy-agent": { + "node_modules/conventional-commits-filter": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "engines": { + "node": ">=18" } }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/conventional-commits-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.0.0.tgz", + "integrity": "sha512-TbsINLp48XeMXR8EvGjTnKGsZqBemisPoyWESlpRyR8lif0lcwzqz+NMtYSj1ooF/WYjSuu7wX0CtdeeMEQAmA==", "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" } }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } } }, - "import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } }, - "indent-string": { + "node_modules/crypto-random-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } }, - "into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" + "engines": { + "node": ">=4.0.0" } }, - "ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", - "dev": true + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, - "requires": { - "has": "^1.0.3" + "dependencies": { + "readable-stream": "^2.0.2" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "requires": { - "is-extglob": "^2.1.1" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "dev": true }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true + "node_modules/env-ci": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.1.0.tgz", + "integrity": "sha512-Z8dnwSDbV1XYM9SBF2J0GcNVvmfmfh3a49qddGIROhBoVro6MZVTji15z/sJbQ2ko2ei8n988EU1wzoLU/tF+g==", + "dev": true, + "dependencies": { + "execa": "^8.0.0", + "java-properties": "^1.0.2" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true + "node_modules/env-ci/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "node_modules/env-ci/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-plain-object": { + "node_modules/env-ci/node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, - "requires": { - "text-extensions": "^1.0.0" + "engines": { + "node": ">=16.17.0" } }, - "is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true + "node_modules/env-ci/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "node_modules/env-ci/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "node_modules/env-ci/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "issue-parser": { + "node_modules/env-ci/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, - "requires": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true - }, - "js-tokens": { + "node_modules/env-ci/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "js-yaml": { + "node_modules/env-ci/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "requires": { - "argparse": "^2.0.1" + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/env-ci/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "engines": { + "node": ">=18" }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { - "p-locate": "^4.1.0" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "requires": { - "yallist": "^4.0.0" + "engines": { + "node": ">=6" } }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "marked": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", - "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", - "dev": true - }, - "marked-terminal": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz", - "integrity": "sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==", - "dev": true, - "requires": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.1", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" - }, - "dependencies": { - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - } + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" } }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" } }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "requires": { - "brace-expansion": "^1.1.7" + "dependencies": { + "reusify": "^1.0.4" } }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nerf-dart": { + "node_modules/find-up-simple": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", "dev": true, - "requires": { - "lodash": "^4.17.21" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "node_modules/find-versions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz", + "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", "dev": true, - "requires": { - "whatwg-url": "^5.0.0" + "dependencies": { + "semver-regex": "^4.0.5", + "super-regex": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-timeout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", + "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", + "dev": true, + "dependencies": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + } + }, + "node_modules/git-log-parser/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/git-log-parser/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/git-log-parser/node_modules/split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "dev": true, + "dependencies": { + "through2": "~2.0.0" + } + }, + "node_modules/git-log-parser/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/git-log-parser/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/hook-std": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", + "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from-esm": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.4.tgz", + "integrity": "sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": ">=16.20" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/index-to-position": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", + "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", + "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "npm": { - "version": "8.19.3", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.3.tgz", - "integrity": "sha512-0QjmyPtDxSyMWWD8I91QGbrgx9KzbV6C9FK1liEb/K0zppiZkr5KxXc990G+LzPwBHDfRjUBlO9T1qZ08vl9mA==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/issue-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", + "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "dev": true, + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, + "node_modules/marked": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/marked-terminal": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.1.0.tgz", + "integrity": "sha512-+pvwa14KZL74MVXjYdPR3nSInhGhNvPce/3mqLVZT2oUvt654sL1XImFuLZ1pkA866IYZ3ikDTOFUIC7XzpZZg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "chalk": "^5.3.0", + "cli-highlight": "^2.1.11", + "cli-table3": "^0.6.5", + "node-emoji": "^2.1.3", + "supports-hyperlinks": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <14" + } + }, + "node_modules/marked-terminal/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.4.tgz", + "integrity": "sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", + "dev": true + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm": { + "version": "10.8.3", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.3.tgz", + "integrity": "sha512-0IQlyAYvVtQ7uOhDFYZCGK8kkut2nh8cpAdA9E6FvRSJaTgtZRZgNjlC5ZCct//L73ygrpY93CxXpRJDtNqPVg==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/redact", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^7.5.4", + "@npmcli/config": "^8.3.4", + "@npmcli/fs": "^3.1.1", + "@npmcli/map-workspaces": "^3.0.6", + "@npmcli/package-json": "^5.2.0", + "@npmcli/promise-spawn": "^7.0.2", + "@npmcli/redact": "^2.0.1", + "@npmcli/run-script": "^8.1.0", + "@sigstore/tuf": "^2.3.4", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^18.0.4", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-columns": "^4.0.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^10.4.5", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^7.0.2", + "ini": "^4.1.3", + "init-package-json": "^6.0.3", + "is-cidr": "^5.1.0", + "json-parse-even-better-errors": "^3.0.2", + "libnpmaccess": "^8.0.6", + "libnpmdiff": "^6.1.4", + "libnpmexec": "^8.1.4", + "libnpmfund": "^5.0.12", + "libnpmhook": "^10.0.5", + "libnpmorg": "^6.0.6", + "libnpmpack": "^7.0.4", + "libnpmpublish": "^9.0.9", + "libnpmsearch": "^7.0.6", + "libnpmteam": "^6.0.5", + "libnpmversion": "^6.0.3", + "make-fetch-happen": "^13.0.1", + "minimatch": "^9.0.5", + "minipass": "^7.1.1", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^10.2.0", + "nopt": "^7.2.1", + "normalize-package-data": "^6.0.2", + "npm-audit-report": "^5.0.0", + "npm-install-checks": "^6.3.0", + "npm-package-arg": "^11.0.3", + "npm-pick-manifest": "^9.1.0", + "npm-profile": "^10.0.0", + "npm-registry-fetch": "^17.1.0", + "npm-user-validate": "^2.0.1", + "p-map": "^4.0.0", + "pacote": "^18.0.6", + "parse-conflict-json": "^3.0.1", + "proc-log": "^4.2.0", + "qrcode-terminal": "^0.12.0", + "read": "^3.0.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "ssri": "^10.0.6", + "supports-color": "^9.4.0", + "tar": "^6.2.1", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.1", + "which": "^4.0.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "2.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "7.5.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.1", + "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.1.1", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.1.0", + "@npmcli/query": "^3.1.0", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "bin-links": "^4.0.4", + "cacache": "^18.0.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.2", + "json-parse-even-better-errors": "^3.0.2", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", + "minimatch": "^9.0.4", + "nopt": "^7.2.1", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.2", + "npm-pick-manifest": "^9.0.1", + "npm-registry-fetch": "^17.0.1", + "pacote": "^18.0.6", + "parse-conflict-json": "^3.0.0", + "proc-log": "^4.2.0", + "proggy": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.6", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "8.3.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/package-json": "^5.1.1", + "ci-info": "^4.0.0", + "ini": "^4.1.2", + "nopt": "^7.2.1", + "proc-log": "^4.2.0", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "5.0.8", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "7.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^18.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "5.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "8.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "2.3.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.3.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "2.3.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "2.3.4", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "1.2.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "18.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^5.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/diff": { + "version": "5.2.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/foreground-child": { + "version": "3.3.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ini": { + "version": "4.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "6.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^5.0.0", + "npm-package-arg": "^11.0.0", + "promzard": "^1.0.0", + "read": "^3.0.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/ip-address": { + "version": "9.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^4.1.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/npm/node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "8.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "6.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.5.4", + "@npmcli/installed-package-contents": "^2.1.0", + "binary-extensions": "^2.3.0", + "diff": "^5.1.0", + "minimatch": "^9.0.4", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.6", + "tar": "^6.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "8.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.5.4", + "@npmcli/run-script": "^8.1.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.6", + "proc-log": "^4.2.0", + "read": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "5.0.12", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.5.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "10.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "6.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "7.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.5.4", + "@npmcli/run-script": "^8.1.0", + "npm-package-arg": "^11.0.2", + "pacote": "^18.0.6" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "9.0.9", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.1", + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.1", + "proc-log": "^4.2.0", + "semver": "^7.3.7", + "sigstore": "^2.2.0", + "ssri": "^10.0.6" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "7.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "6.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "6.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.7", + "@npmcli/run-script": "^8.1.0", + "json-parse-even-better-errors": "^3.0.2", + "proc-log": "^4.2.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "13.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "10.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "7.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.3.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "11.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "8.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "9.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "10.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^17.0.1", + "proc-log": "^4.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "17.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/package-json-from-dist": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/npm/node_modules/pacote": { + "version": "18.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.11.1", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/proggy": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/sigstore": { + "version": "2.3.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.8.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.18", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/which": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", "dev": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.2.1", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.14", - "libnpmfund": "^3.0.5", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "^5.1.0", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "@gar/promisify": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "@npmcli/arborist": { - "version": "5.6.3", - "bundled": true, - "dev": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^5.2.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/ci-detect": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "@npmcli/config": { - "version": "4.2.2", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/disparity-colors": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.3.0" - } - }, - "@npmcli/fs": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "bundled": true, - "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "dependencies": { - "npm-bundled": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - } - } - }, - "@npmcli/map-workspaces": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - } - }, - "@npmcli/metavuln-calculator": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/name-from-folder": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "@npmcli/node-gyp": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "@npmcli/package-json": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "@npmcli/promise-spawn": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/query": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" - } - }, - "@npmcli/run-script": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "asap": { - "version": "2.0.6", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "bin-links": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "requires": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "binary-extensions": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "builtins": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, - "cacache": { - "version": "16.1.3", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - } - }, - "chalk": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "cidr-regex": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "ip-regex": "^4.1.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "cli-columns": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "cli-table3": { - "version": "0.6.2", - "bundled": true, - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "clone": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "cmd-shim": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "mkdirp-infer-owner": "^2.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "color-support": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "columnify": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "debug": { - "version": "4.3.4", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "defaults": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "depd": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "dezalgo": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "5.1.0", - "bundled": true, - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true, - "dev": true - }, - "encoding": { - "version": "0.1.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "bundled": true, - "dev": true - }, - "err-code": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "bundled": true, - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "gauge": { - "version": "4.0.4", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "8.0.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "bundled": true, - "dev": true - }, - "has": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hosted-git-info": { - "version": "5.2.1", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore-walk": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "minimatch": "^5.0.1" - } - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "ini": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "init-package-json": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - } - }, - "ip-regex": { - "version": "4.3.0", - "bundled": true, - "dev": true - }, - "is-cidr": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "cidr-regex": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.10.0", - "bundled": true, - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "bundled": true, - "dev": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true, - "dev": true - }, - "just-diff": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "just-diff-apply": { - "version": "5.4.1", - "bundled": true, - "dev": true - }, - "libnpmaccess": { - "version": "6.0.4", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmdiff": { - "version": "4.0.5", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" - } - }, - "libnpmexec": { - "version": "4.0.14", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" - } - }, - "libnpmfund": { - "version": "3.0.5", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^5.6.3" - } - }, - "libnpmhook": { - "version": "8.0.4", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmorg": { - "version": "4.0.4", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmpack": { - "version": "4.1.3", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - } - }, - "libnpmpublish": { - "version": "6.0.5", - "bundled": true, - "dev": true, - "requires": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - } - }, - "libnpmsearch": { - "version": "5.0.4", - "bundled": true, - "dev": true, - "requires": { - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmteam": { - "version": "4.0.4", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmversion": { - "version": "3.0.7", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" - } - }, - "lru-cache": { - "version": "7.13.2", - "bundled": true, - "dev": true - }, - "make-fetch-happen": { - "version": "10.2.1", - "bundled": true, - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "3.3.4", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "mkdirp-infer-owner": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - } - }, - "ms": { - "version": "2.1.3", - "bundled": true, - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "bundled": true, - "dev": true - }, - "node-gyp": { - "version": "9.1.0", - "bundled": true, - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "nopt": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1" - } - } - } - }, - "nopt": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "normalize-package-data": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "npm-audit-report": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "npm-bundled": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "npm-install-checks": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "npm-package-arg": { - "version": "9.1.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - }, - "npm-packlist": { - "version": "5.1.3", - "bundled": true, - "dev": true, - "requires": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "npm-pick-manifest": { - "version": "7.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "npm-profile": { - "version": "6.2.1", - "bundled": true, - "dev": true, - "requires": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" - } - }, - "npm-registry-fetch": { - "version": "13.3.1", - "bundled": true, - "dev": true, - "requires": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - } - }, - "npm-user-validate": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "npmlog": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.2", - "bundled": true, - "dev": true - }, - "p-map": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pacote": { - "version": "13.6.2", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - } - }, - "parse-conflict-json": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "postcss-selector-parser": { - "version": "6.0.10", - "bundled": true, - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "proc-log": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-call-limit": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "promzard": { - "version": "0.3.0", - "bundled": true, - "dev": true, - "requires": { - "read": "1" - } - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "read": { - "version": "1.0.7", - "bundled": true, - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "read-package-json": { - "version": "5.0.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "read-package-json-fast": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "retry": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "7.3.7", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "bundled": true, - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "bundled": true, - "dev": true - }, - "socks": { - "version": "2.7.0", - "bundled": true, - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "spdx-correct": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "bundled": true, - "dev": true - }, - "ssri": { - "version": "9.0.1", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "6.1.11", - "bundled": true, - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "treeverse": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "unique-filename": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^3.0.0" - } - }, - "unique-slug": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "walk-up-path": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true, - "dev": true - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", "dev": true, - "requires": { - "path-key": "^3.0.0" + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "requires": { - "wrappy": "1" + "engines": { + "node": ">=0.10.0" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-each-series": { + "node_modules/p-each-series": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "node_modules/p-filter": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, - "requires": { - "p-map": "^2.0.0" + "dependencies": { + "p-map": "^7.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-is-promise": { + "node_modules/p-is-promise": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "requires": { - "p-try": "^2.0.0" + "engines": { + "node": ">=8" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/p-map": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", + "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", "dev": true, - "requires": { - "p-limit": "^2.2.0" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-reduce": { + "node_modules/p-reduce": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "engines": { + "node": ">=8" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-json": { + "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "path-exists": { + "node_modules/parse-ms": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pify": { + "node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "pkg-conf": { + "node_modules/pkg-conf": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", "dev": true, - "requires": { + "dependencies": { "find-up": "^2.0.0", "load-json-file": "^4.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-ms": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz", + "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==", + "dev": true, + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "process-nextick-args": { + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "proto-list": { + "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "queue-microtask": { + "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "rc": { + "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, - "requires": { + "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/read-package-up/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "dependencies": { + "lru-cache": "^10.0.1" }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-package-up/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/read-package-up/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/read-package-up/node_modules/parse-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "dependencies": { + "@babel/code-frame": "^7.22.13", + "index-to-position": "^0.1.2", + "type-fest": "^4.7.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/read-package-up/node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", + "node_modules/read-package-up/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "dev": true, - "requires": { - "esprima": "~4.0.0" + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "registry-auth-token": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", - "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", "dev": true, - "requires": { - "@pnpm/npm-conf": "^1.0.4" + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "engines": { + "node": ">=0.10.0" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "requires": { - "glob": "^7.1.3" + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "semantic-release": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-20.1.0.tgz", - "integrity": "sha512-+9+n6RIr0Fz0F53cXrjpawxWlUg3O7/qr1jF9lrE+/v6WqwBrSWnavVHTPaf2WLerET2EngoqI0M4pahkKl6XQ==", + "node_modules/semantic-release": { + "version": "24.1.1", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.1.tgz", + "integrity": "sha512-4Ax2GxD411jUe9IdhOjMLuN+6wAj+aKjvOGngByrpD/iKL+UKN/2puQglhyI4gxNyy9XzEBMzBwbqpnEwbXGEg==", "dev": true, - "requires": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^4.0.1", - "cosmiconfig": "^8.0.0", + "dependencies": { + "@semantic-release/commit-analyzer": "^13.0.0-beta.1", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^10.0.0", + "@semantic-release/npm": "^12.0.0", + "@semantic-release/release-notes-generator": "^14.0.0-beta.1", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^9.0.0", "debug": "^4.0.0", - "env-ci": "^8.0.0", - "execa": "^6.1.0", - "figures": "^5.0.0", - "find-versions": "^5.1.0", + "env-ci": "^11.0.0", + "execa": "^9.0.0", + "figures": "^6.0.0", + "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^3.0.0", - "hosted-git-info": "^6.0.0", + "hosted-git-info": "^8.0.0", + "import-from-esm": "^1.3.1", "lodash-es": "^4.17.21", - "marked": "^4.1.0", - "marked-terminal": "^5.1.1", + "marked": "^12.0.0", + "marked-terminal": "^7.0.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", - "read-pkg-up": "^9.1.0", + "read-package-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^4.0.0", "signale": "^1.2.1", "yargs": "^17.5.1" }, - "dependencies": { - "@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - } - }, - "@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true - }, - "aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "requires": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - } - }, - "clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "requires": { - "escape-string-regexp": "5.0.0" - } - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - }, - "execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "dev": true - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "locate-path": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", - "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "p-reduce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", - "dev": true - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", - "dev": true, - "requires": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": ">=20.8.1" + } + }, + "node_modules/semantic-release/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/semantic-release/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/execa": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.4.0.tgz", + "integrity": "sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/hosted-git-info": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.0.tgz", + "integrity": "sha512-4nw3vOVR+vHUOT8+U4giwe2tcGv+R3pwwRidUe67DoMBTjhrfr6rZYJVVwdkBE+Um050SG+X9tf0Jo4fOpn01w==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/semantic-release/node_modules/human-signals": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/semantic-release/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/semantic-release/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semantic-release/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "requires": { - "lru-cache": "^6.0.0" + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "semver-diff": { + "node_modules/semver-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "dev": true, - "requires": { + "dependencies": { "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "semver-regex": { + "node_modules/semver-regex": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, - "signale": { + "node_modules/signale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.3.2", "figures": "^2.0.0", "pkg-conf": "^2.1.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/signale/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dev": true, "dependencies": { - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - } + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "spawn-error-forwarder": { + "node_modules/spawn-error-forwarder": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", "dev": true }, - "spdx-correct": { + "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, - "requires": { + "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-exceptions": { + "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, - "spdx-expression-parse": { + "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "requires": { + "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-license-ids": { + "node_modules/spdx-license-ids": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, - "requires": { - "through": "2" + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, - "requires": { - "readable-stream": "^3.0.0" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "stream-combiner2": { + "node_modules/stream-combiner2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stream-combiner2/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - }, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "safe-buffer": "~5.1.0" } }, - "string-width": { + "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, - "requires": { - "min-indent": "^1.0.0" + "engines": { + "node": ">=6" } }, - "strip-json-comments": { + "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/super-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz", + "integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==", + "dev": true, + "dependencies": { + "function-timeout": "^1.0.1", + "time-span": "^5.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "node_modules/supports-hyperlinks": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" + "dependencies": { + "has-flag": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/tempy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", + "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", + "dev": true, "dependencies": { - "type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true - } + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", "dev": true, - "requires": { - "readable-stream": "3" + "dependencies": { + "convert-hrtime": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "traverse": { + "node_modules/traverse": { "version": "0.6.7", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "uglify-js": { + "node_modules/uglify-js": { "version": "3.14.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", "dev": true, - "optional": true + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" + "engines": { + "node": ">=4" } }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universal-user-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", + "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", "dev": true }, - "universalify": { + "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 10.0.0" + } }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "validate-npm-package-license": { + "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "requires": { + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "wordwrap": { + "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4" + } }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yargs": { + "node_modules/yargs": { "version": "17.6.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, - "requires": { + "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -4849,26 +6485,39 @@ "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } + "engines": { + "node": ">=12" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 5dc55e7e3..affc30077 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,11 @@ "url": "git+https://github.com/parse-community/Parse-SDK-iOS-OSX.git" }, "devDependencies": { - "@semantic-release/changelog": "6.0.0", - "@semantic-release/commit-analyzer": "9.0.1", - "@semantic-release/exec": "6.0.2", - "@semantic-release/git": "10.0.0", - "@semantic-release/release-notes-generator": "10.0.2", - "semantic-release": "20.1.0" + "@semantic-release/changelog": "6.0.3", + "@semantic-release/commit-analyzer": "13.0.0", + "@semantic-release/exec": "6.0.3", + "@semantic-release/git": "10.0.1", + "@semantic-release/release-notes-generator": "14.0.1", + "semantic-release": "24.1.1" } } diff --git a/release.config.js b/release.config.js index 8b195edab..88321d868 100644 --- a/release.config.js +++ b/release.config.js @@ -2,8 +2,14 @@ * Semantic Release Config */ -const fs = require('fs').promises; -const path = require('path'); +// For CommonJS use: +// const { readFile } = require('fs').promises; +// const { resolve } = require('path'); + +// For ES6 modules use: +import { readFile } from 'fs/promises'; +import { resolve, dirname } from 'path'; +import { fileURLToPath } from 'url'; // Get env vars const ref = process.env.GITHUB_REF; @@ -24,9 +30,9 @@ const templates = { async function config() { // Get branch - const branch = ref.split('/').pop(); + const branch = ref?.split('/')?.pop()?.split('-')[0] || '(current branch could not be determined)'; console.log(`Running on branch: ${branch}`); - + // Set changelog file //const changelogFile = `./changelogs/CHANGELOG_${branch}.md`; const changelogFile = `./CHANGELOG.md`; @@ -37,10 +43,12 @@ async function config() { const config = { branches: [ + 'main', 'master', - // { name: 'alpha', prerelease: true }, - // { name: 'beta', prerelease: true }, - // 'next-major', + 'release', + { name: 'alpha', prerelease: true }, + { name: 'beta', prerelease: true }, + 'next-major', // Long-Term-Support branches // { name: 'release-1', range: '1.x.x', channel: '1.x' }, // { name: 'release-2', range: '2.x.x', channel: '2.x' }, @@ -59,13 +67,13 @@ async function config() { { scope: 'no-release', release: false }, ], parserOpts: { - noteKeywords: [ 'BREAKING CHANGE', 'BREAKING CHANGES', 'BREAKING' ], + noteKeywords: [ 'BREAKING CHANGE' ], }, }], ['@semantic-release/release-notes-generator', { preset: 'angular', parserOpts: { - noteKeywords: ['BREAKING CHANGE', 'BREAKING CHANGES', 'BREAKING'] + noteKeywords: [ 'BREAKING CHANGE' ] }, writerOpts: { commitsSort: ['subject', 'scope'], @@ -100,19 +108,24 @@ async function config() { async function loadTemplates() { for (const template of Object.keys(templates)) { - const text = await readFile(path.resolve(__dirname, resourcePath, templates[template].file)); + // For ES6 modules use: + const fileUrl = import.meta.url; + const __dirname = dirname(fileURLToPath(fileUrl)); + + const filePath = resolve(__dirname, resourcePath, templates[template].file); + const text = await readFile(filePath, 'utf-8'); templates[template].text = text; } } -async function readFile(filePath) { - return await fs.readFile(filePath, 'utf-8'); -} - function getReleaseComment() { const url = repositoryUrl + '/releases/tag/${nextRelease.gitTag}'; let comment = '🎉 This change has been released in version [${nextRelease.version}](' + url + ')'; return comment; } -module.exports = config(); +// For CommonJS use: +// module.exports = config(); + +// For ES6 modules use: +export default config(); From 907f73fba72a4c327ad21cb3db1f68bf379a54ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 20:54:38 +0200 Subject: [PATCH 19/24] refactor: Bump semantic-release from 24.1.1 to 24.1.2 (#1814) --- package-lock.json | 32 ++++++++++++++++---------------- package.json | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 092205370..008c74950 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@semantic-release/exec": "6.0.3", "@semantic-release/git": "10.0.1", "@semantic-release/release-notes-generator": "14.0.1", - "semantic-release": "24.1.1" + "semantic-release": "24.1.2" } }, "node_modules/@babel/code-frame": { @@ -159,12 +159,12 @@ "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.3.tgz", - "integrity": "sha512-o4WRoOJZlKqEEgj+i9CpcmnByvtzoUYC6I8PD2SA95M+BJ2x8h7oLcVOg9qcowWXBOdcTRsMZiwvM3EyLm9AfA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.5.tgz", + "integrity": "sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==", "dev": true, "dependencies": { - "@octokit/types": "^13.5.0" + "@octokit/types": "^13.6.0" }, "engines": { "node": ">= 18" @@ -234,9 +234,9 @@ } }, "node_modules/@octokit/types": { - "version": "13.5.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.1.tgz", - "integrity": "sha512-F41lGiWBKPIWPBgjSvaDXTTQptBujnozENAK3S//nj7xsFdYdirImKlBB/hTjr+Vii68SM+8jG3UJWRa6DMuDA==", + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.0.tgz", + "integrity": "sha512-CrooV/vKCXqwLa+osmHLIMUb87brpgUqlqkPGc6iE2wCkUvTrHiXFMhAKoDDaAAYJrtKtrFTgSQTg5nObBEaew==", "dev": true, "dependencies": { "@octokit/openapi-types": "^22.2.0" @@ -381,9 +381,9 @@ } }, "node_modules/@semantic-release/github": { - "version": "10.3.5", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.3.5.tgz", - "integrity": "sha512-svvRglGmvqvxjmDgkXhrjf0lC88oZowFhOfifTldbgX9Dzj0inEtMLaC+3/MkDEmxmaQjWmF5Q/0CMIvPNSVdQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.0.tgz", + "integrity": "sha512-Uon6G6gJD8U1JNvPm7X0j46yxNRJ8Ui6SgK4Zw5Ktu8RgjEft3BGn+l/RX1TTzhhO3/uUcKuqM+/9/ETFxWS/Q==", "dev": true, "dependencies": { "@octokit/core": "^6.0.0", @@ -407,7 +407,7 @@ "node": ">=20.8.1" }, "peerDependencies": { - "semantic-release": ">=20.1.0" + "semantic-release": ">=24.1.0" } }, "node_modules/@semantic-release/github/node_modules/@semantic-release/error": { @@ -5577,14 +5577,14 @@ } }, "node_modules/semantic-release": { - "version": "24.1.1", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.1.tgz", - "integrity": "sha512-4Ax2GxD411jUe9IdhOjMLuN+6wAj+aKjvOGngByrpD/iKL+UKN/2puQglhyI4gxNyy9XzEBMzBwbqpnEwbXGEg==", + "version": "24.1.2", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.2.tgz", + "integrity": "sha512-hvEJ7yI97pzJuLsDZCYzJgmRxF8kiEJvNZhf0oiZQcexw+Ycjy4wbdsn/sVMURgNCu8rwbAXJdBRyIxM4pe32g==", "dev": true, "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", "@semantic-release/error": "^4.0.0", - "@semantic-release/github": "^10.0.0", + "@semantic-release/github": "^11.0.0", "@semantic-release/npm": "^12.0.0", "@semantic-release/release-notes-generator": "^14.0.0-beta.1", "aggregate-error": "^5.0.0", diff --git a/package.json b/package.json index affc30077..4e6bd3b01 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ "@semantic-release/exec": "6.0.3", "@semantic-release/git": "10.0.1", "@semantic-release/release-notes-generator": "14.0.1", - "semantic-release": "24.1.1" + "semantic-release": "24.1.2" } } From d363a7867b1b211b6f1b9a8c08f27fb208518f76 Mon Sep 17 00:00:00 2001 From: Yao Fan <5057962+fysteven@users.noreply.github.com> Date: Mon, 14 Oct 2024 03:03:29 -0700 Subject: [PATCH 20/24] fix: App crashes on launch and SwiftUI preview when built with Xcode 16 due to unregistered Parse subclasses (#1811) --- .../Subclassing/PFObjectSubclassingController.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Parse/Parse/Internal/Object/Subclassing/PFObjectSubclassingController.m b/Parse/Parse/Internal/Object/Subclassing/PFObjectSubclassingController.m index 07f6adba3..affbaec9a 100644 --- a/Parse/Parse/Internal/Object/Subclassing/PFObjectSubclassingController.m +++ b/Parse/Parse/Internal/Object/Subclassing/PFObjectSubclassingController.m @@ -357,7 +357,18 @@ - (void)_registerSubclassesInLoadedBundle:(NSBundle *)bundle { - (void)_registerSubclassesInBundle:(NSBundle *)bundle { PFConsistencyAssert(bundle.loaded, @"Cannot register subclasses in an unloaded bundle: %@", bundle); - const char *executablePath = bundle.executablePath.UTF8String; + [self _registerSubclassesInExecutablePath:bundle.executablePath]; + +#if defined(DEBUG) && DEBUG + if (bundle == [NSBundle mainBundle]) { + NSString *executablePath = [NSString stringWithFormat:@"%@.debug.dylib", bundle.executablePath]; + [self _registerSubclassesInExecutablePath:executablePath]; + } +#endif +} + +- (void)_registerSubclassesInExecutablePath:(NSString *)exePath { + const char *executablePath = exePath.UTF8String; if (executablePath == NULL) { return; } From 0b9b13502a775f0f09aa3a46db22a6c64e68a344 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 14 Oct 2024 10:11:19 +0000 Subject: [PATCH 21/24] chore(release): 4.1.2 [skip ci] ## [4.1.2](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.1.1...4.1.2) (2024-10-14) ### Bug Fixes * App crashes on launch and SwiftUI preview when built with Xcode 16 due to unregistered Parse subclasses ([#1811](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1811)) ([d363a78](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/d363a7867b1b211b6f1b9a8c08f27fb208518f76)) --- CHANGELOG.md | 7 +++++++ Parse/Parse/Resources/Parse-OSX.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-iOS.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-tvOS.Info.plist | 4 ++-- Parse/Parse/Resources/Parse-watchOS.Info.plist | 4 ++-- Parse/Parse/Source/PFConstants.h | 2 +- ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist | 4 ++-- ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist | 4 ++-- ParseLiveQuery/ParseLiveQuery/Resources/Info.plist | 4 ++-- .../OSX/ParseOSXStarterProject-Swift/Resources/Info.plist | 4 ++-- .../OSX/ParseOSXStarterProject/Resources/Info.plist | 4 ++-- .../iOS/ParseStarterProject-Swift/Resources/Info.plist | 4 ++-- .../iOS/ParseStarterProject/Resources/Info.plist | 4 ++-- .../tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist | 4 ++-- .../ParseStarter Extension/Info.plist | 4 ++-- .../ParseStarterProject-Swift/ParseStarter/Info.plist | 4 ++-- .../watchOS/ParseStarterProject-Swift/Resources/Info.plist | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 19 files changed, 41 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f34e0af72..26e397617 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [4.1.2](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.1.1...4.1.2) (2024-10-14) + + +### Bug Fixes + +* App crashes on launch and SwiftUI preview when built with Xcode 16 due to unregistered Parse subclasses ([#1811](https://github.com/parse-community/Parse-SDK-iOS-OSX/issues/1811)) ([d363a78](https://github.com/parse-community/Parse-SDK-iOS-OSX/commit/d363a7867b1b211b6f1b9a8c08f27fb208518f76)) + ## [4.1.1](https://github.com/parse-community/Parse-SDK-iOS-OSX/compare/4.1.0...4.1.1) (2024-07-15) diff --git a/Parse/Parse/Resources/Parse-OSX.Info.plist b/Parse/Parse/Resources/Parse-OSX.Info.plist index 9c3351592..67340845b 100644 --- a/Parse/Parse/Resources/Parse-OSX.Info.plist +++ b/Parse/Parse/Resources/Parse-OSX.Info.plist @@ -13,10 +13,10 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 diff --git a/Parse/Parse/Resources/Parse-iOS.Info.plist b/Parse/Parse/Resources/Parse-iOS.Info.plist index f97d29109..706b893d8 100644 --- a/Parse/Parse/Resources/Parse-iOS.Info.plist +++ b/Parse/Parse/Resources/Parse-iOS.Info.plist @@ -13,7 +13,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -21,7 +21,7 @@ iPhoneOS CFBundleVersion - 4.1.1 + 4.1.2 MinimumOSVersion 12.0 diff --git a/Parse/Parse/Resources/Parse-tvOS.Info.plist b/Parse/Parse/Resources/Parse-tvOS.Info.plist index 659b71beb..d49675207 100644 --- a/Parse/Parse/Resources/Parse-tvOS.Info.plist +++ b/Parse/Parse/Resources/Parse-tvOS.Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 NSPrincipalClass diff --git a/Parse/Parse/Resources/Parse-watchOS.Info.plist b/Parse/Parse/Resources/Parse-watchOS.Info.plist index 659b71beb..d49675207 100644 --- a/Parse/Parse/Resources/Parse-watchOS.Info.plist +++ b/Parse/Parse/Resources/Parse-watchOS.Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 NSPrincipalClass diff --git a/Parse/Parse/Source/PFConstants.h b/Parse/Parse/Source/PFConstants.h index bce859f40..61a05e1c5 100644 --- a/Parse/Parse/Source/PFConstants.h +++ b/Parse/Parse/Source/PFConstants.h @@ -14,7 +14,7 @@ #pragma mark - SDK Version ///-------------------------------------- -#define PARSE_VERSION @"4.1.1" +#define PARSE_VERSION @"4.1.2" ///-------------------------------------- #pragma mark - Platform diff --git a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist index c43439f9d..9831a9757 100644 --- a/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-tvOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleVersion - 4.1.1 + 4.1.2 diff --git a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist index c43439f9d..9831a9757 100644 --- a/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery-watchOS/Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleVersion - 4.1.1 + 4.1.2 diff --git a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist index 87dd6dbfa..3169161ae 100644 --- a/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist +++ b/ParseLiveQuery/ParseLiveQuery/Resources/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist index 978bf98b9..1f45a8bab 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject-Swift/Resources/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSMainNibFile diff --git a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist index 10eea1908..63794a1ac 100644 --- a/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist +++ b/ParseStarterProject/OSX/ParseOSXStarterProject/Resources/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile diff --git a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist index 6aa75bbaf..872995214 100644 --- a/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist index 0321b3655..aff47593e 100644 --- a/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist +++ b/ParseStarterProject/iOS/ParseStarterProject/Resources/Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 LSRequiresIPhoneOS NSMainNibFile diff --git a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist index 471e2b499..bc3d8ed4c 100644 --- a/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/tvOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist index eb8517482..524b8a338 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter Extension/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 NSExtension NSExtensionAttributes diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist index c527415f8..08b9b8414 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/ParseStarter/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist index d34b24c2f..d6c30fccf 100644 --- a/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist +++ b/ParseStarterProject/watchOS/ParseStarterProject-Swift/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.1 + 4.1.2 CFBundleSignature ???? CFBundleVersion - 4.1.1 + 4.1.2 LSRequiresIPhoneOS UIMainStoryboardFile diff --git a/package-lock.json b/package-lock.json index 008c74950..6b1872ade 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "parse-sdk-ios-osx", - "version": "4.1.1", + "version": "4.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "parse-sdk-ios-osx", - "version": "4.1.1", + "version": "4.1.2", "devDependencies": { "@semantic-release/changelog": "6.0.3", "@semantic-release/commit-analyzer": "13.0.0", diff --git a/package.json b/package.json index 4e6bd3b01..1fa4f6f82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "parse-sdk-ios-osx", - "version": "4.1.1", + "version": "4.1.2", "private": true, "repository": { "type": "git", From 49b771e1baf0e36f9afa56a2630660a1145fa4b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 13:14:17 +0200 Subject: [PATCH 22/24] refactor: Bump semantic-release from 24.1.2 to 24.1.3 (#1815) --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b1872ade..4476ff581 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@semantic-release/exec": "6.0.3", "@semantic-release/git": "10.0.1", "@semantic-release/release-notes-generator": "14.0.1", - "semantic-release": "24.1.2" + "semantic-release": "24.1.3" } }, "node_modules/@babel/code-frame": { @@ -5577,9 +5577,9 @@ } }, "node_modules/semantic-release": { - "version": "24.1.2", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.2.tgz", - "integrity": "sha512-hvEJ7yI97pzJuLsDZCYzJgmRxF8kiEJvNZhf0oiZQcexw+Ycjy4wbdsn/sVMURgNCu8rwbAXJdBRyIxM4pe32g==", + "version": "24.1.3", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.3.tgz", + "integrity": "sha512-Cb0Pm3Ye15u8k/B+7EnusMUSIIucAIEBD3QDRmmclv53KVyqmg1Lb3XPx0AMNxfJZEI+ZT+M+IXDyTrudK6Rew==", "dev": true, "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", diff --git a/package.json b/package.json index 1fa4f6f82..d72048eeb 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ "@semantic-release/exec": "6.0.3", "@semantic-release/git": "10.0.1", "@semantic-release/release-notes-generator": "14.0.1", - "semantic-release": "24.1.2" + "semantic-release": "24.1.3" } } From cdfc83d168fb9728f961bf6273b6af7194199108 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 11:20:02 +0100 Subject: [PATCH 23/24] refactor: Bump rexml from 3.3.6 to 3.3.9 (#1817) --- Gemfile.lock | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f2a19e5ad..6511c5f53 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -92,15 +92,13 @@ GEM public_suffix (4.0.7) rake (13.0.6) redcarpet (3.6.0) - rexml (3.3.6) - strscan + rexml (3.3.9) rouge (2.0.7) ruby-macho (1.4.0) sassc (2.4.0) ffi (~> 1.9) sqlite3 (1.7.3) mini_portile2 (~> 2.8.0) - strscan (3.1.0) thread_safe (0.3.6) typhoeus (1.4.1) ethon (>= 0.9.0) From d5983ba34030a33ba0f2b2bad046f868dd1def7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 11:21:55 +0100 Subject: [PATCH 24/24] refactor: Bump semantic-release from 24.1.3 to 24.2.0 (#1816) --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4476ff581..0196adbc7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@semantic-release/exec": "6.0.3", "@semantic-release/git": "10.0.1", "@semantic-release/release-notes-generator": "14.0.1", - "semantic-release": "24.1.3" + "semantic-release": "24.2.0" } }, "node_modules/@babel/code-frame": { @@ -5577,9 +5577,9 @@ } }, "node_modules/semantic-release": { - "version": "24.1.3", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.3.tgz", - "integrity": "sha512-Cb0Pm3Ye15u8k/B+7EnusMUSIIucAIEBD3QDRmmclv53KVyqmg1Lb3XPx0AMNxfJZEI+ZT+M+IXDyTrudK6Rew==", + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.0.tgz", + "integrity": "sha512-fQfn6e/aYToRtVJYKqneFM1Rg3KP2gh3wSWtpYsLlz6uaPKlISrTzvYAFn+mYWo07F0X1Cz5ucU89AVE8X1mbg==", "dev": true, "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", diff --git a/package.json b/package.json index d72048eeb..80001acd8 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ "@semantic-release/exec": "6.0.3", "@semantic-release/git": "10.0.1", "@semantic-release/release-notes-generator": "14.0.1", - "semantic-release": "24.1.3" + "semantic-release": "24.2.0" } }