From 1bd014771518f5a9e315c416f00e8878ec4488e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ramiro=20Coll=20Don=CC=83etz?= Date: Tue, 6 Aug 2019 12:35:27 -0300 Subject: [PATCH 1/3] Initial project setup --- .gitignore | 82 ++ .../Drink-O-Matic.xcodeproj/project.pbxproj | 728 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Drink-O-Matic/Drink-O-Matic/AppDelegate.swift | 46 ++ .../AppIcon.appiconset/Contents.json | 98 +++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../Drink-O-Matic/Base.lproj/Main.storyboard | 24 + Drink-O-Matic/Drink-O-Matic/Info.plist | 45 ++ .../Drink-O-Matic/ViewController.swift | 20 + .../Drink_O_MaticTests.swift | 34 + Drink-O-Matic/Drink-O-MaticTests/Info.plist | 22 + .../Drink_O_MaticUITests.swift | 34 + Drink-O-Matic/Drink-O-MaticUITests/Info.plist | 22 + Drink-O-Matic/Podfile | 23 + Drink-O-Matic/Podfile.lock | 22 + 19 files changed, 1264 insertions(+) create mode 100644 .gitignore create mode 100644 Drink-O-Matic/Drink-O-Matic.xcodeproj/project.pbxproj create mode 100644 Drink-O-Matic/Drink-O-Matic.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Drink-O-Matic/Drink-O-Matic.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Drink-O-Matic/Drink-O-Matic.xcworkspace/contents.xcworkspacedata create mode 100644 Drink-O-Matic/Drink-O-Matic.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Drink-O-Matic/Drink-O-Matic/AppDelegate.swift create mode 100644 Drink-O-Matic/Drink-O-Matic/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Drink-O-Matic/Drink-O-Matic/Assets.xcassets/Contents.json create mode 100644 Drink-O-Matic/Drink-O-Matic/Base.lproj/LaunchScreen.storyboard create mode 100644 Drink-O-Matic/Drink-O-Matic/Base.lproj/Main.storyboard create mode 100644 Drink-O-Matic/Drink-O-Matic/Info.plist create mode 100644 Drink-O-Matic/Drink-O-Matic/ViewController.swift create mode 100644 Drink-O-Matic/Drink-O-MaticTests/Drink_O_MaticTests.swift create mode 100644 Drink-O-Matic/Drink-O-MaticTests/Info.plist create mode 100644 Drink-O-Matic/Drink-O-MaticUITests/Drink_O_MaticUITests.swift create mode 100644 Drink-O-Matic/Drink-O-MaticUITests/Info.plist create mode 100644 Drink-O-Matic/Podfile create mode 100644 Drink-O-Matic/Podfile.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..47ef03fca --- /dev/null +++ b/.gitignore @@ -0,0 +1,82 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +## Other +*.moved-aside +*.xccheckout +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ \ No newline at end of file diff --git a/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.pbxproj b/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.pbxproj new file mode 100644 index 000000000..10a7d5081 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.pbxproj @@ -0,0 +1,728 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 15A3905F5B905C60D99161C6 /* Pods_Drink_O_Matic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 722FDDB2D778BBFDFD776D0E /* Pods_Drink_O_Matic.framework */; }; + 28AC160222F352E300534A96 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC160122F352E300534A96 /* AppDelegate.swift */; }; + 28AC160422F352E300534A96 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC160322F352E300534A96 /* ViewController.swift */; }; + 28AC160722F352E300534A96 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 28AC160522F352E300534A96 /* Main.storyboard */; }; + 28AC160922F352E500534A96 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 28AC160822F352E500534A96 /* Assets.xcassets */; }; + 28AC160C22F352E500534A96 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 28AC160A22F352E500534A96 /* LaunchScreen.storyboard */; }; + 28AC161722F352E500534A96 /* Drink_O_MaticTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC161622F352E500534A96 /* Drink_O_MaticTests.swift */; }; + 28AC162222F352E500534A96 /* Drink_O_MaticUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC162122F352E500534A96 /* Drink_O_MaticUITests.swift */; }; + B4F4B24AE5A1254861A61C70 /* Pods_Drink_O_MaticUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C51183A47160CDDC05CA9F1 /* Pods_Drink_O_MaticUITests.framework */; }; + E1F05E0F067030F4E49E19F0 /* Pods_Drink_O_MaticTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AF8414AB55563959CDBEA16 /* Pods_Drink_O_MaticTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 28AC161322F352E500534A96 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 28AC15F622F352E300534A96 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 28AC15FD22F352E300534A96; + remoteInfo = "Drink-O-Matic"; + }; + 28AC161E22F352E500534A96 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 28AC15F622F352E300534A96 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 28AC15FD22F352E300534A96; + remoteInfo = "Drink-O-Matic"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 28AC15FE22F352E300534A96 /* Drink-O-Matic.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Drink-O-Matic.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 28AC160122F352E300534A96 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 28AC160322F352E300534A96 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 28AC160622F352E300534A96 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 28AC160822F352E500534A96 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 28AC160B22F352E500534A96 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 28AC160D22F352E500534A96 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 28AC161222F352E500534A96 /* Drink-O-MaticTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Drink-O-MaticTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 28AC161622F352E500534A96 /* Drink_O_MaticTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Drink_O_MaticTests.swift; sourceTree = ""; }; + 28AC161822F352E500534A96 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 28AC161D22F352E500534A96 /* Drink-O-MaticUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Drink-O-MaticUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 28AC162122F352E500534A96 /* Drink_O_MaticUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Drink_O_MaticUITests.swift; sourceTree = ""; }; + 28AC162322F352E500534A96 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 3C51183A47160CDDC05CA9F1 /* Pods_Drink_O_MaticUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Drink_O_MaticUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3FB58FBF10A2F913A03F21D9 /* Pods-Drink-O-Matic.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Drink-O-Matic.debug.xcconfig"; path = "Target Support Files/Pods-Drink-O-Matic/Pods-Drink-O-Matic.debug.xcconfig"; sourceTree = ""; }; + 4E14FE35F6EF15E3794D1139 /* Pods-Drink-O-Matic.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Drink-O-Matic.release.xcconfig"; path = "Target Support Files/Pods-Drink-O-Matic/Pods-Drink-O-Matic.release.xcconfig"; sourceTree = ""; }; + 722FDDB2D778BBFDFD776D0E /* Pods_Drink_O_Matic.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Drink_O_Matic.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 85C720A72337B4F217A1742F /* Pods-Drink-O-MaticTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Drink-O-MaticTests.release.xcconfig"; path = "Target Support Files/Pods-Drink-O-MaticTests/Pods-Drink-O-MaticTests.release.xcconfig"; sourceTree = ""; }; + 8AF8414AB55563959CDBEA16 /* Pods_Drink_O_MaticTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Drink_O_MaticTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B07EFC6918A357A1E45FD335 /* Pods-Drink-O-MaticTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Drink-O-MaticTests.debug.xcconfig"; path = "Target Support Files/Pods-Drink-O-MaticTests/Pods-Drink-O-MaticTests.debug.xcconfig"; sourceTree = ""; }; + C691AAB6153BB3F6B3F4CE6B /* Pods-Drink-O-MaticUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Drink-O-MaticUITests.debug.xcconfig"; path = "Target Support Files/Pods-Drink-O-MaticUITests/Pods-Drink-O-MaticUITests.debug.xcconfig"; sourceTree = ""; }; + D316EDD25E531DA09364BD3A /* Pods-Drink-O-MaticUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Drink-O-MaticUITests.release.xcconfig"; path = "Target Support Files/Pods-Drink-O-MaticUITests/Pods-Drink-O-MaticUITests.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 28AC15FB22F352E300534A96 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 15A3905F5B905C60D99161C6 /* Pods_Drink_O_Matic.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 28AC160F22F352E500534A96 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E1F05E0F067030F4E49E19F0 /* Pods_Drink_O_MaticTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 28AC161A22F352E500534A96 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B4F4B24AE5A1254861A61C70 /* Pods_Drink_O_MaticUITests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 28AC15F522F352E300534A96 = { + isa = PBXGroup; + children = ( + 28AC160022F352E300534A96 /* Drink-O-Matic */, + 28AC161522F352E500534A96 /* Drink-O-MaticTests */, + 28AC162022F352E500534A96 /* Drink-O-MaticUITests */, + 28AC15FF22F352E300534A96 /* Products */, + E6D245425B6C1A5A69858807 /* Pods */, + F4F8D8FBF3D1A81A6FF00C5A /* Frameworks */, + ); + sourceTree = ""; + }; + 28AC15FF22F352E300534A96 /* Products */ = { + isa = PBXGroup; + children = ( + 28AC15FE22F352E300534A96 /* Drink-O-Matic.app */, + 28AC161222F352E500534A96 /* Drink-O-MaticTests.xctest */, + 28AC161D22F352E500534A96 /* Drink-O-MaticUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 28AC160022F352E300534A96 /* Drink-O-Matic */ = { + isa = PBXGroup; + children = ( + 28AC160122F352E300534A96 /* AppDelegate.swift */, + 28AC160322F352E300534A96 /* ViewController.swift */, + 28AC160522F352E300534A96 /* Main.storyboard */, + 28AC160822F352E500534A96 /* Assets.xcassets */, + 28AC160A22F352E500534A96 /* LaunchScreen.storyboard */, + 28AC160D22F352E500534A96 /* Info.plist */, + ); + path = "Drink-O-Matic"; + sourceTree = ""; + }; + 28AC161522F352E500534A96 /* Drink-O-MaticTests */ = { + isa = PBXGroup; + children = ( + 28AC161622F352E500534A96 /* Drink_O_MaticTests.swift */, + 28AC161822F352E500534A96 /* Info.plist */, + ); + path = "Drink-O-MaticTests"; + sourceTree = ""; + }; + 28AC162022F352E500534A96 /* Drink-O-MaticUITests */ = { + isa = PBXGroup; + children = ( + 28AC162122F352E500534A96 /* Drink_O_MaticUITests.swift */, + 28AC162322F352E500534A96 /* Info.plist */, + ); + path = "Drink-O-MaticUITests"; + sourceTree = ""; + }; + E6D245425B6C1A5A69858807 /* Pods */ = { + isa = PBXGroup; + children = ( + 3FB58FBF10A2F913A03F21D9 /* Pods-Drink-O-Matic.debug.xcconfig */, + 4E14FE35F6EF15E3794D1139 /* Pods-Drink-O-Matic.release.xcconfig */, + B07EFC6918A357A1E45FD335 /* Pods-Drink-O-MaticTests.debug.xcconfig */, + 85C720A72337B4F217A1742F /* Pods-Drink-O-MaticTests.release.xcconfig */, + C691AAB6153BB3F6B3F4CE6B /* Pods-Drink-O-MaticUITests.debug.xcconfig */, + D316EDD25E531DA09364BD3A /* Pods-Drink-O-MaticUITests.release.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + F4F8D8FBF3D1A81A6FF00C5A /* Frameworks */ = { + isa = PBXGroup; + children = ( + 722FDDB2D778BBFDFD776D0E /* Pods_Drink_O_Matic.framework */, + 8AF8414AB55563959CDBEA16 /* Pods_Drink_O_MaticTests.framework */, + 3C51183A47160CDDC05CA9F1 /* Pods_Drink_O_MaticUITests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 28AC15FD22F352E300534A96 /* Drink-O-Matic */ = { + isa = PBXNativeTarget; + buildConfigurationList = 28AC162622F352E500534A96 /* Build configuration list for PBXNativeTarget "Drink-O-Matic" */; + buildPhases = ( + 73BDAA272CB8048DC90C66D3 /* [CP] Check Pods Manifest.lock */, + 28AC15FA22F352E300534A96 /* Sources */, + 28AC15FB22F352E300534A96 /* Frameworks */, + 28AC15FC22F352E300534A96 /* Resources */, + 72CC0B3C96BA913907982921 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Drink-O-Matic"; + productName = "Drink-O-Matic"; + productReference = 28AC15FE22F352E300534A96 /* Drink-O-Matic.app */; + productType = "com.apple.product-type.application"; + }; + 28AC161122F352E500534A96 /* Drink-O-MaticTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 28AC162922F352E500534A96 /* Build configuration list for PBXNativeTarget "Drink-O-MaticTests" */; + buildPhases = ( + 6E4B5B7111BF089F9F0AE92E /* [CP] Check Pods Manifest.lock */, + 28AC160E22F352E500534A96 /* Sources */, + 28AC160F22F352E500534A96 /* Frameworks */, + 28AC161022F352E500534A96 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 28AC161422F352E500534A96 /* PBXTargetDependency */, + ); + name = "Drink-O-MaticTests"; + productName = "Drink-O-MaticTests"; + productReference = 28AC161222F352E500534A96 /* Drink-O-MaticTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 28AC161C22F352E500534A96 /* Drink-O-MaticUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 28AC162C22F352E500534A96 /* Build configuration list for PBXNativeTarget "Drink-O-MaticUITests" */; + buildPhases = ( + 78C9AE30C4FB79752315BF9E /* [CP] Check Pods Manifest.lock */, + 28AC161922F352E500534A96 /* Sources */, + 28AC161A22F352E500534A96 /* Frameworks */, + 28AC161B22F352E500534A96 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 28AC161F22F352E500534A96 /* PBXTargetDependency */, + ); + name = "Drink-O-MaticUITests"; + productName = "Drink-O-MaticUITests"; + productReference = 28AC161D22F352E500534A96 /* Drink-O-MaticUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 28AC15F622F352E300534A96 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1020; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Ramiro Coll Doñetz"; + TargetAttributes = { + 28AC15FD22F352E300534A96 = { + CreatedOnToolsVersion = 10.2.1; + }; + 28AC161122F352E500534A96 = { + CreatedOnToolsVersion = 10.2.1; + TestTargetID = 28AC15FD22F352E300534A96; + }; + 28AC161C22F352E500534A96 = { + CreatedOnToolsVersion = 10.2.1; + TestTargetID = 28AC15FD22F352E300534A96; + }; + }; + }; + buildConfigurationList = 28AC15F922F352E300534A96 /* Build configuration list for PBXProject "Drink-O-Matic" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 28AC15F522F352E300534A96; + productRefGroup = 28AC15FF22F352E300534A96 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 28AC15FD22F352E300534A96 /* Drink-O-Matic */, + 28AC161122F352E500534A96 /* Drink-O-MaticTests */, + 28AC161C22F352E500534A96 /* Drink-O-MaticUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 28AC15FC22F352E300534A96 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 28AC160C22F352E500534A96 /* LaunchScreen.storyboard in Resources */, + 28AC160922F352E500534A96 /* Assets.xcassets in Resources */, + 28AC160722F352E300534A96 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 28AC161022F352E500534A96 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 28AC161B22F352E500534A96 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 6E4B5B7111BF089F9F0AE92E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Drink-O-MaticTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 72CC0B3C96BA913907982921 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Drink-O-Matic/Pods-Drink-O-Matic-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Drink-O-Matic/Pods-Drink-O-Matic-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Drink-O-Matic/Pods-Drink-O-Matic-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 73BDAA272CB8048DC90C66D3 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Drink-O-Matic-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 78C9AE30C4FB79752315BF9E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Drink-O-MaticUITests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 28AC15FA22F352E300534A96 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 28AC160422F352E300534A96 /* ViewController.swift in Sources */, + 28AC160222F352E300534A96 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 28AC160E22F352E500534A96 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 28AC161722F352E500534A96 /* Drink_O_MaticTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 28AC161922F352E500534A96 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 28AC162222F352E500534A96 /* Drink_O_MaticUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 28AC161422F352E500534A96 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 28AC15FD22F352E300534A96 /* Drink-O-Matic */; + targetProxy = 28AC161322F352E500534A96 /* PBXContainerItemProxy */; + }; + 28AC161F22F352E500534A96 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 28AC15FD22F352E300534A96 /* Drink-O-Matic */; + targetProxy = 28AC161E22F352E500534A96 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 28AC160522F352E300534A96 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 28AC160622F352E300534A96 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 28AC160A22F352E500534A96 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 28AC160B22F352E500534A96 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 28AC162422F352E500534A96 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_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_IMPLICIT_RETAIN_SELF = 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 = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 28AC162522F352E500534A96 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_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_IMPLICIT_RETAIN_SELF = 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 = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 28AC162722F352E500534A96 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3FB58FBF10A2F913A03F21D9 /* Pods-Drink-O-Matic.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 3JEJ7T2FN9; + INFOPLIST_FILE = "Drink-O-Matic/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.codetest.Drink-O-Matic"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 28AC162822F352E500534A96 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4E14FE35F6EF15E3794D1139 /* Pods-Drink-O-Matic.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 3JEJ7T2FN9; + INFOPLIST_FILE = "Drink-O-Matic/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.codetest.Drink-O-Matic"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 28AC162A22F352E500534A96 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B07EFC6918A357A1E45FD335 /* Pods-Drink-O-MaticTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 3JEJ7T2FN9; + INFOPLIST_FILE = "Drink-O-MaticTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.codetest.Drink-O-MaticTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Drink-O-Matic.app/Drink-O-Matic"; + }; + name = Debug; + }; + 28AC162B22F352E500534A96 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 85C720A72337B4F217A1742F /* Pods-Drink-O-MaticTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 3JEJ7T2FN9; + INFOPLIST_FILE = "Drink-O-MaticTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.codetest.Drink-O-MaticTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Drink-O-Matic.app/Drink-O-Matic"; + }; + name = Release; + }; + 28AC162D22F352E500534A96 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C691AAB6153BB3F6B3F4CE6B /* Pods-Drink-O-MaticUITests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 3JEJ7T2FN9; + INFOPLIST_FILE = "Drink-O-MaticUITests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.codetest.Drink-O-MaticUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "Drink-O-Matic"; + }; + name = Debug; + }; + 28AC162E22F352E500534A96 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D316EDD25E531DA09364BD3A /* Pods-Drink-O-MaticUITests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 3JEJ7T2FN9; + INFOPLIST_FILE = "Drink-O-MaticUITests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.codetest.Drink-O-MaticUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "Drink-O-Matic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 28AC15F922F352E300534A96 /* Build configuration list for PBXProject "Drink-O-Matic" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 28AC162422F352E500534A96 /* Debug */, + 28AC162522F352E500534A96 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 28AC162622F352E500534A96 /* Build configuration list for PBXNativeTarget "Drink-O-Matic" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 28AC162722F352E500534A96 /* Debug */, + 28AC162822F352E500534A96 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 28AC162922F352E500534A96 /* Build configuration list for PBXNativeTarget "Drink-O-MaticTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 28AC162A22F352E500534A96 /* Debug */, + 28AC162B22F352E500534A96 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 28AC162C22F352E500534A96 /* Build configuration list for PBXNativeTarget "Drink-O-MaticUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 28AC162D22F352E500534A96 /* Debug */, + 28AC162E22F352E500534A96 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 28AC15F622F352E300534A96 /* Project object */; +} diff --git a/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..be29cd054 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Drink-O-Matic/Drink-O-Matic.xcworkspace/contents.xcworkspacedata b/Drink-O-Matic/Drink-O-Matic.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..3b781b54e --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Drink-O-Matic/Drink-O-Matic.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Drink-O-Matic/Drink-O-Matic.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Drink-O-Matic/Drink-O-Matic/AppDelegate.swift b/Drink-O-Matic/Drink-O-Matic/AppDelegate.swift new file mode 100644 index 000000000..c2a36af8a --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// Drink-O-Matic +// +// Created by Ramiro Coll Doñetz on 01/08/2019. +// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Drink-O-Matic/Drink-O-Matic/Assets.xcassets/AppIcon.appiconset/Contents.json b/Drink-O-Matic/Drink-O-Matic/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d8db8d65f --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Drink-O-Matic/Drink-O-Matic/Assets.xcassets/Contents.json b/Drink-O-Matic/Drink-O-Matic/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Drink-O-Matic/Drink-O-Matic/Base.lproj/LaunchScreen.storyboard b/Drink-O-Matic/Drink-O-Matic/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..bfa361294 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Drink-O-Matic/Drink-O-Matic/Base.lproj/Main.storyboard b/Drink-O-Matic/Drink-O-Matic/Base.lproj/Main.storyboard new file mode 100644 index 000000000..f1bcf3840 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Drink-O-Matic/Drink-O-Matic/Info.plist b/Drink-O-Matic/Drink-O-Matic/Info.plist new file mode 100644 index 000000000..16be3b681 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Drink-O-Matic/Drink-O-Matic/ViewController.swift b/Drink-O-Matic/Drink-O-Matic/ViewController.swift new file mode 100644 index 000000000..f8a23f7d9 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/ViewController.swift @@ -0,0 +1,20 @@ +// +// ViewController.swift +// Drink-O-Matic +// +// Created by Ramiro Coll Doñetz on 01/08/2019. +// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + } + + +} + diff --git a/Drink-O-Matic/Drink-O-MaticTests/Drink_O_MaticTests.swift b/Drink-O-Matic/Drink-O-MaticTests/Drink_O_MaticTests.swift new file mode 100644 index 000000000..fbf0a5e33 --- /dev/null +++ b/Drink-O-Matic/Drink-O-MaticTests/Drink_O_MaticTests.swift @@ -0,0 +1,34 @@ +// +// Drink_O_MaticTests.swift +// Drink-O-MaticTests +// +// Created by Ramiro Coll Doñetz on 01/08/2019. +// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. +// + +import XCTest +@testable import Drink_O_Matic + +class Drink_O_MaticTests: XCTestCase { + + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Drink-O-Matic/Drink-O-MaticTests/Info.plist b/Drink-O-Matic/Drink-O-MaticTests/Info.plist new file mode 100644 index 000000000..6c40a6cd0 --- /dev/null +++ b/Drink-O-Matic/Drink-O-MaticTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Drink-O-Matic/Drink-O-MaticUITests/Drink_O_MaticUITests.swift b/Drink-O-Matic/Drink-O-MaticUITests/Drink_O_MaticUITests.swift new file mode 100644 index 000000000..111c725f9 --- /dev/null +++ b/Drink-O-Matic/Drink-O-MaticUITests/Drink_O_MaticUITests.swift @@ -0,0 +1,34 @@ +// +// Drink_O_MaticUITests.swift +// Drink-O-MaticUITests +// +// Created by Ramiro Coll Doñetz on 01/08/2019. +// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. +// + +import XCTest + +class Drink_O_MaticUITests: XCTestCase { + + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/Drink-O-Matic/Drink-O-MaticUITests/Info.plist b/Drink-O-Matic/Drink-O-MaticUITests/Info.plist new file mode 100644 index 000000000..6c40a6cd0 --- /dev/null +++ b/Drink-O-Matic/Drink-O-MaticUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Drink-O-Matic/Podfile b/Drink-O-Matic/Podfile new file mode 100644 index 000000000..41848f2cd --- /dev/null +++ b/Drink-O-Matic/Podfile @@ -0,0 +1,23 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'Drink-O-Matic' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for Drink-O-Matic + + pod 'Alamofire', '~> 5.0.0-beta.5' + pod 'SDWebImage', '~> 5.0' + + target 'Drink-O-MaticTests' do + inherit! :search_paths + # Pods for testing + end + + target 'Drink-O-MaticUITests' do + inherit! :search_paths + # Pods for testing + end + +end diff --git a/Drink-O-Matic/Podfile.lock b/Drink-O-Matic/Podfile.lock new file mode 100644 index 000000000..79bf05f51 --- /dev/null +++ b/Drink-O-Matic/Podfile.lock @@ -0,0 +1,22 @@ +PODS: + - Alamofire (5.0.0-beta.7) + - SDWebImage (5.0.6): + - SDWebImage/Core (= 5.0.6) + - SDWebImage/Core (5.0.6) + +DEPENDENCIES: + - Alamofire (~> 5.0.0-beta.5) + - SDWebImage (~> 5.0) + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Alamofire + - SDWebImage + +SPEC CHECKSUMS: + Alamofire: bd07938ceecad59d2492aeecb1f785a8f2721160 + SDWebImage: 920f1a2ff1ca8296ad34f6e0510a1ef1d70ac965 + +PODFILE CHECKSUM: 5e18ca987c770749227fcaff2bd21048e155b54f + +COCOAPODS: 1.7.5 From b367968ce5418a52195a5b13505ed377521a3ef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ramiro=20Coll=20Don=CC=83etz?= Date: Tue, 6 Aug 2019 12:36:42 -0300 Subject: [PATCH 2/3] Finished code-test v1 --- .../Drink-O-Matic.xcodeproj/project.pbxproj | 269 +++++++++++++++- .../Drink-O-Matic/APIClient/APIClient.swift | 45 +++ .../Drink-O-Matic/APIClient/APIRouter.swift | 99 ++++++ .../{ => Application}/AppDelegate.swift | 0 .../Drink-O-Matic/Base.lproj/Main.storyboard | 24 -- .../Drink-O-Matic/Models/Drink.swift | 34 +++ .../Drink-O-Matic/Models/DrinkDetails.swift | 32 ++ .../AppIcon.appiconset/Contents.json | 58 ++-- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 734 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1863 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 3107 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1196 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 2973 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 5027 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1863 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 4473 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 7354 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 7354 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 13024 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 4167 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 10286 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 11737 bytes .../AppIcon.appiconset/ItunesArtwork@2x.png | Bin 0 -> 167629 bytes .../Assets.xcassets/Contents.json | 0 .../noInternetIcon.imageset/Contents.json | 21 ++ .../noInternetIcon.imageset/no-wifi.png | Bin 0 -> 17476 bytes .../Drink-O-Matic/Resources/Constants.swift | 43 +++ .../Base.lproj/LaunchScreen.storyboard | 0 .../Storyboards/Base.lproj/Main.storyboard | 202 ++++++++++++ .../{ => Supporting Files}/Info.plist | 0 .../CardPresentationController.swift | 57 ++++ .../Transition/CardTransition.swift | 54 ++++ .../Transition/DismissCardAnimator.swift | 130 ++++++++ .../Transition/PresentCardAnimator.swift | 220 +++++++++++++ .../Drink-O-Matic/Utils/GlobalConstants.swift | 41 +++ .../Drink-O-Matic/Utils/GradientView.swift | 110 +++++++ .../Drink-O-Matic/Utils/NibLoadable.swift | 29 ++ .../Utils/StatusBarAnimatable.swift | 107 +++++++ .../StatusBarAnimatableViewController.swift | 83 +++++ .../Utils/UIView+AutoLayout.swift | 40 +++ .../Drink-O-Matic/ViewController.swift | 20 -- .../CardDetailViewController.swift | 288 ++++++++++++++++++ .../ViewControllers/HomeViewController.swift | 259 ++++++++++++++++ .../Views/CardCollectionViewCell.swift | 81 +++++ .../Views/CardCollectionViewCell.xib | 45 +++ .../Drink-O-Matic/Views/CardContentView.swift | 124 ++++++++ .../Drink-O-Matic/Views/CardContentView.xib | 122 ++++++++ 47 files changed, 2563 insertions(+), 74 deletions(-) create mode 100644 Drink-O-Matic/Drink-O-Matic/APIClient/APIClient.swift create mode 100644 Drink-O-Matic/Drink-O-Matic/APIClient/APIRouter.swift rename Drink-O-Matic/Drink-O-Matic/{ => Application}/AppDelegate.swift (100%) delete mode 100644 Drink-O-Matic/Drink-O-Matic/Base.lproj/Main.storyboard create mode 100644 Drink-O-Matic/Drink-O-Matic/Models/Drink.swift create mode 100644 Drink-O-Matic/Drink-O-Matic/Models/DrinkDetails.swift rename Drink-O-Matic/Drink-O-Matic/{ => Resources}/Assets.xcassets/AppIcon.appiconset/Contents.json (63%) mode change 100644 => 100755 create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png rename Drink-O-Matic/Drink-O-Matic/{ => Resources}/Assets.xcassets/Contents.json (100%) create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/noInternetIcon.imageset/Contents.json create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/noInternetIcon.imageset/no-wifi.png create mode 100644 Drink-O-Matic/Drink-O-Matic/Resources/Constants.swift rename Drink-O-Matic/Drink-O-Matic/{ => Storyboards}/Base.lproj/LaunchScreen.storyboard (100%) create mode 100644 Drink-O-Matic/Drink-O-Matic/Storyboards/Base.lproj/Main.storyboard rename Drink-O-Matic/Drink-O-Matic/{ => Supporting Files}/Info.plist (100%) create mode 100755 Drink-O-Matic/Drink-O-Matic/Transition/CardPresentationController.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Transition/CardTransition.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Transition/DismissCardAnimator.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Transition/PresentCardAnimator.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Utils/GlobalConstants.swift create mode 100644 Drink-O-Matic/Drink-O-Matic/Utils/GradientView.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Utils/NibLoadable.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Utils/StatusBarAnimatable.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Utils/StatusBarAnimatableViewController.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Utils/UIView+AutoLayout.swift delete mode 100644 Drink-O-Matic/Drink-O-Matic/ViewController.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/ViewControllers/CardDetailViewController.swift create mode 100644 Drink-O-Matic/Drink-O-Matic/ViewControllers/HomeViewController.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Views/CardCollectionViewCell.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Views/CardCollectionViewCell.xib create mode 100755 Drink-O-Matic/Drink-O-Matic/Views/CardContentView.swift create mode 100755 Drink-O-Matic/Drink-O-Matic/Views/CardContentView.xib diff --git a/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.pbxproj b/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.pbxproj index 10a7d5081..425e9bb7b 100644 --- a/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.pbxproj +++ b/Drink-O-Matic/Drink-O-Matic.xcodeproj/project.pbxproj @@ -3,18 +3,78 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ 15A3905F5B905C60D99161C6 /* Pods_Drink_O_Matic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 722FDDB2D778BBFDFD776D0E /* Pods_Drink_O_Matic.framework */; }; 28AC160222F352E300534A96 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC160122F352E300534A96 /* AppDelegate.swift */; }; - 28AC160422F352E300534A96 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC160322F352E300534A96 /* ViewController.swift */; }; + 28AC160422F352E300534A96 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC160322F352E300534A96 /* HomeViewController.swift */; }; 28AC160722F352E300534A96 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 28AC160522F352E300534A96 /* Main.storyboard */; }; 28AC160922F352E500534A96 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 28AC160822F352E500534A96 /* Assets.xcassets */; }; 28AC160C22F352E500534A96 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 28AC160A22F352E500534A96 /* LaunchScreen.storyboard */; }; 28AC161722F352E500534A96 /* Drink_O_MaticTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC161622F352E500534A96 /* Drink_O_MaticTests.swift */; }; 28AC162222F352E500534A96 /* Drink_O_MaticUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AC162122F352E500534A96 /* Drink_O_MaticUITests.swift */; }; + 28EFF4B922F3958400608AD3 /* APIRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4B822F3958400608AD3 /* APIRouter.swift */; }; + 28EFF4BA22F3958400608AD3 /* APIRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4B822F3958400608AD3 /* APIRouter.swift */; }; + 28EFF4BB22F3958400608AD3 /* APIRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4B822F3958400608AD3 /* APIRouter.swift */; }; + 28EFF4BD22F3959100608AD3 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4BC22F3959100608AD3 /* APIClient.swift */; }; + 28EFF4BE22F3959100608AD3 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4BC22F3959100608AD3 /* APIClient.swift */; }; + 28EFF4BF22F3959100608AD3 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4BC22F3959100608AD3 /* APIClient.swift */; }; + 28EFF4C122F3972900608AD3 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4C022F3972900608AD3 /* Constants.swift */; }; + 28EFF4C222F3972900608AD3 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4C022F3972900608AD3 /* Constants.swift */; }; + 28EFF4C322F3972900608AD3 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4C022F3972900608AD3 /* Constants.swift */; }; + 28EFF4C522F3994B00608AD3 /* Drink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4C422F3994B00608AD3 /* Drink.swift */; }; + 28EFF4C622F3994B00608AD3 /* Drink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4C422F3994B00608AD3 /* Drink.swift */; }; + 28EFF4C722F3994B00608AD3 /* Drink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4C422F3994B00608AD3 /* Drink.swift */; }; + 28EFF4C922F39FD900608AD3 /* DrinkDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4C822F39FD900608AD3 /* DrinkDetails.swift */; }; + 28EFF4CA22F39FD900608AD3 /* DrinkDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4C822F39FD900608AD3 /* DrinkDetails.swift */; }; + 28EFF4CB22F39FD900608AD3 /* DrinkDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4C822F39FD900608AD3 /* DrinkDetails.swift */; }; + 28EFF4D222F49E4C00608AD3 /* CardContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4CD22F49E4C00608AD3 /* CardContentView.swift */; }; + 28EFF4D322F49E4C00608AD3 /* CardContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4CD22F49E4C00608AD3 /* CardContentView.swift */; }; + 28EFF4D422F49E4C00608AD3 /* CardContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4CD22F49E4C00608AD3 /* CardContentView.swift */; }; + 28EFF4D522F49E4C00608AD3 /* CardContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28EFF4CE22F49E4C00608AD3 /* CardContentView.xib */; }; + 28EFF4D622F49E4C00608AD3 /* CardContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28EFF4CE22F49E4C00608AD3 /* CardContentView.xib */; }; + 28EFF4D722F49E4C00608AD3 /* CardContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28EFF4CE22F49E4C00608AD3 /* CardContentView.xib */; }; + 28EFF4DB22F49E4C00608AD3 /* CardCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4D022F49E4C00608AD3 /* CardCollectionViewCell.swift */; }; + 28EFF4DC22F49E4C00608AD3 /* CardCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4D022F49E4C00608AD3 /* CardCollectionViewCell.swift */; }; + 28EFF4DD22F49E4C00608AD3 /* CardCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4D022F49E4C00608AD3 /* CardCollectionViewCell.swift */; }; + 28EFF4DE22F49E4C00608AD3 /* CardCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28EFF4D122F49E4C00608AD3 /* CardCollectionViewCell.xib */; }; + 28EFF4DF22F49E4C00608AD3 /* CardCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28EFF4D122F49E4C00608AD3 /* CardCollectionViewCell.xib */; }; + 28EFF4E022F49E4C00608AD3 /* CardCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28EFF4D122F49E4C00608AD3 /* CardCollectionViewCell.xib */; }; + 28EFF4E922F49E8900608AD3 /* GlobalConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E222F49E8900608AD3 /* GlobalConstants.swift */; }; + 28EFF4EA22F49E8900608AD3 /* GlobalConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E222F49E8900608AD3 /* GlobalConstants.swift */; }; + 28EFF4EB22F49E8900608AD3 /* GlobalConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E222F49E8900608AD3 /* GlobalConstants.swift */; }; + 28EFF4EC22F49E8900608AD3 /* StatusBarAnimatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E322F49E8900608AD3 /* StatusBarAnimatable.swift */; }; + 28EFF4ED22F49E8900608AD3 /* StatusBarAnimatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E322F49E8900608AD3 /* StatusBarAnimatable.swift */; }; + 28EFF4EE22F49E8900608AD3 /* StatusBarAnimatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E322F49E8900608AD3 /* StatusBarAnimatable.swift */; }; + 28EFF4EF22F49E8900608AD3 /* UIView+AutoLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E422F49E8900608AD3 /* UIView+AutoLayout.swift */; }; + 28EFF4F022F49E8900608AD3 /* UIView+AutoLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E422F49E8900608AD3 /* UIView+AutoLayout.swift */; }; + 28EFF4F122F49E8900608AD3 /* UIView+AutoLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E422F49E8900608AD3 /* UIView+AutoLayout.swift */; }; + 28EFF4F222F49E8900608AD3 /* NibLoadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E522F49E8900608AD3 /* NibLoadable.swift */; }; + 28EFF4F322F49E8900608AD3 /* NibLoadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E522F49E8900608AD3 /* NibLoadable.swift */; }; + 28EFF4F422F49E8900608AD3 /* NibLoadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E522F49E8900608AD3 /* NibLoadable.swift */; }; + 28EFF4FB22F49E8900608AD3 /* StatusBarAnimatableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E822F49E8900608AD3 /* StatusBarAnimatableViewController.swift */; }; + 28EFF4FC22F49E8900608AD3 /* StatusBarAnimatableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E822F49E8900608AD3 /* StatusBarAnimatableViewController.swift */; }; + 28EFF4FD22F49E8900608AD3 /* StatusBarAnimatableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF4E822F49E8900608AD3 /* StatusBarAnimatableViewController.swift */; }; + 28EFF50B22F49EA400608AD3 /* CardDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF50A22F49EA400608AD3 /* CardDetailViewController.swift */; }; + 28EFF50C22F49EA400608AD3 /* CardDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF50A22F49EA400608AD3 /* CardDetailViewController.swift */; }; + 28EFF50D22F49EA400608AD3 /* CardDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF50A22F49EA400608AD3 /* CardDetailViewController.swift */; }; + 28EFF51322F49ECA00608AD3 /* DismissCardAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF50F22F49ECA00608AD3 /* DismissCardAnimator.swift */; }; + 28EFF51422F49ECA00608AD3 /* DismissCardAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF50F22F49ECA00608AD3 /* DismissCardAnimator.swift */; }; + 28EFF51522F49ECA00608AD3 /* DismissCardAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF50F22F49ECA00608AD3 /* DismissCardAnimator.swift */; }; + 28EFF51622F49ECA00608AD3 /* CardTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51022F49ECA00608AD3 /* CardTransition.swift */; }; + 28EFF51722F49ECA00608AD3 /* CardTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51022F49ECA00608AD3 /* CardTransition.swift */; }; + 28EFF51822F49ECA00608AD3 /* CardTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51022F49ECA00608AD3 /* CardTransition.swift */; }; + 28EFF51922F49ECA00608AD3 /* CardPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51122F49ECA00608AD3 /* CardPresentationController.swift */; }; + 28EFF51A22F49ECA00608AD3 /* CardPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51122F49ECA00608AD3 /* CardPresentationController.swift */; }; + 28EFF51B22F49ECA00608AD3 /* CardPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51122F49ECA00608AD3 /* CardPresentationController.swift */; }; + 28EFF51C22F49ECA00608AD3 /* PresentCardAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51222F49ECA00608AD3 /* PresentCardAnimator.swift */; }; + 28EFF51D22F49ECA00608AD3 /* PresentCardAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51222F49ECA00608AD3 /* PresentCardAnimator.swift */; }; + 28EFF51E22F49ECA00608AD3 /* PresentCardAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51222F49ECA00608AD3 /* PresentCardAnimator.swift */; }; + 28EFF52022F76F5400608AD3 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51F22F76F5400608AD3 /* GradientView.swift */; }; + 28EFF52122F76F5400608AD3 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51F22F76F5400608AD3 /* GradientView.swift */; }; + 28EFF52222F76F5400608AD3 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFF51F22F76F5400608AD3 /* GradientView.swift */; }; B4F4B24AE5A1254861A61C70 /* Pods_Drink_O_MaticUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C51183A47160CDDC05CA9F1 /* Pods_Drink_O_MaticUITests.framework */; }; E1F05E0F067030F4E49E19F0 /* Pods_Drink_O_MaticTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AF8414AB55563959CDBEA16 /* Pods_Drink_O_MaticTests.framework */; }; /* End PBXBuildFile section */ @@ -39,7 +99,7 @@ /* Begin PBXFileReference section */ 28AC15FE22F352E300534A96 /* Drink-O-Matic.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Drink-O-Matic.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 28AC160122F352E300534A96 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 28AC160322F352E300534A96 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 28AC160322F352E300534A96 /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; 28AC160622F352E300534A96 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 28AC160822F352E500534A96 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 28AC160B22F352E500534A96 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -50,6 +110,26 @@ 28AC161D22F352E500534A96 /* Drink-O-MaticUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Drink-O-MaticUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 28AC162122F352E500534A96 /* Drink_O_MaticUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Drink_O_MaticUITests.swift; sourceTree = ""; }; 28AC162322F352E500534A96 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 28EFF4B822F3958400608AD3 /* APIRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRouter.swift; sourceTree = ""; }; + 28EFF4BC22F3959100608AD3 /* APIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIClient.swift; sourceTree = ""; }; + 28EFF4C022F3972900608AD3 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 28EFF4C422F3994B00608AD3 /* Drink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Drink.swift; sourceTree = ""; }; + 28EFF4C822F39FD900608AD3 /* DrinkDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrinkDetails.swift; sourceTree = ""; }; + 28EFF4CD22F49E4C00608AD3 /* CardContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardContentView.swift; sourceTree = ""; }; + 28EFF4CE22F49E4C00608AD3 /* CardContentView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CardContentView.xib; sourceTree = ""; }; + 28EFF4D022F49E4C00608AD3 /* CardCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardCollectionViewCell.swift; sourceTree = ""; }; + 28EFF4D122F49E4C00608AD3 /* CardCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CardCollectionViewCell.xib; sourceTree = ""; }; + 28EFF4E222F49E8900608AD3 /* GlobalConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlobalConstants.swift; sourceTree = ""; }; + 28EFF4E322F49E8900608AD3 /* StatusBarAnimatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarAnimatable.swift; sourceTree = ""; }; + 28EFF4E422F49E8900608AD3 /* UIView+AutoLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+AutoLayout.swift"; sourceTree = ""; }; + 28EFF4E522F49E8900608AD3 /* NibLoadable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NibLoadable.swift; sourceTree = ""; }; + 28EFF4E822F49E8900608AD3 /* StatusBarAnimatableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarAnimatableViewController.swift; sourceTree = ""; }; + 28EFF50A22F49EA400608AD3 /* CardDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardDetailViewController.swift; sourceTree = ""; }; + 28EFF50F22F49ECA00608AD3 /* DismissCardAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DismissCardAnimator.swift; sourceTree = ""; }; + 28EFF51022F49ECA00608AD3 /* CardTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardTransition.swift; sourceTree = ""; }; + 28EFF51122F49ECA00608AD3 /* CardPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardPresentationController.swift; sourceTree = ""; }; + 28EFF51222F49ECA00608AD3 /* PresentCardAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PresentCardAnimator.swift; sourceTree = ""; }; + 28EFF51F22F76F5400608AD3 /* GradientView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = ""; }; 3C51183A47160CDDC05CA9F1 /* Pods_Drink_O_MaticUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Drink_O_MaticUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3FB58FBF10A2F913A03F21D9 /* Pods-Drink-O-Matic.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Drink-O-Matic.debug.xcconfig"; path = "Target Support Files/Pods-Drink-O-Matic/Pods-Drink-O-Matic.debug.xcconfig"; sourceTree = ""; }; 4E14FE35F6EF15E3794D1139 /* Pods-Drink-O-Matic.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Drink-O-Matic.release.xcconfig"; path = "Target Support Files/Pods-Drink-O-Matic/Pods-Drink-O-Matic.release.xcconfig"; sourceTree = ""; }; @@ -114,12 +194,16 @@ 28AC160022F352E300534A96 /* Drink-O-Matic */ = { isa = PBXGroup; children = ( - 28AC160122F352E300534A96 /* AppDelegate.swift */, - 28AC160322F352E300534A96 /* ViewController.swift */, - 28AC160522F352E300534A96 /* Main.storyboard */, - 28AC160822F352E500534A96 /* Assets.xcassets */, - 28AC160A22F352E500534A96 /* LaunchScreen.storyboard */, - 28AC160D22F352E500534A96 /* Info.plist */, + 28EFF50E22F49EC000608AD3 /* Transition */, + 28EFF4E122F49E7C00608AD3 /* Utils */, + 28EFF4CC22F49E3B00608AD3 /* Views */, + 28EFF4B222F394FB00608AD3 /* APIClient */, + 28EFF4B122F394EE00608AD3 /* Models */, + 28EFF4B322F3950F00608AD3 /* Application */, + 28EFF4B422F3951700608AD3 /* ViewControllers */, + 28EFF4B622F3953C00608AD3 /* Resources */, + 28EFF4B722F3954700608AD3 /* Storyboards */, + 28EFF4B522F3952500608AD3 /* Supporting Files */, ); path = "Drink-O-Matic"; sourceTree = ""; @@ -142,6 +226,102 @@ path = "Drink-O-MaticUITests"; sourceTree = ""; }; + 28EFF4B122F394EE00608AD3 /* Models */ = { + isa = PBXGroup; + children = ( + 28EFF4C422F3994B00608AD3 /* Drink.swift */, + 28EFF4C822F39FD900608AD3 /* DrinkDetails.swift */, + ); + path = Models; + sourceTree = ""; + }; + 28EFF4B222F394FB00608AD3 /* APIClient */ = { + isa = PBXGroup; + children = ( + 28EFF4B822F3958400608AD3 /* APIRouter.swift */, + 28EFF4BC22F3959100608AD3 /* APIClient.swift */, + ); + path = APIClient; + sourceTree = ""; + }; + 28EFF4B322F3950F00608AD3 /* Application */ = { + isa = PBXGroup; + children = ( + 28AC160122F352E300534A96 /* AppDelegate.swift */, + ); + path = Application; + sourceTree = ""; + }; + 28EFF4B422F3951700608AD3 /* ViewControllers */ = { + isa = PBXGroup; + children = ( + 28EFF50A22F49EA400608AD3 /* CardDetailViewController.swift */, + 28AC160322F352E300534A96 /* HomeViewController.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; + 28EFF4B522F3952500608AD3 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 28AC160D22F352E500534A96 /* Info.plist */, + ); + path = "Supporting Files"; + sourceTree = ""; + }; + 28EFF4B622F3953C00608AD3 /* Resources */ = { + isa = PBXGroup; + children = ( + 28AC160822F352E500534A96 /* Assets.xcassets */, + 28EFF4C022F3972900608AD3 /* Constants.swift */, + ); + path = Resources; + sourceTree = ""; + }; + 28EFF4B722F3954700608AD3 /* Storyboards */ = { + isa = PBXGroup; + children = ( + 28AC160522F352E300534A96 /* Main.storyboard */, + 28AC160A22F352E500534A96 /* LaunchScreen.storyboard */, + ); + path = Storyboards; + sourceTree = ""; + }; + 28EFF4CC22F49E3B00608AD3 /* Views */ = { + isa = PBXGroup; + children = ( + 28EFF4CE22F49E4C00608AD3 /* CardContentView.xib */, + 28EFF4CD22F49E4C00608AD3 /* CardContentView.swift */, + 28EFF4D122F49E4C00608AD3 /* CardCollectionViewCell.xib */, + 28EFF4D022F49E4C00608AD3 /* CardCollectionViewCell.swift */, + ); + path = Views; + sourceTree = ""; + }; + 28EFF4E122F49E7C00608AD3 /* Utils */ = { + isa = PBXGroup; + children = ( + 28EFF4E522F49E8900608AD3 /* NibLoadable.swift */, + 28EFF4E422F49E8900608AD3 /* UIView+AutoLayout.swift */, + 28EFF4E222F49E8900608AD3 /* GlobalConstants.swift */, + 28EFF4E322F49E8900608AD3 /* StatusBarAnimatable.swift */, + 28EFF4E822F49E8900608AD3 /* StatusBarAnimatableViewController.swift */, + 28EFF51F22F76F5400608AD3 /* GradientView.swift */, + ); + path = Utils; + sourceTree = ""; + }; + 28EFF50E22F49EC000608AD3 /* Transition */ = { + isa = PBXGroup; + children = ( + 28EFF51122F49ECA00608AD3 /* CardPresentationController.swift */, + 28EFF51022F49ECA00608AD3 /* CardTransition.swift */, + 28EFF50F22F49ECA00608AD3 /* DismissCardAnimator.swift */, + 28EFF51222F49ECA00608AD3 /* PresentCardAnimator.swift */, + ); + path = Transition; + sourceTree = ""; + }; E6D245425B6C1A5A69858807 /* Pods */ = { isa = PBXGroup; children = ( @@ -152,7 +332,6 @@ C691AAB6153BB3F6B3F4CE6B /* Pods-Drink-O-MaticUITests.debug.xcconfig */, D316EDD25E531DA09364BD3A /* Pods-Drink-O-MaticUITests.release.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -274,6 +453,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 28EFF4D522F49E4C00608AD3 /* CardContentView.xib in Resources */, + 28EFF4DE22F49E4C00608AD3 /* CardCollectionViewCell.xib in Resources */, 28AC160C22F352E500534A96 /* LaunchScreen.storyboard in Resources */, 28AC160922F352E500534A96 /* Assets.xcassets in Resources */, 28AC160722F352E300534A96 /* Main.storyboard in Resources */, @@ -284,6 +465,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 28EFF4DF22F49E4C00608AD3 /* CardCollectionViewCell.xib in Resources */, + 28EFF4D622F49E4C00608AD3 /* CardContentView.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -291,6 +474,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 28EFF4E022F49E4C00608AD3 /* CardCollectionViewCell.xib in Resources */, + 28EFF4D722F49E4C00608AD3 /* CardContentView.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -387,8 +572,26 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 28AC160422F352E300534A96 /* ViewController.swift in Sources */, + 28EFF4D222F49E4C00608AD3 /* CardContentView.swift in Sources */, + 28EFF4C122F3972900608AD3 /* Constants.swift in Sources */, + 28EFF4EC22F49E8900608AD3 /* StatusBarAnimatable.swift in Sources */, + 28EFF51622F49ECA00608AD3 /* CardTransition.swift in Sources */, + 28AC160422F352E300534A96 /* HomeViewController.swift in Sources */, + 28EFF4B922F3958400608AD3 /* APIRouter.swift in Sources */, + 28EFF51322F49ECA00608AD3 /* DismissCardAnimator.swift in Sources */, + 28EFF4E922F49E8900608AD3 /* GlobalConstants.swift in Sources */, + 28EFF4EF22F49E8900608AD3 /* UIView+AutoLayout.swift in Sources */, + 28EFF51922F49ECA00608AD3 /* CardPresentationController.swift in Sources */, + 28EFF52022F76F5400608AD3 /* GradientView.swift in Sources */, 28AC160222F352E300534A96 /* AppDelegate.swift in Sources */, + 28EFF4F222F49E8900608AD3 /* NibLoadable.swift in Sources */, + 28EFF4C522F3994B00608AD3 /* Drink.swift in Sources */, + 28EFF50B22F49EA400608AD3 /* CardDetailViewController.swift in Sources */, + 28EFF4BD22F3959100608AD3 /* APIClient.swift in Sources */, + 28EFF51C22F49ECA00608AD3 /* PresentCardAnimator.swift in Sources */, + 28EFF4DB22F49E4C00608AD3 /* CardCollectionViewCell.swift in Sources */, + 28EFF4C922F39FD900608AD3 /* DrinkDetails.swift in Sources */, + 28EFF4FB22F49E8900608AD3 /* StatusBarAnimatableViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -397,6 +600,24 @@ buildActionMask = 2147483647; files = ( 28AC161722F352E500534A96 /* Drink_O_MaticTests.swift in Sources */, + 28EFF4F022F49E8900608AD3 /* UIView+AutoLayout.swift in Sources */, + 28EFF52122F76F5400608AD3 /* GradientView.swift in Sources */, + 28EFF51A22F49ECA00608AD3 /* CardPresentationController.swift in Sources */, + 28EFF4BA22F3958400608AD3 /* APIRouter.swift in Sources */, + 28EFF51D22F49ECA00608AD3 /* PresentCardAnimator.swift in Sources */, + 28EFF4EA22F49E8900608AD3 /* GlobalConstants.swift in Sources */, + 28EFF4BE22F3959100608AD3 /* APIClient.swift in Sources */, + 28EFF4D322F49E4C00608AD3 /* CardContentView.swift in Sources */, + 28EFF4ED22F49E8900608AD3 /* StatusBarAnimatable.swift in Sources */, + 28EFF4FC22F49E8900608AD3 /* StatusBarAnimatableViewController.swift in Sources */, + 28EFF4CA22F39FD900608AD3 /* DrinkDetails.swift in Sources */, + 28EFF4C622F3994B00608AD3 /* Drink.swift in Sources */, + 28EFF4DC22F49E4C00608AD3 /* CardCollectionViewCell.swift in Sources */, + 28EFF51422F49ECA00608AD3 /* DismissCardAnimator.swift in Sources */, + 28EFF50C22F49EA400608AD3 /* CardDetailViewController.swift in Sources */, + 28EFF4F322F49E8900608AD3 /* NibLoadable.swift in Sources */, + 28EFF4C222F3972900608AD3 /* Constants.swift in Sources */, + 28EFF51722F49ECA00608AD3 /* CardTransition.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -405,6 +626,24 @@ buildActionMask = 2147483647; files = ( 28AC162222F352E500534A96 /* Drink_O_MaticUITests.swift in Sources */, + 28EFF4F122F49E8900608AD3 /* UIView+AutoLayout.swift in Sources */, + 28EFF52222F76F5400608AD3 /* GradientView.swift in Sources */, + 28EFF51B22F49ECA00608AD3 /* CardPresentationController.swift in Sources */, + 28EFF4BB22F3958400608AD3 /* APIRouter.swift in Sources */, + 28EFF51E22F49ECA00608AD3 /* PresentCardAnimator.swift in Sources */, + 28EFF4EB22F49E8900608AD3 /* GlobalConstants.swift in Sources */, + 28EFF4BF22F3959100608AD3 /* APIClient.swift in Sources */, + 28EFF4D422F49E4C00608AD3 /* CardContentView.swift in Sources */, + 28EFF4EE22F49E8900608AD3 /* StatusBarAnimatable.swift in Sources */, + 28EFF4FD22F49E8900608AD3 /* StatusBarAnimatableViewController.swift in Sources */, + 28EFF4CB22F39FD900608AD3 /* DrinkDetails.swift in Sources */, + 28EFF4C722F3994B00608AD3 /* Drink.swift in Sources */, + 28EFF4DD22F49E4C00608AD3 /* CardCollectionViewCell.swift in Sources */, + 28EFF51522F49ECA00608AD3 /* DismissCardAnimator.swift in Sources */, + 28EFF50D22F49EA400608AD3 /* CardDetailViewController.swift in Sources */, + 28EFF4F422F49E8900608AD3 /* NibLoadable.swift in Sources */, + 28EFF4C322F3972900608AD3 /* Constants.swift in Sources */, + 28EFF51822F49ECA00608AD3 /* CardTransition.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -564,15 +803,17 @@ baseConfigurationReference = 3FB58FBF10A2F913A03F21D9 /* Pods-Drink-O-Matic.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 3JEJ7T2FN9; - INFOPLIST_FILE = "Drink-O-Matic/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Drink-O-Matic/Supporting Files/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = "com.codetest.Drink-O-Matic"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -583,15 +824,17 @@ baseConfigurationReference = 4E14FE35F6EF15E3794D1139 /* Pods-Drink-O-Matic.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 3JEJ7T2FN9; - INFOPLIST_FILE = "Drink-O-Matic/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Drink-O-Matic/Supporting Files/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = "com.codetest.Drink-O-Matic"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; diff --git a/Drink-O-Matic/Drink-O-Matic/APIClient/APIClient.swift b/Drink-O-Matic/Drink-O-Matic/APIClient/APIClient.swift new file mode 100644 index 000000000..5b9d09eed --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/APIClient/APIClient.swift @@ -0,0 +1,45 @@ +// +// APIClient.swift +// Drink-O-Matic +// +// Created by Ramiro Coll Doñetz on 01/08/2019. +// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. +// + +import Alamofire + +class APIClient { + @discardableResult + private static func performRequest(route:APIRouter, decoder: JSONDecoder = JSONDecoder(), completion:@escaping (AFResult)->Void) -> DataRequest { + return AF.request(route) + .responseDecodable (decoder: decoder){ (response: DataResponse) in + completion(response.result) + } + } + +// static func login(email: String, password: String, completion:@escaping (Result)->Void) { +// performRequest(route: APIRouter.login(email: email, password: password), completion: completion) +// } + + static func getDrinks(completion:@escaping (AFResult)->Void) { + let jsonDecoder = JSONDecoder() + performRequest(route: APIRouter.drinks(filter: K.APIDrinksFilter.filterByCocktailGlass), decoder: jsonDecoder, completion: completion) + } + + static func getDrinkDetails(drinkId: String, completion:@escaping (AFResult)->Void) { + + AF.request(APIRouter.drink(id: drinkId)).responseJSON { (response) in + switch response.result { + case .success(let value): + if let responseDict = value as? [String: Any] { + let drinkDetail = DrinkDetails.initFromDictionary(dict: responseDict) + completion(.success(drinkDetail)) + } + case .failure(let error): + // error handling + completion(.failure(error)) + } + } + } +} + diff --git a/Drink-O-Matic/Drink-O-Matic/APIClient/APIRouter.swift b/Drink-O-Matic/Drink-O-Matic/APIClient/APIRouter.swift new file mode 100644 index 000000000..c1a54bc5a --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/APIClient/APIRouter.swift @@ -0,0 +1,99 @@ +// +// APIRouter.swift +// Drink-O-Matic +// +// Created by Ramiro Coll Doñetz on 01/08/2019. +// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. +// + +import Alamofire + +enum APIRouter: URLRequestConvertible { + + case drinks(filter: [String:String]) + case drink(id: String) + + // MARK: - HTTPMethod + private var method: HTTPMethod { + switch self { +// case .login: +// return .post + case .drinks, .drink: + return .get + } + } + + // MARK: - Path + private var path: String { + switch self { +// case .login: +// return "/login" + case .drinks: + return "/filter.php" + case .drink: + return "/lookup.php" + } + } + + // MARK: - Parameters + private var queryParameters: Parameters? { + switch self { + case .drinks(let filter): + return filter + case .drink(let id): + return [K.APIParameterKey.drinkId: id] + } + } + + // MARK: - Body Parameters + private var bodyParameters: Parameters? { + switch self { +// case .login(let email, let password): +// return [K.APIParameterKey.email: email, K.APIParameterKey.password: password] + default: + return nil + } + } + + // MARK: - URLRequestConvertible + func asURLRequest() throws -> URLRequest { + //create url and query params + let baseUrl = try K.ProductionServer.baseURL.asURL() + var urlComponents = URLComponents.init(string: baseUrl.appendingPathComponent(path).absoluteString) + if let parameters = queryParameters { + urlComponents?.setQueryItems(with: parameters) + } + + //protective code + guard let requestUrl = urlComponents?.url else { + throw AFError.invalidURL(url: baseUrl.appendingPathComponent(path)) + } + + //here we start to work with the URLRequest object + var urlRequest = URLRequest(url: requestUrl) + + // HTTP Method + urlRequest.httpMethod = method.rawValue + + // Common Headers + urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.acceptType.rawValue) + urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.contentType.rawValue) + + // Parameters + if let parameters = bodyParameters { + do { + urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: []) + } catch { + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) + } + } + + return urlRequest + } +} + +extension URLComponents { + mutating func setQueryItems(with parameters: Parameters) { + self.queryItems = parameters.map { URLQueryItem(name: $0.key, value: $0.value as? String) } + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/AppDelegate.swift b/Drink-O-Matic/Drink-O-Matic/Application/AppDelegate.swift similarity index 100% rename from Drink-O-Matic/Drink-O-Matic/AppDelegate.swift rename to Drink-O-Matic/Drink-O-Matic/Application/AppDelegate.swift diff --git a/Drink-O-Matic/Drink-O-Matic/Base.lproj/Main.storyboard b/Drink-O-Matic/Drink-O-Matic/Base.lproj/Main.storyboard deleted file mode 100644 index f1bcf3840..000000000 --- a/Drink-O-Matic/Drink-O-Matic/Base.lproj/Main.storyboard +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Drink-O-Matic/Drink-O-Matic/Models/Drink.swift b/Drink-O-Matic/Drink-O-Matic/Models/Drink.swift new file mode 100644 index 000000000..6d2c64fa0 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Models/Drink.swift @@ -0,0 +1,34 @@ +// +// Drink.swift +// Drink-O-Matic +// +// Created by Ramiro Coll Doñetz on 01/08/2019. +// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. +// + +import Foundation +import UIKit + +struct DrinkList: Codable { + let drinks: [Drink] +} + +struct Drink: Codable { + let name: String + let thumbUrl: String + let id: String +} + +extension Drink { + //Customizing Key Names to match the naming style + enum CodingKeys: String, CodingKey { + case name = "strDrink" + case thumbUrl = "strDrinkThumb" + case id = "idDrink" + } + + func highlightedImage() -> Drink { +// let scaledImage = image.resize(toWidth: image.size.width * GlobalConstants.cardHighlightedFactor) + return Drink.init(name: name, thumbUrl: thumbUrl, id: id) + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Models/DrinkDetails.swift b/Drink-O-Matic/Drink-O-Matic/Models/DrinkDetails.swift new file mode 100644 index 000000000..00691ab73 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Models/DrinkDetails.swift @@ -0,0 +1,32 @@ +// +// DrinkDetails.swift +// Drink-O-Matic +// +// Created by Ramiro Coll Doñetz on 01/08/2019. +// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. +// + +import UIKit + +class DrinkDetails { + var instructions: String? + var ingredients = [String]() + + static func initFromDictionary(dict: [String: Any]) -> DrinkDetails { + let drinkDetail = DrinkDetails() + + if let drinkArray = dict["drinks"] as? [Any], let drinkDict = drinkArray.first as? [String: Any] { + //parse instructions + drinkDetail.instructions = drinkDict["strInstructions"] as? String + + //parse ingredients + var ingredientCount = 1 + while let ingredient = drinkDict["strIngredient\(ingredientCount)"] as? String, !ingredient.isEmpty{ + drinkDetail.ingredients.append(ingredient) + ingredientCount += 1 + } + } + + return drinkDetail + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Assets.xcassets/AppIcon.appiconset/Contents.json b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json old mode 100644 new mode 100755 similarity index 63% rename from Drink-O-Matic/Drink-O-Matic/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json index d8db8d65f..8d8f4bb49 --- a/Drink-O-Matic/Drink-O-Matic/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,93 +1,117 @@ { "images" : [ { - "idiom" : "iphone", "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", "scale" : "3x" }, { + "size" : "29x29", "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", "scale" : "3x" }, { - "idiom" : "ipad", "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", "scale" : "2x" }, { - "idiom" : "ios-marketing", "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "ItunesArtwork@2x.png", "scale" : "1x" } ], diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..b694e9af487ff17564d1dcca7b51e828aa7c3609 GIT binary patch literal 734 zcmV<40wMj0P)(a?K2A?I`yK?Aiu_(1v7&vugOu&-62Uy z%XJ7ko=bfNpwAIR0Mgt4h-!&Pk@#Uz{q{3l1}SnvoR&ufz_t$9I9M0oeaKRAHAJIo z-W=NJZAdZef|}KgAMU#Su4*n7Hk;{-{kiii)4!g`dg%Rr4FG4Ex%)WUdKSzT^jafF zRDPLvJ=>q?tIg4$kJN656O(Pfl(hwKbDeDl0EEJ|3zIZUS|9XU0}Rkiwx^RM8}GEk zo7crcQLWT;wHUu20w5(w36et9%Y`dzc`8sYn+OcOSoT)yqo)U9Jxrc|2v%$IT-EG$ zqxQg#6B2nlVEW^X1%Q*40e@pD&17$@Q&K1uI{&tL&eydvn7yJWwU~CJ(O&P=oC$yqgXqOzxf0l^fy)lI z-^E8M#3urq*p3gQi?=RK2Qh1X5+*RSzu>Dd*n7~at(R1wVoNK(t_n|@shh8Oum0XA zLB@d!-f4#s5g6;gEVp<1uOIjQlC}vyyLXt3&2*G5HcR7y*#MFheo@c7bj+Rv0IQqT zH?Lz)d-D~QOzlrMDpJwm+sN)sn2}hT^S>a+>5D0Mnce^MoC48+6HKome4?3$E0x_$Ck%-JhsR4xHI?ObI#`DPMp}jcBp8` z2V3(q=dst>Yd_9DmzWuMLc|?Gy_3M!`=f>#H+xLb{{)x;BHSA5eFr9(!92=U2mvsJ zpv~Q6$=eBR3_#(@H}r|usIwJ@Aq9#RbhbI)IY3f?mgM2T1ZG%5_YcXhJYw(I5{+@F zYCnFuVX@(*{7vzB%nZW-An3-anVCWJ6{!nD^+PX!h+5Ln3<8+V@HOX4``kx&HdMvg z9S6K%DKnTMMDSW)csZZ`>ch|mL=aT@&2fEkIPrh$22uUZ%Y~mD)ssb2u1){q50#T|!jdrTPZVWO4u&Cw z_iDfY?r8H59w%Eun+7Y9gOs*5bWZ>5ccLd}@4Tn<+{++B9Iw~KFf;3FJ^#I@YyBh9 znD+d!Cy%INg_*~H^sK1|(YQZ2UcZ!QX4Zxmh%wAuAIRswdpH=I8UNuky5!C2pA+lm zBY?;s7^n7ZqPMF)Fg|*Q?{OT1ERhZ?dzFsc< znVM)yC)%4v{&cBpUk@$Hne4VTGnb~~(U_SVioEfXkrv6AJ}3Tm(gsFIHY{9elopl* z;p)kO)_dBU*S7exe&B_mT|PBbov6$y^Q(&Dk{HW$ znVUbe`Rx}5%M(>$2>^Y^E>H9~oT`OoqP)6(SrdT`*sul}X#tH(q3&ss{*Qr)h?!eA zv~2n8rk8&G)}_DXm9M+*?^v<6sZywgHKi@vN!cVQsD`6&7ufLCbJv6<5+oD0!i`(9 z=4opQ;P~JoA~w8!XJ@7({nqi}cTSD%ePYYN*~x#M&Oh|^UL)9v{vJE$9n+=K!Vut%JofqpV)fp@VkZK>cp`3;RAQIt!wh? zEU)=~-7r({zAhCQ%MrziIuS}mmFbKuCIB@bcG`Y#z!A1l21Fw1k|oJ?U`a5vZ9nk% z#$;yR-l(m+aHdcg@z5x~s0C!FojC$-mL-FW8ODGl2}!VIs3~CKBqa!1ShI!T~raV@4y?>B->FCyP@PffTrRS9Z;Y zR3>YmJ~34(E7-PSvK_&U;*@&*^vq)iJ8V}1P%JbxqFRLBb+d9g%dhj;xXNZ_N5|6XdRsq5 zEb)8+mdWF#&J)|5FJ2HqF8x@%%@!{s|9>A}{tXZ1&PplaWtRW|002ovPDHLkV1n2! Bo{0be literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6f94ff3ebe1704020c2502312acda761be1e9515 GIT binary patch literal 3107 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 literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..908e1b878a1296b2bd1cb93ad1abfca1cefba7e5 GIT binary patch literal 1196 zcmV;d1XKHoP))Ahnb!_zy8kGXS#=&8P6cZvw%Jox3#{F zYc>8imk7+z3WnWg;+}h{IlZQtVqi?Qe z_`gq3&24;h*8cDnV@q!pxBSBJ=-D3J3nC_98Qdu zpfxl@X(%l+wm(^xdyDmx7u$McMK1x&^w=X(dDvZD=?Bc`fPFjUb_q+Q6)VpUyA)9&q1pxm1&&myq zF1u~nWy&(r$(TV&>v3E`VD8+%J&tts%CvGr5Gq$@I(Fuj7Xna*>Ce{mw8Kibt~&^1 zNO#`LrBf@0w)F!5=EP90c4Fe*w-}auPPrsE(%A^5+6_ccg=l<3t`j70!<6`oQ3nZv@r2RXNLYC>I z`><}LEyY^-;4mX7m(ux6aNi-gdG( zx~mWBLP}}LFs2>vJl|PZ(+rosydH&GbV_)6u-{a-Crz1ZK zr|Q};wbB4jUtW-=u)D0Tfpi4XY>dFySleXnTq1zcnYRyrT)K2@s!@wsBb71OG%tKN zlg=gX|K-Gi+O#d5?6j61M7vD^An=~VZMw{g&7>^7x#jYYWo9lNEL=V{yX`Jb5BC(Cin06d>%v&mZPZhK}1NdgeMv9E-$W#Gn?Fe4U?hE8@E30u~jSc8mo zQYirN0+y*K=_SI_LNqzvxPQkh?Mo}g*DlpnOq=^sg~5cg5G_0mcaEe1c#&u-2x5^* z8Y@1o<2HAqdv}9V$CrjnsnIub*FH?wr?=4gd&2O0iOGC5%c{{cyZCFlhA+Ce|Jo zZRgNRD8)ppJ^tu~LragY4ic>gY`|@cjgtT6?SJAvMLetjsDA*frb|u+PdX$30000< KMNUMnLSTa2f=V6$ literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b0526c50ae81310369de774119486154ede3fcc2 GIT binary patch literal 2973 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 Tr#l}t00000NkvXXu0mjfZ?3qz literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e45cb8581fdffee8c58463bb5a2c3d6cba174370 GIT binary patch literal 5027 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

