From ab9d79f7819d4ac179e23bec10651507e3bb0b19 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Sat, 14 May 2022 01:27:17 +0000 Subject: [PATCH] Initial commit --- .browserslistrc | 2 + .editorconfig | 22 + .eslintignore | 5 + .eslintrc.js | 24 + .gitignore | 81 + .haml-lint.yml | 13 + .rubocop.yml | 106 + .travis.yml | 23 + Gemfile | 94 + Gemfile.lock | 487 + Guardfile | 102 + QUESTIONS.md | 7 + README.md | 17 + Rakefile | 8 + app/assets/config/manifest.js | 4 + .../images/favicon/android-chrome-192x192.png | Bin 0 -> 55018 bytes .../images/favicon/android-chrome-256x256.png | Bin 0 -> 93297 bytes .../images/favicon/apple-touch-icon.png | Bin 0 -> 42214 bytes .../images/favicon/browserconfig.xml.erb | 9 + app/assets/images/favicon/favicon-16x16.png | Bin 0 -> 1187 bytes app/assets/images/favicon/favicon-32x32.png | Bin 0 -> 2340 bytes app/assets/images/favicon/favicon.ico | Bin 0 -> 15086 bytes app/assets/images/favicon/mstile-150x150.png | Bin 0 -> 25765 bytes .../images/favicon/safari-pinned-tab.svg | 14 + .../images/favicon/site.webmanifest.erb | 19 + app/assets/images/saasbook.jpeg | Bin 0 -> 13664 bytes app/assets/stylesheets/scaffold.css | 80 + .../national/states/us-states.topo.json | 1 + app/assets/topojson/states/ak.topo.json | 1 + app/assets/topojson/states/al.topo.json | 1 + app/assets/topojson/states/ar.topo.json | 1 + app/assets/topojson/states/as.topo.json | 1 + app/assets/topojson/states/az.topo.json | 1 + app/assets/topojson/states/ca.topo.json | 1 + app/assets/topojson/states/co.topo.json | 1 + app/assets/topojson/states/ct.topo.json | 1 + app/assets/topojson/states/dc.topo.json | 1 + app/assets/topojson/states/de.topo.json | 1 + app/assets/topojson/states/fl.topo.json | 1 + app/assets/topojson/states/ga.topo.json | 1 + app/assets/topojson/states/gu.topo.json | 1 + app/assets/topojson/states/hi.topo.json | 1 + app/assets/topojson/states/ia.topo.json | 1 + app/assets/topojson/states/id.topo.json | 1 + app/assets/topojson/states/il.topo.json | 1 + app/assets/topojson/states/in.topo.json | 1 + app/assets/topojson/states/ks.topo.json | 1 + app/assets/topojson/states/ky.topo.json | 1 + app/assets/topojson/states/la.topo.json | 1 + app/assets/topojson/states/ma.topo.json | 1 + app/assets/topojson/states/md.topo.json | 1 + app/assets/topojson/states/me.topo.json | 1 + app/assets/topojson/states/mi.topo.json | 1 + app/assets/topojson/states/mn.topo.json | 1 + app/assets/topojson/states/mo.topo.json | 1 + app/assets/topojson/states/mp.topo.json | 1 + app/assets/topojson/states/ms.topo.json | 1 + app/assets/topojson/states/mt.topo.json | 1 + app/assets/topojson/states/nc.topo.json | 1 + app/assets/topojson/states/nd.topo.json | 1 + app/assets/topojson/states/ne.topo.json | 1 + app/assets/topojson/states/nh.topo.json | 1 + app/assets/topojson/states/nj.topo.json | 1 + app/assets/topojson/states/nm.topo.json | 1 + app/assets/topojson/states/nv.topo.json | 1 + app/assets/topojson/states/ny.topo.json | 1 + app/assets/topojson/states/oh.topo.json | 1 + app/assets/topojson/states/ok.topo.json | 1 + app/assets/topojson/states/or.topo.json | 1 + app/assets/topojson/states/pa.topo.json | 1 + app/assets/topojson/states/pr.topo.json | 1 + app/assets/topojson/states/ri.topo.json | 1 + app/assets/topojson/states/sc.topo.json | 1 + app/assets/topojson/states/sd.topo.json | 1 + app/assets/topojson/states/tn.topo.json | 1 + app/assets/topojson/states/tx.topo.json | 1 + app/assets/topojson/states/ut.topo.json | 1 + app/assets/topojson/states/va.topo.json | 1 + app/assets/topojson/states/vi.topo.json | 1 + app/assets/topojson/states/vt.topo.json | 1 + app/assets/topojson/states/wa.topo.json | 1 + app/assets/topojson/states/wi.topo.json | 1 + app/assets/topojson/states/wv.topo.json | 1 + app/assets/topojson/states/wy.topo.json | 1 + app/controllers/ajax_controller.rb | 9 + app/controllers/application_controller.rb | 11 + app/controllers/events_controller.rb | 31 + app/controllers/login_controller.rb | 75 + app/controllers/map_controller.rb | 48 + app/controllers/my_events_controller.rb | 45 + app/controllers/my_news_items_controller.rb | 59 + app/controllers/news_items_controller.rb | 24 + app/controllers/representatives_controller.rb | 7 + app/controllers/search_controller.rb | 15 + app/controllers/session_controller.rb | 15 + app/controllers/user_controller.rb | 7 + app/helpers/application_helper.rb | 39 + .../my_news_items_controller_helper.rb | 4 + app/helpers/news_item_helper.rb | 4 + app/helpers/ratings_helper.rb | 4 + app/helpers/representatives_helper.rb | 4 + app/helpers/session_helper.rb | 4 + app/javascript/packs/application.js | 38 + app/javascript/packs/county_map.js | 27 + app/javascript/packs/events_index.js | 52 + app/javascript/packs/events_new.js | 26 + app/javascript/packs/map_utils.js | 23 + app/javascript/packs/national_states_map.js | 64 + .../packs/state_county_filter_util.js | 73 + app/javascript/packs/state_map.js | 21 + app/javascript/packs/state_map_utils.js | 70 + app/javascript/stylesheets/application.scss | 24 + app/javascript/stylesheets/map.scss | 22 + app/jobs/application_job.rb | 4 + app/mailers/application_mailer.rb | 6 + app/models/application_record.rb | 5 + app/models/county.rb | 10 + app/models/event.rb | 17 + app/models/news_item.rb | 12 + app/models/representative.rb | 27 + app/models/state.rb | 10 + app/models/user.rb | 34 + app/views/application/_favicon.html.haml | 9 + app/views/events/index.html.haml | 73 + app/views/events/show.html.haml | 43 + app/views/layouts/_footer.html.haml | 29 + app/views/layouts/_navbar.html.haml | 31 + app/views/layouts/application.html.haml | 24 + app/views/layouts/mailer.html.haml | 8 + app/views/layouts/mailer.text.haml | 1 + app/views/login/login.html.haml | 15 + app/views/map/county.html.haml | 15 + app/views/map/index.html.haml | 15 + app/views/map/state.html.haml | 43 + app/views/my_events/_form.html.haml | 48 + app/views/my_events/edit.html.haml | 13 + app/views/my_events/new.html.haml | 13 + app/views/my_news_items/_form.html.haml | 32 + app/views/my_news_items/edit.html.haml | 19 + app/views/my_news_items/new.html.haml | 15 + app/views/news_items/index.html.haml | 46 + app/views/news_items/show.html.haml | 39 + app/views/representatives/index.html.haml | 15 + app/views/representatives/search.html.haml | 20 + app/views/shared/_flash_messages.html.haml | 7 + app/views/user/profile.html.haml | 31 + babel.config.js | 72 + bin/bundle | 3 + bin/rails | 9 + bin/rake | 9 + bin/setup | 36 + bin/spring | 17 + bin/update | 31 + bin/webpack | 18 + bin/webpack-dev-server | 18 + bin/yarn | 11 + config.ru | 7 + config/application.rb | 38 + config/boot.rb | 6 + config/cucumber.yml | 9 + config/database.yml | 95 + config/environment.rb | 7 + config/environments/development.rb | 55 + config/environments/production.rb | 82 + config/environments/test.rb | 48 + config/favicon.json | 62 + .../application_controller_renderer.rb | 9 + config/initializers/backtrace_silencers.rb | 8 + config/initializers/cookies_serializer.rb | 7 + .../initializers/filter_parameter_logging.rb | 6 + config/initializers/inflections.rb | 17 + config/initializers/mime_types.rb | 5 + config/initializers/omniauth.rb | 54 + config/initializers/web_app_manifest.rb | 23 + config/initializers/wrap_parameters.rb | 16 + config/locales/en.yml | 33 + config/puma.rb | 39 + config/routes.rb | 43 + config/spring.rb | 8 + config/storage.yml | 34 + config/webpack/development.js | 5 + config/webpack/environment.js | 25 + config/webpack/production.js | 5 + config/webpack/test.js | 5 + config/webpacker.yml | 97 + db/migrate/20200519225752_create_users.rb | 18 + db/migrate/20200519230125_create_states.rb | 21 + db/migrate/20200519230441_create_counties.rb | 17 + db/migrate/20200519231212_create_events.rb | 18 + .../20200520030218_create_representatives.rb | 14 + ...4064017_add_uid_provider_index_to_users.rb | 12 + .../20200616205245_create_news_items.rb | 17 + ...28065604_add_columns_to_representatives.rb | 8 + db/schema.rb | 78 + db/seed_data.rb | 655 ++ db/seeds.rb | 50 + docs/Checkpoint-1-Spec-1a05.md | 3 + docs/Checkpoint-2-Spec-2684.md | 95 + docs/Checkpoint-3-Spec-b9c9.md | 44 + ...-Management--Heroku--and-Travis-CI-6b5d.md | 209 + docs/End-of-Iteration-1-b43f.md | 4 + docs/End-of-Iteration-2-3d4f.md | 6 + docs/Getting-Started-a6c3.md | 102 + docs/Intro-23fe.md | 11 + docs/Iteration-Instructions-581b.md | 81 + docs/Linters-ef5d.md | 41 + docs/Pivotal-Tracker-and-Auditors-bdb7.md | 58 + docs/README.md | 14 + docs/Understanding-the-Codebase-d21e.md | 15 + features/step_definitions/.gitkeep | 0 features/support/env.rb | 71 + lib/assets/counties_fips_data/ak.json | 147 + lib/assets/counties_fips_data/al.json | 337 + lib/assets/counties_fips_data/ar.json | 377 + lib/assets/counties_fips_data/as.json | 27 + lib/assets/counties_fips_data/az.json | 77 + lib/assets/counties_fips_data/ca.json | 292 + lib/assets/counties_fips_data/co.json | 322 + lib/assets/counties_fips_data/ct.json | 42 + lib/assets/counties_fips_data/dc.json | 7 + lib/assets/counties_fips_data/de.json | 17 + lib/assets/counties_fips_data/fl.json | 337 + lib/assets/counties_fips_data/ga.json | 797 ++ lib/assets/counties_fips_data/gu.json | 7 + lib/assets/counties_fips_data/hi.json | 27 + lib/assets/counties_fips_data/ia.json | 497 + lib/assets/counties_fips_data/id.json | 222 + lib/assets/counties_fips_data/il.json | 512 + lib/assets/counties_fips_data/in.json | 462 + lib/assets/counties_fips_data/ks.json | 527 + lib/assets/counties_fips_data/ky.json | 602 ++ lib/assets/counties_fips_data/la.json | 322 + lib/assets/counties_fips_data/ma.json | 72 + lib/assets/counties_fips_data/md.json | 122 + lib/assets/counties_fips_data/me.json | 82 + lib/assets/counties_fips_data/mi.json | 417 + lib/assets/counties_fips_data/mn.json | 437 + lib/assets/counties_fips_data/mo.json | 577 ++ lib/assets/counties_fips_data/mp.json | 22 + lib/assets/counties_fips_data/ms.json | 412 + lib/assets/counties_fips_data/mt.json | 282 + lib/assets/counties_fips_data/nc.json | 502 + lib/assets/counties_fips_data/nd.json | 267 + lib/assets/counties_fips_data/ne.json | 467 + lib/assets/counties_fips_data/nh.json | 52 + lib/assets/counties_fips_data/nj.json | 107 + lib/assets/counties_fips_data/nm.json | 167 + lib/assets/counties_fips_data/nv.json | 87 + lib/assets/counties_fips_data/ny.json | 312 + lib/assets/counties_fips_data/oh.json | 442 + lib/assets/counties_fips_data/ok.json | 387 + lib/assets/counties_fips_data/or.json | 182 + lib/assets/counties_fips_data/pa.json | 337 + lib/assets/counties_fips_data/pr.json | 392 + lib/assets/counties_fips_data/ri.json | 27 + lib/assets/counties_fips_data/sc.json | 232 + lib/assets/counties_fips_data/sd.json | 332 + lib/assets/counties_fips_data/tn.json | 477 + lib/assets/counties_fips_data/tx.json | 1272 +++ lib/assets/counties_fips_data/ut.json | 147 + lib/assets/counties_fips_data/va.json | 667 ++ lib/assets/counties_fips_data/vi.json | 17 + lib/assets/counties_fips_data/vt.json | 72 + lib/assets/counties_fips_data/wa.json | 197 + lib/assets/counties_fips_data/wi.json | 362 + lib/assets/counties_fips_data/wv.json | 277 + lib/assets/counties_fips_data/wy.json | 117 + .../national_shapefile_request.rb | 32 + lib/task_helpers/state_consistency_checker.rb | 44 + lib/task_helpers/state_fips_task_helper.rb | 89 + lib/task_helpers/state_shapefile_request.rb | 37 + lib/task_helpers/task_helper.rb | 35 + lib/task_helpers/topojson_task_helper.rb | 64 + lib/tasks/cucumber.rake | 80 + lib/tasks/national.rake | 16 + lib/tasks/states.rake | 63 + package.json | 57 + postcss.config.js | 12 + 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 + script/cucumber | 11 + spec/linters/eslint_spec.rb | 14 + spec/linters/haml_lint_spec.rb | 14 + spec/linters/rubocop_spec.rb | 12 + spec/rails_helper.rb | 97 + spec/spec_helper.rb | 96 + yarn.lock | 8713 +++++++++++++++++ 292 files changed, 31446 insertions(+) create mode 100644 .browserslistrc create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .haml-lint.yml create mode 100644 .rubocop.yml create mode 100644 .travis.yml create mode 100755 Gemfile create mode 100644 Gemfile.lock create mode 100755 Guardfile create mode 100644 QUESTIONS.md create mode 100755 README.md create mode 100755 Rakefile create mode 100755 app/assets/config/manifest.js create mode 100755 app/assets/images/favicon/android-chrome-192x192.png create mode 100755 app/assets/images/favicon/android-chrome-256x256.png create mode 100755 app/assets/images/favicon/apple-touch-icon.png create mode 100755 app/assets/images/favicon/browserconfig.xml.erb create mode 100755 app/assets/images/favicon/favicon-16x16.png create mode 100755 app/assets/images/favicon/favicon-32x32.png create mode 100755 app/assets/images/favicon/favicon.ico create mode 100755 app/assets/images/favicon/mstile-150x150.png create mode 100755 app/assets/images/favicon/safari-pinned-tab.svg create mode 100755 app/assets/images/favicon/site.webmanifest.erb create mode 100755 app/assets/images/saasbook.jpeg create mode 100755 app/assets/stylesheets/scaffold.css create mode 100755 app/assets/topojson/national/states/us-states.topo.json create mode 100755 app/assets/topojson/states/ak.topo.json create mode 100755 app/assets/topojson/states/al.topo.json create mode 100755 app/assets/topojson/states/ar.topo.json create mode 100755 app/assets/topojson/states/as.topo.json create mode 100755 app/assets/topojson/states/az.topo.json create mode 100755 app/assets/topojson/states/ca.topo.json create mode 100755 app/assets/topojson/states/co.topo.json create mode 100755 app/assets/topojson/states/ct.topo.json create mode 100755 app/assets/topojson/states/dc.topo.json create mode 100755 app/assets/topojson/states/de.topo.json create mode 100755 app/assets/topojson/states/fl.topo.json create mode 100755 app/assets/topojson/states/ga.topo.json create mode 100755 app/assets/topojson/states/gu.topo.json create mode 100755 app/assets/topojson/states/hi.topo.json create mode 100755 app/assets/topojson/states/ia.topo.json create mode 100755 app/assets/topojson/states/id.topo.json create mode 100755 app/assets/topojson/states/il.topo.json create mode 100755 app/assets/topojson/states/in.topo.json create mode 100755 app/assets/topojson/states/ks.topo.json create mode 100755 app/assets/topojson/states/ky.topo.json create mode 100755 app/assets/topojson/states/la.topo.json create mode 100755 app/assets/topojson/states/ma.topo.json create mode 100755 app/assets/topojson/states/md.topo.json create mode 100755 app/assets/topojson/states/me.topo.json create mode 100755 app/assets/topojson/states/mi.topo.json create mode 100755 app/assets/topojson/states/mn.topo.json create mode 100755 app/assets/topojson/states/mo.topo.json create mode 100755 app/assets/topojson/states/mp.topo.json create mode 100755 app/assets/topojson/states/ms.topo.json create mode 100755 app/assets/topojson/states/mt.topo.json create mode 100755 app/assets/topojson/states/nc.topo.json create mode 100755 app/assets/topojson/states/nd.topo.json create mode 100755 app/assets/topojson/states/ne.topo.json create mode 100755 app/assets/topojson/states/nh.topo.json create mode 100755 app/assets/topojson/states/nj.topo.json create mode 100755 app/assets/topojson/states/nm.topo.json create mode 100755 app/assets/topojson/states/nv.topo.json create mode 100755 app/assets/topojson/states/ny.topo.json create mode 100755 app/assets/topojson/states/oh.topo.json create mode 100755 app/assets/topojson/states/ok.topo.json create mode 100755 app/assets/topojson/states/or.topo.json create mode 100755 app/assets/topojson/states/pa.topo.json create mode 100755 app/assets/topojson/states/pr.topo.json create mode 100755 app/assets/topojson/states/ri.topo.json create mode 100755 app/assets/topojson/states/sc.topo.json create mode 100755 app/assets/topojson/states/sd.topo.json create mode 100755 app/assets/topojson/states/tn.topo.json create mode 100755 app/assets/topojson/states/tx.topo.json create mode 100755 app/assets/topojson/states/ut.topo.json create mode 100755 app/assets/topojson/states/va.topo.json create mode 100755 app/assets/topojson/states/vi.topo.json create mode 100755 app/assets/topojson/states/vt.topo.json create mode 100755 app/assets/topojson/states/wa.topo.json create mode 100755 app/assets/topojson/states/wi.topo.json create mode 100755 app/assets/topojson/states/wv.topo.json create mode 100755 app/assets/topojson/states/wy.topo.json create mode 100755 app/controllers/ajax_controller.rb create mode 100755 app/controllers/application_controller.rb create mode 100755 app/controllers/events_controller.rb create mode 100755 app/controllers/login_controller.rb create mode 100755 app/controllers/map_controller.rb create mode 100755 app/controllers/my_events_controller.rb create mode 100755 app/controllers/my_news_items_controller.rb create mode 100755 app/controllers/news_items_controller.rb create mode 100755 app/controllers/representatives_controller.rb create mode 100755 app/controllers/search_controller.rb create mode 100755 app/controllers/session_controller.rb create mode 100755 app/controllers/user_controller.rb create mode 100755 app/helpers/application_helper.rb create mode 100755 app/helpers/my_news_items_controller_helper.rb create mode 100755 app/helpers/news_item_helper.rb create mode 100755 app/helpers/ratings_helper.rb create mode 100755 app/helpers/representatives_helper.rb create mode 100755 app/helpers/session_helper.rb create mode 100755 app/javascript/packs/application.js create mode 100755 app/javascript/packs/county_map.js create mode 100755 app/javascript/packs/events_index.js create mode 100755 app/javascript/packs/events_new.js create mode 100755 app/javascript/packs/map_utils.js create mode 100755 app/javascript/packs/national_states_map.js create mode 100755 app/javascript/packs/state_county_filter_util.js create mode 100755 app/javascript/packs/state_map.js create mode 100755 app/javascript/packs/state_map_utils.js create mode 100755 app/javascript/stylesheets/application.scss create mode 100755 app/javascript/stylesheets/map.scss create mode 100755 app/jobs/application_job.rb create mode 100755 app/mailers/application_mailer.rb create mode 100755 app/models/application_record.rb create mode 100755 app/models/county.rb create mode 100755 app/models/event.rb create mode 100755 app/models/news_item.rb create mode 100755 app/models/representative.rb create mode 100755 app/models/state.rb create mode 100755 app/models/user.rb create mode 100755 app/views/application/_favicon.html.haml create mode 100755 app/views/events/index.html.haml create mode 100755 app/views/events/show.html.haml create mode 100755 app/views/layouts/_footer.html.haml create mode 100755 app/views/layouts/_navbar.html.haml create mode 100755 app/views/layouts/application.html.haml create mode 100755 app/views/layouts/mailer.html.haml create mode 100755 app/views/layouts/mailer.text.haml create mode 100755 app/views/login/login.html.haml create mode 100755 app/views/map/county.html.haml create mode 100755 app/views/map/index.html.haml create mode 100755 app/views/map/state.html.haml create mode 100755 app/views/my_events/_form.html.haml create mode 100755 app/views/my_events/edit.html.haml create mode 100755 app/views/my_events/new.html.haml create mode 100755 app/views/my_news_items/_form.html.haml create mode 100755 app/views/my_news_items/edit.html.haml create mode 100755 app/views/my_news_items/new.html.haml create mode 100755 app/views/news_items/index.html.haml create mode 100755 app/views/news_items/show.html.haml create mode 100755 app/views/representatives/index.html.haml create mode 100755 app/views/representatives/search.html.haml create mode 100755 app/views/shared/_flash_messages.html.haml create mode 100755 app/views/user/profile.html.haml create mode 100755 babel.config.js 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/webpack create mode 100755 bin/webpack-dev-server create mode 100755 bin/yarn create mode 100755 config.ru create mode 100755 config/application.rb create mode 100755 config/boot.rb create mode 100755 config/cucumber.yml create mode 100755 config/database.yml create mode 100755 config/environment.rb create mode 100755 config/environments/development.rb create mode 100755 config/environments/production.rb create mode 100755 config/environments/test.rb create mode 100755 config/favicon.json create mode 100755 config/initializers/application_controller_renderer.rb create mode 100755 config/initializers/backtrace_silencers.rb create mode 100755 config/initializers/cookies_serializer.rb create mode 100755 config/initializers/filter_parameter_logging.rb create mode 100755 config/initializers/inflections.rb create mode 100755 config/initializers/mime_types.rb create mode 100755 config/initializers/omniauth.rb create mode 100755 config/initializers/web_app_manifest.rb create mode 100755 config/initializers/wrap_parameters.rb create mode 100755 config/locales/en.yml create mode 100755 config/puma.rb create mode 100755 config/routes.rb create mode 100755 config/spring.rb create mode 100755 config/storage.yml create mode 100755 config/webpack/development.js create mode 100755 config/webpack/environment.js create mode 100755 config/webpack/production.js create mode 100755 config/webpack/test.js create mode 100755 config/webpacker.yml create mode 100755 db/migrate/20200519225752_create_users.rb create mode 100755 db/migrate/20200519230125_create_states.rb create mode 100755 db/migrate/20200519230441_create_counties.rb create mode 100755 db/migrate/20200519231212_create_events.rb create mode 100755 db/migrate/20200520030218_create_representatives.rb create mode 100755 db/migrate/20200614064017_add_uid_provider_index_to_users.rb create mode 100755 db/migrate/20200616205245_create_news_items.rb create mode 100755 db/migrate/20200728065604_add_columns_to_representatives.rb create mode 100755 db/schema.rb create mode 100755 db/seed_data.rb create mode 100755 db/seeds.rb create mode 100644 docs/Checkpoint-1-Spec-1a05.md create mode 100644 docs/Checkpoint-2-Spec-2684.md create mode 100644 docs/Checkpoint-3-Spec-b9c9.md create mode 100644 docs/Credentials-Management--Heroku--and-Travis-CI-6b5d.md create mode 100644 docs/End-of-Iteration-1-b43f.md create mode 100644 docs/End-of-Iteration-2-3d4f.md create mode 100644 docs/Getting-Started-a6c3.md create mode 100644 docs/Intro-23fe.md create mode 100644 docs/Iteration-Instructions-581b.md create mode 100644 docs/Linters-ef5d.md create mode 100644 docs/Pivotal-Tracker-and-Auditors-bdb7.md create mode 100644 docs/README.md create mode 100644 docs/Understanding-the-Codebase-d21e.md create mode 100755 features/step_definitions/.gitkeep create mode 100755 features/support/env.rb create mode 100755 lib/assets/counties_fips_data/ak.json create mode 100755 lib/assets/counties_fips_data/al.json create mode 100755 lib/assets/counties_fips_data/ar.json create mode 100755 lib/assets/counties_fips_data/as.json create mode 100755 lib/assets/counties_fips_data/az.json create mode 100755 lib/assets/counties_fips_data/ca.json create mode 100755 lib/assets/counties_fips_data/co.json create mode 100755 lib/assets/counties_fips_data/ct.json create mode 100755 lib/assets/counties_fips_data/dc.json create mode 100755 lib/assets/counties_fips_data/de.json create mode 100755 lib/assets/counties_fips_data/fl.json create mode 100755 lib/assets/counties_fips_data/ga.json create mode 100755 lib/assets/counties_fips_data/gu.json create mode 100755 lib/assets/counties_fips_data/hi.json create mode 100755 lib/assets/counties_fips_data/ia.json create mode 100755 lib/assets/counties_fips_data/id.json create mode 100755 lib/assets/counties_fips_data/il.json create mode 100755 lib/assets/counties_fips_data/in.json create mode 100755 lib/assets/counties_fips_data/ks.json create mode 100755 lib/assets/counties_fips_data/ky.json create mode 100755 lib/assets/counties_fips_data/la.json create mode 100755 lib/assets/counties_fips_data/ma.json create mode 100755 lib/assets/counties_fips_data/md.json create mode 100755 lib/assets/counties_fips_data/me.json create mode 100755 lib/assets/counties_fips_data/mi.json create mode 100755 lib/assets/counties_fips_data/mn.json create mode 100755 lib/assets/counties_fips_data/mo.json create mode 100755 lib/assets/counties_fips_data/mp.json create mode 100755 lib/assets/counties_fips_data/ms.json create mode 100755 lib/assets/counties_fips_data/mt.json create mode 100755 lib/assets/counties_fips_data/nc.json create mode 100755 lib/assets/counties_fips_data/nd.json create mode 100755 lib/assets/counties_fips_data/ne.json create mode 100755 lib/assets/counties_fips_data/nh.json create mode 100755 lib/assets/counties_fips_data/nj.json create mode 100755 lib/assets/counties_fips_data/nm.json create mode 100755 lib/assets/counties_fips_data/nv.json create mode 100755 lib/assets/counties_fips_data/ny.json create mode 100755 lib/assets/counties_fips_data/oh.json create mode 100755 lib/assets/counties_fips_data/ok.json create mode 100755 lib/assets/counties_fips_data/or.json create mode 100755 lib/assets/counties_fips_data/pa.json create mode 100755 lib/assets/counties_fips_data/pr.json create mode 100755 lib/assets/counties_fips_data/ri.json create mode 100755 lib/assets/counties_fips_data/sc.json create mode 100755 lib/assets/counties_fips_data/sd.json create mode 100755 lib/assets/counties_fips_data/tn.json create mode 100755 lib/assets/counties_fips_data/tx.json create mode 100755 lib/assets/counties_fips_data/ut.json create mode 100755 lib/assets/counties_fips_data/va.json create mode 100755 lib/assets/counties_fips_data/vi.json create mode 100755 lib/assets/counties_fips_data/vt.json create mode 100755 lib/assets/counties_fips_data/wa.json create mode 100755 lib/assets/counties_fips_data/wi.json create mode 100755 lib/assets/counties_fips_data/wv.json create mode 100755 lib/assets/counties_fips_data/wy.json create mode 100755 lib/task_helpers/national_shapefile_request.rb create mode 100755 lib/task_helpers/state_consistency_checker.rb create mode 100755 lib/task_helpers/state_fips_task_helper.rb create mode 100755 lib/task_helpers/state_shapefile_request.rb create mode 100755 lib/task_helpers/task_helper.rb create mode 100755 lib/task_helpers/topojson_task_helper.rb create mode 100755 lib/tasks/cucumber.rake create mode 100755 lib/tasks/national.rake create mode 100755 lib/tasks/states.rake create mode 100755 package.json create mode 100755 postcss.config.js create mode 100755 public/404.html create mode 100755 public/422.html create mode 100755 public/500.html create mode 100755 public/apple-touch-icon-precomposed.png create mode 100755 public/apple-touch-icon.png create mode 100755 public/favicon.ico create mode 100755 public/robots.txt create mode 100755 script/cucumber create mode 100755 spec/linters/eslint_spec.rb create mode 100755 spec/linters/haml_lint_spec.rb create mode 100755 spec/linters/rubocop_spec.rb create mode 100755 spec/rails_helper.rb create mode 100755 spec/spec_helper.rb create mode 100755 yarn.lock diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..a623956 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,2 @@ +defaults + diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..eac146f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ + +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# Change these settings to your own preference +indent_style = space +indent_size = 4 + +[*.md] +trim_trailing_whitespace = false + diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..c8191fd --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ + +/node_modules/* +/public/* +postcss.config.js + diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..09ee62e --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,24 @@ + +module.exports = { + env: { + browser: true, + commonjs: true, + es6: true, + jquery: true + }, + extends: [ + 'airbnb-base' + ], + globals: { + Atomics: 'readonly', + SharedArrayBuffer: 'readonly', + }, + parserOptions: { + ecmaVersion: 2018, + }, + rules: { + indent: ['error', 4], + 'linebreak-style': ['error', 'unix'], + }, +}; + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b5b8af --- /dev/null +++ b/.gitignore @@ -0,0 +1,81 @@ + +*.rbc +capybara-*.html +.rspec +/db/*.sqlite3 +/db/*.sqlite3-journal +/db/*.sqlite3-[0-9]* +/public/system +/coverage/ +/spec/tmp +*.orig +rerun.txt +pickle-email-*.html + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Note: It is not OK to publish secrets in repo, use figaro instead. +config/initializers/secret_token.rb +config/master.key + +# Only include if you have production secrets in this file, which is no longer a Rails default +# config/secrets.yml + +# dotenv, dotenv-rails +# TODO Comment out these rules if environment variables can be committed +.env +.env.* + +## Environment normalization: +/.bundle +/vendor/bundle + +# these should all be checked in to normalize the environment: +# Gemfile.lock, .ruby-version, .ruby-gemset + +# unless supporting rvm < 1.11.0 or doing something fancy, ignore this: +.rvmrc + +# Ignore erb files generated by rails_real_favicon +# Instead use `bundle exec rails haml:erb2haml app/views/application/_favicon.html.erb` to convert to haml. +app/views/application/_favicon.html.erb + +# if using bower-rails ignore default bower_components path bower.json files +/vendor/assets/bower_components +*.bowerrc +bower.json + +# Ignore pow environment settings +.powenv + +# Ignore Byebug command history file. +.byebug_history + +# Ignore node_modules +/node_modules + +# Use yarn instead of npm +package-lock.json + +# Ignore precompiled javascript packs +/public/packs +/public/packs-test +/public/assets + +# Ignore yarn files +/yarn-error.log +yarn-debug.log* +.yarn-integrity + +# Ignore uploaded files in development +/storage/* +!/storage/.keep +/public/uploads + + +# Ignore master key for decrypting credentials and more. +/config/master.key diff --git a/.haml-lint.yml b/.haml-lint.yml new file mode 100644 index 0000000..69697d1 --- /dev/null +++ b/.haml-lint.yml @@ -0,0 +1,13 @@ + +linters: + LineLength: + max: 120 + severity: error + Indentation: # For consistency with default rubocop rules. + character: space + width: 4 + severity: error +exclude: + - 'node_modules/**/*' + - 'vendor/**/*' + diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..333ae26 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,106 @@ + +require: rubocop-rails +AllCops: + TargetRubyVersion: 2.6 + Exclude: + - 'Guardfile' + - 'bin/*' + - 'node_modules/**/*' + - 'vendor/**/*' + - 'db/seed_data.rb' + - 'db/seeds.rb' + - 'db/schema.rb' + - 'config/routes.rb' + +Rails: + Enabled: true + +Gemspec/RequiredRubyVersion: + Enabled: true + +# No space makes the method definition shorter and differentiates +# from a regular assignment. +Layout/SpaceAroundEqualsInParameterDefault: + EnforcedStyle: no_space + +# Most readable form. +Layout/HashAlignment: + EnforcedHashRocketStyle: table + EnforcedColonStyle: table + +Layout/LineLength: + Max: 120 + +Layout/IndentationWidth: + Width: 4 # 4 spaces for Indentation. + +Lint/RaiseException: + Enabled: true + +Lint/StructNewOverride: + Enabled: true + +Metrics/BlockLength: + ExcludedMethods: ['describe', 'context', 'shared_examples', 'namespace', 'ActiveRecord::Schema.define'] + +# Skips style of child classes and modules. +Style/ClassAndModuleChildren: + Enabled: false + +Style/CollectionMethods: + Enabled: true + PreferredMethods: + # inject seems more common in the community. + reduce: "inject" + +Style/Documentation: + Enabled: false + +Style/HashEachMethods: + Enabled: true + AutoCorrect: false # Unsafe autocorrect + +Style/HashTransformKeys: + Enabled: true + AutoCorrect: false # Unsafe autocorrect + +Style/HashTransformValues: + Enabled: true + AutoCorrect: false # Unsafe autocorrect + +# Mixing the styles looks just silly. +Style/HashSyntax: + EnforcedStyle: ruby19_no_mixed_keys + +# has_key? and has_value? are far more readable than key? and value? +Style/PreferredHashMethods: + EnforcedStyle: verbose + +Layout/EmptyLinesAroundAttributeAccessor: + Enabled: true +Layout/SpaceAroundMethodCallOperator: + Enabled: true +Style/ExponentialNotation: + Enabled: true +Style/SlicingWithRange: + Enabled: true + +Metrics/MethodLength: + Max: 20 + Exclude: + - 'db/seed_data.rb' + +Metrics/ModuleLength: + Exclude: + - 'db/seed_data.rb' + +# Version 0.85.0 +Lint/DeprecatedOpenSSLConstant: + Enabled: true +Lint/MixedRegexpCaptureTypes: + Enabled: true +Style/RedundantRegexpCharacterClass: + Enabled: true +Style/RedundantRegexpEscape: + Enabled: true + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..6dd3a4e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,23 @@ +env: + secure: Roq8/1BG2VJS0nBliiPkKm8pggAHE7KHWQ4FaLqdE/ZcNeSGpoYkx6cRSfgqRyP2d/cKtBMrDCHXW0JKZe3x3jLdVMimAb/syexDL5ISOB2J2bTySY8e8h4Li6pUiXl54rLVWt/N1dv3QfD+WbazNhB95kkrYNccVm6/wWCRM2a5CE5cy8WAMjVX4CRY511J7/3DHQ/64N2qhRwzNqIwEuE96eKOa/WGf6tuzW5ym2yqSZvPJy7lPz0vew5h4zJI/jXuDTcISBaiKQFSwRvduLQdK5RAAfaWfLidVXARZ09W98vgNEwEAkFHbQdwSYwcdmk/SLPGgdlsBZ36GhM97wMmo2ANS1No/aQjKoJp6BlDunnOWVGDXCcU5UPOodVbmQ04HJiOtNUIcWC6wOg3QJpP+MQd1GYdBuurs61TVK4lDI5p2Ob/kwgT4pjhlleHod8LWUxlZouhHoa5Cl2650yxxmn80+XPkRtAIrThQ1bMHTq772iE1Avmw0Lea4tqgW916TwaUEeHyPKK+jIURVn4JolUDKv/FqAsv4e4lu3zgKiHico9zH6uejyM6KTw+J5qCnIps2axANsMN2zrAUhw06Ji/FMV8QUXPXShWWjJ4ljBOW6xFztVMucm7gwurnmEYjAajB7e3utMSReuEmPVisOVrYgNGUL24AZrbbc= +language: ruby +dist: focal +rvm: +- 2.6.6 +cache: + directories: + - node_modules + - vendor/bundle +before_install: +- gem install bundler:2.1.4 +- nvm install 12.13.1 +- npm install -g yarn@1.22.4 +before_script: +- bundle install +- yarn install +script: +- bundle exec rake db:drop +- RAILS_ENV=test bundle exec rake db:migrate --trace +- bundle exec rake db:test:prepare +- bundle exec rspec +- bundle exec cucumber diff --git a/Gemfile b/Gemfile new file mode 100755 index 0000000..578ce94 --- /dev/null +++ b/Gemfile @@ -0,0 +1,94 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.6.6' # Make sure that this matches .ruby-version file. + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.2.4' +# Use Puma as the app server +gem 'puma', '~> 3.11' +# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker +# Note: Pin the webpacker version to the same version used in package.json +gem 'webpacker', '5.1.1' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.5' +# Use figaro to easily manage config across environments +gem 'figaro' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' +# Use third party sign on authenticate users +gem 'omniauth' +gem 'omniauth-github' +gem 'omniauth-google-oauth2' +gem 'omniauth-rails_csrf_protection' + +# Use Haml instead of erb +gem 'haml-rails' + +# Google Civic Client +gem 'google-api-client', '~> 0.34' + +# Use assets pipeline to serve topojson files. +gem 'sprockets', '4.0.0' + +# Use ActiveStorage variant +# gem 'mini_magick', '~> 4.8' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.1.0', require: false + +# Even though this gem is only required for rake tasks, heroku needs it to run +# pre-receive rake tasks hook so it is included for production environment. +gem 'rubyzip' + +gem 'date_validator' + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: %i[mri mingw x64_mingw] + + # Testing utilities + gem 'cucumber-rails', require: false + gem 'database_cleaner' + gem 'factory_bot' + gem 'haml_lint' + gem 'rspec-rails' + gem 'rubocop-rails' + gem 'sqlite3' + + # Guard Plugins + gem 'guard' + gem 'guard-cucumber', require: false + gem 'guard-rspec', require: false + gem 'guard-rubocop', require: false + + # Generate different sizes of favicon from a single image. + gem 'rails_real_favicon' + + # Report coverage. + gem 'codecov', require: false + gem 'simplecov' +end + +group :development do + # Access an interactive console on exception pages or by calling 'console' anywhere in the code. + gem 'listen', '>= 3.0.5', '< 3.2' + gem 'web-console', '>= 3.3.0' + # 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 + +group :production do + # Use postgresql as the database for Active Record in production (Heroku) + gem 'pg', '>= 0.18', '< 2.0' + gem 'rails_12factor' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..cd4a1f8 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,487 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.2.6) + actionpack (= 5.2.6) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailer (5.2.6) + actionpack (= 5.2.6) + actionview (= 5.2.6) + activejob (= 5.2.6) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.2.6) + actionview (= 5.2.6) + activesupport (= 5.2.6) + rack (~> 2.0, >= 2.0.8) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.2.6) + activesupport (= 5.2.6) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.2.6) + activesupport (= 5.2.6) + globalid (>= 0.3.6) + activemodel (5.2.6) + activesupport (= 5.2.6) + activerecord (5.2.6) + activemodel (= 5.2.6) + activesupport (= 5.2.6) + arel (>= 9.0) + activestorage (5.2.6) + actionpack (= 5.2.6) + activerecord (= 5.2.6) + marcel (~> 1.0.0) + activesupport (5.2.6) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) + arel (9.0.0) + ast (2.4.2) + bindex (0.8.1) + bootsnap (1.9.1) + msgpack (~> 1.0) + builder (3.2.4) + byebug (11.1.3) + capybara (3.36.0) + addressable + matrix + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (>= 1.5, < 3.0) + xpath (~> 3.2) + codecov (0.6.0) + simplecov (>= 0.15, < 0.22) + coderay (1.1.3) + concurrent-ruby (1.1.9) + crass (1.0.6) + cucumber (7.1.0) + builder (~> 3.2, >= 3.2.4) + cucumber-core (~> 10.1, >= 10.1.0) + cucumber-create-meta (~> 6.0, >= 6.0.1) + cucumber-cucumber-expressions (~> 14.0, >= 14.0.0) + cucumber-gherkin (~> 22.0, >= 22.0.0) + cucumber-html-formatter (~> 17.0, >= 17.0.0) + cucumber-messages (~> 17.1, >= 17.1.1) + cucumber-wire (~> 6.2, >= 6.2.0) + diff-lcs (~> 1.4, >= 1.4.4) + mime-types (~> 3.3, >= 3.3.1) + multi_test (~> 0.1, >= 0.1.2) + sys-uname (~> 1.2, >= 1.2.2) + cucumber-core (10.1.0) + cucumber-gherkin (~> 22.0, >= 22.0.0) + cucumber-messages (~> 17.1, >= 17.1.1) + cucumber-tag-expressions (~> 4.0, >= 4.0.2) + cucumber-create-meta (6.0.2) + cucumber-messages (~> 17.1, >= 17.1.1) + sys-uname (~> 1.2, >= 1.2.2) + cucumber-cucumber-expressions (14.0.0) + cucumber-gherkin (22.0.0) + cucumber-messages (~> 17.1, >= 17.1.1) + cucumber-html-formatter (17.0.0) + cucumber-messages (~> 17.1, >= 17.1.0) + cucumber-messages (17.1.1) + cucumber-rails (2.4.0) + capybara (>= 2.18, < 4) + cucumber (>= 3.2, < 8) + mime-types (~> 3.3) + nokogiri (~> 1.10) + railties (>= 5.0, < 7) + rexml (~> 3.0) + webrick (~> 1.7) + cucumber-tag-expressions (4.1.0) + cucumber-wire (6.2.0) + cucumber-core (~> 10.1, >= 10.1.0) + cucumber-cucumber-expressions (~> 14.0, >= 14.0.0) + cucumber-messages (~> 17.1, >= 17.1.1) + database_cleaner (2.0.1) + database_cleaner-active_record (~> 2.0.0) + database_cleaner-active_record (2.0.1) + activerecord (>= 5.a) + database_cleaner-core (~> 2.0.0) + database_cleaner-core (2.0.1) + date_validator (0.12.0) + activemodel (>= 3) + activesupport (>= 3) + declarative (0.0.20) + diff-lcs (1.4.4) + docile (1.4.0) + erubi (1.10.0) + erubis (2.7.0) + factory_bot (6.2.0) + activesupport (>= 5.0.0) + faraday (1.8.0) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0.1) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.1) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + multipart-post (>= 1.2, < 3) + ruby2_keywords (>= 0.0.4) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + ffi (1.15.4) + figaro (1.2.0) + thor (>= 0.14.0, < 2) + formatador (0.3.0) + gems (1.2.0) + globalid (0.5.2) + activesupport (>= 5.0) + google-api-client (0.53.0) + google-apis-core (~> 0.1) + google-apis-generator (~> 0.1) + google-apis-core (0.4.1) + addressable (~> 2.5, >= 2.5.1) + googleauth (>= 0.16.2, < 2.a) + httpclient (>= 2.8.1, < 3.a) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.a) + rexml + webrick + google-apis-discovery_v1 (0.7.0) + google-apis-core (>= 0.4, < 2.a) + google-apis-generator (0.4.0) + activesupport (>= 5.0) + gems (~> 1.2) + google-apis-core (>= 0.4, < 2.a) + google-apis-discovery_v1 (~> 0.5) + thor (>= 0.20, < 2.a) + googleauth (1.1.0) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.4, < 3.0) + memoist (~> 0.16) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (>= 0.16, < 2.a) + guard (2.18.0) + formatador (>= 0.2.4) + listen (>= 2.7, < 4.0) + lumberjack (>= 1.0.12, < 2.0) + nenv (~> 0.1) + notiffany (~> 0.0) + pry (>= 0.13.0) + shellany (~> 0.0) + thor (>= 0.18.1) + guard-compat (1.2.1) + guard-cucumber (3.0.0) + cucumber (>= 3.1) + nenv (>= 0.1) + guard-rspec (4.7.3) + guard (~> 2.1) + guard-compat (~> 1.1) + rspec (>= 2.99.0, < 4.0) + guard-rubocop (1.5.0) + guard (~> 2.0) + rubocop (< 2.0) + haml (5.2.2) + temple (>= 0.8.0) + tilt + haml-rails (2.0.1) + actionpack (>= 5.1) + activesupport (>= 5.1) + haml (>= 4.0.6, < 6.0) + html2haml (>= 1.0.1) + railties (>= 5.1) + haml_lint (0.37.1) + haml (>= 4.0, < 5.3) + parallel (~> 1.10) + rainbow + rubocop (>= 0.50.0) + sysexits (~> 1.1) + hashie (5.0.0) + html2haml (2.2.0) + erubis (~> 2.7.0) + haml (>= 4.0, < 6) + nokogiri (>= 1.6.0) + ruby_parser (~> 3.5) + httpclient (2.8.3) + i18n (1.8.11) + concurrent-ruby (~> 1.0) + jbuilder (2.11.2) + activesupport (>= 5.0.0) + json (2.6.1) + jwt (2.3.0) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + loofah (2.12.0) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + lumberjack (1.2.8) + mail (2.7.1) + mini_mime (>= 0.1.1) + marcel (1.0.2) + matrix (0.4.2) + memoist (0.16.2) + method_source (1.0.0) + mime-types (3.3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2021.0901) + mini_mime (1.1.2) + mini_portile2 (2.6.1) + minitest (5.14.4) + msgpack (1.4.2) + multi_json (1.15.0) + multi_test (0.1.2) + multi_xml (0.6.0) + multipart-post (2.1.1) + nenv (0.3.0) + nio4r (2.5.8) + nokogiri (1.12.5) + mini_portile2 (~> 2.6.1) + racc (~> 1.4) + notiffany (0.1.3) + nenv (~> 0.1) + shellany (~> 0.0) + oauth2 (1.4.7) + faraday (>= 0.8, < 2.0) + jwt (>= 1.0, < 3.0) + multi_json (~> 1.3) + multi_xml (~> 0.5) + rack (>= 1.2, < 3) + omniauth (2.0.4) + hashie (>= 3.4.6) + rack (>= 1.6.2, < 3) + rack-protection + omniauth-github (2.0.0) + omniauth (~> 2.0) + omniauth-oauth2 (~> 1.7.1) + omniauth-google-oauth2 (1.0.0) + jwt (>= 2.0) + oauth2 (~> 1.1) + omniauth (~> 2.0) + omniauth-oauth2 (~> 1.7.1) + omniauth-oauth2 (1.7.2) + oauth2 (~> 1.4) + omniauth (>= 1.9, < 3) + omniauth-rails_csrf_protection (1.0.0) + actionpack (>= 4.2) + omniauth (~> 2.0) + os (1.1.4) + parallel (1.21.0) + parser (3.0.2.0) + ast (~> 2.4.1) + pg (1.2.3) + pry (0.14.1) + coderay (~> 1.1) + method_source (~> 1.0) + public_suffix (4.0.6) + puma (3.12.6) + racc (1.6.0) + rack (2.2.3) + rack-protection (2.1.0) + rack + rack-proxy (0.7.0) + rack + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (5.2.6) + actioncable (= 5.2.6) + actionmailer (= 5.2.6) + actionpack (= 5.2.6) + actionview (= 5.2.6) + activejob (= 5.2.6) + activemodel (= 5.2.6) + activerecord (= 5.2.6) + activestorage (= 5.2.6) + activesupport (= 5.2.6) + bundler (>= 1.3.0) + railties (= 5.2.6) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.4.2) + loofah (~> 2.3) + rails_12factor (0.0.3) + rails_serve_static_assets + rails_stdout_logging + rails_real_favicon (0.1.1) + json (>= 1.7, < 3) + rails + rubyzip (~> 2) + rails_serve_static_assets (0.0.5) + rails_stdout_logging (0.0.5) + railties (5.2.6) + actionpack (= 5.2.6) + activesupport (= 5.2.6) + method_source + rake (>= 0.8.7) + thor (>= 0.19.0, < 2.0) + rainbow (3.0.0) + rake (13.0.6) + rb-fsevent (0.11.0) + rb-inotify (0.10.1) + ffi (~> 1.0) + regexp_parser (2.1.1) + representable (3.1.1) + declarative (< 0.1.0) + trailblazer-option (>= 0.1.1, < 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rexml (3.2.5) + rspec (3.10.0) + rspec-core (~> 3.10.0) + rspec-expectations (~> 3.10.0) + rspec-mocks (~> 3.10.0) + rspec-core (3.10.1) + rspec-support (~> 3.10.0) + rspec-expectations (3.10.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.10.0) + rspec-mocks (3.10.2) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.10.0) + rspec-rails (5.0.2) + actionpack (>= 5.2) + activesupport (>= 5.2) + railties (>= 5.2) + rspec-core (~> 3.10) + rspec-expectations (~> 3.10) + rspec-mocks (~> 3.10) + rspec-support (~> 3.10) + rspec-support (3.10.3) + rubocop (1.22.3) + parallel (~> 1.10) + parser (>= 3.0.0.0) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml + rubocop-ast (>= 1.12.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 1.4.0, < 3.0) + rubocop-ast (1.13.0) + parser (>= 3.0.1.1) + rubocop-rails (2.12.4) + activesupport (>= 4.2.0) + rack (>= 1.1) + rubocop (>= 1.7.0, < 2.0) + ruby-progressbar (1.11.0) + ruby2_keywords (0.0.5) + ruby_dep (1.5.0) + ruby_parser (3.18.1) + sexp_processor (~> 4.16) + rubyzip (2.3.2) + semantic_range (3.0.0) + sexp_processor (4.16.0) + shellany (0.0.1) + signet (0.16.0) + addressable (~> 2.8) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simplecov (0.21.2) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.12.3) + simplecov_json_formatter (0.1.3) + spring (2.1.1) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (4.0.0) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.2) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + sqlite3 (1.4.2) + sys-uname (1.2.2) + ffi (~> 1.1) + sysexits (1.2.0) + temple (0.8.2) + thor (1.1.0) + thread_safe (0.3.6) + tilt (2.0.10) + trailblazer-option (0.1.2) + tzinfo (1.2.9) + thread_safe (~> 0.1) + uber (0.1.0) + unicode-display_width (2.1.0) + web-console (3.7.0) + actionview (>= 5.0) + activemodel (>= 5.0) + bindex (>= 0.4.0) + railties (>= 5.0) + webpacker (5.1.1) + activesupport (>= 5.2) + rack-proxy (>= 0.6.1) + railties (>= 5.2) + semantic_range (>= 2.3.0) + webrick (1.7.0) + websocket-driver (0.7.5) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + xpath (3.2.0) + nokogiri (~> 1.8) + +PLATFORMS + ruby + +DEPENDENCIES + bootsnap (>= 1.1.0) + byebug + codecov + cucumber-rails + database_cleaner + date_validator + factory_bot + figaro + google-api-client (~> 0.34) + guard + guard-cucumber + guard-rspec + guard-rubocop + haml-rails + haml_lint + jbuilder (~> 2.5) + listen (>= 3.0.5, < 3.2) + omniauth + omniauth-github + omniauth-google-oauth2 + omniauth-rails_csrf_protection + pg (>= 0.18, < 2.0) + puma (~> 3.11) + rails (~> 5.2.4) + rails_12factor + rails_real_favicon + rspec-rails + rubocop-rails + rubyzip + simplecov + spring + spring-watcher-listen (~> 2.0.0) + sprockets (= 4.0.0) + sqlite3 + tzinfo-data + web-console (>= 3.3.0) + webpacker (= 5.1.1) + +RUBY VERSION + ruby 2.6.6p146 + +BUNDLED WITH + 2.1.4 diff --git a/Guardfile b/Guardfile new file mode 100755 index 0000000..21035e6 --- /dev/null +++ b/Guardfile @@ -0,0 +1,102 @@ +# frozen_string_literal: true + +# A sample Guardfile +# More info at https://github.com/guard/guard#readme + +## Uncomment and set this to only include directories you want to watch +# directories %w(app lib config test spec features) \ +# .select{|d| Dir.exist?(d) ? d : UI.warning("Directory #{d} does not exist")} + +## Note: if you are using the `directories` clause above and you are not +## watching the project directory ('.'), then you will want to move +## the Guardfile to a watched dir and symlink it back, e.g. +# +# $ mkdir config +# $ mv Guardfile config/ +# $ ln -s config/Guardfile . +# +# and, you'll have to watch "config/Guardfile" instead of "Guardfile" + +# Note: The cmd option is now required due to the increasing number of ways +# rspec may be run, below are examples of the most common uses. +# * bundler: 'bundle exec rspec' +# * bundler binstubs: 'bin/rspec' +# * spring: 'bin/rspec' (This will use spring if running and you have +# installed the spring binstubs per the docs) +# * zeus: 'zeus rspec' (requires the server to be started separately) +# * 'just' rspec: 'rspec' + +guard :rspec, cmd: 'bundle exec rspec' do + require 'guard/rspec/dsl' + dsl = Guard::RSpec::Dsl.new(self) + + # Feel free to open issues for suggestions and improvements + + # RSpec files + rspec = dsl.rspec + watch(rspec.spec_helper) { rspec.spec_dir } + watch(rspec.spec_support) { rspec.spec_dir } + watch(rspec.spec_files) + + # Ruby files + ruby = dsl.ruby + dsl.watch_spec_files_for(ruby.lib_files) + + # Rails files + rails = dsl.rails(view_extensions: %w[erb haml slim]) + dsl.watch_spec_files_for(rails.app_files) + dsl.watch_spec_files_for(rails.views) + + watch(rails.controllers) do |m| + [ + rspec.spec.call("routing/#{m[1]}_routing"), + rspec.spec.call("controllers/#{m[1]}_controller"), + rspec.spec.call("acceptance/#{m[1]}") + ] + end + + # Rails config changes + watch(rails.spec_helper) { rspec.spec_dir } + watch(rails.routes) { "#{rspec.spec_dir}/routing" } + watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" } + + # Capybara features specs + watch(rails.view_dirs) { |m| rspec.spec.call("features/#{m[1]}") } + watch(rails.layouts) { |m| rspec.spec.call("features/#{m[1]}") } + + # Turnip features and steps + watch(%r{^spec/acceptance/(.+)\.feature$}) + watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m| + Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' + end +end + +cucumber_options = { + # Below are examples overriding defaults + + # cmd: 'bin/cucumber', + # cmd_additional_args: '--profile guard', + + # all_after_pass: false, + # all_on_start: false, + # keep_failed: false, + # feature_sets: ['features/frontend', 'features/experimental'], + + # run_all: { cmd_additional_args: '--profile guard_all' }, + # focus_on: { 'wip' }, # @wip + # notification: false +} + +guard 'cucumber', cucumber_options do + watch(%r{^features/.+\.feature$}) + watch(%r{^features/support/.+$}) { 'features' } + + watch(%r{^features/step_definitions/(.+)_steps\.rb$}) do |m| + Dir[File.join("**/#{m[1]}.feature")][0] || 'features' + end +end + +guard :rubocop do + watch(/.+\.rb$/) + watch(%r{(?:.+/)?\.rubocop(?:_todo)?\.yml$}) { |m| File.dirname(m[0]) } +end diff --git a/QUESTIONS.md b/QUESTIONS.md new file mode 100644 index 0000000..f9bb021 --- /dev/null +++ b/QUESTIONS.md @@ -0,0 +1,7 @@ +- if we don't use Figaro, why is the Figaro gem listed in the gemfile? + +- do we really use both sprockets and webpack? can't we consolidate +the assets under a single asset pipeline? + +- is rails-12factor gem still needed for Rails 5+ apps on Heroku? + diff --git a/README.md b/README.md new file mode 100755 index 0000000..47ea775 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# Actionmap + +
qQr{8+}tygc~yB(xSOlb^Wc!ZJ&0Ui$mz~c~r{H1Gn?{Ur{q(BIX)(R;E zHt&NesMi_{^9-dF-V2O%$Ux(qCki97JO>*f15GJQ92VgPqL7da;y5A`8Mz*!VntXc zxXj^Qf!5W#5FQCa~9!COj(eGDbh=Xl{n||!r`RD3kT98g(MIG* dVqA$WzSdI=A>65-u1t%DHam(~P;%yDkvWclQU z$6p){hi`rP% 8Ui~ z{_E49Nhu#Z^r9$;qKHTcieZkFioD2);}~NsLQ0Htgi%=i9pDUj0Y(`d7U=}C)I`K+ zr72`i*S1lKLfZ&w1kM&n;Ruz&m=dWqSzh3TK m8*r2q_44fXNF2rO-$O0 U=$##l|-qo-fM<1H3(x6!egAp;j3ei$`S}fwNpPMLI{*n z066CeVvlzNOd(N9(QMXnKBd#`;IM>2KrM+G3 sm@=cx46)RNG6d@pUgC_QnZ~G4VVuD$OInK%NQ$gPVX@Alr9^0jm*Azq zOVCK%z)_e2=PlM6;v^!iCpZt*Sv(FYC8l)Pp(74MkOGIVPHh}22{F0DmmY7y`;ssa zB;yfM8uF;X`2r~wq15#Dd*EWG(*{{lpo1KbLn}al4g^^~1SB4Tuj~@uy9b;6v+Kb9 zmGafQ_5o=lCaFbuX+Q7n_COAd0w5(`Do_%y !67e%=l+uxg32}d)Ff0Q0ADGA zb0uk#((Cm}q9)DO6#YRT>kKE3Kg^M%hxqX0kLdL}y!6u7DNVr#AH0vX7NkT92S}t) z1R`Q)Vur?{CWX)09&EAEUL&k2kOm t1;MmeB!XRL8f0xybd&Fsg(BOoiFor-z zC=^pOEe8Do!y>B`*;h_oF?39(lgu8Sr9bQ=wP2X{+1}d*;Xnx-keiZNj 7+JnIwc0O13&PRZ=V67w^QZ11gdZ}SGti5k74hm(#l3Xmv#DLFEClHtw}({n5> zEzmbT_B*>oVL(|JJQgXd!^PisN4>!P2X5&7^#K9*-5)$&2}*A$UG+LBa$ppoC?j+k zQj`&88KHw1Qz}LWO%($OUp;t0IEiw<#`p?}^We&oZtgH9;(zsb{u{;`v;4#V?jPcT zbLXDn=&>VM7xR;sf6VOcF*@Bgy}n256z?2PREy+G$*EK4`8&V+ce!=@4!yj?rCXO+ zTW?dy60I8un^FuVhi6ancmCG@n(fUEqEK_=_9uM*2Y-%C71nz2j sddH2#gB;(WMeh5m@ z-5<~j$N0m){l8=XUYCFJkN+uO`=9?!uC83>M?d*K)+oZLiMI|2Am-8Nr!wQQP2gd@)|KBh1|EC)f34#;>jhzKEKgh&t~LW&3} z;{V{4fDb4O0Y1dLfFgrC_f`mXM3U4fN=v)lB?v<5jRu3kfLph2vAnWEUX(be5JccZ ztWlJOz}Wz;YjpO8>}>Y9dwZQIXdrxuB&Nt<(09baIH7Oy-~V_2n1BAy{)nd^`yw-w zhZuAV!XP9~YdGsDOGB$RPAEgl(&9(4ix7f1iuw5CPxu%A`d?D!CExz;clhB?e@qy~ z1YwBMiYN*ZQlM2pBW;llOH65z2(;3aMS&24FTVIC-hT64{;&V-|BVmczs%RZ@Y_UT zld=>D8B-dGvl>B6pc|Y!eSt53;hT()&EZ{$DK&wvp>>K@$>^DfqxT5$ng9OmOAsT7 zs&yhp5~EZ^5Cmwg(fYugy9dVtNaaw #L&g7 z0muPLgA4=~g95_Dfga#}AE`48T|`jFlml!bP=UnSE~Tk5MaCGE(hP dLI{*L2xaj|g2 a z)}XXUqv>Xw6t07i8D97*!1X0Qu=vnp6s+}blZy^ADDfggsAA+_OSJYNbN2e{7=}c( zkRT3lu3%VN@*?NEKlpQg@3;O2|Ly GmKbYBd2Ty;5)$pJzc;GHdxvm}&_*y2#8E_4k14_--Liv3;|qsE z66%1gKO_z!v V|8Det>7RG8Vdc}}-zsLCa1jFGFAt4Af z);g@QU_D8c(&=;v!k91&5Ykt50$bwoBTFnsY0ydmgfRR{8tB(-GBMO#IP!G)+*8lL zI2aDz`ukt|-+ta(4mdy-z~v3RN}*`tiw4LDZ!O*{g!f2X<^E6=U8*$PubR@*Fp9r? zr3fT=<8VUJYBU%OhX|o4GmDUdGB*TKh$$_2f%V`qIAuXPgjZOj07-XX>DU67IE;*m zeT~2em~u#AKnY2w*GGq7tf$_b#|epb9^pX?g) Ak^cX~J_K{l`^AyPGP zAPa$a7KFnn!@yZc>y()!4w{& w76?(fBoES|ew2@f&lgp`cmpJJ_xlx)>pnZTTO9(wimlVDrmQA$R;0@Lc3ALas zbK)eSw4Ux@NEoFEA;DJ)qEJXL(IP+!Nofsef%A^S7KCAlH&qI@95+Z6Ja9Rr5a1l% zJCp<=E!Gz}FFMIj! J`pPgir`205f{N0m3T;1w2rIYDN5m6{%`9LI})o$YgVzda{TT+2_689>{@F zfTBGE!+?a-Or#U&AV!D~@2k^Sh$^inuv8@nK;a0q#e0d>8Y_azii`qHiAQ*cqzclVaMd#U(NYQnqDmkD z;1%`sJ{-e?5_on0z!0RW+Ol3S3T6c|2oU6;desKDjVh}n4MMgN7=%yoF2#9UrALJa zEce4>F}fC`@9L6_MiP(@W~+nbfXIPS0B=K_3BZPU8-fTcH^?hog@i!hDr?{+2#J^a zfdarU2Q;JX^MimHKgwBu=68Ob;r1v#TVA+-n*G{bw@{z?9RI*Q5sYG#`*&rbv?KJA z7u9C=_pKT@QB_x+07Z!##S2b=6#|RIJ-AwRvP<0PGxR7H8o7gF 3N5a *BU}U`M@U`$s?$}vS}MG-qr<5>IK+deCJ}CQfH{xz z8s~%mWY*|EryLjsxbN0D@9^H@y+t@v0j-?JJO7y&z=7n!sSfr&IO4&T?weu|pDNFP z;3|3Nf8`F4BkYX-4}Sg`)e-)FHPn21HUAl9@r+JFKe7*k(pAbLy+Gc#Q1`FnE0?Ug zLtCBhRBBaWb;RhJ4&f~lkMa)THPQzUEMj#BmG57fp~_- }t#HT1o zhZtF=Pk*Z_SyVeq$k9o7A4%i=eX~|&wS*fXUL}sWa_dHpobVvLt6VKFkPqG^Qi#!} z{4`7Usk3zdGc3-FDpvUHbMT)Y7N0^F {57wZ1 zm%sG5<^7bY=Qj%Q>*TYigYeZ!Cr0acKTxd@q17WU0dFg}<32nK+%K8*>i@X=`|MY8 zzW0H15AFdlqu}{h9jXUg`N7X*g)*z$1)%_k_wqrG{JvYDM1?5=fe;SqJ#rLhARJDP zEP!x0AL4DD2Y2j!g@f`I=_~i=L3|@dj|Ee?A)j$Q@DhYWhzdMcT8kT<_S|>V9>h!j zGkbO9Ci>5OTVH_^wUQ%O>V5{!;jO6>4kL?GJsI)oGaG%TaBie<2WRuc0a5@dK}zw! z{Rvb^nGG>T0eGaUd~-|XyE>sLy+lb#tDa)=A^lzlsERIey@}A8VV)CfjkhJHG$^gA z%#hM30eMk?_Y`GGSro`HMC*XOD5#}rl^Ifs;c!4U%#czNCkaY`&AQ}yhSVV{OweJ1 zF;#%4rKHG*cv}*MA<7$^b-2 N5AcR9{iNWH$#bA-DMv~4|nW~~>FzAuQ(Fmtq zo$_L&(Lw~o^@O|_(CzIIMIl;8IHR$4gy)w9Isl<6n25Kwf=U2N36dznT0>dnSYrsn z2py#$L+}zQ!J2|$zm1ZTdaX86N{h24 e)#F#@ecIIeHxw zIWP(kh9O}X5(EL@D6#?b)6-0jw+I43UX)~|K|~c|v~(bKKzDDz#_B!hrY1OZbdD&B zxx2i|)?S-XHAo_jD{>ZQCrOi-es9Ru))rD&ilV}@Pft(NYBdnT NWX>n8lW|ZzURGG_5S62DU zdpCIQ$%lCO%we4KtZ$#-JAeLTI>P}fN&&+cpM8|0ho|`HlV$$o+gFfMa`fm?o_Xd1 zi}MrIk^m3nqe5D@o3XOI%1>W@o6g=A51l&7S6(_#UReI(FMr0Z8@oJx{xs(wKEc4i z+IE*e{oc>m+3S!dDW=SL_Q`XcJ2lIV>l^&5Kl*pf9A4s^Uw@KDEv#^qBb4iX5846! zyyV~f`#&d*HNW%CCs0BlyeHJ37X9vr^LJNz{MG7q0S&QnjG#`-EVq@}=(+&=3p zn|ph_d+`dtc MjN+Jc37K9RNvBc(GjvPPE?|kEVrYD=UJ3Vf!+^Y&!NTiZ1 zF3vIc*m2@8;*bCM&rp S;nf(xeI+ zX@HOpD;z;w<#^WC+iY*|A{ABNgRFpj-Tr{}^$pHHa*kL_taU7}tkUiG5lWBJrBxbu zeYHoo-Juo*Bnk$`ar^E%!(M?TAP7U|7sfa;J4N&P2HTsv?CormhNDcBHTa@OE%c;X zP?nZjta#~#3v6%hv%S&7n}S-TsD}byKr!qw>~{F#3or1(bLa5Zv9i9)?*1N9dZZ4R zoStU!&=_C;=F|Me_ut~~-F1>!A0Xh(r*dEv04m?n7*l10tU(Ho7SPFt{P~~$8C(1N zsI-pPnz9681&uhMm4*aTRxX0`L{f0!p;O$xyTJ#aTtNi_XUZy@ ~-FI?|s53B8pOm!^t<%^s>dkO`_fxwj+&VZJng~Q}Sq%W(&l~foH51l^5 z>e>n3efL8YA!VL}2UF%0&f>MgP?@kd-?_}se)bAFj6i9GQlJ!J7$T? 9vlSJtlNR5yRr4*Z6 zJM6W4C{vIK5YBOEA|+xG5!Nthgo-Fj$JSPdtSrcj5(#Jol9GB|5a=q4Hq%N;RRwVv z y&tG|kFnSV$sCtTB!O>%fsV5;O zH+*vWHv4@;YjTdVED1uv*4h?-{_XD(CMkQJg7L{IoXM-~ns=j0`@xU{qX2m+tAY;^ zUWBM1dH{D$f`~u({oln)ffcH12}H2n%lS9|<~t1b+c+6uJZx<3ap}rczV$m_ 7bee)oBd*A!mi5GbkXwln_Z`@i7I-A$y{7zY#e zCV%~RehVQZv +}p}| z`{P@9Z*aA$2jMpg@M}c)7~z5{d*LE*G5838vh>`$w}T24z1$(Rf>5yE&j@g6;R%E% zln`pqCm(*unN!Dj?7}%NJaUfq?glO&fTzm8JC8MvK!S87cG$ryP|9#<<`GUE8^=*l zj}!Vs%au=Vko9{A>j~uOp*e#T7LO-R1Q##9!_i|)Jon6FJaqODcW$1*+CE^Afub+! z?AVCDRv;8R-45IPZDbf>s)G?q$JP*BZHB&x845{}OE$L$bTWgC5`?UZU!C2I%vwTa zz?5iTrCz67Q GpD;N;gAx!3fwYDqAAq&spq|8RZ*KG2 zYj1OCX`Vw1Q+(x%&ykfG+Iuh%D~T(M3KT5>Gb9og &&TV1)X-4}2Jw8GrKU-(!2PjgC{i3P2dbP$Ik|3M6@! z<2=MsL>Oq^c;ijx7Ur0l9_Q%`4-;!eFscamheLXU9DsT)p&3i^tcS8Cul@9gyzz3M zFTC_57alv0Egh~X@y1p?>9Wc`N$&}CRi)NiFxE L%_c9s^gPyNI0_0| zQtE`Ej3}j`5Q10V{)nHv@)}WX9ET)S0h9&(+z>XWFe;(|x`pN2-}@=o?yM5lCh%xN z9pK9xTtONsv^2yDc6Pda=g+^#es{?1!V+Kk(labfHd#8l#Kh%mWF14Ebt~>9EzlZ5 z;Rvuu>rqnE8k^+m&1F9N 0{DSZ|2YUjwZ0sFgq$Ux%-6i%Sy8k^gD{NnX@_|~_+%;Ci)yveH*C 1=bcUuib+Y63BVU`bM8#?pWWug%g^;{;e;t zaP%-=`RbSWNB{hfNgH*nsJ@4>zA6sl(MnKwFd|||#LwUQh?(gY#}}p;Yu3rFCk?6s z;;nn@tZw&Nm~HaplMk`8*P+wvBc)`}-sR}wlZ-VR3^K#=@+!4jiqLvg1miaf@asg% z0a6;I7$C$DWQLao9;l6_{QlqgZOResz)=Of+Ig;Dzr%OF^8*H@t9 >Kc@Ij0VYh1i?huI_ZoH{bcGtWHElaD@JHIxXAiZx1mcKbQ+Uc5?Y zU EMRH@^4`R%k>J;JgRpkj}BPy~V%&vn>Xt zr37S{5|7O@=;q)IAKh5x=(W2%_2>x>A3wt5Pd&w@o68vKtBz}_5h}zpV&6~-qZ+9C zG#lNLw=UjbX>O7v)WiV{oJEEWHdgle@#~lP=GUI2H8swE@n8NHS!q#9puA@+4e`!% z<;q^GM{n`S*`u63JWVqU z&_ZIoAn!UhcXzmS=^A(M?h!YqSl#Y${oW>7Y3b&kf|z?7eZty48(V$4MTip-4#&%{ zUqJ>nCR;HQxVPR$>ww{K!1D4YjYuKz7!Sj;;vouERq4$OOIZ%t*x2IsowWy0>{4oS z>%coA1p$uD-F ;t}O4< zZROnC+#^U*cJ}*Ry|IZghP|P~M|ILT wy0dxgN6n@Fgp2<|Kd7Y>!&w2*I(V) z*$%w3lto4yR`_%4%!8__cNO?*SPVz~t2MIHAyvhX83dZV=o4sBL5s^a(iIpVV@a_x zBB`b1WsiK=C6bCnj~d*i2361>Zi7%H(G-v%q+^ip;3&|lj`R(ruN2cbhYB^N^`Icj zhNNML@D?ourE^#%pd3=yRXd}#j>0SYg(a;wa5g896<(%vf )tY=*B6W%nQcw!-GF-8bay>K_nU0g`7G=Ln>T|#&q9&poBC`$_ zO<9|zR3XY40@KI#_o*i_xf3{@Qlijd0M3y2_6aG`IzR>?2#NG1zRW1|3>noCwF!E} zcw2CEOqPciXI?Bz^VZ+}*0Z1YmIDru1!&f%38RRetsX_*CeRUqjwtfH0-Rxy!lP7` z?T{LTmb5$j_?jS!8(0KFX|z^ol`tH18D>3P*`uC@1UdlY(ZVupZ-a7-)oTm}1w$(d zR1Cf#>+K SrsE~nG1mPIY=6GQ!i;S!=1UQ6sXcZ!&8oAX78Pd%M O`5S}c{(2WMAJ2+inpOpin z0PWruIuFQA7i3NlNA!DL!cg+qnG?)RjWOAZNh6834(m#Ug4OkXZrxqy-r5dP+N>6# zfKGddBvCy2=oyY4nx;_;tHPD7%<#@`j~jRIaA$d$K&1$sV4ddN(FKk#Jw%fDig30J z5IzLyu%f`a94SIV8FTHE+nBQC)Y+2+vBKfVOG_M8&F_&`lv#-pKpf(%<<{jJjMZx_ z9a>=MHSb?p=kkr))awytnUlsLFTHSqRz1PwCGWp~gSG7*aT3!T3^;q@C>PGnQIm$9 zPRZLJ+{F$vOt#PBRFm1cIVNXkNz;%}Dn#iJWkC`OHiwR%T)fRN>vME&hG#CECQf5S zK1ACL7bbL7N>P+(EQ8*Voy{Gt-&zGKpmZDxzWn_2G($_^OO%QzE#$Uhe^aAoog~)m zbO!wNt;-CH0h$q@>ww9DQ2-I{qk;e@cW`o>K@N>p!i%_C=yQ41u2fZ#sLf7DX= z&`H>7XZ+%g4|wn6YXo7;px5El;W@tag(o?@IEB;-Eg!HfqC6A^9zC I0Gy@p`5CNs}6s6_;k8kpmUtDC^?Q!Ph8J;_ToH6ad7AP5EMU_E9R2$0M zs$XVk47XNyxOjb)FbIJ9=e^B-MGlMt$S^^MAx0>ajwl8_&OUmMCm%kJmL6{h3<`sH z3LyfVhcr|~LNMKoc gq`QFQKQ|6vP8-%Y~Eb)?FUZPZ0rG^nnuLon`-p)48ImXLbtoJx;sD%O{ ziwZa61Nvq4n7vSx-f{EpI%ya(J-2`i1jpvaIXXSg%{zDT-f?Pafyi0BFj%QLe&!hO zUcSfnZkI!cra3%cLpp~raPQ_a+Z(GqeC7z>`112iG-Gn>u+CGIRiP>XBIQuBDr6~N zH4P<6ijoRv4Vkl)UQ$Yl^=`xuPzAJUpm_HDDYAZ#@BZjz8c~H{Eg4~htRpM^gPvul z1kP4$9NnR%%qwe>=m_~6IQ0Ltlr{z%f@~l}fysv)U05WQ6$|v{UYo!8?)SNKZ;$cG zL*#kR;l)XQ?`tp6Y&1!05%q~N1}5i`hflIJ*Fp(HXJ~orgR8vu{w4auj3AKAPdEAP zFTcRz^f Ly#?S;HcD z_xc9Ll$8Blo_zE$&s;b~qBPw+=f|&H 6q*G|ZxJhnHKKSG|jX2?N{odD6QZiOgI5fY==GHYtDUc3A z39j(my1K%CZ^ZATs=*cBI~vV8x~6ebaqapVcqseZEKH8!9t{yHMBv!iXmjn_DnZ&9 zK@dD^Tf1y*cUhVrM|e1Q<_JIdVZo^r3)E`WWE>|I9#1{i9GXs9yKOjqWVXWbAlTaP zaeH}%shKH`99_WrszYpbbCZ{U@g_nw$Ob){O-<<@A{sU4Kj?fU|fEwzOQoc8$wd zZ_`TZ2y3`j HlwPpW9&mG`O|#)BixMhqDNYQqA|y!0 za6y7J{og3Se@v7FtpsueSE$$Oy!ZZ94lhj7Y=i`1#EZ{9&xP}b?!Yj}4I7)A+_~~0 zfBNU&Wj7btWRk_jMUr}h!g@5YvbDorucSG9ge)%z15dqS+1ThX7?h0FqY5=SF@-Q! zv1LA@{qVG!F<*S)QF7xEI>b7vYUg0U>gp!@!;+}pLQ6}MBosoB#Nz}irLa|Vzmj$8 zjTyp518WN?2Xu!$E?>LJ-0YJC3R SFmKApZn$rucTS`Y~M)=SUx((}&{MiOhP9$=*f>pKH} z{Ij>&+}kIqd%Vpn*6jl(2Sx#^MsbgD)j5^aQm)^)$;&@iJbvL6OAFIPK}ecbufoC7 ze3NG$KElSv4zGQ9gP*;374IEk7!YWWGahR_I!wr|#HkQNN#QD W#g7=QOdO#T0e<{afJxtaTKCCI)TRrL`rf?a;2OOZ% z6L5eOz&l& IV7#O>RkaOBV|=gvLE_{0oJoRFq5Q6SMua&&Qqv^CC7 zzhrBBmoh65fhJUdEhtTfpu`K0l#V0~klG^DD0Qa<9)pyQFbMF@fmh^NfeHhxq@pGC zU<&Y7kmm(L3XCgpBEXjAh``ohoF~+kDU(tll_W2#&fi*`Ae3WcXP?cTZCZ_ar1YFV zc@!zC=J?%i!Rv2+#Q0aAqduW%B${)l4x<(19yYc+T)n$YnrddoA|k4TBMkz+^^LDk zBFK#(ke+&^hy-|RM`U8+mnyPKO026!GJ!%0iBJ}29Z?kW$+a8&>GxlulS{(5j=fJ( zHe!wF^ak{H+EryfP&hA |8(CrUsG+Pv<#eT|D^LcNzUy=i(0D%+)vg&7*K#>=m zK68pk&Mnf}-{7@h{EUkqd_QSONrd5kLf9^Qn{r)X%-bXhZ z;4HIK6GX~lie1ur1C#d{bT&A7`VdJ}QHPXHu-n<8UkoXXLWnwe=nwjQ@b)JR@)D^- zN&`Wl==TQPxV>CKlXcZeWv#;*Td}%Paf;#{UX-X%;8n$_Y)3RN-Tshkw^uo`I7_TG zT2uhP5?I;X@Xc9yznk+(Z-M4N42FDKSJ`xv@q+FIbwHV0tV>6d4jhqypw9n-q-Z zCpbtI_|lGo_v(!H9*lK3>p&_>>v-dx4_V*XXSOxQg~yIFJ2_5f9aFPY)EiAYc@L!& zT36S#)? UJV0C4gvcJiNGlz*njZ^{kTFRi`XZhX=N2bn# zhcl;7@P*wzKYjB(I>T+EKyq|xif5lbPY?<`mQFwC`klK3X^NEs w+P9&06QD_gXS z5*Gy+X9=WWB8izDZ=tlp8G&=YqIJ<>)rqDc9}KvB{WdpluG5G@_PRU#_BUQ43?iDX zF~0uwFYxca{bRa=K3b~>Jfhxv#+r5JXQzq6V8o6mu^ucMOTb=tfDU3T2d4? nz?)%AUr4owm%!MU?%IJCHkEghkXaZV8Fl12!n1*>3nYli~OhgWWJ z=J*oR6D $h26-$kb_2Cf=TVHLO#TsUG| z3j|UN(j=*7i1~_`myy3;adHZRFskMd<0>y(YIIO3$bC*)??HzN?Ox96#y)3{%~6z= zNQUfpGwv*JP_K`(vessMKWDsEkzGj@u)f`)*Dna8klBS9gbFam($5P1^!q>O=K2P@ zk&xRQX-b|r_YlAL)t9K(LX?D}H1zsIi~~EOgBL+a)R>|%DN)w)-lf}2FD&rf WxTlNrZ{pWI<*uS07#Wp-(i9Ek`e_wMeqyj!5h z<}e{h>9N@m6E^UP2356#DkTZR5Fr)Ddm>R$CJsv2>lcjIn^<4+lh-dYH8soWBQq!= zc=oBYeEiAB?C$PRIta8tsenj(B0q|e7!5O|sw6v~5GjE-1yQ|r(DpuXfD|ArhByp) zks*~pX-%)&;RiqbIm;`DId*uSMv@SUYG6j`VQ3-mcerzJjrXpu(3LgPT9a~Mxq4@l zds{!@?4uVrF;inE2@y(RkaT((!$FsuH*a$7<}!U3kv3=O7VyExD~Q4)wBY8w9kMLJ z$$&77kxEgPwwlr|^k|f7r63jmXUNLRHgCNBF*8#w*0*}>?DPnO1Un+Nt%gMkR1lEX zn=G$x^UnL%nQEqJ?|JR5_i@gm;}B;(Z@l{f{c?^l)~v5*+_=3;l%xm&H*Vh{>+WNU zfVbbdK_(NTcnm8F3ZH>WxV6#d?N3&jjxFn3J8W!i5~m4kn>&2?$xUiCxVu-&gGX z1E&Jwc!FMgiyyxHI)e-6Xx37OSwWn{Y;EuI_QlIIYom;osMz1`Q&I|1)p0Tld!3TC zo`L!_rMf>^^5FRYaDa63pZ@4A!YF+D#*N#rcJ|9a_z0y1#`N$mM>>rrCK4KFhZMHJ z2a3Xatc*}e6B$MbTcXMVp>Xtv19B?~MZrWZ0I4ZVW%>~kXFbM&jAE<^un2U~LA!zy zMd3VgoQ&MFvLfz^5=s=ggD8w1kkmR;pnU~}CE4FD$vSs3^r)N1z0e zvgExza3xA9O6wVx8I5KQMFR{N)5iLpQAVkSbq&w~UiB%8{c8HWtYdA2QVFIkNMcou zOHz=PmZGps${Z~m`y#=LCaH7y-U^65nXDs|1?tUlY_U&iGOQ_ad0yeKbTtvi_= >+}cvjJ4_%xnS6}2n&TURmYewpa_ZU6J$QXIuH4fti4SlJziCF1VRZ; zDAu||gw#l#B4vbBAu0+-gR!9~hBVRy9Q3;b3{{mkFAT8;O@RtzMPH~Af+!)&b0S@3 zdz7-+Jfqk547xp{IL28|APUSN$Cf!VjFDkdot)NFmIFfR$xTV-96m_UfueL4YcqW5 ziK1$ZsWW9Y#U6w7)ub3DD@;`3JYl3OB&Kx~?KWu|p_3RBgp|_bT-EnHa2YCYqQVp( zCWH|PpJ1dS9}JPMi#J(CO023u*j8wq^9%+V ^QX~s*;gWK#Awt&1LS~U1N}0gwhBpac+d~bQJ*1nVh`0&(i!9 zhmIX*YHk9-h#0G|I0rYDH~8@SJ@B4d65?%%v?YP^lp^QoktLSqA7g523?(JTc%1X> zZtZaW_9|<;yJV$de0GW#o_vN{R1vzDUO*U7*s3O?fYm$OTzvl`FMi=E=4PfC3 ?#}=nB-s8i7%#Oe;)>KGX1@C-tjY~I|2?9;Up?9$4z$ieR1O!2VR30HM!$BJ< zhop7ESHJuv9zAmui9o4pE h+g4r`C z7r1tNo4@+;n{4lNsW- QBf)x4q(|c<9EdaXoIihxzx?rQy!XLJEY2S0!XryW z0?MMqN?jo-M?s`_AWFfl8+9%`e3pr3LS9x3CP4tk`%z;&oIiVvfBT&uk`3A%Kk_Ii z4$ZK?x6b>Y+@c;e$p?nO7+!ehVdjo6aP?lBth>WQ&ppkfC+10O<6M0I7Dblv#pfR9 z`DY)YSxZ2OiiDW^b%mqcK0e1^{oqFo23wpt_8g~=En=LfUs}A -H_Wy=@*pdxWn( z_awrV4EuW=S(@hbsRbmCH(!5~%a<+@L X{3iIzG+ad&hWr^Svr-F&gJ0 zRmI*mR*(7O3r{dNUT1Zu%`0!b%l76DGZW){;khT6ni@w~k1q{k1hg;90xum&7;)jz zvrM%T?%rMFCqMluN`VRj0;PHGsb@HRWPzv7pXBP5ODJy$1=ynChd=x=TYFt(R3itx zP$(bM-WgP*kPs9_$<@nu`QYMpk~E|{*kNgUf)}2Bj`@j{#~(hy&tH3!t*x^x&Q5dw zv9nyed5^5u!{%`O=mJX%(+mxK_`wbO?HwXLnmJ~2%B;=F!$ =)X63G_a5hmKYkf&Eis M?3Wbw9`r+ns`XV+^G< z_s0_)Bsnk&ke6FHG}iCqMUOa+iJJ)zojgo4*4(?Z!^=N;o&EhDIxLxQH89TMq(%h+ zN^8PURZttH+3oh}Z|%{~4Oed7V!zX2e(4B1JKHoGwQ3X-Rr5-q1cO1JGv|&mHQB;C z&-?FP }Prs1Yn-|og2nhsAQRD@?yE_bq1G?=t z`|CSA{?v2q_A`V9Yz6tSrRCZu*SWX0Nz|CAn%_M{Y79!t{7i~1bK=Gr`@7q`_x4*f z$C?cDZEg!Vd*nD{<3~BXw7`CQhs#&5acFLe#rYWyEzEND#s;xWc>J-`q;bH?c9-kd zt`aD~l}HSMv|utGd-w$7^@w}hJ%0SNciC9qpwVd1AN2X?lRJcQjdKs3#fTIq66|Og z$e`2b(gz=ri;y5n3B!=GEXXa?CgusFCPg-=$iIG53I6pG=!7T?u|^Q;1T!?$n>D5< zC-Ba3>-J6B` n6U0@AT@Zm(`}<<2%Ik4*8*^G|W^k#lVA?X%m>*xB6T zlMgTQ#+z>wH)pAh%~3ii%c@bt*%DmA;_L)*AlTd8;nvOTfG3GVv=ofk`76|_6zCuT z5s(iv8fi+uKj4#3Rv2%LacFUdKm1?*FWB1IqtofKxv|aN8@Kq2zxW=RmBh6sT2;!D zL=k`e_kN$uT0|URq{Mi~&UVhLFTaZ^3!HUG0gDTZy!he^NF@kk!{OOU4lm7N3RqrV zMM}-3%h!4O!eh*g)p_jP2`+zponyxrIJ7W_^Kk9PExNrP6G8Op=qT@r0! 5r@?S@)a%n
t~|jJ3v@Us_~If%M0D?umza|HJG2)z99dEHcn3QdJ|1 zY@QQp$^7&r3dpmPB&jnyqmV){R!b@zi~#Qq)|PlvqC<&NA;V!#oYeX0PhV$!b&ba# zJHgVz6s^`Y^K&yibovDOQ%|tI-R3WU@G5s#Hc(Py4Ja=;a%7Rhg9sG^=Rpe6s7n}V zg1{4oA%%4uK03#dV+)v39FQu>{^l;PzxFn-eRzeqHo@jjpASE|!AsAb=j72PjxJ2{ z$mv-oTLJgBI=uJMB~%pSg~E$!ZdqO$)QF$RIdEPeWP( >g{jIN4T89;q!e!LM0B 7PS>8t~ zC^N&4e((zS*0+fo6ZFdrp*{IPlIJ;%G#ZWllI-quxq5w-D2_RNWQN6wl&sA7_{tTA zCDbM+@gm{lOZRyE+$koTDc}6s^UTal XmBnovgrnKlu4u^h?lTgf-Rl%+1|B!Z4z=1xk!2 zj~p;LFbd!qR&!?=k{4~pTM2VB4J5F;x5wUY7eq)YB)KV=pJ=i;HGwHSE+2CI&>Ua? z+Lu^gS>xwF{TZwG?y|PFNxPr%{&dWL^LPJ%sp)Bs99cxZez6+Fp)|&nIBPh(I8Qy* z6uD<}YllIZSAD+T5-QEn#kr~-UWp3yCLJ PUSX`pxT=-$ z=G`^^>@R V4)Hg>@hl4q)4cSRFY~Ye@)r~~!1#of)m^UNSY`V0lN>)hM-*vx zx_vHPyM>NxSeIgo9D}Te4eAi%1 ~**Kov&WtZ~g9<@wTi`lvzd^!i9$pvoQHP z?CrNHtYKI<#%dvBtrofWY;JF(0)_V$gvD9|!ZEurhm?}69Pr0~`d4i2bx7)Udfg6D z0Dt)R{(!@avsE=zDG(m#bFwTW)B=aaI>Y=-$~V6LJdZwdVl;ryA%y4f!Ym$7x7ViI z-$&^wl!T-f^I!bI@6j6;SQSu?M#O3na{KlcS1w OImZ`VYpG9}GD#3V=(&1vnGp2uR1ruu;Ix-GVfIby!qgytN`N zT@E4L-Q7KOmw>|1Lr6CgLw9$BfPl1sbeFUY-Q67$`knXQ@BYujbLPa}D}HP3dnfnH zahc(AtWX+)C}1Ay)Zl7mL$ ;m*X|7hZ*E*=WnHyGI>t{3vww@O}l{CFPt8d#v})dyAw#y)8k`2-ajqc1O0O zYjEWCm&%VDU5}#IJZy3A#iR?qm2{>|omm=pbW8v Q7&R2DLV%cnbh_ck4aH!ek_@EzI5pSIl5N=Y;PM@Dx++} zREyPkb#j8$67T{n&wtUTO4jdhPzWpUw{BQltCy&HXkaBbpRd)zyI15Gc}8EouM+A( z8Dx6;@^ZrrI6xhKPJiZZZ(|GeD!Bv%`UVHtbJfxX)#| AUe7GiE*9O>qUl6#q#hyjWQJCV@DQh?b;@z7bDy!dLRj@ zwruB%! o$w)Cfl5cQ=Ht{UW*t4m`G+Yx+jxgT+Fo_n{qm&$ z|Aq!7p>jBkuqx(CL;juOc!}2><#TqZX1FsU>9UFD8Yw6D%ZNdPDZ0(tps$VBIRILB zaSa!pyjTM+*o=V2LbiaAJE9g2$(4$ rX_+mI5X05}V;P)YXNgAXL9; z@2ZiEnjtB{s3j^|0xf>-u5L1EuN))_HRHRg;MJv3(tv7G*20}{@6a{4%o%m1cp7Ii ziX_2uAi3Yi_$T(wxQr(H_V_%d?9b+ED zm16lvGRVWz6KI;qp;6UtgyYB&{7KlTr;rn_JcxZ;?lr1I YH(W9da3> zlxSFUUhj=9?-7AvnC5FGa3dTTf!)ltTsYp&kwlBV$J5p;m$!azhNo>IBdJY9r&**a zY{5wu(|xM@E>$avF^XB-zoK>x;t;9z+K7c4T4#zkXY^nnai3?zHjshmgn28u-7!QG zJ);{E6GtdKRRUJ(TCa? iVp0m5?GDwoQ8XY; 7icM zE*Ae&%z&`wxRFdj@hc{}QYK9;tu(rZhW~PsdsYLe4%Gvo5CS|1rYVx*`=H^-8Q3PJ z0?O;JjVW52xvvU2nM?F4-w-j#C*!xvf#o!RjtU>WI!3w*pnCvjI;fy2SK28BuE^(X z0OKev^(Oza#ns-75$+!>S@fp%d%w4WnF|p%+tmRio->PFsn~F6Q*kC^pcDxhC6&Sn zeg(yp7F0@}wTF8@M=B^nxxCY~YXndc !vU4&pSz&2O8oeS_c`4ct zR$!bHjE9f-O Ns_kFM8^}-*8%&Z(r3M|ydBG#*E(fTOS1w$FKP!)Am zE(rl;5G=)VBod!NLx~H7AsFy1sHHT+ONWYZMU6r=Wfpo^Az)|WEnlrk1BSq0oakI| z%92lxW_cBhh6%w{!xc)q2oOw7vVu2}IONqxgU?}P_YzciRJ0S`jaZ*2@a1r&nSV5U z0unktLmUnwmz?J3{WY=2KB`_L`Ya}q?8=xq{H$?Xl3U>*_|77ZwF^DN-~|MyjEQtP z`{c(x(`Zhkc+c8je$6T&|2;%VtZ*nBh=R9VfW&M6;EtM}esH8dhk6p61gmFVTwFA( zU!=s6zMD;eKOhbY!_aM2)n*j&g*(LcYfQ=#!%7O}7joJ^QlI`8%TdjHhk^2@{a*C% zf$h&+@dvak(PF)tS$n`?@<|>ae~ uau&Mr2s;Q?WMp5PMVGprNdms!fi z`jN>k#wU}uyKo4;YX1a*Bv)JlLzhOM7LM@_4F`=>AN$0;6LpESQB>5LT6}KVeSQ6< z53wwW4!R9qwfBmELA0p6UvGXNs~+77cR0ptm#I;eZoS;E(~O0w#KaaF_ngQk8~8AC zlZ*QYFGg~Sd+lQ`eK?LO#Z9~-GtDZNI7lM&r>D A8bEv>?&el2x zZb|h8eeBU7VeNn5mHo~Gu-dvh6{EM_Pr38N7(kl7zPq+fxsu3v@4+n1$z(e@`kY#2 z@M;{o(&-!;Sw~Xn#;9)|CdSB e?4Fzn$*N_@`Us>8V2;g~Y_*qww*VC-KQS_sTkuZbIl-WfS*%!lbuD(~eDP zZ&3JF(AF^W_l~|vkn-65VWXot! AAQraLz%V)XPMEEWT+PgSp|tzBG_C{ZJe5=1A_5XN_Q2s8=e5OkD5VZ7O@ zB(ccVdeN*LoPz}^J_*hhE5sUFpT-c_da{z_JLHQ^Aui^@Mp-is&2?XQhBy1X&H)G2 z0D2*a96}x|pUa7ns6>5na(?c7a6z@zQm<$|k@t1}JP9-W_Y9)7!(4F!y^5NOj bV)zH{3p9cI_OXb?OD?Fbx1z+wu-p%x3}Y>%imj `{mdI;C zr_MYUmljJK^Lh>Hizva`GbQrH;)8z!!cCnd^YmZe_derkX4JN~4^Etsm)4O9yQEa- zis{V@WaNJArfT(hLB`kS`JDx+s&d+B|CC_~{Fc4FJp%)SPYw>TzV~UF`S}c}2xqI6 z$Y;CW6Q48mRR}euUF~xil?*>DTVxQDiFiaw>DB(|jKng(6A|-y5r+%MG{MY(0un)v z!&~GVA7Ufu4DIJ}tCxJieZ7A>AD<;8{>NMJy^-*{M-IZuGc`2vZ<;+sR6_f?%CAX~ z^p&g6KJY${a%xWYim{MY>?^DDgqAYCa4x?B*88IAa>!_~ujjdWH64bXAWPj^;N5Tm zdYTwcM4-7%c^PD ~lM@gdWGp8Y+i@}9vXsJl=GPAQReC(1~Sz3JW<r>^i1sG znrW$8g|tNKN&ObyaY-&I`y8+1;XfajDZAV7=wwsnNDbNc$&8M_&AFto^AGBX$`;QG zqaqY>T7BtK#gVlz3`>~nn-!)UQ*PAjcMfbqnjjwh0BJO0%W e3;D9dJehULjmo3ZKVrtPeQBPAzfi`lAhokKT zJ&a^*bTxzDMm7;uBLqt(?-I7^6U06{QbioQS2Y-%Q|xT+Mo399Aq{f!rnSI7xw}Tc zI8xwv5f%h9cUV?4D4Oe>5Z|C6I>XX9f4$wJ?GXZ+l?cNQB$KU$lu*2=rlf-L2)9i^ zdKJ@AXRA5}`JCkhVik#mbW(r?OGCQnh9V>dGHYj0fr23Nqq~uIbFzwW4;Tv>UE!X0 z3+Gq~^>#P<-;}1eULy1^uh$&%7d`XuF<0IZ3tJp$Bo0*qgFc8xG{I3Oswi{SKW8X) z+-G#fItZ65lSqz5g=1LI#a~N*JL(Y$$49;_!1!p01$ad9QyZm2EDC3?RrLoNdIZ4+ zFvR`QZ$YL!%;baz(l}sU69pN=G>yFyy!MMv4d2GKp+58qib3~;^yHFCp?blTItyl+ zx}jVkHex{;oG``0k?Pl?rh3 DIP{5kmjee1pTH}Ks=+6JMpjiv=w z1w#A%jvSawf$`LNB54;ZV%R05PkRZ0>YEIhInpz&o;9(Ty0JSNuTYk+HX+KSk0`KQ zFkZ)iDJ(s>mneg}m@w=U=33UIZ=2YEv9^gI_hNEm2F^QiQdf;kDE5XXbMLnE_azl2 z-2`OFuVFv^@wWRn`Vdw-UXQu$%e5l+;Cmu2yKeUd+~sUpMzrs=kwyUh<)VWN?YxZE zaM3y&Il${b9e@ZIM5T3!s8E@qnrU?2XjFJ+y>=Ff1gKPr(w|1{XfjstMnFN`#Og&^ zh{FBE;aqe|dO5OdzJ7XU YDq6C&9nlG-6ii>7rPw<-SNLbmj ;&^ZytYwwS5@j%4WCNMaR?5#D2vbex-U_po M5b!;z&crnU6a0;l&Hu%MVml}eHFfBBfZ35oJQ$R0-MM*L2yXG~x&(X2F!t@wni z3DZb@+Ri2AyJe~30= g9TZDCFg7|lpW4&_ z*Aw?lE7Xl}*KPK}2_uYPpX7q$9c=Wx3~Me;e+Ykv6eFK?RM7i|sX{~Ws5-)oUltWr zH%6oW+rSFLR8t%!dZe3yyL%?OIMwTF-Zc_C;qpD~6uN2D^^(xfdxtDLrL>Nb)tWo{nn`!uD1D&?C&1*28N zD`M>R9{S8#vV008-K9D-83?G<{@eWyv5^%^K@=1W)pMU)<=!|a=|tIJjQXa0Uulu@ zm0VBZCB=k=09^)MtP9J_ecKuN*+U?35Irh_9Zd|b&i8d2V)7mA&~oDeJD0dJR^=i_ z1fYE9C|0<`G`^cuIuY-a MhU#4K3p|D#- JSj{RkVUDE)m;^_%6xCf_<>N-0| z1AO!4i+g%|5yIoi7^1Yl2Rv*J=b{mlLhBnF`>Q`RFDxxlk8vB@W>lA*I62UimQ34E zIeH#=_@YwDpTdN^HMel8`l%ErpI1c7)bo)k!Fb}27cu~IG9%dPu(q^JUHcTFm&F)~ z*7$Y)SeG4sxy`C7A>Xz-C^V$t^qjKENfU)XI9U1Z{3T$8$9iJw)T8oEZ%7K^+*aFp zr}CGneE>bdoV#z2=Rd;>-Q8{4&slTN0+8G@vbS#zXJg{yXYHCYGV?0%Udu_<%onep zCt3>e@H7DIGT|%JP~7|7iClF96To%%&A#5Bd^2@u8FQ>{F^-<(tg*Af7`RMXPleeU zLbg^smtmzcS5Tg1VpP1g;NjarJ*kUlVlXV`ordqD&}U61EUboO^K&&ubp88G`A9;E zE Z0c`RM(BejxTm4|FRmjW5Uypi_WH=csLd*$<_jHNbBNA~u{g{5I+Vj?nW zmNE0BvX*LYj%l>23+u}Y5yVNfg^Tv}4Gn#N|B7pCYxl>JjOB_=Mfp?%(1sMEG*kY` zs@=kt3HT#Ue*UlohT*7S06cqmdL$~ MV_DzH30dM9-U0hdK&on1UKYd`8lO%sp_bEsa(c?i!!yu2Kr&%e@25yMH22(4 zmjd8kC2ej#Ld`S>D=61nwvg+%+gnv4qQQkFZbrf+dZf3pTvpcm<@5Mfv$iXlU^smK z!0ktZ){LW*S+r0ICu-FHE!x{=@q#fGk^X8NrN1WN#8~qH9G8cxrdb2h&{rs5BOJr` z4GCDOLk|LlzJ*y8AY$hl7U@;ib#x4@t%=K-PE~QtRLu`x2mi53uBc#od?A 29UO zIPef&Y4eOf)O&kQ_vem%$l3~c%Vq9RSb4L4<%-MX?Wb6R%L#W2qSJyI(G!z!RfQ1? zi}==LhnW*<=J4n%P@O_3DU*_bhLL%@2N`AFEX gFmma_6?{lvO3Q#7d5CN*qdT{XE9wPsee4W$AIKx!(X)sXb#i@4*|Zk={` zi}SYd{zNXo(== S@S0jU@3)2@opN1`JBmugGXgmLMklwf9&Iv@r3!ShQC}M1=H_;J zx#L(homcd7XF|@;tZ+sI69~}lsYWB$f2NjS6xf<6!%Lcca(c&ATA-OvOKKEFmJ(wd zJ6_w-IW(Hf_qd8dg%GvEeX^fYI+PZmGwxVu*}VrBzJ5E~Xru}dUDdXZ$;E~;z*I+T zhX9o?bgXQwc*v^lm_QrmgiV;thgBM?ZOAMu8#% h6=9 zqfGIUE;3uNlIiU*x3Xhybn-)fie=}c)8A9i|33|cBM0es{`J`_KELaVf6dp*+RE#w zq70B4v4tznR@)TXR?U3uqB8%;v75FJQ?h6(x!$jt_^gtPh=}ZXn<8ZkZ|$8rd^c@V z$f9jregeANUYn#^Ve}?=N^~mW(Y?yhq+C68BffbmX(DlIzo*Jo3x_X&z*+S_>L%(M z7zF*#SfR%sfG@PJ(JeyX^p8-RuWt!>w6|AO3Wr-vNKWXNp^2%bwRQN6-Q98xBo_h@ z)k^&uJe%>G8(z hH-Cs9A%F6iTx|d&DVw!kgm>dvb7mb zVeV<2&a1j;`>uQeAI@-a<6Ba(Hx=1nQ_VES+(8^h^)@=X{kh?zM!sWRL)*B#b#!a1 z5c!uAO(4xN3G5wXXKPpp2FAwyLPN2n^NZ`t)|)$c<5tPX0^fP~g?b7b6u`4EsV|Za zU!}+tfFM$)TA6CiJS4y|%Q`P0$+TwZ!Rsv*Eep%o$(ds!wrkq_86dwKnsz9pS*ob0 z)OWTH0xNby1J8;{>szIZled%9r8`G+m8@|boZ{kAAiaY2)KuLhc@<{!nL1cwn$GR( zeY6i;)W3OWNf_wy!uqKCdICEF(zDb?kkkH-@-O?!aN}MU>#uEDJ9Q5AK9ilUG}Lv; z{LC+$7lE0@)P-dqdoqnB8L`PJ4Ols)$2*!@*;kE>$F`xquCC)+VsY4F{K~5Q)%xqS z(k$1TswTHb!Z 9sKaHT@1802Rmzc BZ{L3`KLKC_7U2 zj{1kqZ8vRn&c?B7=zS4oc|KX3F^elJ7GIq5UvM8zTHodGZ#}&`bXzj^dPX>X@fUwQ zpqY@k1F=-HkcqgY;4`RQjFc*?sHo!8arw6S{u-a8Ni~Q1Mn^`Xd3boX`tGxLNKt4L zm4Ic_c2(3=T}}=(>qV`nC^m8|q0nf(%7MK>B9^h`9H1N``rZ2OW9;#-30106N;UIf z%8lngLy<+W56w>66qU|bH)vO^`|5vpCOLn|qDy6cZGQ-T2f9JAFqBKLuj}l6_Cxv} zU6fH>&6aZwEH)%`I7V*5CgRT<5Vd@ta=(X71=C;G&(-@MpW*u*yZ=R}&z~QbWi@YZ zN|n<;uC6Sh$K{KH+h)xiAi1e?gm3{kAl`yB%f0V&n-`ZB_B_8l)i~cAaNR9AoUzpu z6i0n6UOwmI5m1Ku<&e%h;m~n~$B_Xw(b+eTPb)v&F`Y1@uiu`Wod(r_)@Y-~Z`lB) z1?aP7IP_?XiET14HUONLkmfbNki$$cJ;TuA>gwjy48n{|(r>QP?K%A~Qodc$DZtBw zM*ig)?I@PMLn?kK&kH7q{%|-ZVd)EvE>?)UxLbCrtE*GXDzTv>hVm0*gcT6T83J0p zayS-`fW** ;2)fTWlp_qRjT3@6@eKJ7a11U;N=d!x)w<|da{d$ z t%> zlZRkH-!Fe?18vK<{^fCNdy^IG?6}rBu>@zfWwV63Mpx={B-3-r0j;ft^T%BLa9UL@ z6 m+6-m_c(H~(YKRd3Z*UOv&Qtrt$eMMq4PCY00Jp)q@Tnv8X`0_5TcE%{4RRT z3f970{xN|!lxpdBIq(kXRw00llMJTFYX0&)?^N%S*x4DGRZ&yJRp9z^qwp_owoIKz zOhjFaf+Zd6eLx-SXmjVS@0Sa2C!vj3Ox^i^EC1zP>Kz|``OEQluJXL|-f^S7*tGKc zSHt9Gtdm~{Ga}l^ <1;us0Re~^$y@sbE21y^j(#YxhoCg>RMz&UaRwE5L zB0#?R>NgsI+S=OM06i+v5~;~3mvTz<>BRNFMC!b$Z^-3{v*UV)wq_~H>j}dm&XW0K zVD&$A6aIbd4h*{-W1>!@QZe(Me9{=-NUd$^7+5e!E@I5g%iCM&vmS|#lKf =10JXZ~c zgCJhw#kjS_?LbaD&B_1R6FUrnEQ8XkYkq(QEHMc_;!6@NT0V8z9i;>Onas>gOU_}m z;E2UcI-sirl9onf`(tqUD(BB1A%3{tpYVSh6gZ(tj%BJ)` I%r@VZ72Sg=Svio$zPWP908e9W$MM#J3DpSIf4Pf zkt1k7el$O9Y{^aJi6~d=ZHHisZ&18Q{KbWn0GBgdkEMi`b( *Xrq+N yV>bZ>9}P>z7zN`O#QHQ75k0WZnO zuU{D3+uN`DomD_`E3M6gP^ZqGf#~zge`e=hA*|}(pG+^3GbKD#y?gxD9d@4=AJIfOM9;N=5<^tyHVRyL7QLivjan>+SFp#&) z+N_tBza3reJ?4-7dZBUBy~n|k`>t3}8^oijscXWwI=?d_>OC>9Gd2(;8%a|g{^r88 zfOdvi*dbQ`D)Ks|x`|#|I?Xx-UG9ptc-9t^1d}}I-38FTQ(IrJRt+zh2JKyJ(&PwT z2Zq=`QJs23r<;1m(#DO<#IQd7p*&G266RH@HZ3-Gn)>-b *I#zGK<0TlSuN^D25zdXp8 zdY|$ct&-o`;X--o$7%=B!ubT2GK^_TX)k0Dx+Ie%@km8EsF?xKQZr-kjy4Np9mAEz zyT@0OQ!VCF$+Gg>RPU6{BhK@?0t=sFtvaR$d>LR;qrD9Df_S8IuY3mwnmQ&phkaz; zdKdkB%N!kBn+)}vd4I#ejIXPwMG-X&B}j8Am95YzS+xU(#B|wBeh%*J z@IGOa70e!9^}gkpvccdI6C2QL7&%>T&d6@t^*KuA_RiCcKu?j0Z={$#^vEQk_-a%+ zYv+j?5)rI(vz>8!OTVO~MWtaDSVL=C5mA?=wnBH2BV;Pzs9C8Kf&Tg(hlw<)auz)R zQn|&&Cj`3wsFtK)U}AD{acz!P!-)zK2c?ESWM?CGCaYdnTR>gMF5l>MTd}x`y%=aX zr5xTsip*2X4cx4PQ>l(_(W|S8yw4)UG!0}6yl&_8TR(3iocryIWM*XnvXJOxv0kNS z yE)P>f)jk^%2v;3&hP8ciTIZYWClKWNY$)b zl;{m8DGQ8O@P!?eUHtc$&aKHL0#YDDaTiCGHD`+KN=(G$ @+ZnnusuQhtDExgEb zKU}T!MW9xqmzOJn(m)k@#3Y#rQ16$fbX0`MT7+o<1DcCB@vQiiekHXfV6|-aPoCX@ zlVbOxDA?qm);l{`Ygn}_=cWcvn8Otp qqRy_2u40`?JVwwY(qNKvYe3Aklr ejxOuC{ z8sC20QN_MqY6PSwH{JJ~J{ITq(}Ket+eQv9P_>Mb1P8GFk_2g(VXW-zbx!N1dV2ca z+pz+}O_t|9+q@()Zo;|wcP`73CdseT5(EiP7Clqq{o4okX2?E#aG)Qer&M29Fy3Dw zt#LW(QSchlj&ErHIczQdLP1RY{wvqYCudv2^|zW*L8cP)j(5XNW|o$*(vX @- zP^lh;rG-7ZMWCE{?T*b)P}p4@CqJpig> ~L^8)sJvK6f6)*8u5L@Dz z^VEYBg5i0#V&?6gX`SZ{jBh;vC(wj_cpKdaiRB_s9YpjUyyq12jVPRE8l4lC4}2G9 zfXJpvseuF=5qg{w@v1lKZ(ut2o_xX)-h51ru3}%Mi}r1Q-g2#C1^UdX%rq!fAyET( zo#)p8D#w+hI`=wyzq7 Co!N z7L6klih(obzpPLIfD4e+cY8zMzFAetuQe!{os@*J);It?u3TzjH(2eXf)L+0vseWy z+UnnZ==myb;>{OtV7*LT-bg-?*I4YxxO1Cea<3a_61fq@rr~iG{n}P5FN+MT8fA${ zV5)d~>Grq;n2Ztc9~~72vm2Uzu>RNiLMHNrIIuViD@7&>B8;+Xjvp3tLoP?nMTId^ zCOk+_pAIV0eoNQBVfj52&n@l@Qr{sHy+U;|@ygx(uz!g#q}%C!oYsfp;E0R(y05RV z{qd;syO uKc%n>D4j+7)8fg zk*+%N7_o7SaE&U6`^3nX%KAcc;{$GJfSdgGd9CbAJg<99gGXBkocJXmeWU^{EiH{x z@wr?+>nrWZ }#S0D_ zVJ2UO3SK#?`e6Sldo{0>l|4rmVr+0hzkxq$XrUhS=ciFR>DL_r()zwC ~_!Ow$o45=}}bzJ0mCLt$; S%bjFzqjY8;iO~h;d9df^MAt9`mSTcpZ&)B&nj*kGS-Xwzv=aY4W8WFAAbw$ zGo$=QuC9R6Te04$VN?|C_h0AZy$?&%7kGHa;BaK;w7Qn|-u@j^quiWowTT`G_T?1* zc_~+GejeH(G`}-#$K#VU+leGTBT9}-FadJpYmB<_IxRe<_+WyF5;?euJOlKB*%AVI zv#YNWKp0ZG?l|N0oyVAsN1|EM&QJa>Z{q-RUM3h2VMRXO&?AY~i?xG>sbv7GRpiZx zku(x5OypMpof1$?smaKq?#pc;S?DDhgkmWDhRV2o_@G1j+V-a$6pG(S9mk^w*K2XT z=l9gtufUw-^f %L-Wd;x_X4nnRsKOsA?g$%? zNBbWlwDR1|Gv>}6%Kl#H5{%ei&+@b{h>&Ucs1r^kydtJJGPFj}ATLAe|2EZqM_#ub zAWj)7Nla#BfFSl>8G>i7M*s`!AWv0_Y+mz8Ud$wB|Jd0Nhtpe6=1Fzl5&~QmG1hKZ9hNWMGA6 mb z=ZPic895^(Xn9Y2`a-VHAT1{5TPm#g5|O&%$JuNp`k#+b?}lEWU*M2Br>9YaV>OJ; zc5hb*F=>9kdK@=D|HMOt`Q{$m*-HC(q0G<-7&lMuZTv4C#Vv&QEM(IGPam5Lni+Zo znY=h3TsE+3s*{})(bumPo2>jBBFFLTOVsoBX>H@U!p5z#!^yuywXAR7|J(jjpp~Q( z{d(0jdOVhIt7Yh9=k@6Bm6+otdjzlx*{0#iQKhq+?B0!MtHi`N{Hzbw3TDXnOX78Y zlbe~zWb{GRCzrigMs2cT_7E5fM-jT+(01ci{m5X@6@h`U#j0Q>l=nE M5ReEZSyQ+N-J-IHbdqC{MKXw_ma{cS#z&U`!oEWy#IZD(&$}DsG~U5lu-t zIGOx%@^3MOx-8U!m9g}~KVSc&FX0Ud_pF7 g^O+ QCjj-k8l(U!M-M_ zzM#tvPKR2!=ospALS!A7-MCXVNk*fp=mS&l+ep`FO-eC}n7zsBU*GtG8iz$o4G4Z= z#cOitL_Wjbee{c? NQg3Mg9DR6b=)yvrzt%Ul?j7rx1hJeZ)_lvg;5v~1 zkLx+3_DzT_)9%DN{QQ1#Y02EDesuGV?_u+j#ruUNJJ-V_xwt&xU?O6q$Axb1$Ecod zoR-&m1)>O(%T$esN@myW&MR`zxAKA=G?ZZ1vTszZctM2Xs|yv9g7*`!T9ETrP`LNm z(|UJCiVIkSS^hz3%B~p%p2^4V4KN16C)&)ZLcVvjHC>PBJUsY-#i_}h;(glWN+#Z( z-{E_ourIW|4QX6{A12Qr==01g;kAoi(-{yXHbmaXBE$e@DGk|p6z}9fski*sT8k>8 z_zEv88(KvwXU1F7(Fuk&s5Ws)Td^v8?w6;^Bn9LvnMJg*KzF>{wsNdE= g@E62$JkNZ%>GV9Wy}` z^g8}ZNIio`OB28S1qQx@Ur|wx;oY6(?o#~K@9KG20Kq{%tL%ecb42cud1hySO|Ea= zjA*mge7_#8+(%=f`5n#>sl8w`fT8baJr&liZ&yHV{dYz9BD6caF`mJd 8r=ga18CTekR8tI?nWVy~x8N>V*%iXHcpSe3OuwK%6uPKTo-*zQ$puEA9 zf)JDJ#@ic=QIQsY8U78Ga7vZvvLi6y+w@?I2uwrmtMdm;?3Ejn&>Nodxyt54IuZw3 zvqH%kr@|C`1acCRqWR;$jp@s3Cs~L9pkH<7BqOo=6f<})3Ww_px*bq@II@Wox4s@3E}iIy|k)YwlQQkwRwN7Xc f>8@`|3`id`G_E&9GV^! z>4dLw1$p~IxgMmI2v$~B24mkqwuzme%DH4aw2*T(+0x2&l^&D|VRB57I&^Sgi=o*3 z^IG`OoS3n@j_r*#j-Uj0kR;mSgb9n+IS+-oPy67zfPeo~+frxBnT^KjJ4{syai%E} z;yh%4hhMJ8A`2Yt6j83rav-{YclrSqG`X_k0Eif9@OeGPbY<366AK%ch{(*Bn6t_$ zRn~FZ0hZq*joqNweoFf=T2H6EhikgPIg*b? YNHm|&Woh`TI zMBxb5A$oFvJd|p2aPjI{7q1p;Ez7j>gSUj|w>zrL3bCskB0LM?~e z{i?1?_P}p+|5=?0Z((VC&l=$Q&1VMOtxSs^8cwasjYT0kxaJ?eVAL5^mJ@5Awl@*F zx1YR05$n<_je{5yAA3E=@g #RF|jHvNf@^oKi$W|?X^E{}=$ zqBp~~qNN%6`NhJ#YB+>omk> WH5>AqCe~<8JRo~CnixWJ zAV@`E>A0T7z=y`;Tee{Dt|^te8}P2nQ~^o+#Wb5&3l>zQ$wpJ%V2K9@XIn=Wt{&o- z5rZ9#Po01xI-4)5aR!hXW2j@F)shJrAHGip{)9@$h@B|Y2hOkF< zlSIBtnKC>PeFc+a&gX3iSq0V8e#K$@rWwdBR3e669}= ?Q4k8_w4dHP^j;xT24LQ9)m9s}OS&-r=}6dMO@h z^n7Adh*xBT@vU@Zf>6LlP@|VrVrn%XTwfs3Gy?Nyqc0OUt0*=kP5GmsH3{S*MVeXR z)NOQD$f#wciTHs{UwYsqsL$`8h>+3Oo20aBt{(~6t8XIL_|T?KZ&3RZO50d|si@8x zn^=2qvZrbxY9$)ROS{LE^U5-WEN0TU@kA1mOB+zS*6+auGtW6G$F%BM8E$fARMM<1 zNIoCGRYxlUdu^9eNX}T*YZg&viMrg?CaW77P) n znFHHsvZ6YMU^`k~eM;188mWG}x&7+vcZ~W ~^bLA~fKLPWD5qiPtdoa_Js z7=4t700Fz&mAe|;#$~EQ_7|6|zlT_u5Dn4kdd=FTxv$x`dB*G%6kg3HOL2>Vdi zmCN>o-*!bxA+=gGbxZ+FF4eORi}xmY0LF?M2)?d7^+c17Pn VM6=)$Gw}q1Q4PS6}J=eu+)x;#M zx2j4;;3Orz!?7l* *?jb-ni2=lu@dxWy zSt&zeAm{g+R=->3Yo8FigKfSe;4q9dzKhvnzU1+;Ugg}Z{e)=Z| }`cZGMU2 gJ5x#rVYFs%EtwqFU*M5-uh1w^C+&{B2aTk*gTsI)RC}U~1bUCPMUn!!Red zuna{z_)|2ZRS4sWCORTOfdnQxq?(r%m?9H`qu+7NoI}IHzKL9IG&`=EySs;w>N^!( zTm*^6RS>*QNma s-l(a_l`)v!u8Lg)O| z>&WDMH(laSC8~qQLqGr5#k1O$#$S(n$f#f(0-)LBJ=`dT4D{zPhw{Snr%DIw>mSG7 z(cSNB20<7I#E4{qeo@L!9l>f4&Jg&`q)?9p$)J@@aRMIEyK`<4zMePOVzQM@1AvEc zSSI8<$`_NO62pHmkX2YzLNUbZ#IDVnz9=B9v|>`CSL3{Y_Fgv4+1>*oIef*$Zsy3* z>^i1&fNwPQm1csQo|EPkPoB?>CjC%2*j(AQK^Y_$gAos8dj Yf+o#27ATWH=h?x_{u&Mo|1p zoe6+g8Erg62M0I gy*+_t&?k708j9DpFY5Z-B$2k-u8qYqAlx1RP?*Z~;@cV1|vzX{Gy4U(n+Q zC-cn gk-D&8SKrd9*mJM=gMXSROg^rt^lLdjOpR)!d_G(wASiTz?t522wsb}R zUw>a)0 aNi#i5{;eB9$FD#j)`xsm?C)aGFZ?OR`Vtk$t5HE{E4Vtz?rH1BMJe!`F ;jIHvo^mMZ9ERjh&}iA42?~T=i`O$m!NLh4ukRvQ$|31R9+{-rdlj=8t|(> z?~YpX^9u+*O&NY=pl2j{i-C!a-~1n~AFZPaFHfV8JRn0e?r=d;f4E7`ka@ayJ%+Qn zr2+GK6RT~W;B9eW`q!gvyfoU0D%HxuFUN&IgO%jUA~*iu6$1c=OTg()ez(eGiysU1 zDmMOP6`fK&RmSKHDmsLZj{^-=L0VBpa`m;fl8l4{#u}Aa4gXF8e(bSdy*LGgkj9#+ z J%{hv_B &{(u<$XMAiI-b@zd_zB>Eg9cAW&mMwFufbIrn?F@l)5+(MhW+ zEukJb6nb=y1qh^Xnf0>DF*5Yk`)m`9SBs-ld{iR$ejrHvB^2OA@pL!76-thz{qVo~ zaK%G4#~0+uYjP7q6YuY{wtu=_mb+95 b=)bF<9erRsqtnI$^>;OH87Qti`4*-bt__1kn{e8 z=ymiML9`_>P*h4GuHHOn;pc{`j(TN01tPcJJTn3CWUO%gKUfmAjYkZrc}Y;DZZT zG4pDXD(0H#-4fP!V*Mls>@-8=*zqoZmI&`CM7tHlp956d!{S7qr>!N%p4OgBt$>#F z85nR%RuLnKSD2xx_aDr=U*r%s3&hE0zZcSvmVV}0Ej5?AuRs1V?zkgT9&4T!-v3Ro zH(UDZmF^d?tdve>c!PStm43b*e>R8z)_lNrS;tPGi5tRBW{-AKYAN5^&j vVAg`|n2ON( q%CII0}Y& zHAy=wt1SJGUou<&$bGfG!@b8N7j#Xl@xL{k$n{M=p0A;{AKdSHu(SszwQ 6P|_Sh?=VvdGkdp~h9T^0g|2_ZVRpcw zEs6077HMkhLT&3U&be>jP5dWMy5-@^Q-w;)Qeg-I!&%OF$+T$Idg0PN+czUGqJMWp zY%pSHj&3qZDlbsJJPiGcgL^;xqH+UW^cTlpTt!RJ9^L{TC~%6b-5fJd1CPCf!=^I0 zYi{f63J(Q)lF~tGX}QG65ho0g1XXZ)eAk``#y!Frt7g^BuS|CE+o5WK5`TU<@$l+= zxsiAdR~NfKJ@*^)>{UV2EDTHvHf;`>7Alnv5*@ek6o!@Jg_^&HVn_>rT;f$d81f(8 z#Y O%}Pbxqh4Riwjhs^wICO@}qNi4Q01>k~vq2QFRhM6ZH5P zz;46Cs0?a38{I)~fU&aVYOCnW5wPPVTf*+=mp#$u^Ir{fM?elvzEq1gQbaaUA sgh)wucXvuir*w;ebV+x2cQf?RL-RfF_m3Z}1#9BD@3YUf_ZGQ4kOrDPU44 YeJ+j4+uTQl5@{CS!obOfokZoMWBmOhVCjL{8CnZtwq4)Y4 zemti`0>>)b8J#xNMi|LO9x>z8!ZndQP3} zLhwRa?CsE*v+F^pC<=M6Hjhr}oAcl}-VZL`q7WU@5VSp-Lgin#09U78_6~=<{(%$t z?I< ;Ov zq$-m2G%wW5!vk&UIH8yr3HeXapR1c1bZgAizw7(s-FVone;w}zxoTL=0l+T!5u1~H zHh0ro-HPw!&RL(@Z|^ !RF}zX1h);?BuhV=6 0Fqtb`LgxH(6NToO{z JE)cU95Gd2*;u@_44}lvw|H%@z}!n%?NVRH5zrWDtZwT!T`g3Iw^*h z?W84*RX!o>Jv$m4pU zT xs}6XX{_7?*wzQ1Ue{Jzk lSGq!G3VwPN9&0T{b7ujDWi1evyvksLV83;OwK~9DD zk4t)%(*@1dL)I+Ex-BjdR<=LfJD|i$If9C-ug#qEu_4tl&Gl~=lT`6!sW3T@R0xbd z1teKj-LbVpTwGe=b3YwN`>j&^<^&;3FpO{~;q-dOl=#Gu36JmYg4~ISH1+k(Cr