From 269b061317268aa20f69c5a74b964ce128e555e5 Mon Sep 17 00:00:00 2001 From: Mariko Date: Mon, 2 Apr 2018 15:31:11 -0700 Subject: [PATCH 01/64] created new rails application --- .gitignore | 19 ++ Gemfile | 54 +++++ Gemfile.lock | 196 ++++++++++++++++++ Rakefile | 6 + app/assets/config/manifest.js | 3 + app/assets/images/.keep | 0 app/assets/javascripts/application.js | 15 ++ app/assets/javascripts/cable.js | 13 ++ app/assets/javascripts/channels/.keep | 0 app/assets/stylesheets/application.css | 15 ++ app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 3 + app/controllers/concerns/.keep | 0 app/helpers/application_helper.rb | 2 + app/jobs/application_job.rb | 2 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/views/layouts/application.html.erb | 14 ++ app/views/layouts/mailer.html.erb | 13 ++ app/views/layouts/mailer.text.erb | 1 + bin/bundle | 3 + bin/rails | 9 + bin/rake | 9 + bin/setup | 38 ++++ bin/spring | 17 ++ bin/update | 29 +++ bin/yarn | 11 + config.ru | 5 + config/application.rb | 18 ++ config/boot.rb | 3 + config/cable.yml | 10 + config/database.yml | 85 ++++++++ config/environment.rb | 5 + config/environments/development.rb | 54 +++++ config/environments/production.rb | 91 ++++++++ config/environments/test.rb | 42 ++++ .../application_controller_renderer.rb | 8 + config/initializers/assets.rb | 14 ++ config/initializers/backtrace_silencers.rb | 7 + config/initializers/cookies_serializer.rb | 5 + .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 ++ config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 ++ config/locales/en.yml | 33 +++ config/puma.rb | 56 +++++ config/routes.rb | 3 + config/secrets.yml | 32 +++ config/spring.rb | 6 + lib/assets/.keep | 0 lib/tasks/.keep | 0 log/.keep | 0 package.json | 5 + public/404.html | 67 ++++++ public/422.html | 67 ++++++ public/500.html | 66 ++++++ public/apple-touch-icon-precomposed.png | 0 public/apple-touch-icon.png | 0 public/favicon.ico | 0 public/robots.txt | 1 + test/application_system_test_case.rb | 5 + test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/files/.keep | 0 test/helpers/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/system/.keep | 0 test/test_helper.rb | 10 + tmp/.keep | 0 vendor/.keep | 0 74 files changed, 1223 insertions(+) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Rakefile create mode 100644 app/assets/config/manifest.js create mode 100644 app/assets/images/.keep create mode 100644 app/assets/javascripts/application.js create mode 100644 app/assets/javascripts/cable.js create mode 100644 app/assets/javascripts/channels/.keep create mode 100644 app/assets/stylesheets/application.css create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/helpers/application_helper.rb create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/application.html.erb create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100755 bin/update create mode 100755 bin/yarn create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/assets.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/cookies_serializer.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/secrets.yml create mode 100644 config/spring.rb create mode 100644 lib/assets/.keep create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 package.json create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/apple-touch-icon-precomposed.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 test/application_system_test_case.rb create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/files/.keep create mode 100644 test/helpers/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/system/.keep create mode 100644 test/test_helper.rb create mode 100644 tmp/.keep create mode 100644 vendor/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..82701fedc --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +/node_modules +/yarn-error.log + +.byebug_history diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..502cba1e3 --- /dev/null +++ b/Gemfile @@ -0,0 +1,54 @@ +source 'https://rubygems.org' + +git_source(:github) do |repo_name| + repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") + "https://github.com/#{repo_name}.git" +end + + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.1.5' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 3.7' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'therubyracer', platforms: :ruby + +# Use CoffeeScript for .coffee assets and views +gem 'coffee-rails', '~> 4.2' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] + # Adds support for Capybara system testing and selenium driver + gem 'capybara', '~> 2.13' + gem 'selenium-webdriver' +end + +group :development do + # Access an IRB console on exception pages or by using <%= console %> anywhere in the code. + gem 'web-console', '>= 3.3.0' + gem 'listen', '>= 3.0.5', '< 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..35ce7e7f3 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,196 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.1.6) + actionpack (= 5.1.6) + nio4r (~> 2.0) + websocket-driver (~> 0.6.1) + actionmailer (5.1.6) + actionpack (= 5.1.6) + actionview (= 5.1.6) + activejob (= 5.1.6) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.1.6) + actionview (= 5.1.6) + activesupport (= 5.1.6) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.1.6) + activesupport (= 5.1.6) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.1.6) + activesupport (= 5.1.6) + globalid (>= 0.3.6) + activemodel (5.1.6) + activesupport (= 5.1.6) + activerecord (5.1.6) + activemodel (= 5.1.6) + activesupport (= 5.1.6) + arel (~> 8.0) + activesupport (5.1.6) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + arel (8.0.0) + bindex (0.5.0) + builder (3.2.3) + byebug (10.0.2) + capybara (2.18.0) + addressable + mini_mime (>= 0.1.3) + nokogiri (>= 1.3.3) + rack (>= 1.0.0) + rack-test (>= 0.5.4) + xpath (>= 2.0, < 4.0) + childprocess (0.9.0) + ffi (~> 1.0, >= 1.0.11) + coffee-rails (4.2.2) + coffee-script (>= 2.2.0) + railties (>= 4.0.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.12.2) + concurrent-ruby (1.0.5) + crass (1.0.3) + erubi (1.7.1) + execjs (2.7.0) + ffi (1.9.23) + globalid (0.4.1) + activesupport (>= 4.2.0) + i18n (1.0.0) + concurrent-ruby (~> 1.0) + jbuilder (2.7.0) + activesupport (>= 4.2.0) + multi_json (>= 1.2) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + loofah (2.2.2) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + mail (2.7.0) + mini_mime (>= 0.1.1) + method_source (0.9.0) + mini_mime (1.0.0) + mini_portile2 (2.3.0) + minitest (5.11.3) + multi_json (1.13.1) + nio4r (2.3.0) + nokogiri (1.8.2) + mini_portile2 (~> 2.3.0) + pg (1.0.0) + public_suffix (3.0.2) + puma (3.11.3) + rack (2.0.4) + rack-test (1.0.0) + rack (>= 1.0, < 3) + rails (5.1.6) + actioncable (= 5.1.6) + actionmailer (= 5.1.6) + actionpack (= 5.1.6) + actionview (= 5.1.6) + activejob (= 5.1.6) + activemodel (= 5.1.6) + activerecord (= 5.1.6) + activesupport (= 5.1.6) + bundler (>= 1.3.0) + railties (= 5.1.6) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.0.4) + loofah (~> 2.2, >= 2.2.2) + railties (5.1.6) + actionpack (= 5.1.6) + activesupport (= 5.1.6) + method_source + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rake (12.3.1) + rb-fsevent (0.10.3) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + ruby_dep (1.5.0) + rubyzip (1.2.1) + sass (3.5.6) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sass-rails (5.0.7) + railties (>= 4.0.0, < 6) + sass (~> 3.1) + sprockets (>= 2.8, < 4.0) + sprockets-rails (>= 2.0, < 4.0) + tilt (>= 1.1, < 3) + selenium-webdriver (3.11.0) + childprocess (~> 0.5) + rubyzip (~> 1.2) + spring (2.0.2) + activesupport (>= 4.2) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (3.7.1) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (0.20.0) + thread_safe (0.3.6) + tilt (2.0.8) + turbolinks (5.1.0) + turbolinks-source (~> 5.1) + turbolinks-source (5.1.0) + tzinfo (1.2.5) + thread_safe (~> 0.1) + uglifier (4.1.8) + execjs (>= 0.3.0, < 3) + web-console (3.5.1) + actionview (>= 5.0) + activemodel (>= 5.0) + bindex (>= 0.4.0) + railties (>= 5.0) + websocket-driver (0.6.5) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.3) + xpath (3.0.0) + nokogiri (~> 1.8) + +PLATFORMS + ruby + +DEPENDENCIES + byebug + capybara (~> 2.13) + coffee-rails (~> 4.2) + jbuilder (~> 2.5) + listen (>= 3.0.5, < 3.2) + pg (>= 0.18, < 2.0) + puma (~> 3.7) + rails (~> 5.1.5) + sass-rails (~> 5.0) + selenium-webdriver + spring + spring-watcher-listen (~> 2.0.0) + turbolinks (~> 5) + tzinfo-data + uglifier (>= 1.3.0) + web-console (>= 3.3.0) + +BUNDLED WITH + 1.16.1 diff --git a/Rakefile b/Rakefile new file mode 100644 index 000000000..e85f91391 --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 000000000..b16e53d6d --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,3 @@ +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 000000000..46b20359f --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,15 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's +// vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. JavaScript code in this file should be added after the last require_* statement. +// +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details +// about supported directives. +// +//= require rails-ujs +//= require turbolinks +//= require_tree . diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js new file mode 100644 index 000000000..739aa5f02 --- /dev/null +++ b/app/assets/javascripts/cable.js @@ -0,0 +1,13 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the `rails generate channel` command. +// +//= require action_cable +//= require_self +//= require_tree ./channels + +(function() { + this.App || (this.App = {}); + + App.cable = ActionCable.createConsumer(); + +}).call(this); diff --git a/app/assets/javascripts/channels/.keep b/app/assets/javascripts/channels/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 000000000..d05ea0f51 --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,15 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + *= require_tree . + *= require_self + */ diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 000000000..d67269728 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 000000000..0ff5442f4 --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 000000000..1c07694e9 --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,3 @@ +class ApplicationController < ActionController::Base + protect_from_forgery with: :exception +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 000000000..de6be7945 --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 000000000..a009ace51 --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 000000000..286b2239d --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 000000000..10a4cba84 --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 000000000..353326840 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,14 @@ + + + + RideshareRails + <%= csrf_meta_tags %> + + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 000000000..cbd34d2e9 --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 000000000..37f0bddbd --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 000000000..66e9889e8 --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails new file mode 100755 index 000000000..5badb2fde --- /dev/null +++ b/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 000000000..d87d5f578 --- /dev/null +++ b/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 000000000..78c4e861d --- /dev/null +++ b/bin/setup @@ -0,0 +1,38 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 000000000..fb2ec2ebb --- /dev/null +++ b/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == "spring" } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/bin/update b/bin/update new file mode 100755 index 000000000..a8e4462f2 --- /dev/null +++ b/bin/update @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/yarn b/bin/yarn new file mode 100755 index 000000000..c2bacef83 --- /dev/null +++ b/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +VENDOR_PATH = File.expand_path('..', __dir__) +Dir.chdir(VENDOR_PATH) do + begin + exec "yarnpkg #{ARGV.join(" ")}" + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/config.ru b/config.ru new file mode 100644 index 000000000..f7ba0b527 --- /dev/null +++ b/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 000000000..03d71e01b --- /dev/null +++ b/config/application.rb @@ -0,0 +1,18 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module RideshareRails + class Application < Rails::Application + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.1 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 000000000..30f5120df --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,3 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 000000000..db55d1026 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: redis://localhost:6379/1 + channel_prefix: rideshare-rails_production diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 000000000..bf1c2b58e --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.1 and up are supported. +# +# Install the pg driver: +# gem install pg +# On OS X with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On OS X with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # http://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: rideshare-rails_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: rideshare-rails + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: rideshare-rails_test + +# As with config/secrets.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: rideshare-rails_production + username: rideshare-rails + password: <%= ENV['RIDESHARE-RAILS_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 000000000..426333bb4 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 000000000..5187e2218 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,54 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + if Rails.root.join('tmp/caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.seconds.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 000000000..8eb974095 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,91 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Attempt to read encrypted secrets from `config/secrets.yml.enc`. + # Requires an encryption key in `ENV["RAILS_MASTER_KEY"]` or + # `config/secrets.yml.key`. + config.read_encrypted_secrets = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "rideshare-rails_#{Rails.env}" + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 000000000..8e5cbde53 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,42 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.seconds.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 000000000..89d2efab2 --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 000000000..4b828e80c --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 000000000..59385cdf3 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 000000000..5a6a32d37 --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 000000000..4a994e1e7 --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 000000000..ac033bf9d --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 000000000..dc1899682 --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 000000000..bbfc3961b --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 000000000..decc5a857 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 000000000..1e19380dc --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,56 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. If you use this option +# you need to make sure to reconnect any threads in the `on_worker_boot` +# block. +# +# preload_app! + +# If you are preloading your application and using Active Record, it's +# recommended that you close any connections to the database before workers +# are forked to prevent connection leakage. +# +# before_fork do +# ActiveRecord::Base.connection_pool.disconnect! if defined?(ActiveRecord) +# end + +# The code in the `on_worker_boot` will be called if you are using +# clustered mode by specifying a number of `workers`. After each worker +# process is booted, this block will be run. If you are using the `preload_app!` +# option, you will want to use this block to reconnect to any threads +# or connections that may have been created at application boot, as Ruby +# cannot share connections between processes. +# +# on_worker_boot do +# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) +# end +# + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 000000000..787824f88 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html +end diff --git a/config/secrets.yml b/config/secrets.yml new file mode 100644 index 000000000..aecbcc3d4 --- /dev/null +++ b/config/secrets.yml @@ -0,0 +1,32 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rails secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +# Shared secrets are available across all environments. + +# shared: +# api_key: a1B2c3D4e5F6 + +# Environmental secrets are only available for that specific environment. + +development: + secret_key_base: 1d73cab469f1829e7396714cb33730ed62d9383e63ce54cc2b954e4d9ebc68ceadfefc0574ff8c282373d71a2c0de119679f8cd998fade9b3af2aa2fe2f13940 + +test: + secret_key_base: 9ae1b4fb19012c50575a8cdbdb82facac1be98f2ca16cb024567dd33fbee1ea956bb2ea5fab75f324094615b0980b5e39c39d70a98ef348ecb0eda226e206bea + +# Do not keep production secrets in the unencrypted secrets file. +# Instead, either read values from the environment. +# Or, use `bin/rails secrets:setup` to configure encrypted secrets +# and move the `production:` environment over there. + +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 000000000..c9119b40c --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +%w( + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +).each { |path| Spring.watch(path) } diff --git a/lib/assets/.keep b/lib/assets/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/log/.keep b/log/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/package.json b/package.json new file mode 100644 index 000000000..2d821c4e4 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "name": "rideshare-rails", + "private": true, + "dependencies": {} +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 000000000..2be3af26f --- /dev/null +++ b/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 000000000..c08eac0d1 --- /dev/null +++ b/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 000000000..78a030af2 --- /dev/null +++ b/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 000000000..e69de29bb diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 000000000..e69de29bb diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 000000000..e69de29bb diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 000000000..37b576a4a --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb new file mode 100644 index 000000000..d19212abd --- /dev/null +++ b/test/application_system_test_case.rb @@ -0,0 +1,5 @@ +require "test_helper" + +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :chrome, screen_size: [1400, 1400] +end diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/system/.keep b/test/system/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 000000000..92e39b2d7 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,10 @@ +ENV['RAILS_ENV'] ||= 'test' +require File.expand_path('../../config/environment', __FILE__) +require 'rails/test_help' + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 000000000..e69de29bb From 711f7f464820e218a65c58ccfd58fa07f6e14a23 Mon Sep 17 00:00:00 2001 From: Mariko Date: Mon, 2 Apr 2018 16:37:37 -0700 Subject: [PATCH 02/64] created conroller --- app/assets/javascripts/rides.coffee | 3 ++ app/assets/stylesheets/rides.scss | 3 ++ app/controllers/rides_controller.rb | 22 +++++++++++++ app/helpers/rides_helper.rb | 2 ++ app/views/rides/create.html.erb | 2 ++ app/views/rides/destroy.html.erb | 2 ++ app/views/rides/edit.html.erb | 2 ++ app/views/rides/index.html.erb | 2 ++ app/views/rides/new.html.erb | 2 ++ app/views/rides/show.html.erb | 2 ++ app/views/rides/update.html.erb | 2 ++ config/routes.rb | 14 ++++++++ test/controllers/rides_controller_test.rb | 39 +++++++++++++++++++++++ 13 files changed, 97 insertions(+) create mode 100644 app/assets/javascripts/rides.coffee create mode 100644 app/assets/stylesheets/rides.scss create mode 100644 app/controllers/rides_controller.rb create mode 100644 app/helpers/rides_helper.rb create mode 100644 app/views/rides/create.html.erb create mode 100644 app/views/rides/destroy.html.erb create mode 100644 app/views/rides/edit.html.erb create mode 100644 app/views/rides/index.html.erb create mode 100644 app/views/rides/new.html.erb create mode 100644 app/views/rides/show.html.erb create mode 100644 app/views/rides/update.html.erb create mode 100644 test/controllers/rides_controller_test.rb diff --git a/app/assets/javascripts/rides.coffee b/app/assets/javascripts/rides.coffee new file mode 100644 index 000000000..24f83d18b --- /dev/null +++ b/app/assets/javascripts/rides.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/rides.scss b/app/assets/stylesheets/rides.scss new file mode 100644 index 000000000..892060eee --- /dev/null +++ b/app/assets/stylesheets/rides.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Rides controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/rides_controller.rb b/app/controllers/rides_controller.rb new file mode 100644 index 000000000..627b45715 --- /dev/null +++ b/app/controllers/rides_controller.rb @@ -0,0 +1,22 @@ +class RidesController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/helpers/rides_helper.rb b/app/helpers/rides_helper.rb new file mode 100644 index 000000000..97fe7e18d --- /dev/null +++ b/app/helpers/rides_helper.rb @@ -0,0 +1,2 @@ +module RidesHelper +end diff --git a/app/views/rides/create.html.erb b/app/views/rides/create.html.erb new file mode 100644 index 000000000..d40934a7b --- /dev/null +++ b/app/views/rides/create.html.erb @@ -0,0 +1,2 @@ +

Rides#create

+

Find me in app/views/rides/create.html.erb

diff --git a/app/views/rides/destroy.html.erb b/app/views/rides/destroy.html.erb new file mode 100644 index 000000000..2e4b7274b --- /dev/null +++ b/app/views/rides/destroy.html.erb @@ -0,0 +1,2 @@ +

Rides#destroy

+

Find me in app/views/rides/destroy.html.erb

diff --git a/app/views/rides/edit.html.erb b/app/views/rides/edit.html.erb new file mode 100644 index 000000000..03a44854f --- /dev/null +++ b/app/views/rides/edit.html.erb @@ -0,0 +1,2 @@ +

Rides#edit

+

Find me in app/views/rides/edit.html.erb

diff --git a/app/views/rides/index.html.erb b/app/views/rides/index.html.erb new file mode 100644 index 000000000..835a9aef9 --- /dev/null +++ b/app/views/rides/index.html.erb @@ -0,0 +1,2 @@ +

Rides#index

+

Find me in app/views/rides/index.html.erb

diff --git a/app/views/rides/new.html.erb b/app/views/rides/new.html.erb new file mode 100644 index 000000000..e97bdc990 --- /dev/null +++ b/app/views/rides/new.html.erb @@ -0,0 +1,2 @@ +

Rides#new

+

Find me in app/views/rides/new.html.erb

diff --git a/app/views/rides/show.html.erb b/app/views/rides/show.html.erb new file mode 100644 index 000000000..87b5228d3 --- /dev/null +++ b/app/views/rides/show.html.erb @@ -0,0 +1,2 @@ +

Rides#show

+

Find me in app/views/rides/show.html.erb

diff --git a/app/views/rides/update.html.erb b/app/views/rides/update.html.erb new file mode 100644 index 000000000..2c4b0a4b8 --- /dev/null +++ b/app/views/rides/update.html.erb @@ -0,0 +1,2 @@ +

Rides#update

+

Find me in app/views/rides/update.html.erb

diff --git a/config/routes.rb b/config/routes.rb index 787824f88..ad4e3f9c2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,17 @@ Rails.application.routes.draw do + get 'rides/index' + + get 'rides/show' + + get 'rides/new' + + get 'rides/create' + + get 'rides/edit' + + get 'rides/update' + + get 'rides/destroy' + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/test/controllers/rides_controller_test.rb b/test/controllers/rides_controller_test.rb new file mode 100644 index 000000000..9d6cda23c --- /dev/null +++ b/test/controllers/rides_controller_test.rb @@ -0,0 +1,39 @@ +require 'test_helper' + +class RidesControllerTest < ActionDispatch::IntegrationTest + test "should get index" do + get rides_index_url + assert_response :success + end + + test "should get show" do + get rides_show_url + assert_response :success + end + + test "should get new" do + get rides_new_url + assert_response :success + end + + test "should get create" do + get rides_create_url + assert_response :success + end + + test "should get edit" do + get rides_edit_url + assert_response :success + end + + test "should get update" do + get rides_update_url + assert_response :success + end + + test "should get destroy" do + get rides_destroy_url + assert_response :success + end + +end From 3af64a3de4c0efa0cc86d30408b35653fe4b9a59 Mon Sep 17 00:00:00 2001 From: Aruna Date: Mon, 2 Apr 2018 16:47:34 -0700 Subject: [PATCH 03/64] created a model for drivers --- db/schema.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 db/schema.rb diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 000000000..48ece44b7 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,25 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 20180402234510) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "drivers", force: :cascade do |t| + t.string "name" + t.string "vin" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end From b0e36050f54493e7b456dd39f1417553c010df35 Mon Sep 17 00:00:00 2001 From: Aruna Date: Mon, 2 Apr 2018 17:08:34 -0700 Subject: [PATCH 04/64] create a trip and passenger model --- db/schema.rb | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index 48ece44b7..3b604c466 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180402234510) do +ActiveRecord::Schema.define(version: 20180403000134) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -22,4 +22,21 @@ t.datetime "updated_at", null: false end + create_table "passengers", force: :cascade do |t| + t.string "name" + t.string "phone_num" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "trips", force: :cascade do |t| + t.string "driver" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "passenger_id" + t.date "date" + t.integer "rating" + t.float "cost" + end + end From 34628d07f53759e3b2a35f15887e1dc3d913b091 Mon Sep 17 00:00:00 2001 From: Aruna Date: Mon, 2 Apr 2018 17:10:09 -0700 Subject: [PATCH 05/64] created all models --- app/models/driver.rb | 2 ++ app/models/passenger.rb | 2 ++ app/models/trip.rb | 2 ++ db/migrate/20180402234510_create_drivers.rb | 10 ++++++++++ db/migrate/20180402235148_create_passengers.rb | 10 ++++++++++ db/migrate/20180402235708_create_trips.rb | 9 +++++++++ db/migrate/20180403000134_add_trip_columns.rb | 9 +++++++++ test/fixtures/drivers.yml | 9 +++++++++ test/fixtures/passengers.yml | 9 +++++++++ test/fixtures/trips.yml | 7 +++++++ test/models/driver_test.rb | 7 +++++++ test/models/passenger_test.rb | 7 +++++++ test/models/trip_test.rb | 7 +++++++ 13 files changed, 90 insertions(+) create mode 100644 app/models/driver.rb create mode 100644 app/models/passenger.rb create mode 100644 app/models/trip.rb create mode 100644 db/migrate/20180402234510_create_drivers.rb create mode 100644 db/migrate/20180402235148_create_passengers.rb create mode 100644 db/migrate/20180402235708_create_trips.rb create mode 100644 db/migrate/20180403000134_add_trip_columns.rb create mode 100644 test/fixtures/drivers.yml create mode 100644 test/fixtures/passengers.yml create mode 100644 test/fixtures/trips.yml create mode 100644 test/models/driver_test.rb create mode 100644 test/models/passenger_test.rb create mode 100644 test/models/trip_test.rb diff --git a/app/models/driver.rb b/app/models/driver.rb new file mode 100644 index 000000000..1ff364562 --- /dev/null +++ b/app/models/driver.rb @@ -0,0 +1,2 @@ +class Driver < ApplicationRecord +end diff --git a/app/models/passenger.rb b/app/models/passenger.rb new file mode 100644 index 000000000..2c5748ac2 --- /dev/null +++ b/app/models/passenger.rb @@ -0,0 +1,2 @@ +class Passenger < ApplicationRecord +end diff --git a/app/models/trip.rb b/app/models/trip.rb new file mode 100644 index 000000000..a8c077a10 --- /dev/null +++ b/app/models/trip.rb @@ -0,0 +1,2 @@ +class Trip < ApplicationRecord +end diff --git a/db/migrate/20180402234510_create_drivers.rb b/db/migrate/20180402234510_create_drivers.rb new file mode 100644 index 000000000..eddae1b05 --- /dev/null +++ b/db/migrate/20180402234510_create_drivers.rb @@ -0,0 +1,10 @@ +class CreateDrivers < ActiveRecord::Migration[5.1] + def change + create_table :drivers do |t| + t.string :name + t.string :vin + + t.timestamps + end + end +end diff --git a/db/migrate/20180402235148_create_passengers.rb b/db/migrate/20180402235148_create_passengers.rb new file mode 100644 index 000000000..97f19c7b4 --- /dev/null +++ b/db/migrate/20180402235148_create_passengers.rb @@ -0,0 +1,10 @@ +class CreatePassengers < ActiveRecord::Migration[5.1] + def change + create_table :passengers do |t| + t.string :name + t.string :phone_num + + t.timestamps + end + end +end diff --git a/db/migrate/20180402235708_create_trips.rb b/db/migrate/20180402235708_create_trips.rb new file mode 100644 index 000000000..2140ea101 --- /dev/null +++ b/db/migrate/20180402235708_create_trips.rb @@ -0,0 +1,9 @@ +class CreateTrips < ActiveRecord::Migration[5.1] + def change + create_table :trips do |t| + t.string :driver + + t.timestamps + end + end +end diff --git a/db/migrate/20180403000134_add_trip_columns.rb b/db/migrate/20180403000134_add_trip_columns.rb new file mode 100644 index 000000000..c93854bf4 --- /dev/null +++ b/db/migrate/20180403000134_add_trip_columns.rb @@ -0,0 +1,9 @@ +class AddTripColumns < ActiveRecord::Migration[5.1] + def change + add_column :trips, :passenger_id, :integer + add_column :trips, :date, :Date + add_column :trips, :rating, :integer + add_column :trips, :cost, :float + + end +end diff --git a/test/fixtures/drivers.yml b/test/fixtures/drivers.yml new file mode 100644 index 000000000..022996d58 --- /dev/null +++ b/test/fixtures/drivers.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + vin: MyString + +two: + name: MyString + vin: MyString diff --git a/test/fixtures/passengers.yml b/test/fixtures/passengers.yml new file mode 100644 index 000000000..2c97eae02 --- /dev/null +++ b/test/fixtures/passengers.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + phone_num: MyString + +two: + name: MyString + phone_num: MyString diff --git a/test/fixtures/trips.yml b/test/fixtures/trips.yml new file mode 100644 index 000000000..fc376e38f --- /dev/null +++ b/test/fixtures/trips.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + driver: MyString + +two: + driver: MyString diff --git a/test/models/driver_test.rb b/test/models/driver_test.rb new file mode 100644 index 000000000..ce2501238 --- /dev/null +++ b/test/models/driver_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class DriverTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/passenger_test.rb b/test/models/passenger_test.rb new file mode 100644 index 000000000..8eea85496 --- /dev/null +++ b/test/models/passenger_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class PassengerTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/trip_test.rb b/test/models/trip_test.rb new file mode 100644 index 000000000..1ed8ca609 --- /dev/null +++ b/test/models/trip_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class TripTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From cc8ee487082b7dbecc138036725c1e38e3e0d521 Mon Sep 17 00:00:00 2001 From: Mariko Date: Mon, 2 Apr 2018 17:15:03 -0700 Subject: [PATCH 06/64] added routes --- config/routes.rb | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index ad4e3f9c2..db7f5d2d3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,17 +1,11 @@ Rails.application.routes.draw do - get 'rides/index' - - get 'rides/show' - - get 'rides/new' - - get 'rides/create' - - get 'rides/edit' - - get 'rides/update' - - get 'rides/destroy' - - # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + root 'trips#index' #defines homepage + + get '/trips' , to: 'trips#index', as: 'trips' + get '/trips/new', to: 'trips#new', as: 'new_trip' + post '/trips', to:'trips#create' + get '/trips/:id/edit', to: 'trips#edit', as: 'edit_trip' + get '/trips/:id', to: 'trips#show', as: 'trip' + patch '/trips/:id', to: 'trips#update' + delete '/trips/:id', to: 'trips#destroy' end From 5457e30a6da33af332ed749d4a5cb97805a6da89 Mon Sep 17 00:00:00 2001 From: Mariko Date: Mon, 2 Apr 2018 17:48:44 -0700 Subject: [PATCH 07/64] added methods new, create and edit --- app/controllers/rides_controller.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/controllers/rides_controller.rb b/app/controllers/rides_controller.rb index 627b45715..ad961881a 100644 --- a/app/controllers/rides_controller.rb +++ b/app/controllers/rides_controller.rb @@ -6,12 +6,20 @@ def show end def new + @trip = Trip.new end def create + trip = Trip.new(trip_params) + if trip.save + redirect_to trips_path + else + render :new + end end def edit + @trip = Trip.find_by(id: params[:id]) end def update @@ -19,4 +27,5 @@ def update def destroy end + end From ee4bd4a0902f18afcb16ce3d86b9f36960df393e Mon Sep 17 00:00:00 2001 From: Aruna Date: Mon, 2 Apr 2018 17:50:10 -0700 Subject: [PATCH 08/64] added index and show methods --- app/controllers/rides_controller.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/controllers/rides_controller.rb b/app/controllers/rides_controller.rb index 627b45715..02a91c8ff 100644 --- a/app/controllers/rides_controller.rb +++ b/app/controllers/rides_controller.rb @@ -1,11 +1,15 @@ class RidesController < ApplicationController def index + @trip = Trip.all end def show + id = params[:id] + @trip = Trip.find(id) end def new + end def create @@ -15,6 +19,16 @@ def edit end def update + @trip = Trip.find_by(id:params[:id]) + if !@trip.nil? + if @trip.update(trip_params) + redirect_to trip_path(@trip.id) + else + render :edit + end + else + redirect_to trips_path + end end def destroy From 7752536dbc170ce8b7db82a26bf6ac1dca1e165f Mon Sep 17 00:00:00 2001 From: Mariko Date: Mon, 2 Apr 2018 20:15:14 -0700 Subject: [PATCH 09/64] added methods destroy and private book_params --- app/controllers/rides_controller.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/controllers/rides_controller.rb b/app/controllers/rides_controller.rb index 364e000e2..a670536fe 100644 --- a/app/controllers/rides_controller.rb +++ b/app/controllers/rides_controller.rb @@ -39,6 +39,17 @@ def update end def destroy + id = params[:id] + @trip = Trip.find(id) + if @trip + @trip.destroy + end + redirect_to trips_path + end + +private + def trip_params + return params.require(:trip).permit(:passenger_id) end end From 802682573c6476877ec6d0ccee0dfc95f18317c3 Mon Sep 17 00:00:00 2001 From: Mariko Date: Mon, 2 Apr 2018 22:19:00 -0700 Subject: [PATCH 10/64] added index code --- app/views/rides/index.html.erb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/views/rides/index.html.erb b/app/views/rides/index.html.erb index 835a9aef9..2442dffc7 100644 --- a/app/views/rides/index.html.erb +++ b/app/views/rides/index.html.erb @@ -1,2 +1,10 @@ -

Rides#index

-

Find me in app/views/rides/index.html.erb

+

Rides

+
    + <% @trips.each do |trip| %> +
  • class="trips" + + <%= link_to trip.id, trip_path(trip.id) %> + +
  • + <% end %> +
From 226620408d5c784e29552ef455dfe69d05f50c3a Mon Sep 17 00:00:00 2001 From: Aruna Date: Tue, 3 Apr 2018 08:58:31 -0700 Subject: [PATCH 11/64] added show view --- app/views/rides/show.html.erb | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/views/rides/show.html.erb b/app/views/rides/show.html.erb index 87b5228d3..954be3646 100644 --- a/app/views/rides/show.html.erb +++ b/app/views/rides/show.html.erb @@ -1,2 +1,14 @@ -

Rides#show

-

Find me in app/views/rides/show.html.erb

+ +

Date:<%= @trip.date %>

+ +

Rating:<%= @trip.rating %>

+ +

Cost:<%= @trip.cost %>

+
    +
  • + <%= link_to "Edit", edit_trip_path %> +
  • +
  • + <%= link_to "Delete", trip_path(@trip.id), method: :delete%> +
  • + Date: Tue, 3 Apr 2018 11:14:15 -0700 Subject: [PATCH 12/64] updated routes, and controller --- app/controllers/rides_controller.rb | 2 +- app/views/rides/index.html.erb | 4 ++-- config/routes.rb | 10 ++-------- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/app/controllers/rides_controller.rb b/app/controllers/rides_controller.rb index a670536fe..230d04062 100644 --- a/app/controllers/rides_controller.rb +++ b/app/controllers/rides_controller.rb @@ -1,6 +1,6 @@ class RidesController < ApplicationController def index - @trip = Trip.all + @trips = Trip.all end def show diff --git a/app/views/rides/index.html.erb b/app/views/rides/index.html.erb index 2442dffc7..06c3d7f22 100644 --- a/app/views/rides/index.html.erb +++ b/app/views/rides/index.html.erb @@ -1,9 +1,9 @@

    Rides

      <% @trips.each do |trip| %> -
    • class="trips" +
    • - <%= link_to trip.id, trip_path(trip.id) %> + <%= link_to trip.date, trip_path(trip.id), class: 'date-link' %>
    • <% end %> diff --git a/config/routes.rb b/config/routes.rb index db7f5d2d3..e41ab88f4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,11 +1,5 @@ Rails.application.routes.draw do - root 'trips#index' #defines homepage - get '/trips' , to: 'trips#index', as: 'trips' - get '/trips/new', to: 'trips#new', as: 'new_trip' - post '/trips', to:'trips#create' - get '/trips/:id/edit', to: 'trips#edit', as: 'edit_trip' - get '/trips/:id', to: 'trips#show', as: 'trip' - patch '/trips/:id', to: 'trips#update' - delete '/trips/:id', to: 'trips#destroy' + resources :trips + # root 'trips#index' #defines homepage end From 625709c8bf4905e7b8f751273de73c6add12e458 Mon Sep 17 00:00:00 2001 From: Aruna Date: Tue, 3 Apr 2018 11:15:15 -0700 Subject: [PATCH 13/64] added code in layout --- app/views/layouts/application.html.erb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 353326840..20c3bcc40 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -9,6 +9,20 @@ + <%= yield %> From 945d33f5738d6bb45619f6d73834bf0e24ca14fc Mon Sep 17 00:00:00 2001 From: Mariko Date: Tue, 3 Apr 2018 11:24:51 -0700 Subject: [PATCH 14/64] updated from RidesController to Trips controller --- .../{rides_controller.rb => trips_controller.rb} | 2 +- app/views/layouts/application.html.erb | 15 +-------------- app/views/{rides => trips}/create.html.erb | 0 app/views/{rides => trips}/destroy.html.erb | 0 app/views/{rides => trips}/edit.html.erb | 0 app/views/{rides => trips}/index.html.erb | 0 app/views/{rides => trips}/new.html.erb | 0 app/views/{rides => trips}/show.html.erb | 0 app/views/{rides => trips}/update.html.erb | 0 9 files changed, 2 insertions(+), 15 deletions(-) rename app/controllers/{rides_controller.rb => trips_controller.rb} (94%) rename app/views/{rides => trips}/create.html.erb (100%) rename app/views/{rides => trips}/destroy.html.erb (100%) rename app/views/{rides => trips}/edit.html.erb (100%) rename app/views/{rides => trips}/index.html.erb (100%) rename app/views/{rides => trips}/new.html.erb (100%) rename app/views/{rides => trips}/show.html.erb (100%) rename app/views/{rides => trips}/update.html.erb (100%) diff --git a/app/controllers/rides_controller.rb b/app/controllers/trips_controller.rb similarity index 94% rename from app/controllers/rides_controller.rb rename to app/controllers/trips_controller.rb index 230d04062..eb5b3f228 100644 --- a/app/controllers/rides_controller.rb +++ b/app/controllers/trips_controller.rb @@ -1,4 +1,4 @@ -class RidesController < ApplicationController +class TripsController < ApplicationController def index @trips = Trip.all end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 20c3bcc40..0aa79dd01 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -9,20 +9,7 @@ - <%= yield %> + diff --git a/app/views/rides/create.html.erb b/app/views/trips/create.html.erb similarity index 100% rename from app/views/rides/create.html.erb rename to app/views/trips/create.html.erb diff --git a/app/views/rides/destroy.html.erb b/app/views/trips/destroy.html.erb similarity index 100% rename from app/views/rides/destroy.html.erb rename to app/views/trips/destroy.html.erb diff --git a/app/views/rides/edit.html.erb b/app/views/trips/edit.html.erb similarity index 100% rename from app/views/rides/edit.html.erb rename to app/views/trips/edit.html.erb diff --git a/app/views/rides/index.html.erb b/app/views/trips/index.html.erb similarity index 100% rename from app/views/rides/index.html.erb rename to app/views/trips/index.html.erb diff --git a/app/views/rides/new.html.erb b/app/views/trips/new.html.erb similarity index 100% rename from app/views/rides/new.html.erb rename to app/views/trips/new.html.erb diff --git a/app/views/rides/show.html.erb b/app/views/trips/show.html.erb similarity index 100% rename from app/views/rides/show.html.erb rename to app/views/trips/show.html.erb diff --git a/app/views/rides/update.html.erb b/app/views/trips/update.html.erb similarity index 100% rename from app/views/rides/update.html.erb rename to app/views/trips/update.html.erb From 24d8a4a123b772e9c12dc29a48b5536ed6327226 Mon Sep 17 00:00:00 2001 From: Aruna Date: Tue, 3 Apr 2018 11:32:58 -0700 Subject: [PATCH 15/64] created a passengers controller --- app/controllers/passengers_controller.rb | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 app/controllers/passengers_controller.rb diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb new file mode 100644 index 000000000..cc1b31183 --- /dev/null +++ b/app/controllers/passengers_controller.rb @@ -0,0 +1,22 @@ +class PassengersController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end From 55a3a45263085fb29e9e9aa2ad343616a4bf1c48 Mon Sep 17 00:00:00 2001 From: Mariko Date: Tue, 3 Apr 2018 11:32:58 -0700 Subject: [PATCH 16/64] created drivers controller and updated routes --- app/assets/javascripts/drivers.coffee | 3 ++ app/assets/stylesheets/drivers.scss | 3 ++ app/controllers/drivers_controller.rb | 22 ++++++++++++ app/helpers/drivers_helper.rb | 2 ++ app/views/drivers/create.html.erb | 2 ++ app/views/drivers/destroy.html.erb | 2 ++ app/views/drivers/edit.html.erb | 2 ++ app/views/drivers/index.html.erb | 2 ++ app/views/drivers/new.html.erb | 2 ++ app/views/drivers/show.html.erb | 2 ++ app/views/drivers/update.html.erb | 2 ++ config/routes.rb | 4 ++- test/controllers/drivers_controller_test.rb | 39 +++++++++++++++++++++ 13 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/drivers.coffee create mode 100644 app/assets/stylesheets/drivers.scss create mode 100644 app/controllers/drivers_controller.rb create mode 100644 app/helpers/drivers_helper.rb create mode 100644 app/views/drivers/create.html.erb create mode 100644 app/views/drivers/destroy.html.erb create mode 100644 app/views/drivers/edit.html.erb create mode 100644 app/views/drivers/index.html.erb create mode 100644 app/views/drivers/new.html.erb create mode 100644 app/views/drivers/show.html.erb create mode 100644 app/views/drivers/update.html.erb create mode 100644 test/controllers/drivers_controller_test.rb diff --git a/app/assets/javascripts/drivers.coffee b/app/assets/javascripts/drivers.coffee new file mode 100644 index 000000000..24f83d18b --- /dev/null +++ b/app/assets/javascripts/drivers.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/drivers.scss b/app/assets/stylesheets/drivers.scss new file mode 100644 index 000000000..8c1768a14 --- /dev/null +++ b/app/assets/stylesheets/drivers.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Drivers controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb new file mode 100644 index 000000000..f034601dd --- /dev/null +++ b/app/controllers/drivers_controller.rb @@ -0,0 +1,22 @@ +class DriversController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end +end diff --git a/app/helpers/drivers_helper.rb b/app/helpers/drivers_helper.rb new file mode 100644 index 000000000..e5fc532e4 --- /dev/null +++ b/app/helpers/drivers_helper.rb @@ -0,0 +1,2 @@ +module DriversHelper +end diff --git a/app/views/drivers/create.html.erb b/app/views/drivers/create.html.erb new file mode 100644 index 000000000..a3069c65c --- /dev/null +++ b/app/views/drivers/create.html.erb @@ -0,0 +1,2 @@ +

      Drivers#create

      +

      Find me in app/views/drivers/create.html.erb

      diff --git a/app/views/drivers/destroy.html.erb b/app/views/drivers/destroy.html.erb new file mode 100644 index 000000000..9955c57cf --- /dev/null +++ b/app/views/drivers/destroy.html.erb @@ -0,0 +1,2 @@ +

      Drivers#destroy

      +

      Find me in app/views/drivers/destroy.html.erb

      diff --git a/app/views/drivers/edit.html.erb b/app/views/drivers/edit.html.erb new file mode 100644 index 000000000..8e7dbd55b --- /dev/null +++ b/app/views/drivers/edit.html.erb @@ -0,0 +1,2 @@ +

      Drivers#edit

      +

      Find me in app/views/drivers/edit.html.erb

      diff --git a/app/views/drivers/index.html.erb b/app/views/drivers/index.html.erb new file mode 100644 index 000000000..5a278b7f7 --- /dev/null +++ b/app/views/drivers/index.html.erb @@ -0,0 +1,2 @@ +

      Drivers#index

      +

      Find me in app/views/drivers/index.html.erb

      diff --git a/app/views/drivers/new.html.erb b/app/views/drivers/new.html.erb new file mode 100644 index 000000000..e54f6c6db --- /dev/null +++ b/app/views/drivers/new.html.erb @@ -0,0 +1,2 @@ +

      Drivers#new

      +

      Find me in app/views/drivers/new.html.erb

      diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb new file mode 100644 index 000000000..3501cb73c --- /dev/null +++ b/app/views/drivers/show.html.erb @@ -0,0 +1,2 @@ +

      Drivers#show

      +

      Find me in app/views/drivers/show.html.erb

      diff --git a/app/views/drivers/update.html.erb b/app/views/drivers/update.html.erb new file mode 100644 index 000000000..83231c184 --- /dev/null +++ b/app/views/drivers/update.html.erb @@ -0,0 +1,2 @@ +

      Drivers#update

      +

      Find me in app/views/drivers/update.html.erb

      diff --git a/config/routes.rb b/config/routes.rb index e41ab88f4..da2f6ffe0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,7 @@ Rails.application.routes.draw do resources :trips - # root 'trips#index' #defines homepage + + resources :drivers + root 'trips#index' #defines homepage end diff --git a/test/controllers/drivers_controller_test.rb b/test/controllers/drivers_controller_test.rb new file mode 100644 index 000000000..822265f12 --- /dev/null +++ b/test/controllers/drivers_controller_test.rb @@ -0,0 +1,39 @@ +require 'test_helper' + +class DriversControllerTest < ActionDispatch::IntegrationTest + test "should get index" do + get drivers_index_url + assert_response :success + end + + test "should get show" do + get drivers_show_url + assert_response :success + end + + test "should get new" do + get drivers_new_url + assert_response :success + end + + test "should get create" do + get drivers_create_url + assert_response :success + end + + test "should get edit" do + get drivers_edit_url + assert_response :success + end + + test "should get update" do + get drivers_update_url + assert_response :success + end + + test "should get destroy" do + get drivers_destroy_url + assert_response :success + end + +end From 9367f2a09c20790446a8acdb968ae6cbfd36149c Mon Sep 17 00:00:00 2001 From: Aruna Date: Tue, 3 Apr 2018 11:34:08 -0700 Subject: [PATCH 17/64] created passengers controller --- app/assets/javascripts/passengers.coffee | 3 ++ app/assets/stylesheets/passengers.scss | 3 ++ app/helpers/passengers_helper.rb | 2 + app/views/passengers/create.html.erb | 2 + app/views/passengers/destroy.html.erb | 2 + app/views/passengers/edit.html.erb | 2 + app/views/passengers/index.html.erb | 2 + app/views/passengers/new.html.erb | 2 + app/views/passengers/show.html.erb | 2 + app/views/passengers/update.html.erb | 2 + config/routes.rb | 6 ++- .../controllers/passengers_controller_test.rb | 39 +++++++++++++++++++ 12 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/passengers.coffee create mode 100644 app/assets/stylesheets/passengers.scss create mode 100644 app/helpers/passengers_helper.rb create mode 100644 app/views/passengers/create.html.erb create mode 100644 app/views/passengers/destroy.html.erb create mode 100644 app/views/passengers/edit.html.erb create mode 100644 app/views/passengers/index.html.erb create mode 100644 app/views/passengers/new.html.erb create mode 100644 app/views/passengers/show.html.erb create mode 100644 app/views/passengers/update.html.erb create mode 100644 test/controllers/passengers_controller_test.rb diff --git a/app/assets/javascripts/passengers.coffee b/app/assets/javascripts/passengers.coffee new file mode 100644 index 000000000..24f83d18b --- /dev/null +++ b/app/assets/javascripts/passengers.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/passengers.scss b/app/assets/stylesheets/passengers.scss new file mode 100644 index 000000000..0e27942f7 --- /dev/null +++ b/app/assets/stylesheets/passengers.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Passengers controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/helpers/passengers_helper.rb b/app/helpers/passengers_helper.rb new file mode 100644 index 000000000..1af9e68f1 --- /dev/null +++ b/app/helpers/passengers_helper.rb @@ -0,0 +1,2 @@ +module PassengersHelper +end diff --git a/app/views/passengers/create.html.erb b/app/views/passengers/create.html.erb new file mode 100644 index 000000000..c57e678b6 --- /dev/null +++ b/app/views/passengers/create.html.erb @@ -0,0 +1,2 @@ +

      Passengers#create

      +

      Find me in app/views/passengers/create.html.erb

      diff --git a/app/views/passengers/destroy.html.erb b/app/views/passengers/destroy.html.erb new file mode 100644 index 000000000..bf98b9174 --- /dev/null +++ b/app/views/passengers/destroy.html.erb @@ -0,0 +1,2 @@ +

      Passengers#destroy

      +

      Find me in app/views/passengers/destroy.html.erb

      diff --git a/app/views/passengers/edit.html.erb b/app/views/passengers/edit.html.erb new file mode 100644 index 000000000..f6c655f9a --- /dev/null +++ b/app/views/passengers/edit.html.erb @@ -0,0 +1,2 @@ +

      Passengers#edit

      +

      Find me in app/views/passengers/edit.html.erb

      diff --git a/app/views/passengers/index.html.erb b/app/views/passengers/index.html.erb new file mode 100644 index 000000000..929c1adad --- /dev/null +++ b/app/views/passengers/index.html.erb @@ -0,0 +1,2 @@ +

      Passengers#index

      +

      Find me in app/views/passengers/index.html.erb

      diff --git a/app/views/passengers/new.html.erb b/app/views/passengers/new.html.erb new file mode 100644 index 000000000..42e868512 --- /dev/null +++ b/app/views/passengers/new.html.erb @@ -0,0 +1,2 @@ +

      Passengers#new

      +

      Find me in app/views/passengers/new.html.erb

      diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb new file mode 100644 index 000000000..59014cd3f --- /dev/null +++ b/app/views/passengers/show.html.erb @@ -0,0 +1,2 @@ +

      Passengers#show

      +

      Find me in app/views/passengers/show.html.erb

      diff --git a/app/views/passengers/update.html.erb b/app/views/passengers/update.html.erb new file mode 100644 index 000000000..e0e2698a1 --- /dev/null +++ b/app/views/passengers/update.html.erb @@ -0,0 +1,2 @@ +

      Passengers#update

      +

      Find me in app/views/passengers/update.html.erb

      diff --git a/config/routes.rb b/config/routes.rb index e41ab88f4..abc1ff12d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,9 @@ Rails.application.routes.draw do + + resources :trips - # root 'trips#index' #defines homepage + + resources :passengers + root 'trips#index' #defines homepage end diff --git a/test/controllers/passengers_controller_test.rb b/test/controllers/passengers_controller_test.rb new file mode 100644 index 000000000..b74b762d9 --- /dev/null +++ b/test/controllers/passengers_controller_test.rb @@ -0,0 +1,39 @@ +require 'test_helper' + +class PassengersControllerTest < ActionDispatch::IntegrationTest + test "should get index" do + get passengers_index_url + assert_response :success + end + + test "should get show" do + get passengers_show_url + assert_response :success + end + + test "should get new" do + get passengers_new_url + assert_response :success + end + + test "should get create" do + get passengers_create_url + assert_response :success + end + + test "should get edit" do + get passengers_edit_url + assert_response :success + end + + test "should get update" do + get passengers_update_url + assert_response :success + end + + test "should get destroy" do + get passengers_destroy_url + assert_response :success + end + +end From 0824978253fd92d877382108d2330a18e0114a10 Mon Sep 17 00:00:00 2001 From: Aruna Date: Tue, 3 Apr 2018 14:05:29 -0700 Subject: [PATCH 18/64] added application layout --- app/controllers/passengers_controller.rb | 34 ++++++++++++++++++++++++ app/controllers/trips_controller.rb | 2 +- app/views/layouts/application.html.erb | 9 +++++++ app/views/passengers/index.html.erb | 16 ++++++++++- config/routes.rb | 2 +- 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index cc1b31183..3e6af911e 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -1,22 +1,56 @@ class PassengersController < ApplicationController def index + @passengers = Passenger.all end def show + id = params[:id] + @passenger = Passenger.find(id) end def new + @passenger = Passenger.new end def create + passenger = Passenger.new(passenger_params) + if passenger.save + redirect_to passegers_path + else + render :new + end end def edit + @passenger = Passenger.find_by(id: params[:id]) end def update + @passenger = Passenger.find_by(id:params[:id]) + if !@passenger.nil? + if @passenger.update(passenger_params) + redirect_to passenger_path(@passenger.id) + else + render :edit + end + else + redirect_to passengers_path + end end def destroy + id = params[:id] + @passenger = Passenger.find(id) + if @passenger + @passenger.destroy + end + redirect_to passengers_path end + end + private + def passenger_params + return params.require(:passenger).permit(:passenger_id) + end + + end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index eb5b3f228..e36753881 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -49,7 +49,7 @@ def destroy private def trip_params - return params.require(:trip).permit(:passenger_id) + return params.require(:trip).permit(:trip_id) end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0aa79dd01..633afd2eb 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -9,6 +9,15 @@ +
      + +
      <%= yield %> diff --git a/app/views/passengers/index.html.erb b/app/views/passengers/index.html.erb index 929c1adad..38b7816d7 100644 --- a/app/views/passengers/index.html.erb +++ b/app/views/passengers/index.html.erb @@ -1,2 +1,16 @@

      Passengers#index

      -

      Find me in app/views/passengers/index.html.erb

      + +
        + <% @passengers.each do |passenger| %> +
      • + + <%= link_to passenger.name, passenger_path(passenger.id), class: 'name-link' %> + +
      • +
      • + + <%= link_to passenger.phone_num, passenger_path(passenger.id), class: 'phone_num-link' %> + +
      • + <% end %> +
      diff --git a/config/routes.rb b/config/routes.rb index 3ba550de2..0334ae33c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,6 +9,6 @@ resources :drivers - + root 'trips#index' #defines homepage end From f80cb9e53e004e52244a882bc8c3359d50f3a349 Mon Sep 17 00:00:00 2001 From: Mariko Date: Tue, 3 Apr 2018 14:06:33 -0700 Subject: [PATCH 19/64] added driver routes and index --- app/controllers/drivers_controller.rb | 34 +++++++++++++++++++++++++++ app/controllers/trips_controller.rb | 2 +- app/views/drivers/index.html.erb | 15 +++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb index f034601dd..0e616eaf4 100644 --- a/app/controllers/drivers_controller.rb +++ b/app/controllers/drivers_controller.rb @@ -1,22 +1,56 @@ class DriversController < ApplicationController def index + @drivers = Driver.all end def show + id = params[:id] + @driver = Driver.find(id) end def new + @driver = Driver.new end def create + driver = Driver.new(driver_params) + if driver.save + redirect_to drivers_path + else + render :new + end end def edit + @driver = Driver.find_by(id: params[:id]) end def update + @driver = Trip.find_by(id: params[:id]) + if !@driver.nil? + if @driver.update(driver_params) + redirect_to driver_path(@driver.id) + else + render :edit + end + else + redirect_to trips_path + end end def destroy + id = params[:id] + @driver = Driver.find(id) + if @driver + @driver.destroy + end + redirect_to drivers_path + end + +private + + def driver_params + return params.require(:driver).permit(:driver_id) + end end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index eb5b3f228..e36753881 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -49,7 +49,7 @@ def destroy private def trip_params - return params.require(:trip).permit(:passenger_id) + return params.require(:trip).permit(:trip_id) end end diff --git a/app/views/drivers/index.html.erb b/app/views/drivers/index.html.erb index 5a278b7f7..f2ba4da67 100644 --- a/app/views/drivers/index.html.erb +++ b/app/views/drivers/index.html.erb @@ -1,2 +1,15 @@

      Drivers#index

      -

      Find me in app/views/drivers/index.html.erb

      +
        + <% @drivers.each do |driver| %> +
      • + + <%= link_to driver.name, driver_path(driver.id), class: 'name-link' %> + +
      • +
      • + + <%= link_to driver.vin, driver_path(driver.id), class: 'vin-link' %> + +
      • + <% end %> +
      From db63232ad4f957222aba19081c340d12529851e5 Mon Sep 17 00:00:00 2001 From: Aruna Date: Tue, 3 Apr 2018 18:03:09 -0700 Subject: [PATCH 20/64] added passenger show page --- app/controllers/passengers_controller.rb | 15 +++---- app/models/driver.rb | 1 + app/models/passenger.rb | 1 + app/models/trip.rb | 2 + app/views/layouts/application.html.erb | 3 ++ app/views/passengers/_form.html.erb | 20 ++++++++++ app/views/passengers/edit.html.erb | 3 +- app/views/passengers/index.html.erb | 9 ++--- app/views/passengers/new.html.erb | 4 +- app/views/passengers/show.html.erb | 40 ++++++++++++++++++- app/views/trips/show.html.erb | 2 +- .../20180404003259_change_drivers_datatype.rb | 6 +++ db/migrate/20180404004120_add_references.rb | 10 +++++ db/schema.rb | 10 +++-- 14 files changed, 101 insertions(+), 25 deletions(-) create mode 100644 app/views/passengers/_form.html.erb create mode 100644 db/migrate/20180404003259_change_drivers_datatype.rb create mode 100644 db/migrate/20180404004120_add_references.rb diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index 3e6af911e..2e64b40cc 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -1,6 +1,6 @@ class PassengersController < ApplicationController def index - @passengers = Passenger.all + @passengers = Passenger.all end def show @@ -9,7 +9,7 @@ def show end def new - @passenger = Passenger.new + @passenger = Passenger.new end def create @@ -46,11 +46,8 @@ def destroy end redirect_to passengers_path end - end - private - def passenger_params - return params.require(:passenger).permit(:passenger_id) - end - - +end +private +def passenger_params + return params.require(:passenger).permit(:passenger_id) end diff --git a/app/models/driver.rb b/app/models/driver.rb index 1ff364562..197e65507 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -1,2 +1,3 @@ class Driver < ApplicationRecord + has_many :trips end diff --git a/app/models/passenger.rb b/app/models/passenger.rb index 2c5748ac2..2fef89192 100644 --- a/app/models/passenger.rb +++ b/app/models/passenger.rb @@ -1,2 +1,3 @@ class Passenger < ApplicationRecord + has_many :trips end diff --git a/app/models/trip.rb b/app/models/trip.rb index a8c077a10..3f761103a 100644 --- a/app/models/trip.rb +++ b/app/models/trip.rb @@ -1,2 +1,4 @@ class Trip < ApplicationRecord + belongs_to :passenger + belongs_to :driver end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 633afd2eb..9c5a5d302 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -15,6 +15,9 @@
    • RideshareRails
    • <%= link_to "Drivers", drivers_path %>
    • <%= link_to "Passengers", passengers_path %>
    • +
    • <%= link_to "Add a Driver", new_driver_path %> +
    • <%= link_to "Add a passenger", new_passenger_path %> +
    diff --git a/app/views/passengers/_form.html.erb b/app/views/passengers/_form.html.erb new file mode 100644 index 000000000..9077a3383 --- /dev/null +++ b/app/views/passengers/_form.html.erb @@ -0,0 +1,20 @@ +

    <%= page_title %>

    +<% if @passenger.errors.any? %> +
      + <% @passenger.errors.each do |field,message| %> +
    • + <%= field.capitalize %>: <%= message %> +
    • + <% end %> +
    +<%end%> + +<%= form_for @passenger do |f| %> +<%= f.label :name%> +<%= f.text_field :name %> +%= f.label :phone_num %> +<%= f.text_area :phone_num%> + +<%= f.submit %> + +<% end %> diff --git a/app/views/passengers/edit.html.erb b/app/views/passengers/edit.html.erb index f6c655f9a..7cd1dfb52 100644 --- a/app/views/passengers/edit.html.erb +++ b/app/views/passengers/edit.html.erb @@ -1,2 +1 @@ -

    Passengers#edit

    -

    Find me in app/views/passengers/edit.html.erb

    +<%= render partial: "form" ,locals: {page_title: "Edit a Trip"}%> diff --git a/app/views/passengers/index.html.erb b/app/views/passengers/index.html.erb index 38b7816d7..9481e9b53 100644 --- a/app/views/passengers/index.html.erb +++ b/app/views/passengers/index.html.erb @@ -1,16 +1,13 @@ -

    Passengers#index

    +
      <% @passengers.each do |passenger| %> +
    • <%= link_to passenger.name, passenger_path(passenger.id), class: 'name-link' %>
    • -
    • - - <%= link_to passenger.phone_num, passenger_path(passenger.id), class: 'phone_num-link' %> - -
    • + <% end %>
    diff --git a/app/views/passengers/new.html.erb b/app/views/passengers/new.html.erb index 42e868512..27944f177 100644 --- a/app/views/passengers/new.html.erb +++ b/app/views/passengers/new.html.erb @@ -1,2 +1,2 @@ -

    Passengers#new

    -

    Find me in app/views/passengers/new.html.erb

    + +<%= render partial: "form" ,locals: {page_title: "Add New Passenger"}%> diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index 59014cd3f..50b618961 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -1,2 +1,38 @@ -

    Passengers#show

    -

    Find me in app/views/passengers/show.html.erb

    +

    Name:<%= @passenger.name %>

    + +

    phone_num:<%= @passenger.phone_num %>

    + +

    Passengers Trips:

    + + + + + + + + + + + <% @passenger.trips.all.each do |trip| %> + + + + + + + + + <% end %> +
    IDDriversPassengerDateRatingCost
    <%=trip.id%><%=trip.driver_id%><%= trip.passenger_id %><%= trip.date %><%= trip.rating %><%=trip.cost%>
    + + + +
      +
    • + <%= link_to "Request ride" %> + <%= link_to "Edit", edit_passenger_path %> +
    • +
    • + <%= link_to "Delete", passenger_path(@passenger.id), method: :delete%> +
    • +
    diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index 954be3646..92ee3bff2 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -3,7 +3,7 @@

    Rating:<%= @trip.rating %>

    -

    Cost:<%= @trip.cost %>

    +

    Cost:<%= @trip.cost %>

    • <%= link_to "Edit", edit_trip_path %> diff --git a/db/migrate/20180404003259_change_drivers_datatype.rb b/db/migrate/20180404003259_change_drivers_datatype.rb new file mode 100644 index 000000000..d4e04bac3 --- /dev/null +++ b/db/migrate/20180404003259_change_drivers_datatype.rb @@ -0,0 +1,6 @@ +class ChangeDriversDatatype < ActiveRecord::Migration[5.1] + def change + remove_column :trips, :driver, :string + add_column :trips, :driver_id, :integer + end +end diff --git a/db/migrate/20180404004120_add_references.rb b/db/migrate/20180404004120_add_references.rb new file mode 100644 index 000000000..f0e1c727d --- /dev/null +++ b/db/migrate/20180404004120_add_references.rb @@ -0,0 +1,10 @@ +class AddReferences < ActiveRecord::Migration[5.1] + def change + remove_column :trips, :driver_id + remove_column :trips, :passenger_id + add_reference :trips, :driver,foreign_key: true + add_reference :trips, :passenger,foreign_key: true + + + end +end diff --git a/db/schema.rb b/db/schema.rb index 3b604c466..5aee04d94 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180403000134) do +ActiveRecord::Schema.define(version: 20180404004120) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -30,13 +30,17 @@ end create_table "trips", force: :cascade do |t| - t.string "driver" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.integer "passenger_id" t.date "date" t.integer "rating" t.float "cost" + t.bigint "driver_id" + t.bigint "passenger_id" + t.index ["driver_id"], name: "index_trips_on_driver_id" + t.index ["passenger_id"], name: "index_trips_on_passenger_id" end + add_foreign_key "trips", "drivers" + add_foreign_key "trips", "passengers" end From 2097b93c1e2bb79e3f5b71104f7036f7ad67a4d3 Mon Sep 17 00:00:00 2001 From: Aruna Date: Tue, 3 Apr 2018 18:18:13 -0700 Subject: [PATCH 21/64] updated form view --- app/views/passengers/_form.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/passengers/_form.html.erb b/app/views/passengers/_form.html.erb index 9077a3383..ebb76137e 100644 --- a/app/views/passengers/_form.html.erb +++ b/app/views/passengers/_form.html.erb @@ -12,7 +12,7 @@ <%= form_for @passenger do |f| %> <%= f.label :name%> <%= f.text_field :name %> -%= f.label :phone_num %> +<%= f.label :phone_num %> <%= f.text_area :phone_num%> <%= f.submit %> From cb73dcbc5ee750f9db9fff41e243925b2779cfe1 Mon Sep 17 00:00:00 2001 From: Aruna Date: Tue, 3 Apr 2018 20:39:20 -0700 Subject: [PATCH 22/64] migration for add references --- app/views/passengers/show.html.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index 50b618961..7503e863b 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -3,7 +3,6 @@

      phone_num:<%= @passenger.phone_num %>

      Passengers Trips:

      - @@ -13,7 +12,9 @@ + <% @passenger.trips.all.each do |trip| %> + From 4b7aba3b29423107a1b2db184c66323a2999b33a Mon Sep 17 00:00:00 2001 From: Mariko Date: Tue, 3 Apr 2018 21:58:37 -0700 Subject: [PATCH 23/64] updated for driver: show, model, index --- app/controllers/passengers_controller.rb | 2 +- app/models/driver.rb | 1 + app/models/trip.rb | 2 ++ app/views/drivers/index.html.erb | 7 +------ app/views/drivers/show.html.erb | 24 ++++++++++++++++++++++-- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index 3e6af911e..953da69c7 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -46,7 +46,7 @@ def destroy end redirect_to passengers_path end - end + private def passenger_params return params.require(:passenger).permit(:passenger_id) diff --git a/app/models/driver.rb b/app/models/driver.rb index 1ff364562..197e65507 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -1,2 +1,3 @@ class Driver < ApplicationRecord + has_many :trips end diff --git a/app/models/trip.rb b/app/models/trip.rb index a8c077a10..8e2566cd8 100644 --- a/app/models/trip.rb +++ b/app/models/trip.rb @@ -1,2 +1,4 @@ class Trip < ApplicationRecord + belongs_to :driver + belongs_to :passenger end diff --git a/app/views/drivers/index.html.erb b/app/views/drivers/index.html.erb index f2ba4da67..6d1baf48d 100644 --- a/app/views/drivers/index.html.erb +++ b/app/views/drivers/index.html.erb @@ -1,4 +1,4 @@ -

      Drivers#index

      +

      Drivers

        <% @drivers.each do |driver| %>
      • @@ -6,10 +6,5 @@ <%= link_to driver.name, driver_path(driver.id), class: 'name-link' %>
      • -
      • - - <%= link_to driver.vin, driver_path(driver.id), class: 'vin-link' %> - -
      • <% end %>
      diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index 3501cb73c..4f65d4066 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -1,2 +1,22 @@ -

      Drivers#show

      -

      Find me in app/views/drivers/show.html.erb

      +

      <%= @driver.name %>

      + +Driver profile picture + +

      + <%= "Average Rating: #{}"%> +

      + +

      + <%= "Total Earnings: #{}"%> +

      + +

      Driver Trips

      + +
        +
      • + <%= link_to "Edit", edit_driver_path %> +
      • +
      • + <%= link_to "Delete", trip_path(@driver.id), method: :delete %> +
      • +
      From 406baa305e5667a99b3d40a3e5bf3187cc0360ec Mon Sep 17 00:00:00 2001 From: Mariko Date: Tue, 3 Apr 2018 22:47:13 -0700 Subject: [PATCH 24/64] added table to driver show --- app/views/drivers/show.html.erb | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index 4f65d4066..93a2abcb3 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -10,13 +10,27 @@ <%= "Total Earnings: #{}"%>

      -

      Driver Trips

      +

      Driver Trips

      +
      IDRating Cost
      <%=trip.id%> <%=trip.driver_id%>
      + + + + + + + + + -
        -
      • - <%= link_to "Edit", edit_driver_path %> -
      • -
      • - <%= link_to "Delete", trip_path(@driver.id), method: :delete %> -
      • -
      + <% @driver.trips.all.each do |trip| %> + + + + + + + + + + <% end %> +
      IDPassengerDateRatingCostEditDelete
      <%=trip.id%><%= trip.passenger_id %><%= trip.date %><%= trip.rating %><%=trip.cost%><%= link_to "Edit", edit_driver_path %><%= link_to "Delete", trip_path(@driver.id), method: :delete %>
      From 3e837d776241e20d69996b304bfd025f72347fe5 Mon Sep 17 00:00:00 2001 From: Mariko Date: Tue, 3 Apr 2018 23:13:59 -0700 Subject: [PATCH 25/64] created partial for edit and new --- app/views/drivers/_form.html.erb | 20 ++++++++++++++++++++ app/views/drivers/edit.html.erb | 3 +-- app/views/drivers/new.html.erb | 3 +-- 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 app/views/drivers/_form.html.erb diff --git a/app/views/drivers/_form.html.erb b/app/views/drivers/_form.html.erb new file mode 100644 index 000000000..f8d5a4a97 --- /dev/null +++ b/app/views/drivers/_form.html.erb @@ -0,0 +1,20 @@ +

      <%= page_title %>

      +<% if @driver.errors.any? %> +
        + <% @driver.errors.each do |field,message| %> +
      • + <%= field.capitalize %>: <%= message %> +
      • + <% end %> +
      +<%end%> + +<%= form_for @driver do |f| %> +<%= f.label :name%> +<%= f.text_field :name %> +<%= f.label :vin %> +<%= f.text_area :vin %> + +<%= f.submit %> + +<% end %> diff --git a/app/views/drivers/edit.html.erb b/app/views/drivers/edit.html.erb index 8e7dbd55b..7cd1dfb52 100644 --- a/app/views/drivers/edit.html.erb +++ b/app/views/drivers/edit.html.erb @@ -1,2 +1 @@ -

      Drivers#edit

      -

      Find me in app/views/drivers/edit.html.erb

      +<%= render partial: "form" ,locals: {page_title: "Edit a Trip"}%> diff --git a/app/views/drivers/new.html.erb b/app/views/drivers/new.html.erb index e54f6c6db..44eb27f6a 100644 --- a/app/views/drivers/new.html.erb +++ b/app/views/drivers/new.html.erb @@ -1,2 +1 @@ -

      Drivers#new

      -

      Find me in app/views/drivers/new.html.erb

      +<%= render partial: "form" ,locals: {page_title: "Add New Driver"}%> From 4fa1178472140762420e28f8d8aa29dcacfbda64 Mon Sep 17 00:00:00 2001 From: Mariko Date: Wed, 4 Apr 2018 00:51:06 -0700 Subject: [PATCH 26/64] added rating and earning cacluations --- app/views/drivers/show.html.erb | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index 93a2abcb3..57c16e2fb 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -2,12 +2,22 @@ Driver profile picture +<% total_ratings = 0%> +<% number_of_trips = 0%> +<% total_earnings = 0%> + +<% @driver.trips.all.each do |trip| %> + <% total_ratings += trip.rating %> + <% number_of_trips += 1 %> + <% total_earnings += trip.cost %> +<% end %> +

      - <%= "Average Rating: #{}"%> + <%= "Average Rating: #{(number_of_trips == 0 ? 0 : total_ratings/number_of_trips)}"%>

      - <%= "Total Earnings: #{}"%> + <%= "Total Earnings: $#{(total_earnings/100)}"%>

      Driver Trips

      @@ -28,7 +38,7 @@ <%= trip.passenger_id %> <%= trip.date %> <%= trip.rating %> - <%=trip.cost%> + <%="$#{(trip.cost/100)}"%> <%= link_to "Edit", edit_driver_path %> <%= link_to "Delete", trip_path(@driver.id), method: :delete %> From daef810b536fa3e7a3b6864d33ed874a7e76aceb Mon Sep 17 00:00:00 2001 From: Aruna Date: Wed, 4 Apr 2018 08:07:21 -0700 Subject: [PATCH 27/64] added total_cost method in passenger model --- app/controllers/drivers_controller.rb | 2 ++ app/controllers/passengers_controller.rb | 4 ++-- app/controllers/trips_controller.rb | 3 ++- app/models/passenger.rb | 26 ++++++++++++++++++++++++ app/views/passengers/show.html.erb | 2 +- config/routes.rb | 3 ++- 6 files changed, 35 insertions(+), 5 deletions(-) diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb index 0e616eaf4..f7eb6a290 100644 --- a/app/controllers/drivers_controller.rb +++ b/app/controllers/drivers_controller.rb @@ -53,4 +53,6 @@ def driver_params return params.require(:driver).permit(:driver_id) end + + end diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index 2e64b40cc..3ba3f1360 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -13,7 +13,7 @@ def new end def create - passenger = Passenger.new(passenger_params) + passenger = Passenger.new(name: params[:passenger][:name],phone: params[:passenger][:phone_num]) if passenger.save redirect_to passegers_path else @@ -49,5 +49,5 @@ def destroy end private def passenger_params - return params.require(:passenger).permit(:passenger_id) + return params.require(:passenger).permit(:name,:phone_num) end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index e36753881..f64d454a8 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -13,7 +13,8 @@ def new end def create - trip = Trip.new(trip_params) + trip = Trip.new(passenger:passenger_id, driver: Driver.ids.sample, cost:rand(100..15000), rating: 0, date: Date.today) + if trip.save redirect_to trips_path else diff --git a/app/models/passenger.rb b/app/models/passenger.rb index 2fef89192..f47e87866 100644 --- a/app/models/passenger.rb +++ b/app/models/passenger.rb @@ -1,3 +1,29 @@ class Passenger < ApplicationRecord has_many :trips + validates :name, presence: true + validates :phone, presence: true + + def total_cost + #if loop for new riders with no trips, think about proper exception handling instead of returning nil + if @trips.count > 0 + total = @trips.map {|trip| trip.cost}.reduce(:+) / 100.0 + return '%.02f' % total + else + return nil + end + end + + + # def start_trip + # # if Driver.available.count < 1 + # # return false + # # elsedef find_driver_ids + # + # + # new_trip = Trip.new(passenger:self, driver: Driver.ids.sample, cost:rand(100..15000), rating: 0, date: Date.today) + # + # trips << new_trip + # + # return new_trip + # end end diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index 7503e863b..c228fd363 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -30,7 +30,7 @@
      • - <%= link_to "Request ride" %> + <%= link_to "Request ride", new_trip_path, method: :post, data: {confirm: "Do u need a ride?"}%>%> <%= link_to "Edit", edit_passenger_path %>
      • diff --git a/config/routes.rb b/config/routes.rb index 0334ae33c..dbe43054e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,6 +9,7 @@ resources :drivers - + + root 'trips#index' #defines homepage end From ac5ad1f74dafa6b933df477115f5a1a39f6607ce Mon Sep 17 00:00:00 2001 From: Mariko Date: Wed, 4 Apr 2018 14:14:10 -0700 Subject: [PATCH 28/64] added class method for random driver to driver controller --- app/models/driver.rb | 30 ++++++++++++++++++++++++++++++ app/views/drivers/show.html.erb | 14 ++------------ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/app/models/driver.rb b/app/models/driver.rb index 197e65507..18c07c551 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -1,3 +1,33 @@ class Driver < ApplicationRecord has_many :trips + + def self.driver_rating + total_ratings = 0 + number_of_trips = 0 + + Driver.trips.all.each do |trip| + total_ratings += trip.rating + number_of_trips += 1 + end + + average_rating = (number_of_trips == 0 ? 0 : total_ratings/number_of_trips) + return average_rating + end + + def self.driver_earnings + total_earnings = 0 + + Driver.trips.all.each do |trip| + total_earnings += trip.cost + end + + total_earnings = total_earnings/100 + + return total_earnings + end + + def self.random_driver + return Driver.all.sample + end + end diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index 57c16e2fb..fdbb00a9e 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -2,22 +2,12 @@ Driver profile picture -<% total_ratings = 0%> -<% number_of_trips = 0%> -<% total_earnings = 0%> - -<% @driver.trips.all.each do |trip| %> - <% total_ratings += trip.rating %> - <% number_of_trips += 1 %> - <% total_earnings += trip.cost %> -<% end %> -

        - <%= "Average Rating: #{(number_of_trips == 0 ? 0 : total_ratings/number_of_trips)}"%> + <%= "Average Rating: #{Driver.driver_rating}"%>

        - <%= "Total Earnings: $#{(total_earnings/100)}"%> + <%= "Total Earnings: $#{Driver.driver_earnings}"%>

        Driver Trips

        From f1002a5f9c8e3723853b16775d53421443df5332 Mon Sep 17 00:00:00 2001 From: Aruna Date: Wed, 4 Apr 2018 14:14:56 -0700 Subject: [PATCH 29/64] working on adding a new trip --- .../stylesheets/{rides.scss => trips.scss} | 0 app/controllers/passengers_controller.rb | 8 +------- app/controllers/trips_controller.rb | 5 +++-- app/models/passenger.rb | 17 ++++++++--------- app/views/passengers/show.html.erb | 6 ++++-- config/routes.rb | 6 ++++-- 6 files changed, 20 insertions(+), 22 deletions(-) rename app/assets/stylesheets/{rides.scss => trips.scss} (100%) diff --git a/app/assets/stylesheets/rides.scss b/app/assets/stylesheets/trips.scss similarity index 100% rename from app/assets/stylesheets/rides.scss rename to app/assets/stylesheets/trips.scss diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index 858b6baa0..0e053385a 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -47,14 +47,8 @@ def destroy redirect_to passengers_path end - private - def passenger_params - return params.require(:passenger).permit(:passenger_id) - end - - - end + private def passenger_params return params.require(:passenger).permit(:name,:phone_num) diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index f64d454a8..9633315c6 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -13,8 +13,9 @@ def new end def create - trip = Trip.new(passenger:passenger_id, driver: Driver.ids.sample, cost:rand(100..15000), rating: 0, date: Date.today) - + trip = Trip.new(passenger: params[:passenger_id], driver:random_driver, + cost:rand(100..15000), rating: 0, date: Date.today) + if trip.save redirect_to trips_path else diff --git a/app/models/passenger.rb b/app/models/passenger.rb index f47e87866..8eab9c6b8 100644 --- a/app/models/passenger.rb +++ b/app/models/passenger.rb @@ -3,15 +3,14 @@ class Passenger < ApplicationRecord validates :name, presence: true validates :phone, presence: true - def total_cost - #if loop for new riders with no trips, think about proper exception handling instead of returning nil - if @trips.count > 0 - total = @trips.map {|trip| trip.cost}.reduce(:+) / 100.0 - return '%.02f' % total - else - return nil - end - end + # def total_cost + # count = 0 + # #if loop for new riders with no trips, think about proper exception handling instead of returning nil + # + # total = @trips.map {|trip| trip.cost}.reduce(:+) / 100.0 + # return '%.02f' % total + # + # end # def start_trip diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index c228fd363..782adf659 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -2,6 +2,8 @@

        phone_num:<%= @passenger.phone_num %>

        +

    +

    Passengers Trips:

    @@ -30,10 +32,10 @@
    • - <%= link_to "Request ride", new_trip_path, method: :post, data: {confirm: "Do u need a ride?"}%>%> + <%= link_to "Request ride", new_trip_passenger_path(:passenger=>@passenger.id), method: :post, data: {confirm: "Do u need a ride?"} %> <%= link_to "Edit", edit_passenger_path %>
    • - <%= link_to "Delete", passenger_path(@passenger.id), method: :delete%> + <%= link_to "Delete", passenger_path(@passenger.id), method: :delete %>
    diff --git a/config/routes.rb b/config/routes.rb index dbe43054e..5daa4e734 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,14 +2,16 @@ - resources :trips + resources :trips do + resources :passengers + end resources :passengers resources :drivers - + root 'trips#index' #defines homepage end From 0fbded8a20bd5f7134d59bbf7814341618fb6007 Mon Sep 17 00:00:00 2001 From: Aruna Date: Wed, 4 Apr 2018 15:05:31 -0700 Subject: [PATCH 30/64] created nested routes --- config/routes.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 5daa4e734..48fec4954 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,11 +2,11 @@ - resources :trips do - resources :passengers + resources :passengers do + resources :trips, only:[:index,:new,:create] end - + resources :trips resources :passengers From c41639a7771b6deaf5bb80b51faaac70cafd0c02 Mon Sep 17 00:00:00 2001 From: Aruna Date: Wed, 4 Apr 2018 15:06:38 -0700 Subject: [PATCH 31/64] fixed path for adding request trip --- app/views/passengers/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index 782adf659..679b88f54 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -32,7 +32,7 @@
    • - <%= link_to "Request ride", new_trip_passenger_path(:passenger=>@passenger.id), method: :post, data: {confirm: "Do u need a ride?"} %> + <%= link_to "Request ride", new_passenger_trip_path(params[:id]), method: :get, data: {confirm: "Do u need a ride?"} %> <%= link_to "Edit", edit_passenger_path %>
    • From eb32115ffd7d08b2b686d601afbf39b4a495cbae Mon Sep 17 00:00:00 2001 From: Aruna Date: Wed, 4 Apr 2018 15:07:13 -0700 Subject: [PATCH 32/64] updated create method for adding new trip --- app/controllers/trips_controller.rb | 65 +++++++++++++++++------------ 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index 9633315c6..f93a325f9 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -13,45 +13,56 @@ def new end def create - trip = Trip.new(passenger: params[:passenger_id], driver:random_driver, - cost:rand(100..15000), rating: 0, date: Date.today) + if params[:passenger_id] + # This is the nested route, /author/:author_id/books/new + passenger = Passenger.find_by(id: passenger_id) + driver = Driver.random_driver + cost = rand(10..500) + rating = 0 + @trips = passenger.trip.new - if trip.save - redirect_to trips_path else - render :new + # This is the 'regular' route, /books/new + # @trips = trip.new end - end - def edit - @trip = Trip.find_by(id: params[:id]) + trip = Trip.new + if trip.save + redirect_to trips_path + else + render :new end +end - def update - @trip = Trip.find_by(id:params[:id]) - if !@trip.nil? - if @trip.update(trip_params) - redirect_to trip_path(@trip.id) - else - render :edit - end +def edit + @trip = Trip.find_by(id: params[:id]) +end + +def update + @trip = Trip.find_by(id:params[:id]) + if !@trip.nil? + if @trip.update(trip_params) + redirect_to trip_path(@trip.id) else - redirect_to trips_path + render :edit end + else + redirect_to trips_path end +end - def destroy - id = params[:id] - @trip = Trip.find(id) - if @trip - @trip.destroy - end - redirect_to trips_path +def destroy + id = params[:id] + @trip = Trip.find(id) + if @trip + @trip.destroy end + redirect_to trips_path +end private - def trip_params - return params.require(:trip).permit(:trip_id) - end +def trip_params + return params.require(:trip).permit(:trip_id) +end end From 5d5147b1f2f80c4ebd3dfec7b3de37452f26bbae Mon Sep 17 00:00:00 2001 From: Mariko Date: Wed, 4 Apr 2018 15:55:24 -0700 Subject: [PATCH 33/64] Changed driver calculations from view to model --- app/models/driver.rb | 18 +++++++++++------- app/views/drivers/show.html.erb | 4 ++-- app/views/trips/show.html.erb | 1 + 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/app/models/driver.rb b/app/models/driver.rb index 18c07c551..0f6a6828f 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -1,24 +1,28 @@ class Driver < ApplicationRecord has_many :trips - def self.driver_rating + def driver_rating total_ratings = 0 number_of_trips = 0 - Driver.trips.all.each do |trip| - total_ratings += trip.rating - number_of_trips += 1 + self.trips.each do |trip| + if trip.rating != nil + total_ratings += trip.rating + number_of_trips += 1 + end end average_rating = (number_of_trips == 0 ? 0 : total_ratings/number_of_trips) return average_rating end - def self.driver_earnings + def driver_earnings total_earnings = 0 - Driver.trips.all.each do |trip| - total_earnings += trip.cost + self.trips.each do |trip| + if trip.rating != nil + total_earnings += trip.cost + end end total_earnings = total_earnings/100 diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index fdbb00a9e..fe53cd1a0 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -3,11 +3,11 @@ Driver profile picture

      - <%= "Average Rating: #{Driver.driver_rating}"%> + <%= "Average Rating: #{@driver.driver_rating}"%>

      - <%= "Total Earnings: $#{Driver.driver_earnings}"%> + <%= "Total Earnings: $#{@driver.driver_earnings}"%>

      Driver Trips

      diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index 92ee3bff2..24d906eef 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -4,6 +4,7 @@

      Rating:<%= @trip.rating %>

      Cost:<%= @trip.cost %>

      +
      • <%= link_to "Edit", edit_trip_path %> From 82adf8fa773bacad62ff36fc6fe06ffa332ac056 Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 00:31:29 -0700 Subject: [PATCH 34/64] added forms view --- app/views/passengers/_form.html.erb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/views/passengers/_form.html.erb b/app/views/passengers/_form.html.erb index ebb76137e..491bc03a0 100644 --- a/app/views/passengers/_form.html.erb +++ b/app/views/passengers/_form.html.erb @@ -1,4 +1,4 @@ -

        <%= page_title %>

        + <% if @passenger.errors.any? %>
          <% @passenger.errors.each do |field,message| %> @@ -11,9 +11,13 @@ <%= form_for @passenger do |f| %> <%= f.label :name%> +
          <%= f.text_field :name %> +
          <%= f.label :phone_num %> +
          <%= f.text_area :phone_num%> +
          <%= f.submit %> From b331210e34597560c68c787ca964df4003c12518 Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 00:32:07 -0700 Subject: [PATCH 35/64] partials for edit view --- app/views/passengers/edit.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/passengers/edit.html.erb b/app/views/passengers/edit.html.erb index 7cd1dfb52..a135b4e3c 100644 --- a/app/views/passengers/edit.html.erb +++ b/app/views/passengers/edit.html.erb @@ -1 +1 @@ -<%= render partial: "form" ,locals: {page_title: "Edit a Trip"}%> +<%= render partial: "form" ,locals: {button_name: "Edit Passenger"}%> From 2ac74f30285ca3dc8aab4e7977702e2b682978ec Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 00:32:40 -0700 Subject: [PATCH 36/64] added index.html --- app/views/passengers/index.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/passengers/index.html.erb b/app/views/passengers/index.html.erb index 9481e9b53..cad801d23 100644 --- a/app/views/passengers/index.html.erb +++ b/app/views/passengers/index.html.erb @@ -1,8 +1,8 @@ - +

          All Passengers List

            <% @passengers.each do |passenger| %> - +
          • <%= link_to passenger.name, passenger_path(passenger.id), class: 'name-link' %> From a80826095b1993e292194817c63773e6689c59ad Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 00:33:13 -0700 Subject: [PATCH 37/64] updated show method --- app/views/passengers/show.html.erb | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index 679b88f54..aadf2e1f7 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -1,6 +1,7 @@

            Name:<%= @passenger.name %>

            -

            phone_num:<%= @passenger.phone_num %>

            +

            phone_num:<%= @passenger.phone_num %>

            +

            total_cost:<%= @passenger.total_cost %>

      @@ -8,15 +9,17 @@
    - + + + <% @passenger.trips.all.each do |trip| %> - + @@ -24,17 +27,22 @@ - - <% end %> + + + + <% end %> + +
    IDDriversDriver Passenger Date Rating CostEditDelete
    <%=trip.id%> <%=trip.driver_id%><%= trip.date %> <%= trip.rating %> <%=trip.cost%>
    <%= link_to "Edit",edit_trip_path(trip.id)%><%= link_to "Details",trip_path(trip.id) %>
    • - <%= link_to "Request ride", new_passenger_trip_path(params[:id]), method: :get, data: {confirm: "Do u need a ride?"} %> - <%= link_to "Edit", edit_passenger_path %> -
    • + <%= link_to "Request ride", passenger_trips_path(params[:id]), method: :post %> +
    • <%= link_to "Edit", edit_passenger_path %>
    • + +
    • <%= link_to "Delete", passenger_path(@passenger.id), method: :delete %>
    • From 188225a2a87fe506f19496804568ebfc8a5d7d29 Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 00:34:03 -0700 Subject: [PATCH 38/64] show view for trips --- app/views/trips/show.html.erb | 49 +++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index 24d906eef..6690da90b 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -1,15 +1,42 @@ -

      Date:<%= @trip.date %>

      -

      Rating:<%= @trip.rating %>

      +

      Here are the Trip details

      + + + + + + + + + -
        -
      • - <%= link_to "Edit", edit_trip_path %> -
      • -
      • - <%= link_to "Delete", trip_path(@trip.id), method: :delete%> -
      • - +
      + + + + <% if @trip.passenger_id == nil || @trip.passenger_id == 0 %> + + <% else %> + + <%end %> + + + + + +
      Trip ID:Driver:PassengerDate:Rating:Cost:
      <%= @trip.id %><%= Driver.random_driver.name %> Passenger ID does not exist <%= link_to @trip.passenger_id, passenger_path(@trip.passenger_id) %><%= @trip.date %><%= @trip.rating %><%= Driver.cost %>
      + + + <%= link_to "edit", edit_trip_path %> + <%= link_to "delete", + trip_path(@trip), + method: :delete, + data: { confirm: 'Are you sure?' } %> From 044ff2ca7f3b36c273ad5beb66c51db18b7c8c00 Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 00:35:29 -0700 Subject: [PATCH 39/64] added some styles --- app/assets/stylesheets/application.css | 33 ++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index d05ea0f51..e555e3ee8 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -13,3 +13,36 @@ *= require_tree . *= require_self */ + table, td, th { + border: 1px solid black; +} +table { + border-collapse: collapse; + width: 100%; +} +td { + text-align: center; +} +th { + height: 50px; +} +nav { + background-color: rgba(215, 190, 217, 0.64); + height: 100px; + color: rgb(81, 18, 84); +} +/* Passenger and Driver index page styles */ +ul { + width: 40em; +} +li { + float: left; + width: 13em; +} +a { + text-decoration: none; +} + +h2{ + text-align: center; +} From cd0cae0f2829de4aded19bd4f70d9ef70f2f621a Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 00:36:14 -0700 Subject: [PATCH 40/64] made changes to application.html --- app/views/layouts/application.html.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 9c5a5d302..f2a6af83d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -17,6 +17,7 @@
    • <%= link_to "Passengers", passengers_path %>
    • <%= link_to "Add a Driver", new_driver_path %>
    • <%= link_to "Add a passenger", new_passenger_path %> +
    • <%= link_to "All Trips", trips_path %>
    From 52df1b3d74cc15b41ad786c9535b0ab6d0f6ae4b Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 00:37:39 -0700 Subject: [PATCH 41/64] still need to fix the show page for new trip --- app/controllers/passengers_controller.rb | 9 +++-- app/controllers/trips_controller.rb | 49 ++++++++++++------------ app/models/driver.rb | 4 ++ app/models/passenger.rb | 34 +++++++--------- app/models/trip.rb | 1 + app/views/trips/_form.html.erb | 31 +++++++++++++++ app/views/trips/edit.html.erb | 3 +- app/views/trips/index.html.erb | 31 ++++++++++----- config/routes.rb | 3 +- 9 files changed, 103 insertions(+), 62 deletions(-) create mode 100644 app/views/trips/_form.html.erb diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index 0e053385a..7c4d6203a 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -1,11 +1,12 @@ class PassengersController < ApplicationController def index - @passengers = Passenger.all + @passengers = Passenger.all.order(:name) end def show id = params[:id] @passenger = Passenger.find(id) + @trips = Trip.where(passenger_id: params[:id]) end def new @@ -13,8 +14,8 @@ def new end def create - passenger = Passenger.new(name: params[:passenger][:name],phone: params[:passenger][:phone_num]) - if passenger.save + @passenger = Passenger.new(passenger_params) + if @passenger.save redirect_to passegers_path else render :new @@ -51,5 +52,5 @@ def destroy private def passenger_params - return params.require(:passenger).permit(:name,:phone_num) + return params.require(:passenger).permit(:name, :phone_num) end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index f93a325f9..5979ae444 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -10,45 +10,45 @@ def show def new @trip = Trip.new + @trip.passenger_id = params[:passenger_id] end def create - if params[:passenger_id] - # This is the nested route, /author/:author_id/books/new - passenger = Passenger.find_by(id: passenger_id) - driver = Driver.random_driver + + passenger_id = Passenger.find_by(id: params[:passenger_id]) + driver_id = Driver.random_driver cost = rand(10..500) + date=Date.today rating = 0 - @trips = passenger.trip.new - - else - # This is the 'regular' route, /books/new - # @trips = trip.new - end - - trip = Trip.new - if trip.save - redirect_to trips_path + @trip = Trip.new(trip_params) + if @trip.save + redirect_to passenger_path(@trip.passenger_id) else - render :new + render :show end end +def show + id = params[:id] + @trip = Trip.find(id) +end + def edit @trip = Trip.find_by(id: params[:id]) end def update - @trip = Trip.find_by(id:params[:id]) - if !@trip.nil? - if @trip.update(trip_params) - redirect_to trip_path(@trip.id) + trip_updates = params[:trip] + @trip = Trip.find(params[:id]) + + @trip.rating = trip_updates[:rating] + + if @trip.save + redirect_to trip_path(@trip) else render :edit end - else - redirect_to trips_path - end + end def destroy @@ -59,10 +59,9 @@ def destroy end redirect_to trips_path end +end private def trip_params - return params.require(:trip).permit(:trip_id) -end - + return params.permit(:date,:cost,:passenger_id,:driver_id,:rating) end diff --git a/app/models/driver.rb b/app/models/driver.rb index 0f6a6828f..1f2d99789 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -33,5 +33,9 @@ def driver_earnings def self.random_driver return Driver.all.sample end + def self.cost + cost = rand(10..100) + return cost + end end diff --git a/app/models/passenger.rb b/app/models/passenger.rb index 8eab9c6b8..d19657f02 100644 --- a/app/models/passenger.rb +++ b/app/models/passenger.rb @@ -1,28 +1,20 @@ class Passenger < ApplicationRecord has_many :trips - validates :name, presence: true + validates :phone, presence: true + validates :name, presence: true, uniqueness: {message: "passenger name is already in our system!"} - # def total_cost - # count = 0 - # #if loop for new riders with no trips, think about proper exception handling instead of returning nil - # - # total = @trips.map {|trip| trip.cost}.reduce(:+) / 100.0 - # return '%.02f' % total - # - # end + def total_cost + total_cost = 0 + + self.trips.each do |trip| + if trip.rating != nil + total_cost += trip.cost + end + end + + return total_cost + end - # def start_trip - # # if Driver.available.count < 1 - # # return false - # # elsedef find_driver_ids - # - # - # new_trip = Trip.new(passenger:self, driver: Driver.ids.sample, cost:rand(100..15000), rating: 0, date: Date.today) - # - # trips << new_trip - # - # return new_trip - # end end diff --git a/app/models/trip.rb b/app/models/trip.rb index 3f761103a..f5b0b96de 100644 --- a/app/models/trip.rb +++ b/app/models/trip.rb @@ -1,4 +1,5 @@ class Trip < ApplicationRecord belongs_to :passenger belongs_to :driver + validates :rating, numericality: { only_integer: true, allow_nil: true, less_than_or_equal_to: 5, greater_than_or_equal_to: 0, message: "Rating must be a number between 0-5." } end diff --git a/app/views/trips/_form.html.erb b/app/views/trips/_form.html.erb new file mode 100644 index 000000000..c94799bc0 --- /dev/null +++ b/app/views/trips/_form.html.erb @@ -0,0 +1,31 @@ +

    edit trip:

    +

    <%= page_title %>

    +<% if @trip.errors.any? %> +
      + <% @trip.errors.each do |field,message| %> +
    • + <%= field.capitalize %>: <%= message %> +
    • + <% end %> +
    +<%end%> + +<%= form_for @trip do |f| %> + + <%= f.label :date %> + <%= f. text_field :date %> + + <%= f.label :passenger_id %> + <%= f. text_field :passenger_id %> + + <%= f.label :driver_id %> + <%= f. text_field :driver_id %> + + <%= f.label :cost %> + <%= f. text_field :cost %> + + <%= f.label :rating %> + <%= f. text_field :rating %> + + <%= f.submit %> +<% end %> diff --git a/app/views/trips/edit.html.erb b/app/views/trips/edit.html.erb index 03a44854f..6414e923f 100644 --- a/app/views/trips/edit.html.erb +++ b/app/views/trips/edit.html.erb @@ -1,2 +1 @@ -

    Rides#edit

    -

    Find me in app/views/rides/edit.html.erb

    +<%= render partial: "form" ,locals: {button_name: "Edit trip"}%> diff --git a/app/views/trips/index.html.erb b/app/views/trips/index.html.erb index 06c3d7f22..ec2893c2a 100644 --- a/app/views/trips/index.html.erb +++ b/app/views/trips/index.html.erb @@ -1,10 +1,23 @@ -

    Rides

    -
      +

      All Trips

      + + + + + + + + + + + <% @trips.each do |trip| %> -
    • - - <%= link_to trip.date, trip_path(trip.id), class: 'date-link' %> - -
    • - <% end %> - + + + + + + + + + <% end %> +
      Trip IDTrip DatePassenger IDDriver IDTrip RatingTrip Cost
      <%= trip.id %><%= link_to trip.date, trip_path(trip.id) %><%= trip.passenger_id %><%= trip.driver_id %><%= trip.rating %>$<%='%.02f' % (trip.cost / 100)%>
      diff --git a/config/routes.rb b/config/routes.rb index 48fec4954..697dc9e56 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,9 +3,10 @@ resources :passengers do - resources :trips, only:[:index,:new,:create] + resources :trips, only:[:index,:new,:create,:show,:edit] end + resources :trips resources :passengers From 8b9649a0783d47208ae0d9dd49a349be9ad80051 Mon Sep 17 00:00:00 2001 From: Mariko Date: Thu, 5 Apr 2018 09:09:23 -0700 Subject: [PATCH 42/64] logic for aggregate driver data --- app/models/driver.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/driver.rb b/app/models/driver.rb index 0f6a6828f..e3eaf806e 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -30,8 +30,9 @@ def driver_earnings return total_earnings end - def self.random_driver + def new_trip_data return Driver.all.sample + # cost = rand(5..100) end end From c589fb55b2b105de0c04b5ef4fda8229fd6aa1a1 Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 12:43:35 -0700 Subject: [PATCH 43/64] fixed the errors in new trip --- app/controllers/trips_controller.rb | 58 +++++++++++++++-------------- app/views/passengers/show.html.erb | 14 +++---- app/views/trips/_form.html.erb | 2 +- app/views/trips/show.html.erb | 18 +++------ 4 files changed, 42 insertions(+), 50 deletions(-) diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index 5979ae444..e75799f73 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -10,35 +10,37 @@ def show def new @trip = Trip.new + @trip.passenger = Passenger.find(params[:id]) @trip.passenger_id = params[:passenger_id] end def create - passenger_id = Passenger.find_by(id: params[:passenger_id]) - driver_id = Driver.random_driver - cost = rand(10..500) - date=Date.today - rating = 0 - @trip = Trip.new(trip_params) - if @trip.save - redirect_to passenger_path(@trip.passenger_id) - else - render :show + passenger_id = Passenger.find_by(id: params[:passenger_id]) + driver_id = Driver.random_driver + cost = rand(10..500) + date=Date.today + rating = 0 + @trip = Trip.new(trip_params) + + if @trip.save + redirect_to trips_path + else + render :show + end end -end -def show - id = params[:id] - @trip = Trip.find(id) -end + def show + id = params[:id] + @trip = Trip.find(id) + end -def edit - @trip = Trip.find_by(id: params[:id]) -end + def edit + @trip = Trip.find_by(id: params[:id]) + end -def update - trip_updates = params[:trip] + def update + trip_updates = params[:trip] @trip = Trip.find(params[:id]) @trip.rating = trip_updates[:rating] @@ -49,16 +51,16 @@ def update render :edit end -end + end -def destroy - id = params[:id] - @trip = Trip.find(id) - if @trip - @trip.destroy + def destroy + id = params[:id] + @trip = Trip.find(id) + if @trip + @trip.destroy + end + redirect_to trips_path end - redirect_to trips_path -end end private diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index aadf2e1f7..1d83493d1 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -1,11 +1,8 @@

      Name:<%= @passenger.name %>

      -

      phone_num:<%= @passenger.phone_num %>

      -

      total_cost:<%= @passenger.total_cost %>

      - -

- -

Passengers Trips:

+

Phone_num:<%= @passenger.phone_num %>

+

Total_cost:<%= @passenger.total_cost %>

+

Passengers Trips

@@ -19,7 +16,6 @@ <% @passenger.trips.all.each do |trip| %> - @@ -27,8 +23,8 @@ - - + + <% end %> diff --git a/app/views/trips/_form.html.erb b/app/views/trips/_form.html.erb index c94799bc0..b21d89f81 100644 --- a/app/views/trips/_form.html.erb +++ b/app/views/trips/_form.html.erb @@ -1,5 +1,5 @@

edit trip:

-

<%= page_title %>

+ <% if @trip.errors.any? %>
    <% @trip.errors.each do |field,message| %> diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index 6690da90b..84917ff7e 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -19,24 +19,18 @@
- - - - <% if @trip.passenger_id == nil || @trip.passenger_id == 0 %> - - <% else %> - - <%end %> - - + + + +
ID
<%=trip.id%> <%=trip.driver_id%><%= trip.date %> <%= trip.rating %> <%=trip.cost%><%= link_to "Edit",edit_trip_path(trip.id)%><%= link_to "Details",trip_path(trip.id) %><%= link_to "Edit" , edit_passenger_path(@passenger.id)%><%= link_to "Delete", passenger_path(@passenger.id),method: :delete %>
<%= @trip.id %><%= Driver.random_driver.name %> Passenger ID does not exist <%= link_to @trip.passenger_id, passenger_path(@trip.passenger_id) %><%= @trip.date %><%= @trip.id %><%= Driver.random_driver.name %> <%= @trip.passenger.name %><%= Date.today%> <%= @trip.rating %> <%= Driver.cost %>
- <%= link_to "edit", edit_trip_path %> + <%= link_to "edit", edit_trip_path(params[:passenger_id]) %> <%= link_to "delete", - trip_path(@trip), + trip_path(params[:passenger_id]), method: :delete, data: { confirm: 'Are you sure?' } %> From 605ecc91870b51369fa6bca2326ab17bb1a5a141 Mon Sep 17 00:00:00 2001 From: Mariko Date: Thu, 5 Apr 2018 15:30:19 -0700 Subject: [PATCH 44/64] new branch with alot of clusters --- app/controllers/drivers_controller.rb | 10 +++++----- app/controllers/passengers_controller.rb | 4 ++-- app/controllers/trips_controller.rb | 4 ++-- app/models/driver.rb | 7 +++++-- app/models/passenger.rb | 4 ++-- app/views/drivers/show.html.erb | 6 ++++-- app/views/passengers/show.html.erb | 2 +- 7 files changed, 21 insertions(+), 16 deletions(-) diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb index f7eb6a290..6a9903bb3 100644 --- a/app/controllers/drivers_controller.rb +++ b/app/controllers/drivers_controller.rb @@ -26,7 +26,7 @@ def edit end def update - @driver = Trip.find_by(id: params[:id]) + @driver = Driver.find_by(id: params[:id]) if !@driver.nil? if @driver.update(driver_params) redirect_to driver_path(@driver.id) @@ -34,7 +34,7 @@ def update render :edit end else - redirect_to trips_path + redirect_to drivers_path end end @@ -42,15 +42,15 @@ def destroy id = params[:id] @driver = Driver.find(id) if @driver - @driver.destroy + @driver.trips.delete_all end - redirect_to drivers_path + redirect_to driver_path end private def driver_params - return params.require(:driver).permit(:driver_id) + return params.require(:driver).permit(:driver_id, :name) end diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index 7c4d6203a..489575a0a 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -16,7 +16,7 @@ def new def create @passenger = Passenger.new(passenger_params) if @passenger.save - redirect_to passegers_path + redirect_to passengers_path else render :new end @@ -43,7 +43,7 @@ def destroy id = params[:id] @passenger = Passenger.find(id) if @passenger - @passenger.destroy + @passenger.trips.delete_all end redirect_to passengers_path end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index e75799f73..63052c2cc 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -19,10 +19,10 @@ def create passenger_id = Passenger.find_by(id: params[:passenger_id]) driver_id = Driver.random_driver cost = rand(10..500) - date=Date.today + date = Date.today rating = 0 @trip = Trip.new(trip_params) - + if @trip.save redirect_to trips_path else diff --git a/app/models/driver.rb b/app/models/driver.rb index aba591fea..32aff2a66 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -1,6 +1,9 @@ class Driver < ApplicationRecord has_many :trips + validates :name, presence: true, uniqueness: {message: "Driver already exists"} + validates :vin, presence: true, uniqueness: {message: "Vin already exists"} + def driver_rating total_ratings = 0 number_of_trips = 0 @@ -30,10 +33,10 @@ def driver_earnings return total_earnings end - def new_trip_data + def self.random_driver return Driver.all.sample - # cost = rand(5..100) end + def self.cost cost = rand(10..100) return cost diff --git a/app/models/passenger.rb b/app/models/passenger.rb index d19657f02..52baf8dc8 100644 --- a/app/models/passenger.rb +++ b/app/models/passenger.rb @@ -1,7 +1,7 @@ class Passenger < ApplicationRecord has_many :trips - - validates :phone, presence: true + + validates :phone_num, presence: true validates :name, presence: true, uniqueness: {message: "passenger name is already in our system!"} def total_cost diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index fe53cd1a0..d58b7730e 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -10,6 +10,8 @@ <%= "Total Earnings: $#{@driver.driver_earnings}"%>

+

<%= link_to "Delte Driver", driver_path(@driver.id), method: :delete %>

+

Driver Trips

@@ -29,8 +31,8 @@ - - + + <% end %>
<%= trip.date %> <%= trip.rating %> <%="$#{(trip.cost/100)}"%><%= link_to "Edit", edit_driver_path %><%= link_to "Delete", trip_path(@driver.id), method: :delete %><%= link_to "Edit Trip", edit_trip_path %><%= link_to "Delete Trip", trip_path(trip.id), method: :delete %>
diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index 1d83493d1..ed2aae8fc 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -24,7 +24,7 @@ <%= trip.rating %> <%=trip.cost%> <%= link_to "Edit" , edit_passenger_path(@passenger.id)%> - <%= link_to "Delete", passenger_path(@passenger.id),method: :delete %> + <%= link_to "Delete", trip_path(trip.id),method: :delete %> <% end %> From 99145151f7654cc5bbb844b3706e469028002e0f Mon Sep 17 00:00:00 2001 From: Mariko Date: Thu, 5 Apr 2018 16:17:50 -0700 Subject: [PATCH 45/64] added dependent to passenger model, delete passenger working --- app/controllers/drivers_controller.rb | 2 +- app/controllers/passengers_controller.rb | 2 +- app/models/passenger.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb index 6a9903bb3..6fd2a2f22 100644 --- a/app/controllers/drivers_controller.rb +++ b/app/controllers/drivers_controller.rb @@ -42,7 +42,7 @@ def destroy id = params[:id] @driver = Driver.find(id) if @driver - @driver.trips.delete_all + @driver.delete_all end redirect_to driver_path end diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index 489575a0a..d834c43c2 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -43,7 +43,7 @@ def destroy id = params[:id] @passenger = Passenger.find(id) if @passenger - @passenger.trips.delete_all + @passenger.destroy end redirect_to passengers_path end diff --git a/app/models/passenger.rb b/app/models/passenger.rb index 52baf8dc8..482747d60 100644 --- a/app/models/passenger.rb +++ b/app/models/passenger.rb @@ -1,5 +1,5 @@ class Passenger < ApplicationRecord - has_many :trips + has_many :trips, dependent: :destroy validates :phone_num, presence: true validates :name, presence: true, uniqueness: {message: "passenger name is already in our system!"} From eab0f9a375e5643b8228af39a77bbaac5127bedf Mon Sep 17 00:00:00 2001 From: Mariko Date: Thu, 5 Apr 2018 16:26:04 -0700 Subject: [PATCH 46/64] fixed driver delete --- app/controllers/drivers_controller.rb | 4 ++-- app/models/driver.rb | 2 +- app/views/drivers/show.html.erb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb index 6fd2a2f22..11bc9984f 100644 --- a/app/controllers/drivers_controller.rb +++ b/app/controllers/drivers_controller.rb @@ -42,9 +42,9 @@ def destroy id = params[:id] @driver = Driver.find(id) if @driver - @driver.delete_all + @driver.destroy end - redirect_to driver_path + redirect_to drivers_path end private diff --git a/app/models/driver.rb b/app/models/driver.rb index 32aff2a66..894355cf1 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -1,5 +1,5 @@ class Driver < ApplicationRecord - has_many :trips + has_many :trips, dependent: :destroy validates :name, presence: true, uniqueness: {message: "Driver already exists"} validates :vin, presence: true, uniqueness: {message: "Vin already exists"} diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index d58b7730e..05a34146c 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -10,7 +10,7 @@ <%= "Total Earnings: $#{@driver.driver_earnings}"%>

-

<%= link_to "Delte Driver", driver_path(@driver.id), method: :delete %>

+

<%= link_to "Delete Driver", driver_path(@driver.id), method: :delete %>

Driver Trips

From 33b68f44ad04d9b370d2956e899eb8c246cd4994 Mon Sep 17 00:00:00 2001 From: Mariko Date: Thu, 5 Apr 2018 17:10:15 -0700 Subject: [PATCH 47/64] fixed new driver validations --- app/controllers/drivers_controller.rb | 6 +++--- app/views/drivers/show.html.erb | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb index 11bc9984f..e646b225c 100644 --- a/app/controllers/drivers_controller.rb +++ b/app/controllers/drivers_controller.rb @@ -13,8 +13,8 @@ def new end def create - driver = Driver.new(driver_params) - if driver.save + @driver = Driver.new(driver_params) + if @driver.save redirect_to drivers_path else render :new @@ -50,7 +50,7 @@ def destroy private def driver_params - return params.require(:driver).permit(:driver_id, :name) + return params.require(:driver).permit(:driver_id, :name, :vin) end diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index 05a34146c..7d5afea96 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -10,6 +10,7 @@ <%= "Total Earnings: $#{@driver.driver_earnings}"%>

+

<%= link_to "Edit Driver", edit_driver_path %>

<%= link_to "Delete Driver", driver_path(@driver.id), method: :delete %>

Driver Trips

From c4192119d1afc3668120b093adf5114a2939a06f Mon Sep 17 00:00:00 2001 From: Mariko Date: Thu, 5 Apr 2018 18:09:32 -0700 Subject: [PATCH 48/64] Removed links from all trips page --- app/views/trips/index.html.erb | 2 +- app/views/trips/show.html.erb | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/app/views/trips/index.html.erb b/app/views/trips/index.html.erb index ec2893c2a..fe44599c8 100644 --- a/app/views/trips/index.html.erb +++ b/app/views/trips/index.html.erb @@ -13,7 +13,7 @@ <% @trips.each do |trip| %>
- + diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index 84917ff7e..d9ae5843a 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -1,12 +1,7 @@

Here are the Trip details

-
<%= trip.id %><%= link_to trip.date, trip_path(trip.id) %><%= trip.date %> <%= trip.passenger_id %> <%= trip.driver_id %> <%= trip.rating %>
@@ -27,10 +22,3 @@
Trip ID:<%= Driver.cost %>
- - - <%= link_to "edit", edit_trip_path(params[:passenger_id]) %> - <%= link_to "delete", - trip_path(params[:passenger_id]), - method: :delete, - data: { confirm: 'Are you sure?' } %> From 7b6f1c2faab747668aab83b5cd2c7434218fcda7 Mon Sep 17 00:00:00 2001 From: Mariko Date: Thu, 5 Apr 2018 19:15:30 -0700 Subject: [PATCH 49/64] fixed request trip to save new trip data --- app/controllers/trips_controller.rb | 21 ++++++++++----------- app/models/driver.rb | 8 ++++---- app/views/passengers/show.html.erb | 3 +-- app/views/trips/_form.html.erb | 2 +- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index 63052c2cc..8a23f863a 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -10,23 +10,22 @@ def show def new @trip = Trip.new - @trip.passenger = Passenger.find(params[:id]) - @trip.passenger_id = params[:passenger_id] + # @trip.passenger = Passenger.find(params[:id]) + # @trip.passenger_id = params[:passenger_id] end def create - - passenger_id = Passenger.find_by(id: params[:passenger_id]) - driver_id = Driver.random_driver - cost = rand(10..500) - date = Date.today - rating = 0 - @trip = Trip.new(trip_params) + @trip = Trip.new + @trip.passenger = Passenger.find_by(id: params[:passenger_id]) + @trip.driver = Driver.random_driver + @trip.cost = rand(100..10000) + @trip.date = Date.today + @trip.rating = 0 if @trip.save redirect_to trips_path else - render :show + render :edit end end @@ -65,5 +64,5 @@ def destroy private def trip_params - return params.permit(:date,:cost,:passenger_id,:driver_id,:rating) + return params.require(:trip).permit(:date, :cost, :passenger_id, :driver_id, :rating) end diff --git a/app/models/driver.rb b/app/models/driver.rb index 894355cf1..259a18727 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -37,9 +37,9 @@ def self.random_driver return Driver.all.sample end - def self.cost - cost = rand(10..100) - return cost - end + # def self.cost + # cost = rand(100..10000) + # return cost + # end end diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index ed2aae8fc..63da4f6bc 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -34,8 +34,7 @@
    -
  • - <%= link_to "Request ride", passenger_trips_path(params[:id]), method: :post %>
  • +
  • <%= link_to "Request ride", passenger_trips_path(params[:id]), method: :post %>
  • <%= link_to "Edit", edit_passenger_path %>
  • diff --git a/app/views/trips/_form.html.erb b/app/views/trips/_form.html.erb index b21d89f81..d32293a15 100644 --- a/app/views/trips/_form.html.erb +++ b/app/views/trips/_form.html.erb @@ -25,7 +25,7 @@ <%= f. text_field :cost %> <%= f.label :rating %> - <%= f. text_field :rating %> + <%= f.text_area :rating %> <%= f.submit %> <% end %> From 13556e127d5aee8f059f4a7d3367ff637fb3b8ae Mon Sep 17 00:00:00 2001 From: Mariko Date: Thu, 5 Apr 2018 19:48:34 -0700 Subject: [PATCH 50/64] updated redirects, new passenger to passenger page, request trip to passenger page --- app/controllers/drivers_controller.rb | 2 +- app/controllers/passengers_controller.rb | 2 +- app/controllers/trips_controller.rb | 4 +--- config/routes.rb | 8 ++------ 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb index e646b225c..cc8f31f01 100644 --- a/app/controllers/drivers_controller.rb +++ b/app/controllers/drivers_controller.rb @@ -15,7 +15,7 @@ def new def create @driver = Driver.new(driver_params) if @driver.save - redirect_to drivers_path + redirect_to driver_path else render :new end diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index d834c43c2..1b016f8ad 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -16,7 +16,7 @@ def new def create @passenger = Passenger.new(passenger_params) if @passenger.save - redirect_to passengers_path + redirect_to passenger_path(@passenger) else render :new end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index 8a23f863a..b4dec4dba 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -10,8 +10,6 @@ def show def new @trip = Trip.new - # @trip.passenger = Passenger.find(params[:id]) - # @trip.passenger_id = params[:passenger_id] end def create @@ -23,7 +21,7 @@ def create @trip.rating = 0 if @trip.save - redirect_to trips_path + redirect_to passenger_path(@trip.passenger) else render :edit end diff --git a/config/routes.rb b/config/routes.rb index 697dc9e56..4570473d6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,18 +1,14 @@ Rails.application.routes.draw do - - resources :passengers do - resources :trips, only:[:index,:new,:create,:show,:edit] + resources :trips, only:[ :index, :new, :create, :show, :edit ] end + resources :trips - resources :trips resources :passengers - resources :drivers - root 'trips#index' #defines homepage end From a3caded39a50a5556fb0bb90fc3f18fdfa4a5ec7 Mon Sep 17 00:00:00 2001 From: Mariko Date: Thu, 5 Apr 2018 22:47:18 -0700 Subject: [PATCH 51/64] passengers can rate trips --- app/controllers/trips_controller.rb | 2 +- app/views/passengers/show.html.erb | 11 ++++++++++- app/views/trips/_form.html.erb | 2 +- app/views/trips/show.html.erb | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index b4dec4dba..cf7035a07 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -18,7 +18,7 @@ def create @trip.driver = Driver.random_driver @trip.cost = rand(100..10000) @trip.date = Date.today - @trip.rating = 0 + # @trip.rating = 0 if @trip.save redirect_to passenger_path(@trip.passenger) diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index 63da4f6bc..ba75056f6 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -21,7 +21,16 @@ <%=trip.driver_id%> <%= trip.passenger_id %> <%= trip.date %> - <%= trip.rating %> + + <% if trip.rating == nil || trip.rating == 0 %> + <%= form_for trip do |f|%> + <%= f.number_field :rating, min: 1, max: 5%> + <%= f.submit %> + <% end %> + <% else %> + <%= trip.rating %> + <% end %> + <%=trip.cost%> <%= link_to "Edit" , edit_passenger_path(@passenger.id)%> <%= link_to "Delete", trip_path(trip.id),method: :delete %> diff --git a/app/views/trips/_form.html.erb b/app/views/trips/_form.html.erb index d32293a15..3e267bb3f 100644 --- a/app/views/trips/_form.html.erb +++ b/app/views/trips/_form.html.erb @@ -25,7 +25,7 @@ <%= f. text_field :cost %> <%= f.label :rating %> - <%= f.text_area :rating %> + <%= f.number_field :rating %> <%= f.submit %> <% end %> diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index d9ae5843a..0d6d51aa0 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -19,6 +19,6 @@ <%= @trip.passenger.name %> <%= Date.today%> <%= @trip.rating %> - <%= Driver.cost %> + <%= @trip.cost %> From 29793fb0fe77aaa73418891afeccad6b9c466381 Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 23:29:55 -0700 Subject: [PATCH 52/64] updated trips controller --- app/views/trips/show.html.erb | 49 ++++++++++++----------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index 84917ff7e..7f62e2257 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -1,36 +1,19 @@ +

    Your Trip Details

    - -

    Here are the Trip details

    - - - - - - - - - - - - - - - - - - - +
    Trip ID:Driver:PassengerDate:Rating:Cost:
    <%= @trip.id %><%= Driver.random_driver.name %> <%= @trip.passenger.name %><%= Date.today%><%= @trip.rating %><%= Driver.cost %>
    + + + + + -
    Passenger NameDriver NameCost of TripTrip Rating
    - + + <%= @trip.passenger.name %> + <%= @trip.driver.name %> + <%= "$#{@trip.cost/100.round(2)}" %> + <%= "#{@trip.rating}" %> + + - <%= link_to "edit", edit_trip_path(params[:passenger_id]) %> - <%= link_to "delete", - trip_path(params[:passenger_id]), - method: :delete, - data: { confirm: 'Are you sure?' } %> + <%= link_to "Edit rating", edit_trip_path %> + <%= button_to "Delete", trip_path(@trip.id), method: :delete %> From 2eb9bd08a399f0641a95219216061412340fcb8b Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 23:32:10 -0700 Subject: [PATCH 53/64] updated views --- app/controllers/main_controller_controller.rb | 4 ++++ app/views/drivers/_form.html.erb | 23 +++++++------------ 2 files changed, 12 insertions(+), 15 deletions(-) create mode 100644 app/controllers/main_controller_controller.rb diff --git a/app/controllers/main_controller_controller.rb b/app/controllers/main_controller_controller.rb new file mode 100644 index 000000000..4652169e2 --- /dev/null +++ b/app/controllers/main_controller_controller.rb @@ -0,0 +1,4 @@ +class MainControllerController < ApplicationController + def index + end +end diff --git a/app/views/drivers/_form.html.erb b/app/views/drivers/_form.html.erb index f8d5a4a97..4f39b0210 100644 --- a/app/views/drivers/_form.html.erb +++ b/app/views/drivers/_form.html.erb @@ -1,20 +1,13 @@ -

    <%= page_title %>

    -<% if @driver.errors.any? %> -
      - <% @driver.errors.each do |field,message| %> -
    • - <%= field.capitalize %>: <%= message %> -
    • - <% end %> -
    -<%end%> +<% button_text = "The button" %> +<% form_class ||= "" %> <%= form_for @driver do |f| %> -<%= f.label :name%> -<%= f.text_field :name %> -<%= f.label :vin %> -<%= f.text_area :vin %> + <%= f.label :name %> + <%= f.text_field :name %> -<%= f.submit %> + <%= f.label :vin %> + <%= f.text_field :vin %> + + <%= f.submit %> <% end %> From 6bc7bde73029093a6abed8016550a6b273890355 Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 23:32:58 -0700 Subject: [PATCH 54/64] made changes to show view --- app/views/passengers/show.html.erb | 64 +++++++++++------------------- 1 file changed, 24 insertions(+), 40 deletions(-) diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index 1d83493d1..0933906fc 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -1,45 +1,29 @@ -

    Name:<%= @passenger.name %>

    +

    +<%= "Passenger #{@passenger.id}: #{@passenger.name}" %> +<%= "Phone number: #{@passenger.phone_num}" %> +

    -

    Phone_num:<%= @passenger.phone_num %>

    -

    Total_cost:<%= @passenger.total_cost %>

    -

    Passengers Trips

    - - - - - - - - - - - +<% @passenger.total_cost %> - <% @passenger.trips.all.each do |trip| %> - - - - - - - - - - - <% end %> +<%= button_to "Edit", edit_passenger_path(@passenger.id), method: :get %> +<%= button_to "Delete", passenger_path(@passenger), method: :delete, data: {confirm: "Are you sure you want to delete this passenger?"} %> +<%= button_to "Add New Trip", passenger_new_trip_path(@passenger.id), method: :post %> +<%= "#{@passenger.name} has taken #{@passenger.trips.length} trip(s)" %> +
    IDDriverPassengerDateRatingCostEditDelete
    <%=trip.id%><%=trip.driver_id%><%= trip.passenger_id %><%= trip.date %><%= trip.rating %><%=trip.cost%><%= link_to "Edit" , edit_passenger_path(@passenger.id)%><%= link_to "Delete", passenger_path(@passenger.id),method: :delete %>
    + + + + + + +<% @passenger.trips.each do |trip| %> + + + + + + + <% end %>
    Trip NumberDriver IDCost of TripTrip Rating
    <%= link_to "Trip #{trip.id}", trip_path(trip.id) %><%= "Driver Id: #{trip.driver_id}" %><%= "Cost of trip: $#{trip.cost_in_dollars}" %><%= "Trip rating: #{trip.rating}" %>
    - - - -
      -
    • - <%= link_to "Request ride", passenger_trips_path(params[:id]), method: :post %>
    • -
    • <%= link_to "Edit", edit_passenger_path %>
    • - - -
    • - <%= link_to "Delete", passenger_path(@passenger.id), method: :delete %> -
    • -
    From 489f972e11883bc8b1313d9073fa343f31962382 Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 23:33:51 -0700 Subject: [PATCH 55/64] added hidden fields to the form view --- app/views/passengers/_form.html.erb | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/app/views/passengers/_form.html.erb b/app/views/passengers/_form.html.erb index 491bc03a0..149b65d19 100644 --- a/app/views/passengers/_form.html.erb +++ b/app/views/passengers/_form.html.erb @@ -1,24 +1,9 @@ - -<% if @passenger.errors.any? %> -
      - <% @passenger.errors.each do |field,message| %> -
    • - <%= field.capitalize %>: <%= message %> -
    • - <% end %> -
    -<%end%> - <%= form_for @passenger do |f| %> -<%= f.label :name%> -
    -<%= f.text_field :name %> -
    -<%= f.label :phone_num %> -
    -<%= f.text_area :phone_num%> -
    + <%= f.label :name %> + <%= f.text_field :name %> -<%= f.submit %> + <%= f.label :phone_number %> + <%= f.text_field :phone_num %> + <%= f.submit %> <% end %> From c7dbdf5efef901d836db261b736418e6f92eec27 Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 23:34:36 -0700 Subject: [PATCH 56/64] added some styling --- app/assets/stylesheets/application.css | 132 ++++++++++++++++++------- 1 file changed, 98 insertions(+), 34 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index e555e3ee8..02108e713 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1,19 +1,85 @@ -/* - * This is a manifest file that'll be compiled into application.css, which will include all the files - * listed below. - * - * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's - * vendor/assets/stylesheets directory can be referenced here using a relative path. - * - * You're free to add application-wide styles to this file and they'll appear at the bottom of the - * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS - * files in this directory. Styles in this file should be added after the last require_* statement. - * It is generally better to create a new file per style scope. - * - *= require_tree . - *= require_self - */ - table, td, th { +body { + margin: 0; + /* background-image: url('car.jpg'); */ + /*text-align:center;*/ +} + +/**********HEADER*******/ + +header { + + background-size: 50%; + + background-color: lightblue; + font-family: fantasy; + color: #87093b; + font-weight: bold; + margin: 0; + padding: 1%; + +} + +h1 { + text-align: center; + /*margin-top: -10px;*/ +} + +h1 img{ + width: 50px; + height: auto; +} + +h1 a{ + text-decoration: none; +} + +h2 { + text-align: center; +} + +.header_link a{ + display: inline-block; + background-color: #87021b; + color: white; + padding: 15px 32px; + font-size: 16px; + margin: 4px 2px; + cursor: pointer; + text-decoration: none; + border-radius: 2em; + box-shadow: 4px 3px 5px gray; + margin-right: 6%; + margin-left: 5%; +} + +.header_link a:hover { + background-color: white; + color: #87021b; + box-shadow: 4px 5px 9px gray; +} + +main { + /*background-color: white;*/ + opacity: .8; + clear:both; + padding: 50px; +} + +main th { + padding: 50px; + padding-bottom: 10px; +} + +main td { + padding: 20px; + padding-top: 5px; + text-align: center; +} + +main .edit_trip { + text-align: center; +} +table, td, th { border: 1px solid black; } table { @@ -25,24 +91,22 @@ td { } th { height: 50px; + } +button{ + background-color: green; } -nav { - background-color: rgba(215, 190, 217, 0.64); - height: 100px; - color: rgb(81, 18, 84); -} -/* Passenger and Driver index page styles */ -ul { - width: 40em; -} -li { - float: left; - width: 13em; -} -a { - text-decoration: none; -} - -h2{ +footer div{ + position: fixed; + right: 0; + bottom: 0; + left: 0; + background-color:lightblue; text-align: center; + /*position: absolute; + left:0px; + bottom:100px; + height:30px; + width:100%;*/ + clear: both; + padding-top: 50px; } From 9736b0ee7739956308e9e62e637d729b768b013d Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 23:35:29 -0700 Subject: [PATCH 57/64] added images --- app/assets/images/car.jpg | Bin 0 -> 103722 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/images/car.jpg diff --git a/app/assets/images/car.jpg b/app/assets/images/car.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67a1090697b312c16c5f62f7f7f0482f60eb8850 GIT binary patch literal 103722 zcmbTc1z1$=*EhNe38e%?S{gxOhK8X*I;159h8ke#E# z&fxPr|9HRmeAl_oOLg=n15@yEvDETW(}w!kL4_?CB*f`Ny+pj=PH;;%GdeH0 zy@RWWml(sJ$wg4tw`6Vxx<6gq?8F$PZdavyuKJ8l#?i%+j-Ly}2?Ys&=mfxAU|v2! zK|u~W9uOGB4dUSj^KgO%MR<8cKp?um8v|-J7Yi#9O^m{PtXbdb_%5TK;<*|7&koZEq(_ZcR&9M|T&fC8|5)KZ8-c`@b)A z+Yz-J5p@?BN+@RbvW`%9xTS-eqO2GL>Is(x%tC}$mWLNCC%_BlwHjYkoGFtp}s%B7_!|na8 zc>X%AtfdRg!_q>|#Su>Thrc4Q|7CqJh@Y2_M~H_V{`KPDC?>JR%4CgvS%94stsEG(S6IJl^WbN4RZZA1OX$H&9Ff7?j^)zC2S z+`+-dA-sE+kd%Oc;9vCr&lfjefcrRT$LMb{(C!21_t7x!quq1@G^qVyVxXb@+k;>L zXy}-Cu&{A(Z{`4;zn(0(=ytFzM{Xyjg6}8=Vz55rj3DD$XtF@?2(#UlW3XllXUl&) zM6BuQ-Nm%e#+twjsWx#p&t60``k$9v_ zwG@uG&Rkslv9~$ymc^=;#i~4{>$u(!Dlj$phV50KVnVNeNQ9`xw%ON*#f3agYMumI zOr5=!<%JX@ZYnyfoH0mw>8H^%&=xmD`@@ZR2D*2KBS4FAHJ(sG&b z+Ch|}1R zwka7Z!<~p(cH~es(D*aL4ASiFu&!*p@OYv`l~0S+Q%yQG&qHydsi{#>EaK@QzrKhr zCD|eA=X!SvOP*QYWS7k5oEO=?3&UF~`w<7rhHEs-Yzh6V$&4oXPenY{wzSw(`S$ji zvUx~U1>@dsW?RN5tMP|H4OizzpcS=7k$(FHj~;WQ+(WAO`*rS&QA*;Fpdly*{G@LGPX)1g{GmaDyK!;SMa;y{@=+W##&@j zIVRe&{I&=+FOtW*%qwR~O?X}}4ip?iqT}7-UxV-RBxb8^&I+dFI4==16^uZzOI}U7 z56L+3H+k@@!IC$c`YeUI=~s;Q&6hmjXRX!?o!+YQ`t?T zXH{y!Y0f*$%-d&!G^+lfkUGV{FC`-vm6sNq>tAYnJM+ zxiI66g$S!%tHf0{B~4T9G-Xz|yuGZ&iM(c)167|NJNlG1=8miE<{Rf}5e$h44)VPC z2uU+c)j2^LLiOYR)oa!|HBE2&X)SP}poc1%%5Y!&%SS@JW`_Odk2lE&otz=`D{_^T zoOi#6Xcan7R(dk!4RN#vEnTx!z_J93@2B%*_6ave@Y459nt-g8d%KF6g%c8Y8V4(E z$yr|8rLf}px@GlGzOkk)uf=zTE^}DBy81NgapQT8Xsn+^aTo28?HFXHYbv5=Khk?s zv)ZH1TE0_%$bXdtChp`oh)$UIOIy!QNR3?fnWZ%9(4Xsc+zX;I#sJ|&d zk#&&Slr-0O0kz;td9|f?C#@#fuNx$bbly_uC3cC!u}k=h<-O3eb?RG)w{kM@`1vBj zK6u-2##qpdDRqJ~bjVfQ#~~$kL!iu%&un<}&|jv^hmn&qQy#z4kqkuDYfbdh zj^*7E4xT^MWI}hE;LXF<*0W{9T8a5=iW7}rEjgUiL|3zXsXp5MGU9A*Y4`!U5UOc% zk574wm90+Sa>OO01zVzqdaFZfZ5>Nj8s&--kE1to*SPP)ZvaW|t#sY+91BF*L;;*w zEnZRZ-LTJGh0$vIZyYLdD1Cgj6rTAPi`VJGZ|I>1YZVPg(e%o!EtHxG!@aq0Iy_Xj z0?ZeD_sz#d4?>Qto6da69G|yuQ?Dl)Z_(74scrHc4JH*gwwxhn-m2x2f2m3YA!Cis zxRx8@Ds3NTI>ozIecU$jnh$zCx4$lEQq~H+3Yuifw`NTpwstXaeEh>dcx=Kg;U{IO zkz+<XTpjezKL7hbkqKKxn8I&G(0o-v`$(PI2kV{tkyR}Z`fAd0pL}*0vVDD(a&wrr> z?K>Vx1#C0Z_uVz_yttLzvy-#flvdX^(IbJ{cbTGgrc$hAR;`fZyev<9|)3I*rAle_&R^cMWZ63Y4r6MMG1&l+&Q zA+TCBn}{u2@Ze-T*E`+rAzd(^p6JPVZ!n z+6=tkHF-6S`8iHyvW^DO9c!PJ8zRnq+m5dsnfJ0ak8gmG`pA*OtG3GHGS*g@xb189 zrm!mXB_pqs)(0Ua3H#}+MBNk1u7Mw>%SYD}1@KmfBDhUgy&}zMv_X+lNprN|kL>nN&vhM+$(T6y-kp=9Y*X;7m(7iDU?%jn}H2c3wu&bMwij2#`q9Z)bVSrHhf=#*yJIatjG5^Ir}< zQDZ+>xk?QE8|vMLd=-1=$u2)18kHjhj_;7m;Z79EsbxW$L=;&#jcqbYn zYti??9VtHTUuLT zGcOZy+ZZdmE~Hll;qdVs<0^f0UrqGg|J$~n8vL< zEfQ*qw;znR*i6WaSDfHUwqu()Z1Qwprxu(nivapxpod z%!8(5k}`X9Tgc9jD$a8sZ5_wIhdHj#g4;m6PBU8IH6`g|jl$4@%l-ZgaSYorL4vNX zs}bo;V;;9Y2#eyl+U9tI6pQD~%6=O!oZ=9s+jwxLSZ&;I$s>ru$gjVw*iPoiMd7*M zC3T)_^EtIn_O@K;`N&s6)Lrahr4nzgk~Yf}uLxmP>Fh2P#>-1@Vb#Gg5av zSVng6FLu?iR|hV+^jPD1Evkj7tkaq3(Dd@v@FHE8NTiF9XUekHRlA21zutMWV!2()QLoU2s3%R#+%nB1>z;NC$E}R^KzNS zGP9pq*%aDH-_>-1$f_mCx(CJtZ1!uZY0|Sk?zv}rMle=>#k9$3=hM})FIBdD85YO-LQBiw4Xl%Uyhws)yQ zFeH)TZXAq!LYgG|GrdVAJ%tEN$;DMk6X3axY<$jRt{ zQ17!u16NIIlD;2@8X?cR@0<2+F;G2S;yPrbSpp>})UXZ0nir5(;7O{Xwdat>m0!uc z`!(EIHAR20n?v>EN$GQ`<0A74#ucI{;w`;}3nCa&Rk6U#_usfOhYRO3n?w?WEk2hE zQ+`ebMdaM&<%xWXFO8>2kE=GOlo?_b7&j!y0A)%1kvHs3Ku^7ATu+aK@kZt$y_F)1 z4LUPte8_`N!DmwrhP9>yj4nh!(r^yQyOnkGdCAo8zy8LMdw)R+2obQL>-OL<$aswY zvDc1(GRR^y(o$&aX|*p|fsmSfrAzi_oY+ayfyV?jy~qJ!#rNRHayswjLZlDq8ICX% z?9(xVqdCw%hTqd{3fLW}Cx2|ppTSyrBx_}zQ4^xnjC0zns13;3F-1P9+KC;y1IS{K zPofLs_J7!8F^fPY{8VTFD&0r5e`ow?=oq&N|DSXpod`u=t9lI%4z!_R>W9ULuu)NA z;RpZejRky)%k2_wd9Gtf944jMNIa-WA50E1Z3h5TR2`vTXV~S9q0LrCqUxMEJkl*k zB?rS411%5$_yAz~{yTYDS!Gqyt#sL~V*ovad<@J3Fob+YJq7^m1c>Luf!Fn`Kk&L2xK!A#WdgJr zHb**Tx-DYHEtjt6;tzQNw5Tco9r!%-80yNrsXr+G-0k$l3e+D;LPO(q)Mbc9zi;%l zorVtw4M0m>TkRhSEJS3uKxY@a&#!R~b{k~uUaF^Xg8OXvKmgXWQ5;MRBCE1lIll%= zn)z4yoQ0w>azf8o2pS0=VyQ>(2tXMPH;CRycm;)F$S|PPlEAl=xY1 z=xRvvbpt4F-~mC1d*Twj??f-E>kZ&OCMh0U8E}wvVpFB|PkVCoTg5PCnxpjEUp)^i z+cv4wCQcC|uBb{d?_sDz5(MaIk&Od@>J(qX10~slIo_>ZBMP70kj7?(*N=5Z^`%#O z6WxxnM1LMd*(im4t|S7`!IEn}m!9E;oOv1yfXsu9VsIjhqkfoxq7@=}&ITX?0>PNg z6)#7TmKtPi?CgPx_)iUTaM4HPlH^60GfnL65Lr~Hc>wcQJV=O0k6KX?QwzBQoBmXB zPH?8n2I#=o*P}x~6iKlX#w~X2?qLrA6r@*6H-JP;j2M4o3)jA~FU-egv&!0|#4K1- zwD}Qho1@+buq|U6>C*E<7d`9zkL`FFqCb10ZEWJ@@7nQAO*Iz!mN^_xtMZSnuQlXx}uXWTDh+1iq(2(+HXsXh4x+vx`?W=2ja31s*c0Ga` zz;emAwoSZG0K9DP^9!Gd-gjC9Dv7FH#uPt7y9J%5irmtM>SZFeH;MBU1=am8_;SkQ zK48S)Lkzwj9U0y$i8^&YE~hPT#axE2zLTN#G&ngz5$yI?)3ZyaVD|+_AnGI}Er_NG zu4F8S%JZdR?@vCgX`9{?Tdt=^-Yr?#+J&2|BQaGKVNTbyteX*DO>ChX53q$wAKt7^N z9-+C|P^ojl;i;*P4_X~(Y1+-k-P{^E`=Bs{raWFU__OgKHoIOpnlM6b#Y zj>Lvzzz)j_J^?SRxzj2H%O-1)Pt|y|j+*P?!f;-rQGgB}O!n~Du!Tb<^39>!QENoW zy8EWZ?yMiJ`WRtMfk(6RvkQK2b-~vLfw2h_OgNaKoh<4N(>|%INpAL4egThO<`>3{ zsg&{idk69QK-pbeR89C-yZbFwa*XKFRRKEJv7Ht*`*2?x7S>=fG2shpRnJ6`P(_4d z-vb*Y!;Gsk;`5s{Ce0wGWaAb}T_#mXQnNain4ud*u2dj{NtzCucIT2V(EBVQSwR7x zUv7>GPNJ!*^|o}e7l#~kz1Wi7d#yq_U zK@uyFL=HdFR(30up6)~J1Wq`628?N*QU((Q5OsC}*j=wd;VHRp^Q3PoiL^WW@^KSD z#l>c5OuZ)2qggtVN|w7T_n7n*BxmTPiwh~NGfKv@T@sY6wDO9o5Q5rD3J=gTJm$jV zYds_r;7nN}vetLg;R?!CYA*fo1ZIfKLM=}qAUCd60?()WIBaG7LJAxTV`5=xPrIW6 zt7VyEQKTYP`{+1IieZKUS4s?3RhDzbahr2dzWZKND+ir~MN^Yabz}3Sl1fo>9;PVS zM~|z5i;+hr$TZVWJ@A@c60It_+mi`U$rI>Rq?1;Rs*IDCfzf%87NN15D_7;sBhWTU z*aX=vYujVh%q;~r;416%@W)WqNUSfiZ!zeX665{fS{cIPV+n|%as9DG;cv_&A<*|0 z;h+yzT7{}p#N1C+-k3|@;mIe(LpRqBY=`BmVpbspQoGpLY}m%s>+*m^(v3I_Ri-$0 zQ%TaI=X06_MUzTtl1$8!Nje%c2~Z_V0UjoRIE@X&q}U4v37`q1u?;_%FjF0EKQ>52 zPm2#EPQ+D-EST2<;}sP0eMSh7vMH8WtYvL061G|kTPnn|^vU21D%fMHti{>0_mj`E z;R%#;>18pcV z@xu|fFJo0f02&@Zf+;8&#u%5QfB{Ix&O_}bQ3wFAL3@wVONzB;s(8fGs28+!k{N}P zs3`)?fm@BG)Qu;{e=o_(2B4mZI0T|dsD=qfr%H3fvBV=Pwq!yDa!ibZdEge!VA7ET zA>Dy)TTivWb@of*;}M}_0$V|m02(fCAOL)Rk6?&zq;tik1ITeuu}u;`3K0b0<1sx} zF?VCC#-Vgee6N6-1+_d18JPn3JXRl>9#d*Bymts;LYE9hQBj_h1;DQa=yF~GKn`wn z5FHVdFcyjq;06YgW0(@nd`8FYE_kat^fZ`==x*TcWGG`p*;+b)DY7^nM~@y@3EUC- zMV&P?w7C1q2Ec3w0CLpuHvrMnDzqiC0!o`5-O!RD_IPUb;9R_O&C5@y@_WnT?|0S} z+UTgROzi;Ldw>W}hN`&&i$6tRuz)$(Shy&)E0~}>w4g`6z7_y*BvCAXr2?R@v$Inf``!3jpO@3Nr|Y4R6G=)$$~fYA zf%E3iM&Xmg$EfWA=rXsU70APHGaTF8@m@0V=?cvyQ#l7a@p$l{tIBcGI@*=gw0t?5 z0i(M8)dKI&pEf){fVpmaT2HLYlnkVAZL)OL2MGN$@t0>n_KRHKsCQ`J>gxDc zS#;|fRlCFMs>0M+R9}JRhJNTf(uy9p16UzJuV4rTrrBUULHSXyW4Y#pnhb(?%P8fM zDiNKUti|+H-tmFV_9I|)ln!;g_WK#W5g!l7)!YwAQY^QjlCjKHmA24Wd-M4b!KBo~ zG-67u+wDr3+yFgJRy#7&pV=JNq9j$AJ9prezlbsStqp0rC$uMcPFg(tjqwQr;!$S{ z32NE)5N@UwA$|_-AFBMhsjM6HaisA8mV>*qV*}mrSAV_cW@BmDCRNuoy1X#{w)*xbfO-ZP{*b+ih=eZ^{*fmbX%S{dgV2Dj9{Dpv+X-_Uu9;;b=)lYND}k z_Y`c}5p3t0k6b?=;Vnj)$cb2wx^GG10}-l@D$ii^K`)Tq*UuGU1i@3t$*HNSaU?Q$ z`V?6a-W~C%^1@u1tRM`MRnjuE>CH`zfd?;~o!L1(6X0F_FmqtJCP#g(S}<>K6@8+K z;3dmW8SzT;vv|OK5Cv`Ysj5p7HALic&!JhnHm- z3+C0e?4FHo!mGjGNBV!P@9wYnmDK6QK9KFkhZC4Yb0UKnSk3pP@P z>c3y_S`&}?UvE&ou;MKxe1$zozvm6kA)no*3jYhP#)2>}X0>aR9vL_#%0rk}D?`0Qa1O;R` zVpT6AzkXZa+CB)T^d~f|ugWOQpp|&|gB~QGe@4?{O)}`oc+Tbnc1gU7m9N&`m24gI38$aSM-s)(g@#!S&g;>kH`q(^@l6l` z6M@=WmYST(cL6K{%MTh3woKKdAQhAaqma@aF2g+O;*3~(z%+KU@>TbHXeEF-o(E#C zL?ywWIP=03g8?erXP@a;+{TmOm8PgzfSw23wZR2z6(lxN!UOp&=s`@0^NH2$rhhrd zPJo$bk*WGAFb~{Sl4E5I;nP9|5md_DjtZ0tL^2DLNGu%uZlV z65ZiBhUsT57hz0X3?dBF?%ts0Lwiqx3UyG)&H*?O=n@o#gT{yP9+S?rGqum05{_Gi zf%!RxlMUU#U5aiYZ)Oyd|ComUNmZ$7>L?$s78Yq}Kj~3Vd`6~X)GJbEZx?N7#z@kz z@Y7mctwLZHmkEc)M4F_uHYDF=^G6-|H+HwloW@2dOYuT4-zzY~UItV_gU3Yj!zNQv zaN_xHKKYtvK~htnWWl|G6c(u*<|ri{cprRnB@pK>e4;={M2X30GJ$l3(%zdg2MpF( z?Zy9K_0*G_y0MX-B{A^rfSwK;KDyB_+_-V==O7qZN2FTI)1rvHXi=rJ$gPOoO;fwC zTf^SL+g`T8Aq!;2lV0pl1cK#^J1F7S)6j`R-t9I^62r3i!Jf{)7aypDcr`<@U*zHriepQr^T4^Y-DP+RJ4<-i$fMi zRRZyHa1|2JDy@{rKpq0>Ak3m?BBlcQxKkpv3~$q*?p%j=LBq`YT(Mh=AD^+QxXl}d zXlg~5aEjP7+}GYJstr_4#?1HT;j2;;a!=mMfT{HA-!<&h=^Aj?ijwlQrz9O{>fH)a zf)?6q@Um+MPBbTPFtg|1XT$MylzKMDyeP1wTy4fs%1Y&#G!?~Qsm4Y`I;)eE|CS1e z#gbJg?qD#*rOR#chub6~b#x;<{?LM5Tb4(*f<+}UamC`xD|sEKJg&_f00s55hyXMU zbaX6i%-gSWP@mhN;?iwp>^?CT2|ZX!1DlkAN7`)s0i)(2uZ)(tb2Sm!Lzkd0OnkE1 zuCEg4oijRn-Ux>biga`vV#@VzkH~p1jLXL|vlk2X`N5PiIo^eDa8> zX$03aMO$We?^Jt2&a-cTdukd>1mOpnuGcS`hZmw9I^Oh%Q}AHSea=N-)#J$^Bw8b1 z_rSP?to2=^GMcv8s7}r1x(<}vzlGU>h6O|eeYeTyzL@y0zr^mNZC|3PT|f8#nZ@+p z`wZzF-cFN?XfiSm606-%7JcDQjEu}BmUpCq2F^GgltC+nnlP3-Ua(5EX7J6Ydl1ZR zYx3>SL2O0F32poj(+mk{-b>NcA-_^P9Ta@^YqrB*zL<8OaX2Vw8Ct1nP16dZHLjhm z`ikdqb};`dXkOnHkLGf7jQ`3>?6}*4oaU3qmj#J!N&6e1jO@F>PDlM408i*_6h$6&{ygp+DPC7|j>JIy{+8fZRnB-QHdEia`h@15Q@_Eu zE3|Gg8lU2oozV^8(QUf`N}_aGr?Csg+r`{41n3uhrR=KBVgagoyzO1I)^F*^)1$^h zar>Qi&k19yKmtY<;e)83VXK2Y^$094jCv~xg>@0D-KiP?0;}#dTpS3qk0bEU%XA)= zDzuqd3^YGs7P1lA-!Co4z-y4){r-}$l}OlwW(5&Z{mHTe&;6~;x35bxs)S1d1gFgT zxi&&)$c|5Y6#eA2-+sHTiHnaeLF^>Z1@Grk*QyL-J(G0rbM|b)S5b1wB+Cvk@9c4-P zo2D*|KETxQqrXIPOAjma+a^5t z&5Td&^u@zM>=f50m!SjZbrwSQjDI-52z-`$H;Z{lAFzIj*;Q#TKf`|gmSFz6Xm@;Vr@UQr)v7K)eG_P8pDqMyxc)8 z;BZhXX0rn!pyf}EVO*BS_~E#T@x$`-_Ef12R2C4HuWnq#>4k{ zs|;0d4;M}C+{_VKyAlOWqkW!N zBkO85OOVB5%5R~Jo^au`(6O4<2%0wQ?n*|}*_9_hXCT`wMnYcw12rj8aBA@j2hr0r zq>$tFF#&c;l(h$jr7t<7l{ z#A_%OH{9Esz!(UsU2-RGJEv%B8WJv@e?@;ZHCXG$;-(WMn0XF-fl{;!|MVVo z35xYZR)E@n?v|-^SYhvymE3RIUn%Cq3_Xo$zH4LP`ZQtEyC4deLfZg z>S_XZOL6w2vW}657ha>VbeZ(wBlEx&NI;2 zq^HQQ-!&kbW`@>J{(KPMUp*c6F^`q^7Ll(8pWO3@cN|G^V^DSLR%R89~1i{*OwJTmaH+$+KnGi(!W2y z;+6YA9`-aE^Rk`w&gjn1uZOui{W~xHp*>fdJ9d)ZPM0dwa$=D#(Q|f7zRdI3&GKYs zD8DOUz65Eqz?GZ$?Y17|Mk`7^^ezkz4tD;wPxf)& zVVQC&5DP-+7eqkiBt$Sb0|zpUTfdU2=O z!)p`;R@4oqE|4Wilyr)3rDNM-r?YKPVKC)$OEjq~VLbZyP82gWTR+CW%wN};K52G- z?oM4@*~P@^o5d&M8y$!=&qRMF(_a%@+9MuD%6_KdD`Mk>kqk#DEVU%j`ag~8Hbh^) z4EJy%m^t-4Z~}jo>WV&#;-2};2;su!4Yu}GTf9ErxmUIDZC=%x%F}FKTF!ZSS#>g# zfU0GUz()M2k;aTkiZj zIY70H_0kE02jAu_$ROl!8#L4IYK~0dqbA@aPZ68^Tpl%V;1nCg%p`*)ANHoa3U{`I z+;c2CUYbA3&EmA9#B8dsgd9%U-dK*`N$p|%xGTlZGkZyFxu=!z;;#fO`J$Sr1L{^Mn2%Ox->xxjgM_YbfU;WWC z3f4IOUaULHxdD9say|tK9cL5j63fqP&%KcNzui&h@}kW4+D`9}75y!xKSYa@((GG^ z?Y7vj(r~TIe zx1M^8AdZ8ANWpr?aVtU$hkZ)owEz!lQ8RPOQ)^h~=@MIBSAG>pz|ZxEf4M;#4JY&v z-8EEhX4A05W|z;JGg(i_I&MY|V%k{LP>DaZVhn$O3e4_<-j*1%$b&5VEttb_Brj*@ zN-WM=vM(k3p@|S+H>?#e*R;oM|J5mtZf#b}S3&s7vVLaA+^*R?yKW_LicxYQJ4=8+ zGH2~4yo-S@D&GjeJpP=YRbRI z{Edrl!Kn?ppnb;@iz=TNup71e^+`6kD|ZFAE{^t;Q|vH}@zH{ZIRC$;ad86>lY?{i z9{C6;96f^dP%Q4FcM9Ua^B4N=;k5fL47J5hRPrM7=?+`CR774-_ zB0`KNL>eR&QoV@m-Vm6 zU7Dc!`2*04S-$^)C8|eg=WK%Z6y<1Kvezva565PO zUyg*jQZ+!FMkdd`()pNcteiLF7$(bEd7!d#Pjqw$M1}}w&TKnbX2zV+ykj~ zwY@IYS{M2#%krcEw2wOUZLI$r?4vYyR4Bl0mU_9}1NjN{40(%T4gVt}_**2^7q?l% zUrEBhNTYWO?^j08!DR=@p-qSkT|fBcuka7QS`RT_-X?c#(`(sR!N#m!r!%~3%$>XY zrC;qASDw@SayWalv)t5*l5Sf^cT*F=-i6)I896K3S;}TP&RxN_P|d|M2xQxnur1UN z(vk`BvKG2xI{g`aw}3qGUBS?OVg5;xB1Rtrq91M* zigYe6q?V46S(i}ML&LDOdLy4L*!W2}Zny8Ewj-QB^}8$aEhzPBUKq=$3UJpf_*P{+ z`1lH6Tqv^(pSI=(a9?tLu=7OyOrv(~$t>9d&xuv68tP(suXN7&$*jQsUg`4NQ=O*E z5`kTlf%m_6mh5H)j;_<14h-N=nXBJYwR|$8;Va`$JVwB28Z|qNA5f{d_I#pYW30fbg%t-Wiwk72DfDV<$-cqDaiklX2((4au(s`tsXoYIU8j}DFF7- zA3H>KLpj1*p`(D|fB43~t<~b>J@sM_AtiC|^0#^EoKJ9a+6!b&Cd%}ZdNyf2vS;)W zFOdkR>yv0IRPt~G)cZrXJIxnwfbX0)K$cmG&GiZ1AOO= z{UIYkj!KUoR$k$;16|OX7~R zL{BQ$dvaY{1v2wtFO?JZHa1l`5eAT?R;QolrO_C;Emp|ph4QH#O}q%zfK|M)-v_e#f}uN%_9x)B zZvolQ4Baj$ON=R!2Cm1v#i;pZvd;5218;?OQvOc z4XTMvSpM8b>WLke5+d#leh7jpNE_Bzl~!`B&X9C|6oNIYG3fZqt9n#8Yy})Dbt9)lQ06ZX<}>DzU8~LL#+9lA&aIA4{xb zXbh_lbd~D6@TLe|os&ig3?3D_3sA{CE>|s0mOg9lA5P-5hOUE?9w`d+L6WLS`Z-az?jRI0*Dg4TP`0iZ;XJ#s#?P%C-8=n1CI82h8@7o&I(zSLgG$km zpL_5imUiFCPwRaqo71hp1PIzhY;b&PF@Vk^3Vt@6Jb=0>n;glCfK>cV_}FFap2L_pBRA z5K?v^>pi_Ze!fy9;I!!^^m;yxuHb-Ab5+g=w#x-ev{K^5*?V+fGr)+kdcquACzxcL zFlLilKGaqxS3IqK%Sr#i;lA3=T>WvDB-_zbd2mSw$m)#&J74#;hG(PijG0rio(F(w z=>So25szzj3T0?V+U;fr_Gf$cC>uu6XYVF z3aFg#oqU-SFMt0PbbNs>=^dGAx;z#ASn>zwl6pJTthP5ID5!LA_n94T!S5xry*Qth8G&6^X2Fz{Fpz!t2}Uf03VUkzhmTo_3N)v;B9>n6;A#t z6r%i%dscAtzE{>WKM1xzMc#TSONP&Y!S>aw~s}7mzSRlH}xz_g$3+WeqMO#Z?Rg_UF{tcWh#Y&&v^3dl0mCs z%{b~An{wi!i{?V@Uv!1TYAGFbXXa#+oV(XfBbeG|Q~ie#egyXHwd0lM{Z#zgP0mC7 z`$`T0dmlPqs7IU6+MhUnBottOKBva5A>ds+K9 zPdS4*y(ktj_%<8KSH?V+#e*CeuDM%jTWI{_WvMi^p(Ge4fxC~g8mqC5_ z_e$iw`%dA8^j@EHdLu5|ukO9b64VPl3jI4z24rxq(-%bbEJXN=SKMFJD7GC*w^`Lu zbA^%m2$X;Gd~)jS`pt`Nk$S0F@O6QkC!93>u6{X-=M;Dtzed+EuheGz@mlfwP*%&R z#72ldrz~G>QX*&ST7L5EhqIZ-85#|A%c+K@nHm5k@NMf#Y(N|tVG{Fk(&^8VTz$QUHGZCTCN%^}MRZEH3CG3vW@Gqj}Gkx|eo1^znxWEzQGyA)OT zN1p$zbx$c440A`wKO|pi>+BACfUi6v2*dZBnzv1;s1IJOCv})!_k_{ex_iWBeTfQ! zby?0%9jhd-s`W8NtJ;$_7DtG=a*=x9(PsL=KcS6yRj%ay0&muNnCrpuSmzd1zRkzw zC-6mj6NbY3M(oA;NlpAwo1{A<{5=FuPQ$P%_DW7)tDa64vEo(eso4bleOb{S;1nTKOYwB)&^w0Vj5~ea2UF9%=H4FQY z;|}Mb1=A3u%Rm3xp<|yyOFYk^XLF=GU$oZaTez{*z9};F0k*3XKtU-YH+G$?m8Z=i zTs`M@IN+43p|g%KI{01uWtvYcjO?8k;eS{6{-qBH!f*3(x>3umS!we(fWO6U%KZ<5 z{8uLNUzP8FP|QnIAVH;x&?`~9byXI@FkY{-AbHL8eNGt4om|mJAAB%^jG?XQfB61I z)HeIEEjyJOi|f6h6kNU+@(0t(q*Lxf-#3k^Cp+#LS4VRQisv*!wQ4HH+n4YyU)=zV zN7^q;9<-(%tMp$qY%LBeMsVG4BFqmO#5Or$8j7`u#a{Uq+HNcG*_sgB!M5zt_;c9L z+Gko%AqZ@I+zEr!qlM#i5&3;@s#$?R6a{+M6K-L(A^_%Dl!4O_9+?nVV~n&q5nagyshLxovx$Z{tZrfT)-g z56QZqa(q!Mh9-7>@576VEXuY`KK3k#ipb-HO+L}87Zn#6%#Q;i4XodP;$O_CjRn!v z4zo`Y1e$D8aK#z3!_Vkv?O%Ru#4z~wpho38iBMqg4PbczgNf|YHayj(`V{bKvpi~$ ztv2*c+a2g8ai1$^s6PG!Ed)-vZid(ez78@j3Eyd_&-iJc$Rja61F-gG6u*>fE<#^K zp-xxnv7?H6_6AL8S+w08^%v@ieYC&db)bs$9e)*xA7braA6xzqzi3Ygzdokemb$IL z)cq-H{#TVo-2fFn{$#EHM4j6@KZc1iiEK8a=#i zB_tV}Aiwx8E|YRJVfMue-`%ygOudP1X+o@AzdteVv&+`4R5;{sz5dHBy?|XgU_q(pMXJ=-2|JZA1X3x3rb7rD5IkN8j6z5H= z?Y0RVmN>W1IYFkiD+ za_Bz_oA1a}zLWp_zY6 ziw>-{$mL8Y^VnutB2Xm6=!wCN!loH(bIlz%dJsfEsT26O2`kI7MYZ0$EKo=CQ)x{(%!F`^&ZwFHNe=rtJj;DDRps$ zh^ek)cXXy#u^YuRS~ez7M2p$ioXw!RX6fQt=(Zxd$13+__3a&u@Jt%+Uenf$KPNMq zy{YEzu90af$3Z;U51b=59bQ((K?=C)^}`!Z(bQx#lp^X0%Euz9Nk`pV%XVY+`z6#Q zbLF~MTPLbVL|h|G+13!hI=Uldf&=cz**@M0O9bo9P-3Ph@oH6K}j~{N~{F zu&}s{(AdG`o-?Y-_M@_LkT`?P`BQEjX`=bv30;UTEGu@lr60)4Jg?OWCd8BxXzR?L=hU9;#aUMetcV+X63~ zT{wc*{xfC&OW-%d;;~L!|DiP-e-tamf_)U&W(4j8hMrzPJ{4E`yZ#rN{!3w>70~U~ zM+Ld{Zbgi{K421De|*+d&cUtlGho#I-Otw$CMM{-f`j9e)s-i)Paf`J9}vIXsI@$U z@t*Y_3O{wf{g;9PufzK&!^1Phl;Af0V;W}Qw~{11$e|~7IBv8hSm=RSPfn_z(2{nS zXZp53Y(mdqR8b*aYxZm|&Iv``cm%wyS8Ln|A=!pOYXz?d3x0-N`v&;wIVOHn>l!)T zENIU_XtN;Zn^2{ILyVISGU3}t>9j2AfT>Amj=Jeb;)A*zfX7ztGcP^kN8d`Tw>MF< zQv_D#ZcUBEvt@S%bBb06EjPs*)IquiRF2g|=J%&R8c&nU`7&p!?#$^1CBEZ!w{Ep# zNke_e7BiOd@caQV^C}L08TV1lQ(+|HLslKB03$lE4#XZPwQJw#=jpx^k(P78m(W9L z_Iotw&tAl_RWQ2+>TM^T(?xmGAC5>| zy23tjaExWyGwzD$n-3fnhn*QMP%K1mF$RX%vH4hTujh?sU}_6iyk|1aG*kp%i1jU> z|Ga(&*=bKcf{D>O^c7`3AKsUPoAQ7RC*NFUo_xM9E$f)UI$A9xBorN_T$<|yzwhqa z?IGdS@u)C}qs5UWAXN4}(A9_Qj#_L$`-hIA+OB=yfTwI~!)napn;9lebGTAqGa?CU zaw)RljcHg@8MvVIqYf854W5Kca~XG=Gxy>gr^KG1(PsEnl}*_cdH5c!varKG@Td&0=h4MIL0e}qlrJhMBUkXoGI z?PaQtdC^(F+Aa@W%2apy5EuN4J>!ngot%s6W1lDRN#{4y24}$-O+6-QM_fwZm&}#&Ui{T{%QU zxSS<^!Caw8u`+QS$h+D-CxHl#5Q(rkO!Kg|wL3N>(p(zpSuBn|3W#Ci90vfP{{Dj# z+CDzJF{`H<_h#p6q#~x8$ot`3Exb&-PA_h`L0DN^D?YirNl^QotqrO9)HN5&abiur z`qCw6<_H=u;yJPUfiJP|K=6fL5moi>OsdoTRL7$WvcKQ#R#D8QL!St6(WVrZ?u|wA zyzYC9RZjzEV2$yO6#Kg$mSM3q!*`v+;hk^U#7y_4V$D*!SWL8ECNY?(l9A6B5~qX$ z*P~_N_Zd_U_=J`AoS#jwuyW0HN^gnM&r~IQ_Smv@h=NrD%jqF*@Shp66W^t~Mr2Z@ zb};CdAKl3_F)3+NI8&q?^R&~vW5d+97|!<6`(E#GX}S2d$795}NGRthYk#N_X3{v1 z@hlf{II{M3I%;6!JdrKl(f%=qOAtrYQ`zMf^GxeF#V+Z7b)U|mk6FLRQILQ89ed1qnVe(7j}6d)2b>UbnfHC}EiG3*=59*FP+S;{Sflf4RMXfe7>e zk8=9g{h&Ge^lv=Q?@+gw7raWAs&@zUR1H3t-`qHF2h33MYu2;5QoBAXuO~zl2!96? zse1G%GAU_=LoZEp>X?rG(8s_xM7VHBacx}#)~Gn0V;eIZt+6iOy*q!!I+9LXW+x6V z2Y2-GnYU*1?tB~>+p&G4VRN-_E{JeOdVDyNjWLG*0Y+*qqxNoi4(1H)@!@NSTuQ zgc=P&k9V^^Dk=eJU)U3@c!yH%Y|fp8+)cQ#;EGrKv{`i6Mxl#>m0?Dio5L5b4x7vl zdJ&@^0yYIdN9xPZpR1HB_;eZ=p46F+Mk<~>)nV~6=lk{Ie$!}A-;Ek*DE`WFikeZy znE{o}VW`Gm3jGgKzBFN#LA*uT^Q(oZzyNo)oUtDt=i(F%Ni0sIcH2yMY-AvUXl~R; zy{lms@Rgr$daDw=eTjP4D#5~BJOy{m8nX|g`I;U;+3TfC9XU^;_6HF>?18ZE10qd!s!BBcHezf#-08qDL8YF>QEMww`l0 zs)zJ3zBy_-!+8|S*mw)C<(4LQ!dh%0b?uB)3l>M@>>^7x3N)Q}W*`EdM&6(~PXFlM zdA$q+u6H^JRkvWPpxT!O{-5do==XLw#kX-+Ga{Ld>I51st-2js-58c z2h{Zp9HeUs(&qPa3jqpZ-saS^;|Vv-ZY2c8>Ea;1V#nXM-w*Xr1gd|g3KbLk8`x+$R%tf6|DnR ztm$pHiSqr#DdA_WHI_b8`!#XwW)&ZsVwgwzf-u;{)da7B%y$sq#yd6dGVOYKWNE+E zIJ(L<`b8IG?r2J$k)8+IAL2DPS+p+s*Z6KnM(0JY_(6EEeb+p`865^gO2a{b*Yz9- z;h|W&LmSpi@diuF^UB^rAiY{LQ7?~4SSiuS){0plR}dpcH2}cwqJRvKq>hZD9=v&( zrc{`|^>fl7IwN%1Z1sS`6;!}$2^PCSFrkgYz+is+3yA!G z@R0v4TyQGOHpfdVUxCAY#GUZk_xEL^II3FU76;Q&2L-prnvkc`N*HLg zM6%dKesuG189yA#q@k!$K5b4nYzQ4#3mgG6G^?EfTDU&f6Es_#vz{x(jS;W@iLD;b zMm>0?$OW#VodI(zKa;{M9%qhJfFJS9TcOo&E>L#K>bMqVNmS3JUd!Wxaq}=>f`bSA z%q<}N3CR_$MMjhAq>{M|uU4hpaz@R9up zH|#~mMf4xLFo(U`odT#+Y;4%LKV1^DF39L)sgnFUaW%5BcCJm+lip7acdrI>MI5%E z|46zkM5O8GB13oK)~ed>O&YHEF0HNmWM};Z8!~EhFH1o~@kP9|l*)mF9T z5eVqXgFLjwOX?5mb<)e5GOA`nAiT^)?-T+rTnQ^|0&}Ea(J>eJ$WAJ?*S_K;N*~0r z7Hs={JjkVT#^3f2p76CBWo1C7*2(yq9<6L)=n@q5kZF zv>eL;>rI{`J-flrXJSlMka-L=Ub$P|A&crNRl*m9&Ognc{%|j&oV#z=x6y20 zKy?3@?C<)dP-#zhxjkGxY}!Sc;NLd?JMi{&&K~oq{Z6tk$d-w$`aEF-WT+#}tiEX% zeTW!z!eoxLDw?chY2$M_35`X>xFdh70!EL*&|ZyZ3a-Xj@zBjG?*izg4V^ zcwRu*IN#xWUSj8A%I6+1N3c>>913r|fGP4eA}ijVpSC~{6<(hHMhg$p z=aN45MPuW4zW`hUzJ=a)*q?OEO>3b;NfEg?+6&y%lKHL<<|kmPX0b5tDWx>*2gY0` z@?|3)DE^tc;~vaLjOT76`O-h3QvaoiF1npn&LBx9;2=rxd8pPU2af82jN`5=&4!^i z(*Z&Icypz+ut1`cMbYb*)T`C_TS9)DV0{s%2+rKmna`-ro%)&CuTI8bN|3^SDIzbk zJt#DJwDHS&SZ1Mrki&$S%DH-=DNy?4#_rIV$l`7ax4$y$apup2hLFW3q-;}(jfQlY z8?BzLw^GrE+XW7?u=-!mL3-br^Y^$hu|9TlwPTH?QRt?1S93JM*Y_w25qS6MwmeJC z*rbg(v%D;%#MS!+%ut61PUC`df1Os^>)tn>iheb&ob-=0CiT1&d`h8AyA{ShFI!f)OqHuGENX`aKw||C3Nh;5c{>^;f<|J)QE0sR8|YgmC3LHn(W8x>G4$ zvA+36BO9UU{vw&qk{!?{8nn`6G~=0mnSE*?k&*^cllbuxoOg23j; zLhClpF|@p4L0)poJy3gD64AO7BiuD&U7Rkhkyw4Oex`K@UowxkcnNrTk1ZgO-NcJ3 z3%a$pm>K+rlrl2|KcNzJYkf#mrAz-yaU;D&vvcfGQiyd%Q@BTRgCwcNY=6eULW6fE za`X4?oWtIB4#{q%=UNY5X+O+7Ok|(S|QfJ zv7z8cJF6IM1IVNmsCwiL8i4svY=uUsA}+jz4JC~+@g2WMuT1o4x}K{3rRYN-J>(ma zsT+qi$OZ4{s7lSzES;W8*smFnFj;bzZ+Q>NqCi4t_U5!2kmw{FiJWgI0mZBe_?j$> z+S?pIKRm6!q~=vOSP`kNymT!5SW=s*f`5OkflV>+#yj;%f4A)>`1cUtkkX;WuPq4A z{#`h;NTZn&fjZUVK%3q?tAx*E;N`vYWi{!-i~U7h)+?A9^Uq2V_bF<$&puOVWGdkrm| z^^@0&ovE6+C+GL;UU{{r86Rv^L2AUL+J`1*po*^Z-DAK-f`bOkQ>dRlZGU6Imd06p zSIU&g^l^x#XMj+14s$_Z7N;wm8K^=lw5ztVULf0_N%cl5Q|Msj{@Z zCx>OfwIJQSV5-QQs#Eo|emvELTv_0BWtba@`Rf(7a+y+7U#rY+$|Q#+)540%uBAiY z9!9{o^4Om$<4;~+y7|g)NfVb(EMt?+I&M&%B43I+j2)%*0v zsMWpg@6lZoVoTFOJ5;I~m*UC-KVAuUK(b{<6QP`yGu58m_FCFJXbfD&RMWBeObp*7 zzMoK?{p^vLTWa3Ajy8*T>G)C9W_6GZ!h76ik$+YrN76DJu%z zo!AL9%_cGMbUttr)(Ny7g3IkJO_`}VRvbze2I$l#7`g4J z3hdl^U874x55=Q51>sSa$O5F(^%5vw2nQ#BUcRaR4}V0pvA>f$F=)}x6J&BtM_DbU zHcqf{!q^4@6j#;5LR=b0D_=T!yuH>mczMuX$1>nkVe0m4lQA{A=|bE_zZ&krv`_U| z^QW%qik7);AaLna&Hw;tF(aTEhJL6t4j^Z5cbSD7O$%?Q2iL4onO4rlMp%~Ml}A}z zifY=e)y&y|5gLS}$bhw?FJ_Fp-Nz7Z1N@hII$9w52K6a`Q5F?`zc)X2d(a6yLX^ijEm1gqrEE;gsxTI~;oE=k$fN&Sc7pJ@Z0 z&n1(c3bf{GUWEire~G!mKx##h(*z`S8Z=0_O zaU~k6-nW~$`W;PQ zW4=x31J6s<3C=t|d1&|IE&fnfZ`0~Z(?*w`?jV9;r@?!#ZP^ohHkLb6%2C-iw+z`k zwqL(>DEDMburhgSYm1PV?GpmK+x2jZKy7KDSKh0Dn?%m`|du3y$jQH`?q?m)jf|sy%lvOGQXGM!d zOI-j0oT(;uTP16sYG>ZZr$OZ!M(w0(_k0St$Ex&U2A$xw^l>-no*M416CZsFQNva* zpl%v`$fUJf%S2^phbk(gV5b#eh*CJlU=>K?gly|G*-?1U*HKePpwt%!TdRcq1R(%V z@-sYl#Vi=Sf|fgyZ;q4tQ>KHf@dweHR%65RZ8)s8cN>f%bV3ui)WPelTCVavvy?Dt zVg18wJpdDuI3;CU7tNu{>0Uj*R48M;Qd(vf4#xWHa+p|}E?j+gb2IX1;f*@0$a6^g zGZ`0+&sOH%xLDArQO);31DzszKmRx0#KFroCdM`novGFP;J7{}rb^xThfE63PIa)z zmYFyr+RK$C+?_U0r&v1V0jl28(g@^SFU{0;u{P8cUcO;Y3hAWfi=&NPU{DhlT7&6M zYH=Cv;F1wob`+i*$H*ke_xaPGOcORRUqD_izh}lMn+u1<6kdaHmOy+}0ug~FTM4}> zBod8Htaq?9h<917N2y~+bs}-tIAo+YI$XfVTpdeyYTj(O_7lT%c>qEzHB$%hR#)=~qW z>dd7(#1Qs@m*$GxW!UO=uQWYpAgv|X2}*cRCEk<{buS=VN8sgFJ|`RZePWYMj0?TL zD^xkl4+b;CX+PE59$GE;r{X-zteO2B^N$;e5C3?VZlQ6os#)Q}i3!s${g3mJ-G%9c zY`Npo+S3BxLN7lJCUfbQ9S$MtXXnP|#gc9lLWtSNNk?AL@gp3P*auTXvT8ha&es4# zVjdlFFT2|qDljS|ri)}|6l?LLp6IceT|GZxhfYVd6#5M06t2ErI_!)L2ol7w>ID;` zqlC6$ie?BG_rl<5iQ#2I4FbqW+>3W|(Q!(X@2iSd5uzFF}y zqTu{KIW&IsOet(f0P*o!C(Y(+FcFM573T$Te9?Ig%kCl#_D z6N-H=POVh>fWpEnDp)xXa#RsYgJ6ii-S{pY}CYvcEc-v^^11qjrCBN(le7 zK-OfwIEVHQ*)GfE?M&{3`=fvx2%>(1TLF+BX0{dcw!3sAP=_&QJg{QdbiTdGDaoBR zW>AseRew!_5$cZzBh%1W-ojEsrnQj|T<&?hnkWNPwjl}=j-GgSB8|BHpEM$MG1)-d zg|F(t)3qmG6T<}`x^R5)+VfkG3|1E-n)+m{FrVaB7o!*zOs+X%8P~-#V`BLCE<5|{ z)1W*txna7}DCfv5MUTB(?ik|KN@q&qx-y4Zf{oB^Pe-b@%{q?4B%_Swn!*F!oI3a7 z#<8y9H4SSTr0VfG3?*PJ^HKIfkDS;yRw=qz;BS2@Nw=d2K|iz_|PZ zuH%cZnqwx|*b@JTae)wJkxz*3bga--EdEPDsd~8hi-9fx?k+*#wCx18ynK!p79cn0 znU((rvT8kPf3N%cL-t|b8&t8|k8|gSzZ9)TWZTxJjin&dQ>W|7MDX<=wPdx(;%i$q zqK_Z=`)cKWkkXyq{t8_zhBz~OgS?w_7k>t^3eCPL7!J?a?aNnvRHMP_$9GAgBZSRu zx6a<2Pt7ESRkQ%tjxmB{U=PjEBAv}}=Evj3e92aSwgLqnK-4>R zpcwq)(UDOl)KtK9$m=Yi;ilG=Ma-4cTw>noCSCyYITH1zZtTcg zw$hE401$i5oh$MJp&bhwty?;C&x1&;tz{HY7lQt zYGokz7mG5If&#eARB}Z3AWM2!)vxdqqG8;mA%%&?%edqiMogR2d6k!>xdU7sC_-Zj z>Zj4CMQuz(Gcn+ruwt3E2t9u@n;J-uV$QTbS7~{fp*auIqzVQkvZCw4EEyBr@)AhQ zn`fzbD=Ur1Vmf@44Qa=7xmP0aT6zjX!q}RL`LfAR{v4jyK%+v?tHjej*9dm$2{NX&aB1V-8Q?uvIRQd8z_Y?YPIX#WVDV3sdx zSCOh5Rs(dcgY&YY*@0D#*nnW{ZUNd#U=>r+F7DiQVP=Blqscmad?o=IB^TCY1P!P! z8m?6$pbqpSjt*Oz(C`W0ssY~iFzkeloC{Q%z-F*$L{{>hQE8#Ug7i7=$zaAv?fJ5F zJ6u|JY7%B-4xF!J#>(!9Bmf>_>awu_B-%QNrDk6hpnEX-r0v&g5L|Zm6jc9A7^QU~h<_Bh-{W4_j_ zSvxmQ52){`0l3p443%M9fg;e_NbM@F*K9V(dgt)#~YX+voZEZ)} z{27@%GB;G88KZB5?4W}kI;48OQu{zEzM~>WpDbEu&U`Jam!6gErHk=ev=MZvGWxOkR;oVnRGL#3{7h1*WW4vrCNTEn^2u{?7m3bcN&A`)4DwMK zXn8x-RUgiuZX&v&H`8#HTL@Sh2YqHf23zV;BZYT1C^W4(oH#oQh6pbedy3EEPJvGY zHon7G9btWBK;Gau&dLDDr>p}yl3|2E_vdR;eOg_KUH*~2i0kvjcfox`e%AD$BV z_~ub@(F3I37g4p=jEQbXeFv|In}g73Tvk!)?Tz`YRV{ycv^HC{y5&3fEEx$@x zLADryp+xdUxW~*IDl`)I%FNo`>z;AtkuN;b&qRfU>I6RXQzg#{x_Lx;wJxc* zH{<~D#^qlj-nuYNKUDWDPfp(#rGA!a0vid&#k*|}#%QhL;0OyTT=ZWGXcjzN6B40k zBlf%x$`ZCvAf3xmVIz`~;<((4-mBemMg&u71#zia@k}BF^rdY6Oh30v-{z!r49_ z9D(oS@^A~bL~97(Nw8Az7q55VM-x2)Qr|1vgf?-w9D*IV!j{pn`wEU^4l-e&H^ci; zGT3V!-ZdpoOCi&6Y;V!;s+m~(Lx|&?Z`~r{WD1%}duzXFcU*cVdNjJeqMMf<+W`ic zyb^(~m@Rlp6mIm3`0NEP|->d>zbj29C~VH#PaGEk7I#$xe!1-nIx(Qv`UpI<>49Rf{)Azsw*mMLIWnao#vx zUgVK`vLXfJuHVYZ9eo*V`X(T*!7%@XJ~pi?sgm50KSLCQ|ddH%Q9s zeQs0|^AJzqUHY%F?LJ2RAD{L`ujptGaE|83M0}4~4pRA{5?cOVBt_(OF~XUxxhBH3 z;0<%M7(t=+uC02+f(h%f^NrJlrbLxc%zKY&o1DxSg>v1H%H_KiCcnL|Pd!)?*U;#` zF}e9Whu>ZLCj6c_8-wfRwz#DFpiAlmJ0%nw)cf?qL&Nd7{RY;TT|Z}IeSN?d3h8G? z2fwwcD0x@o=8JN^{JQ#!x|XJo)m7Pxl9F-2`|E29lkRp4vxfGK6$);kd0WJ@f|fhn zRD}MDo$q6ub2D)YZNC5ZS># z4^em-f${2KGHtlMy=S4Lv$wUJnliA*y4BqLsRqZN*yzMc9hyX)Kv}OoSVVftL&hEH z1x)npc(??%8V*P}iC(c}TMp2YR(MG-(NA{}wHkwAqG@Cg#N(~feT&cw@!-m%kGgtg(BXrySaVq!{&)goHQg!ld zwm*(?N;e=yDFSxmWbK7c#P%H!kU%J=-A}~@4>@hTJRai5Vr#LokK$*-x z;4>eye-r7rlERT=G6(;PLRIB-`@;Dnh4MFv{Z~>w;pR_kFOxQYsh@N#JMqeWpz5-ugk1mXs<<{e zf`=RY)WAC=^L&Xe$|dwnici~(X2R1d-B0T#8m8^^k0J; z>7QOBbn+DMNLZ21ICA09+MDirx$lrE2@=Py#kogDrm?4IdN>5`X4fb*P1aVL6}{B_ zpamI{Xixmp%c|}pi=KJLFgA?LzSoVVM%Kx%SQ=Qr#eJ=0v_sTRqo)9s8hSPp959}( zkVX~W9&2-59V_0M25mXCPvp3Xq2=ALI|`QtO7%E3kA|n#JwY(pCHfFTgWKx6nw_l^ z+QFtKq=e3p2UwtK?78#sBa5AR5Qr_doA$9FYIcHBL|h}|A1BEhQNcY{kGLEU9kOE$tQxNUoGs@G624R61^l>H!9IELm%{a46+;eY)m2!|vTwl5In&iL z?Lz4WwEh%|s;nCh3vO9MAtn@hRk}Jx_RhHxma8wss(T-Q5N7eHHk!)lLlYn3>m6Gy zEkUN&gDX3aVJV&xRGyT^PZkFn8BOT40-a4}g`NjNXyt|j@ZFSaIi_NpIDnT6m_<=) zFVZCg{aIGC*9pF)Yw_p6(?B8P$O%wK(|;-S2xBb6wsH zU$oT?Nw7?N7}o3t@noPa`;=M^dc2kOq`n*SBui-zYRq8TJ55^jmoM^M&vn zm2H1RgHI~-?q0bk^T{{DgkR)JlFtP*QvWVy{FU?$(_SepuIet; ze9&IIvzccpSmY5qOG_x0E?KxLLo)g*4O5kaROW5f%Gsg5Kh~Dvh?ac!v`4ch&%Fzf zG*OctE1@|VrneB7b00fOkh_FV&U=5q>ol*2FuI9X?SQF9FBpgD#-(?4*jO15go-OtZ9vw8~CWakKGIk!(36q50x zqZc&T=!;^1FJ#;T;z(nzqR^M$^ezu3%v%u}>6V8$qj{6JfuqIV4 zdNv)KkD7MN#~j{z<+i>EKO1GVdb8(^wNaiYPoQ#yz>{VV{mWCw`Ii!KMWEJEQgo8Lrrk+&HFg)>6BRzw_Tkufq!gWt@2)@rbpZ9`QB53}$a zofChYu$9d$4~r>Nr2-+gU9p?HDM^F@rAjlr(*ATSap$EnqMfTb&FKgVx|cMm5H-c5 zo}wEWUAuRmw2~%8TdUC$I=4JWW6G?@2ngtENRuZ;r;*4yHgl(^PYraq3kYY{Ua1N3 z!8WAqRA;(UoVFh7M*QLW=+H_9$tID04A=AYIY1%W0^`TUIg^BkslF{-6%qfIIWD`>jPusGIO@^oI@8{Envd_^^vWe&RC%r0Ox-zRUo5K1f(GGCjk4_Q>&!miiuyZh)HL-tIIkk z{2VYgs#_?}lu^B3Wi+bF;gY7L-YYPn;YqhK8^@g`XT%@_JGwUoJ%zV8mq-%C;`}YG zg;}}dEwd}t$Vt{{TZ4>iu?hi#D-DJQ+P|HH*>cf{oDp+VBkwSk3G^B)Mt3FFLX*zM zYFp*S_wumrJL+RQ_Zxe@4mIBQ668;EiY@bxxFx>5&5lXS%C7#!ef7ygQC8M<)N|*@ z);zJ#mG!UJKUj=u^Z(59d%PQ{OIeY?$L7SBo+cyW(vW|h(05)2^l%8^?dFG%JJpP| z3~VgCNH@Kv{I>X$^rn2$i+gfE1>+lI{e(3fp-N%3-rjr|Qy4B@S|Y%Efu?gOIun~3 z7h5ImGVFH@G~JHfa(?jWjisj*w?puQ=dY~>BsR)4&9zBouG*yFkS?3f1grb6VIcpq z868WuAGHwwwR^21IPNw?uQsnpKwyqptg#x6?g0Gp=aJs%rgF7H;6YqCM)684kmd}2 zE{ic!{&}JJ9RCsFdlkYA(Vb4;D!2;nRag|9LI(#8>E>o^*`H2GrB>dBqh(|t+PqKo zZP+2%fH+K_LBWPPH*ik5oGznvRxIvc#8Z#Vv*SclLq(Hm=lE$i6Q$Xsnxw~gi`~FgR6r#~^gf3CGin2gVgTdM<>K)eGTUd|h z4*1c}kQY8p8l)n$*A?o7bBe{wVS<}4?mlHJOxbnLSIPT6U3PoC>J2DNRuBPIlyVfX ztiTLZob&#ty1C*838}(W#-=ho41y=(d1`JRK4u%&2pJt>LCy?p z`aRieCHO`*b{GEZtt4zpZ9{m8-S)3YUa(z^9Uxi9K#CSu)gO}yNLS~J4h+6FCu5cH z{1<@4y9G>VB}>lnQH~0cz-QIs5zx0>lU4@4=HqQt-fHLS_hmLO`*M9_t%y@Ha#_Sw5cmGyhx zrmw`Y-XZ?@`agY#a}3FF=R=b{jRce)BD$A5NcI%6(j@`QUpN^rKJY?1q z^_ktD+tJ*dQHOrEK{@VQBC6L}?(Q^eu=~dScwC!&n;vKJCsG#pwV~nb{>D_xCt>YN6tPsDv#-P?HWL~;4tVdF)tvgy9v zMa3Jln?4e$`NW#h^IT)GMiW%H(x6wDE0+b;JBG zg#=#kFz|C4yEUv~sb3R|r=z7M^qrzY`RggXskoF0I{diL@Fh5<&U8K}rJGuZl@u=W z^ZNB8d~q(IE*rLH?y&26QjviZAI)KZ6H%=B8IF^8N37QjU6UoFKhbm7JWYDGC{BNP zERaVgZ=hB(f^ag(&MeCuO3?rv`Q2h@e$ag*_s^5w=og(DlFhum za|8UkFW*mVeal*|cs!cwNp~?Y!$w>h|Q>?7^lB=A{FRH*~^9esp-gWUr}QV>AK4mULpwpK=%aafLTm9GoN5 zm=mC5{jSF9AXau8;=r-)1rnXm3J;FmuDM9g5C5>y`n>#{`4J;EqMYY|E>iz9vhb}~Dh7=-e+#_BU3unn0*&L^{VH>j4-&XbQP^gHdyROTV z7XxJ(}RgkHJ70+OWWK#^_a}QZ~4gU zMm1gB?sG%SB21R}6+U!H_a(--LnrHLOv_z06++I)VH7c!l7sEgUeyk0!HmXHp7}Mt zxfFFpW@icRWJvf=MZ3q$xRN39-}Z}} zg&*`(mhg@>)*O0HEmgq#0y>Tmcmp2-^%t3&OecXgW2|yS+Z#<&c~c^bmn`*O5oY2L z8XA_=i|u};f}764l@tf9CL?1nNV7MiXE2_YHv*Js=r`sM0-d-lS!%6iup*<@Od0_z zE)_5Gexy_Mq5EP|b!(1@^5#7&Jl~Lz<{UU-`c7Pgc(n8{e({T+kvJ+&Ff-W?(DJE< z@u7N7$IlN^8_nPSmE7817Ppx!8AK@YfpoAtGB4t0wPunWQdiR?Z3`qsS^uk-7K;~9X|dv6@MQFWV;ap*qIyEi)tw%0lZ z6}66-4wuyBZ|etvJ937NI@XWpl_>-dND-n*^dFMw^K?)b!l_g8kJcn`{!>N&AC3AY zf_y1b{0*P^4PTtJ`Jaow{@ZZT_8&?7hL8GJE(#Ztp0w$jB;`g-0e{qgkIX4B`?G$P zD}AoN=7S&Rq_ijun>v9`?|c+8{m53{cwB{~2&lW!wQkyNJyNt+heaY&XGj3sJEO_M7=?M7=j{ALSa8kAHRmxBIO`9c1(mkfM#4T5fYvO?&~2PCgW=i)5R-I3V*JEZr`&X5lhHP}UQ0Z7pl z1F)(4vXz#R^<1yS?5T7mfd^%Jc>+{2#ff%Ji~%CBdqC+3b@-u(QcKUf+sp`u9-+n>_nTa_k2j8Fl@b z+iY*(%_1)V{x*FQ)w{a4lbt|-mX4(;LjtF^{Jl(d6G1w#33%kgRi39Mz~_~iX2|c- zEBmSMerosay~Ud5yR4#;7k$UH_T^YDWy^78-|!_rjS9f~xKHhi>J#lpZqthj%Latg zhbNyXmDQjId&ZYrOfbb~*X>bhUb|0aoCn*6P(Qa={$%h0D^+ z9P`Ld1vTj2o?&&_*o@JFm;1SH^uzz_#*)h}aH3>`=4Hm98GJ4^nC+9@aNtym zfSpnyuJA8Kg)mzA;(e-`FXJ2k+>227_e{lYzFrnm)Z&1DZ2a~;hE&x6YTN|v zCF<1faI1*6mKduhl z{wDi2(;H8#7Hqt_Pq`z1@Kw}(@;7&|*~*CulXd!>9if5i9c<swsZ$Bhp}gEQV{aJ@(?|`TBeg8Mh zXmG5OWStI$9eAO9@ltZ@9Vnn^BhKowgs%=2dP8`Y~lTziiNKhh)i5xBwuMX?Rjyqj@nF> zIT*ZA$tzulsac$LsZRzBE$*iT{3o;17k|@1pMqh6E%{nT%fVXD*1I ztm4)+t{?TNP5%;zbQ-g3K^BkMv;G_+^VoV2>($J`M!%B}X= zq;Z(@M&(O0n-(jS$KV|ktM}c4@R!M$ODdI7600cBog(ikjRZ=QMvKaFSK0m@zCIWI zH^)ZwkhTV<5!PV?xfQt;E;1+Vt%VmA>1SWNpu8UNRG!#IF_2E6oNH*~T`AfnW8+uY z?axk?s|4g3%o^gnvygSzy8VHdEO$^@SPC79Cx$;e?L!UwKNQ){XeNvdzM1eSw$URW z`b7J>CGwsa;^WLn+H5uBb-hefvf650t{m#vTg(SdfvJGhChORv4LHiP?>PlnuoXW1 zUNNX=CzQ+6%c#l%!S@ehrAK$zw)k(w z`fSH~Poe~)1N;T7TPlkv)W(E)lTJ(_k2cqgjkYp(*F>66)eLg$+-f6(vlwfezHQ01 zTm3RRJVFC3Gc z7{8??wn~`Gu0`CgbTW`{(#7y~vm4Q=d$UIE2hjl~q%i-q36FG11NN zaOpf{DA{|n&Gn+#iea#;VelQp(AVr_Sz#BHSNX3s4=}uBkwHB(Z?cb#!wkk-K1>qu znTc{1R-@Lh%)`Lai0z}B8B52ghR`cT4ngCE)(ox}oT-bv<<(RBX8tK%V&Da71LU9yy?#05&k zgNlxZ7&d)CDC3yKttC}1(YAU73zW`OzTGamm0ArupgyhV^LQQM{gtt96_r61-DIzR zA!+9%O=x0(|5n|qjM8J5CKB&QB`hoYimQQgW;V1RqnQPRlZ37{*>f7GGsKPz-iYG9 zJ^Sk-bxBBc5_`&^{!U@UOsL(5uV{TS@*-&}hp26hgb{4@2(}hyKZ;`p5}hr&)f1CC zC($W#V1u3sTpk|}(ix*MaZ)qCoR3P@WHX!xj~t2H&Jy0M;+Qvi1DF$|WMM!U+X>1~ zd_=NOeyZBqOqQpMq<_dbPkPt=8w;iUo}Tr&Rz_UsWl@?khWMZmxk`(#$WuF<1>=mI zk7UNncM4~d26qYb$hr<^5XDWXn^~XXzRhm*_ z2iD}8CAn*)gDkq_?N5Oi%~;}UkW?<5x?wLYh)wh z>H$r;@=Bp43zln{`$9U6VT7-_$HV$cE^q(Fua5*(yWX%!q*%$7qPX1{8 z(NCibZyBCAwc1Peimj^I%!KQyw>%qbCGjSyT9euDD|>}u6KFrRW>8|_-xj-nZpN@t ztjLqPP!zMkIf1(A!*4T18@FQE6W+$f;=`sw%~056Pm^jNEew|&tSGvLEh%!LF0Az* zYUs4jo>Cc-oV$nk+eb99Isd#awtTqa%=R3H>E%uP1*v4>s@J$`vZN%ME zXA6+8iOT5STp>y&-Db#t*rKQSQ(ro)(|_n@O*dvi+QVMSEyXe`o>7PgH}`dH^?U@DdnUL9|``a1shL!pQ==g;BOKMip{ ze8ze&mL@g8vun9EJ3Bp;ce2#4Tu`g2Xtje=$oTd=S~YxJqli7*dw6XQURw|7sG!JDX3X!F+$cTSR7#<`03 zc9n8Z`V>kt#Iur9B>7}e%mg9}4yZLy{7tYikrbc819|6}O12fGmN-LfR#MmCqKUbm z$LnShm(;oL(+WyEe5-4p0y4HW+>J>-e5Jl}oHUG#?419QPthI2#_-RT8K?DLb=uS1 zk!U~dQ{3J1$hxH@I_c9R7Hmq?O7^csy^*7m@1DBy6w!hn1a1Yn|uOU*x-lqVJuy^Xx7Nb zc&f;Zqw=B8&7+|tU+v3kktJn?RPFl<$U)eezBHz31beL&c%nwxnw+>*thuPL0iq?s z)mN5L`ia50sWK5uXOV;g@=B&UCu$=>cv1X{LC%=}i9}2%0{%sxA>qA(4?8OhjqTJU z*Y-ud8~jGtqW2dHqsHHi%i#Qvm@1w2e(BR`&P)C_Y%rZqui*)`=~r1wLtl20A5!$x z>cswwJAAL#)SREl2PE-dJAoD*m8r#??k2~WD)pnIkOdN9->2W39q^ke`KizF3Uks6{$!%ou1n8-{w(f_fhI=2Fb;Dv_NbeF z;p$?SsdPPCpv^v6DKHtRYQQX3sCidVlF^H8)>(G?XhKTi(p0(F zioV#gKD{(~fDd0MD|zAWbJeNJujs->{G;Sw@ETrf?S4@g278q?s*(`aA z@2JKdpD!!5*Jsj?$hsuX$u{aQc#aB`PgV?+C9s7>=xTP_sX(-z4_`_%ZmKM{+M-ml z_d_@rx7bO?SQ8f2E9Op7)E(>Qi~N`w=Gh&7eD`f zhs^?ffGo0!QSm(|oj7?xc#MKrH9HG>^jVJ=J0nt0k&FZ3|8ajH{~U#3I$NY*j6(bl zr`!RQ(rb<Z%aKq`Q>b6KJqkwJf`XQyx)ftJylZ>^&_NDxzo;Atgx<~pJnLg9rWCw*_ct+3R;5vhvQnJnx-eDcDz~O~5@Ep~ zm(+o1sdRNia=yZZAbCul`OWA#izF}e+rK_v_sm5$FX?n$&$+OHxRxyHorHm}-o^R9 zi9$VG#h&$vJzEqjviXV9ZAc>) z^qZ}W&ecSTpv-m@Q&vQ-SVIB9OcuwN{1hH=Ph zHj$b8`Nx*g&(X?6O3>PQ$>)XfE`@Ey>sL-{z{`j1Q^1N@pg6~b28%^8Q0SjDZ zsm&KYpS~pSxd02?slNzr_Kvb*rYkR=y`8U-)Na<|R@RgufzYmtOOi zUJ`sNbTdCkYBRXiI_fWW)Vu%_yY;s}VZ@m0l3#`!%`Rxx;>O*RejiK=nmRLG3x1G0 z;DsBn2AG5Ual#<9P$%9|COyK4kXf<}NkySZ%B_*b0jLA0;Zp^$)OP41G2!B*IG7{t zhb(BhP$T?`@V&*`sDs{)9JZg){L`NBJ|wdL><287&<}oA+>m74kDqYHZJAq!|Lk&| zQ=yYf>|@@A1!;RMiF=_mYAuu{w*(tyju5!bGk4A@I7`;7{iRq7yzJYQ1`5Y+8j$!A$>t(hHP*!PVk(RsmqbV6k+| zX*wB5zI7lDVMOOF_`|LKK9Fv~!MBtnK{)mK<9GScQk^$oCT`$SblT_#KAUzql%v+~ z#JzNEPg>ly2AWMsbpu`k)b+|Phx!d91|YY=m?`xmgT`#R*rDxre@AQe);P$R94lpxe(9+i- za}hB6*##6K;2a^Dh4R|_2~=x5v;7u$Qu%Z$B+bQzY6vJpfTN?PQ@sR6Er3#hGMB3% zEdd2W7a=2vVZ6iycAshmwW#j~Lme71 z%>!j8nXG{wW^R*#UvI&L&@{Uuki_tMJOsb3k#=zRKe!70_1E7B7x60pN0K zV@OGdrtn8O1Rw!x`qMYT$vbMmvcSBd_Rs?H>%t=k-rdK+4TtWE$Jv4S9H0t-^)(Nk zj@Ih(9V9aL>HO?YcGXBtqDZ9m)Rz#i>!0}v0nXwl2xGwgkhg-6GCH8bBu)rHZYllU zuF639Kh^8+V}XnLECFn)>6Tpjo&!Q!yp7558t^?hbut``=3c1~)B?)jLs`1q>biVC zyLmN=m%p+cv~2ohCuPQ!KoT_u08swR_ziqE{q}Q!aL{5r5q;uBLR#6b@0`f0>A~e_t#z?3PB^#II31d z5ZWc}|AeAB6!!sU1NXuY^+(``di*DFLU@h`Q9Mrl1J?iJlK;eDg00|Zg^vav5R4Fz zA2K))s3t+6lG-J7>-oHA7633MSA!B{bFK?g7l#*>^@R~g(KCroNyn*^VWV!f9-)w( z)Z*7WdXqpI2-sKO9RbPaH_=yd-~<8&8^Mr^jky9CrN(-6<3kT%LQB6Om=gvh_@d+3Yh`99-s6lFGl30T5c{v>rEFe0(uYqBWftdkOLlA`LJHW#Mfa2wl2npx} z6fQwr!7BuB!iO#Zp)9aL;3@#vS^n{j9LmK5_R*Ra05?~Gs=qtoNkKf)dXQB!!vj79 zAjqct7asU)^Bb;05r#7Vp*XNIlk_?%Ad%fAPax$GUl@c2;01vSL8$%@b@~rbh8O|C zOaJ2*0kANF_y5~!z#<873{M2KP{&4X!9m-N*X<$C@;Tsfk-*E`f*0k06{J8jG3klF zl;jII40Rd${v{C7m@cwF$a?W4uSPYXIS{qI1zEoZ2*1|rg_RC#U1sk0KWAeq1w|nk zO&F5|UNgELWg>`?>K5r(1V{|YKeQLm#utbVU=G!tv(=3@YRlPD9Y+HD z@tF+Xz`cV3L;!Gtguvf!e1EK_Bqo^C|r*1e=rm=`F5b9W}S?s@)sB z@r)+{(Eykdkd@am0FQV9mET0y`#OPBhiAamBcwV(cyszWVkD|BEC4%c(gg-j(fLIP z`2sP+tAGN)fD;2FqI)A9;-fu0Qw?}9c;;JIEtFN@bpr>M1?V)>Z0acK(tzu4qBJnF z7MK~Z!zW<+XzNuL0G!4k(t@0Wz@Z2j3}_SJ!jS9_L+Bsf;h7NL3IOQi8Q3Z?;X}|T z0L(0u?f_2*Fm{L!1b6@26U5*D?Mi=JL9)l^H+bU#qJhXWP$ZNU0ggkR^3`XW8CLor z7Fh5M1U)--0P6`B2+8ozbfMe-Di|<{f7_F=cmrZI0I(Jif6BbhKwfbF=Z1s2=Zj%M ztS?9^uFNKYk7OfSq?)T? zl6kl%{(KToPGz5(vk2d=i27ZhrF&#HY7^>!ECa;;O{6pncoWb~I&p@Z#a$^W8!>KpH@Foh9TPWKhY4AR#c_ zU3{ z#@)we0a0P|Fk|_wO*lJqd`BM-hnf-H3dWYPA^Vm3Q)xdzTYB4?L1a8+3`$axtH9jjO(uo z6Rt>Ci1EfrE9FR3Atv~d9ev0={?Kh@OKr3370xp%inN-1ASC%^O9E&AU)A74Gu{!Q zvJc)e*zvaX4@>&ngb?WP*7QeH_@Wa&DOZGO-eGQZ=>5ypf1CXQ3!p^&9DuR@6H!1b zh%ykgh|lQ>+D(J14EVec@=Oz`@`E3t9&)ENJST(-H6SJcn|rA~DTZ|_aoFPD^jRA1 zLH;JfnXE@S&EQw{yr(Agn>?*#j&9Ap7jS2bFDHcaFU=w~uiTVlU=&v1+jgr+ls!&M zcNe3~c8=W4QVR7vOPts4hrC>LO5A?5uAcY>@6IEI*!TfK100NHYD(I{mMcNUK09TT zqovimIbuJY3`teC+04wRjQB#N{nU9dwP)`6hd8@@Ri>wWo9K?yzivaOvjr-Qe}Wt2 zpTIL9iUd*cjZmLlhM^;q*9WH>2t-QX0!j;&?Tz6t3dUH?qENnxyQLI^=-9 z+J+~y|6~gUZi=_lzoI`RwSS0^8^nC^c|IZI!4nTc+7D0SjOU(nxGVlpb=m;f5!$whA2BkfuSgxny!z>Hd-Kh{4}7> z0Uw0&xd$anb8^3lrWfk(fy|uYH__A*sPPC3m{`99iImiCDySs1;Jp?m=?GRIHc#Dwi+2DYW(oAE2S$WAUF1@x12Nj`ooZP{?Tef$t1xsw{ zD=Oby>TP(+1G6b`Y%jy^7Vok%+N2`Suvco*%avQgyr-DxV}%ng4~y-emVBv{v&r$$ z8CI2;s}(<8%EORT@kVGoKCG{>qfbz;CHuTe-+Gu)6`Wm2FEQH~7V{MT^sc8(;JPyR5P@aVvW8BIXI|apBC`TW=}|a+HOLsRHMwb-lc+>QIU6P ziuq+-WG$rSJ*j*$*RA#`5B*!6`y74L;&H2Sk^XbR*{0X4!OOzu@2_&i8W^t$o*D`E zQDxNaCRsZce0ScaBlnEisSwFE-C)D>;Z>UaY<;u6lQBoahg<~9Ewoq^!tTGzP>}L@HK6kDNnnA1bVK!L0sRIg z5X(UP1Nk2)i2>pRA&i7n$u=A^Az-ffL=B%&9YPLNk{uR=Obtm5*pILvFTDO~W=DSL zZ=#OuaA~X!cCR;a{EHKJ>|J!hCoE!^!x?4YV5DsR#SxADC>Owg&h!(LhQfo4=)rSk zw81w5y+iNaYW2UTM@y`u<(h)If5C~3q%c>BgS$#ll85@yK$;%LD5Kt%H1~>fwJuEj za@@5{QLfmlrMXkK)vOmktwyy)c#X1N>~{BVK6v7Yo69sPOyaIud`#ne8{3l9&LF!% zpU^@H*GbQ;lDU*)^=05LoJzodc+Dej(NA~n4F^N~G=)-`PF)K2M}X2HOTnip5Rn0; z2nagyv5CNm2&fh>kOvisUw_KPIbW)MW=jjV05!Bf;qm{{GaiNk68yW?hu^}%*G3LY zw|K~f)Cbi*2%+*n6Wv4V1SmSb`ameD0IeND|Mwhxl@Jg=K*cQxv=#7oh~j5(UkAG> zU+rOmZToLu?I;8_nax5aHe-49LXZq6bu6$XA;8v$4$sS6rR4jxfNjM7k{2wMrlcRV zdSjU|Ol6)UmEbq1UQ^05_ez+INd7ZgyzrZP>(>3%Z^v&`>Jio5Oj=Gkc;6?hUTHpa zBN4VCTL&_o*6vpdOs%3n#H6(P?jgwAmG2cb$F(-Gv$*?Q_J6RVtII!ZNt5MghsGfp znN7$s@dJFr%$7vbBJSAxF`vugSnppRuQVO($&sYhng#sp?Q~j&-0EKn@NO%W^g6@BnI{u-> z?S$MEPr2Dgp)?DWu|Tp03Ntl48xT20D;|7QU`8H;* zsQ&r1BRAjR)GGyX&hNv&iP#NTaw=_xKHjou<6dL%NkL0kQ6-I%VcU@VmUX&i@+te8 z?Ta=k>j@oK$gP%;IlFHUH-Z2K{BJUeCsO|dz=Zu_Ap0?VIq0t<58aIbiy)UF5TXCh zRQ~WOh%FtKav?PyW-ZV?z+xaEg?fM-^d>%ES_ZWu^dY`Nb#OuvG`?g$#z-o;l)G>uXwh+n_OZO z=@hF9dV(r4A?*Vxn0uKPvET0Z6vx|Q-j%(J{>IG1%mY&@;|m9$ivhp7{lwol-Hutf zB|W1o_=Oq~Q1U~~KYH7LPUxZB#69+%7``PvoIqNud^~YzvYcn({>oI{&AeRsyKZm< zvQk4~dRV|#P+{rD&4M&+YDgW<`t|Bbkf`FbQ+1Fk{);~Tks2Wq5%R`Edxu*6EAxN^ z1)4TDP3U|aSP#DSo^0l)18#XM+-#20L8 z0nh|T4#4&SsDEXP|EkmqTr8VLT(z}0PURzW<2{D{rY1}n%b+LNyF*;}s`$N;h2}-2 z{!^!4ma-X%Oi=W#2GOfskmDiyj;du=De*^B;P?;-L3hM?v-#-Wp4>%-oT# zW|f?+*%N2d%Oq8Hvszx(NTPPLz(v%WEBNoWB`bXGM<5yd{9}v_-IvTd_%Yb~@M-?J zy4GVHg;*T&5wn~;!JGSG@g3Bxq0T`rKZei# zp$_pyKBy6)UO>nkA!r23Amk8GHt4#XE%8bp9H@Y5$03IsyP#+W(s@Yp_yYT*o+Yz~ zpQM_2&XjK~&KiAFH1BFvbDSqCUpe26Vc8wB6wRdEweBM zS^WK0;=Cs|P_?;4mO($0jhHe?2B~N7UcFG$sJy7-Um2u3T5&&in%FUIdLtY5=SvD6E0bO(cC0{0camaJBX~d|@mVqpsRfLpN$(g!P$? zzyCR>wqJbz?4OWnQ1HPZcctYyi~gjpTgML+S=lGX|H~L zy28vPG3(I>osZe&V?Gx*f1qA_0-usVH9p8TpuGz`xrBDw2-q;70(*0#AE-a&3p_uu zM%m(7antOV?*Zrot=u2DSB(W0uY42J-N{4VT(~Tz^#-Qr-t2uJz9ou>a?w*Cn2 zcUm8*n`g;hSC+a}dtaUzrONvYomtgkDNZQpQYYT$1V%ea< z5eoRjYoL<2myQOf1EBh*g$AKG3!Sep9u|xspd+}&jBn(VT=Le*^3MH^6Q8XXc$9B= zB+C96xt;uq%TXU4BuQy8w~_+KO-!7L8+TKzyp_HhjWxO=u%BLdE0upg5F@MwuMwqk z+$dz#9iz5J+Rwa9OX+YRQ6Ah$InyVo-Yj6kzqev5o}OJh4M--lscEdrj)Qu$T)CD} zMP7q@!>a_3nkE;yie%BN@NwjRiYhzDdbHxA3X1E%3lJ|0e0GBe7ks$>yJTpagHVe6 zi*A4X<8N5_L()K$_`}%%L?2n|4?)#Tmy`apyZnrm~VR3knMc_p19koB4f+t-h=%WLnyw@Nqv6 zl@~BmSP$Fw;-cajfJp|NHWQu+tY=2wS38*!BYmLw=0R9Tf8HK=Y04^upp>&{;To|9S-|jxcNV#Ds&9wkO=*a zv{uY4zlq|O-aY|`L_qB9ss{CO^)38nd)4T3z+(z)*Q{4wfu-n-R7E8*c~O?<*t|$yr4kiC&VvTmuR?VlAIwI z&U3909FhH|bb0-LiQ%~cs;qsNyzOSOlBfe3fe1=}@IfH`ReQ2wE*r-6nIHzG4FkHd zUEwtutqqZ3X60$trI5ZzVe~Vw;m}h3u}EhFUYeDGGfDkLDbiztBR5C9;dFrE;Kb~d zdz10M5GQuHd9V3Crx?34q)UrsQuX?b=60kvvb8SszhtEI(r8eWEe?f}ca)l!+9Gwf z+M+Rtt1ph%lRYQlEmK0sDKm&;8CLwRN?Vffbm^U+`l0V;kvng~O>Jg9d-odUlq64u z&rU{`#>EQ;nVH$rzh-9}lxE(U9 zoT_gn(#21BGM3BCqKTc$mW!$>yHETIP8vJ+o9KAAyJ3HvYKLo+e$u_KYL4OiJ*9Y3 z2IZxPpaunEg8d4M|0Y6=1~WM?1Lj^0RW@6S7OnS%*-<&Jo7+yIa z7b;gLw8GANO^s!$w(riQ4POm|#Xyj<3G8E_Eqqgjmhx&4Ojv{eo8zj8eA#=Hf6_~< z9xS3Ug_q-97|MVGO%0D;EX}U7=%P6n;rb}av#B^{9cGw%VfxuoS4x=AwYe|WmeGWR z1Q06y>*y7)26Uo^$`u@WnPX-uQU|0H5U5Y-O1`kbm%5+iyXPX0CpB_cM$LvtpWWUPfVRs6=6ZY|qqrQAY5;-k>y^6s80;vU}$ecyc z-S!^GwvNC0I|R3KGhY_EF*8nnqvd6QayE%gA-mknM ztH3F#$CWhYAFl^Jc<*Lll+)**#RoBwie^2f}IEsd&d8CM0p-ul?_*OUG+d|2&i0HMK%+~d68GZz@jcF=U8+swKo zt~=`T8VM>Y&qI_#u=z_aI*-;LsDQ$v9T)bpElGQqW3QN^iQD?4-lrVi%{(wuO#P4E zZzgAtACc?VQ6_gZc|i>eAk%lyzWx+RdBpB=M=JYJ8WY1AM-vk=R;?GVjyh3V_SuRO z4AO>6UET~y`=z;d`C)2#n4GMc92`~dNceRHHxkvA=e3OIUtGK-r&FfUk(-ri_hQ!7 z4`A!$Q*T`1P={Nxb0g_Rej>-~u{75;^*T$xjlg>3<&qGQcRX|7uSTYRE%iSV?tg6| zi$k~!H4@9G<~^OMCY+W9L$TiHS(lMo@TEFEJvK;5GSB-UmS-+|fMnlbZq$L(kr|;> zP1ZiI?h#gkqq!==DF>(XDV2*^jxsc~scU^U(e9;6X;sPL)ODx-J94W}Sn|%pOKzJo z^aEFIANre;sguZ}=v#KA5(2-UUx?M)=AQ=#@$#XHGsFV_P$I}0sBjN~e}J9p+HMF; z*;klhYdCr13wD7b7$P+Y|T3*?W)kSfok%Z|4_$nE*Yb4df-gWrpAj1 zIkT>5K7M{c+c%W1X@d-0bTT3HaSS9);`GlF9;_cb`Z4}NP`mN!qi}QEgj`lu+auv?ri)2U(DVU{NplsB#`poNV1 zgXGsUAGWgEn5zBk$j#S2dw#J@nPRy7`6W4ix~flA{6Rq&&d67|_aRKP94f+^su@mw zCOWG8v^p*b%Ubq4%Ie~cgmlX@NivV_)}V!7TZ>IaK8W#`VdjNr**UAum5g&pa?RNs z$=)mIGNR=VfXVNcod3=dZYq<{kJ0W;atd^J7Zw(_IzS}ky}Zh5b3^$wtu(iDHI=Js z&kHZdk{;Uln3Sq(W#?2$4Dw<5nP0eiznqB)z0t&T?O}n(RXHJj4`P!!T~%iX*FbV} z^wU=Q-VK&#Mz&46f__#dy7NIUbe}G~?SQBC1qfZP6eXJqtF<~FMiu9Zjp+AEu3@R} zQhPZ5rW=`&c}-B8={OSPzybTxSp06^nYZH1G!ieGO?~-4~E+6?ANhCojtoIg$uFhI_ zLjNYp=L*QSvMUUtrOS{aQkKc_jDc|%R;jYb9+8W4@ve~9nbA!QZms$n5}$W)Dq;ye zAzQ92hT)QD*E+qIpdK*!#Y# zn8tRMav7ZB>$R*htCv=oYWS5UbLQjee6D0#)q?VI@2c>3l>YwN?{&3xtt_&=t48T$ zQgWk0&kqEaO3*dVUEcP0I(LfqdCL2;U|KR+#(f$}DmNSlnw33|K?8v_h9&H>!!(}} zy~yEz#v@U+EvXIXDO_gL{lZA3KI6}EKmBOhQQZ!ozJn(yHuX*1)!1LChtuRyy0}yK zqY}@=*WCPcUbkf=@cfIDe2+#BPV*J*Abn})GS6?M94Wh!Q%G#}>+2`!3vaumb>F9q z2LIXJKJgHIegZnG0c972Q(DX55R1xg)gE%Xb2;!g(XkrOyNQh@o(Rhm`Ct;3RA0DX z*Gftx?lZfYzF)gJa7*_7DhKNY^5x*l2VXMy<>6btB$fQ1N^p$PC|l(#?CPi=-{bVB z1+Q#Q#H`Orv7u~ zqOG{`pW8(47~|hW5t2xD`D({X@ha4wy>W)+@X?F>J*FBM({L&r8nrKOmbI3{t(sr5 zAm<-fi|$=eIn5x1F|Be?EjZ~Pg*o4Al$c4?>3`CU|L#XoIpd8c8^wnVNOxq7-fpWbXIw{L5 zq7Op8mdxR(Zs44vg(D=h)pdlZlrGgOJE=YK);W&&&|t~G^s1dvHD>Qe?Cf?+-OXNM z#p^NJP6ImXq#QY1Uu)x1%_lT?1ipB>HFC99#Q*TCix`sAylQ{sN=SkG074+0RBvt@ zH`hIsSu&fzQGJsc&OrY;xj&U%P#caxIM94Qwy2!1W>mC7o-J3)w#aUv#vrX{`8glP z@vGMy$ML?;;th9cR&i!lp0rL;3jEdGXZ*Uf^(?13+IIwnFC)1&ih7hXXD#09W!-`s z#NG{Z3apD5R7yoseSUtjOEU>^olnFrBp=6kwp_inL&da+>v5YhCAlu6mO;@AO7ntj zLvEol34Z@7=lMAso6)OCzF@iyUbJVKiPS?XGm6X@g$on3yKt7L734n*3dQZN$2#g7 z>3um=Jg6c-XDMv5O{lNNTt1%`xN*ZG+tM)tYIqtVKb?$h^~U3U4U!2}oFcI}jp zJkFCp_ua;3%mH@Ykgk7~x3+>o-Y4gT>m!ebZNDo*j%Ua?lJfI;4J@uL=fOpX?>xTQ zA18n9%lC9)*LvMw&U5};Nmt0iw5}x;Vx_#04B^7nf;{%vhaL4{wdAVq)!0uPu6LAv z6Fpv=@nQQ-)Z9ZP-|MY<`-+gRPQoi$#-!Ka^9kp3s%+sYR5%My^;R?Dc52M?#1K_S zHdrcFML1!==JxkzJiJ`%TDbO4)(32Lq0Bl-a|N!0V`7*_{ku{Eqo;q2vQ)Qt#f!E# zGE`1|_viM<43_PF%a6sSoltGxK_mD{$wlP2=vB{_nZ$O8E3LKph-bz>?WY#ewr~lY zzTGSwXczD+gB;b%ldw5TX|ZEZ2cA^?a)r~sqplz(+)#>-BHlXlZu_Opw)u0}iEsw^ zzCpVUvP!AIGAo{zx;uJLzJb0cJ4jPltF=$3lCzI~nmE(M64S=#u3LXyN;14n_|wT4 z#fzs4`x{R(o##mB7FHjm;>}LbbgG(@(lCBr*s$?9r0Q3p-!$70Vk+fn>B&>WRoO{G zm=D5^fyx|V^-1rOvD?#XVP$Uxm^(L(Xe+Gq;|wAXUQb_A2*$2e=ruXWuW7kq9HXx1 z7p3z}`G@8R$r;2fnkn%0O?6kc|0dE}<6UHcrwhH?xj^e2ttM0SAdYAGCtY$Qt6p?? zmG&2w!rr!k_>egyGBYH=s&4D8Q-C^CgpOWnEcZNH?#s=`oo9!%p9rhL17#9Fmv&GD zwe1M(s8W%+^4IXl$nF|K4L4p`qmeO z)a#py=e-T4iY14*`x(bfVEi6(a=p=`V#X!z0T~X_zlnOH3>U0$hI-Yqv`98eiJ5>L zJ1*YQ52n9~h!)Mr7w8gJ@=LoT<*61dfgeiA*N&Sm~fGx@-GzSN@qC7R^pnt^~?A|xwtqAZTZxjELDUp z(2OmUwiEHn7G|aCjr#iW2CzWChH==~+KoU{teYTU{oP57?=5xqV{9{(>gFfn(T$<6 zEYS*Iz0XvrwWj#SRne`ia5R2@IZST%ZrEE?v7SY~SMUjs?XLL5=)=u-GO4!B+*PTM zF6K$wp&tAHCX&!H{TNJtyW!$TjNtQLMoM9&8!jB9y9O%3}YuaP;GSl1JZ-+MgCMqLuHLLkfPv!lpmLE2! zk7QtS&0LLKecM#6MK=I{oIrOYRZm=nGdqmO?tCJJb8DzA;{6%Dv*#Em3V-mQ4XqJ< z<`62EX-Z~bn0PH55R3@RTJtknN0a!&vR=6hrhH!94?ZP9j`L|-6Gfzc4-bj+NKg=VX=bCq)U>SJ0G_g21U*Rl(od@50Yf1&J1%idjc zU(xJ08rXHFY-u~iQt+(|tx@-X6A_DO(q#(c7!X#g?bNdJUZKpJg+lU^Urb%AtvZ<; zc6}M;)0QdozQ2E!T_pdwB1N!Dy@x|@Df()%oJ&UFsXu*o9+e#ozB?UuSP zjhHy+JDOc1ziFkkVVSjDTqPqs8+?UNL1EhK6Z%6Njjp*vlBA8sH!U?M^O~gvD1^oF-nVBCVWj{O3gLuI)zZL zfk3$@5cQ8@A@oe~`iMqM>6-CJ!79xzYVM5(&GyTY@X(e?u+g|ZpuEdr7J*)kbp9Us z&=)$m0nTgmZJ}zHm9)t>o40d z7$i8Sin3U9R=B9SHln6T<$q!Wde(;L+|o;emY1L7z2} z7)DVqZ=a&bn!hE}9#Hb{SiYg@7S6DYUH z&%&e9iTC1Dz!P166Nypms8uI$CUA)3(j+RI=rkFpFpV!Gj;wF0yM9g1a)|XrHTw=k zeVjOZjtFLdytrm>a=4e&!k6cudoIP4d|dx{$SXb$TVkp&@ZLcZ)vy?=Z^mY^+0T=B z-Z%%EushwO^L@tnF(`02w=Bxi;7)Y;gc^cQN&YvH_;<5+SIpUV`ZPlF$wF5xUrfC% z(`&5a;ofl_cE4&Ll!@s#=^v)5;VR#F_kJ$%)NK6F7be3Jq)??5(>?QAbdI@X&PMUr znpADwnVvYgZN9rz>&>R6vw{~3O@$tvM)7@&^(-V0KVwCHzv^c^@J)~-sBZ@gXHIUsO>F(_H!Y~rCNz?YiL#7(^6fx7?J|r%ka|H$ zox8EOJhID96{^SLfeE!qmcCs*jQ8 zh+=WR?E0#d@scgX={#IJTPO7xZs!-&i-Hpw@hWiGw!{Of-$c3m zJ!uRe?O^AQ2SH1dJMpn5cm;=rTYRd5!$Q5`Fn!Fsuof&F1_VL41Ylj0yBGf(Y8k2! z_AbJvB})OsJeYpG&ASNbO{fk2s$9b@YtSb~KGss1Qy%)^P#*79N__l)612&TeU`S} ztJJ&gs)SJpQwW1@!+`GIg~?&KVl(kST=?S)p=Ncp3tD9s&^&F)h(Wc3Dkx7r)qy(x%=Onu*oJ=Nu4A({N~dUnk;N=;<}oaOj+T zu7B%gq^*ol;@vJ-6hnSR7EzeuP12ie=5|HgN1LfhGj;WIUhs1(9%YVw+(^VK)R(gU z2qQqvhpmL?koh>ol(N8?ZHl-V1C(PPmBbYA7IBk2pST#-)5IC6n?v$4L?mS%KGhdC zPRC0V%$8GJk#(^w|Huh3Q?iO@t}XiQ5=4O{h6^gkxMZl4-w!lK^4KbzJtKY~DR9;n zrLQD+o~e-?^nOXEiRcL_=LC3HLCf{+qdsJ$NDgrzC$XWP79JgqqMbBf_+cCapDc3z?`?x+qd$23_Y6;mf9F6`;@o`((Mv-`;+@^kATUnyXg{H~2 z{vvJxD$WacjF9rh70-xWmg*^PqWTRr9*2=8pX%B6$RVeVmXULvZ!F?&4jv3K{>-nN zLvd4uq1Sr|%(dy*jgSXaV8P50$6IeC@QdV7loZF93RmjIlgub_7OY2txe*bEoK^Pb z0`JjS1%0d!GPGBbfGwcM_451t@80@mN(HXC=jlE?lGNw7x{cW*&#!ofK!X!l*qXk; zG>@TRW~2)7F|CD{@QEUB%Iq4gm7Ls)XNl+{!4txI@yFb2`c`x^D>8}`4NWP*?2bj@ zUjRwO_AQ{_MtbB>V2Ug1#Ci=iA7d6?l7r!|kb!%0z%cVSw9JUXJw%_tgqq-)70(1g zw|<5ND#WY;6?F_i(d1D7IhhriH72&+yg-=sOj@Qa-~tQjSzBMKAw$i`K*9{NSm1++ z!OR6J6yKWqMCDcQF8GVrwKyiXoj)21d=MqCu<_ zL1(U)U6I8jbK%KjNn2YW(D)f}lG+zsCwWI=6~-wEWT+wA)ELfY7SvS4%_JLkgZY5n zP=kWzkvQk0D`K{26-pW`%QaTYJ4h8qB2tE&Z|`dQ{22XZPmoS!0&O1Sh>RyX8qECv z*n0D@CeH4Cd}gwT0F$tVJ%O+z1`q{AO(5*30XL*BVR1pR#jQnabrQm+h=3@ls6oKu z4oWRrt6@`ITM!0_^VXg zJ^o_AJvw`l!Pab`!Q#^ct0Kv~fTid#yv?0m=Cx=&z+@3;8Tex>s$Sio1m$_VR^cCY^V>P?D^NZ%?;222>hxDGHF2*GGp+f%MN7EtR*JdN!HTv5)^qhaAq04OE! zQM}ow(Qq-718$bS_$Oo@F^N_7J#zvMpAqpARL{=)PPp680q7+wS7mz z)8+iE`RSXOn|m~#El*FV;l`qO`Y-M7DGWx?|MXEkfI(n*1HLB;H53c6wE$~C83zRm z;5^(Alm{EDd|(GITp#*MEpX+AL#;f}SZ(q@pVY%AKVmsFiGy)VQ5=Sr6w_naf+hX8 z$}F}8@FQ50OhSj1u4J_NF28`WHVHjyf}xs5l;#iJDw{lDE@D3^tn_uMWwud$?oVcm ziy?kZcwHrR*t+L%4gC7d?SXHX#>QB)FFziB3=lL|2`aE{^O?;_%G6x5OSI&c*nlza zY)@NRP7llcMjhdEvK_Cl>6m)pJ0gVrCT^{Av9_`5g%Zol8%`4R>|4`PT=@J5gc5G~ zOPJRIxFb^eXLRncQFfBD6FaUtFv0iI=ALXqZ|z&OzJ8u(4@Ejvq{@fV0aMnPUHw(Y zO+ivZPc|!)5DxEyyrU1|=`rHMgSE9xW9(bTw8ubj@kVa^8&^@lJI(ZQ>Q64RNSC)6 z866sv^){f^n%3$?XXzoFWfAZXl8P4WhImXbP8k<_%>{TZkgl>d+os)lxQ9|7T&~>I zQ9H)nLqcRo1K|gGEo$i|3TaFJuWxO7)J>)nZI;}`g{*CizzPgswE+(10r&gzCp6P9L#Qwy!iDLd0^oN#i2DQ^k4nxjF8-ZUr!lgf69cCev+7dkW8p@aIX=a&Du}Nr@ME zUl@T`nbl10zLPt4KoV_pIoR>o1@3vgyHQ?N9kfJb8Z{EIpvs#G6)aH+^OPI zGT8UUvnZBNM5CZblOQ`NttIm)39O>!x?Uq3Z2@@n`}2n8O#JXf%1ncmd4OO+*K1b~!#u#&M+cpSGtSXMgZYM`>l{D(wMYPpy{A$Ug*=2z;j1}+n zi!?R~l9Q}scJ4Xg#(2smf@WEB4(b$3p;)u1z)h&!E+u!5`PLFgM0_2@LkT$@|I(uxzpyv zEU;)j=I+j}KNH@nffKXxWtq5eY{Id%wZ^_Or+X=NAh@fXtmVbniatP&S={SGG}XeG zM&0VdQvNmc5mN9Hv$k)6td%WN6A!7T9ho4+opr%a5xh0VfU(kJP-XqYxd!PE#H~yH zgjZnlrwH%{Mn^d&*$^{8?XN${jbpH<9xe%xeFBLfzwz)!G{mBzYA^>{CJey*gj^6` z{~~yK?d=8TpCFF_iy)6gr_d_rR(T(!IA#|Eg^fk6Q5T3Yq(TGs1w%Olr=Q5^G2|`M zn~f@vBQa!s#9y(OcJA)cu7Ch(0yIn|t&&jgjQ6x|5Jtzz4YF-( z&IQ!cvE6f3QQ`{8&fp&Pngh>@pJC#vB&AZF(rKIk?-Sa@q4w6zjGdl6>NGQNz2(~H zkT6B~%1xG&cPA;!@}11zSNJf}W!yxGXGYK>;1>G*2@ymtt z(E($^nJAUqdh6DKa9Gnp`r_s|88Aie2wyb4PN+K)V{Fb+g(2J(Y8YIdzMr-gt^@P# z<_{OZ%{C>*44s&aI66qSC+E2rXn>dTrAJKzpla-JI9RJM1q9<--P8SQ1YMqVoVnm2gNO&2@ z8E(W5{Aa+`tuns4m?H`MW-QnYYQ+-KntCbhZefq}HN6ftJrpMO4`6~)^NL|#6Rp}p zOG0@=HVe<)@hYH}X76&b?lD{vO(GhcyJ$JQCrgyxjL1np4$8q=D!UWg0XYr`|LG-2 z%$t!|fh=Rdw%`+%{~`RAPdoI3gv~|40J+9cT%+7Iz7sYiz&FN2FE&7OnN`awH>oiI zcvrdRTp*Nk1j<72Sp&nPT@l0U;oe~Xh_z2IMr9n5fCd?ditSj4sd5`&tp`6Gy>vSJ z0DRhO-+A|=fl;iy7R_zu{olN4;auf7Qwfb%b0aozxw-BZT{aNg0XU&VtAsrE!h9&3 z(+b!snszoj@G6m{Y%eA)qaq^M`o3FbE{(1%;o`}fB&CT{z(=g#4q_~D6}>p&Z#qQw zB3xHf%pIUR=~Kivj*632EW{s+69lP=Hg_Y3?Qx4#yu-K&c}IyW_Ro@hAVMA6cV zR4lI^o5>NrX@#V-mLNng8!-qh9CvYS{aFE*W2!3Bhm1+$N~Bt!9bp zZLV|BbrTVRY$`Al*o>9s^cg|x+*#JBJ5+i_8ar&cyC;vpiQYM-^XQES`Uqj6*H2pm zY8ljWTJ}a(3*e-fU$BV*N5OIL5nLb*VPU| z9LirMgaq`z@`}NR%I9z30;g_eJU3t@$5Jp_7i!7`a2)tJ7o_%uY>2_BE~AAkyg=H> zuw_(8(ZR+s2zP@lN8+M2`ct902H2bf!Uem;p?^kLwSgjGWhWlK9uA)m>xoVZ-F68O z8oi}iyD-{hN4h*c0e4=v zh2u3R#-QFo#~2cbLC?5Ag!mXv{iy^7_Wi#bARs^0Dx;_$Hu|)|0@eVb9_0-rw@{I6 zh#U#v*dt9ZI@f3w_i_1NHMovwx^i>bUT-|N|v9fr@#UM3px?Ag3l zkiueCLiO3d{#6DMcxz{wY9zsTZAGeXXPI4^+*e4OMjB1cq;?Tq!qENQ5YQaO^Ae}u zazLqcmhmxg3p#*PJGy+7#Dk2nTViMrLZ4$l3@D#@bX0SAliNDTA) z6g3Ni`c|1!X#18Kp%&RW>EV=sSmad-OB<@h%(h-`)c`v8gam(9od$2RT; z4a5yd^gQ7Z0I~r0vuZI^12Wl?F#;rlb>l1{WfLectUw1LEr4;hSYCva!YgO2Z}DT` zJ*1;@Zk4})b;f5~t}!HiD#{uM9Rk%sPMI+)kUUR-vLvWA_rTqOm|Et{%67h&1*!b8 zPmQ6xg%_hGu~*Hg0N3UB01+bv&PSOBeNFaOL!dx{LR%Pc4d#Zj6_z*~;=@pC^5Qmln=;~}QU8Jv_`-4k^zb;KUHFR%5JOC$T!%Iwp=PKj zqCXM8p~6Qw;-8p6j?!oea-i|T^N1qM^S9mU-cz{vpZ?Oy;8@e_nL1H%gf}7exG{g3 zX=S2r+}C!?!REs#G-tAh@3BiJF9k zEE0a2%V!G172k#@FZhmDu*Eg|i41tb zMC47e#m(vwdv`{)U9VO%UeI@&E!#!9&y;_}C@3m!W;6RY)&7wrZ8l zy|AnmV0$qsWssiwh!=3MN~YTk+# z2mlh3D-TBA8#AlcM2^#_lar-DSaM8H4=j(E49%G@Ll<&i9%rP>UF!!lpM^mFSj`=u zyudLA8S{rP@Zm0Tg&u2f8|<6;F1HOPAiZb)TI9{h;&?u1k7_e{wdI-x~~bOsVd zfMKkMA{S{J$_s3V3TSpIRY40!@|EB>j*k+)?y>8?;dMjZVn#PW1RS-=zNw*z*|z&fED z1wFnJ+nS`*Ve>>|9UvFri%NGVEL2097yrqebs70^+RvtoF5u`!hX~lfC9jf9k+2K#`Q?d|*;J)Rs() zjBoRcxOCRMS~a)ptzw^Nk5n$aPy8DyaP$a!pk-7j zAiN`w7X39u208>XfFLq%BMl=oL>stMsPABKyMo%_wjjHU;EMQu{I@_PVFlLaN~>_# z#v!mJTlqs^sL|tv!v>$s!1w@JLy>Z1YWk*u9DQX3Wo}7kK8=_3_+R=k&E{#0KlxV| zeO)b-Jd7@H3CO3lwe-T)RK@9gP2dm+!ipHicOjkSW-x_6kM%@Z*hyg@U?}8LXC$x( z)7U6U=V6xWm*wo7T6&yGJHA12%CkrF;zkI~_W3JNvP1ZVxX;mY(+?UoS}x~;WhR$s zI(o+tJ0)l1D`Zub=45gG+L&+?J5CK5lqR4FOWOSZ_|p3blj*@0l`c}_t@YzbE`u*K zrXCYQ9V6eqfZescNg@y*&h{RrEGNgvxkfaceRGWT3mi+H#d*`Ub*ebE! zan~<8-I`DhSCeQW$28is%r(+FnQHs?N?o`3K=C|Los20Bm_RfTOH9qhVJ0)<5?qX; z+@dl?s^Z7EmwCZDi4}V#*1LX{v?g|Z@d6VuPEyTon#f?$Ilk&a*si6DAL!;mtLwdY z(F?9=#qsn)o^zSg>STsPbEn)`?X-^W#Mq@iwVVHpR1W-pUWOG%Va+yuVGhGp%B9vU zGe_rn-d4OClg+`oLEoFwg<_ZDN~dmycCl-~Ly5PPnM=lR)UWmHu0v* z1`zogdP!$tL3mL^;*J{cT~)Rh$wMh+`32#nJNoBwdo-LDmrE4#HmjSUYlgbK$VEp8 zH3^m6Nvyo6Cgcg^=u@dPUoQt0{O$AZ#izT9u-aVqmglndQJCrstrd) zbZs~sIin^>dj55hFo%J=m~m{W#L_1*a^pE(KMUu^H&aOsiTj6aQ&h3S7! zo>EWNzT2jjt8*O{fzMwlwS(l9iZ;{CYU$UmQ~cd0XWQW#nUUL)inXh>8!OEtrtR;| zJ-Gu$pL3mX%!^J$AtYJaE8r0=JtI*dfar~xt%jk5A5614y_5t>+yT8Th`Pg^0?BPv8b+$Z7j zGzNbK5OspJG(GV21Rb&tB^o+AT1w<^M(Bmx$%CUTY=&I6VNTM*LeL=CEjTP{p&~KT zkAybTF$S%S(gSiZ4E-v^(vy(41kmI3JT~ZUKzz)?0!X@8J9gUQKI%zks)ugxfJV9v z#)KcJmVl+ey^?gBHVm*di*jOHL1}dnR=)`|Mgtho;?)(RPynC@kBYZV1I=7Dr8K&Z zu3tx#(M9Arb3x$_@fRRN_milC69o`WMl^kmB-a5w?bPDQ#19O>@Zr{8wdV!}g{eDpDl% zTd7h1@wt(LqVPOIGoO)LTQ()T%^TlEKQJA8!}_LeyEXOhNTgH1$bQO>Nb^Lv0!V(QCe!xNF+-}FEp)D;VZG|Y-bT$4apJJXb$W8j zF5`r=ssB?WCcDqGL1boe-eLgO*1%cFfBToSAm76{!KhX?v^9|c_=nXDc^E*)L5(e2B^n&nCv!We3rK`bK_Zn z0GG}R2*#1;#1+n7cA^$6=ZNV;8@Ba9V9<$T6QTOm2}XK2uQAwA!&Nb@7p(0^!yw8Q z_GA13(&6YbN`ZC5fb0#e5d0_~3`#UF6^!R~ofklx?yF5Tg?6kY=Zir3RmP=kJ=1r{ zirH9QkEstC5(M^@-H@ShRpFP#xvU)^F0izfK1&(*p_i}W{6|3y4S;EfMPs2^!uzck zla$>(_6w^}wY)UZc-gr_a6b<69n#nJz!eD}EKrKDU)q7z)k#Txxd-K*ZDZUoUs+A0 zt-|byr1-tdY<4_srrF`?GQs$LglIR}0w43nXgBTdVIwecGratWEH#lDcdLx6Z^76~ zm2-XHS$8uo&p0BQPT(=Di)2(rNaf;F?KCW!*G5y(HJ64N)j96w{&C@lqnsREiPC*5 zHz$lI(^FzCoC_oD6qD7d!iy=ZE@-Zni26jb>CJNM1u^VZjGR@Ar#%paVM9S}K{LlC zswF~f$M#c>C-<`y#pF$gHLHyt+{M1raps91h%!a_CdLUVsj`%YpfLKP!)5J>UHYTb zPL5c`$^9zeWmHojH~!+$&QyJ9gO_C{mRIblPfwMJ6N_2KCB6HYtqxKz!Fb!@yq}0~ zG6@>Bky}uQ@q#b`UYB8Af{XaY`tOyonP+THb;z)hEiAm-Cg7xs1~B()URs%3M6C& zRB9;ynS(P-utC5W#J%AR!SkUN3t7kN|L>wu6AXzfw#-kA*?9p&n~F8_qJ3Ooq)JQrF<*_q_N%w^;Bd_G5SVR6Y$v*vGr!<#vida zEg2uN=E3lW1R8Wz+a98e{K) z8%QDbopC!>8QL=?yBv(wEx%TiGm4uXE4O9@zXj=7x&P?|>8r zS%9f@t6h${3<+Q%*(-c%&Lc+iA})`LPkJlpWYlB9=fiXjYP2418TH7qdcMqVMF&t* zP8~i?*iOf_Ht@Lr9`I zxJ?6kni2lmv;fiz$1>4)Gi9hnX*t;?lu_%WTV)e(+~3RB?L)%)O0<>PWqB4%-LTzu z&0m9hZCuV2u}>c;7M;@O#e5tpeRWa#Lx*5=a=ZHW6%sr!*+y3-kxv#j+9YDQOdlnc zT`DRK)$46)+!97YZx+wfngJZe5i*%ky?s{vqYj^lqSQc~6>w$ylfIijy1gmw|LmOg z*{G5>{_C3phx3b95|Y!_SUczW_B$srilppqR&KnbHtrsY>d0_(-KgX3rHUM9aBk)& zi+++s)$h^glG^_k_p%%@oH+?b&-mqt?VkQuHq; zW1D8o2)sj-{1FwpYSKq+jd=czvCnjlBTEV|70?QE3)e{+s}`@WporqMF!Lz#+r8v( zEMKRgNKB$y#46$mr?cH%*Nih&n>e3Mk`k8`=56fs=KJh8F-d2S5Wl_cmvuBn3j@>z z1ZLfD>R1hC9nuaKVC3MVRtIWV!j?cVoRH^r53$!|BxON>;0R&JX)(M2Zq+dW3}}uE zp>tgV>}m!}job|OKY$voybKC;6t4C)rZx+Vz!7_vCQEV(*#S~<(ca{l=Y9rkt^5RK z968_!!iHij8g@ZVBtu1GH~~lq*+0G|159!QgPOrENb?)60THCZ?Le&ngL#KAocalf zIN;yV8wiB2h`e`0K%m|f4@DIW5*t#$C+lQ%WUZ59ElNE;YWO>)ZxsxqvF7nI*&HHo z8_a1-_2w#75o%>cu!3aSwo(0X;ysM4tv)<27`Yr{ykQJA1gWLrbA@`07@|^_{eueg z7!--TbsoLTJj|1r?uupmXqOn~8zz5Ug+1mObJkrMPN#jPsv5$`9|bY^JJF8AD@wx1rZ<<*OWj5qscq+-|>< zg&PEcQLpQE+zI3^5lx82NtLRa`(!u&wbHEp>V?C_)BhV_-OYRYJDD0<)TX!CxMov+ z?q5UnFC2Z}WuFUnyxJOg|0AZdjZsuGvn5@wx~hdaAF;>VF2H{R=^H#7S#@z5;i{+% zo!{>g+U-8pZq;KatTokCk#aPJ{}JmeEX_HikXOHNpVD5HN$@zlhlc|-g_=v0KUT^P zUA(h~-|j%)Tx1yxMC1)iGz1XCprSFPPWHc`LuLYU75;5i6Y$mxp-GtHwEFOZbYyRxLqG?>>~$G!@!|j21>lAMznNOp zFp~c7hJW(*zb+lxgG85!$QH35GDSq_Bd9wcQHo*&TwWAc$kVNci$p3N#fU*`BYxCC z4o4dd9)t*9K&am;gBM`R1E$>g@;*??XiCDwSSLNUE&=>Xx@S>D=?gHv!h{Pv(JWqk zTI}@;gCOgLTkvwzA@H_6nv>|vdUV#%GqAv!9H4D`T~Xy!)b6r}qBiRg5r_ zKFOC%+``Ii@?9s=bD3d>s_MA47=r}0cH0KTc1oPPE{QbilLXUpqcu!EcePASX!~W`#sbd_f*EvvS z*^}zJ#M4D3Z>4`0wPD;X48G%rxy2916)`$(OHF)3!em#or`1os-2T-pWjSA_hz zb1y9Kp|a0a^;fioHZKU;?ytI4nWds_ZKihQKk18Wh#LMadZ~KmtLFnS);Aw+{|E_? z^M*<8ye=4hKg$19F4?1m4QmMfHbX<%Y(?->)PztI#J0_b64|p8rmb8coY_DnsDBc= z{?odn<+jo^R!xGx0$4YMR+OI&k56#HWj2r-9Q|K6HvSX+u~7y`gsV3k6H$r*`paW% z&<0>KWWS=v3I1nTaCClkzTsrxAbi?U6J>Y-dewkSD8>WeBrRaWqA@JwH-E&6=^hRa-Dc=lDrd?>w2N6@G4vP4nqin|)0W2hFFm($D?Df8J_C2W2c#U@X0@Yr zKOLU3k>8)D_$+Fyak?zsHO9}3zLUiDm${6Fbj})Qadxh_KfJ+gL=)?K;(FMTlIFJ* z*;=N0|ApA5x0w}LClq1cQ4Fl7Bi9?EYZdkju2I5C1Z$&-#dMxRr9Ddxz}8lWP02ANJqOyihRzi$l2)KJ*ZH zkYR6hc>a?hnJ1U-#I{sNTy&P!3@^DZ6F9lIo{_zJwFt9*6YEsEW?&;I#+iF>B+jV$ z%$Ze#6}o)hwuYX~ojJpGsfT@9@q_KepP2dVKmX+JbxX{ZXs*8{@H_1Tw`9^8(B+>N z#eTK)}VE!hS`Xd0Ln!4Z5CAp7q7lmZP28nG0H@PqJ*o=Um075XS9TSloyig;rV z@&A;cIV}2!&5;;G%K+iG1O_4yb$WfG9tJIthRF13jJa*Vx7{c=^6G;HFHovQ0}rS? zLY=Mq@Qx-_V%c;XdHBK~zsSjY4hSBAT~L-c-E2Q=02<~0cM=K2#B#L5(5*7xwtl)` z=^Fl-ZrJF?k>e8E2#4UFyajCcu@1`saF%phJ3eOwJLYbrmM5iN%Q_Nc)Pe~`_^XxB z>7`LTe;>gRc$yJWzF#`FfrllZ+EJo?yn&zCH;6lRymC2V-T6kmel?f+Q^aI+beQ%N z+_wdf8eZDQT~0dTGkwD!uY}Ck6#m-(%&W!zk3~*9)86l)D(|t*E}v&w;ZF}gcwwnd z^k@^WWxee2hXS`L@IZZjp@;OdV0^nHJCJYQ@l!B`CI8^AZ?U?2wb+h~{KE3i_M3r{ ztNF}3DHBbV-sJFAv){2C`@FgZGsTHMzY5I1bg0s9i(hoM>-dcC?C(7*82?mu42oTO zNb-FAv@vIFJITh1d1i%d=hC*eGfUr3Y4YAQHfyB$;CN<5Gr!I3^vqk0+#FnuJyXlL ze-u)EYxi+i^ob*vc;ehi9+EHn)$o#MeuPZUNR@oKj&NG7vsMdb43*ha20i=SfnWCJ zf1T4>d@!pub&5m(tuZpAN1FD&22N*OgDT_uhi#K*(_`p%k`-6+1X7$>x+a27bYUGk znR3f5)6xPh-fr zn2KcWLDQvNfjaA866%`GvYk7&Dht?(MvJ+<6{#u%+|VOqg*Czer2~?G;km)Z4vrC@ zrq>{eBg~)#?PVC{{AUaSh>EMV{;D6IeNsoaVSOsx9`q+iTCPdT=ayPUJV zv{P?}9pHB^k;Oac%`U2I-1@w>%C0jL_3Rk0F=2;O7mIlH0|C8`r+iO)zg}hgBsHgq zz43}>XO_EfAw&Pdh9Uy168rQr2Wf}a@;iHYYV<`!AA`E#zv1Da_3DmZ?-J3@I7jK6 zxBQd(oe61@%=MH&CyFWxjkKrZX%)N_cf|{~yHFNipAeLxwbC%#vtpgi3l{fqdhEis z{ar!{G%*&H;x@iak4GW%@1tJ_x)$&-?JK+_8nMbUOS8SryslES?-Kd z^3|nc(Nj*Ys5qz^rnk+5qy22y3Kw|ts%oyed+eB!Z2Xlpmyz=9q(H(i(U$NC>pYAm ziXXgvuBrr zBzwI}RnNUyY-*ZAQ-yKojB(K&bB~xmSTFUuKl_mEW^EY0#yx#@nW}WQRQAmQ2)6b@ znwBCmVR)QV5I8wt$O~+GsJ$0JWQ^(pKs)2!V?)a303##6H}veNDwN?s>*zr?L+Jx$ z415xvD}$qs=^xbzT7%|*uWP?y?I29p$Z_2?PS!V`J%v>Yhe+PpVR%CFBlb1?_zZ9O zX6c9tjJGChZDD?>7FC4B&5sWR<)b>!(wJ^-s+$EKTz<-A&1XxnOwm;nE@RMcU;m2&NxgCTDNerk#Nt)aUD63O zi+B+ii(S&KpucRIU6?%g>776Lt8>2PHqU!b*Q$c9cV52BTv3$kT-W@Ui>f}5HrVR< zMa2|d+}JqGFKfNhX*S6^)fX7iEin}ZeABiz3Jav&AUS7tY||2P71QzYH*D358uD9+ z1N#^gzI|aIS7;QoQGp9+*Y9Aht2-Pz8hGKx$%jn{O)5D~|5}hgsji;xgiY?--yqC0 zJ_*l}$Dggh7ti6&I8~*SNrtgp3(8?j)_AO&F4T^%H||hceZ&-#J$l);LCm{sQHa0G zl#|(mVeCMRDV%AxCUB?2M76d=reoYR$(I^g+U*pD;>)=EPYP!)!i(&%VUjJHnjhj$ zG~-*H>1Xj$d5lD*A@$gwh0G%6x+tqyJC$m-MCu&FydtY3>+61Y#~a8Ag+9o;lZ!zD zpqVXQg+bmyD}8jN`BoV+T~Kq>;MYvfNtgK|y$1#owE(0cD(kJHk#+>I%y$98?S{;Y zoYDo{9%^@NE!dvmlb z&w(BmfkX+yqFd~7RAnt3&I}@cz408>vlc53S{$|!O_GV`<~Nao-!_9B_LB*8Cu?jq zFt{YUj8$VnEhd2$@~J0(>@fA#*m+|VfiF1E5xJhkldh(ZW_1L`=#Y&#Brn=y(2?-e~-dvNEvrEB`y}kb(RGa%iJ-U}}B;p=n>4 z@23?NRem02>GtELv}iZCUjJRvyU*W{Yg)5=1D(vY^=^-+R7~l0_u)t-EUL;{t#Zh8 zGwILYSlwJ9eyx6&CoNY9&A*#Fb!2-R$2R2>&n)z2_-mPsNGvMtX|HCcF@3XJc@D=X z&YZN7z3u9u7t^pmnkyb|>J}-KbiouL@0*T4Tw(PMt@k~8Z%zENg>~cSFFdp~>l@wb z`U-rvwXI*kggrgZjD(YO*|NNN`N>W!Vvl{;o)Eg87gbE&vZ0JiWen1SjO%BFnh|2r z{H-BpjJP&Jxwx2(ZzQwzB$cG}oLY(G2u(2w`{HP0EuWo z49Hj6R9JmvwHOQ=)b&G#BGPN4;DT%puHaKt{TjMhFgW%9xC(t1<$L7158DAHA?5qe zgRIE;9(6il)&y13U@pb)QU~_+?X+S6O@)g%*$o3N$OuZIlLYS6jA2l$&}3}hW?oit z6DM8%JI7Tn5iSa!m2c7)npx!i`R4aTpi)#BJO9Vls>}|Fcj<6{c%gP3?zC+&zw_$v zCSCaxTf!?S2Aw;{Xt#0x2OGjGyubPMV~qL=?n+4RieF+02VS6P=dA3((+eX$==q$_ z9J84emd2cN!-USctTUz6(RO`L?bo~PBd{#;aM}f&SLk>0g^HQpy(?~i1!H^TSDcs8 z-=DF}>VUyUKh?Uly zO0yIBx!0=p$lP5o(RGV$<#r7f;|6?kI+ahXc+V$j4o3aWmY#X`Hq?`@|4-VVnRWx_Vzx=Q9Iv_mA#? zikZ=lj=?TLH8+6m(+t(E@(<8G@(JF=2dL6}`-pb|F!ol+pK_Cd3ihcHTNZnHAotR{ zOIhq}hTW!P@prA8L%3m0%6{5J$Kpqy(=~;>2X~jnEGik<`s3iKH*9YP*JxW4j~M_z zJwjv8p7VDUi5XkG$sWwKn-cj%a;CKV-TobJeX#+YyJ=os*oiu`_!$>XuX}V>PzRJ7 zt1yydD^tEJCLU8kB~7W#TikiWr0WcwcqHa!&qu6I{@ly?Rc1x=liPhQoEG1$?=Kyl z@P3)GGx>Od3RiKRR`zRc#aFTiDr9%bk^GSBbiyUYJw`;Ho6xJ~2~N{8_Ln$S?4)Uh z&G*aL6X?2rk*#Y*w)0DOLHm^aUQxy3JDNGx5;NZKEwv{Pj1v7H&c$-j7%L{1FppSM`DGuesfbA3ac^W3rT z+Q&Oeqz7ncGC#L-jY)K$vsGwT`K?sdew)}yQEmM(U*Bxfo-rD*Yt>QR39lJ zJ^tiO4pzRW$M;;k&@KPt=B()pYlSsi9AE9^VQ%j;mb{wu{y_2j#=!EmzmTL`h<2vP zC^y=7O2xz9Gv@q7`A7UTkdh%imGgkalJ=;!9oljrtKlz`ue&b()xPH5$*SPAT(NK3 z2yJPIGkc11*@lx@{Y`6a%pVU4EQXiA z#8k=QhgSuMVzk~XcN<={PxiQT>rLLxR(^#`*MFamXY`(3^#gsa*;g$`J`c?!){Jpo zlOwe{7^=T2&5C;@&hS%9`1MNi`md(%6&95X-z2ZLUb-vX2G&kLRV zFh&d3n8^*@9m*6pOWkK_a*)Yk1?U(ZfB2t{FX&>!a1MH&5Osc$QR1Kq(CM?gQ@5_I zWeQ`2;+|YED;%1Bqn~gA(}XK&@zNMuz>$=njbX=xast;L^;lUUWCxDVsH6B_Bo)MB zQBmTf6&+&bMu_XmVB3`>XHYnNS-aF8z=k`o*E%x7tM?PJLZmd28Waf$YkkW<}HQ znq+o#$u7BOp6Yzw+Ws}KC3Yn0_XQ0eiZuh3Cs=Px#~A6r3fARpYQuA1(C7j-LCNo~ zXdj}2u5t@jv0jm?inJR{YOZr;b{{v_u2fC&n6>?Cs-tUtA2G|!?3&PqX57m)mRzH+ zavr>uyuVIp!S|g%Xv1sXPB{ErbdWPv8S87&uwM0Z_ebmrZTJxF#cPwI*Hc=`!>|1d!U5~BUO1ZQGVVHtECZE`dicEzQA30(`e z7F9;DZ)~3XbGn>zXNGmMc=^Q}>ZNT2LOOVj@+{=v?)^K7mvTz8ZxGkp;7SE%F35*y?5 zX~sL{4zh*ER8ySBH4MkU7e;@pZxuRoiEQoBF(t3<7^U*n-W9(u;e|NA-+#L>^6s3_ z4Cg|c#67mO&BRWMxh=)_FZNg^xAWblZQDP5bG-1J8BGyl`;Hqo`9do@&cSrh{mx_O z*L2(B^`@`qm^FXIlII=Imsi=u(TGXf9 zJvZfxE-9k-}@)*wZ(iH=b`}y4F%?ADDbMZ*XcpZ_l+euV$+* zSc#^18EfZ$bDr2J+HgRL>k0h7uabX!cWHchYh!ejZuVr|{^@M_(hquP(S3o_ViOx) z%~hRW_UScj=Xd<<$)QF+=s)O{vU8#l>$EwNwJCP>CIbW`3$@% zd{gqzIo6WrenC>Z?(iw0?D0{=8NRyj>J|AhVujH}f3{nEiR(|_F1BY`S50~0B2gU3 zZ627L<9JcRh>2{VUu}Kc`el?;CV52q$bDLKNC}xb#ai1?`QoBONSfpAAV>ZSzVQ(j zR=?4^wa+@c>k_8DKjNzpWU}jNaMyi(7#|{zn<{_*jOv>;gIV zK#1>8*rGuePtK+9q^6eN^QF@^^^g&t%}Al&e5d7_QYWph=)e2hPSO=t948xe2y1J_ zA2DZSM1;<^#3}->+T>P_`Aa;F?X-BZ1IEVEgjTfb`TeBos1>dFUX1+w5|c`KtW#Eg z>+_uzuQ?w=|MPdL%G}wvzRkHyr24~mXlkiK;>zBVaWSSqMwN=b7qtXp)39>8aGw|% zZWRCdOJhvtjfpC<CqWt1i<-{D)+67Gq5nict3 zixq!|O19kLq-#S<`ID5Ghm!N+Dl$zj+Tdzb^>@p3rA<+km9g+o4U@>sb$?zPi0Wa4 zF9XLwrwIK;k3Vke4?WVH|L9K4Fg!(1oYg;PTJG*qKf2cK(num(=+}f2jezJluE>$i zk7SgXr@zq5OP}*%#@ItL3)Zu|CrL|}V(-fslpkfDA9W!$@un`5Mwk?=GKQOO2xs~5OF}Ht$`osdudyBJ;`~K_jyr@u<{H$M?)2Y%` zBrahLBv+b;-QGeOxk^bR?|g@gH@p6Nv#Q*-=8R^i$S&=xKy~DON^B=heCUy)rtYxF ze15d?O;^<<{6pyU$D4{X@w#?qZ*+CXhgR9|+uxC!J+`Ra*UyojUS8TmD_c|Tx{7+Y zCe<3l3EBG01#ztGCjI7@-`}@@?@ACg}-ci;Ow~RMT_zG3V zc&WKp@%9#pxRpw?wz&%r$oDSkkFCmeefcIe@Ahk%Y!Myrc4B=OWa}m$coa8xCb$1e zn`ym`d(D^3=$Dq}jN*`dqfMKqer~*N=FH|Fb=cyGEsajfvweC(dD6`@e~uG*Fg_QH zc;Ze$$NILRj|eU7(Ya&;#FiZ!J0dMe>557%XaH*+53&unj!Rq++>`6hrmmL`Er6$N zx_=^y2c?`oOD3r!XsT!T_a`&*M^5+eO(7DUE{1IzPoCsN$(jx$}_HtT+4BZ_|JYs*_{vlR=ujQWQ)`S3%}li%+Tsm$l-*!GvLl_A&g zdB4=%KRBx;CVcXNYD1x$+@=j zo7QUe_Or&ff3+-Lx1hhjE4+56jY9M53O&}(OBG3${`w+yS=q*7V?IxsRupG0a1b1b zYwz9?_NaOHiw2DU>+0`>c3~iIfAz-yCLRq{TySo3s0hp5W6{)J&&ri+vh)`!-1)SW zX;|;;>ZZ>6FC%1|-AJmw{;HTiB`YoMJ@^H+ z3b}RYQ3}HV18M;$@Cunt{LA-{qZT-!jr$0G39%|FIgYaq{W3~hL&nd|^yzHR(Axg^ z_ZCxzD|D+@)@Sy~_UY!QweWlG$U}rjXyI=b7ltdQ(yTN=fk#5!^4q6n7ZTUym98HR>IsztiPGvru&h*e)0c^ zSX;a`>AVM z5sz}LOKe%gq08>z?+Ge)!NRxUZ#Mh4Bsenkfw~9O7_vF+wJLDkYNOlY3Om8{2X>C4 zL{SIE!t#yi4*lvcqaUBoWF^WKK5~894UczQnlR2{hHBf*Zx=j$?QC-3k+z7l;v124 zv`q>&cPf&OT@ZVj#(IUNI%x;oVnzK?{#qx?aXZT#dP&W9SvMjidD#v|F6~W{vmD{V%(FKvXVT%A-m2cfF3$mpDa` zF_O&{zPst;@hf4B&bob77Fy@<@v}UY_46tCuc^GIsF7%aINw>qy({^yJCr{8izqCV z8G+GTS0B`BaEnHl&1~VBF$ZUaZ^mvVtnes!_Pf+ayW}IroI6a{zu>FQ$MdgxGD>*T z-rP59@UJ~iv!seFI&tm0aOryOyS}kE=vs66B1M|)Kw|6SRFRs@z?95&>~!r{yyilG zQTL2V8uN#Xt6ODpt(fLw>jaX({KA>Mb1Ck*6Li)yUE^x|K4NJyx-%olrHkZcN|%ru z+@dq=>mph0qU&Aw9z0N5+!LhXQy1&`xbNLdd0$KDUzz!Y@pSZJR)&oHGSN(i6Azmc zF=8U!x`<5X+Tza5vrN0aiyv50*j?ACz!jRh1AENFQ^lBSvqWy1V(wz0)kKx3o4gMv znd5%MXJY+1(eT?_ZnDZtMATf5T&XOiqE`Gn<3PnE5r3W~zj9R+w%Cp&5?pvr(Xt8? zR_3Z0r#IXdUZGk3rsLZp&91y=FG!s%){`PTi{Fyd9+Q!|-DB*=kGFQ5>2G?^CT%m8 z!mcMysWD=3j%9svS)#Sl_0lYE^HuJ=Q<3A7weh)@)GS^SyrOx@OKb=lt=UGv{@l=XJl9`^Lx^UPAXW@Fx=^lJ!5(@_!91 z37xzcDSLyJbC3d$s7#XWU%HRF!AU!K|5!4; ztS<>xTJ&g_6YzL|%F}p=w1q3Xtda@5mkR;O>_V#{7t(*AN!EnQc4ENH^gKc+2?~;r zOYuh}ko96ZlF!ZKpj-@x(5tlSfi))==JX{MiAz88H9F+3zd%^MgfAzix_DmaWCjUN zf_N@n_VJh_pG)i`qq8L9pj(jfIgSQhRaKDkduveZKj5YKjEu4WSzuHE>n3_di~d4x zY)ys#&6lorHso6`sc) z$@QL3?f-sZNTWc7CkRit`B_~1{O?b~T>6o&!qr7e+-&Fxcy%yeCrnY);yeqHU*cUz zy0;GpU9g@_4ytTx5zX_LITJ@NMY2QVkd}I=cD+#wmIaB?11kQMxBus~_G!EN+ILXk zm(a*uI41(!mZU=ZBv}tmx4at+=)3WOC@wi=(e|=gRKjl-UzO8?nYu{5#Z0*kl8Ix#dk2+ z1HcHaKJH-jg z9U@S|3%L=nLpAD?grs|gM1$!A9{%iZXyOE@FQG`vw&)QsxDQk+gE6+rDlz*hTT)~f zxNvlngneCC{xvBF5_ctz^Kqs5qM&ScbWn5|eh#vIeyQ-e6Ar&^(BaYdOr z#!@G)KM&L{7dIo%8Zrc=VhkkFpDXr7(iMb7Pe*+?Cd1vLL@Y~HSrLBMj>$;Z_qq`h zByhDXO!BA@2jvu%Y>w^|xx;ij9E^@qf6WXBg9kP4NJX=tM}C^n{Y!Qt4teOH2NK5# z13m#g+6m8n-C$k^5oO4Q%N(mR!Z+pk9D9fN;ZQ1qTF2=g!}g4zyr__du-x&1#W{Dv znQa!irPI<+2n;U%lkew~j!U=hw8IY1L;$_>R&7P6WB%+D66?-D z%l?u;9vHxG1ov=!&-U&{uxq;REpq}0$@>q$VkZM6);+~#c@ zog61++MMYQy2q)KvJbG3|8RE!pL1w9Ld@gl2H>rx+b=wUH_i(|p(S;Dkwmnpi5q_d zkkrnXuhV(c%k7H{Y4+0*irKfHS!@^b4?y|hM^Cz`i-E~Kd>Hc%K`6|gxk3sD7+hxO zh)cH7XA=Wb*?3&#Gm+%H(UVg9`cz2O29Q!bw<8|;p3AcjGuJC3=i;VJW>sM9=O; z^<~Lyz>WC&)kao3a;3{!`{7)m4mN?2pMhl1sf;LLvBe6=Z9Py&%o+d|ic6DdgFx;% zZ?g2Y*jah5yY^AtjbnE7_b?Zk^%;FjVCCPwzO@vgt?R)27`Ti zOU)OtP4)OWw06SRwt7nEI>!#L>)+vJT9TOOiNMg;^mhzJA|9~?WIQ>fWHJWWW@OUZ zE7tKOngkhW5P&JRYkbseflYK2HW)U$z{L9I*%3lMqVN00#t5M2v=}*pg#`tw$;Y)i z=3N!usVr=9^a5&-+pI%Aro|nB(ca7vz2ipJy5GKoHdv$J(a9mR{o>N=T4jWxa(sO~ z0EyOvhPdjMb4e1g<+VWi4JfpbO)ei0 z`M1D&je_}I*wAQ*M{DS5AZk^f9Jt0l+k-;+lxFBP-~B3FRwYM}VJ)i2D*}qLRixt~ zV^HNmtW<{dVy@*N=oAHYGNcw!CQdbLZsv2+EBMbk?{;JU-_dB6a+ky+@W^cjSQB#8 zxG0zTzQ`N17j<@c7R6_NBO339G#f(P-e583iD=09+O>qODO-J1Y~3!cGo!8@6U501 z?S}tgh-=KUi4rliRXAinnKSOO>>5;WuWiCqYWo18`45oXh8PpZ@!MT!*TWM|yENSg zM!2!+~YCH01-YpPl z;pCP8?q;#CL+ProZjnTi?L2#QvgkN;Ak2Qq=)+)EJy@Fw3jGaRI&l+TJR&3sm;FXb zdkMb?O5Sma5^w_%6y1^QeC<+PtWm2`*P>>VWZ5XIv#d{eGtRxq!N@vUR~95&xna)^3yBh zAU2{k#jGmR*_7o%5l{=GTQN->Q%XAG#cG1+32lL-Qhs-glX~C^XL0-WWg28vED$|L zzYv1_X~?6eE_GSzmsE<(P!;=pWW?w4**Ks>G32)y0WkwxY!unRcSg74w{Om-4N8}k zpJm4Xa-dz+hSbU7D+fUP5;t8X@8&Srq?c|;{{x_iBk!X8x_>|``r&N`SYI5oeRhC^ z<>P0&(B&g(hOhQx1&<@>F6}ycyFil;$3)EfpTi8H$UDG3$I%VlpHkn&^H~?YN%m3^ zoN-S#K`}Gp?Mm2p1%m%;k4Kn)0|5xi*_g=kL4a`h=TZ%~?XKh{mu0F-)qv zuj)F&U$&1w%}7tTokS5dLRU^-PR4t2*Y_-&0UU+deHp7390mUX7)Vaca?e6}6q$=Z z5ZBsWm7DYt=`jNNg1!=kJDwkd!;?pTIjXaYvx^;asN?dw-<)97xw$)P)08yHHl<@cb%ibYO=_dkmOj9pjU2 z0I{Qn^gNrMoXF@47H!2oKy3qSm zpGn_6Sy0pYmppd2Q19D`=TEWB6T&CU{c-u|5mq5#J8;rEGTpb)x$g`nkQ`B7FBOb0 zkHG`@PONE=@-(IO(e8iH5-By*w{>ngB^T!%@qfUhZ&-&G+?7ukQ03B_yJl9q>ZCzOQR$Tj=T}&PbeJK)SSL3&PNf#v zoC?nephFisqM|y%v!O1aQuP3sWG)WgR7|h-ugJX!u)y@IrvaNQ+p6#3Ii#a@|e5)VI>xPmzMqiq7A@C+g`>Hs1% znkmM1PF{nL(hv`AGhgQ~=EMF0CF{j)kv~p=#A!ill-~w3elK}sg`C9X$;qRov@u_5 zF)g2Mu0l96w0O%wlYrI%8*e=-_7a2mT!4*Y?*Z;*Xh$_0ZE|e09`^@HPE}7cAe`!M zG~h=P>i3!bv!XGGTM&`Um!!Zkf|G(sB-_R0MyiootJ|ujVjo&MoegL01!T~Mtls8! z<+ls7NxMMy$r@Rp-H3(E>cj3Rfq-uT)5-!hs~%Re0^Jg;*D;b43Ucvp!~!34Ip|)yjXwfsCRQ+?M;~o_tLpeIjZEbPQoH<(FQN z1{`T9LCkGyFBUq)g%^I2T}8kFXG(+f>sgRM1FRr;len!v79vshyhXffnrjll#iqzedymyEc^t?6tVS2HP0w## z(8vQxk^88C^8MVino%Iyo{WI++G(rr(b6qG!a6#x$=u&N^2S!UmLF=#oh&4w;CK@z zGFej{c}%$GA-(KSeRYtqR=>df6ROcC8oE}ozca_vCSIV7@3~V^Bs$gNHoB2!P zybw~NE)GCm?CQExo8&~Y^)u=jjGXp982gorcQ(||XJ zEHo|&141M+>#Q-|G4src`_BBHQbBAt7SxGP_wWZ46mMEdGO9)&(?48bp-KNhIl%4Sr~*O5CD4Z8x^zXk2@6R*Wg`OBng z#A$V8`apcKdq)GPJ*&3a3|0H%&Q)1LoPh}MhDwG4I?%b{t@gNIjic)^{6aH2s)hfg z{n{zL(q0!TJk@-t7=p1PosCdF#?;VqUE@i12Bj1$*KK-%00nFqgf{yGwT##5O?3b- zjX{XYRFDNd*rD2MZou2vP$s|%KGQ!u_$h_+?YB&E$>v!ivJWo8I>-tFdSFtID*Lmw zvXd~_Zmd8xH6>&0E06f2V(Zg$l(WWs;qOBfQXoP+-0-{K+s{s+uUbes~wAa+5| z2OSvmjep83HB`f*(W|ALGs;4NnBOo1PnQXebPbfssIX4vU%7BYt{zH+ZOBlbhhP9l zBL=rdHxQ~|p2~V6Wx;dhwQ;H(DpDzBi0Pu*Qf7qN4yu@wX0{ehyW*SQdlO4lhrElL~)T6n%29ca1ldy!9F_FcV3VAO+lDi;#BOKbJ>c9z%;`;_msrUlq1;qA zNf$Os(fu{RrGq6TCjyRi;h6;w!u&&GnAn#Fy`lu!IVY>#khZ~X#^OlIRoQJ`d%=$X z(85}>BQ}Uko>M^deza?F{NPZli?Z z%wE<{9;#_SH>7-&GO!Y0QTN_hw_Gfj9WlhIQH}_3DguKaSa&Bpbsf^Ajt6I-uAWz~ zw>lCdc}kgal0@1;?*(vQJtvb$5GZ~X!ECCSwgWtpOOXFy zpL|^xd1C~I7Tthgt7G6sS9iD(T`#;QWshnD)Qm-7N3{B6wf1agW)~>9?A%Yp^3kA8 z+BsE(GS$|Zst(!aT)1qxXZ1hl+TzH*=zF-HTyK}AIpgPzAIkS-E*bB|uO1OWZPgx; zCQ5Ua9EJ?M$ZilkqgB?)9iiw57tJoQ7_tqllPN_}Mb|JL z`(woNx=L~u>YfOQBN}*~)<=ZlodvE0HkH?`Du zkh5zOfOUb*+8KFH<23YiEh|mzvKYaXbB+h31=8;9^iOb;a**21zwB&sdmJ;&T7|*g zQHsclKFHl!VanN4X$i3LZwFMdK-?_nrz%Cg9UgEnQ^L*EyDF`kH02jjE{`?n_9>JULoGQLmgc8fAa0&B`4R(X!AxswO#K&sHJl zT)9sybTgt+9{O*WjMKcg*wu*-85)#(k{ckwBX^F^oR7CtPA8n=FG;SB4N4TLm?Et5AA}-6>=4!!xtGkhg6!_G>FnM> zgQ*+TQGrGTiUYLAa%d>U|NJN>%71Q28pxPJE&)2$i<~p!E;nGvDUopzZN1niW2k3YQ0Qd#qe1ilt{jCsw(wUFVl}MV)OKET1k{84Akj ziNo`e^sicmN6{)jKJT+Q_~jg%svJgUg)MlV5bVvrtIX`{C68^K(6mk>cNI#mRjFg{6-o;32J+qD_1BG(#ew+3*q~~%Oil>)IL86eLs5!_!TRyB5Wt_3z z@nVe}DFe(+GP*yIDKeXeD-1fPxiVjvhEx_jZ5&+|J>?F(Rn2^kVnDwDvjduMB*&py zV++TQ8XeY+YG+M~vYF0|q~iwe)0*~~)p4uX{iyx7EN-`qkjF&^l^;N4)V?dAIM{S| zV4n*wE`HqM9<}GZDn;QqoECrdf>8F|oMVfENZ0JgTf+^VopPDRO}4Lwzwm)zAoL{yyXy?17<%2z+t;5P zeZDl>|{Vtaa8Fqs40=@-LF-oKswSC|coF09;(1K_ZH ze(Fsyj}u412?Y_-)}hkI$|!dWh2MyfFaT{*gn#@76eH5_%C?=5roN*}uYG(NuhJTo078BgXb9#`}rHf!0ao$0Gf5YQJo%Z6( zG%nCC(sp37j3e6hvW|;Jc>4?X22j7=ps6#4K#$Bf*Bf#H{OR(%8Wby;tun8&MMV$3 zk)oxR!k7R+U)ZPTF54`D=n{~r6UO+n7h+2*`d+e9;bKthbl@-4g|ahVv&`z7DAH>$ zm6|N9_2xFaN>~CDs{k=xBX!&qfE5%7h!>a1^}CH<5m}V%360a;6jtloo0Szvb%983 zVHlC&_6ZnQUs^&4sD*IP9x0nEOyXexr&pYs-jh*Oe72}5f+$a7X2BP54`qQE%p zPA=WaLyu}VD80=VYtOVO0Zx+;fZi&rLW%+Lv+An`$+>r^3dcxSHMVTe7zA!w!NYsP zXf|e*)=!91-zy_%$=!8jb~@=Y4X5t#R=O5g{&nFM_+k~iBoK8YT#gqVQL#>reZu}w zG0A@fQ=RT{$SSe#g@_q4qrI9;YlKXg>g|GK*xL)FVDmfz#^wX7$!!6A z&UEf%$QMpeSv~Nn*(0J9d>QVyU3QkxOJp|F;@CX3u)vswQP^qx9C&&EfdDddgu|*9 zGzg+I>Kw!s!$B(0m~DJCvIr?gh^yDVgoH}q^Kq3L#)CAXL86#uybfFdvPT9~oNp^~ zb-Q6OmeuUX3FLIE@Fk>&;x1%d!vyRMMqcCdDQ9)AHhfg8R7TjW)ym#7(j5G8o=3*4@e>1b6;TPN=AmGoLuN^3eKgFgmw5 zPyX;Snhy7uW1>O&$D+yUXGdVr86Fy!h;Ug~^!N8R;n6aeA?wJ@80PdSBXB5zfXEv} z(#HCzDDOBgBlKUI8XR+-mkREISpm=L$za-nq{AWQi)Af}lorLJH%AmSTokw4$b%G* zLs%9D9wdd4p#bz+S_ z*4&3_a&wNkod(r~2b3QXtRSZvK=%7qV}x~5CL8w!mzim)-VLl)!HW*_@HC~xag2`l z)LmxTEJnayQR=7aZxaD4qd;LdZ^IAdiO$6?F19@hBg&3A2+;N11qNM#3`J?vVJp7D z-w%U*82Xpg3xs0I+I?N4HzP6VFh0q9g|H4vKC}%j!BO1Bj1q4mfrr1dBWa=nafw%8xN$S(eY$qVItuEldok$k;WZbi8$3tp3fEPOYH6Hl^X5> zweJwQ3L9DoL3wUxz)aoyg_K?Z*#?P@>`4_Zn4uB?;~VcX$EQ+ zi*~{JwVKJC745SU5O;45;#_4@P#@%mhQBV!W9K?J56#LH5$PbJn_+^cpyh;&w&vK? zUVlVm7=ce$c2v-D&&>nQkD>$$Jgilrww8*QEy7%MpeoT?QDBePEAHM<@d5Ec-IF-9 zCO)3+LnJe<-E|8-D!u6vUiLFCYP-O7aR=VV+sqy@MiCu!u%rWhka?tnjwCp~ojDAH zQenqgQ#}L?r1h$ejNehlBUK@l6=wOAR+s|+bR|5(6(lp{y!T>VyfTK(1)-w_Yvq>lN;}9ugddq)Fv{6 z?RBma4U-`F;uTXpRpDKth_=w6Mk$y+h#SS|s1WkykX%&xrnkN9F$@kHsr%GjjPNXau5=As>B9uQ_lEJN@&KpOD)}e5< zutL}p^CZTsa2|S|3UHIlDd(vI|HT)JEaI3k&YAg_B`iP`5v0C_)omt180(i%e&=eG z>v4OKYcN8*>>#-b3N&z9?ME%p`Pezn&2??73q)-K`LoG@Rifw$0-`g2H)a6qt?btJ zv*R>y;Q9gdv%L=QFQQ~lhB6N=$x)3+y_rkG5k^-$AEz`PVW#7)*kn1xIU$gK%ECTD z4PeA3hq&lc!GrRypS-U{M@M3rIHv0ZwW)doi-zBRf()L~J^Zh_anFPkA!tGK94=-e5Wf52edA&=SjMIXmowIbiyJg97;l#l*z@t*C6gjAI^|MBmLLw07+Ufg^C zs?*ynjc5T6itr3-tlE~pt9GEBnT+Q~N;Pb#LYc=QxNEF|X>lN@kU_-(j(WxtU@Ym* zg3OV$BJV&ENu6*{9_EhDVyR-N)e{(;P*F{UFgz(P7|FmTX^|-D8|NyBN5&>$&KC^7baC%lsA^7-d&*b5k|sxcEi-kO6=~ z_lc*9N~Lwq!#OZWy6517=hO89JNz7j8eG6G$R5y6=8e*qgtO$qFB2?xvRTCZDbo|O z)#~_F7LQE#mU-?F2BQXzFp3cwl-|4j1g6~dUW8dlm3t=fLjBQw_Q-g&K>d7==(GtxcF7iIKxgP1$<$V2%UXHBF^%M z6L5&|3cvz>or>sdoo$6rVd^M`teD#YRQBlGY`hdmr&zv;Sjird4THuRGT!xq%ROWy z8$zL5S5hj~T1cZv&Dz^yuAbV18d=yW$oQ@fLpsZ++M%IqO=fzN(?$c-S>hf7`az--fI=_ARBtm5xDfck#(==|4oUQgAQ^db>VV6fQM*QoM1Ev z6hR$cuu9cN zog##h&IHoQ(&a*(0y=h*j7z;qfYWYblEP3+lwM&?atJr z1(7ple17?^MqRl&dZ2Rg{q&Yls&uS zVsT&t7fNr&dqf1ME&G#kFoR6zL!JU;)|0jzdp(AYyr3F(whJkVeOqAcT2T0WD*R`EEhs zasG{(frMu;Rc8I37o2H-Q}WHYjKVttqOERi`XCqeJ~`LN-tbdpz)%;aL^-J7P14-9 z@I|Ec$@|27YOAoQ`M3fwwCl2BebJ^k~zLqlLcUennJT?$!p$qsMNhX$}V@Uzn4 zLIt@KOJ|Z~aHsh$_H%5jEUZ&syb&i#gG9`!_=1k$+xepBM=<%bV$B?H5_H-Vw62m6 znG~}^iaHJ>->-a&iC!RIe&KynzBd<60+<6BRf$2(_glY5%2$pbKZ47Dvp=kmS?x5ca8#qVk6L*BJJFXH~x#uVO;>JN?)e-*I4ncRQ4 zrQVuqcjXIpJsWTFh@unWI`DK!rB(VM==;t6_%lMcTptC`w#~h!otWff=Kle0t^+*J zt&aYS0rk`dw8g6YUU?XP{+sIED_c19y$_z=s7rJIfTOkzhKRZpL+#;z+y7~(1OMAV zoM0{h0!4E3FrhKL1ZJ!MlTZhPKwtox?xeyMGUb6lZAiT_GI;sq9xl&(=kWgdlUa5w zrND8CX!o)m3kqiFARZt>lI7l*t}wEwKy@qv;ghKcJYUUSl(^@&dVs}L@qbi4QkG3$ z`zUddh6ACx>PEK#l}e37Kk{m!_caBC{tWrwm>q@A{O1vu!2JUZ_jPjYKGX&Dxe2H4U1|l#-qS1H@xk(^TXh(Bq)wf&01c(GcyQA=d*n z65x)r6M~jKv*WPiwv({oTDZNix$qs<$C19{{mi?Ak=Dxn%AhfOJ3nZF|0>n`^S-lt zDT%7lLmJ`)Bj~dkxebXLJEjvm+G*~?KZM+$gT5HFzwp~JRKZJ%<;4$mo+LRR>+Xk! z2Q!GM-cLKfKQraGx{}U}YXHojh!lJ2X0^~huN>$_vGb4?7AAXz#Y{i^eWz?VqNQYw zEHb;n7HOOQ?N!#E^j_09%b$)RgIYn^RRcoddQ_Zy+*v=cw;JJ}BLgR>~?t4x&krv7zt z)8VaVC^JI>`Agc_@cbXEqb$EVuH`N4Qd``_N5_-&mF_yLmfCr3PK+j=^q;$D$O z)A-prcTbXf){0o$nBsB&neP|I_+G-~tHP*&VZS239m#j7#lI%N9E#O+!?w!zf*|!% zZKYdJ533nUmQC2#qO5U-0u|7&tz_+$0K0OI?!gsP} z6K8!m8-vt^Hor*sk4NTg$e2&>IavnKtNST9_}6(e#!tAX*dM{TEZO?Q{I($Udpwx87{r7vFSWjHjpGef>L3C-Qt@pPQQ# zH0UIo^J(8v205;s{=p&Iz>q~c#@Bu&k1JgMdg{dO?X@Gru)ir?CYloBCN?js5b~%G z4|SA9+y zfG55e8NylctHKQ}zjL=X@gK#M@OgNwa&8Iz)I!M2`IH%}YiHRppWxq?O874gzkF); zUEXIzD%i5%S=OujM@`SW+}usbfgdt{&U|Wq@aJiOtW{LT&r2~56jC709qnq;FLm+P zMo5c}7_V5mpU^_9=B;0H*YdtR_E7uvx$kppuh-C(MUor4(+$O)Uzi0SO)(+qCa0DY zKSgoSnWlg{Ka*vvJ%SC@{EGYZQn=+r;=+^{H?O~EkiOTCgv`{;-|I~}gZXq$`hpb>J@O9XV6hh56fs0H{B_Y2#EyyiRQx_5f?U0s18`8LqptW4TDcsWZ-G#whTcOQI zF*s9?o&T(UEp+dn+q`>2$WYT+wy!Oy$rLxDB0}o09uKKVo3F!UhPj}YzBWX0vB5j+ zd94>MT=s9N6=9R#)tENlC_Z^qf72-}bmgpOtc`gagz4L1tto6^mq zWB}Bv^)5`hnswmZKm*w*@C8|Sg~4+ai|UOPMM&&iFM$O&XCr7ogEEZ~6L^oz^f-)x zWX9)b(K?zV#rZ>0T=3)s%FWz^*WJSD>cUjc^pBlXSuuCD^`VSL_2*X15R+u-rwyOn zT+QE%yULw%Q~6Nw)Jl+?TL-qrW`_sTyM85m{@46vul&->-`Y;NM4UmNUe@X%*SFHU zCLaoMACf79t{Lw&{O{Pxk<(SuWK#|0e&wO_Td`j}?kuf)zB<4COzo5#X7W>(youDR zdT*KpHc#qmX!rYk$!Esel7bnj_vp#5denR8hf}>EepL^zPO8qY&2cI&EXzvr{C4s0 zN}fFR#fa*xpTyU`E!#BZSC-Xr?$=mV8E;Aj7ig-^waC3w)6JcuYFjvYKU^tX4;f6< zvbpGH)+F#3;U%RDQP=p6O8k_=SbS`(Yi*y{7zgKFKnJ{-1-O;sT_@CfuVp|X{ht*- zKDs0jXp!Pq_LOr%95%wiPU12_2Z2$DsP;l!#@s>cEAr2c4>j_hw!V&^UNX!-hvbDj zsCQwuks_hU05&`7S8#3D{-aaY8>fP5JITc*1Vn}i=LL8#9Hl~VzmfI!OPX9@_=(fB zr z6uU0fplGakMJm%+dZP0$*D?j@h}1u*9_H%AZ&l_hmmij)10*H<89izzvb<0IIgT2Y z0x$dneE$K%en&9R-(G(fHMLru(UW0UKfODO@ynbKe)-@*LBZ70R!Xbsm(TBhdz~uC z$oUg?b@%0;Na>?uOX)wpGrRBpEWSG`cE&&deRy?rQDnxoCD8Kps|WX}+Z?*B$eV(|c21 zdCf@avYg5Cm|b>}N^ofUny)ku93$j)1*z1JQaQf1@d7z@Qc`LH69op%=1+W`kRm$8 zc3izNytY2zCq8e3Unc)q6oUTo9zD=>{QNSibCOr0nu7hZBR#LTJgE)TO2A07aOj&` zgJy%P4a$|7?x>!xbtl6p#XMholcB->p1VSbI?uFajhB>Xw>7^EviH5p9A>xGy!w8= z>#^eqd$O-dRRS`-o0|BkMv7>ki$*3^C!(`6?N{43FEd=0j(}q769V|9gD+Uaw8_)= zyqnX_SAT77CE0~bpTNGID=OiF*0OtGyvBB(ujtQqn1swULfEtYv_*4?6v;9pL^Rbr-6h2}XLePBUp@(&UVV3zw<(hM z^1+j^nWek0zXV_1<=zZs9@PY&kX_GwdRZ)?^7-AmTl*;NO~wbD>C0zs4oVZbQ#bm) zOn_E1ow_og_{6aYTxHmEn8U)&7K5`-NCpTo+jw@-RMFvC|G)mh8rsQX7vd}8VeT-! z8kg0%)&Cty8$UK2pZ&!^Jemx|0|GHa!7N}X3fCpL!o37e{>d`XUkaxgYm@+3M-7m2XbJ;#HDYu>MP4 z%E3h5_lSs-N|}Der{&dO4`<>NU){L$Be8WY|Eaqm>iBEuINjsg0kjB^ZWmoh$|DvWkb76OMEM5o6_gOMQ zZO6+MY*rL)_ur{s?C8mnGcn5Te4SiPsnO*O2=$5$8?Xa#4xpTZ!Y>ReuNn${kuJF+B2yLWQkREN^{q*$_nQMk0ePFha21* z6{SZ-0}NM{Lp) zCR8Fae`Sqs-Ny=#`(C{K{3~Br`EZb4pmKH1lPNA6M@BSXC9F+ltm|mNc0*+{T>s6A z(~~66k^es8v3Jb=av1f0!bV<<+Fx9DER??vj)CMhgb zLQ`4#n0lin<5XUz;%EIuhwi%ctov(s-t+LE`5-#@-(hZ3jeK8!VOs_^`I1lF<9_MN z7y2&}-Z@yjPXA@YRyx1@Lh9_+$^7KLNdAs!=c@IG>e@1+^9>f|j*Z&%yOPssf!g$4 z$?4=*xT=f?`YhIs%C!>ocPzbT?>G1Th|1?L;SRCR!S_h5Qb|{zyC;5ZVe2qgwpGYY z`|?1CGQU;8`&jXF_rBthe$vXf0?$_~hOXyKRCHjAhR5d@BhB~4#v=6o0spr*{QE6~ zaZs7DxDw1nIU z8T+*X(eJ5)4Oax*pDTtdZ`$vfim|xQDTXUHthe>K&qZeTcKidRQ@_HzA|)AK#ck08fdfGfYb^uXp9|P$Jd83V^tUCO zOPm_t-jh`6>AM&545Qz%cf8(}eY>T^-!;Ivh`cT*zdfZxz5%z-9*(&4W@Gw~ z>`#nu3=O75N(h~>X^(mxl)vA;>RC8?V#MjIM9O+vce7Te44Tre z&k%w&KiLfTwZ-{<%_;FUoKFy46thvT<+S1Ysrz>@`|99uTtxVP&K=pg)r~LueUfXp zJ(nEMC$&WOL?(tG4;8~QFeyLIbYn5sNe;*xRfevxZfIdm~eSkkai`iTX@4gK&MdxN^F z=O&~gLLc=~M(&b6B^N4jp0DoFoDuAkEW1APU+4*?iLZl`6JG0iPEYE9qq?UjJ`hO} z7wNlY8F(#y=QRtJ6pUNYt*+c2J9M*qYrOuH;(2zgUm;r(@t@+)ECmCNhU;8)fuB}b z;1pNB-0}%hWZZvmR32wOVPg$b-rW`GK3g1{?PRXi7M7MUM%0_IyhxP`c+aQyTG~KY zt-wparvW`X`M@W>YuWscOz}Nr=B+g4nIEyIR`ea@@9->+y?G+h&z=%-)b;Ig=^qQF zfimyw# zg>Ij&e&aH@^7P@W*A6|2ZF{(tn!9`0H;H=JYfraz>6d4j;N#BA%)qX@i;7a3_x>v< zW>48^s_Xxis9Rj982aNdy(`pMc)V;BCak7#5l{V61-By#8(m*~yu(vvm;OpKd5%(R z!)|ravs}8nIJWYB&P5Zk7 zd{|qnS4DbJqbn{^P-o9{^%4u}`ky`2aFTtqIFkK> z^zFs6!xJBRx3%~UqE8CXj)PpwNC7AB(vO{8ye*G{=RIjrG88<_HpeSg*tYr?xy|8aUI=853oFL8ZOdh%AP*^5+jcwnEG#hE7_ z8g`|hD!)8A6BtCQs1;FAzZUlZwYjD-RwMmD<8)D@Q9zKpPxZ}_Y+J`SHlyrkQn-Cy z&~FskI=+5II=kGHbC3N@a!$zgf=uBDoN_DGCXV8d3@q*~CgFmrGY1f|wZgY!q~2BO zNjze{VOlnkM{?AuxRmg2{q)}Tm#nokU#I1qA^(8Xm-2=0XM?yutQ5>t#xq-Oe;(z$ zq+YwE(0g26=f3h;X>Gf;<3w<7-yxy%;2U?t!4haUSubS58En-V=7F>4&i<*^4!`*q)1bt*-^Y zc6aaF(L=3;q{q?&gNV;;mIZ%~5fhUoW1OJ3Wg&m{M7kRS{uW z<=}Wp`J>-%hVB#i7iEWw&y#A~i7}qHd=9?#3T|JX&Kt}8b5|U07+6=+@%a83qZ^sh zcTB!@HRo2}vgJ;3!r5}ZmB;qkaj?~*W~!_$%&`{`g#*Mfw=lj!zC!NF%!%C3WrFv$ z#}e&6tjy7`)i~{W^w;%kWM+*?a2*t3Zhm)~cy`y07yIGB{XUD58-2S*gx*>{ZCT4; z`f%eY7jIPjMsiqnxVf)5ptE@1~Ct#*Y8~Ue>HstSX9mT zFtvb-lq`aD2rQuF61wD4igZg!C@J0D-6`GODJ&tqba$tS2unx`@_yIf|M}**cXs;D zoSB__;+``Xv~q#DoMY|{*Po+L%HK8Cvfn3E+uD>iUvQp4yfb!F_gYwxOwtigp7TbV zQeM%mrOZD%D35zVjH?0d{82dguHm}a^SipfGsoY}qD-c}+it9yrr85>tu^`#zyrL7I^GVlOn3|f>?L|CcRZL=4NZ{&kf3lWDO*!(| zA|55kTOGEPxRk*6F#@gZ=#{jVvvM+<@UVf5Qe%E8v_ z&RFygGTOpTgcuCpHKk+a-8eC&!*ilU>y!sL z_=rBW0t%)eB)$$kQyS%o8*j{GQ`#f<55VluJr#NJF)Rch(T(EW^<(w^5@1;0Wse{U z8Aa^Bc!NNK_xc&ZdtACe@5w=qoDl@^A*1d&LPG%00jP~U|2Zb-HBD;p?h7vgc5mM9r6aKE2De)EAEn zeP6$w-W8GFW$w4+DTEbA++E`7=5TONMbmP@4>)yx`;(iNL*m9D<-Sh(ZL^2cOY94? z@^^Jm3Qzmeq)vGIX@wbNY;$RBT=AYgzZzNj=Oki!k#Zp1r1V}9+wptnipT(+RvfeJ z`ZJi7-}z)7bn+H;{`4s%Dz-wmCh*zQ+0Ul;Qjrd5&9$hOnw=s+*(Xhd3eKhPF4+fU zJw+lnla^LPuT5C_`hZW_MehD<{{2EJ z#jdw$%$cvy;7`F6JEpJYPbTAh z@NQ3jo1%bksbav+eOf%YBm*~t^t&|b!7e}4oY@Ay>{5tu{0Lp1?6hXr2l=7gnw|6# z>}4xp<~<7zE)7o%6sfK0uWXD9Zn|4vHgc3@16Nq z?oaOJhr_{CVlFxp?@=KWjX6p75BFxx>6PcdULk(O-%@VWT6H8MCmg{X90!zL)I0Yd zqB}gTMGP=-3MNrEgU@ufEe$|*1{`aNrGIJH*Eh1)H|M6fdlwX&bw-fipP$O7FsaFa zb<1-MI@eLB+@B*gc{D5g*gEtH7~N;UrHHKQuPI$bXfzsFvc80-^rmJz!w?LSvT`NM znJ0uV8u|Ght>(e7u5PloYFxZ|b;z<-6&)Nu70R@B0;?^eM-WTtFP`%6ozV|5(wZ42 zPZO!qGZGUlEg(?=s&1tPHWjEr{7OZqL5kg|X>P-!|1ju8J1SG__(Y_b5ubxmFDzaE z5atx=V%5w#o_nYkYI*3e=B7%xr1tgHZzD4@my(H@(!pOzeW>-kGQFVda|UPa8=_tW zm!5siA=WgEu4s1fVx?>swRQw&pXN6BRMVZKgWUH?9I1B1+F8)<$PBG<&kbr)?rjrE z)BAUPNtBI3n9?&gH#U{mzh7|crA2xg#Y+sJ1j(ZvQeuEJQI3yo6FeU(IS09S9y0C@ z6x++%Eq$`Hvjcw^wXbkpZ6H^;2*Qk_YnGF6rvh%wa?i9xyuwSy|V7q=pT zF38`D`o8F**DBXxrnQ{^@%Loyhk4aBR!)rj18FCHunTy4ZCZbpThEEQW&yRZN0=JX zx#^!}l0BdOw|d33eDWF7LHqLZtB^OfXr&wd!4Ccb^tM~eKUZfkg5*J7EBORoJJxW0 ziAvbzoL}i3oMY=#4yx>NxMvZ=v+k+y__$RG(!I2fZQl_Zz7ucJQmePM)GTjlUf%H% zfBNEw$#SC~tw7Dp-l0odv#Iys!~>#}C5>6`w`X zhA8x>th+Dh*>pO&T*}F8qc3h* zjtj1Kw%UJ_CfilAxM`#?N^z_>iWAx+s`giwDvjO5>!KtDm%y_hmxrp=YUx>?-aE(q zH8nDwD}Ld%+8O$Ft+`c@TkILTpzDGX-lC7|u3EHyrH*?m`^l{-+`;ErD zWodKfja>GuW5|-Col}oHiW6c?wb@Ng)_PN!aLRiE73=I`f4g_k_d#&I!K#O@I9TX z+feOC?5MiI^BCXB2D1?Tx8kY1$=Mr9=gHaY8){93Zxr8ff4y2{8<|XJ9;?3|Q7eBd zAK!izN`5b6T>gymp*qBY1(qQpp=dbt?EQnJ<9DIwVnh!MYXyIQy&r9j8d(xuy>bls zwJeB^4oZl~JNG z_nJ6!b6SOBcjbZ@Ti=bI)G)&^2WmyPHOUxL;)mhH#P~lrBoTTyJPEezSz+p(Og~1zk1XVrLC4_{IYr7U^VsPPK9nSGbgHtweov z7Cgm-P&Zu^J6U#d)3b9n$^3K(Ve8u8p>?0db)TtqpP@Cvwy$5WyhJL*x~EIG9E!XA`1Tj} zSN7$toHE-_*NBL5!!QJRx9r6!0EEWZF!vG$J;%h2!wRQ?``Re?WkB2=x=Ude_OI+@ z?=wTMOb;#2FWyaWspcPU9QU2y)5*YdRS!=_XFJ6!?~vk!r_ibUZd*d3Rv7!i>F)Ba znHhldH@(jQP&Sgp#CTCfs6BhxX~uI$(bc3|D7Ml)=HH2j!9Zcq@B_ux0}FQ#gHU1n zKld;g26SjIPEtbM_egGU{NDU#a7+6A-^}$8p-R%D@uRW1v2pacVxRrE;;8S-!_7>R zHGY2B|6!s}%>ZY_Oo@6iHXVgAHipg5FAH#xOeuRwqfN&Dhpe)h2#WIslZbYG7@Ve&l`c}cWUEl2bkf&}1wG%EbV@E}7k-SfBO@cDmQ_OWDrJZw zPcnJ$m@+uva1F_#gwLp~(9Qc!CL?>svV4tHu@3{gBf>Men6Cku^5h&e3T!dPRd zaG+2q9bR66e36DWD}FQ~NZt{wmQ~@z;kKg|uV0kG#A{}Y@8)TqT(lp9A(`J7GNG3B zgMEBBUm`@_(bLnkkB11Y(HGFeb)LX2J=-o*fIZ@ql$E2*#;SB-SxE8^O4Gq6W0w9# zX%fX51=u1Ho*2b}2m})HSw=?EaLAZCT|+pE=NEpk$rEgK%mXOcRPo=$nqaGN-Sgr^y1C_9{&)p% zpB>{;A{bEvyEz(4swGEw2*buH8-+FYwAn?4MFa%+VeTT$@Hq)b5I;`cb}K}R2!m!s zElpFDjxGW>1VIwPmsLbCdx~R9g6Za1P-_1nZTh8LDrkU;t}rY?BfAGzQaxS0eW>P> zvZ6$Lh%na(j;hA2y?z!FH$*_Bn8{*xiu)%!2n0_&!q~&Y!_ArvQY1+WmPz{qKLzpA zNrIE_z!5NYl6Z_qj{vAY=JwWncg*=fV>EVq4y;K~^M*vSy^JVJI$l!hS2qTb59Y45{_c1p3 zk+I}U+3ex?=Lt`@15NQ|3dktqEjOGvlj;c-*h7e9z{>ggQd27V2cltEA#{p#WH(e| zVFBIwQbDpY^ipzbo^*1h0JSCikJ`e-0pa7};($Q^1dx~*SlFaEPZ)Vg7$j8_KukP* z#(?mV455}--!m;CrJ^3V&1~d&3gOonExaN3J89hry;$GIZpI3vvd#n8C79D61_m5t0p+<9$i7P&DP5it zT?MlVJOu`EHu2XyIF-iIC5YWh`vpslipAoS#N(GSe}&raJFK#uI6c*(@Vqzyy{Au( zQ5CPa$|WuGWssG3{kXduHy}DlBVJ0pti8aV(-;|LI%576BK*SdEISNv_%7R7CCv z+#}lbUC9}TO9RvXgazgj9U}66O`9I@6}t|y&XT(x@qdBqmT={b z4aPS@4v&uee^yY(E5gZypcBT@uF%NnV@0@kl0hA(G-dw}q1GC;pz62q0b-KOTrag)lu$B-H{AO-oRIWtpLA|Z*gO|}Lx9HWXL$F!pEUt@YY%iNA@B^y;uXn|IR-!Id7h0Qy9i5;U)w2W5xFn5BH zywzxe961v(`V}kB@8aJT4U0KH=(aRtI&~sWR7ISO>_x+_)Zvwne*fXLZty>K{LUO6 zGqWdU~V5Nn72L=ZF1)MMOBj-PMO|$)ng*SN*hm(csmSKzxSE zx^jCjUB!*@Ol@}g&8_88$rZ~>{aP_@I||SU9uMlFc3JmosAu5aFNF<|GPRW7fG{R9 z#&EtueFty&{iLpC+%Jy4rXjD5@5AjnyMMAT_0w++%@2_1yw+=#9*?xz-GlA$-={CkvY$4&5he6H7( z8cjaknO01K(75ho*`$Ci{8`_%*59M;yBZa-Mt9H%eVXw9_cDNxc;+4j)Ym*-KmYcd zq~3oRLR)|+{(or}TR?^p;1TQF6C{g%z021_EqGO|H}O2=u8Ymxp{;dY*CDmOm+mTN z<;CM@$<5%m<}L^0;F#lf;WoJ{UK)Pzt4vQJJfd;Ba7qS|llQCbc(#8>Ru)3PA{Jr- z19UgDVs|uR$0v4NV#7q|KxCO;tf;3pGBPqSUt6#j6e{k7UI^99oh3TiL*bGu^<^Aw zLTo}Xq7Q*KIu(_z?2JN%4wgq+jgR681{a2cmGUcI^G-{YkxuQol@b=iJ(M@H?Aeq& zIm(;`kR_~k3UGC$IU)-hU3Ea?8c~41=d5Wf$9zMu?{1Cw461AC9Q62`3e%ic)O98o zrL)T5J;0YPAXE`Otb{lR!U7{kk3&!af}@yhuT3|y@I6*4%BvM2a|L-Cw1mz(p0D#| zoDT{r)@$8ZUYJvf*xFart;!H!8?+x(DUTBUfGTUEX^5xc^X_NhnKgegj;XOFcc!($ zW&D>(pSDO7-xXGfL3Js0wga>RqLqkgz+Zb7V%E1bJlGm}6|J&JH?qi5V8306s$sjO zM4c-Fw)&SrZvRtC8k-Gs0{p-k~k)f@rhW) z%gmnln<0m8WoFd0-Ibibjp*drTxjGnvOCpi_e!E_X2iOet7nJ2SFy0R>({2SD+pf~mw_(t zsiQ21SCd-U&`Q*#vR4@~AX+?0X&fa_B6EzOPu``1{&=yzZ-hT)-6zzFtkcMwesa=_ zU!dZWo^mQ3&{k=AL0%w|eVLYEvBs$>4Ep*QHSs8n zy=(Wb^mEF$pX$*$ef^wfy?uYWKH1Tgo!aZ?i5;EMYued5i0bKG+tC+QN;#Q!&J;b1 zV+t2JO7IHZN;e}ST9qNT1CcdUbc~K$O1EbJ5v<^-U~VQ>S}rx_ZTZ9x=UD?-{tY<< zNe0UUItEFA@wZDAcqLnRVf}7k+DBcD-FbDG$)dfIt+C3Sk;a*s9nm~>oqPMKs=^v{ zKbPG3L)bulKv91w1CF52gJTLVB4w0Nay;kgF(4;!vDn ztcgKSRAqu=+}f%fHH#7qdnwpxVnk2Uw1jiD-YNCUK$I8+dgj+$da0xgsQ-S6CEBl` zvb3@M0CR?@YL0=PjmL;#zRw{vu@wz?O6Dl3G?mjA71(CqU(VKpW^m=?59M|jqnE)P zF(<~T6Efe~%vT$w^hhr#wNzuw}%wHeKJqhHJa>Rsn1%!`Yn$2RoHt6vt<;TJR}_WTETX{Bf`+R6ne$9U~?;i=O`?d8!CUP+{RSs7QkD zDM;(IL!r1E%QB`z9U!yxFVe|1Q(IMom25qf0l4q_%&#@9B^;EMl$2y!qsfnA@sl|t zjTA72JZ*u!(vmvsBt})*M$XgG5uSRQj+8FoU`lh;OIV9?W&5nw!Xy{jgo!weU4bka z(mP{+&6IQe?4+43N6?r5nYT?n9rh?Sj6&YQF}>tMiRh%e(&q3Rzkdl<7tYm|t~^{JjH<2;r=Ls(iBFK`^RgFrH;1E464d*=l zJ+$BE35J2fo6WuaSJ@6gid(z|O+g`aT(V6s=%u_MOkU?``(`AUf!^cxe}h!RXR-c*q~Nv5FG_O1oH z?nKj~qMa;@h_Q4FDL+qpB|pWfAOV=EDPN^!vv;aYTki(uQI|PKIN#ppp6^+bVqT3} zJxolld7L#3Gq-J~8g6^4Zey)XU(uXs+qT8VfHzUBy8=Cg_Z<||S`0!2QSOz>H&OEs zw4P121{c-dn#n)B0vqHlW_H{R#92njR_P(ct^Andwpc-4Z}kg}?VtKD3T!lsCEvJl zz9+A8M!U`HhT0gT9q37-JkOAwYun#100i(2N5mjgmTSea#!6sky&yE3Ca^lceaVxm zAI?#hGchM>R8S&ch!K?{11=RKLdr7G%loB5RCXnDKvA!dDdr^+s(#`*d!Wz=|&K)pb< zkUs|Yw;%7x#J-+d)mP{Fq3VnlzO_?p zTO?rlB`f89;Rov6#F?#wPF4uB5`4yZ{D}NIF!)IIh(*v>)mx@tMXTKrUuTzyn5(=* zbi{sIu2Lf6k|C;et1uBh5idkji+QFL%ON*u<5VUNVshhO*6-qJDZW^m$^{?W(W0$!I4F2neE%@vDZ zPe7JplOPM%=^iDYPt0u-&|?kQ0hGN<4{XsJDcXZsnzV6#U1#V}{sYecCnaZOX31ho z(R2PLF+x@PS_w7%;|XBfy!{}6yduT_>mvqG8zp{?+rlTrX?d1^9Sm@rM~IVSe}97PIBTKJ5D$d|3T+9qj~fI| z$esB5uYZO#J`3{r!LNQ=4be&s9pT2XPQN9WlwNFV+OyZ9H+@k0Q&x3^q-^6~{XGM2 z1ipwrF1LLj7dHOBr11XcUzjVSLkV_?664EkJ4g$7rx0ob^pQ` zZ^%>mKa8$d?n!5_UuZ=(Dk_YQ#HcV-r8#!+JdJw%+lO_t z=Lq z|3|A(M;Wsva#A!`)8hW?nVNPsxM_3>bPDkQGunyCkJYX1GuxNyw+wv9$^~5u(cAjtT2nsy_hLKkJxpo!AU%+36lkVX!&Kphz952Qqk>+M^_2=HM^Owwq^VHZaS=dY)3wb}Hi^WVa5XM&t=S z%^PX^VX#1=?~iE~erLCOk2J0DbUNGG%|EenG57yXBiDmHo~7R8-5Y3b5VMs%N~1Yb z%ef43P3~(dqmCdy;keB1{wQz;Kdjm2CjG7GUipSuM!tM%$;RY8=)I%=Ony!6n2oHO z6lj4=m$0+6(Algopx-@sd53a`pSsItNZ2GS&+W2nr#LB@hS{a>05x)~{4$y5O-gsp z8p+3V*buYO1gNEQCmSg&!E>2;rYu;R4yBs{QSr2A16Jeo*e;qqsiku6qbvqVRfqtS zS;FxcogttpFO8ay-)q}ePkN87cPh=zFM_$>h1F=P#Lg@~r|F&%@<061BYkQ>ZSiO# zxz@`2{4KMt;tFm;e4CX@2I@yll{n7t=S=b#)LK*Kq0%QMVPezxmTew4GwrzjSA4N9 zyWf(}RR+y@hBkLhRpr0XhIYZObkJQqeW%J?0SzjGDVErPo!Y!sJ`#djs(8_a2$|wD z5e#>mV{UZ$aI@3!dzICSB zF(KP^<9Ma2!N|Zq`+!sf+bSmiT5>;5Eal1rd&z;$vJpkMPPmbIj6*aPdK!2nOXYuQNJp+oZxXF=8{_9d2AUuL(f6|W9L8nCiDo?{>ZrAeiZ=?eHjAL-5r#9ji)k8&Yd21IXgTLqcZ5f2y&bTFSH=QY8#gQ{y#*y<}jx-VLSIRY2(=8@85f%pKHU{R} ztKBiaJ&I-D7|a0lb%EP>C-W$I@?+WcE1A_EgxjeKseBH2!sjDvQic`Y(yNeC$>xkEA#ir9u-_6U5{E<*XAZc9 z@;eFtczKd_lIDC953sp62|AY2$?d&5Of0|Jz6tTml7}89J14uu$+{>Z7hV@bJo#di z@~mjXe^SYo0Zj-*vXGTzW6Y?^$+&=_g=HifQ>t^&pB2!8$k(L>R3Wsw2e0L!1#v4F zQbo{T!6Z^DOmWgAQhE3cBvJ*mm@*I-@atk)5M5|nkc`-nstj3;>Z75b_!jui5_y66 zI3zOyO7#oSf>_{Lu-P|LBnL#_my4!>R#|BOf&_j7MlbLg0%`H*sS1nm84EfoCGyKu zHDn;F($@2|dN2D_vrA&(&tpDx-Gm;z7iyuu>uY!F>)8*adKj(^R(K^p?! zxrcDbR+3PyGLOS2m?10jHEx!tRF$fngd`!*+kc${JflD>{Fg&Np@lUhQW8=c7XK~( EKi9Y6E&u=k literal 0 HcmV?d00001 From 0b188bb9d14071568dc54890ea0f81c9201e26af Mon Sep 17 00:00:00 2001 From: Aruna Date: Thu, 5 Apr 2018 23:37:00 -0700 Subject: [PATCH 58/64] still need to work on styling --- app/assets/javascripts/main_controller.coffee | 3 + app/assets/stylesheets/main_controller.scss | 3 + app/assets/stylesheets/trips.scss | 3 + app/controllers/drivers_controller.rb | 41 ++++------ app/controllers/passengers_controller.rb | 50 +++++------- app/controllers/trips_controller.rb | 73 ++++++++---------- app/helpers/main_controller_helper.rb | 2 + app/models/driver.rb | 54 ++++++------- app/models/passenger.rb | 22 +++--- app/models/trip.rb | 11 ++- app/views/drivers/edit.html.erb | 4 +- app/views/drivers/index.html.erb | 17 ++-- app/views/drivers/new.html.erb | 17 +++- app/views/drivers/show.html.erb | 56 +++++++------- app/views/layouts/application.html.erb | 49 +++++++----- app/views/main_controller/index.html.erb | 4 + app/views/passengers/edit.html.erb | 4 +- app/views/passengers/index.html.erb | 31 +++++--- app/views/passengers/new.html.erb | 16 +++- app/views/trips/edit.html.erb | 9 ++- app/views/trips/index.html.erb | 27 ++----- app/views/trips/new.html.erb | 43 ++++++++++- car.jpg | Bin 0 -> 103722 bytes config/routes.rb | 22 +++--- .../main_controller_controller_test.rb | 9 +++ 25 files changed, 318 insertions(+), 252 deletions(-) create mode 100644 app/assets/javascripts/main_controller.coffee create mode 100644 app/assets/stylesheets/main_controller.scss create mode 100644 app/helpers/main_controller_helper.rb create mode 100644 app/views/main_controller/index.html.erb create mode 100644 car.jpg create mode 100644 test/controllers/main_controller_controller_test.rb diff --git a/app/assets/javascripts/main_controller.coffee b/app/assets/javascripts/main_controller.coffee new file mode 100644 index 000000000..24f83d18b --- /dev/null +++ b/app/assets/javascripts/main_controller.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/main_controller.scss b/app/assets/stylesheets/main_controller.scss new file mode 100644 index 000000000..e1aeba4bc --- /dev/null +++ b/app/assets/stylesheets/main_controller.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the main_controller controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/trips.scss b/app/assets/stylesheets/trips.scss index 892060eee..be196a7ad 100644 --- a/app/assets/stylesheets/trips.scss +++ b/app/assets/stylesheets/trips.scss @@ -1,3 +1,6 @@ // Place all the styles related to the Rides controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ +body th { + padding: 20px; +} diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb index f7eb6a290..c33aabf71 100644 --- a/app/controllers/drivers_controller.rb +++ b/app/controllers/drivers_controller.rb @@ -3,18 +3,14 @@ def index @drivers = Driver.all end - def show - id = params[:id] - @driver = Driver.find(id) - end - def new @driver = Driver.new end def create - driver = Driver.new(driver_params) - if driver.save + @driver = Driver.new(driver_params) + + if @driver.save redirect_to drivers_path else render :new @@ -22,37 +18,32 @@ def create end def edit - @driver = Driver.find_by(id: params[:id]) + @driver = Driver.find(params[:id]) end def update - @driver = Trip.find_by(id: params[:id]) - if !@driver.nil? - if @driver.update(driver_params) + @driver = Driver.find(params[:id]) + result = @driver.update(driver_params) + if result redirect_to driver_path(@driver.id) else render :edit end - else - redirect_to trips_path - end + end + + def show + @driver = Driver.find(params[:id]) end def destroy - id = params[:id] - @driver = Driver.find(id) - if @driver - @driver.destroy - end + driver = Driver.find(params[:id]) + driver.destroy + redirect_to drivers_path end -private - + private def driver_params - return params.require(:driver).permit(:driver_id) - + return params.require(:driver).permit(:name, :vin) end - - end diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index 7c4d6203a..8b8a046ef 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -1,12 +1,7 @@ class PassengersController < ApplicationController - def index - @passengers = Passenger.all.order(:name) - end - def show - id = params[:id] - @passenger = Passenger.find(id) - @trips = Trip.where(passenger_id: params[:id]) + def index + @passengers = Passenger.all end def new @@ -15,42 +10,39 @@ def new def create @passenger = Passenger.new(passenger_params) + if @passenger.save - redirect_to passegers_path + redirect_to '/passengers' else render :new end end + def show + @passenger = Passenger.find(params[:id]) + end + def edit - @passenger = Passenger.find_by(id: params[:id]) + @passenger = Passenger.find(params[:id]) end def update - @passenger = Passenger.find_by(id:params[:id]) - if !@passenger.nil? - if @passenger.update(passenger_params) - redirect_to passenger_path(@passenger.id) - else - render :edit - end - else - redirect_to passengers_path - end + @passenger = Passenger.find(params[:id]) + @passenger.update_attributes(passenger_params) + @passenger.save + + redirect_to passenger_path(@passenger) end def destroy - id = params[:id] - @passenger = Passenger.find(id) - if @passenger - @passenger.destroy - end + @passenger = Passenger.find_by(id: params[:id]) + @passenger.destroy + redirect_to passengers_path end -end - -private -def passenger_params - return params.require(:passenger).permit(:name, :phone_num) + private + def passenger_params + return params.require(:passenger).permit(:name, :phone_num) + end end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index e75799f73..ccad13242 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -1,69 +1,58 @@ class TripsController < ApplicationController def index - @trips = Trip.all + if params[:driver_id] + @trips = Driver.find(params[:driver_id]).trips.order(date: :desc) + else + @trips = Trip.all.order(date: :desc) + end end def show - id = params[:id] - @trip = Trip.find(id) + @trip = Trip.find_by(id: params[:id]) end def new - @trip = Trip.new - @trip.passenger = Passenger.find(params[:id]) - @trip.passenger_id = params[:passenger_id] + @trip = Trip.new(passenger_id: params[:passenger][:passenger_id]) end def create - - passenger_id = Passenger.find_by(id: params[:passenger_id]) - driver_id = Driver.random_driver - cost = rand(10..500) - date=Date.today - rating = 0 - @trip = Trip.new(trip_params) - + puts params + @trip = Trip.new( + driver_id: Driver.order("RANDOM()").first.id, + passenger_id: params[:passenger_id], + rating: 0, + cost: rand(1000..10000), + date: Date.today + ) if @trip.save - redirect_to trips_path + redirect_to "/passengers/#{params[:passenger_id]}" else - render :show + render :new end end - def show - id = params[:id] - @trip = Trip.find(id) - end - def edit - @trip = Trip.find_by(id: params[:id]) + @trip = Trip.find(params[:id]) end def update - trip_updates = params[:trip] @trip = Trip.find(params[:id]) + result = @trip.update({rating: params[:trip][:rating]}) - @trip.rating = trip_updates[:rating] - - if @trip.save - redirect_to trip_path(@trip) - else - render :edit - end - + if result + redirect_to "/passengers/#{params[:passenger_id]}" + else + render :edit + end end def destroy - id = params[:id] - @trip = Trip.find(id) - if @trip - @trip.destroy - end - redirect_to trips_path - end -end + trip = Trip.find(params[:id]) + + trip.destroy + + redirect_to root_path -private -def trip_params - return params.permit(:date,:cost,:passenger_id,:driver_id,:rating) + + end end diff --git a/app/helpers/main_controller_helper.rb b/app/helpers/main_controller_helper.rb new file mode 100644 index 000000000..ac00e15d6 --- /dev/null +++ b/app/helpers/main_controller_helper.rb @@ -0,0 +1,2 @@ +module MainControllerHelper +end diff --git a/app/models/driver.rb b/app/models/driver.rb index 1f2d99789..a2b8dca01 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -1,41 +1,33 @@ class Driver < ApplicationRecord - has_many :trips + # has_many :trips + has_many :trips, -> { order(date: :desc) }, dependent: :destroy - def driver_rating - total_ratings = 0 - number_of_trips = 0 + validates :name, presence: { message: "You need to provide a name" } + validates :vin, presence: { message: "You need to provide a VIN number" } - self.trips.each do |trip| - if trip.rating != nil - total_ratings += trip.rating - number_of_trips += 1 - end +# Calculate total earnings for driver less 15% + def total_earnings + total = 0 + trips.each do |trip| + total += trip.cost end - - average_rating = (number_of_trips == 0 ? 0 : total_ratings/number_of_trips) - return average_rating + total_earning = total * (1 - 0.15) + return "$ #{(total_earning/100).round(2)}" end - def driver_earnings - total_earnings = 0 - - self.trips.each do |trip| - if trip.rating != nil - total_earnings += trip.cost - end +# Calculate average rating for driver + def avg_rating + total_rating = 0 + counter = 0 + trips.each do |trip| + total_rating += trip.rating + counter += 1 end - total_earnings = total_earnings/100 - - return total_earnings - end - - def self.random_driver - return Driver.all.sample - end - def self.cost - cost = rand(10..100) - return cost + if counter == 0 + return "No available average rating" + else + return (total_rating / counter) + end end - end diff --git a/app/models/passenger.rb b/app/models/passenger.rb index d19657f02..358a4793d 100644 --- a/app/models/passenger.rb +++ b/app/models/passenger.rb @@ -1,20 +1,16 @@ class Passenger < ApplicationRecord - has_many :trips - - validates :phone, presence: true - validates :name, presence: true, uniqueness: {message: "passenger name is already in our system!"} + # has_many :trips + has_many :trips, -> { order(date: :desc) } ,dependent: :destroy + validates :name, presence: {message: 'Please provide a valid name.'} + validates :phone_num, presence: {message: 'Please provide a valud phone number.'} + +# Calculate total cost of trip def total_cost total_cost = 0 - - self.trips.each do |trip| - if trip.rating != nil - total_cost += trip.cost - end + trips.each do |trip| + total_cost += trip.cost end - - return total_cost + return "$ #{total_cost/100.round(2)}" end - - end diff --git a/app/models/trip.rb b/app/models/trip.rb index f5b0b96de..b07aad807 100644 --- a/app/models/trip.rb +++ b/app/models/trip.rb @@ -1,5 +1,12 @@ class Trip < ApplicationRecord - belongs_to :passenger belongs_to :driver - validates :rating, numericality: { only_integer: true, allow_nil: true, less_than_or_equal_to: 5, greater_than_or_equal_to: 0, message: "Rating must be a number between 0-5." } + belongs_to :passenger + + validates :date, presence: { message: "You need to provide a date" } + validates :rating, presence: { message: "You need to provide a rating" } + validates :cost, presence: { message: "You need to provide a cost" } + + def cost_in_dollars + return (self.cost / 100.0).round(2) + end end diff --git a/app/views/drivers/edit.html.erb b/app/views/drivers/edit.html.erb index 7cd1dfb52..9c40227e1 100644 --- a/app/views/drivers/edit.html.erb +++ b/app/views/drivers/edit.html.erb @@ -1 +1,3 @@ -<%= render partial: "form" ,locals: {page_title: "Edit a Trip"}%> +

    Edit Driver

    + +<%= render partial: "form"%> diff --git a/app/views/drivers/index.html.erb b/app/views/drivers/index.html.erb index 6d1baf48d..12303f0de 100644 --- a/app/views/drivers/index.html.erb +++ b/app/views/drivers/index.html.erb @@ -1,10 +1,11 @@ -

    Drivers

    -
      +

      Drivers

      + +
        <% @drivers.each do |driver| %> -
      1. - - <%= link_to driver.name, driver_path(driver.id), class: 'name-link' %> - -
      2. +
        + +
      3. <%= link_to driver.name, driver_path(driver.id) %>
      4. +
        +
        <% end %> -
    + diff --git a/app/views/drivers/new.html.erb b/app/views/drivers/new.html.erb index 44eb27f6a..8e879ba8d 100644 --- a/app/views/drivers/new.html.erb +++ b/app/views/drivers/new.html.erb @@ -1 +1,16 @@ -<%= render partial: "form" ,locals: {page_title: "Add New Driver"}%> +

    Add New Driver

    + +<% if @driver.errors.messages.length > 0 %> +
    +
      + <% @driver.errors.messages.each do |field, problems| %> +
    • + <%= field %> + <%= problems %> +
    • + <% end%> +
    +
    +<% end %> + +<%= render partial: "form"%> diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index fe53cd1a0..453f9d63d 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -1,36 +1,32 @@ -

    <%= @driver.name %>

    +

    Driver Details

    -Driver profile picture +
    + <%= @driver.name %> +

    <%= @driver.vin %>

    +
    -

    - <%= "Average Rating: #{@driver.driver_rating}"%> -

    +
    + <%= @driver.total_earnings %> +
    -

    - <%= "Total Earnings: $#{@driver.driver_earnings}"%> -

    +
    + <%= @driver.avg_rating %> +
    -

    Driver Trips

    - - - - - - - - - - +
    + <%= button_to "Edit", edit_driver_path(@driver.id), method: :get %> + <%= button_to "Delete", driver_path(@driver.id), method: :delete %> +
    - <% @driver.trips.all.each do |trip| %> - - - - - - - - - +
    +
      + <% @driver.trips.each do |trip| %> +
    • + <%= link_to "Trip #{trip.id}", trip_path(trip.id) %> + <%= trip.date %> + <%= trip.rating %> + <%= trip.cost %> +
    • <% end %> -
    IDPassengerDateRatingCostEditDelete
    <%=trip.id%><%= trip.passenger_id %><%= trip.date %><%= trip.rating %><%="$#{(trip.cost/100)}"%><%= link_to "Edit", edit_driver_path %><%= link_to "Delete", trip_path(@driver.id), method: :delete %>
    +
+ diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f2a6af83d..76b725685 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,28 +1,35 @@ - - RideshareRails - <%= csrf_meta_tags %> + + Rideshare + <%= csrf_meta_tags %> + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> - <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> - + +
+

+ <%= image_tag("car.jpg", :alt => "image") %> + <%=link_to "Life on Road", '/', method: :get%> +

+ +
- -
- -
+
<%= yield %> +
+ +
+
+ Aruna & Mariko Inc +
- +
+ diff --git a/app/views/main_controller/index.html.erb b/app/views/main_controller/index.html.erb new file mode 100644 index 000000000..1a31c3cca --- /dev/null +++ b/app/views/main_controller/index.html.erb @@ -0,0 +1,4 @@ +

Welcome to the RideShare

+ +<%= link_to 'View all Drivers', drivers_path %> +<%= link_to 'View all Passengers', passengers_path % diff --git a/app/views/passengers/edit.html.erb b/app/views/passengers/edit.html.erb index a135b4e3c..35cdf9cbe 100644 --- a/app/views/passengers/edit.html.erb +++ b/app/views/passengers/edit.html.erb @@ -1 +1,3 @@ -<%= render partial: "form" ,locals: {button_name: "Edit Passenger"}%> +

Edit the passenger!!!

+ +<%= render partial: "form"%> diff --git a/app/views/passengers/index.html.erb b/app/views/passengers/index.html.erb index cad801d23..0a08ba348 100644 --- a/app/views/passengers/index.html.erb +++ b/app/views/passengers/index.html.erb @@ -1,13 +1,22 @@ +

Passengers

-

All Passengers List

-
    - <% @passengers.each do |passenger| %> +<%=button_to "Add New Passenger", new_passenger_path, method: :get%> -
  • - - <%= link_to passenger.name, passenger_path(passenger.id), class: 'name-link' %> - -
  • - - <% end %> -
+ + + + + +<% @passengers.each do |passenger| %> + + + + +<% end %> +
+ Passenger ID + Passenger
+ <%= passenger.id %> + + <%= link_to(passenger.name, passenger_path(passenger.id)) %> +
diff --git a/app/views/passengers/new.html.erb b/app/views/passengers/new.html.erb index 27944f177..4e8c696d3 100644 --- a/app/views/passengers/new.html.erb +++ b/app/views/passengers/new.html.erb @@ -1,2 +1,16 @@ +

We have a new passenger!!!

-<%= render partial: "form" ,locals: {page_title: "Add New Passenger"}%> +<% if @passenger.errors.messages.length > 0 %> +
+
    + <% @passenger.errors.messages.each do |field, problems| %> +
  • + <%= field %> + <%= problems %> +
  • + <% end%> +
+
+<% end %> + +<%= render partial: "form"%> diff --git a/app/views/trips/edit.html.erb b/app/views/trips/edit.html.erb index 6414e923f..e07c1b406 100644 --- a/app/views/trips/edit.html.erb +++ b/app/views/trips/edit.html.erb @@ -1 +1,8 @@ -<%= render partial: "form" ,locals: {button_name: "Edit trip"}%> +

Let's edit that trip!!!

+ +<%= form_for @trip do |f| %> + <%= f.label :rating %> + <%= f.number_field :rating, in: 1.0..5.0 %> + + <%= f.submit "Edit trip!" %> +<% end %> diff --git a/app/views/trips/index.html.erb b/app/views/trips/index.html.erb index ec2893c2a..a62f3f9a8 100644 --- a/app/views/trips/index.html.erb +++ b/app/views/trips/index.html.erb @@ -1,23 +1,8 @@ -

All Trips

+

All TRIPS!!!

+<% @trips.each do |trip| %> +

+ <%= trip.id %> +

- - - - - - - - - - <% @trips.each do |trip| %> - - - - - - - - - <% end %> -
Trip IDTrip DatePassenger IDDriver IDTrip RatingTrip Cost
<%= trip.id %><%= link_to trip.date, trip_path(trip.id) %><%= trip.passenger_id %><%= trip.driver_id %><%= trip.rating %>$<%='%.02f' % (trip.cost / 100)%>
+<% end %> diff --git a/app/views/trips/new.html.erb b/app/views/trips/new.html.erb index e97bdc990..bbaddcbda 100644 --- a/app/views/trips/new.html.erb +++ b/app/views/trips/new.html.erb @@ -1,2 +1,41 @@ -

Rides#new

-

Find me in app/views/rides/new.html.erb

+

New Trip

+ +<%= render partial: 'layouts/error_messages', locals: { model: @trip } %> + +
    + <%= form_for @trip do |f| %> +
  • + <%= f.label :date, :class => 'label' %> + + <%= f.date_field :date, value: Date.today, :class => 'field' %> +
  • + + + + + + +
  • + <%= f.label :cost, :class => 'label' %> + + <%= f.text_field :cost, :class => 'field' %> +
  • + +
  • + <%= f.submit %> +
  • + <%end%> +
diff --git a/car.jpg b/car.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67a1090697b312c16c5f62f7f7f0482f60eb8850 GIT binary patch literal 103722 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 EKi9Y6E&u=k literal 0 HcmV?d00001 diff --git a/config/routes.rb b/config/routes.rb index 697dc9e56..21854ffb0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,18 +1,16 @@ -Rails.application.routes.draw do + Rails.application.routes.draw do + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + get '/', to: 'main#index', as: 'root' - resources :passengers do - resources :trips, only:[:index,:new,:create,:show,:edit] - end - - - resources :trips - resources :passengers + resources :drivers + resources :passengers do - resources :drivers + post '/new_trip', to: 'trips#create' + end - - root 'trips#index' #defines homepage -end + resources :trips, :except => [:index] + # get '/', to: 'main#index' + end diff --git a/test/controllers/main_controller_controller_test.rb b/test/controllers/main_controller_controller_test.rb new file mode 100644 index 000000000..057d6c5c5 --- /dev/null +++ b/test/controllers/main_controller_controller_test.rb @@ -0,0 +1,9 @@ +require 'test_helper' + +class MainControllerControllerTest < ActionDispatch::IntegrationTest + test "should get index" do + get main_controller_index_url + assert_response :success + end + +end From 0edf898281eadb6fc6ebf83ce7b26f499248693f Mon Sep 17 00:00:00 2001 From: Mariko Date: Fri, 6 Apr 2018 07:59:22 -0700 Subject: [PATCH 59/64] ridsharerails now link to homepage/all rides page --- app/controllers/drivers_controller.rb | 2 +- app/controllers/trips_controller.rb | 6 +++++- app/views/layouts/application.html.erb | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb index cc8f31f01..e646b225c 100644 --- a/app/controllers/drivers_controller.rb +++ b/app/controllers/drivers_controller.rb @@ -15,7 +15,7 @@ def new def create @driver = Driver.new(driver_params) if @driver.save - redirect_to driver_path + redirect_to drivers_path else render :new end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index cf7035a07..198c3d0be 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -43,7 +43,11 @@ def update @trip.rating = trip_updates[:rating] if @trip.save - redirect_to trip_path(@trip) + if @trip.rating > 0 + redirect_to trip_path(@trip.passenger) + else + redirect_to trip_path(@trip) + end else render :edit end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f2a6af83d..0713d8d86 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -12,12 +12,12 @@
From 3590bf19cc24b24251e3dcebf8789dcf94e9b8bd Mon Sep 17 00:00:00 2001 From: Mariko Date: Fri, 6 Apr 2018 14:05:44 -0700 Subject: [PATCH 60/64] updating redirect to link --- app/controllers/trips_controller.rb | 6 +++--- app/views/drivers/show.html.erb | 2 +- app/views/passengers/show.html.erb | 8 ++++---- app/views/trips/index.html.erb | 13 +++++++++++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index 198c3d0be..0547edaad 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -28,8 +28,8 @@ def create end def show - id = params[:id] - @trip = Trip.find(id) + + @trip = Trip.find_by(id: params[:id]) end def edit @@ -44,7 +44,7 @@ def update if @trip.save if @trip.rating > 0 - redirect_to trip_path(@trip.passenger) + redirect_to passenger_path(@trip.passenger) else redirect_to trip_path(@trip) end diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index 7d5afea96..e49ef7690 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -31,7 +31,7 @@ <%= trip.passenger_id %> <%= trip.date %> <%= trip.rating %> - <%="$#{(trip.cost/100)}"%> + <%="$#{'%.02f' % (trip.cost / 100)}"%> <%= link_to "Edit Trip", edit_trip_path %> <%= link_to "Delete Trip", trip_path(trip.id), method: :delete %> diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index ba75056f6..c0b08a203 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -1,7 +1,7 @@

Name:<%= @passenger.name %>

Phone_num:<%= @passenger.phone_num %>

-

Total_cost:<%= @passenger.total_cost %>

+

Total_cost:<%= '%.02f' % (@passenger.total_cost / 100) %>

Passengers Trips

@@ -31,9 +31,9 @@ <%= trip.rating %> <% end %> - - - + + + <% end %> diff --git a/app/views/trips/index.html.erb b/app/views/trips/index.html.erb index fe44599c8..b987df920 100644 --- a/app/views/trips/index.html.erb +++ b/app/views/trips/index.html.erb @@ -14,8 +14,17 @@ - - + + + From 8bc6c9f4e13b349892b9dc2844b316db933d9603 Mon Sep 17 00:00:00 2001 From: Aruna Date: Fri, 6 Apr 2018 14:08:43 -0700 Subject: [PATCH 61/64] made new changes --- app/assets/stylesheets/application.css | 6 ++++-- app/controllers/passengers_controller.rb | 2 +- app/controllers/trips_controller.rb | 6 ++++-- app/views/drivers/_form.html.erb | 6 +++++- app/views/drivers/show.html.erb | 7 ++++--- app/views/main_controller/index.html.erb | 3 ++- app/views/passengers/_form.html.erb | 5 ++++- app/views/passengers/show.html.erb | 5 +++-- app/views/trips/_form.html.erb | 11 ++++++++++- config/routes.rb | 6 ++++-- 10 files changed, 41 insertions(+), 16 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 02108e713..d73e9e0f7 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -59,7 +59,9 @@ h2 { } main { - /*background-color: white;*/ + + + background-color: white; opacity: .8; clear:both; padding: 50px; @@ -93,7 +95,7 @@ th { height: 50px; } button{ - background-color: green; + color: green; } footer div{ position: fixed; diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index 8b8a046ef..425528fba 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -12,7 +12,7 @@ def create @passenger = Passenger.new(passenger_params) if @passenger.save - redirect_to '/passengers' + redirect_to passenger_path else render :new end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index ccad13242..3d2afa203 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -25,7 +25,8 @@ def create date: Date.today ) if @trip.save - redirect_to "/passengers/#{params[:passenger_id]}" + redirect_to passengers_path + # redirect_to "/passengers/#{params[:passenger_id]}" else render :new end @@ -40,7 +41,8 @@ def update result = @trip.update({rating: params[:trip][:rating]}) if result - redirect_to "/passengers/#{params[:passenger_id]}" + redirect_to passengers_path + # redirect_to "/passengers/#{params[:passenger_id]}" else render :edit end diff --git a/app/views/drivers/_form.html.erb b/app/views/drivers/_form.html.erb index 4f39b0210..d4dc5e707 100644 --- a/app/views/drivers/_form.html.erb +++ b/app/views/drivers/_form.html.erb @@ -1,12 +1,16 @@ <% button_text = "The button" %> -<% form_class ||= "" %> +<% form_class = "" %> <%= form_for @driver do |f| %> <%= f.label :name %> +
<%= f.text_field :name %> +
<%= f.label :vin %> +
<%= f.text_field :vin %> +
<%= f.submit %> diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index 453f9d63d..4bb612699 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -1,8 +1,9 @@

Driver Details

- <%= @driver.name %> -

<%= @driver.vin %>

+ <%= "Driver : #{@driver.name}" %> + +

<%= "Vin: #{@driver.vin}" %>

@@ -15,7 +16,7 @@
<%= button_to "Edit", edit_driver_path(@driver.id), method: :get %> - <%= button_to "Delete", driver_path(@driver.id), method: :delete %> + <%= button_to "Delete", driver_path(@driver.id), method: :delete, data: {confirm: "Are you sure you want to delete this passenger?"} %>
diff --git a/app/views/main_controller/index.html.erb b/app/views/main_controller/index.html.erb index 1a31c3cca..0175a7962 100644 --- a/app/views/main_controller/index.html.erb +++ b/app/views/main_controller/index.html.erb @@ -1,4 +1,5 @@

Welcome to the RideShare

<%= link_to 'View all Drivers', drivers_path %> -<%= link_to 'View all Passengers', passengers_path % +
+<%= link_to 'View all Passengers', passengers_path %> diff --git a/app/views/passengers/_form.html.erb b/app/views/passengers/_form.html.erb index 149b65d19..50f16487b 100644 --- a/app/views/passengers/_form.html.erb +++ b/app/views/passengers/_form.html.erb @@ -1,9 +1,12 @@ <%= form_for @passenger do |f| %> <%= f.label :name %> +
<%= f.text_field :name %> - +
<%= f.label :phone_number %> +
<%= f.text_field :phone_num %> +
<%= f.submit %> <% end %> diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index 0933906fc..53c29f5e6 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -1,6 +1,7 @@

-<%= "Passenger #{@passenger.id}: #{@passenger.name}" %> -<%= "Phone number: #{@passenger.phone_num}" %> +<%= "Passenger #{@passenger.id}: #{@passenger.name}" %> +
+<%= "Phone number: #{@passenger.phone_num}" %>

<% @passenger.total_cost %> diff --git a/app/views/trips/_form.html.erb b/app/views/trips/_form.html.erb index b21d89f81..113967418 100644 --- a/app/views/trips/_form.html.erb +++ b/app/views/trips/_form.html.erb @@ -13,19 +13,28 @@ <%= form_for @trip do |f| %> <%= f.label :date %> +
<%= f. text_field :date %> +
<%= f.label :passenger_id %> +
<%= f. text_field :passenger_id %> +
<%= f.label :driver_id %> +
<%= f. text_field :driver_id %> +
<%= f.label :cost %> +
<%= f. text_field :cost %> +
<%= f.label :rating %> +
<%= f. text_field :rating %> - +
<%= f.submit %> <% end %> diff --git a/config/routes.rb b/config/routes.rb index 21854ffb0..92fe8592f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,9 +2,11 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - get '/', to: 'main#index', as: 'root' + root 'main_controller#index' - resources :drivers + # get '/', to: 'main#index', as: 'root' + + resources :drivers resources :passengers do From d5a342628fef068bd83d98befd21a7af4aba3beb Mon Sep 17 00:00:00 2001 From: Mariko Date: Fri, 6 Apr 2018 14:16:14 -0700 Subject: [PATCH 62/64] space --- app/controllers/passengers_controller.rb | 2 +- app/controllers/trips_controller.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index 1b016f8ad..d7025f935 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -1,4 +1,4 @@ -class PassengersController < ApplicationController +mclass PassengersController < ApplicationController def index @passengers = Passenger.all.order(:name) end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index 0547edaad..9f2480eb0 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -51,7 +51,7 @@ def update else render :edit end - + end def destroy From fcc2471c45e4e3cfee5b1a70ba58bfa11980b7ec Mon Sep 17 00:00:00 2001 From: Mariko Date: Fri, 6 Apr 2018 14:20:06 -0700 Subject: [PATCH 63/64] space --- app/controllers/trips_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index 9f2480eb0..7499e2a2d 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -51,7 +51,7 @@ def update else render :edit end - + end def destroy From 6bb8e44f673c2913704fdf8eee5a844eb8b935e8 Mon Sep 17 00:00:00 2001 From: Mariko Date: Fri, 6 Apr 2018 17:00:15 -0700 Subject: [PATCH 64/64] final refactoring --- app/controllers/drivers_controller.rb | 14 ++++++------ app/controllers/passengers_controller.rb | 2 -- app/controllers/trips_controller.rb | 29 ++++++++++++------------ app/models/driver.rb | 2 +- app/models/passenger.rb | 2 +- app/views/drivers/index.html.erb | 27 ++++++++++++++-------- app/views/drivers/show.html.erb | 9 ++++---- app/views/passengers/index.html.erb | 2 -- app/views/passengers/show.html.erb | 8 +++---- app/views/trips/edit.html.erb | 7 +----- app/views/trips/new.html.erb | 1 - app/views/trips/show.html.erb | 13 ++++++----- 12 files changed, 56 insertions(+), 60 deletions(-) diff --git a/app/controllers/drivers_controller.rb b/app/controllers/drivers_controller.rb index 31d93a803..fcb8e521d 100644 --- a/app/controllers/drivers_controller.rb +++ b/app/controllers/drivers_controller.rb @@ -2,9 +2,6 @@ class DriversController < ApplicationController def index @drivers = Driver.all end - def show - @driver = Driver.find(params[:id]) - end def new @driver = Driver.new @@ -13,12 +10,16 @@ def new def create @driver = Driver.new(driver_params) if @driver.save - redirect_to drivers_path + redirect_to drivers_path(@driver) else render :new end end + def show + @driver = Driver.find(params[:id]) + end + def edit @driver = Driver.find(params[:id]) end @@ -31,8 +32,7 @@ def update else render :edit end - - end + end end def destroy @@ -45,7 +45,7 @@ def destroy private def driver_params - return params.require(:driver).permit(:name, :vin) + return params.require(:driver).permit(:name, :vin, :driver_id) end end diff --git a/app/controllers/passengers_controller.rb b/app/controllers/passengers_controller.rb index b05efa56f..77df4a028 100644 --- a/app/controllers/passengers_controller.rb +++ b/app/controllers/passengers_controller.rb @@ -10,10 +10,8 @@ def new def create @passenger = Passenger.new(passenger_params) - if @passenger.save redirect_to passenger_path(@passenger) - else render :new end diff --git a/app/controllers/trips_controller.rb b/app/controllers/trips_controller.rb index b9c2d9b72..d0a179ac2 100644 --- a/app/controllers/trips_controller.rb +++ b/app/controllers/trips_controller.rb @@ -12,12 +12,11 @@ def show end def new - @trip = Trip.new(passenger_id: params[:passenger][:passenger_id]) end def create - + @trip = Trip.new( driver_id: Driver.order("RANDOM()").first.id, passenger_id: params[:passenger_id], @@ -26,15 +25,15 @@ def create date: Date.today ) if @trip.save - redirect_to passengers_path + redirect_to passengers_path(@trip.passenger) # redirect_to "/passengers/#{params[:passenger_id]}" else render :new end end - - + + def edit @trip = Trip.find(params[:id]) end @@ -42,12 +41,12 @@ def edit def update @trip = Trip.find(params[:id]) result = @trip.update({rating: params[:trip][:rating]}) - if result - redirect_to passengers_path - # redirect_to "/passengers/#{params[:passenger_id]}" - else - render :edit - end + if result + redirect_to passenger_path + # redirect_to "/passengers/#{params[:passenger_id]}" + else + render :edit + end end def destroy @@ -59,8 +58,8 @@ def destroy end -private -def trip_params - return params.require(:trip).permit(:date, :cost, :passenger_id, :driver_id, :rating) - + private + def trip_params + return params.require(:trip).permit(:date, :cost, :passenger_id, :driver_id, :rating) + end end diff --git a/app/models/driver.rb b/app/models/driver.rb index 9bff2028f..c72594831 100644 --- a/app/models/driver.rb +++ b/app/models/driver.rb @@ -15,7 +15,7 @@ def total_earnings trips.each do |trip| total += trip.cost end - total_earning = total * (1 - 0.15) + total_earning = total * (1 - 0.20) return "$ #{(total_earning/100).round(2)}" end diff --git a/app/models/passenger.rb b/app/models/passenger.rb index cfb1f242d..696fa4853 100644 --- a/app/models/passenger.rb +++ b/app/models/passenger.rb @@ -13,6 +13,6 @@ def total_cost trips.each do |trip| total_cost += trip.cost end - return "$ #{total_cost/100.round(2)}" + return total_cost/100.round(2) end end diff --git a/app/views/drivers/index.html.erb b/app/views/drivers/index.html.erb index 12303f0de..c36607bd4 100644 --- a/app/views/drivers/index.html.erb +++ b/app/views/drivers/index.html.erb @@ -1,11 +1,20 @@

Drivers

-
    - <% @drivers.each do |driver| %> -
    - -
  1. <%= link_to driver.name, driver_path(driver.id) %>
  2. -
    -
    - <% end %> -
+
<%=trip.cost%><%= link_to "Edit" , edit_passenger_path(@passenger.id)%><%= link_to "Delete", trip_path(trip.id),method: :delete %><%='%.02f' % (trip.cost / 100)%><%= link_to "Edit Trip" , edit_trip_path%><%= link_to "Delete Trip", trip_path(trip.id),method: :delete %>
<%= trip.id %> <%= trip.date %><%= trip.passenger_id %><%= trip.driver_id %> + <% if trip.passenger_id != nil %> + <%= link_to trip.passenger.name, passenger_path(trip.passenger)%> + <% end %> + + <% if trip.driver_id != nil %> + <%= link_to trip.driver.name, driver_path(trip.driver) %> + <% end %> + <%= trip.rating %> $<%='%.02f' % (trip.cost / 100)%>
+ + + + +<% @drivers.each do |driver| %> + + + + +<% end %> +
+ Driver ID + Driver
+ <%= driver.id %> + + <%= link_to(driver.name, driver_path(driver.id)) %> +
diff --git a/app/views/drivers/show.html.erb b/app/views/drivers/show.html.erb index c6b7b7c03..7e4aa6e69 100644 --- a/app/views/drivers/show.html.erb +++ b/app/views/drivers/show.html.erb @@ -7,17 +7,16 @@
- <%= @driver.total_earnings %> + <%="Driver's Total Earnings: #{ @driver.total_earnings}" %>
-
- <%= @driver.avg_rating %> + <%= "Driver's Average Ratings: #{@driver.avg_rating}" %>
- +
<%= button_to "Edit Driver", edit_driver_path(@driver.id), method: :get %> - <%= button_to "Delete Driver", driver_path(@driver.id), method: :delete, data: {confirm: "Are you sure you want to delete this passenger?"} %> + <%= button_to "Delete Driver", driver_path(@driver.id), method: :delete, data: {confirm: "Are you sure you want to delete this Driver?"} %>

Driver Trips

diff --git a/app/views/passengers/index.html.erb b/app/views/passengers/index.html.erb index 0a08ba348..5d3ba69b4 100644 --- a/app/views/passengers/index.html.erb +++ b/app/views/passengers/index.html.erb @@ -1,7 +1,5 @@

Passengers

-<%=button_to "Add New Passenger", new_passenger_path, method: :get%> -
diff --git a/app/views/passengers/show.html.erb b/app/views/passengers/show.html.erb index ee0ba4714..03c3f2093 100644 --- a/app/views/passengers/show.html.erb +++ b/app/views/passengers/show.html.erb @@ -10,9 +10,8 @@ <%= button_to "Edit Passenger", edit_passenger_path(@passenger.id), method: :get %> <%= button_to "Delete Passenger", passenger_path(@passenger), method: :delete, data: {confirm: "Are you sure you want to delete this passenger?"} %> <%= button_to "Add New Trip", passenger_new_trip_path(@passenger.id), method: :post %> -======= -

Phone_num:<%= @passenger.phone_num %>

-

Total_cost:<%= '%.02f' % (@passenger.total_cost / 100) %>

+ +

Total_cost: $<%= '%.02f' % (@passenger.total_cost / 100) %>

<%= "#{@passenger.name} has taken #{@passenger.trips.length} trip(s)" %>

Passengers Trips

@@ -29,7 +28,7 @@ <% @passenger.trips.all.each do |trip| %> - + @@ -48,4 +47,3 @@ <% end %> - diff --git a/app/views/trips/edit.html.erb b/app/views/trips/edit.html.erb index e07c1b406..92372c7e5 100644 --- a/app/views/trips/edit.html.erb +++ b/app/views/trips/edit.html.erb @@ -1,8 +1,3 @@

Let's edit that trip!!!

-<%= form_for @trip do |f| %> - <%= f.label :rating %> - <%= f.number_field :rating, in: 1.0..5.0 %> - - <%= f.submit "Edit trip!" %> -<% end %> +<%= render partial: "form" %> diff --git a/app/views/trips/new.html.erb b/app/views/trips/new.html.erb index bbaddcbda..86b9b018e 100644 --- a/app/views/trips/new.html.erb +++ b/app/views/trips/new.html.erb @@ -1,6 +1,5 @@

New Trip

-<%= render partial: 'layouts/error_messages', locals: { model: @trip } %>
    <%= form_for @trip do |f| %> diff --git a/app/views/trips/show.html.erb b/app/views/trips/show.html.erb index d1922d13c..e7c7d406a 100644 --- a/app/views/trips/show.html.erb +++ b/app/views/trips/show.html.erb @@ -9,8 +9,13 @@
- - + + @@ -18,7 +23,3 @@ <%= link_to "Edit rating", edit_trip_path %> <%= button_to "Delete", trip_path(@trip.id), method: :delete %> - - - -
<%=trip.id%><%=link_to trip.id, trip_path(trip.id)%> <%=trip.driver_id%> <%= trip.passenger_id %> <%= trip.date %><%= link_to "Delete Trip", trip_path(trip.id),method: :delete %>
Trip Rating
<%= @trip.passenger.name %><%= @trip.driver.name %><% if @trip.passenger_id != nil %> + <%= link to @trip.passenger.name, passenger_path(@trip.passenger)%> + <%end%> + <% if @trip.driver_id != nil %> + <%= link_to @trip.driver.name, driver_path(@trip.driver) %> + <% end %> <%= "$#{@trip.cost/100.round(2)}" %> <%= "#{@trip.rating}" %>