DxLnxA31B92J9Qx-!?e2Mf3*sce=+t-BTXy z^Gg%jFvU$fb5aTbH{X>zb86tl-G%*o#vlA#N7r@Ph)I!%>&;5B5S6)7YY2g3Zx;6a zB!B&_nVauuW(^WEGD8L_s>&T1AlKC)la(|ss&_?Eh~IJgc=_<_rM_Nocp&h~+O(*t z#n^I!P8IV_dQ#1%gRZLWy|f=>l5p{oE2;ARC>lx zF!Sopf!r2sHZZUP2KYX)Fivciie`GVH7KbT-fCTnD} zM*Je+B9)9`)tVF;QywvOJ2MMG#WGk*J6ShnLR~1t8;jktetu8cOd22iwZ^V3=~->0 z#GG-M+}9P?7a$`@(JHC}bO6xoC%H*2ONRyc`Uf5eY^oGl|J1>I>p07zt4I)87pq|=Q z2m%O!Fyh`5!Qgql{g&kNRrUgQ6xSUWv}QLzIELN3y||09mKXo7CQ9iWZ%XHyAq*;c zbnsvpMw59`?e%g25H&WF5C{V7ecmsZSW1B4ICR4;&ixNIP~Be(0jU2QI;HfHZollY zQP0L9&H9?IL^>_=`SAGhP#O!|>KTT-dX>?!+zdnR?)IYyF^6htm8({n3tsiUI=(8s zEW(u~tOdwI_`=-(51n{ogE literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e7639a9c62d4a6b35bb2f6c84e8a4245a245da9a GIT binary patch literal 1863 zcmV-N2e|l&P)5D0Mnce^MoC48+6HKome4?3$E0x_$Ck%-JhsR4xHI?ObI#`DPMp}jcBp8` z2V3(q=dst>Yd_9DmzWuMLc|?Gy_3M!`=f>#H+xLb{{)x;BHSA5eFr9(!92=U2mvsJ zpv~Q6$=eBR3_#(@H}r|usIwJ@Aq9#RbhbI)IY3f?mgM2T1ZG%5_YcXhJYw(I5{+@F zYCnFuVX@(*{7vzB%nZW-An3-anVCWJ6{!nD^+PX!h+5Ln3<8+V@HOX4``kx&HdMvg z9S6K%DKnTMMDSW)csZZ`>ch|mL=aT@&2fEkIPrh$22uUZ%Y~mD)ssb2u1){q50#T|!jdrTPZVWO4u&Cw z_iDfY?r8H59w%Eun+7Y9gOs*5bWZ>5ccLd}@4Tn<+{++B9Iw~KFf;3FJ^#I@YyBh9 znD+d!Cy%INg_*~H^sK1|(YQZ2UcZ!QX4Zxmh%wAuAIRswdpH=I8UNuky5!C2pA+lm zBY?;s7^n7ZqPMF)Fg|*Q?{OT1ERhZ?dzFsc< znVM)yC)%4v{&cBpUk@$Hne4VTGnb~~(U_SVioEfXkrv6AJ}3Tm(gsFIHY{9elopl* z;p)kO)_dBU*S7exe&B_mT|PBbov6$y^Q(&Dk{HW$ znVUbe`Rx}5%M(>$2>^Y^E>H9~oT`OoqP)6(SrdT`*sul}X#tH(q3&ss{*Qr)h?!eA zv~2n8rk8&G)}_DXm9M+*?^v<6sZywgHKi@vN!cVQsD`6&7ufLCbJv6<5+oD0!i`(9 z=4opQ;P~JoA~w8!XJ@7({nqi}cTSD%ePYYN*~x#M&Oh|^UL)9v{vJE$9n+=K!Vut%JofqpV)fp@VkZK>cp`3;RAQIt!wh? zEU)=~-7r({zAhCQ%MrziIuS}mmFbKuCIB@bcG`Y#z!A1l21Fw1k|oJ?U`a5vZ9nk% z#$;yR-l(m+aHdcg@z5x~s0C!FojC$-mL-FW8ODGl2}!VIs3~CKBqa!1ShI!T~raV@4y?>B->FCyP@PffTrRS9Z;Y zR3>YmJ~34(E7-PSvK_&U;*@&*^vq)iJ8V}1P%JbxqFRLBb+d9g%dhj;xXNZ_N5|6XdRsq5 zEb)8+mdWF#&J)|5FJ2HqF8x@%%@!{s|9>A}{tXZ1&PplaWtRW|002ovPDHLkV1n2! Bo{0be literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..535cf314ec88a28c25fb3135e6d373dff4154e6f GIT binary patch literal 4473 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 LNkvXXu0mjf%K46V literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff6d663289fc0267df649f103c4073462b6a839 GIT binary patch literal 7354 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 LXoG5$EF%903`a~R literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff6d663289fc0267df649f103c4073462b6a839 GIT binary patch literal 7354 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 LXoG5$EF%903`a~R literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..adcd585e5aefd25d6d04ccc47ae45b27dec974a8 GIT binary patch literal 13024 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 literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee8ea05ee9b3828c8b4ce4021de3ed92ca7665c GIT binary patch literal 4167 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 literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4466237bdf4a16b9a07de583ae69ccf8f6a1fd GIT binary patch literal 11737 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

sFU2WjH{y)zqBmT&2P3NU8&hX zNby~ohatk(5J~5y8P<3NPr#FobGj>gl}4D2TOs;SyVQ`>@9)bDrF=bdeP=tVLQE4J z3-~CrIn~EtFh~L_?%qa^z3s)NaY~1jp-kXGt%d-ya+GXC>S^#aneLkd-MLyJske>B zI^%+9DZ+lZPE?ZL_|k8r&|rF&z-g^8RGLo^w(j69sFOSP54t={WNbP-0yv+PM@0(V zQ~(@-7h0n&YjVHmxgR7R z?!N2)+EWN^0qc3p_S>kl*S9v`#@h{XZ?CEeshViTX5~c%ltjaQjT0#ke&bojPoD%n zQ7QM+dZih2*be*7{xme<{MxP^`(XR~9rZA%?#rFa)lv1WNlSqzGI1ka8X-LBSFJS0 z1R;o0A=A)k33EeESV5N)R2<$XU*q;T-!K((Hsx=$+L=ZE=i3`XbQbM7)?yB_(Rsm^ z)07ELP}|@!?Y(Y-aH}Kl3!9H?uFu|$s;B(@&gKZz#MMEWy-XvWfD|oy5W}?2VQ#Y6 zdP1au9T(`8-X16b`R6 z&%6(8^!8e?wJjnG(@yP|Xcr6Ji~hjf*#0!kW1p7f)h^k1Jg;24@}EMH>p1s^5kTtn zr;4T6@aXV3_ZMrmIUEJ$W`q^<>QavX1<&i(6jlW_HTQNzJ6G>!e|=_{Uu#rW^WL{{ zoE&}QhFhT`EMT07w(mj89~@~+1~qNj@sJ4;esp@Dn5Sa#q;m3}2r0KR$Uq5@3y(iH z$niBQGy1DOp8GGS-u`}F3Qb)&3GdPQ(0ez&9OTunpO-5pDq4>{9r_`{&JV~QLNuhj zQUo8c1b7e@L_?rgOsCb#aOaPpeOcR}e?W#2-cKYQax)ZyL>JT*Dr2+|36DT^ytrv~ zfigBZ)$J#sqJh0VADNT=U0qrSK4eb>VLoxIEH(KOEvT!Rh1v!B?%K3TY>n6l(|8z# zheR;YH3AmR$9vu)u(Q<4KT&{A^XFV|kj>s5QQ>HGY_bv`=g$yOmWjs`KRJaozdTWm z!X(W5G~*8)i%>tg@HLb0O<%)Ly@u<{(d;983)fe_Vjc{`=|3<1fV1ynwe}QW;qr7V+iBW5^UlxL?@O z%nIMv@DB++-~$dPrtI?KLXC$*)ETgX_uo6a?l-{i-B;=Z;^FwG!>7nl`n_&%=RL74 zzvSF+<~vDXGe@Tz$%YsTAfkpaH8iC|^tgUS-~W97u5wwV)r&mlYq>0}+W^ViL_-OF z{CYG50i0uMl~2Q(%Zd%1J|FF@bjZ#u(=$kEk17e;#}Sch zc{G$|jqH!K9%HX``g&G1L^{i2Xi8lf(bMO-|7+s}2zAqfT(>X~64&Q>1H5d25+fQ| zR$s2aPy@56DI9e-(_K=GM(`=J=?g--mY0YR@M_->BrLd$iiSJ&mS#>CuK-YoA9Ufm zjkR1DipBeXQp{aQIP=#S||*1L@YS`gX#XC@S+@`+l-MiY8d*m zQiXPpMxb;9s#mhZ7*KTQPCD!24`1h)7Gyi2eS6S~eMm!}<7$+naetk$orY#C4uHEN z1UyUmQcQf@o6T3&Q!Bf3E+4wMJP-Xwe|go>KOWSrRWBS5**5JLiFoS76T|kZ71|tW z+Wqos=t+q%4?agc++KIqXtawxL*dkSHa{mscbHMp(256@Bd3^2)hka27yNc|uj9() zp!5yr-HuLMZ{9PbXwHO-PZ50K0eVo(ry9?og5j_O)e1$k{LNMkO3C1y&ScBhP1hxJ zJU(uNUB_xjc8nZ0{)*lw!9@+BNpnCteJd%)^%!URm`m^T^r9y6^m-tarZW3C@W~bO zEysW)l>T1aaVXy6&zfXB)%yJSZk&QAQDkG#xP!z;sXb4Gw)}1z#_pPv6WY+pHqYTPv7g+f6bz0kvHA-8NymISyB86cTDes#N#3$f!}{X=;+NA=OgniUYgt0Rm) z!D!ORcr;Q+4UJ6yjnBt;KmnJ$9X`O5c)D7mTAthWO!CnlfHeSRv;Pw)dEd{+F%q(5 z%#;_cI?-@{7!aN92+FhM@wF%ek}(1FmzO**r>#bp(Pm(uX#gx3IKZE(QVS>bEH+Cy~5vIK{Aq1^Tt zBt%B*_({JP$m_`schgiwzH9QP%;fQRxux~-#mWxav1s@!f_2hApO>|&IDW?Ro zs@Q~;rHYkS(pBFwp9gub2c~PGb*WX<-^*)xHlQhh=b1;2s3-9;*X;5kXd&j}*a3gx z%MV;&$e!TeY&J=Nvg}RD#~=SF-KH^#D`4dEq#<2X8hHbuO*SIoFwBr@*Yw#~*76X= zdQH*=fmKT7>|%mwJ}lCD-5IvxLbZ)fBU-3 z!a^}t@tf6N7i>J<{ESk`gHnvhB;W2ZdiEiJ3{y ze>Rj2Z!>zA5jRfrgdU_Jnl*CD+^vTl5=PwXnqtjfJG*de*a|n~3fkdL*u`!2jb0vS z&H;Ud+g!;#9n9W;N0++Evp-QLInvxM^wiAQJaAnjj#1;#h&1`jb@yh@wsBlUrIaIw zMj(w&Rd;c@M{`pX7ZJKfeBF}eeC-keNMG8x3#s?hW^5v6n`X%U^-s#MTT?fzvaZ~HC z5#s}l?#%_$acF#AzZiUZdOJoqZG2h|0F0Gz9eY71pxIH`Hg&h8e>eLKafL=9d(%hs z?cTIL8%9k-4`UlDj&8!@HGL5*tJ`N*s$*_R81(izw8pA`^P@!?n`mN224dYBR`O(^ zdoj4wK6|_j+1#OSA`mzl-j(K!4}k-no2(#G3b%DaZn(mbj%s1}-Uh#*B?<7+5s-Gh($U zkbu=_oMS(RmOCa+L_tb{e}vNQ`A=dywW^-)Uqf-RU1M?7SGrZD$dy zYu%7P^ERv4Af`@?()bxq^wGeh%jkqIm(hzQZk$$+7n(Uy_DdDe{L^T>g8%nwom4*rYzGK!(Wl z;_DCOy>Bpf=&c(EaakM9Z^cNH1CxDEL*k@}_rubnAx0d}qQptrnXVlmdx6#Qsr9Vp zOLGp)tF$TB<+*OTZkg@7$r*MElaIH=*$vhY-nE%8?e4?s%_NaN+9=WLD>#j&;o)Hg zX8}?R+l{&UvKvQ7*rCGt00bQ6{MpvmO2-D^ua}c@)Nt%L+kVjHq=csuv?oXen->mx z@wq-;-7dcZklAKaPzBtp`S|ce&h(AeJ7`>p^i`;pd=MlZatj$C*~I-ofa^AO^5nDe zgTg@Nuw&>=cnT?i`Y{=0jX2S~Z8~She?8RkAwm6Q5&*9Ay{G!NHemkL`xH9Xri7i{ zGu8b5qZ(_}S4E+r4X!+1GAFT2$DV{{D}GOs9yuLEpTejw*QvkP!scdojat&n1@i4q zMo(SnKw@kd0phPD`ux@pjA*JUzP62QfpB+<*o5J|PMG=mHL!?it%gUNRyQTe4 zEG@#nES|5su~eoaB=1hV14bBC{Z^u+8)7HGg%c`swn?1hA3pFC$jKS@TZzf0QV06I zG?4!+$Z~YU#_lLs?^bf1XIEb3nzyH-}?8jmqN>p2Xsre-=7w-z1-p<$DpT3d*c|+rjO;>!dlx zkec(Vh33T{7*X_DoL+FE3`K-~W$B$`e?377l^SRtJZ*1QDY+9Bt7{MRf1DRq$nht~ z*61hY?M{#r>^8RhvstLKQ;fYSaoq3oz!rDWP$RBhG5rnfZ6hly*c{d5yQo4ytMgRH znu{}byb!AWOiQOZfbOZ`R9swI%JuNFsiZiXL^+KOVEOJ%Ah+*0JYH>ba_%B;$4|1V zw(AAnE0;hyc;zC0PftPW48>|~8)_Ps{3BMqyhPO`Iq;j16wzQit(sbY_d)Hb^SwxK z!<ISF=Vp^vm$u!cFCYc_h{KmE=ZfBeG;rl4 zB$ggl)3O<2=g#QecDl(-)ICrvMk%MtM*W4Ca=w<#bP-LQJgN1#5yEIl-YgoMkBZ0; z(JU`0T`~j!TsU-8v|=_sl8ZSO=6c_~zSj>tO~MN^U^%RR8@i>>umpi!j+y=r_4oDS z@$r$c@uQ#%(&6HIC%-!LPCg`p-9bh2v}H%)*tA{X+?CSN&Qe3PDWeHe)`KI1s+Ke| zJlu;bt12s3fG*fGZDc{jKT)2__)!p>H%8{0YMGK?ww=zDjl|c%#>9$9x!7MJ=mIn> zAHrzBgouS=6x!+_!Dt_TjiJ`lPSNc>OkO#TsksYvuszP8cq4FWkR}zT@oS%U6>k-%*%vn4W7JQ zOtbx?WQi%`2T(#oF~qRs*`=qi>>Gp9^U(wIm+aU;*z+}YU^HZIQ=e7}OxL-_x=Vv6 zc)fl}`Iu+Z!CqWXX$u1# zh*9O|**p^=Qyvkg)U&lu7c);u8tqwuPc#&xr3>;qrC(*x{=_dUze<^mD54e^iQ;1( zk3DGUr6M6nXfNoVF98?ZXkvn)&^p2FG8;P{G`u%X!5M*D?cf(MwTG&J0I)657~*ANsjD z-TZUNzxMOd?^p)nG5u-9CS}%H);YCrobokDL?eCWsZ18{EZ*(T=VfqD+O0>64U>Ix zQ8uVXQqZZ$<*FQ5nBKWbu)%=^O$=|Ty(9=`|JHAd$e;Uqu&x3${5e>oVL?x)U z)vrNWR+eH#pWeMMY3Im1D^9&%p=LtC^JQ1yQY+Rkoatba=3~sltVWjo^E-dl+dG+` z!Y|_Y^59Zs6_DnjTS!i%=I>$?-Hcc4i(HB`T*L4-MY%_=x+#+$MEq0ZI!TeTXN^lc zR$*!+w)S?Iq2X9WwSQaX`QXDls-fSBaJ&EH8T$bpvT! zy4|L6V*wxPeLSiSeD%G?gOqD%=zSy0$~mvJ<|yD$R{ zb9!DSuZDk=9QNS-g6k4V@yOePIlE?Y^8rVY#(97#^je$$D zE0)vFv4=z%)2Jlj6(c!oAgD@u<=mOk$M_#_w9@386a)xv#mu)<+T!XH?#w4y{j7Dq z`GLk%`aXQTXMLVhOzU`Og0VY+NJ!&qe*Ss?Z1KgLpj&2tuxpDttUkRHVx^QSQx^2#?cGgc5MMMfJ zK24O9YwW7m+WoV%@}A+-*JZiB59`b|JA2dD8V6PiBT3zUZuKG(R1kSZ5bZS*5T3@? zy8n5koTC+W{ZaEl#X9HP_N!rCM4~0i4_G%riHODBNzBCsKZI-_BObTx0-n~N_dKaL zHa&keymY2XrWwOA8VwnVg;?N#{(J8If5jIgvErhT;lkOicW5{LCl}2|8iT10BZ;Oj zrTRpudE{mI;4arBKyqP53K(K&QT45r)Jm$XnrA%N{2O;DY0#vkqBlW+lCiZoNspVx z4=ivO0AZAD=>d8)^)uW5-aWvLCu^HG&ttu+)0Mh8Bh8_baf2^-s9Lt{Bn1t|iU1qR zr25i^zcyi#wz_Gv9QoSR^5!vI*T=KZHr#!JaRDS3$a49SGaiqQ?uKf6d0bB zSoeP)3JY(A4bhxeZIyp6JKk7(C63b0S`>9*ukkSDQEz{%njwQk_7IWl-weq@APA>< zuN$H@M>=H||AQ)P)Y(mF0r*}*^m23ldcbJ(z|Zgf3AJz$e;N4*5$%S*k%izt#N;rJbXhExxWbg1=tl_tI3)rrLbmk2fs# z=8B)BLxmzf!RD61+ww0to{%&TyTzxD6yv7&DZbr?GC!|HzFugsQn(r@&*1cMt@X}w<>Ibrqr}P1 zH&tHYW@Rl?3%6BS2(OBt99IPBIY*>7M!vYdvPf*5N!vO_zoe|9Lw~jn_4hBL^v_wo zYJm}5|41*61WW>?Q)?0eoHu#$=KdZK@=57x>TOi(YdH&@vPsR8ULuqZF*ML50ptq2 zwNrQxAuK??xkibzqjS2ku|*(H!pl)&Im@_=K3OPsip6BB8ufR54sH_Q+VAUGw}e+f zChIo{jnKFOLOgHp=JFl0!>8tZa6%Bccv%<xliG#?C~p56w3=BT1k(lTDnSXo+ZyC8Bf?S>-P_q`lM$Ui?*6k;mW6yG%p16RJ? zu8yOyXVMZ=tX~@soRC_Jh{^)10Z2XERUrDGhsjcGQ|eyFqV&Z{~?Nt({a9B-PIGZ;jU`eB0K>IkMyI zt-FMKF5LKuT-5gYXaKP8&8Yo5F`DD%!%1yi5s6OX)e+#+Z2P06AIu8_SCR4iXFWzR znfh`vjFgU`*(WDBzjwS$wI9=CU#@IL}* z@;3INy4q@grtuveQOsqI7SV9Iep)}XyO~dT>8-VRvO9bhOYJH;XD!$O!zXn@Y)@A% z983yU8=ac;GeiMTA%A5#`^K>|7g&s;;rn+BlcG)jlB9IQ{fs!8A5gB1LT;3xbulg7 z5vg$UmV<{tl$k6{)w232>lc3ly?T42tHT|bSQ$>>-|>Cdhf$P=BEij3MbJ_(n_|{< z1^9Ted!>gh9Cz?~s@`%VN_qZ^`xsx)H~t{~g$o3{+RL{XGrwEQ0cXW@rN|6&cnXAe zI_9oM%S+4tH|kfN4~@PEkhd{)hyAO|xKI5;TdiIwb5AL5E3UQ?CQkdrImT?IZyFLw zCYTM|_*ViRm_}bVVXv>(OgU0#F9qrVB}HCme99X6ib~zDEW3mOUy+At(|e!ZHi9&? z+H^W7;u-fER@BLht~;8lPQ?0p-c(?!rY3f3buC{!|8UWyo{T7W*fc!18`5}B!xGOu zl69+`Z;JC5HVVtxOIdyuHH{E6EA;CsOOawhJpdyCmG0MOjXWO}_9yigF1$4IqzKUHe96odh^9i-;qxA1M7)^r!S@%BPz=tprI|UrXLEwr-BKX9nKLh@yE>tb)9 zaZscF6{dQoKi@v^y@|2^9mdDf>Y#D^GycXO*iX;UZQ0R>=)0JCvN|szHh`ToLM>t6 z7Fg|dJB+1n4*$_pgLJl%8`l{zwE5GGPoq9+?W3!n_rP=&MrhYpx9jfBr1||T?^b`m z@W2OI5BWANP5_HMS*kdK%A%?ub`fK1bZhfc55!v~&lKZtfaIEG?DWu%Up99i%=qQfvHTl5q&|cs(j^- zqBjTt|K46R%Z`WlY0tx3>B29&{A=1*#P1*Uyj)s-RcQ&r#lMx;Q$9;vs7tSQQ8z%M z!f>joe|(e6!+q#rPDX~SXC{`tw6NG%C;Z~hwbVs4IBxa{$v1!N`fVcgO}^bWgJ!oJ zSooIVX(~MfYo(_!Bk|2z)3Up{?dL33hvP6vgYfF|m?FwL%R3=7hcq}N-h1KTjEu}4o+vF>6N=GM$p?o3Hy8Wap4B$`_9lGxPitt! z3+`L&IgZC8XDJ8b(uUt7uFBpQ1akdT6QV6T*PCwH8oQ~k1cVB#)tsGyK&*yI^@*X! z#x(cN4b21$b~&2&cmP)OqjUWxBS28fq0vu-gRsUxuf9RPNNKrhxE-eXJQlvwTaufc zB^c~U;r=<}<>-vCNd{PE+PE@RF9p*;Ep_uJNN>#=ho5+$)PP2smTxedqb!^t{=;c3 zu7|J?bYNK4uMy z_^3+1(nJVdLBHtT+ShtMc%IT|&wlL}k}s-Gl=)tX)EhN%s5TyAg%1`hFPG(#v({Vn zd_yU%Lt&Y%t=-=v_hskP^X>Y;{L0xG6GMw9zp6~^Q665};i}#>>&YCtXEdOoY<%-o zT7c4DLp()WWDP1!pw`#vES7~7st5_RSsl{Q&6yLFk(Dhx>B=5XwD}fS)f(wMBTRDU zf%@QQ)*RjqtLWt0`@o1xRtZl8P;{UplanKiU7uIFAJWr+J<7GgcwW>llis+8vEzQ@ z@XCegyW!OS@uA^KtDw&=(@U<6*#5~#O-XEe z6_0_%pWe@h#;~jc7b@3wxx=z-F;f2JIl66w0~H6+K#L3|-JGxYMTUKGTx|+2>L0<@ z(0~HP?(TzU(O6Ns6+_>&7)}~{WSeBfG;j3FDw)dF1{WpsYbt?B#m1iZyny~5Vx~*a zfzLr-R!Qx3*k65X&B`(yZOzK`*i=bT|5PF5duQNv z+(mjFM@2Nd=Lezu(ju%EUf44ogQ?jJ@S&W(3ez1La-)yi5rzNI@hO!0dTO;@^mfWB z`e)#uGnQ8(JxG;#rMN2svDPh*VmaLe`kYN%HE?tbprFY{!H|h-`K3klx%y4Rx%$=i z{FBzOOmPwv?DxAmpKug-4hP#1@o@CC$@brUhCtB!wO4tbu1$=cX=LjVN3zR}cPR&HByaj~xVs7U_UaoQkaM=7l_u z8-Oz|D>)GY6g3WWYEwa>=wd8;^pL!UjJiE``4g3r0RlcG?FXvSAkloNyY}*z+r&as zlD~ii@)P;GEtPcqF?=d)r@p=2E#Kb>ds2PMG}-lCaAWr{y()voho!G{$cT-k%~$?D z=C^_V`0!1B0?q~~f~ZeJ7D90H&SCe{v3#uwi)@IcbXFn?H^kDI z^}gS1r0~{-@Q0{u?{G~cQbx&E?8M$N`P9vcD(u*^u|9GcGbR*C108`u)-g$vRQ~a) zB%{e2l7;x$72x;{@9bs>kXrE`Q#!bqWlAzgW-#s}viq54{X!J($tv0M5~cqoZrk1S z?bOe>w&%707mhkPd}raarDJZ~cMriPv5G=69dpN=gWnTnhR(P;&u z`<5+YKv@o0A9#O^Ok5t5LvmV#17Ms+t6j^6V0byD)2=42{py&9h#MUpZvXqcuU>B@ zxUHtRK8yyrM@ugBLZ9G0_7@J1Vt6Ud?^muXY!};~enVgXX}=lS&-XVjNC?*#dLA)Y z3PnaNNFJ081*aQiB>GHPc86fh(R9jUUt6Jgg*?;R{|WXWmw#Ap^1n^q^6Q0 zk5g6=If2pr3Y*?>nw$_f_blxNu4la_Mt=!n3&ePBo3H-|A3@;0Mnq#39hj#kOvk=8 z_T8=No$H$)-5vktUEJQoB$~EWLo5AEm)E$gKlCdmgLm}hr7{ADVr00!iR}$s z+tzDadpEcBtMBIzpUj^fV^+uHlUN0jRM%!6s+jwhqaBp##|wSM&}G-Q+Pk>@;8GQV z7($cvu(6b9TIJbd`oI1~-`c}C!aZ4*@^;A0IE>q0$4VAM^h;s_Kt!*O556!*ofe13 zKC43)Kl-_X9ar&7%5V*0Wu2%%1g4^UoAJgjR4z#Xic7M9wbSU-((C=f=bpg606S(9Bu(q#>H(7bJ%ennR z%K8=ohMQVs0Pvh;R3QN4EnMFWAKbe3$=mkblc)dnd48~ur-zm-xM+r}28}7zRvLzu z*KM0R%ZnEVWNk~@3~+I48y`DV6sWSL!?QX)XpT=q2%~@b03Y7P2o?lD1&p9#Rx*~{ zy?P_K8kl}*OaO@JRVwv3ZYJiK*M7Db<&|ZiFYb0%j_U?5)Bhrp-I8jxwSjBf2zp8U z&!gt5_VHMG%-goAs1qb21BWww`{?-p{ZqRCSPsu7CNTtYbF+Sark|EE?<%K%Y${+F z{g>xXV+bOy(g1Vh>iW*!hi^|mdPm>6fp>3VdxD_ZO%38ASlyVcs{rYpFOy)*^sBaf zZu^&=w%_&hU2!lOBr!sefQ6)}F;eM@&YZ*6b-H;;}!|N89yOB>{t1 z^RhJ%(JzGw01>@9{gD{JqQ>c&)_E+!J(qL)Y4meBz_}qegL}8JYck8KVQY$wNxSy9 z9VC`v{C943=*7YBHKD_zd9=f&$*j^6b|@AZ2WR-=o5R1~n|=1(XkJ%<19hs!F@i*> znY*;T(jo0uzE>h5E|76$QB$3=nQl*~Z(ZB`Z}bZ*ZIoPVaZ`?)MDgxdWlY=A*5L56ToH#S`0SgffBN+FtNWv~nYfOFrmnS; zLP`aY`AVmh($Mfq!HNrJsg_XXNs!IS_Q&t;{OiZ~@Gh=xU@A!k(9l;ap`ASHpDyc8 z&u?!$Xr;paet*q|U9B#J{&wz?0Dx=`ky5~~kPJ6S8pR01-96pj*t>hnKL6(FXJ60m zKbGS;=1nw+NC-g&U433)W!J*4OfCTKFnE)*NVm4vd^AhVqr+o-Wlh>M!*AZfB(zCw zDgF1h7m%;rXBGYPF##Z=pMl8yY<9ALASp{)9yCps%> zfuPXmZbsYhc(t~cQy;#v8$cH;3sT168NT>-|IeQ-PBOjqQW4zxN0G`O63Kq;8r9<+Uo(HYvXJ_6RcCqPViCsmuw8!`z_a5C}}l zRwp8kDx1zz{lno|G8Neo!3TG-J$8kac`aYgbJ@iTH=>^t696K5Wz3-pGgH&*tg)k$ z$~;-NLA@*n?cvKvvnfp4AGL@4vTbnL2y9Zx<^JUNHVBHnM#2H(q#*RMa1TvxBSM| z-oJe;|N1fZHlf*qJ0z&W9oe9&Dy4G6Y}pxIx<9S`_p3!s^g3G!&4=H-WFFRCtnX@7 zdWeP93-oDW-&tS0Ype;Nl$D9(oF!-mLV)Cio4c~NeeL#**=Jv!=IoD;>w_cI&Bzhp z4o5%z*uBpBEi8I{=wDd5nPq`eS4!mOm8!U-w))BO+26kfup^3(?#foB{T=BB|Cg`o z!K37ZcfoR5|I0jvL_dZJ0KMLxUjTZw%h1oSRG24tR7H*IxCsxB(ri&xnk=Im@ydfH z?!iR5!@P+rkktW15l^NLRPiLr-rZXmjobPk8T`G~cyX})^w%=v`iE-2BzN)vGANjAp%*52s<`In6k?#SD3VNyW_vC^`@qf8RS?hXh92p2YZKL4Dq z{^;WQFYuh+wz)?e3i-@mF?h6B4VRz}3l zJcx+^o;_D(G4Hb@d~yHq&tKSgPvco#Ww?8Glc;^6zjgaA_1~f^c<7~+&_y79yB={^ zleCIZsnutd$lmU)Pd?cCmyi6;b-A&P$#|Kacv&xb;XQs?!uEpa@YnV9{(78$HLm`w ztuBjgYT)p0wU3BMyZxM*xI?sb)$B|AE+7Av_NV7>#JMy2tpWuQxC9TbLGbp?>#^Fr zw!8ngug<=DkdE_K6=PM^XY&w3h;31vK*EJNfk7wG++VW`Yaf^A4IT^`#zWGU;Md5NsAS-HfzR&m|Hr4tpM4un7SY^PMHJa}^${Ju zgD#dmls{V9`y`kFK}1c&F&>Rl&T~t)Guis!_SSFS+4%hj_~;#p@z-CNwZ_hu`YglO z!FC;`9!3Dj!gGKs;BGJrqCwSxl#{BeC8|DLImP4*Y3U=7R4?9!^0N63QPd#7j$X-Rz6I- zG@yKpJ}+j_3#S)9W4i6AC8S{EEJI!?yM8)j|N31r6=vJ4CpiHBSN^-9~ zhw%uz{V4L~_Szdqf# zwJxUuykw;1g)r3$*-=W!M7y7(3UOE~R1OCzrLvRs`GNl~`d|LS;ICim^49)+UD4J^ z|M20ht-cycmv9ffd~QWkf0&!&S{|G9|YF1#D+>$+9@@WqH39Gp z2c{!@bf?;yY;KLQw|(^Yd(*j%JjS5Ob5l3&sH&>n&t&lK(81tE`y+*QD|%HVh?-le zxHI?YF0+*GKRb%|a+F>9MBaNVs)!l1+u97>vB^ux+=a<)zI*6ZU;;qDAbH`p=lmm~ z`OEz7%S{&3RS5*iv42#b&7!I`roOBPI9Fscte|aY02}}mV(wYsRS26CY>eALVV(5r zDfK0zf53q37NN+3dB#@{4*%Mu;;w%#mhsKG8X*PX z!6iT}=Nh?IP19K2y}R=-A5Q=6BfN71o71*0`nh_A64NmHUjzLneFkV>p*C;u=;-8c zUmu(tr?+ly-@L9{8`#;x<`kB&IYkws1_Wdv_fdYw&lPzNqyKYD1)lF*i%$_j70SW` zj9lKnHl9@DYr7tizI}Z9aKD;ctb&M`BANAb27QR%_ciY4pV6Q1fVoIl0VVAss8L3A zIs5+U)8H6ad(#cMz6}Y>`#7xqA52vAb0hw8cb4eIm;lf($AP>$c7pCB?2-^?Fx&ew zA9FrjCAPXmtPiC6FZvr0_!;`jIbf&{juuBVMX+WOOV3B(;)Csj7lXQ>ZKwx8vO7jW zHz#p>1Cy#r!jI9uT1)6=i+A3l84eE!{0HLAv=?Hkvsy{*wFAL7~;Zfs*30fYdDXGhTG997wG zYx$90=BZXILVtYNr(cZZ4j|_oLVy548_z)zZf;=|ZcIm~f4+D4pP#0O2US9p*r?ZL zV-qQ@inSZO7_Ol&A5ji1$0LWhcy_o;Pz&nr4vVUlsn0Ec_v|!&F$!_x4%zU$l&@ldWDz(&@ajcA7R6to0i2P!=fN*o4ft!GQvKl4{|<*=m&>}(SQFn zcM^St+FAMxByWz-(tI&;F|$xrIj86SmdoYOuL~?HrX$%HqY7{YgD%y#&* z!E3vJ0JEjBMkL^eXNyn2IsNoodw4KO$d)8V0NE@;+{~@4wsh+%{(Uu~x_r+scXM}F zS4}bawT!UiJI;aC6&L5=H z>xB6{J>Cz;^NqPpn+EkP1I_*{Z%opIXL)C;H@4%g-SOQUxOFW~N6Vnz&;PalII^5$ zIyZ9kV@f8VAtcKpqM|{9!?Q@(onrF#W(+aN@!!A651ut=3kNFIP}a?NJt+DWG^Ht! z4ORt|Vf#vh0B&aH?vmWv9k)~7h%ukkXPO(0hKZ1Fup#dK8)LC$FG zi94B()Z6si(FNsI(RJ(Ac!LOfw=o~qJK50xBXjGRaDI^ zr#upI)g)Sv)NX7|fBWv<|NNc&_C0Kb8c=BLiv7#&?7tk2{rAy7pUYnXIrr7-devNF zV>7A7ID9aBv>#`wY799=7s*yXJ(7cy`NL;3WZxQZy>naMzdL&87OwALcZ#h|Oh*ub zSsABypn;XEEgh!B9OiI=K4&c9IokYLL%XQJ2frK>KDsmB+VJg-!$04f-Fu+N^Ql$= z2`PuD5@eAx1QLR|>xBiuZResg(GXM=RzALB$mS(6-tu5)O>^&uM=@Sk#DDvZY=x3C z8vt0@$}H!sVR__SnJVX7i2eag0O*$^fO^|JWO<$lq%1CMKR&(NNzs6yWiGVsC(-_n zEX#=d;h1txvaD^Bx0M5vthO@@eI@9cm6iVz%rUFwtd=HAwu{|bF&NYcY7^cSDoBf z;uFFsX%=5U{QmpL*qLtMx-q(Yee*Z( z>8h#dAgo%YLA%#X4S=1p`3a;h>yZrzS$S!szTQ&F(!o+L~V9+QbKU z!sZBy`sUi{8VsvQy4o53u}Q08)CN zi$Ftvk(H4Wv+i73uKyK&fWB%DxZredXA8})5QT>jJX=4^+$DO0RdZfCf17oeafb_% zV!XQ*_qNgh;+j2Km)zZUW~|$z7cP)c{+k5{XZGngPyh6J^W77jH>#Bdo!5&9?Sqd# z9J!>zr$664K&13ya(?ELW)ynO>z1x0j(ZbMc9wBJ5#P`>=5 z_lw>*!|c?D3)WZ0U&@xY8OLX*2S<~piICs|GjSkDxO~c;pJ}tP`N@#(+B)AEGjBrivo_S!p%L5C)cV< zLv`}m*NgpAoi*ZF+{^YRA`-gc`QsF1z9oL+Q9ZEqN06C@cAmSiUU&WZ8Vp9WW_Au+egp-dhhhB2OG6lqlss0+*|~< ztZzvDP$i&)xv_Jb{+8%Jxmi>lRgK$8uEXX=b?5qxfB$&nkDuVq9)i0kDSZpOeuY12 zD3;!M)&*r?kP9w*bJ5KpY8wU%eb{U z9#yz|L#hyfrf;GOEU*3CEhPG>m;lf(sEmB{D*?*bzjr+ymZyM2AZ=wQx;bTYxWgT0 zNHtWT3RMJcGYa?8)2;p50qtjp+wspbOoTG%>>ii^yjo_M&2ez#i$=4<+_Sk$nXJie z&2Cu_aIPaCfMqR;D6+zq+g@%6>w?2p908^!;{6~Nyr{dUAx*q32;ctl}Uvl zB3AnXjSHX}G>&Vl>g4molcV|B*FQ|}+}QigyLk6D?%u#y5v84|`boE1fKeHw2UJ%! z8+J1nXql1JfQ^7p-kFZX)Q>*@`s~rOiD5&7Btv%OTy8-b=~qGSuFW9kZATy&#M`+| z&y5E(ZpqR_<2VGL*NcbE{$K804`DPO1n#s~pHk=@+ATODwP8(jw2Gs^Lyn-UHxzU(Uj1-7cu$M1|rqfqG?^8D$srZjaK zL)=XvCHi++R>1+w;-6(vQ2PcHn2Sn`(N%NGG5My3;w;--!ZYj!iYv=B7KG^u%qV`qYmQ5XmRsjr@ZcI&a!y>25AMEc#x%-kVi9P!>;J2^=V z2Y>sj`R<9OETR#bOD0_2V%=mKN;gy>TAOe8+lNI7fVjJ>LZl?}*}>85+2Pru)|CYDsqw# zG{@spL8Gv!GOqF{Gy%FjonGJFytcb}ZFju4i@hCeZ(yYTKJ&|e7w^L0p?ImCS>@Lp z(7b3YK6^TwFHX-tHZiTrA9S-T z5AVI?U2bnCbPq?`{<^6}Zop^%^|B2C}!EokYZDQ%&k2SXH%)d=PyVsJ4JDw;jb z8k^V6>EiLTql52$*nH>qwcoxkAHIX#4GF6|I}Sdy&(+YM|8RDwAP?Sg$z4Sxz_M!) z>AMU`#)o&eH#Q~clSQr{AB-1@REq?W<$*!aNBmM2L`c5_W;cQ*4l&D($tcDUV3zAV zQaL*~-T(CKxHY|Y`?`cJlU$8P%g4977hUf=qMwcl01XU>83d(ygSDUOUZS^vL9HYJ z}<`qHf3{Tw7H3$DQ@pzZv%VV z*xtZ6LV+kNcVWPQ8myMGk%GCa`a=_eA&rTjc+pbgP zqCgT&Ze>%S(tR=o0}u?-RiK-Q0^%x;;GPv4t3}Ys+c&YZ0TE=AN*!yr4?wo88p?y5 z;VxyPPzR8ZDkw7WmoFB7`Eva2Q$MQ3gF}O8*&RSbl>^S)+PAgA1$}7)0C5qBXDb7- zCE2b*OqR07xmdk5-TLhZH~!mi@$vh(wt=dj#F1s)|FEvE`|mO#c)4e6y`I-!3&-+f zGB_Yer4y72+(aV)xMSWlj}FGib(NtaW>(f>xkw}4HE3(&+Wx~|N~T(}2$51rUqK>7 zJ3Dv6c!q=1ogen&J9lvRI&STtLc1{rkYNcPBn%H*{XxyWWYOg>qZ;lnCT$?E zQOd-1doQa9H{9Oc`k()TIDYv5{^#Mh2iL~qrfEWq2G4E^QHN%zmcF|%S$5q;drMRd zBgCli1Q$58tkbU+&Gd1q|MFG6vpM?X$D>=@fSIEVf0RNyakyD{L3>c5m%s#oF6ck) z2A^4>`=(nySXMSkyT4~Yz>*!Ra6z4r42z6K!tt3s-amf$xOs9o`|5{qR_7)~h(fAl zWAg|Rcd>RSfcDeBU$giU`hsRN@9Ud21N}7wX>!h|$&MCh`s~nx9``Wd) z-->r`Vs{f8BW#Q?itV6H85(M@*|K=(HlxjOb#GhI4a+muBapF6&&`e|V^*WdlH2XR z+#M=DXa!V$w>*v|C2;qQc4WE?o>@>CSGu#|qag00(iQ^!?Dy>T68lLH5fy3crXU%) zg1~^MhxM1=9ennUJv-jjQK^*c-wuAE1*filpWT865ka>npP41ereT(I+OD=geEZfP ze>?i^``FuDM*lBi-JYp6a&sHg~XN*eTB^xxl2>x%KL8*3}~ zZnGMPrapP_1b@Bv*3Kp-BkWF8HKToxR#2F=OBDDvqkjMs02)~RM3%lzqdR91?sq}I zXo5RDLZxiTk{t#t43G9tzIkx+%@6tUAr8-U)<}~>YAj{R<`9TjHifuo=>^n&6qk07 z-5;~7e8w%?N_JDOWz-YyBBCOq>ZQp;%3*=#%OBGB&*p#s)~BPeySZ`q=H3Ty%iWu} zwFkAV=H2S9sG$PH741qd$qI+ZvZAYd^!kHGySdDp{sG-jIuEqF@N|P@%b%LzY@W{M zRyXa&3vB|RJ{)!)@NV{C8MAf+W^p>++}lNr0J?hOH~rDPnyxknCN27YJ&YZHzYFyM6QDe>?vDN7&nF-=FLC z4A75j`+jy|^r-*D$c_MH$MHNrKCoFGAbB+!4h8^mP(*~j%|jVJ=<>nma1M0230FJe*lw>|YCQx1QuiquUD~}=W(}SmES?^o z{_rF}JDxvy+B`XoCyPmgsjG<0L=sd~wZwD)fBb&}18-!p!n~w%9*iJU+B%$NA~e=+>TG+p2EwP43>p?q&>tz~GiGsKQ(X zLB$|_eqntH%*Bo^8CO-a zsHNRYPJjD8cBT+>H<8F_gMLI`N7_~j3Qp!H zkDjLaLg2aIoTc4udRZ<%yn_DJ0C(iUM3w`=psHpj$w#9QV>K6B9GxAXoYqIPdjEL) z@M!ws+qiuV;{Y>6EmK@=9g(0kqw^QW&zGFv)(&}Fi!)Z-xi)P+x}DR}pFT_JFeZ#d zt#qu50+q7Cy{%5fmA_lo+n~Ff0MwzXbzR#?r{jsu)6u>A)%M2b)+XNClWA-h!IeXd zv>&ineSU~~OaN#}x(x<1HAxxYc0kmv;{uv(aAASA(@plgo zzIiZ8US&)&Di_V(|z>9I;4_T zcablr-i?pH(Uz4>vT|hZw|DhE0dOFjAD;Nhys}|YmX+Cpm+#S$1xX>(5hmk)lZUo9 z=$rqLUQJv0w9GFxDjcW{KRl~H`>whF#82l)1_|NPO?RJ9y$#0_+yx3`w=8JJTD^N~ z=f8cd|N0y3Z9vO@8Zoco<4-TCANXHx1=sCaJ*&?i?|ajT+i)*%>7xIBupeEYoPNk( zpYwXoIjciOa-F?NDn5=nu44V{BtF9F`b~=EbG(SnK*xO{zCNQm;lfU>FPL#!!VFR#AmMB zHWUdENrtl;j}K12c`*O>QF?Tc9v|kz)3-dv?4GTJ7%n1J93dJ!inPnTx_X_Qa~bzV z7ybAB4PYL zGAsWcmMp~+Fp5Qhe`R$#z{y+aZ`t5tTzKPPYNhAXeY=jFfKWSabYPF0H zXFdf8rT2~FWOllLIL_0u3Hz#M;{^cY6=q_&VB6Lmu%}iapE#!w+yQ04r&%5V>tO`Mx2Hd^2_s8GLBAw2f z`fwHmDw+k^Ttxap|KWxk!+Y01AOMn^swx~QhwP!T=7(pG|Le0`w{BokVS5~dHkMUY zba0p?`bn4o&_EZH1+>FA*4MOXKPfAKh#{Kcc#iu|@o@j}yB|&-JZ_#G;$%LqeM3U7 z7v|k%gLpTnFLiFm{!2x^w6XKWy`uW1z*oBmgAu0TIaRF6x21Dvw{fs%z_r{>QB@I9 zcTJ9zY~J|6sXaNapPe2)KHk0iSZ?p)gSW7^iSfAHXaqr7y?SBnRbG4ud84cxBfI-m z0`f8prD&^u=g$uPWUkrW0r#Lna0+xh*++ZGT-W7I{08-l+4nwf5`yvHEsFd$Fj=)GGzzkhG? z@4vy`1|pChqHrYf8hNzVdoj>?{ij?>OM`Sr3h{Oe_C;NvoXw9;DzgkPbt?c$_}YIw zwrgR#iN1>;9CIECn8E@3p>64^znly zCwt$I?q1(LosZwUjkj)M9Q$ofMdZ2dBYrKDw97K|=gE%b>G%w@Iyjc=O4~Hgt>40S zb^h3gJ&mC|L@<@_s=F-#vvXp z=21fwQAoPVRhuBVz!8!o$~+)#jW<8Iz5CyOi)))cQZYvrN_SlV6I4IL9i%swFAo;h zjoG(dl*=ru8S2JQ=5{(4i^C7XVe}8I42^47_*sJTJ~tRjmR(d7VwO`bA2O8&MM!l6 zU|PlIq(1rL{^E4DI6b@Z-+vFkhTTncy)@x4tnOd&{CnBoFn3o~2QpkB1_zLXhRqRv z^Y+%PUYwlG7YjYD%W|gvN=mxWCot!>-)>h#02+h4do~r3sBjP2CyhV(`&V~&xAgWk z>`wZYXhi=YCIB=bfWzIy0a29ovfZ8|0YG+S!SOtO_SK`mf9X$-@!;ubk+%~(BM2l! zSD$&7Aj?4xNCi=cDcn6tTa(!Z`Eq`^ToAjDPPu9TJt*WX*RQ_vL5#jX4@9Kv@FOCQ zkkPIX3+-fd1M`frgt3Sm%@?x=kDi@`+k3kozq|R{5Ag1-^0*|+L4(8FB@MrhkpFoG zHM0hHNbpjou9(-eCkJufc*&?@Xqu*~s{UB$gXc%O%9ETkfU;azL=d!5-`d?A?QX#m zBp_vtA@{|v>&H`)Siv1GIG!)Q{^8)WZ?=w_N_3H$D#WO&?#R|9xfiZsFvHfSWPJ|q zK9aBid}p%rZy#OzAHT!f*HCG>C{Xsi&~f?QpZ&hlo5q1|r`kTOZ}*L93{MZ!!O5nF zDtRzS&^(A;`(uQA8}3J6t_o-`&~0GXuQCvUNU*YqMMb+{x_rb`A(n++(XlHrKRY}4 zzn{&IPOkmyZ#Mq$5w2~uQxnp5Z)+p_K`(>lo`V-&?xj3O1Q7y9K-p>rIUwv!@rMtt z<@_Y)**6b$kt&EnyzG}!)-9+64Y_UokMbwV@vv=ps!&JS<}#u5tAH<>`iEza|9ha@9Zc^^*J$XUH=5DkfMCl{;kLBBt9e%d=0QYiPtQ)%tUfrM z&-afu9^ak5dmFd*;-o^#5<=G^$E`F?dh<7G>C67luQ>C;vIh}lAUo!bERrT0MEox9 z&ns1383SuOvk-A|yDTixU`USF`7SN2xS$z~Dg@WsAbo8V9HN=HZjS-#hy9z8uX)wRw~BC^l{o zS83Zhm+_m@0C_pU(^Yo*YB!j^9`yWe!15P=vSHVSq5jjh-KVjPB=sxO$~hwDWq$%M zw>+0$tCKF8=4949Ih=j}Wb321_kRBY-o1^@@p4U^NIzoTmA0$)`CW~OVl09DEepE-ge8M5Qx z?BvsLPd@){bKY1+)^=@#xO=yT^0{xBcJf8M>#U_Bt}++%Y21A8=FY!=9De&AHpV8_ z&61UQo{|Ft&LKxyCG9K3u>AZ(DgJSV2RoiMr?Vg`*}X}XdnnIG{h!~C_II(j1$H8rRr@-0cw2M< zK!;USg2|>Zj=3EVoaK1(>h$kFoPGC1563c|r=|7Tk;@jLY}kxS7q|y)&bO|H1l6c7 z`&Z^MqD)&QJrUOf1M2Z-Y=|kFfG8dcGRjD@0DqPjvzOzunVrpgFAn?v{(Fov^b@ef z5%-1*5@Xj4P4d4ErG)CDz$(2J22AJSbWCM{8WDvU0sh)4P=YbVbyop}fk3Hq8w2#S z*kfJo%iHVQ-y|&SFNDb=eD@^(`BgH`*{gvpCiY81~Idgknax{JI4yVA&Em!9u zn3TFWJRAS;Y-4{DpWj95SQ_S2hYs(8E&%AzLfw{2fDl80Qt|xA|NQdwA3sI!f0I*( zMB!C6z?f@6hB(j5Oj|SFm#tlP0o&)pFn`Xk6U$+}3a0>2N~Jv?Ew3mXzzWeSLZJE} zgQ_u!NNUClA6}f6GhaSCOvbtU;vT-dhmFikgDNxA8`J041DCPxYmM*a!z|BF#uSu6 zfkQI^2P2-IRX3E4kW4Z5x{RU$@El!h0_FaP7~ z@akk3IG&C;3@E@Du$tL_>86^Vo7ix#8W>a7?7{x#fBTC6@;UZ4!9Y+a)wt^=&)7Py zL5GXbluTo*Nc%}s^wRBzcQX$=nc8@+v;6G%G|UQur7jT?^&Sc)(s~eNOcH4w%8D(M zO3iw4SsyKcI61x~kQ&u9+67P|M>JUI;`zxe_h&P|9e^+HqwkRLQq8#*rn}%Ss*U+_ z@-ej!Kjw+7FwF)j9^KiP%(te~({F!KUnr0;gh|cL59*6NpS5Z^>X3lqGpb^ec^rKI zOS#?O-P^^8k#bj&>+sK@3jjK_(AaMUJTNQp{NVH-Kc0N^^Ww?tZ0<*a6E)SK7Bxwz z(&>-1#Z}XG-d}6v9X=8?d4H?m0N}bY6@b5A;yaHd_JC7&{)SehJ~6_dwCdSW)N0|!HmcV zNs{!oHaJVbtrKWq{uDjX>eL0p+0_61a{R-y;UrJs6ch-owZrsl+lg8K<_?WN1jk{N zZvEl2(Z79#{Vljy`Dz$|K-=x7PqhWR!)2hQMW9w-U-_>>=%=Iq_NUSBzrxX}zBm}a zJizNCJsB^~CVAnx26Roy8H`r~JCz3Mh ze7ax~ae`o4-G zn_9HBkt^-(2SQozG#Qexd=1np{tqn$ssT9Xg7>N#$jq@Bys3IEkIs&RUrcA)ho{3o zJjR1P^o4G~oc0STAOrwjYhg+Q41PMFo}6*%Rn_8X=bB1#S*b?>HCwqPgp(}oZ*EZ5 zFmx#@U`F-5PY%)3Dg5lmr{nK_mhnPBs!9Y776noQ6JowlFYN5d8 z4ithCOj759&QB)OzyF-i=9>w!&u+Wjon?m%uv8^pivgKP$YKw@TC&1QLVHcdlNRU={| ztEZ#I1+~4k)g_R?1dDUPpuL1gePjs;wcfQw&A#h$uHFRuHDZ1Jx8-Z{5|jM&ho`fj zUkp5@%-)yeNMU5CMLj`gq{c+eAXRSNcL5r;NMg`s1naqSvv=>$U-E-J^c}bob5v8V z#nGwWBfb14>d@i*g`rW*hCm4gpfL0YJ>KY{^e`Sx@Asa*oIHJ19-M~Pr+Pe@AB~d$ z2_^U8Q7d!)@)%4uZU*ilk4M7YLLFTa8OaJ}%>11YSC*f>S?HdylHCm{& zx-71q!z#$3I5|fZ#Qh{G$MffZ{dV-=Htp?TBV86CngegP*4)7LnYs4%v%_zSE&#aE zu*%_3R0%weUwQOG%woT0%yWAnHN!;l@~r&F4^RK=>-?8jy}|~8sSFG<3c}3bpbEgT zuz>*9YKl7=?E(X$5F09OO{yJhAu_W_5N9SOzz|>wOJ(C4+Cx1WEJhd2)~wQrk>w$p ztxXVX=ZcAz;}Y8>X=WCp!h*E?r0Ok=r`cH5RW^^tPpk*Zlh+W+e(KcI?CHVN)A7#B z!`uJcxtg%Q84(CPIKQEr!|Fy<6DmBLqa*A6Myg6F%D0^meFvY^wW3TB~({ zGBFttG^!pIWCC(tF)QtxC;4~J(n&GmWU*LqniNnah(Q#Ik2hCMUS^b3IYx;g^8ipJ zGz+E6lG0RIX6Ac$wtHXQOaJgWHnTWmxbE3lUlgLF^HE==9sX4~=T;Js00M5TE(5(J zt^Sre7$AK&`h5F$pW|$1PhL)+yn6MIAHvz3#|u{kr{G{v$uy zCC>X$hEm{cR!sl)(`aiOpY32Xi$*v$PH>16supS=z`6=vhgEa|z$Xd|O3YP;!3=5+ zMg{Qm>*Bw@d-jj-%A@fhaN>iOB?Tji(_LYx>Xgy>i^bVkat+-0b=3>F&Zb*U5)Gq9_C;%nj8$sG6CN!=V6x;$jeA;C(goH0D694jYmrQB?$O9Q{iCB)-Nf z`Fb@AAs8yn)5gEA4zNAPVAXY{+IzFQL>rGW6BmM!X%;L$ozH%HF;VWHoyq^}-=Tq0 zN5UX@4P;ps~=m6n^q6MT}@ibnH5(TMH^RGUt6Z7t1{_?|;G|(WJiTE~i-Ckdxoxy`q(UmkXY5 zWmTfdP6+9UG9K-2jJ|y6pB@uvuzED`wDv-lvFIB7(ak$DI2|78N1}@SHc48 z$>7WT$?@#f(Rh9~?SoQrs;a6@1H;%`iJE17D7x^ z*`<91b=C3Lr@43d#Lxu*HyX9Uy{MUqVzMyOGe}8JXLxyX@_+vQ$fnWiR7%fCigozG~(g6P);n8Hj!L`;+<38}#>&V_B-6=UkCnO@{I zW_FepfLIfVL=+{IWw{)3#N51~8r!aBOp$8BhOqpcm0hiRg6r+a8DUL{*|3y3TAoh> z1tp<`xb$Imbo#=3nVdfAr|$E6xW5NLSz}5&Rs))^Mw^ev#}@;%LFatLxKf3Hv&mvM zSJgVmy2@5-WqKo0LYgMDy#?pMO+Z=CWV?KgyEeFpVUOn25>RIl9e@B#^68V8uYY{f zpBD*nD2t?@1@)2kK+Ro66{oIoR;qZLkUNk8ObNKmi;!?RaGPJ;-~Zwf9^6Gr?P#hJb(QkU(ZfwBS|eN>akzVz{=)u ztfgHMpQ%*5)IjV&2@846PbZ5296{s0Z-4F$GxWBJYo;p^>Y!qcwAuCWbXY?d0Nikd zT1Twu2LS5KApu5Yf|D73cz*J~znOgVvpbolN^BrC2VxO3TjV(sXnRDLsy4tn!0Qj=gp z95qQ*6+|q|%-(x|qTaK{A@prslvbdE`XtG!cNNa9F3stz*x1Yl(lRh(AW{Y^$GJ|6 z1N>vphu**c4i9!kt$;F1X#Bi2@Bbt8!7i*I#es3EQFX5vPyIZ92M^NB2-O#=1j-WW zXK>Q|d1XxW4Nz6Ov;sf|i;X%4b07p@T8_W@W%~1rtTgtj-iwI$-W(BE?m`Sr*BqcK zurvflApk&L#f-D0zqf_Y@1tV@6l;K3_5RN{ZFlJKn;=llu#e4WG1P?#aS#X- zT!!9l+3Mf9yS@GT(w^PCG+};C;rD8s%sC^!sN@ z*kvT?=dzgv$H7cZ9SN!l0aus8WkCqYfQPq+#}AJW4vWHbkPucILQ74jsAx;3h-cxr8PFh!g`R zQiCTW5J{RC;0em4j*&Xo&p34@gA;MiftiGrK+HrWQa23;jf{Tpy_JE3A!wPG zv?&92g_uU~a65I}Ic!m>c^{To$T8t(%MCF~eP z-ivVl;^?J)y{|gpKjOiyG?mg6#G%R1v;(t`9PRb5;pG=$c5+tE7mm1@qVx71q?s`@ z%v2~H4SJg+kW~cskN~agjinERpl*Bri+CQ(w+PJgFkkra; z#?F%3Y7h{4D`xrP#o_$P%l>Ek*x#tmM=fAleY&meONS0^bOFGp0a{@MR)boC;dqK~ zpPl~iZx-J@* z8%#*R24f>rQ#DRplBLr!52jYdP4Bx%2gUWUX~|CphQ=>5lk zMTxvH?A#H_P{mh$n`e*?7v{)~saEEWWaMF6dvv>NHg_jVP$3ohCl z0u;s|FvA-bEI(dhbnQC;R${%i zb5vh!#PJqAIL-g@WAXZ=@8P^LSVTOGQfI;QDh&^-ZqQ06K>Wdp&m`U78a%%1zIcFP zT7_6ll{i)0y>r!o4jq15EM@yq-2-Ak(3qczf>Qx7=Op9wFJJE7yFI+U`|2M*or+h7i_irCHyPaS`lqEkz<~LHMZhnwU;qF9KL7eje-S_~Uo0|` zIP6wci6~3609zCVyL#eC9GYG`#4+P2KrHAQ12HOK5LGW0g#b>WfHyNH5>a7K7KD;v zpErjO9^Azsqs;+r4KV82Ak|(%i7+#qLy{nos$xuWayoz(waEvRC6#{T(H;tKc}a^B zd5N>Rp3N}LC$A36lSzJbs`ETma>NKq098s45L6Ckb)IUnlL1Ecgap(_T1!x)B2ob$ z4a!W+tgsM*8kpIWks_J<@apvBuRnlkpkK-3+bk%X?*%{|2z<0yTRF_?wm1a}AI@fB zo^w6>tsMir!JDiYV)fV^FXTr3WOEn;fJ*tNrr^G(UfK39UD=7ea2si;0#76EF?P{+rR(JeRc<%edQQy z5OwZ;hYyMK5oTR7tZsF+z~+epNQAOsiex7n_8#r+jKBH$`0Jk*&yIUcnul0zmf94* zLk*RHa<&i=FozJpG$5zreE!|D<3WEXOYzlR%1DXByQOBRQke@d0U;B*yF2*oPH}L$ z_~Cg{RxgPQjgJO_!3yQ-MsALZiOtN2G%n4|0u}`+<}VJXzr5@{yoW44l6J91v1T($v&SGZ2W`0M!5>VTm(F z+iE{C*OG!w)y#-E2vjw)bV?1v0y8$GU{bZ9;v_J6QtgRs4QXq@8$H?I&h~d~Z$~x; z*xINjK*fwpqrA{WFLlH3as`R&2MdxVahz1a3?iuUe1YkLUmUoTN$=H3I5?xTc^J>b zcxE%Nv7G9JRL%RQVIYwtKuL|6*-TZXk`-F_M5C0OuZFcFb|*tPx@9Gq5T!~?G23jF#u?9;l`+dzTq&K7#17}yy5svU!P2#zwQ;DJXmBAN)RYD!D>@TdAkz?% zG=+wypl2;ss*fiwhEH{Uo|$}J%0ebTJiGOW-ysv+8fw!-RF7niCs&%EI&`Sf1pqf3 zakP*Tk#J?ef??t9rDVc4ZjA2k?R<96J-ChiZHzLctZeFp>+a8rim(h_ z08}KIHloaDwR|)+0Rn`LDF6zxB(*+|?)(l5k4cWx8D5_*p1wSO@?!q_IOM@k=Lkj0 z;@FWvjD($;sl{??)a)Su6sjQxKs9T|>Ky~t_YIMiAq)@&Bd=~6%2%h;Z=RU&*8ljE zyR`u#Z^5yUaGafd%{(vz76qmYDT4(gy~^5KZy=bmSx~ja@vw(M?QBz{2N0J)8XaG$}L*%Xer^x@%kv$Qbu;jkY#MyW5NJo;~~j{#Q0B%4zP( zGPZVE&@u!ezL0)+nO(JdIg8PVD3SmIY*IY?-+#Z=ldb>fUtF4+fS5xFjr{amqV~F} zdQ1pA!@;B5^JlMTh1Xf>gO z<)sx-k%&h6(;B`3Q6Pj$qyP>CH3315K!ItNV4jlO8fJHPN00VXI z2H3bF)>x(Ni8hrXe(=g+MQ9xZEbUs18K|m$5MU&fiUBl8&`Yp8!o8i|XS*ARcL%3a z|Kj-Ur|0w6$5tpWlyk3M0g$j&qsnc`n}$N`#rY%fLXNAY7~|4KPCg+=BO-p%%IJeGhg6j%tb&j0?aBYo44G!F{vt< z1(;?o-5g?b*eqE$FlqJ15Q!8h6w~tTr{^a>KkF$_pHHj#R`H&edf-=e5uyq}6Bdn= zG=N}AssXlu?L54*^@q=~zZDX$n1RHd+E0fMiWW`Bn#i{m-}16*UC*vpg)q!il|?X0 z@zuTF#^C;_cl!0ulkc9S)3Q&FgIWjz(o1`SFSzlz9-r5Y4~zE{DYAgGr?2flzUdE# z=^sC%-4O(QRSnSkbGcpP7-e{TclTsEJ3cFmQ!&JeWl zB^Ze$LQJaGR{J@ZuxZ19sMfEhK03<8Fql~&7^5U;Pi%KI+TR-7+w0%o>wR$_+an|n z1Pdi`fJjB@iQYf3Qfh6v*INJ3M%6e=%?>T!V5T4lu>v8^oQ+bWLx;i6=X zumAVg4|+ZR%ja&CR{ZZ~VDd+Xn1EaUQls)6XN&T5%w-^3pKAG*P%{C*B>jvBJvav4 zQ2n14A-B1ntE)H0ehSPA9F2?DCpw-xU*-B6EnT!qbGWGSSAyB8reQt`~0-Vwy(zBF#|yZ5%D0w!&|+rk&ODm z(fr33;dGvOWx84iFjj9Ls;!(d0C2GFtT%gc{Nn%o+ru>Bm}tNar;}_zk9U#)kECb#YP{(mBtH$B&j!5je1(kN47m;ZGG+< zmQ~Kxnn69o#RTVq3ZmFS*8k(<{^t*HG_@a}AN=k6=}#{vC)3$tK~O=IT@Y1`nx%$H zmVQlfqUl0wpQOl}a>Qn)(9)Dd$cV}ylYI8mi?2xZwz z`(fsbpI@Es{Jb;h>|R_oN73P^_ztLOrNn~aJ$=)EI>63!O+ zKYlv?+YjZl!)-6@)yza-(?B1Q5L(%FqxT9oIYYfLttpiMMB$;@7#KP zzxQB|?(boL8$GFJ1gL^6svU+95bFjjx)6qFnp;nv8=Q1WUZg1npj{0x^PY&R&fw}L z27;1FPq4Q^S+aj?d;j;xv!9-y{Pb-6^1zi!>K(B&s+4MoniE2;k8k<`)@&>poWVe) zAwWwbW)d(N=^{+Ne|9kJ?+yBRbQ>8%NKN@;^2yfE@I}6I;+ec@ohetZj2b>YJs)E+DOK3{p=RTKXdzu;nPBDJ| zI{W3t=EK_refD(;cpAoJPbH$)cz++=9XxHv`t=7oOu9#ERKSQrQ!^LS>xGQoc~HK-sDBD=eqY&2Q3OPwH!wPAQE@3qks^FCd`l$b_duR z;Njk2f1}*#)6b*u`qUqu(ZWlx=q(ZRg4772b$?YY6&hoJHHZN|I1wW*p;ZSbu@EQ0 z!gz7^-IJ`}-^da?xCMbRUl%i76=%%y*?c~pB;LzAbpRWa8DL1Vw7;{BUJAygL+h{0 z*?9w6W&QS{C?G_b&Wl%vr_Wyvix5X~M`qnxw25;fA@M3CK%Da-BuT=?MF`o>#^|$q zxPJ>9y-0bE`k%}kOt~uobohWEi&MNKXeH* zzhctYr{QeDZ{LK}s^zwa*0VuGLS9HPDs*~ydhp%PgZ&-XPq8z&%s5>Pt)^^5f>R6t zKmZ7? zVy%)WVVww68A^kyDI+lQl>9L5Kib=Pd~fT&{|P$-3^QbriNmNgOJJ~IMnp^;wJ$aJ zBs%D^D9lvvzg;layqzYZ)#vM9wJ9LCO98R45QiT%%pz6hdPRXx`i!scZ{4}Ib?^D< zw?7|${ZnyphCEOnL?J{{ZDs{=TWnQEc1@^(h=j?TnOT6bnwUW~Gnu_SImv$BxP1$w zJ~k5clI1M0)^dpUGp%n2@7bW!`Jd`f<@j@{mY3yhk$MHl?0i`EE8CA8Sr2omlg$CL zB(`y1JQM8(Enn?3N&rmZ4X=-OfaYhB64X`xz)F~ z`v2q4_lCV!fB*jM?>`Mnq@fy_Fi1pNQ3$oo6qN2mXezHp(i|lb^Q9T-`(r? zu<=#hmay`!72Di4%~5-UmMdBnJ}{6F-QM2({Ql|DBtM+?5MvvQJFsTn>9TuY%{f;D zuV5_7#p~nZ#ZkJuLA%557Vq$@=mLQ2hG-oc=3;Fp6jo&qOk=_%kST~kTqsV<{2xzG z|LdpzEHIKH%Y6W8w_ms@w@w5dz=0Hd$0cX{p5#d>7?ifvfN7`08w+=U>br0F>^3ehSe<-qNvWP zbEUx)OcEQwz%YY=pgamZe}4SS|NQHtEW^KjA&P<#fVBE%&4>bEuq5_nTXlri8u$1f z?R;H14g`zFf+`lT1VR92KAg@m_Zg@8Vv)HdT&WG%z(I{E2w~Kdy{(XOoS;xgZ~$(U z-;a9kZj9`#;s$7Hj8e~jd_MW*^~ln&C?QTou&QewTBNp^@{hxSxehx^lrBqQRtil9 zeCvz5$>Y1o81XKvzD-gfiCu{|>D+es$kFDcuM*pqhPr;fZtIE{>C%TL!ip9r8#2c2 z4U&i3TfH*j{D&9eXgUlm!HCEwt_YrJC2t=K4rCSE5OoQ6xj#u7h`o6QSlNwB`{{5t z_-Sx!6Zf}}IS|S+BuRoMyAR0P1TF$O24Ho+eF~|od4@!=zrFYGzdQK(>HO%_1xo@6 zu?dw7ts|B=Uj^sx)aV1S8kj9fyy?*O!o(l_^~bw=w=fz?S{Zz?Pzu4BucwToVh3hz-v%7 zb1W=oR#+&tm=9e4!QSq_f3@|yM|^u5qaKp;q)q_m?Ec&1t>5$ZY2)?|E?*dZ>dhWf zN&DHujnUz7aP-YjXNTjyLth1Irs~xbkuaMfRO&^`WRlgJZalUsk6V8pgUl-j<$%Sj z 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

#6%y)TfvgBrY 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 literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Assets.xcassets/Contents.json b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/Contents.json similarity index 100% rename from Drink-O-Matic/Drink-O-Matic/Assets.xcassets/Contents.json rename to Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/Contents.json diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/noInternetIcon.imageset/Contents.json b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/noInternetIcon.imageset/Contents.json new file mode 100644 index 000000000..9a6ceb170 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/noInternetIcon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "no-wifi.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/noInternetIcon.imageset/no-wifi.png b/Drink-O-Matic/Drink-O-Matic/Resources/Assets.xcassets/noInternetIcon.imageset/no-wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..c07845802fbe8cecb718cac2d87a6e9d1b9f8e93 GIT binary patch literal 17476 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

  • V|rzi=HV18LwmY2@=OG^|NE|J{%yzyzOLQw4y0{5?0KZ zeC(v?zeGa>%C$j!fiw)|vzl1a*WcVozPLV-iB3-(14@n#S5 z!1Qb)KYDibaH#&;ESNvQ+~}0v%QYdR3nLMlNPrV(teubsuv>m~%6Q{}Ur^Bb{Wv-d zZpX;GKGo>Ja00Fd+Uk+S>~5OcSh{4D~&l>b85+!ffS@^L7hMnkQH%82K}+})@m zJOwE~=u4(JrwW17rq#8Csn-Vv_-FGf)S3IS3$GBw`w2ag)j`x}9#9T=q#a9S=}%J<0c>g6 z)F9WzcYmUmNZFAN|`QC zOu>}8v=8L9cbdrT>qNN$mfQrxOkIRCYd`e5nyJOXNqvJ)AZe*5zCW}^#nkt62S&5w zWEm13L4y7S;Gys;gs6L94J3$yU|@(i@VoviIfBABwBDoA85=&2_Ovg+MXSh6(A4cguE%fXirMVLEkL$D?u9r9sAy%Krys4phGTE`#U*0000V literal 0 HcmV?d00001 diff --git a/Drink-O-Matic/Drink-O-Matic/Resources/Constants.swift b/Drink-O-Matic/Drink-O-Matic/Resources/Constants.swift new file mode 100644 index 000000000..a755b8c7d --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Resources/Constants.swift @@ -0,0 +1,43 @@ +// +// Constants.swift +// Drink-O-Matic +// +// Created by Ramiro Coll Doñetz on 01/08/2019. +// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. +// + +import Foundation + +struct K { + struct ProductionServer { + static let baseURL = "https://www.thecocktaildb.com/api/json/v1/1" + } + + struct APIParameterKey { + static let drinkId = "i" + + // static let password = "password" + // static let email = "email" + } + + struct APIDrinksFilter { + //Filter by Glass + static let filterByCocktailGlass = ["g" : "Cocktail_glass"] + static let filterByChampagneFlute = ["g" : "Champagne_flute"] + + //Filter by Alcoholic + static let filterByAlcoholic = ["a" : "Alcoholic"] + static let filterByNonAlcoholic = ["a" : "Non_Alcoholic"] + } +} + +enum HTTPHeaderField: String { + case authentication = "Authorization" + case contentType = "Content-Type" + case acceptType = "Accept" + case acceptEncoding = "Accept-Encoding" +} + +enum ContentType: String { + case json = "application/json" +} diff --git a/Drink-O-Matic/Drink-O-Matic/Base.lproj/LaunchScreen.storyboard b/Drink-O-Matic/Drink-O-Matic/Storyboards/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from Drink-O-Matic/Drink-O-Matic/Base.lproj/LaunchScreen.storyboard rename to Drink-O-Matic/Drink-O-Matic/Storyboards/Base.lproj/LaunchScreen.storyboard diff --git a/Drink-O-Matic/Drink-O-Matic/Storyboards/Base.lproj/Main.storyboard b/Drink-O-Matic/Drink-O-Matic/Storyboards/Base.lproj/Main.storyboard new file mode 100644 index 000000000..9a2f51e24 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Storyboards/Base.lproj/Main.storyboard @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Drink-O-Matic/Drink-O-Matic/Info.plist b/Drink-O-Matic/Drink-O-Matic/Supporting Files/Info.plist similarity index 100% rename from Drink-O-Matic/Drink-O-Matic/Info.plist rename to Drink-O-Matic/Drink-O-Matic/Supporting Files/Info.plist diff --git a/Drink-O-Matic/Drink-O-Matic/Transition/CardPresentationController.swift b/Drink-O-Matic/Drink-O-Matic/Transition/CardPresentationController.swift new file mode 100755 index 000000000..9c15a740c --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Transition/CardPresentationController.swift @@ -0,0 +1,57 @@ +// +// CardPresentationController.swift +// AppStoreInteractiveTransition +// +// Created by Wirawit Rueopas on 31/7/18. +// Copyright © 2018 Wirawit Rueopas. All rights reserved. +// + +import UIKit + +final class CardPresentationController: UIPresentationController { + + private lazy var blurView = UIVisualEffectView(effect: nil) + + // Default is false. + // And also means you can access only `.to` when present, and `.from` when dismiss (e.g., can touch only 'presented view'). + // + // If true, the presenting view is removed and you have to add it during animation accessing `.from` key. + // And you will have access to both `.to` and `.from` view. (In the typical .fullScreen mode) + override var shouldRemovePresentersView: Bool { + return false + } + + override func presentationTransitionWillBegin() { + let container = containerView! + blurView.translatesAutoresizingMaskIntoConstraints = false + container.addSubview(blurView) + blurView.edges(to: container) + blurView.alpha = 0.0 + + presentingViewController.beginAppearanceTransition(false, animated: false) + presentedViewController.transitionCoordinator!.animate(alongsideTransition: { (ctx) in + UIView.animate(withDuration: 0.5, animations: { + self.blurView.effect = UIBlurEffect(style: .light) + self.blurView.alpha = 1 + }) + }) { (ctx) in } + } + + override func presentationTransitionDidEnd(_ completed: Bool) { + presentingViewController.endAppearanceTransition() + } + + override func dismissalTransitionWillBegin() { + presentingViewController.beginAppearanceTransition(true, animated: true) + presentedViewController.transitionCoordinator!.animate(alongsideTransition: { (ctx) in + self.blurView.alpha = 0.0 + }, completion: nil) + } + + override func dismissalTransitionDidEnd(_ completed: Bool) { + presentingViewController.endAppearanceTransition() + if completed { + blurView.removeFromSuperview() + } + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Transition/CardTransition.swift b/Drink-O-Matic/Drink-O-Matic/Transition/CardTransition.swift new file mode 100755 index 000000000..f60175e71 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Transition/CardTransition.swift @@ -0,0 +1,54 @@ +// +// CardTransition.swift +// AppStoreInteractiveTransition +// +// Created by Wirawit Rueopas on 31/7/18. +// Copyright © 2018 Wirawit Rueopas. All rights reserved. +// + +import UIKit + +final class CardTransition: NSObject, UIViewControllerTransitioningDelegate { + struct Params { + let fromCardFrame: CGRect + let fromCardFrameWithoutTransform: CGRect + let fromCell: CardCollectionViewCell + } + + let params: Params + + init(params: Params) { + self.params = params + super.init() + } + + func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { + let params = PresentCardAnimator.Params.init( + fromCardFrame: self.params.fromCardFrame, + fromCell: self.params.fromCell + ) + return PresentCardAnimator(params: params) + } + + func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { + let params = DismissCardAnimator.Params.init( + fromCardFrame: self.params.fromCardFrame, + fromCardFrameWithoutTransform: self.params.fromCardFrameWithoutTransform, + fromCell: self.params.fromCell + ) + return DismissCardAnimator(params: params) + } + + func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { + return nil + } + + func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { + return nil + } + + // IMPORTANT: Must set modalPresentationStyle to `.custom` for this to be used. + func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + return CardPresentationController(presentedViewController: presented, presenting: presenting) + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Transition/DismissCardAnimator.swift b/Drink-O-Matic/Drink-O-Matic/Transition/DismissCardAnimator.swift new file mode 100755 index 000000000..b0fd3abfe --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Transition/DismissCardAnimator.swift @@ -0,0 +1,130 @@ +// +// DismissCardAnimator.swift +// AppStoreInteractiveTransition +// +// Created by Wirawit Rueopas on 7/8/18. +// Copyright © 2018 Wirawit Rueopas. All rights reserved. +// + +import UIKit + +final class DismissCardAnimator: NSObject, UIViewControllerAnimatedTransitioning { + + struct Params { + let fromCardFrame: CGRect + let fromCardFrameWithoutTransform: CGRect + let fromCell: CardCollectionViewCell + } + + struct Constants { + static let relativeDurationBeforeNonInteractive: TimeInterval = 0.5 + static let minimumScaleBeforeNonInteractive: CGFloat = 0.8 + } + + private let params: Params + + init(params: Params) { + self.params = params + super.init() + } + + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + return GlobalConstants.dismissalAnimationDuration + } + + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + let ctx = transitionContext + let container = ctx.containerView + let screens: (cardDetail: CardDetailViewController, home: HomeViewController) = ( + ctx.viewController(forKey: .from)! as! CardDetailViewController, + ctx.viewController(forKey: .to)! as! HomeViewController + ) + + let cardDetailView = ctx.view(forKey: .from)! + + let animatedContainerView = UIView() + if GlobalConstants.isEnabledDebugAnimatingViews { + animatedContainerView.layer.borderColor = UIColor.yellow.cgColor + animatedContainerView.layer.borderWidth = 4 + cardDetailView.layer.borderColor = UIColor.red.cgColor + cardDetailView.layer.borderWidth = 2 + } + animatedContainerView.translatesAutoresizingMaskIntoConstraints = false + cardDetailView.translatesAutoresizingMaskIntoConstraints = false + + container.removeConstraints(container.constraints) + + container.addSubview(animatedContainerView) + animatedContainerView.addSubview(cardDetailView) + + // Card fills inside animated container view + cardDetailView.edges(to: animatedContainerView) + + animatedContainerView.centerXAnchor.constraint(equalTo: container.centerXAnchor).isActive = true + let animatedContainerTopConstraint = animatedContainerView.topAnchor.constraint(equalTo: container.topAnchor, constant: 0) + let animatedContainerWidthConstraint = animatedContainerView.widthAnchor.constraint(equalToConstant: cardDetailView.frame.width) + let animatedContainerHeightConstraint = animatedContainerView.heightAnchor.constraint(equalToConstant: cardDetailView.frame.height) + + NSLayoutConstraint.activate([animatedContainerTopConstraint, animatedContainerWidthConstraint, animatedContainerHeightConstraint]) + + // Fix weird top inset + let topTemporaryFix = screens.cardDetail.cardContentView.topAnchor.constraint(equalTo: cardDetailView.topAnchor) + topTemporaryFix.isActive = GlobalConstants.isEnabledWeirdTopInsetsFix + + container.layoutIfNeeded() + + // Force card filling bottom + let stretchCardToFillBottom = screens.cardDetail.cardContentView.bottomAnchor.constraint(equalTo: cardDetailView.bottomAnchor) + + func animateCardViewBackToPlace() { + stretchCardToFillBottom.isActive = true + screens.cardDetail.isFontStateHighlighted = false + // Back to identity + // NOTE: Animated container view in a way, helps us to not messing up `transform` with `AutoLayout` animation. + cardDetailView.transform = CGAffineTransform.identity + animatedContainerTopConstraint.constant = self.params.fromCardFrameWithoutTransform.minY + animatedContainerWidthConstraint.constant = self.params.fromCardFrameWithoutTransform.width + animatedContainerHeightConstraint.constant = self.params.fromCardFrameWithoutTransform.height + + container.layoutIfNeeded() + } + + func completeEverything() { + let success = !ctx.transitionWasCancelled + animatedContainerView.removeConstraints(animatedContainerView.constraints) + animatedContainerView.removeFromSuperview() + if success { + cardDetailView.removeFromSuperview() + self.params.fromCell.isHidden = false + } else { + screens.cardDetail.isFontStateHighlighted = true + + // Remove temporary fixes if not success! + topTemporaryFix.isActive = false + stretchCardToFillBottom.isActive = false + + cardDetailView.removeConstraint(topTemporaryFix) + cardDetailView.removeConstraint(stretchCardToFillBottom) + + container.removeConstraints(container.constraints) + + container.addSubview(cardDetailView) + cardDetailView.edges(to: container) + } + ctx.completeTransition(success) + } + + UIView.animate(withDuration: transitionDuration(using: ctx), delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.0, options: [], animations: { + animateCardViewBackToPlace() + }) { (finished) in + completeEverything() + } + + UIView.animate(withDuration: transitionDuration(using: ctx) * 0.6) { + screens.cardDetail.scrollView.contentOffset = .zero + + //animate gradient view alpha to show it back at home screen + screens.cardDetail.cardContentView.gradientView.alpha = 1 + } + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Transition/PresentCardAnimator.swift b/Drink-O-Matic/Drink-O-Matic/Transition/PresentCardAnimator.swift new file mode 100755 index 000000000..7410c142a --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Transition/PresentCardAnimator.swift @@ -0,0 +1,220 @@ +// +// PresentCardAnimator.swift +// AppStoreInteractiveTransition +// +// Created by Wirawit Rueopas on 31/7/18. +// Copyright © 2018 Wirawit Rueopas. All rights reserved. +// + +import UIKit + +final class PresentCardAnimator: NSObject, UIViewControllerAnimatedTransitioning { + + private let params: Params + + struct Params { + let fromCardFrame: CGRect + let fromCell: CardCollectionViewCell + } + + private let presentAnimationDuration: TimeInterval + private let springAnimator: UIViewPropertyAnimator + private var transitionDriver: PresentCardTransitionDriver? + + init(params: Params) { + self.params = params + self.springAnimator = PresentCardAnimator.createBaseSpringAnimator(params: params) + self.presentAnimationDuration = springAnimator.duration + super.init() + } + + private static func createBaseSpringAnimator(params: PresentCardAnimator.Params) -> UIViewPropertyAnimator { + // Damping between 0.7 (far away) and 1.0 (nearer) + let cardPositionY = params.fromCardFrame.minY + let distanceToBounce = abs(params.fromCardFrame.minY) + let extentToBounce = cardPositionY < 0 ? params.fromCardFrame.height : UIScreen.main.bounds.height + let dampFactorInterval: CGFloat = 0.3 + let damping: CGFloat = 1.0 - dampFactorInterval * (distanceToBounce / extentToBounce) + + // Duration between 0.5 (nearer) and 0.9 (nearer) + let baselineDuration: TimeInterval = 0.5 + let maxDuration: TimeInterval = 0.9 + let duration: TimeInterval = baselineDuration + (maxDuration - baselineDuration) * TimeInterval(max(0, distanceToBounce)/UIScreen.main.bounds.height) + + let springTiming = UISpringTimingParameters(dampingRatio: damping, initialVelocity: .init(dx: 0, dy: 0)) + return UIViewPropertyAnimator(duration: duration, timingParameters: springTiming) + } + + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + // 1. + return presentAnimationDuration + } + + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + // 2. + transitionDriver = PresentCardTransitionDriver(params: params, + transitionContext: transitionContext, + baseAnimator: springAnimator) + interruptibleAnimator(using: transitionContext).startAnimation() + } + + func animationEnded(_ transitionCompleted: Bool) { + // 4. + transitionDriver = nil + } + + func interruptibleAnimator(using transitionContext: UIViewControllerContextTransitioning) -> UIViewImplicitlyAnimating { + // 3. + return transitionDriver!.animator + } +} + +final class PresentCardTransitionDriver { + let animator: UIViewPropertyAnimator + init(params: PresentCardAnimator.Params, transitionContext: UIViewControllerContextTransitioning, baseAnimator: UIViewPropertyAnimator) { + let ctx = transitionContext + let container = ctx.containerView + let screens: (home: HomeViewController, cardDetail: CardDetailViewController) = ( + ctx.viewController(forKey: .from)! as! HomeViewController, + ctx.viewController(forKey: .to)! as! CardDetailViewController + ) + + let cardDetailView = ctx.view(forKey: .to)! + let fromCardFrame = params.fromCardFrame + + // Temporary container view for animation + let animatedContainerView = UIView() + animatedContainerView.translatesAutoresizingMaskIntoConstraints = false + if GlobalConstants.isEnabledDebugAnimatingViews { + animatedContainerView.layer.borderColor = UIColor.yellow.cgColor + animatedContainerView.layer.borderWidth = 4 + cardDetailView.layer.borderColor = UIColor.red.cgColor + cardDetailView.layer.borderWidth = 2 + } + container.addSubview(animatedContainerView) + + do /* Fix centerX/width/height of animated container to container */ { + let animatedContainerConstraints = [ + animatedContainerView.widthAnchor.constraint(equalToConstant: container.bounds.width), + animatedContainerView.heightAnchor.constraint(equalToConstant: container.bounds.height), + animatedContainerView.centerXAnchor.constraint(equalTo: container.centerXAnchor) + ] + NSLayoutConstraint.activate(animatedContainerConstraints) + } + + let animatedContainerVerticalConstraint: NSLayoutConstraint = { + switch GlobalConstants.cardVerticalExpandingStyle { + case .fromCenter: + return animatedContainerView.centerYAnchor.constraint( + equalTo: container.centerYAnchor, + constant: (fromCardFrame.height/2 + fromCardFrame.minY) - container.bounds.height/2 + ) + case .fromTop: + return animatedContainerView.topAnchor.constraint(equalTo: container.topAnchor, constant: fromCardFrame.minY) + } + + }() + animatedContainerVerticalConstraint.isActive = true + + animatedContainerView.addSubview(cardDetailView) + cardDetailView.translatesAutoresizingMaskIntoConstraints = false + + let weirdCardToAnimatedContainerTopAnchor: NSLayoutConstraint + + do /* Pin top (or center Y) and center X of the card, in animated container view */ { + let verticalAnchor: NSLayoutConstraint = { + switch GlobalConstants.cardVerticalExpandingStyle { + case .fromCenter: + return cardDetailView.centerYAnchor.constraint(equalTo: animatedContainerView.centerYAnchor) + case .fromTop: + // WTF: SUPER WEIRD BUG HERE. + // I should set this constant to 0 (or nil), to make cardDetailView sticks to the animatedContainerView's top. + // BUT, I can't set constant to 0, or any value in range (-1,1) here, or there will be abrupt top space inset while animating. + // Funny how -1 and 1 work! WTF. You can try set it to 0. + return cardDetailView.topAnchor.constraint(equalTo: animatedContainerView.topAnchor, constant: -1) + } + }() + let cardConstraints = [ + verticalAnchor, + cardDetailView.centerXAnchor.constraint(equalTo: animatedContainerView.centerXAnchor), + ] + NSLayoutConstraint.activate(cardConstraints) + } + let cardWidthConstraint = cardDetailView.widthAnchor.constraint(equalToConstant: fromCardFrame.width) + let cardHeightConstraint = cardDetailView.heightAnchor.constraint(equalToConstant: fromCardFrame.height) + NSLayoutConstraint.activate([cardWidthConstraint, cardHeightConstraint]) + + cardDetailView.layer.cornerRadius = GlobalConstants.cardCornerRadius + + // ------------------------------- + // Final preparation + // ------------------------------- + params.fromCell.isHidden = true + params.fromCell.resetTransform() + + let topTemporaryFix = screens.cardDetail.cardContentView.topAnchor.constraint(equalTo: cardDetailView.topAnchor, constant: 0) + topTemporaryFix.isActive = GlobalConstants.isEnabledWeirdTopInsetsFix + + container.layoutIfNeeded() + + // ------------------------------ + // 1. Animate container bouncing up + // ------------------------------ + func animateContainerBouncingUp() { + animatedContainerVerticalConstraint.constant = 0 + container.layoutIfNeeded() + } + + // ------------------------------ + // 2. Animate cardDetail filling up the container + // ------------------------------ + func animateCardDetailViewSizing() { + cardWidthConstraint.constant = animatedContainerView.bounds.width + cardHeightConstraint.constant = animatedContainerView.bounds.height + cardDetailView.layer.cornerRadius = 0 + container.layoutIfNeeded() + + //animate gradient view alpha to hide it at detail screen + screens.cardDetail.cardContentView.gradientView.alpha = 0 + } + + func completeEverything() { + // Remove temporary `animatedContainerView` + animatedContainerView.removeConstraints(animatedContainerView.constraints) + animatedContainerView.removeFromSuperview() + + // Re-add to the top + container.addSubview(cardDetailView) + + cardDetailView.removeConstraints([topTemporaryFix, cardWidthConstraint, cardHeightConstraint]) + + // Keep -1 to be consistent with the weird bug above. + cardDetailView.edges(to: container, top: -1) + + // No longer need the bottom constraint that pins bottom of card content to its root. + screens.cardDetail.cardBottomToRootBottomConstraint.isActive = false + screens.cardDetail.scrollView.isScrollEnabled = true + + let success = !ctx.transitionWasCancelled + ctx.completeTransition(success) + } + + baseAnimator.addAnimations { + + // Spring animation for bouncing up + animateContainerBouncingUp() + + // Linear animation for expansion + let cardExpanding = UIViewPropertyAnimator(duration: baseAnimator.duration * 0.6, curve: .linear) { + animateCardDetailViewSizing() + } + cardExpanding.startAnimation() + } + + baseAnimator.addCompletion { (_) in + completeEverything() + } + + self.animator = baseAnimator + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Utils/GlobalConstants.swift b/Drink-O-Matic/Drink-O-Matic/Utils/GlobalConstants.swift new file mode 100755 index 000000000..70f6c2e4d --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Utils/GlobalConstants.swift @@ -0,0 +1,41 @@ +// +// Constants.swift +// AppStoreInteractiveTransition +// +// Created by Wirawit Rueopas on 31/7/18. +// Copyright © 2018 Wirawit Rueopas. All rights reserved. +// + +import UIKit + +enum GlobalConstants { + static let cardHighlightedFactor: CGFloat = 0.96 + static let statusBarAnimationDuration: TimeInterval = 0.4 + static let cardCornerRadius: CGFloat = 16 + static let dismissalAnimationDuration = 0.6 + + static let cardVerticalExpandingStyle: CardVerticalExpandingStyle = .fromTop + + + /// Without this, there'll be weird offset (probably from scrollView) that obscures the card content view of the cardDetailView. + static let isEnabledWeirdTopInsetsFix = true + + /// If true, will draw borders on animating views. + static let isEnabledDebugAnimatingViews = false + + /// If true, this will add a 'reverse' additional top safe area insets to make the final top safe area insets zero. + static let isEnabledTopSafeAreaInsetsFixOnCardDetailViewController = false + + /// If true, will always allow user to scroll while it's animated. + static let isEnabledAllowsUserInteractionWhileHighlightingCard = false +} + +extension GlobalConstants { + enum CardVerticalExpandingStyle { + /// Expanding card pinning at the top of animatingContainerView + case fromTop + + /// Expanding card pinning at the center of animatingContainerView + case fromCenter + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Utils/GradientView.swift b/Drink-O-Matic/Drink-O-Matic/Utils/GradientView.swift new file mode 100644 index 000000000..345422b92 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Utils/GradientView.swift @@ -0,0 +1,110 @@ +// +// GradientView.swift +// +// Created by Mathieu Vandeginste on 06/12/2016. +// Copyright © 2018 Mathieu Vandeginste. All rights reserved. +// + +import UIKit + +@IBDesignable class GradientView: UIView { + + private var gradientLayer: CAGradientLayer! + + @IBInspectable var topColor: UIColor = .red { + didSet { + setNeedsLayout() + } + } + + @IBInspectable var bottomColor: UIColor = .yellow { + didSet { + setNeedsLayout() + } + } + + @IBInspectable var shadowColor: UIColor = .clear { + didSet { + setNeedsLayout() + } + } + + @IBInspectable var shadowX: CGFloat = 0 { + didSet { + setNeedsLayout() + } + } + + @IBInspectable var shadowY: CGFloat = -3 { + didSet { + setNeedsLayout() + } + } + + @IBInspectable var shadowBlur: CGFloat = 3 { + didSet { + setNeedsLayout() + } + } + + @IBInspectable var startPointX: CGFloat = 0 { + didSet { + setNeedsLayout() + } + } + + @IBInspectable var startPointY: CGFloat = 0.5 { + didSet { + setNeedsLayout() + } + } + + @IBInspectable var endPointX: CGFloat = 1 { + didSet { + setNeedsLayout() + } + } + + @IBInspectable var endPointY: CGFloat = 0.5 { + didSet { + setNeedsLayout() + } + } + + @IBInspectable var cornerRadius: CGFloat = 0 { + didSet { + setNeedsLayout() + } + } + + override class var layerClass: AnyClass { + return CAGradientLayer.self + } + + override func layoutSubviews() { + self.gradientLayer = self.layer as? CAGradientLayer + self.gradientLayer.colors = [topColor.cgColor, bottomColor.cgColor] + self.gradientLayer.startPoint = CGPoint(x: startPointX, y: startPointY) + self.gradientLayer.endPoint = CGPoint(x: endPointX, y: endPointY) + self.layer.cornerRadius = cornerRadius + self.layer.shadowColor = shadowColor.cgColor + self.layer.shadowOffset = CGSize(width: shadowX, height: shadowY) + self.layer.shadowRadius = shadowBlur + self.layer.shadowOpacity = 1 + + } + + func animate(duration: TimeInterval, newTopColor: UIColor, newBottomColor: UIColor) { + let fromColors = self.gradientLayer?.colors + let toColors: [AnyObject] = [ newTopColor.cgColor, newBottomColor.cgColor] + self.gradientLayer?.colors = toColors + let animation : CABasicAnimation = CABasicAnimation(keyPath: "colors") + animation.fromValue = fromColors + animation.toValue = toColors + animation.duration = duration + animation.isRemovedOnCompletion = true + animation.fillMode = .forwards + animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear) + self.gradientLayer?.add(animation, forKey:"animateGradient") + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Utils/NibLoadable.swift b/Drink-O-Matic/Drink-O-Matic/Utils/NibLoadable.swift new file mode 100755 index 000000000..1d32b7cda --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Utils/NibLoadable.swift @@ -0,0 +1,29 @@ +// +// NibLoadable.swift +// AppStoreHomeInteractiveTransition +// +// Created by Wirawit Rueopas on 30/7/18. +// Copyright © 2018 Wirawit Rueopas. All rights reserved. +// + +import UIKit + +protocol NibLoadable where Self: UIView { + + /// Setup this view with nib: + /// 1. Load content view from nib (with the class name) + /// 2. Set owner to self + /// 3. Add it as a subview and fill edges with AutoLayout + func fromNib() -> UIView? +} + +extension NibLoadable { + @discardableResult + func fromNib() -> UIView? { + let contentView = Bundle(for: type(of: self)).loadNibNamed(String(describing: type(of: self)), owner: self, options: nil)?.first as! UIView + self.addSubview(contentView) + contentView.translatesAutoresizingMaskIntoConstraints = false + contentView.edges(to: self) + return contentView + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Utils/StatusBarAnimatable.swift b/Drink-O-Matic/Drink-O-Matic/Utils/StatusBarAnimatable.swift new file mode 100755 index 000000000..3605169fb --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Utils/StatusBarAnimatable.swift @@ -0,0 +1,107 @@ +// +// StatusBarAnimatable.swift +// AppStoreInteractiveTransition +// +// Created by Wirawit Rueopas on 1/8/18. +// Copyright © 2018 Wirawit Rueopas. All rights reserved. +// + +import UIKit + +@objc +protocol StatusBarAnimatable where Self: UIViewController { + var statusBarAnimatableHidesStatusBar: Bool { get } + var statusBarAnimatableAnimationDuration: TimeInterval { get } + var statusBarAnimatableUpdateAnimation: UIStatusBarAnimation { get } + @objc optional var statusBarAnimatableAfterInteractivityEnds: Bool { get } +} + + +private let swizzling: (AnyClass, Selector, Selector) -> () = { forClass, originalSelector, swizzledSelector in + let originalMethod = class_getInstanceMethod(forClass, originalSelector)! + let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector)! + method_exchangeImplementations(originalMethod, swizzledMethod) +} + +extension UIViewController { + static func doSwizzle() { + do { + let originalSelector = #selector(viewWillAppear(_:)) + let swizzledSelector = #selector(swizzled_viewWillAppear(_:)) + swizzling(UIViewController.self, originalSelector, swizzledSelector) + } + + do { + let originalSelector = #selector(viewDidDisappear(_:)) + let swizzledSelector = #selector(swizzled_viewDidDisappear(_:)) + swizzling(UIViewController.self, originalSelector, swizzledSelector) + } + + do { + let originalSelector = #selector(getter: preferredStatusBarUpdateAnimation) + let swizzledSelector = #selector(getter: swizzled_preferredStatusBarUpdateAnimation) + swizzling(UIViewController.self, originalSelector, swizzledSelector) + } + } + + @objc func swizzled_viewWillAppear(_ animated: Bool) { + self.swizzled_viewWillAppear(animated) + if let avc = self as? StatusBarAnimatable { + avc.performViewWillAppear() + } + } + + @objc func swizzled_viewDidDisappear(_ animated: Bool) { + self.swizzled_viewDidDisappear(animated) + if let avc = self as? StatusBarAnimatable { + avc.performViewDidDisappear() + } + } + + @objc var swizzled_preferredStatusBarUpdateAnimation: UIStatusBarAnimation { + if let avc = self as? StatusBarAnimatable { + return avc.statusBarAnimatableUpdateAnimation + } else { + return self.swizzled_preferredStatusBarUpdateAnimation + } + } +} + +private var key: Void? + +extension StatusBarAnimatable { + var shouldHideStatusBar: Bool { + get { + return (objc_getAssociatedObject(self, &key) as? Bool) ?? UIApplication.shared.isStatusBarHidden + } + + set { + objc_setAssociatedObject(self, &key, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + fileprivate func performViewWillAppear() { + guard let coordinator = transitionCoordinator else { return } + let onlyAfterNonInteractive = statusBarAnimatableAfterInteractivityEnds ?? true + if onlyAfterNonInteractive && coordinator.initiallyInteractive { + coordinator.notifyWhenInteractionChanges { [unowned self] (ctx) in + if ctx.isCancelled { return } + self.shouldHideStatusBar = self.statusBarAnimatableHidesStatusBar + UIView.animate(withDuration: self.statusBarAnimatableAnimationDuration) { + self.setNeedsStatusBarAppearanceUpdate() + } + } + } else { + coordinator.animate(alongsideTransition: { [unowned self] (_) in + self.shouldHideStatusBar = self.statusBarAnimatableHidesStatusBar + UIView.animate(withDuration: self.statusBarAnimatableAnimationDuration) { + self.setNeedsStatusBarAppearanceUpdate() + } + }) + } + } + + fileprivate func performViewDidDisappear() { + self.shouldHideStatusBar = UIApplication.shared.isStatusBarHidden + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Utils/StatusBarAnimatableViewController.swift b/Drink-O-Matic/Drink-O-Matic/Utils/StatusBarAnimatableViewController.swift new file mode 100755 index 000000000..4392bdb4d --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Utils/StatusBarAnimatableViewController.swift @@ -0,0 +1,83 @@ +// +// StatusBarAnimatableViewController.swift +// AppStoreInteractiveTransition +// +// Created by Wirawit Rueopas on 2/8/18. +// Copyright © 2018 Wirawit Rueopas. All rights reserved. +// + +import UIKit + +/// Info about status bar animation +struct StatusBarAnimatableConfig { + let prefersHidden: Bool + let animation: UIStatusBarAnimation + + /// Animation duration for status bar. Default is `nil`, which `transitionDuration` is used. + let animationDuration: TimeInterval? + + /// Status bar animation starts after interactivity phase is ended. + let animatesAfterInteractivityEnds: Bool +} + +extension StatusBarAnimatableConfig { + init(prefersHidden: Bool, animation: UIStatusBarAnimation) { + self.init(prefersHidden: prefersHidden, + animation: animation, + animationDuration: nil, + animatesAfterInteractivityEnds: true) + } +} + + +/// No-swizzle approach for animating status bar. Subclass view controller with this and override `statusBarAnimatableConfig`. +class StatusBarAnimatableViewController: UIViewController { + + private var shouldCurrentlyHideStatusBar = false + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + guard let coordinator = transitionCoordinator else { return } + let config = statusBarAnimatableConfig + let onlyAfterNonInteractive = config.animatesAfterInteractivityEnds + + // IMPORTANT: + // If you return `interactionControllerFor_`, + // Even if it does nothing, coordinator.initiallyInteractive will be `true`, + // BUT this block registered below won't get called at all! + if onlyAfterNonInteractive && coordinator.initiallyInteractive { + coordinator.notifyWhenInteractionChanges { [unowned self] (ctx) in + if ctx.isCancelled { return } + self.shouldCurrentlyHideStatusBar = config.prefersHidden + UIView.animate(withDuration: config.animationDuration ?? ctx.transitionDuration) { + self.setNeedsStatusBarAppearanceUpdate() + } + } + } else { + coordinator.animate(alongsideTransition: { [unowned self] (ctx) in + self.shouldCurrentlyHideStatusBar = config.prefersHidden + UIView.animate(withDuration: config.animationDuration ?? ctx.transitionDuration) { + self.setNeedsStatusBarAppearanceUpdate() + } + }) + } + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + shouldCurrentlyHideStatusBar = UIApplication.shared.isStatusBarHidden + } + + final override var prefersStatusBarHidden: Bool { + return shouldCurrentlyHideStatusBar + } + + final override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { + return statusBarAnimatableConfig.animation + } + + open var statusBarAnimatableConfig: StatusBarAnimatableConfig { + return StatusBarAnimatableConfig(prefersHidden: false, + animation: .none) + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Utils/UIView+AutoLayout.swift b/Drink-O-Matic/Drink-O-Matic/Utils/UIView+AutoLayout.swift new file mode 100755 index 000000000..6d52d843a --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Utils/UIView+AutoLayout.swift @@ -0,0 +1,40 @@ +// +// Extensions.swift +// AppStoreHomeInteractiveTransition +// +// Created by Wirawit Rueopas on 3/4/2561 BE. +// Copyright © 2561 Wirawit Rueopas. All rights reserved. +// + +import UIKit + +extension UIView { + /// Constrain 4 edges of `self` to specified `view`. + func edges(to view: UIView, top: CGFloat=0, left: CGFloat=0, bottom: CGFloat=0, right: CGFloat=0) { + NSLayoutConstraint.activate([ + self.leftAnchor.constraint(equalTo: view.leftAnchor, constant: left), + self.rightAnchor.constraint(equalTo: view.rightAnchor, constant: right), + self.topAnchor.constraint(equalTo: view.topAnchor, constant: top), + self.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: bottom) + ]) + } +} + +extension UIImage { + /// Resize UIImage to new width keeping the image's aspect ratio. + func resize(toWidth scaledToWidth: CGFloat) -> UIImage { + let image = self + let oldWidth = image.size.width + let scaleFactor = scaledToWidth / oldWidth + + let newHeight = image.size.height * scaleFactor + let newWidth = oldWidth * scaleFactor + + let scaledSize = CGSize(width:newWidth, height:newHeight) + UIGraphicsBeginImageContextWithOptions(scaledSize, true, image.scale) + image.draw(in: CGRect(x: 0, y: 0, width: scaledSize.width, height: scaledSize.height)) + let scaledImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return scaledImage! + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/ViewController.swift b/Drink-O-Matic/Drink-O-Matic/ViewController.swift deleted file mode 100644 index f8a23f7d9..000000000 --- a/Drink-O-Matic/Drink-O-Matic/ViewController.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// ViewController.swift -// Drink-O-Matic -// -// Created by Ramiro Coll Doñetz on 01/08/2019. -// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view. - } - - -} - diff --git a/Drink-O-Matic/Drink-O-Matic/ViewControllers/CardDetailViewController.swift b/Drink-O-Matic/Drink-O-Matic/ViewControllers/CardDetailViewController.swift new file mode 100755 index 000000000..250d60996 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/ViewControllers/CardDetailViewController.swift @@ -0,0 +1,288 @@ +// +// CardDetailViewController.swift +// AppStoreHomeInteractiveTransition +// +// Created by Wirawit Rueopas on 4/4/2561 BE. +// Copyright © 2561 Wirawit Rueopas. All rights reserved. +// + +import UIKit + + +class CardDetailViewController: StatusBarAnimatableViewController, UIScrollViewDelegate { + + // This constraint limits card content to not be covered by root view. + // This is useful to make the card content expands when presenting, + // as intially the card is fully contained in a smaller environment (card cell). + // When animating detail view controller to be full-screen size, it should gradually expands along the bottom edge. + // + // ***But we dismiss disable this after presenting*** + @IBOutlet weak var cardBottomToRootBottomConstraint: NSLayoutConstraint! + + @IBOutlet weak var cardContentView: CardContentView! + @IBOutlet weak var textView: UITextView! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var descriptionLabel: UILabel! + @IBOutlet weak var scrollView: UIScrollView! + + var drinkViewModel: Drink! { + didSet { + if self.cardContentView != nil { + self.cardContentView.drinkModel = drinkViewModel + } + } + } + + var drinkDetailModel: DrinkDetails! { + didSet { + if self.cardContentView != nil { + self.cardContentView.drinkDetailModel = drinkDetailModel + } + } + } + + var unhighlightedDrinkViewModel: Drink! + + var isFontStateHighlighted: Bool = true { + didSet { + cardContentView.setFontState(isHighlighted: isFontStateHighlighted) + } + } + + var draggingDownToDismiss = false + + final class DismissalPanGesture: UIPanGestureRecognizer {} + final class DismissalScreenEdgePanGesture: UIScreenEdgePanGestureRecognizer {} + + private lazy var dismissalPanGesture: DismissalPanGesture = { + let pan = DismissalPanGesture() + pan.maximumNumberOfTouches = 1 + return pan + }() + + private lazy var dismissalScreenEdgePanGesture: DismissalScreenEdgePanGesture = { + let pan = DismissalScreenEdgePanGesture() + pan.edges = .left + return pan + }() + + override func viewDidLoad() { + super.viewDidLoad() + + if GlobalConstants.isEnabledDebugAnimatingViews { + scrollView.layer.borderWidth = 3 + scrollView.layer.borderColor = UIColor.green.cgColor + + scrollView.subviews.first!.layer.borderWidth = 3 + scrollView.subviews.first!.layer.borderColor = UIColor.purple.cgColor + } + + scrollView.delegate = self + scrollView.contentInsetAdjustmentBehavior = .never + cardContentView.drinkModel = drinkViewModel + cardContentView.drinkDetailModel = drinkDetailModel + setTitleAndDescription() + cardContentView.setFontState(isHighlighted: isFontStateHighlighted) + + dismissalPanGesture.addTarget(self, action: #selector(handleDismissalPan(gesture:))) + dismissalPanGesture.delegate = self + + dismissalScreenEdgePanGesture.addTarget(self, action: #selector(handleDismissalPan(gesture:))) + dismissalScreenEdgePanGesture.delegate = self + + // Make drag down/scroll pan gesture waits til screen edge pan to fail first to begin + dismissalPanGesture.require(toFail: dismissalScreenEdgePanGesture) + scrollView.panGestureRecognizer.require(toFail: dismissalScreenEdgePanGesture) + + loadViewIfNeeded() + view.addGestureRecognizer(dismissalPanGesture) + view.addGestureRecognizer(dismissalScreenEdgePanGesture) + } + + func setTitleAndDescription() { + //set drink title + titleLabel.font = UIFont.systemFont(ofSize: 24, weight: .bold) + titleLabel.text = drinkViewModel.name + + //set drink description and ingredients + let descriptionTitleAttributes: [NSAttributedString.Key: Any] = [ + .font: UIFont.systemFont(ofSize: 14, weight: .bold), + .foregroundColor: UIColor.darkText] + + let descriptionBodyAttributes: [NSAttributedString.Key: Any] = [ + .font: UIFont.systemFont(ofSize: 14, weight: .light), + .foregroundColor: UIColor.darkText] + + let ingredientsAttributedString = NSMutableAttributedString() + + if let ingredientsToShow = drinkDetailModel?.ingredients { + ingredientsAttributedString.append(NSAttributedString(string: "Ingredients\n", attributes: descriptionTitleAttributes)) + + for ingredient in ingredientsToShow { + var ingredientString = "" + if ingredientsAttributedString.length > 0 { + ingredientString.append("\n") + } + ingredientString.append("• \(ingredient)") + + ingredientsAttributedString.append(NSAttributedString(string: ingredientString, attributes: descriptionBodyAttributes)) + } + } + + ingredientsAttributedString.append(NSAttributedString(string: "\n\nHow to prepare", attributes: descriptionTitleAttributes)) + + if let instructions = drinkDetailModel.instructions, !instructions.isEmpty { + ingredientsAttributedString.append(NSAttributedString(string: "\n\n" + instructions, attributes: descriptionBodyAttributes)) + } else { + ingredientsAttributedString.append(NSAttributedString(string: "\n\nNo description available", attributes: descriptionBodyAttributes)) + } + + descriptionLabel.attributedText = ingredientsAttributedString + } + + func didSuccessfullyDragDownToDismiss() { + drinkViewModel = unhighlightedDrinkViewModel + dismiss(animated: true) + } + + func userWillCancelDissmissalByDraggingToTop(velocityY: CGFloat) {} + + func didCancelDismissalTransition() { + // Clean up + interactiveStartingPoint = nil + dismissalAnimator = nil + draggingDownToDismiss = false + } + + var interactiveStartingPoint: CGPoint? + var dismissalAnimator: UIViewPropertyAnimator? + + // This handles both screen edge and dragdown pan. As screen edge pan is a subclass of pan gesture, this input param works. + @objc func handleDismissalPan(gesture: UIPanGestureRecognizer) { + + let isScreenEdgePan = gesture.isKind(of: DismissalScreenEdgePanGesture.self) + let canStartDragDownToDismissPan = !isScreenEdgePan && !draggingDownToDismiss + + // Don't do anything when it's not in the drag down mode + if canStartDragDownToDismissPan { return } + + let targetAnimatedView = gesture.view! + let startingPoint: CGPoint + + if let p = interactiveStartingPoint { + startingPoint = p + } else { + // Initial location + startingPoint = gesture.location(in: nil) + interactiveStartingPoint = startingPoint + } + + let currentLocation = gesture.location(in: nil) + let progress = isScreenEdgePan ? (gesture.translation(in: targetAnimatedView).x / 100) : (currentLocation.y - startingPoint.y) / 100 + let targetShrinkScale: CGFloat = 0.86 + let targetCornerRadius: CGFloat = GlobalConstants.cardCornerRadius + + func createInteractiveDismissalAnimatorIfNeeded() -> UIViewPropertyAnimator { + if let animator = dismissalAnimator { + return animator + } else { + let animator = UIViewPropertyAnimator(duration: 0, curve: .linear, animations: { + targetAnimatedView.transform = .init(scaleX: targetShrinkScale, y: targetShrinkScale) + targetAnimatedView.layer.cornerRadius = targetCornerRadius + + }) + animator.isReversed = false + animator.pauseAnimation() + animator.fractionComplete = progress + return animator + } + } + + switch gesture.state { + case .began: + dismissalAnimator = createInteractiveDismissalAnimatorIfNeeded() + + case .changed: + dismissalAnimator = createInteractiveDismissalAnimatorIfNeeded() + + let actualProgress = progress + let isDismissalSuccess = actualProgress >= 1.0 + + dismissalAnimator!.fractionComplete = actualProgress + + if isDismissalSuccess { + dismissalAnimator!.stopAnimation(false) + dismissalAnimator!.addCompletion { [unowned self] (pos) in + switch pos { + case .end: + self.didSuccessfullyDragDownToDismiss() + default: + fatalError("Must finish dismissal at end!") + } + } + dismissalAnimator!.finishAnimation(at: .end) + } + + case .ended, .cancelled: + if dismissalAnimator == nil { + // Gesture's too quick that it doesn't have dismissalAnimator! + print("Too quick there's no animator!") + didCancelDismissalTransition() + return + } + // NOTE: + // If user lift fingers -> ended + // If gesture.isEnabled -> cancelled + + // Ended, Animate back to start + dismissalAnimator!.pauseAnimation() + dismissalAnimator!.isReversed = true + + // Disable gesture until reverse closing animation finishes. + gesture.isEnabled = false + dismissalAnimator!.addCompletion { [unowned self] (pos) in + self.didCancelDismissalTransition() + gesture.isEnabled = true + } + dismissalAnimator!.startAnimation() + default: + fatalError("Impossible gesture state? \(gesture.state.rawValue)") + } + } + + override func viewWillLayoutSubviews() { + super.viewWillLayoutSubviews() + scrollView.scrollIndicatorInsets = .init(top: cardContentView.bounds.height, left: 0, bottom: 0, right: 0) + if GlobalConstants.isEnabledTopSafeAreaInsetsFixOnCardDetailViewController { + self.additionalSafeAreaInsets = .init(top: max(-view.safeAreaInsets.top,0), left: 0, bottom: 0, right: 0) + } + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + if draggingDownToDismiss || (scrollView.isTracking && scrollView.contentOffset.y < 0) { + draggingDownToDismiss = true + scrollView.contentOffset = .zero + } + + scrollView.showsVerticalScrollIndicator = !draggingDownToDismiss + } + + func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { + // Without this, when user drag down and lift the finger fast at the top, there'll be some scrolling going on. + // This check prevents that. + if velocity.y > 0 && scrollView.contentOffset.y <= 0 { + scrollView.contentOffset = .zero + } + } + + override var statusBarAnimatableConfig: StatusBarAnimatableConfig { + return StatusBarAnimatableConfig(prefersHidden: true, + animation: .slide) + } +} + +extension CardDetailViewController: UIGestureRecognizerDelegate { + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return true + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/ViewControllers/HomeViewController.swift b/Drink-O-Matic/Drink-O-Matic/ViewControllers/HomeViewController.swift new file mode 100644 index 000000000..64e0f1b99 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/ViewControllers/HomeViewController.swift @@ -0,0 +1,259 @@ +// +// ViewController.swift +// Drink-O-Matic +// +// Created by Ramiro Coll Doñetz on 01/08/2019. +// Copyright © 2019 Ramiro Coll Doñetz. All rights reserved. +// + +import UIKit + +class HomeViewController: StatusBarAnimatableViewController { + + private var isFetchingDrinks: Bool = true { + didSet { + if isFetchingDrinks { + //show loading view and hide ingredients label + UIView.animate(withDuration: 0.3) { + self.collectionView.isHidden = true + self.noInternetView.isHidden = true + self.activityIndicator.isHidden = false + } + } else { + UIView.animate(withDuration: 0.3) { + self.collectionView.isHidden = false + self.noInternetView.isHidden = false + self.activityIndicator.isHidden = true + } + } + } + } + + enum HomeState { + case loading + case error + case success + } + + var state: HomeState? { + didSet { + guard let state = state else { return } + switch state { + case .error: + UIView.animate(withDuration: 0.3) { + self.collectionView.isHidden = true + self.noInternetView.isHidden = false + self.activityIndicator.stopAnimating() + } + case .loading: + UIView.animate(withDuration: 0.3) { + self.collectionView.isHidden = true + self.noInternetView.isHidden = true + self.activityIndicator.startAnimating() + } + case .success: + UIView.animate(withDuration: 0.3) { + self.collectionView.isHidden = false + self.noInternetView.isHidden = true + self.activityIndicator.stopAnimating() + self.refreshControl.endRefreshing() + } + } + } + } + + @IBOutlet weak var collectionView: UICollectionView! + + private var transition: CardTransition? + + var drinks = [Drink]() + var drinkDetails = [String:DrinkDetails]() + + private let refreshControl = UIRefreshControl() + @IBOutlet weak var noInternetView: UIView! + @IBOutlet weak var activityIndicator: UIActivityIndicatorView! + + override func viewDidLoad() { + super.viewDidLoad() + + // Make it responds to highlight state faster + collectionView.delaysContentTouches = false + + if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { + layout.minimumLineSpacing = 20 + layout.minimumInteritemSpacing = 0 + layout.sectionInset = .init(top: 20, left: 0, bottom: 64, right: 0) + } + + collectionView.delegate = self + collectionView.dataSource = self + collectionView.clipsToBounds = false + collectionView.register(UINib(nibName: "\(CardCollectionViewCell.self)", bundle: nil), forCellWithReuseIdentifier: "card") + + // Add Refresh Control to Collection View + if #available(iOS 10.0, *) { + collectionView.refreshControl = refreshControl + } else { + collectionView.addSubview(refreshControl) + } + + // Configure Refresh Control + refreshControl.addTarget(self, action: #selector(fetchDrinks(_:)), for: .valueChanged) + + fetchDrinks() + } + + override var statusBarAnimatableConfig: StatusBarAnimatableConfig { + return StatusBarAnimatableConfig(prefersHidden: false, + animation: .slide) + } + + @IBAction func tryAgainPressed(_ sender: Any) { + fetchDrinks() + } +} + +// MARK: - Server Fetch Methods +extension HomeViewController { + @objc private func fetchDrinks(_ sender: Any? = nil) { + //set screen state to update UI + state = .loading + + //query to get drinks list from server + APIClient.getDrinks{ result in + switch result { + case .success(let drinkList): + //clear data from arrays + self.drinks.removeAll() + self.drinkDetails.removeAll() + + if drinkList.drinks.isEmpty { + //response array is empty, return error screen + self.state = .error + } else { + //update array and collectionview + self.drinks = drinkList.drinks + self.collectionView.reloadData() + self.state = .success + } + case .failure(let error): + self.state = .error + print(error.localizedDescription) + } + } + } + + private func fetchDrinkDetail(drinkId: String, indexPath: IndexPath, completion:@escaping (DrinkDetails)->Void) { + //fetch single drink detail based on id + APIClient.getDrinkDetails(drinkId: drinkId) { (result) in + switch result { + case .success(let drinkDetail): + completion(drinkDetail) + case .failure(let error): + self.state = .error + print(error.localizedDescription) + } + } + } +} + +extension HomeViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { + func numberOfSections(in collectionView: UICollectionView) -> Int { + return 1 + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return drinks.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + return collectionView.dequeueReusableCell(withReuseIdentifier: "card", for: indexPath) + } + + func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { + let cell = cell as! CardCollectionViewCell + //get drink from array and set it on cell + let drink = drinks[indexPath.row] + cell.cardContentView?.drinkModel = drink + + //check if we already have the drinkDetail for that drinkId + if let drinkDetail = drinkDetails[drink.id] { + //set the detail at the cell + cell.cardContentView?.drinkDetailModel = drinkDetail + } else { + //fetch drinkDetail from server and update cell at completion + cell.cardContentView?.isFetchingDetails = true + fetchDrinkDetail(drinkId: drink.id, indexPath: indexPath, completion: { drinkDetail in + self.drinkDetails[drink.id] = drinkDetail + self.collectionView.reloadItems(at: [indexPath]) + }) + } + } + + func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { + let cell = cell as! CardCollectionViewCell + cell.cardContentView.imageView.image = nil + cell.cardContentView.imageView.setNeedsDisplay() + } +} + +extension HomeViewController { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let cardHorizontalOffset: CGFloat = 20 + let cardHeightByWidthRatio: CGFloat = 1.2 + let width = collectionView.bounds.size.width - 2 * cardHorizontalOffset + let height: CGFloat = width * cardHeightByWidthRatio + return CGSize(width: width, height: height) + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + + // Get tapped cell location + let cell = collectionView.cellForItem(at: indexPath) as! CardCollectionViewCell + + // Freeze highlighted state (or else it will bounce back) + cell.freezeAnimations() + + // Get current frame on screen + let currentCellFrame = cell.layer.presentation()!.frame + + // Convert current frame to screen's coordinates + let cardPresentationFrameOnScreen = cell.superview!.convert(currentCellFrame, to: nil) + + // Get card frame without transform in screen's coordinates (for the dismissing back later to original location) + let cardFrameWithoutTransform = { () -> CGRect in + let center = cell.center + let size = cell.bounds.size + let r = CGRect( + x: center.x - size.width / 2, + y: center.y - size.height / 2, + width: size.width, + height: size.height + ) + return cell.superview!.convert(r, to: nil) + }() + + let drinkModel = drinks[indexPath.row] + let drinkDetailModel = drinkDetails[drinkModel.id] + + // Set up card detail view controller + let vc = storyboard!.instantiateViewController(withIdentifier: "cardDetailVc") as! CardDetailViewController + vc.drinkViewModel = drinkModel.highlightedImage() + vc.unhighlightedDrinkViewModel = drinkModel // Keep the original one to restore when dismiss + vc.drinkDetailModel = drinkDetailModel + let params = CardTransition.Params(fromCardFrame: cardPresentationFrameOnScreen, + fromCardFrameWithoutTransform: cardFrameWithoutTransform, + fromCell: cell) + transition = CardTransition(params: params) + vc.transitioningDelegate = transition + + // If `modalPresentationStyle` is not `.fullScreen`, this should be set to true to make status bar depends on presented vc. + vc.modalPresentationCapturesStatusBarAppearance = true + vc.modalPresentationStyle = .custom + + present(vc, animated: true, completion: { [unowned cell] in + // Unfreeze + cell.unfreezeAnimations() + }) + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Views/CardCollectionViewCell.swift b/Drink-O-Matic/Drink-O-Matic/Views/CardCollectionViewCell.swift new file mode 100755 index 000000000..085e88fda --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Views/CardCollectionViewCell.swift @@ -0,0 +1,81 @@ +// +// CardCollectionViewCell.swift +// AppStoreHomeInteractiveTransition +// +// Created by Wirawit Rueopas on 31/3/2561 BE. +// Copyright © 2561 Wirawit Rueopas. All rights reserved. +// + +import UIKit + +final class CardCollectionViewCell: UICollectionViewCell { + + @IBOutlet weak var cardContentView: CardContentView! + + var disabledHighlightedAnimation = false + + func resetTransform() { + transform = .identity + } + + func freezeAnimations() { + disabledHighlightedAnimation = true + layer.removeAllAnimations() + } + + func unfreezeAnimations() { + disabledHighlightedAnimation = false + } + + override func awakeFromNib() { + cardContentView.layer.cornerRadius = 16 + cardContentView.layer.masksToBounds = true + cardContentView.ingredientsLabel.isHidden = false + backgroundColor = .clear + layer.shadowColor = UIColor.black.cgColor + layer.shadowOpacity = 0.2 + layer.shadowOffset = .init(width: 0, height: 4) + layer.shadowRadius = 12 + } + + // Make it appears very responsive to touch + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + super.touchesBegan(touches, with: event) + animate(isHighlighted: true) + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + super.touchesEnded(touches, with: event) + animate(isHighlighted: false) + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + super.touchesCancelled(touches, with: event) + animate(isHighlighted: false) + } + + private func animate(isHighlighted: Bool, completion: ((Bool) -> Void)?=nil) { + if disabledHighlightedAnimation { + return + } + let animationOptions: UIView.AnimationOptions = GlobalConstants.isEnabledAllowsUserInteractionWhileHighlightingCard + ? [.allowUserInteraction] : [] + if isHighlighted { + UIView.animate(withDuration: 0.5, + delay: 0, + usingSpringWithDamping: 1, + initialSpringVelocity: 0, + options: animationOptions, animations: { + self.transform = .init(scaleX: GlobalConstants.cardHighlightedFactor, y: GlobalConstants.cardHighlightedFactor) + }, completion: completion) + } else { + UIView.animate(withDuration: 0.5, + delay: 0, + usingSpringWithDamping: 1, + initialSpringVelocity: 0, + options: animationOptions, animations: { + self.transform = .identity + }, completion: completion) + } + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Views/CardCollectionViewCell.xib b/Drink-O-Matic/Drink-O-Matic/Views/CardCollectionViewCell.xib new file mode 100755 index 000000000..dfe43b93c --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Views/CardCollectionViewCell.xib @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Drink-O-Matic/Drink-O-Matic/Views/CardContentView.swift b/Drink-O-Matic/Drink-O-Matic/Views/CardContentView.swift new file mode 100755 index 000000000..9bba3bab2 --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Views/CardContentView.swift @@ -0,0 +1,124 @@ +// +// CardContentView.swift +// AppStoreHomeInteractiveTransition +// +// Created by Wirawit Rueopas on 3/4/2561 BE. +// Copyright © 2561 Wirawit Rueopas. All rights reserved. +// + +import UIKit +import SDWebImage + +@IBDesignable final class CardContentView: UIView, NibLoadable { + + static let linesOfVisibleIngredients = 2 + + var drinkModel: Drink? { + didSet { + titleLabel.font = UIFont.systemFont(ofSize: 24, weight: .bold) + titleLabel.text = drinkModel?.name + if let imageString = drinkModel?.thumbUrl, let imageUrl = URL.init(string: imageString) { + imageView.sd_imageTransition = .fade + imageView.sd_setImage(with: imageUrl, completed: nil) + } + } + } + + var drinkDetailModel: DrinkDetails? { + didSet { + let ingredientsAttributes: [NSAttributedString.Key: Any] = [ + .font: UIFont.systemFont(ofSize: 14, weight: .bold), + .foregroundColor: UIColor.white] + + let moreIngredientsAttributes: [NSAttributedString.Key: Any] = [ + .font: UIFont.systemFont(ofSize: 14, weight: .light), + .foregroundColor: UIColor.white] + + let ingredientsAttributedString = NSMutableAttributedString() + + if let ingredientsToShow = drinkDetailModel?.ingredients.prefix(CardContentView.linesOfVisibleIngredients) { + for ingredient in ingredientsToShow { + var ingredientString = "" + if ingredientsAttributedString.length > 0 { + ingredientString.append("\n") + } + ingredientString.append("• \(ingredient)") + + ingredientsAttributedString.append(NSAttributedString(string: ingredientString, attributes: ingredientsAttributes)) + } + } + + if let ingredientsToCount = drinkDetailModel?.ingredients.dropFirst(CardContentView.linesOfVisibleIngredients), !ingredientsToCount.isEmpty { + ingredientsAttributedString.append(NSAttributedString(string: "\nand \(ingredientsToCount.count) ingredients more", attributes: moreIngredientsAttributes)) + } + + ingredientsLabel.attributedText = ingredientsAttributedString + + isFetchingDetails = false + } + } + + var isFetchingDetails: Bool = true { + didSet { + if isFetchingDetails { + //show loading view and hide ingredients label + UIView.animate(withDuration: 0.3) { + self.ingredientsLabel.isHidden = true + self.activityIndicator.startAnimating() + } + } else { + UIView.animate(withDuration: 0.3) { + self.ingredientsLabel.isHidden = false + self.activityIndicator.stopAnimating() + } + } + } + } + + + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var ingredientsLabel: UILabel! + @IBOutlet weak var imageView: UIImageView! + @IBOutlet weak var gradientView: GradientView! + @IBOutlet weak var activityIndicator: UIActivityIndicatorView! + + @IBOutlet weak var imageToTopAnchor: NSLayoutConstraint! + @IBOutlet weak var imageToLeadingAnchor: NSLayoutConstraint! + @IBOutlet weak var imageToTrailingAnchor: NSLayoutConstraint! + @IBOutlet weak var imageToBottomAnchor: NSLayoutConstraint! + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + fromNib() + commonSetup() + } + + override init(frame: CGRect) { + super.init(frame: frame) + fromNib() + commonSetup() + } + + override func awakeFromNib() { + super.awakeFromNib() + commonSetup() + } + + private func commonSetup() { + // *Make the background image stays still at the center while we animationg, + // else the image will get resized during animation. + imageView.contentMode = .scaleAspectFill + setFontState(isHighlighted: false) + } + + // This "connects" highlighted (pressedDown) font's sizes with the destination card's font sizes + func setFontState(isHighlighted: Bool) { + if isHighlighted { +// titleLabel.font = UIFont.systemFont(ofSize: 24 * GlobalConstants.cardHighlightedFactor, weight: .bold) +// ingredientsLabel.font = UIFont.systemFont(ofSize: 40 * GlobalConstants.cardHighlightedFactor, weight: .semibold) + } else { +// titleLabel.font = UIFont.systemFont(ofSize: 24, weight: .bold) +// ingredientsLabel.font = UIFont.systemFont(ofSize: 40, weight: .semibold) + } + } +} diff --git a/Drink-O-Matic/Drink-O-Matic/Views/CardContentView.xib b/Drink-O-Matic/Drink-O-Matic/Views/CardContentView.xib new file mode 100755 index 000000000..e96660b8b --- /dev/null +++ b/Drink-O-Matic/Drink-O-Matic/Views/CardContentView.xib @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 83932486ecf68d278e24668da96ac4d7444f9e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ramiro=20Coll=20Do=C3=B1etz?= Date: Tue, 6 Aug 2019 13:31:13 -0300 Subject: [PATCH 3/3] Update README.md --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 11bf4f62a..51bd98fa1 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,22 @@ Please clone the repository, complete the exercise, and submit a PR for us to re A) Describe the strategy used to consume the API endpoints and the data management. +To consume the API endpoints I used Alamofire5 (beta version). If you check the two models, you'll notice that I used different approachs to parse the data. At Drink model, I used the new Codable Swift object, that gives you a super easy and quick way to parse JSON response into models. For the DrinkDetail, I used standard dict parsing to fetch properly the N ingredients. + B) Explain which library was used for the routing and why. Would you use the same for a consumer facing app targeting thousands of users? Why? +I used a different approach for navigation in the app basing myself in a demo proyect. Using advanced transitions I copied the navigation from AppStore, using UIViewControllerTransitioningDelegate to achive it. + C) Have you used any strategy to optimize the performance of the list generated for the first feature? +Yes, I'm fetching each drink detail at the willDisplay delegate of the collectionview and requesting it from API asynchronously. Also, I'm caching the models into an array during the applife time, so we only need to fetch it once. If you perform a pull to request at the collectionview, all data will be refreshed from server. Anyway, this can be a lot better with a better API. + D) Would you like to add any further comments or observations? +The API haves a really poor design. It can be improved in a lot of different ways, for example: + - Having all the data that we need at home screen at the first request. + - Using pagination + - Using timestamps to keep track of changes in data. In this way, we can use a database that can keep record of all drinks and just update some if is necessary. ## Overview: