[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\ncustom: ['https://1manstartup.com/donate']\n"
  },
  {
    "path": ".gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# Visual Studio Code related\n.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\n/build/\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n**/android/**/GeneratedPluginRegistrant.java\n**/android/key.properties\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n\n\n*google-services.json\n*GoogleService-Info.plist\n*lib/credentials.dart"
  },
  {
    "path": ".metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: 7a4c33425ddd78c54aba07d86f3f9a4a0051769b\n  channel: stable\n\nproject_type: app\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Dave Faliskie\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Travel Treasury\n[Download The Live App](https://traveltreasury.app)\n\n![alt text](https://travel-treasury.s3.amazonaws.com/background_3phones.png)\n\nThis repository contains all the code written throughout the 1ManStartup YouTube tutorials for building a travel budget app using Flutter\n\n[View the channel on YouTube](https://www.youtube.com/channel/UC8xcnxN4CyXdPCeUN1eURPg)\n\n## How To Use This Resource\n\nEach episode where code is created or modified will have an associated branch\nin this repo. The code in each episode's branch will contain the completed code from that episode\nand the branch will remain in that state.\n\nThe master branch will contain the most recent version of code, and be considered the \"production\" version.\nThis means the master branch will always be the most up to date.\n\n\nAny questions should be asked in the comments of the relevant video on YouTube.\n\n\n## Setup Firebase Database\n\nAfter Episode 15 you will need to configure your own Firebase project. Most importantly you will need to generate and include your own google-services.json file for Android and GoogleServices-Info.plist file for iOS. Full instructions on how to configure Firebase for this project can be found in [Episode 15 on YouTube](https://youtu.be/8L0YWmVYIqU)\n"
  },
  {
    "path": "android/app/build.gradle",
    "content": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader('UTF-8') { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterRoot = localProperties.getProperty('flutter.sdk')\nif (flutterRoot == null) {\n    throw new FileNotFoundException(\"Flutter SDK not found. Define location with flutter.sdk in the local.properties file.\")\n}\n\ndef flutterVersionCode = localProperties.getProperty('flutter.versionCode')\nif (flutterVersionCode == null) {\n    flutterVersionCode = '1'\n}\n\ndef flutterVersionName = localProperties.getProperty('flutter.versionName')\nif (flutterVersionName == null) {\n    flutterVersionName = '1.0'\n}\n\napply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply from: \"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle\"\napply plugin: 'com.google.firebase.crashlytics'\n\ndef keystoreProperties = new Properties()\ndef keystorePropertiesFile = rootProject.file('key.properties')\nif (keystorePropertiesFile.exists()) {\n    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n}\n\nandroid {\n    compileSdkVersion 28\n\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n\n    defaultConfig {\n        applicationId \"com.a1manstartup.travel_budget\"\n        minSdkVersion 21\n        targetSdkVersion 29\n        versionCode flutterVersionCode.toInteger()\n        versionName flutterVersionName\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n        // TODO: find a better solution to the DEX reference limit https://developer.android.com/studio/build/multidex\n        multiDexEnabled true\n    }\n\n    signingConfigs {\n        release {\n            keyAlias keystoreProperties['keyAlias']\n            keyPassword keystoreProperties['keyPassword']\n            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null\n            storePassword keystoreProperties['storePassword']\n        }\n    }\n\n    buildTypes {\n        release {\n            signingConfig signingConfigs.release\n        }\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n    implementation 'com.android.support:multidex:1.0.3'\n}\n\n\napply plugin: 'com.google.gms.google-services'"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.a1manstartup.travel_budget\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.a1manstartup.travel_budget\">\n\n    <!-- io.flutter.app.FlutterApplication is an android.app.Application that\n         calls FlutterMain.startInitialization(this); in its onCreate method.\n         In most cases you can leave this as-is, but you if you want to provide\n         additional functionality it is fine to subclass or reimplement\n         FlutterApplication and put your custom class here. -->\n    <application\n        android:name=\"io.flutter.app.FlutterApplication\"\n        android:label=\"Travel Treasury\"\n        android:icon=\"@mipmap/ic_launcher\">\n        <activity\n            android:name=\".MainActivity\"\n            android:launchMode=\"singleTop\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:windowSoftInputMode=\"adjustResize\">\n            <!-- This keeps the window background of the activity showing\n                 until Flutter renders its first frame. It can be removed if\n                 there is no splash screen (such as the default splash screen\n                 defined in @style/LaunchTheme). -->\n            <meta-data\n                android:name=\"io.flutter.app.android.SplashScreenUntilFirstFrame\"\n                android:value=\"true\" />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n        <meta-data\n            android:name=\"com.google.android.gms.ads.APPLICATION_ID\"\n            android:value=\"ca-app-pub-2334510780816542~7385148076\"/>\n    </application>\n\n    <uses-permission android:name=\"android.permission.INTERNET\" android:maxSdkVersion=\"28\" />\n</manifest>"
  },
  {
    "path": "android/app/src/main/kotlin/com/a1manstartup/travel_budget/MainActivity.kt",
    "content": "package com.a1manstartup.travel_budget\n\nimport android.os.Bundle\n\nimport io.flutter.app.FlutterActivity\nimport io.flutter.plugins.GeneratedPluginRegistrant\n\nclass MainActivity: FlutterActivity() {\n  override fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    GeneratedPluginRegistrant.registerWith(this)\n  }\n}\n"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- <item android:drawable=\"@android:color/white\" /> -->\n\n    <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@drawable/launch_screen\" />\n    </item>\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <background android:drawable=\"@color/ic_launcher_background\"/>\n  <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>\n"
  },
  {
    "path": "android/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#57AEAF</color>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             Flutter draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.a1manstartup.travel_budget\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "android/build.gradle",
    "content": "buildscript {\n    ext.kotlin_version = '1.3.21'\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.3.1'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n        classpath 'com.google.gms:google-services:4.3.3'\n        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0'\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\nrootProject.buildDir = '../build'\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(':app')\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.6.2-all.zip\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\nandroid.enableR8=true\n"
  },
  {
    "path": "android/settings.gradle",
    "content": "include ':app'\n\ndef flutterProjectRoot = rootProject.projectDir.parentFile.toPath()\n\ndef plugins = new Properties()\ndef pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')\nif (pluginsFile.exists()) {\n    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }\n}\n\nplugins.each { name, path ->\n    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()\n    include \":$name\"\n    project(\":$name\").projectDir = pluginDirectory\n}\n"
  },
  {
    "path": "android/settings_aar.gradle",
    "content": "include ':app'\n"
  },
  {
    "path": "ios/Flutter/.last_build_id",
    "content": "ff43a8078c18a80d1d983aec4895d6ad"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>8.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Flutter.podspec",
    "content": "#\n# NOTE: This podspec is NOT to be published. It is only used as a local source!\n#\n\nPod::Spec.new do |s|\n  s.name             = 'Flutter'\n  s.version          = '1.0.0'\n  s.summary          = 'High-performance, high-fidelity mobile apps.'\n  s.description      = <<-DESC\nFlutter provides an easy and productive way to build and deploy high-performance mobile apps for Android and iOS.\n                       DESC\n  s.homepage         = 'https://flutter.io'\n  s.license          = { :type => 'MIT' }\n  s.author           = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' }\n  s.source           = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s }\n  s.ios.deployment_target = '8.0'\n  s.vendored_frameworks = 'Flutter.framework'\nend\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/flutter_export_environment.sh",
    "content": "#!/bin/sh\n# This is a generated file; do not edit or check into version control.\nexport \"FLUTTER_ROOT=/Users/davefaliskie/flutter\"\nexport \"FLUTTER_APPLICATION_PATH=/Users/davefaliskie/Code/travel_budget\"\nexport \"FLUTTER_TARGET=/Users/davefaliskie/Code/travel_budget/lib/main.dart\"\nexport \"FLUTTER_BUILD_DIR=build\"\nexport \"SYMROOT=${SOURCE_ROOT}/../build/ios\"\nexport \"OTHER_LDFLAGS=$(inherited) -framework Flutter\"\nexport \"FLUTTER_FRAMEWORK_DIR=/Users/davefaliskie/flutter/bin/cache/artifacts/engine/ios\"\nexport \"FLUTTER_BUILD_NAME=1.0.0\"\nexport \"FLUTTER_BUILD_NUMBER=1\"\nexport \"DART_DEFINES=flutter.inspector.structuredErrors%3Dtrue\"\nexport \"DART_OBFUSCATION=false\"\nexport \"TRACK_WIDGET_CREATION=true\"\nexport \"TREE_SHAKE_ICONS=false\"\nexport \"PACKAGE_CONFIG=.packages\"\n"
  },
  {
    "path": "ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\n# platform :ios, '9.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_ios_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n\n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?\n  ) -> Bool {\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-83.5x83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"Icon-App-1024x1024@1x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"launch_screen.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"filename\" : \"launch_screen@2x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"filename\" : \"launch_screen@3x.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images."
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"16097.2\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"16087\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                                <rect key=\"frame\" x=\"-113\" y=\"-120\" width=\"640\" height=\"1136\"/>\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"76.811594202898561\" y=\"251.11607142857142\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"640\" height=\"1136\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>Travel Treasury</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleURLTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t<array>\n\t\t\t\t<string>com.googleusercontent.apps.635382246089-feadgcif5jb704jtq2nir0d6cnh8fu02</string>\n\t\t\t</array>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t<array>\n\t\t\t\t<string>com.googleusercontent.apps.635382246089-egv2iuv19s1e0gjiq7rqvngu4c7e7su0</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>GADApplicationIdentifier</key>\n\t<string>ca-app-pub-2334510780816542~6726672523</string>\n\t<key>LSApplicationCategoryType</key>\n\t<string></string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIBackgroundModes</key>\n\t<array>\n\t\t<string>fetch</string>\n\t\t<string>remote-notification</string>\n\t</array>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>io.flutter.embedded_views_preview</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\""
  },
  {
    "path": "ios/Runner/Runner.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.developer.applesignin</key>\n\t<array>\n\t\t<string>Default</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t79B7BE68738E518A2180EBC1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2C587E9A5CE2029DC627BB1 /* Pods_Runner.framework */; };\n\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n\t\tF661854B22D2FB7A00F470E2 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F661854A22D2FB7900F470E2 /* GoogleService-Info.plist */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t4B222A4CE387272255EFF8F4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t585F8E30EE2A7E3719072D33 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t6D26CDADDD27BBED144A21CE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tA2C587E9A5CE2029DC627BB1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF60F054123AED29C00A7CBC4 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = \"<group>\"; };\n\t\tF661854A22D2FB7900F470E2 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"GoogleService-Info.plist\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t79B7BE68738E518A2180EBC1 /* Pods_Runner.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7AEB469C9BCC6CEA8F744F18 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t585F8E30EE2A7E3719072D33 /* Pods-Runner.debug.xcconfig */,\n\t\t\t\t6D26CDADDD27BBED144A21CE /* Pods-Runner.release.xcconfig */,\n\t\t\t\t4B222A4CE387272255EFF8F4 /* Pods-Runner.profile.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t\t7AEB469C9BCC6CEA8F744F18 /* Pods */,\n\t\t\t\tD77848A49B74BD0A44544A5F /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF60F054123AED29C00A7CBC4 /* Runner.entitlements */,\n\t\t\t\tF661854A22D2FB7900F470E2 /* GoogleService-Info.plist */,\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t97C146F11CF9000F007C117D /* Supporting Files */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F11CF9000F007C117D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD77848A49B74BD0A44544A5F /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA2C587E9A5CE2029DC627BB1 /* Pods_Runner.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t55FBF33E8A6D71BEB6B19B9A /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t\t68376A1452E274003D21895A /* [CP] Embed Pods Frameworks */,\n\t\t\t\t9CFF9FF5EF81DF04E13A03E3 /* [CP] Copy Pods Resources */,\n\t\t\t\tF61820892586ED4B007F31CA /* Run Script Crashlytics */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0910;\n\t\t\t\tORGANIZATIONNAME = \"The Chromium Authors\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tDevelopmentTeam = 8V4XE9BJVC;\n\t\t\t\t\t\tLastSwiftMigration = 0910;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tSystemCapabilities = {\n\t\t\t\t\t\t\tcom.apple.BackgroundModes = {\n\t\t\t\t\t\t\t\tenabled = 1;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t\tF661854B22D2FB7A00F470E2 /* GoogleService-Info.plist in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" embed_and_thin\";\n\t\t};\n\t\t55FBF33E8A6D71BEB6B19B9A /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"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\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t68376A1452E274003D21895A /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/BoringSSL-GRPC/openssl_grpc.framework\",\n\t\t\t\t\"${PODS_ROOT}/../Flutter/Flutter.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/abseil/absl.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/apple_sign_in/apple_sign_in.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/device_info/device_info.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/libPhoneNumber-iOS/libPhoneNumber_iOS.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/libphonenumber/libphonenumber.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl_grpc.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/absl.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/apple_sign_in.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libPhoneNumber_iOS.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libphonenumber.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n\t\t9CFF9FF5EF81DF04E13A03E3 /* [CP] Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\",\n\t\t\t\t\"${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle\",\n\t\t\t);\n\t\t\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tF61820892586ED4B007F31CA /* Run Script Crashlytics */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script Crashlytics\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"# Type a script or drag a script file from your workspace to insert its path.\\n${PODS_ROOT}/FirebaseCrashlytics/run\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 8V4XE9BJVC;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.a1manstartup.travelBudget1;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = 8V4XE9BJVC;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.a1manstartup.travelBudget1;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = 8V4XE9BJVC;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.a1manstartup.travelBudget1;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0910\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "lib/classes/progress_painter.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'dart:math';\n\nclass ProgressPainter extends CustomPainter {\n  Color defaultCircleColor;\n  Color percentageCompletedCircleColor;\n  double completedPercentage;\n  double circleWidth;\n\n  ProgressPainter(\n      {this.defaultCircleColor,\n        this.percentageCompletedCircleColor,\n        this.completedPercentage,\n        this.circleWidth});\n\n  getPaint(Color color) {\n    return Paint()\n      ..color = color\n      ..strokeCap = StrokeCap.round\n      ..style = PaintingStyle.stroke\n      ..strokeWidth = circleWidth;\n  }\n\n  @override\n  void paint(Canvas canvas, Size size) {\n    Paint defaultCirclePaint = getPaint(defaultCircleColor);\n    Paint progressCirclePaint = getPaint(percentageCompletedCircleColor);\n\n    Offset center = Offset(size.width / 2, size.height / 2);\n    double radius = min(size.width / 2, size.height / 2);\n    canvas.drawCircle(center, radius, defaultCirclePaint);\n\n    double arcAngle = 2 * pi * (completedPercentage / 100);\n    canvas.drawArc(Rect.fromCircle(center: center, radius: radius), -pi / 2,\n        arcAngle, false, progressCirclePaint);\n  }\n\n  @override\n  bool shouldRepaint(CustomPainter painter) {\n    return true;\n  }\n}"
  },
  {
    "path": "lib/generated/i18n.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\n\n// ignore_for_file: non_constant_identifier_names\n// ignore_for_file: camel_case_types\n// ignore_for_file: prefer_single_quotes\n\n// This file is automatically generated. DO NOT EDIT, all your changes would be lost.\nclass S implements WidgetsLocalizations {\n  const S();\n\n  static S current;\n\n  static const GeneratedLocalizationsDelegate delegate =\n    GeneratedLocalizationsDelegate();\n\n  static S of(BuildContext context) => Localizations.of<S>(context, S);\n\n  @override\n  TextDirection get textDirection => TextDirection.ltr;\n\n}\n\nclass $en extends S {\n  const $en();\n}\n\nclass GeneratedLocalizationsDelegate extends LocalizationsDelegate<S> {\n  const GeneratedLocalizationsDelegate();\n\n  List<Locale> get supportedLocales {\n    return const <Locale>[\n      Locale(\"en\", \"\"),\n    ];\n  }\n\n  LocaleListResolutionCallback listResolution({Locale fallback, bool withCountry = true}) {\n    return (List<Locale> locales, Iterable<Locale> supported) {\n      if (locales == null || locales.isEmpty) {\n        return fallback ?? supported.first;\n      } else {\n        return _resolve(locales.first, fallback, supported, withCountry);\n      }\n    };\n  }\n\n  LocaleResolutionCallback resolution({Locale fallback, bool withCountry = true}) {\n    return (Locale locale, Iterable<Locale> supported) {\n      return _resolve(locale, fallback, supported, withCountry);\n    };\n  }\n\n  @override\n  Future<S> load(Locale locale) {\n    final String lang = getLang(locale);\n    if (lang != null) {\n      switch (lang) {\n        case \"en\":\n          S.current = const $en();\n          return SynchronousFuture<S>(S.current);\n        default:\n          // NO-OP.\n      }\n    }\n    S.current = const S();\n    return SynchronousFuture<S>(S.current);\n  }\n\n  @override\n  bool isSupported(Locale locale) => _isSupported(locale, true);\n\n  @override\n  bool shouldReload(GeneratedLocalizationsDelegate old) => false;\n\n  ///\n  /// Internal method to resolve a locale from a list of locales.\n  ///\n  Locale _resolve(Locale locale, Locale fallback, Iterable<Locale> supported, bool withCountry) {\n    if (locale == null || !_isSupported(locale, withCountry)) {\n      return fallback ?? supported.first;\n    }\n\n    final Locale languageLocale = Locale(locale.languageCode, \"\");\n    if (supported.contains(locale)) {\n      return locale;\n    } else if (supported.contains(languageLocale)) {\n      return languageLocale;\n    } else {\n      final Locale fallbackLocale = fallback ?? supported.first;\n      return fallbackLocale;\n    }\n  }\n\n  ///\n  /// Returns true if the specified locale is supported, false otherwise.\n  ///\n  bool _isSupported(Locale locale, bool withCountry) {\n    if (locale != null) {\n      for (Locale supportedLocale in supportedLocales) {\n        // Language must always match both locales.\n        if (supportedLocale.languageCode != locale.languageCode) {\n          continue;\n        }\n\n        // If country code matches, return this locale.\n        if (supportedLocale.countryCode == locale.countryCode) {\n          return true;\n        }\n\n        // If no country requirement is requested, check if this locale has no country.\n        if (true != withCountry && (supportedLocale.countryCode == null || supportedLocale.countryCode.isEmpty)) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n}\n\nString getLang(Locale l) => l == null\n  ? null\n  : l.countryCode != null && l.countryCode.isEmpty\n    ? l.languageCode\n    : l.toString();\n"
  },
  {
    "path": "lib/main.dart",
    "content": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:firebase_core/firebase_core.dart';\nimport 'package:flutter/material.dart';\nimport 'package:google_fonts/google_fonts.dart';\nimport 'package:travel_budget/services/custom_colors.dart';\nimport 'package:travel_budget/views/navigation_view.dart';\nimport 'package:travel_budget/views/first_view.dart';\nimport 'package:travel_budget/views/sign_up_view.dart';\nimport 'package:travel_budget/widgets/provider_widget.dart';\nimport 'package:travel_budget/services/auth_service.dart';\nimport 'package:firebase_admob/firebase_admob.dart';\nimport 'package:travel_budget/services/admob_service.dart';\nimport 'package:firebase_crashlytics/firebase_crashlytics.dart';\n\nvoid main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  await Firebase.initializeApp();\n  FirebaseAdMob.instance.initialize(appId: AdMobService().getAdMobAppId());\n  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;\n  runApp(MyApp());\n}\n\nclass MyApp extends StatefulWidget {\n  @override\n  _MyAppState createState() => _MyAppState();\n}\n\nclass _MyAppState extends State<MyApp> with WidgetsBindingObserver {\n  var colors = CustomColors(WidgetsBinding.instance.window.platformBrightness);\n\n  @override\n  void initState() {\n    super.initState();\n    WidgetsBinding.instance.addObserver(this);\n  }\n\n  @override\n  void dispose() {\n    WidgetsBinding.instance.removeObserver(this);\n    super.dispose();\n  }\n\n  @override\n  void didChangePlatformBrightness() {\n    setState(() {\n      colors = CustomColors(WidgetsBinding.instance.window.platformBrightness);\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Provider(\n      auth: AuthService(),\n      db: FirebaseFirestore.instance,\n      colors: colors,\n      child: MaterialApp(\n        debugShowCheckedModeBanner: false,\n        title: \"Travel Budget App\",\n        theme: ThemeData(\n            brightness: Brightness.light,\n            primarySwatch: Colors.blue,\n            textTheme: TextTheme(bodyText2: GoogleFonts.quicksand(fontSize: 14.0))),\n        darkTheme: ThemeData(\n            brightness: Brightness.dark,\n            primarySwatch: Colors.blue,\n            textTheme: TextTheme(bodyText2: GoogleFonts.bitter(fontSize: 14.0))),\n        home: HomeController(),\n        routes: <String, WidgetBuilder>{\n          '/home': (BuildContext context) => HomeController(),\n          '/signUp': (BuildContext context) => SignUpView(authFormType: AuthFormType.signUp),\n          '/signIn': (BuildContext context) => SignUpView(authFormType: AuthFormType.signIn),\n          '/anonymousSignIn': (BuildContext context) => SignUpView(authFormType: AuthFormType.anonymous),\n          '/convertUser': (BuildContext context) => SignUpView(authFormType: AuthFormType.convert),\n        },\n      ),\n    );\n  }\n}\n\nclass HomeController extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    final AuthService auth = Provider.of(context).auth;\n    return StreamBuilder<String>(\n      stream: auth.onAuthStateChanged,\n      builder: (context, AsyncSnapshot<String> snapshot) {\n        if (snapshot.connectionState == ConnectionState.active) {\n          final bool signedIn = snapshot.hasData;\n          return signedIn ? NavigationView() : FirstView();\n        }\n        return Container();\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/models/Place.dart",
    "content": "class Place {\n  String name;\n  double averageBudget;\n  String placeId;\n\n  Place(\n      this.name,\n      this.averageBudget,\n      this.placeId,\n      );\n}"
  },
  {
    "path": "lib/models/Trip.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:travel_budget/credentials.dart';\n\n\nclass Trip {\n  String title;\n  DateTime startDate;\n  DateTime endDate;\n  double budget;\n  Map budgetTypes;\n  String travelType;\n  String photoReference;\n  String notes;\n  String documentId;\n  double saved;\n  List ledger;\n\n\n  Trip(\n      this.title,\n      this.startDate,\n      this.endDate,\n      this.budget,\n      this.budgetTypes,\n      this.travelType\n      );\n\n  // formatting for upload to Firbase when creating the trip\n  Map<String, dynamic> toJson() => {\n    'title': title,\n    'startDate': startDate,\n    'endDate': endDate,\n    'budget': budget,\n    'budgetTypes': budgetTypes,\n    'travelType': travelType,\n    'photoReference': photoReference,\n  };\n\n  // creating a Trip object from a firebase snapshot\n  Trip.fromSnapshot(DocumentSnapshot snapshot) :\n      title = snapshot.data()['title'],\n      startDate = snapshot.data()['startDate'].toDate(),\n      endDate = snapshot.data()['endDate'].toDate(),\n      budget = snapshot.data()['budget'],\n      budgetTypes = snapshot.data()['budgetTypes'],\n      travelType = snapshot.data()['travelType'],\n      photoReference = snapshot.data()['photoReference'],\n      notes = snapshot.data()['notes'],\n      documentId = snapshot.id,\n      saved = snapshot.data()['saved'],\n      ledger = snapshot.data()['ledger'];\n\n\n\n  Map<String, Icon> types({color = Colors.black}) => {\n    \"car\": Icon(Icons.directions_car, size: 50, color: color),\n    \"bus\": Icon(Icons.directions_bus, size: 50, color: color),\n    \"train\": Icon(Icons.train, size: 50, color: color),\n    \"plane\": Icon(Icons.airplanemode_active, size: 50, color: color),\n    \"ship\": Icon(Icons.directions_boat, size: 50, color: color),\n    \"other\": Icon(Icons.directions, size: 50, color: color),\n  };\n\n  // return the google places image\n  Image getLocationImage() {\n    final baseUrl = \"https://maps.googleapis.com/maps/api/place/photo\";\n    final maxWidth = \"1000\";\n    final url = \"$baseUrl?maxwidth=$maxWidth&photoreference=$photoReference&key=$PLACES_API_KEY\";\n    return Image.network(url, fit: BoxFit.cover);\n  }\n\n  int getTotalTripDays() {\n    int total = endDate.difference(startDate).inDays;\n    if (total < 1) {\n      total = 1;\n    }\n    return total;\n  }\n\n  int getDaysUntilTrip() {\n    int diff = startDate.difference(DateTime.now()).inDays;\n    if (diff < 0) {\n      diff = 0;\n    }\n    return diff;\n  }\n\n  int getCurrentDailyBudget() {\n    if (saved == 0 || saved == null) {\n      return 0;\n    } else {\n      return (saved / getTotalTripDays()).floor();\n    }\n  }\n\n  Map<String, dynamic> ledgerItem(String amount, String type) {\n    var amountDouble = double.parse(amount);\n    if (type == \"spent\") {\n      amountDouble = double.parse(\"-\" + amount);\n    }\n    return {\n      'ledger': FieldValue.arrayUnion([\n        {\n          \"date\": DateTime.now(),\n          \"amount\": amountDouble,\n        },\n      ]),\n      'saved': FieldValue.increment(amountDouble)\n    };\n  }\n}\n\n"
  },
  {
    "path": "lib/models/User.dart",
    "content": "class User {\n  String homeCountry;\n  bool admin;\n\n  User(this.homeCountry);\n\n  Map<String, dynamic> toJson() => {\n    'homeCountry': homeCountry,\n    'admin': admin,\n  };\n}"
  },
  {
    "path": "lib/services/admob_service.dart",
    "content": "import 'dart:io';\nimport 'package:firebase_admob/firebase_admob.dart';\nimport 'package:flutter/material.dart';\n\nclass AdMobService {\n\n  String getAdMobAppId() {\n    if (Platform.isIOS) {\n      return 'ca-app-pub-2334510780816542~6726672523';\n    } else if (Platform.isAndroid) {\n      return 'ca-app-pub-2334510780816542~7385148076';\n    }\n    return null;\n  }\n\n  static String _getBannerAdId() {\n    if (Platform.isIOS) {\n//      return 'ca-app-pub-2334510780816542/6833456062';\n      return 'ca-app-pub-3940256099942544/2934735716';\n    } else if (Platform.isAndroid) {\n//      return 'ca-app-pub-2334510780816542/2993163849';\n      return \"ca-app-pub-3940256099942544/6300978111\";\n    }\n    return null;\n  }\n\n  String getInterstitialAdId() {\n      if (Platform.isIOS) {\n//      return '';\n        return 'ca-app-pub-3940256099942544/4411468910';\n      } else if (Platform.isAndroid) {\n//      return '';\n        return \"ca-app-pub-3940256099942544/1033173712\";\n      }\n      return null;\n  }\n\n\n  InterstitialAd getNewTripInterstitial() {\n    return InterstitialAd(\n      adUnitId: getInterstitialAdId(),\n      listener: (MobileAdEvent event) {\n        print(\"InterstitialAd event is $event\");\n      },\n    );\n  }\n\n  static BannerAd _homeBannerAd;\n\n  static BannerAd _getHomePageBannerAd() {\n    return BannerAd(\n      adUnitId: _getBannerAdId(),\n      size: AdSize.smartBanner\n    );\n  }\n\n  static void showHomeBannerAd() {\n    if ( _homeBannerAd == null ) _homeBannerAd = _getHomePageBannerAd();\n    _homeBannerAd\n      ..load()\n      ..show(anchorType: AnchorType.bottom, anchorOffset: kBottomNavigationBarHeight);\n  }\n\n  static void hideHomeBannerAd() async {\n    await _homeBannerAd.dispose();\n    _homeBannerAd = null;\n  }\n\n\n}"
  },
  {
    "path": "lib/services/auth_service.dart",
    "content": "import 'package:apple_sign_in/apple_sign_in.dart';\nimport 'package:firebase_auth/firebase_auth.dart';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:google_sign_in/google_sign_in.dart';\n\nclass AuthService {\n  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;\n  final GoogleSignIn _googleSignIn = GoogleSignIn();\n\n  Stream<String> get onAuthStateChanged => _firebaseAuth.authStateChanges().map(\n        (User user) => user?.uid,\n      );\n\n  // GET UID\n  String getCurrentUID() {\n    return _firebaseAuth.currentUser.uid;\n  }\n\n  // GET CURRENT USER\n  Future getCurrentUser() async {\n    return _firebaseAuth.currentUser;\n  }\n\n  getProfileImage() {\n    if(_firebaseAuth.currentUser.photoURL != null) {\n      return Image.network(_firebaseAuth.currentUser.photoURL, height: 100, width: 100);\n    } else {\n      return Icon(Icons.account_circle, size: 100);\n    }\n  }\n\n  // Email & Password Sign Up\n  Future<String> createUserWithEmailAndPassword(\n      String email, String password, String name) async {\n    final authResult = await _firebaseAuth.createUserWithEmailAndPassword(\n      email: email,\n      password: password,\n    );\n\n    // Update the username\n    await updateUserName(name, authResult.user);\n    return authResult.user.uid;\n  }\n\n  Future updateUserName(String name, User currentUser) async {\n    await currentUser.updateProfile(displayName: name);\n    await currentUser.reload();\n  }\n\n  // Email & Password Sign In\n  Future<String> signInWithEmailAndPassword(\n      String email, String password) async {\n    return (await _firebaseAuth.signInWithEmailAndPassword(\n            email: email, password: password))\n        .user\n        .uid;\n  }\n\n  // Sign Out\n  signOut() async {\n    return await _firebaseAuth.signOut();\n  }\n\n  // Reset Password\n  Future sendPasswordResetEmail(String email) async {\n    return _firebaseAuth.sendPasswordResetEmail(email: email);\n  }\n\n  // Create Anonymous User\n  Future singInAnonymously() {\n    return _firebaseAuth.signInAnonymously();\n  }\n\n  Future convertUserWithEmail(\n      String email, String password, String name) async {\n    final currentUser = _firebaseAuth.currentUser;\n\n    final credential =\n        EmailAuthProvider.credential(email: email, password: password);\n    await currentUser.linkWithCredential(credential);\n    await updateUserName(name, currentUser);\n  }\n\n  Future convertWithGoogle() async {\n    final currentUser = _firebaseAuth.currentUser;\n    final GoogleSignInAccount account = await _googleSignIn.signIn();\n    final GoogleSignInAuthentication _googleAuth = await account.authentication;\n    final AuthCredential credential = GoogleAuthProvider.credential(\n      idToken: _googleAuth.idToken,\n      accessToken: _googleAuth.accessToken,\n    );\n    await currentUser.linkWithCredential(credential);\n    await updateUserName(_googleSignIn.currentUser.displayName, currentUser);\n  }\n\n  // GOOGLE\n  Future<String> signInWithGoogle() async {\n    final GoogleSignInAccount account = await _googleSignIn.signIn();\n    final GoogleSignInAuthentication _googleAuth = await account.authentication;\n    final AuthCredential credential = GoogleAuthProvider.credential(\n      idToken: _googleAuth.idToken,\n      accessToken: _googleAuth.accessToken,\n    );\n    return (await _firebaseAuth.signInWithCredential(credential)).user.uid;\n  }\n\n  // APPLE\n  Future signInWithApple() async {\n    final AuthorizationResult result = await AppleSignIn.performRequests([\n      AppleIdRequest(requestedScopes: [Scope.email, Scope.fullName])\n    ]);\n\n    switch (result.status) {\n      case AuthorizationStatus.authorized:\n        final AppleIdCredential _auth = result.credential;\n        final OAuthProvider oAuthProvider =\n            new OAuthProvider(\"apple.com\");\n\n        final AuthCredential credential = oAuthProvider.credential(\n          idToken: String.fromCharCodes(_auth.identityToken),\n          accessToken: String.fromCharCodes(_auth.authorizationCode),\n        );\n\n        await _firebaseAuth.signInWithCredential(credential);\n\n        // update the user information\n        if (_auth.fullName != null) {\n          await _firebaseAuth.currentUser.updateProfile(displayName: \"${_auth.fullName.givenName} ${_auth.fullName.familyName}\");\n        }\n\n        break;\n\n      case AuthorizationStatus.error:\n        print(\"Sign In Failed ${result.error.localizedDescription}\");\n        break;\n\n      case AuthorizationStatus.cancelled:\n        print(\"User Cancled\");\n        break;\n    }\n  }\n\n  Future createUserWithPhone(String phone, BuildContext context) async {\n    _firebaseAuth.verifyPhoneNumber(\n        phoneNumber: phone,\n        timeout: Duration(seconds: 0),\n        verificationCompleted: (AuthCredential authCredential) {\n          _firebaseAuth.signInWithCredential(authCredential).then((UserCredential result){\n            Navigator.of(context).pop(); // to pop the dialog box\n            Navigator.of(context).pushReplacementNamed('/home');\n          }).catchError((e) {\n            return \"error\";\n          });\n        },\n        verificationFailed: (FirebaseAuthException exception) {\n          return \"error\";\n        },\n        codeSent: (String verificationId, [int forceResendingToken]) {\n          final _codeController = TextEditingController();\n          showDialog(\n            context: context,\n            barrierDismissible: false,\n            builder: (context) => AlertDialog(\n              title: Text(\"Enter Verification Code From Text Message\"),\n              content: Column(\n                mainAxisSize: MainAxisSize.min,\n                children: <Widget>[TextField(controller: _codeController)],\n              ),\n              actions: <Widget>[\n                FlatButton(\n                  child: Text(\"submit\"),\n                  textColor: Colors.white,\n                  color: Colors.green,\n                  onPressed: () {\n                    var _credential = PhoneAuthProvider.credential(verificationId: verificationId,\n                        smsCode: _codeController.text.trim());\n                    _firebaseAuth.signInWithCredential(_credential).then((UserCredential result){\n                      Navigator.of(context).pop(); // to pop the dialog box\n                      Navigator.of(context).pushReplacementNamed('/home');\n                    }).catchError((e) {\n                      return \"error\";\n                    });\n                  },\n                )\n              ],\n            ),\n          );\n        },\n        codeAutoRetrievalTimeout: (String verificationId) {\n          verificationId = verificationId;\n        });\n  }\n}\n\nclass NameValidator {\n  static String validate(String value) {\n    if (value.isEmpty) {\n      return \"Name can't be empty\";\n    }\n    if (value.length < 2) {\n      return \"Name must be at least 2 characters long\";\n    }\n    if (value.length > 50) {\n      return \"Name must be less than 50 characters long\";\n    }\n    return null;\n  }\n}\n\nclass EmailValidator {\n  static String validate(String value) {\n    if (value.isEmpty) {\n      return \"Email can't be empty\";\n    }\n    return null;\n  }\n}\n\nclass PasswordValidator {\n  static String validate(String value) {\n    if (value.isEmpty) {\n      return \"Password can't be empty\";\n    }\n    return null;\n  }\n}\n"
  },
  {
    "path": "lib/services/custom_colors.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass CustomColors {\n  Brightness brightness;\n  Color text1, primary;\n\n  CustomColors(Brightness brightness) {\n    this.brightness = brightness;\n\n    if(brightness == Brightness.dark) {\n      this.text1 = Color(0xff252223);\n      this.primary = Color(0xff3c7778);\n\n    } else {\n      this.text1 = Colors.white;\n      this.primary = Color(0xff57AEAF);\n    }\n  }\n\n}"
  },
  {
    "path": "lib/services/firebase_service.dart",
    "content": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:travel_budget/widgets/provider_widget.dart';\n\nclass FirebaseService {\n\n  static Future<Trip> getNextTrip(context) async {\n    final uid = Provider.of(context).auth.getCurrentUID();\n    var snapshot = await FirebaseFirestore.instance\n        .collection('userData')\n        .doc(uid)\n        .collection('trips')\n        .orderBy('startDate')\n        .limit(1)\n        .get();\n    return Trip.fromSnapshot(snapshot.docs.first);\n  }\n\n  static void addToLedger(context, documentId, item) async {\n    await Provider.of(context).db\n        .collection('userData')\n        .doc(Provider.of(context).auth.getCurrentUID())\n        .collection('trips')\n        .doc(documentId)\n        .update(item);\n  }\n}"
  },
  {
    "path": "lib/views/deposit_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:travel_budget/services/firebase_service.dart';\nimport 'package:travel_budget/views/navigation_view.dart';\nimport 'package:travel_budget/widgets/provider_widget.dart';\nimport 'package:travel_budget/widgets/rounded_button.dart';\n\nclass DepositView extends StatefulWidget {\n  final Trip trip;\n\n  DepositView({\n    @required this.trip,\n  });\n\n  @override\n  _DepositViewState createState() => _DepositViewState();\n}\n\nclass _DepositViewState extends State<DepositView> {\n  String _amount = \"0\";\n  String _error;\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      color: Colors.indigo,\n      width: MediaQuery.of(context).size.width,\n      height: MediaQuery.of(context).size.height,\n      child: SafeArea(\n        child: Column(\n          children: [\n            Spacer(),\n            FittedBox(\n              fit: BoxFit.fitWidth,\n              child: Text(\n                \"\\$$_amount\",\n                style: TextStyle(fontSize: 100, fontWeight: FontWeight.bold, color: Colors.white),\n              ),\n            ),\n            Padding(\n              padding: const EdgeInsets.only(top: 15.0),\n              child: Text(\"${_error ?? ''}\", style: TextStyle(color: Colors.white)),\n            ),\n            Container(\n              child: Padding(\n                padding: const EdgeInsets.symmetric(horizontal: 25.0),\n                child: GridView.count(\n                  crossAxisCount: 3,\n                  shrinkWrap: true,\n                  physics: NeverScrollableScrollPhysics(),\n                  childAspectRatio: 1.4,\n                  children: setKeyboard(),\n                ),\n              ),\n            ),\n            Spacer(),\n            Padding(\n              padding: const EdgeInsets.symmetric(horizontal: 15.0),\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n                children: [\n                  _actionBtn(\"spent\"),\n                  _actionBtn(\"saved\"),\n                ],\n              ),\n            ),\n            Spacer()\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget _numberBtn(String number) {\n    return FlatButton(\n      child: Text(\n        \"$number\",\n        style: TextStyle(fontSize: 40, color: Colors.white),\n      ),\n      onPressed: () {\n        setState(() {\n          if (_amount == \"0\") {\n            _amount = \"$number\";\n          } else if (_amount.length == 5) {\n            _amount = _amount;\n            HapticFeedback.heavyImpact();\n          } else {\n            _amount += \"$number\";\n          }\n        });\n      },\n    );\n  }\n\n  Widget _deleteBtn() {\n    return FlatButton(\n      child: Text(\n        \"<\",\n        style: TextStyle(fontSize: 40, color: Colors.white),\n      ),\n      onPressed: () {\n        setState(() {\n          if (_amount.length <= 1) {\n            _amount = \"0\";\n          } else {\n            _amount = _amount.substring(0, _amount.length - 1);\n          }\n        });\n      },\n    );\n  }\n\n  Widget _actionBtn(String type) {\n    return Expanded(\n      child: Padding(\n        padding: const EdgeInsets.symmetric(vertical: 5.0, horizontal: 10.0),\n        child: RoundedButton(\n          color: Colors.indigoAccent,\n          child:\n              Text(\"${type[0].toUpperCase()}${type.substring(1)}\", style: TextStyle(color: Colors.white, fontSize: 20)),\n          onPressed: () async {\n            if (_amount == \"0\") {\n              setState(() {\n                _error = \"Enter an amount\";\n              });\n            } else if (type == \"spent\" && double.parse(_amount) > widget.trip.saved) {\n              setState(() {\n                _error = \"Yove've only saved \\$${widget.trip.saved.floor()}\";\n              });\n            } else {\n              FirebaseService.addToLedger(context, widget.trip.documentId, widget.trip.ledgerItem(_amount, type));\n              Navigator.pushReplacement(\n                context,\n                PageRouteBuilder(\n                  pageBuilder: (_, __, ___) => NavigationView(),\n                  transitionDuration: Duration(seconds: 0),\n                ),\n              );\n            }\n          },\n        ),\n      ),\n    );\n  }\n\n  setKeyboard() {\n    List<Widget> keyboard = [];\n\n    // numbers 1-9\n    List.generate(9, (index) {\n      keyboard.add(_numberBtn(\"${index + 1}\"));\n    });\n\n    keyboard.add(Text(\"\"));\n    keyboard.add(_numberBtn(\"0\"));\n    keyboard.add(_deleteBtn());\n\n    return keyboard;\n  }\n}\n"
  },
  {
    "path": "lib/views/detail_trip_view.dart",
    "content": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:travel_budget/services/admob_service.dart';\nimport 'package:travel_budget/widgets/provider_widget.dart';\nimport 'edit_notes_view.dart';\nimport 'package:intl/intl.dart';\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:travel_budget/widgets/money_text_field.dart';\nimport 'package:travel_budget/widgets/calculator_widget.dart';\n\nclass DetailTripView extends StatefulWidget {\n  final Trip trip;\n\n  DetailTripView({Key key, @required this.trip}) : super(key: key);\n\n  @override\n  _DetailTripViewState createState() => _DetailTripViewState();\n}\n\nclass _DetailTripViewState extends State<DetailTripView> {\n  TextEditingController _budgetController = TextEditingController();\n  var _budget;\n\n  void initState() {\n    super.initState();\n    AdMobService.hideHomeBannerAd();\n    _budgetController.text = widget.trip.budget.toStringAsFixed(0);\n    _budget = widget.trip.budget.floor();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Center(\n        child: CustomScrollView(\n          slivers: <Widget>[\n            SliverAppBar(\n              title: Text('Trip Details'),\n              backgroundColor: Colors.green,\n              expandedHeight: 350.0,\n              flexibleSpace: FlexibleSpaceBar(\n                background: widget.trip.getLocationImage(),\n              ),\n              actions: <Widget>[\n                IconButton(\n                  icon: Icon(\n                    Icons.settings,\n                    color: Colors.white,\n                    size: 30,\n                  ),\n                  padding: const EdgeInsets.only(right: 15),\n                  onPressed: () {\n                    _tripEditModalBottomSheet(context);\n                  },\n                ),\n              ],\n            ),\n            SliverList(\n              delegate: SliverChildListDelegate([\n                tripDetails(),\n                CalculatorWidget(trip: widget.trip),\n                totalBudgetCard(),\n                daysOutCard(),\n                notesCard(context),\n                Container(\n                  height: 200,\n                )\n              ]),\n            )\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget daysOutCard() {\n    return Card(\n      color: Colors.amberAccent,\n      child: Padding(\n        padding: const EdgeInsets.all(8.0),\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n          children: <Widget>[\n            Text(\"${widget.trip.getDaysUntilTrip()}\", style: TextStyle(fontSize: 75)),\n            Text(\"days until your trip\", style: TextStyle(fontSize: 25))\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget tripDetails() {\n    return Card(\n      child: Column(\n        children: <Widget>[\n          Row(\n            children: <Widget>[\n              Padding(\n                padding: const EdgeInsets.all(8.0),\n                child: Text(\n                  widget.trip.title,\n                  style: TextStyle(fontSize: 30, color: Colors.green[900]),\n                ),\n              ),\n            ],\n          ),\n          Row(\n            children: <Widget>[\n              Padding(\n                padding: const EdgeInsets.only(left: 8.0, bottom: 8.0),\n                child: Text(\n                    \"${DateFormat('MM/dd/yyyy').format(widget.trip.startDate).toString()} - ${DateFormat('MM/dd/yyyy').format(widget.trip.endDate).toString()}\"),\n              ),\n            ],\n          ),\n        ],\n      ),\n    );\n  }\n\n  Widget totalBudgetCard() {\n    return Card(\n      color: Colors.blue,\n      child: Column(\n        children: <Widget>[\n          Padding(\n            padding: const EdgeInsets.all(8.0),\n            child: Row(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: <Widget>[\n                Text(\"Daily Budget\",\n                    style: TextStyle(fontSize: 15, color: Colors.white)),\n              ],\n            ),\n          ),\n          Padding(\n            padding: const EdgeInsets.all(8.0),\n            child: Row(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: <Widget>[\n                Flexible(\n                  child: AutoSizeText(\n                    \"\\$$_budget\",\n                    style: TextStyle(fontSize: 100),\n                    maxLines: 1,\n                  ),\n                ),\n              ],\n            ),\n          ),\n          Row(\n            children: <Widget>[\n              Expanded(\n                child: Container(\n                  color: Colors.blue[900],\n                  child: Padding(\n                    padding: const EdgeInsets.symmetric(\n                        vertical: 10.0, horizontal: 20),\n                    child: Text(\n                      \"\\$${_budget * widget.trip.getTotalTripDays()} total\",\n                      style: TextStyle(color: Colors.white, fontSize: 20),\n                    ),\n                  ),\n                ),\n              )\n            ],\n          )\n        ],\n      ),\n    );\n  }\n\n  Widget notesCard(context) {\n    return Hero(\n      tag: \"TripNotes-${widget.trip.title}\",\n      transitionOnUserGestures: true,\n      child: Card(\n        color: Colors.deepPurpleAccent,\n        child: InkWell(\n          child: Column(\n            children: <Widget>[\n              Padding(\n                padding: const EdgeInsets.only(top: 10.0, left: 10.0),\n                child: Row(\n                  children: <Widget>[\n                    Text(\"Trip Notes\",\n                        style: TextStyle(fontSize: 24, color: Colors.white)),\n                  ],\n                ),\n              ),\n              Padding(\n                padding: const EdgeInsets.all(8.0),\n                child: Row(\n                  children: setNoteText(),\n                ),\n              )\n            ],\n          ),\n          onTap: () {\n            Navigator.push(\n                context,\n                MaterialPageRoute(\n                    builder: (context) => EditNotesView(trip: widget.trip)));\n          },\n        ),\n      ),\n    );\n  }\n\n  List<Widget> setNoteText() {\n    if (widget.trip.notes == null) {\n      return [\n        Padding(\n          padding: const EdgeInsets.only(right: 8.0),\n          child: Icon(Icons.add_circle_outline, color: Colors.grey[300]),\n        ),\n        Text(\"Click To Add Notes\", style: TextStyle(color: Colors.grey[300])),\n      ];\n    } else {\n      return [\n        Text(widget.trip.notes, style: TextStyle(color: Colors.grey[300]))\n      ];\n    }\n  }\n\n\n  void _tripEditModalBottomSheet(context) {\n    showModalBottomSheet(\n      context: context,\n      builder: (BuildContext bc) {\n        return Container(\n          height: MediaQuery.of(context).size.height * .60,\n          child: Padding(\n            padding: const EdgeInsets.all(8.0),\n            child: Column(\n              children: <Widget>[\n                Row(\n                  children: <Widget>[\n                    Text(\"Edit Trip\"),\n                    Spacer(),\n                    IconButton(\n                      icon: Icon(\n                        Icons.cancel,\n                        color: Colors.orange,\n                        size: 25,\n                      ),\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    )\n                  ],\n                ),\n                Row(\n                  children: [\n                    Text(\n                      widget.trip.title,\n                      style: TextStyle(fontSize: 30, color: Colors.green[900]),\n                    ),\n                  ],\n                ),\n                Row(\n                  children: <Widget>[\n                    Expanded(\n                      child: MoneyTextField(\n                        controller: _budgetController,\n                        helperText: \"Budget\",\n                      ),\n                    )\n                  ],\n                ),\n                Row(\n                  mainAxisAlignment: MainAxisAlignment.center,\n                  children: <Widget>[\n                    RaisedButton(\n                      child: Text('Submit'),\n                      color: Colors.deepPurple,\n                      textColor: Colors.white,\n                      onPressed: () async {\n                        widget.trip.budget = double.parse(_budgetController.text);\n                        setState(() {\n                          _budget = widget.trip.budget.floor();\n                        });\n                        await updateTrip(context);\n                        Navigator.of(context).pop();\n                      },\n                    )\n                  ],\n                ),\n                Row(\n                  mainAxisAlignment: MainAxisAlignment.center,\n                  children: <Widget>[\n                    RaisedButton(\n                      child: Text('Delete'),\n                      color: Colors.red,\n                      textColor: Colors.white,\n                      onPressed: () async {\n                        await deleteTrip(context);\n                        Navigator.of(context).pushNamedAndRemoveUntil('/home', (Route<dynamic> route) => false);\n                      },\n                    )\n                  ],\n                )\n              ],\n            ),\n          ),\n        );\n      },\n    );\n  }\n\n  Future updateTrip(context) async {\n    var uid = await Provider.of(context).auth.getCurrentUID();\n    final doc = FirebaseFirestore.instance\n        .collection('userData')\n        .doc(uid)\n        .collection(\"trips\")\n        .doc(widget.trip.documentId);\n\n    return await doc.set(widget.trip.toJson());\n  }\n\n  Future deleteTrip(context) async {\n    var uid = await Provider.of(context).auth.getCurrentUID();\n    final doc = FirebaseFirestore.instance\n        .collection('userData')\n        .doc(uid)\n        .collection(\"trips\")\n        .doc(widget.trip.documentId);\n\n    return await doc.delete();\n  }\n}\n"
  },
  {
    "path": "lib/views/edit_notes_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:travel_budget/widgets/provider_widget.dart';\nimport 'package:travel_budget/widgets/rounded_button.dart';\n\nclass EditNotesView extends StatefulWidget {\n  final Trip trip;\n\n  EditNotesView({Key key, @required this.trip}) : super(key: key);\n\n  @override\n  _EditNotesViewState createState() => _EditNotesViewState();\n}\n\nclass _EditNotesViewState extends State<EditNotesView> {\n  TextEditingController _notesController = new TextEditingController();\n\n  final db = FirebaseFirestore.instance;\n\n  @override\n  void initState() {\n    super.initState();\n    _notesController.text = widget.trip.notes;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Container(\n        height: MediaQuery.of(context).size.height,\n        width: MediaQuery.of(context).size.width,\n        color: Colors.amberAccent,\n        child: Hero(\n          tag: \"TripNotes-${widget.trip.title}\",\n          transitionOnUserGestures: true,\n          child: SafeArea(\n            child: SingleChildScrollView(\n              child: Column(\n                children: <Widget>[\n                  buildHeading(context),\n                  buildNotesText(),\n                  buildSubmitButton(context),\n                ],\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  Widget buildHeading(context) {\n    return Material(\n      color: Colors.amberAccent,\n      child: Padding(\n        padding: const EdgeInsets.only(left: 20.0, top: 10.0),\n        child: Row(\n          children: <Widget>[\n            Expanded(\n              child: Text(\n                \"Trip Notes\",\n                style: TextStyle(fontSize: 24, color: Colors.black),\n              ),\n            ),\n            FlatButton(\n              child: Icon(Icons.close, color: Colors.black, size: 30),\n              onPressed: () {\n                Navigator.of(context).pop();\n              },\n            )\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildNotesText() {\n    return Material(\n      color: Colors.amberAccent,\n      child: Padding(\n        padding: const EdgeInsets.all(20.0),\n        child: TextField(\n          maxLines: null,\n          controller: _notesController,\n          decoration: InputDecoration(\n            border: InputBorder.none,\n          ),\n          cursorColor: Colors.black,\n          autofocus: true,\n          style: TextStyle(color: Colors.black),\n        ),\n      ),\n    );\n  }\n\n  Widget buildSubmitButton(context) {\n    return Material(\n      color: Colors.amberAccent,\n      child: RoundedButton(\n        child: Text(\"Save\", style: TextStyle(color: Colors.white)),\n        color: Colors.indigo,\n        onPressed: () async {\n          widget.trip.notes = _notesController.text;\n\n          final uid =  Provider.of(context).auth.getCurrentUID();\n\n          await db.collection(\"userData\")\n                  .doc(uid)\n                  .collection(\"trips\")\n                  .doc(widget.trip.documentId)\n                  .update({'notes': _notesController.text});\n\n          Navigator.of(context).pop();\n\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/first_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:travel_budget/widgets/custom_dialog.dart';\n\nclass FirstView extends StatelessWidget {\n  final primaryColor = const Color(0xFF75A2EA);\n\n  @override\n  Widget build(BuildContext context) {\n    final _width = MediaQuery.of(context).size.width;\n    final _height = MediaQuery.of(context).size.height;\n\n    return Scaffold(\n      body: Container(\n        width: _width,\n        height: _height,\n        color: primaryColor,\n        child: SafeArea(\n          child: Padding(\n            padding: const EdgeInsets.all(16.0),\n            child: Column(\n              children: <Widget>[\n                SizedBox(height: _height * 0.10),\n                Text(\n                  \"Welcome\",\n                  style: TextStyle(fontSize: 44, color: Colors.white),\n                ),\n                SizedBox(height: _height * 0.10),\n                AutoSizeText(\n                  \"Let’s start planning your next trip\",\n                  maxLines: 2,\n                  textAlign: TextAlign.center,\n                  style: TextStyle(\n                    fontSize: 40,\n                    color: Colors.white,\n                  ),\n                ),\n                SizedBox(height: _height * 0.15),\n                RaisedButton(\n                  color: Colors.white,\n                  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),\n                  child: Padding(\n                    padding: const EdgeInsets.only(top: 10.0, bottom: 10.0, left: 30.0, right: 30.0),\n                    child: Text(\n                      \"Get Started\",\n                      style: TextStyle(\n                        color: primaryColor,\n                        fontSize: 28,\n                        fontWeight: FontWeight.w300,\n                      ),\n                    ),\n                  ),\n                  onPressed: () {\n                    showDialog(\n                      context: context,\n                      builder: (BuildContext context) => CustomDialog(\n                        title: \"Would you like to create a free account?\",\n                        description:\n                            \"With an account, your data will be securely saved, allowing you to access it from multiple devices.\",\n                        primaryButtonText: \"Create My Account\",\n                        primaryButtonRoute: \"/signUp\",\n                        secondaryButtonText: \"Maybe Later\",\n                        secondaryButtonRoute: \"/anonymousSignIn\",\n                      ),\n                    );\n                  },\n                ),\n                SizedBox(height: _height * 0.05),\n                FlatButton(\n                  child: Text(\n                    \"Sign In\",\n                    style: TextStyle(color: Colors.white, fontSize: 25),\n                  ),\n                  onPressed: () {\n                    Navigator.of(context).pushReplacementNamed('/signIn');\n                  },\n                )\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/home_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:travel_budget/views/home_widgets/home_header.dart';\nimport 'package:travel_budget/views/home_widgets/percent_saved.dart';\nimport 'package:travel_budget/views/home_widgets/saved_vs_needed.dart';\nimport 'package:travel_budget/views/home_widgets/travel_type.dart';\nimport 'package:travel_budget/views/home_widgets/trip_details_card.dart';\n\nimport 'home_widgets/current_daily_budget.dart';\nimport 'home_widgets/days_until_trip.dart';\nimport 'home_widgets/notes.dart';\n\nclass HomeView extends StatefulWidget {\n  final Trip trip;\n\n  HomeView({\n    @required this.trip,\n  });\n\n  @override\n  _HomeViewState createState() => _HomeViewState();\n}\n\nclass _HomeViewState extends State<HomeView> {\n  @override\n  Widget build(BuildContext context) {\n    return SingleChildScrollView(\n      child: Column(\n        children: [\n          HomeHeader(widget.trip),\n          TripDetailsCard(widget.trip),\n          Padding(\n            padding: const EdgeInsets.only(left: 15.0, right: 15.0),\n            child: IntrinsicHeight(\n              child: Row(\n                children: [\n                  Expanded(\n                    flex: 12,\n                    child: DaysUntilTrip(widget.trip),\n                  ),\n                  Spacer(),\n                  Expanded(\n                    flex: 12,\n                    child: CurrentDailyBudget(widget.trip),\n                  )\n                ],\n              ),\n            ),\n          ),\n          Padding(\n            padding: const EdgeInsets.all(15.0),\n            child: SavedVsNeeded(widget.trip),\n          ),\n\n          Padding(\n            padding: const EdgeInsets.only(left: 15.0, right: 15.0),\n            child: IntrinsicHeight(\n              child: Row(\n                children: [\n                  Expanded(\n                    flex: 5,\n                    child: TravelType(widget.trip),\n                  ),\n                  Spacer(),\n                  Expanded(\n                    flex: 12,\n                    child: PercentSaved(widget.trip),\n                  )\n                ],\n              ),\n            ),\n          ),\n\n          Padding(\n            padding: const EdgeInsets.all(15.0),\n            child: Notes(trip: widget.trip),\n          ),\n\n          Container(height: 40)\n        ],\n      ),\n    );\n  }\n}\n\n"
  },
  {
    "path": "lib/views/home_widgets/current_daily_budget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\n\nclass CurrentDailyBudget extends StatelessWidget {\n  CurrentDailyBudget(this.trip);\n  final Trip trip;\n\n  @override\n  Widget build(BuildContext context) {\n    return Card(\n      child: Container(\n        decoration: BoxDecoration(\n          borderRadius: BorderRadius.circular(4.0),\n          gradient: LinearGradient(\n            colors: [Colors.blueAccent, Colors.blue],\n            begin: Alignment.topLeft,\n            end: Alignment.bottomRight,\n          ),\n        ),\n        child: Padding(\n          padding: const EdgeInsets.all(20.0),\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n            children: [\n              FittedBox(\n                fit: BoxFit.fitWidth,\n                child: Text(\"\\$${trip.getCurrentDailyBudget()}\", style: TextStyle(fontSize: 60, color: Colors.white)),\n              ),\n              FittedBox(\n                fit: BoxFit.fitWidth,\n                child: Text(\"current daily budget\", style: TextStyle(color: Colors.white)),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n\n"
  },
  {
    "path": "lib/views/home_widgets/days_until_trip.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\n\nclass DaysUntilTrip extends StatelessWidget {\n  DaysUntilTrip(this.trip);\n  final Trip trip;\n\n  @override\n  Widget build(BuildContext context) {\n    return Card(\n      child: Container(\n        decoration: BoxDecoration(\n          borderRadius: BorderRadius.circular(4.0),\n          gradient: LinearGradient(\n            colors: [Colors.lightBlue, Colors.blueAccent],\n            begin: Alignment.topLeft,\n            end: Alignment.bottomRight,\n          ),\n        ),\n        child: Padding(\n          padding: const EdgeInsets.all(20.0),\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n            children: [\n              FittedBox(\n                fit: BoxFit.fitWidth,\n                child: Text(\"${trip.getDaysUntilTrip()}\", style: TextStyle(fontSize: 60, color: Colors.white)),\n              ),\n              FittedBox(\n                fit: BoxFit.fitWidth,\n                child: Text(\"days until your trip\", style: TextStyle(color: Colors.white)),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/home_widgets/home_header.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\n\nclass HomeHeader extends StatelessWidget {\n  HomeHeader(this.trip);\n  final Trip trip;\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      width: MediaQuery.of(context).size.width,\n      height: MediaQuery.of(context).size.height * 0.25,\n      decoration: BoxDecoration(\n          gradient: LinearGradient(\n            colors: [Colors.deepPurple, Colors.blueAccent],\n            begin: Alignment.topCenter,\n            end: Alignment.bottomCenter,\n          )\n      ),\n\n      child: SafeArea(\n        child: Column(\n          mainAxisAlignment: MainAxisAlignment.center,\n          children: [\n            Padding(\n              padding: const EdgeInsets.all(8.0),\n              child: FittedBox(\n                fit: BoxFit.fitWidth,\n                child: Text(\"\\$${(trip.saved ?? 0.0).floor()}\", style: TextStyle(color: Colors.white, fontSize: 65)),\n              ),\n            ),\n            Text(\"Total Saved\", style: TextStyle(color: Colors.white)),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/home_widgets/notes.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:travel_budget/views/edit_notes_view.dart';\n\nclass Notes extends StatelessWidget {\n  final Trip trip;\n\n  Notes({@required this.trip});\n\n  @override\n  Widget build(BuildContext context) {\n    return Hero(\n      tag: \"TripNotes-${trip.title}\",\n      transitionOnUserGestures: true,\n      child: Card(\n        color: Colors.amberAccent,\n        child: InkWell(\n          child: Column(\n            children: <Widget>[\n              Padding(\n                padding: const EdgeInsets.only(left: 10.0, top: 8.0),\n                child: Row(\n                  children: <Widget>[\n                    Text(\"Notes\", style: TextStyle(fontSize: 24, color: Colors.black)),\n                  ],\n                ),\n              ),\n              Padding(\n                padding: const EdgeInsets.all(8.0),\n                child: Row(\n                  children: setNoteText(),\n                ),\n              )\n            ],\n          ),\n          onTap: () {\n            Navigator.push(\n              context,\n              MaterialPageRoute(builder: (context) => EditNotesView(trip: trip)),\n            );\n          },\n        ),\n      ),\n    );\n  }\n\n  List<Widget> setNoteText() {\n    if (trip.notes == null) {\n      return [\n        Padding(\n          padding: const EdgeInsets.only(right: 8.0),\n          child: Icon(Icons.add_circle_outline, color: Colors.grey),\n        ),\n        Text(\"Click To Add Notes\", style: TextStyle(color: Colors.black)),\n      ];\n    } else {\n      return [\n        Flexible(\n          child: Padding(\n            padding: const EdgeInsets.only(left: 8.0, right: 8.0),\n            child: Text(\n              trip.notes,\n              style: TextStyle(color: Colors.black),\n              overflow: TextOverflow.fade,\n              maxLines: 5,\n            ),\n          ),\n        )\n      ];\n    }\n  }\n}\n"
  },
  {
    "path": "lib/views/home_widgets/percent_saved.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/classes/progress_painter.dart';\nimport 'package:travel_budget/models/Trip.dart';\n\nclass PercentSaved extends StatelessWidget {\n  PercentSaved(this.trip);\n  final Trip trip;\n\n  @override\n  Widget build(BuildContext context) {\n    final totalBudget = trip.budget.floor() * trip.getTotalTripDays();\n    final saved = (trip.saved ?? 0).floor();\n    final percentComplete = (saved / totalBudget) * 100;\n\n    return Card(\n      child: Container(\n        decoration: BoxDecoration(\n          borderRadius: BorderRadius.circular(4.0),\n          gradient: LinearGradient(\n            colors: [Colors.indigoAccent, Colors.indigo],\n            begin: Alignment.topLeft,\n            end: Alignment.bottomRight,\n          ),\n        ),\n        child: Padding(\n          padding: const EdgeInsets.all(25.0),\n          child: Column(\n            children: [\n              Container(\n                height: 200,\n                width: 200,\n                decoration: BoxDecoration(\n                  shape: BoxShape.circle,\n                ),\n                child: Padding(\n                  padding: const EdgeInsets.all(20.0),\n                  child: Stack(\n                    children: [\n                      Center(\n                          child: Text(\"${percentComplete.toStringAsFixed(0)}%\",\n                              style: TextStyle(color: Colors.white, fontSize: 30))),\n                      CustomPaint(\n                        child: Center(),\n                        painter: ProgressPainter(\n                          circleWidth: 40,\n                          completedPercentage: percentComplete,\n                          defaultCircleColor: Colors.white30,\n                          percentageCompletedCircleColor: Colors.greenAccent,\n                        ),\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n              Container(\n                child: Padding(\n                  padding: const EdgeInsets.only(top: 15.0),\n                  child: Text(\"percent saved\", style: TextStyle(color: Colors.white)),\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/home_widgets/saved_vs_needed.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\n\nclass SavedVsNeeded extends StatelessWidget {\n  SavedVsNeeded(this.trip);\n  final Trip trip;\n\n  @override\n  Widget build(BuildContext context) {\n    final saved = (trip.saved ?? 0.0).floor();\n    final totalBudget = trip.budget.floor() * trip.getTotalTripDays();\n    final needed = (totalBudget - saved).floor();\n\n    return Card(\n      child: Container (\n        height: MediaQuery.of(context).size.height * 0.30,\n        decoration: BoxDecoration(\n          borderRadius: BorderRadius.circular(4.0),\n          gradient: LinearGradient(\n            colors: [Colors.blueAccent, Colors.indigo],\n            begin: Alignment.topLeft,\n            end: Alignment.bottomRight,\n          ),\n        ),\n\n        child: Row(\n          crossAxisAlignment: CrossAxisAlignment.end,\n          mainAxisAlignment: MainAxisAlignment.spaceAround,\n          children: [\n            Column(\n              children: [\n                Padding(\n                  padding: const EdgeInsets.only(top: 15.0, bottom: 15.0),\n                  child: Text(\"saved\", style: TextStyle(color: Colors.white)),\n                ),\n                Expanded(\n                  child: Container(\n                    alignment: Alignment.bottomCenter,\n                    child: FractionallySizedBox(\n                      heightFactor: (saved > totalBudget) ? 1 : (saved/totalBudget),\n                      child: Container(\n                        width: 50,\n                        color: Colors.white,\n                      ),\n                    ),\n                  ),\n                ),\n                Padding(\n                  padding: const EdgeInsets.only(top: 15.0, bottom: 15.0),\n                  child: Text(\"\\$$saved\", style: TextStyle(color: Colors.white)),\n                ),\n              ],\n            ),\n            Column(\n              children: [\n                Padding(\n                  padding: const EdgeInsets.only(top: 15.0, bottom: 15.0),\n                  child: Text(\"needed\", style: TextStyle(color: Colors.white)),\n                ),\n                Expanded(\n                  child: Container(\n                    alignment: Alignment.bottomCenter,\n                    child: FractionallySizedBox(\n                      heightFactor: (needed <= 0) ? 0 : (needed/totalBudget),\n                      child: Container(\n                        width: 50,\n                        color: Colors.white,\n                      ),\n                    ),\n                  ),\n                ),\n                Padding(\n                  padding: const EdgeInsets.only(top: 15.0, bottom: 15.0),\n                  child: Text(\"\\$${(needed <= 0) ? 0 : needed}\", style: TextStyle(color: Colors.white)),\n                ),\n              ],\n            )\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/home_widgets/travel_type.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\n\nclass TravelType extends StatelessWidget {\n  TravelType(this.trip);\n  final Trip trip;\n\n  Widget getTypeIcon() {\n    if (trip.types().containsKey(trip.travelType)) {\n      return trip.types(color: Colors.white)[trip.travelType];\n    } else {\n      return Icon(Icons.directions, size: 40, color: Colors.white);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Card(\n      child: Container(\n        decoration: BoxDecoration(\n          borderRadius: BorderRadius.circular(4.0),\n          gradient: LinearGradient(\n            colors: [Colors.lightBlue, Colors.blueAccent],\n            begin: Alignment.topLeft,\n            end: Alignment.bottomRight,\n          ),\n        ),\n        child: Padding(\n          padding: const EdgeInsets.all(20.0),\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n            children: [\n              FittedBox(\n                fit: BoxFit.fitWidth,\n                child: Padding(\n                  padding: const EdgeInsets.only(top: 6.0),\n                  child: Text(\n                    \"transport\",\n                    style: TextStyle(color: Colors.white),\n                  ),\n                ),\n              ),\n              Expanded(\n                child: getTypeIcon(),\n              ),\n              Text(trip.travelType, style: TextStyle(color: Colors.white)),\n            ],\n          ),\n        ),\n      ),\n\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/home_widgets/trip_details_card.dart",
    "content": "import 'package:auto_size_text/auto_size_text.dart';\nimport 'package:flutter/material.dart';\nimport 'package:intl/intl.dart';\nimport 'package:travel_budget/models/Trip.dart';\n\nclass TripDetailsCard extends StatelessWidget {\n  TripDetailsCard(this.trip);\n  final Trip trip;\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      child: Stack(\n        overflow: Overflow.visible,\n        alignment: Alignment.bottomCenter,\n        children: [\n          Container(\n            child: Column(\n              children: [\n                SizedBox(\n                  width: double.infinity,\n                  height: 250,\n                  child: trip.getLocationImage(),\n                ),\n                SizedBox(\n                  height: 50,\n                  width: double.infinity,\n                )\n              ],\n            ),\n          ),\n          Positioned(\n            top: 150,\n            left: 15,\n            right: 15,\n            child: Card(\n              child: Padding(\n                padding: const EdgeInsets.all(16.0),\n                child: Column(\n                  children: [\n                    Row(\n                      children: [\n                        Expanded(\n                          child: Container(\n                            height: 40,\n                            child: AutoSizeText(\n                              trip.title,\n                              style: TextStyle(fontSize: 30.0),\n                              maxLines: 2,\n                            ),\n                          ),\n                        )\n                      ],\n                    ),\n                    Row(\n                      children: [\n                        Padding(\n                          padding: const EdgeInsets.only(bottom: 8.0),\n                          child: Text(\n                              \"${DateFormat('MMM dd, yyyy').format(trip.startDate).toString()} - ${DateFormat('MMM dd, yyyy').format(trip.endDate).toString()}\"),\n                        ),\n                      ],\n                    ),\n                    Row(\n                      children: [\n                        Text(\"\\$${(trip.budget.floor() * trip.getTotalTripDays()).toString()}\",\n                            style: TextStyle(fontSize: 25.0, fontWeight: FontWeight.bold)),\n                        Padding(\n                          padding: const EdgeInsets.only(top: 8.0, left: 4.0),\n                          child: Text(\"total budget\"),\n                        ),\n                      ],\n                    )\n                  ],\n                ),\n              ),\n            ),\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/navigation_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/services/firebase_service.dart';\nimport 'package:travel_budget/views/home_view.dart';\nimport 'deposit_view.dart';\nimport 'profile_view.dart';\nimport 'package:travel_budget/models/Trip.dart';\n\nclass NavigationView extends StatefulWidget {\n  @override\n  State<StatefulWidget> createState() {\n    return _NavigationViewState();\n  }\n}\n\nclass _NavigationViewState extends State<NavigationView> {\n  Future _nextTrip;\n  Trip _trip;\n  int _currentIndex = 0;\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    _nextTrip = FirebaseService.getNextTrip(context);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return FutureBuilder(\n      future: _nextTrip,\n      builder: (context, snapshot) {\n        if (snapshot.connectionState == ConnectionState.done) {\n          if(snapshot.hasData) {\n            _trip = snapshot.data;\n            return _buildView();\n          } else {\n            // TODO update when user has no trips\n            return Container(\n              color: Colors.white,\n              child: Center(\n                child: CircularProgressIndicator(),\n              ),\n            );\n          }\n        } else {\n          return Container(\n            color: Colors.white,\n            child: Center(\n              child: CircularProgressIndicator(),\n            ),\n          );\n        }\n      },\n    );\n  }\n\n  _buildView() {\n    final List<Widget> _children = [\n      HomeView(trip: _trip),\n      DepositView(trip: _trip),\n      ProfileView(),\n    ];\n\n    return Scaffold(\n      body: _children[_currentIndex],\n      floatingActionButton: FloatingActionButton(\n        onPressed: () {\n          onTabTapped(1);\n        },\n        tooltip: \"Add Savings\",\n        child: Icon(Icons.attach_money, color: Colors.indigo),\n        elevation: 4.0,\n        backgroundColor: Colors.white,\n      ),\n      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,\n      bottomNavigationBar: BottomNavigationBar(\n          onTap: onTabTapped,\n          currentIndex: _currentIndex,\n          items: [\n            BottomNavigationBarItem(\n              icon: new Icon(Icons.home),\n              title: new Text(\"Home\"),\n            ),\n            BottomNavigationBarItem(\n              icon: new Icon(Icons.attach_money),\n              title: new Text(\"Save\"),\n            ),\n            BottomNavigationBarItem(\n              icon: new Icon(Icons.account_circle),\n              title: new Text(\"Profile\"),\n            ),\n          ]\n      ),\n    );\n  }\n\n  void onTabTapped(int index) {\n    setState(() {\n      _currentIndex = index;\n    });\n  }\n\n}\n"
  },
  {
    "path": "lib/views/new_trips/budget_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:travel_budget/widgets/divider_with_text_widget.dart';\nimport 'package:travel_budget/widgets/money_text_field.dart';\nimport 'summary_view.dart';\n\nenum budgetType { simple, complex }\n\nclass NewTripBudgetView extends StatefulWidget {\n  final Trip trip;\n\n  NewTripBudgetView({Key key, @required this.trip}) : super(key: key);\n\n  @override\n  _NewTripBudgetViewState createState() => _NewTripBudgetViewState();\n}\n\nclass _NewTripBudgetViewState extends State<NewTripBudgetView> {\n  var _budgetState = budgetType.simple;\n  var _switchButtonText = \"Build Budget\";\n  var _budgetTotal = 0;\n\n  TextEditingController _budgetController = new TextEditingController();\n  TextEditingController _transportationController = new TextEditingController();\n  TextEditingController _foodController = new TextEditingController();\n  TextEditingController _lodgingController = new TextEditingController();\n  TextEditingController _entertainmentController = new TextEditingController();\n\n  @override\n  void initState() {\n    super.initState();\n    _budgetController.addListener(_setBudgetTotal);\n    _transportationController.addListener(_setTotalBudget);\n    _foodController.addListener(_setTotalBudget);\n    _lodgingController.addListener(_setTotalBudget);\n    _entertainmentController.addListener(_setTotalBudget);\n  }\n\n\n  _setTotalBudget() {\n    var total = 0;\n    total = (_transportationController.text == \"\") ? 0 : int.parse(_transportationController.text);\n    total += (_foodController.text == \"\") ? 0 : int.parse(_foodController.text);\n    total += (_lodgingController.text== \"\") ? 0 : int.parse(_lodgingController.text);\n    total += (_entertainmentController.text == \"\") ? 0 : int.parse(_entertainmentController.text);\n    setState(() {\n      _budgetTotal = total;\n    });\n  }\n\n  _setBudgetTotal() {\n    setState(() {\n      _budgetTotal = (_budgetController.text == \"\") ? 0 : int.parse(_budgetController.text);\n    });\n  }\n\n\n  List<Widget> setBudgetFields(_budgetController) {\n    List<Widget> fields = [];\n\n    if (_budgetState == budgetType.simple) {\n      _switchButtonText = \"Build Budget\";\n      fields.add(Padding(\n        padding: const EdgeInsets.all(12.0),\n        child: Text(\"Enter a Trip Budget\"),\n      ));\n      fields.add(MoneyTextField(controller: _budgetController, helperText: \"Daily estimated budget\"));\n    } else {\n      // assumes complex budget\n      _switchButtonText = \"Simple Budget\";\n      fields.add(Padding(\n        padding: const EdgeInsets.all(12.0),\n        child: Text(\"Enter How much you want to spend in each area\"),\n      ));\n      fields.add(MoneyTextField(controller: _transportationController, helperText: \"Daily Estimated Transportation Budget\"));\n      fields.add(MoneyTextField(controller: _foodController, helperText: \"Daily Estimated Food Budget\"));\n      fields.add(MoneyTextField(controller: _lodgingController, helperText: \"Daily Estimated Lodging Budget\"));\n      fields.add(MoneyTextField(controller: _entertainmentController, helperText: \"Daily Estimated Entertainment Budget\"));\n      fields.add(Text(\"Total: \\$$_budgetTotal\"));\n    }\n\n    fields.add(FlatButton(\n      child: Text(\n        \"Continue\",\n        style: TextStyle(fontSize: 25, color: Colors.blue),\n      ),\n      onPressed: () async {\n        widget.trip.budget = _budgetTotal.toDouble();\n        widget.trip.budgetTypes = {\n          'transportation': (_transportationController.text == \"\") ? 0.0 : double.parse(_transportationController.text),\n          'food': (_foodController.text == \"\") ? 0.0 : double.parse(_foodController.text),\n          'lodging': (_lodgingController.text== \"\") ? 0.0 : double.parse(_lodgingController.text),\n          'entertainment': (_entertainmentController.text == \"\") ? 0.0 : double.parse(_entertainmentController.text),\n        };\n\n        Navigator.push(\n          context,\n          MaterialPageRoute(\n              builder: (context) => NewTripSummaryView(trip: widget.trip)),\n        );\n      },\n    ));\n    fields.add(DividerWithText(dividerText: \"or\"));\n    fields.add(FlatButton(\n      child: Text(\n        _switchButtonText,\n        style: TextStyle(fontSize: 25, color: Colors.blue),\n      ),\n      onPressed: () {\n        setState(() {\n          _budgetState = (_budgetState == budgetType.simple)\n              ? budgetType.complex\n              : budgetType.simple;\n        });\n      },\n    ));\n\n    return fields;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    _budgetController.text = (_budgetController.text == \"\") ? \"\" : _budgetTotal.toString();\n    _budgetController.selection = TextSelection.collapsed(offset: _budgetController.text.length);\n\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Create Trip - Budget'),\n      ),\n      body: SingleChildScrollView(\n        child: Center(\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: setBudgetFields(_budgetController),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/new_trips/date_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:date_range_picker/date_range_picker.dart' as DateRagePicker;\nimport 'package:intl/intl.dart';\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'dart:async';\nimport 'budget_view.dart';\n\nclass NewTripDateView extends StatefulWidget {\n  final Trip trip;\n\n  NewTripDateView({Key key, @required this.trip}) : super(key: key);\n\n  @override\n  _NewTripDateViewState createState() => _NewTripDateViewState();\n}\n\nclass _NewTripDateViewState extends State<NewTripDateView> {\n  DateTime _startDate = DateTime.now();\n  DateTime _endDate = DateTime.now().add(Duration(days: 7));\n\n  Future displayDateRangePicker(BuildContext context) async {\n    final List<DateTime> picked = await DateRagePicker.showDatePicker(\n        context: context,\n        initialFirstDate: _startDate,\n        initialLastDate: _endDate,\n        firstDate: new DateTime(DateTime.now().year - 50),\n        lastDate: new DateTime(DateTime.now().year + 50));\n    if (picked != null && picked.length == 2) {\n      setState(() {\n        _startDate = picked[0];\n        _endDate = picked[1];\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Center(\n        child: CustomScrollView(\n          slivers: <Widget>[\n            SliverAppBar(\n              title: Text(''),\n              backgroundColor: Colors.green,\n              expandedHeight: 350.0,\n              flexibleSpace: FlexibleSpaceBar(\n                background: widget.trip.getLocationImage(),\n              ),\n            ),\n            SliverFixedExtentList(\n              itemExtent: 200.00,\n              delegate: SliverChildListDelegate([\n                buildSelectedDetails(context, widget.trip),\n                buildButtons(),\n              ]),\n            )\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildButtons() {\n    return Column(\n      mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n      children: <Widget>[\n        SizedBox(\n          width: MediaQuery.of(context).size.width * 0.60,\n          child: RaisedButton(\n            child: Text(\"Change Date Range\"),\n            color: Colors.deepPurpleAccent,\n            textColor: Colors.white,\n            onPressed: () async {\n              await displayDateRangePicker(context);\n            },\n          ),\n        ),\n        SizedBox(\n          width: MediaQuery.of(context).size.width * 0.60,\n          child: RaisedButton(\n            child: Text('Continue'),\n            color: Colors.amberAccent,\n            onPressed: () {\n              widget.trip.startDate = _startDate;\n              widget.trip.endDate = _endDate;\n              Navigator.push(\n                context,\n                MaterialPageRoute(\n                  builder: (context) => NewTripBudgetView(\n                    trip: widget.trip,\n                  ),\n                ),\n              );\n            },\n          ),\n        ),\n      ],\n    );\n  }\n\n  Widget buildingSelectedDates() {\n    return Padding(\n      padding: const EdgeInsets.only(top: 15.0),\n      child: Container(\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n          children: <Widget>[\n            Column(\n              mainAxisAlignment: MainAxisAlignment.center,\n              crossAxisAlignment: CrossAxisAlignment.center,\n              children: [\n                Text(\"Start Date\"),\n                Padding(\n                  padding: const EdgeInsets.only(top: 8.0),\n                  child: Text(\n                    \"${DateFormat('MM-dd').format(_startDate).toString()}\",\n                    style: TextStyle(fontSize: 35, color: Colors.deepPurple),\n                  ),\n                ),\n                Text(\n                  \"${DateFormat('yyyy').format(_startDate).toString()}\",\n                  style: TextStyle(color: Colors.deepPurple),\n                ),\n              ],\n            ),\n            Container(\n                child: Icon(\n                  Icons.arrow_forward,\n                  color: Colors.deepOrange,\n                  size: 45,\n                )),\n            Column(\n              mainAxisAlignment: MainAxisAlignment.center,\n              crossAxisAlignment: CrossAxisAlignment.center,\n              children: [\n                Text(\"End Date\"),\n                Padding(\n                  padding: const EdgeInsets.only(top: 8.0),\n                  child: Text(\n                    \"${DateFormat('MM-dd').format(_endDate).toString()}\",\n                    style: TextStyle(fontSize: 35, color: Colors.deepPurple),\n                  ),\n                ),\n                Text(\n                  \"${DateFormat('yyyy').format(_endDate).toString()}\",\n                  style: TextStyle(color: Colors.deepPurple),\n                ),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildSelectedDetails(BuildContext context, Trip trip) {\n    return Hero(\n      tag: \"SelectedTrip-${trip.title}\",\n      transitionOnUserGestures: true,\n      child: Container(\n        child: Padding(\n          padding: const EdgeInsets.only(\n            left: 8.0,\n            right: 8.0,\n          ),\n          child: SingleChildScrollView(\n            child: Card(\n              child: Row(\n                children: <Widget>[\n                  Expanded(\n                    child: Padding(\n                      padding: const EdgeInsets.only(\n                          top: 16.0, left: 16.0, bottom: 16.0),\n                      child: Column(\n                        children: <Widget>[\n                          Row(\n                            children: <Widget>[\n                              Flexible(\n                                child: AutoSizeText(trip.title, \n                                    maxLines: 3,\n                                    style: TextStyle(fontSize: 25.0)),\n                              ),\n                            ],\n                          ),\n                          buildingSelectedDates(),\n                        ],\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/new_trips/location_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:travel_budget/models/Place.dart';\nimport 'package:travel_budget/widgets/divider_with_text_widget.dart';\nimport 'date_view.dart';\nimport 'package:travel_budget/credentials.dart';\nimport 'package:dio/dio.dart';\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'dart:async';\nimport 'package:uuid/uuid.dart';\n\n\nclass NewTripLocationView extends StatefulWidget {\n  final Trip trip;\n\n  NewTripLocationView({Key key, @required this.trip}) : super(key: key);\n\n  @override\n  _NewTripLocationViewState createState() => _NewTripLocationViewState();\n}\n\nclass _NewTripLocationViewState extends State<NewTripLocationView> {\n  TextEditingController _searchController = new TextEditingController();\n//  Timer _throttle;\n  var uuid = new Uuid();\n  String _sessionToken;\n\n  String _heading;\n  List<Place> _placesList;\n  final List<Place> _suggestedList = [\n//    Place(\"New York\", 320.00),\n//    Place(\"Austin\", 250.00),\n//    Place(\"Boston\", 290.00),\n//    Place(\"Florence\", 300.00),\n//    Place(\"Washington D.C.\", 190.00),\n  ];\n\n  @override\n  void initState() {\n    super.initState();\n    _heading = \"Suggestions\";\n    _placesList = _suggestedList;\n    _searchController.addListener(_onSearchChanged);\n  }\n\n  @override\n  void dispose() {\n    _searchController.removeListener(_onSearchChanged);\n    _searchController.dispose();\n    super.dispose();\n  }\n\n  _onSearchChanged() {\n    if(_sessionToken == null) {\n      setState(() {\n        _sessionToken = uuid.v4();\n      });\n    }\n    getLocationResults(_searchController.text);\n  }\n\n  void getLocationResults(String input) async {\n    if (input.isEmpty) {\n      setState(() {\n        _heading = \"Suggestions\";\n      });\n      return;\n    }\n\n    String baseURL = 'https://maps.googleapis.com/maps/api/place/autocomplete/json';\n    String type = '(regions)';\n    String request = '$baseURL?input=$input&key=$PLACES_API_KEY&type=$type&sessiontoken=$_sessionToken';\n    Response response = await Dio().get(request);\n\n    final predictions = response.data['predictions'];\n\n    List<Place> _displayResults = [];\n\n    for (var i=0; i < predictions.length; i++) {\n      String name = predictions[i]['description'];\n      String placeId = predictions[i]['place_id'];\n\n      // TODO figure out the budget\n      double averageBudget = 200.0;\n      _displayResults.add(Place(name, averageBudget, placeId));\n    }\n\n    setState(() {\n      _heading = \"Results\";\n      _placesList = _displayResults;\n    });\n  }\n\n  Future<String> getLocationPhotoRef(placeId) async {\n    String placeImgRequest = 'https://maps.googleapis.com/maps/api/place/details/json?place_id=$placeId&fields=photo,geometry&key=$PLACES_API_KEY&sessiontoken=$_sessionToken';\n    Response placeDetails = await Dio().get(placeImgRequest);\n    return placeDetails.data[\"result\"][\"photos\"][0][\"photo_reference\"];\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Create Trip - Location'),\n      ),\n      body: Center(\n        child: Column(\n          children: <Widget>[\n            Padding(\n              padding: const EdgeInsets.all(30.0),\n              child: TextField(\n                controller: _searchController,\n                decoration: InputDecoration(\n                  prefixIcon: Icon(Icons.search),\n                ),\n              ),\n            ),\n            Padding(\n              padding: const EdgeInsets.only(left: 10.0, right: 10.0),\n              child: new DividerWithText(\n                dividerText: _heading,\n              ),\n            ),\n            Expanded(\n              child: ListView.builder(\n                itemCount: _placesList.length,\n                itemBuilder: (BuildContext context, int index) =>\n                    buildPlaceCard(context, index),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget buildPlaceCard(BuildContext context, int index) {\n    return Hero(\n      tag: \"SelectedTrip-${_placesList[index].name}\",\n      transitionOnUserGestures: true,\n      child: Container(\n        child: Padding(\n          padding: const EdgeInsets.only(\n            left: 8.0,\n            right: 8.0,\n          ),\n          child: Card(\n            child: InkWell(\n              child: Row(\n                children: <Widget>[\n                  Expanded(\n                    child: Padding(\n                      padding: const EdgeInsets.all(16.0),\n                      child: Column(\n                        children: <Widget>[\n                          Row(\n                            children: <Widget>[\n                              Flexible(\n                                child: AutoSizeText(_placesList[index].name,\n                                    maxLines: 3,\n                                    style: TextStyle(fontSize: 25.0)),\n                              ),\n                            ],\n                          ),\n                          Row(\n                            children: <Widget>[\n                              Text(\n                                  \"Average Budget \\$${_placesList[index].averageBudget.toStringAsFixed(2)}\"),\n                            ],\n                          ),\n                        ],\n                      ),\n                    ),\n                  ),\n\n                ],\n              ),\n              onTap: () async {\n                String photoReference = await getLocationPhotoRef(_placesList[index].placeId);\n                widget.trip.title = _placesList[index].name;\n                widget.trip.photoReference = photoReference;\n                setState(() {\n                  _sessionToken = null;\n                });\n                // TODO maybe pass the trip average budget through here too...\n                // that would need to be added to the Trip object\n                Navigator.push(\n                  context,\n                  MaterialPageRoute(\n                      builder: (context) => NewTripDateView(trip: widget.trip)),\n                );\n              },\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/new_trips/summary_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:travel_budget/widgets/provider_widget.dart';\nimport 'package:intl/intl.dart';\nimport 'package:travel_budget/services/admob_service.dart';\nimport 'package:firebase_admob/firebase_admob.dart';\n\n\nclass NewTripSummaryView extends StatelessWidget {\n  final db = FirebaseFirestore.instance;\n  final Trip trip;\n  final ams = AdMobService();\n\n  NewTripSummaryView({Key key, @required this.trip}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    InterstitialAd newTripAd = ams.getNewTripInterstitial();\n    newTripAd.load();\n    final tripTypes = trip.types();\n    var tripKeys = tripTypes.keys.toList();\n    return Scaffold(\n        appBar: AppBar(\n          title: Text('Trip Summary'),\n        ),\n        body: Center(\n            child: Column(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: <Widget>[\n                Padding(\n                  padding: const EdgeInsets.all(12.0),\n                  child: Text(\"Submit\", style: TextStyle(fontSize: 20, color: Colors.green),),\n                ),\n                Text(\"${trip.title}\"),\n                Text(\"${DateFormat('dd/MM/yyyy').format(trip.startDate).toString()} - ${DateFormat('dd/MM/yyyy').format(trip.endDate).toString()}\"),\n                Text(\"\\$${trip.budget.toStringAsFixed(2)}\"),\n\n                Expanded(\n                  child: GridView.count(\n                    crossAxisCount: 3,\n                    scrollDirection: Axis.vertical,\n                    primary: false,\n                    children: List.generate(tripTypes.length, (index) {\n                      return FlatButton(\n                        child: Column(\n                          mainAxisAlignment: MainAxisAlignment.center,\n                          children: <Widget>[\n                            tripTypes[tripKeys[index]],\n                            Text(tripKeys[index]),\n                          ],\n                        ),\n                        onPressed: () async {\n                          trip.travelType = tripKeys[index];\n                          final uid = await Provider.of(context).auth.getCurrentUID();\n                          await db.collection(\"userData\").doc(uid).collection(\"trips\").add(trip.toJson());\n                          newTripAd.show(\n                            anchorType: AnchorType.bottom,\n                            anchorOffset: 0.0,\n                            horizontalCenterOffset: 0.0,\n                          );\n                          Navigator.of(context).popUntil((route) => route.isFirst);\n                        },\n                      );\n                    }),\n                  ),\n                ),\n              ],\n            )\n        )\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/past_trips_view.dart",
    "content": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:flutter/material.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:travel_budget/widgets/provider_widget.dart';\nimport 'package:travel_budget/widgets/trip_card.dart';\n\n\nclass PastTripsView extends StatefulWidget {\n  @override\n  _PastTripsViewState createState() => _PastTripsViewState();\n}\n\nclass _PastTripsViewState extends State<PastTripsView> {\n  TextEditingController _searchController = TextEditingController();\n\n  Future resultsLoaded;\n  List _allResults = [];\n  List _resultsList = [];\n\n  @override\n  void initState() {\n    super.initState();\n    _searchController.addListener(_onSearchChanged);\n  }\n\n  @override\n  void dispose() {\n    _searchController.removeListener(_onSearchChanged);\n    _searchController.dispose();\n    super.dispose();\n  }\n\n  @override\n  void didChangeDependencies() {\n    super.didChangeDependencies();\n    resultsLoaded = getUsersPastTripsStreamSnapshots();\n  }\n\n\n  _onSearchChanged() {\n    searchResultsList();\n  }\n\n  searchResultsList() {\n    var showResults = [];\n\n    if(_searchController.text != \"\") {\n      for(var tripSnapshot in _allResults){\n        var title = Trip.fromSnapshot(tripSnapshot).title.toLowerCase();\n\n        if(title.contains(_searchController.text.toLowerCase())) {\n          showResults.add(tripSnapshot);\n        }\n      }\n\n    } else {\n      showResults = List.from(_allResults);\n    }\n    setState(() {\n      _resultsList = showResults;\n    });\n  }\n\n  getUsersPastTripsStreamSnapshots() async {\n    final uid = await Provider.of(context).auth.getCurrentUID();\n    var data = await FirebaseFirestore.instance\n        .collection('userData')\n        .doc(uid)\n        .collection('trips')\n        .where(\"endDate\", isLessThanOrEqualTo: DateTime.now())\n        .orderBy('endDate')\n        .get();\n    setState(() {\n      _allResults = data.docs;\n    });\n    searchResultsList();\n    return \"complete\";\n  }\n\n  Widget build(BuildContext context) {\n    return Container(\n      child: Column(\n        children: <Widget>[\n          Text(\"Past Trips\", style: TextStyle(fontSize: 20)),\n          Padding(\n            padding: const EdgeInsets.only(left: 30.0, right: 30.0, bottom: 30.0),\n            child: TextField(\n              controller: _searchController,\n              decoration: InputDecoration(\n                prefixIcon: Icon(Icons.search)\n              ),\n            ),\n          ),\n          Expanded(\n            child: ListView.builder(\n                itemCount: _resultsList.length,\n                itemBuilder: (BuildContext context, int index) =>\n                    buildTripCard(context, _resultsList[index]),\n            )\n\n          ),\n        ],\n      ),\n    );\n  }\n}"
  },
  {
    "path": "lib/views/profile_view.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/widgets/provider_widget.dart';\nimport 'package:intl/intl.dart';\nimport 'package:travel_budget/models/User.dart';\n\nclass ProfileView extends StatefulWidget {\n  @override\n  _ProfileViewState createState() => _ProfileViewState();\n}\n\nclass _ProfileViewState extends State<ProfileView> {\n  User user = User(\"\");\n  bool _isAdmin = false;\n  TextEditingController _userCountryController = TextEditingController();\n\n  @override\n  Widget build(BuildContext context) {\n    return SingleChildScrollView(\n      child: Container(\n        width: MediaQuery.of(context).size.width,\n        child: Column(\n          children: <Widget>[\n            FutureBuilder(\n              future: Provider.of(context).auth.getCurrentUser(),\n              builder: (context, snapshot) {\n                if (snapshot.connectionState == ConnectionState.done) {\n                  return displayUserInformation(context, snapshot);\n                } else {\n                  return CircularProgressIndicator();\n                }\n              },\n            )\n          ],\n        ),\n      ),\n    );\n  }\n\n  Widget displayUserInformation(context, snapshot) {\n    final authData = snapshot.data;\n\n    return Column(\n      children: <Widget>[\n        Padding(\n          padding: const EdgeInsets.only(top: 10.0),\n          child: Provider.of(context).auth.getProfileImage(),\n        ),\n        Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Text(\n            \"Name: ${authData.displayName ?? 'Anonymous'}\",\n            style: TextStyle(fontSize: 20),\n          ),\n        ),\n        Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Text(\n            \"Email: ${authData.email ?? 'Anonymous'}\",\n            style: TextStyle(fontSize: 20),\n          ),\n        ),\n        Padding(\n          padding: const EdgeInsets.all(8.0),\n          child: Text(\n            \"Created: ${DateFormat('MM/dd/yyyy').format(authData.metadata.creationTime)}\",\n            style: TextStyle(fontSize: 20),\n          ),\n        ),\n        FutureBuilder(\n          future: _getProfileData(),\n          builder: (context, snapshot) {\n            if (snapshot.connectionState == ConnectionState.done) {\n              _userCountryController.text = user.homeCountry;\n              _isAdmin = user.admin ?? false;\n            }\n            return Container(\n              child: Column(\n                children: <Widget>[\n                  Padding(\n                    padding: const EdgeInsets.all(8.0),\n                    child: Text(\n                      \"Home Country: ${_userCountryController.text}\",\n                      style: TextStyle(fontSize: 20),\n                    ),\n                  ),\n                  adminFeature(),\n                ],\n              ),\n            );\n          }\n        ),\n        showSignOut(context, authData.isAnonymous),\n        RaisedButton(\n          child: Text(\"Edit User\"),\n          onPressed: () {\n            _userEditBottomSheet(context);\n          },\n        )\n      ],\n    );\n  }\n\n  _getProfileData() async {\n    final uid = await Provider.of(context).auth.getCurrentUID();\n    await Provider.of(context)\n        .db\n        .collection('userData')\n        .document(uid)\n        .get().then((result) {\n          user.homeCountry = result.data['homeCountry'];\n          user.admin = result.data['admin'];\n    });\n  }\n\n  Widget showSignOut(context, bool isAnonymous) {\n    if (isAnonymous == true) {\n      return RaisedButton(\n        child: Text(\"Sign In To Save Your Data\"),\n        onPressed: () {\n          Navigator.of(context).pushNamed('/convertUser');\n        },\n      );\n    } else {\n      return RaisedButton(\n        child: Text(\"Sign Out\"),\n        onPressed: () {\n          try {\n            Provider.of(context).auth.signOut();\n          } catch (e) {\n            print(e);\n          }\n        },\n      );\n    }\n  }\n\n  Widget adminFeature() {\n    if(_isAdmin == true) {\n      return Text(\"You are an admin\");\n    } else {\n      return Container();\n    }\n  }\n\n  void _userEditBottomSheet(BuildContext context) {\n    showModalBottomSheet(\n      context: context,\n      builder: (BuildContext bc) {\n        return Container(\n          height: MediaQuery.of(context).size.height * .60,\n          child: Padding(\n            padding: const EdgeInsets.only(left: 15.0, top: 15.0),\n            child: Column(\n              children: <Widget>[\n                Row(\n                  children: <Widget>[\n                    Text(\"Update Profile\"),\n                    Spacer(),\n                    IconButton(\n                      icon: Icon(Icons.cancel),\n                      color: Colors.orange,\n                      iconSize: 25,\n                      onPressed: () {\n                        Navigator.of(context).pop();\n                      },\n                    ),\n                  ],\n                ),\n                Row(\n                  children: [\n                    Expanded(\n                      child: Padding(\n                        padding: const EdgeInsets.only(right: 15.0),\n                        child: TextField(\n                          controller: _userCountryController,\n                          decoration: InputDecoration(\n                            helperText: \"Home Country\",\n                          ),\n                        ),\n                      ),\n                    )\n                  ],\n                ),\n                Row(\n                  mainAxisAlignment: MainAxisAlignment.center,\n                  children: <Widget>[\n                    RaisedButton(\n                      child: Text('Save'),\n                      color: Colors.green,\n                      textColor: Colors.white,\n                      onPressed: () async {\n                        user.homeCountry = _userCountryController.text;\n                        setState(() {\n                          _userCountryController.text = user.homeCountry;\n                        });\n                        final uid =\n                            await Provider.of(context).auth.getCurrentUID();\n                        await Provider.of(context)\n                            .db\n                            .collection('userData')\n                            .document(uid)\n                            .setData(user.toJson());\n                        Navigator.of(context).pop();\n                      },\n                    )\n                  ],\n                ),\n              ],\n            ),\n          ),\n        );\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/views/sign_up_view.dart",
    "content": "import 'package:apple_sign_in/apple_sign_in.dart';\nimport 'package:flutter/material.dart';\nimport 'package:travel_budget/services/auth_service.dart';\nimport 'package:auto_size_text/auto_size_text.dart';\nimport 'package:travel_budget/widgets/provider_widget.dart';\nimport 'package:flutter_spinkit/flutter_spinkit.dart';\nimport 'package:flutter_auth_buttons/flutter_auth_buttons.dart';\nimport 'package:international_phone_input/international_phone_input.dart';\n\n// TODO move this to tone location\nfinal primaryColor = const Color(0xFF75A2EA);\n\nenum AuthFormType { signIn, signUp, reset, anonymous, convert, phone }\n\nclass SignUpView extends StatefulWidget {\n  final AuthFormType authFormType;\n\n  SignUpView({Key key, @required this.authFormType}) : super(key: key);\n\n  @override\n  _SignUpViewState createState() =>\n      _SignUpViewState(authFormType: this.authFormType);\n}\n\nclass _SignUpViewState extends State<SignUpView> {\n  AuthFormType authFormType;\n  bool _showAppleSignIn = false;\n\n  @override\n  void initState() {\n    super.initState();\n\n    _useAppleSignIn();\n  }\n\n  _useAppleSignIn() async {\n    final isAvailable = await AppleSignIn.isAvailable();\n    setState(() {\n      _showAppleSignIn = isAvailable;\n    });\n  }\n\n  _SignUpViewState({this.authFormType});\n\n  final formKey = GlobalKey<FormState>();\n  String _email, _password, _name, _warning, _phone;\n\n  void switchFormState(String state) {\n    formKey.currentState.reset();\n    if (state == \"signUp\") {\n      setState(() {\n        authFormType = AuthFormType.signUp;\n      });\n    } else if (state == 'home') {\n      Navigator.of(context).pop();\n    } else {\n      setState(() {\n        authFormType = AuthFormType.signIn;\n      });\n    }\n  }\n\n  bool validate() {\n    final form = formKey.currentState;\n    if (authFormType == AuthFormType.anonymous) {\n      return true;\n    }\n    form.save();\n    if (form.validate()) {\n      form.save();\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  void submit() async {\n    if (validate()) {\n      try {\n        final auth = Provider.of(context).auth;\n        switch (authFormType) {\n          case AuthFormType.signIn:\n            await auth.signInWithEmailAndPassword(_email, _password);\n            Navigator.of(context).pushReplacementNamed('/home');\n            break;\n          case AuthFormType.signUp:\n            await auth.createUserWithEmailAndPassword(_email, _password, _name);\n            Navigator.of(context).pushReplacementNamed('/home');\n            break;\n          case AuthFormType.reset:\n            await auth.sendPasswordResetEmail(_email);\n            setState(() {\n              _warning = \"A password reset link has been sent to $_email\";\n              authFormType = AuthFormType.signIn;\n            });\n            break;\n          case AuthFormType.anonymous:\n            await auth.singInAnonymously();\n            Navigator.of(context).pushReplacementNamed('/home');\n            break;\n          case AuthFormType.convert:\n            await auth.convertUserWithEmail(_email, _password, _name);\n            Navigator.of(context).pop();\n            break;\n          case AuthFormType.phone:\n            var result = await auth.createUserWithPhone(_phone, context);\n            if (_phone == \"\" || result == \"error\") {\n              setState(() {\n                _warning = \"Your phone number could not be validated\";\n              });\n            }\n            break;\n        }\n      } catch (e) {\n        setState(() {\n          _warning = e.message;\n        });\n      }\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    final _width = MediaQuery.of(context).size.width;\n    final _height = MediaQuery.of(context).size.height;\n\n    if (authFormType == AuthFormType.anonymous) {\n      submit();\n      return Scaffold(\n          backgroundColor: primaryColor,\n          body: SingleChildScrollView(\n            child: Column(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: <Widget>[\n                SpinKitDoubleBounce(\n                  color: Colors.white,\n                ),\n                Text(\n                  \"Loading\",\n                  style: TextStyle(color: Colors.white),\n                ),\n              ],\n            ),\n          ));\n    } else {\n      return Scaffold(\n        body: SingleChildScrollView(\n          child: Container(\n            color: primaryColor,\n            height: _height,\n            width: _width,\n            child: SafeArea(\n              child: Column(\n                children: <Widget>[\n                  SizedBox(height: _height * 0.025),\n                  showAlert(),\n                  SizedBox(height: _height * 0.025),\n                  buildHeaderText(),\n                  SizedBox(height: _height * 0.05),\n                  Padding(\n                    padding: const EdgeInsets.all(20.0),\n                    child: Form(\n                      key: formKey,\n                      child: Column(\n                        children: buildInputs() + buildButtons(),\n                      ),\n                    ),\n                  ),\n                ],\n              ),\n            ),\n          ),\n        ),\n      );\n    }\n  }\n\n  Widget showAlert() {\n    if (_warning != null) {\n      return Container(\n        color: Colors.amberAccent,\n        width: double.infinity,\n        padding: EdgeInsets.all(8.0),\n        child: Row(\n          children: <Widget>[\n            Padding(\n              padding: const EdgeInsets.only(right: 8.0),\n              child: Icon(Icons.error_outline),\n            ),\n            Expanded(\n              child: AutoSizeText(\n                _warning,\n                maxLines: 3,\n              ),\n            ),\n            Padding(\n              padding: const EdgeInsets.only(left: 8.0),\n              child: IconButton(\n                icon: Icon(Icons.close),\n                onPressed: () {\n                  setState(() {\n                    _warning = null;\n                  });\n                },\n              ),\n            )\n          ],\n        ),\n      );\n    }\n    return SizedBox(\n      height: 0,\n    );\n  }\n\n  AutoSizeText buildHeaderText() {\n    String _headerText;\n    if (authFormType == AuthFormType.signIn) {\n      _headerText = \"Sign In\";\n    } else if (authFormType == AuthFormType.reset) {\n      _headerText = \"Reset Password\";\n    } else if (authFormType == AuthFormType.phone) {\n      _headerText = \"Phone Sign In\";\n    } else {\n      _headerText = \"Create New Account\";\n    }\n    return AutoSizeText(\n      _headerText,\n      maxLines: 1,\n      textAlign: TextAlign.center,\n      style: TextStyle(\n        fontSize: 35,\n        color: Colors.white,\n      ),\n    );\n  }\n\n  void onPhoneNumberChange(\n      String number, String internationalizedPhoneNumber, String isoCode) {\n    setState(() {\n      _phone = internationalizedPhoneNumber;\n    });\n  }\n\n  List<Widget> buildInputs() {\n    List<Widget> textFields = [];\n\n    // if were in the sign up state add name\n    if ([AuthFormType.signUp, AuthFormType.convert].contains(authFormType)) {\n      textFields.add(\n        TextFormField(\n          validator: NameValidator.validate,\n          style: TextStyle(fontSize: 22.0),\n          decoration: buildSignUpInputDecoration(\"Name\"),\n          onSaved: (value) => _name = value,\n        ),\n      );\n      textFields.add(SizedBox(height: 20));\n    }\n\n    // add email & password\n    if ([\n      AuthFormType.signUp,\n      AuthFormType.convert,\n      AuthFormType.reset,\n      AuthFormType.signIn\n    ].contains(authFormType)) {\n      textFields.add(\n        TextFormField(\n          validator: EmailValidator.validate,\n          style: TextStyle(fontSize: 22.0),\n          decoration: buildSignUpInputDecoration(\"Email\"),\n          onSaved: (value) => _email = value,\n        ),\n      );\n      textFields.add(SizedBox(height: 20));\n    }\n\n    if (authFormType != AuthFormType.reset &&\n        authFormType != AuthFormType.phone) {\n      textFields.add(\n        TextFormField(\n          validator: PasswordValidator.validate,\n          style: TextStyle(fontSize: 22.0),\n          decoration: buildSignUpInputDecoration(\"Password\"),\n          obscureText: true,\n          onSaved: (value) => _password = value,\n        ),\n      );\n      textFields.add(SizedBox(height: 20));\n    }\n\n    if (authFormType == AuthFormType.phone) {\n      textFields.add(\n        InternationalPhoneInput(\n            decoration: buildSignUpInputDecoration(\"Enter Phone Number\"),\n            onPhoneNumberChange: onPhoneNumberChange,\n            initialPhoneNumber: _phone,\n            initialSelection: 'US',\n            showCountryCodes: true),\n      );\n      textFields.add(SizedBox(height: 20));\n    }\n\n    return textFields;\n  }\n\n  InputDecoration buildSignUpInputDecoration(String hint) {\n    return InputDecoration(\n      hintText: hint,\n      filled: true,\n      fillColor: Colors.white,\n      focusColor: Colors.white,\n      enabledBorder: OutlineInputBorder(\n          borderSide: BorderSide(color: Colors.white, width: 0.0)),\n      contentPadding:\n          const EdgeInsets.only(left: 14.0, bottom: 10.0, top: 10.0),\n    );\n  }\n\n  List<Widget> buildButtons() {\n    String _switchButtonText, _newFormState, _submitButtonText;\n    bool _showForgotPassword = false;\n    bool _showSocial = true;\n\n    if (authFormType == AuthFormType.signIn) {\n      _switchButtonText = \"Create New Account\";\n      _newFormState = \"signUp\";\n      _submitButtonText = \"Sign In\";\n      _showForgotPassword = true;\n    } else if (authFormType == AuthFormType.reset) {\n      _switchButtonText = \"Return to Sign In\";\n      _newFormState = \"signIn\";\n      _submitButtonText = \"Submit\";\n      _showSocial = false;\n    } else if (authFormType == AuthFormType.convert) {\n      _switchButtonText = \"Cancel\";\n      _newFormState = \"home\";\n      _submitButtonText = \"Sign Up\";\n    } else if (authFormType == AuthFormType.phone) {\n      _switchButtonText = \"Cancel\";\n      _newFormState = \"signIn\";\n      _submitButtonText = \"Continue\";\n      _showSocial = false;\n    } else {\n      _switchButtonText = \"Have an Account? Sign In\";\n      _newFormState = \"signIn\";\n      _submitButtonText = \"Sign Up\";\n    }\n\n    return [\n      Container(\n        width: MediaQuery.of(context).size.width * 0.7,\n        child: RaisedButton(\n          shape:\n              RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),\n          color: Colors.white,\n          textColor: primaryColor,\n          child: Padding(\n            padding: const EdgeInsets.all(8.0),\n            child: Text(\n              _submitButtonText,\n              style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.w300),\n            ),\n          ),\n          onPressed: submit,\n        ),\n      ),\n      showForgotPassword(_showForgotPassword),\n      FlatButton(\n        child: Text(\n          _switchButtonText,\n          style: TextStyle(color: Colors.white),\n        ),\n        onPressed: () {\n          switchFormState(_newFormState);\n        },\n      ),\n      buildSocialIcons(_showSocial),\n    ];\n  }\n\n  Widget showForgotPassword(bool visible) {\n    return Visibility(\n      child: FlatButton(\n        child: Text(\n          \"Forgot Password?\",\n          style: TextStyle(color: Colors.white),\n        ),\n        onPressed: () {\n          setState(() {\n            authFormType = AuthFormType.reset;\n          });\n        },\n      ),\n      visible: visible,\n    );\n  }\n\n  Widget buildSocialIcons(bool visible) {\n    final _auth = Provider.of(context).auth;\n    return Visibility(\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.stretch,\n        children: <Widget>[\n          Divider(\n            color: Colors.white,\n          ),\n          SizedBox(height: 10),\n          buildAppleSignIn(_auth),\n          SizedBox(height: 10),\n          GoogleSignInButton(\n            onPressed: () async {\n              try {\n                if (authFormType == AuthFormType.convert) {\n                  await _auth.convertWithGoogle();\n                  Navigator.of(context).pop();\n                } else {\n                  await _auth.signInWithGoogle();\n                  Navigator.of(context).pushReplacementNamed('/home');\n                }\n              } catch (e) {\n                setState(() {\n                  _warning = e.message;\n                });\n              }\n            },\n          ),\n          RaisedButton(\n            color: Colors.green,\n            textColor: Colors.white,\n            child: Row(\n              children: <Widget>[\n                Icon(Icons.phone),\n                Padding(\n                  padding: const EdgeInsets.only(\n                      left: 14.0, top: 10.0, bottom: 10.0),\n                  child: Text(\"Sign in with Phone\",\n                      style: TextStyle(fontSize: 18)),\n                )\n              ],\n            ),\n            onPressed: () {\n              setState(() {\n                authFormType = AuthFormType.phone;\n              });\n            },\n          ),\n        ],\n      ),\n      visible: visible,\n    );\n  }\n\n  Widget buildAppleSignIn(_auth) {\n    if (authFormType != AuthFormType.convert && _showAppleSignIn == true) {\n      return AppleSignInButton(\n        onPressed: () async {\n          await _auth.signInWithApple();\n          Navigator.of(context).pushReplacementNamed('/home');\n        },\n        style: ButtonStyle.black,\n      );\n    } else {\n      return Container();\n    }\n  }\n}\n"
  },
  {
    "path": "lib/widgets/calculator_widget.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:travel_budget/widgets/money_text_field.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:travel_budget/widgets/provider_widget.dart';\nimport 'package:cloud_firestore/cloud_firestore.dart';\n\nclass CalculatorWidget extends StatefulWidget {\n  final Trip trip;\n\n  CalculatorWidget({\n    @required this.trip,\n  });\n\n  @override\n  _CalculatorWidgetState createState() => _CalculatorWidgetState();\n}\n\nclass _CalculatorWidgetState extends State<CalculatorWidget> {\n  TextEditingController _moneyController = TextEditingController();\n  int _saved;\n  int _needed;\n\n  @override\n  void initState() {\n    super.initState();\n    _saved = (widget.trip.saved ?? 0.0).floor();\n    _needed = (widget.trip.budget.floor() * widget.trip.getTotalTripDays()) - _saved;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Card(\n      child: Column(\n        children: <Widget>[\n          Container(\n            color: Colors.cyan,\n            child: Padding(\n              padding: const EdgeInsets.only(top: 12.0, bottom: 12.0),\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n                children: <Widget>[\n                  Column(\n                    children: <Widget>[\n                      Text(\"\\$$_saved\", style: TextStyle(fontSize: 60)),\n                      Text(\"Saved\", style: TextStyle(fontSize: 20)),\n                    ],\n                  ),\n                  Container(\n                    height: 80,\n                    child: VerticalDivider(\n                      color: Colors.white,\n                      thickness: 5,\n                    ),\n                  ),\n                  Column(\n                    children: <Widget>[\n                      Text(\"\\$$_needed\", style: TextStyle(fontSize: 60)),\n                      Text(\"Needed\", style: TextStyle(fontSize: 20)),\n                    ],\n                  ),\n                ],\n              ),\n            ),\n          ),\n          Container(\n            color: Colors.orangeAccent,\n            child: Padding(\n              padding: const EdgeInsets.only(left: 20.0, right: 40.0),\n              child: Row(\n                children: <Widget>[\n                  Expanded(\n                    child: MoneyTextField(\n                      controller: _moneyController,\n                      helperText: \"Save Additional\",\n                    ),\n                  ),\n                  IconButton(\n                    icon: Icon(Icons.add_circle),\n                    color: Colors.green,\n                    iconSize: 50,\n                    onPressed: () async {\n                      setState(() {\n                        _saved = _saved + int.parse(_moneyController.text);\n                        _needed = _needed - int.parse(_moneyController.text);\n                      });\n                      final uid = await Provider.of(context).auth.getCurrentUID();\n                      await FirebaseFirestore.instance.collection('userData')\n                          .doc(uid)\n                          .collection('trips')\n                          .doc(widget.trip.documentId)\n                          .update({'saved': _saved.toDouble()});\n                    },\n                  ),\n                  IconButton(\n                    icon: Icon(Icons.remove_circle),\n                    color: Colors.red,\n                    iconSize: 50,\n                    onPressed: () async {\n                      setState(() {\n                        _saved = _saved - int.parse(_moneyController.text);\n                        _needed = _needed + int.parse(_moneyController.text);\n                      });\n                      final uid = await Provider.of(context).auth.getCurrentUID();\n                      await FirebaseFirestore.instance.collection('userData')\n                          .doc(uid)\n                          .collection('trips')\n                          .doc(widget.trip.documentId)\n                          .update({'saved': _saved.toDouble()});\n                    },\n                  )\n                ],\n              ),\n            ),\n          ),\n          Container(\n            color: Colors.orangeAccent,\n            child: Padding(\n              padding: const EdgeInsets.only(bottom: 20.0),\n              child: Row(\n                mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n                children: <Widget>[\n                  generateAddMoneyBtn(25),\n                  generateAddMoneyBtn(50),\n                  generateAddMoneyBtn(100),\n                ],\n              ),\n            ),\n          )\n        ],\n      ),\n    );\n  }\n\n\n  RaisedButton generateAddMoneyBtn(int amount) {\n    return RaisedButton(\n      child: Text(\"\\$$amount\"),\n      color: Colors.white,\n      textColor: Colors.deepOrange,\n      onPressed: () async {\n        setState(() {\n          _saved = _saved + amount;\n          _needed = _needed - amount;\n        });\n        final uid = await Provider.of(context).auth.getCurrentUID();\n        await FirebaseFirestore.instance.collection('userData')\n            .doc(uid)\n            .collection('trips')\n            .doc(widget.trip.documentId)\n            .update({'saved': _saved.toDouble()});\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/custom_dialog.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:auto_size_text/auto_size_text.dart';\n\nclass CustomDialog extends StatelessWidget {\n  final primaryColor = const Color(0xFF75A2EA);\n  final grayColor = const Color(0xFF939393);\n\n  final String title,\n      description,\n      primaryButtonText,\n      primaryButtonRoute,\n      secondaryButtonText,\n      secondaryButtonRoute;\n\n  CustomDialog(\n      {@required this.title,\n      @required this.description,\n      @required this.primaryButtonText,\n      @required this.primaryButtonRoute,\n      this.secondaryButtonText,\n      this.secondaryButtonRoute});\n\n  static const double padding = 20.0;\n\n  @override\n  Widget build(BuildContext context) {\n    return Dialog(\n      shape: RoundedRectangleBorder(\n        borderRadius: BorderRadius.circular(padding),\n      ),\n      child: Stack(\n        children: <Widget>[\n          Container(\n            padding: EdgeInsets.all(padding),\n            decoration: BoxDecoration(\n                color: Colors.white,\n                shape: BoxShape.rectangle,\n                borderRadius: BorderRadius.circular(padding),\n                boxShadow: [\n                  BoxShadow(\n                    color: Colors.black,\n                    blurRadius: 10.0,\n                    offset: const Offset(0.0, 10.0),\n                  ),\n                ]),\n            child: Column(\n              mainAxisSize: MainAxisSize.min,\n              children: <Widget>[\n                SizedBox(height: 24.0),\n                AutoSizeText(\n                  title,\n                  maxLines: 2,\n                  textAlign: TextAlign.center,\n                  style: TextStyle(\n                    color: primaryColor,\n                    fontSize: 25.0,\n                  ),\n                ),\n                SizedBox(height: 24.0),\n                AutoSizeText(\n                  description,\n                  maxLines: 4,\n                  textAlign: TextAlign.center,\n                  style: TextStyle(\n                    color: grayColor,\n                    fontSize: 18.0,\n                  ),\n                ),\n                SizedBox(height: 24.0),\n                RaisedButton(\n                  color: primaryColor,\n                  shape: RoundedRectangleBorder(\n                      borderRadius: BorderRadius.circular(30.0)),\n                  child: Padding(\n                    padding: const EdgeInsets.fromLTRB(20, 10, 20, 10),\n                    child: AutoSizeText(\n                      primaryButtonText,\n                      maxLines: 1,\n                      style: TextStyle(\n                        fontSize: 18,\n                        fontWeight: FontWeight.w200,\n                        color: Colors.white,\n                      ),\n                    ),\n                  ),\n                  onPressed: () {\n                    Navigator.of(context).pop();\n                    Navigator.of(context)\n                        .pushReplacementNamed(primaryButtonRoute);\n                  },\n                ),\n                SizedBox(height: 10.0),\n                showSecondaryButton(context),\n              ],\n            ),\n          )\n        ],\n      ),\n    );\n  }\n\n  showSecondaryButton(BuildContext context) {\n    if (secondaryButtonRoute != null && secondaryButtonText != null ){\n      return FlatButton(\n        child: AutoSizeText(\n          secondaryButtonText,\n          maxLines: 1,\n          style: TextStyle(\n            fontSize: 18,\n            color: primaryColor,\n            fontWeight: FontWeight.w400,\n          ),\n        ),\n        onPressed: () {\n          Navigator.of(context).pop();\n          Navigator.of(context).pushReplacementNamed(secondaryButtonRoute);\n        },\n      );\n    } else {\n      return SizedBox(height: 10.0);\n    }\n  }\n}\n"
  },
  {
    "path": "lib/widgets/divider_with_text_widget.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass DividerWithText extends StatelessWidget {\n  final String dividerText;\n  const DividerWithText({Key key, @required this.dividerText}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Row(\n      children: <Widget>[\n        Expanded(child: Padding(\n          padding: const EdgeInsets.only(right:8.0),\n          child: Divider(),\n        )),\n        Text(dividerText),\n        Expanded(child: Padding(\n          padding: const EdgeInsets.only(left: 8.0),\n          child: Divider(),\n        )),\n      ],\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widgets/money_text_field.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nclass MoneyTextField extends StatelessWidget {\n  final TextEditingController controller;\n  final String helperText;\n\n  const MoneyTextField({Key key, @required this.controller, this.helperText})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: const EdgeInsets.all(30.0),\n      child: TextField(\n        controller: controller,\n        maxLines: 1,\n        decoration: InputDecoration(\n          prefixIcon: Icon(Icons.attach_money),\n          helperText: helperText,\n        ),\n        keyboardType: TextInputType.numberWithOptions(decimal: false),\n        inputFormatters: [\n          WhitelistingTextInputFormatter.digitsOnly,\n        ],\n        autofocus: false,\n      ),\n    );\n  }\n}\n\n\n\n\n"
  },
  {
    "path": "lib/widgets/provider_widget.dart",
    "content": "import 'package:travel_budget/services/auth_service.dart';\nimport 'package:flutter/material.dart';\n\nclass Provider extends InheritedWidget {\n  final AuthService auth;\n  final db;\n  final colors;\n\n  Provider({Key key, Widget child, this.auth, this.db, this.colors}) : super(key: key, child: child);\n\n  @override\n  bool updateShouldNotify(InheritedWidget oldWidget) {\n    return true;\n  }\n\n  static Provider of(BuildContext context) =>\n      (context.dependOnInheritedWidgetOfExactType<Provider>());\n}"
  },
  {
    "path": "lib/widgets/rounded_button.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass RoundedButton extends RaisedButton {\n  final VoidCallback onPressed;\n  final Widget child;\n  final Color color;\n\n  const RoundedButton({@required this.onPressed, this.child, this.color}) : super(onPressed: onPressed, child: child);\n\n  @override\n  Widget build(BuildContext context) {\n    return Theme(\n      data: Theme.of(context).copyWith(\n        buttonTheme: Theme.of(context).buttonTheme.copyWith(\n          shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0)),\n          buttonColor: color,\n        )\n      ),\n      child: Builder(builder: super.build),\n    );\n  }\n}"
  },
  {
    "path": "lib/widgets/trip_card.dart",
    "content": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:flutter/material.dart';\nimport 'package:google_fonts/google_fonts.dart';\nimport 'package:intl/intl.dart';\nimport 'package:travel_budget/models/Trip.dart';\nimport 'package:travel_budget/services/admob_service.dart';\nimport 'package:travel_budget/views/detail_trip_view.dart';\n\nWidget buildTripCard(BuildContext context, DocumentSnapshot document, [bool loadBannerAd]) {\n  final trip = Trip.fromSnapshot(document);\n  final tripType = trip.types();\n\n  return new Container(\n    child: Card(\n      child: InkWell(\n        child: Padding(\n          padding: const EdgeInsets.all(16.0),\n          child: Column(\n            children: <Widget>[\n              Padding(\n                padding: const EdgeInsets.only(top: 8.0, bottom: 4.0),\n                child: Row(children: <Widget>[\n                  Text(\n                    trip.title,\n                    style: GoogleFonts.seymourOne(fontSize: 20.0),\n                  ),\n                  Spacer(),\n                ]),\n              ),\n              Padding(\n                padding: const EdgeInsets.only(top: 4.0, bottom: 80.0),\n                child: Row(children: <Widget>[\n                  Text(\n                      \"${DateFormat('MM/dd/yyyy').format(trip.startDate).toString()} - ${DateFormat('MM/dd/yyyy').format(trip.endDate).toString()}\"),\n                  Spacer(),\n                ]),\n              ),\n              Padding(\n                padding: const EdgeInsets.only(top: 8.0, bottom: 8.0),\n                child: Row(\n                  children: <Widget>[\n                    Text(\n                      \"\\$${(trip.budget == null) ? \"n/a\" : trip.budget.toStringAsFixed(2)}\",\n                      style: new TextStyle(fontSize: 35.0),\n                    ),\n                    Spacer(),\n                    (tripType.containsKey(trip.travelType)) ? tripType[trip.travelType] : tripType[\"other\"],\n                  ],\n                ),\n              )\n            ],\n          ),\n        ),\n        onTap: () {\n          if (loadBannerAd == true) {\n            Navigator.push(context, MaterialPageRoute(builder: (context) => DetailTripView(trip: trip))).then((value) {\n              AdMobService.showHomeBannerAd();\n            });\n          } else {\n            Navigator.push(context, MaterialPageRoute(builder: (context) => DetailTripView(trip: trip)));\n          }\n        },\n      ),\n    ),\n  );\n}\n"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: travel_budget\ndescription: A new Flutter application.\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.1.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n\n  firebase_core: ^0.5.3\n  cloud_firestore: ^0.14.0\n  firebase_auth: ^0.18.0\n  google_sign_in: ^4.0.4\n  apple_sign_in: ^0.1.0\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons: ^0.1.2\n  intl: 0.16.1\n  date_range_picker: ^1.0.5\n  auto_size_text: ^2.0.2\n  flutter_spinkit: ^3.1.0\n  flutter_auth_buttons: ^0.5.0\n  dio: ^3.0.10\n  uuid: 2.0.1\n  device_info: ^0.4.1+4\n  google_fonts: ^0.3.2\n  firebase_admob: ^0.10.0-dev.1\n  flare_flutter: ^2.0.3\n  international_phone_input: ^1.0.4\n  flutter_launcher_icons: \"^0.7.3\"\n  firebase_crashlytics: \"^0.2.4\"\n\n\n# flutter pub run flutter_launcher_icons:main\nflutter_icons:\n  image_path: \"assets/icons/main_logo.png\"\n  adaptive_icon_foreground: \"assets/icons/foreground_logo.png\"\n  adaptive_icon_background: \"#57AEAF\"\n  android: true\n  ios: true\n\n\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://www.dartlang.org/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n\n  # To add assets to your application, add an assets section, like this:\n  assets:\n    - assets/\n  #  - images/a_dot_burr.jpeg\n  #  - images/a_dot_ham.jpeg\n\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware.\n\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.dev/assets-and-images/#from-packages\n\n  # To add custom fonts to your application, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts from package dependencies,\n  # see https://flutter.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "res/values/strings_en.arb",
    "content": ""
  },
  {
    "path": "test/widget_test.dart",
    "content": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester\n// utility that Flutter provides. For example, you can send tap and scroll\n// gestures. You can also use WidgetTester to find child widgets in the widget\n// tree, read text, and verify that the values of widget properties are correct.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport 'package:travel_budget/main.dart';\n\nvoid main() {\n  testWidgets('Counter increments smoke test', (WidgetTester tester) async {\n    // Build our app and trigger a frame.\n    await tester.pumpWidget(MyApp());\n\n    // Verify that our counter starts at 0.\n    expect(find.text('0'), findsOneWidget);\n    expect(find.text('1'), findsNothing);\n\n    // Tap the '+' icon and trigger a frame.\n    await tester.tap(find.byIcon(Icons.add));\n    await tester.pump();\n\n    // Verify that our counter has incremented.\n    expect(find.text('0'), findsNothing);\n    expect(find.text('1'), findsOneWidget);\n  });\n}\n"
  }
]